From cc988b21485929d9389fcfd6a4831952adeb24c9 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Wed, 13 Dec 2023 22:46:09 +0100 Subject: [PATCH 01/13] [AdaGFX_helper] Reduce build-size --- src/src/Helpers/AdafruitGFX_helper.cpp | 467 ++++++++----------------- src/src/Helpers/AdafruitGFX_helper.h | 1 + 2 files changed, 144 insertions(+), 324 deletions(-) diff --git a/src/src/Helpers/AdafruitGFX_helper.cpp b/src/src/Helpers/AdafruitGFX_helper.cpp index 5c2133cc15..14c1ed7bbc 100644 --- a/src/src/Helpers/AdafruitGFX_helper.cpp +++ b/src/src/Helpers/AdafruitGFX_helper.cpp @@ -371,20 +371,12 @@ String AdaGFXparseTemplate(const String & tmpString, String subcommand = result.substring(prefixTrigger + ADAGFX_PARSE_POSTFIX_LEN, postfixTrigger); if (!subcommand.isEmpty()) { - String command; - command.reserve(trigger.length() + 1 + subcommand.length()); - command += trigger; - command += ','; - command += subcommand; + const String command = strformat(F("%s,%s"), trigger.c_str(), subcommand.c_str()); # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(ADAGFX_LOG_LEVEL)) { - String log; - log.reserve(command.length() + 20); - log += F("AdaGFX: inline cmd: "); - log += command; - addLogMove(ADAGFX_LOG_LEVEL, log); + addLogMove(ADAGFX_LOG_LEVEL, concat(F("AdaGFX: inline cmd: "), command)); } # endif // ifndef BUILD_NO_DEBUG @@ -554,12 +546,7 @@ String AdaGFXparseTemplate(const String & tmpString, # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(ADAGFX_LOG_LEVEL)) { - String log; - log.reserve(result.length() + 24); - log += F("AdaGFX: parse result: '"); - log += result; - log += '\''; - addLogMove(ADAGFX_LOG_LEVEL, log); + addLogMove(ADAGFX_LOG_LEVEL, strformat(F("AdaGFX: parse result: '%s'"), result.c_str())); } # endif // ifndef BUILD_NO_DEBUG return result; @@ -618,19 +605,9 @@ void AdafruitGFX_helper::initialize() { # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(ADAGFX_LOG_LEVEL)) { - String log; - log.reserve(65); - log += F("AdaGFX: Init, x: "); - log += _res_x; - log += F(", y: "); - log += _res_y; - log += F(", colors: "); - log += static_cast(_colorDepth); - log += F(", trigger: "); - log += _trigger; - log += F(", "); - log += getFeatures(); - addLogMove(ADAGFX_LOG_LEVEL, log); + addLogMove(ADAGFX_LOG_LEVEL, strformat(F("AdaGFX: Init, x: %d, y: %d, colors: %d, trigger: %s, %s"), + _res_x, _res_y, static_cast(_colorDepth), + _trigger.c_str(), getFeatures().c_str())); } # endif // ifndef BUILD_NO_DEBUG @@ -654,26 +631,26 @@ void AdafruitGFX_helper::initialize() { * Show enabled features of the helper ***************************************************************************/ String AdafruitGFX_helper::getFeatures() { - String log = F("Features:"); - - # if (defined(ADAGFX_USE_ASCIITABLE) && ADAGFX_USE_ASCIITABLE) - log += F(" asciitable,"); - # endif // if (defined(ADAGFX_USE_ASCIITABLE) && ADAGFX_USE_ASCIITABLE) - # if (defined(ADAGFX_ENABLE_EXTRA_CMDS) && ADAGFX_ENABLE_EXTRA_CMDS) - log += F(" lm/lmr,"); - # endif // if (defined(ADAGFX_ENABLE_EXTRA_CMDS) && ADAGFX_ENABLE_EXTRA_CMDS) - # if (defined(ADAGFX_ENABLE_BMP_DISPLAY) && ADAGFX_ENABLE_BMP_DISPLAY) - log += F(" bmp,"); - # endif // if (defined(ADAGFX_ENABLE_BMP_DISPLAY) && ADAGFX_ENABLE_BMP_DISPLAY) - # if (defined(ADAGFX_ENABLE_BUTTON_DRAW) && ADAGFX_ENABLE_BUTTON_DRAW) - log += F(" btn,"); - # endif // if (defined(ADAGFX_ENABLE_BUTTON_DRAW) && ADAGFX_ENABLE_BUTTON_DRAW)` - # if (defined(ADAGFX_ENABLE_FRAMED_WINDOW) && ADAGFX_ENABLE_FRAMED_WINDOW) - log += F(" win,"); - # endif // if (defined(ADAGFX_ENABLE_FRAMED_WINDOW) && ADAGFX_ENABLE_FRAMED_WINDOW) - # if (defined(ADAGFX_ENABLE_GET_CONFIG_VALUE) && ADAGFX_ENABLE_GET_CONFIG_VALUE) - log += F(" getconf,"); - # endif // if (defined(ADAGFX_ENABLE_GET_CONFIG_VALUE) && ADAGFX_ENABLE_GET_CONFIG_VALUE) + String log = F("Features:" + # if (defined(ADAGFX_USE_ASCIITABLE) && ADAGFX_USE_ASCIITABLE) + " asciitable," + # endif // if (defined(ADAGFX_USE_ASCIITABLE) && ADAGFX_USE_ASCIITABLE) + # if (defined(ADAGFX_ENABLE_EXTRA_CMDS) && ADAGFX_ENABLE_EXTRA_CMDS) + " lm/lmr," + # endif // if (defined(ADAGFX_ENABLE_EXTRA_CMDS) && ADAGFX_ENABLE_EXTRA_CMDS) + # if (defined(ADAGFX_ENABLE_BMP_DISPLAY) && ADAGFX_ENABLE_BMP_DISPLAY) + " bmp," + # endif // if (defined(ADAGFX_ENABLE_BMP_DISPLAY) && ADAGFX_ENABLE_BMP_DISPLAY) + # if (defined(ADAGFX_ENABLE_BUTTON_DRAW) && ADAGFX_ENABLE_BUTTON_DRAW) + " btn," + # endif // if (defined(ADAGFX_ENABLE_BUTTON_DRAW) && ADAGFX_ENABLE_BUTTON_DRAW)` + # if (defined(ADAGFX_ENABLE_FRAMED_WINDOW) && ADAGFX_ENABLE_FRAMED_WINDOW) + " win," + # endif // if (defined(ADAGFX_ENABLE_FRAMED_WINDOW) && ADAGFX_ENABLE_FRAMED_WINDOW) + # if (defined(ADAGFX_ENABLE_GET_CONFIG_VALUE) && ADAGFX_ENABLE_GET_CONFIG_VALUE) + " getconf," + # endif // if (defined(ADAGFX_ENABLE_GET_CONFIG_VALUE) && ADAGFX_ENABLE_GET_CONFIG_VALUE) + ); if (log.endsWith(F(","))) { log.remove(log.length() - 1); @@ -846,12 +823,12 @@ bool AdafruitGFX_helper::processCommand(const String& string) { if ((nullptr == _display) || _trigger.isEmpty()) { return success; } - String cmd = parseString(string, 1); // lower case - String subcommand = parseString(string, 2); - uint16_t res_x = _res_x; - uint16_t res_y = _res_y; - uint16_t _xo = 0; - uint16_t _yo = 0; + const String cmd = parseString(string, 1); // lower case + const String subcommand = parseString(string, 2); + uint16_t res_x = _res_x; + uint16_t res_y = _res_y; + uint16_t _xo = 0; + uint16_t _yo = 0; # if ADAGFX_ENABLE_FRAMED_WINDOW getWindowLimits(res_x, res_y); @@ -862,7 +839,6 @@ bool AdafruitGFX_helper::processCommand(const String& string) { isAdaGFXTrigger(cmd)) || subcommand.isEmpty()) { return success; } // Only support own trigger, and at least a non=empty subcommand - String log; std::vector sParams; std::vector nParams; uint8_t emptyCount = 0; @@ -885,11 +861,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(LOG_LEVEL_DEBUG_DEV)) { - log = ':'; - log += argCount; - log += ' '; - log += sParams[argCount]; - addLog(LOG_LEVEL_DEBUG_DEV, log); + addLog(LOG_LEVEL_DEBUG_DEV, strformat(F(":%d %s"), argCount, sParams[argCount].c_str())); } # endif // ifndef BUILD_NO_DEBUG @@ -901,21 +873,26 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(ADAGFX_LOG_LEVEL)) { - log.reserve(90); - log.clear(); - log += F("AdaGFX: command: "); - log += _trigger; - log += F(" argCount: "); - log += argCount; - log += ':'; - log += string; - addLog(ADAGFX_LOG_LEVEL, log); + addLog(ADAGFX_LOG_LEVEL, strformat(F("AdaGFX: command: %s argCount: %d:%s"), _trigger.c_str(), argCount, string.c_str())); } # endif // ifndef BUILD_NO_DEBUG char tmp[12]{}; const int subcommand_i = GetCommandCode(tmp, sizeof(tmp), subcommand.c_str(), adagfx_commands); const adagfx_commands_e subcmd = static_cast(subcommand_i); + const bool currentColRowState = _columnRowMode; + + # if ADAGFX_ARGUMENT_VALIDATION + + // Optimize some coordinate checks, with less than 3 occurrences there is no gain + const bool invCoord_0_1 = argCount >= 2 && invalidCoordinates(nParams[0], nParams[1]); + const bool invCoord_2_3 = argCount >= 4 && invalidCoordinates(nParams[2], nParams[3]); + const bool invCoord_0_2_1_3 = argCount >= 4 && invalidCoordinates(nParams[0] + nParams[2], + nParams[1] + nParams[3]); + const bool invCoord_0_1_comp_cr = argCount >= 2 && invalidCoordinates(nParams[0] - _x_compensation, + nParams[1] - _y_compensation, + _columnRowMode); + # endif // if ADAGFX_ARGUMENT_VALIDATION if (adagfx_commands_e::txt == subcmd) // txt: Print text at last cursor position, ends at next line! { @@ -956,10 +933,9 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } else if ((adagfx_commands_e::txl == subcmd) && (argCount >= 2)) // txl: Text at line(s) { - uint8_t _line = 0; - uint8_t _column = 0; - uint8_t idx = 0; - bool currentColRowState = _columnRowMode; + uint8_t _line = 0; + uint8_t _column = 0; + uint8_t idx = 0; setColumnRowMode(true); // this command is by default set to Column/Row mode while (idx < argCount && !sParams[idx + 1].isEmpty()) { @@ -1001,7 +977,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # if ADAGFX_ARGUMENT_VALIDATION - if (invalidCoordinates(nParams[0] - _x_compensation, nParams[1] - _y_compensation, _columnRowMode)) { + if (invCoord_0_1_comp_cr) { success = false; } else # endif // if ADAGFX_ARGUMENT_VALIDATION @@ -1018,7 +994,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # if ADAGFX_ARGUMENT_VALIDATION - if (invalidCoordinates(nParams[0] - _x_compensation, nParams[1] - _y_compensation, _columnRowMode)) { + if (invCoord_0_1_comp_cr) { success = false; } else # endif // if ADAGFX_ARGUMENT_VALIDATION @@ -1035,7 +1011,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # if ADAGFX_ARGUMENT_VALIDATION - if (invalidCoordinates(nParams[0] - _x_compensation, nParams[1] - _y_compensation, _columnRowMode)) { + if (invCoord_0_1_comp_cr) { success = false; } else # endif // if ADAGFX_ARGUMENT_VALIDATION @@ -1053,7 +1029,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # if ADAGFX_ARGUMENT_VALIDATION - if (invalidCoordinates(nParams[0] - _x_compensation, nParams[1] - _y_compensation, _columnRowMode)) { + if (invCoord_0_1_comp_cr) { success = false; } else # endif // if ADAGFX_ARGUMENT_VALIDATION @@ -1071,7 +1047,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # if ADAGFX_ARGUMENT_VALIDATION - if (invalidCoordinates(nParams[0] - _x_compensation, nParams[1] - _y_compensation, _columnRowMode)) { + if (invCoord_0_1_comp_cr) { success = false; } else # endif // if ADAGFX_ARGUMENT_VALIDATION @@ -1152,9 +1128,8 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } line.reserve(_textcols); _display->setCursor(0, 0); - int16_t row = 0; - const bool colMode = _columnRowMode; - _columnRowMode = true; + int16_t row = 0; + setColumnRowMode(true); for (int16_t i = start; i <= 0xFF && row < _textrows; i++) { if ((i % 4 == 0) && (line.length() > (_textcols - 8u))) { // 8 = 4x space + char @@ -1164,10 +1139,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } if (line.isEmpty()) { - line += F("0x"); - - if (i < 0x10) { line += '0'; } - line += String(i, HEX); + line += formatToHex(i, 2); } line += ' '; line += static_cast(((i == 0x0A) || (i == 0x0D) ? 0x20 : i)); // Show a space instead of CR/LF @@ -1177,9 +1149,9 @@ bool AdafruitGFX_helper::processCommand(const String& string) { printText(line.c_str(), 0, row, _fontscaling, _fgcolor, _bgcolor); } - _columnRowMode = colMode; // Restore + setColumnRowMode(currentColRowState); // Restore - if (_fontscaling != currentScale) { // Restore if needed + if (_fontscaling != currentScale) { // Restore if needed _fontscaling = currentScale; _display->setTextSize(_fontscaling); calculateTextMetrics(_fontwidth, _fontheight, _heightOffset, _isProportional); @@ -1349,8 +1321,8 @@ bool AdafruitGFX_helper::processCommand(const String& string) { else if ((adagfx_commands_e::l == subcmd) && (argCount == 5)) { // l: Line # if ADAGFX_ARGUMENT_VALIDATION - if (invalidCoordinates(nParams[0], nParams[1]) || - invalidCoordinates(nParams[2], nParams[3])) { + if (invCoord_0_1 || + invCoord_2_3) { success = false; } else # endif // if ADAGFX_ARGUMENT_VALIDATION @@ -1383,18 +1355,14 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # if ADAGFX_ENABLE_EXTRA_CMDS else if (((adagfx_commands_e::lm == subcmd) || (adagfx_commands_e::lmr == subcmd)) && (argCount >= 5)) { // lm/lmr: Multi-line, multiple // coordinates - uint16_t mcolor = AdaGFXparseColor(sParams[0], _colorDepth); - bool mloop = true; - uint8_t parCount = 0; - uint8_t optCount = 0; - int cx = -1; - int cy = -1; - bool closeLine = false; - bool relativeMode = (adagfx_commands_e::lmr == subcmd); // Use Relative mode - # ifndef BUILD_NO_DEBUG - String log; - log.reserve(40); - # endif // ifndef BUILD_NO_DEBUG + uint16_t mcolor = AdaGFXparseColor(sParams[0], _colorDepth); + bool mloop = true; + uint8_t parCount = 0; + uint8_t optCount = 0; + int cx = -1; + int cy = -1; + bool closeLine = false; + const bool relativeMode = (adagfx_commands_e::lmr == subcmd); // Use Relative mode while (mloop) { sParams[optCount] = parseString(string, parCount + 4); // 0-offset + 1st and 2nd cmd-argument and 1 for color argument @@ -1429,20 +1397,9 @@ bool AdafruitGFX_helper::processCommand(const String& string) { mloop = false; // Exit after closing the line } # ifndef BUILD_NO_DEBUG - log.clear(); - log += F("AdaGFX: cmd: lm x/y/x1/y1:"); - log += nParams[0]; - log += '/'; - log += nParams[1]; - log += '/'; - log += nParams[2]; - log += '/'; - log += nParams[3]; - log += F(" loop:"); - log += mloop ? 'T' : 'f'; - log += F(" color:"); - log += AdaGFXcolorToString(mcolor, _colorDepth); - addLog(LOG_LEVEL_INFO, log); + addLog(LOG_LEVEL_INFO, strformat(F("AdaGFX: cmd: lm x/y/x1/y1:%d/%d/%d/%d loop:%c color:%s"), + nParams[0], nParams[1], nParams[2], nParams[3], + mloop ? 'T' : 'f', AdaGFXcolorToString(mcolor, _colorDepth).c_str())); # endif // ifndef BUILD_NO_DEBUG _display->drawLine(nParams[0] + _xo, nParams[1] + _yo, nParams[2] + _xo, nParams[3] + _yo, mcolor); @@ -1458,87 +1415,58 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } } # endif // if ADAGFX_ENABLE_EXTRA_CMDS - else if ((adagfx_commands_e::r == subcmd) && (argCount == 5)) { // r: Rectangle - # if ADAGFX_ARGUMENT_VALIDATION - - if (invalidCoordinates(nParams[0], nParams[1]) || - invalidCoordinates(nParams[0] + nParams[2], nParams[1] + nParams[3])) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - _display->drawRect(nParams[0] + _xo, nParams[1] + _yo, nParams[2], nParams[3], AdaGFXparseColor(sParams[4], _colorDepth)); - } - } - else if ((adagfx_commands_e::rf == subcmd) && (argCount == 6)) { // rf: Rectangled, filled + else if (((adagfx_commands_e::r == subcmd) && (argCount == 5)) || // r: Rectangle + ((adagfx_commands_e::rf == subcmd) && (argCount == 6))) { // rf: Rectangled, filled # if ADAGFX_ARGUMENT_VALIDATION - if (invalidCoordinates(nParams[0], nParams[1]) || - invalidCoordinates(nParams[0] + nParams[2], nParams[1] + nParams[3])) { + if (invCoord_0_1 || + invCoord_0_2_1_3) { success = false; } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->fillRect(nParams[0] + _xo, nParams[1] + _yo, nParams[2], nParams[3], AdaGFXparseColor(sParams[5], _colorDepth)); + if (adagfx_commands_e::rf == subcmd) { + _display->fillRect(nParams[0] + _xo, nParams[1] + _yo, nParams[2], nParams[3], AdaGFXparseColor(sParams[5], _colorDepth)); + } _display->drawRect(nParams[0] + _xo, nParams[1] + _yo, nParams[2], nParams[3], AdaGFXparseColor(sParams[4], _colorDepth)); } } - else if ((adagfx_commands_e::c == subcmd) && (argCount == 4)) { // c: Circle - # if ADAGFX_ARGUMENT_VALIDATION - - if (invalidCoordinates(nParams[0], nParams[1]) || - invalidCoordinates(nParams[2], 0)) { // Also check radius - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - _display->drawCircle(nParams[0] + _xo, nParams[1] + _yo, nParams[2], AdaGFXparseColor(sParams[3], _colorDepth)); - } - } - else if ((adagfx_commands_e::cf == subcmd) && (argCount == 5)) { // cf: Circle, filled + else if (((adagfx_commands_e::c == subcmd) && (argCount == 4)) || // c: Circle + ((adagfx_commands_e::cf == subcmd) && (argCount == 5))) { // cf: Circle, filled # if ADAGFX_ARGUMENT_VALIDATION - if (invalidCoordinates(nParams[0], nParams[1]) || + if (invCoord_0_1 || invalidCoordinates(nParams[2], 0)) { // Also check radius success = false; } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->fillCircle(nParams[0] + _xo, nParams[1] + _yo, nParams[2], AdaGFXparseColor(sParams[4], _colorDepth)); + if (adagfx_commands_e::cf == subcmd) { + _display->fillCircle(nParams[0] + _xo, nParams[1] + _yo, nParams[2], AdaGFXparseColor(sParams[4], _colorDepth)); + } _display->drawCircle(nParams[0] + _xo, nParams[1] + _yo, nParams[2], AdaGFXparseColor(sParams[3], _colorDepth)); } } - else if ((adagfx_commands_e::t == subcmd) && (argCount == 7)) { // t: Triangle + else if (((adagfx_commands_e::t == subcmd) && (argCount == 7)) || // t: Triangle + ((adagfx_commands_e::tf == subcmd) && (argCount == 8))) { // tf: Triangle, filled # if ADAGFX_ARGUMENT_VALIDATION - if (invalidCoordinates(nParams[0], nParams[1]) || - invalidCoordinates(nParams[2], nParams[3]) || + if (invCoord_0_1 || + invCoord_2_3 || invalidCoordinates(nParams[4], nParams[5])) { success = false; } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->drawTriangle(nParams[0] + _xo, nParams[1] + _yo, nParams[2] + _xo, nParams[3] + _yo, nParams[4] + _xo, nParams[5] + _yo, - AdaGFXparseColor(sParams[6], _colorDepth)); - } - } - else if ((adagfx_commands_e::tf == subcmd) && (argCount == 8)) { // tf: Triangle, filled - # if ADAGFX_ARGUMENT_VALIDATION - - if (invalidCoordinates(nParams[0], nParams[1]) || - invalidCoordinates(nParams[2], nParams[3]) || - invalidCoordinates(nParams[4], nParams[5])) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - _display->fillTriangle(nParams[0] + _xo, - nParams[1] + _yo, - nParams[2] + _xo, - nParams[3] + _yo, - nParams[4] + _xo, - nParams[5] + _yo, - AdaGFXparseColor(sParams[7], _colorDepth)); + if (adagfx_commands_e::tf == subcmd) { + _display->fillTriangle(nParams[0] + _xo, + nParams[1] + _yo, + nParams[2] + _xo, + nParams[3] + _yo, + nParams[4] + _xo, + nParams[5] + _yo, + AdaGFXparseColor(sParams[7], _colorDepth)); + } _display->drawTriangle(nParams[0] + _xo, nParams[1] + _yo, nParams[2] + _xo, @@ -1548,40 +1476,25 @@ bool AdafruitGFX_helper::processCommand(const String& string) { AdaGFXparseColor(sParams[6], _colorDepth)); } } - else if ((adagfx_commands_e::rr == subcmd) && (argCount == 6)) { // rr: Rounded rectangle + else if (((adagfx_commands_e::rr == subcmd) && (argCount == 6)) || // rr: Rounded rectangle + ((adagfx_commands_e::rrf == subcmd) && (argCount == 7))) { // rrf: Rounded rectangle, filled # if ADAGFX_ARGUMENT_VALIDATION - if (invalidCoordinates(nParams[0], nParams[1]) || - invalidCoordinates(nParams[0] + nParams[2], nParams[1] + nParams[3]) || - invalidCoordinates(nParams[4], 0)) { // Also check radius + if (invCoord_0_1 || + invCoord_0_2_1_3 || + invalidCoordinates(nParams[4], 0)) { // Also check radius success = false; } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->drawRoundRect(nParams[0] + _xo, - nParams[1] + _yo, - nParams[2], - nParams[3], - nParams[4], - AdaGFXparseColor(sParams[5], _colorDepth)); - } - } - else if ((adagfx_commands_e::rrf == subcmd) && (argCount == 7)) { // rrf: Rounded rectangle, filled - # if ADAGFX_ARGUMENT_VALIDATION - - if (invalidCoordinates(nParams[0], nParams[1]) || - invalidCoordinates(nParams[0] + nParams[2], nParams[1] + nParams[3]) || - invalidCoordinates(nParams[4], 0)) { // Also check radius - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - _display->fillRoundRect(nParams[0] + _xo, - nParams[1] + _yo, - nParams[2], - nParams[3], - nParams[4], - AdaGFXparseColor(sParams[6], _colorDepth)); + if (adagfx_commands_e::rrf == subcmd) { + _display->fillRoundRect(nParams[0] + _xo, + nParams[1] + _yo, + nParams[2], + nParams[3], + nParams[4], + AdaGFXparseColor(sParams[6], _colorDepth)); + } _display->drawRoundRect(nParams[0] + _xo, nParams[1] + _yo, nParams[2], @@ -1593,7 +1506,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { else if ((adagfx_commands_e::px == subcmd) && (argCount == 3)) { // px: Pixel # if ADAGFX_ARGUMENT_VALIDATION - if (invalidCoordinates(nParams[0], nParams[1])) { + if (invCoord_0_1) { success = false; } else # endif // if ADAGFX_ARGUMENT_VALIDATION @@ -1605,7 +1518,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { // incremented merged loop is # if ADAGFX_ARGUMENT_VALIDATION // smaller than 2 separate loops - if (invalidCoordinates(nParams[0], nParams[1])) { + if (invCoord_0_1) { success = false; } else # endif // if ADAGFX_ARGUMENT_VALIDATION @@ -1670,7 +1583,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { // (*clr = color, TaskIndex, Group and SelGrp are ignored) # if ADAGFX_ARGUMENT_VALIDATION - if (invalidCoordinates(nParams[2], nParams[3]) || + if (invCoord_2_3 || invalidCoordinates(nParams[2] + nParams[4], nParams[3] + nParams[5])) { success = false; } else @@ -1700,13 +1613,13 @@ bool AdafruitGFX_helper::processCommand(const String& string) { if (!sParams[16].isEmpty()) { disabledCaptionColor = AdaGFXparseColor(sParams[16], _colorDepth); } - uint16_t fillColor = onColor; - uint16_t textColor = captionColor; - bool clearArea = nParams[7] < 0; + uint16_t fillColor = onColor; + uint16_t textColor = captionColor; + const bool clearArea = nParams[7] < 0; nParams[7] = std::abs(nParams[7]); - Button_type_e buttonType = static_cast(nParams[7] & 0x0F); - Button_layout_e buttonLayout = static_cast(nParams[7] & 0xF0); + const Button_type_e buttonType = static_cast(nParams[7] & 0x0F); + const Button_layout_e buttonLayout = static_cast(nParams[7] & 0xF0); // Check mode & state: -2, -1, 0, 1 to select used colors if (nParams[0] == 0) { @@ -1857,8 +1770,8 @@ bool AdafruitGFX_helper::processCommand(const String& string) { if (argCount == 6) { setRotation(nParams[5]); } // Use requested rotation - if (invalidCoordinates(nParams[0], nParams[1]) || - invalidCoordinates(nParams[0] + nParams[2], nParams[1] + nParams[3])) { + if (invCoord_0_1 || + invCoord_0_2_1_3) { success = false; if (curWin != 0) { selectWindow(curWin); } // restore current window @@ -1886,7 +1799,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(LOG_LEVEL_INFO)) { - addLogMove(LOG_LEVEL_INFO, concat(F("AdaGFX defined window id: "), static_cast(win))); + addLogMove(LOG_LEVEL_INFO, strformat(F("AdaGFX defined window id: %d"), win)); } # endif // ifndef BUILD_NO_DEBUG @@ -1898,12 +1811,10 @@ bool AdafruitGFX_helper::processCommand(const String& string) { // logWindows(F(" deFwin ")); // Use for debugging only? } } - else if ((adagfx_commands_e::delwin == subcmd) && (argCount == 1)) { // delwin: delete window + else if ((adagfx_commands_e::delwin == subcmd) && (argCount == 1) && (nParams[0] > 0)) { // delwin: delete window, don't delete window 0 // logWindows(F(" deLwin ")); // use for debugging only - if (nParams[0] > 0) { // don't delete window 0 - success = deleteWindow(nParams[0]); - } + success = deleteWindow(nParams[0]); } # endif // if ADAGFX_ENABLE_FRAMED_WINDOW else { @@ -2189,29 +2100,10 @@ void AdafruitGFX_helper::printText(const char *string, # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { - String log = F("printText: clear: _x:"); - log += _x; - log += F(", oTop:"); - log += oTop; - log += F(", _y:"); - log += _y; - log += F(", xTx:"); - log += xText; - log += F(", yTx:"); - log += yText; - log += F(", wTx:"); - log += wText; - log += F(", hTx:"); - log += hText; - log += F(", oBot:"); - log += oBottom; - log += F(", _res_x/max:"); - log += _res_x; - log += '/'; - log += res_x; - log += F(", str:"); - log += newString; - addLogMove(LOG_LEVEL_DEBUG, log); + addLogMove(LOG_LEVEL_DEBUG, strformat(F("printText: clear: _x:%d, oTop:%d, _y:%d, xTx:%d, yTx:%d, wTx:%d," + " hTx:%d, oBot:%d, _res_x/max:%d/%d, str:%s"), + _x, oTop, _y, xText, yText, wText, + hText, oBottom, _res_x, res_x, newString.c_str())); } # endif // ifndef BUILD_NO_DEBUG @@ -2708,23 +2600,8 @@ void AdafruitGFX_helper::calculateTextMetrics(const uint8_t fontwidth, # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(ADAGFX_LOG_LEVEL)) { - String log; - log.reserve(60); - log += F("AdaGFX:"); - - if (!_trigger.isEmpty()) { - log += F(" tr: "); - log += _trigger; - } - log += F(" x: "); - log += res_x; - log += F(", y: "); - log += res_y; - log += F(", text columns: "); - log += _textcols; - log += F(" rows: "); - log += _textrows; - addLogMove(ADAGFX_LOG_LEVEL, log); + addLogMove(ADAGFX_LOG_LEVEL, strformat(F("AdaGFX: tr: %s x: %d, y: %d, text columns: %d rows: %d"), + _trigger.c_str(), res_x, res_y, _textcols, _textrows)); } # endif // ifndef BUILD_NO_DEBUG } @@ -2750,18 +2627,8 @@ bool AdafruitGFX_helper::invalidCoordinates(const int X, # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(ADAGFX_LOG_LEVEL)) { - String log; - - log.reserve(49); - log += F("invalidCoordinates: X:"); - log += X; - log += '/'; - log += (colRowMode ? _textcols : res_x); - log += F(" Y:"); - log += Y; - log += '/'; - log += (colRowMode ? _textrows : res_y); - addLogMove(ADAGFX_LOG_LEVEL, log); + addLogMove(ADAGFX_LOG_LEVEL, strformat(F("invalidCoordinates: X:%d/%d Y:%d/%d"), + X, colRowMode ? _textcols : res_x, Y, colRowMode ? _textrows : res_y)); } # endif // ifndef BUILD_NO_DEBUG @@ -2948,27 +2815,10 @@ bool AdafruitGFX_helper::showBmp(const String& filename, colors = 1 << depth; } # ifndef BUILD_NO_DEBUG - String log; if (loglevelActiveFor(LOG_LEVEL_INFO)) { - log.reserve(80); - log += F("showBmp: bitmap w:"); - log += bmpWidth; - log += F(", h:"); - log += bmpHeight; - log += F(", dpt:"); - log += depth; - log += F(", colors:"); - log += colors; - log += F(", cmp:"); - log += compression; - log += F(", pl:"); - log += planes; - log += F(", x:"); - log += x; - log += F(", y:"); - log += y; - addLog(LOG_LEVEL_INFO, log); + addLog(LOG_LEVEL_INFO, strformat(F("showBmp: bitmap w:%d, h:%d, dpt:%d, colors:%d, cmp:%d, pl:%d, x:%d, y:%d"), + bmpWidth, bmpHeight, depth, colors, compression, planes, x, y)); } # endif // ifndef BUILD_NO_DEBUG @@ -3002,16 +2852,8 @@ bool AdafruitGFX_helper::showBmp(const String& filename, # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(LOG_LEVEL_INFO)) { - log.clear(); - log += F("showBmp: x:"); - log += x; - log += F(", y:"); - log += y; - log += F(", dw:"); - log += _display->width(); - log += F(", dh:"); - log += _display->height(); - addLogMove(LOG_LEVEL_INFO, log); + addLogMove(LOG_LEVEL_INFO, strformat(F("showBmp: x:%d, y:%d, dw:%d, dh:%d"), + x, y, _display->width(), _display->height())); } # endif // ifndef BUILD_NO_DEBUG @@ -3353,37 +3195,14 @@ bool AdafruitGFX_helper::deleteWindow(const uint8_t& windowId) { ***************************************************************************/ void AdafruitGFX_helper::logWindows(const String& prefix) { # ifndef BUILD_NO_DEBUG - String log; - - log.reserve(50); for (auto it = _windows.begin(); it != _windows.end(); it++) { - log.clear(); - log += F("AdaGFX window "); - log += prefix; - log += F(": "); - log += (*it).id; - log += F(", x:"); - log += (*it).top_left.x; - log += F(", y:"); - log += (*it).top_left.y; - log += F(", w:"); - log += (*it).width_height.x; - log += F(", h:"); - log += (*it).width_height.y; - log += F(", rot:"); - log += (*it).rotation; - log += F(", current: "); - log += getWindow(); - log += F(", org x:"); - log += (*it).org_top_left.x; - log += F(", y:"); - log += (*it).org_top_left.y; - log += F(", w:"); - log += (*it).org_width_height.x; - log += F(", h:"); - log += (*it).org_width_height.y; - addLogMove(LOG_LEVEL_INFO, log); + addLogMove(LOG_LEVEL_INFO, strformat(F("AdaGFX window %s: %d, x:%d, y:%d, w:%d, h:%d" + ", rot%d, current: %d, org x:%d, y:%d, w:%d, h:%d"), + prefix.c_str(), (*it).id, (*it).top_left.x, (*it).top_left.y, + (*it).width_height.x, (*it).width_height.y, + (*it).rotation, getWindow(), (*it).org_top_left.x, (*it).org_top_left.y, + (*it).org_width_height.x, (*it).org_width_height.y)); } # endif // ifndef BUILD_NO_DEBUG } diff --git a/src/src/Helpers/AdafruitGFX_helper.h b/src/src/Helpers/AdafruitGFX_helper.h index 0d2ab46ab0..6097a17a13 100644 --- a/src/src/Helpers/AdafruitGFX_helper.h +++ b/src/src/Helpers/AdafruitGFX_helper.h @@ -12,6 +12,7 @@ ***************************************************************************/ /************ * Changelog: + * 2023-12-12 tonhuisman: Code deduplication and string optimizations to reduce build size * 2023-02-26 tonhuisman: Use GetCommandCode() / PROGMEM for parsing of commands and colors to reduce .bin size. * 2022-10-05 tonhuisman: No longer trim off spaces from arguments to commands * 2022-09-23 tonhuisman: Allow backlight percentage from 0% instead of from 1% to be able to completely turn it off From 1706a43586690a74d0df54a835a8d94f82624adc Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 30 Dec 2023 21:27:42 +0100 Subject: [PATCH 02/13] [AdaGFX_helper] Simplify font handling, add some better 7/14 segment fonts, enable 18pt fonts for ESP32 --- src/src/Helpers/AdafruitGFX_helper.cpp | 612 +++++++++++++------------ src/src/Helpers/AdafruitGFX_helper.h | 31 +- src/src/Static/Fonts/7segment18pt7b.h | 365 +++++++++++++++ src/src/Static/Fonts/7segment24pt7b.h | 557 ++++++++++++++++++++++ src/src/Static/Fonts/LCD14cond18pt7b.h | 317 +++++++++++++ src/src/Static/Fonts/LCD14cond24pt7b.h | 474 +++++++++++++++++++ 6 files changed, 2063 insertions(+), 293 deletions(-) create mode 100644 src/src/Static/Fonts/7segment18pt7b.h create mode 100644 src/src/Static/Fonts/7segment24pt7b.h create mode 100644 src/src/Static/Fonts/LCD14cond18pt7b.h create mode 100644 src/src/Static/Fonts/LCD14cond24pt7b.h diff --git a/src/src/Helpers/AdafruitGFX_helper.cpp b/src/src/Helpers/AdafruitGFX_helper.cpp index 2cae6eccbb..ac7617a621 100644 --- a/src/src/Helpers/AdafruitGFX_helper.cpp +++ b/src/src/Helpers/AdafruitGFX_helper.cpp @@ -12,11 +12,21 @@ # include "../Static/Fonts/Seven_Segment18pt7b.h" # include "../Static/Fonts/FreeSans9pt7b.h" # ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED -# include "../Static/Fonts/angelina8pt7b.h" -# include "../Static/Fonts/NovaMono8pt7b.h" -# include "../Static/Fonts/unispace8pt7b.h" -# include "../Static/Fonts/unispace_italic8pt7b.h" -# include "../Static/Fonts/whitrabt8pt7b.h" +# ifdef ADAGFX_FONTS_EXTRA_8PT_ANGELINA +# include "../Static/Fonts/angelina8pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ANGELINA +# ifdef ADAGFX_FONTS_EXTRA_8PT_NOVAMONO +# include "../Static/Fonts/NovaMono8pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_8PT_NOVAMONO +# ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACE +# include "../Static/Fonts/unispace8pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACE +# ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACEITALIC +# include "../Static/Fonts/unispace_italic8pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACEITALIC +# ifdef ADAGFX_FONTS_EXTRA_8PT_WHITERABBiT +# include "../Static/Fonts/whitrabt8pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_8PT_WHITERABBiT # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTO # include "../Static/Fonts/Roboto_Regular8pt7b.h" # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTO @@ -28,12 +38,24 @@ # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOMONO # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED -# include "../Static/Fonts/angelina12pt7b.h" -# include "../Static/Fonts/NovaMono12pt7b.h" -# include "../Static/Fonts/RepetitionScrolling12pt7b.h" -# include "../Static/Fonts/unispace12pt7b.h" -# include "../Static/Fonts/unispace_italic12pt7b.h" -# include "../Static/Fonts/whitrabt12pt7b.h" +# ifdef ADAGFX_FONTS_EXTRA_12PT_ANGELINA +# include "../Static/Fonts/angelina12pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ANGELINA +# ifdef ADAGFX_FONTS_EXTRA_12PT_NOVAMONO +# include "../Static/Fonts/NovaMono12pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_12PT_NOVAMONO +# ifdef ADAGFX_FONTS_EXTRA_12PT_REPETITIONSCROLLiNG +# include "../Static/Fonts/RepetitionScrolling12pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_12PT_REPETITIONSCROLLiNG +# ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACE +# include "../Static/Fonts/unispace12pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACE +# ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACEITALIC +# include "../Static/Fonts/unispace_italic12pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACEITALIC +# ifdef ADAGFX_FONTS_EXTRA_12PT_WHITERABBiT +# include "../Static/Fonts/whitrabt12pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_12PT_WHITERABBiT # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTO # include "../Static/Fonts/Roboto_Regular12pt7b.h" # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTO @@ -45,8 +67,12 @@ # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOMONO # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED -# include "../Static/Fonts/AmerikaSans16pt7b.h" -# include "../Static/Fonts/whitrabt16pt7b.h" +# ifdef ADAGFX_FONTS_EXTRA_16PT_AMERIKASANS +# include "../Static/Fonts/AmerikaSans16pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_16PT_AMERIKASANS +# ifdef ADAGFX_FONTS_EXTRA_16PT_WHITERABBiT +# include "../Static/Fonts/whitrabt16pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_16PT_WHITERABBiT # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTO # include "../Static/Fonts/Roboto_Regular16pt7b.h" # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTO @@ -58,11 +84,29 @@ # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOMONO # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_18PT_INCLUDED -# include "../Static/Fonts/whitrabt18pt7b.h" +# ifdef ADAGFX_FONTS_EXTRA_18PT_WHITERABBiT +# include "../Static/Fonts/whitrabt18pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_18PT_WHITERABBiT +# ifdef ADAGFX_FONTS_EXTRA_18PT_SEVENSEG_B +# include "../Static/Fonts/7segment18pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_18PT_SEVENSEG_B +# ifdef ADAGFX_FONTS_EXTRA_18PT_LCD14COND +# include "../Static/Fonts/LCD14cond18pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_18PT_LCD14COND # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED -# include "../Static/Fonts/whitrabt20pt7b.h" +# ifdef ADAGFX_FONTS_EXTRA_20PT_WHITERABBiT +# include "../Static/Fonts/whitrabt20pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_20PT_WHITERABBiT # endif // ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED +# ifdef ADAGFX_FONTS_EXTRA_24PT_INCLUDED +# ifdef ADAGFX_FONTS_EXTRA_24PT_SEVENSEG_B +# include "../Static/Fonts/7segment24pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_24PT_SEVENSEG_B +# ifdef ADAGFX_FONTS_EXTRA_24PT_LCD14COND +# include "../Static/Fonts/LCD14cond24pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_24PT_LCD14COND +# endif // ifdef ADAGFX_FONTS_EXTRA_24PT_INCLUDED # endif // if ADAGFX_FONTS_INCLUDED # if FEATURE_SD && defined(ADAGFX_ENABLE_BMP_DISPLAY) @@ -760,64 +804,223 @@ enum class adagfx_commands_e : int8_t { defwin, delwin, }; -const char adagfx_fonts[] PROGMEM = "default|sevenseg24|sevenseg18|freesans|" - # ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED - "angelina8prop|novamono8pt|unispace8pt|unispaceitalic8pt|whiterabbit8pt|roboto8pt|robotocond8pt|robotomono8pt|" - # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED - # ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED - "angelina12prop|novamono12pt|repetitionscrolling12pt|unispace12pt|unispaceitalic12pt|whiterabbit12pt|roboto12pt|robotocond12pt|robotomono12pt|" - # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED - # ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED - "amerikasans16pt|whiterabbit16pt|roboto16pt|robotocond16pt|robotomono16pt|" - # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED - # ifdef ADAGFX_FONTS_EXTRA_18PT_INCLUDED - "whiterabbit18pt|" - # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_INCLUDED - # ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED - "whiterabbit20pt" - # endif // ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED - ""; -enum class adagfx_fonts_e : int8_t { - invalid = -1, - default_font = 0, - sevenseg24, - sevenseg18, - freesans, +# if ADAGFX_FONTS_INCLUDED + +// *** Don't forget to add the | separator at the end of a (new) font-name! (except for the last one in the list) +const char adagfx_fonts[] PROGMEM = + "default|sevenseg24|sevenseg18|freesans|" + # ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_8PT_ANGELINA + "angelina8prop|" + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ANGELINA + # ifdef ADAGFX_FONTS_EXTRA_8PT_NOVAMONO + "novamono8pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_NOVAMONO + # ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACE + "unispace8pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACE + # ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACEITALIC + "unispaceitalic8pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACEITALIC + # ifdef ADAGFX_FONTS_EXTRA_8PT_WHITERABBiT + "whiterabbit8pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_WHITERABBiT + # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTO + "roboto8pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTO + # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOCONDENSED + "robotocond8pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOCONDENSED + # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOMONO + "robotomono8pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOMONO + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_12PT_ANGELINA + "angelina12prop|" + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ANGELINA + # ifdef ADAGFX_FONTS_EXTRA_12PT_NOVAMONO + "novamono12pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_NOVAMONO + # ifdef ADAGFX_FONTS_EXTRA_12PT_REPETITIONSCROLLiNG + "repetitionscrolling12pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_REPETITIONSCROLLiNG + # ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACE + "unispace12pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACE + # ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACEITALIC + "unispaceitalic12pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACEITALIC + # ifdef ADAGFX_FONTS_EXTRA_12PT_WHITERABBiT + "whiterabbit12pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_WHITERABBiT + # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTO + "roboto12pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTO + # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOCONDENSED + "robotocond12pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOCONDENSED + # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOMONO + "robotomono12pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOMONO + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_16PT_AMERIKASANS + "amerikasans16pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_AMERIKASANS + # ifdef ADAGFX_FONTS_EXTRA_16PT_WHITERABBiT + "whiterabbit16pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_WHITERABBiT + # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTO + "roboto16pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTO + # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOCONDENSED + "robotocond16pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOCONDENSED + # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOMONO + "robotomono16pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOMONO + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_18PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_18PT_WHITERABBiT + "whiterabbit18pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_WHITERABBiT + # ifdef ADAGFX_FONTS_EXTRA_18PT_SEVENSEG_B + "sevenseg18b|" + # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_SEVENSEG_B + # ifdef ADAGFX_FONTS_EXTRA_18PT_LCD14COND + "lcd14cond18pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_LCD14COND + # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_20PT_WHITERABBiT + "whiterabbit20pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_20PT_WHITERABBiT + # endif // ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_24PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_24PT_SEVENSEG_B + "sevenseg24b|" + # endif // ifdef ADAGFX_FONTS_EXTRA_24PT_SEVENSEG_B + # ifdef ADAGFX_FONTS_EXTRA_24PT_LCD14COND + "lcd14cond24pt|" + # endif // ifdef ADAGFX_FONTS_EXTRA_24PT_LCD14COND + # endif // ifdef ADAGFX_FONTS_EXTRA_24PT_INCLUDED + ""; + +typedef struct { + const GFXfont *f; + uint8_t width; + uint8_t height; + int8_t offset; + bool proportional; +} tFontArgs; + +/* *INDENT-OFF* */ +const tFontArgs fontargs[] = +{ + { NULL, 9, 6, 0, false }, + { &Seven_Segment24pt7b, 21, 42, 35, true }, + { &Seven_Segment18pt7b, 16, 33, 26, true }, + { &FreeSans9pt7b, 10, 16, 12, false }, # ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED - angelina8prop, - novamono8pt, // 8pt - unispace8pt, - unispaceitalic8pt, - whiterabbit8pt, - roboto8pt, - robotocond8pt, - robotomono8pt, // 8pt - # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_8PT_ANGELINA + { &angelina8pt7b, 6, 16, 12, true }, + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ANGELINA + # ifdef ADAGFX_FONTS_EXTRA_8PT_NOVAMONO + { &NovaMono8pt7b, 9, 16, 12, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_NOVAMONO + # ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACE + { &unispace8pt7b, 13, 24, 20, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACE + # ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACEITALIC + { &unispace_italic8pt7b, 13, 24, 20, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACEITALIC + # ifdef ADAGFX_FONTS_EXTRA_8PT_WHITERABBiT + { &whitrabt8pt7b, 10, 16, 12, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_WHITERABBiT + # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTO + { &Roboto_Regular8pt7b, 10, 16, 12, true }, + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTO + # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOCONDENSED + { &RobotoCondensed_Regular8pt7b, 9, 16, 12, true }, + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOCONDENSED + # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOMONO + { &RobotoMono_Regular8pt7b, 10, 16, 12, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOMONO + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED - angelina12prop, // 12pt - novamono12pt, - repetitionscrolling12pt, - unispace12pt, - unispaceitalic12pt, - whiterabbit12pt, - roboto12pt, - robotocond12pt, - robotomono12pt, // 12pt - # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_12PT_ANGELINA + { &angelina12pt7b, 8, 22, 18, true }, + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ANGELINA + # ifdef ADAGFX_FONTS_EXTRA_12PT_NOVAMONO + { &NovaMono12pt7b, 13, 26, 22, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_NOVAMONO + # ifdef ADAGFX_FONTS_EXTRA_12PT_REPETITIONSCROLLiNG + { &RepetitionScrolling12pt7b, 13, 22, 18, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_REPETITIONSCROLLiNG + # ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACE + { &unispace12pt7b, 18, 30, 26, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACE + # ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACEITALIC + { &unispace_italic12pt7b, 18, 30, 26, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACEITALIC + # ifdef ADAGFX_FONTS_EXTRA_12PT_WHITERABBiT + { &whitrabt12pt7b, 13, 20, 16, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_WHITERABBiT + # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTO + { &Roboto_Regular12pt7b, 13, 20, 16, true }, + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTO + # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOCONDENSED + { &RobotoCondensed_Regular12pt7b, 13, 20, 16, true }, + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOCONDENSED + # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOMONO + { &RobotoMono_Regular12pt7b, 13, 20, 16, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOMONO + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED - amerikasans16pt, // 16pt - whiterabbit16pt, - roboto16pt, - robotocond16pt, - robotomono16pt, // 16pt - # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_16PT_AMERIKASANS + { &AmerikaSans16pt7b, 17, 30, 26, true }, + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_AMERIKASANS + # ifdef ADAGFX_FONTS_EXTRA_16PT_WHITERABBiT + { &whitrabt16pt7b, 18, 26, 22, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_WHITERABBiT + # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTO + { &Roboto_Regular16pt7b, 18, 27, 23, true }, + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTO + # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOCONDENSED + { &RobotoCondensed_Regular16pt7b, 18, 27, 23, true }, + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOCONDENSED + # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOMONO + { &RobotoMono_Regular16pt7b, 18, 27, 23, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOMONO + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_18PT_INCLUDED - whiterabbit18pt, // 18pt + # ifdef ADAGFX_FONTS_EXTRA_18PT_WHITERABBiT + { &whitrabt18pt7b, 21, 30, 26, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_WHITERABBiT + # ifdef ADAGFX_FONTS_EXTRA_18PT_SEVENSEG_B + { &_7segment18pt7b, 21, 30, 0, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_SEVENSEG_B + # ifdef ADAGFX_FONTS_EXTRA_18PT_LCD14COND + { &LCD14cond18pt7b, 24, 30, 0, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_LCD14COND # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED - whiterabbit20pt, // 20pt - # endif // ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_20PT_WHITERABBiT + { &whitrabt20pt7b, 24, 32, 28, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_20PT_WHITERABBiT + # endif // ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_24PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_24PT_SEVENSEG_B + { &_7segment24pt7b, 26, 34, 0, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_24PT_SEVENSEG_B + # ifdef ADAGFX_FONTS_EXTRA_24PT_LCD14COND + { &LCD14cond24pt7b, 26, 34, 0, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_24PT_LCD14COND + # endif // ifdef ADAGFX_FONTS_EXTRA_24PT_INCLUDED }; +/* *INDENT-ON* */ +# endif // if ADAGFX_FONTS_INCLUDED bool AdafruitGFX_helper::processCommand(const String& string) { bool success = false; @@ -840,7 +1043,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { isAdaGFXTrigger(cmd)) || subcommand.isEmpty()) { return success; } // Only support own trigger, and at least a non=empty subcommand - std::vector sParams; + std::vector sParams; std::vector nParams; uint8_t emptyCount = 0; int argCount = 0; @@ -889,9 +1092,6 @@ bool AdafruitGFX_helper::processCommand(const String& string) { const bool invCoord_2_3 = argCount >= 4 && invalidCoordinates(nParams[2], nParams[3]); const bool invCoord_0_2_1_3 = argCount >= 4 && invalidCoordinates(nParams[0] + nParams[2], nParams[1] + nParams[3]); - const bool invCoord_0_1_comp_cr = argCount >= 2 && invalidCoordinates(nParams[0] - _x_compensation, - nParams[1] - _y_compensation, - _columnRowMode); # endif // if ADAGFX_ARGUMENT_VALIDATION if (adagfx_commands_e::txt == subcmd) // txt: Print text at last cursor position, ends at next line! @@ -923,15 +1123,15 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - if (_columnRowMode) { - _display->setCursor(nParams[0] * _fontwidth + _xo, nParams[1] * _fontheight + _yo); - } else { - _display->setCursor(nParams[0] + _xo, nParams[1] + _yo); - } - _display->println(parseStringToEndKeepCaseNoTrim(string, 5)); // Print entire rest of provided line + printText(parseStringToEndKeepCaseNoTrim(string, 5).c_str(), + nParams[0] + _xo - _x_compensation, + nParams[1] + _yo - _y_compensation, + _fontscaling, + _fgcolor, + _bgcolor); } } - else if ((adagfx_commands_e::txl == subcmd) && (argCount >= 2)) // txl: Text at line(s) + else if ((adagfx_commands_e::txl == subcmd) && (argCount >= 2)) // txl: Text at line(s) { uint8_t _line = 0; uint8_t _column = 0; @@ -972,85 +1172,58 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } } else if ((adagfx_commands_e::txtfull == subcmd) && (argCount >= 3) && (argCount <= 8)) { // txtfull: Text at position, with size and color - switch (argCount) { - case 3: // single text + uint16_t par3color = argCount < 5 || sParams[3].isEmpty() ? _fgcolor : AdaGFXparseColor(sParams[3], _colorDepth); + uint16_t par4color = argCount < 6 || sParams[4].isEmpty() ? _bgcolor : AdaGFXparseColor(sParams[4], _colorDepth); - # if ADAGFX_ARGUMENT_VALIDATION + # if ADAGFX_ARGUMENT_VALIDATION + + if (invalidCoordinates(nParams[0] - _x_compensation, + nParams[1] - _y_compensation, + _columnRowMode)) { + success = false; + } else + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + switch (argCount) { + case 3: // single text - if (invCoord_0_1_comp_cr) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { printText(sParams[2].c_str(), nParams[0] - _x_compensation, nParams[1] - _y_compensation, _fontscaling, _fgcolor, - _fgcolor); // transparent bg - } - break; - case 4: // text + size - - # if ADAGFX_ARGUMENT_VALIDATION + _bgcolor); + break; + case 4: // text + size - if (invCoord_0_1_comp_cr) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { printText(sParams[3].c_str(), nParams[0] - _x_compensation, nParams[1] - _y_compensation, nParams[2], _fgcolor, - _fgcolor); // transparent bg - } - break; - case 5: // text + size + color - - # if ADAGFX_ARGUMENT_VALIDATION + _bgcolor); + break; + case 5: // text + size + color - if (invCoord_0_1_comp_cr) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - uint16_t color = AdaGFXparseColor(sParams[3], _colorDepth); printText(sParams[4].c_str(), nParams[0] - _x_compensation, nParams[1] - _y_compensation, nParams[2], - color, - color); // transparent bg - } - break; - case 6: // text + size + color + bkcolor - - # if ADAGFX_ARGUMENT_VALIDATION + par3color, + par3color); // transparent bg + break; + case 6: // text + size + color + bkcolor - if (invCoord_0_1_comp_cr) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { printText(sParams[5].c_str(), nParams[0] - _x_compensation, nParams[1] - _y_compensation, nParams[2], - AdaGFXparseColor(sParams[3], _colorDepth), - AdaGFXparseColor(sParams[4], _colorDepth)); - } - break; - case 7: // 7: text + size + color + bkcolor + printmode - case 8: // as 7 but: + maxwidth - - # if ADAGFX_ARGUMENT_VALIDATION + par3color, + par4color); + break; + case 7: // 7: text + size + color + bkcolor + printmode + case 8: // as 7 but: + maxwidth - if (invCoord_0_1_comp_cr) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION { AdaGFXTextPrintMode tmpPrintMode = _textPrintMode; @@ -1062,19 +1235,20 @@ bool AdafruitGFX_helper::processCommand(const String& string) { nParams[0] - _x_compensation, nParams[1] - _y_compensation, nParams[2], - AdaGFXparseColor(sParams[3], _colorDepth), - AdaGFXparseColor(sParams[4], _colorDepth), + par3color, + par4color, argCount == 8 ? nParams[argCount - 2] : 0); if (_textPrintMode != tmpPrintMode) { _textPrintMode = tmpPrintMode; _display->setTextWrap(_textPrintMode == AdaGFXTextPrintMode::ContinueToNextLine); } + break; } - break; - default: - success = false; - break; + default: + success = false; + break; + } } } else if (adagfx_commands_e::clear == subcmd) // clear: Clear display @@ -1162,155 +1336,15 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # if ADAGFX_FONTS_INCLUDED sParams[0].toLowerCase(); - char ftmp[24]{}; - const int font_i = GetCommandCode(ftmp, sizeof(ftmp), sParams[0].c_str(), adagfx_fonts); - const adagfx_fonts_e font = static_cast(font_i); - - if (adagfx_fonts_e::sevenseg24 == font) { - _display->setFont(&Seven_Segment24pt7b); - calculateTextMetrics(21, 42, 35, true); - } else if (adagfx_fonts_e::sevenseg18 == font) { - _display->setFont(&Seven_Segment18pt7b); - calculateTextMetrics(16, 33, 26, true); - } else if (adagfx_fonts_e::freesans == font) { - _display->setFont(&FreeSans9pt7b); - calculateTextMetrics(10, 16, 12); - - // Extra 8pt fonts: - # ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED - # ifdef ADAGFX_FONTS_EXTRA_8PT_ANGELINA - } else if (adagfx_fonts_e::angelina8prop == font) { // Proportional font! - _display->setFont(&angelina8pt7b); - calculateTextMetrics(6, 16, 12, true); - # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ANGELINA - # ifdef ADAGFX_FONTS_EXTRA_8PT_NOVAMONO - } else if (adagfx_fonts_e::novamono8pt == font) { - _display->setFont(&NovaMono8pt7b); - calculateTextMetrics(9, 16, 12); - # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_NOVAMONO - # ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACE - } else if (adagfx_fonts_e::unispace8pt == font) { - _display->setFont(&unispace8pt7b); - calculateTextMetrics(13, 24, 20); - # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACE - # ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACEITALIC - } else if (adagfx_fonts_e::unispaceitalic8pt == font) { - _display->setFont(&unispace_italic8pt7b); - calculateTextMetrics(13, 24, 20); - # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACEITALIC - # ifdef ADAGFX_FONTS_EXTRA_8PT_WHITERABBiT - } else if (adagfx_fonts_e::whiterabbit8pt == font) { - _display->setFont(&whitrabt8pt7b); - calculateTextMetrics(10, 16, 12); - # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_WHITERABBiT - # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTO - } else if (adagfx_fonts_e::roboto8pt == font) { // Proportional font! - _display->setFont(&Roboto_Regular8pt7b); - calculateTextMetrics(10, 16, 12, true); - # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTO - # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOCONDENSED - } else if (adagfx_fonts_e::robotocond8pt == font) { // Proportional font! - _display->setFont(&RobotoCondensed_Regular8pt7b); - calculateTextMetrics(9, 16, 12, true); - # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOCONDENSED - # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOMONO - } else if (adagfx_fonts_e::robotomono8pt == font) { - _display->setFont(&RobotoMono_Regular8pt7b); - calculateTextMetrics(10, 16, 12); - # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOMONO - # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED - // Extra 12pt fonts: - # ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED - # ifdef ADAGFX_FONTS_EXTRA_12PT_ANGELINA - } else if (adagfx_fonts_e::angelina12prop == font) { // Proportional font! - _display->setFont(&angelina12pt7b); - calculateTextMetrics(8, 22, 18, true); - # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ANGELINA - # ifdef ADAGFX_FONTS_EXTRA_12PT_NOVAMONO - } else if (adagfx_fonts_e::novamono12pt == font) { - _display->setFont(&NovaMono12pt7b); - calculateTextMetrics(13, 26, 22); - # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_NOVAMONO - # ifdef ADAGFX_FONTS_EXTRA_12PT_REPETITIONSCROLLiNG - } else if (adagfx_fonts_e::repetitionscrolling12pt == font) { - _display->setFont(&RepetitionScrolling12pt7b); - calculateTextMetrics(13, 22, 18); - # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_REPETITIONSCROLLiNG - # ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACE - } else if (adagfx_fonts_e::unispace12pt == font) { - _display->setFont(&unispace12pt7b); - calculateTextMetrics(18, 30, 26); - # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACE - # ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACEITALIC - } else if (adagfx_fonts_e::unispaceitalic12pt == font) { - _display->setFont(&unispace_italic12pt7b); - calculateTextMetrics(18, 30, 26); - # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACEITALIC - # ifdef ADAGFX_FONTS_EXTRA_12PT_WHITERABBiT - } else if (adagfx_fonts_e::whiterabbit12pt == font) { - _display->setFont(&whitrabt12pt7b); - calculateTextMetrics(13, 20, 16); - # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_WHITERABBiT - # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTO - } else if (adagfx_fonts_e::roboto12pt == font) { // Proportional font! - _display->setFont(&Roboto_Regular12pt7b); - calculateTextMetrics(13, 20, 16, true); - # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTO - # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOCONDENSED - } else if (adagfx_fonts_e::robotocond12pt == font) { // Proportional font! - _display->setFont(&RobotoCondensed_Regular12pt7b); - calculateTextMetrics(13, 20, 16, true); - # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOCONDENSED - # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOMONO - } else if (adagfx_fonts_e::robotomono12pt == font) { - _display->setFont(&RobotoMono_Regular12pt7b); - calculateTextMetrics(13, 20, 16); - # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOMONO - # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED - # ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED - # ifdef ADAGFX_FONTS_EXTRA_16PT_AMERIKASANS - } else if (adagfx_fonts_e::amerikasans16pt == font) { // Proportional font! - _display->setFont(&AmerikaSans16pt7b); - calculateTextMetrics(17, 30, 26, true); - # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_AMERIKASANS - # ifdef ADAGFX_FONTS_EXTRA_16PT_WHITERABBiT - } else if (adagfx_fonts_e::whiterabbit16pt == font) { - _display->setFont(&whitrabt16pt7b); - calculateTextMetrics(18, 26, 22); - # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_WHITERABBiT - # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTO - } else if (adagfx_fonts_e::roboto16pt == font) { // Proportional font! - _display->setFont(&Roboto_Regular16pt7b); - calculateTextMetrics(18, 27, 23, true); - # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTO - # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOCONDENSED - } else if (adagfx_fonts_e::robotocond16pt == font) { // Proportional font! - _display->setFont(&RobotoCondensed_Regular16pt7b); - calculateTextMetrics(18, 27, 23, true); - # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOCONDENSED - # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOMONO - } else if (adagfx_fonts_e::robotomono16pt == font) { - _display->setFont(&RobotoMono_Regular16pt7b); - calculateTextMetrics(18, 27, 23); - # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOMONO - # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED - # ifdef ADAGFX_FONTS_EXTRA_18PT_INCLUDED - # ifdef ADAGFX_FONTS_EXTRA_18PT_WHITERABBiT - } else if (adagfx_fonts_e::whiterabbit18pt == font) { - _display->setFont(&whitrabt18pt7b); - calculateTextMetrics(21, 30, 26); - # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_WHITERABBiT - # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_WHITERABBiT - # ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED - # ifdef ADAGFX_FONTS_EXTRA_20PT_WHITERABBiT - } else if (adagfx_fonts_e::whiterabbit20pt == font) { - _display->setFont(&whitrabt20pt7b); - calculateTextMetrics(24, 32, 28); - # endif // ifdef ADAGFX_FONTS_EXTRA_20PT_WHITERABBiT - # endif // ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED - } else if (adagfx_fonts_e::default_font == font) { // font,default is always available! - _display->setFont(); - calculateTextMetrics(6, 9); + constexpr int font_max = NR_ELEMENTS(fontargs); + const int font_i = GetCommandCode(sParams[0].c_str(), adagfx_fonts); + + if ((font_i >= 0) && (font_i < font_max)) { + _display->setFont(fontargs[font_i].f); + calculateTextMetrics(fontargs[font_i].width, + fontargs[font_i].height, + fontargs[font_i].offset, + fontargs[font_i].proportional); } else { success = false; } @@ -1766,7 +1800,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # if ADAGFX_ARGUMENT_VALIDATION const int16_t curWin = getWindow(); - if (curWin != 0) { selectWindow(0); } // Validate against raw window coordinates + if (curWin != 0) { selectWindow(0); } // Validate against raw window coordinates if (argCount == 6) { setRotation(nParams[5]); } // Use requested rotation @@ -2186,7 +2220,7 @@ uint16_t AdaGFXparseColor(String & s, const AdaGFXColorDepth& colorDepth, const bool emptyIsBlack) { s.toLowerCase(); - int32_t result = -1; // No result yet + int32_t result = -1; // No result yet const int color_i = GetCommandCode(s.c_str(), adagfx_colornames); const adagfx_colornames_e color = static_cast(color_i); diff --git a/src/src/Helpers/AdafruitGFX_helper.h b/src/src/Helpers/AdafruitGFX_helper.h index 6097a17a13..df8d81a0fc 100644 --- a/src/src/Helpers/AdafruitGFX_helper.h +++ b/src/src/Helpers/AdafruitGFX_helper.h @@ -12,6 +12,14 @@ ***************************************************************************/ /************ * Changelog: + * 2023-12-30 tonhuisman: Optimization of font handling, also reducing code-size + * Add some additional 7-segment/LCD-like fonts (18 pt enabled by default for ESP32 builds using this helper) + * - sevenseg18b (7segment 18 pt) (very few non-alphanumeric characters, slightly slanted) + * - sevenseg24b (7segment 24 pt) + * - lcd14cond18pt (LCD 14 segment, condensed, 18 pt) + * - lcd14cond24pt (LCD 14 segment, condensed, 24 pt) + * as sevenseg18 and sevenseg24 are partially proportionally spaced, even in the numeric characters :-( + * 2023-12-29 tonhuisman: Bugfixes: txz and txtfull subcommands didn't properly use the last set FG/BG colors * 2023-12-12 tonhuisman: Code deduplication and string optimizations to reduce build size * 2023-02-26 tonhuisman: Use GetCommandCode() / PROGMEM for parsing of commands and colors to reduce .bin size. * 2022-10-05 tonhuisman: No longer trim off spaces from arguments to commands @@ -51,7 +59,7 @@ # include // Used for bmp support -# define BUFPIXELS 200 ///< 200 * 5 = 1000 bytes +# define BUFPIXELS 200 ///< 200 * 5 = 1000 bytes # define ADAGFX_PARSE_MAX_ARGS 7 // Maximum number of arguments needed and supported (corrected) # ifndef ADAGFX_ARGUMENT_VALIDATION @@ -93,11 +101,12 @@ // # define ADAGFX_FONTS_EXTRA_8PT_INCLUDED // 8 extra 8pt fonts, should probably only be enabled in a private custom build, adds ~15.4 kB // # define ADAGFX_FONTS_EXTRA_12PT_INCLUDED // 9 extra 12pt fonts, should probably only be enabled in a private custom build, adds ~28 kB // # define ADAGFX_FONTS_EXTRA_16PT_INCLUDED // 5 extra 16pt fonts, should probably only be enabled in a private custom build, adds ~19.9 kB -// # define ADAGFX_FONTS_EXTRA_18PT_INCLUDED // 1 extra 18pt fonts, should probably only be enabled in a private custom build, adds ~4.3 kB +// # define ADAGFX_FONTS_EXTRA_18PT_INCLUDED // 3 extra 18pt fonts, should probably only be enabled in a private custom build, adds ~13.8 kB // # define ADAGFX_FONTS_EXTRA_20PT_INCLUDED // 1 extra 20pt fonts, should probably only be enabled in a private custom build, adds ~5.3 kB +// # define ADAGFX_FONTS_EXTRA_24PT_INCLUDED // 2 extra 24pt fonts, should probably only be enabled in a private custom build, adds ~11.1 kB // To enable/disable 8pt fonts separately: (will only be enabled if ADAGFX_FONTS_EXTRA_8PT_INCLUDED is defined) -# define ADAGFX_FONTS_EXTRA_8PT_ANGELINA // This font is proportinally spaced! +# define ADAGFX_FONTS_EXTRA_8PT_ANGELINA // This font is proportinally spaced! # define ADAGFX_FONTS_EXTRA_8PT_NOVAMONO # define ADAGFX_FONTS_EXTRA_8PT_UNISPACE # define ADAGFX_FONTS_EXTRA_8PT_UNISPACEITALIC @@ -129,10 +138,21 @@ // To enable/disable 18pt fonts separately: (will only be enabled if ADAGFX_FONTS_EXTRA_18PT_INCLUDED is defined) # define ADAGFX_FONTS_EXTRA_18PT_WHITERABBiT +# define ADAGFX_FONTS_EXTRA_18PT_SEVENSEG_B +# define ADAGFX_FONTS_EXTRA_18PT_LCD14COND +# ifndef ESP8266 +# ifndef ADAGFX_FONTS_EXTRA_18PT_INCLUDED +# define ADAGFX_FONTS_EXTRA_18PT_INCLUDED +# endif // ifndef ADAGFX_FONTS_EXTRA_18PT_INCLUDED +# endif // ifndef ESP8266 // To enable/disable 20pt fonts separately: (will only be enabled if ADAGFX_FONTS_EXTRA_20PT_INCLUDED is defined) # define ADAGFX_FONTS_EXTRA_20PT_WHITERABBiT +// To enable/disable 24pt fonts separately: (will only be enabled if ADAGFX_FONTS_EXTRA_24PT_INCLUDED is defined) +# define ADAGFX_FONTS_EXTRA_24PT_LCD14COND +# define ADAGFX_FONTS_EXTRA_24PT_SEVENSEG_B + # ifdef LIMIT_BUILD_SIZE # ifdef ADAGFX_FONTS_INCLUDED # undef ADAGFX_FONTS_INCLUDED @@ -176,6 +196,9 @@ # ifndef ADAGFX_FONTS_EXTRA_20PT_INCLUDED # define ADAGFX_FONTS_EXTRA_20PT_INCLUDED # endif // ifndef ADAGFX_FONTS_EXTRA_20PT_INCLUDED +# ifndef ADAGFX_FONTS_EXTRA_24PT_INCLUDED +# define ADAGFX_FONTS_EXTRA_24PT_INCLUDED +# endif // ifndef ADAGFX_FONTS_EXTRA_24PT_INCLUDED # ifndef ADAGFX_SUPPORT_7COLOR # define ADAGFX_SUPPORT_7COLOR 1 # endif // ifndef ADAGFX_SUPPORT_7COLOR @@ -473,7 +496,7 @@ class AdafruitGFX_helper { # endif // if ADAGFX_ENABLE_BMP_DISPLAY # if ADAGFX_ENABLE_FRAMED_WINDOW - uint8_t getWindow() { + uint8_t getWindow() const { return _window; } diff --git a/src/src/Static/Fonts/7segment18pt7b.h b/src/src/Static/Fonts/7segment18pt7b.h new file mode 100644 index 0000000000..1a6b597a74 --- /dev/null +++ b/src/src/Static/Fonts/7segment18pt7b.h @@ -0,0 +1,365 @@ +#ifndef FONTS_7SEGMENT18PT7B_H +#define FONTS_7SEGMENT18PT7B_H + +const uint8_t _7segment18pt7bBitmaps[] PROGMEM = { + 0x00, 0x00, 0x00, 0x08, 0x80, 0x19, 0x80, 0x33, 0x80, 0xF7, 0x01, 0xCE, + 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, + 0xE4, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x46, 0x77, 0x77, 0x77, 0x7F, + 0xF4, 0x1F, 0xF7, 0xFE, 0x6F, 0xE7, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, + 0x00, 0x70, 0x07, 0x00, 0xF0, 0x0F, 0x00, 0x40, 0x00, 0x00, 0x40, 0x0E, + 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, + 0x00, 0xDF, 0xCB, 0xFC, 0x7F, 0xC0, 0x3F, 0xF1, 0xFF, 0x61, 0xFD, 0x80, + 0x0F, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, + 0x03, 0x80, 0x0E, 0x00, 0x18, 0x00, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x78, + 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, + 0x3F, 0xF1, 0xFE, 0xCF, 0xFA, 0x00, 0x00, 0x00, 0x27, 0xFF, 0xFF, 0xEE, + 0xEE, 0xE6, 0x40, 0x7F, 0xBF, 0xF7, 0xF8, 0xFF, 0x00, 0x1F, 0xF8, 0xFF, + 0xD9, 0xBF, 0xB3, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, 0x38, 0x0E, + 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE4, 0x00, 0xC0, 0x00, 0x10, + 0x02, 0x70, 0x0E, 0xE0, 0x3D, 0xC0, 0x7B, 0x80, 0xF7, 0x01, 0xEE, 0x03, + 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xDF, 0xF9, 0x7F, 0xB1, 0xFF, 0x40, + 0x21, 0x8C, 0xF7, 0x39, 0xCE, 0x73, 0x9C, 0xE3, 0x00, 0x8E, 0xF7, 0xBD, + 0xEE, 0x73, 0x9C, 0xE3, 0x10, 0x1F, 0xF8, 0x7F, 0xD8, 0x3F, 0xB0, 0x00, + 0xF0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, + 0x00, 0x70, 0x00, 0xE1, 0xFE, 0xC7, 0xFE, 0x17, 0xF8, 0x70, 0x00, 0xE0, + 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, + 0x70, 0x00, 0xDF, 0xC1, 0x7F, 0x81, 0xFF, 0x00, 0x3F, 0xF1, 0xFF, 0x61, + 0xFD, 0x80, 0x0F, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, + 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x3F, 0xD9, 0xFF, 0x83, 0xFD, 0x00, 0x0E, + 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x07, + 0x00, 0x1C, 0x3F, 0xF1, 0xFE, 0xCF, 0xFA, 0x00, 0x00, 0x08, 0x80, 0x19, + 0x80, 0x33, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, + 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE5, 0xFE, 0xC7, 0xFE, 0x07, 0xFA, + 0x00, 0x0E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0x80, + 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x30, 0x00, 0x40, 0x1F, + 0xF1, 0xFF, 0x86, 0xFE, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, + 0x00, 0x70, 0x01, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0x5F, 0xE0, 0xFF, 0xC1, + 0xFE, 0x80, 0x07, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x38, + 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x1F, 0xF8, 0xFF, 0x67, 0xFD, 0x00, 0x1F, + 0xF1, 0xFF, 0x86, 0xFE, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, + 0x00, 0x70, 0x01, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0x5F, 0xE0, 0xFF, 0xC5, + 0xFE, 0xB8, 0x07, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3B, + 0x80, 0xEE, 0x03, 0xB8, 0x0E, 0xDF, 0xFA, 0xFF, 0x67, 0xFD, 0x00, 0x7F, + 0xE7, 0xFD, 0x8F, 0xEC, 0x00, 0xF0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, + 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x80, + 0x0E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0E, 0x00, 0x70, 0x03, + 0x80, 0x1C, 0x00, 0xE0, 0x03, 0x00, 0x10, 0x1F, 0xF8, 0xFF, 0xD9, 0xBF, + 0xB3, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, + 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE5, 0xFE, 0xC7, 0xFE, 0x17, 0xFA, 0x70, + 0x0E, 0xE0, 0x3D, 0xC0, 0x7B, 0x80, 0xF7, 0x01, 0xEE, 0x03, 0x9C, 0x07, + 0x38, 0x0E, 0x70, 0x1C, 0xDF, 0xF9, 0x7F, 0xB1, 0xFF, 0x40, 0x1F, 0xF8, + 0xFF, 0xD9, 0xBF, 0xB3, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, 0x38, + 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE5, 0xFE, 0xC7, 0xFE, + 0x07, 0xFA, 0x00, 0x0E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, + 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x1F, 0xF8, 0x7F, 0xB1, 0xFF, + 0x40, 0x77, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xE0, 0x00, 0x00, 0x3F, + 0xCF, 0xFC, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xF8, 0xFF, 0x3F, 0xE0, 0x00, 0x1F, 0xF8, 0x7F, + 0xD8, 0x3F, 0xB0, 0x00, 0xF0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, + 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE1, 0xFE, 0xC7, 0xFE, 0x17, + 0xF8, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, + 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xC0, 0x01, 0x00, 0x00, 0x00, 0x1F, + 0xF8, 0xFF, 0xD9, 0xBF, 0xB3, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, + 0x38, 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE5, 0xFE, 0xC7, + 0xFE, 0x17, 0xFA, 0x70, 0x0E, 0xE0, 0x3D, 0xC0, 0x7B, 0x80, 0xF7, 0x01, + 0xEE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xC0, 0x39, 0x00, 0x30, + 0x00, 0x40, 0x1F, 0xF8, 0xFF, 0xD9, 0xBF, 0xB3, 0x80, 0xF7, 0x01, 0xCE, + 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, + 0xE5, 0xFE, 0xC7, 0xFE, 0x17, 0xFA, 0x70, 0x0E, 0xE0, 0x3D, 0xC0, 0x7B, + 0x80, 0xF7, 0x01, 0xEE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xDF, + 0xF9, 0x7F, 0xB1, 0xFF, 0x40, 0x1F, 0xF7, 0xFE, 0x6F, 0xE7, 0x00, 0x70, + 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0xF0, 0x0F, 0x00, 0x40, + 0x00, 0x00, 0x40, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, + 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xDF, 0xCB, 0xFC, 0x7F, 0xC0, 0x1F, 0xF8, + 0xFF, 0xD9, 0xBF, 0xB3, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, 0x38, + 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE4, 0x00, 0xC0, 0x00, + 0x10, 0x02, 0x70, 0x0E, 0xE0, 0x3D, 0xC0, 0x7B, 0x80, 0xF7, 0x01, 0xEE, + 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xDF, 0xF9, 0x7F, 0xB1, 0xFF, + 0x40, 0x1F, 0xF7, 0xFE, 0x6F, 0xE7, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, + 0x00, 0x70, 0x07, 0x00, 0xF0, 0x0F, 0x00, 0x5F, 0xE3, 0xFF, 0x5F, 0xEE, + 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, + 0x00, 0xDF, 0xCB, 0xFC, 0x7F, 0xC0, 0x1F, 0xF7, 0xFE, 0x6F, 0xE7, 0x00, + 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0xF0, 0x0F, 0x00, + 0x5F, 0xE3, 0xFF, 0x5F, 0xEE, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, + 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xC0, 0x08, 0x00, 0x1F, 0xF1, 0xFF, + 0x86, 0xFE, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, + 0x01, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0xB8, + 0x07, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3B, 0x80, 0xEE, + 0x03, 0xB8, 0x0E, 0xDF, 0xFA, 0xFF, 0x67, 0xFD, 0x00, 0x00, 0x08, 0x80, + 0x19, 0x80, 0x33, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, 0x38, 0x0E, + 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE5, 0xFE, 0xC7, 0xFE, 0x17, + 0xFA, 0x70, 0x0E, 0xE0, 0x3D, 0xC0, 0x7B, 0x80, 0xF7, 0x01, 0xEE, 0x03, + 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xC0, 0x39, 0x00, 0x30, 0x00, 0x40, + 0x21, 0x8C, 0xF7, 0x39, 0xCE, 0x73, 0x9C, 0xE3, 0x00, 0x8E, 0xF7, 0xBD, + 0xEE, 0x73, 0x9C, 0xE3, 0x10, 0x00, 0x08, 0x00, 0x18, 0x00, 0x30, 0x00, + 0xF0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, + 0x00, 0x70, 0x00, 0xE0, 0x00, 0xC0, 0x00, 0x10, 0x02, 0x70, 0x0E, 0xE0, + 0x3D, 0xC0, 0x7B, 0x80, 0xF7, 0x01, 0xEE, 0x03, 0x9C, 0x07, 0x38, 0x0E, + 0x70, 0x1C, 0xDF, 0xF9, 0x7F, 0xB1, 0xFF, 0x40, 0x00, 0x08, 0x80, 0x19, + 0x80, 0x33, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, + 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE5, 0xFE, 0xC7, 0xFE, 0x17, 0xF8, + 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, + 0x00, 0x38, 0x00, 0x70, 0x00, 0xDF, 0xC1, 0x7F, 0x81, 0xFF, 0x00, 0x40, + 0x18, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x3C, 0x0F, + 0x01, 0x00, 0x00, 0x10, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, + 0xE0, 0x38, 0x0E, 0x03, 0x7F, 0xBF, 0xDF, 0xF0, 0x1F, 0xF0, 0xFF, 0x80, + 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0xFF, 0xC5, 0xFE, 0xB8, 0x07, + 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3B, 0x80, 0xEE, 0x03, + 0xB8, 0x0E, 0xC0, 0x3A, 0x00, 0x60, 0x01, 0x00, 0x1F, 0xF8, 0xFF, 0xD9, + 0xBF, 0xB3, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, + 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE4, 0x00, 0xC0, 0x00, 0x10, 0x02, + 0x70, 0x0E, 0xE0, 0x3D, 0xC0, 0x7B, 0x80, 0xF7, 0x01, 0xEE, 0x03, 0x9C, + 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xC0, 0x39, 0x00, 0x30, 0x00, 0x40, 0x1F, + 0xF8, 0xFF, 0xD9, 0xBF, 0xB3, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, + 0x38, 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE4, 0x00, 0xC0, + 0x00, 0x10, 0x02, 0x70, 0x0E, 0xE0, 0x3D, 0xC0, 0x7B, 0x80, 0xF7, 0x01, + 0xEE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xDF, 0xF9, 0x7F, 0xB1, + 0xFF, 0x40, 0x1F, 0xF8, 0xFF, 0xD9, 0xBF, 0xB3, 0x80, 0xF7, 0x01, 0xCE, + 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, + 0xE5, 0xFE, 0xC7, 0xFE, 0x17, 0xF8, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, + 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xC0, + 0x01, 0x00, 0x00, 0x1F, 0xF8, 0xFF, 0xD9, 0xBF, 0xB3, 0x80, 0xF7, 0x01, + 0xCE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, + 0x80, 0xE5, 0xFE, 0xC7, 0xFE, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0xC0, 0x7F, 0x81, 0xFF, 0x00, 0x1F, 0xF7, 0xFE, 0x6F, 0xE7, 0x00, + 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0xF0, 0x0F, 0x00, + 0x40, 0x00, 0x00, 0x40, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, + 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xC0, 0x08, 0x00, 0x1F, 0xF1, 0xFF, + 0x86, 0xFE, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, + 0x01, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0x5F, 0xE0, 0xFF, 0xC1, 0xFE, 0x80, + 0x07, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x38, 0x00, 0xE0, + 0x03, 0x80, 0x0E, 0x1F, 0xF8, 0xFF, 0x67, 0xFD, 0x00, 0x7F, 0xE7, 0xFD, + 0x8F, 0xEC, 0x00, 0xF0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, + 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x80, 0x0E, 0x00, + 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, + 0x00, 0xE0, 0x03, 0x00, 0x10, 0x00, 0x08, 0x80, 0x19, 0x80, 0x33, 0x80, + 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xE0, 0x3B, + 0xC0, 0x77, 0x80, 0xE4, 0x00, 0xC0, 0x00, 0x10, 0x02, 0x70, 0x0E, 0xE0, + 0x3D, 0xC0, 0x7B, 0x80, 0xF7, 0x01, 0xEE, 0x03, 0x9C, 0x07, 0x38, 0x0E, + 0x70, 0x1C, 0xDF, 0xF9, 0x7F, 0xB1, 0xFF, 0x40, 0x00, 0x08, 0x80, 0x19, + 0x80, 0x33, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, + 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE4, 0x00, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x7F, 0x81, 0xFF, 0x00, 0x00, + 0x08, 0x80, 0x19, 0x80, 0x33, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, + 0x38, 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE5, 0xFE, 0xC7, + 0xFE, 0x17, 0xFA, 0x70, 0x0E, 0xE0, 0x3D, 0xC0, 0x7B, 0x80, 0xF7, 0x01, + 0xEE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xDF, 0xF9, 0x7F, 0xB1, + 0xFF, 0x40, 0x3F, 0xEF, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0xFF, 0xCF, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, + 0x8F, 0xF3, 0xFE, 0x00, 0x00, 0x08, 0x80, 0x19, 0x80, 0x33, 0x80, 0xF7, + 0x01, 0xCE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, + 0x77, 0x80, 0xE5, 0xFE, 0xC7, 0xFE, 0x07, 0xFA, 0x00, 0x0E, 0x00, 0x3C, + 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, + 0x1C, 0x1F, 0xF8, 0x7F, 0xB1, 0xFF, 0x40, 0x1F, 0xF8, 0x7F, 0xD8, 0x3F, + 0xB0, 0x00, 0xF0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, + 0x00, 0x38, 0x00, 0x70, 0x00, 0xE1, 0xFE, 0xC7, 0xFE, 0x17, 0xF8, 0x70, + 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, + 0x38, 0x00, 0x70, 0x00, 0xDF, 0xC1, 0x7F, 0x81, 0xFF, 0x00, 0x1F, 0xF7, + 0xFE, 0x6F, 0xE7, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, + 0x00, 0xF0, 0x0F, 0x00, 0x40, 0x00, 0x00, 0x40, 0x0E, 0x00, 0xE0, 0x0E, + 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xDF, 0xCB, + 0xFC, 0x7F, 0xC0, 0x00, 0x3F, 0xF1, 0xFF, 0x61, 0xFD, 0x80, 0x0F, 0x00, + 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, + 0x0E, 0x00, 0x18, 0x00, 0x00, 0x01, 0x00, 0x0E, 0x00, 0x78, 0x01, 0xE0, + 0x07, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x3F, 0xF1, + 0xFE, 0xCF, 0xFA, 0x00, 0x00, 0x3F, 0xBF, 0xFF, 0xE0, 0x46, 0x77, 0x77, + 0x77, 0x7F, 0xF4, 0x1F, 0xF8, 0x7F, 0xD8, 0x3F, 0xB0, 0x00, 0xF0, 0x01, + 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, + 0x00, 0xE1, 0xFE, 0xC7, 0xFE, 0x17, 0xFA, 0x70, 0x0E, 0xE0, 0x3D, 0xC0, + 0x7B, 0x80, 0xF7, 0x01, 0xEE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, + 0xDF, 0xF9, 0x7F, 0xB1, 0xFF, 0x40, 0x40, 0x01, 0x80, 0x07, 0x00, 0x1C, + 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0F, + 0x00, 0x17, 0xF8, 0x3F, 0xF1, 0x7F, 0xAE, 0x01, 0xF8, 0x0F, 0xE0, 0x3F, + 0x80, 0xFE, 0x03, 0xF8, 0x0E, 0xE0, 0x3B, 0x80, 0xEE, 0x03, 0xB7, 0xFE, + 0xBF, 0xD9, 0xFF, 0x40, 0x1F, 0xE3, 0xFF, 0x5F, 0xEE, 0x00, 0xE0, 0x0E, + 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xDF, 0xCB, + 0xFC, 0x7F, 0xC0, 0x00, 0x08, 0x00, 0x18, 0x00, 0x30, 0x00, 0xF0, 0x01, + 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, + 0x00, 0xE1, 0xFE, 0xC7, 0xFE, 0x17, 0xFA, 0x70, 0x0E, 0xE0, 0x3D, 0xC0, + 0x7B, 0x80, 0xF7, 0x01, 0xEE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, + 0xDF, 0xF9, 0x7F, 0xB1, 0xFF, 0x40, 0x1F, 0xF8, 0xFF, 0xD9, 0xBF, 0xB3, + 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xE0, + 0x3B, 0xC0, 0x77, 0x80, 0xE5, 0xFE, 0xC7, 0xFE, 0x17, 0xF8, 0x70, 0x00, + 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, + 0x00, 0x70, 0x00, 0xDF, 0xC1, 0x7F, 0x81, 0xFF, 0x00, 0x1F, 0xF7, 0xFE, + 0x6F, 0xE7, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, + 0xF0, 0x0F, 0x00, 0x5F, 0xE3, 0xFF, 0x5F, 0xEE, 0x00, 0xE0, 0x0E, 0x00, + 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xC0, 0x08, 0x00, + 0x1F, 0xF8, 0xFF, 0xD9, 0xBF, 0xB3, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, + 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE5, 0xFE, + 0xC7, 0xFE, 0x07, 0xFA, 0x00, 0x0E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, + 0x01, 0xE0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x1F, 0xF8, 0x7F, + 0xB1, 0xFF, 0x40, 0x40, 0x01, 0x80, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, + 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0F, 0x00, 0x17, 0xF8, + 0x3F, 0xF1, 0x7F, 0xAE, 0x01, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, + 0xF8, 0x0E, 0xE0, 0x3B, 0x80, 0xEE, 0x03, 0xB0, 0x0E, 0x80, 0x18, 0x00, + 0x40, 0x27, 0xFF, 0xFF, 0xEE, 0xEE, 0xE6, 0x40, 0x00, 0x10, 0x00, 0x60, + 0x01, 0x80, 0x0F, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, + 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x18, 0x00, 0x00, 0x01, 0x00, 0x0E, + 0x00, 0x78, 0x01, 0xE0, 0x07, 0x80, 0x1E, 0x00, 0x70, 0x01, 0xC0, 0x07, + 0x00, 0x1C, 0x3F, 0xF1, 0xFE, 0xCF, 0xFA, 0x00, 0x1F, 0xF1, 0xFF, 0x86, + 0xFE, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, + 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0x5F, 0xE0, 0xFF, 0xC5, 0xFE, 0xB8, 0x07, + 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3B, 0x80, 0xEE, 0x03, + 0xB8, 0x0E, 0xC0, 0x3A, 0x00, 0x60, 0x01, 0x00, 0x40, 0x18, 0x07, 0x01, + 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x3C, 0x0F, 0x01, 0x00, 0x00, + 0x10, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, + 0x03, 0x7F, 0xBF, 0xDF, 0xF0, 0x1F, 0xF0, 0xFF, 0x80, 0xFE, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1F, 0xE0, 0xFF, 0xC5, 0xFE, 0xB8, 0x07, 0xE0, 0x3F, 0x80, + 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3B, 0x80, 0xEE, 0x03, 0xB8, 0x0E, 0xC0, + 0x3A, 0x00, 0x60, 0x01, 0x00, 0x1F, 0xE0, 0xFF, 0xC5, 0xFE, 0xB8, 0x07, + 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3B, 0x80, 0xEE, 0x03, + 0xB8, 0x0E, 0xC0, 0x3A, 0x00, 0x60, 0x01, 0x00, 0x1F, 0xE0, 0xFF, 0xC5, + 0xFE, 0xB8, 0x07, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3B, + 0x80, 0xEE, 0x03, 0xB8, 0x0E, 0xDF, 0xFA, 0xFF, 0x67, 0xFD, 0x00, 0x1F, + 0xF8, 0xFF, 0xD9, 0xBF, 0xB3, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, + 0x38, 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE5, 0xFE, 0xC7, + 0xFE, 0x17, 0xF8, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, + 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xC0, 0x01, 0x00, 0x00, + 0x1F, 0xF8, 0xFF, 0xD9, 0xBF, 0xB3, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, + 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE5, 0xFE, + 0xC7, 0xFE, 0x07, 0xFA, 0x00, 0x0E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, + 0x01, 0xE0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, + 0x30, 0x00, 0x40, 0x1F, 0xE3, 0xFF, 0x5F, 0xEE, 0x00, 0xE0, 0x0E, 0x00, + 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xC0, 0x08, 0x00, + 0x40, 0x01, 0x80, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, + 0x1C, 0x00, 0x70, 0x03, 0xC0, 0x0F, 0x00, 0x17, 0xF8, 0x3F, 0xF0, 0x7F, + 0xA0, 0x01, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0E, 0x00, + 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x18, 0x00, 0x40, 0x40, 0x06, + 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x0F, + 0x00, 0xF0, 0x05, 0xFE, 0x3F, 0xF5, 0xFE, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, + 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0D, 0xFC, 0xBF, 0xC7, + 0xFC, 0x40, 0x0B, 0x80, 0x7E, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, + 0x03, 0xB8, 0x0E, 0xE0, 0x3B, 0x80, 0xED, 0xFF, 0xAF, 0xF6, 0x7F, 0xD0, + 0x00, 0x08, 0x80, 0x19, 0x80, 0x33, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, + 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE4, 0x00, + 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x7F, + 0x81, 0xFF, 0x00, 0x00, 0x08, 0x80, 0x19, 0x80, 0x33, 0x80, 0xF7, 0x01, + 0xCE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0xC0, 0x77, + 0x80, 0xE5, 0xFE, 0xC7, 0xFE, 0x17, 0xFA, 0x70, 0x0E, 0xE0, 0x3D, 0xC0, + 0x7B, 0x80, 0xF7, 0x01, 0xEE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, 0x1C, + 0xDF, 0xF9, 0x7F, 0xB1, 0xFF, 0x40, 0x3F, 0xEF, 0xF8, 0x7F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, + 0xFF, 0xCF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3F, 0x8F, 0xF3, 0xFE, 0x00, 0x00, 0x08, 0x80, 0x19, + 0x80, 0x33, 0x80, 0xF7, 0x01, 0xCE, 0x03, 0x9C, 0x07, 0x38, 0x0E, 0x70, + 0x1C, 0xE0, 0x3B, 0xC0, 0x77, 0x80, 0xE5, 0xFE, 0xC7, 0xFE, 0x07, 0xFA, + 0x00, 0x0E, 0x00, 0x3C, 0x00, 0x78, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0x80, + 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x1F, 0xF8, 0x7F, 0xB1, 0xFF, 0x40, 0x1F, + 0xF8, 0x7F, 0xD8, 0x3F, 0xB0, 0x00, 0xF0, 0x01, 0xC0, 0x03, 0x80, 0x07, + 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE1, 0xFE, 0xC7, + 0xFE, 0x17, 0xF8, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, + 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xDF, 0xC1, 0x7F, 0x81, + 0xFF, 0x00, 0x00, 0x46, 0x77, 0x77, 0x77, 0x7F, 0xF4, 0x04, 0xEE, 0xEE, + 0xEE, 0xEE, 0xEC, 0x80, 0x00, 0x00 }; + +const GFXglyph _7segment18pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 17, 0, 0 }, // 0x20 ' ' + { 1, 1, 1, 0, 0, 0 }, // 0x21 '!' + { 2, 15, 13, 17, 2, -26 }, // 0x22 '"' + { 27, 1, 1, 0, 0, 0 }, // 0x23 '#' + { 28, 1, 1, 0, 0, 0 }, // 0x24 '$' + { 29, 1, 1, 0, 0, 0 }, // 0x25 '%' + { 30, 1, 1, 0, 0, 0 }, // 0x26 '&' + { 31, 4, 12, 17, 2, -25 }, // 0x27 ''' + { 37, 12, 27, 17, 2, -26 }, // 0x28 '(' + { 78, 14, 27, 17, 3, -26 }, // 0x29 ')' + { 126, 1, 1, 0, 0, 0 }, // 0x2A '*' + { 127, 1, 1, 0, 0, 0 }, // 0x2B '+' + { 128, 4, 13, 17, 12, -12 }, // 0x2C ',' + { 135, 10, 3, 17, 4, -14 }, // 0x2D '-' + { 139, 2, 4, 0, -1, -1 }, // 0x2E '.' + { 140, 1, 1, 0, 0, 0 }, // 0x2F '/' + { 141, 15, 27, 17, 2, -26 }, // 0x30 '0' + { 192, 5, 27, 17, 12, -26 }, // 0x31 '1' + { 209, 15, 27, 17, 2, -26 }, // 0x32 '2' + { 260, 14, 27, 17, 3, -26 }, // 0x33 '3' + { 308, 15, 27, 17, 2, -26 }, // 0x34 '4' + { 359, 14, 27, 17, 2, -26 }, // 0x35 '5' + { 407, 14, 27, 17, 2, -26 }, // 0x36 '6' + { 455, 13, 27, 17, 4, -26 }, // 0x37 '7' + { 499, 15, 27, 17, 2, -26 }, // 0x38 '8' + { 550, 15, 27, 17, 2, -26 }, // 0x39 '9' + { 601, 4, 15, 6, 2, -20 }, // 0x3A ':' + { 609, 1, 1, 0, 0, 0 }, // 0x3B ';' + { 610, 1, 1, 0, 0, 0 }, // 0x3C '<' + { 611, 11, 15, 17, 3, -14 }, // 0x3D '=' + { 632, 1, 1, 0, 0, 0 }, // 0x3E '>' + { 633, 15, 26, 17, 2, -26 }, // 0x3F '?' + { 682, 1, 1, 0, 0, 0 }, // 0x40 '@' + { 683, 15, 27, 17, 2, -26 }, // 0x41 'A' + { 734, 15, 27, 17, 2, -26 }, // 0x42 'B' + { 785, 12, 27, 17, 2, -26 }, // 0x43 'C' + { 826, 15, 27, 17, 2, -26 }, // 0x44 'D' + { 877, 12, 27, 17, 2, -26 }, // 0x45 'E' + { 918, 12, 26, 17, 2, -26 }, // 0x46 'F' + { 957, 14, 27, 17, 2, -26 }, // 0x47 'G' + { 1005, 15, 27, 17, 2, -26 }, // 0x48 'H' + { 1056, 5, 27, 17, 12, -26 }, // 0x49 'I' + { 1073, 15, 27, 17, 2, -26 }, // 0x4A 'J' + { 1124, 15, 27, 17, 2, -26 }, // 0x4B 'K' + { 1175, 10, 26, 17, 2, -25 }, // 0x4C 'L' + { 1208, 14, 27, 17, 2, -26 }, // 0x4D 'M' + { 1256, 15, 27, 17, 2, -26 }, // 0x4E 'N' + { 1307, 15, 27, 17, 2, -26 }, // 0x4F 'O' + { 1358, 15, 26, 17, 2, -26 }, // 0x50 'P' + { 1407, 15, 27, 17, 2, -26 }, // 0x51 'Q' + { 1458, 12, 26, 17, 2, -26 }, // 0x52 'R' + { 1497, 14, 27, 17, 2, -26 }, // 0x53 'S' + { 1545, 13, 27, 17, 4, -26 }, // 0x54 'T' + { 1589, 15, 27, 17, 2, -26 }, // 0x55 'U' + { 1640, 15, 27, 17, 2, -26 }, // 0x56 'V' + { 1691, 15, 27, 17, 2, -26 }, // 0x57 'W' + { 1742, 11, 27, 17, 3, -26 }, // 0x58 'X' + { 1780, 15, 27, 17, 2, -26 }, // 0x59 'Y' + { 1831, 15, 27, 17, 2, -26 }, // 0x5A 'Z' + { 1882, 12, 27, 17, 2, -26 }, // 0x5B '[' + { 1923, 1, 1, 0, 0, 0 }, // 0x5C '\' + { 1924, 14, 27, 17, 3, -26 }, // 0x5D ']' + { 1972, 1, 1, 0, 0, 0 }, // 0x5E '^' + { 1973, 9, 3, 17, 3, -2 }, // 0x5F '_' + { 1977, 4, 12, 17, 2, -25 }, // 0x60 '`' + { 1983, 15, 27, 17, 2, -26 }, // 0x61 'a' + { 2034, 14, 26, 17, 2, -25 }, // 0x62 'b' + { 2080, 12, 15, 17, 2, -14 }, // 0x63 'c' + { 2103, 15, 27, 17, 2, -26 }, // 0x64 'd' + { 2154, 15, 27, 17, 2, -26 }, // 0x65 'e' + { 2205, 12, 26, 17, 2, -26 }, // 0x66 'f' + { 2244, 15, 27, 17, 2, -26 }, // 0x67 'g' + { 2295, 14, 26, 17, 2, -25 }, // 0x68 'h' + { 2341, 4, 13, 17, 12, -12 }, // 0x69 'i' + { 2348, 14, 27, 17, 3, -26 }, // 0x6A 'j' + { 2396, 14, 27, 17, 2, -26 }, // 0x6B 'k' + { 2444, 10, 26, 17, 2, -25 }, // 0x6C 'l' + { 2477, 14, 27, 17, 2, -26 }, // 0x6D 'm' + { 2525, 14, 15, 17, 2, -14 }, // 0x6E 'n' + { 2552, 14, 15, 17, 2, -14 }, // 0x6F 'o' + { 2579, 15, 26, 17, 2, -26 }, // 0x70 'p' + { 2628, 15, 27, 17, 2, -26 }, // 0x71 'q' + { 2679, 12, 14, 17, 2, -14 }, // 0x72 'r' + { 2700, 14, 26, 17, 2, -25 }, // 0x73 's' + { 2746, 12, 26, 17, 2, -25 }, // 0x74 't' + { 2785, 14, 13, 17, 2, -12 }, // 0x75 'u' + { 2808, 15, 27, 17, 2, -26 }, // 0x76 'v' + { 2859, 15, 27, 17, 2, -26 }, // 0x77 'w' + { 2910, 11, 27, 17, 3, -26 }, // 0x78 'x' + { 2948, 15, 27, 17, 2, -26 }, // 0x79 'y' + { 2999, 15, 27, 17, 2, -26 }, // 0x7A 'z' + { 3050, 1, 1, 0, 0, 0 }, // 0x7B '{' + { 3051, 4, 25, 17, 2, -25 }, // 0x7C '|' + { 3064, 1, 1, 0, 0, 0 }, // 0x7D '}' + { 3065, 1, 1, 0, 0, 0 } }; // 0x7E '~' + +const GFXfont _7segment18pt7b PROGMEM = { + (uint8_t *)_7segment18pt7bBitmaps, + (GFXglyph *)_7segment18pt7bGlyphs, + 0x20, 0x7E, 36 }; + +// Approx. 3738 bytes +#endif // ifndef FONTS_7SEGMENT18PT7B_H diff --git a/src/src/Static/Fonts/7segment24pt7b.h b/src/src/Static/Fonts/7segment24pt7b.h new file mode 100644 index 0000000000..fd2c5e0ab8 --- /dev/null +++ b/src/src/Static/Fonts/7segment24pt7b.h @@ -0,0 +1,557 @@ +#ifndef FONTS_7SEGMENT24PT7B_H +#define FONTS_7SEGMENT24PT7B_H + +const uint8_t _7segment24pt7bBitmaps[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x19, 0x80, 0x03, 0xB8, 0x00, 0xF7, + 0x80, 0x1E, 0xF0, 0x03, 0xDE, 0x00, 0x7B, 0xC0, 0x1F, 0x78, 0x03, 0xEF, + 0x00, 0x7D, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, + 0x00, 0xF7, 0x80, 0x1E, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x63, + 0x9E, 0xF7, 0xBD, 0xEF, 0x7F, 0xFF, 0xFF, 0xFB, 0x80, 0x0F, 0xFF, 0x87, + 0xFF, 0x8D, 0xFF, 0xC7, 0x7F, 0xC3, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, + 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x0F, 0x80, 0x07, 0xC0, + 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, + 0x78, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, + 0x03, 0xE0, 0x01, 0xE0, 0x00, 0xE7, 0xF8, 0x6F, 0xFE, 0x0F, 0xFF, 0x07, + 0xFF, 0xC0, 0x3F, 0xFF, 0x0F, 0xFF, 0x61, 0xFF, 0xDC, 0x3F, 0xEF, 0x00, + 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, + 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x78, + 0x00, 0x1E, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, + 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, + 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF0, + 0x00, 0x3C, 0x1F, 0xEF, 0x1F, 0xFD, 0xCF, 0xFF, 0x63, 0xFF, 0xF0, 0x00, + 0x00, 0x3B, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x79, 0xCC, 0x40, + 0x3F, 0xF1, 0xFF, 0xEF, 0xFF, 0xCF, 0xFC, 0x77, 0xEE, 0x00, 0x0F, 0xFF, + 0xC0, 0xFF, 0xF6, 0x37, 0xFF, 0x73, 0xBF, 0xEF, 0x3C, 0x00, 0xF3, 0xC0, + 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF3, 0xC0, 0x1F, 0x3C, + 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xE7, + 0x80, 0x1E, 0x70, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0E, + 0x78, 0x01, 0xE7, 0x80, 0x1E, 0x78, 0x03, 0xE7, 0x80, 0x3E, 0x78, 0x03, + 0xE7, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, + 0x3E, 0xF8, 0x03, 0xCF, 0x00, 0x3C, 0xE7, 0xFB, 0xCD, 0xFF, 0xDC, 0x3F, + 0xFD, 0x83, 0xFF, 0xF0, 0x10, 0x61, 0xCF, 0x3C, 0xF3, 0xDF, 0x7D, 0xF7, + 0xDF, 0x7D, 0xF7, 0x9E, 0x18, 0x00, 0x0E, 0x79, 0xEF, 0xBE, 0xFB, 0xEF, + 0xBE, 0xFB, 0xEF, 0x3C, 0xF1, 0xC6, 0x10, 0x0F, 0xFF, 0xC0, 0xFF, 0xF6, + 0x07, 0xFF, 0x70, 0x3F, 0xEF, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, + 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, + 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x07, + 0xFE, 0x60, 0xFF, 0xF0, 0x1F, 0xFF, 0x87, 0x7F, 0xE0, 0x78, 0x00, 0x07, + 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, + 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, + 0x0F, 0x00, 0x00, 0xE7, 0xF8, 0x0D, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, + 0xE0, 0x3F, 0xFF, 0x0F, 0xFF, 0x61, 0xFF, 0xDC, 0x3F, 0xEF, 0x00, 0x03, + 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, + 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, + 0x1E, 0x1F, 0xF9, 0x8F, 0xFF, 0x07, 0xFF, 0xE0, 0x7F, 0xEE, 0x00, 0x07, + 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, + 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF0, 0x00, + 0x3C, 0x1F, 0xEF, 0x1F, 0xFD, 0xCF, 0xFF, 0x63, 0xFF, 0xF0, 0x00, 0x00, + 0x80, 0x00, 0x19, 0x80, 0x03, 0xB8, 0x00, 0xF7, 0x80, 0x1E, 0xF0, 0x03, + 0xDE, 0x00, 0x7B, 0xC0, 0x1F, 0x78, 0x03, 0xEF, 0x00, 0x7D, 0xE0, 0x0F, + 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0xF7, 0x80, 0x1E, + 0xEF, 0xFC, 0xC3, 0xFF, 0xC0, 0xFF, 0xFC, 0x07, 0xFE, 0xE0, 0x00, 0x3C, + 0x00, 0x07, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, + 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xE0, + 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0x70, 0x00, 0x0C, 0x00, 0x01, 0x00, + 0x1F, 0xFF, 0x07, 0xFF, 0x86, 0xFF, 0xE1, 0xDF, 0xF0, 0x78, 0x00, 0x1E, + 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, + 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xC0, 0x00, + 0xEF, 0xFC, 0x07, 0xFF, 0x83, 0xFF, 0xF0, 0x3F, 0xF7, 0x00, 0x03, 0xC0, + 0x00, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, + 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x1E, + 0x0F, 0xF7, 0x8F, 0xFE, 0xE7, 0xFF, 0xB1, 0xFF, 0xF8, 0x0F, 0xFF, 0x81, + 0xFF, 0xE0, 0xDF, 0xFC, 0x1D, 0xFF, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, + 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, 0x3E, + 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xC0, 0x00, 0x77, + 0xFE, 0x01, 0xFF, 0xE0, 0x7F, 0xFE, 0x3B, 0xFF, 0x77, 0x80, 0x1E, 0xF0, + 0x03, 0xDE, 0x00, 0xFB, 0xC0, 0x1F, 0x78, 0x03, 0xEF, 0x00, 0x7F, 0xE0, + 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0xF7, 0x80, + 0x1E, 0xE7, 0xFB, 0xDB, 0xFF, 0xB8, 0xFF, 0xF6, 0x1F, 0xFF, 0x80, 0xFF, + 0xFC, 0xFF, 0xF6, 0x7F, 0xF7, 0x3F, 0xEF, 0x00, 0x0F, 0x00, 0x0F, 0x00, + 0x0F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, + 0x1F, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x3E, 0x00, 0x3E, 0x00, + 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, + 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x10, 0x0F, + 0xFF, 0xC0, 0xFF, 0xF6, 0x37, 0xFF, 0x73, 0xBF, 0xEF, 0x3C, 0x00, 0xF3, + 0xC0, 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF3, 0xC0, 0x1F, + 0x3C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, + 0xE7, 0x80, 0x1E, 0x77, 0xFE, 0x60, 0xFF, 0xF0, 0x1F, 0xFF, 0x87, 0x7F, + 0xEE, 0x78, 0x01, 0xE7, 0x80, 0x1E, 0x78, 0x03, 0xE7, 0x80, 0x3E, 0x78, + 0x03, 0xE7, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF, + 0x80, 0x3E, 0xF8, 0x03, 0xCF, 0x00, 0x3C, 0xE7, 0xFB, 0xCD, 0xFF, 0xDC, + 0x3F, 0xFD, 0x83, 0xFF, 0xF0, 0x1F, 0xFF, 0x83, 0xFF, 0xD9, 0xBF, 0xFB, + 0xBB, 0xFE, 0xF7, 0x80, 0x1E, 0xF0, 0x03, 0xDE, 0x00, 0x7B, 0xC0, 0x1F, + 0x78, 0x03, 0xEF, 0x00, 0x7D, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3F, + 0xF0, 0x07, 0xFE, 0x00, 0xF7, 0x80, 0x1E, 0xEF, 0xFC, 0xC3, 0xFF, 0xC0, + 0xFF, 0xFC, 0x07, 0xFE, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x01, 0xF0, + 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, + 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x00, 0x3C, 0x0F, 0xF7, 0x87, + 0xFF, 0x71, 0xFF, 0xEC, 0x3F, 0xFF, 0x00, 0x7D, 0xF7, 0xDF, 0x7C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xEF, 0xBE, 0x00, 0x00, + 0x1F, 0xF8, 0x7F, 0xF9, 0xFF, 0xF8, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0xFF, 0xE3, 0xFF, 0xC7, + 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xC0, 0xFF, 0xF6, 0x07, 0xFF, 0x70, 0x3F, + 0xEF, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x00, + 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, + 0x00, 0x1F, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x07, 0xFE, 0x60, 0xFF, 0xF0, + 0x1F, 0xFF, 0x87, 0x7F, 0xE0, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, + 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, + 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x00, 0xE0, + 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0xFF, 0xF6, 0x37, 0xFF, + 0x73, 0xBF, 0xEF, 0x3C, 0x00, 0xF3, 0xC0, 0x0F, 0x3C, 0x00, 0xF3, 0xC0, + 0x1F, 0x3C, 0x01, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, + 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xE7, 0x80, 0x1E, 0x77, 0xFE, 0x60, + 0xFF, 0xF0, 0x1F, 0xFF, 0x87, 0x7F, 0xEE, 0x78, 0x01, 0xE7, 0x80, 0x1E, + 0x78, 0x03, 0xE7, 0x80, 0x3E, 0x78, 0x03, 0xE7, 0x80, 0x3E, 0xF8, 0x03, + 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xCF, 0x00, + 0x3C, 0xE0, 0x03, 0xCC, 0x00, 0x1C, 0x00, 0x01, 0x80, 0x00, 0x10, 0x0F, + 0xFF, 0xC0, 0xFF, 0xF6, 0x37, 0xFF, 0x73, 0xBF, 0xEF, 0x3C, 0x00, 0xF3, + 0xC0, 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF3, 0xC0, 0x1F, + 0x3C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, + 0xE7, 0x80, 0x1E, 0x77, 0xFE, 0x60, 0xFF, 0xF0, 0x1F, 0xFF, 0x87, 0x7F, + 0xEE, 0x78, 0x01, 0xE7, 0x80, 0x1E, 0x78, 0x03, 0xE7, 0x80, 0x3E, 0x78, + 0x03, 0xE7, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF, + 0x80, 0x3E, 0xF8, 0x03, 0xCF, 0x00, 0x3C, 0xE7, 0xFB, 0xCD, 0xFF, 0xDC, + 0x3F, 0xFD, 0x83, 0xFF, 0xF0, 0x0F, 0xFF, 0x87, 0xFF, 0x8D, 0xFF, 0xC7, + 0x7F, 0xC3, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, + 0x1E, 0x00, 0x0F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, + 0x00, 0xF0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x07, + 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, + 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xE0, + 0x00, 0xE7, 0xF8, 0x6F, 0xFE, 0x0F, 0xFF, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, + 0xC0, 0xFF, 0xF6, 0x37, 0xFF, 0x73, 0xBF, 0xEF, 0x3C, 0x00, 0xF3, 0xC0, + 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF3, 0xC0, 0x1F, 0x3C, + 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xE7, + 0x80, 0x1E, 0x70, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0E, + 0x78, 0x01, 0xE7, 0x80, 0x1E, 0x78, 0x03, 0xE7, 0x80, 0x3E, 0x78, 0x03, + 0xE7, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, + 0x3E, 0xF8, 0x03, 0xCF, 0x00, 0x3C, 0xE7, 0xFB, 0xCD, 0xFF, 0xDC, 0x3F, + 0xFD, 0x83, 0xFF, 0xF0, 0x0F, 0xFF, 0x87, 0xFF, 0x8D, 0xFF, 0xC7, 0x7F, + 0xC3, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, + 0x00, 0x0F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, + 0xF0, 0x00, 0x77, 0xFE, 0x07, 0xFF, 0x87, 0xFF, 0xEE, 0xFF, 0xC7, 0x80, + 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3E, + 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xE0, 0x00, + 0xE7, 0xF8, 0x6F, 0xFE, 0x0F, 0xFF, 0x07, 0xFF, 0xC0, 0x0F, 0xFF, 0x87, + 0xFF, 0x8D, 0xFF, 0xC7, 0x7F, 0xC3, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, + 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x0F, 0x80, 0x07, 0xC0, + 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF0, 0x00, 0x77, 0xFE, 0x07, 0xFF, 0x87, + 0xFF, 0xEE, 0xFF, 0xC7, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, + 0x78, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, + 0x03, 0xE0, 0x01, 0xE0, 0x00, 0xE0, 0x00, 0x60, 0x00, 0x00, 0x0F, 0xFF, + 0x81, 0xFF, 0xE0, 0xDF, 0xFC, 0x1D, 0xFF, 0x03, 0xC0, 0x00, 0x78, 0x00, + 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0xF0, 0x00, + 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xC0, 0x00, + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x77, 0x80, 0x1E, + 0xF0, 0x03, 0xDE, 0x00, 0xFB, 0xC0, 0x1F, 0x78, 0x03, 0xEF, 0x00, 0x7F, + 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0xF7, + 0x80, 0x1E, 0xE7, 0xFB, 0xDB, 0xFF, 0xB8, 0xFF, 0xF6, 0x1F, 0xFF, 0x80, + 0x00, 0x00, 0x40, 0x00, 0x06, 0x30, 0x00, 0x73, 0x80, 0x0F, 0x3C, 0x00, + 0xF3, 0xC0, 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF3, 0xC0, + 0x1F, 0x3C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, + 0x01, 0xE7, 0x80, 0x1E, 0x77, 0xFE, 0x60, 0xFF, 0xF0, 0x1F, 0xFF, 0x87, + 0x7F, 0xEE, 0x78, 0x01, 0xE7, 0x80, 0x1E, 0x78, 0x03, 0xE7, 0x80, 0x3E, + 0x78, 0x03, 0xE7, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, + 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xCF, 0x00, 0x3C, 0xE0, 0x03, 0xCC, 0x00, + 0x1C, 0x00, 0x01, 0x80, 0x00, 0x10, 0x10, 0x61, 0xCF, 0x3C, 0xF3, 0xDF, + 0x7D, 0xF7, 0xDF, 0x7D, 0xF7, 0x9E, 0x18, 0x00, 0x0E, 0x79, 0xEF, 0xBE, + 0xFB, 0xEF, 0xBE, 0xFB, 0xEF, 0x3C, 0xF1, 0xC6, 0x10, 0x00, 0x00, 0x40, + 0x00, 0x06, 0x00, 0x00, 0x70, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, + 0x00, 0x00, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, + 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xE0, 0x00, + 0x1E, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0E, 0x78, + 0x01, 0xE7, 0x80, 0x1E, 0x78, 0x03, 0xE7, 0x80, 0x3E, 0x78, 0x03, 0xE7, + 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, + 0xF8, 0x03, 0xCF, 0x00, 0x3C, 0xE7, 0xFB, 0xCD, 0xFF, 0xDC, 0x3F, 0xFD, + 0x83, 0xFF, 0xF0, 0x00, 0x00, 0x40, 0x00, 0x06, 0x30, 0x00, 0x73, 0x80, + 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x1F, 0x3C, + 0x01, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xF7, + 0xC0, 0x1F, 0x7C, 0x01, 0xE7, 0x80, 0x1E, 0x77, 0xFE, 0x60, 0xFF, 0xF0, + 0x1F, 0xFF, 0x87, 0x7F, 0xE0, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, + 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, + 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x00, 0xE7, + 0xF8, 0x0D, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xE0, 0x30, 0x00, 0x70, + 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, + 0x3C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x1C, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, + 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, + 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x39, 0xFE, 0x6F, 0xFE, 0x3F, 0xFC, 0x7F, + 0xFC, 0x0F, 0xFF, 0x81, 0xFF, 0xE0, 0x1F, 0xFC, 0x01, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xFE, 0x01, 0xFF, 0xE0, 0x7F, 0xFE, 0x3B, 0xFF, + 0x77, 0x80, 0x1E, 0xF0, 0x03, 0xDE, 0x00, 0xFB, 0xC0, 0x1F, 0x78, 0x03, + 0xEF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, + 0xFE, 0x00, 0xF7, 0x80, 0x1E, 0xE0, 0x03, 0xD8, 0x00, 0x38, 0x00, 0x06, + 0x00, 0x00, 0x80, 0x0F, 0xFF, 0xC0, 0xFF, 0xF6, 0x37, 0xFF, 0x73, 0xBF, + 0xEF, 0x3C, 0x00, 0xF3, 0xC0, 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x1F, 0x3C, + 0x01, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xF7, + 0xC0, 0x1F, 0x7C, 0x01, 0xE7, 0x80, 0x1E, 0x70, 0x00, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x0E, 0x78, 0x01, 0xE7, 0x80, 0x1E, 0x78, 0x03, + 0xE7, 0x80, 0x3E, 0x78, 0x03, 0xE7, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, + 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xCF, 0x00, 0x3C, 0xE0, + 0x03, 0xCC, 0x00, 0x1C, 0x00, 0x01, 0x80, 0x00, 0x10, 0x0F, 0xFF, 0xC0, + 0xFF, 0xF6, 0x37, 0xFF, 0x73, 0xBF, 0xEF, 0x3C, 0x00, 0xF3, 0xC0, 0x0F, + 0x3C, 0x00, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, + 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xE7, 0x80, + 0x1E, 0x70, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0E, 0x78, + 0x01, 0xE7, 0x80, 0x1E, 0x78, 0x03, 0xE7, 0x80, 0x3E, 0x78, 0x03, 0xE7, + 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, + 0xF8, 0x03, 0xCF, 0x00, 0x3C, 0xE7, 0xFB, 0xCD, 0xFF, 0xDC, 0x3F, 0xFD, + 0x83, 0xFF, 0xF0, 0x0F, 0xFF, 0xC0, 0xFF, 0xF6, 0x37, 0xFF, 0x73, 0xBF, + 0xEF, 0x3C, 0x00, 0xF3, 0xC0, 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x1F, 0x3C, + 0x01, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xF7, + 0xC0, 0x1F, 0x7C, 0x01, 0xE7, 0x80, 0x1E, 0x77, 0xFE, 0x60, 0xFF, 0xF0, + 0x1F, 0xFF, 0x87, 0x7F, 0xE0, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, + 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, + 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x00, 0xE0, + 0x00, 0x0C, 0x00, 0x00, 0x1F, 0xFF, 0x83, 0xFF, 0xD9, 0xBF, 0xFB, 0xBB, + 0xFE, 0xF7, 0x80, 0x1E, 0xF0, 0x03, 0xDE, 0x00, 0x7B, 0xC0, 0x1F, 0x78, + 0x03, 0xEF, 0x00, 0x7D, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0, + 0x07, 0xFE, 0x00, 0xF7, 0x80, 0x1E, 0xEF, 0xFC, 0xC3, 0xFF, 0xC0, 0xFF, + 0xFC, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x07, 0xFF, + 0x01, 0xFF, 0xE0, 0x3F, 0xFE, 0x00, 0x0F, 0xFF, 0x87, 0xFF, 0x8D, 0xFF, + 0xC7, 0x7F, 0xC3, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, + 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, + 0xF0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, + 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, + 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, + 0xE0, 0x00, 0xE0, 0x00, 0x60, 0x00, 0x00, 0x1F, 0xFF, 0x07, 0xFF, 0x86, + 0xFF, 0xE1, 0xDF, 0xF0, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, + 0x00, 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, + 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xC0, 0x00, 0xEF, 0xFC, 0x07, 0xFF, 0x83, + 0xFF, 0xF0, 0x3F, 0xF7, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x7C, 0x00, + 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, + 0xC0, 0x01, 0xF0, 0x00, 0x78, 0x00, 0x1E, 0x0F, 0xF7, 0x8F, 0xFE, 0xE7, + 0xFF, 0xB1, 0xFF, 0xF8, 0xFF, 0xFC, 0xFF, 0xF6, 0x7F, 0xF7, 0x3F, 0xEF, + 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, + 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x1E, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x1E, + 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3E, + 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x1C, + 0x00, 0x18, 0x00, 0x10, 0x00, 0x00, 0x40, 0x00, 0x06, 0x30, 0x00, 0x73, + 0x80, 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x1F, + 0x3C, 0x01, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, + 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xE7, 0x80, 0x1E, 0x70, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x0E, 0x78, 0x01, 0xE7, 0x80, 0x1E, 0x78, + 0x03, 0xE7, 0x80, 0x3E, 0x78, 0x03, 0xE7, 0x80, 0x3E, 0xF8, 0x03, 0xEF, + 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xCF, 0x00, 0x3C, + 0xE7, 0xFB, 0xCD, 0xFF, 0xDC, 0x3F, 0xFD, 0x83, 0xFF, 0xF0, 0x00, 0x00, + 0x80, 0x00, 0x19, 0x80, 0x03, 0xB8, 0x00, 0xF7, 0x80, 0x1E, 0xF0, 0x03, + 0xDE, 0x00, 0x7B, 0xC0, 0x1F, 0x78, 0x03, 0xEF, 0x00, 0x7D, 0xE0, 0x0F, + 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0xF7, 0x80, 0x1E, + 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0xF0, 0x07, 0xFF, 0x01, 0xFF, 0xE0, 0x3F, 0xFE, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x06, 0x30, 0x00, 0x73, 0x80, 0x0F, 0x3C, 0x00, + 0xF3, 0xC0, 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF3, 0xC0, + 0x1F, 0x3C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, + 0x01, 0xE7, 0x80, 0x1E, 0x77, 0xFE, 0x60, 0xFF, 0xF0, 0x1F, 0xFF, 0x87, + 0x7F, 0xEE, 0x78, 0x01, 0xE7, 0x80, 0x1E, 0x78, 0x03, 0xE7, 0x80, 0x3E, + 0x78, 0x03, 0xE7, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, + 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xCF, 0x00, 0x3C, 0xE7, 0xFB, 0xCD, 0xFF, + 0xDC, 0x3F, 0xFD, 0x83, 0xFF, 0xF0, 0x3F, 0xFE, 0x7F, 0xF8, 0x7F, 0xF0, + 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0xF8, 0x7F, 0xF9, 0xFF, 0xF8, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0xFF, 0xE3, 0xFF, 0xC7, + 0xFF, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x19, 0x80, 0x03, 0xB8, 0x00, 0xF7, + 0x80, 0x1E, 0xF0, 0x03, 0xDE, 0x00, 0x7B, 0xC0, 0x1F, 0x78, 0x03, 0xEF, + 0x00, 0x7D, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, + 0x00, 0xF7, 0x80, 0x1E, 0xEF, 0xFC, 0xC3, 0xFF, 0xC0, 0xFF, 0xFC, 0x07, + 0xFE, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, + 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, + 0x0F, 0x80, 0x01, 0xE0, 0x00, 0x3C, 0x0F, 0xF7, 0x87, 0xFF, 0x71, 0xFF, + 0xEC, 0x3F, 0xFF, 0x00, 0x0F, 0xFF, 0xC0, 0xFF, 0xF6, 0x07, 0xFF, 0x70, + 0x3F, 0xEF, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x1F, + 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, + 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x07, 0xFE, 0x60, 0xFF, + 0xF0, 0x1F, 0xFF, 0x87, 0x7F, 0xE0, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, + 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0xF8, 0x00, 0x0F, + 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x00, + 0xE7, 0xF8, 0x0D, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, 0xFF, 0xE0, 0x0F, 0xFF, + 0x87, 0xFF, 0x8D, 0xFF, 0xC7, 0x7F, 0xC3, 0xC0, 0x01, 0xE0, 0x00, 0xF0, + 0x00, 0x78, 0x00, 0x3C, 0x00, 0x1E, 0x00, 0x0F, 0x00, 0x0F, 0x80, 0x07, + 0xC0, 0x03, 0xE0, 0x01, 0xF0, 0x00, 0xF0, 0x00, 0x70, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0E, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, + 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, + 0xC0, 0x03, 0xE0, 0x01, 0xE0, 0x00, 0xE7, 0xF8, 0x6F, 0xFE, 0x0F, 0xFF, + 0x07, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0x0F, 0xFF, 0x61, 0xFF, 0xDC, 0x3F, + 0xEF, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, + 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, + 0x00, 0x78, 0x00, 0x1E, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, + 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, + 0x00, 0xF0, 0x00, 0x3C, 0x1F, 0xEF, 0x1F, 0xFD, 0xCF, 0xFF, 0x63, 0xFF, + 0xF0, 0x00, 0x1F, 0xE3, 0xFF, 0xBF, 0xFD, 0xFF, 0xF0, 0x63, 0x9E, 0xF7, + 0xBD, 0xEF, 0x7F, 0xFF, 0xFF, 0xFB, 0x80, 0x0F, 0xFF, 0xC0, 0xFF, 0xF6, + 0x07, 0xFF, 0x70, 0x3F, 0xEF, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, + 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, + 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x07, + 0xFE, 0x60, 0xFF, 0xF0, 0x1F, 0xFF, 0x87, 0x7F, 0xEE, 0x78, 0x01, 0xE7, + 0x80, 0x1E, 0x78, 0x03, 0xE7, 0x80, 0x3E, 0x78, 0x03, 0xE7, 0x80, 0x3E, + 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, + 0xCF, 0x00, 0x3C, 0xE7, 0xFB, 0xCD, 0xFF, 0xDC, 0x3F, 0xFD, 0x83, 0xFF, + 0xF0, 0x30, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, + 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x0F, 0x80, + 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF0, 0x00, 0x1D, 0xFF, + 0x80, 0x7F, 0xF8, 0x1F, 0xFF, 0x8E, 0xFF, 0xDD, 0xE0, 0x07, 0xBC, 0x00, + 0xF7, 0x80, 0x3E, 0xF0, 0x07, 0xDE, 0x00, 0xFB, 0xC0, 0x1F, 0xF8, 0x03, + 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3D, 0xE0, 0x07, + 0xB9, 0xFE, 0xF6, 0xFF, 0xEE, 0x3F, 0xFD, 0x87, 0xFF, 0xE0, 0x07, 0xFE, + 0x07, 0xFF, 0x87, 0xFF, 0xEE, 0xFF, 0xC7, 0x80, 0x03, 0xC0, 0x01, 0xE0, + 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, + 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xE0, 0x00, 0xE7, 0xF8, 0x6F, 0xFE, + 0x0F, 0xFF, 0x07, 0xFF, 0xC0, 0x00, 0x00, 0x40, 0x00, 0x06, 0x00, 0x00, + 0x70, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, + 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, + 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xE0, 0x00, 0x1E, 0x07, 0xFE, 0x60, + 0xFF, 0xF0, 0x1F, 0xFF, 0x87, 0x7F, 0xEE, 0x78, 0x01, 0xE7, 0x80, 0x1E, + 0x78, 0x03, 0xE7, 0x80, 0x3E, 0x78, 0x03, 0xE7, 0x80, 0x3E, 0xF8, 0x03, + 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xCF, 0x00, + 0x3C, 0xE7, 0xFB, 0xCD, 0xFF, 0xDC, 0x3F, 0xFD, 0x83, 0xFF, 0xF0, 0x0F, + 0xFF, 0xC0, 0xFF, 0xF6, 0x37, 0xFF, 0x73, 0xBF, 0xEF, 0x3C, 0x00, 0xF3, + 0xC0, 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF3, 0xC0, 0x1F, + 0x3C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, + 0xE7, 0x80, 0x1E, 0x77, 0xFE, 0x60, 0xFF, 0xF0, 0x1F, 0xFF, 0x87, 0x7F, + 0xE0, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, + 0x00, 0x07, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, + 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x00, 0x00, 0xE7, 0xF8, 0x0D, 0xFF, 0xC0, + 0x3F, 0xFC, 0x03, 0xFF, 0xE0, 0x0F, 0xFF, 0x87, 0xFF, 0x8D, 0xFF, 0xC7, + 0x7F, 0xC3, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, + 0x1E, 0x00, 0x0F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xF0, + 0x00, 0xF0, 0x00, 0x77, 0xFE, 0x07, 0xFF, 0x87, 0xFF, 0xEE, 0xFF, 0xC7, + 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, + 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xE0, + 0x00, 0xE0, 0x00, 0x60, 0x00, 0x00, 0x1F, 0xFF, 0x83, 0xFF, 0xD9, 0xBF, + 0xFB, 0xBB, 0xFE, 0xF7, 0x80, 0x1E, 0xF0, 0x03, 0xDE, 0x00, 0x7B, 0xC0, + 0x1F, 0x78, 0x03, 0xEF, 0x00, 0x7D, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, + 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0xF7, 0x80, 0x1E, 0xEF, 0xFC, 0xC3, 0xFF, + 0xC0, 0xFF, 0xFC, 0x07, 0xFE, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x01, + 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, + 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x00, 0x3C, 0x0F, 0xF7, + 0x87, 0xFF, 0x71, 0xFF, 0xEC, 0x3F, 0xFF, 0x00, 0x30, 0x00, 0x07, 0x00, + 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x03, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, + 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x0F, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, + 0x07, 0xC0, 0x00, 0xF0, 0x00, 0x1D, 0xFF, 0x80, 0x7F, 0xF8, 0x1F, 0xFF, + 0x8E, 0xFF, 0xDD, 0xE0, 0x07, 0xBC, 0x00, 0xF7, 0x80, 0x3E, 0xF0, 0x07, + 0xDE, 0x00, 0xFB, 0xC0, 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x0F, + 0xFC, 0x01, 0xFF, 0x80, 0x3D, 0xE0, 0x07, 0xB8, 0x00, 0xF6, 0x00, 0x0E, + 0x00, 0x01, 0x80, 0x00, 0x20, 0x3B, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xEF, 0x79, 0xCC, 0x40, 0x00, 0x01, 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, + 0x0F, 0x00, 0x03, 0xC0, 0x00, 0xF0, 0x00, 0x3C, 0x00, 0x1F, 0x00, 0x07, + 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, 0x01, 0xF0, + 0x00, 0x78, 0x00, 0x1E, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, + 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3E, 0x00, 0x0F, 0x80, 0x03, 0xE0, + 0x00, 0xF0, 0x00, 0x3C, 0x1F, 0xEF, 0x1F, 0xFD, 0xCF, 0xFF, 0x63, 0xFF, + 0xF0, 0x0F, 0xFF, 0x81, 0xFF, 0xE0, 0xDF, 0xFC, 0x1D, 0xFF, 0x03, 0xC0, + 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, + 0x00, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, + 0x03, 0xC0, 0x00, 0x77, 0xFE, 0x01, 0xFF, 0xE0, 0x7F, 0xFE, 0x3B, 0xFF, + 0x77, 0x80, 0x1E, 0xF0, 0x03, 0xDE, 0x00, 0xFB, 0xC0, 0x1F, 0x78, 0x03, + 0xEF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, + 0xFE, 0x00, 0xF7, 0x80, 0x1E, 0xE0, 0x03, 0xD8, 0x00, 0x38, 0x00, 0x06, + 0x00, 0x00, 0x80, 0x30, 0x00, 0x70, 0x00, 0xF0, 0x01, 0xE0, 0x03, 0xC0, + 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, 0xF8, 0x01, 0xF0, 0x03, + 0xE0, 0x07, 0xC0, 0x0F, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, + 0x01, 0xE0, 0x03, 0xC0, 0x07, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x3C, 0x00, + 0xF8, 0x01, 0xF0, 0x03, 0xE0, 0x07, 0xC0, 0x0F, 0x80, 0x1E, 0x00, 0x39, + 0xFE, 0x6F, 0xFE, 0x3F, 0xFC, 0x7F, 0xFC, 0x0F, 0xFF, 0x81, 0xFF, 0xE0, + 0x1F, 0xFC, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x01, + 0xFF, 0xE0, 0x7F, 0xFE, 0x3B, 0xFF, 0x77, 0x80, 0x1E, 0xF0, 0x03, 0xDE, + 0x00, 0xFB, 0xC0, 0x1F, 0x78, 0x03, 0xEF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, + 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0xF7, 0x80, 0x1E, 0xE0, + 0x03, 0xD8, 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, 0x80, 0x07, 0xFE, 0x01, + 0xFF, 0xE0, 0x7F, 0xFE, 0x3B, 0xFF, 0x77, 0x80, 0x1E, 0xF0, 0x03, 0xDE, + 0x00, 0xFB, 0xC0, 0x1F, 0x78, 0x03, 0xEF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, + 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0xF7, 0x80, 0x1E, 0xE0, + 0x03, 0xD8, 0x00, 0x38, 0x00, 0x06, 0x00, 0x00, 0x80, 0x07, 0xFE, 0x01, + 0xFF, 0xE0, 0x7F, 0xFE, 0x3B, 0xFF, 0x77, 0x80, 0x1E, 0xF0, 0x03, 0xDE, + 0x00, 0xFB, 0xC0, 0x1F, 0x78, 0x03, 0xEF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, + 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0xF7, 0x80, 0x1E, 0xE7, + 0xFB, 0xDB, 0xFF, 0xB8, 0xFF, 0xF6, 0x1F, 0xFF, 0x80, 0x0F, 0xFF, 0xC0, + 0xFF, 0xF6, 0x37, 0xFF, 0x73, 0xBF, 0xEF, 0x3C, 0x00, 0xF3, 0xC0, 0x0F, + 0x3C, 0x00, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, + 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xE7, 0x80, + 0x1E, 0x77, 0xFE, 0x60, 0xFF, 0xF0, 0x1F, 0xFF, 0x87, 0x7F, 0xE0, 0x78, + 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, + 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, + 0xF8, 0x00, 0x0F, 0x00, 0x00, 0xE0, 0x00, 0x0C, 0x00, 0x00, 0x1F, 0xFF, + 0x83, 0xFF, 0xD9, 0xBF, 0xFB, 0xBB, 0xFE, 0xF7, 0x80, 0x1E, 0xF0, 0x03, + 0xDE, 0x00, 0x7B, 0xC0, 0x1F, 0x78, 0x03, 0xEF, 0x00, 0x7D, 0xE0, 0x0F, + 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0xF7, 0x80, 0x1E, + 0xEF, 0xFC, 0xC3, 0xFF, 0xC0, 0xFF, 0xFC, 0x07, 0xFE, 0xE0, 0x00, 0x3C, + 0x00, 0x07, 0x80, 0x01, 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, + 0x00, 0x1F, 0x00, 0x03, 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xE0, + 0x00, 0x3C, 0x00, 0x07, 0x80, 0x00, 0x70, 0x00, 0x0C, 0x00, 0x01, 0x00, + 0x07, 0xFE, 0x07, 0xFF, 0x87, 0xFF, 0xEE, 0xFF, 0xC7, 0x80, 0x03, 0xC0, + 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1F, + 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, 0xE0, 0x01, 0xE0, 0x00, 0xE0, 0x00, + 0x60, 0x00, 0x00, 0x60, 0x00, 0x1C, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, + 0x78, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, 0x3E, + 0x00, 0x0F, 0x80, 0x03, 0xE0, 0x00, 0xF8, 0x00, 0x3C, 0x00, 0x0E, 0xFF, + 0xC0, 0x7F, 0xF8, 0x3F, 0xFF, 0x03, 0xFF, 0x70, 0x00, 0x3C, 0x00, 0x0F, + 0x00, 0x07, 0xC0, 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0xC0, + 0x01, 0xF0, 0x00, 0x7C, 0x00, 0x1F, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, + 0x78, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x00, 0x80, 0x30, 0x00, 0x1C, 0x00, + 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0x78, + 0x00, 0x3C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0xC0, 0x03, + 0xC0, 0x01, 0xDF, 0xF8, 0x1F, 0xFE, 0x1F, 0xFF, 0xBB, 0xFF, 0x1E, 0x00, + 0x0F, 0x00, 0x07, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0x00, 0xF0, 0x00, 0xF8, + 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x0F, 0x80, 0x07, 0x80, 0x03, + 0x9F, 0xE1, 0xBF, 0xF8, 0x3F, 0xFC, 0x1F, 0xFF, 0x00, 0x70, 0x00, 0xEF, + 0x00, 0x3D, 0xE0, 0x07, 0xBC, 0x01, 0xF7, 0x80, 0x3E, 0xF0, 0x07, 0xDE, + 0x00, 0xFF, 0xC0, 0x1F, 0xF8, 0x03, 0xFF, 0x00, 0x7F, 0xE0, 0x0F, 0xFC, + 0x01, 0xEF, 0x00, 0x3D, 0xCF, 0xF7, 0xB7, 0xFF, 0x71, 0xFF, 0xEC, 0x3F, + 0xFF, 0x00, 0x00, 0x00, 0x80, 0x00, 0x19, 0x80, 0x03, 0xB8, 0x00, 0xF7, + 0x80, 0x1E, 0xF0, 0x03, 0xDE, 0x00, 0x7B, 0xC0, 0x1F, 0x78, 0x03, 0xEF, + 0x00, 0x7D, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, 0x3F, 0xF0, 0x07, 0xFE, + 0x00, 0xF7, 0x80, 0x1E, 0xE0, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x07, 0xFF, 0x01, 0xFF, + 0xE0, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x40, 0x00, 0x06, 0x30, 0x00, 0x73, + 0x80, 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x0F, 0x3C, 0x00, 0xF3, 0xC0, 0x1F, + 0x3C, 0x01, 0xF3, 0xC0, 0x1F, 0x3C, 0x01, 0xF7, 0xC0, 0x1F, 0x7C, 0x01, + 0xF7, 0xC0, 0x1F, 0x7C, 0x01, 0xE7, 0x80, 0x1E, 0x77, 0xFE, 0x60, 0xFF, + 0xF0, 0x1F, 0xFF, 0x87, 0x7F, 0xEE, 0x78, 0x01, 0xE7, 0x80, 0x1E, 0x78, + 0x03, 0xE7, 0x80, 0x3E, 0x78, 0x03, 0xE7, 0x80, 0x3E, 0xF8, 0x03, 0xEF, + 0x80, 0x3E, 0xF8, 0x03, 0xEF, 0x80, 0x3E, 0xF8, 0x03, 0xCF, 0x00, 0x3C, + 0xE7, 0xFB, 0xCD, 0xFF, 0xDC, 0x3F, 0xFD, 0x83, 0xFF, 0xF0, 0x3F, 0xFE, + 0x7F, 0xF8, 0x7F, 0xF0, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x7F, 0xF9, 0xFF, 0xF8, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, + 0xFF, 0xE3, 0xFF, 0xC7, 0xFF, 0xC0, 0x00, 0x00, 0x80, 0x00, 0x19, 0x80, + 0x03, 0xB8, 0x00, 0xF7, 0x80, 0x1E, 0xF0, 0x03, 0xDE, 0x00, 0x7B, 0xC0, + 0x1F, 0x78, 0x03, 0xEF, 0x00, 0x7D, 0xE0, 0x0F, 0xFC, 0x01, 0xFF, 0x80, + 0x3F, 0xF0, 0x07, 0xFE, 0x00, 0xF7, 0x80, 0x1E, 0xEF, 0xFC, 0xC3, 0xFF, + 0xC0, 0xFF, 0xFC, 0x07, 0xFE, 0xE0, 0x00, 0x3C, 0x00, 0x07, 0x80, 0x01, + 0xF0, 0x00, 0x3E, 0x00, 0x07, 0xC0, 0x00, 0xF8, 0x00, 0x1F, 0x00, 0x03, + 0xE0, 0x00, 0x7C, 0x00, 0x0F, 0x80, 0x01, 0xE0, 0x00, 0x3C, 0x0F, 0xF7, + 0x87, 0xFF, 0x71, 0xFF, 0xEC, 0x3F, 0xFF, 0x00, 0x0F, 0xFF, 0xC0, 0xFF, + 0xF6, 0x07, 0xFF, 0x70, 0x3F, 0xEF, 0x00, 0x00, 0xF0, 0x00, 0x0F, 0x00, + 0x00, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xF0, + 0x00, 0x1F, 0x00, 0x01, 0xF0, 0x00, 0x1F, 0x00, 0x01, 0xE0, 0x00, 0x1E, + 0x07, 0xFE, 0x60, 0xFF, 0xF0, 0x1F, 0xFF, 0x87, 0x7F, 0xE0, 0x78, 0x00, + 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, 0x00, 0x78, 0x00, 0x07, 0x80, + 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, 0x00, 0x0F, 0x80, 0x00, 0xF8, + 0x00, 0x0F, 0x00, 0x00, 0xE7, 0xF8, 0x0D, 0xFF, 0xC0, 0x3F, 0xFC, 0x03, + 0xFF, 0xE0, 0x00, 0x30, 0xE3, 0xCF, 0x3C, 0xF3, 0xCF, 0x3D, 0xF7, 0xDF, + 0x7D, 0xE7, 0x00, 0x01, 0xC7, 0x9E, 0x79, 0xE7, 0x9E, 0xFB, 0xEF, 0xBE, + 0xFB, 0xCE, 0x30, 0x00, 0x00 }; + +const GFXglyph _7segment24pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 22, 0, 0 }, // 0x20 ' ' + { 1, 1, 1, 0, 0, 0 }, // 0x21 '!' + { 2, 19, 17, 22, 3, -35 }, // 0x22 '"' + { 43, 1, 1, 0, 0, 0 }, // 0x23 '#' + { 44, 1, 1, 0, 0, 0 }, // 0x24 '$' + { 45, 1, 1, 0, 0, 0 }, // 0x25 '%' + { 46, 1, 1, 0, 0, 0 }, // 0x26 '&' + { 47, 5, 15, 22, 3, -33 }, // 0x27 ''' + { 57, 17, 36, 22, 2, -35 }, // 0x28 '(' + { 134, 18, 36, 22, 4, -35 }, // 0x29 ')' + { 215, 1, 1, 0, 0, 0 }, // 0x2A '*' + { 216, 1, 1, 0, 0, 0 }, // 0x2B '+' + { 217, 5, 17, 22, 16, -16 }, // 0x2C ',' + { 228, 14, 4, 22, 5, -19 }, // 0x2D '-' + { 235, 4, 4, 0, -2, -1 }, // 0x2E '.' + { 237, 1, 1, 0, 0, 0 }, // 0x2F '/' + { 238, 20, 36, 22, 2, -35 }, // 0x30 '0' + { 328, 6, 36, 22, 16, -35 }, // 0x31 '1' + { 355, 20, 36, 22, 2, -35 }, // 0x32 '2' + { 445, 18, 36, 22, 4, -35 }, // 0x33 '3' + { 526, 19, 36, 22, 3, -35 }, // 0x34 '4' + { 612, 18, 36, 22, 3, -35 }, // 0x35 '5' + { 693, 19, 36, 22, 2, -35 }, // 0x36 '6' + { 779, 16, 36, 22, 6, -35 }, // 0x37 '7' + { 851, 20, 36, 22, 2, -35 }, // 0x38 '8' + { 941, 19, 36, 22, 3, -35 }, // 0x39 '9' + { 1027, 6, 20, 8, 2, -27 }, // 0x3A ':' + { 1042, 1, 1, 0, 0, 0 }, // 0x3B ';' + { 1043, 1, 1, 0, 0, 0 }, // 0x3C '<' + { 1044, 15, 20, 22, 4, -19 }, // 0x3D '=' + { 1082, 1, 1, 0, 0, 0 }, // 0x3E '>' + { 1083, 20, 34, 22, 2, -35 }, // 0x3F '?' + { 1168, 1, 1, 0, 0, 0 }, // 0x40 '@' + { 1169, 20, 36, 22, 2, -35 }, // 0x41 'A' + { 1259, 20, 36, 22, 2, -35 }, // 0x42 'B' + { 1349, 17, 36, 22, 2, -35 }, // 0x43 'C' + { 1426, 20, 36, 22, 2, -35 }, // 0x44 'D' + { 1516, 17, 36, 22, 2, -35 }, // 0x45 'E' + { 1593, 17, 34, 22, 2, -35 }, // 0x46 'F' + { 1666, 19, 36, 22, 2, -35 }, // 0x47 'G' + { 1752, 20, 36, 22, 2, -35 }, // 0x48 'H' + { 1842, 6, 36, 22, 16, -35 }, // 0x49 'I' + { 1869, 20, 36, 22, 2, -35 }, // 0x4A 'J' + { 1959, 20, 36, 22, 2, -35 }, // 0x4B 'K' + { 2049, 15, 34, 22, 2, -33 }, // 0x4C 'L' + { 2113, 19, 36, 22, 2, -35 }, // 0x4D 'M' + { 2199, 20, 36, 22, 2, -35 }, // 0x4E 'N' + { 2289, 20, 36, 22, 2, -35 }, // 0x4F 'O' + { 2379, 20, 34, 22, 2, -35 }, // 0x50 'P' + { 2464, 19, 36, 22, 3, -35 }, // 0x51 'Q' + { 2550, 17, 34, 22, 2, -35 }, // 0x52 'R' + { 2623, 18, 36, 22, 3, -35 }, // 0x53 'S' + { 2704, 16, 36, 22, 6, -35 }, // 0x54 'T' + { 2776, 20, 36, 22, 2, -35 }, // 0x55 'U' + { 2866, 19, 36, 22, 3, -35 }, // 0x56 'V' + { 2952, 20, 36, 22, 2, -35 }, // 0x57 'W' + { 3042, 15, 36, 22, 4, -35 }, // 0x58 'X' + { 3110, 19, 36, 22, 3, -35 }, // 0x59 'Y' + { 3196, 20, 36, 22, 2, -35 }, // 0x5A 'Z' + { 3286, 17, 36, 22, 2, -35 }, // 0x5B '[' + { 3363, 1, 1, 0, 0, 0 }, // 0x5C '\' + { 3364, 18, 36, 22, 4, -35 }, // 0x5D ']' + { 3445, 1, 1, 0, 0, 0 }, // 0x5E '^' + { 3446, 13, 4, 22, 4, -3 }, // 0x5F '_' + { 3453, 5, 15, 22, 3, -33 }, // 0x60 '`' + { 3463, 20, 36, 22, 2, -35 }, // 0x61 'a' + { 3553, 19, 34, 22, 2, -33 }, // 0x62 'b' + { 3634, 17, 20, 22, 2, -19 }, // 0x63 'c' + { 3677, 20, 36, 22, 2, -35 }, // 0x64 'd' + { 3767, 20, 36, 22, 2, -35 }, // 0x65 'e' + { 3857, 17, 34, 22, 2, -35 }, // 0x66 'f' + { 3930, 19, 36, 22, 3, -35 }, // 0x67 'g' + { 4016, 19, 34, 22, 2, -33 }, // 0x68 'h' + { 4097, 5, 17, 22, 16, -16 }, // 0x69 'i' + { 4108, 18, 36, 22, 4, -35 }, // 0x6A 'j' + { 4189, 19, 36, 22, 2, -35 }, // 0x6B 'k' + { 4275, 15, 34, 22, 2, -33 }, // 0x6C 'l' + { 4339, 19, 36, 22, 2, -35 }, // 0x6D 'm' + { 4425, 19, 20, 22, 2, -19 }, // 0x6E 'n' + { 4473, 19, 20, 22, 2, -19 }, // 0x6F 'o' + { 4521, 20, 34, 22, 2, -35 }, // 0x70 'p' + { 4606, 19, 36, 22, 3, -35 }, // 0x71 'q' + { 4692, 17, 18, 22, 2, -19 }, // 0x72 'r' + { 4731, 18, 34, 22, 3, -33 }, // 0x73 's' + { 4808, 17, 34, 22, 2, -33 }, // 0x74 't' + { 4881, 19, 17, 22, 2, -16 }, // 0x75 'u' + { 4922, 19, 36, 22, 3, -35 }, // 0x76 'v' + { 5008, 20, 36, 22, 2, -35 }, // 0x77 'w' + { 5098, 15, 36, 22, 4, -35 }, // 0x78 'x' + { 5166, 19, 36, 22, 3, -35 }, // 0x79 'y' + { 5252, 20, 36, 22, 2, -35 }, // 0x7A 'z' + { 5342, 1, 1, 0, 0, 0 }, // 0x7B '{' + { 5343, 6, 32, 22, 2, -33 }, // 0x7C '|' + { 5367, 1, 1, 0, 0, 0 }, // 0x7D '}' + { 5368, 1, 1, 0, 0, 0 } }; // 0x7E '~' + +const GFXfont _7segment24pt7b PROGMEM = { + (uint8_t *)_7segment24pt7bBitmaps, + (GFXglyph *)_7segment24pt7bGlyphs, + 0x20, 0x7E, 48 }; + +// Approx. 6041 bytes +#endif // ifndef FONTS_7SEGMENT24PT7B_H diff --git a/src/src/Static/Fonts/LCD14cond18pt7b.h b/src/src/Static/Fonts/LCD14cond18pt7b.h new file mode 100644 index 0000000000..1abd1bc594 --- /dev/null +++ b/src/src/Static/Fonts/LCD14cond18pt7b.h @@ -0,0 +1,317 @@ +#ifndef FONTS_LCD14COND18PT7B_H +#define FONTS_LCD14COND18PT7B_H +const uint8_t LCD14cond18pt7bBitmaps[] PROGMEM = { + 0x00, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, + 0x02, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xBF, 0xEF, 0xE0, 0x8C, 0x63, 0x18, + 0xC6, 0x31, 0x8C, 0x63, 0x18, 0x80, 0x88, 0x44, 0x22, 0x11, 0x08, 0x84, + 0x42, 0x21, 0x10, 0x88, 0x44, 0x22, 0x11, 0x0F, 0xF7, 0xFF, 0xFD, 0x10, + 0x88, 0x44, 0x22, 0x11, 0x08, 0x84, 0x42, 0x21, 0x10, 0x88, 0x7F, 0xBF, + 0xEF, 0xE0, 0x7F, 0x7F, 0xFF, 0xD1, 0x08, 0x84, 0x42, 0x21, 0x10, 0x88, + 0x44, 0x22, 0x11, 0x08, 0x87, 0xFB, 0xFE, 0xFF, 0x08, 0x84, 0x42, 0x21, + 0x10, 0x88, 0x44, 0x22, 0x11, 0x08, 0x84, 0x5F, 0xFF, 0xF7, 0xF0, 0x7F, + 0xBF, 0xFF, 0xFA, 0x22, 0x89, 0xA2, 0x68, 0x9A, 0x2C, 0x8B, 0x23, 0x88, + 0xE2, 0x38, 0x8C, 0x3F, 0xEF, 0xFD, 0xFF, 0x18, 0x46, 0x13, 0x84, 0xE1, + 0x28, 0x4A, 0x16, 0x85, 0xA1, 0x48, 0x52, 0x17, 0xFF, 0xFF, 0x7F, 0x80, + 0x7F, 0x7F, 0xDD, 0xC8, 0x24, 0x12, 0x09, 0x8C, 0xC6, 0x22, 0x1B, 0x0D, + 0x82, 0x81, 0x40, 0x00, 0x02, 0x01, 0x14, 0x8A, 0x4D, 0xA6, 0xD2, 0x2B, + 0x1D, 0x8E, 0x83, 0x41, 0xA0, 0xDD, 0xFF, 0xF7, 0xF0, 0xFF, 0xF8, 0x7F, + 0x7F, 0xFD, 0xD0, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, + 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, + 0x01, 0x00, 0x80, 0x40, 0x3D, 0xDF, 0xF7, 0xF0, 0x7F, 0x7F, 0xDD, 0xE0, + 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, + 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, + 0x80, 0x5D, 0xFF, 0xF7, 0xF0, 0x08, 0x24, 0x92, 0x4D, 0x66, 0xB1, 0x50, + 0xA8, 0x7C, 0x3E, 0x0E, 0x07, 0x0F, 0xEF, 0xFB, 0xF8, 0x70, 0x38, 0x3E, + 0x1F, 0x0A, 0x85, 0x46, 0xB3, 0x59, 0x24, 0x92, 0x08, 0x00, 0x08, 0x04, + 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x07, + 0xF7, 0xFD, 0xFC, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, + 0x10, 0x08, 0x04, 0x02, 0x00, 0x25, 0xB4, 0xB6, 0x90, 0x77, 0x7F, 0xDD, + 0xC0, 0xFF, 0xF8, 0x02, 0x04, 0x18, 0x30, 0x40, 0x83, 0x06, 0x08, 0x10, + 0x00, 0x00, 0x04, 0x08, 0x30, 0x60, 0x81, 0x06, 0x0C, 0x10, 0x20, 0x00, + 0x7E, 0xFF, 0xF7, 0x81, 0x83, 0x83, 0x83, 0x87, 0x87, 0x85, 0x85, 0x85, + 0x85, 0x81, 0x80, 0x81, 0x91, 0xA1, 0xB1, 0xA1, 0xA1, 0xE1, 0xE1, 0xC1, + 0xC1, 0xC1, 0xF7, 0xFF, 0x7E, 0x13, 0x37, 0x75, 0x5D, 0xD9, 0x91, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x7F, 0xBF, 0xF7, 0x3C, 0x01, 0x00, + 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x5C, 0xFF, + 0xFF, 0xCE, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x08, 0x02, 0x00, + 0x80, 0x20, 0x0F, 0x3B, 0xFF, 0x7F, 0x80, 0x7F, 0x7F, 0xDD, 0xE0, 0x10, + 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x0B, 0xBF, 0xFE, + 0xEF, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, + 0x5D, 0xFF, 0xF7, 0xF0, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, + 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0xF3, 0xFF, 0xF7, 0x3C, 0x01, + 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, + 0x10, 0x04, 0x7F, 0x7F, 0xDD, 0xC8, 0x04, 0x02, 0x01, 0x80, 0xC0, 0x20, + 0x18, 0x0C, 0x02, 0x01, 0x00, 0x38, 0x3E, 0x0F, 0x00, 0x80, 0x40, 0x20, + 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x5D, 0xFF, 0xF7, 0xF0, 0x7F, + 0xBF, 0xFF, 0x3A, 0x00, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x08, + 0x02, 0x00, 0x80, 0x3C, 0xEF, 0xFF, 0xCF, 0x80, 0x60, 0x18, 0x06, 0x01, + 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x1F, 0x3F, 0xFF, 0x7F, 0x80, + 0x7F, 0x7F, 0xDD, 0xE0, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, + 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, + 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x7F, 0xBF, 0xFF, 0x3E, + 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, + 0x7C, 0xFF, 0xFF, 0xCF, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, + 0x06, 0x01, 0x80, 0x60, 0x1F, 0x3F, 0xFF, 0x7F, 0x80, 0x7F, 0xBF, 0xFF, + 0x3E, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, + 0x80, 0x7C, 0xFF, 0xFD, 0xCF, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, + 0x10, 0x04, 0x01, 0x00, 0x40, 0x17, 0x3F, 0xFF, 0x7F, 0x80, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x3F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x22, + 0x66, 0x44, 0xCC, 0x88, 0x25, 0xB4, 0xB6, 0x90, 0x01, 0x26, 0xC9, 0x36, + 0x48, 0x77, 0x7F, 0xDD, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xBB, 0xFE, 0xFE, 0x93, 0x64, 0x9B, 0x24, 0x00, + 0x4B, 0x69, 0x6D, 0x20, 0x7F, 0x7F, 0xFD, 0xF0, 0x18, 0x0C, 0x06, 0x03, + 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x3E, 0x3E, 0x1E, 0x08, 0x04, + 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, + 0x7F, 0xBF, 0xFF, 0x3E, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, + 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x04, 0x01, 0x12, 0x44, 0x91, 0x24, + 0xCD, 0x33, 0x48, 0x56, 0x1D, 0x87, 0x40, 0xD0, 0x37, 0x3F, 0xFF, 0x7F, + 0x80, 0x7F, 0xBF, 0xFF, 0x3E, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, + 0x60, 0x18, 0x06, 0x01, 0x80, 0x7C, 0xFF, 0xFF, 0xCF, 0x80, 0x60, 0x18, + 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, + 0x7F, 0x7F, 0xDF, 0xE1, 0x10, 0x88, 0x44, 0x22, 0x11, 0x08, 0x84, 0x42, + 0x21, 0x10, 0x88, 0x7C, 0x3C, 0x1F, 0x08, 0x84, 0x42, 0x21, 0x10, 0x88, + 0x44, 0x22, 0x11, 0x08, 0x84, 0x5F, 0xFF, 0xF7, 0xF0, 0x7F, 0x7F, 0xFD, + 0xD0, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, + 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, + 0x80, 0x40, 0x3D, 0xDF, 0xF7, 0xF0, 0x7F, 0x7F, 0xDF, 0xE1, 0x10, 0x88, + 0x44, 0x22, 0x11, 0x08, 0x84, 0x42, 0x21, 0x10, 0x88, 0x44, 0x22, 0x11, + 0x08, 0x84, 0x42, 0x21, 0x10, 0x88, 0x44, 0x22, 0x11, 0x08, 0x84, 0x5F, + 0xFF, 0xF7, 0xF0, 0x7F, 0x7F, 0xFD, 0xD0, 0x08, 0x04, 0x02, 0x01, 0x00, + 0x80, 0x40, 0x20, 0x10, 0x08, 0x07, 0xBB, 0xFF, 0xEE, 0x80, 0x40, 0x20, + 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x3D, 0xDF, 0xF7, 0xF0, + 0x7F, 0x7F, 0xFD, 0xD0, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, + 0x10, 0x08, 0x07, 0xBB, 0xFF, 0xEE, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, + 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x00, 0x7F, 0xBF, 0xFF, 0x3A, + 0x00, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, + 0x20, 0xE8, 0x7E, 0x0F, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, + 0x06, 0x01, 0x80, 0x60, 0x1F, 0x3F, 0xFF, 0x7F, 0x80, 0x80, 0x60, 0x18, + 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, + 0xF3, 0xFF, 0xFF, 0x3E, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, + 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x04, 0x7F, 0x7F, 0xDF, 0xC1, 0x00, + 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, + 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, + 0x1F, 0xDF, 0xF7, 0xF0, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, + 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x60, 0x18, 0x06, 0x01, + 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x7C, + 0xFF, 0xFD, 0xFE, 0x80, 0x40, 0x60, 0x70, 0x38, 0x14, 0x1A, 0x0D, 0x04, + 0x86, 0x43, 0x21, 0x1E, 0x0F, 0x87, 0x82, 0x11, 0x0C, 0x86, 0x41, 0x20, + 0xD0, 0x68, 0x14, 0x0E, 0x07, 0x01, 0x80, 0x00, 0x80, 0x40, 0x20, 0x10, + 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, + 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, + 0x7B, 0xBF, 0xEF, 0xE0, 0x81, 0xC1, 0xC3, 0xC3, 0xE3, 0xE7, 0xA7, 0xA5, + 0xB5, 0x95, 0x95, 0x81, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xC1, 0xC1, 0xC1, 0xE1, 0xE1, 0xA1, + 0xA1, 0xB1, 0xB1, 0x91, 0x81, 0x81, 0x81, 0x85, 0x85, 0x85, 0x85, 0x87, + 0x87, 0x83, 0x83, 0x83, 0x81, 0x81, 0x7F, 0xBF, 0xFF, 0x3E, 0x01, 0x80, + 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, + 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, + 0x80, 0x60, 0x1F, 0x3F, 0xFF, 0x7F, 0x80, 0x7F, 0xBF, 0xFF, 0x3E, 0x01, + 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x7C, + 0xFF, 0xFF, 0xCE, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x08, 0x02, + 0x00, 0x80, 0x20, 0x08, 0x02, 0x00, 0x7F, 0xBF, 0xFF, 0x3E, 0x01, 0x80, + 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, + 0x06, 0x01, 0x82, 0x60, 0x98, 0x26, 0x0D, 0x83, 0x60, 0x58, 0x1E, 0x07, + 0x80, 0xE0, 0x3F, 0x3F, 0xFF, 0x7F, 0x80, 0x7F, 0xBF, 0xFF, 0x3E, 0x01, + 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x7C, + 0xFF, 0xFF, 0xCE, 0x82, 0x20, 0x88, 0x22, 0x0C, 0x83, 0x20, 0x48, 0x1A, + 0x06, 0x80, 0xA0, 0x28, 0x00, 0x7F, 0xBF, 0xFF, 0x3A, 0x00, 0x80, 0x20, + 0x08, 0x02, 0x00, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x3C, 0xEF, 0xFD, + 0xCF, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, + 0x40, 0x17, 0x3F, 0xFF, 0x7F, 0x80, 0x7F, 0x7F, 0xDF, 0xC1, 0x00, 0x80, + 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, + 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, + 0x01, 0x00, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, + 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, + 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x7C, 0xFF, 0xFD, + 0xFE, 0x01, 0x81, 0x81, 0x81, 0xC1, 0xC1, 0x41, 0x61, 0x61, 0x21, 0x21, + 0x01, 0x01, 0x01, 0x09, 0x09, 0x0D, 0x0D, 0x05, 0x07, 0x07, 0x03, 0x03, + 0x03, 0x01, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x95, 0xA5, 0xB5, 0xA5, 0xA7, 0xE7, 0xE3, 0xC3, + 0xC3, 0xC1, 0x81, 0x83, 0x06, 0x0E, 0x3C, 0x68, 0x9B, 0x36, 0x28, 0x50, + 0x00, 0x00, 0x05, 0x0A, 0x36, 0x6C, 0x8B, 0x1E, 0x38, 0x30, 0x60, 0x80, + 0x83, 0x07, 0x1E, 0x34, 0x48, 0x9B, 0x36, 0x28, 0x50, 0x00, 0x81, 0x02, + 0x04, 0x08, 0x10, 0x20, 0x40, 0x81, 0x02, 0x04, 0x08, 0x7F, 0x7F, 0xDD, + 0xC0, 0x20, 0x10, 0x18, 0x0C, 0x04, 0x02, 0x03, 0x01, 0x80, 0x80, 0x43, + 0xBB, 0xFE, 0xEE, 0x10, 0x08, 0x0C, 0x06, 0x02, 0x01, 0x01, 0x80, 0xC0, + 0x40, 0x20, 0x1D, 0xDF, 0xF7, 0xF0, 0x7F, 0x7F, 0xFF, 0xD1, 0x08, 0x84, + 0x42, 0x21, 0x10, 0x88, 0x44, 0x22, 0x11, 0x08, 0x84, 0x42, 0x21, 0x10, + 0x88, 0x44, 0x22, 0x11, 0x08, 0x84, 0x42, 0x21, 0x10, 0x88, 0x44, 0x3F, + 0xDF, 0xF7, 0xF0, 0x81, 0x03, 0x06, 0x04, 0x08, 0x18, 0x30, 0x20, 0x40, + 0x00, 0x00, 0x01, 0x02, 0x06, 0x0C, 0x08, 0x10, 0x30, 0x60, 0x40, 0x80, + 0x7F, 0x7F, 0xDF, 0xE1, 0x10, 0x88, 0x44, 0x22, 0x11, 0x08, 0x84, 0x42, + 0x21, 0x10, 0x88, 0x44, 0x22, 0x11, 0x08, 0x84, 0x42, 0x21, 0x10, 0x88, + 0x44, 0x22, 0x11, 0x08, 0x84, 0x5F, 0xFF, 0xF7, 0xF0, 0x28, 0x51, 0xB3, + 0x64, 0x58, 0xF1, 0xC1, 0x83, 0x04, 0x77, 0x7F, 0xDF, 0xC0, 0x93, 0x64, + 0x9B, 0x24, 0x7F, 0xBF, 0xF7, 0x3C, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, + 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x5C, 0xFF, 0xFF, 0xCF, 0x80, 0x60, + 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x1F, 0x3F, + 0xFF, 0x7F, 0x80, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x08, 0x02, + 0x00, 0x80, 0x20, 0x08, 0x02, 0x00, 0xF3, 0xBF, 0xFF, 0x3E, 0x01, 0x80, + 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x7C, 0xFF, + 0xFD, 0xFE, 0x77, 0x7F, 0xFD, 0xD0, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, + 0x40, 0x20, 0x10, 0x08, 0x07, 0xBB, 0xFE, 0xFE, 0x00, 0x40, 0x10, 0x04, + 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x73, + 0xFF, 0xFF, 0x3E, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, + 0x06, 0x01, 0x80, 0x7C, 0xFF, 0xFD, 0xFE, 0x7F, 0xBF, 0xFF, 0x3E, 0x01, + 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x7C, + 0xFF, 0xFF, 0xCE, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x08, 0x02, + 0x00, 0x80, 0x20, 0x0F, 0x3B, 0xFF, 0x7F, 0x80, 0x7F, 0x7F, 0xFD, 0xD0, + 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x07, 0x83, + 0xE1, 0xE0, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, + 0x40, 0x20, 0x10, 0x00, 0x7F, 0xBF, 0xFF, 0x3E, 0x01, 0x80, 0x60, 0x18, + 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x7C, 0xFF, 0xFD, 0xCF, + 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, + 0x17, 0x3F, 0xFF, 0x7F, 0x80, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, + 0x08, 0x02, 0x00, 0x80, 0x20, 0x08, 0x02, 0x00, 0xF3, 0xBF, 0xFF, 0x3E, + 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, + 0x60, 0x18, 0x04, 0x7F, 0x7F, 0xDD, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x04, 0x02, + 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x7F, + 0x7F, 0xDD, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, + 0x02, 0x01, 0x00, 0x80, 0x5D, 0xFF, 0xF7, 0xF0, 0x80, 0x40, 0x60, 0x70, + 0x38, 0x14, 0x1A, 0x0D, 0x04, 0x86, 0x43, 0x21, 0x1E, 0x0F, 0x87, 0x82, + 0x11, 0x0C, 0x86, 0x41, 0x20, 0xD0, 0x68, 0x14, 0x0E, 0x07, 0x01, 0x80, + 0x00, 0xFF, 0xFF, 0xFF, 0xC0, 0x77, 0x7F, 0xFF, 0xF1, 0x18, 0x8C, 0x46, + 0x23, 0x11, 0x88, 0xC4, 0x62, 0x31, 0x18, 0x8C, 0x46, 0x22, 0x73, 0xBF, + 0xFF, 0x3E, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, + 0x01, 0x80, 0x60, 0x18, 0x04, 0x73, 0xBF, 0xFF, 0x3E, 0x01, 0x80, 0x60, + 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x7C, 0xFF, 0xFD, + 0xFE, 0x7F, 0xBF, 0xFF, 0x3E, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, + 0x60, 0x18, 0x06, 0x01, 0x80, 0x7C, 0xFF, 0xFF, 0xCE, 0x80, 0x20, 0x08, + 0x02, 0x00, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x20, 0x08, 0x02, 0x00, + 0x7F, 0xBF, 0xFF, 0x3E, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, + 0x18, 0x06, 0x01, 0x80, 0x7C, 0xFF, 0xFD, 0xCF, 0x00, 0x40, 0x10, 0x04, + 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x77, + 0x7F, 0xFD, 0xD0, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, + 0x08, 0x04, 0x02, 0x00, 0x7F, 0xBF, 0xFF, 0x3A, 0x00, 0x80, 0x20, 0x08, + 0x02, 0x00, 0x80, 0x20, 0x08, 0x02, 0x00, 0x80, 0x3C, 0xEF, 0xFD, 0xCF, + 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, 0x40, + 0x17, 0x3F, 0xFF, 0x7F, 0x80, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, + 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x07, 0xF7, 0xFD, 0xFC, 0x10, 0x08, + 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, + 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, + 0x18, 0x06, 0x01, 0xF3, 0xFF, 0xF7, 0xF8, 0x19, 0x9D, 0xD5, 0x57, 0x73, + 0x31, 0x81, 0x95, 0xA5, 0xB5, 0xA5, 0xA7, 0xE7, 0xE3, 0xC3, 0xC3, 0xC1, + 0x81, 0x83, 0x06, 0x0E, 0x3C, 0x68, 0x9B, 0x36, 0x28, 0x50, 0x00, 0x00, + 0x05, 0x0A, 0x36, 0x6C, 0x8B, 0x1E, 0x38, 0x30, 0x60, 0x80, 0x80, 0x60, + 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x06, + 0x01, 0xF3, 0xFF, 0xF7, 0x3C, 0x01, 0x00, 0x40, 0x10, 0x04, 0x01, 0x00, + 0x40, 0x10, 0x04, 0x01, 0x00, 0x5C, 0xFF, 0xFD, 0xFE, 0x7F, 0x7F, 0xDD, + 0xC0, 0x20, 0x10, 0x18, 0x0C, 0x04, 0x02, 0x03, 0x01, 0x80, 0x80, 0x40, + 0x00, 0x00, 0x00, 0x10, 0x08, 0x0C, 0x06, 0x02, 0x01, 0x01, 0x80, 0xC0, + 0x40, 0x20, 0x1D, 0xDF, 0xF7, 0xF0, 0x7F, 0x7F, 0xFD, 0xD0, 0x08, 0x04, + 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x07, 0x83, 0xE1, 0xE0, + 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x3D, + 0xDF, 0xF7, 0xF0, 0xFF, 0xFF, 0xFF, 0xC0, 0x7F, 0x7F, 0xDD, 0xE0, 0x10, + 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x3C, 0x3E, + 0x0F, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0x80, + 0x5D, 0xFF, 0xF7, 0xF0, 0x80, 0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xA0, 0xA0, + 0xB0, 0x90, 0x90, 0x80, 0x80, 0x01, 0x05, 0x05, 0x05, 0x05, 0x07, 0x07, + 0x03, 0x03, 0x03, 0x01, 0x01 }; + +const GFXglyph LCD14cond18pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 13, 0, 0 }, // 0x20 ' ' + { 1, 9, 28, 13, 2, -27 }, // 0x21 '!' + { 33, 5, 13, 12, 1, -26 }, // 0x22 '"' + { 42, 9, 28, 12, 1, -27 }, // 0x23 '#' + { 74, 9, 29, 11, 1, -28 }, // 0x24 '$' + { 107, 10, 29, 12, 1, -28 }, // 0x25 '%' + { 144, 9, 29, 12, 2, -28 }, // 0x26 '&' + { 177, 1, 13, 13, 6, -26 }, // 0x27 ''' + { 179, 9, 29, 12, 1, -28 }, // 0x28 '(' + { 212, 9, 29, 12, 2, -28 }, // 0x29 ')' + { 245, 9, 25, 13, 2, -26 }, // 0x2A '*' + { 274, 9, 27, 13, 2, -27 }, // 0x2B '+' + { 305, 3, 10, 13, 3, -12 }, // 0x2C ',' + { 309, 9, 3, 13, 2, -15 }, // 0x2D '-' + { 313, 1, 13, 12, 1, -13 }, // 0x2E '.' + { 315, 7, 23, 13, 3, -25 }, // 0x2F '/' + { 336, 8, 29, 13, 1, -28 }, // 0x30 '0' + { 365, 4, 25, 13, 7, -26 }, // 0x31 '1' + { 378, 10, 29, 13, 1, -28 }, // 0x32 '2' + { 415, 9, 29, 13, 2, -28 }, // 0x33 '3' + { 448, 10, 27, 13, 1, -27 }, // 0x34 '4' + { 482, 9, 29, 13, 2, -28 }, // 0x35 '5' + { 515, 10, 29, 13, 1, -28 }, // 0x36 '6' + { 552, 9, 28, 13, 2, -28 }, // 0x37 '7' + { 584, 10, 29, 13, 1, -28 }, // 0x38 '8' + { 621, 10, 29, 13, 1, -28 }, // 0x39 '9' + { 658, 2, 24, 4, 1, -26 }, // 0x3A ':' + { 664, 4, 24, 13, 3, -26 }, // 0x3B ';' + { 676, 3, 23, 13, 7, -25 }, // 0x3C '<' + { 685, 9, 16, 13, 2, -15 }, // 0x3D '=' + { 703, 3, 23, 13, 3, -25 }, // 0x3E '>' + { 712, 9, 28, 11, 1, -28 }, // 0x3F '?' + { 744, 10, 29, 12, 1, -28 }, // 0x40 '@' + { 781, 10, 28, 12, 1, -28 }, // 0x41 'A' + { 816, 9, 29, 12, 2, -28 }, // 0x42 'B' + { 849, 9, 29, 12, 1, -28 }, // 0x43 'C' + { 882, 9, 29, 12, 2, -28 }, // 0x44 'D' + { 915, 9, 29, 12, 1, -28 }, // 0x45 'E' + { 948, 9, 28, 12, 1, -28 }, // 0x46 'F' + { 980, 10, 29, 12, 1, -28 }, // 0x47 'G' + { 1017, 10, 27, 12, 1, -27 }, // 0x48 'H' + { 1051, 9, 29, 13, 2, -28 }, // 0x49 'I' + { 1084, 10, 28, 12, 1, -27 }, // 0x4A 'J' + { 1119, 9, 25, 12, 1, -26 }, // 0x4B 'K' + { 1148, 9, 28, 12, 1, -27 }, // 0x4C 'L' + { 1180, 8, 25, 11, 1, -26 }, // 0x4D 'M' + { 1205, 8, 25, 11, 1, -26 }, // 0x4E 'N' + { 1230, 10, 29, 12, 1, -28 }, // 0x4F 'O' + { 1267, 10, 28, 12, 1, -28 }, // 0x50 'P' + { 1302, 10, 29, 12, 1, -28 }, // 0x51 'Q' + { 1339, 10, 27, 12, 1, -28 }, // 0x52 'R' + { 1373, 10, 29, 12, 1, -28 }, // 0x53 'S' + { 1410, 9, 28, 13, 2, -28 }, // 0x54 'T' + { 1442, 10, 28, 12, 1, -27 }, // 0x55 'U' + { 1477, 8, 25, 12, 3, -26 }, // 0x56 'V' + { 1502, 8, 25, 11, 1, -26 }, // 0x57 'W' + { 1527, 7, 23, 13, 3, -25 }, // 0x58 'X' + { 1548, 7, 24, 13, 3, -25 }, // 0x59 'Y' + { 1569, 9, 29, 13, 2, -28 }, // 0x5A 'Z' + { 1602, 9, 29, 12, 1, -28 }, // 0x5B '[' + { 1635, 7, 23, 13, 3, -25 }, // 0x5C '\' + { 1656, 9, 29, 12, 2, -28 }, // 0x5D ']' + { 1689, 7, 10, 13, 3, -12 }, // 0x5E '^' + { 1698, 9, 3, 13, 2, -2 }, // 0x5F '_' + { 1702, 3, 10, 13, 3, -25 }, // 0x60 '`' + { 1706, 10, 29, 12, 1, -28 }, // 0x61 'a' + { 1743, 10, 28, 12, 1, -27 }, // 0x62 'b' + { 1778, 9, 16, 12, 1, -15 }, // 0x63 'c' + { 1796, 10, 28, 12, 1, -27 }, // 0x64 'd' + { 1831, 10, 29, 12, 1, -28 }, // 0x65 'e' + { 1868, 9, 28, 12, 1, -28 }, // 0x66 'f' + { 1900, 10, 29, 12, 1, -28 }, // 0x67 'g' + { 1937, 10, 27, 12, 1, -27 }, // 0x68 'h' + { 1971, 9, 28, 13, 2, -28 }, // 0x69 'i' + { 2003, 9, 29, 12, 2, -28 }, // 0x6A 'j' + { 2036, 9, 25, 12, 1, -26 }, // 0x6B 'k' + { 2065, 1, 26, 13, 6, -26 }, // 0x6C 'l' + { 2069, 9, 15, 11, 1, -15 }, // 0x6D 'm' + { 2086, 10, 15, 12, 1, -15 }, // 0x6E 'n' + { 2105, 10, 16, 12, 1, -15 }, // 0x6F 'o' + { 2125, 10, 28, 12, 1, -28 }, // 0x70 'p' + { 2160, 10, 28, 12, 1, -28 }, // 0x71 'q' + { 2195, 9, 15, 12, 1, -15 }, // 0x72 'r' + { 2212, 10, 29, 12, 1, -28 }, // 0x73 's' + { 2249, 9, 27, 13, 2, -27 }, // 0x74 't' + { 2280, 10, 15, 12, 1, -14 }, // 0x75 'u' + { 2299, 4, 12, 12, 7, -13 }, // 0x76 'v' + { 2305, 8, 12, 11, 1, -13 }, // 0x77 'w' + { 2317, 7, 23, 13, 3, -25 }, // 0x78 'x' + { 2338, 10, 28, 12, 1, -27 }, // 0x79 'y' + { 2373, 9, 29, 13, 2, -28 }, // 0x7A 'z' + { 2406, 9, 29, 12, 1, -28 }, // 0x7B '{' + { 2439, 1, 26, 13, 6, -26 }, // 0x7C '|' + { 2443, 9, 29, 12, 2, -28 }, // 0x7D '}' + { 2476, 8, 25, 11, 1, -26 } }; // 0x7E '~' + +const GFXfont LCD14cond18pt7b PROGMEM = { + (uint8_t *)LCD14cond18pt7bBitmaps, + (GFXglyph *)LCD14cond18pt7bGlyphs, + 0x20, 0x7E, 38 }; + +// Approx. 5734 bytes +#endif // ifndef FONTS_LCD14COND18PT7B_H diff --git a/src/src/Static/Fonts/LCD14cond24pt7b.h b/src/src/Static/Fonts/LCD14cond24pt7b.h new file mode 100644 index 0000000000..853eb4d566 --- /dev/null +++ b/src/src/Static/Fonts/LCD14cond24pt7b.h @@ -0,0 +1,474 @@ +#ifndef FONTS_LCD14COND24PT7B_H +#define FONTS_LCD14COND24PT7B_H + +const uint8_t LCD14Condensed24pt7bBitmaps[] PROGMEM = { + 0x00, 0x04, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x79, 0xE7, 0xFE, 0x7F, 0xE7, 0xFE, 0x00, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x82, + 0x82, 0x06, 0x18, 0x30, 0xC1, 0x86, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x18, + 0x60, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x86, 0x0C, 0x30, 0x61, 0x83, 0x0C, + 0x1F, 0xFE, 0x7F, 0xF3, 0xFF, 0xBF, 0xFD, 0x86, 0x0C, 0x30, 0x61, 0x83, + 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x86, 0x0C, 0x30, 0x61, + 0x83, 0x0C, 0x18, 0x60, 0xFF, 0xF3, 0xFF, 0x9F, 0xFC, 0x7F, 0xE0, 0x3F, + 0xF1, 0xFF, 0xE7, 0xFF, 0xBF, 0xFC, 0xC3, 0x03, 0x0C, 0x0C, 0x30, 0x30, + 0xC0, 0xC3, 0x03, 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, 0x03, 0x0C, 0x0C, + 0x30, 0x30, 0xC0, 0xC3, 0x03, 0xFF, 0xC7, 0xFF, 0x9F, 0xFE, 0x3F, 0xFC, + 0x0C, 0x30, 0x30, 0xC0, 0xC3, 0x03, 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, + 0x03, 0x0C, 0x0C, 0x30, 0x30, 0xC0, 0xC3, 0x03, 0x0C, 0x0C, 0x33, 0xFF, + 0xDF, 0xFE, 0x7F, 0xF8, 0xFF, 0xC0, 0x3F, 0xE3, 0xFF, 0x9F, 0xFD, 0xFF, + 0xCC, 0x32, 0x61, 0x93, 0x0C, 0x98, 0x6C, 0xC3, 0x66, 0x1B, 0x30, 0xD1, + 0x87, 0x8C, 0x3C, 0x61, 0xE3, 0x0E, 0x18, 0x70, 0xC3, 0x87, 0xFF, 0x1F, + 0xFC, 0xFF, 0xE3, 0xFF, 0x83, 0x8C, 0x3C, 0x61, 0xE3, 0x0F, 0x18, 0x78, + 0xC6, 0xC6, 0x36, 0x31, 0xB1, 0x99, 0x8C, 0xCC, 0x66, 0x63, 0x33, 0x19, + 0x18, 0xCF, 0xFE, 0xFF, 0xE7, 0xFF, 0x1F, 0xF0, 0x7F, 0xCF, 0xFE, 0xFB, + 0xE7, 0xBC, 0x40, 0x44, 0x04, 0x60, 0xC6, 0x0C, 0x60, 0xC6, 0x0C, 0x31, + 0x83, 0x18, 0x31, 0x81, 0xB0, 0x1B, 0x01, 0xB0, 0x0B, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x30, 0xA3, 0x1B, 0x31, 0xB3, 0x1B, 0x33, 0x1B, 0x31, + 0xB3, 0x1B, 0x60, 0xF6, 0x0F, 0x60, 0xF6, 0x0F, 0x40, 0x74, 0x07, 0x7B, + 0xFF, 0xBE, 0xFF, 0xE7, 0xFC, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x3F, 0xF7, + 0xFF, 0x7D, 0xFF, 0xDF, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, + 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, + 0x00, 0x80, 0x08, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, + 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, + 0x00, 0xFD, 0xF7, 0xDF, 0x7F, 0xF3, 0xFF, 0xFF, 0xCF, 0xFE, 0xFB, 0xEF, + 0xBF, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, + 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x20, + 0x02, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, + 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0xFB, 0xFF, + 0xBE, 0xFF, 0xEF, 0xFC, 0x00, 0x03, 0x0C, 0xCF, 0x33, 0xCC, 0xF3, 0x36, + 0xD9, 0xB6, 0x6D, 0x8F, 0xC3, 0xF0, 0xFC, 0x3F, 0x07, 0x81, 0xE3, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFC, 0x78, 0x1E, 0x0F, 0xC3, 0xF0, 0xFC, 0x3F, 0x1B, + 0x66, 0xD9, 0xB6, 0xCC, 0xF3, 0x3C, 0xCF, 0x33, 0x0C, 0x00, 0x00, 0x04, + 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, + 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x07, 0xFE, 0x7F, + 0xE7, 0xFE, 0x7F, 0xE0, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, + 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, + 0x00, 0x40, 0x13, 0x33, 0x36, 0x66, 0xCC, 0xCC, 0x80, 0x7B, 0xDF, 0x7F, + 0xEF, 0xBD, 0xE0, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0xC0, 0x30, 0x0C, + 0x07, 0x01, 0x80, 0x60, 0x38, 0x0C, 0x03, 0x01, 0xC0, 0x60, 0x18, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0xC0, 0x30, 0x1C, 0x06, + 0x01, 0x80, 0x60, 0x30, 0x0C, 0x03, 0x00, 0x80, 0x20, 0x00, 0x3F, 0xE3, + 0xFF, 0x9F, 0x7D, 0xFB, 0xFC, 0x03, 0xE0, 0x1F, 0x01, 0xF8, 0x0F, 0xC0, + 0x7E, 0x03, 0xF0, 0x37, 0x81, 0xBC, 0x0D, 0xE0, 0xCF, 0x06, 0x78, 0x33, + 0xC1, 0x9E, 0x00, 0xE0, 0x05, 0x00, 0x2C, 0x01, 0xE2, 0x0F, 0x30, 0x79, + 0x83, 0xCC, 0x1E, 0xC0, 0xF6, 0x07, 0xB0, 0x3F, 0x81, 0xF8, 0x0F, 0xC0, + 0x7E, 0x03, 0xE0, 0x1F, 0x00, 0xFF, 0x7E, 0xFB, 0xE7, 0xFF, 0x1F, 0xF0, + 0x00, 0x31, 0xC7, 0x3C, 0xF3, 0xCF, 0x6D, 0xB6, 0xF3, 0xCF, 0x3C, 0xC3, + 0x00, 0x20, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, + 0x0C, 0x00, 0x3F, 0xE3, 0xFF, 0x9F, 0x7C, 0x7B, 0xF0, 0x01, 0x80, 0x0C, + 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, + 0x0C, 0x00, 0x60, 0x03, 0x00, 0x19, 0xEF, 0xDF, 0x7C, 0xFF, 0xEF, 0xDE, + 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, + 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x3F, 0x78, 0xFB, + 0xE7, 0xFF, 0x1F, 0xF0, 0xFF, 0xCF, 0xFE, 0xFB, 0xEF, 0xBF, 0x00, 0x30, + 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, + 0x03, 0x00, 0x30, 0x03, 0x00, 0x3F, 0xBF, 0xFB, 0xEF, 0xFE, 0xFB, 0xF0, + 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, + 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0xFB, 0xFF, 0xBE, 0xFF, 0xEF, + 0xFC, 0x80, 0x16, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, + 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, + 0x00, 0x7F, 0xBF, 0x7D, 0xF3, 0xFF, 0x8F, 0x7E, 0x00, 0x30, 0x01, 0x80, + 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, + 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0x80, 0xFF, 0xCF, 0xFE, + 0xFF, 0xEF, 0xBC, 0xC0, 0x0C, 0x00, 0xC0, 0x0E, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x03, 0x00, 0x30, 0x03, 0x00, 0x10, 0x01, 0x00, 0x10, 0x00, 0x3C, + 0x07, 0xE0, 0x7E, 0x03, 0xF0, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, + 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, + 0xFB, 0xFF, 0xFE, 0xFF, 0xEF, 0xFC, 0x3F, 0xE3, 0xFF, 0x9F, 0x7D, 0xFB, + 0xCC, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, + 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x07, 0xEF, 0x1F, + 0x7C, 0xFF, 0xEF, 0xDF, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, + 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, + 0x00, 0xFF, 0x7E, 0xFB, 0xE7, 0xFF, 0x1F, 0xF0, 0xFF, 0xCF, 0xFE, 0xFB, + 0xEF, 0xBF, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, + 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, + 0x20, 0x00, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, + 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, + 0x30, 0x02, 0x3F, 0xE3, 0xFF, 0x9F, 0x7D, 0xFB, 0xFC, 0x01, 0xE0, 0x0F, + 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, + 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xEF, 0xDF, 0x7C, 0xFF, 0xEF, 0xDF, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xFF, 0x7E, 0xFB, + 0xE7, 0xFF, 0x1F, 0xF0, 0x3F, 0xE3, 0xFF, 0x9F, 0x7D, 0xFB, 0xFC, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xEF, 0xDF, 0x7C, 0xFB, + 0xE3, 0xDF, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, + 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xCF, + 0x7E, 0xFB, 0xE7, 0xFF, 0x1F, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, + 0x30, 0xC3, 0x08, 0x00, 0x04, 0x10, 0xC3, 0x0C, 0x31, 0x86, 0x18, 0xC3, + 0x0C, 0x30, 0x11, 0x33, 0x36, 0x66, 0xEC, 0xCC, 0x80, 0x00, 0x08, 0xCC, + 0xCC, 0x66, 0x63, 0x33, 0x11, 0x7B, 0xDF, 0x7F, 0xEF, 0xBD, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0x7B, 0xEF, 0xFF, 0xF7, 0xFC, 0x88, 0xCC, + 0xC6, 0x66, 0x33, 0x33, 0x10, 0x00, 0x01, 0x33, 0x37, 0x66, 0x6C, 0xCC, + 0x88, 0x3F, 0xF1, 0xFF, 0xE7, 0xFF, 0xBF, 0x3F, 0xC0, 0x0F, 0x00, 0x3C, + 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, + 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x0F, 0x03, 0xF8, 0x1F, 0x80, 0x7E, + 0x03, 0xF0, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, + 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, + 0x00, 0x30, 0x00, 0x80, 0x3F, 0xE3, 0xFF, 0x9F, 0x7D, 0xFB, 0xFC, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xE0, 0x04, 0x00, + 0x20, 0x01, 0x82, 0x8C, 0x36, 0x61, 0xB3, 0x0D, 0x98, 0xC6, 0xC6, 0x36, + 0x31, 0xB3, 0x07, 0x98, 0x3C, 0xC1, 0xE6, 0x0F, 0x20, 0x39, 0x01, 0xCF, + 0x7E, 0xFB, 0xE7, 0xFF, 0x1F, 0xF0, 0x3F, 0xE3, 0xFF, 0x9F, 0x7D, 0xFB, + 0xFC, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, + 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xEF, 0xDF, + 0x7C, 0xFB, 0xEF, 0xDF, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, + 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, + 0x00, 0xF0, 0x07, 0x00, 0x20, 0x7F, 0xE3, 0xFF, 0x9F, 0xFC, 0xFF, 0xF0, + 0x61, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x86, 0x0C, + 0x30, 0x61, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x3F, 0xC0, 0xFC, + 0x07, 0xE0, 0x7F, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x30, 0xC1, + 0x86, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x30, + 0xDF, 0xFE, 0xFF, 0xE7, 0xFF, 0x3F, 0xF0, 0x3F, 0xF7, 0xFF, 0x7D, 0xFF, + 0xDF, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, + 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0x80, 0x08, + 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, + 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFD, 0xF7, + 0xDF, 0x7F, 0xF3, 0xFF, 0x7F, 0xE3, 0xFF, 0x9F, 0xFC, 0xFF, 0xF0, 0x61, + 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x86, 0x0C, 0x30, + 0x61, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x04, 0x08, + 0x20, 0x61, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x86, + 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x30, 0xDF, + 0xFE, 0xFF, 0xE7, 0xFF, 0x3F, 0xF0, 0x3F, 0xF7, 0xFF, 0x7D, 0xFF, 0xDF, + 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0F, 0xDF, 0x7D, 0xF7, 0xFF, + 0xFD, 0xFC, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFD, 0xF7, 0xDF, + 0x7F, 0xF3, 0xFF, 0x3F, 0xF7, 0xFF, 0x7D, 0xFF, 0xDF, 0xC0, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x0F, 0xDF, 0x7D, 0xF7, 0xFF, 0xFD, 0xFC, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x08, 0x00, 0x3F, 0xE3, 0xFF, + 0x9F, 0x7D, 0xFB, 0xCC, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, + 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, + 0x06, 0x0F, 0x20, 0x7D, 0x03, 0xEC, 0x1F, 0xE0, 0x0F, 0x00, 0x78, 0x03, + 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, + 0x03, 0xC0, 0x1E, 0x00, 0xFF, 0x7E, 0xFB, 0xE7, 0xFF, 0x1F, 0xF0, 0x80, + 0x16, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, + 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x7F, + 0xBF, 0x7D, 0xF3, 0xFF, 0xBF, 0x7F, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, + 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, + 0x00, 0x78, 0x03, 0xC0, 0x1C, 0x00, 0x80, 0x7F, 0xE7, 0xFE, 0x7F, 0xE7, + 0xFE, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x04, 0x00, + 0x40, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, + 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x7F, 0xE7, + 0xFE, 0x7F, 0xE7, 0xFE, 0x00, 0x10, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, + 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, + 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x14, 0x00, 0xB0, 0x07, 0x80, + 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, + 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xFD, 0xFB, 0xEF, 0x9F, + 0xFC, 0x7F, 0xC0, 0x00, 0x0C, 0x00, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x07, + 0xC0, 0x6C, 0x06, 0xC0, 0xEC, 0x0C, 0xC0, 0xCC, 0x1C, 0xC1, 0x8C, 0x18, + 0xC1, 0x8F, 0xC0, 0x7C, 0x07, 0xC0, 0xFC, 0x0C, 0x18, 0xC1, 0x8C, 0x18, + 0xC1, 0xCC, 0x0C, 0xC0, 0xCC, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x7C, 0x03, + 0xC0, 0x3C, 0x03, 0xC0, 0x00, 0x00, 0x80, 0x0C, 0x00, 0xC0, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0x00, 0x08, 0x00, 0xC0, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, + 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFD, 0xF7, 0xDF, 0x7F, 0xF3, 0xFF, + 0x00, 0x06, 0x00, 0xF8, 0x0F, 0xC0, 0x7F, 0x07, 0xF8, 0x3F, 0xC1, 0xFB, + 0x0F, 0xD8, 0xDE, 0xC6, 0xF6, 0x37, 0x9B, 0x3C, 0xD9, 0xE6, 0xCF, 0x14, + 0x78, 0x03, 0x00, 0x04, 0x00, 0xB0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, + 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, + 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x18, 0x00, 0x00, 0x00, 0x06, 0x00, 0xF8, + 0x07, 0xC0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xD8, 0x1E, 0xC0, + 0xF6, 0x07, 0x98, 0x3C, 0xC1, 0xE6, 0x0F, 0x10, 0x78, 0x03, 0x80, 0x14, + 0x00, 0xB0, 0x07, 0x83, 0x3C, 0x19, 0xE0, 0xCF, 0x06, 0x78, 0x1B, 0xC0, + 0xDE, 0x06, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x00, 0xF8, 0x07, + 0xC0, 0x18, 0x00, 0x00, 0x3F, 0xE3, 0xFF, 0x9F, 0x7D, 0xFB, 0xFC, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xE0, 0x05, 0x00, + 0x2C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, + 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xFF, + 0x7E, 0xFB, 0xE7, 0xFF, 0x1F, 0xF0, 0x3F, 0xE3, 0xFF, 0x9F, 0x7D, 0xFB, + 0xFC, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, + 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xEF, 0xDF, + 0x7C, 0xFB, 0xEF, 0xDE, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, + 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, + 0x00, 0x30, 0x01, 0x00, 0x00, 0x3F, 0xE3, 0xFF, 0x9F, 0x7D, 0xFB, 0xFC, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, + 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xE0, 0x05, + 0x00, 0x2C, 0x01, 0xE0, 0x8F, 0x06, 0x78, 0x33, 0xC1, 0x9E, 0x06, 0xF0, + 0x37, 0x81, 0xBC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x3E, 0x01, + 0xFF, 0x7E, 0xFB, 0xE7, 0xFF, 0x1F, 0xF0, 0x3F, 0xE3, 0xFF, 0x9F, 0x7D, + 0xFB, 0xFC, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, + 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xEF, + 0xDF, 0x7C, 0xFB, 0xEF, 0xDE, 0x60, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x86, + 0x06, 0x30, 0x31, 0x81, 0x8C, 0x06, 0x60, 0x33, 0x01, 0x98, 0x04, 0xC0, + 0x26, 0x01, 0x30, 0x00, 0x00, 0x00, 0x3F, 0xE3, 0xFF, 0x9F, 0x7D, 0xFB, + 0xCC, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, + 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x07, 0xEF, 0x1F, + 0x7C, 0xFF, 0xE3, 0xDF, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, + 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, + 0x00, 0xCF, 0x7E, 0xFB, 0xE7, 0xFF, 0x1F, 0xF0, 0x7F, 0xE7, 0xFE, 0x7F, + 0xE7, 0xFE, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, + 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x04, + 0x00, 0x40, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, + 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, + 0x00, 0x40, 0x80, 0x16, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, + 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, + 0x0F, 0x00, 0x78, 0x03, 0x00, 0x14, 0x00, 0xB0, 0x07, 0x80, 0x3C, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xFD, 0xFB, 0xEF, 0x9F, 0xFC, 0x7F, + 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3E, 0x03, 0x60, 0x36, + 0x03, 0x60, 0x33, 0x03, 0x30, 0x33, 0x03, 0x10, 0x31, 0x03, 0x10, 0x30, + 0x03, 0x00, 0x20, 0x02, 0x00, 0x30, 0x23, 0x03, 0x30, 0x33, 0x03, 0x30, + 0x3B, 0x01, 0xB0, 0x1B, 0x01, 0xB0, 0x0F, 0x00, 0xF0, 0x0F, 0x00, 0x70, + 0x07, 0x00, 0x30, 0x00, 0x00, 0x06, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0x80, 0x10, 0x00, 0xB0, 0x07, 0x8A, + 0x3C, 0xD9, 0xE6, 0xCF, 0x36, 0x7B, 0x1B, 0xD8, 0xDE, 0xC6, 0xF6, 0x1F, + 0xE0, 0xFF, 0x07, 0xF8, 0x3F, 0x80, 0xFC, 0x07, 0xC0, 0x18, 0x00, 0x00, + 0x80, 0xC0, 0x70, 0x78, 0x3C, 0x1E, 0x0D, 0x8C, 0xC6, 0x63, 0x1B, 0x0D, + 0x86, 0xC1, 0x60, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0D, 0x86, 0xC3, 0x63, + 0x19, 0x8C, 0xC6, 0xC1, 0xE0, 0xF0, 0x78, 0x38, 0x0C, 0x04, 0x80, 0xC0, + 0x70, 0x38, 0x3C, 0x1B, 0x0D, 0x84, 0xC6, 0x33, 0x19, 0x8C, 0x82, 0x41, + 0x20, 0x00, 0x00, 0x10, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, + 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xBD, 0xF0, 0x06, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xC0, 0x18, + 0x07, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xC0, 0x18, 0x03, 0x0F, 0x7F, 0xFF, + 0xFF, 0xF7, 0xBE, 0x10, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0xC0, 0x18, + 0x03, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x08, 0x01, 0xEF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xC0, 0x3F, 0xF3, 0xFF, 0x9F, 0xFD, 0xFF, 0xEC, 0x30, 0x61, + 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x86, 0x0C, 0x30, + 0x61, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x20, 0x81, 0x04, 0x0C, + 0x30, 0x61, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x30, 0xC1, 0x86, + 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x3F, 0xFC, + 0xFF, 0xE7, 0xFF, 0x1F, 0xF8, 0x80, 0x20, 0x0C, 0x03, 0x00, 0xC0, 0x18, + 0x06, 0x01, 0x80, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x80, 0x60, 0x18, 0x07, 0x00, 0xC0, 0x30, 0x0E, 0x01, + 0x80, 0x60, 0x1C, 0x03, 0x00, 0xC0, 0x30, 0x7F, 0xE3, 0xFF, 0x9F, 0xFC, + 0xFF, 0xF0, 0x61, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x30, 0xC1, + 0x86, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x30, + 0xC1, 0x04, 0x08, 0x20, 0x61, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, + 0x30, 0xC1, 0x86, 0x0C, 0x30, 0x61, 0x83, 0x0C, 0x18, 0x60, 0xC3, 0x06, + 0x18, 0x30, 0xDF, 0xFE, 0xFF, 0xE7, 0xFF, 0x3F, 0xF0, 0x14, 0x1B, 0x0D, + 0x86, 0xC6, 0x33, 0x19, 0x8C, 0xC2, 0xC1, 0xE0, 0xF0, 0x70, 0x18, 0x08, + 0x7B, 0xDF, 0x7F, 0xFF, 0xBF, 0xE0, 0x88, 0xCC, 0xC6, 0x66, 0x33, 0x31, + 0x10, 0x3F, 0xE3, 0xFF, 0x9F, 0x7C, 0x7B, 0xF0, 0x01, 0x80, 0x0C, 0x00, + 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, + 0x00, 0x60, 0x03, 0x00, 0x19, 0xEF, 0xDF, 0x7C, 0xFF, 0xEF, 0xDF, 0xE0, + 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xFF, 0x7E, 0xFB, 0xE7, + 0xFF, 0x1F, 0xF0, 0x80, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, + 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, + 0x60, 0x03, 0x00, 0x1F, 0xBC, 0x7D, 0xF3, 0xFF, 0xBF, 0x7F, 0x80, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, + 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xFD, 0xFB, 0xEF, 0x9F, 0xFC, + 0x7F, 0xC0, 0x3D, 0xF7, 0xDF, 0x7D, 0xFF, 0xDF, 0xC0, 0x0C, 0x00, 0xC0, + 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, + 0x0C, 0x00, 0xC0, 0x0F, 0xDF, 0x7D, 0xF7, 0xFF, 0x3F, 0xF0, 0x00, 0x10, + 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, + 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x67, 0xBF, + 0x7D, 0xF3, 0xFF, 0xBF, 0x7F, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, + 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, + 0x78, 0x03, 0xFD, 0xFB, 0xEF, 0x9F, 0xFC, 0x7F, 0xC0, 0x3F, 0xE3, 0xFF, + 0x9F, 0x7D, 0xFB, 0xFC, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, + 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, + 0x1F, 0xEF, 0xDF, 0x7C, 0xFB, 0xEF, 0xDE, 0x60, 0x03, 0x00, 0x18, 0x00, + 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, + 0x00, 0xC0, 0x06, 0x00, 0x3F, 0x78, 0xFB, 0xE7, 0xFF, 0x1F, 0xF0, 0x3F, + 0xF7, 0xFF, 0x7D, 0xFF, 0xDF, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, + 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, + 0x0F, 0xC0, 0x7C, 0x07, 0xC0, 0xFC, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, + 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, + 0x0C, 0x00, 0xC0, 0x08, 0x00, 0x3F, 0xE3, 0xFF, 0x9F, 0x7D, 0xFB, 0xFC, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, + 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1F, 0xEF, 0xDF, 0x7C, + 0xFB, 0xE3, 0xDF, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, + 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, + 0xCF, 0x7E, 0xFB, 0xE7, 0xFF, 0x1F, 0xF0, 0x80, 0x06, 0x00, 0x30, 0x01, + 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, + 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x1F, 0xBC, 0x7D, 0xF3, 0xEF, + 0xBF, 0x7F, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, + 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, + 0x1C, 0x00, 0x80, 0x7F, 0xE7, 0xFE, 0x7F, 0xE7, 0x9E, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x40, 0xFF, 0xCF, 0xFE, + 0xFB, 0xEF, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, + 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, + 0xFB, 0xFF, 0xBE, 0xFF, 0xEF, 0xFC, 0x00, 0x0C, 0x00, 0xC0, 0x3C, 0x03, + 0xC0, 0x3C, 0x07, 0xC0, 0x6C, 0x06, 0xC0, 0xEC, 0x0C, 0xC0, 0xCC, 0x1C, + 0xC1, 0x8C, 0x18, 0xC1, 0x8F, 0xC0, 0x7C, 0x07, 0xC0, 0xFC, 0x0C, 0x18, + 0xC1, 0x8C, 0x18, 0xC1, 0xCC, 0x0C, 0xC0, 0xCC, 0x0E, 0xC0, 0x6C, 0x06, + 0xC0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x00, 0x00, 0x3F, 0xFF, 0xFF, + 0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0xE0, 0x3C, 0xF1, 0xFF, 0xE7, 0xFF, 0xBF, + 0xFF, 0xC3, 0x0F, 0x0C, 0x3C, 0x30, 0xF0, 0xC3, 0xC3, 0x0F, 0x0C, 0x3C, + 0x30, 0xF0, 0xC3, 0xC3, 0x0F, 0x0C, 0x3C, 0x30, 0xF0, 0xC3, 0xC3, 0x0F, + 0x0C, 0x38, 0x20, 0x80, 0x3D, 0xE3, 0xEF, 0x9F, 0x7D, 0xFB, 0xFC, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xE0, 0x04, 0x3D, + 0xE3, 0xEF, 0x9F, 0xFD, 0xFB, 0xFC, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, + 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, + 0x03, 0xC0, 0x1F, 0xEF, 0xDF, 0x7C, 0xFF, 0xE3, 0xFE, 0x00, 0x3F, 0xE3, + 0xFF, 0x9F, 0x7D, 0xFB, 0xFC, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, + 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, + 0xC0, 0x1F, 0xEF, 0xDF, 0x7C, 0xFB, 0xEF, 0xDE, 0x60, 0x03, 0x00, 0x18, + 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, + 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x00, 0x00, 0x3F, 0xE3, 0xFF, + 0x9F, 0x7D, 0xFB, 0xFC, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, + 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, + 0x1F, 0xEF, 0xDF, 0x7C, 0xFB, 0xE3, 0xDF, 0x80, 0x0C, 0x00, 0x60, 0x03, + 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, + 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x20, 0x3D, 0xF7, 0xDF, 0x7D, + 0xFF, 0xDF, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, + 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0x80, + 0x00, 0x3F, 0xE3, 0xFF, 0x9F, 0x7D, 0xFB, 0xCC, 0x00, 0x60, 0x03, 0x00, + 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, + 0x00, 0x18, 0x00, 0xC0, 0x07, 0xEF, 0x1F, 0x7C, 0xFF, 0xE3, 0xDF, 0x80, + 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, + 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xCF, 0x7E, 0xFB, 0xE7, + 0xFF, 0x1F, 0xF0, 0x04, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x07, 0xFE, 0x7F, 0xE7, 0xFE, 0x7F, 0xE0, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x00, 0x40, 0x80, 0x16, 0x00, 0xF0, 0x07, 0x80, + 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, + 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x7F, 0xBF, 0x7D, 0xF3, 0xFF, 0x8F, + 0xF8, 0x00, 0x3C, 0xF3, 0xCF, 0x36, 0xDB, 0x6C, 0xF3, 0xCF, 0x3C, 0x71, + 0xC3, 0x00, 0x00, 0x06, 0x00, 0xF1, 0x47, 0x9B, 0x3C, 0xD9, 0xE6, 0xCF, + 0x63, 0x7B, 0x1B, 0xD8, 0xDE, 0xC3, 0xFC, 0x1F, 0xE0, 0xFF, 0x07, 0xF0, + 0x1F, 0x80, 0xF8, 0x03, 0x00, 0x00, 0x80, 0xC0, 0x70, 0x78, 0x3C, 0x1E, + 0x0D, 0x8C, 0xC6, 0x63, 0x1B, 0x0D, 0x86, 0xC1, 0x60, 0x00, 0x00, 0x00, + 0x00, 0x0A, 0x0D, 0x86, 0xC3, 0x63, 0x19, 0x8C, 0xC6, 0xC1, 0xE0, 0xF0, + 0x78, 0x38, 0x0C, 0x04, 0x80, 0x16, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, + 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, + 0x01, 0xE0, 0x0F, 0x00, 0x7F, 0xBF, 0x7D, 0xF3, 0xFF, 0x8F, 0x7E, 0x00, + 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, + 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x3D, 0xFB, 0xEF, 0x9F, + 0xFC, 0x7F, 0xC0, 0x7F, 0xFF, 0xFF, 0xFF, 0xBD, 0xF0, 0x06, 0x00, 0xC0, + 0x18, 0x07, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xC0, + 0x18, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x06, 0x00, 0xC0, + 0x18, 0x07, 0x00, 0xC0, 0x18, 0x03, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x40, + 0x08, 0x01, 0xEF, 0xFF, 0xFF, 0xFE, 0xFF, 0xC0, 0x3F, 0xF7, 0xFF, 0x7D, + 0xFF, 0xDF, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, + 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0F, 0xC0, 0x7C, + 0x07, 0xC0, 0xFC, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, + 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xFD, + 0xF7, 0xDF, 0x7F, 0xF3, 0xFF, 0x3F, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, + 0xFF, 0xE0, 0xFF, 0xCF, 0xFE, 0xFB, 0xEF, 0xBF, 0x00, 0x30, 0x03, 0x00, + 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, + 0x30, 0x03, 0x00, 0x30, 0x3F, 0x03, 0xE0, 0x3E, 0x03, 0xF0, 0x03, 0x00, + 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, 0x30, 0x03, 0x00, + 0x30, 0x03, 0x00, 0x30, 0x03, 0xFB, 0xFF, 0xBE, 0xFF, 0xEF, 0xFC, 0x00, + 0x06, 0x00, 0x38, 0x01, 0xC0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x00, + 0xD8, 0x06, 0xC0, 0x36, 0x01, 0x98, 0x0C, 0xC0, 0x66, 0x03, 0x10, 0x18, + 0x00, 0x80, 0x00, 0x00, 0x80, 0x06, 0x02, 0x30, 0x19, 0x80, 0xCC, 0x06, + 0x60, 0x1B, 0x00, 0xD8, 0x06, 0xC0, 0x1E, 0x00, 0xF0, 0x07, 0x80, 0x3C, + 0x00, 0xE0, 0x07, 0x00, 0x18, 0x00, 0x00 }; + +const GFXglyph LCD14Condensed24pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 17, 0, 0 }, // 0x20 ' ' + { 1, 12, 36, 17, 3, -35 }, // 0x21 '!' + { 55, 8, 17, 17, 2, -35 }, // 0x22 '"' + { 72, 13, 36, 17, 2, -35 }, // 0x23 '#' + { 131, 14, 38, 18, 2, -37 }, // 0x24 '$' + { 198, 13, 38, 17, 2, -37 }, // 0x25 '%' + { 260, 12, 38, 17, 3, -37 }, // 0x26 '&' + { 317, 2, 17, 17, 8, -35 }, // 0x27 ''' + { 322, 12, 38, 17, 2, -37 }, // 0x28 '(' + { 379, 12, 38, 17, 3, -37 }, // 0x29 ')' + { 436, 10, 34, 16, 3, -35 }, // 0x2A '*' + { 479, 12, 34, 17, 3, -35 }, // 0x2B '+' + { 530, 4, 13, 17, 4, -16 }, // 0x2C ',' + { 537, 11, 4, 17, 3, -20 }, // 0x2D '-' + { 543, 2, 17, 17, 2, -18 }, // 0x2E '.' + { 548, 10, 30, 17, 4, -33 }, // 0x2F '/' + { 586, 13, 38, 17, 2, -37 }, // 0x30 '0' + { 648, 6, 34, 17, 9, -35 }, // 0x31 '1' + { 674, 13, 38, 17, 2, -37 }, // 0x32 '2' + { 736, 12, 38, 17, 3, -37 }, // 0x33 '3' + { 793, 13, 34, 17, 2, -35 }, // 0x34 '4' + { 849, 12, 38, 17, 3, -37 }, // 0x35 '5' + { 906, 13, 38, 17, 2, -37 }, // 0x36 '6' + { 968, 12, 36, 17, 3, -37 }, // 0x37 '7' + { 1022, 13, 38, 17, 2, -37 }, // 0x38 '8' + { 1084, 13, 38, 17, 2, -37 }, // 0x39 '9' + { 1146, 2, 32, 6, 2, -35 }, // 0x3A ':' + { 1154, 6, 32, 16, 3, -35 }, // 0x3B ';' + { 1178, 4, 30, 17, 9, -33 }, // 0x3C '<' + { 1193, 11, 21, 17, 3, -20 }, // 0x3D '=' + { 1222, 4, 30, 17, 4, -33 }, // 0x3E '>' + { 1237, 14, 36, 18, 2, -37 }, // 0x3F '?' + { 1300, 13, 38, 17, 2, -37 }, // 0x40 '@' + { 1362, 13, 36, 17, 2, -37 }, // 0x41 'A' + { 1421, 13, 38, 18, 3, -37 }, // 0x42 'B' + { 1483, 12, 38, 17, 2, -37 }, // 0x43 'C' + { 1540, 13, 38, 18, 3, -37 }, // 0x44 'D' + { 1602, 12, 38, 17, 2, -37 }, // 0x45 'E' + { 1659, 12, 36, 17, 2, -37 }, // 0x46 'F' + { 1713, 13, 38, 17, 2, -37 }, // 0x47 'G' + { 1775, 13, 34, 17, 2, -35 }, // 0x48 'H' + { 1831, 12, 38, 17, 3, -37 }, // 0x49 'I' + { 1888, 13, 36, 17, 2, -35 }, // 0x4A 'J' + { 1947, 12, 34, 17, 2, -35 }, // 0x4B 'K' + { 1998, 12, 36, 17, 2, -35 }, // 0x4C 'L' + { 2052, 13, 34, 17, 2, -35 }, // 0x4D 'M' + { 2108, 13, 34, 17, 2, -35 }, // 0x4E 'N' + { 2164, 13, 38, 17, 2, -37 }, // 0x4F 'O' + { 2226, 13, 36, 17, 2, -37 }, // 0x50 'P' + { 2285, 13, 38, 17, 2, -37 }, // 0x51 'Q' + { 2347, 13, 36, 17, 2, -37 }, // 0x52 'R' + { 2406, 13, 38, 17, 2, -37 }, // 0x53 'S' + { 2468, 12, 36, 17, 3, -37 }, // 0x54 'T' + { 2522, 13, 36, 17, 2, -35 }, // 0x55 'U' + { 2581, 12, 34, 17, 3, -35 }, // 0x56 'V' + { 2632, 13, 34, 17, 2, -35 }, // 0x57 'W' + { 2688, 9, 30, 17, 4, -33 }, // 0x58 'X' + { 2722, 9, 32, 17, 4, -33 }, // 0x59 'Y' + { 2758, 11, 38, 17, 3, -37 }, // 0x5A 'Z' + { 2811, 13, 38, 17, 2, -37 }, // 0x5B '[' + { 2873, 10, 30, 17, 4, -33 }, // 0x5C '\' + { 2911, 13, 38, 18, 3, -37 }, // 0x5D ']' + { 2973, 9, 13, 17, 4, -16 }, // 0x5E '^' + { 2988, 11, 4, 17, 3, -3 }, // 0x5F '_' + { 2994, 4, 13, 17, 4, -33 }, // 0x60 '`' + { 3001, 13, 38, 17, 2, -37 }, // 0x61 'a' + { 3063, 13, 36, 17, 2, -35 }, // 0x62 'b' + { 3122, 12, 21, 17, 2, -20 }, // 0x63 'c' + { 3154, 13, 36, 17, 2, -35 }, // 0x64 'd' + { 3213, 13, 38, 17, 2, -37 }, // 0x65 'e' + { 3275, 12, 36, 17, 2, -37 }, // 0x66 'f' + { 3329, 13, 38, 17, 2, -37 }, // 0x67 'g' + { 3391, 13, 34, 17, 2, -35 }, // 0x68 'h' + { 3447, 12, 36, 17, 3, -37 }, // 0x69 'i' + { 3501, 12, 38, 17, 3, -37 }, // 0x6A 'j' + { 3558, 12, 34, 17, 2, -35 }, // 0x6B 'k' + { 3609, 2, 34, 17, 8, -35 }, // 0x6C 'l' + { 3618, 14, 19, 18, 2, -20 }, // 0x6D 'm' + { 3652, 13, 19, 17, 2, -20 }, // 0x6E 'n' + { 3683, 13, 21, 17, 2, -20 }, // 0x6F 'o' + { 3718, 13, 36, 17, 2, -37 }, // 0x70 'p' + { 3777, 13, 36, 17, 2, -37 }, // 0x71 'q' + { 3836, 12, 19, 17, 2, -20 }, // 0x72 'r' + { 3865, 13, 38, 17, 2, -37 }, // 0x73 's' + { 3927, 12, 34, 17, 3, -35 }, // 0x74 't' + { 3978, 13, 19, 17, 2, -18 }, // 0x75 'u' + { 4009, 6, 17, 17, 9, -18 }, // 0x76 'v' + { 4022, 13, 17, 17, 2, -18 }, // 0x77 'w' + { 4050, 9, 30, 17, 4, -33 }, // 0x78 'x' + { 4084, 13, 36, 17, 2, -35 }, // 0x79 'y' + { 4143, 11, 38, 17, 3, -37 }, // 0x7A 'z' + { 4196, 12, 38, 17, 2, -37 }, // 0x7B '{' + { 4253, 2, 34, 17, 8, -35 }, // 0x7C '|' + { 4262, 12, 38, 17, 3, -37 }, // 0x7D '}' + { 4319, 13, 34, 17, 2, -35 } }; // 0x7E '~' + +const GFXfont LCD14cond24pt7b PROGMEM = { + (uint8_t *)LCD14Condensed24pt7bBitmaps, + (GFXglyph *)LCD14Condensed24pt7bGlyphs, + 0x20, 0x7E, 51 }; + +// Approx. 5047 bytes +#endif // ifndef FONTS_LCD14COND24PT7B_H From ecbb06a492e33b78bb0c8c6d30240b4c37f4cf18 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 30 Dec 2023 22:35:24 +0100 Subject: [PATCH 03/13] [AdaGFX_helper] Update Fonts documentation --- docs/source/Plugin/AdaGFX_commands.repl | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/source/Plugin/AdaGFX_commands.repl b/docs/source/Plugin/AdaGFX_commands.repl index 6ad286eb09..62bef44287 100644 --- a/docs/source/Plugin/AdaGFX_commands.repl +++ b/docs/source/Plugin/AdaGFX_commands.repl @@ -136,7 +136,11 @@ * *whiterabbit16pt* A modern 16 * 20 font * *robotomono16pt* A modern 16 * 20 font * *whiterabbit18pt* A modern 18 * 22 font + * *sevenseg18b* A better 18 * 22 font, where the 1 isn't proportionally spaced, but doesn't have much non-alphanumeric characters + * *lcd14cond18pt* A 14 segment, 18pt, LCD-like font * *whiterabbit20pt* A modern 20 * 24 font + * *sevenseg24b* A better 24 * 34 font, where the 1 isn't proportionally spaced, but doesn't have much non-alphanumeric characters + * *lcd14cond24pt* A 14 segment, 24pt, LCD-like font Standard disabled fonts (even on MAX builds), that can be enabled in a custom build: @@ -148,6 +152,8 @@ * *robotocond16pt* A modern 16 * 20 font (Roboto Condensed, proportionally spaced) NB: Roboto is used as the default Android font since Android 4.1, and very readable, even when using small fonts on a small display. + + NB2: The 18pt fonts are included by default in the ESP32 builds, using this helper. " " ``,l,,,,,`` From 7622e90f2c46793c1accd74b78bd996bc9365414 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Sat, 20 Jan 2024 22:17:54 +0100 Subject: [PATCH 04/13] [AdaGFX_helper] Code improvements Partly based on this commit: https://github.com/letscontrolit/ESPEasy/pull/4932/commits/a95ad3bda183f0ecf4e41efff3e9cbe4fb3a2e16 --- src/src/Helpers/AdafruitGFX_helper.cpp | 1476 +++++++++++++----------- 1 file changed, 781 insertions(+), 695 deletions(-) diff --git a/src/src/Helpers/AdafruitGFX_helper.cpp b/src/src/Helpers/AdafruitGFX_helper.cpp index ac7617a621..bc1f3e5e8d 100644 --- a/src/src/Helpers/AdafruitGFX_helper.cpp +++ b/src/src/Helpers/AdafruitGFX_helper.cpp @@ -379,13 +379,13 @@ void AdaGFXFormLineSpacing(const __FlashStringHelper *id, String lineSpacings[16]; int lineSpacingOptions[16]; - for (uint8_t i = 0; i < 16; i++) { + for (uint8_t i = 0; i < 16; ++i) { if (15 == i) { - # ifndef LIMIT_BUILD_SIZE + # ifndef LIMIT_BUILD_SIZE lineSpacings[i] = F("Auto, using font height * scaling"); - # else // ifndef LIMIT_BUILD_SIZE + # else // ifndef LIMIT_BUILD_SIZE lineSpacings[i] = F("Auto"); - # endif // ifndef LIMIT_BUILD_SIZE + # endif // ifndef LIMIT_BUILD_SIZE } else { lineSpacings[i] = i; } @@ -584,7 +584,7 @@ String AdaGFXparseTemplate(const String & tmpString, } } - for (uint16_t l = result.length(); l > 0 && isSpace(result[l - 1]); l--) { // Right-trim + for (uint16_t l = result.length(); l > 0 && isSpace(result[l - 1]); --l) { // Right-trim result.remove(l - 1); } @@ -764,13 +764,30 @@ void AdafruitGFX_helper::invertDisplay(bool i) { /**************************************************************************** * processCommand: Parse string to ,[,...] and execute that command ***************************************************************************/ -const char adagfx_commands[] PROGMEM = "txt|txp|txz|txl|txc|txs|txtfull|clear|rot|tpm|" // 0..9 - "asciitable|font|l|lh|lv|lm|lmr|r|rf|c|" // 10..19 - "cf|t|tf|rr|rrf|px|pxh|pxv|bmp|btn|" // 20..29 - "win|defwin|delwin"; // 30.. +const char adagfx_commands[] PROGMEM = + "txt|txp|txz|txl|txc|txs|txtfull|clear|rot|tpm|" // 0..9 + # if ADAGFX_USE_ASCIITABLE + "asciitable|" + # endif // if ADAGFX_USE_ASCIITABLE + "font|l|lh|lv|" + # if ADAGFX_ENABLE_EXTRA_CMDS + "lm|lmr|" + # endif // if ADAGFX_ENABLE_EXTRA_CMDS + "r|rf|c|" // 10..19 + "cf|t|tf|rr|rrf|px|pxh|pxv|" + # if ADAGFX_ENABLE_BMP_DISPLAY + "bmp|" + # endif // if ADAGFX_ENABLE_BMP_DISPLAY + # if ADAGFX_ENABLE_BUTTON_DRAW + "btn|" // 20..29 + # endif // if ADAGFX_ENABLE_BUTTON_DRAW + # if ADAGFX_ENABLE_FRAMED_WINDOW + "win|defwin|delwin" // 30.. + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW +; enum class adagfx_commands_e : int8_t { invalid = -1, - txt = 0, // 0 + txt = 0, // 0 txp, txz, txl, @@ -780,13 +797,17 @@ enum class adagfx_commands_e : int8_t { clear, rot, tpm, // 9 + # if ADAGFX_USE_ASCIITABLE asciitable, // 10 + # endif // if ADAGFX_USE_ASCIITABLE font, l, lh, lv, + # if ADAGFX_ENABLE_EXTRA_CMDS lm, lmr, + # endif // if ADAGFX_ENABLE_EXTRA_CMDS r, rf, c, // 19 @@ -798,11 +819,17 @@ enum class adagfx_commands_e : int8_t { px, pxh, pxv, + # if ADAGFX_ENABLE_BMP_DISPLAY bmp, + # endif // if ADAGFX_ENABLE_BMP_DISPLAY + # if ADAGFX_ENABLE_BUTTON_DRAW btn, // 29 + # endif // if ADAGFX_ENABLE_BUTTON_DRAW + # if ADAGFX_ENABLE_FRAMED_WINDOW win, // 30 defwin, delwin, + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW }; # if ADAGFX_FONTS_INCLUDED @@ -907,18 +934,25 @@ const char adagfx_fonts[] PROGMEM = # endif // ifdef ADAGFX_FONTS_EXTRA_24PT_INCLUDED ""; -typedef struct { - const GFXfont *f; - uint8_t width; - uint8_t height; - int8_t offset; - bool proportional; -} tFontArgs; +struct tFontArgs { + constexpr tFontArgs(const GFXfont *f, + uint8_t width, + uint8_t height, + int8_t offset, + bool proportional) + : _f(f), _width(width), _height(height), _offset(offset), _proportional(proportional) {} + + const GFXfont *_f; + uint8_t _width; + uint8_t _height; + int8_t _offset; + bool _proportional; +}; /* *INDENT-OFF* */ -const tFontArgs fontargs[] = +constexpr tFontArgs fontargs[] = { - { NULL, 9, 6, 0, false }, + { nullptr, 9, 6, 0, false }, { &Seven_Segment24pt7b, 21, 42, 35, true }, { &Seven_Segment18pt7b, 16, 33, 26, true }, { &FreeSans9pt7b, 10, 16, 12, false }, @@ -1072,7 +1106,6 @@ bool AdafruitGFX_helper::processCommand(const String& string) { argCount++; } argCount -= emptyCount; // Not counting the empty arguments - success = true; // If we get this far, we'll flip the flag if something wrong is found # ifndef BUILD_NO_DEBUG @@ -1081,7 +1114,10 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } # endif // ifndef BUILD_NO_DEBUG - const int subcommand_i = GetCommandCode(subcommand.c_str(), adagfx_commands); + const int subcommand_i = GetCommandCode(subcommand.c_str(), adagfx_commands); + + if (subcommand_i < 0) { return false; } // Fail fast + const adagfx_commands_e subcmd = static_cast(subcommand_i); const bool currentColRowState = _columnRowMode; @@ -1094,765 +1130,815 @@ bool AdafruitGFX_helper::processCommand(const String& string) { nParams[1] + nParams[3]); # endif // if ADAGFX_ARGUMENT_VALIDATION - if (adagfx_commands_e::txt == subcmd) // txt: Print text at last cursor position, ends at next line! + switch (subcmd) { - _display->println(parseStringToEndKeepCaseNoTrim(string, 3)); // Print entire rest of provided line - } - else if ((adagfx_commands_e::txp == subcmd) && (argCount == 2)) // txp: Text position - { - # if ADAGFX_ARGUMENT_VALIDATION + case adagfx_commands_e::invalid: + break; + case adagfx_commands_e::txt: // txt: Print text at last cursor position, ends at next line! + _display->println(parseStringToEndKeepCaseNoTrim(string, 3)); // Print entire rest of provided line + success = true; + break; + case adagfx_commands_e::txp: // txp: Text position - if (invalidCoordinates(nParams[0], nParams[1], _columnRowMode)) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - if (_columnRowMode) { - _display->setCursor(nParams[0] * _fontwidth + _xo, nParams[1] * _fontheight + _yo); - } else { - _display->setCursor(nParams[0] + _xo - _x_compensation, nParams[1] + _yo - _y_compensation); - } - } - } - else if ((adagfx_commands_e::txz == subcmd) && (argCount >= 3)) // txz: Text at position - { - # if ADAGFX_ARGUMENT_VALIDATION + if (argCount == 2) { + # if ADAGFX_ARGUMENT_VALIDATION - if (invalidCoordinates(nParams[0], nParams[1], _columnRowMode)) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - printText(parseStringToEndKeepCaseNoTrim(string, 5).c_str(), - nParams[0] + _xo - _x_compensation, - nParams[1] + _yo - _y_compensation, - _fontscaling, - _fgcolor, - _bgcolor); - } - } - else if ((adagfx_commands_e::txl == subcmd) && (argCount >= 2)) // txl: Text at line(s) - { - uint8_t _line = 0; - uint8_t _column = 0; - uint8_t idx = 0; - setColumnRowMode(true); // this command is by default set to Column/Row mode - - while (idx < argCount && !sParams[idx + 1].isEmpty()) { - if (nParams[idx] > 0) { - _line = nParams[idx]; - } else { - _line++; + if (!invalidCoordinates(nParams[0], nParams[1], _columnRowMode)) + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + if (_columnRowMode) { + _display->setCursor(nParams[0] * _fontwidth + _xo, nParams[1] * _fontheight + _yo); + } else { + _display->setCursor(nParams[0] + _xo - _x_compensation, nParams[1] + _yo - _y_compensation); + } + } + success = true; } - printText(sParams[idx + 1].c_str(), _column, _line - 1, _fontscaling, _fgcolor, _bgcolor); - idx += 2; - } - setColumnRowMode(currentColRowState); - } - else if ((adagfx_commands_e::txc == subcmd) && ((argCount == 1) || (argCount == 2))) // txc: Textcolor, fg and opt. bg colors - { - _fgcolor = AdaGFXparseColor(sParams[0], _colorDepth); - - if (argCount == 1) { - _bgcolor = _fgcolor; // Transparent background - _display->setTextColor(_fgcolor); - } else { // argCount=2 - _bgcolor = AdaGFXparseColor(sParams[1], _colorDepth); - _display->setTextColor(_fgcolor, _bgcolor); - } - } - else if ((adagfx_commands_e::txs == subcmd) && (argCount == 1)) // txs: Text size = font scaling, 1..10 - { - if ((nParams[0] >= 0) && (nParams[0] <= 10)) { - _fontscaling = nParams[0]; - _display->setTextSize(_fontscaling); - calculateTextMetrics(_fontwidth, _fontheight, _heightOffset, _isProportional); - } else { - success = false; - } - } - else if ((adagfx_commands_e::txtfull == subcmd) && (argCount >= 3) && (argCount <= 8)) { // txtfull: Text at position, with size and color - uint16_t par3color = argCount < 5 || sParams[3].isEmpty() ? _fgcolor : AdaGFXparseColor(sParams[3], _colorDepth); - uint16_t par4color = argCount < 6 || sParams[4].isEmpty() ? _bgcolor : AdaGFXparseColor(sParams[4], _colorDepth); - - # if ADAGFX_ARGUMENT_VALIDATION + break; + case adagfx_commands_e::txz: // txz: Text at position - if (invalidCoordinates(nParams[0] - _x_compensation, - nParams[1] - _y_compensation, - _columnRowMode)) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - switch (argCount) { - case 3: // single text + if (argCount >= 3) { + # if ADAGFX_ARGUMENT_VALIDATION - printText(sParams[2].c_str(), - nParams[0] - _x_compensation, - nParams[1] - _y_compensation, + if (!invalidCoordinates(nParams[0], nParams[1], _columnRowMode)) + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + printText(parseStringToEndKeepCaseNoTrim(string, 5).c_str(), + nParams[0] + _xo - _x_compensation, + nParams[1] + _yo - _y_compensation, _fontscaling, _fgcolor, _bgcolor); - break; - case 4: // text + size + } + success = true; + } + break; + case adagfx_commands_e::txl: // txl: Text at line(s) - printText(sParams[3].c_str(), - nParams[0] - _x_compensation, - nParams[1] - _y_compensation, - nParams[2], - _fgcolor, - _bgcolor); - break; - case 5: // text + size + color - - printText(sParams[4].c_str(), - nParams[0] - _x_compensation, - nParams[1] - _y_compensation, - nParams[2], - par3color, - par3color); // transparent bg - break; - case 6: // text + size + color + bkcolor - - printText(sParams[5].c_str(), - nParams[0] - _x_compensation, - nParams[1] - _y_compensation, - nParams[2], - par3color, - par4color); - break; - case 7: // 7: text + size + color + bkcolor + printmode - case 8: // as 7 but: + maxwidth + if (argCount >= 2) { + uint8_t _line = 0; + uint8_t _column = 0; + uint8_t idx = 0; + setColumnRowMode(true); // this command is by default set to Column/Row mode + + while (idx < argCount && !sParams[idx + 1].isEmpty()) { + if (nParams[idx] > 0) { + _line = nParams[idx]; + } else { + _line++; + } + printText(sParams[idx + 1].c_str(), _column, _line - 1, _fontscaling, _fgcolor, _bgcolor); + idx += 2; + } + setColumnRowMode(currentColRowState); + success = true; + } + break; + case adagfx_commands_e::txc: // txc: Textcolor, fg and opt. bg colors + + if ((argCount == 1) || (argCount == 2)) { + _fgcolor = AdaGFXparseColor(sParams[0], _colorDepth); + + if (argCount == 1) { + _bgcolor = _fgcolor; // Transparent background + _display->setTextColor(_fgcolor); + } else { // argCount=2 + _bgcolor = AdaGFXparseColor(sParams[1], _colorDepth); + _display->setTextColor(_fgcolor, _bgcolor); + } + success = true; + } + break; + case adagfx_commands_e::txs: // txs: Text size = font scaling, 1..10 + + if ((argCount == 1) && (nParams[0] >= 0) && (nParams[0] <= 10)) { + _fontscaling = nParams[0]; + _display->setTextSize(_fontscaling); + calculateTextMetrics(_fontwidth, _fontheight, _heightOffset, _isProportional); + success = true; + } + break; + case adagfx_commands_e::txtfull: // txtfull: Text at position, with size and color + + if ((argCount >= 3) && (argCount <= 8)) { + uint16_t par3color = argCount < 5 || sParams[3].isEmpty() ? _fgcolor : AdaGFXparseColor(sParams[3], _colorDepth); + uint16_t par4color = argCount < 6 || sParams[4].isEmpty() ? _bgcolor : AdaGFXparseColor(sParams[4], _colorDepth); + # if ADAGFX_ARGUMENT_VALIDATION + + if (!invalidCoordinates(nParams[0] - _x_compensation, + nParams[1] - _y_compensation, + _columnRowMode)) + # endif // if ADAGFX_ARGUMENT_VALIDATION { - AdaGFXTextPrintMode tmpPrintMode = _textPrintMode; + success = true; + + switch (argCount) { + case 3: // single text + + printText(sParams[2].c_str(), + nParams[0] - _x_compensation, + nParams[1] - _y_compensation, + _fontscaling, + _fgcolor, + _bgcolor); + break; + case 4: // text + size + + printText(sParams[3].c_str(), + nParams[0] - _x_compensation, + nParams[1] - _y_compensation, + nParams[2], + _fgcolor, + _bgcolor); + break; + case 5: // text + size + color + + printText(sParams[4].c_str(), + nParams[0] - _x_compensation, + nParams[1] - _y_compensation, + nParams[2], + par3color, + par3color); // transparent bg + break; + case 6: // text + size + color + bkcolor + + printText(sParams[5].c_str(), + nParams[0] - _x_compensation, + nParams[1] - _y_compensation, + nParams[2], + par3color, + par4color); + break; + case 7: // 7: text + size + color + bkcolor + printmode + case 8: // as 7 but: + maxwidth - if ((nParams[5] >= 0) && (nParams[5] < static_cast(AdaGFXTextPrintMode::MAX))) { - _textPrintMode = static_cast(nParams[5]); - _display->setTextWrap(_textPrintMode == AdaGFXTextPrintMode::ContinueToNextLine); - } - printText(sParams[argCount - 1].c_str(), - nParams[0] - _x_compensation, - nParams[1] - _y_compensation, - nParams[2], - par3color, - par4color, - argCount == 8 ? nParams[argCount - 2] : 0); - - if (_textPrintMode != tmpPrintMode) { - _textPrintMode = tmpPrintMode; - _display->setTextWrap(_textPrintMode == AdaGFXTextPrintMode::ContinueToNextLine); + { + AdaGFXTextPrintMode tmpPrintMode = _textPrintMode; + + if ((nParams[5] >= 0) && (nParams[5] < static_cast(AdaGFXTextPrintMode::MAX))) { + _textPrintMode = static_cast(nParams[5]); + _display->setTextWrap(_textPrintMode == AdaGFXTextPrintMode::ContinueToNextLine); + } + printText(sParams[argCount - 1].c_str(), + nParams[0] - _x_compensation, + nParams[1] - _y_compensation, + nParams[2], + par3color, + par4color, + argCount == 8 ? nParams[argCount - 2] : 0); + + if (_textPrintMode != tmpPrintMode) { + _textPrintMode = tmpPrintMode; + _display->setTextWrap(_textPrintMode == AdaGFXTextPrintMode::ContinueToNextLine); + } + break; + } + default: + success = false; + break; } - break; } - default: - success = false; - break; } - } - } - else if (adagfx_commands_e::clear == subcmd) // clear: Clear display - { - # if ADAGFX_ENABLE_FRAMED_WINDOW + break; + case adagfx_commands_e::clear: // clear: Clear display + # if ADAGFX_ENABLE_FRAMED_WINDOW - if (_window == 0) - # endif // if ADAGFX_ENABLE_FRAMED_WINDOW + if (_window == 0) + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW + { + _display->fillScreen(argCount == 0 ? _bgcolor : AdaGFXparseColor(sParams[0], _colorDepth)); + } + # if ADAGFX_ENABLE_FRAMED_WINDOW + else { + // logWindows(F("clear ")); // Use for debugging only + uint16_t _w = 0, _h = 0; + getWindowLimits(_w, _h); + _display->fillRect(_xo, _yo, _w, _h, + argCount == 0 ? _bgcolor : AdaGFXparseColor(sParams[0], _colorDepth)); + } + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW + success = true; + break; + case adagfx_commands_e::rot: // rot: Rotation + + if ((argCount == 1) && (nParams[0] >= 0) && (nParams[0] <= 3)) { + setRotation(nParams[0]); + success = true; + } + break; + case adagfx_commands_e::tpm: // tpm: Text Print Mode + + if ((argCount == 1) && ((nParams[0] < 0) || (nParams[0] >= static_cast(AdaGFXTextPrintMode::MAX)))) { + _textPrintMode = static_cast(nParams[0]); + _display->setTextWrap(_textPrintMode == AdaGFXTextPrintMode::ContinueToNextLine); + success = true; + } + break; + # if ADAGFX_USE_ASCIITABLE + case adagfx_commands_e::asciitable: // Show ASCII table { - _display->fillScreen(argCount == 0 ? _bgcolor : AdaGFXparseColor(sParams[0], _colorDepth)); - } - # if ADAGFX_ENABLE_FRAMED_WINDOW - else { - // logWindows(F("clear ")); // Use for debugging only - uint16_t _w = 0, _h = 0; - getWindowLimits(_w, _h); - _display->fillRect(_xo, _yo, _w, _h, - argCount == 0 ? _bgcolor : AdaGFXparseColor(sParams[0], _colorDepth)); - } - # endif // if ADAGFX_ENABLE_FRAMED_WINDOW - } - else if ((adagfx_commands_e::rot == subcmd) && (argCount == 1)) // rot: Rotation - { - if ((nParams[0] < 0) || (nParams[0] > 3)) { - success = false; - } else { - setRotation(nParams[0]); - } - } - else if ((adagfx_commands_e::tpm == subcmd) && (argCount == 1)) // tpm: Text Print Mode - { - if ((nParams[0] < 0) || (nParams[0] >= static_cast(AdaGFXTextPrintMode::MAX))) { - success = false; - } else { - _textPrintMode = static_cast(nParams[0]); - _display->setTextWrap(_textPrintMode == AdaGFXTextPrintMode::ContinueToNextLine); - } - } - # if ADAGFX_USE_ASCIITABLE - else if (adagfx_commands_e::asciitable == subcmd) // Show ASCII table - { - String line; - const int16_t start = 0x80 + (argCount >= 1 && nParams[0] >= -4 && nParams[0] < 4 ? nParams[0] * 0x20 : 0); - const uint8_t scale = (argCount == 2 && nParams[1] > 0 && nParams[1] <= 10 ? nParams[1] : 2); - const uint8_t currentScale = _fontscaling; - - if (_fontscaling != scale) { // Set fontscaling - _fontscaling = scale; - _display->setTextSize(_fontscaling); - calculateTextMetrics(_fontwidth, _fontheight, _heightOffset, _isProportional); - } - line.reserve(_textcols); - _display->setCursor(0, 0); - int16_t row = 0; - setColumnRowMode(true); + String line; + const int16_t start = 0x80 + (argCount >= 1 && nParams[0] >= -4 && nParams[0] < 4 ? nParams[0] * 0x20 : 0); + const uint8_t scale = (argCount == 2 && nParams[1] > 0 && nParams[1] <= 10 ? nParams[1] : 2); + const uint8_t currentScale = _fontscaling; - for (int16_t i = start; i <= 0xFF && row < _textrows; i++) { - if ((i % 4 == 0) && (line.length() > (_textcols - 8u))) { // 8 = 4x space + char + if (_fontscaling != scale) { // Set fontscaling + _fontscaling = scale; + _display->setTextSize(_fontscaling); + calculateTextMetrics(_fontwidth, _fontheight, _heightOffset, _isProportional); + } + line.reserve(_textcols); + _display->setCursor(0, 0); + int16_t row = 0; + setColumnRowMode(true); + + for (int16_t i = start; i <= 0xFF && row < _textrows; ++i) { + if ((i % 4 == 0) && (line.length() > (_textcols - 8u))) { // 8 = 4x space + char + printText(line.c_str(), 0, row, _fontscaling, _fgcolor, _bgcolor); + line.clear(); + row++; + } + + if (line.isEmpty()) { + line += formatToHex(i, 2); + } + line += ' '; + line += static_cast(((i == 0x0A) || (i == 0x0D) ? 0x20 : i)); // Show a space instead of CR/LF + } + + if (row < _textrows) { printText(line.c_str(), 0, row, _fontscaling, _fgcolor, _bgcolor); - line.clear(); - row++; } - if (line.isEmpty()) { - line += formatToHex(i, 2); + setColumnRowMode(currentColRowState); // Restore + + if (_fontscaling != currentScale) { // Restore if needed + _fontscaling = currentScale; + _display->setTextSize(_fontscaling); + calculateTextMetrics(_fontwidth, _fontheight, _heightOffset, _isProportional); } - line += ' '; - line += static_cast(((i == 0x0A) || (i == 0x0D) ? 0x20 : i)); // Show a space instead of CR/LF + success = true; + break; } + # endif // if ADAGFX_USE_ASCIITABLE + case adagfx_commands_e::font: // font: Change font - if (row < _textrows) { - printText(line.c_str(), 0, row, _fontscaling, _fgcolor, _bgcolor); - } + # if ADAGFX_FONTS_INCLUDED - setColumnRowMode(currentColRowState); // Restore + if (argCount == 1) { + sParams[0].toLowerCase(); - if (_fontscaling != currentScale) { // Restore if needed - _fontscaling = currentScale; - _display->setTextSize(_fontscaling); - calculateTextMetrics(_fontwidth, _fontheight, _heightOffset, _isProportional); - } - } - # endif // if ADAGFX_USE_ASCIITABLE - else if ((adagfx_commands_e::font == subcmd) && (argCount == 1)) { // font: Change font - # if ADAGFX_FONTS_INCLUDED - sParams[0].toLowerCase(); - - constexpr int font_max = NR_ELEMENTS(fontargs); - const int font_i = GetCommandCode(sParams[0].c_str(), adagfx_fonts); - - if ((font_i >= 0) && (font_i < font_max)) { - _display->setFont(fontargs[font_i].f); - calculateTextMetrics(fontargs[font_i].width, - fontargs[font_i].height, - fontargs[font_i].offset, - fontargs[font_i].proportional); - } else { - success = false; - } - # else // if ADAGFX_FONTS_INCLUDED - success = false; - # endif // if ADAGFX_FONTS_INCLUDED - } - else if ((adagfx_commands_e::l == subcmd) && (argCount == 5)) { // l: Line - # if ADAGFX_ARGUMENT_VALIDATION + constexpr int font_max = NR_ELEMENTS(fontargs); + const int font_i = GetCommandCode(sParams[0].c_str(), adagfx_fonts); - if (invCoord_0_1 || - invCoord_2_3) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - _display->drawLine(nParams[0] + _xo, nParams[1] + _yo, nParams[2] + _xo, nParams[3] + _yo, AdaGFXparseColor(sParams[4], _colorDepth)); - } - } - else if ((adagfx_commands_e::lh == subcmd) && (argCount == 3)) { // lh: Horizontal line - # if ADAGFX_ARGUMENT_VALIDATION + if ((font_i >= 0) && (font_i < font_max)) { + _display->setFont(fontargs[font_i]._f); + calculateTextMetrics(fontargs[font_i]._width, + fontargs[font_i]._height, + fontargs[font_i]._offset, + fontargs[font_i]._proportional); + success = true; + } + } + # endif // if ADAGFX_FONTS_INCLUDED + break; + case adagfx_commands_e::l: // l: Line - if ((nParams[0] < 0) || (nParams[0] > res_x)) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - _display->drawFastHLine(_xo, nParams[0] + _yo, nParams[1], AdaGFXparseColor(sParams[2], _colorDepth)); - } - } - else if ((adagfx_commands_e::lv == subcmd) && (argCount == 3)) { // lv: Vertical line - # if ADAGFX_ARGUMENT_VALIDATION + if (argCount == 5) { + # if ADAGFX_ARGUMENT_VALIDATION - if ((nParams[0] < 0) || (nParams[0] > res_y)) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - _display->drawFastVLine(nParams[0] + _xo, _yo, nParams[1], AdaGFXparseColor(sParams[2], _colorDepth)); - } - } - # if ADAGFX_ENABLE_EXTRA_CMDS - else if (((adagfx_commands_e::lm == subcmd) || (adagfx_commands_e::lmr == subcmd)) && (argCount >= 5)) { // lm/lmr: Multi-line, multiple - // coordinates - uint16_t mcolor = AdaGFXparseColor(sParams[0], _colorDepth); - bool mloop = true; - uint8_t parCount = 0; - uint8_t optCount = 0; - int cx = -1; - int cy = -1; - bool closeLine = false; - const bool relativeMode = (adagfx_commands_e::lmr == subcmd); // Use Relative mode - - while (mloop) { - sParams[optCount] = parseString(string, parCount + 4); // 0-offset + 1st and 2nd cmd-argument and 1 for color argument - - if (!validIntFromString(sParams[optCount], nParams[optCount]) && !sParams[optCount].isEmpty()) { - mcolor = AdaGFXparseColor(sParams[optCount], _colorDepth); // Interpret as a color - - if (optCount > 0) { optCount--; } + if (!(invCoord_0_1 || + invCoord_2_3)) + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + _display->drawLine(nParams[0] + _xo, nParams[1] + _yo, nParams[2] + _xo, nParams[3] + _yo, + AdaGFXparseColor(sParams[4], _colorDepth)); + success = true; + } } - mloop = !sParams[optCount].isEmpty(); - closeLine = equals(sParams[optCount], 'c'); + break; + case adagfx_commands_e::lh: // lh: Horizontal line - if (mloop) { parCount++; optCount++; } // Next argument + if (argCount == 3) { + # if ADAGFX_ARGUMENT_VALIDATION - if ((optCount == 4) || closeLine) { // 0..3 = 4th argument or close the line - if (relativeMode) { - nParams[2] += nParams[0]; - nParams[3] += nParams[1]; + if (!((nParams[0] < 0) || (nParams[0] > res_x))) + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + _display->drawFastHLine(_xo, nParams[0] + _yo, nParams[1], AdaGFXparseColor(sParams[2], _colorDepth)); + success = true; } - # if ADAGFX_ARGUMENT_VALIDATION + } + break; + case adagfx_commands_e::lv: // lv: Vertical line - if (invalidCoordinates(nParams[0], nParams[1]) || - invalidCoordinates(nParams[2], nParams[3])) { - success = false; - mloop = false; // break out - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION + if (argCount == 3) + { + # if ADAGFX_ARGUMENT_VALIDATION + + if (!((nParams[0] < 0) || (nParams[0] > res_y))) + # endif // if ADAGFX_ARGUMENT_VALIDATION { - if (closeLine) { - nParams[2] = cx; - nParams[3] = cy; - mloop = false; // Exit after closing the line + _display->drawFastVLine(nParams[0] + _xo, _yo, nParams[1], AdaGFXparseColor(sParams[2], _colorDepth)); + success = true; + } + } + break; + # if ADAGFX_ENABLE_EXTRA_CMDS + case adagfx_commands_e::lm: + case adagfx_commands_e::lmr: // lm/lmr: Multi-line, multiple coordinates + + if (argCount >= 5) { + uint16_t mcolor = AdaGFXparseColor(sParams[0], _colorDepth); + bool mloop = true; + uint8_t parCount = 0; + uint8_t optCount = 0; + int cx = -1; + int cy = -1; + bool closeLine = false; + const bool relativeMode = (adagfx_commands_e::lmr == subcmd); // Use Relative mode + success = true; + + while (mloop) { + sParams[optCount] = parseString(string, parCount + 4); // 0-offset + 1st and 2nd cmd-argument and 1 for color argument + + if (!validIntFromString(sParams[optCount], nParams[optCount]) && !sParams[optCount].isEmpty()) { + mcolor = AdaGFXparseColor(sParams[optCount], _colorDepth); // Interpret as a color + + if (optCount > 0) { optCount--; } } - # ifndef BUILD_NO_DEBUG - addLog(LOG_LEVEL_INFO, strformat(F("AdaGFX: cmd: lm x/y/x1/y1:%d/%d/%d/%d loop:%c color:%s"), - nParams[0], nParams[1], nParams[2], nParams[3], - mloop ? 'T' : 'f', AdaGFXcolorToString(mcolor, _colorDepth).c_str())); - # endif // ifndef BUILD_NO_DEBUG - _display->drawLine(nParams[0] + _xo, nParams[1] + _yo, nParams[2] + _xo, nParams[3] + _yo, mcolor); + mloop = !sParams[optCount].isEmpty(); + closeLine = equals(sParams[optCount], 'c'); + + if (mloop) { parCount++; optCount++; } // Next argument - if ((cx == -1) && (cy == -1)) { - cx = nParams[0]; - cy = nParams[1]; + if ((optCount == 4) || closeLine) { // 0..3 = 4th argument or close the line + if (relativeMode) { + nParams[2] += nParams[0]; + nParams[3] += nParams[1]; + } + # if ADAGFX_ARGUMENT_VALIDATION + + if (invalidCoordinates(nParams[0], nParams[1]) || + invalidCoordinates(nParams[2], nParams[3])) { + success = false; + mloop = false; // break out + } else + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + if (closeLine) { + nParams[2] = cx; + nParams[3] = cy; + mloop = false; // Exit after closing the line + } + # ifndef BUILD_NO_DEBUG + addLog(LOG_LEVEL_INFO, strformat(F("AdaGFX: cmd: lm x/y/x1/y1:%d/%d/%d/%d loop:%c color:%s"), + nParams[0], nParams[1], nParams[2], nParams[3], + mloop ? 'T' : 'f', AdaGFXcolorToString(mcolor, _colorDepth).c_str())); + # endif // ifndef BUILD_NO_DEBUG + _display->drawLine(nParams[0] + _xo, nParams[1] + _yo, nParams[2] + _xo, nParams[3] + _yo, mcolor); + + if ((cx == -1) && (cy == -1)) { + cx = nParams[0]; + cy = nParams[1]; + } + nParams[0] = nParams[2]; // Move second set to first set + nParams[1] = nParams[3]; + optCount = 2; // Get second set of arguments only + } } - nParams[0] = nParams[2]; // Move second set to first set - nParams[1] = nParams[3]; - optCount = 2; // Get second set of arguments only } } - } - } - # endif // if ADAGFX_ENABLE_EXTRA_CMDS - else if (((adagfx_commands_e::r == subcmd) && (argCount == 5)) || // r: Rectangle - ((adagfx_commands_e::rf == subcmd) && (argCount == 6))) { // rf: Rectangled, filled - # if ADAGFX_ARGUMENT_VALIDATION + break; + # endif // if ADAGFX_ENABLE_EXTRA_CMDS + case adagfx_commands_e::r: // r: Rectangle + case adagfx_commands_e::rf: // rf: Rectangled, filled - if (invCoord_0_1 || - invCoord_0_2_1_3) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - if (adagfx_commands_e::rf == subcmd) { - _display->fillRect(nParams[0] + _xo, nParams[1] + _yo, nParams[2], nParams[3], AdaGFXparseColor(sParams[5], _colorDepth)); + if ((argCount == 5) || + (argCount == 6)) { + # if ADAGFX_ARGUMENT_VALIDATION + + if (!(invCoord_0_1 || + invCoord_0_2_1_3)) + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + if ((adagfx_commands_e::rf == subcmd) && (argCount == 6)) { + _display->fillRect(nParams[0] + _xo, nParams[1] + _yo, nParams[2], nParams[3], AdaGFXparseColor(sParams[5], _colorDepth)); + } + _display->drawRect(nParams[0] + _xo, nParams[1] + _yo, nParams[2], nParams[3], AdaGFXparseColor(sParams[4], _colorDepth)); + success = true; + } } - _display->drawRect(nParams[0] + _xo, nParams[1] + _yo, nParams[2], nParams[3], AdaGFXparseColor(sParams[4], _colorDepth)); - } - } - else if (((adagfx_commands_e::c == subcmd) && (argCount == 4)) || // c: Circle - ((adagfx_commands_e::cf == subcmd) && (argCount == 5))) { // cf: Circle, filled - # if ADAGFX_ARGUMENT_VALIDATION + break; + case adagfx_commands_e::c: // c: Circle + case adagfx_commands_e::cf: // cf: Circle, filled - if (invCoord_0_1 || - invalidCoordinates(nParams[2], 0)) { // Also check radius - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - if (adagfx_commands_e::cf == subcmd) { - _display->fillCircle(nParams[0] + _xo, nParams[1] + _yo, nParams[2], AdaGFXparseColor(sParams[4], _colorDepth)); + if ((argCount == 4) || + (argCount == 5)) { + # if ADAGFX_ARGUMENT_VALIDATION + + if (!(invCoord_0_1 || + invalidCoordinates(nParams[2], 0))) // Also check radius + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + if ((adagfx_commands_e::cf == subcmd) && (argCount == 5)) { + _display->fillCircle(nParams[0] + _xo, nParams[1] + _yo, nParams[2], AdaGFXparseColor(sParams[4], _colorDepth)); + } + _display->drawCircle(nParams[0] + _xo, nParams[1] + _yo, nParams[2], AdaGFXparseColor(sParams[3], _colorDepth)); + success = true; + } } - _display->drawCircle(nParams[0] + _xo, nParams[1] + _yo, nParams[2], AdaGFXparseColor(sParams[3], _colorDepth)); - } - } - else if (((adagfx_commands_e::t == subcmd) && (argCount == 7)) || // t: Triangle - ((adagfx_commands_e::tf == subcmd) && (argCount == 8))) { // tf: Triangle, filled - # if ADAGFX_ARGUMENT_VALIDATION - - if (invCoord_0_1 || - invCoord_2_3 || - invalidCoordinates(nParams[4], nParams[5])) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - if (adagfx_commands_e::tf == subcmd) { - _display->fillTriangle(nParams[0] + _xo, - nParams[1] + _yo, - nParams[2] + _xo, - nParams[3] + _yo, - nParams[4] + _xo, - nParams[5] + _yo, - AdaGFXparseColor(sParams[7], _colorDepth)); + break; + case adagfx_commands_e::t: // t: Triangle + case adagfx_commands_e::tf: // tf: Triangle, filled + + if ((argCount == 7) || + (argCount == 8)) { + # if ADAGFX_ARGUMENT_VALIDATION + + if (!(invCoord_0_1 || + invCoord_2_3 || + invalidCoordinates(nParams[4], nParams[5]))) + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + if ((adagfx_commands_e::tf == subcmd) && (argCount == 8)) { + _display->fillTriangle(nParams[0] + _xo, + nParams[1] + _yo, + nParams[2] + _xo, + nParams[3] + _yo, + nParams[4] + _xo, + nParams[5] + _yo, + AdaGFXparseColor(sParams[7], _colorDepth)); + } + _display->drawTriangle(nParams[0] + _xo, + nParams[1] + _yo, + nParams[2] + _xo, + nParams[3] + _yo, + nParams[4] + _xo, + nParams[5] + _yo, + AdaGFXparseColor(sParams[6], _colorDepth)); + success = true; + } } - _display->drawTriangle(nParams[0] + _xo, - nParams[1] + _yo, - nParams[2] + _xo, - nParams[3] + _yo, - nParams[4] + _xo, - nParams[5] + _yo, - AdaGFXparseColor(sParams[6], _colorDepth)); - } - } - else if (((adagfx_commands_e::rr == subcmd) && (argCount == 6)) || // rr: Rounded rectangle - ((adagfx_commands_e::rrf == subcmd) && (argCount == 7))) { // rrf: Rounded rectangle, filled - # if ADAGFX_ARGUMENT_VALIDATION - - if (invCoord_0_1 || - invCoord_0_2_1_3 || - invalidCoordinates(nParams[4], 0)) { // Also check radius - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - if (adagfx_commands_e::rrf == subcmd) { - _display->fillRoundRect(nParams[0] + _xo, - nParams[1] + _yo, - nParams[2], - nParams[3], - nParams[4], - AdaGFXparseColor(sParams[6], _colorDepth)); + break; + case adagfx_commands_e::rr: // rr: Rounded rectangle + case adagfx_commands_e::rrf: // rrf: Rounded rectangle, filled + + if ((argCount == 6) || + (argCount == 7)) { + # if ADAGFX_ARGUMENT_VALIDATION + + if (!(invCoord_0_1 || + invCoord_0_2_1_3 || + invalidCoordinates(nParams[4], 0))) // Also check radius + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + if ((adagfx_commands_e::rrf == subcmd) && (argCount == 7)) { + _display->fillRoundRect(nParams[0] + _xo, + nParams[1] + _yo, + nParams[2], + nParams[3], + nParams[4], + AdaGFXparseColor(sParams[6], _colorDepth)); + } + _display->drawRoundRect(nParams[0] + _xo, + nParams[1] + _yo, + nParams[2], + nParams[3], + nParams[4], + AdaGFXparseColor(sParams[5], _colorDepth)); + success = true; + } } - _display->drawRoundRect(nParams[0] + _xo, - nParams[1] + _yo, - nParams[2], - nParams[3], - nParams[4], - AdaGFXparseColor(sParams[5], _colorDepth)); - } - } - else if ((adagfx_commands_e::px == subcmd) && (argCount == 3)) { // px: Pixel - # if ADAGFX_ARGUMENT_VALIDATION + break; + case adagfx_commands_e::px: // px: Pixel - if (invCoord_0_1) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - _display->drawPixel(nParams[0] + _xo, nParams[1] + _yo, AdaGFXparseColor(sParams[2], _colorDepth)); - } - } - else if (((adagfx_commands_e::pxh == subcmd) || (adagfx_commands_e::pxv == subcmd)) && (argCount > 2)) { // pxh/pxv: Pixels, hor./vert. - // incremented merged loop is - # if ADAGFX_ARGUMENT_VALIDATION // smaller than 2 separate loops + if (argCount == 3) { + # if ADAGFX_ARGUMENT_VALIDATION - if (invCoord_0_1) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - _display->startWrite(); - _display->writePixel(nParams[0] + _xo, nParams[1] + _yo, AdaGFXparseColor(sParams[2], _colorDepth)); - loop = true; - uint8_t h = 0; - uint8_t v = 0; - bool isPxh = (adagfx_commands_e::pxh == subcmd); - - if (isPxh) { - h++; - } else { - v++; + if (!invCoord_0_1) + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + _display->drawPixel(nParams[0] + _xo, nParams[1] + _yo, AdaGFXparseColor(sParams[2], _colorDepth)); + success = true; + } } + break; + case adagfx_commands_e::pxh: + case adagfx_commands_e::pxv: // pxh/pxv: Pixels, hor./vert. - while (loop) { - String color = parseString(string, h + v + 5); // 5 = 2 + 3 already parsed merged loop is smaller than 2 separate loops + if (argCount > 2) { + // incremented merged loop is smaller than 2 separate loops + # if ADAGFX_ARGUMENT_VALIDATION - if (color.isEmpty() - # if ADAGFX_ARGUMENT_VALIDATION - || invalidCoordinates(nParams[0] + h + _xo, nParams[1] + v + _yo) - # endif // if ADAGFX_ARGUMENT_VALIDATION - ) { - loop = false; - } else { - _display->writePixel(nParams[0] + h + _xo, nParams[1] + v + _yo, AdaGFXparseColor(color, _colorDepth)); + if (!invCoord_0_1) + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + _display->startWrite(); + _display->writePixel(nParams[0] + _xo, nParams[1] + _yo, AdaGFXparseColor(sParams[2], _colorDepth)); + loop = true; + uint8_t h = 0; + uint8_t v = 0; + bool isPxh = (adagfx_commands_e::pxh == subcmd); if (isPxh) { h++; } else { v++; } + + while (loop) { + String color = parseString(string, h + v + 5); // 5 = 2 + 3 already parsed merged loop is smaller than 2 separate loops + + if (color.isEmpty() + # if ADAGFX_ARGUMENT_VALIDATION + || invalidCoordinates(nParams[0] + h + _xo, nParams[1] + v + _yo) + # endif // if ADAGFX_ARGUMENT_VALIDATION + ) { + loop = false; + } else { + _display->writePixel(nParams[0] + h + _xo, nParams[1] + v + _yo, AdaGFXparseColor(color, _colorDepth)); + + if (isPxh) { + h++; + } else { + v++; + } + } + delay(0); + } + _display->endWrite(); + success = true; } - delay(0); } - _display->endWrite(); - } - } - # if ADAGFX_ENABLE_BMP_DISPLAY - else if ((adagfx_commands_e::bmp == subcmd) && (argCount == 3)) { // bmp,x,y,filename.bmp : show bmp from file - if (!sParams[2].isEmpty()) { - success = showBmp(sParams[2], nParams[0] + _xo, nParams[1] + _yo); - } else { - success = false; - } - } - # endif // if ADAGFX_ENABLE_BMP_DISPLAY - # if ADAGFX_ENABLE_BUTTON_DRAW - else if ((adagfx_commands_e::btn == subcmd) && (argCount >= 8) && (nParams[7] != 0)) - { // btn,state,m,x,y,w,h,id,type[,ONclr,OFFclr,Captionclr,fontscale,ONcaption,OFFcapt,Borderclr,DisabClr,DisabCaptclr],TaskIndex,Group,SelGrp,objectname - // ev: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17,18,19,20,21 - // nP: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16,17,18,19,20 - // : Draw a button - // m=mode: -2 = disabled, -1 = initial, 0 = default - // state: 0 = off, 1 = on, -2 = off + disabled, -1 = on + disabled - // id: < 0 = clear area - // type & 0x0F: 0 = none, 1 = rectangle, 2 = rounded rect., 3 = circle, - // type & 0xF0 = CenterAligned, LeftAligned, TopAligned, RightAligned, BottomAligned, LeftTopAligned, RightTopAligned, - // RightBottomAligned, LeftBottomAligned, NoCaption - // (*clr = color, TaskIndex, Group and SelGrp are ignored) - # if ADAGFX_ARGUMENT_VALIDATION - - if (invCoord_2_3 || - invalidCoordinates(nParams[2] + nParams[4], nParams[3] + nParams[5])) { - success = false; - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - // All checked out OK - // Default values - uint16_t onColor = ADAGFX_BLUE; - uint16_t offColor = ADAGFX_RED; - uint16_t captionColor = ADAGFX_WHITE; - uint8_t fontScale = 0; - uint16_t borderColor = ADAGFX_WHITE; - uint16_t disabledColor = 0x9410; // Medium grey - uint16_t disabledCaptionColor = 0x5A69; // Dark grey + break; + # if ADAGFX_ENABLE_BMP_DISPLAY + case adagfx_commands_e::bmp: // bmp,x,y,filename.bmp : show bmp from file - if (!sParams[8].isEmpty()) { onColor = AdaGFXparseColor(sParams[8], _colorDepth); } + if ((argCount == 3) && !sParams[2].isEmpty()) { + success = showBmp(sParams[2], nParams[0] + _xo, nParams[1] + _yo); + } + break; + # endif // if ADAGFX_ENABLE_BMP_DISPLAY + # if ADAGFX_ENABLE_BUTTON_DRAW + case adagfx_commands_e::btn: + + if ((argCount >= 8) && (nParams[7] != 0)) { + // btn,state,m,x,y,w,h,id,type[,ONclr,OFFclr,Captionclr,fontscale,ONcaption,OFFcapt,Borderclr,DisabClr,DisabCaptclr],TaskIndex,Group,SelGrp,objectname + // ev: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17,18,19,20,21 + // nP: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16,17,18,19,20 + // : Draw a button + // m=mode: -2 = disabled, -1 = initial, 0 = default + // state: 0 = off, 1 = on, -2 = off + disabled, -1 = on + disabled + // id: < 0 = clear area + // type & 0x0F: 0 = none, 1 = rectangle, 2 = rounded rect., 3 = circle, + // type & 0xF0 = CenterAligned, LeftAligned, TopAligned, RightAligned, BottomAligned, LeftTopAligned, RightTopAligned, + // RightBottomAligned, LeftBottomAligned, NoCaption + // (*clr = color, TaskIndex, Group and SelGrp are ignored) + # if ADAGFX_ARGUMENT_VALIDATION - if (!sParams[9].isEmpty()) { offColor = AdaGFXparseColor(sParams[9], _colorDepth); } + if (!(invCoord_2_3 || + invalidCoordinates(nParams[2] + nParams[4], nParams[3] + nParams[5]))) + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + // All checked out OK + // Default values + uint16_t onColor = ADAGFX_BLUE; + uint16_t offColor = ADAGFX_RED; + uint16_t captionColor = ADAGFX_WHITE; + uint8_t fontScale = 0; + uint16_t borderColor = ADAGFX_WHITE; + uint16_t disabledColor = 0x9410; // Medium grey + uint16_t disabledCaptionColor = 0x5A69; // Dark grey + success = true; - if (!sParams[10].isEmpty()) { captionColor = AdaGFXparseColor(sParams[10], _colorDepth); } + if (!sParams[8].isEmpty()) { onColor = AdaGFXparseColor(sParams[8], _colorDepth); } - if ((nParams[11] > 0) && (nParams[11] <= 10)) { fontScale = nParams[11]; } + if (!sParams[9].isEmpty()) { offColor = AdaGFXparseColor(sParams[9], _colorDepth); } - if (!sParams[14].isEmpty()) { borderColor = AdaGFXparseColor(sParams[14], _colorDepth); } + if (!sParams[10].isEmpty()) { captionColor = AdaGFXparseColor(sParams[10], _colorDepth); } - if (!sParams[15].isEmpty()) { disabledColor = AdaGFXparseColor(sParams[15], _colorDepth); } + if ((nParams[11] > 0) && (nParams[11] <= 10)) { fontScale = nParams[11]; } - if (!sParams[16].isEmpty()) { disabledCaptionColor = AdaGFXparseColor(sParams[16], _colorDepth); } + if (!sParams[14].isEmpty()) { borderColor = AdaGFXparseColor(sParams[14], _colorDepth); } - uint16_t fillColor = onColor; - uint16_t textColor = captionColor; - const bool clearArea = nParams[7] < 0; - nParams[7] = std::abs(nParams[7]); + if (!sParams[15].isEmpty()) { disabledColor = AdaGFXparseColor(sParams[15], _colorDepth); } - const Button_type_e buttonType = static_cast(nParams[7] & 0x0F); - const Button_layout_e buttonLayout = static_cast(nParams[7] & 0xF0); + if (!sParams[16].isEmpty()) { disabledCaptionColor = AdaGFXparseColor(sParams[16], _colorDepth); } - // Check mode & state: -2, -1, 0, 1 to select used colors - if (nParams[0] == 0) { - fillColor = offColor; - } + uint16_t fillColor = onColor; + uint16_t textColor = captionColor; + const bool clearArea = nParams[7] < 0; + nParams[7] = std::abs(nParams[7]); - if ((nParams[1] == -2) || (nParams[0] < 0)) { - fillColor = disabledColor; - textColor = disabledCaptionColor; - } else if (clearArea) { - fillColor = _bgcolor; // - borderColor = _bgcolor; - } + const Button_type_e buttonType = static_cast(nParams[7] & 0x0F); + const Button_layout_e buttonLayout = static_cast(nParams[7] & 0xF0); - // Clear the area? - if ((buttonType != Button_type_e::None) || - clearArea) { - drawButtonShape(buttonType, - nParams[2] + _xo, nParams[3] + _yo, nParams[4], nParams[5], - _bgcolor, _bgcolor); - } + // Check mode & state: -2, -1, 0, 1 to select used colors + if (nParams[0] == 0) { + fillColor = offColor; + } - // Check button-type bits (mask: 0x0F) to draw correct shape - if (!clearArea) { - drawButtonShape(buttonType, - nParams[2] + _xo, nParams[3] + _yo, nParams[4], nParams[5], - fillColor, borderColor); - } + if ((nParams[1] == -2) || (nParams[0] < 0)) { + fillColor = disabledColor; + textColor = disabledCaptionColor; + } else if (clearArea) { + fillColor = _bgcolor; // + borderColor = _bgcolor; + } - // Display caption? (or bitmap) - if (!clearArea && - (buttonLayout != Button_layout_e::NoCaption)) { - int16_t x1, y1; - uint16_t w1, h1, w2, h2; - String newString; + // Clear the area? + if ((buttonType != Button_type_e::None) || + clearArea) { + drawButtonShape(buttonType, + nParams[2] + _xo, nParams[3] + _yo, nParams[4], nParams[5], + _bgcolor, _bgcolor); + } - // Determine alignment parameters - if ((nParams[0] == 1) || (nParams[0] == -1)) { // 1 = on+enabled, -1 = on+disabled - newString = sParams[12].isEmpty() ? sParams[6] : sParams[12]; - } else { - newString = sParams[13].isEmpty() ? sParams[6] : sParams[13]; - } - newString = AdaGFXparseTemplate(newString, 20); - - _display->setTextSize(fontScale); // set scaling - _display->getTextBounds(newString, 0, 0, &x1, &y1, &w1, &h1); // get caption length and height in pixels - _display->getTextBounds(F(" "), 0, 0, &x1, &y1, &w2, &h2); // measure space width for little margins - - // Check button-alignment bits (mask 0xF0) for caption placement, modifies the x/y arguments passed! - // Little margin is: from left/right: half of the width of a space, from top/bottom: half of height of the font used - - switch (buttonLayout) { - case Button_layout_e::CenterAligned: - nParams[2] += (nParams[4] / 2 - w1 / 2); // center horizontically - nParams[3] += (nParams[5] / 2 - h1 / 2); // center vertically - break; - case Button_layout_e::LeftAligned: - nParams[2] += w2 / 2; // A little margin from left - nParams[3] += (nParams[5] / 2 - h1 / 2); // center vertically - break; - case Button_layout_e::TopAligned: - nParams[2] += (nParams[4] / 2 - w1 / 2); // center horizontically - nParams[3] += h1 / 2; // A little margin from top - break; - case Button_layout_e::RightAligned: - nParams[2] += (nParams[4] - w1) - w2 / 2; // right-align + a little margin - nParams[3] += (nParams[5] / 2 - h1 / 2); // center vertically - break; - case Button_layout_e::BottomAligned: - nParams[2] += (nParams[4] / 2 - w1 / 2); // center horizontically - nParams[3] += (nParams[5] - h1 * 1.5); // bottom align + a little margin - break; - case Button_layout_e::LeftTopAligned: - nParams[2] += w2 / 2; // A little margin from left - nParams[3] += h1 / 2; // A little margin from top - break; - case Button_layout_e::RightTopAligned: - nParams[2] += (nParams[4] - w1) - w2 / 2; // right-align + a little margin - nParams[3] += h1 / 2; // A little margin from top - break; - case Button_layout_e::RightBottomAligned: - nParams[2] += (nParams[4] - w1) - w2 / 2; // right-align + a little margin - nParams[3] += (nParams[5] - h1 * 1.5); // bottom align + a little margin - break; - case Button_layout_e::LeftBottomAligned: - nParams[2] += w2 / 2; // A little margin from left - nParams[3] += (nParams[5] - h1 * 1.5); // bottom align + a little margin - break; - case Button_layout_e::Bitmap: - { // Use ON/OFF caption to specify (full) bitmap filename - # if ADAGFX_ENABLE_BMP_DISPLAY - - if (!newString.isEmpty()) { - int32_t offX = 0; // Allow optional arguments for x and y offset values, usage: - int32_t offY = 0; // [x,[y,]]filename.bmp - - if (newString.indexOf(',') > -1) { - String tmp = parseString(newString, 1); - validIntFromString(tmp, offX); - newString = parseStringToEndKeepCase(newString, 2); - - if (newString.indexOf(',') > -1) { - tmp = parseString(newString, 1); - validIntFromString(tmp, offY); - newString = parseStringToEndKeepCase(newString, 2); + // Check button-type bits (mask: 0x0F) to draw correct shape + if (!clearArea) { + drawButtonShape(buttonType, + nParams[2] + _xo, nParams[3] + _yo, nParams[4], nParams[5], + fillColor, borderColor); + } + + // Display caption? (or bitmap) + if (!clearArea && + (buttonLayout != Button_layout_e::NoCaption)) { + int16_t x1, y1; + uint16_t w1, h1, w2, h2; + String newString; + + // Determine alignment parameters + if ((nParams[0] == 1) || (nParams[0] == -1)) { // 1 = on+enabled, -1 = on+disabled + newString = sParams[12].isEmpty() ? sParams[6] : sParams[12]; + } else { + newString = sParams[13].isEmpty() ? sParams[6] : sParams[13]; + } + newString = AdaGFXparseTemplate(newString, 20); + + _display->setTextSize(fontScale); // set scaling + _display->getTextBounds(newString, 0, 0, &x1, &y1, &w1, &h1); // get caption length and height in pixels + _display->getTextBounds(F(" "), 0, 0, &x1, &y1, &w2, &h2); // measure space width for little margins + + // Check button-alignment bits (mask 0xF0) for caption placement, modifies the x/y arguments passed! + // Little margin is: from left/right: half of the width of a space, from top/bottom: half of height of the font used + + switch (buttonLayout) { + case Button_layout_e::CenterAligned: + nParams[2] += (nParams[4] / 2 - w1 / 2); // center horizontically + nParams[3] += (nParams[5] / 2 - h1 / 2); // center vertically + break; + case Button_layout_e::LeftAligned: + nParams[2] += w2 / 2; // A little margin from left + nParams[3] += (nParams[5] / 2 - h1 / 2); // center vertically + break; + case Button_layout_e::TopAligned: + nParams[2] += (nParams[4] / 2 - w1 / 2); // center horizontically + nParams[3] += h1 / 2; // A little margin from top + break; + case Button_layout_e::RightAligned: + nParams[2] += (nParams[4] - w1) - w2 / 2; // right-align + a little margin + nParams[3] += (nParams[5] / 2 - h1 / 2); // center vertically + break; + case Button_layout_e::BottomAligned: + nParams[2] += (nParams[4] / 2 - w1 / 2); // center horizontically + nParams[3] += (nParams[5] - h1 * 1.5); // bottom align + a little margin + break; + case Button_layout_e::LeftTopAligned: + nParams[2] += w2 / 2; // A little margin from left + nParams[3] += h1 / 2; // A little margin from top + break; + case Button_layout_e::RightTopAligned: + nParams[2] += (nParams[4] - w1) - w2 / 2; // right-align + a little margin + nParams[3] += h1 / 2; // A little margin from top + break; + case Button_layout_e::RightBottomAligned: + nParams[2] += (nParams[4] - w1) - w2 / 2; // right-align + a little margin + nParams[3] += (nParams[5] - h1 * 1.5); // bottom align + a little margin + break; + case Button_layout_e::LeftBottomAligned: + nParams[2] += w2 / 2; // A little margin from left + nParams[3] += (nParams[5] - h1 * 1.5); // bottom align + a little margin + break; + case Button_layout_e::Bitmap: + { // Use ON/OFF caption to specify (full) bitmap filename + # if ADAGFX_ENABLE_BMP_DISPLAY + + if (!newString.isEmpty()) { + int32_t offX = 0; // Allow optional arguments for x and y offset values, usage: + int32_t offY = 0; // [x,[y,]]filename.bmp + + if (newString.indexOf(',') > -1) { + String tmp = parseString(newString, 1); + validIntFromString(tmp, offX); + newString = parseStringToEndKeepCase(newString, 2); + + if (newString.indexOf(',') > -1) { + tmp = parseString(newString, 1); + validIntFromString(tmp, offY); + newString = parseStringToEndKeepCase(newString, 2); + } + } + success = showBmp(newString, nParams[2] + _xo + offX, nParams[3] + _yo + offY); } + # endif // if ADAGFX_ENABLE_BMP_DISPLAY + { + success = false; + } + break; } - success = showBmp(newString, nParams[2] + _xo + offX, nParams[3] + _yo + offY); - } else - # endif // if ADAGFX_ENABLE_BMP_DISPLAY - { - success = false; + case Button_layout_e::NoCaption: + case Button_layout_e::Alignment_MAX: + break; } - break; - } - case Button_layout_e::NoCaption: - case Button_layout_e::Alignment_MAX: - break; - } - if ((buttonLayout != Button_layout_e::NoCaption) && - (buttonLayout != Button_layout_e::Bitmap)) { - // Set position and colors, then print - _display->setCursor(nParams[2] + _xo, nParams[3] + _yo); - _display->setTextColor(textColor, textColor); // transparent bg results in button color - _display->print(newString); + if ((buttonLayout != Button_layout_e::NoCaption) && + (buttonLayout != Button_layout_e::Bitmap)) { + // Set position and colors, then print + _display->setCursor(nParams[2] + _xo, nParams[3] + _yo); + _display->setTextColor(textColor, textColor); // transparent bg results in button color + _display->print(newString); - // restore colors - _display->setTextColor(_fgcolor, _bgcolor); + // restore colors + _display->setTextColor(_fgcolor, _bgcolor); + } + + // restore font scaling + _display->setTextSize(_fontscaling); + } } + } + break; + # endif // if ADAGFX_ENABLE_BUTTON_DRAW + # if ADAGFX_ENABLE_FRAMED_WINDOW + case adagfx_commands_e::win: // win: select window by id - // restore font scaling - _display->setTextSize(_fontscaling); + if ((argCount >= 1) && (argCount <= 2)) { + success = selectWindow(nParams[0], nParams[1]); } - } - } - # endif // if ADAGFX_ENABLE_BUTTON_DRAW - # if ADAGFX_ENABLE_FRAMED_WINDOW - else if ((adagfx_commands_e::win == subcmd) && (argCount >= 1) && (argCount <= 2)) { // win: select window by id - success = selectWindow(nParams[0], nParams[1]); - } - else if ((adagfx_commands_e::defwin == subcmd) && (argCount >= 5) && (argCount <= 6)) { // defwin: define window - const int8_t rot = _rotation; - # if ADAGFX_ARGUMENT_VALIDATION - const int16_t curWin = getWindow(); + break; + case adagfx_commands_e::defwin: // defwin: define window - if (curWin != 0) { selectWindow(0); } // Validate against raw window coordinates + if ((argCount >= 5) && (argCount <= 6)) { + const int8_t rot = _rotation; + # if ADAGFX_ARGUMENT_VALIDATION + const int16_t curWin = getWindow(); - if (argCount == 6) { setRotation(nParams[5]); } // Use requested rotation + if (curWin != 0) { selectWindow(0); } // Validate against raw window coordinates - if (invCoord_0_1 || - invCoord_0_2_1_3) { - success = false; + if (argCount == 6) { setRotation(nParams[5]); } // Use requested rotation - if (curWin != 0) { selectWindow(curWin); } // restore current window + if (invCoord_0_1 || + invCoord_0_2_1_3) { + if (curWin != 0) { selectWindow(curWin); } // restore current window - if (rot != _rotation) { setRotation(rot); } // Restore rotation - } else - # endif // if ADAGFX_ARGUMENT_VALIDATION - { - # if ADAGFX_ARGUMENT_VALIDATION - - if (curWin != 0) { selectWindow(curWin); } // restore current window - # endif // if ADAGFX_ARGUMENT_VALIDATION - - if (nParams[4] > 0) { // Window 0 is the raw window, having the full size, created at initialization of this - // helper instance - # ifndef BUILD_NO_DEBUG - int16_t win = // avoid compiler warning - # endif // ifndef BUILD_NO_DEBUG - defineWindow(nParams[0], - nParams[1], - nParams[2], - nParams[3], - nParams[4], - argCount == 6 ? nParams[5] : _rotation); - # ifndef BUILD_NO_DEBUG - - if (loglevelActiveFor(LOG_LEVEL_INFO)) { - addLogMove(LOG_LEVEL_INFO, strformat(F("AdaGFX defined window id: %d"), win)); - } - # endif // ifndef BUILD_NO_DEBUG + if (rot != _rotation) { setRotation(rot); } // Restore rotation + } else + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + # if ADAGFX_ARGUMENT_VALIDATION - if (rot != _rotation) { setRotation(rot); } // Restore rotation, also update new window - } else { - success = false; + if (curWin != 0) { selectWindow(curWin); } // restore current window + # endif // if ADAGFX_ARGUMENT_VALIDATION + + if (nParams[4] > 0) { // Window 0 is the raw window, having the full size, created at initialization of this + success = true; + + // helper instance + # ifndef BUILD_NO_DEBUG + int16_t win = // avoid compiler warning + # endif // ifndef BUILD_NO_DEBUG + defineWindow(nParams[0], + nParams[1], + nParams[2], + nParams[3], + nParams[4], + argCount == 6 ? nParams[5] : _rotation); + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + addLogMove(LOG_LEVEL_INFO, strformat(F("AdaGFX defined window id: %d"), win)); + } + # endif // ifndef BUILD_NO_DEBUG + + if (rot != _rotation) { setRotation(rot); } // Restore rotation, also update new window + } + + // logWindows(F(" deFwin ")); // Use for debugging only? + } } + break; + case adagfx_commands_e::delwin: // delwin: delete window, don't delete window 0 - // logWindows(F(" deFwin ")); // Use for debugging only? - } - } - else if ((adagfx_commands_e::delwin == subcmd) && (argCount == 1) && (nParams[0] > 0)) { // delwin: delete window, don't delete window 0 - // logWindows(F(" deLwin ")); // use for debugging only + if ((argCount == 1) && (nParams[0] > 0)) { + // logWindows(F(" deLwin ")); // use for debugging only - success = deleteWindow(nParams[0]); - } - # endif // if ADAGFX_ENABLE_FRAMED_WINDOW - else { - success = false; + success = deleteWindow(nParams[0]); + } + break; + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW } return success; @@ -2702,7 +2788,7 @@ void AdafruitGFX_helper::setRotation(uint8_t m) { } # if ADAGFX_ENABLE_FRAMED_WINDOW - for (uint8_t i = 0; i < _windows.size(); i++) { // Swap x/y for all matching windows + for (uint8_t i = 0; i < _windows.size(); ++i) { // Swap x/y for all matching windows switch (rotation) { case 0: // 0 degrees _windows[i].top_left.x = _windows[i].org_top_left.x; // All original @@ -2902,7 +2988,7 @@ bool AdafruitGFX_helper::showBmp(const String& filename, (quantized = (uint16_t *)malloc(colors * sizeof(uint16_t)))) { if (depth < 16) { // Load and quantize color table - for (uint16_t c = 0; c < colors; c++) { + for (uint16_t c = 0; c < colors; ++c) { b = file.read(); g = file.read(); r = file.read(); @@ -2912,7 +2998,7 @@ bool AdafruitGFX_helper::showBmp(const String& filename, } } - for (row = 0; row < loadHeight; row++) { // For each scanline... + for (row = 0; row < loadHeight; ++row) { // For each scanline... delay(0); // Keep ESP8266 happy // Seek to start of scan line. It might seem labor-intensive @@ -2943,7 +3029,7 @@ bool AdafruitGFX_helper::showBmp(const String& filename, srcidx = sizeof sdbuf; // Force buffer reload } - for (col = 0; col < loadWidth; col++) { // For each pixel... + for (col = 0; col < loadWidth; ++col) { // For each pixel... if (srcidx >= sizeof sdbuf) { // Time to load more? if (transact && canTransact) { _tft->dmaWait(); @@ -2968,7 +3054,7 @@ bool AdafruitGFX_helper::showBmp(const String& filename, } else { // loop over buffer - for (uint16_t p = 0; p < destidx; p++) { + for (uint16_t p = 0; p < destidx; ++p) { _display->drawPixel(x + p, y + drow, dest[p]); } } @@ -3017,7 +3103,7 @@ bool AdafruitGFX_helper::showBmp(const String& filename, } else { // loop over buffer if (destidx) { - for (uint16_t p = 0; p < destidx; p++) { + for (uint16_t p = 0; p < destidx; ++p) { _display->drawPixel(x + p, y + drow, dest[p]); if (p % 100 == 0) { delay(0); } @@ -3111,7 +3197,7 @@ bool AdafruitGFX_helper::selectWindow(const uint8_t& windowId, int16_t AdafruitGFX_helper::getWindowIndex(const int16_t& windowId) { size_t result = 0; - for (auto win = _windows.begin(); win != _windows.end(); win++, result++) { + for (auto win = _windows.begin(); win != _windows.end(); win++, ++result) { if ((*win).id == windowId) { break; } From 339f0f656c356d3063f8241e113476072ff3880b Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Tue, 16 Apr 2024 23:43:26 +0200 Subject: [PATCH 05/13] [AdaGFX Helper] Add TomThumb 3x5 font --- docs/source/Plugin/AdaGFX_commands.repl | 1 + src/src/Helpers/AdafruitGFX_helper.cpp | 17 ++++++++++++++++- src/src/Helpers/AdafruitGFX_helper.h | 11 ++++++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/docs/source/Plugin/AdaGFX_commands.repl b/docs/source/Plugin/AdaGFX_commands.repl index 84255a4f19..cf7b1ee1fa 100644 --- a/docs/source/Plugin/AdaGFX_commands.repl +++ b/docs/source/Plugin/AdaGFX_commands.repl @@ -116,6 +116,7 @@ * *sevenseg24* A rather large 7-segment 21 * 48 font * *sevenseg18* A somewhat less large 7-segment 16 * 34 font * *freesans* A sans-serif 10 * 21 font + * *tomthumb* A small 3 * 5 font, for use on a 5x29 NeoPixel display. Not available in limited builds. Usually disabled fonts: (can be enabled in a Custom build, default enabled in the MAX builds) diff --git a/src/src/Helpers/AdafruitGFX_helper.cpp b/src/src/Helpers/AdafruitGFX_helper.cpp index bc1f3e5e8d..c998adf08e 100644 --- a/src/src/Helpers/AdafruitGFX_helper.cpp +++ b/src/src/Helpers/AdafruitGFX_helper.cpp @@ -11,6 +11,11 @@ # include "../Static/Fonts/Seven_Segment24pt7b.h" # include "../Static/Fonts/Seven_Segment18pt7b.h" # include "../Static/Fonts/FreeSans9pt7b.h" +# ifdef ADAGFX_FONTS_EXTRA_5PT_INCLUDED +# ifdef ADAGFX_FONTS_EXTRA_5PT_TOMTHUMB +# include // Available in Adafruit_GFX library +# endif // ifdef ADAGFX_FONTS_EXTRA_5PT_TOMTHUMB +# endif // ifdef ADAGFX_FONTS_EXTRA_5PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_8PT_ANGELINA # include "../Static/Fonts/angelina8pt7b.h" @@ -836,6 +841,11 @@ enum class adagfx_commands_e : int8_t { // *** Don't forget to add the | separator at the end of a (new) font-name! (except for the last one in the list) const char adagfx_fonts[] PROGMEM = "default|sevenseg24|sevenseg18|freesans|" + # ifdef ADAGFX_FONTS_EXTRA_5PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_5PT_TOMTHUMB + "tomthumb|" + # endif // ifdef ADAGFX_FONTS_EXTRA_5PT_TOMTHUMB + # endif // ifdef ADAGFX_FONTS_EXTRA_5PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_8PT_ANGELINA "angelina8prop|" @@ -956,6 +966,11 @@ constexpr tFontArgs fontargs[] = { &Seven_Segment24pt7b, 21, 42, 35, true }, { &Seven_Segment18pt7b, 16, 33, 26, true }, { &FreeSans9pt7b, 10, 16, 12, false }, + # ifdef ADAGFX_FONTS_EXTRA_5PT_INCLUDED + # ifdef ADAGFX_FONTS_EXTRA_5PT_TOMTHUMB + { &TomThumb, 5, 6, 5, false }, + # endif // ifdef ADAGFX_FONTS_EXTRA_5PT_TOMTHUMB + # endif // ifdef ADAGFX_FONTS_EXTRA_5PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_8PT_ANGELINA { &angelina8pt7b, 6, 16, 12, true }, @@ -1886,7 +1901,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # if ADAGFX_ARGUMENT_VALIDATION const int16_t curWin = getWindow(); - if (curWin != 0) { selectWindow(0); } // Validate against raw window coordinates + if (curWin != 0) { selectWindow(0); } // Validate against raw window coordinates if (argCount == 6) { setRotation(nParams[5]); } // Use requested rotation diff --git a/src/src/Helpers/AdafruitGFX_helper.h b/src/src/Helpers/AdafruitGFX_helper.h index df8d81a0fc..018e958137 100644 --- a/src/src/Helpers/AdafruitGFX_helper.h +++ b/src/src/Helpers/AdafruitGFX_helper.h @@ -12,6 +12,8 @@ ***************************************************************************/ /************ * Changelog: + * 2024-04-16 tonhuisman: Add font TomThumb, 3x5 pixel font to be used on a NeoMatrix 5x29 display. Disabled by LIMIT_BUILD_SIZE. + * This font is already available via the Adafruit_GFX_Library * 2023-12-30 tonhuisman: Optimization of font handling, also reducing code-size * Add some additional 7-segment/LCD-like fonts (18 pt enabled by default for ESP32 builds using this helper) * - sevenseg18b (7segment 18 pt) (very few non-alphanumeric characters, slightly slanted) @@ -98,6 +100,7 @@ # define ADAGFX_ENABLE_GET_CONFIG_VALUE 1 // Enable getting values features # endif // ifndef ADAGFX_ENABLE_GET_CONFIG_VALUE +# define ADAGFX_FONTS_EXTRA_5PT_INCLUDED // 1 extra 5pt font, should only be enabled in non-LIMIT_BUILD_SIZE builds, adds ~0.3 kB // # define ADAGFX_FONTS_EXTRA_8PT_INCLUDED // 8 extra 8pt fonts, should probably only be enabled in a private custom build, adds ~15.4 kB // # define ADAGFX_FONTS_EXTRA_12PT_INCLUDED // 9 extra 12pt fonts, should probably only be enabled in a private custom build, adds ~28 kB // # define ADAGFX_FONTS_EXTRA_16PT_INCLUDED // 5 extra 16pt fonts, should probably only be enabled in a private custom build, adds ~19.9 kB @@ -105,8 +108,11 @@ // # define ADAGFX_FONTS_EXTRA_20PT_INCLUDED // 1 extra 20pt fonts, should probably only be enabled in a private custom build, adds ~5.3 kB // # define ADAGFX_FONTS_EXTRA_24PT_INCLUDED // 2 extra 24pt fonts, should probably only be enabled in a private custom build, adds ~11.1 kB +// To enable/disable 8pt fonts separately: (will only be enabled if ADAGFX_FONTS_EXTRA_5PT_INCLUDED is defined) +# define ADAGFX_FONTS_EXTRA_5PT_TOMTHUMB + // To enable/disable 8pt fonts separately: (will only be enabled if ADAGFX_FONTS_EXTRA_8PT_INCLUDED is defined) -# define ADAGFX_FONTS_EXTRA_8PT_ANGELINA // This font is proportinally spaced! +# define ADAGFX_FONTS_EXTRA_8PT_ANGELINA // This font is proportinally spaced! # define ADAGFX_FONTS_EXTRA_8PT_NOVAMONO # define ADAGFX_FONTS_EXTRA_8PT_UNISPACE # define ADAGFX_FONTS_EXTRA_8PT_UNISPACEITALIC @@ -181,6 +187,9 @@ # endif // ifdef LIMIT_BUILD_SIZE # ifdef PLUGIN_SET_MAX // Include all fonts in MAX builds +# ifndef ADAGFX_FONTS_EXTRA_5PT_INCLUDED +# define ADAGFX_FONTS_EXTRA_5PT_INCLUDED +# endif // ifndef ADAGFX_FONTS_EXTRA_5PT_INCLUDED # ifndef ADAGFX_FONTS_EXTRA_8PT_INCLUDED # define ADAGFX_FONTS_EXTRA_8PT_INCLUDED # endif // ifndef ADAGFX_FONTS_EXTRA_8PT_INCLUDED From 8b39b0c358234ceb54bbf109e23be58ec1ff5eed Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Tue, 16 Apr 2024 23:45:09 +0200 Subject: [PATCH 06/13] [Build] Add ESP32-S3 4MB NeoPixel LittleFS build, including AHT2x (P105) for TinyTronics Smart Home display unit --- platformio_esp32s3_envs.ini | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/platformio_esp32s3_envs.ini b/platformio_esp32s3_envs.ini index 284b717885..0be1936677 100644 --- a/platformio_esp32s3_envs.ini +++ b/platformio_esp32s3_envs.ini @@ -137,6 +137,15 @@ build_flags = ${esp32s3_common.build_flags} -DFEATURE_SD=1 -DPLUGIN_NEOPIXEL_COLLECTION +[env:neopixel_ESP32s3_4M316k_LittleFS_CDC] +extends = esp32s3_common_LittleFS +board = esp32s3cdc-qio_qspi +build_flags = ${esp32s3_common_LittleFS.build_flags} + -DFEATURE_ARDUINO_OTA=1 + -DFEATURE_SD=1 + -DPLUGIN_NEOPIXEL_COLLECTION + -DUSE_P105 + [env:custom_ESP32s3_8M1M_LittleFS_CDC_ETH] extends = esp32s3_common_LittleFS From b4a8196fb783d2a8d9f16c8e0f823d98fc8e0446 Mon Sep 17 00:00:00 2001 From: TD-er Date: Wed, 17 Apr 2024 10:11:09 +0200 Subject: [PATCH 07/13] [AdaGFX Helper] Make "1" in TomThumb font as wide as all other numbers --- lib/Adafruit_GFX_Library/Fonts/TomThumb.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/Adafruit_GFX_Library/Fonts/TomThumb.h b/lib/Adafruit_GFX_Library/Fonts/TomThumb.h index 08b20800e2..7d49239cf4 100644 --- a/lib/Adafruit_GFX_Library/Fonts/TomThumb.h +++ b/lib/Adafruit_GFX_Library/Fonts/TomThumb.h @@ -69,7 +69,7 @@ const uint8_t TomThumbBitmaps[] PROGMEM = { 0x80, /* 0x2E period */ 0x25, 0x48, /* 0x2F slash */ 0x76, 0xDC, /* 0x30 zero */ - 0x75, 0x40, /* 0x31 one */ + 0x59, 0x2E, /* 0x31 one */ 0xC5, 0x4E, /* 0x32 two */ 0xC5, 0x1C, /* 0x33 three */ 0xB7, 0x92, /* 0x34 four */ @@ -279,7 +279,7 @@ const GFXglyph TomThumbGlyphs[] PROGMEM = { {22, 1, 1, 2, 0, -1}, /* 0x2E period */ {23, 3, 5, 4, 0, -5}, /* 0x2F slash */ {25, 3, 5, 4, 0, -5}, /* 0x30 zero */ - {27, 2, 5, 3, 0, -5}, /* 0x31 one */ + {27, 3, 5, 4, 0, -5}, /* 0x31 one */ {29, 3, 5, 4, 0, -5}, /* 0x32 two */ {31, 3, 5, 4, 0, -5}, /* 0x33 three */ {33, 3, 5, 4, 0, -5}, /* 0x34 four */ From ff96c7102bc4bc7fa1c944d49068f50ea87cdf06 Mon Sep 17 00:00:00 2001 From: TD-er Date: Wed, 17 Apr 2024 11:26:14 +0200 Subject: [PATCH 08/13] [NeoPixel] Add AHT20 support to ESP32 NeoPixel build. --- src/src/CustomBuild/define_plugin_sets.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/src/CustomBuild/define_plugin_sets.h b/src/src/CustomBuild/define_plugin_sets.h index f0ee7eec64..abdf6b392c 100644 --- a/src/src/CustomBuild/define_plugin_sets.h +++ b/src/src/CustomBuild/define_plugin_sets.h @@ -1967,6 +1967,12 @@ To create/register a plugin, you have to : #endif #ifndef USES_P131 #define USES_P131 // NeoMatrix + #ifdef ESP32 + #define TOMTHUMB_USE_EXTENDED 1 + #endif + #endif + #if !defined(USES_P105) && defined(ESP32) + #define USES_P105 // AHT10/20/21 (used in TinyTronics Smart Home RGB LED Matrix) #endif #if !defined(USES_P137) && defined(ESP32) #define USES_P137 // AXP192 From 50bc8da4e02efca487a08c013be8a2f457195a28 Mon Sep 17 00:00:00 2001 From: TD-er Date: Wed, 17 Apr 2024 13:33:26 +0200 Subject: [PATCH 09/13] [NeoPixel Matrix] Fix trailing pixels on scrolling text --- src/src/PluginStructs/P131_data_struct.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/src/PluginStructs/P131_data_struct.cpp b/src/src/PluginStructs/P131_data_struct.cpp index af801d36ce..bb5856bd75 100644 --- a/src/src/PluginStructs/P131_data_struct.cpp +++ b/src/src/PluginStructs/P131_data_struct.cpp @@ -307,11 +307,11 @@ void P131_data_struct::display_content(struct EventStruct *event, _bgcolor); } - if (!content[x].rightScroll && (content[x].pixelPos + content[x].length < _xpix) && (content[x].stepWidth > 1)) { + if (!content[x].rightScroll && (content[x].pixelPos + content[x].length < _xpix) && (content[x].stepWidth >= 1)) { // Clear right from text - matrix->fillRect(content[x].pixelPos + content[x].length + 1, + matrix->fillRect(content[x].pixelPos + content[x].length, yPos, - content[x].stepWidth - 1, + content[x].stepWidth, h, _bgcolor); } From c20705bd560d78a49ba1526f020492fd503e6437 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Wed, 17 Apr 2024 20:24:07 +0200 Subject: [PATCH 10/13] [Build] ESP32-S3 4MB NeoPixel LittleFS build, remove typo, no longer needed here --- platformio_esp32s3_envs.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/platformio_esp32s3_envs.ini b/platformio_esp32s3_envs.ini index 0be1936677..4d852a3483 100644 --- a/platformio_esp32s3_envs.ini +++ b/platformio_esp32s3_envs.ini @@ -144,7 +144,6 @@ build_flags = ${esp32s3_common_LittleFS.build_flags} -DFEATURE_ARDUINO_OTA=1 -DFEATURE_SD=1 -DPLUGIN_NEOPIXEL_COLLECTION - -DUSE_P105 [env:custom_ESP32s3_8M1M_LittleFS_CDC_ETH] From 78d0179ae466fa6dcb75ba486db7ccba5ad3ce6c Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Wed, 17 Apr 2024 23:15:06 +0200 Subject: [PATCH 11/13] [AdaGFX] Add Default font option and support functions --- src/src/Helpers/AdafruitGFX_helper.cpp | 152 ++++++++++++++++++------- src/src/Helpers/AdafruitGFX_helper.h | 17 ++- 2 files changed, 128 insertions(+), 41 deletions(-) diff --git a/src/src/Helpers/AdafruitGFX_helper.cpp b/src/src/Helpers/AdafruitGFX_helper.cpp index c998adf08e..276a6f9d65 100644 --- a/src/src/Helpers/AdafruitGFX_helper.cpp +++ b/src/src/Helpers/AdafruitGFX_helper.cpp @@ -617,10 +617,11 @@ AdafruitGFX_helper::AdafruitGFX_helper(Adafruit_GFX *display, const uint16_t fgcolor, const uint16_t bgcolor, const bool useValidation, - const bool textBackFill) + const bool textBackFill, + const uint8_t defaultFontId) : _display(display), _trigger(trigger), _res_x(res_x), _res_y(res_y), _colorDepth(colorDepth), _textPrintMode(textPrintMode), _fontscaling(fontscaling), _fgcolor(fgcolor), _bgcolor(bgcolor), - _useValidation(useValidation), _textBackFill(textBackFill) + _useValidation(useValidation), _textBackFill(textBackFill), _defaultFontId(defaultFontId) { addLog(LOG_LEVEL_INFO, F("AdaGFX_helper: GFX Init.")); } @@ -636,10 +637,11 @@ AdafruitGFX_helper::AdafruitGFX_helper(Adafruit_SPITFT *display, const uint16_t fgcolor, const uint16_t bgcolor, const bool useValidation, - const bool textBackFill) + const bool textBackFill, + const uint8_t defaultFontId) : _tft(display), _trigger(trigger), _res_x(res_x), _res_y(res_y), _colorDepth(colorDepth), _textPrintMode(textPrintMode), _fontscaling(fontscaling), _fgcolor(fgcolor), _bgcolor(bgcolor), - _useValidation(useValidation), _textBackFill(textBackFill) + _useValidation(useValidation), _textBackFill(textBackFill), _defaultFontId(defaultFontId) { _display = _tft; addLog(LOG_LEVEL_INFO, F("AdaGFX_helper: TFT Init.")); @@ -671,6 +673,9 @@ void AdafruitGFX_helper::initialize() { if (_fontscaling < 1) { _fontscaling = 1; } if (nullptr != _display) { + # if ADAGFX_FONTS_INCLUDED + setFontById(_defaultFontId); + # endif // if ADAGFX_FONTS_INCLUDED _display->setTextSize(_fontscaling); _display->setTextColor(_fgcolor, _bgcolor); // initialize text colors _display->setTextWrap(_textPrintMode == AdaGFXTextPrintMode::ContinueToNextLine); @@ -949,128 +954,197 @@ struct tFontArgs { uint8_t width, uint8_t height, int8_t offset, - bool proportional) - : _f(f), _width(width), _height(height), _offset(offset), _proportional(proportional) {} + bool proportional, + uint8_t fontId) + : _f(f), _width(width), _height(height), _offset(offset), + _proportional(proportional), _fontId(fontId) {} const GFXfont *_f; uint8_t _width; uint8_t _height; int8_t _offset; bool _proportional; + uint8_t _fontId; }; /* *INDENT-OFF* */ constexpr tFontArgs fontargs[] = { - { nullptr, 9, 6, 0, false }, - { &Seven_Segment24pt7b, 21, 42, 35, true }, - { &Seven_Segment18pt7b, 16, 33, 26, true }, - { &FreeSans9pt7b, 10, 16, 12, false }, + { nullptr, 9, 6, 0, false, 0u }, + { &Seven_Segment24pt7b, 21, 42, 35, true, 1u }, + { &Seven_Segment18pt7b, 16, 33, 26, true, 2u }, + { &FreeSans9pt7b, 10, 16, 12, false, 3u }, # ifdef ADAGFX_FONTS_EXTRA_5PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_5PT_TOMTHUMB - { &TomThumb, 5, 6, 5, false }, + { &TomThumb, 5, 6, 5, false, 4u }, # endif // ifdef ADAGFX_FONTS_EXTRA_5PT_TOMTHUMB # endif // ifdef ADAGFX_FONTS_EXTRA_5PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_8PT_ANGELINA - { &angelina8pt7b, 6, 16, 12, true }, + { &angelina8pt7b, 6, 16, 12, true, 5u }, # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ANGELINA # ifdef ADAGFX_FONTS_EXTRA_8PT_NOVAMONO - { &NovaMono8pt7b, 9, 16, 12, false }, + { &NovaMono8pt7b, 9, 16, 12, false, 6u }, # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_NOVAMONO # ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACE - { &unispace8pt7b, 13, 24, 20, false }, + { &unispace8pt7b, 13, 24, 20, false, 7u }, # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACE # ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACEITALIC - { &unispace_italic8pt7b, 13, 24, 20, false }, + { &unispace_italic8pt7b, 13, 24, 20, false, 8u }, # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_UNISPACEITALIC # ifdef ADAGFX_FONTS_EXTRA_8PT_WHITERABBiT - { &whitrabt8pt7b, 10, 16, 12, false }, + { &whitrabt8pt7b, 10, 16, 12, false, 9u }, # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_WHITERABBiT # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTO - { &Roboto_Regular8pt7b, 10, 16, 12, true }, + { &Roboto_Regular8pt7b, 10, 16, 12, true, 10u }, # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTO # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOCONDENSED - { &RobotoCondensed_Regular8pt7b, 9, 16, 12, true }, + { &RobotoCondensed_Regular8pt7b, 9, 16, 12, true, 11u }, # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOCONDENSED # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOMONO - { &RobotoMono_Regular8pt7b, 10, 16, 12, false }, + { &RobotoMono_Regular8pt7b, 10, 16, 12, false, 12u }, # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOMONO # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_12PT_ANGELINA - { &angelina12pt7b, 8, 22, 18, true }, + { &angelina12pt7b, 8, 22, 18, true, 13u }, # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ANGELINA # ifdef ADAGFX_FONTS_EXTRA_12PT_NOVAMONO - { &NovaMono12pt7b, 13, 26, 22, false }, + { &NovaMono12pt7b, 13, 26, 22, false, 14u }, # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_NOVAMONO # ifdef ADAGFX_FONTS_EXTRA_12PT_REPETITIONSCROLLiNG - { &RepetitionScrolling12pt7b, 13, 22, 18, false }, + { &RepetitionScrolling12pt7b, 13, 22, 18, false, 15u }, # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_REPETITIONSCROLLiNG # ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACE - { &unispace12pt7b, 18, 30, 26, false }, + { &unispace12pt7b, 18, 30, 26, false, 16u }, # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACE # ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACEITALIC - { &unispace_italic12pt7b, 18, 30, 26, false }, + { &unispace_italic12pt7b, 18, 30, 26, false, 17u }, # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_UNISPACEITALIC # ifdef ADAGFX_FONTS_EXTRA_12PT_WHITERABBiT - { &whitrabt12pt7b, 13, 20, 16, false }, + { &whitrabt12pt7b, 13, 20, 16, false, 18u }, # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_WHITERABBiT # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTO - { &Roboto_Regular12pt7b, 13, 20, 16, true }, + { &Roboto_Regular12pt7b, 13, 20, 16, true, 19u }, # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTO # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOCONDENSED - { &RobotoCondensed_Regular12pt7b, 13, 20, 16, true }, + { &RobotoCondensed_Regular12pt7b, 13, 20, 16, true, 20u }, # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOCONDENSED # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOMONO - { &RobotoMono_Regular12pt7b, 13, 20, 16, false }, + { &RobotoMono_Regular12pt7b, 13, 20, 16, false, 21u }, # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOMONO # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_16PT_AMERIKASANS - { &AmerikaSans16pt7b, 17, 30, 26, true }, + { &AmerikaSans16pt7b, 17, 30, 26, true, 22u }, # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_AMERIKASANS # ifdef ADAGFX_FONTS_EXTRA_16PT_WHITERABBiT - { &whitrabt16pt7b, 18, 26, 22, false }, + { &whitrabt16pt7b, 18, 26, 22, false, 23u }, # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_WHITERABBiT # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTO - { &Roboto_Regular16pt7b, 18, 27, 23, true }, + { &Roboto_Regular16pt7b, 18, 27, 23, true, 24u }, # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTO # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOCONDENSED - { &RobotoCondensed_Regular16pt7b, 18, 27, 23, true }, + { &RobotoCondensed_Regular16pt7b, 18, 27, 23, true, 25u }, # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOCONDENSED # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOMONO - { &RobotoMono_Regular16pt7b, 18, 27, 23, false }, + { &RobotoMono_Regular16pt7b, 18, 27, 23, false, 26u }, # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOMONO # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_18PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_18PT_WHITERABBiT - { &whitrabt18pt7b, 21, 30, 26, false }, + { &whitrabt18pt7b, 21, 30, 26, false, 27u }, # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_WHITERABBiT # ifdef ADAGFX_FONTS_EXTRA_18PT_SEVENSEG_B - { &_7segment18pt7b, 21, 30, 0, false }, + { &_7segment18pt7b, 21, 30, 0, false, 28u }, # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_SEVENSEG_B # ifdef ADAGFX_FONTS_EXTRA_18PT_LCD14COND - { &LCD14cond18pt7b, 24, 30, 0, false }, + { &LCD14cond18pt7b, 24, 30, 0, false, 29u }, # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_LCD14COND # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_20PT_WHITERABBiT - { &whitrabt20pt7b, 24, 32, 28, false }, + { &whitrabt20pt7b, 24, 32, 28, false, 30u }, # endif // ifdef ADAGFX_FONTS_EXTRA_20PT_WHITERABBiT # endif // ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_24PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_24PT_SEVENSEG_B - { &_7segment24pt7b, 26, 34, 0, false }, + { &_7segment24pt7b, 26, 34, 0, false, 31u }, # endif // ifdef ADAGFX_FONTS_EXTRA_24PT_SEVENSEG_B # ifdef ADAGFX_FONTS_EXTRA_24PT_LCD14COND - { &LCD14cond24pt7b, 26, 34, 0, false }, + { &LCD14cond24pt7b, 26, 34, 0, false, 32u }, # endif // ifdef ADAGFX_FONTS_EXTRA_24PT_LCD14COND # endif // ifdef ADAGFX_FONTS_EXTRA_24PT_INCLUDED }; /* *INDENT-ON* */ # endif // if ADAGFX_FONTS_INCLUDED +String AdaGFXgetFontName(uint8_t fontId) { + # if ADAGFX_FONTS_INCLUDED + constexpr uint32_t font_max = NR_ELEMENTS(fontargs); + + if (fontId < font_max) { + const uint32_t idx = AdaGFXgetFontIndexForFontId(fontId); + char tmp[30]{}; // Longest name so far is 23 + \0 + String fontName(GetTextIndexed(tmp, sizeof(tmp), idx, adagfx_fonts)); + return fontName; + } + # endif // if ADAGFX_FONTS_INCLUDED + return EMPTY_STRING; +} + +uint32_t AdaGFXgetFontIndexForFontId(uint8_t fontId) { + # if ADAGFX_FONTS_INCLUDED + constexpr uint32_t font_max = NR_ELEMENTS(fontargs); + + if (fontId < font_max) { + for (uint32_t idx = 0; idx < font_max; ++idx) { + if (fontargs[idx]._fontId == fontId) { + return idx; + } + } + } + # endif // if ADAGFX_FONTS_INCLUDED + return 0; +} + +void AdaGFXFormDefaultFont(const __FlashStringHelper *id, + uint8_t selectedIndex) { + # if ADAGFX_FONTS_INCLUDED + constexpr uint32_t font_max = NR_ELEMENTS(fontargs); + + addRowLabel_tr_id(F("Default font"), id); + addSelector_Head(id); + + char tmp[30]{}; // Longest name so far is 23 + \0 + + for (uint32_t idx = 0; idx < font_max; ++idx) { + const bool selected = (fontargs[idx]._fontId == selectedIndex); + String fontName(GetTextIndexed(tmp, sizeof(tmp), idx, adagfx_fonts)); + addSelector_Item(fontName, + fontargs[idx]._fontId, + selected); + } + addSelector_Foot(); + # endif // if ADAGFX_FONTS_INCLUDED +} + +# if ADAGFX_FONTS_INCLUDED +void AdafruitGFX_helper::setFontById(uint8_t fontId) { + constexpr int font_max = NR_ELEMENTS(fontargs); + const int font_i = AdaGFXgetFontIndexForFontId(fontId); + + if ((font_i >= 0) && (font_i < font_max)) { + _display->setFont(fontargs[font_i]._f); + calculateTextMetrics(fontargs[font_i]._width, + fontargs[font_i]._height, + fontargs[font_i]._offset, + fontargs[font_i]._proportional); + } +} + +# endif // if ADAGFX_FONTS_INCLUDED + bool AdafruitGFX_helper::processCommand(const String& string) { bool success = false; diff --git a/src/src/Helpers/AdafruitGFX_helper.h b/src/src/Helpers/AdafruitGFX_helper.h index 018e958137..48ae8c9f44 100644 --- a/src/src/Helpers/AdafruitGFX_helper.h +++ b/src/src/Helpers/AdafruitGFX_helper.h @@ -12,6 +12,8 @@ ***************************************************************************/ /************ * Changelog: + * 2024-04-17 tonhuisman: Add AdaGFXFormDefaultFont() selector and some support functions + * Add default font selection at initialization * 2024-04-16 tonhuisman: Add font TomThumb, 3x5 pixel font to be used on a NeoMatrix 5x29 display. Disabled by LIMIT_BUILD_SIZE. * This font is already available via the Adafruit_GFX_Library * 2023-12-30 tonhuisman: Optimization of font handling, also reducing code-size @@ -414,6 +416,10 @@ uint16_t AdaGFXrgb565ToColor7(const uint16_t& color); // Convert rgb565 color to # endif // if ADAGFX_SUPPORT_7COLOR void AdaGFXFormLineSpacing(const __FlashStringHelper *id, uint8_t selectedIndex); +String AdaGFXgetFontName(uint8_t fontId); +uint32_t AdaGFXgetFontIndexForFontId(uint8_t fontId); +void AdaGFXFormDefaultFont(const __FlashStringHelper *id, + uint8_t selectedIndex); class AdafruitGFX_helper { public: @@ -428,7 +434,8 @@ class AdafruitGFX_helper { const uint16_t fgcolor = ADAGFX_WHITE, const uint16_t bgcolor = ADAGFX_BLACK, const bool useValidation = true, - const bool textBackFill = false); + const bool textBackFill = false, + const uint8_t defaultFontId = 0); # if ADAGFX_ENABLE_BMP_DISPLAY AdafruitGFX_helper(Adafruit_SPITFT *display, const String & trigger, @@ -440,7 +447,8 @@ class AdafruitGFX_helper { const uint16_t fgcolor = ADAGFX_WHITE, const uint16_t bgcolor = ADAGFX_BLACK, const bool useValidation = true, - const bool textBackFill = false); + const bool textBackFill = false, + const uint8_t defaultFontId = 0); # endif // if ADAGFX_ENABLE_BMP_DISPLAY virtual ~AdafruitGFX_helper() {} @@ -521,6 +529,10 @@ class AdafruitGFX_helper { bool deleteWindow(const uint8_t& windowId); # endif // if ADAGFX_ENABLE_FRAMED_WINDOW + #if ADAGFX_FONTS_INCLUDED + void setFontById(uint8_t fontId); + #endif + uint16_t getTextSize(const String& text, uint16_t & h); // return length and height in pixels using current font @@ -561,6 +573,7 @@ class AdafruitGFX_helper { uint16_t _bgcolor; bool _useValidation; bool _textBackFill; + uint8_t _defaultFontId; uint16_t _textcols = 0; uint16_t _textrows = 0; int16_t _lastX = 0; From 5da3c3c85e33ede4cb95919eab87ba9fe601f03d Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Wed, 17 Apr 2024 23:16:40 +0200 Subject: [PATCH 12/13] [P131] Add default font selector --- src/_P131_NeoPixelMatrix.ino | 7 ++++++- src/src/PluginStructs/P131_data_struct.cpp | 9 ++++++--- src/src/PluginStructs/P131_data_struct.h | 7 +++++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/_P131_NeoPixelMatrix.ino b/src/_P131_NeoPixelMatrix.ino index 17535107dc..0a17113cc8 100644 --- a/src/_P131_NeoPixelMatrix.ino +++ b/src/_P131_NeoPixelMatrix.ino @@ -7,6 +7,7 @@ // ####################################################################################################### /** Changelog: + * 2024-04-17 tonhuisman: Add selection of a default font to use. * 2023-10-03 tonhuisman: Optimizate alignment of settings struct, exclude some logging if BUILD_NO_DEBUG is defined * 2023-02-27 tonhuisman: Implement support for getting config values, see AdafruitGFX_Helper.h changelog for details * 2022-07-30 tonhuisman: Add commands to set scroll-options (settext, setscroll, setstep, setspeed, setempty, setright) @@ -158,6 +159,8 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) addFormNumericBox(F("Maximum allowed brightness"), F("maxbright"), P131_CONFIG_FLAG_GET_MAXBRIGHT, 1, 255); addUnit(F("1..255")); + AdaGFXFormDefaultFont(F("deffont"), P131_CONFIG_DEFAULT_FONT); + AdaGFXFormFontScaling(F("fontscale"), P131_CONFIG_FLAG_GET_FONTSCALE, 4); # ifdef P131_SHOW_SPLASH @@ -288,6 +291,7 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) P131_CONFIG_MATRIX_HEIGHT = getFormItemInt(F("mxheight")); P131_CONFIG_TILE_WIDTH = getFormItemInt(F("tlwidth")); P131_CONFIG_TILE_HEIGHT = getFormItemInt(F("tlheight")); + P131_CONFIG_DEFAULT_FONT = getFormItemInt(F("deffont")); // Bits are already in the correct order/configuration to be passed on to the constructor // Matrix bits @@ -382,7 +386,8 @@ boolean Plugin_131(uint8_t function, struct EventStruct *event, String& string) P131_CONFIG_FLAG_GET_BRIGHTNESS, P131_CONFIG_FLAG_GET_MAXBRIGHT, P131_CONFIG_GET_COLOR_FOREGROUND, - P131_CONFIG_GET_COLOR_BACKGROUND)); + P131_CONFIG_GET_COLOR_BACKGROUND, + P131_CONFIG_DEFAULT_FONT)); P131_data_struct *P131_data = static_cast(getPluginTaskData(event->TaskIndex)); success = (nullptr != P131_data) && P131_data->plugin_init(event); // Start the display diff --git a/src/src/PluginStructs/P131_data_struct.cpp b/src/src/PluginStructs/P131_data_struct.cpp index bb5856bd75..6dc8944649 100644 --- a/src/src/PluginStructs/P131_data_struct.cpp +++ b/src/src/PluginStructs/P131_data_struct.cpp @@ -31,10 +31,12 @@ P131_data_struct::P131_data_struct(uint8_t matrixWidth, uint8_t brightness, uint8_t maxbright, uint16_t fgcolor, - uint16_t bgcolor) + uint16_t bgcolor, + const uint8_t defaultFontId) : _matrixWidth(matrixWidth), _matrixHeight(matrixHeight), _tileWidth(tileWidth), _tileHeight(tileHeight), _pin(pin), _matrixType(matrixType), _ledType(ledType), _rotation(rotation), _fontscaling(fontscaling), _textmode(textmode), - _commandTrigger(commandTrigger), _brightness(brightness), _maxbright(maxbright), _fgcolor(fgcolor), _bgcolor(bgcolor) { + _commandTrigger(commandTrigger), _brightness(brightness), _maxbright(maxbright), _fgcolor(fgcolor), _bgcolor(bgcolor), + _defaultFontId(defaultFontId) { _commandTrigger.toLowerCase(); _commandTriggerCmd = _commandTrigger; _commandTriggerCmd += F("cmd"); @@ -112,7 +114,8 @@ bool P131_data_struct::plugin_init(struct EventStruct *event) { _fgcolor, _bgcolor, true, - _textBackFill); + _textBackFill, + _defaultFontId); success = (nullptr != gfxHelper); diff --git a/src/src/PluginStructs/P131_data_struct.h b/src/src/PluginStructs/P131_data_struct.h index 4beb16e931..34ba2014c1 100644 --- a/src/src/PluginStructs/P131_data_struct.h +++ b/src/src/PluginStructs/P131_data_struct.h @@ -24,6 +24,7 @@ # define P131_CONFIG_MATRIX_HEIGHT PCONFIG(1) # define P131_CONFIG_TILE_WIDTH PCONFIG(2) # define P131_CONFIG_TILE_HEIGHT PCONFIG(3) +# define P131_CONFIG_DEFAULT_FONT PCONFIG(4) # define P131_CONFIG_FLAGS PCONFIG_ULONG(0) # define P131_CONFIG_FLAGS_B PCONFIG_ULONG(1) @@ -107,8 +108,9 @@ struct P131_data_struct : public PluginTaskData_base { String commandTrigger, uint8_t brightness, uint8_t maxbright, - uint16_t fgcolor = ADAGFX_WHITE, - uint16_t bgcolor = ADAGFX_BLACK); + uint16_t fgcolor = ADAGFX_WHITE, + uint16_t bgcolor = ADAGFX_BLACK, + const uint8_t defaultFontId = 0); P131_data_struct() = delete; virtual ~P131_data_struct(); @@ -158,6 +160,7 @@ struct P131_data_struct : public PluginTaskData_base { uint8_t _maxbright = 255; uint16_t _fgcolor = ADAGFX_WHITE; uint16_t _bgcolor = ADAGFX_BLACK; + uint8_t _defaultFontId; uint16_t _textcols = 0; uint16_t _textrows = 0; From 3b87f62de40f49299d3ef381f120bb6431bd4595 Mon Sep 17 00:00:00 2001 From: Ton Huisman Date: Thu, 18 Apr 2024 22:04:26 +0200 Subject: [PATCH 13/13] [P131] Update documentation --- docs/source/Plugin/P131.rst | 8 ++++++++ .../source/Plugin/P131_DefaultFontOptions.png | Bin 0 -> 78286 bytes .../Plugin/P131_DeviceConfiguration.png | Bin 73434 -> 75787 bytes 3 files changed, 8 insertions(+) create mode 100644 docs/source/Plugin/P131_DefaultFontOptions.png diff --git a/docs/source/Plugin/P131.rst b/docs/source/Plugin/P131.rst index 76a892a69a..a8daa50bcb 100644 --- a/docs/source/Plugin/P131.rst +++ b/docs/source/Plugin/P131.rst @@ -193,6 +193,14 @@ Default setting is *Continue to next line*. * **Maximum allowed brightness**: The brightness that is the maximum it can be set to, either from UI or via the ``brightness`` command, to optionally help protect both the eyes and the power-supply powering the display. Default is 255. Range: 1..255. +* **Default font**: Select from the currently available fonts, the font that will be active when the plugin is started. + +Available fonts are depending on the build used, some builds don't show this option, as then only the ``default`` font is included: + +.. image:: P131_DefaultFontOptions.png + +The complete list of possible fonts is available at the ``font`` subcommand, below. (This screenshot is taken from a MAX build) + * **Font scaling** The scaling factor for the currently active font. Select a factor between 1 and 4. * **Clear display on exit** When checked, will clear the display when the task is disabled, either from settings or via the ``TaskDisable`` command. This will fill the display with black pixels, turning all NeoPixels off. diff --git a/docs/source/Plugin/P131_DefaultFontOptions.png b/docs/source/Plugin/P131_DefaultFontOptions.png new file mode 100644 index 0000000000000000000000000000000000000000..48dc4d35d02ff6539e8cc8c745d37944baf47613 GIT binary patch literal 78286 zcmZ^~1yEbz);5~p6l;MZ#XU%Iw+452DXuNsfDj1)02|Oy;AgIBOZwm+ zC}s*WlJHOXaU;(ELlGSqs0I<8C-@p`RY!diMeK#pxH%UuZa~E4DH(N&sfVqu} zqrD~83l9Fb?A&iT**Uo>StvO<1bKJ_xdpIZNc{VnQqj`d)ZCj=$JW8Z(G%;1l!hu7 z=UWagKFYV0GLDYcc9xX?`QfiVcP9XV5+Eljrs-w0-=^nEBj?co4K#1Z7$}@;O3#_# zF)z+JS@1LGC0w8{n-eS|*2tjMsGzGm`YLo}!PTaz<)Fw)2}Ym=;35&mPyaxs{C;FX z?^;#WLO}t|oPC-9=YI=b z*hSOg;@UG*sh4SfqW+mLO>k%ZBJ#tB4BExyWEhq)YUp>NSYlFbX{*z_4zXrl;)Y+>VM#66j(4FQ zLUGn9OXOyJOI^HscUh3#yY`l@DU|`WgY0RUp!^_?BR&MMA3j1PD_X-Zk!ZJ@$4|Wd zGfUnkK^7*uO%GYx&D!aa!nZ$j{$hz~7pY&oe>zurqD_&ftI3)RxTr8jZqRrU`A|0( zWJW2tEuM-KP6{~hN`1(xF`vGf$HdQyYYYeZQ2J`!h`c;c;fwDb)loXgo~aU>2x%qw zQolTkYIfMbM($0BL^yk&AVPAyKW4os65a0Sh!i<$9Rn)Y{FG<>bo;m0^Zvs4sXlpV zL|xUenPR_{#YmVxi6`yYL*>V67k$ebzDagu$*#jh~+nq zJZ8f+U5S%x^T}XNFzmg(>Ujpw{@thG{4C=+!P!m{pG$_CALEae#U5k(9=SvbVF94C zDd)KSq+&9q^L4P*#}+Iv(VLvm!*C-e_%1y44SCP2A9t&Vk8atXPT69vv*+&Bq&xm+ z1Mkk8ayMMZ$(j-Hg$`BR;x4*m@P!Hr0yI=LHTJ$41m$B{lFbQ;aV)8)Wdk@jP3cq!cXXX|sl ze0<*Ib1>xdTiH{%Qb%?$H%|JUw7B$N`7=F@0)_diIS}1Cl1^XSX08b**OC-++&r#( zstXDv;HAj_)(TqMX3!MPNqf3nddwh>-1MD$0)YbFw7dq*-tCXY&LlL~_&)wT`uI(( zmTPvac!vb!!5oOQQU5<`8b*EOBo#k$+EJ&iWWOaOb1xqN!}kM< z#}x{M(HW2JJlK!Qb$~HyXVcvMG9iGMFD5N+<_NLXqrKe^;U;!~ZGl_o)2d^UmmfgqW5dH>Y#badrWEG8D`!HBJ1Q0UF4S9^{snP&Ni6%m-JO=B_M|Wz z3M2He%aASBz2#+aQL`s(?5u@l?&(4~2@G@+x_bKH7oRu`7q5=2e*l>)yy zSmN%d+tRm=j%szR*8Q`~_JK17-qxQYnZC2?;kUs@p%@R2iA51=Y4Z zZ}S0d7)8RM;SBRrw`2QFFaK)bU1J~yvgEs(8N#ZJ55B$z@E~tG)3FmUgs3owGr`A^ z-cMz7Tbc1QAHjV5IrSVi%_xtj9&opaQD3Zdp{^C~gxAefR#sKHL*RSKZD?o+c*&EY zlp=qDIP^#szyy~Cr{G-dT>AcEk`CCrC=-;^ ze4ZZLT79oZ`B#^o9=-+uJsq zwet6e&GsG(PR0{2LwW`VRAoFoJf@Ugy#B|k2i5#)xsu7mp$!Xn_utplw{(%Bk?oP4 z(`>qh0hPtMrNtg9BOWfMr$TbR{WI_86~jJCtoHVXD$*BkJl*FI-@JRwLB275s4?uP1#A9Jx8VMr(dTX58Q-Kr%Z6&a=?OW2v1gC$J(*~yx#p?p{jc>L+}m-U*tje z8D1P@Ll1_V88LCo_9zn)x|i-db|9`DWsfy+Kiivq@2oH&=7m;*eLhu-L?Vj`O;0Li82Q@wk6u1u)k|g*K6Wvi!7Zo*o0)kVt*mIODg7 zP1wi~{7FwQ3`qWve!*DaJNxPy=Etz}PTzah$+ms1=qxBd>+hppE;)SHlY=N78Ifl~ zzjP+7-J_UpDI99Ua_s|Wq7Li+iELVzrB(ebvJLeUbIF;=yLV}DkZB;Yun%4py7_e1 zg#1|);@WUSITo{jb3}$Ii7x~>iZs7?5!t@>K~k;gRv7lv&|Y86oh0?N8vJ7KqkNsM`9LWl`rj$F>w$36<@w zcc7LK%ASX2?zp{sfsd73Z#t%ddLAN)5`+1zzHu&>sK46s`Eu`5u>5&xePCBJxn3R~ zR(^!<<|M`!LUTlRUb@ZwGtbZ12f-P&AF&5yxzi(G0X?xt zO*`EA@ceB%Gfs#S@%IO{|L>h0+rHzvz~;=o{K&>O;}g+mTs}+2Jty$KWDGr$;{<~8bYzFeuy8?w451>-k;o)c9y*W7I zml!7i>F3VgEJp|D%k#*>@{V|)@#Vi;CRUd<>3&<8d%e^m9HDq7b&H@P5+=Ni`$lb_ z6W?AXXYzJGIQRK)U;eMZQPpLsvz~A=$l&#y1(phu2*(yXV;5C3~lihYp%yxycvN9&itcvK|S$_Z!2JxTrx=?~*)u*(SHLTi?{(30Fb&>;6bLjS3VbB^kQ`XAg+vyfP_ z{|EUIB7a1B4k}j{7hg)~9yfZm{RclMqWT(go)^Qn-=UYgU2V73Q}nh)P0;mw7DrOM zh1oOGn-3ssam!kB>T}pF3S%XiHRGo7wwuXpS5u=FzUYHa-+< zvZQ|bBu0QRC70qa|67y^6AhafB^RoYSYT_glC2;FF!n zl1;7WFqv|T9621-K72ztT;F|?EB*AXg)=9CT*xgxy`OSev)K~fsyVF~2 zVW^+l<-)K?@47kt_mq2yQDUhqzg-EuVBC5TN}CD*U}Veu9TKI02h_l`j3uPZW_SU2 z0j~r;S>j}3pp&3rT?7$E@}1r$GIP{)DX*`u>&C`W;r)~mBoJa6yp}h?AQim_|(IT$mL!JpjI%>4?w}k2-KgV)yfmVz{4Qy$}rF>Gy#r#7@ z(vt_0)FDq!feW|6&5g-d{%*f#t=FSeLxT$z=stW{u@WjUvJeuw6UIW65>yk^5Y!el z6x4&q(3SgD!VWZk_up?{dxLPug>CktWYlXXueH2sjVTwpWcx)^cFD_(b7gaS?zg+X z$B0(xs218i+1~xFaLd^bilA>!==MA!lKLKhR%b3CIGfbgMm94ulX#G2KQptC()NHT zAS{@gH0cVUDTsFXd~(pDUEq6bvhyHR?3@=*xhchLoR7#hN>xHLB7*c;I-vUX#2Iz0 z(YG;VKAolSyWuFI1IZ(d%s-}@D2?*TTPgDw;cpiFCFA4I=Cl_)dpp4e7;%rcw{a_u zh>qX0Cv*@ys;KTL*~`n`TQ|_`N;MSR>8jq(j0F%l?Uoz#hjjCvYpqWZ>io!WF&0z1 zpoxc@;|wBR6=Jx*7mkz918%$*Z5XN$tnGc8kH6BNKRS6ldP}7W=1Jq<8SYSJT>OTy zO=SP>;ByHdgnB4>{bh5oe&g{+fHIn)YbPR;lwx3lYWd8BLJ*Ki4lShv#yD9)h9P7t zn7Nmsotu~ub#*t{WQ$Y|e5*aNIb=|K7Lp-b)&Njnlk16)r~nFpVo-Dtw)KG`2d7Pz zX=um=k6g_dF`iA&xbbV1xnP%jS~b7LUv1z1#h_kglXGR3mXA|Yf+HT1ZT%i@a7)YU zmjEwy$!=XTQ-`L=7=NRVGriL)zoSL&`2j<1H9j`LQ$m_*MdBtqK)~g*@Nc8ukQaMV zB&?b2QqNRh?_S224y$it_Vq<|aY7pxatSMb?_4@7Y`Y#Y2Y~d2g}ERR2~VTi93BoH zj;7k#+soIfrAeD3evozjsNivRxv_mMIqIeIgAOnmBb*+-B%qS7;nsden?8rP1oiH&wCn5s{(i2g0j%kFvX83`ZlJYHTpF z1#5Uw8$2sfg+pgnbkY@%C5cigo^Q|V^gg9;Mo*GF-G1~Va~77J2qt>QTEj0tsyL>s zyMtR%zbP_=Pa7CR7=7XAiDB~YS4Fw}x|f}pLV?RYD|9A%vX@u9MMl*KxH=XB9iXTo z4A{5Kq!e*6`IPj^ul7W`b`HS&22Ts?j0u_cl7?uH=mtyF<;F?7LEg@f7?j_efRu*D zX&3ccdR1D5>Wp$tn(=0@ywl{>tEvX2%{4qct`xcB5`U1X2>b zj)B41@g<=tB-(;-3m83=$d*#1zNUJP0z zqd9$K=@ab4T7Gf-5gdl)>_;KjYe1(hN9& z&d*ZP1Ok<#Ng4%_AKIV?;XVlm+oBktP=t76?9Te2(FDW*^7s%qdtg-CktWRYa$k`m zpS5Na)mUh7W|Z%`t)Y3oV7uBp%^VJ7l>TYWD{%Gh%5nYlR8cwB)3Tz8>Gv*-<*hYs zl9HSc>)X0BS3nsZSVK)7lJnv9F(NS~f-nKPI;1lt#Zpg?9wMgL@f|b-=rr^&O5NPF zph`-(8LqUj`jx1xq`(OU_w`zS5Tq*8l;4D5z=B&pd?bN2)!S2twzSN_>VE^i{3%p_ zi||X^g06#QX#54F8UT2UAgN#(Oj3}H#DhRGsB13p@!BwfGl&h9UGn{=m9+(ZO0uSl zesKv^tMba3rXbxU$N=|l(zTA0tB8xIl^&QQuG( z;eHd4=bil8vI5})FiOZ*#>Hh&=7L!3o|2+{C88|1)T3=Cwv=!t_OK3O#++y^kzV0I zxr5czJSS8TuU%MOBK$Mdqss4V#G^a%0Ks_34;!JS8ev8TdE2xlrXwEjQq3!=XNB6U z`t{u5d0Mz8C9s1>aZQ*Izho%Au}P=Fta>>Nuq=9^nJV56U^nD2k+d1K0-8d846~T9 zXQg5;J9-E*)@e*~e!^B%p`(QYhC!!Jd zj3BHLTB<)hDZR{8{8-0XL4XXdGfuv^wJl(61=h^`BA;4MR2skDQghcB97l?L`5&{y z0jVF9co5kr8wo*OA>#?avY zaAhGdj1jDXo5h25oRR${d1v~wqKvs$%m5rf;wwwiaEgjj7nrkIxSb<|?KREt@Ddfr z0IF$4hGkG+V1_{}j+4ZnKTLr3OcoXkK$09(9(Nfx(TOH#fEe%w$de(}L})pHC~bor z{~bv-6Ooo4FNu=_o1HX(l`UH&!CHl4XtG3Qedo;j^u7m!_zhWtDPY|udYmZ5Ihbbf zwUkJHEq`)65jRId{J=ErE+?>7S?w&na|`KLF9Wb32{1BX+ers;4rMopH?w@t%j;?R zbgVhbW;FB>S*o7ozY3)Q-EN2#V8|@w2LbD;SYFQTF~%8*aa@xf=?1N#xN)iOqeO`5 z)=$;9!t1UyIO5QIiO&a&+>nCPjxw@}gP2D&hAz~R*dPL+i8r3y@aPC4E?1&_k)_X@ zmuY}*CFMcdWhWO>z-wYY`Dh8XR#e*Fd~@6gOho)J3kx?{X&M?7d<{U46gay{r50Ot z{SyP$B9|V@msQ;vVyH60)aqwG@VtehnKS9f7vueT7SfzpEUW@G{j$_Y0_*IY%bes< zvKH%2m?97QI;Yn=8s4{Nve|LiL+qXINS*w=g2%t_mP#!+Lmp#G`^^Q z<#(J&_y>n-8m_}0;%$Q-ZUM6A;0c_F#ru5I3fMUgJ|o39_n^{I-dvfa#iOAQ24&CI>KnlbdE>#G&%;%rv>`t!Sru zT0K1Z`sETKQc9bxS$+3nAxLqCtgUk^C%V0H5@MJ^7R^meGIWq5P`k9Fe_O`Lkj~F} zu9+?Jh#P+*E*_ydy`8eCYNu%lP+iZAggg4*F9#5xl>g+P z&J;2zhH<Th1*KvxcCZTj8&$QZ0tb51&1j%dAP3oBgn{O_u<;U8h=Qhh@)29VRHi zYs~WQdg?6O&arxES0AX_U*^1N88o@Jo>rvFDp#b!Q=Y0B=68OpYa8nmE`6l zoj8yj)Wg_G9cEI(zaRZ~%EIth#OGl}23jn-5(c{L@WE~iNi#? ze136Nq-z8MnXrUDCrN1;05svdBCQo|7VtX)zK*@>RCvBVj+IcZk)=@c7(%4xGWkzR z+L@~-WXg$BSJ3ogpgZ~BPiDI0rhU7aG83a`m1}uK8aiC4`8rz_VJTgE3!_|4EGfI$ za$?Rk`#(IF1SZ#7y}OF;ur1@xK)mJZdK)6{-i(?r)XTMs8h(^`ko=T2_BZcRMAcv- z81aupA>eZ5?7G9hVMm2b2(JSzk42;G&+52f@z9i;CSvGNVZ4Wa;?8G9hP6aRr2&@9 zSBLT&kxlQMeXaWx!$%^T_(=BDD^_)f{C2;n^)NyeyGLs3&Xxy~n{;YL&WG>t{a;D> zF=WxU#tvOi*F-Rh2Hp~N_WR=J4A$jQc>||OV$7asbMd?dabQlE#jdQT1;BspUo;0y|KePPI@h7kHMuoMbBebeaR4Us#5$TY{E`9X;0+n z0IDU=UwclU>s-~qWGPLMHm4#wX1xXcq*ox-I%YceqO%I%#LT)?SOfcfjwFEaUK(~* zw<)(-G@lRMwQ{#t;>|FyqDw}s3m#;RZM4mg+)yXq;TOTmjln5#Vj@wlN9@mZ&w&^% zPmT=@!C){mi%oe8O%4eNGK=!*qWD(C78-IVNt`q=3nHPMwl)+uZd?2lx;6P{2r}Bb z&c85%d%EEt|5?2-$1)ioLfjWYOcv8WjYjqAO#}iy9z@@I+q-Ccp}=cb65k-VAMZ3E zOZUSA&m8cAX>NiM6!0NrB#bCpAI{Vqs;iQ+aD5aBynD-r@AoS~g^zrI%EZ|-P@%yy zPei&CVBaTWwP4Pw=GpC@;OS}k5f6Y`vnCu8&Fa#eDK6@$*?s4d2l}lpr#BbO%IfF`#W$$)#!uVuVnvgalR-BCBati+DQvN7Jc1!9uDI1-r->|^ zq|O^(EQ3vdKy?x-TAc#=IJb1TH>lZJ2dTGIhll$WXQ2`kpp?XO%pdH`Gg8=%LU{IE z)qb_h%3nuzAYOK(WKHz-@=E2IjR}1Q2t=Cp|IDF zWvSKr*5>u*0R|U8A6glP@txXCCy|Xb!c*Ls``yryeKXc*XzF#XV~tVzN;X1u;NI%kPjG5Rd$N5!y)%!I8nVYg z0sXDl(AdgPRB~dGuU)Rh zG^a-{`L3>*XF~pK#pe&%(4})(hYw=kx;&dOx8vDKADavxH0FZynHWQk_ zO|cD)9+JdN|H3)BHf#Z?V}8Bf#%LfEW~0+kr2M_=Ps0SMz~hF3Y{w-M{i_my!VV`<54=j0#L$*L^(Tc4jI;c24DWwT3nh- zLKI*6kw;2FJ~%LukV*Y^l1tvJzvu=Vejhqtg+b%KKP9_j=1WXK)2j0nup`dIdt~YV zIxO;h6v;q+|J~yZd+De@w&Fd_;+$;LoPe`u9eV%TX#l)3r<835H~pxuAb|}$7*;^t zr`KkO@1*Zg`8R=oq0%BaaU1<;M@=~1jx=Mp`by<=)*ERdO#)D*FoN2SP(vZLL!_`LiR#9^hwq1Lww5K8*h(5&&tGjq2DeE=1{_vXpM!rDcsUvKeGray(q)n?t4hKLW3^E*o2=x-bGfcX1w~yO@7_P}V^^c%nF!o~GxNlalZ_L77YJ~MI#$HVs8!xOX2PNH=#kV8 zM003f&|vaaW62BaXy5=KLyn{m-YvTOT30aaZ0O~FYCScHEN`&yc8HM_H1*Q^u1#3q z@+^u_>nYKiwe>Xr_EdaSMP>c^7<_qkoqX9~=O{Ku+AA90MUz=+9Zl;K-|qvnpJT{M z*XOGvQ>lgp);$1vjNvRMu;eRzl;$D%nP0|;{APk&t&OIsPpvo`Gf!}(w^Td%E!O$M z8G-t9{W|Itv&Gg5vxZDlyDQuG`&f+VBO?EGRkE-hC-H{R))90cDnd5nfsK#SicPpt zh!Kx?%5ZWC>Ct(<~bPbxZ$U)`mf-EmX~H(Y}UI;JUOabk#m`Io`;HG?yi1m3{eJcehlc&XajG=t?@hjQC~ z;h8ma6Ug~qEB#1lXyrZRf$+WK_8c*`XK0mD_b+7itrm}7I0a0=|IRo0VEGmp3GZxc z=qzZnUb`DKk5z7(y>+)qJ;7iNghOhE=Ky?xj2~F}N0fLzso&EjB+I7i+(Y`q2c0hm zUT{>oEXoY>sPtDvPOGc?t9w~(YxhSRJE9PJpi?M$1UGBE{ zq}K8lAR7lVfAnpc5i?zX`L8*7)!l=its%%R<*gH`@AcnLk`&vs-qRNsV&)9reRdHd zgUt8F>vsF7;OgN-?rGOQrfp(lh@9Qxy7PmFl;`UbLD&pda@Qd_s1{VVitRf4M|3zC zy@Hcr{h?r;faCgt%mcqqORo6Ztjvyt+y{PeWrO}*4c>AF^39#Vz2k>Juj;u-6UhsS z1@NyoRtM4I`V$S=r`yqBLD*>%{q5h^vx6P`kxJd_<-op zu(l)B;EDmK;iXCN1=K{dKsxNX8W+`rE`EM~3aW*I6!U1<|8H5o{QLh?mhZBGX1mUG zir{cP3EuKJ*CPl0N^=(S&)}jN$N+$RYP?>99*IoV;GItU&JhnmI5TXQLxKNrnmd79 z<1o<)nT^K}-@izfflqMV$9h(FIwS5PxWFwM-1L>X`hQ5z=k^)zvXxL4ylK$z13_vK z)qa7pe2rXEMmhN)PxzZ@S&6U%Vx-Zcjzkr(Uv#N}h+NHW@MFodP|ptV-0(x0w=0>9 zvg^Cl6XQVoy5DcO9I?TAyiQ@(khk~WDg?_e=nlzV_TY5J;ZwuDi${RUk(%bibRnE~ z{l7$j(-;3RIrlRr?;QC5$K-!yw>}AE!HuEaUnfPXsM+xuYdv=}Nu27kl;Pa)oHgqI zjZ6PeQHyi0B^d40_f4kMi`3np3-y1^G)TsQ8=TLZ#>Wqoo$2a%5yA9Z>HjO@e@5$c z{`YjJl~5+Un&5p0`t`~uR~B_Ah+2nf8zs_k1^k@fA71VImGA_sc54S3l7i^*SQ;WbAk z1_*`u#=jy#{L;ODbT6#l#9MIa@}$R{zFqh(erRuwVopN-3G0I61z+Hs zr=Ibh?FPFVtj)l-dj@%uR9_Kq2L&Y$(Y9S5jDQltkb1GO)(1YOD0qCI>wx2-s)xC2 ze%1S{z^5yS#*xyYVQ_PEI9x5#&pyQpYEChwsc~+%{Ir5_`k2)!A<-`Nsa>oK=B$L+ z(YwVr{YY@P*8jpg(E^U9#H`dmIn0kj;tSO?~B=n>jCE7WhN)-;P?F?6WanF#W@6W=t!PPpA=& zK>akN?m9dH0ny}wPyPbaOGytRkw-Wi$IG&@*edJW+n8C-tR*FcE*_8atVXNUt~kpv`WPKyQT(p=euo!%!^V*!mu@5IE^UW*6^9U7hWhMD1#fF-+MQ z?N@)1ZNJ}ec84w7sN#lmo9Tjd+xg*Y^ufWP)xNQ7C~eCn_EJ>H(>=%)<=s!6X#P53 z7Sy5TPg3<6&;vVo{+kwM07;X3d{sY%H$>_#PYC1I6B@@F*WX*;vaPFaGz)*S6_48) zD}WEM)@ZAE6P+Af{juV$e*eo2vn1?5r%bak0UlRo5V!Kh*~Mu5ohVO!E4ckZ2Opd0 zTzWKEz`>e929_-^Z(cDsU!z4u6ODmE3#_e;O-Kk8*5XThcgNu3<@Q1rk)Lzd>j$>4 zWxkKqbh;V?4Ysjw=gFX(p+Ynu{hZvdjW?lUlz58lmDyt3S_l?lJ%-V6?E12kipOO` zQG|=5!`W*~r1?WK@}ZSljF>IJ8x7vALhlgH<1c9}aXR$DX^v&LsWD(DB zdEfm=_Qtzk6iCnsY&Uvno5Pqry{rqIcBo{S4ch9P2qGojA0U5>m=3wb#vbpz-U>b# za%r_B_VS}(nYGTHO|cTnfF~fHceJ5F)MFCaN#r0{hxg&B;imUN)u4-;8|}M?9Ti07 zHbP|TNOFjt!khqvP;m>jX7AURhsXNV_aM6s(?HR)!7W7PYCj<4B9;UePf{cincI8W><) zo)CI9Zd>v>#(bZ~iIS{aS>&g+G@{D)rCr0|sL5K#k+!7IvOh6^hvAU#lgYQ6&6QvO z78+K_qcc^1m9sCPBFTXC9=r$B<~l#U1P_=u#BGsIzFIj7w+9dj3(v~T`cEN`NAu1s zEF@+fC;?#1fStob?8^g$kclXwH^-6`co4QsKc&L{ig#yx z2a9ERf$wVHUd~`E-4~3<_il#TEtBe1uf2X!v~w_D0uKJX%@2rX2{3V+oX7KN3}nga zvXg=1fH2FCldngR7_mHGb7^bLz5PDb>s1Lmc|g;SnIkkbb=) z!irlBq__S~2|)5lcek|zU;+&)en(C*X}&HOt5APiEsxAZs8gg1iTtR}RHe`aqxwA? zS_!1(1K40mQ)U=I%IzVfCLhxf6!-1SNv?pbyv~&nB3Fcim^Y zIU3TD6sF8QaW?D_*Ewh$Tep%_t@Gos`O~Am5nrNq14prOE)5RqyLjhkUAp};Y#63Y zqxx2u=e)!0HzhBXXN(*qldfLD7L2lUpu9pBv@dU9S&a>7{^PtIDz(+~SMv=A`;PgJ z(>it-4H8w_iRw+1A?ik_Qmw0`WnT*(4d!6JXve}bZHvoc*X<%m_5tjddZmAU|L@(I z_8v2%RFa)toYYn8WBpK49~vt$Xx(M;(Q7VL89qL!_KZV(mnHGueV>pt#E%8gf2IXb z=vQHaSb#66g3Vq#saCD{D=`(7;1D41ppQoGX zLJSBxs^Vm7+O&BM(3e`=PzT1NkAv0|2#yq_I<1In^mul5FR(gEbDbS=vI6Y#6Gz$E z*^I(q9gSFCdVJ$Bb=|~$Gih~bGVL$9h!PD>o=;=07>Rm@sZz+${OsRvAOqhUn zQRrz^zVJs)WN^emeSUH|NTtYRxlULA$5m<(0Bxk2r9X0l`t#Tg>9^3fuyaC^Yz&k8)WWJTK&|v(&3@;TMKfez0F=SR*)&|?CJo6IP&t6_!uJwWP}x&XW34j2zM%< zq-Puplv>QVKEx_e>T~e}K!9HMl^nscdG#Zn3+xbWxa=K)j6zz+(XeD7!`cRqLHau8>P587Z> zC!t5stK-UeC)Vjfp&4lc$qYj8;?{^HS**9{w$O82=hMa%B06Pt z&D~CpJBf`@H7O3cmQZdRm|k}Z+?m=slRM>v97kS7DVzcPTTk0&4hI$*KDX;hX5_x* zbY+wqQ_LI5gBBLTrej?QR2yTe-p>g2#-05xY7MwETJ-H2+e9_b3H`7z?7!2*xBJnc;HPN-Ae;%BX zgFA6dBd_|afIdV!27qBY;M-bBP3ioCQ$IW1?AX};x(R3RSJ33z>14?@IcTQ59D*e@ zUpG_}cL{MFa84AV2t-ICwj0YGuG4@FF(x^_0HiA_Ap|q1rh$}Ybs*|YqQoh3Q|4xV zie}QU{9^MCo#mA9$gKg%07mh%RoqSvwh&wz=$^VGx23Q3Ur8l_`O&a2w20_+0_{{f znJ>srqt={>Sz@A$->^=H6_tkU5LQ3p&RL<=0Yp0W6B7D-5Np22_+{NOH)goc=puV< zy27||!evNG5=*x<5!}Teju&4os`M#6Dbi7%ht1@qqYyQV`zjW^UDe?D#`yVM1Mq

!hN)bW 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≠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

x@zQF_IsY88|M^g5RH!wF+iSfK zVw6Ij(KqzfmEV2=J@HdD!sD<#MrJ;R^UcO=_sGFqZQUth7vX0<~9rl6&!t1@_W72Qe#bw`|Oa+=!`NF-a0BZLc*d zV(Fzvm#2PJri}O9AQvMCD9+<72aLhkjG?_BdO9h`%`%EKm5dqUvgyCdzvzyvzuSz` zQoj5k8qJ{e1h}$BMn6!#xbhRs;#RR)f8 z+@kuw2n1o$7}%+m`EH7aHoP&%#wLn%)$1I+gbzG+ktL{)v zh17Ey+M~X5qAI$3t4aMhcRr~+d^#N_M(J5e*ihghNe$h^z#jYXwz)5u2T$(FeAR;A z>5JuqfQcz*#o4XQeP+ctFk-Q@z3cFnJ*F@+IT^jF2rbbjxaeYP&NJe5T)!DH#W#jc zNuEEoz<-HfM)fE~rW8EW-hi+mOoyD=fEh2oo;XvlJW_HiWu)k;IpH~*8P^t9IvKf?(mSEe50E%ALvumcbLQw4F< zm9X<+NJh0kB8cLDH_^ml{*Nx6pquOzJsSxzG-xV|4r>%Wcp6!lFiWpt%}WXtOoB;1 zB8xkVroZ`>wbIUiIa0%+7BXX~0nBK_p-0l-txX`>v6Er%s;RoqUwG}29gxO{cwWji zj3kh8!uelApqHW^U#mS<5GdDd%pp%IqT_k){uo%}RAnj7excH@eizZ!)SPj=85QZV z;Z-+XbvbfNIC}o{js#_QcEmN>0o@jVzQTUdE=hUfa7pWeiZ{-*p3hkD2*pI4ag!^8 zXkWQQ-i(ol@HOj1BMGY%B@9#TLE2m{#Q~uh0@%^^(yre7^Xae|Y)RUfOJr2HepGR_ zKFMqLhU*ciQjr(oW8$$9KRF_lqNc!hTyLc{yEw4l0Bxks_T6IKtS5VnqG`H&ESm4vYalG6dKD^kgyPVAW?&68=mND zz|(-BWTA8X=*5?fVaezyR6jTH0CEl+y|gonyyfrR)Hv@s_vK|<`jt0U;jag1LbfPi z?miW*KNK4+ay`&P-%Q?$A!4v>586)r0cI>9eSA04?>p(<7KDX!+1$@ca=Q~Phtyy1 zF@wq#W=Jyvcdd8_qntuEben7-?0(YB4nwbyn@2`Bmn(*h@05_Zs0n|cz&fVVEu{UN zfSphl$c((w}=``@o(W z0i5%3YBW1g_#C-B5LPFO32sve_JlfBT&M`tGuMOajn}OV;RJob*BOe%AI64w*9`%` zT&1Wx1~(bk2s9*5L~|y>5?r~ZG!67@R5VP`&J>nhJ-V4`C{y?|;FnuCKXFh~x;9c| zDU8gZubL4${D>)MK%><)wiU;lUnlWxpC)|WQSa4YFSod&?3(Ijcjv=zH;_mtSz%a6 zM1@s_e+4DvC$ET=DGa(E*?T42WJq+^)wHqK6_CJ`f8fo4KR@&${QzFBEC3D+{+!E} z{u#X7Z2tcy-QY6t<=@jQ>gzS?1PiUhT^CFbCu1=C&U_;MOe<;N%+49_l8^%nQu`O- z96zd_6Vvyn4^ zJ45c!%3~WRts(~o+P#CgbNrOqe9HO|$7#tffMj5VuADO4+h6E3s`J z7KGN|IfoTtOSX>8zk7uxbRB~HQ|C=bmVTuMwPoTKiSW%`CHkR+2?P*RJ z-S>cjq36}C@T%CX=!$mlkoxObNm~1ED)Ev{s$zUNXF|7eT7>Hcwr;{}3eB{wbVxx zrzkHK626k<=LC`FgxN91NG!P!a=^r#vrJb$!0I=^5Eq3=@-Cn;GnB%8kZNtgfCTX|-(q-a8^Z#_~ zWmGkLrAybu)i{<{=~2|WtAzh0T^e6E5cvl0a#k+e9oawaaCx4*Lu7!46p$%s$#l$x zl*QuJM;K#H7#c(s{EDU_u-_et_0%Lr^)9X>B zsk&n!Sn(Y{t=@6H1p%((l%~N>upmsVylH7I@q!xzaYA&lwkUNrK>>vhRE<2D_(HuvWADY6b2pLP13$A5c^); z%Yn3)EBd~*HP_ir!*qkIqVwkNl48sw0nvqI+~BK`*NO z5Yso_sTN^0ZgW0PNaHJy$Xh!G8o4}*YQB6UlgpilbzSxyZBBH5HY)jwOB|sC7-=ys zzq+Z_*nFYOxCLY#tNJ-(Bc#Sgi6#(5C2JyBd3vU% z7lao9u;$Trx+1NeoShqKgX?Z8$rG<^m}N2(dWu}J(VIfe0g|&0A}L#G)eW4vxmpkr z$e<(A!Z}5uT0pq|-@;wD0O+3iz?q(_?YsG-ILQCE0@AxZ|0D@zvGU->*<81`+Ua)u1#ZGUDQ{U5n)) zqR>22%e@j}M~);gxbcq`jwh7B`&H@>cgRX9Hw1U7ynlOJJMY7{9a7f(iQ(br6;)O7 z%G*FI`#o53I*~^eI^up@Ie-5AQs@R~|ICbk1X6qlE%2m%3zx!&BfokLalt!BJ)-1@ zg$ZNtPY`Pgh0LjavGb=Fmk6+v8fW}yFXV|GEuy~uJVPI##ZIA@-Mhsj{Av}7oQPiT78?G9zOmO_e$rPWN#S$Yf( zBYz`d^s%|xc%xW)duLf5LGsBO`dpy1i>du4Hyh9L z5(^jJj6Hs2nkSv04;Txe9-ly18Xh`?kI;AH192s5Dr(s^bV9XCgU#sQZ+J0HS5=lh zw(P!Ss{2?KAb^B~#sDi3*2#BE+ez;rwHOVKOXE?YuxcOD6ko1pqil$~c&U8Ljd~=l z7DYIr(tQ`ZZz<~@RcrL|(T%HWp-YvQ95G*%70t}&8WXDkXoO5pN5MS?)$44NFAr`{ z;3R;JB5@NtD{oHV!Depdvll*e{3dh6*Vq$T&uz<}GRYjgI!HVJk^la$u}{@dY(M+R zeKmm>plhq5<+7{1PU@_uBKS$P9O=VAw8xfa+asIo7rwNXjE>zNR7rTf%BJQ%i8F^A za$?;wd{WG3*7|6$x)oQu0Tuw*qpO2j+r0nhORon9UqZ6lb(^_wF#&;rtw42@c$X?( zwX1|oATW}Dy42a&cq#~ikTKm08ao#c7}GbQur7RshnR2N={h}=NVxvwdd>Cz>wm4b zlX4j!i)CF9!awH74QJRPwKyvU_smeT`KwS?Obp}iN`g;q^jy_wKd83 z#cR)hVch&(P)=Nvr_W>{|I(-HW>mU+a66Tw7p>>52k=E&S5=g;PTe5K7a{2OSLRLGfy^+( zp*#|TA_vYYx{BuMjXeeQI)lFH5zwu1_qYI+@6Gjq_@guXIp$)hlj>zDr-7*;Rmg)3 zcS$9p*81+JBju)dU$Esb_x9}-b4jr*KWL|DPGG0oDMt$th+ZG{sk*Cy#y=EjFqNM> za+LJoI%HR4OuvJhB8FBM$Veo%{gGzcdTveeXBG>k)eMh%H04yYC*DHhwfuLbAIHFE zpgoNgl@I~D^*?g38_eCEm@{klI(9D-hzFL_Ukf(mwaH(u)KcmCCauN^eqVJ0u;06< z%5}c`YF5?R(rW03OHPcTNpA|t#~4ffn5wU$9wHbFYDxe8yh>C};p{|9JI1=#@&&=n zduftpmF{JOC8|m}8PaOnu+omUvrMe1@F|C+^=G@qAj0~8cE~!ErmwAfL@E6%XCS!A z9=RWy*G|4bGxHs|``&78Y!6j|iRGobub|_$5AJnZvei6ou_ppoP`7S+Nb@0w6d$lX zIWwvrFPQJ6=!Q7+(cc%(i!+b@Tv{)@J^tN=_pc1dqFqF>i!1T?=qmXAkMAeXVe!6a zjavl)*x0443{s?fJL|k+nFB*ndJ;!L=I6OvFvMXqdc=8JP*l|A{(*rr|8P;op6{gM zwkTdv_{%QQ&?+-XNJto-no<=mZIzh*D9-j=lD|ocGcE@%1X71xFEJt~j-z}ZQuJ;y z8#weAkN7W=lMRWmz=V><6G7Mi2(W%qn-mxdRW~U2E>|x!)OFsmF`?vFlam)+%4dk# z&1@~9-h%Q46a&6|eV`a|3L(m-yGGZ2Esr(1U|n$VTm zh5(%CqL?881qxBCZjpKF?T2G#HuQxpIp=i739&dJB_(=v{`Q%*E8A?j<{`ZoDVW!z z>cYn`#7WkVM7lf?Vo-IiNLQSL0x$>0jVat;-XVX_OC3G`8dTV~<|G&@#@c&?i0jCs zr@EB8ky?_jGbh~P+1dW2$cYK9szJcoK23-@sS6Wih8YGQHkBYN>MGwiS?4K)XY4tk zztqHse(Ic<^hdUh>T?odQXJESj+1IzDol@Mdyota3WUrd@1U+a6J7Yg6WLhygq`dF zeSGmv&9oNC_hz)rV8|!^=~n=iBU~_9e!*Sp3w+qx;4xIiUAQkMiwt?dtC#k9N%^NF zY8~!GG{@Q1T|LS%u{mrOP~xR%LAds~HR&RQZ{MTzwy1w``S*_?He>PDlXHunD3lRA ztv-O3R~PMTrEvD+pS1uVRV@e|2h#@kqX=#OfQQ1|UTmg~me$Pe~<``jT;#YmYtI&Hk=qk-$k6AJ(7?!$1jtA zY%pSjaHgLtXw%HVZeOZb4`KynJOaIiI z_Pf1Hdhjh3%rbhHFjFG7JUm>uB2_i7*-Gy>(e`^6XLoF*w_&BQJi6_Va3IP?y5{GF z+d8Jn6K6B9G7uST`uriK^eV55Ta<{OM*LKj>ON^&rM#fy<%`Rb*TR~ju_r)r6g8q7YoYb{AIM$m!C<|`|(OxLd!39)2{CQKGq z`I)1a4WbaJE;4vZnsmam!S*;rd8C6I&zzYlg1!f#*?Bzhz;r}O7>HgmtN9v;p`VRI zUU4L!cd9^hBZ~47^RPuE&-MA^sK7!ca{?SS&7SGvn~h{8!P*fs^M`DuF5+q1J5d{x zV3i{z&V#*^#?7lqs~quW*o?OYfT=}5^ZyI^(Ekam-ZeL$0eG4DFH$9t7s=4+^k(IF zu)!CrD=H4w|A~m=%!6XWCkV{mXcvRsVKEdH${kdyi;ZQD0jtnl{qeoISlXOxP(!OU zK+n@DFTB^_dV{*e7peb$Vgv|3{{`)@jkL0Ynjde^93CBgp=V+OP<^|`_Z;u~+Fbs| zZD2BbiV|2X*6`9&Sw(gA!+*TU44@_1sv z&~(@gbks^5i9jl^O3t4?eZyH@>Z_M=ZNiC3XQTZ!hM*+qc;cmJK97BptP}%XaqWm3 zl~sg5QhxG7{VovCcV>Kt^1I0=sZUGMKUwRU;j5Snek+$q3rDlC+o7DxE@4bl!Pw1Z zI%mmGI%^-)LFdPF&3ODxKou{~8J;H>9yc-$6`{p^M zEI80dit;T;rQ0Lu#+#AHZ{0{!s0)M%nl#?g9Sa6v=|dn-;8yYgEo{Wr+YcjL|{>ai+ZxvDKDLMBd z73hjNa|T-8%PrrYry(_MxE&wS#qF2df96wvLM*|5Jrr;vppxw(I!Nf{I9}_$`VSqJTY7s%)}Ou79YDY)Y1wc_zR8YgpIiXgqJRsdFV0Xm9-z~ zqiJL5WGi9lhc^Fj`o@u@%{t6mGB}yi$Us8(QK})lph$6{d^^-D0I?Co5traU*M3@q zjSi2{l9lwf%2}@bE(VrRQbK)|y7hdfpCVDq%oZ{Eja)EGi_VCcm=OlW&b`SxN*AYxwGSMj3*TKX~aL*Tc2he!V zoUtL2xs}$?@TaYDlG_l-EvgtA+cbpI0lj~_>azr_mz9`~73&!P73>yg82=YCb+HHb z@83C1rF&q&dCyvoZKd;XS8cLEQZ7?u!h6MiHA%G}VAKn1xD|*MGA=r6SGfC-P&wKK zspJYNk9>kjpwxFbeNWbRcD|8jL*H!x&c5^{W0-~M z>oFb@ORnO~cVLSg(L`8b!0<7))#*VAt~&$O-8{cdLKgR)+8>5kCKtuqxBn(N{cec;EI(IzJ=ri=fr<%OPG_ zoVK-$Hxj3K6kbYxJwAqXJLXvbRs$vPDyVY+t^wCCU!0Fq3K!?sMzm<6bB*Mfg#wa> zj%u2_jRD-lRaOpjF-o5J)yqA%XRYItD?We3l|mj)wQ$Js7KH9z>vq1^nE5MIBCK6A zW0?Q_s#>2faWb{YqAGO-qE<{7uZ_?aXID>#(nIIv()2w!L8ctt?Q0cB6bCJfD}KO@$< zNRddkp*!;RR7rW-&LfsI6Lu@es>%2NAPF05)r)q zPi?NF+r@y8sT&yo@ZrN@E*G}_2r}tIk1Dbq+(gX(+J2KWbE!u=Kf&R4mY0_|4h&@N zcj7ACDYD~c$cx44r3P^}-ZAx4&S|4Z*S-R<*bBd#e&a4ds&2{cDgrMM|Iv;CNpF;e^!=U{d0Z@+zC^My|@4(-xFCcA4JgT{|{z zOcOn+u*M+C6YY*{G5uJ{NDhDLO-jukhbXx^Q za_1;xogVas)|^GHzwV?3ceZ!8s)5%UtH~ym4D-~r;RPLk_&7>I16%uwitsK+!kyI{ z{5vxEclyd*&&w5JHsnxSl|phld6j`R>PX4Vwx9j%_z_IkoS5y$dD_C@Z8jvw!Rwk1^Ck5t79{_vBhSRnp_nNfinYZXuq z<^uT83Ykz-?h^2Xdt0VE%YMxFm4?;QTRU`oF*J4*jZ zBc+;$SkR;nV-G42!_NaNHS$fot3h~3OR$VZ6O7 zM%*LdC;ANb_%Z8b&XE)7B zs~K;{D-fUDV;2GgRzhN${7xD#pA$LgSIe{0TC{CAkEmxumg1z<>Mo%A+ea?0APvfW z2kq4&*DqbWnQzj~E{YY++!nX>RGQHd1-H`tK4TDK%AQ00su7}B-I+z$!`jiA-y)q_ zL^H9BJ_4;?HS)+Q?PI6hZTCWQip?(Hmw%ekStwuBG297!jHaoE)0hW|Fg(_yEbu@2 zfCBJ0YSfhi(X!5!+CISCKs`+-*vK};t#P?Pz!a}3F{s>>_N`l+S222AA!P)v?MpFU z$Pvdg*XC-~y&x>FEk*Iy{!D=-_hy6+`O4OXg7#OL5iq$_J1CTg4^DQ?0?$kE7tn}Z z2<~(VrNx>g@6e_39os(iYy~JFE(Y1|Ci#;W8$i?@j>D%LKfC74m1>Dyh-u9KO{(+1 zi>SUI?i5*b9q$y$izgHmD9LYf|M<^|Z`bYB&Tn?rHd_UQRW;PX*lou>@;0mLKh@J< z@BrpE0f4!ct)Id^d0Z^>dn#CyJBLnBi|% z#9C?5RRi;>brJb}OM^Z**Iqs9LKLU#jSfLd8#2QI5qU;^3-N8a^%CK%qjd*6ZQMUj zsC2DBMcvMK`P8FyHv?<9wB=g+N)e-v>d} z;KrZpxGWh)z1F3a@Zp#3O<14%-p*M4hJz6_!sv1KX=+5`#JT*V8KveR0np8A{+#Gk z;P%SIoIgz%)ob>D9&`vji$9^JeW^gX0`2YT`&$BL{beww*_tQUfB!xXK1d(+*_J;w zNB|t|Eh!s*zh8(z31%%tpRnr-A!_m&!CxuS1xPer^AM+Ep8Q$(rHgJm_nG1tURmr=Z#W+tbG4U-(AfBe@HD% zbd7X2+oE7sb4KfB%3%XVzkLShK>+D+8zIL>Z@CP-q898{$SxUdy9fIzB0Tb8Ka}!t zZGVH9Kj5}s@ zLOuqcCxK*fG95;Z8#_k`OZz^UWLP__i{;6n7CD-AO`RV@8EC9Kx8cb;6(|zNt7w)e zEq1$p*1Te|lEB<)T%JwuG|_I0YqSC58i=?+IP^W>zE^<;gr6DQj@P&Jv6~ItPQWM? zYKUtvd|b@s4nybVFFH4v6P^O^C~p>}MJdo}OH+2Gw-ww{>3&LCNB9eX(~tin0BhQY zzWv>}&x7>o?ON=JmG*tp9~IQ7VS4+e+dshX%yX9R-f_p6Ixc@26j=1ABWD1dtk!{CMJ*XxB#%Zbx2 z2AS&`oBTT$-2Xui=)*s0T=aswQ<)5;sYy!Mf_mZ;)Ls>nlkZCg**cZoMY*`ne5o5hlnK63lDk;*{$dfb$ z#hkFfrZbjoLCx(5)0?z8#!lNM4J*bcDbYDaAd-ZvR)v95k4LT9(tE$-eQR8!_Tz>) znGG+g>CR#Y)c^qGm72pU-3Xl}lG^F;<^Ewp#a4}IP_jmqceG->&qr1|F{-AwGp5s-HOOnx3kqxM3Wgep$7;D-{8G3_XaBNA;{ zm)=i>JgP_W$8NXN^I5NpOv`7m4o$eOS*)r8u?52%kcyk0J!C=fIp`?T{*1ck7Jl!F zTvEO$v)(F1(0xtk1}Wd-HFcys+f@+!v4JThXSvc%WY45z=lo0m43sw7HJmXhyS*n@ z;i6-YM@RA5L0z>RSbNigcg&kC7S*51aK3dneB?*(wwq;>0s zgv{|CGf;S`#}4sRA_L3(#cLTLo}%U(q)ewJ9fqRC3T@?{wP&IX*yIavO5@8J5M83W zp;HMA4;1eL@jtV-dG5X*MLW zKD3Pr>M@ODE{5sl17lEdwkdas@1|2fs0B}3?-<41e2Q`?;z>4L{miEjnWlUx6Yf*( ztEC$W*PUn8S8MxpuaM%+Gmid(a9NPW7^L~!@CMa1h}cJfum|kKwWpTX`5P@98NbVwjiVnpCW#Gl@9!T-uGB*%bEmg&1@B+##$i4*->-IRR_BbiWZuLI$L<1EY z;dBwY9cc9Z;ouaib0jHF2G>Z{_x1mX%ISMcxyC@6q)^o0G*;SZSMvo^=SdO8NM_WC{fn+dp z!?X9ydv;RxL(vD^KX*&3v5<}!P-qFZ`JqJnzCQ=52L`&SrLH%Ujqm>BZIw*~Zt0iB zSK@TXx4$_)(3M2dfdKEe2yxe*(N-kXbPCtAF}2D_}RyCT@%0M$NT zXlk9l_Ds76DnP*{51|*}N%#s5z(LedC1F6hnMAEwco5=UNwfBA#b|wJ5RLs@zV_@g z)qVRGoIpMo|LF0kWD#s3+q%>LvWgvIqMPM7P#4v055#Im3{`~8pimvOJ?}hsFU8rah#fjEKGF+MV2q8A9LLmuLFOdo)4RKXCnjhi_RrCpwp`=|gHsw!=1BbG>FJ zv??)s&wPzu#Yk3MsnesJvj*9=UcVg1x;dry#n~D4g?v#p!gL=9>k1iMA?T`fU$I%H zyTz|%kdpICp-b+9tRsqaSHtVc6l zO;|%0%1;QizY0orqEI6vC#7uBvms>kuNSmdD`upW`#L@N3p~jJJBvn-5a)o!7AL5Q zXUJW9a1L+;*vnle%cBp6`vU8&j!0qeFos*rRws%9#3IuVQgd#%Uzw-2yI%<2U>%(4 znR?CC{Mfsb?w0I|Ov;m9J$NJKnY_BA*(pwhZcfY86!l<99fAEsJI0oW{Gd5Pu{5~B zeho2Qk?S7$1Dw5G(sVRCkL=|IWfZwGDnF}O(<^2$#;oPZvzSWA^lZso;v*;pY!BdM51j}CDV|dEaTDb; zDV`VQUVq@!{R@Y+97Q_2;mK6)Z7Q@&iCFCA-xy;J3KhAElwUVvk73dzB_o=z7uV$} zoF0C!TItV^C^c1XMNcywMX~;zRp``+HqA6C9o%q{;yHP0VESWUza6OB1O2EEG z+h4cx%Vf_%rAOUZJ6%S^lXd0y$Zw`irHpYbda+1a4cN2-e|%qBj;-;<0_OHYL-nnh zovKdIt@iArvY4yD58e1L3wnS&`CM7hAa_Z0v)(&=vJUCT2Qhx*Cr~8mcYFBO9u@Sm z*_#YP|luhO2_* zDG^Vn+yQq=XKti*t9v?m(n!>gYEdlBwj7r`L1$Gi>rIYP+&{<3h*-4G5jLFgr}4?w zn9I5^V;RrXB%x9welfy<&g-_^Zm%LXo=^NkwGhZY!=C<>W6p{}YSnz!pyp5Ms~r*| zLSY}JHnhv7B>o~lx!WfCT=V^uXu{Kw#O`z`eqDYI!N7&jy5tQB9NT0nk zt7lGH5H8ViNsB>M!Dg4ngTNVV9>ttdxtL`|<$XO)KC=N=)o*%$;`TX?3jA#dK82I# zQ!9DBOViQI@y>gnmE!kP;X`Eu?#D3Yg?xyUxa4B#zRcHSYaZ_)$mCbd(A;&=#&x4E zb&sBO?hq@@B_n2@u>6g2Q&OAL*BwYvyb4`^Dxg0e7bY#G$Dqp}VQxK8iFsBa|Msg{ z^Z1EFopmP5yUGH)oJ@$)cCWkQ8^n1`TWs3N4<#cyC!|e5>0Y;nahoY8@@YbL*sMn?O4-avP=L;I zay5lADk>?xTtKr>_Z44%4es%R9DuM=ZWW7g%~TZBi|fyG8aLIYcr#U?Ap_^54c(lL zZ${uIGsnBV@JV0p`wxbDETeVAtLfg7 z#6$VVzh5QY^Mfd5&?|>3>9d(g^-~7%C$UAoxXCV2O^oN!X(VJsQKp?9jjA4`xaF|G zf&B>pueg$V6)2-;26JfncB%LXkaO95&@iRJfkz1qe$xNuG2d(So>605DSCvx^y)2I zd#Sh|#USEYgZAt7xbq(vb-L&mw_IN3jeE|=ugqwbO#_AlVL$Y*62UazVy>*J8`HbhvnESUROa> zz^tBJF+@s9{b}THACjsUA7sR;fJ&wNAjdwkS{k(lwrZe>$<4p|4HNM8|CDnmzQw-~ zPafan^ZCQ=nYxYQay29p(9ZoX+-#+~uvq4h#A>P3El_X<4({v(6>E*)07_6;*nxk% z=?Jj0V_w29Er!{@!UQ`i8p|@g2O8MziYn%Q|k4PQ@V+XmllbS z61Besr+|dfOS9R!DTH;3#mmx6<=ulx&7IqKGtzh)f7yNOH@};|?N!^<7Dsa2_QTIE z?N@%d{VsF2bZ_x(i@z!A{Z_MW-GYh(+{|mMVB=;SZ^FctIxy>l!5j7L8;I;?2Tj?s z6Z`6L`4EXbYxw&g4iZnEJo!jzpRB~Wm!#i+ya>M+7pHD`R$b!p`FlV9{FJm!TG}Br z6;!eeoW95Y>{M_*Vx7v9&^J+keIuU*UCBCO;o}B7YgE_OWd(wk- zzbLB0?|gLpua+lIUWHhLjc}vSlE7j;Fue1DXBUFbmN~`02tPy&FUi5eiXtkEl$;Oz z`s=Ucq-{S-v@2f}hK2hq1LT}4p)>8GsU)S3By%zHBxpW9wF8&o!TdVq1u$KnhlY4_y_d!u6Ga2kA~|E*d(m5lN*Gw5c&-kkPP&F1Nw>rGfN(J zjV~+^qWxV({5^vKtc;%7!LyLdNaI0|;Qo1Htl@`le)d3~JDt(P8t_6b>bcbq^!ghx z10s&$LJKD=KNn`j#R>YCS2(oHdXcai26=P`vApn$_yL!fkQCIS|F-T@ecz$Ouy{(l zYMFe?L#~`dbIQP(&r0RcQNPdhvgN8w`(x(Oi9?TPgh4^wMHe2~6?!x}V_o{;P)w70wRWog> z`s1r+s6N!*0Q^$YjtkAi(1Hsl+wsbVYR#XjJ9!c2eK+VS?UzrUL{HsLQLUk@@EApB z9>@p{)qiIAoO-nSn4IAd1mi zvI~45H0+fB<`;$U&de6)r=Hx?tmM>~buN>*5PYyc25(T#eLS;^Ma-FY#G&3qMbdjs z7-mx;JEb4sbe|D;V_4U(oX%$-<9{Z+DGbG~bvTFA0?GN=!`vx*G}kh4alZVyWV2=Q zQ+49qnT6_GO*=voED7+fwJ%c7&}G0!%rhFu*!QtMs02?c}{5CAwz7gBm+~@OX;FZ2a?U+y=eFQ6ANrSO8Uz1vxq4{~2j+O4a;BZl?grq7u7j_7unb@5>;&&OB26M2s zi&{L2BO9DmmzHkcw$oux-)6$v>a@Q{O_O;RzB$)&DQ=+Zi(F;S0gZx%BFJ9={)ewUZ~XcalW__aFGhkpQL z+1>F{4$D~x+SmOh3pTLudLMLUYd%r(l#R!EDm&ty3`N&e$jyQQG;o)XCpiBIjayx8 zMWm_LM^x3r4xfI{g_^TZeH`6}$6bh;77{-QeoKEYxM%tJ!9wnrml~xVlxnHsKsL*D zY~SU=$V9Hu?*sdw5w!;MWo*jZ_#Gi^Umv&ro_{k>K7q#c1tj&u4KJt|1+q1+}Mlw-7wfar=7NJVpy_W<#zQ$e}onk$zJSqk7-0qwwAww zDOPu#J9%=nU=>!Qu&`4Pc9gXwJV(6O9<5m@`Y9m(Sv%co?9^%7V%yD+o*sOr)!47P zudT{<%0|sSUh5^a+g~#^+AIRWZX*A*v00B=Io@MZdz`V-H_tL0_ zb+Jqy$~jB8U-+?C(EG~&A@Zi6*MG@vV#HnQRCgo|S-4XFyy8q~Pfs_ybenI8$?`&Y zVdne}@a%%0tOkt-+kSrh(9Dv6Ia6x{g4S|+4xnw5sjxQ^C5MST!)Hsp-@>KAj@A1! zwjJ%;#;8R0U%a*N*IzH0i?_rf;+1vdPT~moaaP=>!9H2_o7==;rFV7wXVqahfgwFU zKTqV|f`Pa>j+=u(20?|QxA;EbXB*ntY{a}7F)l8y%~V%ccSigx3?Rjo_R z{%{_lSjZsu_`KK{7x3JUzYkP*7A{#e^6)by8N>6PkGTAG9;c;Bp z+^{~xJz>)0BlKdyLcAn>y+2-Zd1A1n1=*RC7x=c!_(!w7A@-_8+kPYFwrnu*{F2cF z(K4TJquzNH02B`akMVSY*h8e`Ot--GFM7=ZJo703KBBokr^UuWJ^Wli2J!P_takK@ zF{{RF;~mY;eb2;(*e6R$oH?GLi>+49i#(vDm?GFXDBq&aO?CzS)ix++;=jxuQ9(N_ zn03wQ3VCkzK0z|qJCb`UG##wJ+`;wfUBvgiE@5cfth}KshtIKU>OG3(R-<+DD$@;J zdBJT+(sIRaovM`$g5Qwa*r!JfDlKc-nCfd(+O_rmBTdd!UshgTk~DDT1EtERI{BSV z&h3>tl+u@qS~MTRlDhMQ-ZH%sJtRqPVu%)3D29{7cU zqzCqQvz`?yci|~o$)$PuvXo%#0AIsTaa%rid`PV)dAnbU`1vWiEAjpVvqtsS8VSDw zr7nt$UgpR35Slb+;^fsyKnV79-npEZ*!p~@A~{~?&T`Nju2;?Df?XcGJ#!A0HQVGU z&ez7p6w}O1R?JJRQeWs)OxAd(jF-PD>3CXSkLA=n7}cZYAjUCiRUc2?trkK+G3!bM z>yH(84!!(cNudDNt&@o2jH=Gxy*L=jW0OUt*ll$2n8nPp0wvvL~f ze1ybF_*5w$Yon?#EP5NdWg;wGtsOcKVXh7o8_wT-jUk|3XnD^NGce}5#U-o_n;fD~ zk~m^eecFHUh%>z^)GJy`yu_{MlE7bQ)nw-A$7SQ!lL@md`lUczVoCbAew*QwNu!d= zbh)bGjl99yb@?^LHnf}V1i9{Mf%0&`c6XR1@fe+NNLr%4tCV&=U$m}JYEYw|*-3mb z7x)-POQIg9moPFvKT2OhgCWVw^^Bc)_H?ID4>5ciV@+_D;?66O1?!4Oufma&^LD?-OaFJ@`gbOaSlQwZ8R;u+ z|9fmW>Rxhk@(g!vu?OfDSkqlnDZWh};tqxHQ-L(>#y-e_U5*Upt`^laHhRm*%BC?G zZlAv*52<2f&w#M+hlSZKIp-ac+Ux!N{Q5zi>$J)d@PFT41_9%*)c%p%74^T;mFgiC zn<#4hj#!o`b*S|IuOfMx$mt?U(~wX7aM4XL+D+h&H*M04b;tRKV_&AHd-l!F<_Fc< zs2wRRoXH<9)C#x9Vu{<;rHrk5+!=4Mb6VN-l9~J(n+Au)z|$Q;x0uZy&lv%iaqJs| z>6z(jRh*lgN5Cs@+O*H0q6KLYome1iyQ!h4k#S6eQ_n;zlHru9WK>m;wXG)jH-MYK zRZd-Y>al?@ZqSjWzQs#0+Pw8GdbSwz@yB}u@nkP`OY>u&CFgsD<6`rxg)_78(UPOr zdnKel^1r1>*0J=E7(V-+rp(EMV09W@qvpd{Q*{U^ z0`;xUb(~oq!LIpWK^f` zSWIz)F38$mtMmMDGU|n!=>WW>@CmVx!?~KifGV6EiDjptIO&NfBL1I7WWFD-18ce$!gzt_1f?p3(0r3=jZYn|Kirssy)e%)P_w|4ONJ=Q9M9-!asuLq!r z6%PNd;Iz6g@mH^(dWDXe>@7iApCe$*{X4b3pW4ar zwQ%6R(Op#}Lrd$g4HuG#dS;-L-4Y)J1$zIw0|A%>p!U;zMgeg83$9`Wz}=5~|M$=H z^9b-k)z#J4fSriBb9N@H&P8~LZuwGI9|Ve7V~<>i;5LP0|fc;3cP&Vds~fe)HI zBpgnB8kQeAfAbk{RHM`BJyTQ8EFMqk^H=mC-Kwt~2p*d3^&W|Lbcv;4yuH0sK{FiQ z^w(gGZG!CX`@mG4r%B2GG>8*^Ny~SjU_d1M&G=8|!sIA`_9-;$Zv8vc>A$(7 zqj!1g{N~=e*K7NpY~*=7HO8?Y7k{xh0f4KQA5F3sSgP0$yCo52z&4@(f@2Rh9qs?@`OzH6`D-O9> zlELLzV7!?%`ix`yR8ss9wBWgsr{MwJll5h6P9TB0C4m((Do_Y*81s=MFK93l?%Ptn zVKVIzyRW(|iWRCnHBymHjq2(@hhr~&G)!CqDr`%6jZU8I5fx7-W|q6zpPrp*A8qK6 z=V7z-GdgQ7*i!*Jyi&^LgO;a~B1`2IB8QGo-c%vlx{i=qI{SRWE|rQYYW2Qmm(<60 zkB`AD#bGqvtPh?Gqexz!%o&hUBs|jAUwUbd{M~Wzvbe>nIrliv6u%!b zO--#!LZ$UxK_(<0_4qak#bM}2wAO7+2YBjfxirNxb=sY4g(P*VT|lbBBzOPqhK`b# zOJLds{p^=3G=O5>t8xK~^A z?O~SF=;gh!Wkt_GxHL=Mvdx`Hw`gD6`O?`6p{S(tXb0~iDbySI-7}x9%~S@G6yR#I z@oHOo`+h*t_zueC8Fn8J&$!`7CZLGve?2Ie z^wDq9cIq21?Azme9#7MSvbW?W z#(KF1UE*AUrsTJ{OC6&B9_*C@`)d^RkV-ST4mL|c(xy%wA15Eo+6WtCoTG8m6_d5} zPX6;4$dM&~4>_rd&>(Pknb`u`S~lp^M}75yaB12}8E*{pC@v{U zqf)6e9F8^k*4509{7CfyK+>B*uu~|d!TTXyctZ(9AFRHfo=bihOfse6t4%)Hz)yXL zKUn=0#MGp00nIN#AGL=7eQx^!Zgmi3Rlo_865fMi_=}JK(-g-C0}RN9(m4^O^uNHW z0iFP>&Yu6a27y+y8hwLkS(rkoSrsnWu>64ct<_T$j?HK_gvzbz=vMU%c3AuE6>wMQ z{CR-j-#Jr`tUpA;sc@{7-F4O;Kx-xKo~ubGVd^kj&#O3G%hYBby zc)?lGuMFkLrzgrA%M2klC0;}UUs50kz>Rjv@MC1r1@}#^b!A*5dh&W|Syy)z1@e3w zjQ{8n^4w1(3zsPluwgu+SR>smU~X0SrE6>cG(*O#-=S)9-Lc-n&tEM)T(0^hbxR%V zVoZr6$#E_q%}G^hG$aXSZ&J=-J%l^$lKJub9FsK)+beSE@k{q{V8nB1RQyabVn@&h zn#bs%SNMVGi}U0EG;^_rg;}B}J-23I)3dL1iervUQ+p{3hG{O{jdq=D9gD#Vu@)!9 zEz;)IH=8#q?I}d8t;b6Yi&JG|E94oGHB$5&{gJNphkdgRNK&y}bmx;s^PxoZv}O0O zH8b)h%G^q6(5}X@+!lqlcZ^*Rri=hLonm|Xg2b3qIG;_=Zr>`D25FRv1BTF;HrV1U zk_<0ZjNttBjqN7iEZ3MX2(}s~I5W5;jUh@4ayYM4v$I#RL7DBKjY>kQZ zU6tF+IXRZovPb^cmy>xatl?S3U}??!`4D5OV*vMIq;+Qt;O$H>+o@wz*&RsI6;{F z-chjf;yJL%+ULR+(x^u;J;c6AdqACM$;(GaQnz>vd#-MeFfZ+S{hE1eiY99~qGScg zxAuJrQr2}J>G-u`n5ErVONU{KdE;Uwb=%ZwhKpYEPzI{?c#K&7%rh}Xt}ZDcsPU37 zud~|OPqwY3{&1+#qLq{W<`=(dB%>VDJk#|INxYEeAE1c2ThBL6qO|DQRuPlBXyYU? z-IcaIg7*HNBmcys<$PdlC1iJu@2~++FbIS~B?j_4mB||(fApO|VBooHiev?SGn2~} z$j5=>Jl4}?cB`HGR1(H12MWR4(@%*1b>l|Bm%uBsu0~bzc6Vlaj#Pfvi8xcJ(l~~4 z8UU9Wz$Xh8?@TW#PFc1^Bfz^K#+F%(6T!)19@#$(aZivpCKY%XlXLS*WCa#3mT>|k zNL}Q&Ob>iYoHUr>28xy7n;L?nOtV*?FI3bOEbEY?oqt8wmeo})o8~LUxdRNZFm1XL zI1x;mTqpR()G%1@w$*idG&7c!VKi2Gc*aw%_I+FVLICb7oC&h4#n6`R6BA7_SnE}% zmIp6`#KnSdO^lI)J{a%Qbp+$=!1XBGJlFHWbf&N!4>@7WZ%GG=yqtd6hb@((C|Ene}I}~ z^+P@s@+Ku{N+sg!x`U9d-~GvzL_sY8_JF|V?D~WTk5WD1`|JCfJ>Zs97k>qvGslXa zeF??>fGpT_?7xL3e}1~YzW(GmCEN$d0a8`ajet#T@BV45tT_Y|xD#XmL@rJi3k3Nz z@bnsZJidp;Dg)o@)}7GPsmDaE-O&G-qW?~);=R6K6SNlter<-BmXvPh-u^pAry1hZdg`d<7*Yl#YCMkAKVV|BLJU*UZO&7*oK@*3ufx z92hWT-Kuamvb5?ktFrPF)be=ny>pi`QwuGENd8Z@W6w_5^`+fXALTIUZ+jN{&}%)^ zCr|i(wF1^!jkJx^Xr_fgX1i8{r;Gv@8iXa$k}7~%7N{fzNS-$UnY+8X_G*P^Vjekf z(>FUwt?X9pZBVHgvniD$uRduR%BXB9NU{LD&N?e7z;^B+m}M$Nqdc)S!VP@y`hqH@ z>nOuiEmENun8C9H&79^h;VN{dU^EZ!J_jKwLp^yX!5{qS<}1+}|G@ch#oUC{FR1td z_idRL3Aavjj?-BA4=k){3$hOeWge@K1xL}3s}K9Am}aJOxi>Efs;{cHX1C1Fq$OW@ zcRY%jsn`2@N2;=+ab3v#0=KTc)`cEW?QqapJkleG*m!uJmq3?C7$JzE#EUma9T-@P zn$>p|NAdl|cRv->ZKrR7r1(jq5G3|3gB4skHi} z0MiKU|5Y@}(PZWMd}4khwrkk8gfq1FQbP;U;?Olxg&!-b|lFvC;NF>O>5 zYVWC9FEd*x%M4$!nHd(R2RsLkt8-i4qZ`pO$LHW?9&(wrcNCQyBKt;$ltKWMF;4C8 zigLeD=?@2kyY0MOepASJ2}O`9ZaqP1E`3^T=>if`S872NRe+K63Rx*u!;(s0?;2Ex zpR=sJ#jC(EI?y9F!|ESFBM6Jqd7THnh+v^6n~k`>2AA`YpVASJB*_ z(xvB0>MdJpjaq87Z4}07y|RdT{Ijw@7(sXXVXY_|93ff9x}&l&Mq%9hV$pf`WY<=E z-$qw*@_m9`!h>~fPf8_WdfSQomT18a*ai42J(axD;~O`b6U(>EZbdZBvMD}~T{|}3 zzG(6907iCsOZ-1O;Uz;qVtwLZo^+vXp`59L{v}0eXTMyF*NuuNno2=5YZ5QDk25lL z$MwXyTnE($`H}{wOlG?uw`^6%A6}JLS#Ns|vlQ$(*@1H2Y!SMnRW~7#tK5?+oW*-Fy#bTMwxvdb_>}oLF(!kkom6ihnM; zxS@Fdh;O}^Vm9SWfu;9@Q5-?{^lJ$d#~`co+q*jZx{)WuZDfv%18*4jsC~%dN`z>e zf>^n2H9t`iN9L<9PQFw{-QtC({@|5|#&ctI;PF!9f8EcOn3B6}e z#1S%`DRW;TNmu;bZ1v}D=0L#BEsuF@T2Ol_K>FN_gI?ceZEqZVB;3Iwm~I|6ynce5 zHQ(Fokh~M)$Hw?(WU5a~I|Kzt*n=hAg_J7^kU;GRjN`)vQRHg#=dVWtMk>nZQB41( zQFSlhA7u}!1ZKHj*rGb(Xc2NtxgpK%1ml>Ib^O<^&m~u=dA&Jc>opGA8;mkcy&7d= z3Fx({WE8=-(A6}%5)0%H*pvoI=kS0^hp3xrv!Rl+Z(+2j3zvl2j>N`IF;p+aHpSs8 zfH+12>Y|l_LFkkE3oqCnAR%@hQMt5rit4_7s&(oOHE+%~aqmEBA^Jq(LFV_|2-fg& zwGAAfP>&jVJ98r2^1b=Yo(%MSttU0VhQ=8Sj(8Xj+8kJqn( zv=`6kB(;K<5yXw^l#>4xHOt-^jf3L4`yx0X{Wr&WfCpM_qetFro?f@x4g!!AOjAfe;G*S~ zFCa<}0EYh?JOA&9oma1pYR>yw3JW+OU`EN#0`{_%5fCoWrm(Iq=PyhMLI*sJgedyM z9IbLuD7~-)3Z*NBc2L+H9?1fW4JHa=EeuJo%={{X`8gOjznkfIa*qB%Yeiw^1_>wx z(l)6TCW$Egw?aWADNK&Me#JnA?7+Gaq+M$SAXO|xZ(Y>*KxU!^Bw5FT`{Wn0M}`Ev zMhDQR={NQp$ zE)zp^7n4Z+T;U=Tbl#0#Q*{6;G8!<1s1wFrjl3u}|5JZdLDI1KmjI znzgK+(Q6+}Kw58|txQjDhDWe+g$Ix^A~0AXe{E)wB2-R_a&@$C)D;a%0~$AwteEy? zfvlT>bt&J7^yqCg9A9uWF>)#i)^|D3D{0#KYIKkf{IQ2EATC{}H3=-^8Msn(rTo_F zIo<}JiYLo|Lq$s^{Rs@ht5Ou&CV>QfMw(I_0>U`{1d| zl}RZ5{1Zwts~wCzGv)4`v5h_Tgqr7L zma(@iU`32sS*Pf3_Ot(HqnpVVIfu4hSol+6!DZ+^A^8kP+HRnxmFmfOh?jPyZ_M2t z?bqpBwU#v{)&X^7{T9~&6$&q2+}iiH1Z`m9<%e4`ck&n7kIk1&Dd!zlLA{)>Gni8l zDqJyNJ><7Fq8B(ggRV-1wuUODKD00q^$yIo@U?ne5r{SgOH7M2TkHetI~QPmo;>@C6OTAmM4CQJjz z&pND9`q{(SgU~s7W`9t=*f3B>btYHO;TFob4p(t2yJ}y`-$!71WT(8R4iipJ( zUfFSvRXK7e(BKhY0N+j-&QC?Yc$K8gz#In!mEtpCw6__k=H(vUCe-zb6PCR1XLI_N7Fwd`$vrYK z%bIXq;?T&lN4FS=^wa{5SXPC)<18q5-IdO~Fi$b_4|8y8W%b|@*dvgQM@1g+u(~Y) zX!H+2YuL>SmnfwKDc7`{C(9Gx!98YqY?Sqj@;&m;4{%WYrd6TiFr{UP!J}5<#2Ix| z0imzO)amFrV7@q0n6MrEi=fO=U2zrg+_KW&3(mdf?;G;-xnhZ_njSOvW9Z9I`0qe1O zqm#Y60h{3@(>(?**(`_>Fn?vO-WB4^0VZJWgL{@Mpct z3Q!nr<;?em7gs?{;D@6<-o2u^vLKgzUjl^~Np_Qp-@{^)MP$hRA(ttO~InqN5uQRvZPq^HkgRxWm^G zZy+&u(KCe@(vnwvRz6??H`9JY2#^eVc!o@$G=#oIhoPaZ6MuA?;B|L6@0>=lLq(GS%>(VaAt`)GmXGhDtc~+_ z7wwXNxFPyU-RR|8u7ja61FxsT2A8v1hQ!VFv!;&V#c2!OpEZoF*+Tj)rh5 ze1PXBCW7z8EDJI|LSp?u?YoKpg06|9qaD zY!$MAJ~O_)CS=T@c~QbMEFXTZ(4IvduwW5Mg3+0A0Y>0z;#9Ql@!K5*S!ZpeF1^Sw z4%+Sir<;=mHF~idi7e;E7V%$Na=CDtrMN2`YzZ2Y*JbCKly#PlDZSJm>e7I1EHXJp?he>&^i&|Wb`0sV(CN#HObnKVG+SS7`b#hTB`}Wd;XgwsoIdo)bb>4+ z7}39Y*ngp2|5n`N4Nx@#aox!1TxqR)=CbtadqC>-F0yiTAoA^6?y4B8kSFxLk-Q{9TwcO;MGmQ=qIlSB~!UH?x$fW!yh2H{n1F9Jtj@0{1n?V0w{7<=kt3ujZ`CK2#zZLs0s zdUh~$$?g-NXeNXOh&HJ%z*;GzWj@>{$o=b(H%tqaah*pBx-u`*|lNJDYXv{AFp)EioYy=9b*hh<5um+tGeN`%w3PS@=ZRlqC*3@i{vrs`~0 ztDDJIr9K+o0y$^xZ$;0l@}YPo{(z$L)27-XdmB;k9)gqTEU<}RcB}sZ*_oZy677oL zn74MS5K50nsGaXDvaz-VR}8o><{=kB!<>P^EGf#3%?0Y`Y|qXwp(a5>$1Y%C>r?f? zgZH52Ck#90ixX(mDPYsvV(@k<&>sQKtsp;z=`eSuHi z)CqEY*7e_#U0ermfoctTGOE-WNGhmX>*|46Irg&CK-+E^MRO?gbmwpN8X+OLffeQx z02cXl{oOQylir+F(j^EyB9)Tns$n$06_u??vMY^T^by_DxPir=q|DQ(+oF~TVB0PS zeOPGMX;c!XB4Opk7W*DLU|B01?vS~er5m#2dZKp zlOUhb6uL1KSp2_? zIS>~>Q2ILr5BtyZ+JEv3(I4w7e}E{bGdDnEf8gvyr6N6`lQZ;=n0iphBKfm!?4LVC z8MedqQJ<4rzpUFm0I%`{C$u(d`jpuD1u~`|^a}qAlC1zn<8v2Y{i6fe>&Wl*qab{$2Gx5VGK*6Oj<-#iY5tR*Anoiw(W20V37$4YNCmpcqJ)o$;9td;&BmU^nDVO)MUIkf>FIMFq)QWiwkSv{t zM>QB>T9?tnZ$i4Gh}8Ws%T&_W)}}*E=WrFT>BeWz4t?MaX;<(s^AyRwX{=+5oso|G zSzahZGi1;i&eKgqAxW)`*aHV%imG>jnjw{4PDxFEO)RyiJ=20YPz2jaY}l;!+LmjBWe{@qkOmte;UT(XPu@8EF(Nzns*Nk=zb ziar%YtXV6eKka$HaUT?r%COkAV~45A)Jw74TE6SLcDP=a=Uxr1zRq2By~o2x)F`oa zG^y}nBL%wl@XVYl_r%CdrB)0zKRxE&`ONWfVFQP|NQs$tv_>VX>=ea--vYDv*q^za zui`k_7lT|ZpWXKGT6zWsfar|3nyqd|+gpw76hQso3d%lTe7=mDVayaOw3LkCH?Oy9 z^4T$X0`ZLRygMEiYe&htICUa;O^kU+am%VQ`6YUzZgT%n$@pRA?L%IXVG0=Q0qSeF zwEFb({TXg2jl$vj$1CB)#*ur)*1jXyG{^f5;AJ%nd=Cpd`ZeVWF~t;S`z{WBkeQsj zPeUPe*>$+sEFhL+w~Vj_Pl+yJ*f?-Qi7PgX$1y*~DLn#j$}z{|Vwp^k($?{L?;tOsvYEWe!NT~;<)hkr9Zg%ehlWF`}4tSZc4XbRlOUB&D)9U#hGTypb~ zn~wAO)s|P*MHMce{sqW%#fnW*I{NuhRQWvAT7e9`}~J@)zJ*Vge?rv4~FwWu|}iuNg{d5TSYL- z9f*~{n+?02Aimu<>|rcT6IitL#9HkFd&vG<}v48uwEZ&AZAeN^)hs;p)vqhH{;8lzYkC1ekrGN z7i5E{7f+?dy*#L8lvy9Rr{+w4Kx6Ah=-kRKZg&_7g^VT)CZjk&TVI`mE>|W}E7>m| z-`+n@BzF=U8jvKX*f51~tFvb(Tl6j4D?iq|UXp_(8T!22GeIVP*Fc!MnUHLZ_`M}M z_Qzi5FcL`P$?Bl`t^XQ3rJ-em(Z-vR_l>eX<9ih4m|G zl;KpQhT$w^JUk+s6oh5RN*lEo!vu3+^N^jR@6G)^dDRR)YdWG5lhx<10ROJhz5#e{ zN!@n`Z^>FXZD*l#^ljn2=O@-^eJusv3B)5r8Z{ARy}w^-3s{Cz)Hzd%S)pQFn;~hE z2_InXikG@^X4&svFImw!YwG@kr6lLM6Kk{TA>j3G*o7rc0`;)LqGpV#VzxUKiOiYh zF}c!}ja)y1l=-Ng2A#5c{)&Iv4*wqb!KROt>h<3)y+q(9=4FZnUB(f`dOPIlF%WNFpLdWgLIA;;2k+yTH z@W|TfwG+4a-K@;P?uB3WAoCqb{uk6tWwuBBF>tlcsoR-=>N&1-99{n&8;Fw-lR%ED2nI9ExQVD2r9G%6c-l?R zhGMxtHfo~SFL-p=MWPpACnk*2_q*04j-EQ%-5{rx<%}PhH`6&6O!D%>_txmOxo&Jo zUj_kpm~>%4m1(-oBQqUK2k^H-?{OUpXl>=spXqZewO@8y^iLZ;ipef|{7fuv?Gt^s z@yo%8A9$Wml2HeOuuaq%_twID?K`8PSm=Y8#>G?t?@wEJwV^97+c6TLk#(;f|2M6T zi~BNlAHwIh+M)1^P~>{Z7L`rf%LpUdwV(hjVrEO2UPuvpd8e&`o<<8N%|#Fw?`V)Wf<7gd6}${n8NFZTzU&jew4`x?!tfe>BE;Ga z?*z}fE7rzo8q^^ij$Lwq(40IO`zCZff1kP2c6|#6r;09!D2OYW&Ia=uw40K>ncWbskegVh+!!EN? zS*Pw&rO)E)&ZG|Cn}N82QSe&1b6oKYxY@Ph(7CV$qfxiCp&&4H`=|mK?S0H2Nd~s+ z+!e~tMO93Jtk9|Zi7-NGPf6fDUt9T;iRY}AoRv7Mj`!(P=e)&ArB;BoLyZ!WN z#jL(03}xRAR-epte){EL=}w)a%gjXKftoOWEVF&Cp`r!Ylx5$h;t>TISx zqzXG#eDC@%B_h0kT09|sep-45GwTTDu7W~&bUbM4rt1yw-FQ7bW3~Ip@RMqzLEnHP zH_n*3lRo}iNs&OvCgj#12O}1ffRRGwz0k0p z2TDg*il(dUg+^nC;%p{!vqi0OSXzZ(eV{JB^!Q7!mtuvhfktaFCm`g%EIUzzm!1E_@(bFCR zPg{z$hS-n+wX> zfwqUB14A2nJ+jGtu4&GuZ*tDesRHBJs(&^9(eKO87ZBP28xJhXI{HqBynv6HU)k(> z%0i(^UbIX#;l(Wl59q>|tCeDfc9gpBbXHD~D~aJt>?G$Byv9u{ee6*`GkTd4@EH~2 z7$-I{MM5y$8xYgv^Kf)@nYZRtKR_Dih4_t-(-CD0`cC)k3 z83&D7>=%2m7YYf##0Bu^UW*!3`S9n358?=@`7F=-0o{NPxn$l_!O+6a@r#Sv7l09nSkb5bHo0_K%LYvRsnsx5VTj#Gidraoj)IvUw~fCaN>QdYIHtW| zLH6xhdCSJT0i@#k&p;Ehyp&?+bhO(|3mB9u*hJKTfzvF;@VUX?izg~Jb|&HweXF}8IZHubR$%xAEDhW^MQ)So&|jT6Qr&{i78az_9;0feh4T) z|6Zy3Nh}f%>e+yDa#hsY8w#ACb#)oCz{_1L#eEHEJW*X*#NU1x@ty1W>cS(snUZj~ z3o~i&_e9Wj9*+&ES)Lh5@dirhuzMvu9Y$t4#J=lxe?Ryz&QMZ=^nH zdYrw!o|a7=uDzr~*}#J7qCRbCu_^M@OmRN5MXeH>h8@qlunO z-91s$Vk4CO2GncK3pm*3wRIt}p^ol9g{12jZ5!e$i)+2`Klyv8TjYu7abG%aR!=YV z`|9P*pN~k(`OkbK?y2PC~bp4vN}r(kr`NJ5SHZQu*N4k!M7g?NjS z3+}c4>pJ|eU%yDYE?Eh=iqnc9Pt2p#W6*npmR8>%uS3ZzSJ!q&$Gu}7ZsoNZZ@C|F z*5t}c|G1uDiU+zS>61)#QjF;(r1Ve4hlN*p`Q*;Ot2)8ap6D#iJ-#QlWbhWB z?^{nD&OQDe72WX8k!YolN)Jz`cJlj=5AULKhs>SS#J1%N7G;HbPttM~8>364Ive~< zaB4Drqb$7!;g{1MA#3$09q+1({jZ_7q$r|}k_+x+*R3rafHmYH;XP)2Z_9^=$I!{( zwMn^6N5<6o4Gk>?(FrS+IWd*%*CQ96IA$1kp%utaP9KWxyS`CyHXWHd=r#B-BMG7G z>_Gd~HNCB-p@_Pa(sN{?&U18fmC6qfy{NXp;=CHZ946+GYMlN=Gl0s6+fwFU=TmjW zuk~~ivE0C|!77)gA&1X0|hg4ok=4#o6=m7v> zL^C9zPOq$OmzrO4%2BY3+`Dt>fDrXdi|X`K%l3V-Ql_rPrc&F}kffW>*`;m6lZT~q zh_yI<>S-L|e$Nfob^Eg8*rhDxrYG#;&J1ikC!mF$cGy~ZZkb!QZ6Y+4Q`#S9MnDa2 zUb&v?u2be3#ZT_7dL8-3%sZk2+-`#*X;y>WcE?>{@qEc(1g}q9dAz_f_OM{Z6%9J$ zB#3=xzILl+t`{m?Q+w6u;B8q~ywBhykoaPyYvM|N&8%L;yE+p=0F>a;`T~$; zH&anG>E-FFlawa9GC6fhV?5I-g!<*u)LiAHz_acNm7ssA;*#~2lV)?tDOuHXj32Aq zD(h*1k*>L2VB#ZOedHFkSzeklRlc0Z;3hjkkWaero-K@?=v;KMpcKKL+S)n?w!YqhfWXPs7K|i zTn)Cysj1YRw)QoHSyp-tXp%s;uT}>+msouh3|I5bt9k{k|_H`)Xt>QM3kEZD&uHhN^oinG#S4;+Tzp*2U~rP zx5g0a_vIse)vz{sX*ZO17nEe#J!(-4$HqiclWAmgK`3|>EwN9%R{iPSg99FyDm`KlVXZN-N#I7jr?3qP_}i#J?hCQ zkIl5eaL|@^5`D~5+=frzV#^|24FD-Lo@N8`MFgo|0Qqqa(9#L=(Zb ziZDGdOe*`5t=Yi~yciqf zB;&D$NcV!#)*sI+>YJg@^&m_v_}94WD!Y2ILicrXOMB0b;Km>vq5iOW!S#4L>uCQ< z!l)m#6)ioL$xgUGj4kX*7hSs&>$o#g@OQaibRJ;rfzhsKIxk$kEP3$4?jO67j4FA5 zq89GIo3T#PF@({sD0~;?qHh{NMoFm}P)*%0D*dWmc883f8P<%2te72 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