/* * TOPPERS BASE PLATFORM MIDDLEWARE * * Copyright (C) 2017-2019 by TOPPERS PROJECT * Educational Working Group. * * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー * スコード中に含まれていること. * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 * の無保証規定を掲載すること. * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ * と. * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 * 作権表示,この利用条件および下記の無保証規定を掲載すること. * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに * 報告すること. * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを * 免責すること. * * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ * の責任を負わない. * * $Id$ */ /* * GRAPHIC-LCDテキスト表示プログラムの本体 */ #include #include #include #include #include #include #include "syssvc/serial.h" #include "syssvc/syslog.h" #ifndef NOT_USEFILFONT #include "fcntl.h" #endif #include "glcd_disp.h" /* * 東雲漢字のイメージデータは以下のファイルにある * 東雲フォントを使用する場合は、以下のフォントデータを * デフォルトドライブのrootに置いてください * shinonome_font12.fnt(12x12) * shinonome_font16.fnt(16x16) */ #define NUM_FONT_WORK 2 typedef struct font_work_s { FILE *pffont; uint8_t arrtibute; uint8_t image_size; uint16_t num_table2B; uint32_t num_table3B; uint32_t offset_image_2B; uint32_t offset_image_3B; uint8_t table[256]; } font_work_t; #ifndef NOT_USEFILFONT /* * 2バイトコード 1バイト目 */ static const uint8_t Utf8CodeTable_2B_1st[][2] = { {0xC2, 0x06}, {0xC3, 0x02}, {0xCE, 0x27}, {0xCF, 0x09}, {0xD0, 0x31}, {0xD1, 0x11} }; /* * 3バイトコード 1バイト目 */ static const uint8_t Utf8CodeTable_3B_1st[][2] = { {0xE2, 0x0E}, {0xE3, 0x04}, {0xE4, 0x08}, {0xE5, 0x40}, {0xE6, 0x40}, {0xE7, 0x3F}, {0xE8, 0x3F}, {0xE9, 0x3C}, {0xEF, 0x03} }; /* * 3バイトコード 2バイト目 */ static const uint8_t Utf8CodeTable_3B_2nd[][2] = { {0x80, 0x0E}, {0x84, 0x02}, {0x86, 0x04}, {0x87, 0x02}, {0x88, 0x14}, {0x89, 0x07}, {0x8A, 0x05}, {0x8C, 0x01}, {0x94, 0x1E}, {0x95, 0x02}, {0x96, 0x06}, {0x97, 0x06}, {0x98, 0x02}, {0x99, 0x05}, {0x80, 0x15}, {0x81, 0x3F}, {0x82, 0x37}, {0x83, 0x3B}, {0xB8, 0x1F}, {0xB9, 0x13}, {0xBA, 0x23}, {0xBB, 0x1E}, {0xBC, 0x13}, {0xBD, 0x1A}, {0xBE, 0x14}, {0xBF, 0x1A}, {0x80, 0x1A}, {0x81, 0x12}, {0x82, 0x0F}, {0x83, 0x13}, {0x84, 0x14}, {0x85, 0x21}, {0x86, 0x24}, {0x87, 0x1B}, {0x88, 0x1B}, {0x89, 0x1A}, {0x8A, 0x17}, {0x8B, 0x1C}, {0x8C, 0x1A}, {0x8D, 0x21}, {0x8E, 0x11}, {0x8F, 0x24}, {0x90, 0x1E}, {0x91, 0x14}, {0x92, 0x16}, {0x93, 0x13}, {0x94, 0x0E}, {0x95, 0x0F}, {0x96, 0x17}, {0x97, 0x0D}, {0x98, 0x0E}, {0x99, 0x0D}, {0x9A, 0x0D}, {0x9B, 0x17}, {0x9C, 0x16}, {0x9D, 0x0E}, {0x9E, 0x0C}, {0x9F, 0x12}, {0xA0, 0x13}, {0xA1, 0x14}, {0xA2, 0x0F}, {0xA3, 0x1D}, {0xA4, 0x1A}, {0xA5, 0x1A}, {0xA6, 0x13}, {0xA7, 0x12}, {0xA8, 0x0F}, {0xA9, 0x0A}, {0xAA, 0x06}, {0xAB, 0x0E}, {0xAC, 0x0B}, {0xAD, 0x1A}, {0xAE, 0x21}, {0xAF, 0x22}, {0xB0, 0x1F}, {0xB1, 0x19}, {0xB2, 0x11}, {0xB3, 0x0F}, {0xB4, 0x0F}, {0xB5, 0x0B}, {0xB6, 0x0E}, {0xB7, 0x1A}, {0xB8, 0x15}, {0xB9, 0x1C}, {0xBA, 0x14}, {0xBB, 0x21}, {0xBC, 0x1F}, {0xBD, 0x1B}, {0xBE, 0x1F}, {0xBF, 0x14}, {0x80, 0x16}, {0x81, 0x1C}, {0x82, 0x1C}, {0x83, 0x17}, {0x84, 0x16}, {0x85, 0x20}, {0x86, 0x14}, {0x87, 0x16}, {0x88, 0x1D}, {0x89, 0x17}, {0x8A, 0x19}, {0x8B, 0x22}, {0x8C, 0x11}, {0x8D, 0x12}, {0x8E, 0x1C}, {0x8F, 0x12}, {0x90, 0x0F}, {0x91, 0x09}, {0x92, 0x12}, {0x93, 0x18}, {0x94, 0x14}, {0x95, 0x16}, {0x96, 0x1B}, {0x97, 0x19}, {0x98, 0x17}, {0x99, 0x17}, {0x9A, 0x15}, {0x9B, 0x18}, {0x9C, 0x1F}, {0x9D, 0x1F}, {0x9E, 0x17}, {0x9F, 0x1C}, {0xA0, 0x12}, {0xA1, 0x17}, {0xA2, 0x1A}, {0xA3, 0x16}, {0xA4, 0x1C}, {0xA5, 0x1A}, {0xA6, 0x12}, {0xA7, 0x17}, {0xA8, 0x1A}, {0xA9, 0x0D}, {0xAA, 0x10}, {0xAB, 0x0D}, {0xAC, 0x12}, {0xAD, 0x19}, {0xAE, 0x1A}, {0xAF, 0x10}, {0xB0, 0x0D}, {0xB1, 0x15}, {0xB2, 0x1B}, {0xB3, 0x16}, {0xB4, 0x14}, {0xB5, 0x11}, {0xB6, 0x0E}, {0xB7, 0x1B}, {0xB8, 0x1C}, {0xB9, 0x10}, {0xBA, 0x13}, {0xBB, 0x14}, {0xBC, 0x13}, {0xBD, 0x11}, {0xBE, 0x0F}, {0xBF, 0x16}, {0x80, 0x12}, {0x81, 0x0A}, {0x82, 0x0D}, {0x83, 0x09}, {0x84, 0x09}, {0x85, 0x0F}, {0x86, 0x0D}, {0x87, 0x16}, {0x88, 0x12}, {0x89, 0x15}, {0x8A, 0x0E}, {0x8B, 0x15}, {0x8C, 0x12}, {0x8D, 0x0E}, {0x8E, 0x09}, {0x8F, 0x0F}, {0x90, 0x0D}, {0x91, 0x12}, {0x92, 0x07}, {0x93, 0x11}, {0x94, 0x1D}, {0x95, 0x20}, {0x96, 0x18}, {0x97, 0x18}, {0x98, 0x0D}, {0x99, 0x19}, {0x9A, 0x15}, {0x9B, 0x19}, {0x9C, 0x13}, {0x9D, 0x0D}, {0x9E, 0x10}, {0x9F, 0x10}, {0xA0, 0x0D}, {0xA1, 0x08}, {0xA2, 0x14}, {0xA3, 0x0F}, {0xA4, 0x0D}, {0xA5, 0x16}, {0xA6, 0x14}, {0xA7, 0x12}, {0xA8, 0x16}, {0xA9, 0x16}, {0xAA, 0x13}, {0xAB, 0x20}, {0xAC, 0x15}, {0xAD, 0x17}, {0xAE, 0x15}, {0xAF, 0x13}, {0xB0, 0x13}, {0xB1, 0x11}, {0xB2, 0x1C}, {0xB3, 0x16}, {0xB4, 0x1F}, {0xB5, 0x1A}, {0xB6, 0x1A}, {0xB7, 0x16}, {0xB8, 0x19}, {0xB9, 0x18}, {0xBA, 0x0E}, {0xBC, 0x03}, {0xBD, 0x17}, {0xBE, 0x18}, {0xBF, 0x12}, {0x80, 0x16}, {0x81, 0x16}, {0x82, 0x19}, {0x83, 0x14}, {0x84, 0x10}, {0x85, 0x14}, {0x86, 0x18}, {0x87, 0x19}, {0x88, 0x1E}, {0x89, 0x15}, {0x8A, 0x12}, {0x8B, 0x17}, {0x8C, 0x16}, {0x8D, 0x0D}, {0x8E, 0x12}, {0x8F, 0x15}, {0x90, 0x12}, {0x91, 0x14}, {0x92, 0x10}, {0x93, 0x11}, {0x94, 0x10}, {0x95, 0x13}, {0x96, 0x17}, {0x97, 0x11}, {0x98, 0x0E}, {0x99, 0x0E}, {0x9A, 0x0D}, {0x9B, 0x16}, {0x9C, 0x13}, {0x9D, 0x13}, {0x9E, 0x0A}, {0x9F, 0x0F}, {0xA0, 0x0F}, {0xA1, 0x19}, {0xA2, 0x14}, {0xA3, 0x17}, {0xA4, 0x10}, {0xA5, 0x13}, {0xA6, 0x19}, {0xA7, 0x0A}, {0xA8, 0x1A}, {0xA9, 0x18}, {0xAA, 0x1B}, {0xAB, 0x1C}, {0xAC, 0x18}, {0xAD, 0x15}, {0xAE, 0x0B}, {0xB0, 0x03}, {0xB1, 0x12}, {0xB2, 0x22}, {0xB3, 0x1B}, {0xB4, 0x0C}, {0xB5, 0x0A}, {0xB6, 0x09}, {0xB7, 0x13}, {0xB8, 0x0C}, {0xB9, 0x12}, {0xBA, 0x13}, {0xBB, 0x12}, {0xBC, 0x18}, {0xBD, 0x0F}, {0xBE, 0x12}, {0xBF, 0x16}, {0x80, 0x23}, {0x81, 0x27}, {0x82, 0x12}, {0x83, 0x0C}, {0x84, 0x06}, {0x85, 0x15}, {0x86, 0x12}, {0x87, 0x1B}, {0x88, 0x0B}, {0x89, 0x0F}, {0x8A, 0x0E}, {0x8B, 0x0B}, {0x8C, 0x13}, {0x8D, 0x0D}, {0x8E, 0x0B}, {0x8F, 0x0C}, {0x90, 0x0E}, {0x91, 0x12}, {0x92, 0x01}, {0x95, 0x01}, {0x96, 0x1B}, {0x97, 0x0D}, {0x98, 0x09}, {0x99, 0x1D}, {0x9A, 0x1E}, {0x9B, 0x1C}, {0x9C, 0x18}, {0x9D, 0x18}, {0x9E, 0x12}, {0x9F, 0x0E}, {0xA0, 0x19}, {0xA1, 0x12}, {0xA2, 0x05}, {0xA3, 0x11}, {0xA4, 0x14}, {0xA5, 0x0A}, {0xA6, 0x0C}, {0xA7, 0x15}, {0xA8, 0x0C}, {0xA9, 0x10}, {0xAA, 0x05}, {0xAB, 0x15}, {0xAC, 0x11}, {0xAD, 0x0E}, {0xAE, 0x10}, {0xAF, 0x13}, {0xB0, 0x19}, {0xB1, 0x0A}, {0xB3, 0x09}, {0xB4, 0x13}, {0xB5, 0x11}, {0xB6, 0x0D}, {0xB7, 0x0F}, {0xB8, 0x03}, {0xB9, 0x05}, {0xBA, 0x17}, {0xBB, 0x19}, {0xBC, 0x0A}, {0xBD, 0x12}, {0xBE, 0x05}, {0xBC, 0x3D}, {0xBD, 0x1F}, {0xBF, 0x05} }; /* * 2バイトコード 2バイト目 */ static const uint8_t Utf8CodeTable_2B_2nd[] = { 0xA7, 0xA8, 0xB0, 0xB1, 0xB4, 0xB6, 0x97, 0xB7, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, /* 0000-0015 */ 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, /* 0016-0031 */ 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0x80, /* 0032-0047 */ 0x81, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x81, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, /* 0048-0063 */ 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, /* 0064-0079 */ 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, /* 0080-0095 */ 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, /* 0096-0111 */ 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x91 /* 0112-0121 */ }; // 3バイトコード 3バイト目 bitmapデータ static const uint8_t Utf8CodeTable_3B_3rd[] = { 0x90, 0x95, 0x98, 0x99, 0x9C, 0x9D, 0xA0, 0xA1, 0xA5, 0xA6, 0xB0, 0xB2, 0xB3, 0xBB, 0x83, 0xAB, /* 0000-0015 */ 0x90, 0x91, 0x92, 0x93, 0x92, 0x94, 0x80, 0x82, 0x83, 0x87, 0x88, 0x8B, 0x9A, 0x9D, 0x9E, 0xA0, /* 0016-0031 */ 0xA5, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB4, 0xB5, 0xBD, 0x92, 0xA0, 0xA1, 0xA6, 0xA7, 0xAA, /* 0032-0047 */ 0xAB, 0x82, 0x83, 0x86, 0x87, 0xA5, 0x92, 0x80, 0x81, 0x82, 0x83, 0x8C, 0x8F, 0x90, 0x93, 0x94, /* 0048-0063 */ 0x97, 0x98, 0x9B, 0x9C, 0x9D, 0xA0, 0xA3, 0xA4, 0xA5, 0xA8, 0xAB, 0xAC, 0xAF, 0xB0, 0xB3, 0xB4, /* 0064-0079 */ 0xB7, 0xB8, 0xBB, 0xBC, 0xBF, 0x82, 0x8B, 0xA0, 0xA1, 0xB2, 0xB3, 0xBC, 0xBD, 0x86, 0x87, 0x8B, /* 0080-0095 */ 0x8E, 0x8F, 0xAF, 0x85, 0x86, 0x80, 0x82, 0xAA, 0xAD, 0xAF, 0x80, 0x81, 0x82, 0x83, 0x85, 0x86, /* 0096-0111 */ 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x81, /* 0112-0127 */ 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, /* 0128-0143 */ 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, /* 0144-0159 */ 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, /* 0160-0175 */ 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0x80, 0x81, /* 0176-0191 */ 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, /* 0192-0207 */ 0x92, 0x93, 0x9B, 0x9C, 0x9D, 0x9E, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, /* 0208-0223 */ 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, /* 0224-0239 */ 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, /* 0240-0255 */ 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, /* 0256-0271 */ 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, /* 0272-0287 */ 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xBB, 0xBC, 0xBD, 0xBE, /* 0288-0303 */ 0x80, 0x81, 0x83, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8D, 0x8E, 0x90, 0x91, 0x94, 0x95, 0x96, 0x97, /* 0304-0319 */ 0x98, 0x99, 0x9E, 0xA1, 0xA6, 0xAA, 0xAD, 0xB1, 0xB2, 0xB6, 0xB8, 0xB9, 0xBB, 0xBC, 0xBF, 0x82, /* 0320-0335 */ 0x83, 0x85, 0x8B, 0x8D, 0x8E, 0x8F, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9D, 0x9E, 0x9F, 0xA2, 0xB1, /* 0336-0351 */ 0xB3, 0xBE, 0x80, 0x82, 0x85, 0x86, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8E, 0x91, 0x92, 0x94, 0x95, /* 0352-0367 */ 0x98, 0x99, 0x9B, 0x9C, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA4, 0xA5, 0xA6, 0xA8, 0xAB, 0xAC, 0xAD, /* 0368-0383 */ 0xAE, 0xB0, 0xB3, 0xB6, 0xBA, 0x80, 0x81, 0x82, 0x84, 0x86, 0x87, 0x8A, 0x8B, 0x8D, 0x8E, 0x8F, /* 0384-0399 */ 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9D, 0x9E, 0x9F, 0xA3, 0xA4, 0xA5, 0xAD, 0xAE, 0xB0, 0xB2, /* 0400-0415 */ 0xB6, 0xB7, 0xBB, 0x81, 0x89, 0x8A, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x9A, 0x9C, 0x9D, 0xAF, 0xB0, /* 0416-0431 */ 0xB4, 0xB6, 0xB8, 0xBA, 0xBC, 0xBD, 0x83, 0x86, 0x87, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x93, 0x95, /* 0432-0447 */ 0x97, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0xA9, 0xAF, 0xB0, 0xB3, 0xB5, 0xB6, 0xBB, 0xBC, 0xBF, /* 0448-0463 */ 0x83, 0x86, 0x88, 0x8B, 0x8D, 0x8F, 0x91, 0x96, 0x98, 0x9B, 0x9D, 0xA0, 0xA1, 0xAB, 0xAD, 0xAE, /* 0464-0479 */ 0xAF, 0xB5, 0xB6, 0xBF, 0x82, 0x83, 0x84, 0x8A, 0x8E, 0x90, 0x91, 0x94, 0x97, 0x98, 0x9A, 0x9B, /* 0480-0495 */ 0x9D, 0x9F, 0xA1, 0xA3, 0xA4, 0xA5, 0xAE, 0xAF, 0xB3, 0xB5, 0xB6, 0xB8, 0xBA, 0xBE, 0x85, 0x86, /* 0496-0511 */ 0x89, 0x8B, 0x8D, 0x8F, 0x91, 0x92, 0x94, 0x96, 0x99, 0x9A, 0x9F, 0xA1, 0xA3, 0xA4, 0xA5, 0xA6, /* 0512-0527 */ 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xB6, 0xB9, 0x83, 0x87, 0x88, 0x89, 0x8F, 0x90, 0x95, 0x96, /* 0528-0543 */ 0x9A, 0x9C, 0xA5, 0xAC, 0xB2, 0xB4, 0xB5, 0xB6, 0xB8, 0xBD, 0x80, 0x85, 0x8D, 0x91, 0x98, 0x99, /* 0544-0559 */ 0x9A, 0xAC, 0xAD, 0xB2, 0xB3, 0xB4, 0xB5, 0xB7, 0xBE, 0x82, 0x85, 0x89, 0x8A, 0x8D, 0x8F, 0x91, /* 0560-0575 */ 0x95, 0x96, 0x9A, 0x9E, 0xA3, 0xA5, 0xA7, 0xAD, 0xAE, 0xB5, 0xB9, 0xBB, 0x80, 0x81, 0x82, 0x84, /* 0576-0591 */ 0x89, 0x92, 0x94, 0x95, 0x96, 0x98, 0x9A, 0x9F, 0xA1, 0xAA, 0xB2, 0xB7, 0xBA, 0xBB, 0xBC, 0xBF, /* 0592-0607 */ 0x80, 0x81, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8B, 0x8C, 0x8D, 0x8E, 0x90, 0x92, 0x94, /* 0608-0623 */ 0x9A, 0x9C, 0xA2, 0xA5, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xB1, 0xB5, 0xB6, 0xB7, 0xB8, /* 0624-0639 */ 0xBC, 0x80, 0x82, 0x85, 0x86, 0x89, 0x8A, 0x8C, 0x8D, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, /* 0640-0655 */ 0x97, 0x99, 0xA0, 0xA2, 0xA4, 0xA5, 0xA6, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB0, 0xB1, 0xB2, 0xB3, /* 0656-0671 */ 0xB4, 0xB5, 0xB6, 0xB7, 0xBD, 0x84, 0x85, 0x86, 0x89, 0x8B, 0x8C, 0x8D, 0x96, 0x9B, 0x9C, 0x9D, /* 0672-0687 */ 0xA0, 0xA1, 0xA6, 0xA7, 0xA9, 0xAA, 0xAD, 0xB0, 0xB1, 0xB5, 0xB6, 0xB8, 0xB9, 0xBA, 0xBD, 0xBE, /* 0688-0703 */ 0x80, 0x83, 0x84, 0x86, 0x87, 0x88, 0x8A, 0x8B, 0x8E, 0x91, 0x94, 0x97, 0x9D, 0xA4, 0xA5, 0xA7, /* 0704-0719 */ 0xA9, 0xAA, 0xAE, 0xB0, 0xB3, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0x83, 0x84, 0x87, 0x8A, 0x8B, /* 0720-0735 */ 0x8C, 0x8D, 0x8F, 0x94, 0x96, 0x9B, 0x9E, 0xA3, 0xA4, 0xA5, 0xA9, 0xAA, 0xAF, 0xB0, 0xB1, 0xB2, /* 0736-0751 */ 0xB3, 0xB4, 0xB5, 0xBD, 0xBF, 0x83, 0x87, 0x88, 0x89, 0x8D, 0x91, 0x92, 0x94, 0x9B, 0x9F, 0xA0, /* 0752-0767 */ 0xA3, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xB1, 0xB4, 0xB5, 0xB9, 0xBC, 0xBE, 0x81, 0x83, 0x85, 0x87, /* 0768-0783 */ 0x89, 0x8D, 0x92, 0x95, 0x97, 0x98, 0x99, 0x9D, 0x9E, 0x9F, 0xA0, 0xA2, 0xA3, 0xA4, 0xA6, 0xA7, /* 0784-0799 */ 0xB2, 0xB3, 0xB5, 0xB8, 0xB9, 0xBA, 0xBE, 0xBF, 0x81, 0x82, 0x85, 0x86, 0x88, 0x8D, 0x8F, 0x90, /* 0800-0815 */ 0x95, 0x96, 0x97, 0x99, 0x9A, 0x9D, 0xA0, 0xA1, 0xA3, 0xAA, 0xAF, 0xB1, 0xB3, 0xB8, 0xB9, 0xBA, /* 0816-0831 */ 0xBB, 0xBF, 0x80, 0x81, 0x83, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8D, 0x91, 0x92, 0x93, 0x94, /* 0832-0847 */ 0x97, 0x98, 0x9A, 0x9C, 0x9E, 0xA0, 0xA6, 0xA9, 0xAE, 0xAF, 0xB0, 0xB1, 0xB3, 0xB4, 0xB5, 0xB7, /* 0848-0863 */ 0xB8, 0xBB, 0xBF, 0x82, 0x84, 0x96, 0x98, 0x9A, 0x9F, 0xA0, 0xA5, 0xA6, 0xA8, 0xA9, 0xAD, 0xAE, /* 0864-0879 */ 0xB0, 0xB3, 0xB6, 0xBB, 0x82, 0x83, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x94, 0x96, 0x97, /* 0880-0895 */ 0x99, 0x9B, 0x9F, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, /* 0896-0911 */ 0xB0, 0xB1, 0xB2, 0xB3, 0xB6, 0xB7, 0xB8, 0xBA, 0x81, 0x83, 0x84, 0x88, 0x89, 0x8A, 0x8B, 0x8C, /* 0912-0927 */ 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x9B, 0x9D, 0x9F, 0xA0, 0xA6, 0xA9, 0xAB, 0xAC, 0xAD, 0xAE, 0xB6, /* 0928-0943 */ 0xB8, 0xB9, 0xBB, 0xBC, 0xBD, 0xBE, 0x80, 0x82, 0x86, 0x88, 0x89, 0x8A, 0x8E, 0x91, 0x9F, 0xA8, /* 0944-0959 */ 0xAA, 0xB0, 0xB1, 0xB3, 0xB5, 0xB6, 0xB7, 0xBB, 0xBC, 0xBD, 0x80, 0x84, 0x86, 0x8B, 0x8C, 0x8E, /* 0960-0975 */ 0x8F, 0x90, 0x92, 0xA2, 0xA4, 0xA5, 0xA8, 0xAB, 0xAC, 0xAF, 0xB2, 0xB3, 0xB8, 0xBC, 0xBD, 0xBE, /* 0976-0991 */ 0x80, 0x81, 0x82, 0x84, 0x87, 0x88, 0x89, 0x98, 0xA1, 0xA2, 0xA5, 0xA6, 0xA8, 0xA9, 0xAD, 0xAE, /* 0992-1007 */ 0xB2, 0xBA, 0xBD, 0x84, 0x86, 0x87, 0x8F, 0x90, 0x94, 0x96, 0xAE, 0xAF, 0xB1, 0xB3, 0xB8, 0xB9, /* 1008-1023 */ 0xBE, 0x80, 0x84, 0x85, 0x86, 0x8C, 0x8F, 0x93, 0x96, 0x97, 0x9C, 0x9D, 0xA3, 0xBB, 0xBC, 0xBE, 0x80, 0x83, 0x84, 0x87, 0x89, 0x8A, 0x8B, 0x98, 0x99, 0x9A, 0x9C, 0x9D, 0x9E, 0x9F, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAE, 0xB0, 0xB6, 0x84, 0x85, 0x87, 0x94, 0x9A, 0x9C, 0x9F, 0xA3, 0xA4, 0xB7, 0xB9, 0xBD, 0xBE, 0x86, 0x89, 0x94, 0x96, 0x97, 0x98, 0x9B, 0xA9, 0xAF, 0xB1, 0xB2, 0xB4, 0xB6, 0xB8, 0x82, 0x8C, 0x8E, 0x90, 0x9B, 0xA4, 0xA8, 0xAA, 0xAB, 0xAC, 0xB4, 0xB8, 0xBA, 0x80, 0x86, 0x87, 0x8A, 0x8F, 0x94, 0xA0, 0xA2, 0xA5, 0xAE, 0xB4, 0xB6, 0xBC, 0x80, 0x81, 0x82, 0x83, 0x88, 0x8E, 0x91, 0x93, 0x97, 0x98, 0x9A, 0x9B, 0x9E, 0xA0, 0xA3, 0xAE, 0xB0, 0xB2, 0xB3, 0xB9, 0xBA, 0xBD, 0xBF, 0x80, 0x83, 0x84, 0x88, 0x89, 0x8B, 0x8D, 0x8F, 0x92, 0x93, 0x96, 0x98, 0x9C, 0x9F, 0xA6, 0xA7, 0xA8, 0xAD, 0xB0, 0xB7, 0xB8, 0xBB, 0x80, 0x82, 0x87, 0x8A, 0x8E, 0x8F, 0x90, 0x91, 0xA1, 0xA4, 0xA6, 0xA9, 0xAA, 0xBF, 0x82, 0x88, 0x89, 0x8B, 0x93, 0xA0, 0xA2, 0xA3, 0xA4, 0xAA, 0xB0, 0xB3, 0x80, 0x83, 0x86, 0x8B, 0x8E, 0x92, 0x93, 0x94, 0x96, 0x9C, 0x9F, 0xA0, 0xA3, 0xB4, 0xB7, 0xB9, 0xBA, 0xBC, 0x80, 0x82, 0x85, 0x86, 0x8A, 0x8B, 0x95, 0x99, 0x9D, 0xA1, 0xA4, 0xAA, 0xAF, 0xB0, 0xB1, 0xB4, 0xB5, 0xBA, 0xBD, 0x80, 0x81, 0x8A, 0x8B, 0x91, 0x92, 0x94, 0x97, 0x98, 0x99, 0x9A, 0x9E, 0xA2, 0xA9, 0xAB, 0xB0, 0xB2, 0xB5, 0xB9, 0xBE, 0x83, 0x85, 0x93, 0x97, 0x9C, 0x9F, 0xA8, 0xAB, 0xAE, 0xB3, 0xB8, 0xB9, 0xBA, 0xBB, 0xBE, 0x81, 0x85, 0x87, 0x8A, 0x8C, 0x91, 0x93, 0x95, 0x97, 0x98, 0x99, 0x9C, 0x9E, 0x9F, 0xA4, 0xA5, 0xAB, 0xAC, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB7, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0x82, 0x89, 0x8A, 0x8F, 0x90, 0x95, 0x96, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0xA2, 0xA5, 0xA7, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xB1, 0xB2, 0xB7, 0xB8, 0xBE, 0x84, 0x87, 0x88, 0x89, 0x8E, 0x8F, 0x90, 0x91, 0x94, 0x95, 0x97, 0x98, 0x9A, 0xA0, 0xA2, 0xA5, 0xA7, 0xA8, 0xA9, 0xAA, 0xAC, 0xAE, 0xB3, 0xB4, 0xB8, 0xBD, 0x81, 0x82, 0x83, 0x84, 0x8A, 0x8D, 0x93, 0x96, 0x99, 0x9B, 0x9D, 0xA3, 0xA5, 0xA8, 0xAC, 0xB2, 0xB9, 0xBB, 0xBE, 0x86, 0x89, 0x8B, 0x90, 0x91, 0x93, 0x94, 0x99, 0x9A, 0x9C, 0xA5, 0xA6, 0xA8, 0xAA, 0xAB, 0xB6, 0xBB, 0xBF, 0x81, 0x83, 0x89, 0x91, 0x98, 0x9A, 0x9C, 0x9F, 0xA0, 0xA5, 0xA9, 0xAF, 0xB5, 0xB6, 0xBC, 0x80, 0x81, 0x86, 0x89, 0x9A, 0xA2, 0xA6, 0xAA, 0xAC, 0xBF, 0x92, 0x9A, 0x9B, 0xBC, 0xBD, 0xBE, 0x81, 0x82, 0x89, 0x8B, 0x8C, 0x90, 0x96, 0x97, 0xA1, 0xA3, 0xA6, 0xA9, 0xBA, 0xBB, 0x89, 0x8B, 0x8C, 0x96, 0xA2, 0xAA, 0xAC, 0xB0, 0xB2, 0xB6, 0xBE, 0x80, 0x83, 0x85, 0x90, 0x91, 0x94, 0x95, 0x97, 0x98, 0x9A, 0x9B, 0x9C, 0x9D, 0x9F, 0xA3, 0xA4, 0xA5, 0xA6, 0xA9, 0xAB, 0xB0, 0xB1, 0xB3, 0xB5, 0xB8, 0xBA, 0x80, 0x83, 0x85, 0x87, 0x88, 0x89, 0x8B, 0x8C, 0x8D, 0x8F, 0x95, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9F, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xAE, 0xB0, 0xB3, 0xB4, 0xB5, 0xB6, 0xB8, 0xB9, 0xBF, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x89, 0x8C, 0x90, 0x92, 0x93, 0x94, 0x9B, 0x9D, 0x9E, 0x9F, 0xA1, 0xA2, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAB, 0xAE, 0xB0, 0xB3, 0xB5, 0xB6, 0xB8, 0xBA, 0xBE, 0xBF, 0x81, 0x82, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8D, 0x8E, 0x8F, 0x91, 0x93, 0x96, 0x9A, 0xA0, 0xA2, 0xA4, 0xA8, 0xAD, 0xB1, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0x80, 0x81, 0x85, 0x86, 0x88, 0x8A, 0x8B, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x93, 0x95, 0x9E, 0xA0, 0xA1, 0xA4, 0xA5, 0xAC, 0xAE, 0xAF, 0xB1, 0xB6, 0xB9, 0x8C, 0x90, 0x91, 0x94, 0xA1, 0xA8, 0xA9, 0xAB, 0xAC, 0xB1, 0xB3, 0xB6, 0xB7, 0xB8, 0xBB, 0xBC, 0xBE, 0x85, 0x87, 0x99, 0xA0, 0xA1, 0xA8, 0xA9, 0xAA, 0xAD, 0xAF, 0xB0, 0xB6, 0xBA, 0xBB, 0xBD, 0x87, 0x8B, 0x8E, 0x91, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9F, 0xA2, 0xA9, 0x8B, 0x8C, 0x8E, 0x90, 0x92, 0x9C, 0xA9, 0xAC, 0xAF, 0xB3, 0xB6, 0x82, 0x84, 0x87, 0x8B, 0x8C, 0x90, 0x9D, 0xA2, 0xAC, 0xAE, 0xB7, 0xBA, 0xBC, 0xBD, 0x89, 0x8C, 0x8D, 0x92, 0x93, 0x96, 0x9B, 0x9D, 0x9E, 0xA1, 0xA3, 0xA5, 0xA6, 0xA7, 0xA8, 0xAB, 0xAE, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB7, 0xBB, 0xBD, 0xBE, 0x82, 0x83, 0x86, 0x8B, 0x8C, 0x91, 0x96, 0x99, 0x9A, 0x9B, 0x9D, 0xA5, 0xAB, 0xAD, 0xAF, 0xB0, 0xB3, 0xB6, 0xB7, 0xB8, 0xBD, 0x80, 0x83, 0x84, 0x85, 0x87, 0x8C, 0x8E, 0x94, 0x95, 0x97, 0x9F, 0xA1, 0xA2, 0xA3, 0xA4, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0x81, 0x83, 0x84, 0x87, 0x8A, 0x8F, 0x95, 0x96, 0x97, 0x9A, 0x9C, 0xA0, 0xA6, 0xA7, 0xAB, 0xAD, 0xB5, 0xB6, 0xB7, 0xB8, 0x81, 0x82, 0x83, 0x88, 0x89, 0x8A, 0x8F, 0x90, 0x93, 0x96, 0x9A, 0x9B, 0x9D, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA8, 0xA9, 0xAC, 0xB0, 0xB1, 0xB3, 0xB4, 0xB6, 0xB7, 0xB8, 0xBA, 0xBB, 0xBC, 0xBE, 0xBF, 0x81, 0x83, 0x84, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8F, 0x90, 0x91, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x9B, 0x9F, 0xA5, 0xA6, 0xA7, 0xA9, 0xAD, 0xAF, 0xB1, 0xB5, 0xB7, 0xB8, 0xBC, 0xBE, 0x81, 0x88, 0x8A, 0x8C, 0x8E, 0x91, 0x93, 0x96, 0x97, 0x99, 0x9C, 0x9D, 0xA1, 0xA2, 0xA6, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xB0, 0xB1, 0xB3, 0xB7, 0xB9, 0xBC, 0xBF, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x8A, 0x8B, 0x8C, 0x90, 0x91, 0x92, 0x93, 0x97, 0x98, 0x99, 0x9E, 0xA0, 0xA1, 0xA8, 0xA9, 0xAA, 0xAD, 0xAE, 0xB3, 0xB4, 0xB9, 0xBC, 0xBD, 0x83, 0x85, 0x8C, 0x8D, 0x96, 0x97, 0x98, 0x99, 0x9C, 0x9D, 0xA0, 0xA4, 0xAB, 0xB0, 0xB1, 0xB5, 0xB8, 0xBB, 0xBD, 0xBF, 0x8E, 0x8F, 0x90, 0x92, 0x95, 0x96, 0x99, 0x9B, 0x9C, 0x9D, 0xA0, 0xA1, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAF, 0xB1, 0xBA, 0x81, 0x82, 0x83, 0x86, 0x8A, 0x8B, 0x8D, 0x90, 0x92, 0x95, 0x99, 0x9A, 0x9F, 0xA0, 0xA2, 0xA3, 0xA4, 0xA5, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAF, 0xB0, 0xB5, 0xB7, 0x81, 0x83, 0x84, 0x89, 0x8B, 0x8C, 0x8D, 0x92, 0x94, 0x96, 0x97, 0x9A, 0x9B, 0x9F, 0xA0, 0xA3, 0xA6, 0xA7, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB8, 0xBC, 0xBD, 0x85, 0x86, 0x87, 0x91, 0x93, 0x98, 0x9A, 0x9C, 0x9F, 0xA0, 0xA1, 0xA3, 0xA7, 0xA8, 0xB0, 0xB1, 0xB3, 0xB4, 0xB6, 0xB7, 0xB9, 0xBA, 0xBB, 0x80, 0x81, 0x83, 0x86, 0x88, 0x89, 0x8D, 0x8E, 0x8F, 0x95, 0x9A, 0x9B, 0x9F, 0xA1, 0xA7, 0xA8, 0xAC, 0xB4, 0xBC, 0xBD, 0xBE, 0xBF, 0x82, 0x84, 0x87, 0x88, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x93, 0x95, 0x98, 0x99, 0x9A, 0x9D, 0x9F, 0xA2, 0xA3, 0xA5, 0xA7, 0xA8, 0xAB, 0xAE, 0xAF, 0xB0, 0xB1, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xBE, 0x82, 0x87, 0x8A, 0x8E, 0x90, 0x91, 0x94, 0x96, 0x99, 0x9A, 0xA4, 0xA7, 0xA9, 0xAB, 0xAC, 0xAE, 0xB2, 0xB6, 0xBA, 0xBE, 0x83, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x90, 0xA3, 0xA6, 0xB2, 0xB4, 0xB6, 0xB7, 0xB8, 0xBA, 0xBC, 0xBD, 0xBE, 0xBF, 0x80, 0x88, 0x89, 0x8A, 0x8C, 0x8D, 0x8E, 0x90, 0x91, 0x92, 0x94, 0x96, 0x9A, 0x9B, 0x9D, 0x9E, 0x9F, 0xA1, 0xA6, 0xAA, 0xAE, 0xAF, 0xB0, 0xB2, 0xB3, 0xB4, 0xB8, 0xBB, 0xBF, 0x80, 0x81, 0x87, 0x88, 0x89, 0x8B, 0x8D, 0x8E, 0x93, 0x95, 0x98, 0x9B, 0x9E, 0xA0, 0xA3, 0xA8, 0xAE, 0xB1, 0xB6, 0xB9, 0xBC, 0xBE, 0xBF, 0x80, 0x82, 0x83, 0x84, 0x89, 0x8A, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x9B, 0x9C, 0x9E, 0xAB, 0xAC, 0xB1, 0xB5, 0xB9, 0xBB, 0xBC, 0xBD, 0x82, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8C, 0x8D, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x97, 0x98, 0x99, 0x9B, 0x9C, 0x9D, 0xA0, 0xA1, 0xAC, 0xAD, 0xAE, 0xAF, 0xB1, 0xB3, 0xB5, 0xB6, 0xB7, 0xBE, 0xBF, 0x81, 0x82, 0x87, 0x88, 0x89, 0x8C, 0x91, 0x99, 0x9F, 0xA7, 0xA8, 0xAB, 0xAF, 0xBA, 0xBD, 0xBE, 0xBF, 0x89, 0x8C, 0x8D, 0x8F, 0x90, 0x95, 0x97, 0x9C, 0xA7, 0xA8, 0xA9, 0xAB, 0xAE, 0xB2, 0xB6, 0xB7, 0xBA, 0xBB, 0x80, 0x83, 0x88, 0x89, 0x8C, 0x8E, 0x8F, 0x92, 0x96, 0x98, 0x9B, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA5, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB2, 0xB4, 0xB5, 0xBB, 0xBE, 0x80, 0x83, 0x84, 0x86, 0x89, 0x8F, 0x90, 0x92, 0x96, 0x9A, 0x9B, 0xA1, 0xA3, 0xA9, 0xAE, 0xB4, 0xB6, 0xBA, 0x86, 0x8D, 0x8F, 0x93, 0x96, 0x97, 0x9C, 0xA6, 0xA8, 0xAC, 0xAD, 0xB4, 0xB6, 0xBA, 0xBE, 0x82, 0x8E, 0x98, 0xA7, 0xA9, 0xAF, 0xB6, 0xB8, 0xBA, 0x83, 0x88, 0x92, 0x93, 0x95, 0x9A, 0x9E, 0xA4, 0xA5, 0xA9, 0xAB, 0xAD, 0xAE, 0xB0, 0xB2, 0xB9, 0xBB, 0xBC, 0x81, 0x82, 0x85, 0x87, 0x8D, 0x92, 0x94, 0x98, 0x9A, 0xA0, 0xA1, 0xA2, 0xA3, 0xA6, 0xA7, 0xAC, 0xAF, 0xB1, 0xB2, 0xB4, 0xB6, 0xBA, 0xBD, 0xBE, 0x80, 0x85, 0x98, 0x9C, 0x9D, 0xA3, 0xA4, 0xAA, 0xAB, 0xAC, 0xAF, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBB, 0xBE, 0xBF, 0x85, 0x88, 0x8D, 0x8F, 0x91, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9D, 0x9E, 0xA2, 0xA3, 0xA6, 0xAC, 0xB0, 0xB2, 0xB4, 0xB5, 0xB7, 0xB8, 0x82, 0x83, 0x87, 0x88, 0x89, 0x8C, 0x8E, 0x90, 0x91, 0x97, 0x99, 0x9B, 0x9C, 0x9F, 0xA1, 0xA4, 0xA5, 0xA7, 0xAB, 0xAC, 0xAD, 0xAF, 0xB0, 0xB7, 0xB9, 0xBC, 0xBD, 0x81, 0x83, 0x84, 0x85, 0x86, 0x8B, 0x8C, 0x8F, 0x92, 0x97, 0x99, 0x9B, 0xA0, 0xA1, 0xA2, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAC, 0xAD, 0xB1, 0xBA, 0xBB, 0x82, 0x83, 0x86, 0x87, 0x8A, 0x8C, 0x8E, 0x8F, 0x93, 0x94, 0x9C, 0x9F, 0xA0, 0xA5, 0xA7, 0xA8, 0xAD, 0xAF, 0xB4, 0xB5, 0xB6, 0xBC, 0xBF, 0x81, 0x82, 0x83, 0x84, 0x89, 0x8B, 0x8F, 0x92, 0x9D, 0x9E, 0x9F, 0xA2, 0xA4, 0xA6, 0xA7, 0xA8, 0xA9, 0xAE, 0xAF, 0xB0, 0xB4, 0xB6, 0xBA, 0x81, 0x83, 0x84, 0x87, 0x88, 0x89, 0x8E, 0x91, 0x96, 0x97, 0x98, 0x9D, 0xA2, 0xA6, 0xAB, 0xAE, 0xB4, 0xB8, 0xB9, 0xBC, 0xBE, 0x81, 0x84, 0x87, 0x89, 0x96, 0x99, 0x9A, 0x9C, 0x9D, 0xA0, 0xA6, 0xA9, 0xB0, 0xB2, 0xB3, 0xB4, 0xB5, 0xB7, 0xB8, 0xB9, 0xBC, 0xBD, 0xBE, 0xBF, 0x80, 0x83, 0x88, 0x89, 0x8B, 0x8D, 0x8F, 0x94, 0x95, 0x96, 0x97, 0x9B, 0x9D, 0x9E, 0x9F, 0xA6, 0xA7, 0xA8, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xB1, 0xB4, 0xB6, 0xB7, 0xB8, 0xBA, 0xBD, 0xBF, 0x81, 0x86, 0x89, 0x8E, 0x8F, 0x90, 0x91, 0x93, 0x96, 0x99, 0x9C, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xAA, 0xAD, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB5, 0xB7, 0xBC, 0xBE, 0xBF, 0x85, 0x87, 0x89, 0x8B, 0x8C, 0x90, 0x95, 0x97, 0x9A, 0x9C, 0x9D, 0xA0, 0xA1, 0xA2, 0xA6, 0xA9, 0xAF, 0xB3, 0xB4, 0xB6, 0xB7, 0xB8, 0xB9, 0x81, 0x84, 0x86, 0x8A, 0x8E, 0x8F, 0x90, 0x91, 0x93, 0x94, 0x98, 0x9A, 0x9D, 0x9E, 0xA2, 0xA4, 0xA7, 0xA9, 0xAC, 0xAE, 0xAF, 0xB1, 0xB3, 0xB4, 0xB5, 0xBB, 0xBE, 0xBF, 0x82, 0x83, 0x84, 0x93, 0x96, 0x97, 0x9E, 0xA1, 0xA2, 0xA9, 0xAA, 0xAB, 0xB2, 0xB4, 0xB8, 0xB9, 0xBC, 0xBD, 0x80, 0x81, 0x82, 0x83, 0x86, 0x88, 0x8D, 0x8E, 0x90, 0x91, 0x93, 0x94, 0x99, 0x9C, 0x9D, 0x9F, 0xA3, 0xA7, 0xB4, 0xB6, 0xB7, 0xBE, 0xBF, 0x81, 0x83, 0x85, 0x8D, 0x8F, 0x93, 0x94, 0x97, 0x9B, 0x9D, 0x9F, 0xA0, 0xA2, 0xA6, 0xA7, 0xA8, 0xAD, 0xAF, 0xB0, 0xB1, 0xB3, 0xB5, 0xB6, 0xB9, 0xBA, 0xBC, 0x84, 0x86, 0x89, 0x8A, 0x8B, 0x8D, 0x92, 0x94, 0x95, 0x97, 0x98, 0x9A, 0x9F, 0xA0, 0xA1, 0xA3, 0xA7, 0xAE, 0xAF, 0xB2, 0xB9, 0xBA, 0x80, 0x81, 0x84, 0x85, 0x88, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x92, 0x99, 0x9A, 0x9B, 0x9C, 0xA1, 0xA2, 0xA3, 0xA5, 0xA6, 0xA8, 0xAA, 0xB0, 0xB4, 0xB6, 0xB9, 0xBD, 0xBF, 0x8A, 0x93, 0x94, 0x95, 0x99, 0x9A, 0x9C, 0x9D, 0x9E, 0xA0, 0xA1, 0xA2, 0xAA, 0xAB, 0xAD, 0xAE, 0xAF, 0xB3, 0xB4, 0xB5, 0xB7, 0xB8, 0xB9, 0xBC, 0xBD, 0xBE, 0x81, 0x82, 0x8A, 0x8E, 0x91, 0x94, 0x95, 0x9B, 0x9C, 0xA0, 0xA7, 0xAE, 0xB1, 0xB2, 0xB4, 0xBB, 0xBE, 0xBF, 0x81, 0x83, 0x87, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x90, 0x93, 0x98, 0x99, 0x9D, 0x9E, 0xA7, 0xA8, 0xAB, 0xAD, 0xB2, 0xB9, 0xBB, 0xBD, 0xBF, 0x82, 0x85, 0x8A, 0x8B, 0x8C, 0x92, 0x93, 0x94, 0x97, 0x99, 0x9B, 0x9E, 0x9F, 0xA1, 0xA2, 0xA3, 0xA9, 0xAA, 0xAB, 0xAE, 0xB5, 0xB6, 0xB8, 0xB9, 0xBA, 0xBD, 0x84, 0x87, 0x88, 0x8B, 0x98, 0x99, 0x9F, 0xA1, 0xA2, 0xA6, 0xB2, 0xB8, 0xBF, 0x80, 0x84, 0x8D, 0x8E, 0x90, 0x97, 0x9C, 0xA0, 0xA2, 0xA3, 0xAA, 0xAC, 0xAE, 0xB3, 0xB8, 0xBB, 0x81, 0x82, 0x83, 0x91, 0x93, 0x9A, 0x9B, 0x9E, 0x9F, 0xA8, 0xAA, 0xBA, 0xBB, 0x84, 0x85, 0x8A, 0x92, 0x96, 0x9D, 0x9F, 0xA0, 0xA1, 0xA3, 0xA7, 0xB2, 0xB7, 0xB8, 0xB9, 0xBA, 0xBD, 0xBE, 0x83, 0x87, 0x89, 0x8C, 0x8E, 0x90, 0x93, 0x94, 0x99, 0x9B, 0x9F, 0xA1, 0xA2, 0xA3, 0xA4, 0xA6, 0xA9, 0xAA, 0xAF, 0xB3, 0xB4, 0xB8, 0xB9, 0xBB, 0xBF, 0x80, 0x83, 0x84, 0x86, 0x89, 0x8A, 0x8B, 0x8D, 0x95, 0x96, 0x98, 0x9E, 0xA4, 0xAA, 0xAB, 0xAF, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB7, 0xBA, 0xBB, 0xBC, 0xBF, 0x80, 0x85, 0x86, 0x8B, 0x8D, 0x8E, 0x92, 0x93, 0x94, 0x98, 0x9B, 0x9F, 0xAB, 0xAC, 0xAF, 0xB3, 0x88, 0x8F, 0x91, 0x93, 0x94, 0x97, 0x9B, 0xA3, 0xA4, 0xB4, 0xB7, 0xB8, 0xBE, 0x80, 0x81, 0x82, 0x8E, 0x90, 0x95, 0x97, 0x9A, 0x9D, 0x9E, 0x9F, 0xA0, 0xA2, 0xA8, 0xAA, 0xB0, 0xB2, 0xB3, 0xBA, 0xBD, 0xBE, 0x81, 0x82, 0x83, 0x88, 0x8C, 0x8D, 0x90, 0x92, 0x93, 0x96, 0x99, 0x9A, 0x9B, 0xA1, 0xA2, 0xAB, 0xAE, 0xB1, 0xB3, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0x81, 0x84, 0x85, 0x89, 0x8A, 0x8C, 0x93, 0x95, 0x97, 0x99, 0x9B, 0x9D, 0xA1, 0xA2, 0xA3, 0xA5, 0xA8, 0xAA, 0xAF, 0xB0, 0xB1, 0xB3, 0x8B, 0x8C, 0x92, 0x97, 0x99, 0x9B, 0x9E, 0x9F, 0xA5, 0xA9, 0xAA, 0xAB, 0xB2, 0xB3, 0xB5, 0xB6, 0xB8, 0xBB, 0xBD, 0xBE, 0x81, 0x84, 0x85, 0x99, 0x9A, 0x9C, 0xA3, 0xA4, 0xA6, 0xA9, 0xAA, 0xAC, 0xAE, 0xB4, 0xB7, 0xB8, 0xB9, 0x85, 0x88, 0x8C, 0x8E, 0x93, 0x95, 0x99, 0x9B, 0x9C, 0xAF, 0xB2, 0xB5, 0xB8, 0xBC, 0x80, 0x85, 0x86, 0x87, 0x8B, 0x8C, 0x91, 0x92, 0x95, 0x98, 0x99, 0x9E, 0xA1, 0xA4, 0xA6, 0xA8, 0xAA, 0xAB, 0xAC, 0xAE, 0xB1, 0xB3, 0xB5, 0xB7, 0xB9, 0xBA, 0xBB, 0x85, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x93, 0x95, 0x99, 0x9A, 0x9B, 0x9D, 0x9F, 0xA0, 0xA1, 0xA3, 0xA4, 0xA5, 0xA6, 0xA9, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB8, 0xBA, 0xBE, 0x83, 0x8A, 0x8D, 0x8E, 0x96, 0x98, 0x9B, 0x9F, 0xA7, 0xAB, 0xAE, 0xAF, 0xB2, 0xB6, 0xBE, 0xBF, 0x80, 0x82, 0x8C, 0x8F, 0x90, 0x96, 0x98, 0x9C, 0x9D, 0x9F, 0xA2, 0xA5, 0xAA, 0xAF, 0xB2, 0xB6, 0xB7, 0xBA, 0xBD, 0x82, 0x84, 0x85, 0x89, 0x8B, 0x8C, 0x91, 0x93, 0x94, 0x95, 0x9D, 0x9E, 0xAC, 0xAF, 0xB2, 0xB4, 0xB7, 0xB8, 0xBE, 0xBF, 0x81, 0x82, 0x86, 0x89, 0x8F, 0x91, 0x93, 0x94, 0x95, 0xA0, 0xA2, 0xA3, 0xAB, 0xAC, 0xB1, 0xB2, 0xB8, 0xBE, 0xBF, 0x81, 0x85, 0x94, 0x98, 0x9B, 0x9C, 0x9F, 0xA4, 0xA6, 0xAD, 0xAE, 0xAF, 0xB0, 0xB4, 0xB8, 0xBA, 0xBC, 0x80, 0x81, 0x82, 0x84, 0x86, 0x8E, 0x91, 0x97, 0xA1, 0xA3, 0xA4, 0xAA, 0xB1, 0xB3, 0xB9, 0x80, 0x81, 0x82, 0x83, 0x86, 0x94, 0x95, 0x98, 0x9B, 0x9F, 0xA0, 0xA1, 0xA4, 0xAB, 0xAC, 0xAE, 0xAF, 0xB1, 0xB3, 0xB6, 0xBA, 0xBE, 0x81, 0x89, 0x8B, 0x8F, 0x91, 0x95, 0x98, 0x9A, 0x9B, 0x9D, 0x9E, 0x9F, 0xA6, 0xA7, 0xAC, 0xB0, 0xB2, 0xBE, 0x8C, 0x91, 0x98, 0xA3, 0xAB, 0xAF, 0xB0, 0xB8, 0xBC, 0xBD, 0x89, 0x8A, 0x8E, 0x92, 0x99, 0xAC, 0xAD, 0xAE, 0xAF, 0xB3, 0xB8, 0xB9, 0xBA, 0x88, 0x8B, 0x8F, 0x99, 0x9D, 0x9F, 0xB1, 0xB9, 0xBD, 0x89, 0x94, 0x99, 0x9A, 0x9C, 0xA1, 0xA6, 0xB6, 0xBC, 0x89, 0x8C, 0x8E, 0x95, 0x96, 0x99, 0xA2, 0xA4, 0xA5, 0xA6, 0xA7, 0xA9, 0xAC, 0xAE, 0xBD, 0x84, 0x88, 0x8A, 0x8F, 0x94, 0x95, 0x99, 0x9F, 0xA8, 0xAC, 0xB1, 0xB9, 0xBE, 0x83, 0x88, 0x89, 0x8E, 0x90, 0x92, 0x94, 0x95, 0x97, 0x9F, 0xA0, 0xA5, 0xA6, 0xA7, 0xAC, 0xAD, 0xAE, 0xB5, 0xB9, 0xBB, 0xBC, 0xBF, 0x86, 0x8D, 0x90, 0x9B, 0xA8, 0xAA, 0xAC, 0xAD, 0xB0, 0xB2, 0xB5, 0xB6, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0x80, 0x86, 0x87, 0x88, 0x8B, 0x8C, 0x92, 0x98, 0x99, 0x9B, 0x9D, 0x9F, 0xA1, 0xA2, 0xA7, 0xA9, 0xB2, 0xB4, 0xB9, 0xBD, 0xBE, 0x80, 0x81, 0x82, 0x87, 0x92, 0x96, 0xA0, 0xA2, 0xA7, 0xAC, 0xAF, 0xB2, 0xB6, 0xB9, 0x82, 0x83, 0x84, 0x86, 0x8E, 0x90, 0x92, 0x97, 0x99, 0x9B, 0xA0, 0xA1, 0xA2, 0xA9, 0xAC, 0xAD, 0xB7, 0xB8, 0xB9, 0xBC, 0xBD, 0x8A, 0x96, 0x97, 0x9B, 0x9C, 0x9D, 0x9F, 0xA5, 0xA9, 0xAA, 0xAB, 0xAE, 0xAF, 0xB4, 0xB6, 0xB7, 0xBE, 0xBF, 0x84, 0x85, 0x8E, 0x8F, 0x97, 0xA3, 0xA8, 0xAA, 0xB0, 0xB2, 0xB5, 0xB8, 0xBA, 0xBB, 0x84, 0x87, 0x89, 0x8B, 0x96, 0xA9, 0xB2, 0xB3, 0xBB, 0x80, 0x82, 0x88, 0x8A, 0x8D, 0x8E, 0x9E, 0xA0, 0xA5, 0xAA, 0xAD, 0xAE, 0xB1, 0xB8, 0xBE, 0x83, 0x85, 0x86, 0x89, 0xA2, 0xA5, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xBA, 0xBF, 0x81, 0x95, 0x99, 0x9A, 0x9B, 0x9C, 0x9E, 0x9F, 0xA0, 0xA3, 0xA4, 0xA9, 0xAA, 0xAF, 0xB0, 0xB3, 0xB6, 0xBE, 0x83, 0x8B, 0x9E, 0xA2, 0xA7, 0xB0, 0xBD, 0x8A, 0x8F, 0x94, 0x9C, 0xA0, 0xA2, 0xA3, 0xA6, 0xA7, 0xA9, 0xAE, 0xB0, 0xB1, 0xB2, 0xB6, 0xB7, 0xB8, 0x83, 0x84, 0x85, 0x8C, 0x8D, 0x8E, 0x91, 0x93, 0x95, 0x98, 0x9A, 0x9C, 0x9E, 0x9F, 0xA3, 0xA5, 0xA6, 0xA8, 0xAB, 0xAC, 0xB0, 0xB1, 0xB2, 0xB3, 0xB7, 0xB8, 0xBA, 0xBB, 0xBC, 0x84, 0x86, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8F, 0x91, 0x94, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0xA0, 0xA2, 0xA4, 0xA5, 0xA6, 0xA7, 0xA9, 0xAA, 0xAB, 0xAD, 0xB0, 0xB3, 0xB4, 0xB6, 0xB7, 0xB8, 0xBF, 0x82, 0x86, 0x87, 0x89, 0x8A, 0x8B, 0x8E, 0x8F, 0x91, 0x94, 0x9A, 0x9D, 0xA3, 0xA5, 0xAB, 0xB1, 0xB2, 0xB3, 0xB5, 0xB8, 0xB9, 0xBC, 0xBD, 0xBE, 0x82, 0x83, 0x85, 0x87, 0x8A, 0x8D, 0x92, 0x94, 0x95, 0x98, 0x99, 0x9B, 0x9E, 0xA2, 0xA3, 0xA9, 0xB0, 0xB2, 0xB3, 0xB4, 0xBA, 0xBC, 0xBE, 0xBF, 0x81, 0x89, 0x8B, 0x8D, 0x9F, 0xA0, 0xA1, 0xA2, 0xA4, 0xA7, 0xB0, 0xB4, 0xBB, 0x82, 0x86, 0x87, 0x88, 0x8C, 0x92, 0x96, 0x98, 0x9C, 0xA1, 0xA2, 0xA7, 0xA8, 0xA9, 0xAA, 0xAC, 0xB0, 0xB2, 0xB6, 0xB8, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0x80, 0x83, 0x84, 0x86, 0x87, 0x88, 0x8B, 0x8E, 0x90, 0x93, 0x96, 0x99, 0x9A, 0xAE, 0xB0, 0xB4, 0xB7, 0xB8, 0xB9, 0xBA, 0xBF, 0x82, 0x83, 0x86, 0x88, 0x8A, 0x8D, 0x92, 0x96, 0x97, 0x9B, 0x9C, 0x9E, 0x9F, 0xA1, 0xA3, 0xA4, 0xA5, 0xA7, 0xAA, 0xAE, 0xB2, 0xB4, 0xB8, 0xBB, 0xBE, 0x81, 0x84, 0x87, 0x88, 0x89, 0x8B, 0x8C, 0x9B, 0x9E, 0x9F, 0xA0, 0xA4, 0xA5, 0xA6, 0xA9, 0xB7, 0xB8, 0xBA, 0xBC, 0x80, 0x87, 0x9A, 0x9B, 0xA1, 0xA3, 0xA5, 0xA6, 0xA8, 0xAB, 0xB9, 0xBE, 0xBF, 0x8B, 0x8E, 0x91, 0x9E, 0xA0, 0xA5, 0xAC, 0xAD, 0xB0, 0xB3, 0xB6, 0xB9, 0xBB, 0xBC, 0xBD, 0xBF, 0x87, 0x8D, 0x97, 0x9A, 0x9B, 0x9C, 0xA2, 0xA3, 0xA5, 0xA7, 0xA9, 0xAD, 0xAE, 0xAF, 0xB3, 0xBC, 0x82, 0x8C, 0x92, 0x94, 0x95, 0xA0, 0xA5, 0xA6, 0xA7, 0xB2, 0xB4, 0xBA, 0xBF, 0x85, 0x9D, 0xAB, 0xAC, 0xAF, 0xB2, 0xB4, 0xBC, 0x81, 0x86, 0x87, 0x8C, 0x8D, 0x8E, 0x91, 0x93, 0x95, 0x97, 0x9A, 0xA3, 0xA7, 0xA9, 0xAA, 0xAF, 0xB5, 0xBA, 0xBC, 0xBE, 0x81, 0x85, 0x86, 0x8A, 0x8B, 0x90, 0x91, 0x94, 0x9A, 0xA7, 0xA8, 0xAC, 0xAF, 0xB4, 0xBD, 0x81, 0x87, 0x8E, 0x91, 0x92, 0x99, 0xA6, 0xAA, 0xAB, 0xAC, 0xBA, 0xBC, 0xBE, 0x80, 0x81, 0x87, 0x88, 0x89, 0x90, 0x93, 0x95, 0x96, 0x97, 0x9A, 0x9D, 0x9E, 0x9F, 0xA0, 0xA2, 0xA5, 0xA8, 0xAD, 0xB7, 0xBA, 0xBF, 0x80, 0x81, 0x84, 0x85, 0x8A, 0x8D, 0x8E, 0x8F, 0x9D, 0xA6, 0xA7, 0xAA, 0xAE, 0xB0, 0xB3, 0xB9, 0xBA, 0xBD, 0xBE, 0xBF, 0x80, 0x81, 0x89, 0x8B, 0x91, 0x92, 0x95, 0x98, 0x9F, 0xA1, 0xA3, 0xA4, 0xA6, 0xA7, 0xA9, 0xAC, 0xB0, 0xBB, 0x80, 0x88, 0x8B, 0x8D, 0x8E, 0x94, 0x97, 0x98, 0x99, 0x9A, 0x9C, 0x9F, 0xA0, 0xAE, 0xB1, 0xB2, 0xB7, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0x80, 0x82, 0x83, 0x86, 0x89, 0x8D, 0x8E, 0x8F, 0x90, 0x97, 0xA1, 0xA2, 0xA3, 0xA9, 0xAB, 0xB0, 0xB4, 0xB6, 0xB9, 0xBA, 0xBD, 0xBF, 0x81, 0x83, 0x84, 0x88, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x9F, 0xA9, 0xAA, 0xAE, 0xAF, 0xB0, 0xB6, 0xBA, 0xBF, 0x83, 0x84, 0x85, 0x87, 0x88, 0x8A, 0x8B, 0x8D, 0x8F, 0x92, 0x93, 0x95, 0x99, 0x9A, 0x9C, 0x9D, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA5, 0xA6, 0xAA, 0xAD, 0xAF, 0xB0, 0xB6, 0xB8, 0xB9, 0xBA, 0xBF, 0x82, 0x84, 0x86, 0x88, 0x8A, 0x8B, 0x8F, 0x91, 0x98, 0x99, 0x9B, 0x9E, 0xA0, 0xA5, 0xA6, 0xA8, 0xAC, 0xB3, 0xB5, 0xB6, 0xB9, 0x85, 0x86, 0x88, 0x89, 0x8B, 0x8C, 0x8D, 0x8F, 0x90, 0x91, 0x92, 0x94, 0x96, 0x9D, 0xA5, 0xA7, 0xAC, 0xAE, 0xB0, 0xB1, 0xB4, 0xB5, 0xBA, 0x86, 0x87, 0x8B, 0x8D, 0x8F, 0x92, 0x94, 0x95, 0x97, 0x98, 0x99, 0x9A, 0x9C, 0x9D, 0x9F, 0xA1, 0xAA, 0xAD, 0xB1, 0xB4, 0xB8, 0x80, 0x81, 0x84, 0x86, 0x87, 0x89, 0x8B, 0x8C, 0x8F, 0x9D, 0xA0, 0xA4, 0xA5, 0xA6, 0xA9, 0xAD, 0xB3, 0xB6, 0xB7, 0x80, 0x87, 0x8D, 0x91, 0x92, 0x93, 0x94, 0x97, 0x9F, 0xA1, 0xA3, 0xA7, 0xAA, 0xAB, 0xB7, 0xB8, 0xBD, 0xBE, 0xBF, 0x80, 0x83, 0x8C, 0x8D, 0x8F, 0x90, 0x94, 0x96, 0x98, 0x9F, 0xA0, 0xA4, 0xA5, 0xAC, 0xB3, 0xB5, 0xBE, 0x81, 0x82, 0x83, 0x89, 0x8B, 0x8D, 0x90, 0x92, 0x95, 0x97, 0x98, 0x9B, 0x9F, 0xA1, 0xA2, 0xA4, 0xA5, 0xA7, 0xA8, 0xAB, 0xAD, 0xAE, 0xB1, 0xB2, 0xB3, 0xB9, 0xBD, 0xBE, 0x80, 0x82, 0x85, 0x8A, 0x8E, 0x92, 0x96, 0x98, 0x9C, 0x9E, 0x9F, 0xA0, 0xA2, 0xA7, 0xAF, 0xB2, 0xB4, 0xB6, 0xB8, 0xBA, 0xBB, 0xBE, 0x80, 0x82, 0x84, 0x85, 0x86, 0x8A, 0x8B, 0x8D, 0x90, 0x94, 0x95, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0xA0, 0xA1, 0xA2, 0xAB, 0xAC, 0xAE, 0xAF, 0xB0, 0xB2, 0xB3, 0xB5, 0xB9, 0xBA, 0xBF, 0x82, 0x83, 0x84, 0x85, 0x86, 0x8B, 0x8C, 0x8E, 0x8F, 0x90, 0x96, 0x9B, 0x9E, 0xA1, 0xA2, 0xA3, 0xA6, 0xA8, 0xAE, 0xB1, 0xB2, 0xB3, 0xB5, 0xB6, 0xB9, 0xBD, 0x89, 0x8F, 0x93, 0x99, 0x9A, 0x9B, 0x9C, 0x9F, 0xA2, 0xA3, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB4, 0xB5, 0xB8, 0xBA, 0xBB, 0xBD, 0xBE, 0xBF, 0x87, 0x8A, 0x8B, 0x8F, 0x91, 0x92, 0x95, 0x98, 0x9A, 0x9C, 0x9D, 0x9E, 0xA0, 0xA1, 0xA4, 0xA8, 0xA9, 0xAC, 0xAF, 0xB2, 0xB4, 0xBB, 0x81, 0x84, 0x85, 0x89, 0x8A, 0x8B, 0x92, 0x9B, 0x9E, 0x9F, 0xA1, 0xA2, 0xA3, 0xA6, 0xAB, 0xAE, 0xB1, 0xB2, 0xB5, 0xB7, 0xB9, 0xBA, 0xBB, 0xBD, 0xBE, 0x81, 0x83, 0x86, 0x8A, 0x8B, 0x8D, 0x94, 0x95, 0x96, 0x99, 0x9A, 0x9D, 0x9E, 0xA6, 0xA7, 0xA9, 0xAA, 0xAD, 0xB0, 0xB9, 0xBB, 0xBC, 0xBD, 0xBF, 0x82, 0x83, 0x88, 0x89, 0x8C, 0x8E, 0x8F, 0x90, 0x92, 0x93, 0x94, 0x96, 0x9B, 0x9C, 0xB6, 0xB8, 0xBA, 0x85, 0x8C, 0x8D, 0x8E, 0x90, 0x91, 0x94, 0x95, 0x98, 0x9F, 0xA0, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAE, 0xB0, 0xB2, 0xB5, 0xB7, 0xB8, 0xB9, 0x82, 0x83, 0x85, 0x86, 0x87, 0x88, 0x8A, 0x8C, 0x8E, 0x94, 0x9A, 0x9D, 0x9E, 0xA3, 0xA4, 0xA8, 0xA9, 0xAE, 0xAF, 0xB2, 0xB6, 0xB8, 0xB9, 0xBD, 0x81, 0x85, 0x86, 0x8A, 0x8C, 0x92, 0x94, 0x95, 0xA0, 0xA1, 0xA6, 0xA9, 0xAB, 0xB0, 0xB3, 0xB9, 0xBB, 0xBC, 0x80, 0x81, 0x83, 0x84, 0x85, 0x86, 0x8B, 0x8C, 0x90, 0x92, 0x95, 0x97, 0x98, 0x99, 0x9C, 0xA1, 0xA8, 0xB3, 0xB6, 0xBB, 0xBD, 0xBF, 0x86, 0x8A, 0x92, 0x96, 0x98, 0x9A, 0x9E, 0x9F, 0xA1, 0xA2, 0xA8, 0xAF, 0xB0, 0xB2, 0xB3, 0xB4, 0xB6, 0xB7, 0xB9, 0xBD, 0xBE, 0xBF, 0x84, 0x85, 0x86, 0x87, 0x89, 0x8B, 0x8C, 0x93, 0x96, 0x98, 0x9A, 0x9B, 0x9D, 0xA1, 0xA2, 0xA5, 0xA9, 0xAA, 0xAC, 0xAD, 0xAF, 0xB1, 0xB2, 0xB4, 0xBA, 0x83, 0x84, 0x86, 0x8C, 0x8E, 0x96, 0x99, 0x9A, 0x9B, 0x9D, 0x9E, 0xA1, 0xA4, 0xA5, 0xAF, 0xB1, 0xB4, 0xB8, 0xBC, 0xBD, 0x82, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x9A, 0x9B, 0xA3, 0xA9, 0xAF, 0xB1, 0xB3, 0xB9, 0xBE, 0x86, 0x8B, 0x8E, 0x90, 0x91, 0x93, 0x94, 0x95, 0x9F, 0xA5, 0xA6, 0xAB, 0xAE, 0xB0, 0xB1, 0xB4, 0xB8, 0xB9, 0xBA, 0xBF, 0x80, 0x82, 0x83, 0x88, 0x8A, 0x8F, 0x93, 0x95, 0x9A, 0x9C, 0x9D, 0xA0, 0xA3, 0xA4, 0xA8, 0xA9, 0xB0, 0xB3, 0xB5, 0xB8, 0xBA, 0xBD, 0xBE, 0xBF, 0x80, 0x82, 0x86, 0x88, 0x89, 0x8D, 0x91, 0x93, 0x98, 0x99, 0x9A, 0x9F, 0xA0, 0xA3, 0xA5, 0xA7, 0xA8, 0xAA, 0xAD, 0xB3, 0xB4, 0xBA, 0xBB, 0xBC, 0xBE, 0x81, 0x82, 0x85, 0x87, 0x88, 0x89, 0x8A, 0x8C, 0x8D, 0x8E, 0x90, 0x92, 0x96, 0x97, 0x98, 0x9B, 0x9C, 0x9E, 0x9F, 0xA9, 0xAA, 0xAB, 0xAC, 0xAE, 0xB3, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0x80, 0x87, 0x98, 0x99, 0x9A, 0x9D, 0x9F, 0xA2, 0xA4, 0xA6, 0xA8, 0xAA, 0xAB, 0xAE, 0xAF, 0xB1, 0xB2, 0xB6, 0xB7, 0xB8, 0xBE, 0x8B, 0x8D, 0x92, 0x99, 0x9D, 0x9F, 0xA5, 0xA6, 0xAB, 0xAC, 0xAD, 0xAF, 0xB1, 0xB3, 0xB8, 0xB9, 0xBB, 0xBD, 0x85, 0x91, 0x92, 0x93, 0x94, 0x97, 0x99, 0x9B, 0x9C, 0x9E, 0x9F, 0xA1, 0xA3, 0xA5, 0xA6, 0xA7, 0xAB, 0xB1, 0xB3, 0xB4, 0xB9, 0xBA, 0xBB, 0x82, 0x83, 0x84, 0x85, 0x86, 0x89, 0x8E, 0x96, 0x97, 0x98, 0x9C, 0xA3, 0xA8, 0xAB, 0xAF, 0xB1, 0xB2, 0xB4, 0xB5, 0xB6, 0xB8, 0xB9, 0x80, 0x85, 0x89, 0x8A, 0x8F, 0x90, 0x92, 0x98, 0xB3, 0xB5, 0xB7, 0xBB, 0xBC, 0x85, 0x87, 0x89, 0x8A, 0x8E, 0x93, 0x96, 0x9A, 0x9E, 0x9F, 0xA0, 0xA2, 0xA8, 0xAA, 0xAB, 0xB1, 0xB5, 0xBD, 0x81, 0x85, 0x8A, 0x8C, 0x8E, 0x93, 0x96, 0x98, 0x9C, 0x9F, 0xA0, 0xA9, 0xAB, 0xAF, 0xB0, 0xB1, 0xB2, 0xB4, 0xB7, 0xBB, 0xBD, 0x83, 0x84, 0x87, 0x8B, 0x8C, 0x8D, 0x8E, 0x93, 0xA0, 0xA2, 0xA9, 0xAA, 0xAC, 0xB1, 0xB5, 0xB8, 0xBC, 0xBD, 0x86, 0x89, 0x8E, 0x97, 0x9B, 0xA1, 0xA2, 0xA3, 0xA6, 0xA9, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB1, 0xB5, 0xB7, 0xB9, 0xBA, 0x82, 0x84, 0x8B, 0x90, 0x94, 0x99, 0x9C, 0x9F, 0xA1, 0xAD, 0xB2, 0xB8, 0xB9, 0xBB, 0xBC, 0xBF, 0x81, 0x84, 0x86, 0x89, 0x8A, 0x8B, 0x8D, 0x90, 0x91, 0x96, 0x99, 0x9A, 0xAC, 0xAE, 0xB4, 0xBC, 0xBF, 0x80, 0x86, 0x91, 0x93, 0x94, 0x95, 0x97, 0x98, 0x9A, 0x9F, 0xA1, 0xA6, 0xAC, 0xAD, 0xB5, 0xBD, 0x80, 0x81, 0x83, 0x88, 0x89, 0x8A, 0x8B, 0x8E, 0x95, 0x97, 0x98, 0x9A, 0xA3, 0xA8, 0xA9, 0xAA, 0xAD, 0xB7, 0xBE, 0x80, 0x84, 0x87, 0x88, 0x8A, 0x90, 0x91, 0x94, 0x97, 0x99, 0x9B, 0x9C, 0xA4, 0xA6, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAE, 0xAF, 0xB9, 0xBA, 0x81, 0x89, 0x8D, 0x8F, 0x90, 0x95, 0x9C, 0x9D, 0xA4, 0xA5, 0xA9, 0xAA, 0xB7, 0xB9, 0xBA, 0xBB, 0xBE, 0x82, 0x86, 0x87, 0x8A, 0x8B, 0x93, 0x96, 0x97, 0x9A, 0xA2, 0xAD, 0xAF, 0xB0, 0xBF, 0x8D, 0x8E, 0x90, 0x94, 0x95, 0x9A, 0x9C, 0x9E, 0x9F, 0xA7, 0xAB, 0xB1, 0xB9, 0xBB, 0x8A, 0x8B, 0x8C, 0x93, 0x95, 0xA3, 0xA4, 0xA9, 0xAA, 0xAB, 0xAF, 0xB0, 0xB6, 0x84, 0x86, 0x87, 0x89, 0x8B, 0x8D, 0x8E, 0x94, 0x99, 0x9B, 0x9E, 0x9F, 0xA4, 0xA9, 0xAC, 0xAD, 0xAE, 0xAF, 0xB8, 0xB9, 0xBB, 0xBE, 0x80, 0x82, 0x83, 0x86, 0x88, 0x89, 0x8A, 0x8D, 0x91, 0x92, 0x98, 0x9A, 0x9C, 0xA5, 0xA9, 0xB4, 0xB7, 0xBB, 0xBF, 0x89, 0x8B, 0x8C, 0x8E, 0x93, 0x95, 0x97, 0x99, 0x9F, 0xA0, 0xA3, 0xA6, 0xA8, 0xAA, 0xAE, 0xB4, 0xB6, 0xB8, 0xBF, 0x82, 0x8D, 0x9F, 0xA2, 0xAB, 0xAF, 0xB3, 0xBA, 0xBB, 0xBD, 0x80, 0x84, 0x86, 0x87, 0x8B, 0x90, 0x92, 0xA0, 0xAF, 0xB2, 0xB6, 0xB7, 0xB9, 0xBB, 0xBE, 0x85, 0x8D, 0x8E, 0x8F, 0x91, 0x95, 0x96, 0xA1, 0xA2, 0xA3, 0xA7, 0xB1, 0xB6, 0xB9, 0xBB, 0x80, 0x82, 0x84, 0x86, 0x8C, 0x8D, 0x92, 0x93, 0x97, 0x99, 0x9B, 0x9D, 0x9E, 0xA1, 0xA2, 0xA3, 0xA8, 0xAB, 0xB0, 0xB2, 0xB5, 0xB7, 0xBD, 0xBE, 0xBF, 0x81, 0x82, 0x88, 0x8B, 0x8D, 0x92, 0x96, 0x97, 0x99, 0x9E, 0xA2, 0xA4, 0xAB, 0xAE, 0xB0, 0xB1, 0xB4, 0xB5, 0xB7, 0xBF, 0x81, 0x82, 0x83, 0x84, 0x85, 0x8F, 0x94, 0x95, 0x98, 0x99, 0x9C, 0x9D, 0x9F, 0xA1, 0xA8, 0xB2, 0xB3, 0xB4, 0xB8, 0xB9, 0xBC, 0xBD, 0xBE, 0x82, 0x84, 0x87, 0x8A, 0x8C, 0x90, 0x92, 0x93, 0x9D, 0x9E, 0xA5, 0xAA, 0xAB, 0xB6, 0xB8, 0xBB, 0x81, 0x83, 0x84, 0x8C, 0x8D, 0x96, 0x9E, 0x9F, 0xA0, 0xA4, 0xA6, 0xAA, 0xAD, 0xAF, 0xB2, 0xB4, 0xB7, 0xBE, 0xBF, 0x81, 0x83, 0x86, 0x87, 0x88, 0x8A, 0x8B, 0x8F, 0x93, 0x96, 0x97, 0x98, 0x9A, 0xA1, 0xA6, 0xA7, 0xA9, 0xAA, 0xAC, 0xAF, 0xB2, 0xB3, 0xBA, 0xBD, 0xBF, 0x80, 0x92, 0x9A, 0x9C, 0x9D, 0xA3, 0xA6, 0xA7, 0xB4, 0xB8, 0x80, 0x82, 0x83, 0x88, 0x8A, 0x8C, 0x8E, 0x90, 0x93, 0x96, 0x97, 0x98, 0x9B, 0x9D, 0x9F, 0xA3, 0xA5, 0xAA, 0xAD, 0xB1, 0xB3, 0xB4, 0xB6, 0xBA, 0xBB, 0xBC, 0x81, 0x86, 0x88, 0x90, 0x91, 0x92, 0x94, 0x95, 0x9B, 0x9E, 0xA0, 0xA2, 0xA3, 0xA6, 0xA9, 0xAB, 0xAC, 0xAD, 0xAE, 0xB0, 0xB1, 0xB2, 0xB3, 0xBC, 0x82, 0x84, 0x85, 0x87, 0x89, 0x8C, 0x8D, 0x91, 0x93, 0x95, 0x98, 0x9A, 0x9E, 0xA0, 0xA1, 0xA3, 0xA4, 0xA5, 0xA6, 0xA8, 0xAC, 0xAD, 0xB0, 0xB2, 0xB9, 0xBC, 0xBF, 0x82, 0x84, 0x87, 0x8B, 0x8C, 0x8D, 0x8F, 0x92, 0x96, 0x9A, 0x9B, 0x9C, 0x9E, 0xA0, 0xA1, 0xA2, 0xA4, 0xA6, 0xA7, 0xAB, 0xAD, 0xAE, 0xB1, 0xB3, 0xB7, 0xB8, 0xBA, 0xBE, 0x80, 0x81, 0x82, 0x84, 0x87, 0x8C, 0x8E, 0x90, 0x94, 0x96, 0x97, 0x99, 0x9A, 0x9B, 0x9D, 0xA0, 0xA1, 0xA6, 0xA8, 0xAB, 0xAC, 0xB3, 0xB9, 0xBE, 0x81, 0x89, 0x8C, 0x8E, 0x8F, 0x96, 0x98, 0x9A, 0x9B, 0x9C, 0x9F, 0xA6, 0xAB, 0xAC, 0xAF, 0xB0, 0xB1, 0xB2, 0xB4, 0xB7, 0xBD, 0x80, 0x83, 0x8A, 0x8C, 0x8E, 0x90, 0x92, 0x93, 0x96, 0x99, 0x9A, 0xB7, 0xBA, 0xBF, 0x81, 0x86, 0x88, 0x8A, 0x8C, 0x8E, 0x90, 0x95, 0x9A, 0xA1, 0xA2, 0xAA, 0xAB, 0xAC, 0xB8, 0xB9, 0xBA, 0xBC, 0x82, 0x85, 0x89, 0x8A, 0x8C, 0x8D, 0x8E, 0x94, 0x98, 0x9D, 0x9E, 0xA0, 0xA1, 0xA2, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB2, 0xB3, 0xB4, 0xB6, 0xB7, 0xB8, 0xBB, 0xBC, 0xBD, 0xBF, 0x80, 0x81, 0x82, 0x83, 0x84, 0x87, 0x88, 0x8A, 0x8D, 0x8E, 0x91, 0x93, 0x9A, 0x9B, 0x9C, 0x9E, 0xA0, 0xA2, 0xA3, 0xA4, 0xA6, 0xAA, 0xAD, 0xBA, 0xBB, 0xBC, 0xBD, 0x84, 0x85, 0x87, 0x88, 0x8A, 0x8B, 0x8D, 0x8F, 0x90, 0x93, 0x94, 0x96, 0xA4, 0xA6, 0xA7, 0xAB, 0xAD, 0xB0, 0xB1, 0xB3, 0xB4, 0xB7, 0x81, 0x85, 0x8A, 0x99, 0xA3, 0xA8, 0xB3, 0xBA, 0xBE, 0x82, 0x8B, 0x8C, 0x8F, 0x96, 0x9A, 0x9B, 0x9D, 0x9F, 0xA1, 0xA3, 0xA8, 0xAA, 0xAB, 0xAF, 0xB3, 0xB5, 0xBC, 0xBF, 0x88, 0x89, 0x8A, 0x8F, 0x90, 0x9D, 0x9E, 0x9F, 0xAA, 0xB0, 0xB4, 0xB5, 0x82, 0x84, 0x87, 0x88, 0x89, 0x8A, 0x8C, 0x90, 0x95, 0x99, 0x9F, 0xA0, 0xA3, 0xA4, 0xB2, 0xB4, 0xB6, 0xBC, 0x81, 0x84, 0x85, 0x87, 0x8A, 0x8B, 0x8D, 0x91, 0x93, 0x94, 0x99, 0xA1, 0xAA, 0xAB, 0xAC, 0xAF, 0xB0, 0xB1, 0xBE, 0x85, 0x86, 0x88, 0x8A, 0x8B, 0x8C, 0x8D, 0x92, 0x9B, 0x9F, 0xA2, 0xA3, 0xAB, 0xB8, 0xBB, 0xBC, 0xBD, 0xBE, 0x83, 0x85, 0x89, 0x8A, 0x8C, 0x92, 0x93, 0x94, 0x95, 0x99, 0x9B, 0x9C, 0x9D, 0x9F, 0xA6, 0xA9, 0xAA, 0xAF, 0xB3, 0xB8, 0xB9, 0xBB, 0xBE, 0xBF, 0x82, 0x84, 0x85, 0x86, 0x89, 0x8C, 0x8D, 0x8E, 0x97, 0x9C, 0x9F, 0xA1, 0xA2, 0xA3, 0xA4, 0x9B, 0x9C, 0x9E, 0x9F, 0xA3, 0xA7, 0xA8, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB7, 0xBA, 0xBB, 0xBC, 0xBF, 0x82, 0x84, 0x85, 0x8E, 0x91, 0x94, 0x9A, 0xA2, 0xA5, 0xA6, 0xA9, 0xAA, 0xAB, 0xAD, 0xAF, 0xB0, 0xB4, 0xB7, 0xB8, 0xB9, 0xBA, 0xBD, 0x80, 0x81, 0x83, 0x85, 0x86, 0x8B, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x93, 0x94, 0x95, 0x96, 0x97, 0x99, 0x9A, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA7, 0xAE, 0xB1, 0xB2, 0xB5, 0xB6, 0xB8, 0xB9, 0xBC, 0xBE, 0x81, 0x82, 0x85, 0x87, 0x89, 0x8A, 0x8B, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x98, 0x99, 0x9C, 0x9E, 0xA0, 0xA1, 0xA3, 0xA5, 0xA8, 0xA9, 0xAD, 0xAE, 0xAF, 0xB2, 0xB5, 0xB6, 0xB7, 0xB8, 0xBA, 0xBC, 0xBD, 0xBF, 0x80, 0x81, 0x82, 0x83, 0x84, 0x87, 0x89, 0x8A, 0x8F, 0x91, 0xA3, 0xA6, 0xA8, 0xAA, 0xAF, 0xB1, 0xB5, 0xB8, 0x81, 0x8A, 0x8E, 0x9B, 0xA1, 0xA2, 0xA4, 0xA8, 0xAD, 0xB5, 0xB7, 0xBD, 0x82, 0x92, 0x99, 0xAD, 0xB0, 0xB2, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x92, 0x94, 0x96, 0x98, 0xA2, 0xA3, 0xA5, 0xA9, 0xAA, 0xAC, 0xB2, 0xB3, 0xB5, 0xB7, 0xB8, 0x82, 0x87, 0x89, 0x8B, 0x8D, 0x90, 0x92, 0x97, 0x9C, 0xA2, 0xA4, 0xAA, 0xAB, 0xAF, 0xB4, 0xB5, 0xB8, 0xBA, 0x80, 0x81, 0x86, 0x87, 0x88, 0x89, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x96, 0x98, 0x9B, 0x9C, 0x9D, 0x9F, 0xA1, 0xA3, 0xA6, 0xA7, 0xB5, 0xB6, 0xBC, 0xBF, 0x8D, 0x8E, 0x91, 0x94, 0x95, 0x9E, 0xA9, 0xAC, 0xB4, 0xB7, 0xBF, 0x84, 0x85, 0x88, 0x89, 0x8B, 0x90, 0x97, 0x9A, 0x9B, 0x9E, 0xA2, 0xA4, 0xA6, 0xB1, 0xBE, 0x80, 0x83, 0x85, 0x91, 0x93, 0x95, 0x96, 0x98, 0x9A, 0x9B, 0x9C, 0xAD, 0xB7, 0xB9, 0x8F, 0x92, 0xA4, 0xA9, 0xAA, 0xAD, 0xB2, 0xB3, 0xB8, 0xBA, 0xBC, 0x86, 0x8F, 0x90, 0x98, 0x99, 0x9A, 0xA0, 0xA2, 0xA3, 0xA6, 0xA8, 0xAB, 0xAC, 0xAE, 0xAF, 0xB2, 0xB5, 0xBA, 0xBB, 0x84, 0x8B, 0x8D, 0x94, 0x96, 0x9B, 0x9C, 0xA0, 0xAC, 0xAE, 0xB5, 0xBC, 0xBE, 0x8C, 0x94, 0x96, 0x97, 0x9A, 0xA7, 0xAC, 0xAD, 0xAE, 0xB0, 0xB9, 0x83, 0x88, 0x90, 0x91, 0x96, 0x97, 0x98, 0x9D, 0xA1, 0xA4, 0xA5, 0xA8, 0x83, 0x87, 0x90, 0x93, 0x94, 0x98, 0x99, 0x9A, 0xA1, 0xAB, 0xB5, 0xB6, 0xB8, 0xBA, 0x81, 0x84, 0x91, 0x92, 0x93, 0x9A, 0x9B, 0x9E, 0xA0, 0xA2, 0xAA, 0xB0, 0xB5, 0xB7, 0xBC, 0xBD, 0xBE, 0xBF, 0x81, 0xB7, 0x80, 0x82, 0x83, 0x87, 0x89, 0x8A, 0x8B, 0x8F, 0x91, 0x93, 0x94, 0x96, 0x98, 0x99, 0xA0, 0xA2, 0xA3, 0xA4, 0xA5, 0xA7, 0xA8, 0xAD, 0xB2, 0xB9, 0xBB, 0xBC, 0xBE, 0x83, 0x87, 0x8A, 0x8C, 0x8D, 0x94, 0x95, 0x96, 0x98, 0x9C, 0xA1, 0xA2, 0xA5, 0x9C, 0xA1, 0xA8, 0xAA, 0xAE, 0xAF, 0xB2, 0xBB, 0xBF, 0x80, 0x82, 0x84, 0x8B, 0x8C, 0x8D, 0x8F, 0x90, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xAA, 0xAC, 0xB0, 0xB2, 0xB3, 0xB5, 0xB6, 0xB7, 0xB8, 0xBA, 0xBD, 0x85, 0x86, 0x88, 0x8A, 0x8B, 0x8D, 0x8E, 0x8F, 0x94, 0x95, 0x97, 0x98, 0x99, 0x9B, 0x9C, 0xA0, 0xA3, 0xA7, 0xA8, 0xAA, 0xB0, 0xB1, 0xB2, 0xB4, 0xB6, 0xB7, 0xB8, 0xB9, 0xBB, 0xBC, 0x80, 0x81, 0x84, 0x85, 0x86, 0x87, 0x89, 0x8B, 0x8C, 0x8D, 0x8E, 0x91, 0x95, 0x96, 0x99, 0x9B, 0x9C, 0xA2, 0xA3, 0xA8, 0xAA, 0xAB, 0xB0, 0xB2, 0xB6, 0xB7, 0xB9, 0xBB, 0x80, 0x84, 0x86, 0x87, 0x88, 0x8A, 0x8D, 0x8E, 0x8F, 0x91, 0x93, 0x96, 0x99, 0x9C, 0x9E, 0xA4, 0xA7, 0xAA, 0xB0, 0xB2, 0xB8, 0xB9, 0xBD, 0xBE, 0x82, 0x84, 0x86, 0x88, 0x89, 0x92, 0x96, 0x99, 0x9C, 0x9E, 0xA0, 0xA1, 0xA2, 0xA4, 0xA6, 0xA8, 0xA9, 0xAB, 0xAD, 0xB1, 0xB4, 0xB9, 0xBA, 0xBC, 0x81, 0x84, 0x85, 0x86, 0x8B, 0x8D, 0x8F, 0x90, 0x98, 0x9C, 0xA0, 0xA3, 0xA6, 0xA8, 0xAB, 0xAD, 0xB3, 0xB4, 0x83, 0x86, 0x88, 0x8B, 0x93, 0x9C, 0xAD, 0xAE, 0xB2, 0xB3, 0xB5, 0xB6, 0xBB, 0xBF, 0x81, 0x82, 0x83, 0x85, 0x86, 0x88, 0x8C, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x97, 0x98, 0x9A, 0xA1, 0xA4, 0xAC, 0xAD, 0xB4, 0xB7, 0xB8, 0xBB, 0xBC, 0xBD, 0x86, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x94, 0x95, 0x98, 0x9B, 0x9E, 0xA7, 0xAB, 0xAF, 0xB0, 0xB1, 0xB3, 0xB4, 0xA8, 0xAA, 0xAF, 0xB1, 0xB6, 0x83, 0x84, 0x86, 0x9B, 0x9C, 0x9F, 0xA2, 0xA9, 0xAB, 0xAD, 0xAE, 0xAF, 0xB2, 0xB4, 0xBC, 0xBD, 0xBE, 0x83, 0x85, 0x89, 0x8A, 0x8C, 0x90, 0x92, 0x93, 0x94, 0x98, 0x9D, 0x9E, 0xA0, 0xA1, 0xA4, 0xA8, 0xAC, 0xAE, 0xBD, 0xBE, 0x82, 0x85, 0x89, 0x8B, 0x8C, 0x90, 0x91, 0x92, 0x95, 0x97, 0x96, 0x97, 0x98, 0x99, 0xA5, 0xA8, 0xAC, 0xAD, 0xAE, 0xB3, 0xB4, 0xBC, 0x81, 0x84, 0x85, 0x86, 0x88, 0x90, 0x91, 0x92, 0x95, 0x98, 0x9B, 0x9D, 0x9F, 0xA2, 0xAD, 0xAE, 0xB1, 0xB2, 0xB8, 0xBB, 0xBF, 0x81, 0x85, 0x8E, 0x8F, 0x92, 0x93, 0x99, 0xA8, 0xAB, 0xB0, 0xB7, 0xBE, 0x80, 0x82, 0x83, 0x85, 0x8D, 0x95, 0x97, 0x9A, 0x9B, 0x9F, 0xA2, 0xA4, 0xA5, 0xA9, 0xAA, 0xAB, 0xA8, 0xAD, 0xB0, 0xB8, 0xBC, 0x80, 0x84, 0x8F, 0x91, 0x93, 0x94, 0x98, 0x9E, 0x9F, 0xA2, 0xA3, 0xA6, 0xAA, 0xAB, 0xAD, 0xAE, 0xAF, 0xB1, 0xB4, 0xB7, 0xBB, 0x86, 0x98, 0x9A, 0x9F, 0xA2, 0xA3, 0xA5, 0xA7, 0xA8, 0xA9, 0xAA, 0xAE, 0xAF, 0xB1, 0xB2, 0xBB, 0xBC, 0x81, 0x82, 0x83, 0x84, 0x85, 0x8D, 0x8E, 0x8F, 0x91, 0x94, 0x98, 0x9A, 0xAF, 0xB4, 0x83, 0x8E, 0x91, 0x92, 0x93, 0x96, 0x97, 0x9F, 0xA0, 0xA8, 0xAA, 0xAB, 0xAD, 0xAE, 0xB4, 0xB9, 0x80, 0x86, 0x89, 0x8A, 0x8F, 0x91, 0x92, 0x94, 0x96, 0x9B, 0xA1, 0xA2, 0xA3, 0xA4, 0xA8, 0xB0, 0xB1, 0xB2, 0xB5, 0x84, 0x86, 0x88, 0x89, 0x8A, 0x8C, 0x8D, 0x90, 0x92, 0x93, 0x94, 0x95, 0x9B, 0xA1, 0xA4, 0xA5, 0xAD, 0xAE, 0xAF, 0xB0, 0xB2, 0xB9, 0xBA, 0xBB, 0xBE, 0x86, 0x87, 0x88, 0x92, 0x97, 0x9A, 0xA0, 0xA7, 0xB6, 0xB8, 0xA5, 0xA7, 0xA9, 0xAB, 0xAC, 0xB0, 0xB3, 0xB4, 0xB6, 0x83, 0x86, 0x87, 0x88, 0x89, 0x8E, 0x92, 0x95, 0x9B, 0x9F, 0xA3, 0xA6, 0xA8, 0xAA, 0xAB, 0xAC, 0xBB, 0xBE, 0xBF, 0x81, 0x84, 0x86, 0x88, 0x90, 0x91, 0x99, 0x9C, 0x9D, 0x9E, 0xA0, 0xA1, 0xA4, 0xAC, 0xAF, 0xB2, 0xBA, 0x87, 0x89, 0x8F, 0x9A, 0xA4, 0xA9, 0xAB, 0xAF, 0xB2, 0xB4, 0xB8, 0xBA, 0xBB, 0x81, 0x82, 0x84, 0x86, 0x8F, 0x93, 0x99, 0xA6, 0xAD, 0xAF, 0xB2, 0xB8, 0xB9, 0xBA, 0xBD, 0x9A, 0x9B, 0x9E, 0xB5, 0xB8, 0xB9, 0xBD, 0xBF, 0x81, 0x88, 0x8B, 0x8C, 0x91, 0x92, 0x93, 0x95, 0x97, 0x9D, 0x9F, 0xA5, 0xA6, 0xA9, 0xAA, 0xAD, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBE, 0xBF, 0x84, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x92, 0x94, 0x98, 0x99, 0x9B, 0x9C, 0x9D, 0x9E, 0xA0, 0xA5, 0xA8, 0xAF, 0xB4, 0xB6, 0xB7, 0xB9, 0xBB, 0xBC, 0xBD, 0x87, 0x88, 0x8E, 0x93, 0x95, 0xA0, 0xA1, 0xAC, 0xBB, 0xBE, 0x8A, 0x8B, 0x8E, 0x8F, 0x92, 0x94, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA6, 0xA7, 0xAA, 0xAC, 0xB2, 0xB6, 0xB7, 0x8D, 0x95, 0x9C, 0x9D, 0xA0, 0x81, 0x83, 0x84, 0x85, 0x86, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0xA0, 0xA1, 0xA2, 0xA3, 0xA5 }; #define UTF8_CODE_2B_1_NUM (sizeof(Utf8CodeTable_2B_1st)/2) #define UTF8_CODE_3B_1_NUM (sizeof(Utf8CodeTable_3B_1st)/2) #define UTF8_CODE_3B_2_NUM (sizeof(Utf8CodeTable_3B_2nd)/2) #define UTF8_CODE_2B_2_NUM sizeof(Utf8CodeTable_2B_2nd) #define UTF8_CODE_3B_3_NUM sizeof(Utf8CodeTable_3B_3rd) static font_work_t FontWork[NUM_FONT_WORK]; static uint8_t font_data[256]; #endif /* * フォントの幅を取得する * param1 phead: フォントヘッダ * param2 c: キャラクタ * param3 len:キャラクタの長さ領域へのポインタ * return フォント幅 */ static int GetFontWidth(font_head_t *phead, uint8_t c, int *len) { const font_t **pf = phead->font_table; int width; width = phead->font_width; *len = 1; if(phead->file_attribute == 0){ if(c < 0x80 || c >= 0xA0) width = pf[c]->width; } else if((c & 0xE0) == 0xC0) *len = 2; else if((c & 0xF0) == 0xE0) *len = 3; else if((c & 0xF8) == 0xF0) *len = 4; else if(c < 0x80 || c >= 0xA0) width = pf[c]->width; return width; } #ifndef NOT_USEFILFONT /* * 2バイトコードビットマップ番号 */ static int GetFont2BNo(font_work_t *pft, uint8_t *ptr) { int totalk = 0; uint32_t i, j; for(i = 0 ; i < UTF8_CODE_2B_1_NUM; i++){ if(Utf8CodeTable_2B_1st[i][0] == ptr[0]) { for(j = 0 ; j < Utf8CodeTable_2B_1st[i][1] ; j++) { if(Utf8CodeTable_2B_2nd[totalk] == ptr[1]) return totalk; totalk++; } } else totalk += Utf8CodeTable_2B_1st[i][1]; } return -1; } /* * 3バイトコードビットマップ番号 */ static int GetFont3BNo(font_work_t *pft, uint8_t *ptr) { int totalk = 0; int totalj = 0; uint32_t i, j, k; for(i = 0 ; i < UTF8_CODE_3B_1_NUM ; i++){ if(Utf8CodeTable_3B_1st[i][0] == ptr[0]){ for(j = 0 ; j < Utf8CodeTable_3B_1st[i][1]; j++){ if(Utf8CodeTable_3B_2nd[totalj][0] == ptr[1]){ for(k = 0 ; k < Utf8CodeTable_3B_2nd[totalj][1]; k++) { if(Utf8CodeTable_3B_3rd[totalk] == ptr[2]) return totalk; totalk++; } return -1; } else /*読み飛ばすbitmap個数を蓄積*/ totalk += Utf8CodeTable_3B_2nd[totalj][1]; totalj++; } } else{ /*読み飛ばすbitmap個数を蓄積*/ for(j = 0 ; j < Utf8CodeTable_3B_1st[i][1] ; j++){ totalk += Utf8CodeTable_3B_2nd[totalj][1]; totalj++; } } } return -1; } #endif /* * 文字描画 * param1 pDrawProp: Pointer to Draw Prop * param2 x0: 文字描画 X座標始点 * param3 y0: 文字描画 Y座標始点 * param4 c: 文字イメージへのポインタ */ #ifndef MAX_FONT_IMAGE static void DrawChar(LCD_DrawProp_t *pDrawProp, uint16_t x0, uint16_t y0, const font_t *pf) { LCD_Handler_t *hlcd = pDrawProp->hlcd; uint32_t h, w; const uint8_t *pchar; for(h = 0 ; h < pf->height ; h++){ pchar = (pf->image + pf->stride * h); for(w = 0; w < pf->width ; w++){ if(pf->stride != 0 && (pchar[w/8] & (1 << (7 - (w % 8)))) != 0){ lcd_drawPixel(hlcd, (x0 + w), (y0 + h), pDrawProp->TextColor); } else{ lcd_drawPixel(hlcd, (x0 + w), (y0 + h), pDrawProp->BackColor); } } } } #else static void DrawChar(LCD_DrawProp_t *pDrawProp, uint16_t x0, uint16_t y0, const font_t *pf) { LCD_Handler_t *hlcd = pDrawProp->hlcd; uint32_t h, w; const uint8_t *pchar; #ifdef TRS_COLOR_T TRS_COLOR_T image[MAX_FONT_IMAGE]; #else color_t image[MAX_FONT_IMAGE]; #endif for(h = 0 ; h < pf->height ; h++){ pchar = (pf->image + pf->stride * h); for(w = 0; w < pf->width ; w++){ if(pf->stride != 0 && (pchar[w/8] & (1 << (7 - (w % 8)))) != 0){ image[w] = pDrawProp->TextColor; } else{ image[w] = pDrawProp->BackColor; } } lcd_drawImageHLine(hlcd, x0, (y0 + h), pf->width, image); } } #endif /* * 一文字描画(UTF8) * param1 pDrawProp: Pointer to Draw Prop * param2 x0: 文字描画 X座標始点 * param3 y0: 文字描画 Y座標始点 * param4 描画コードへのポインタ */ static void lcd_DisplayData(LCD_DrawProp_t *pDrawProp, uint16_t x0, uint16_t y0, uint8_t *ptr) { font_head_t *phead = (font_head_t *)pDrawProp->pFont; DrawChar(pDrawProp, x0, y0, lcd_getFontTable(phead, ptr)); } /* * フォントデータからフォントテーブルを取り出す * param1 phead: フォントヘッダ * param2 ptr: フォントデータへのポインタ * return フォントテーブルへのポインタ */ const font_t * lcd_getFontTable(font_head_t *phead, uint8_t *ptr) { const font_t **pf = phead->font_table; int len; #ifndef NOT_USEFILFONT char fname[32+4]; font_t *pwf = (font_t *)font_data; font_file_head_t *pffh; font_work_t *pft = NULL; int no, i, k, off = 0; #endif GetFontWidth(phead, *ptr, &len); if(len == 1) return pf[*ptr]; else if(phead->file_attribute == 0) return pf[*ptr]; else{ #ifndef NOT_USEFILFONT pwf->width = phead->font_width; pwf->height = phead->font_height; pwf->stride = (phead->font_width + 7) >> 3; pwf->iheight = phead->font_height; memset(pwf->image, 0, pwf->height * pwf->stride); if(phead->pdata == NULL){ for(i = 0 ; i < NUM_FONT_WORK ; i++){ if(FontWork[i].pffont == NULL){ pft = &FontWork[i]; break; } } if(pft != NULL){ sprintf(fname, "%s.fnt", phead->font_name); pft->pffont = fopen(fname, "rb"); if(pft->pffont != NULL){ if(fread(pft->table, sizeof(font_file_head_t), 1, pft->pffont) != 1){ phead->file_attribute = 0x00; fclose(pft->pffont); pft->pffont = NULL; } else{ pffh = (font_file_head_t *)pft->table; pft->offset_image_2B = pffh->off_2byte_font; pft->offset_image_3B = pffh->off_3byte_font; pft->num_table2B = pffh->siz_2byte_font; pft->num_table3B = pffh->siz_3byte_font; pft->image_size = pffh->csize + pffh->isize; phead->pdata = pft; } } else phead->file_attribute = 0x00; } else phead->file_attribute = 0x00; } if((pft = phead->pdata) != NULL){ no = -1; if(len == 2){ no = GetFont2BNo(pft, ptr); off = pft->offset_image_2B; } else if(len == 3){ no = GetFont3BNo(pft, ptr); off = pft->offset_image_3B; } if(no >= 0){ uint32_t length = 0; uint32_t data = 0, j, c; fseek(pft->pffont, (no * pft->image_size + off), SEEK_SET); fread(pft->table, pft->image_size, 1, pft->pffont); for(i = j = k = no = 0 ; i < phead->font_height ; i++){ while(length < phead->font_width){ data <<= 8; data |= pft->table[no+1]; length += 8; no++; } j = phead->font_width; while(j >= 8){ c = data >> (length - 8); j -= 8; length -= 8; pwf->image[k++] = c; } if(j > 0){ c = data << (8-j); length -= j; pwf->image[k++] = c; } } } } return pwf; #else return pf[*ptr]; #endif } } /* * 文字列表示ラインクリア * param1 pDrawProp: Pointer to Draw Prop * param2 ライン番号 */ void lcd_clearStringLine(LCD_DrawProp_t *pDrawProp, uint16_t Line) { font_head_t *phead = (font_head_t *)pDrawProp->pFont; lcd_fillRect(pDrawProp->hlcd, 0, (Line * phead->font_height), pDrawProp->hlcd->_width, phead->font_height, pDrawProp->BackColor); } /* * 一文字描画 * param1 pDrawProp: Pointer to Draw Prop * param2 x0: 文字描画 X座標始点 * param3 y0: 文字描画 Y座標始点 * param4 描画アスキーコード(範囲は0x20から0x7Eまで) */ void lcd_DisplayChar(LCD_DrawProp_t *pDrawProp, uint16_t x0, uint16_t y0, uint8_t Ascii) { font_head_t *phead = (font_head_t *)pDrawProp->pFont; const font_t **pf = phead->font_table; DrawChar(pDrawProp, x0, y0, pf[Ascii]); } /* * 文字列描画 * param1 pDrawProp: Pointer to Draw Prop * param1 x0: 文字列描画 X座標始点 * param2 y0: 文字列描画 Y座標始点 * param3 Text: 描画文字列へのポインタ * param4 Mode: 表示モード */ void lcd_DisplayStringAt(LCD_DrawProp_t *pDrawProp, uint16_t x0, uint16_t y0, uint8_t *Text, Line_ModeTypdef Mode) { LCD_Handler_t *hlcd = pDrawProp->hlcd; font_head_t *phead = (font_head_t *)pDrawProp->pFont; const font_t **pf = phead->font_table; uint16_t ref_column = 1; uint32_t size = 0; uint8_t *ptr = (uint8_t *)Text, c; int wid, len = 1; /* Get the text size */ while(*ptr){ size += GetFontWidth(phead, *ptr, &len); ptr += len; } switch (Mode){ case CENTER_MODE: ref_column = x0 + (hlcd->_width - size) / 2; break; case LEFT_MODE: ref_column = x0; break; case RIGHT_MODE: ref_column = - x0 + (hlcd->_width - size); break; default: ref_column = x0; break; } /* * 開始カラム位置をスクリーン内に収める */ if((ref_column < 1) || (ref_column >= 0x8000)){ ref_column = 1; } /* * 一文字描画を使って文字列を描画する */ while (((c = *Text) != 0) && pf[c] != 0 && (ref_column + (wid = GetFontWidth(phead, c, &len))) <= hlcd->_width){ lcd_DisplayData(pDrawProp, ref_column, y0, Text); ref_column += wid; /* 次のカラムに移動 */ Text += len; /* 次の文字に移動 */ } } /* * 文字列描画 * param1 pDrawProp: Pointer to Draw Prop * param2 x0: 文字列描画 X座標始点 * param3 y0: 文字列描画 Y座標始点 * param4 Text: 描画文字列へのポインタ */ void lcd_DisplayStringAtLine(LCD_DrawProp_t *pDrawProp, uint16_t Line, uint8_t *ptr) { font_head_t *phead = (font_head_t *)pDrawProp->pFont; const font_t *pf; pf = phead->font_table[' ']; lcd_DisplayStringAt(pDrawProp, 0, Line * pf->height, ptr, LEFT_MODE); }