From 2d9047f6b35bb839e3e809d78b0445fff892194d Mon Sep 17 00:00:00 2001 From: Hamza Hajeir Date: Sat, 17 Oct 2020 21:16:17 +0300 Subject: [PATCH 01/11] Fix CR #40 --- Adafruit_Thermal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adafruit_Thermal.cpp b/Adafruit_Thermal.cpp index 72b2dec..cf41ec4 100644 --- a/Adafruit_Thermal.cpp +++ b/Adafruit_Thermal.cpp @@ -142,7 +142,7 @@ void Adafruit_Thermal::writeBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d) { // The inherited Print class handles the rest! size_t Adafruit_Thermal::write(uint8_t c) { - if (c != 0x13) { // Strip carriage returns + if (c != 13) { // Strip carriage returns timeoutWait(); stream->write(c); unsigned long d = BYTE_TIME; From 6ba0da3ff6ee7014c330a4276c18b7f3feeca2fc Mon Sep 17 00:00:00 2001 From: digidigital Date: Thu, 25 May 2017 22:30:16 +0200 Subject: [PATCH 02/11] Update Adafruit_Thermal.h Generic ESC/POS support for QR-codes --- Adafruit_Thermal.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Adafruit_Thermal.h b/Adafruit_Thermal.h index 71d257d..cc7a622 100644 --- a/Adafruit_Thermal.h +++ b/Adafruit_Thermal.h @@ -88,6 +88,18 @@ #define CODEPAGE_THAI2 45 //!< Thai 2 character code page #define CODEPAGE_CP856 46 //!< Hebrew character code page #define CODEPAGE_CP874 47 //!< Thai character code page + +//QR barcode models +#define MODEL_1 49 +#define MODEL_2 50 +#define MICRO_QR 51 + +//QR Code error correction levels +#define LEVEL_L 48 +#define LEVEL_M 49 +#define LEVEL_Q 50 +#define LEVEL_H 51 + #else #define UPC_A 0 #define UPC_E 1 @@ -214,6 +226,20 @@ class Adafruit_Thermal : public Print { * @param fromStream Stream to get bitmap data from */ printBitmap(Stream *fromStream), + /*! + * @brief Prints a QR Code, Only works on printers with support for this feature + * @param text + * @param errCorrect + * @param moduleSize + * @param model + * @param timeoutQR + */ + printQRcode(char *text, uint8_t errCorrect=48, uint8_t moduleSize=3, uint8_t model=50, uint16_t timeoutQR=4000000L), + /*! + * @brief Re-Prints a QR Code, Only works on printers with support for this feature + * @param timeoutQR + */ + reprintQRcode(uint16_t timeoutQR=4000000L), /*! * @brief Sets text to normal mode */ From 88999edc3aa15d0221cd40b98a0104391b26b5d1 Mon Sep 17 00:00:00 2001 From: digidigital Date: Thu, 25 May 2017 22:32:19 +0200 Subject: [PATCH 03/11] Update Adafruit_Thermal.cpp Generic ESC/POS support for QR Codes --- Adafruit_Thermal.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/Adafruit_Thermal.cpp b/Adafruit_Thermal.cpp index cf41ec4..57dd6dc 100644 --- a/Adafruit_Thermal.cpp +++ b/Adafruit_Thermal.cpp @@ -646,3 +646,59 @@ void Adafruit_Thermal::setCharSpacing(int spacing) { } // ------------------------------------------------------------------------- + +// Standard ESC/POS commands that work only on printers that support these commands + +void Adafruit_Thermal::printQRcode(char *text, uint8_t errCorrect, uint8_t moduleSize, uint8_t model, uint16_t timeoutQR) { //Store data and print QR Code + + //Set QR-Code model + //Range + // 49 selects Model 1 + // 50 selects Model 2 + // 51 selects Micro QR-Code + if (model<49 || model>51) model=50 ; // if out of allowed range set model 2 as fallback. Some printers ignore this setting and use e.g. Model 2 in any case! + writeBytes(ASCII_GS, '(', 'k', 4); + writeBytes(0, 49, 65, model); + writeBytes(0); + + //Module size in pixels (fn=167) + //Range: + //1 <= n <= 16 + if (moduleSize<1 || moduleSize>16) moduleSize=3; // Default = 3 + writeBytes(ASCII_GS, '(', 'k'); + writeBytes(3, 0, 49, 67); + writeBytes(moduleSize); + + //Set error correction level fn=169 + // 48 selects error correction level L 7% + // 49 selects error correction level M 15% + // 50 selects error correction level Q 25% + // 51 selects error correction level H 30% + if (errCorrect<48 || errCorrect>51) errCorrect=48; // if incorrect level is specified take level l + writeBytes(ASCII_GS, '(', 'k'); + writeBytes(3, 0, 49, 69); + writeBytes(errCorrect); //Default = 48 + + //Store the QR Code data in the symbol storage area. (fn=180) + writeBytes(ASCII_GS, '(', 'k'); + uint16_t len = strlen(text); + + writeBytes((uint8_t)((len+3)%256), (uint8_t)((len+3)/256)); //pL , pH -> pL and pH specify the parameter count (pL + pH x 256) in bytes after cn + writeBytes(49, 80, 48); + for(uint16_t i=0; i Date: Thu, 25 May 2017 22:44:13 +0200 Subject: [PATCH 04/11] Update Adafruit_Thermal.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adde yield() to timeoutWait() in order to "feed" the ESP8266´s watchdog timer. Arduino reference guide describes yield() -> Passes control to other tasks when called. Ideally yield() should be used in functions that will take a while to complete. --- Adafruit_Thermal.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Adafruit_Thermal.cpp b/Adafruit_Thermal.cpp index 57dd6dc..da59083 100644 --- a/Adafruit_Thermal.cpp +++ b/Adafruit_Thermal.cpp @@ -80,12 +80,10 @@ void Adafruit_Thermal::timeoutSet(unsigned long x) { // This function waits (if necessary) for the prior task to complete. void Adafruit_Thermal::timeoutWait() { - if (dtrEnabled) { - while (digitalRead(dtrPin) == HIGH) - ; + if(dtrEnabled) { + while(digitalRead(dtrPin) == HIGH){yield();}; } else { - while ((long)(micros() - resumeTime) < 0L) - ; // (syntax is rollover-proof) + while((long)(micros() - resumeTime) < 0L){yield();}; // (syntax is rollover-proof) } } From 37f8ef82275e1a89568fdab577de5760b6308591 Mon Sep 17 00:00:00 2001 From: digidigital Date: Thu, 25 May 2017 23:05:02 +0200 Subject: [PATCH 05/11] Update keywords.txt --- keywords.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/keywords.txt b/keywords.txt index cb01255..461ccfc 100644 --- a/keywords.txt +++ b/keywords.txt @@ -39,10 +39,13 @@ inverseOn KEYWORD2 inverseOff KEYWORD2 setDefault KEYWORD2 - +underlineOn KEYWORD2 +underlineOff KEYWORD2 +printQRcode KEYWORD2 +reprintQRcode KEYWORD2 ####################################### # Constants (LITERAL1) -####################################### \ No newline at end of file +####################################### From c23519ca0c828e47c3f519f0b96919df5745cdac Mon Sep 17 00:00:00 2001 From: Benjamin Olayinka Date: Tue, 16 Oct 2018 21:38:45 +0200 Subject: [PATCH 06/11] initial commit --- Adafruit_Thermal.cpp | 194 ++++- Adafruit_Thermal.h | 111 ++- LICENSE | 22 + README.md | 24 +- defineExample | 99 +++ examples/A_printertest/A_printertest.ino | 41 +- examples/A_printertest/Hal9klogo.h | 546 ++++++++++++++ examples/A_printertest/adalogo.h | 0 examples/A_printertest/adaqrcode.h | 0 examples/A_printertest/hal9kqrcode.h | 693 ++++++++++++++++++ examples/B_charsets/B_charsets.ino | 36 +- examples/C_barcodes/C_barcodes.ino | 15 +- keywords.txt | 11 +- .../bitmapImageConvert/bitmapImageConvert.pde | 0 ruby/Gemfile | 0 ruby/Gemfile.lock | 0 ruby/License.txt | 0 ruby/sample_ascii.txt | 0 18 files changed, 1689 insertions(+), 103 deletions(-) create mode 100755 LICENSE create mode 100644 defineExample mode change 100644 => 100755 examples/A_printertest/A_printertest.ino create mode 100755 examples/A_printertest/Hal9klogo.h mode change 100644 => 100755 examples/A_printertest/adalogo.h mode change 100644 => 100755 examples/A_printertest/adaqrcode.h create mode 100755 examples/A_printertest/hal9kqrcode.h mode change 100644 => 100755 examples/B_charsets/B_charsets.ino mode change 100644 => 100755 examples/C_barcodes/C_barcodes.ino mode change 100644 => 100755 processing/bitmapImageConvert/bitmapImageConvert.pde mode change 100644 => 100755 ruby/Gemfile mode change 100644 => 100755 ruby/Gemfile.lock mode change 100644 => 100755 ruby/License.txt mode change 100644 => 100755 ruby/sample_ascii.txt diff --git a/Adafruit_Thermal.cpp b/Adafruit_Thermal.cpp index da59083..4647083 100644 --- a/Adafruit_Thermal.cpp +++ b/Adafruit_Thermal.cpp @@ -35,8 +35,7 @@ // operation, a few rare specimens instead work at 9600. If so, change // this constant. This will NOT make printing slower! The physical // print and feed mechanisms are the bottleneck, not the port speed. -#define BAUDRATE \ - 19200 //!< How many bits per second the serial port should transfer +#define BAUDRATE 19200 //!< How many bits per second the serial port should transfer // ASCII codes used by some of the printer config commands: #define ASCII_TAB '\t' //!< Horizontal tab @@ -136,11 +135,35 @@ void Adafruit_Thermal::writeBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d) { timeoutSet(4 * BYTE_TIME); } +// Riva Addition _ Updated +void Adafruit_Thermal::writeBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d, uint8_t e, uint8_t f, uint8_t g, uint8_t h) { + timeoutWait(); + stream->write(a); + stream->write(b); + stream->write(c); + stream->write(d); + stream->write(e); + stream->write(f); + stream->write(g); + stream->write(h); + timeoutSet(8 * BYTE_TIME); +} + // The underlying method for all high-level printing (e.g. println()). // The inherited Print class handles the rest! size_t Adafruit_Thermal::write(uint8_t c) { if (c != 13) { // Strip carriage returns + #ifdef DENMARK + if(c == 0xC3){c = 0x00;} // + if(c == 0xA5){c = '}';} // Danish å + if(c == 0xB8){c = '|';} // Danish ø + if(c == 0xA6){c = '{';} // Danish æ + if(c == 0x85){c = ']';} // Danish Å + if(c == 0x98){c = '\\';} // Danish Ø + if(c == 0x86){c = '[';} // Danish Æ + #endif // end ifdef DENMARK + timeoutWait(); stream->write(c); unsigned long d = BYTE_TIME; @@ -156,6 +179,7 @@ size_t Adafruit_Thermal::write(uint8_t c) { } timeoutSet(d); prevByte = c; + } return 1; @@ -206,11 +230,10 @@ void Adafruit_Thermal::begin(uint8_t heatTime) { // is n(D7-D5)*250us. // (Unsure of the default value for either -- not documented) -#define printDensity 10 +#define printDensity 20 // 100% (? can go higher, text is darker but fuzzy) +#define printBreakTime 1 // 500 uS -#define printBreakTime 2 - - writeBytes(ASCII_DC2, '#', (printBreakTime << 5) | printDensity); + //writeBytes(ASCII_DC2, '#', (printBreakTime << 5) | printDensity); // Enable DTR pin if requested if (dtrPin < 255) { @@ -219,9 +242,11 @@ void Adafruit_Thermal::begin(uint8_t heatTime) { dtrEnabled = true; } - dotPrintTime = 30000; // See comments near top of file for - dotFeedTime = 2100; // an explanation of these values. - maxChunkHeight = 255; + dotPrintTime = 1; // See comments near top of file for 30000 //Fastes print speed + dotFeedTime = 1; // an explanation of these values. 2100 //Fastes print speed + maxChunkHeight = 255; + + setDefault(); } // Reset printer to default state. @@ -237,9 +262,10 @@ void Adafruit_Thermal::reset() { #if PRINTER_FIRMWARE >= 264 // Configure tab stops on recent printers writeBytes(ASCII_ESC, 'D'); // Set tab stops... - writeBytes(4, 8, 12, 16); // ...every 4 columns, - writeBytes(20, 24, 28, 0); // 0 marks end-of-list. + writeBytes( 4, 8, 12, 16); // ...every 4 columns, + //writeBytes(20, 24, 28, 0); // 0 marks end-of-list. //commented out to remove x( of first line #endif + } // Reset text formatting parameters. @@ -253,8 +279,8 @@ void Adafruit_Thermal::setDefault() { underlineOff(); setBarcodeHeight(50); setSize('s'); - setCharset(); - setCodePage(); + setCharset(CHARSET_DENMARK1); + setCodePage(CODEPAGE_ISO_8859_1); } void Adafruit_Thermal::test() { @@ -407,7 +433,9 @@ void Adafruit_Thermal::feedRows(uint8_t rows) { column = 0; } -void Adafruit_Thermal::flush() { writeBytes(ASCII_FF); } +void Adafruit_Thermal::flush() { + writeBytes(ASCII_FF); +} void Adafruit_Thermal::setSize(char value) { uint8_t size; @@ -446,10 +474,107 @@ void Adafruit_Thermal::underlineOn(uint8_t weight) { void Adafruit_Thermal::underlineOff() { writeBytes(ASCII_ESC, '-', 0); } -void Adafruit_Thermal::printBitmap(int w, int h, const uint8_t *bitmap, - bool fromProgMem) { - int rowBytes, rowBytesClipped, rowStart, chunkHeight, chunkHeightLimit, x, y, - i; +void Adafruit_Thermal::printBitmap( int w, int h, const uint8_t *bitmap, bool fromProgMem) { + + int rowBytes, rowBytesClipped, rowStart, chunkHeight, x, y, i; + + rowBytes = (w + 7) / 8; // Round up to next byte boundary + + writeBytes(ASCII_GS, 'v', '0', 0, rowBytes % 256, rowBytes / 256, h % 256, h / 256); + i = 0; + for(y=0; y < h; y++) { + for(x=0; x < rowBytes; x++, i++) { + writeBytes(fromProgMem ? pgm_read_byte(bitmap + i) : *(bitmap+i)); + } + } + timeoutSet(h * dotPrintTime); + prevByte = '\n'; +} + +//this is a ridiculous vertical dot print define, not a horizontal raster. +//to print a c header string, you must transpose (rotate and flip) and image first +//also beware of switched height vs width when the image is transposed +void Adafruit_Thermal::defineBitImage( int w, int h, const uint8_t *bitmap) { + + int colBytes, rowBytes, rowBytesClipped, rowStart, chunkHeight, x, y, i; + + rowBytes = (w + 7) / 8; // Round up to next byte boundary + colBytes = (h + 7) / 8; + + writeBytes(0x1D, 0x2A, rowBytes, colBytes); + i = 0; + for(y=0; y < h; y++) { + for(x=0; x < rowBytes; x++, i++) { + writeBytes(pgm_read_byte(bitmap + (i))); + } + } + timeoutSet(h * dotPrintTime); + prevByte = '\n'; +} + +void Adafruit_Thermal::printDefinedBitImage(int mode){ + writeBytes(0x1D, 0x2F, mode); +} + +//this is a ridiculous vertical dot print, not a horizontal raster. +//to print a c header string, you must transpose (rotate and flip) and image first +//also beware of switched height vs width when the image is transposed +//n=1 NV images +void Adafruit_Thermal::defineNVBitmap( int w, int h, const uint8_t *bitmap) { + int colBytes, rowBytes, rowBytesClipped, rowStart, chunkHeight, x, y, i; + + rowBytes = (w / 8); //Round up to next byte boundary for columns, which are transposed rows + colBytes = (h + 7) / 8; + + writeBytes(0x1C, 0x71, 1); + writeBytes(rowBytes % 256, rowBytes / 256, colBytes % 256, colBytes / 256); + i = 0; + for(y=0; y < colBytes; y++) { + for(x=0; x < w; x++, i++) { + writeBytes(pgm_read_byte(bitmap + i)); + } + } +} + +//n=2 NV images +void Adafruit_Thermal::defineNVBitmap( int w1, int h1, const uint8_t *bitmap1, int w2, int h2, const uint8_t *bitmap2) { + int colBytes, rowBytes, rowBytesClipped, rowStart, chunkHeight, x, y, i; + + rowBytes = (w1 / 8); //Round up to next byte boundary for columns, which are transposed rows + colBytes = (h1 +7)/ 8; + + //write n=1 image + writeBytes(0x1C, 0x71, 2); + writeBytes(rowBytes % 256, rowBytes / 256, colBytes % 256, colBytes / 256); + i = 0; + for(y=0; y < colBytes; y++) { + for(x=0; x < rowBytes * 8; x++, i++) { + writeBytes(pgm_read_byte(bitmap1 + i)); + } + } + + //write n=2 image + rowBytes = (w2 / 8); + colBytes = (h2 + 7) / 8; + writeBytes(rowBytes % 256, rowBytes / 256, colBytes % 256, colBytes / 256); + i = 0; + for(y=0; y < colBytes; y++) { + for(x=0; x < rowBytes*8; x++, i++) { + writeBytes(pgm_read_byte(bitmap2 + i)); + } + } +} + +void Adafruit_Thermal::printNVBitmap(int n, int mode){ + writeBytes(0x1C, 0x70, n, mode); +} + + + +void Adafruit_Thermal::printBitmap_ada( + int w, int h, const uint8_t *bitmap, bool fromProgMem) { + int rowBytes, rowBytesClipped, rowStart, chunkHeight, chunkHeightLimit, + x, y, i; rowBytes = (w + 7) / 8; // Round up to next byte boundary rowBytesClipped = (rowBytes >= 48) ? 48 : rowBytes; // 384 pixels max width @@ -471,7 +596,7 @@ void Adafruit_Thermal::printBitmap(int w, int h, const uint8_t *bitmap, if (chunkHeight > chunkHeightLimit) chunkHeight = chunkHeightLimit; - writeBytes(ASCII_DC2, '*', chunkHeight, rowBytesClipped); + writeBytes(ASCII_ESC, '*', chunkHeight, rowBytesClipped); //ASCII_DC2 for (y = 0; y < chunkHeight; y++) { for (x = 0; x < rowBytesClipped; x++, i++) { @@ -485,9 +610,9 @@ void Adafruit_Thermal::printBitmap(int w, int h, const uint8_t *bitmap, prevByte = '\n'; } -void Adafruit_Thermal::printBitmap(int w, int h, Stream *fromStream) { - int rowBytes, rowBytesClipped, rowStart, chunkHeight, chunkHeightLimit, x, y, - i, c; +void Adafruit_Thermal::printBitmap_ada(int w, int h, Stream *fromStream) { + int rowBytes, rowBytesClipped, rowStart, chunkHeight, chunkHeightLimit, + x, y, i, c; rowBytes = (w + 7) / 8; // Round up to next byte boundary rowBytesClipped = (rowBytes >= 48) ? 48 : rowBytes; // 384 pixels max width @@ -509,7 +634,7 @@ void Adafruit_Thermal::printBitmap(int w, int h, Stream *fromStream) { if (chunkHeight > chunkHeightLimit) chunkHeight = chunkHeightLimit; - writeBytes(ASCII_DC2, '*', chunkHeight, rowBytesClipped); + writeBytes(ASCII_ESC, '*', chunkHeight, rowBytesClipped); //ASCII_DC2 for (y = 0; y < chunkHeight; y++) { for (x = 0; x < rowBytesClipped; x++) { @@ -538,7 +663,7 @@ void Adafruit_Thermal::printBitmap(Stream *fromStream) { tmp = fromStream->read(); height = (fromStream->read() << 8) + tmp; - printBitmap(width, height, fromStream); + printBitmap_ada(width, height, fromStream); } // Take the printer offline. Print commands sent after this will be @@ -586,11 +711,7 @@ void Adafruit_Thermal::wake() { // ability. Returns true for paper, false for no paper. // Might not work on all printers! bool Adafruit_Thermal::hasPaper() { -#if PRINTER_FIRMWARE >= 264 - writeBytes(ASCII_ESC, 'v', 0); -#else - writeBytes(ASCII_GS, 'r', 0); -#endif + writeBytes(0x10, 0x04, 4); int status = -1; for (uint8_t i = 0; i < 10; i++) { @@ -643,6 +764,21 @@ void Adafruit_Thermal::setCharSpacing(int spacing) { writeBytes(ASCII_ESC, ' ', spacing); } +// Cut paper. +void Adafruit_Thermal::cut(){ + writeBytes(ASCII_GS, 'V', 0); +} + +// Make printer beep +void Adafruit_Thermal::beep(){ + writeBytes(ASCII_ESC, 'o'); + //writeBytes(30); +} + +void Adafruit_Thermal::setBeep(int sec) { + writeBytes(ASCII_GS, 'o', sec); +} + // ------------------------------------------------------------------------- // Standard ESC/POS commands that work only on printers that support these commands diff --git a/Adafruit_Thermal.h b/Adafruit_Thermal.h index cc7a622..cca228e 100644 --- a/Adafruit_Thermal.h +++ b/Adafruit_Thermal.h @@ -2,15 +2,13 @@ * @file Adafruit_Thermal.h */ -#ifndef ADAFRUIT_THERMAL_H -#define ADAFRUIT_THERMAL_H +#ifndef Pos_Printer_H +#define Pos_Printer_H -/*! - * *** EDIT THIS NUMBER *** Printer firmware version is shown on test - * page (hold feed button when connecting power). Number used here is - * integerized, e.g. 268 = 2.68 firmware. - */ -#define PRINTER_FIRMWARE 268 +// *** EDIT THIS NUMBER *** Printer firmware version is shown on test +// page (hold feed button when connecting power). Number used here is +// integerized, e.g. 268 = 2.68 firmware. +#define PRINTER_FIRMWARE 629 //268 #include "Arduino.h" @@ -213,19 +211,27 @@ class Adafruit_Thermal : public Print { * @param bitmap Bitmap data, from a file. * @param fromProgMem */ - printBitmap(int w, int h, const uint8_t *bitmap, bool fromProgMem=true), + printBitmap(int w, int h, const uint8_t *bitmap, bool fromProgMem = true), /*! - * @brief Prints a bitmap + * @brief Prints a bitmap : Adafruit's code + * @param w Width of the image in pixels + * @param h Height of the image in pixels + * @param bitmap Bitmap data, from a file. + * @param fromProgMem + */ + printBitmap_ada(int w, int h, const uint8_t *bitmap, bool fromProgMem=true), + /*! + * @brief Prints a bitmap : Adafruit's code * @param w Width of the image in pixels * @param h Height of the image in pixels * @param fromStream Stream to get bitmap data from */ - printBitmap(int w, int h, Stream *fromStream), + printBitmap_ada(int w, int h, Stream *fromStream), /*! - * @brief Prints a bitmap + * @brief Prints a bitmap : Adafruit's code * @param fromStream Stream to get bitmap data from */ - printBitmap(Stream *fromStream), + printBitmap_ada(Stream *fromStream), /*! * @brief Prints a QR Code, Only works on printers with support for this feature * @param text @@ -243,6 +249,8 @@ class Adafruit_Thermal : public Print { /*! * @brief Sets text to normal mode */ + + normal(), /*! * @brief Reset the printer @@ -351,7 +359,57 @@ class Adafruit_Thermal : public Print { /*! * @brief Wakes device that was in sleep mode */ - wake(); + wake(), + + /*! + * @brief Cuts the paper + */ + cut(), + /*! + * @brief Run beep + */ + beep(), + /*! + * @brief Define Bit Image + * @param w Width + * @param h Height + * @param bitmap Bitmap pointer + */ + defineBitImage( int w, int h, const uint8_t *bitmap), + /*! + * @brief Print the defined Bit Image + * @param mode + */ + printDefinedBitImage(int mode=0), + /*! + * @brief Print NV Bit Image + * @param n + * @param mode + */ + printNVBitmap(int n, int mode=0), + /*! + * @brief Define NV Bitmap + * @param w Width + * @param h Height + * @param bitmap Bitmap pointer + */ + defineNVBitmap(int w, int h, const uint8_t *bitmap), + /*! + * @brief Define NV Bitmap + * @param w1 First Width + * @param h1 First Height + * @param bitmap1 First Bitmap pointer + * @param w2 Second Width + * @param h2 Second Height + * @param bitmap2 Second Bitmap pointer + */ + defineNVBitmap(int w1, int h1, const uint8_t *bitmap1,int w2, int h2, const uint8_t *bitmap2), + /*! + * @brief Sets beep duration + * @param sec seconds + */ + setBeep(int sec); + bool /*! * @brief Whether or not the printer has paper @@ -372,14 +430,21 @@ class Adafruit_Thermal : public Print { dtrPin; // DTR handshaking pin (experimental) boolean dtrEnabled; // True if DTR pin set & printer initialized unsigned long - resumeTime, // Wait until micros() exceeds this before sending byte - dotPrintTime, // Time to print a single dot line, in microseconds - dotFeedTime; // Time to feed a single dot line, in microseconds - void writeBytes(uint8_t a), writeBytes(uint8_t a, uint8_t b), - writeBytes(uint8_t a, uint8_t b, uint8_t c), - writeBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d), - setPrintMode(uint8_t mask), unsetPrintMode(uint8_t mask), - writePrintMode(); + resumeTime, // Wait until micros() exceeds this before sending byte + dotPrintTime, // Time to print a single dot line, in microseconds + dotFeedTime; // Time to feed a single dot line, in microseconds + void + writeBytes(uint8_t a), + writeBytes(uint8_t a, uint8_t b), + writeBytes(uint8_t a, uint8_t b, uint8_t c), + writeBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d), + // Riva addition _ Updated + writeBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d, uint8_t e, uint8_t f, uint8_t g, uint8_t h), + + setPrintMode(uint8_t mask), + unsetPrintMode(uint8_t mask), + writePrintMode(); + }; -#endif // ADAFRUIT_THERMAL_H +#endif // Pos_Printer_H diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..dc91a69 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 AndersV209 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/README.md b/README.md index 1b211ca..83f1283 100644 --- a/README.md +++ b/README.md @@ -5,18 +5,22 @@ This is an Arduino library for the Adafruit Thermal Printer. Pick one up at --> https://www.adafruit.com/product/597 These printers use TTL serial to communicate, 2 pins are required. -Full tutorial with wiring diagrams, images, etc. is available at: -https://learn.adafruit.com/mini-thermal-receipt-printer +An Arduino library for a POSIFLEX PP-700II Printer: -Before loading the example code, or even opening the Arduino software, -place the Adafruit_Thermal folder in your Arduino library. +These printers use TTL serial to communicate. Check the switches under the printer to determine baud. -////ARDUINO LIBRARY LOCATION//// -On your Mac:: In (home directory)/Documents/Arduino/Libraries -On your PC:: My Documents\Arduino\libraries -On your Linux box: (home directory)/sketchbook/libraries +This library supports functions which the adafruit printers do not, such as -Adafruit invests time and resources providing this open source code. Please support Adafruit and open-source hardware by purchasing products from Adafruit! +cut() +beep() +setNVbitmap() -Written by Limor Fried/Ladyada for Adafruit Industries, with contributions from the open source community. Originally based on Thermal library from bildr.org +Originally based on adafruit thermal printer library +https://github.com/adafruit/Adafruit-Thermal-Printer-Library MIT license, all text above must be included in any redistribution. + +////ARDUINO LIBRARY LOCATION//// + +On your Mac:: In (home directory)/Documents/Arduino/Libraries +On your PC:: My Documents\Arduino\libraries +On your Linux box: (home directory)/sketchbook/libraries \ No newline at end of file diff --git a/defineExample b/defineExample new file mode 100644 index 0000000..0fd4b12 --- /dev/null +++ b/defineExample @@ -0,0 +1,99 @@ +printer.write(0x1C); +printer.write(0x71); +printer.write(0x2); +printer.write(0x3); +printer.write(0x0); +printer.write(0x3); +printer.write(0x0); +printer.write(0x4); +printer.write(0x7E); +printer.write(0x40); +printer.write(0x8); +printer.write(0x81); +printer.write(0x20); +printer.write(0x10); +printer.write(0x81); +printer.write(0x10); +printer.write(0x8); +printer.write(0x81); +printer.write(0x8); +printer.write(0x4); +printer.write(0x7E); +printer.write(0x4); +printer.write(0x0); +printer.write(0x0); +printer.write(0x4); +printer.write(0x4); +printer.write(0x7E); +printer.write(0x4); +printer.write(0x8); +printer.write(0x81); +printer.write(0x8); +printer.write(0x10); +printer.write(0x81); +printer.write(0x10); +printer.write(0x8); +printer.write(0x81); +printer.write(0x20); +printer.write(0x4); +printer.write(0x7E); +printer.write(0x40); +printer.write(0x0); +printer.write(0x0); +printer.write(0x0); +printer.write(0x4); +printer.write(0x7E); +printer.write(0x40); +printer.write(0x8); +printer.write(0x81); +printer.write(0x20); +printer.write(0x10); +printer.write(0x81); +printer.write(0x10); +printer.write(0x8); +printer.write(0x81); +printer.write(0x8); +printer.write(0x4); +printer.write(0x7E); +printer.write(0x4); +printer.write(0x0); +printer.write(0x0); +printer.write(0x4); +printer.write(0x4); +printer.write(0x7E); +printer.write(0x4); +printer.write(0x8); +printer.write(0x81); +printer.write(0x8); +printer.write(0x10); +printer.write(0x81); +printer.write(0x10); +printer.write(0x8); +printer.write(0x81); +printer.write(0x20); +printer.write(0x4); +printer.write(0x7E); +printer.write(0x40); +printer.write(0x0); +printer.write(0x0); +printer.write(0x0); +printer.write(0x1); +printer.write(0x0); +printer.write(0x2); +printer.write(0x0); +printer.write(0x0F); +printer.write(0xF0); +printer.write(0x10); +printer.write(0x4); +printer.write(0x8); +printer.write(0x2); +printer.write(0x2); +printer.write(0x1); +printer.write(0x8); +printer.write(0x2); +printer.write(0x10); +printer.write(0x4); +printer.write(0x0F); +printer.write(0xF0); +printer.write(0x0); +printer.write(0x0); \ No newline at end of file diff --git a/examples/A_printertest/A_printertest.ino b/examples/A_printertest/A_printertest.ino old mode 100644 new mode 100755 index bbff0ff..4b222fd --- a/examples/A_printertest/A_printertest.ino +++ b/examples/A_printertest/A_printertest.ino @@ -1,9 +1,8 @@ /*------------------------------------------------------------------------ - Example sketch for Adafruit Thermal Printer library for Arduino. + Example sketch for POS Printer library for Arduino. Demonstrates a few text styles & layouts, bitmap printing, etc. - IMPORTANT: DECLARATIONS DIFFER FROM PRIOR VERSIONS OF THIS LIBRARY. - This is to support newer & more board types, especially ones that don't + There is support for newer & more board types, especially ones that don't support SoftwareSerial (e.g. Arduino Due). You can pass any Stream (e.g. Serial1) to the printer constructor. See notes below. @@ -12,8 +11,8 @@ ------------------------------------------------------------------------*/ #include "Adafruit_Thermal.h" -#include "adalogo.h" #include "adaqrcode.h" +#include "adalogo.h" // Here's the new syntax when using SoftwareSerial (e.g. Arduino Uno) ---- // If using hardware serial instead, comment out or remove these lines: @@ -41,8 +40,8 @@ void setup() { pinMode(7, OUTPUT); digitalWrite(7, LOW); // NOTE: SOME PRINTERS NEED 9600 BAUD instead of 19200, check test page. - mySerial.begin(19200); // Initialize SoftwareSerial - //Serial1.begin(19200); // Use this instead if using hardware serial + mySerial.begin(9600); // Initialize SoftwareSerial + //Serial1.begin(9600); // Use this instead if using hardware serial printer.begin(); // Init printer (same regardless of serial type) // The following calls are in setup(), but don't *need* to be. Use them @@ -50,6 +49,10 @@ void setup() { // over and over (which would happen if they were in loop() instead). // Some functions will feed a line when called, this is normal. + // Print the 500x85 pixel logo in Hal9klogo.h: + printer.printBitmap(adalogo_width, adalogo_height, adalogo_data); + printer.feed(); + // Test inverse on & off printer.inverseOn(); printer.println(F("Inverse ON")); @@ -91,20 +94,26 @@ void setup() { printer.setLineHeight(); // Reset to default printer.justify('L'); - // Barcode examples: - // CODE39 is the most common alphanumeric barcode: - printer.printBarcode("ADAFRUT", CODE39); + + + + // Barcode example: printer.setBarcodeHeight(100); - // Print UPC line on product barcodes: - printer.printBarcode("123456789123", UPC_A); + // EAN-13: 13 digits (same as JAN-13) + printer.print(F("EAN-13:")); + printer.printBarcode("7340011345428", EAN13); - // Print the 75x75 pixel logo in adalogo.h: - printer.printBitmap(adalogo_width, adalogo_height, adalogo_data); - // Print the 135x135 pixel QR code in adaqrcode.h: + // Print the 135x135 pixel QR code in hal9kqrcode.h: printer.printBitmap(adaqrcode_width, adaqrcode_height, adaqrcode_data); - printer.println(F("Adafruit!")); - printer.feed(2); + + + + + printer.println(F("HAL9K!")); + printer.feed(8); + printer.cut(); + //printer.beep(); printer.sleep(); // Tell printer to sleep delay(3000L); // Sleep for 3 seconds diff --git a/examples/A_printertest/Hal9klogo.h b/examples/A_printertest/Hal9klogo.h new file mode 100755 index 0000000..ab01184 --- /dev/null +++ b/examples/A_printertest/Hal9klogo.h @@ -0,0 +1,546 @@ +#ifndef _Hal9klogo_h_ +#define _Hal9klogo_h_ + +#define Hal9klogo_width 500 +#define Hal9klogo_height 85 + +static const uint8_t PROGMEM Hal9klogo_data[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xE0, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x03, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, + 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, + 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFE, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, + 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xF8, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, + 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, + 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFE, + 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, + 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0F, + 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x1F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, + 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFE, 0x00, + 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, + 0xFC, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, + 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, + 0x00, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, + 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, + 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xF0, + 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, + 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, + 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0x7F, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, + 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFE, + 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, + 0xFF, 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x1F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, + 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, + 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, + 0x80, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, + 0x03, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, + 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, + 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, + 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, + 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, + 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, + 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x1F, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, + 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFE, + 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, + 0xF8, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x1F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, + 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, + 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, + 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xF0, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, + 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, + 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, + 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xF8, 0x00, + 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, + 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, + 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x03, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, + 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x1F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, + 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, + 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, + 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, + 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, + 0x80, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, + 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, + 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, + 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x3F, + 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xE0, + 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFC, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, + 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, + 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, + 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, + 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, + 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x3F, + 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, + 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, + 0xF8, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x3F, 0xFF, 0xFF, + 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, + 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, + 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, + 0xFC, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xE0, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, + 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, + 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, + 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xFF, + 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x80, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, + 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, + 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, + 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, + 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, + 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, + 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1F, 0xFF, 0xFF, + 0xFF, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, + 0xF8, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xFF, 0xFF, + 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, + 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, + 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x0F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, + 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, + 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, + 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x3F, + 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x03, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF8, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, + 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, + 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x7F, 0xFF, + 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x3F, 0xFF, + 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, + 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xE0, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, + 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF8, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFC, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x3F, 0xFF, 0xFF, + 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x01, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, + 0x7F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, + 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, + 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0xFF, + 0xFF, 0xFF, 0x80, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x80, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x07, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, + 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, + 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +#endif // _C:\Users\Ander_000\Desktop\Hal9klogo_h_ diff --git a/examples/A_printertest/adalogo.h b/examples/A_printertest/adalogo.h old mode 100644 new mode 100755 diff --git a/examples/A_printertest/adaqrcode.h b/examples/A_printertest/adaqrcode.h old mode 100644 new mode 100755 diff --git a/examples/A_printertest/hal9kqrcode.h b/examples/A_printertest/hal9kqrcode.h new file mode 100755 index 0000000..30ecc6e --- /dev/null +++ b/examples/A_printertest/hal9kqrcode.h @@ -0,0 +1,693 @@ + + +#define hal9kqrcode_width 296 +#define hal9kqrcode_height 296 + + +static const uint8_t PROGMEM hal9kqrcode_data [] = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 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, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, +0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, +0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, +0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, +0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, +0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, +0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, +0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, +0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, +0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, +0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, +0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, +0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, +0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, +0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, +0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, +0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, +0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, +0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, +0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, +0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, +0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, +0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, +0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, +0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, +0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, +0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, +0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, +0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, +0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, +0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, +0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, +0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, +0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, +0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, +0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, +0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, +0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, +0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, +0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, +0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, +0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, +0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, +0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, +0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, +0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, +0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, +0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, +0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, +0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, +0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, +0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, +0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, +0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, +0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFC, +0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, +0x00, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, +0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, +0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +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, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 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, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, +0x03, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFF, +0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, +0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xFF, +0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x03, +0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, +0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, +0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, +0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, +0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, +0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, +0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, +0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0x00, +0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, +0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, +0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3F, +0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, +0x00, 0x03, 0xFF, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, +0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xFF, +0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, +0x03, 0xFF, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, +0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, +0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xFF, 0xFF, +0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, +0xFF, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, +0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, +0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0xFF, +0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xF0, +0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xF0, 0x03, +0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, +0xFC, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, +0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, +0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xF0, 0x00, +0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, +0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, +0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, +0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, +0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, +0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, +0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, +0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, +0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3F, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x00, +0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x3F, +0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, +0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, +0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, +0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, +0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, +0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, +0xFF, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, +0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, +0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, +0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xC0, +0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, +0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, +0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, +0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, +0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, +0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, +0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, +0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, +0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, +0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, +0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, +0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, +0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, +0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, +0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, +0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x03, 0xFF, 0xFF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, +0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xFF, +0xF0, 0x03, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xFF, +0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, +0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, +0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, +0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, +0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, +0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, +0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, +0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, +0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, +0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, +0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, +0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, +0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, +0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, +0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, +0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, +0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, +0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, +0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, +0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, +0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xC0, 0x0F, +0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, +0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0xFC, 0x00, 0xFF, 0xC0, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, +0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, +0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, +0xFF, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, +0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, +0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, +0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x00, +0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, +0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, +0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, +0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, +0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, +0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, +0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, +0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x0F, 0xFC, +0x00, 0xFF, 0xC0, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, +0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, 0xFF, 0xC0, 0x00, 0x03, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 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, +}; diff --git a/examples/B_charsets/B_charsets.ino b/examples/B_charsets/B_charsets.ino old mode 100644 new mode 100755 index 755fd72..476fcf8 --- a/examples/B_charsets/B_charsets.ino +++ b/examples/B_charsets/B_charsets.ino @@ -1,5 +1,5 @@ /*------------------------------------------------------------------------ - Example sketch for Adafruit Thermal Printer library for Arduino. + Example sketch for POS Printer library for Arduino. Demonstrates some of the available alternate characters. See 'A_printertest' sketch for a more generalized printing example. @@ -23,38 +23,40 @@ Adafruit_Thermal printer(&mySerial); // Pass addr to printer constructor // Here's the syntax for hardware serial (e.g. Arduino Due) -------------- // Un-comment the following line if using hardware serial: -//Adafruit_Thermal printer(&Serial1); // Or Serial2, Serial3, etc. +//Adafruit_Thermal printer(&Serial1); // Or Serial2, Serial3, etc // ----------------------------------------------------------------------- -void setup() { +void setup() { // This line is for compatibility with the Adafruit IotP project pack, // which uses pin 7 as a spare grounding point. You only need this if // wired up the same way (w/3-pin header into pins 5/6/7): pinMode(7, OUTPUT); digitalWrite(7, LOW); - mySerial.begin(19200); // Initialize SoftwareSerial - //Serial1.begin(19200); // Use this instead if using hardware serial - printer.begin(); // Init printer (same regardless of serial type) + mySerial.begin(9600); // Initialize SoftwareSerial + //Serial1.begin(9600); // Use this instead if using hardware serial + printer.begin(50); // Init printer (same regardless of serial type) printer.underlineOn(); - printer.println(F("CHARACTER SET EXAMPLE\n")); + printer.println("CHARACTER SET EXAMPLE\n"); printer.underlineOff(); - printer.println(F("DEFAULT CHARSET & CODE PAGE:")); + printer.println("Danish CHARSET & West Europe:"); dump(); - printer.println(F("\nNORWAY CHARSET w/")); - printer.println(F("KATAKANA CODEPAGE:")); + printer.println("\nUSA CHARSET w/"); + printer.println("USA, Standard Europe:"); // Charset selection alters a few chars in ASCII 0x23-0x7E range. - printer.setCharset(CHARSET_NORWAY); + printer.setCharset(CHARSET_USA); // Code page selects alt symbols for 'upper' ASCII 0x80-0xFF. // There's a TON of these, best to check datasheet! - printer.setCodePage(CODEPAGE_KATAKANA); + printer.setCodePage(CODEPAGE_CP437); dump(); - printer.feed(2); + printer.feed(10); + printer.cut(); + printer.beep(); printer.setDefault(); // Restore printer to defaults } @@ -63,16 +65,16 @@ void setup() { void dump() { uint8_t major, minor, c; - printer.println(F(" 01234567 89ABCDEF")); + printer.println(" 01234567 89ABCDEF"); for(major=0; major<16; major++) { - printer.print(F(" ")); + printer.print(" "); printer.print(major, HEX); - printer.print(F("- ")); + printer.print("- "); for(minor=0; minor<16; minor++) { c = (major << 4) | minor; if(c < 32) c = ' '; // Skip control codes! printer.write(c); - if(minor == 7) printer.print(F(" ")); + if(minor == 7) printer.print(" "); } printer.println(); } diff --git a/examples/C_barcodes/C_barcodes.ino b/examples/C_barcodes/C_barcodes.ino old mode 100644 new mode 100755 index 7407340..09ea622 --- a/examples/C_barcodes/C_barcodes.ino +++ b/examples/C_barcodes/C_barcodes.ino @@ -1,5 +1,5 @@ /*------------------------------------------------------------------------ - Example sketch for Adafruit Thermal Printer library for Arduino. + Example sketch for POS Printer library for Arduino. Demonstrates the available gamut of barcodes. See 'A_printertest' sketch for a more generalized printing example. @@ -34,8 +34,8 @@ void setup() { // wired up the same way (w/3-pin header into pins 5/6/7): pinMode(7, OUTPUT); digitalWrite(7, LOW); - mySerial.begin(19200); // Initialize SoftwareSerial - //Serial1.begin(19200); // Use this instead if using hardware serial + mySerial.begin(9600); // Initialize SoftwareSerial + //Serial1.begin(9600); // Use this instead if using hardware serial printer.begin(); // Init printer (same regardless of serial type) printer.justify('C'); @@ -51,6 +51,8 @@ void setup() { // Also note that strings passed to printBarcode() are always normal // RAM-resident strings; PROGMEM strings (e.g. F("123")) are NOT used. + printer.setBarcodeHeight(150); + // UPC-A: 12 digits printer.print(F("UPC-A:")); printer.printBarcode("123456789012", UPC_A); @@ -84,12 +86,15 @@ void setup() { // CODE 93: compressed version of Code 39? printer.print(F("CODE 93:")); printer.printBarcode("ADAFRUIT", CODE93); - + +/* Commented out because I can't get this one working yet // CODE 128: 2-255 characters (ASCII 0-127) printer.print(F("CODE128:")); printer.printBarcode("Adafruit", CODE128); +*/ - printer.feed(2); + printer.feed(10); + printer.cut(); printer.setDefault(); // Restore printer to defaults } diff --git a/keywords.txt b/keywords.txt index 461ccfc..6e5a912 100644 --- a/keywords.txt +++ b/keywords.txt @@ -1,7 +1,7 @@ ####################################################### -# keywords.txt - keywords file for the Thermal library +# keywords.txt - keywords file for the PosPrinter library -# Created by Adam Meyer of bildr Aug 10th 2011 +# Created by Anders Vestergaard of Aug 23th 2015 # Released as MIT license @@ -11,7 +11,7 @@ # Datatypes (KEYWORD1) ####################################### -Thermal KEYWORD1 +PosPrinter KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) @@ -43,6 +43,11 @@ underlineOn KEYWORD2 underlineOff KEYWORD2 printQRcode KEYWORD2 reprintQRcode KEYWORD2 +cut KEYWORD2 +beep KEYWORD2 +setCharset KEYWORD2 +setCodePage KEYWORD2 +printBitmap KEYWORD2 diff --git a/processing/bitmapImageConvert/bitmapImageConvert.pde b/processing/bitmapImageConvert/bitmapImageConvert.pde old mode 100644 new mode 100755 diff --git a/ruby/Gemfile b/ruby/Gemfile old mode 100644 new mode 100755 diff --git a/ruby/Gemfile.lock b/ruby/Gemfile.lock old mode 100644 new mode 100755 diff --git a/ruby/License.txt b/ruby/License.txt old mode 100644 new mode 100755 diff --git a/ruby/sample_ascii.txt b/ruby/sample_ascii.txt old mode 100644 new mode 100755 From a296aa5547f13f7b93dc9cda32636625ab067966 Mon Sep 17 00:00:00 2001 From: Hamza Hajeir Date: Sat, 17 Oct 2020 22:52:40 +0300 Subject: [PATCH 07/11] Remove Danish default charset --- Adafruit_Thermal.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Adafruit_Thermal.cpp b/Adafruit_Thermal.cpp index 4647083..825a722 100644 --- a/Adafruit_Thermal.cpp +++ b/Adafruit_Thermal.cpp @@ -279,8 +279,6 @@ void Adafruit_Thermal::setDefault() { underlineOff(); setBarcodeHeight(50); setSize('s'); - setCharset(CHARSET_DENMARK1); - setCodePage(CODEPAGE_ISO_8859_1); } void Adafruit_Thermal::test() { From 94e80f92f97c1a4e9c2f71ff2ecd32fbacca3c89 Mon Sep 17 00:00:00 2001 From: Hamza Hajeir Date: Sat, 17 Oct 2020 23:03:45 +0300 Subject: [PATCH 08/11] Revert some modifications --- Adafruit_Thermal.h | 6 +++--- README.md | 23 +++++++++-------------- examples/A_printertest/A_printertest.ino | 2 +- keywords.txt | 6 +++--- 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/Adafruit_Thermal.h b/Adafruit_Thermal.h index cca228e..d7a4c02 100644 --- a/Adafruit_Thermal.h +++ b/Adafruit_Thermal.h @@ -2,8 +2,8 @@ * @file Adafruit_Thermal.h */ -#ifndef Pos_Printer_H -#define Pos_Printer_H +#ifndef ADAFRUIT_THERMAL_H +#define ADAFRUIT_THERMAL_H // *** EDIT THIS NUMBER *** Printer firmware version is shown on test // page (hold feed button when connecting power). Number used here is @@ -447,4 +447,4 @@ class Adafruit_Thermal : public Print { }; -#endif // Pos_Printer_H +#endif // ADAFRUIT_THERMAL_H diff --git a/README.md b/README.md index 83f1283..a19dec6 100644 --- a/README.md +++ b/README.md @@ -5,22 +5,17 @@ This is an Arduino library for the Adafruit Thermal Printer. Pick one up at --> https://www.adafruit.com/product/597 These printers use TTL serial to communicate, 2 pins are required. -An Arduino library for a POSIFLEX PP-700II Printer: +Full tutorial with wiring diagrams, images, etc. is available at: +https://learn.adafruit.com/mini-thermal-receipt-printer -These printers use TTL serial to communicate. Check the switches under the printer to determine baud. - -This library supports functions which the adafruit printers do not, such as - -cut() -beep() -setNVbitmap() - -Originally based on adafruit thermal printer library -https://github.com/adafruit/Adafruit-Thermal-Printer-Library -MIT license, all text above must be included in any redistribution. +Before loading the example code, or even opening the Arduino software, +place the Adafruit_Thermal folder in your Arduino library. ////ARDUINO LIBRARY LOCATION//// - On your Mac:: In (home directory)/Documents/Arduino/Libraries On your PC:: My Documents\Arduino\libraries -On your Linux box: (home directory)/sketchbook/libraries \ No newline at end of file +On your Linux box: (home directory)/sketchbook/libraries + +Adafruit invests time and resources providing this open source code. Please support Adafruit and open-source hardware by purchasing products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries, with contributions from the open source community. Originally based on Thermal library from bildr.org diff --git a/examples/A_printertest/A_printertest.ino b/examples/A_printertest/A_printertest.ino index 4b222fd..b9b186e 100755 --- a/examples/A_printertest/A_printertest.ino +++ b/examples/A_printertest/A_printertest.ino @@ -49,7 +49,7 @@ void setup() { // over and over (which would happen if they were in loop() instead). // Some functions will feed a line when called, this is normal. - // Print the 500x85 pixel logo in Hal9klogo.h: + // Print the 500x85 pixel logo in adalogo.h: printer.printBitmap(adalogo_width, adalogo_height, adalogo_data); printer.feed(); diff --git a/keywords.txt b/keywords.txt index 6e5a912..7fa412e 100644 --- a/keywords.txt +++ b/keywords.txt @@ -1,7 +1,7 @@ ####################################################### -# keywords.txt - keywords file for the PosPrinter library +# keywords.txt - keywords file for the Thermal library -# Created by Anders Vestergaard of Aug 23th 2015 +# Created by Adam Meyer of bildr Aug 10th 2011 # Released as MIT license @@ -11,7 +11,7 @@ # Datatypes (KEYWORD1) ####################################### -PosPrinter KEYWORD1 +Thermal KEYWORD1 ####################################### # Methods and Functions (KEYWORD2) From 0089878f8807675475e6b81687b1c824ca863243 Mon Sep 17 00:00:00 2001 From: Hamza Hajeir Date: Sat, 17 Oct 2020 23:14:53 +0300 Subject: [PATCH 09/11] Fix Check error --- Adafruit_Thermal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Adafruit_Thermal.cpp b/Adafruit_Thermal.cpp index 825a722..3d2ec05 100644 --- a/Adafruit_Thermal.cpp +++ b/Adafruit_Thermal.cpp @@ -651,7 +651,7 @@ void Adafruit_Thermal::printBitmap_ada(int w, int h, Stream *fromStream) { prevByte = '\n'; } -void Adafruit_Thermal::printBitmap(Stream *fromStream) { +void Adafruit_Thermal::printBitmap_ada(Stream *fromStream) { uint8_t tmp; uint16_t width, height; From 92ba79459f0784c302598f3ae979e19e49bc1099 Mon Sep 17 00:00:00 2001 From: Hamza Hajeir Date: Mon, 2 Nov 2020 16:08:46 +0200 Subject: [PATCH 10/11] Refactor The Library to become Async! Tested on ESP8266 target --- Adafruit_Thermal.cpp | 266 ++++++++++++++++------- Adafruit_Thermal.h | 145 ++++++++++-- examples/A_printertest/A_printertest.ino | 11 +- examples/B_charsets/B_charsets.ino | 1 + examples/C_barcodes/C_barcodes.ino | 1 + 5 files changed, 315 insertions(+), 109 deletions(-) diff --git a/Adafruit_Thermal.cpp b/Adafruit_Thermal.cpp index 3d2ec05..4ddf28f 100644 --- a/Adafruit_Thermal.cpp +++ b/Adafruit_Thermal.cpp @@ -73,8 +73,9 @@ Adafruit_Thermal::Adafruit_Thermal(Stream *s, uint8_t dtr) // This method sets the estimated completion time for a just-issued task. void Adafruit_Thermal::timeoutSet(unsigned long x) { - if (!dtrEnabled) - resumeTime = micros() + x; + if(!dtrEnabled) { + resumeTime = (resumeTime > micros() ? micros() : lastWritingTime) + x; + } } // This function waits (if necessary) for the prior task to complete. @@ -106,85 +107,131 @@ void Adafruit_Thermal::setTimes(unsigned long p, unsigned long f) { // commands, printing bitmaps or barcodes, etc. Not when printing text. void Adafruit_Thermal::writeBytes(uint8_t a) { - timeoutWait(); - stream->write(a); - timeoutSet(BYTE_TIME); + storeInBuffer(a); } void Adafruit_Thermal::writeBytes(uint8_t a, uint8_t b) { - timeoutWait(); - stream->write(a); - stream->write(b); - timeoutSet(2 * BYTE_TIME); + storeInBuffer(a); + storeInBuffer(b); } void Adafruit_Thermal::writeBytes(uint8_t a, uint8_t b, uint8_t c) { - timeoutWait(); - stream->write(a); - stream->write(b); - stream->write(c); - timeoutSet(3 * BYTE_TIME); + storeInBuffer(a); + storeInBuffer(b); + storeInBuffer(c); } void Adafruit_Thermal::writeBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d) { - timeoutWait(); - stream->write(a); - stream->write(b); - stream->write(c); - stream->write(d); - timeoutSet(4 * BYTE_TIME); + storeInBuffer(a); + storeInBuffer(b); + storeInBuffer(c); + storeInBuffer(d); } // Riva Addition _ Updated void Adafruit_Thermal::writeBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d, uint8_t e, uint8_t f, uint8_t g, uint8_t h) { - timeoutWait(); - stream->write(a); - stream->write(b); - stream->write(c); - stream->write(d); - stream->write(e); - stream->write(f); - stream->write(g); - stream->write(h); - timeoutSet(8 * BYTE_TIME); + storeInBuffer(a); + storeInBuffer(b); + storeInBuffer(c); + storeInBuffer(d); + storeInBuffer(e); + storeInBuffer(f); + storeInBuffer(g); + storeInBuffer(h); } // The underlying method for all high-level printing (e.g. println()). // The inherited Print class handles the rest! size_t Adafruit_Thermal::write(uint8_t c) { + storeInBuffer(c); + return 1; +} + + +void Adafruit_Thermal::storeInBuffer(uint8_t c) +{ + +#ifdef DEBUG_PRINTER_ + static int count=0; + count++; + if(count%100==0) + { + DEBUG_("Stored 100 elements, internalBuffer.size()=%d, internalBuffer.capacity()=%d\n",internalBuffer.size(),internalBuffer.capacity()); + } +#endif + if (c != 13) + { // Strip carriage returns + + internalBuffer.push_back(c); - if (c != 13) { // Strip carriage returns - #ifdef DENMARK - if(c == 0xC3){c = 0x00;} // - if(c == 0xA5){c = '}';} // Danish å - if(c == 0xB8){c = '|';} // Danish ø - if(c == 0xA6){c = '{';} // Danish æ - if(c == 0x85){c = ']';} // Danish Å - if(c == 0x98){c = '\\';} // Danish Ø - if(c == 0x86){c = '[';} // Danish Æ - #endif // end ifdef DENMARK - - timeoutWait(); - stream->write(c); unsigned long d = BYTE_TIME; - if ((c == '\n') || (column == maxColumn)) { // If newline or wrap - d += (prevByte == '\n') ? ((charHeight + lineSpacing) * dotFeedTime) - : // Feed line - ((charHeight * dotPrintTime) + - (lineSpacing * dotFeedTime)); // Text line + if ((c == '\n') || (column == maxColumn)) + { // If newline or wrap + d += (prevByte == '\n') ? ((charHeight + lineSpacing) * dotFeedTime) : // Feed line + ((charHeight * dotPrintTime) + (lineSpacing * dotFeedTime)); // Text line column = 0; c = '\n'; // Treat wrap as newline on next pass - } else { + } + else + { column++; } timeoutSet(d); prevByte = c; - } +} - return 1; +void Adafruit_Thermal::loop() +{ + if(internalBuffer.size()) + { + if (micros() - resumeTime > 0) + { + stream->write(internalBuffer.at(0)); + SERIAL_WRITE(internalBuffer.at(0)); + internalBuffer.erase(internalBuffer.begin()); + lastWritingTime = micros(); + } + } + else if(largeReserve) + { + // DEBUG_("Resizing capacity to 100\n"); + internalBuffer.shrink_to_fit(); + internalBuffer.reserve(100); + largeReserve = false; + } + + if(askedForPaper) + { + static uint32_t prevmillis; + static uint8_t count; + + if (millis() - prevmillis > 100 && count < 10) + { + paperStatus = -1; + if (stream->available()) + { + paperStatus = stream->read(); + count = 0; + askedForPaper = false; + paperResultReady = true; + paperStatus = !(paperStatus & 0b00000100); + } + if(count == 10 && !paperResultReady) + { + count=0; + paperStatus = -1; + paperResultReady = true; + askedForPaper = false; + } + + count++; + + } + } } + /*! @def printDensity Printing density, default: 100% (? can go higher, text is darker but fuzzy) @@ -196,8 +243,7 @@ void Adafruit_Thermal::begin(uint8_t heatTime) { // The printer can't start receiving data immediately upon power up -- // it needs a moment to cold boot and initialize. Allow at least 1/2 // sec of uptime before printer can receive data. - timeoutSet(500000L); - + internalBuffer.reserve(100); //Reserve 100 bytes for better code performence (Less memory re-allocations) wake(); reset(); @@ -279,6 +325,8 @@ void Adafruit_Thermal::setDefault() { underlineOff(); setBarcodeHeight(50); setSize('s'); + setCharset(); + setCodePage(); } void Adafruit_Thermal::test() { @@ -300,7 +348,7 @@ void Adafruit_Thermal::setBarcodeHeight(uint8_t val) { // Default is 50 writeBytes(ASCII_GS, 'h', val); } -void Adafruit_Thermal::printBarcode(const char *text, uint8_t type) { +void Adafruit_Thermal::printBarcode(char *text, uint8_t type) { feed(1); // Recent firmware can't print barcode w/o feed first??? writeBytes(ASCII_GS, 'H', 2); // Print label below barcode writeBytes(ASCII_GS, 'w', 3); // Barcode width 3 (0.375/1.0mm thin/thick) @@ -472,12 +520,26 @@ void Adafruit_Thermal::underlineOn(uint8_t weight) { void Adafruit_Thermal::underlineOff() { writeBytes(ASCII_ESC, '-', 0); } -void Adafruit_Thermal::printBitmap( int w, int h, const uint8_t *bitmap, bool fromProgMem) { +int Adafruit_Thermal::printBitmap( int w, int h, const uint8_t *bitmap, bool fromProgMem) { int rowBytes, rowBytesClipped, rowStart, chunkHeight, x, y, i; rowBytes = (w + 7) / 8; // Round up to next byte boundary + DEBUG_("h*rowBytes=%d maxFreeBlockSize()=%d, internalBuffer.size()=%d\n",h * rowBytes,AVAILABLE_MEM,internalBuffer.size()); + uint32_t bytesToReserve = h * rowBytes + 8 + internalBuffer.size() + EXCESS_BYTES; + if (bytesToReserve > AVAILABLE_MEM) + { + return 1; + } + else + { + + DEBUG_("Reserving %d Bytes\n",bytesToReserve); + internalBuffer.reserve(bytesToReserve); + largeReserve = true; + } + DEBUG_("SendingBytes\n"); writeBytes(ASCII_GS, 'v', '0', 0, rowBytes % 256, rowBytes / 256, h % 256, h / 256); i = 0; for(y=0; y < h; y++) { @@ -485,29 +547,42 @@ void Adafruit_Thermal::printBitmap( int w, int h, const uint8_t *bitmap, bool fr writeBytes(fromProgMem ? pgm_read_byte(bitmap + i) : *(bitmap+i)); } } + DEBUG_("setting Timeout\n"); timeoutSet(h * dotPrintTime); prevByte = '\n'; + + DEBUG_("Returning 0\n"); + return 0; } //this is a ridiculous vertical dot print define, not a horizontal raster. //to print a c header string, you must transpose (rotate and flip) and image first //also beware of switched height vs width when the image is transposed -void Adafruit_Thermal::defineBitImage( int w, int h, const uint8_t *bitmap) { +int Adafruit_Thermal::defineBitImage( int w, int h, const uint8_t *bitmap, bool fromProgMem) { int colBytes, rowBytes, rowBytesClipped, rowStart, chunkHeight, x, y, i; rowBytes = (w + 7) / 8; // Round up to next byte boundary colBytes = (h + 7) / 8; - + if (h * rowBytes + internalBuffer.size() + EXCESS_BYTES > AVAILABLE_MEM) + { + return 1; + } + else + { + internalBuffer.reserve(h * rowBytes + 4 + internalBuffer.size() + EXCESS_BYTES); + largeReserve = true; + } writeBytes(0x1D, 0x2A, rowBytes, colBytes); i = 0; for(y=0; y < h; y++) { for(x=0; x < rowBytes; x++, i++) { - writeBytes(pgm_read_byte(bitmap + (i))); + writeBytes(fromProgMem ? pgm_read_byte(bitmap + (i)) : *(bitmap +i)); } } timeoutSet(h * dotPrintTime); prevByte = '\n'; + return 0; } void Adafruit_Thermal::printDefinedBitImage(int mode){ @@ -518,28 +593,53 @@ void Adafruit_Thermal::printDefinedBitImage(int mode){ //to print a c header string, you must transpose (rotate and flip) and image first //also beware of switched height vs width when the image is transposed //n=1 NV images -void Adafruit_Thermal::defineNVBitmap( int w, int h, const uint8_t *bitmap) { +int Adafruit_Thermal::defineNVBitmap( int w, int h, const uint8_t *bitmap, bool fromProgMem) { int colBytes, rowBytes, rowBytesClipped, rowStart, chunkHeight, x, y, i; rowBytes = (w / 8); //Round up to next byte boundary for columns, which are transposed rows colBytes = (h + 7) / 8; + DEBUG_("w*colBytes=%d maxFreeBlockSize()=%d, internalBuffer.size()=%d\n",w*colBytes,AVAILABLE_MEM,internalBuffer.size()); + + uint32_t bytesToReserve = w*colBytes + 7 + internalBuffer.size() + EXCESS_BYTES; + if ( bytesToReserve > AVAILABLE_MEM) + { + return 1; + } + else + { + DEBUG_("Reserving %d bytes\n",bytesToReserve); + internalBuffer.reserve(bytesToReserve); + largeReserve = true; + } + DEBUG_("SendingBytes\n"); writeBytes(0x1C, 0x71, 1); writeBytes(rowBytes % 256, rowBytes / 256, colBytes % 256, colBytes / 256); i = 0; for(y=0; y < colBytes; y++) { - for(x=0; x < w; x++, i++) { - writeBytes(pgm_read_byte(bitmap + i)); + for(x=0; x < rowBytes * 8; x++, i++) { + writeBytes(fromProgMem ? pgm_read_byte(bitmap + i) : *(bitmap + i)); } } + DEBUG_("Returning 0\n"); + return 0; } //n=2 NV images -void Adafruit_Thermal::defineNVBitmap( int w1, int h1, const uint8_t *bitmap1, int w2, int h2, const uint8_t *bitmap2) { +int Adafruit_Thermal::defineNVBitmap( int w1, int h1, const uint8_t *bitmap1, int w2, int h2, const uint8_t *bitmap2, bool fromProgMem) { int colBytes, rowBytes, rowBytesClipped, rowStart, chunkHeight, x, y, i; rowBytes = (w1 / 8); //Round up to next byte boundary for columns, which are transposed rows colBytes = (h1 +7)/ 8; + if ((h1 * w1 / 8) + (h2 * w2 / 8) + 11 + internalBuffer.size() + EXCESS_BYTES > AVAILABLE_MEM) + { + return 1; + } + else + { + internalBuffer.reserve((h1 * w1 / 8) + (h2 * w2 / 8) + 11 + internalBuffer.size() + EXCESS_BYTES); + largeReserve = true; + } //write n=1 image writeBytes(0x1C, 0x71, 2); @@ -547,7 +647,7 @@ void Adafruit_Thermal::defineNVBitmap( int w1, int h1, const uint8_t *bitmap1, i i = 0; for(y=0; y < colBytes; y++) { for(x=0; x < rowBytes * 8; x++, i++) { - writeBytes(pgm_read_byte(bitmap1 + i)); + writeBytes(fromProgMem ? pgm_read_byte(bitmap1 + i): *(bitmap1 + i) ); } } @@ -558,9 +658,11 @@ void Adafruit_Thermal::defineNVBitmap( int w1, int h1, const uint8_t *bitmap1, i i = 0; for(y=0; y < colBytes; y++) { for(x=0; x < rowBytes*8; x++, i++) { - writeBytes(pgm_read_byte(bitmap2 + i)); + writeBytes(fromProgMem ? pgm_read_byte(bitmap2 + i): *(bitmap2 + i) ); } } + + return 0; } void Adafruit_Thermal::printNVBitmap(int n, int mode){ @@ -691,7 +793,7 @@ void Adafruit_Thermal::wake() { timeoutSet(0); // Reset timeout counter writeBytes(255); // Wake #if PRINTER_FIRMWARE >= 264 - delay(50); + timeoutSet(50000L); writeBytes(ASCII_ESC, '8', 0, 0); // Sleep off (important!) #else // Datasheet recommends a 50 mS delay before issuing further commands, @@ -706,22 +808,22 @@ void Adafruit_Thermal::wake() { } // Check the status of the paper using the printer's self reporting -// ability. Returns true for paper, false for no paper. +// ability. Returns 1 when it has paper ,, 0 when has no paper ,, -1 : timeout or short time / No response. // Might not work on all printers! -bool Adafruit_Thermal::hasPaper() { - writeBytes(0x10, 0x04, 4); - - int status = -1; - for (uint8_t i = 0; i < 10; i++) { - if (stream->available()) { - status = stream->read(); - break; - } - delay(100); +int Adafruit_Thermal::hasPaper() +{ + if (paperResultReady) + { + return paperStatus; } - - return !(status & 0b00000100); + else + return -1; } +void Adafruit_Thermal::askForPaperAvailability() { + writeBytes(0x10, 0x04, 4); + askedForPaper = true; +} + void Adafruit_Thermal::setLineHeight(int val) { if (val < 24) @@ -781,7 +883,7 @@ void Adafruit_Thermal::setBeep(int sec) { // Standard ESC/POS commands that work only on printers that support these commands -void Adafruit_Thermal::printQRcode(char *text, uint8_t errCorrect, uint8_t moduleSize, uint8_t model, uint16_t timeoutQR) { //Store data and print QR Code +void Adafruit_Thermal::printQRcode(char *text, uint8_t errCorrect, uint8_t moduleSize, uint8_t model) { //Store data and print QR Code //Set QR-Code model //Range @@ -819,17 +921,15 @@ void Adafruit_Thermal::printQRcode(char *text, uint8_t errCorrect, uint8_t modul writeBytes(49, 80, 48); for(uint16_t i=0; i // Barcode types and charsets #if PRINTER_FIRMWARE >= 264 @@ -104,14 +105,52 @@ #define EAN13 2 #define EAN8 3 #define CODE39 4 -#define I25 5 -#define CODEBAR 6 +#define ITF 5 +#define CODABAR 6 #define CODE93 7 #define CODE128 8 #define CODE11 9 #define MSI 10 #endif + +#ifdef DEBUG_PRINTER_ +#define DEBUG_(f_,...) Serial.printf((f_), ##__VA_ARGS__) +#define SERIAL_WRITE(c) Serial.write(c) +#else +#define DEBUG_(f_,...) +#define SERIAL_WRITE(c) +#endif + +#define EXCESS_BYTES 75 //For next commands to be stored in internalBuffer. + +#ifdef ARDUINO_ARCH_ESP8266 +#define AVAILABLE_MEM ESP.getMaxFreeBlockSize() +#elif defined(ARDUINO_ARCH_ESP32) +#define AVAILABLE_MEM ESP.getMaxAllocHeap() +#elif defined(__AVR__) || defined(__arm__) +#ifdef __arm__ // Check https://github.com/mpflaga/Arduino-MemoryFree +// should use uinstd.h to define sbrk but Due causes a conflict +extern "C" char* sbrk(int incr); +#else // __ARM__ +extern char *__brkval; +#endif // __arm__ + +int freeMemory() { + char top; +#ifdef __arm__ + return &top - reinterpret_cast(sbrk(0)); +#elif defined(CORE_TEENSY) || (ARDUINO > 103 && ARDUINO != 151) + return &top - __brkval; +#else // __arm__ + return __brkval ? &top - __brkval : &top - __malloc_heap_start; +#endif // __arm__ +} +#define AVAILABLE_MEM freeMemory() +#else +#error "Define AVAILABLE_MEM for your MCU target at Adafruit_Printer.h L151" +#endif + /*! * Driver for the thermal printer */ @@ -139,6 +178,10 @@ class Adafruit_Thermal : public Print { * @param heatTime how much time to spend heating up the printer */ begin(uint8_t heatTime=120), + /*! + * @brief Printer Loop + */ + loop(), /*! * @brief Disables bold text */ @@ -203,15 +246,8 @@ class Adafruit_Thermal : public Print { * @param text The specified text/number (the meaning varies based on the type of barcode) and type to write to the barcode * @param type Value from the datasheet or class-level variables like UPC-A. Note the type value changes depending on the firmware version so use class-level values where possible */ - printBarcode(const char *text, uint8_t type), - /*! - * @brief Prints a bitmap - * @param w Width of the image in pixels - * @param h Height of the image in pixels - * @param bitmap Bitmap data, from a file. - * @param fromProgMem - */ - printBitmap(int w, int h, const uint8_t *bitmap, bool fromProgMem = true), + printBarcode(char *text, uint8_t type), + /*! * @brief Prints a bitmap : Adafruit's code * @param w Width of the image in pixels @@ -233,24 +269,22 @@ class Adafruit_Thermal : public Print { */ printBitmap_ada(Stream *fromStream), /*! - * @brief Prints a QR Code, Only works on printers with support for this feature - * @param text - * @param errCorrect - * @param moduleSize + * @brief Store data and print QR Code, Only works on printers with support for this feature + * @param text The specified text/number + * @param errCorrect Error Correction level + * @param moduleSize Module Size * @param model - * @param timeoutQR */ - printQRcode(char *text, uint8_t errCorrect=48, uint8_t moduleSize=3, uint8_t model=50, uint16_t timeoutQR=4000000L), + printQRcode(char *text, uint8_t errCorrect=48, uint8_t moduleSize=3, uint8_t model=50), /*! * @brief Re-Prints a QR Code, Only works on printers with support for this feature * @param timeoutQR */ - reprintQRcode(uint16_t timeoutQR=4000000L), + reprintQRcode(), + /*! * @brief Sets text to normal mode */ - - normal(), /*! * @brief Reset the printer @@ -361,6 +395,11 @@ class Adafruit_Thermal : public Print { */ wake(), + /*! + * @brief Request paper availability from the printer + */ + askForPaperAvailability(), + /*! * @brief Cuts the paper */ @@ -410,7 +449,59 @@ class Adafruit_Thermal : public Print { */ setBeep(int sec); - bool + int + /*! + * @brief Prints a bitmap + * @param w Width of the image in pixels + * @param h Height of the image in pixels + * @param bitmap Bitmap data, from a file. + * @param fromProgMem + */ + + printBitmap(int w, int h, const uint8_t *bitmap, bool fromProgMem = true), + /*! + * @brief Define a bit image + * @param w Width of the image in pixels + * @param h Height of the image in pixels + * @param bitmap Bitmap data, from a file. + * @param fromProgMem + */ + defineBitImage( int w, int h, const uint8_t *bitmap, bool fromProgMem), + /*! + * @brief Define a NV bit image + * + * Procedure to define NV image : + * 1) Design the photo in Black&White, Make the column pixels 8 multiplier (16,24...) + * 2) Transpost the image : Rotate +90 CC then Flip Horizontally + * 3) Save as bmp image. + * 4) Use LCDAssistant.exe to extract image table. + * 5) Define image width = (width of origin image), image height (height of origin image). origin image : untransposed image + * 6) Use defineNVBitImage(). + * @param w Width of the image in pixels + * @param h Height of the image in pixels + * @param bitmap Bitmap data, from a file. + * @param fromProgMem + */ + defineNVBitmap(int w, int h, const uint8_t *bitmap, bool fromProgMem), + /*! + * @brief Define 2 NV bit images + * + * Procedure to define NV image : + * 1) Design the photo in Black&White, Make the column pixels 8 multiplier (16,24...) + * 2) Transpost the image : Rotate +90 CC then Flip Horizontally + * 3) Save as bmp image. + * 4) Use LCDAssistant.exe to extract image table. + * 5) Define image width = (width of origin image), image height (height of origin image). origin image : untransposed image + * 6) Use defineNVBitImage(). + * @param w1 Width of the image in pixels + * @param h1 Height of the image in pixels + * @param bitmap1 Bitmap data, from a file. + * @param w2 Width of the image in pixels + * @param h2 Height of the image in pixels + * @param bitmap2 Bitmap data, from a file. + * @param fromProgMem + */ + defineNVBitmap(int w1, int h1, const uint8_t *bitmap1,int w2, int h2, const uint8_t *bitmap2, bool fromProgMem), /*! * @brief Whether or not the printer has paper * @return Returns true if there is still paper @@ -419,6 +510,7 @@ class Adafruit_Thermal : public Print { private: Stream *stream; + std::vector internalBuffer; uint8_t printMode, prevByte, // Last character issued to printer column, // Last horizontal column printed @@ -428,9 +520,15 @@ class Adafruit_Thermal : public Print { barcodeHeight, // Barcode height in dots, not including text maxChunkHeight, dtrPin; // DTR handshaking pin (experimental) - boolean dtrEnabled; // True if DTR pin set & printer initialized + int + paperStatus; // Holding the result of askForPaperAvailability + boolean dtrEnabled, // True if DTR pin set & printer initialized + paperResultReady, + largeReserve, + askedForPaper; unsigned long resumeTime, // Wait until micros() exceeds this before sending byte + lastWritingTime,//To build the next printing time (resumeTime) upun it dotPrintTime, // Time to print a single dot line, in microseconds dotFeedTime; // Time to feed a single dot line, in microseconds void @@ -443,7 +541,8 @@ class Adafruit_Thermal : public Print { setPrintMode(uint8_t mask), unsetPrintMode(uint8_t mask), - writePrintMode(); + writePrintMode(), + storeInBuffer(uint8_t c); }; diff --git a/examples/A_printertest/A_printertest.ino b/examples/A_printertest/A_printertest.ino index b9b186e..084bda2 100755 --- a/examples/A_printertest/A_printertest.ino +++ b/examples/A_printertest/A_printertest.ino @@ -116,10 +116,15 @@ void setup() { //printer.beep(); printer.sleep(); // Tell printer to sleep - delay(3000L); // Sleep for 3 seconds - printer.wake(); // MUST wake() before printing again, even if reset - printer.setDefault(); // Restore printer to defaults } void loop() { + printer.loop(); + static bool once; + if(millis() >= 4000 & !once) + { + printer.wake(); // MUST wake() before printing again, even if reset + printer.setDefault(); // Restore printer to defaults + once = true; + } } diff --git a/examples/B_charsets/B_charsets.ino b/examples/B_charsets/B_charsets.ino index 476fcf8..cd7833b 100755 --- a/examples/B_charsets/B_charsets.ino +++ b/examples/B_charsets/B_charsets.ino @@ -81,4 +81,5 @@ void dump() { } void loop() { + printer.loop(); } diff --git a/examples/C_barcodes/C_barcodes.ino b/examples/C_barcodes/C_barcodes.ino index 09ea622..b62d50e 100755 --- a/examples/C_barcodes/C_barcodes.ino +++ b/examples/C_barcodes/C_barcodes.ino @@ -99,4 +99,5 @@ void setup() { } void loop() { + printer.loop(); } From cdc30a21f3ca2a5d71a442e738857875fabb1f72 Mon Sep 17 00:00:00 2001 From: Hamza Hajeir Date: Fri, 25 Dec 2020 21:49:24 +0200 Subject: [PATCH 11/11] Improve the library functionalities, Reserve hasPaper() blocking function, Add non-Blocking multi-level paperLevel status, Enhance internal working --- Adafruit_Thermal.cpp | 133 +++++++++++++++++++++++++++++++++++-------- Adafruit_Thermal.h | 53 ++++++++++++++--- keywords.txt | 14 +++++ library.properties | 2 +- 4 files changed, 169 insertions(+), 33 deletions(-) diff --git a/Adafruit_Thermal.cpp b/Adafruit_Thermal.cpp index 4ddf28f..9411fd9 100644 --- a/Adafruit_Thermal.cpp +++ b/Adafruit_Thermal.cpp @@ -140,6 +140,32 @@ void Adafruit_Thermal::writeBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d, ui storeInBuffer(h); } +void Adafruit_Thermal::setBytes(uint8_t a) { + storeInBuffer(a); + DEBUG_("%02X",a); +} + +void Adafruit_Thermal::setBytes(uint8_t a, uint8_t b) { + storeInBuffer(a); + storeInBuffer(b); + DEBUG_("%02X%02X",a,b); +} + +void Adafruit_Thermal::setBytes(uint8_t a, uint8_t b, uint8_t c) { + storeInBuffer(a); + storeInBuffer(b); + storeInBuffer(c); + DEBUG_("%02X%02X%02X",a,b,c); +} + +void Adafruit_Thermal::setBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d) { + storeInBuffer(a); + storeInBuffer(b); + storeInBuffer(c); + storeInBuffer(d); + DEBUG_("%02X%02X%02X%02X",a,b,c,d); +} + // The underlying method for all high-level printing (e.g. println()). // The inherited Print class handles the rest! size_t Adafruit_Thermal::write(uint8_t c) { @@ -161,8 +187,13 @@ void Adafruit_Thermal::storeInBuffer(uint8_t c) #endif if (c != 13) { // Strip carriage returns + + - internalBuffer.push_back(c); + if(internalBuffer.size() < internalBuffer.capacity()) + internalBuffer.emplace_back(c); + else + internalBuffer.push_back(c); unsigned long d = BYTE_TIME; if ((c == '\n') || (column == maxColumn)) @@ -180,7 +211,16 @@ void Adafruit_Thermal::storeInBuffer(uint8_t c) prevByte = c; } } - +#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c" +#define BYTE_TO_BINARY(byte) \ + (byte & 0x80 ? '1' : '0'), \ + (byte & 0x40 ? '1' : '0'), \ + (byte & 0x20 ? '1' : '0'), \ + (byte & 0x10 ? '1' : '0'), \ + (byte & 0x08 ? '1' : '0'), \ + (byte & 0x04 ? '1' : '0'), \ + (byte & 0x02 ? '1' : '0'), \ + (byte & 0x01 ? '1' : '0') void Adafruit_Thermal::loop() { if(internalBuffer.size()) @@ -195,7 +235,7 @@ void Adafruit_Thermal::loop() } else if(largeReserve) { - // DEBUG_("Resizing capacity to 100\n"); + DEBUG_("Resizing capacity to 100\n"); internalBuffer.shrink_to_fit(); internalBuffer.reserve(100); largeReserve = false; @@ -206,16 +246,21 @@ void Adafruit_Thermal::loop() static uint32_t prevmillis; static uint8_t count; - if (millis() - prevmillis > 100 && count < 10) + if (millis() - prevmillis > 100 && count <= 10) { + DEBUG_("Trying to read response\tstream->available()=%d\tcount=%d\n",stream->available(),count); paperStatus = -1; if (stream->available()) { - paperStatus = stream->read(); + byte data = stream->read(); count = 0; askedForPaper = false; paperResultReady = true; - paperStatus = !(paperStatus & 0b00000100); + bool nearOut = ((data >> 3) & 0x01); + bool noPaper = ((data >> 6) & 0x01); + Serial.printf("noPaper=%d\tnearOut=%d\tdata="BYTE_TO_BINARY_PATTERN"\n",noPaper,nearOut,BYTE_TO_BINARY(data)); + + paperStatus = noPaper ? 0 : nearOut ? 1 : 2; } if(count == 10 && !paperResultReady) { @@ -226,7 +271,7 @@ void Adafruit_Thermal::loop() } count++; - + prevmillis = millis(); } } } @@ -243,6 +288,7 @@ void Adafruit_Thermal::begin(uint8_t heatTime) { // The printer can't start receiving data immediately upon power up -- // it needs a moment to cold boot and initialize. Allow at least 1/2 // sec of uptime before printer can receive data. + // timeoutSet(500000L); internalBuffer.reserve(100); //Reserve 100 bytes for better code performence (Less memory re-allocations) wake(); reset(); @@ -443,16 +489,10 @@ void Adafruit_Thermal::boldOff() { unsetPrintMode(BOLD_MASK); } void Adafruit_Thermal::justify(char value) { uint8_t pos = 0; - switch (toupper(value)) { - case 'L': - pos = 0; - break; - case 'C': - pos = 1; - break; - case 'R': - pos = 2; - break; + switch(toupper(value)) { + case 'L': pos = 0; break; + case 'C': pos = 1; break; + case 'R': pos = 2; break; } writeBytes(ASCII_ESC, 'a', pos); @@ -560,7 +600,7 @@ int Adafruit_Thermal::printBitmap( int w, int h, const uint8_t *bitmap, bool fro //also beware of switched height vs width when the image is transposed int Adafruit_Thermal::defineBitImage( int w, int h, const uint8_t *bitmap, bool fromProgMem) { - int colBytes, rowBytes, rowBytesClipped, rowStart, chunkHeight, x, y, i; + int colBytes, rowBytes, x, y, i; rowBytes = (w + 7) / 8; // Round up to next byte boundary colBytes = (h + 7) / 8; @@ -594,7 +634,7 @@ void Adafruit_Thermal::printDefinedBitImage(int mode){ //also beware of switched height vs width when the image is transposed //n=1 NV images int Adafruit_Thermal::defineNVBitmap( int w, int h, const uint8_t *bitmap, bool fromProgMem) { - int colBytes, rowBytes, rowBytesClipped, rowStart, chunkHeight, x, y, i; + int colBytes, rowBytes, x, y, i; rowBytes = (w / 8); //Round up to next byte boundary for columns, which are transposed rows colBytes = (h + 7) / 8; @@ -807,14 +847,44 @@ void Adafruit_Thermal::wake() { #endif } +// Blocking Functions +// Check the status of the paper using the printer's self reporting +// ability. Returns true for paper, false for no paper.// Might not work on all printers! + +bool Adafruit_Thermal::hasPaper() { +#if PRINTER_FIRMWARE >= 264 + writeBytes(ASCII_ESC, 'v', 0); +#else + writeBytes(ASCII_GS, 'r', 0); +#endif + + int status = -1; + for (uint8_t i = 0; i < 10; i++) + { + if (stream->available()) + { + status = stream->read(); + break; + } + delay(100); + } + + return !(status & 0b00000100); +} + +//non-Blocking Function +// Printers have 2 sensors : one at the end of roll, one at the near end. // Check the status of the paper using the printer's self reporting -// ability. Returns 1 when it has paper ,, 0 when has no paper ,, -1 : timeout or short time / No response. +// ability. Returns 0 when it has no paper Roll ,, 1 when it's near out ,,2 when it has paper ,, -1 : timeout or short time / No response. // Might not work on all printers! -int Adafruit_Thermal::hasPaper() +int Adafruit_Thermal::paperLevel() { if (paperResultReady) { - return paperStatus; + paperResultReady = false; + int result = paperStatus; + paperStatus = -1; + return result; } else return -1; @@ -883,7 +953,7 @@ void Adafruit_Thermal::setBeep(int sec) { // Standard ESC/POS commands that work only on printers that support these commands -void Adafruit_Thermal::printQRcode(char *text, uint8_t errCorrect, uint8_t moduleSize, uint8_t model) { //Store data and print QR Code +void Adafruit_Thermal::printQRcode(const char *text, uint8_t errCorrect, uint8_t moduleSize, uint8_t model) { //Store data and print QR Code //Set QR-Code model //Range @@ -934,3 +1004,20 @@ void Adafruit_Thermal::reprintQRcode() { //Reprint a previously printed QR Code prevByte = '\n'; /// Treat as if prior line is blank } + +int Adafruit_Thermal::reserveBytes(int size){ + uint32_t bytesToReserve = size + internalBuffer.size() + EXCESS_BYTES; + if ( bytesToReserve > AVAILABLE_MEM) + { + return 1; + } + else + { + DEBUG_("Reserving %d bytes\n",bytesToReserve); + internalBuffer.reserve(bytesToReserve); + if (bytesToReserve > 100) + largeReserve = true; + } + return 0; + +} diff --git a/Adafruit_Thermal.h b/Adafruit_Thermal.h index fc38495..9f9ed83 100644 --- a/Adafruit_Thermal.h +++ b/Adafruit_Thermal.h @@ -21,7 +21,7 @@ #define EAN8 68 //!< EAN8 (JAN8) barcode system. 7-8 char #define CODE39 69 //!< CODE39 barcode system. 1<=num of chars #define ITF 70 //!< ITF barcode system. 1<=num of chars, must be an even number -#define CODABAR 71 //!< CODABAR barcode system. 1<=num<=255 +#define CODEBAR 71 //!< CODEBAR barcode system. 1<=num<=255 #define CODE93 72 //!< CODE93 barcode system. 1<=num<=255 #define CODE128 73 //!< CODE128 barcode system. 2<=num<=255 @@ -105,18 +105,18 @@ #define EAN13 2 #define EAN8 3 #define CODE39 4 -#define ITF 5 -#define CODABAR 6 +#define I25 5 +#define ITF I25 +#define CODEBAR 6 #define CODE93 7 #define CODE128 8 #define CODE11 9 #define MSI 10 #endif - - +// #define DEBUG_PRINTER_ #ifdef DEBUG_PRINTER_ #define DEBUG_(f_,...) Serial.printf((f_), ##__VA_ARGS__) -#define SERIAL_WRITE(c) Serial.write(c) +#define SERIAL_WRITE(c) Serial.printf("%02X",c) #else #define DEBUG_(f_,...) #define SERIAL_WRITE(c) @@ -275,7 +275,7 @@ class Adafruit_Thermal : public Print { * @param moduleSize Module Size * @param model */ - printQRcode(char *text, uint8_t errCorrect=48, uint8_t moduleSize=3, uint8_t model=50), + printQRcode(const char *text, uint8_t errCorrect=48, uint8_t moduleSize=3, uint8_t model=50), /*! * @brief Re-Prints a QR Code, Only works on printers with support for this feature * @param timeoutQR @@ -447,7 +447,33 @@ class Adafruit_Thermal : public Print { * @brief Sets beep duration * @param sec seconds */ - setBeep(int sec); + setBeep(int sec), + /*! + * @brief Sets directly to librarie's internal buffer + * @param a byte to store + */ + setBytes(uint8_t a), + /*! + * @brief Sets directly to librarie's internal buffer + * @param a byte to store + * @param b byte to store + */ + setBytes(uint8_t a, uint8_t b), + /*! + * @brief Sets directly to librarie's internal buffer + * @param a byte to store + * @param b byte to store + * @param c byte to store + */ + setBytes(uint8_t a, uint8_t b, uint8_t c), + /*! + * @brief Sets directly to librarie's internal buffer + * @param a byte to store + * @param b byte to store + * @param c byte to store + * @param d byte to store + */ + setBytes(uint8_t a, uint8_t b, uint8_t c, uint8_t d); int /*! @@ -503,7 +529,16 @@ class Adafruit_Thermal : public Print { */ defineNVBitmap(int w1, int h1, const uint8_t *bitmap1,int w2, int h2, const uint8_t *bitmap2, bool fromProgMem), /*! - * @brief Whether or not the printer has paper + * @brief Non-Blocking function. Gets the paper level, Printers have 2 sensors : one at the end of roll, one at the near end. + * Make sure you call askForPaperAvailability() before 100ms at least of calling this function. + * @return 0 when it has no paper Roll ,, 1 when it's near out ,,2 when it has paper ,, -1 : timeout or short time call / No response. + */ + paperLevel(), + reserveBytes(int size); +bool + /*! + * @brief Check Whether or not the printer has paper + * Blocking function. * @return Returns true if there is still paper */ hasPaper(); diff --git a/keywords.txt b/keywords.txt index 7fa412e..4a73fe7 100644 --- a/keywords.txt +++ b/keywords.txt @@ -48,6 +48,20 @@ beep KEYWORD2 setCharset KEYWORD2 setCodePage KEYWORD2 printBitmap KEYWORD2 +setBytes KEYWORD2 +defineBitImage KEYWORD2 +defineNVBitmap KEYWORD2 +paperLevel KEYWORD2 +reserveBytes KEYWORD2 +hasPaper KEYWORD2 +askForPaperAvailability KEYWORD2 +cut KEYWORD2 +beep KEYWORD2 +printDefinedBitImage KEYWORD2 +printNVBitmap KEYWORD2 +printQRcode KEYWORD2 +printBitmap_ada KEYWORD2 +loop KEYWORD2 diff --git a/library.properties b/library.properties index 09fbba4..1387bad 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Adafruit Thermal Printer Library -version=1.2.1 +version=1.3.0 author=Adafruit maintainer=Adafruit sentence=Arduino Library for Small Thermal Printers