diff --git a/E-Paper_Showerthoughts.ino b/E-Paper_Showerthoughts.ino new file mode 100644 index 0000000..9f9bf3b --- /dev/null +++ b/E-Paper_Showerthoughts.ino @@ -0,0 +1,173 @@ +#define ENABLE_GxEPD2_GFX 0 + +#include +#include +#include +#include +#include +#include + +#include "credentials.h" +#include "logo.h" + + +#if defined(ESP32) +GxEPD2_BW display(GxEPD2_750(/*CS=*/ 15, /*DC=*/ 27, /*RST=*/ 26, /*BUSY=*/ 25)); +#endif + +#define uS_TO_S_FACTOR 1000000 // Conversion of seconds (S) to microseconds (uS) +#define SLEEPING_TIME 1800 // Time in Seconds e.g. 1800s = 0.5 hours +RTC_DATA_ATTR int bootCount = 0; // Boot counter after deep sleep + +// Creating instances +WiFiClientSecure client; + +void setup() { + Serial.begin(115200); + display.init(115200); + SPI.end(); // Do not use standard SPI pins + SPI.begin(13, 12, 14, 15); // Remap SPI pins for Waveshare ESP32 module + display.fillScreen(GxEPD_WHITE); + display.setRotation(3); // Rotate Dislay orientation 180° + Serial.println("DEBUG: Setup EPD Display complete"); + delay(2000); + connectToWifi(); + esp_sleep_enable_timer_wakeup(SLEEPING_TIME * uS_TO_S_FACTOR); + ++bootCount; + Serial.println("INFO: Boot number: " + String(bootCount)); +} + +void loop() { + DisplayShowerthought(); + Serial.println("INFO: Going to deep sleep"); + esp_wifi_stop(); + esp_bt_controller_disable(); + esp_deep_sleep_start(); +} + + +////////////////////////////////////////////////// +///// WiFi Setup ///// +////////////////////////////////////////////////// + +void connectToWifi() { + WiFi.begin(ssid, password); + Serial.print("WIFI: Connecting "); + + while (WiFi.status() != WL_CONNECTED) { + Serial.print("."); + delay(500); + } + + Serial.println("WIFI: Connected to network"); + Serial.println(WiFi.localIP()); + Serial.println(WiFi.macAddress()); +} + + +const char GreeterText[] = "Reddit | Showerthoughts"; + +void DisplayShowerthought() { + Serial.println("DEBUG: Showing greeting screen"); + //display.setRotation(3); + display.setFont(&FreeMonoBold9pt7b); + display.setTextColor(GxEPD_BLACK); + int16_t tbx, tby; uint16_t tbw, tbh; + display.getTextBounds(GreeterText, 0, 0, &tbx, &tby, &tbw, &tbh); + uint16_t x = ((display.width() - tbw) / 2) - tbx; + uint16_t y = ((display.height() - tbh) / 2) - tby; + display.setFullWindow(); + display.firstPage(); // Full refresh + String Thought = getShowerthought(); + do { + display.fillScreen(GxEPD_WHITE); + display.drawBitmap(130, 90, logo, 125, 125, GxEPD_BLACK); + display.setCursor(x, y); + display.print(GreeterText); + display.drawRect(x-16, y-20, tbw+32, tbh+18, GxEPD_BLACK); + display.setCursor(0, 450); + display.print(Thought); + } + while (display.nextPage()); +} + + +////////////////////////////////////////////////// +///// Reddit utils ///// +////////////////////////////////////////////////// +String getShowerthought() { + // Connect to reddit.com and fetch the showerthought data using the web client + Serial.println("Fetching Showerthougt"); + if(!client.connect(host, port)) { + Serial.println("connection 1 failed!"); + return "Impossible to connect to Reddit"; + } + String url = "/r/Showerthoughts/random.json?sort=hot&limit=1&t=day"; + client.print(String("GET ") + url + " HTTP/1.1\r\n" + + "Host: " + host + "\r\n" + + "User-Agent: ESP32/0.1\r\n" + + "Connection: close\r\n\r\n"); + unsigned long timeout = millis(); + while (client.available() == 0) { + if (millis() - timeout > 5000) { + Serial.println(">>> Client Timeout !"); + client.stop(); + return "Reddit did not respond in time"; + } + } + + // get the random post url (redirection) + String headerLine = ""; + String locationUrl; + while(headerLine != "\r") { + headerLine = client.readStringUntil('\n'); + if(headerLine.indexOf("location: ") ==0) { + locationUrl = headerLine.substring(10, headerLine.indexOf("?")); + break; + } + } + client.stop(); + // get the content of the url we just got + if(!client.connect(host, port)) { + Serial.println("connection 2 failed!"); + return "Impossible to reconnect to Reddit"; + } + client.print(String("GET ") + locationUrl + " HTTP/1.1\r\n" + + "Host: " + host + "\r\n" + + "User-Agent: ESP32/0.1\r\n" + + "Connection: close\r\n\r\n"); + timeout = millis(); + while (client.available() == 0) { + if (millis() - timeout > 5000) { + Serial.println(">>> Client Timeout !"); + client.stop(); + return "Shower thought did not arrived in time"; + } + } + // get rid of header + while(client.connected()) { + String line = client.readStringUntil('\n'); + if (line == "\r") { + Serial.println("headers received"); + break; + } + } + // Get the response from the reddit.com server + String quote = client.readStringUntil('\n'); + client.stop(); + // As the JSON-formatted response text can be too long, we'll parse it manually instead of using ArduinoJson + int quote_start = quote.indexOf("\"title\""); + // The showerthought quote ends right before a ', "' substring + int quote_end = quote.indexOf(", \"", quote_start+1); // we start the search from the position where "title" is + String showerthought = quote.substring(quote_start+9, quote_end); + // Sanitize the string a bit + showerthought.replace("\\\"","'"); // get rid of escaped quotes in the text ('\"') + int junkIndex = showerthought.indexOf("\\u"); + while(junkIndex >= 0) { + showerthought.remove(junkIndex, 5); + showerthought.setCharAt(junkIndex, '\''); + junkIndex = showerthought.indexOf("\\u"); + } + return showerthought; + Serial.print(showerthought); +} diff --git a/README.md b/README.md index c564548..348b5e0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,17 @@ -# E-Paper_Showerthoughts +# E-Paper Showerthoughts Display +This code uses an ESP32 to fetch latest posts from [/r/showerthoughts](https://www.reddit.com/r/Showerthoughts/) and displays them on a Waveshare e-paper display. Afterwards it puts the ESP to deep sleep mode. All components run on battery power without annoying cables. -This repository contains code for fetching posts from /r/showerthoughts and displaying them on a waveshare e-paper display. \ No newline at end of file +![Front](img/01_Front.jpg) +![Front](img/02_Back.jpg) + +#### Used Hardware ++ [Waveshare 7.5" e-paper display](https://www.waveshare.com/7.5inch-e-paper.htm) ++ [Waveshare ESP32 Driver Board](https://www.waveshare.com/e-paper-esp32-driver-board.htm) ++ [IKEA Ribba Picture Frame 21x30cm](https://www.ikea.com/de/de/p/ribba-rahmen-schwarz-60378396/) ++ Custom made passepartouts (approx 10€) ++ [18650 battery](https://de.aliexpress.com/item/33033883495.html?spm=a2g0o.productlist.0.0.708e4adbR5PUrg&algo_pvid=909ec7f9-0dec-4d04-9ab2-ef9166feb299&algo_expid=909ec7f9-0dec-4d04-9ab2-ef9166feb299-12&btsid=d3c3feb7-5f93-4090-ad6a-6a72fec81e74&ws_ab_test=searchweb0_0,searchweb201602_9,searchweb201603_55) ++ [Battery charge shield for 18650 batteries](https://de.aliexpress.com/item/32870248379.html?spm=a2g0o.productlist.0.0.74ef5554qSLELp&algo_pvid=a72d0c05-ed9a-41f1-8723-c99a06ee77b7&algo_expid=a72d0c05-ed9a-41f1-8723-c99a06ee77b7-3&btsid=370f59b5-5bf4-438d-9ef8-dbafc59dce1f&ws_ab_test=searchweb0_0,searchweb201602_9,searchweb201603_55) + +#### To do +- [x] Add showerthoughts logo +- [ ] Better word wrapping diff --git a/credentials.h b/credentials.h new file mode 100644 index 0000000..bd05d66 --- /dev/null +++ b/credentials.h @@ -0,0 +1,8 @@ +// WIFI +const char* ssid = ""; +const char* password = ""; + +// REDDIT +const char* host = "www.reddit.com"; +const int port = 443; +const char fingerprint[] = "77:C7:6C:11:70:33:25:EE:F0:6C:3B:E3:0F:15:C2:CB:2A:73:7A:56:F3:40:FD:76:29:1E:06:CB:0D:45:48:2C"; diff --git a/img/01_Front.jpg b/img/01_Front.jpg new file mode 100644 index 0000000..c4b5c1a Binary files /dev/null and b/img/01_Front.jpg differ diff --git a/img/02_Back.jpg b/img/02_Back.jpg new file mode 100644 index 0000000..dcc213d Binary files /dev/null and b/img/02_Back.jpg differ diff --git a/logo.h b/logo.h new file mode 100644 index 0000000..7b31c07 --- /dev/null +++ b/logo.h @@ -0,0 +1,140 @@ +#if defined(ESP8266) || defined(ESP32) +#include +#else +#include +#endif + +// Used http://javl.github.io/image2cpp/ +// Settings: +// * Background Color -> Black +// * Invert Image Colors -> True +// * Output: Arduino Code +// * Draw Mode: Horizontal - 1 bit per pixel + +const unsigned char logo [] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0xe0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, + 0x00, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, + 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, + 0x00, 0x07, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, + 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, + 0x00, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, + 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, + 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, + 0x00, 0x7f, 0x80, 0x00, 0x00, 0x06, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, + 0x00, 0xff, 0x80, 0x00, 0x00, 0x0f, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, + 0x00, 0xff, 0x80, 0x00, 0x00, 0x19, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, + 0x01, 0xff, 0x80, 0x00, 0x3c, 0x10, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, + 0x01, 0xff, 0x80, 0x00, 0x76, 0x10, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, + 0x03, 0xff, 0x00, 0x00, 0x63, 0x18, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, + 0x03, 0xff, 0x00, 0x00, 0x43, 0x19, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, + 0x07, 0xff, 0x00, 0x00, 0x61, 0x8f, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x07, 0xff, 0x80, 0x00, 0x39, 0x8e, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x07, 0xff, 0x80, 0x00, 0x1f, 0xfe, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x0f, 0xff, 0x80, 0x00, 0x07, 0xf6, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0f, 0xff, 0x80, 0x00, 0x01, 0x83, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1f, 0xff, 0x80, 0x00, 0x01, 0x81, 0x80, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x1f, 0xff, 0xc0, 0x00, 0xf9, 0x81, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x1f, 0xff, 0xc0, 0x01, 0x9f, 0x00, 0xc0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x1f, 0xff, 0xe0, 0x03, 0x07, 0x80, 0x60, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x3f, 0xff, 0xe0, 0x03, 0x07, 0xc0, 0x30, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x3f, 0xff, 0xf0, 0x01, 0x8c, 0x70, 0x18, 0x01, 0xfc, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x3f, 0xff, 0xf8, 0x01, 0xf8, 0x38, 0x0c, 0x01, 0xf8, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x3f, 0xff, 0xf8, 0x00, 0x70, 0x1c, 0x0e, 0x01, 0xf0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x7f, 0xff, 0xfc, 0x00, 0x00, 0x06, 0x07, 0x01, 0xe0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x7f, 0xff, 0xfe, 0x00, 0x00, 0x03, 0x03, 0x83, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x7f, 0xff, 0xff, 0x80, 0x00, 0x01, 0xc1, 0xc7, 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x7f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x7f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x70, 0x7e, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x38, 0x7c, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x1c, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0f, 0xf0, 0x00, 0x1f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x07, 0xe0, 0x00, 0x3e, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x07, 0xc0, 0x00, 0x7c, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x07, 0x80, 0x00, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0x00, 0x01, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1e, 0x00, 0x03, 0xe0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xc0, 0x03, 0xc7, 0xef, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0x80, 0x0f, 0xff, 0x80, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1f, 0x00, 0x1f, 0xff, 0x80, 0x1f, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x3e, 0x00, 0x1f, 0xff, 0xc0, 0x0f, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x7c, 0x00, 0x1e, 0x3f, 0xf0, 0x0f, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xf8, 0x00, 0x1e, 0x0f, 0xfc, 0x0f, 0xdf, 0xf8, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xf0, 0x00, 0x1e, 0x03, 0xff, 0x9f, 0x07, 0xf0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x03, 0xe0, 0x00, 0x0f, 0x80, 0xff, 0xff, 0x07, 0xf0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x07, 0xc0, 0x3c, 0x07, 0xe0, 0x7f, 0xff, 0x07, 0xf0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0f, 0x80, 0xfe, 0x03, 0xf8, 0x7f, 0xff, 0x0f, 0xf0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x1f, 0x00, 0xff, 0x83, 0xff, 0xf1, 0xff, 0xff, 0xf0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x3e, 0x01, 0xff, 0xc3, 0xff, 0xe0, 0x3f, 0xff, 0xf0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x7c, 0x01, 0xe7, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xe0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0xf8, 0x01, 0xe3, 0xff, 0x87, 0xf0, 0x03, 0xff, 0xe0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0x01, 0xf1, 0xff, 0x83, 0xfc, 0x00, 0xff, 0xe0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xe0, 0x00, 0xf8, 0xff, 0x80, 0xfe, 0x00, 0x7f, 0xe0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xc0, 0x00, 0x7c, 0x3f, 0xc0, 0x7f, 0x80, 0x7f, 0xc0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xc0, 0x00, 0x7e, 0x1f, 0xe0, 0x3f, 0xe0, 0x7f, 0xc0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x00, 0x3e, 0x0f, 0xf8, 0x3f, 0xf8, 0xff, 0xc0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xc0, 0x00, 0x1f, 0x07, 0xfc, 0x3f, 0xff, 0xff, 0xc0, + 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x7c, 0x1f, 0x83, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xfe, 0x1f, 0xc1, 0xff, 0xf8, 0x7f, 0xff, 0x80, + 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0x1f, 0xe0, 0x7f, 0xf8, 0x1f, 0xff, 0x00, + 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xf0, 0x7f, 0xf8, 0x07, 0xff, 0x00, + 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xe3, 0xff, 0xf8, 0x7f, 0xfc, 0x03, 0xff, 0x00, + 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xe3, 0xff, 0xf8, 0x7f, 0xfe, 0x01, 0xfe, 0x00, + 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xe1, 0xf1, 0xff, 0xff, 0xff, 0x81, 0xfe, 0x00, + 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf1, 0xf0, 0xff, 0xe3, 0xff, 0xc3, 0xfc, 0x00, + 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0x7f, 0xc1, 0xff, 0xff, 0xfc, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8, 0xf0, 0x7f, 0xc0, 0x7f, 0xff, 0xf8, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x3f, 0xc0, 0x3f, 0xff, 0xf8, 0x00, + 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7c, 0x1f, 0xe0, 0x1f, 0xff, 0xf0, 0x00, + 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7c, 0x1f, 0xf0, 0x0f, 0xff, 0xe0, 0x00, + 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7e, 0x1f, 0xf0, 0x07, 0xff, 0xe0, 0x00, + 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x1f, 0xf8, 0x03, 0xff, 0xc0, 0x00, + 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xfc, 0x01, 0xff, 0x80, 0x00, + 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xcf, 0xff, 0xfe, 0x00, 0xff, 0x80, 0x00, + 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x87, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, + 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x87, 0xf1, 0xff, 0x81, 0xfe, 0x00, 0x00, + 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x83, 0xf0, 0xff, 0xc1, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xc1, 0xf0, 0x7f, 0xe7, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xc1, 0xf0, 0x7f, 0xff, 0xf8, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0xc0, 0xf8, 0x3f, 0xff, 0xf0, 0x00, 0x00, + 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0xe0, 0xf8, 0x1f, 0xff, 0xe0, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xe0, 0x7c, 0x1f, 0xff, 0xc0, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7c, 0x1f, 0xff, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3e, 0x1f, 0xfe, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0x3f, 0xfc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xf8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7c, 0x7f, 0xff, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +};