Add screen basic notification

Dsiplay SSID / SIGNAL / IP and status like in 2.X
This commit is contained in:
Luc 2019-03-24 09:44:05 +01:00
parent 76bad8d262
commit 3b380bac12
16 changed files with 1052 additions and 386 deletions

View File

@ -49,14 +49,15 @@
//OLED_I2C_SSD1306 1
//OLED_I2C_SSDSH1106 2
//TFT_SPI_ILI9341_320X240 3
//#define DISPLAY_DEVICE TFT_SPI_ILI9341_320X240
#define DISPLAY_DEVICE OLED_I2C_SSD1306
#if defined (DISPLAY_DEVICE)
//for ILI9143 edit User_Setup.h of TFT_eSPI library
#define DISPLAY_I2C_PIN_SDA 4
#define DISPLAY_I2C_PIN_SCL 15
#define DISPLAY_I2C_PIN_RST 16 //comment if not applicable
#define DISPLAY_I2C_PIN_SCL 5
//#define DISPLAY_I2C_PIN_RST 16 //comment if not applicable
#define DISPLAY_I2C_ADDR 0x3c
//#define DISPLAY_FLIP_VERTICALY 1 //comment to disable
#define DISPLAY_FLIP_VERTICALY 1 //comment to disable
#endif //DISPLAY_DEVICE
//DHT_DEVICE: send update of temperature / humidity based on DHT 11/22
//#define DHT_DEVICE
@ -68,9 +69,9 @@
#endif //DHT_DEVICE
//PIN_RESET_FEATURE : allow to reset settings by setting low a pin
#define PIN_RESET_FEATURE
//#define PIN_RESET_FEATURE
#if defined (PIN_RESET_FEATURE)
#define ESP3D_RESET_PIN 4
#define ESP3D_RESET_PIN 2
#endif //PIN_RESET_FEATURE
//SDCARD_FEATURE: to access SD Card files directly instead of access by serial using printer Board FW
//#define SDCARD_FEATURE

View File

@ -44,6 +44,7 @@
#include "esp3doutput.h"
#include "../modules/boot_delay/boot_delay.h"
bool Esp3D::restart = false;
//Contructor
@ -64,6 +65,8 @@ bool Esp3D::begin()
BootDelay bd;
Hal::begin();
DEBUG_ESP3D_INIT
//init output
ESP3DOutput::isOutput(ESP_ALL_CLIENTS, true);
bool res = true;
#if defined(CONNECTED_DEVICES_FEATURE)
if (!DevicesServices::begin()) {
@ -72,7 +75,11 @@ bool Esp3D::begin()
}
#endif //CONNECTED_DEVICES_FEATURE
//delayto avoid to disturb printer
bd.begin(/*&outserialfn*/);
#ifdef DISPLAY_DEVICE
bd.begin(&display_progress);
#else
bd.begin();
#endif //DISPLAY_DEVICE
log_esp3d("Mode %d", WiFi.getMode());
if (!Settings_ESP3D::begin()) {
@ -81,8 +88,6 @@ bool Esp3D::begin()
//Restart ESP3D
restart_esp();
}
//init output
ESP3DOutput::isOutput(ESP_ALL_CLIENTS, true);
//BT do not start automaticaly so should be OK
//Serial service
if (!serial_service.begin()) {

View File

@ -40,8 +40,9 @@ uint8_t ESP3DOutput::_outputflags = ESP_ALL_CLIENTS;
#include <ESP8266WebServer.h>
#endif //ARDUINO_ARCH_ESP8266
#endif //HTTP_FEATURE
#if defined (DISPLAY_DEVICE)
#include "../modules/display/display.h"
#endif //DISPLAY_DEVICE
//constructor
ESP3DOutput::ESP3DOutput(uint8_t client)
@ -204,6 +205,9 @@ size_t ESP3DOutput::printMSG(const char * s)
display+= s;
return printLN(display.c_str());
}
if (_client == ESP_SCREEN_CLIENT){
return print(s);
}
switch(Settings_ESP3D::GetFirmwareTarget()) {
case GRBL:
display = "[MSG:";
@ -230,6 +234,9 @@ size_t ESP3DOutput::printERROR(const char * s, int code_error)
if (!isOutput(_client)) {
return 0;
}
if (_client == ESP_SCREEN_CLIENT){
return print(s);
}
#ifdef HTTP_FEATURE
_code = code_error;
if (_client == ESP_HTTP_CLIENT) {
@ -350,6 +357,11 @@ size_t ESP3DOutput::write(const uint8_t *buffer, size_t size)
}
break;
#endif //HTTP_FEATURE
#if defined (DISPLAY_DEVICE)
case ESP_SCREEN_CLIENT:
esp3d_display.SetStatus((const char *)buffer);
return size;
#endif //DISPLAY_DEVICE
#if defined (BLUETOOTH_FEATURE)
case ESP_BT_CLIENT:
if(bt_service.started()) {

View File

@ -25,7 +25,7 @@
#define ESP_WEBSOCKET_TERMINAL_CLIENT 8
#define ESP_PRINTER_LCD_CLIENT 16
#define ESP_BT_CLIENT 32
#define ESP_OLED_CLIENT 64
#define ESP_SCREEN_CLIENT 64
#define ESP_WEBSOCKET_CLIENT 128
#define ESP_ALL_CLIENTS 255

View File

@ -444,9 +444,9 @@ bool Commands::ESP400(const char* cmd_params, level_authenticate_type auth_type,
output->print ("\",\"T\":\"F\",\"V\":\"");
output->print (Settings_ESP3D::read_byte(ESP_TARGET_FW));
output->printf ("\",\"H\":\"Output msg\",\"O\":[{\"M117\":\"%d\"}", ESP_PRINTER_LCD_CLIENT);
#ifdef ESP_OLED_FEATURE
output->printf (",{\"Oled\":\"%d\"}", ESP_OLED_CLIENT);
#endif //ESP_OLED_FEATURE
#ifdef DISPLAY_DEVICE
output->printf (",{\"Screen\":\"%d\"}", ESP_SCREEN_CLIENT);
#endif //DISPLAY_DEVICE
output->printf (",{\"Serial\":\"%d\"}", ESP_SERIAL_CLIENT);
#ifdef WS_DATA_FEATURE
output->printf (",{\"Web Socket\":\"%d\"}", ESP_WEBSOCKET_CLIENT);

View File

@ -22,7 +22,7 @@
#define _VERSION_ESP3D_H
//version and sources location
#define FW_VERSION "3.0.0.a5"
#define FW_VERSION "3.0.0.a6"
#define REPOSITORY "https://github.com/luc-github/ESP3D"
#endif //_VERSION_ESP3D_H

View File

@ -69,7 +69,8 @@ static void my_spp_cb(esp_spp_cb_event_t event, esp_spp_cb_param_t *param)
{
ESP3DOutput output(ESP_ALL_CLIENTS);
switch (event) {
case ESP_SPP_SRV_OPEN_EVT: { //Server connection open
case ESP_SPP_SRV_OPEN_EVT:
{ //Server connection open
char str[18];
str[17]='\0';
uint8_t * addr = param->srv_open.rem_bda;
@ -78,12 +79,22 @@ static void my_spp_cb(esp_spp_cb_event_t event, esp_spp_cb_param_t *param)
String stmp = "BT Connected with ";
stmp += str;
output.printMSG(stmp.c_str());
#if defined (DISPLAY_DEVICE)
ESP3DOutput outputscr(ESP_SCREEN_CLIENT);
outputscr.printMSG(stmp.c_str());
#endif //DISPLAY_DEVICE
}
break;
case ESP_SPP_CLOSE_EVT://Client connection closed
case ESP_SPP_CLOSE_EVT:
{//Client connection closed
output.printMSG("BT Disconnected");
#if defined (DISPLAY_DEVICE)
ESP3DOutput outputscr(ESP_SCREEN_CLIENT);
outputscr.printMSG("BT Disconnected");
#endif //DISPLAY_DEVICE
BTService::setClientAddress("");
}
break;
default:
break;

View File

@ -77,6 +77,6 @@ private :
void flushbuffer();
};
extern BTService bt_service;
extern BTService bt_service;
#endif //_BT_SERVICE_H

View File

@ -0,0 +1,67 @@
/*
OLED_SSD1306.h - ESP3D display data file
Copyright (c) 2014 Luc Lebosse. All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
//Screen size
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
//Colors
#define TFT_BLACK BLACK
#define TFT_WHITE WHITE
#define SPLASH_FG TFT_BLACK
#define SPLASH_BG TFT_WHITE
#define SCREEN_BG TFT_BLACK
#define PROGRESS_FG TFT_WHITE
#define SIGNAL_FG TFT_WHITE
#define SSID_FG TFT_WHITE
#define IP_FG TFT_WHITE
#define STATUS_FG TFT_WHITE
//Fonts
#define FONTSIGNAL 2
#define FONTSSID 2
#define FONTIP 3
#define FONTSTATUS 2
//Positions
#define SIGNAL_X 128-27
#define SIGNAL_Y 0
#define SIGNAL_W 46
#define SIGNAL_H 10
#define SIGNAL_ICON_X 128-43
#define SIGNAL_ICON_Y 2
#define SIGNAL_ICON_W 15
#define SIGNAL_ICON_H 10
#define SIGNAL_ICON_W_BAR 3
#define SIGNAL_ICON_SPACER_X 1
#define SSID_AREA_X 0
#define SSID_AREA_Y 0
#define SSID_AREA_W 85
#define SSID_AREA_H 12
#define IP_AREA_X 0
#define IP_AREA_Y 16
#define IP_AREA_W 128
#define IP_AREA_H 16
#define STATUS_AREA_X 0
#define STATUS_AREA_Y 48
#define STATUS_AREA_W 128
#define STATUS_AREA_H 16

View File

@ -0,0 +1,67 @@
/*
OLED_SSDSH1106.h - ESP3D display data file
Copyright (c) 2014 Luc Lebosse. All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
//Screen size
#define SCREEN_WIDTH 132
#define SCREEN_HEIGHT 64
//Colors
#define TFT_BLACK BLACK
#define TFT_WHITE WHITE
#define SPLASH_FG TFT_BLACK
#define SPLASH_BG TFT_WHITE
#define SCREEN_BG TFT_BLACK
#define PROGRESS_FG TFT_WHITE
#define SIGNAL_FG TFT_WHITE
#define SSID_FG TFT_WHITE
#define IP_FG TFT_WHITE
#define STATUS_FG TFT_WHITE
//Fonts
#define FONTSIGNAL 2
#define FONTSSID 2
#define FONTIP 3
#define FONTSTATUS 2
//Positions
#define SIGNAL_X 132-27
#define SIGNAL_Y 0
#define SIGNAL_W 46
#define SIGNAL_H 10
#define SIGNAL_ICON_X 132-43
#define SIGNAL_ICON_Y 2
#define SIGNAL_ICON_W 15
#define SIGNAL_ICON_H 10
#define SIGNAL_ICON_W_BAR 3
#define SIGNAL_ICON_SPACER_X 1
#define SSID_AREA_X 0
#define SSID_AREA_Y 0
#define SSID_AREA_W 85
#define SSID_AREA_H 12
#define IP_AREA_X 0
#define IP_AREA_Y 16
#define IP_AREA_W 132
#define IP_AREA_H 16
#define STATUS_AREA_X 0
#define STATUS_AREA_Y 48
#define STATUS_AREA_W 132
#define STATUS_AREA_H 16

View File

@ -0,0 +1,66 @@
/*
OLED_SSD1306.h - ESP3D display data file
Copyright (c) 2014 Luc Lebosse. All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
//Screen size
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
//Colors
#define SPLASH_FG TFT_BLACK
#define SPLASH_BG TFT_WHITE
#define SCREEN_BG TFT_BLACK
#define PROGRESS_FG TFT_WHITE
#define SIGNAL_FG TFT_WHITE
#define SSID_FG TFT_WHITE
#define IP_FG TFT_WHITE
#define STATUS_FG TFT_WHITE
//Fonts
#define FONTSIGNAL 2
#define FONTSSID 2
#define FONTIP 3
#define FONTSTATUS 2
//Positions
#define SIGNAL_X 320-34
#define SIGNAL_Y 0
#define SIGNAL_W 34
#define SIGNAL_H 16
#define SIGNAL_ICON_X 320-50
#define SIGNAL_ICON_Y 2
#define SIGNAL_ICON_W 15
#define SIGNAL_ICON_H 10
#define SIGNAL_ICON_W_BAR 3
#define SIGNAL_ICON_SPACER_X 1
#define SSID_AREA_X 0
#define SSID_AREA_Y 0
#define SSID_AREA_W 269
#define SSID_AREA_H 16
#define IP_AREA_X 0
#define IP_AREA_Y 16
#define IP_AREA_W 320
#define IP_AREA_H 16
#define STATUS_AREA_X 0
#define STATUS_AREA_Y 48
#define STATUS_AREA_W 320
#define STATUS_AREA_H 16

View File

@ -29,43 +29,295 @@
#include "esp3d_logo.h"
#if DISPLAY_DEVICE == OLED_I2C_SSD1306
#include <SSD1306.h>
SSD1306 esp_display(DISPLAY_I2C_ADDR, DISPLAY_I2C_PIN_SDA, DISPLAY_I2C_PIN_SCL);
SSD1306 esp3d_screen(DISPLAY_I2C_ADDR, DISPLAY_I2C_PIN_SDA, DISPLAY_I2C_PIN_SCL);
#include "OLED_SSD1306.h"
#endif //DISPLAY_DEVICE == OLED_I2C_SSD1306
#if DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#include <SH1106.h>
SH1106 esp_display(DISPLAY_I2C_ADDR, (DISPLAY_I2C_PIN_SDA==-1)?SDA:DISPLAY_I2C_PIN_SDA, (DISPLAY_I2C_PIN_SCL==-1)?SCL:DISPLAY_I2C_PIN_SCL);
SH1106 esp3d_screen(DISPLAY_I2C_ADDR, (DISPLAY_I2C_PIN_SDA==-1)?SDA:DISPLAY_I2C_PIN_SDA, (DISPLAY_I2C_PIN_SCL==-1)?SCL:DISPLAY_I2C_PIN_SCL);
#include "OLED_SSDSH1106.h"
#endif //DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#endif //DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240
#include <TFT_eSPI.h>
TFT_eSPI esp_display = TFT_eSPI();
TFT_eSPI esp3d_screen = TFT_eSPI();
#include "esp3d_logob.h"
#include "TFT_ILI9341_240X320.h"
#endif //TFT_SPI_ILI9341_240X320
#if defined (WIFI_FEATURE)
#include "../wifi/wificonfig.h"
#endif // WIFI_FEATURE
#if defined (ETH_FEATURE)
#include "../ethernet/ethconfig.h"
#endif //ETH_FEATURE
#if defined (BLUETOOTH_FEATURE)
#include "../bluetooth/BT_service.h"
#endif //BLUETOOTH_FEATURE
#if defined (WIFI_FEATURE) || defined (ETH_FEATURE) || defined (BLUETOOTH_FEATURE)
#include "../network/netconfig.h"
#endif //WIFI_FEATURE || ETH_FEATURE) ||BLUETOOTH_FEATURE
#define DISPLAY_REFRESH_TIME 1000
Display esp3d_display;
bool Display::splash()
{
log_esp3d("Splash");
if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) {
return false;
}
if (!_splash_displayed) {
#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
esp_display.drawXbm((_screenwidth-ESP3D_Logo_width)/2, (_screenheight-ESP3D_Logo_height)/2, ESP3D_Logo_width, ESP3D_Logo_height, ESP3D_Logo);
#endif //DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240
esp_display.drawXBitmap((_screenwidth-ESP3D_Logo_width)/2, (_screenheight-ESP3D_Logo_height)/2, ESP3D_Logo, ESP3D_Logo_width, ESP3D_Logo_height, TFT_WHITE);
#endif //TFT_SPI_ILI9341_240X320
log_esp3d("Splash");
drawXbm((_screenwidth-ESP3D_Logo_width)/2, (_screenheight-ESP3D_Logo_height)/2, ESP3D_Logo_width, ESP3D_Logo_height, SPLASH_FG, SPLASH_BG ,ESP3D_Logo);
log_esp3d("Display Splash");
_splash_displayed = true;
return true;
}
return false;
}
void Display::showStatus()
{
//Display Status
String status = _status;
setTextFont(FONTSTATUS);
uint16_t size = sizetoFitSpace(status.c_str(), STATUS_AREA_W);
//check the need for resize
if (size < status.length()){
static int status_shift = -1;
status+=" ";
log_esp3d("current %s", status.c_str());
if (status_shift > status.length()){
status_shift = -1;
}
log_esp3d("shift %d", status_shift);
if (status_shift > 0){
status.remove(0,status_shift);
}
log_esp3d("shifted %s", status.c_str());
size = sizetoFitSpace(status.c_str(), STATUS_AREA_W);
log_esp3d("size available %d existing %d",size, status.length());
if (size < status.length()){
//cut
status = status.substring(0,size);
status_shift++;
} else{
status_shift = -1;
}
log_esp3d("sized %s", status.c_str());
}
//clear area
fillRect(STATUS_AREA_X, STATUS_AREA_Y, STATUS_AREA_W, STATUS_AREA_H, SCREEN_BG);
drawString(status.c_str(), STATUS_AREA_X, STATUS_AREA_Y, STATUS_FG);
}
bool Display::main_screen()
{
log_esp3d("Mainscreen");
//Signal
int sig = -1;
#if defined (WIFI_FEATURE)
if (WiFiConfig::started()){
String ssid;
if (WiFi.getMode() == WIFI_AP) {
sig = 100;
ssid = WiFiConfig::AP_SSID();
} else {
if (WiFi.isConnected()) {
sig = WiFiConfig::getSignal (WiFi.RSSI ());
ssid = WiFi.SSID();
}
}
//Display SSID
setTextFont(FONTSSID);
uint16_t size = sizetoFitSpace(ssid.c_str(), SSID_AREA_W);
//check the need for resize
if (size < ssid.length()){
static int ssid_shift = -1;
ssid+=" ";
log_esp3d("current %s", ssid.c_str());
if (ssid_shift > ssid.length()){
ssid_shift = -1;
}
log_esp3d("shift %d", ssid_shift);
if (ssid_shift > 0){
ssid.remove(0,ssid_shift);
}
log_esp3d("shifted %s", ssid.c_str());
size = sizetoFitSpace(ssid.c_str(), SSID_AREA_W);
log_esp3d("size available %d existing %d",size, ssid.length());
if (size < ssid.length()){
//cut
ssid = ssid.substring(0,size);
ssid_shift++;
} else{
ssid_shift = -1;
}
log_esp3d("sized %s", ssid.c_str());
}
//clear area
fillRect(SSID_AREA_X, SSID_AREA_Y, SSID_AREA_W, SSID_AREA_H, SCREEN_BG);
drawString(ssid.c_str(), SSID_AREA_X, SSID_AREA_Y, SSID_FG);
}
#endif // WIFI_FEATURE
#if defined (ETH_FEATURE)
if (EthConfig::started()){
sig = -2;
setTextFont(FONTSSID);
//clear area
fillRect(SSID_AREA_X, SSID_AREA_Y, SSID_AREA_W, SSID_AREA_H, SCREEN_BG);
//display connection speed
if(ETH.linkUp()){
ssid = ETH.linkSpeed();
ssid+= "Mbps";
drawString(ssid.c_str(), SSID_AREA_X, SSID_AREA_Y, SSID_FG);
}
}
#endif //ETH_FEATURE
#if defined (BLUETOOTH_FEATURE)
if (bt_service.started()){
sig = -3;
//Display hostname
String hostname = bt_service.hostname();
setTextFont(FONTSSID);
uint16_t size = sizetoFitSpace(hostname.c_str(), SSID_AREA_W);
//check the need for resize
if (size < hostname.length()){
static int hostname_shift = -1;
hostname+=" ";
log_esp3d("current %s", hostname.c_str());
if (hostname_shift > hostname.length()){
hostname_shift = -1;
}
log_esp3d("shift %d", hostname_shift);
if (hostname_shift > 0){
hostname.remove(0,hostname_shift);
}
log_esp3d("shifted %s", hostname.c_str());
size = sizetoFitSpace(hostname.c_str(), SSID_AREA_W);
log_esp3d("size available %d existing %d",size, hostname.length());
if (size < hostname.length()){
//cut
hostname = hostname.substring(0,size);
hostname_shift++;
} else{
hostname_shift = -1;
}
log_esp3d("sized %s", hostname.c_str());
}
//clear area
fillRect(SSID_AREA_X, SSID_AREA_Y, SSID_AREA_W, SSID_AREA_H, SCREEN_BG);
if (hostname.length()>0){
drawString(hostname.c_str(), SSID_AREA_X, SSID_AREA_Y, SSID_FG);
}
}
#endif //BLUETOOTH_FEATURE
//set current font size
setTextFont(FONTSIGNAL);
fillRect(SIGNAL_X, SIGNAL_Y, SIGNAL_W, SIGNAL_H,SCREEN_BG);
fillRect(SIGNAL_ICON_X, SIGNAL_ICON_Y, SIGNAL_ICON_W, SIGNAL_ICON_H,SCREEN_BG);
String s;
if (sig > 0) {
//Signal %
s = String(sig);
s+="%";
//Signal Icon according %
if (sig > 0) {
fillRect(SIGNAL_ICON_X, SIGNAL_ICON_Y + (SIGNAL_ICON_H * 0.6), SIGNAL_ICON_W_BAR, SIGNAL_ICON_H * 0.4, SIGNAL_FG);
} else {
drawRect(SIGNAL_ICON_X, SIGNAL_ICON_Y + (SIGNAL_ICON_H * 0.6), SIGNAL_ICON_W_BAR, SIGNAL_ICON_H * 0.4, SIGNAL_FG);
}
if (sig >= 25) {
fillRect(SIGNAL_ICON_X + SIGNAL_ICON_SPACER_X +SIGNAL_ICON_W_BAR, SIGNAL_ICON_Y + (SIGNAL_ICON_H * 0.4), SIGNAL_ICON_W_BAR, (SIGNAL_ICON_H * 0.6), SIGNAL_FG);
} else {
drawRect(SIGNAL_ICON_X + SIGNAL_ICON_SPACER_X + SIGNAL_ICON_W_BAR, SIGNAL_ICON_Y + (SIGNAL_ICON_H * 0.4), SIGNAL_ICON_W_BAR, (SIGNAL_ICON_H * 0.6), SIGNAL_FG);
}
if (sig >= 50) {
fillRect(SIGNAL_ICON_X + (2*(SIGNAL_ICON_SPACER_X + SIGNAL_ICON_W_BAR)), SIGNAL_ICON_Y + (SIGNAL_ICON_H * 0.2), SIGNAL_ICON_W_BAR, (SIGNAL_ICON_H * 0.8), SIGNAL_FG);
} else {
drawRect(SIGNAL_ICON_X + (2*(SIGNAL_ICON_SPACER_X + SIGNAL_ICON_W_BAR)), SIGNAL_ICON_Y + (SIGNAL_ICON_H * 0.2), SIGNAL_ICON_W_BAR, (SIGNAL_ICON_H * 0.8), SIGNAL_FG);
}
if (sig >= 75) {
fillRect(SIGNAL_ICON_X + (3*(SIGNAL_ICON_SPACER_X + SIGNAL_ICON_W_BAR)), SIGNAL_ICON_Y, SIGNAL_ICON_W_BAR, (SIGNAL_ICON_H), SIGNAL_FG);
} else {
drawRect(SIGNAL_ICON_X + (3*(SIGNAL_ICON_SPACER_X + SIGNAL_ICON_W_BAR)), SIGNAL_ICON_Y, SIGNAL_ICON_W_BAR, (SIGNAL_ICON_H), SIGNAL_FG);
}
}
//No signal / no connection
if (sig == -1) {
s = " X";
}
//Ethernet is connected
if (sig == -2) {
s = "Eth";
}
//BT is active
if (sig == -3) {
s = "BT";
}
//Show Connection type
drawString(s.c_str(), SIGNAL_X, SIGNAL_Y, SIGNAL_FG);
//IP
setTextFont(FONTIP);
fillRect(IP_AREA_X, IP_AREA_Y, IP_AREA_W, IP_AREA_H, SCREEN_BG);
#if defined (WIFI_FEATURE) || defined (ETH_FEATURE) || defined (BLUETOOTH_FEATURE)
if (NetConfig::started()){
switch(NetConfig::getMode()){
#if defined (WIFI_FEATURE)
case ESP_WIFI_STA:
s = WiFi.localIP().toString();
break;
case ESP_WIFI_AP:
s = WiFi.softAPIP().toString();
break;
#endif //WIFI_FEATURE
#if defined (ETH_FEATURE)
case ESP_ETH_STA:
s = ETH.localIP().toString();
break;
#endif //ETH_FEATURE
#if defined (BLUETOOTH_FEATURE)
case ESP_BT:
s = bt_service.isConnected()?"Connected":"";
break;
#endif //BLUETOOTH_FEATURE
default:
s="";
break;
}
if (s.length()>0){
drawString(s.c_str(), IP_AREA_X, IP_AREA_Y, IP_FG);
}
}
#endif //WIFI_FEATURE || ETH_FEATURE || BLUETOOTH_FEATURE
//status
showStatus();
return true;
}
uint16_t Display::sizetoFitSpace(const char * string, uint16_t maxwidth)
{
String s = string;
while (getStringWidth(s.c_str()) > maxwidth) {
if (s.length() > 0) {
s.remove(s.length()-1);
} else {
return 0;
}
}
return s.length();
}
void Display::show_screenID(uint8_t screenID)
{
clear_screen();
_screenID = screenID;
}
@ -74,18 +326,8 @@ Display::Display()
_started = false;
_screenID = SPLASH_SCREEN;
_splash_displayed=false;
#if DISPLAY_DEVICE == OLED_I2C_SSD1306
_screenwidth = 128;
_screenheight = 64;
#endif //OLED_I2C_SSD1306
#if DISPLAY_DEVICE == OLED_I2C_SSDSH1106
_screenwidth = 132;
_screenheight = 64;
#endif //OLED_I2C_SSDSH1106
#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240
_screenwidth = 320;
_screenheight = 240;
#endif //TFT_SPI_ILI9341_240X320
_screenwidth = SCREEN_WIDTH;
_screenheight = SCREEN_HEIGHT;
}
Display::~Display()
{
@ -96,6 +338,7 @@ bool Display::begin()
{
bool res = true;
_started = false;
log_esp3d("Init Display");
#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#if defined(DISPLAY_I2C_PIN_RST)
pinMode(DISPLAY_I2C_PIN_RST,OUTPUT);
@ -103,17 +346,20 @@ bool Display::begin()
delay(10); // wait for a second
digitalWrite(DISPLAY_I2C_PIN_RST, HIGH); // turn the LED off by making the voltage LOW
#endif //DISPLAY_I2C_PIN_RST
log_esp3d("Init Display");
esp_display.init();
esp_display.clear();
esp3d_screen.init();
esp3d_screen.clear();
#if defined(DISPLAY_FLIP_VERTICALY)
esp_display.flipScreenVertically();
esp3d_screen.flipScreenVertically();
#endif
#endif //DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240
esp_display.begin(); // Initialise the display
esp_display.setRotation(3);
esp_display.fillScreen(TFT_BLACK); // Black screen fill
esp3d_screen.begin(); // Initialise the display
#if defined(DISPLAY_FLIP_VERTICALY)
esp3d_screen.setRotation(3);
#else
esp3d_screen.setRotation(1);
#endif
esp3d_screen.fillScreen(SCREEN_BG); // Black screen fill
#endif //TFT_SPI_ILI9341_320X240
show_screenID(SPLASH_SCREEN);
update_screen();
@ -129,48 +375,63 @@ void Display::end()
if(!_started) {
return;
}
_status ="";
_started = false;
_screenID = SPLASH_SCREEN;
_splash_displayed=false;
clear_screen();
}
void Display::SetStatus(const char * status)
{
_status= status;
}
void Display::clear_screen()
{
log_esp3d("clear screen");
#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
esp_display.clear();
esp3d_screen.clear();
#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240
esp_display.fillScreen(TFT_BLACK); // Black screen fill
log_esp3d("Fill black");
esp3d_screen.fillScreen(SCREEN_BG); // Black screen fill
#endif //TFT_SPI_ILI9341_240X320
}
void Display::update_screen()
void Display::update_screen(bool force)
{
bool need_update = false;
if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) {
return;
}
bool need_update = force;
switch(_screenID) {
case SPLASH_SCREEN:
need_update = splash();
if (!_splash_displayed) {
need_update = splash();
}
break;
case MAIN_SCREEN:
log_esp3d("Mainscreen");
clear_screen();
need_update = true;
need_update = main_screen();
break;
default:
break;
}
if (need_update) {
#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
esp_display.display();
esp3d_screen.display();
log_esp3d("Update display");
#endif //DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
Hal::wait(0);
}
}
void Display::handle()
{
static uint32_t last_update = millis();
if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) {
return;
}
if (_started) {
if ((millis()- last_update) > DISPLAY_REFRESH_TIME) {
last_update = millis();
@ -179,4 +440,144 @@ void Display::handle()
}
}
// Draw a line from position 0 to position 1
void Display::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t color)
{
if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) {
return;
}
#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
esp3d_screen.setColor((color == TFT_BLACK)?BLACK:WHITE);
esp3d_screen.drawLine(x0, y0, x1, y1);
#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240
esp3d_screen.drawLine(x0, y0, x1, y1, color);
#endif //TFT_SPI_ILI9341_240X320
}
// Draw the border of a rectangle at the given location
void Display::drawRect(int16_t x, int16_t y, int16_t width, int16_t height, int16_t color)
{
if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) {
return;
}
#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
esp3d_screen.setColor((color == TFT_BLACK)?BLACK:WHITE);
esp3d_screen.drawRect(x, y, width, height);
#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240
esp3d_screen.drawRect(x, y, width, height, color);
#endif //TFT_SPI_ILI9341_240X320
}
// Fill the rectangle
void Display::fillRect(int16_t x, int16_t y, int16_t width, int16_t height, int16_t color)
{
if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) {
return;
}
#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
esp3d_screen.setColor((color == TFT_BLACK)?BLACK:WHITE);
esp3d_screen.fillRect(x, y, width, height);
#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240
esp3d_screen.fillRect(x, y, width, height, color);
#endif //TFT_SPI_ILI9341_240X320
}
void Display::setTextFont(uint8_t font)
{
#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
switch(font) {
case 3:
esp3d_screen.setFont(ArialMT_Plain_16);
break;
case 2:
default:
esp3d_screen.setFont(ArialMT_Plain_10);
}
#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240
esp3d_screen.setTextFont(font);
#endif //TFT_SPI_ILI9341_240X320
}
void Display::drawString(const char *string, int32_t poX, int32_t poY, int16_t color)
{
if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) {
return;
}
#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
esp3d_screen.setColor((color == TFT_BLACK)?BLACK:WHITE);
esp3d_screen.drawString(poX, poY, string);
#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240
esp3d_screen.setTextColor(color);
esp3d_screen.drawString(string, poX, poY);
#endif //TFT_SPI_ILI9341_240X320
}
// Draw a XBM
void Display::drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, int16_t color, const unsigned char *xbm)
{
if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) {
return;
}
#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
(void)color;
esp3d_screen.drawXbm(x, y, width, height, (const char *)xbm);
#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240
esp3d_screen.drawXBitmap(x, y, xbm, width, height,color);
#endif //TFT_SPI_ILI9341_240X320
}
void Display::drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, uint16_t fgcolor, uint16_t bgcolor, const unsigned char *xbm)
{
if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) {
return;
}
#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
(void)fgcolor;
(void)bgcolor;
esp3d_screen.drawXbm(x, y, width, height, (const char *)xbm);
#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240
esp3d_screen.drawXBitmap(x, y, xbm, width, height, fgcolor, bgcolor);
#endif //TFT_SPI_ILI9341_240X320
}
uint16_t Display::getStringWidth(const char* text)
{
#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
return esp3d_screen.getStringWidth(text, strlen(text));
#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106
#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240
return esp3d_screen.textWidth(text);
#endif //TFT_SPI_ILI9341_240X320
}
void Display::progress(uint8_t v)
{
if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) {
return;
}
static uint8_t previous = 0;
if (previous > v) {
//clear
fillRect(10, _screenheight-2, _screenwidth-20, 2, SCREEN_BG);
}
log_esp3d("%d", v);
previous = v;
//display bar
drawRect(10, _screenheight-2, ((_screenwidth-20) * v)/100, 2, PROGRESS_FG);
//update screen
update_screen(true);
}
void display_progress(uint8_t v)
{
esp3d_display.progress(v);
}
#endif //DISPLAY_DEVICE

View File

@ -34,18 +34,33 @@ public:
void end();
void handle();
void show_screenID(uint8_t screenID);
void update_screen();
void update_screen(bool force=false);
void clear_screen();
void progress(uint8_t v);
void SetStatus(const char * status);
private:
bool main_screen();
bool splash();
void showStatus();
bool _started;
uint8_t _screenID;
bool _splash_displayed;
uint _screenwidth;
uint _screenheight;
uint16_t sizetoFitSpace(const char * string, uint16_t maxwidth);
void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t color);
void drawRect(int16_t x, int16_t y, int16_t width, int16_t height, int16_t color);
void fillRect(int16_t x, int16_t y, int16_t width, int16_t height, int16_t color);
void setTextFont(uint8_t font);
void drawString(const char *string, int32_t poX, int32_t poY, int16_t color);
void drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, int16_t color, const unsigned char *xbm);
void drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, uint16_t fgcolor, uint16_t bgcolor, const unsigned char *xbm);
uint16_t getStringWidth(const char* text);
String _status;
};
extern Display esp3d_display;
extern void display_progress(uint8_t v);
#endif //_DISPLAY_H

View File

@ -24,319 +24,319 @@
#define ESP3D_Logo_width 200
#define ESP3D_Logo_height 150
const unsigned char ESP3D_Logo[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xA4, 0x69, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xC0, 0xFD, 0xFF, 0x7F, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF5, 0xFF, 0xFF, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x03, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x0F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x80, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
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, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x59, 0x99, 0x96, 0x99,
0x96, 0x66, 0x59, 0x55, 0x66, 0x59, 0x55, 0x66, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98,
0xA4, 0x4A, 0xAA, 0xA4, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xA4, 0x4A,
0x94, 0xAA, 0xAA, 0xAA, 0x59, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x01, 0x00, 0x00, 0x00, 0x00,
0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0x00, 0x00, 0x00,
0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x5F, 0xA5, 0x56, 0x6A, 0xAA, 0xFE, 0x7F, 0x00, 0x00,
0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x00,
0x00, 0x00, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,
0x01, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF0, 0x07, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC0, 0x07, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x80, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x80, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x07, 0xC0,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03,
0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x07, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1C, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xF8, 0x7F, 0x00, 0x00, 0xF0,
0xFF, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xFE, 0x1F, 0x00, 0x00,
0xF0, 0x1F, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0xF0, 0xFF, 0x01, 0x00, 0xE0,
0xFF, 0x01, 0x00, 0x6E, 0x6B, 0x00, 0x00, 0x00, 0x38, 0xFC, 0x3F, 0x00,
0x00, 0xF0, 0x0F, 0x00, 0xC0, 0x7F, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00,
0xFC, 0xFF, 0x03, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFE, 0x1F,
0x00, 0x00, 0xF8, 0x07, 0x00, 0x80, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0x03,
0x00, 0xFF, 0xFF, 0x0F, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF8, 0xFC,
0x1F, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x80, 0xFF, 0x00, 0x00, 0x80, 0xFF,
0x03, 0x00, 0xFF, 0xFF, 0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xF0,
0xFE, 0x1F, 0x00, 0x10, 0xF8, 0x03, 0xF8, 0x81, 0x7F, 0x00, 0x00, 0x00,
0xFF, 0x01, 0x80, 0xFF, 0xFF, 0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00,
0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0x01, 0xFC, 0x8F, 0xFF, 0x80, 0x3F,
0x00, 0xFE, 0x01, 0x80, 0xFF, 0xFF, 0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0x03,
0x00, 0xF0, 0xFF, 0x3F, 0xE0, 0xFF, 0xFF, 0x03, 0xFE, 0xFF, 0x7F, 0x80,
0xFF, 0x00, 0xFE, 0x01, 0x80, 0x1F, 0xF8, 0x3F, 0x80, 0x7F, 0xE1, 0xFF,
0x07, 0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF,
0x80, 0xFF, 0x01, 0xFE, 0x01, 0x80, 0x07, 0xE0, 0x3F, 0x80, 0x7F, 0x00,
0xFE, 0x0F, 0x00, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0x01, 0xFE, 0xFF,
0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x01, 0x00, 0x01, 0xE0, 0x3F, 0x80, 0x7F,
0x00, 0xFC, 0x1F, 0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0x01, 0xFF,
0xFF, 0xFF, 0x80, 0xFF, 0x01, 0xFC, 0x01, 0x00, 0x00, 0xC0, 0x3F, 0x80,
0x7F, 0x00, 0xF0, 0x1F, 0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0x01,
0xFC, 0xFF, 0xFF, 0x80, 0xFF, 0x03, 0xFE, 0x01, 0x00, 0x00, 0xC0, 0x3F,
0x80, 0x7F, 0x00, 0xE0, 0x1F, 0x00, 0xE0, 0xFF, 0x3F, 0xE0, 0xFF, 0xFF,
0x01, 0xF8, 0xFF, 0x7F, 0x80, 0xFF, 0x03, 0xFE, 0x01, 0x00, 0x00, 0xE0,
0x3F, 0x80, 0x7F, 0x00, 0xE0, 0x3F, 0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0xFF,
0xFF, 0x01, 0xF8, 0xFF, 0xFF, 0x80, 0xFF, 0x01, 0xFE, 0x01, 0x00, 0x00,
0xE0, 0x3F, 0x80, 0x7F, 0x00, 0xE0, 0x3F, 0x00, 0xF0, 0xFF, 0x3F, 0xE0,
0xFF, 0xFF, 0x03, 0xE0, 0xFF, 0xFF, 0x80, 0xFF, 0x01, 0xFE, 0x01, 0x00,
0x00, 0xE0, 0x1F, 0x80, 0x7F, 0x00, 0xC0, 0x7F, 0x00, 0xE0, 0xFF, 0x1F,
0x40, 0x95, 0xFE, 0x07, 0x00, 0xFF, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x01,
0x00, 0x00, 0xF0, 0x1F, 0x80, 0x7F, 0x00, 0xC0, 0x3F, 0x00, 0xF0, 0xFF,
0x1F, 0x00, 0x00, 0xFE, 0x07, 0x00, 0xFC, 0xFF, 0x80, 0xFF, 0x00, 0xFE,
0x01, 0x00, 0x00, 0xF9, 0x0F, 0x80, 0x7F, 0x00, 0x80, 0x7F, 0x00, 0xF0,
0xFF, 0x1F, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0xF0, 0xFF, 0x80, 0x7F, 0x00,
0xFF, 0x01, 0x00, 0x78, 0xFF, 0x07, 0x80, 0x7F, 0x00, 0x80, 0x3F, 0x00,
0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0xE0, 0x7F, 0x00, 0x1B,
0x00, 0xFF, 0x01, 0x00, 0xFC, 0xFF, 0x03, 0x80, 0x3F, 0x00, 0x80, 0x7F,
0x00, 0xF0, 0xFF, 0x3F, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0xC0, 0xFF, 0x00,
0x00, 0x80, 0xFF, 0x01, 0x00, 0xFC, 0xFF, 0x00, 0x80, 0x7F, 0x00, 0x80,
0x7F, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x80, 0xFF,
0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0xFC, 0xFF, 0x03, 0x80, 0x7F, 0x00,
0x80, 0x7F, 0x00, 0xE0, 0xFF, 0x1F, 0xE0, 0xFB, 0xFF, 0xFF, 0x03, 0x00,
0x7F, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x00, 0xFC, 0xFF, 0x0F, 0x80, 0x7F,
0x00, 0x80, 0x7F, 0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F,
0x00, 0xFF, 0x00, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0xFC, 0xFF, 0x3F, 0x80,
0x7F, 0x00, 0x80, 0x7F, 0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0xFF,
0x7F, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0x00, 0x00, 0xFA, 0x3F,
0x80, 0x7F, 0x00, 0x80, 0x3F, 0x00, 0xF0, 0xFF, 0x3F, 0xE0, 0xFF, 0xFF,
0xFF, 0xFF, 0x00, 0xFE, 0x00, 0xE0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xF0,
0x7F, 0x80, 0x7F, 0x00, 0xC0, 0x7F, 0x00, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF,
0xFF, 0xFF, 0xFF, 0x01, 0xFE, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00,
0xC0, 0x7F, 0x80, 0x7F, 0x00, 0xC0, 0x3F, 0x00, 0xF0, 0xFF, 0x1F, 0xE0,
0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x7E, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00,
0x00, 0xC0, 0xFF, 0x80, 0x7F, 0x00, 0xC0, 0x3F, 0x00, 0xE0, 0xFF, 0x1F,
0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFE, 0x80, 0xFF, 0xFF, 0xFF, 0x01,
0x00, 0x00, 0x80, 0xFF, 0x80, 0x7F, 0x00, 0xC0, 0x3F, 0x00, 0xF0, 0xFF,
0x3F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x7E, 0x80, 0xFF, 0xFF, 0xFF,
0x01, 0x00, 0x00, 0x80, 0xFF, 0x80, 0x7F, 0x00, 0xE0, 0x3F, 0x00, 0xF0,
0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFE, 0x80, 0xFF, 0xFF,
0xFF, 0x01, 0x00, 0x00, 0x80, 0xFF, 0x80, 0x7F, 0x00, 0xF0, 0x1F, 0x00,
0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0xF9, 0xFF, 0x00, 0x7E, 0x80, 0xFF,
0xFF, 0xFF, 0x01, 0x00, 0x00, 0x80, 0xFF, 0x80, 0x7F, 0x00, 0xF0, 0x1F,
0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0xE1, 0xFF, 0x00, 0xFF, 0x80,
0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xC0, 0xFF, 0x80, 0x7F, 0x00, 0xF8,
0x1F, 0x00, 0xE0, 0xFF, 0x3F, 0x00, 0xA8, 0xFA, 0x00, 0x0C, 0x80, 0x7F,
0x80, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0x01, 0xE0, 0x7F, 0x80, 0x7F, 0x00,
0xFE, 0x0F, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x80,
0x7F, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0x07, 0xF0, 0x7F, 0x80, 0x7F,
0xD4, 0xFF, 0x07, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0x01, 0x00,
0xC0, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0xFF, 0xFF, 0x3F, 0x80,
0xFF, 0xFF, 0xFF, 0x03, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0x01,
0x00, 0xE0, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0xFF, 0xFF, 0x3F,
0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0xF0, 0xFC, 0x3F, 0x00, 0x00, 0xF0,
0x03, 0x00, 0xF0, 0x7F, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0xFF, 0xFF,
0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xF0, 0xFE, 0x7F, 0x00, 0x00,
0xF8, 0x1F, 0x00, 0xFE, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0x80, 0xFF,
0xFF, 0x07, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0xFC, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xD9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0x03, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFE, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0xFC, 0xFF, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x78, 0xFC,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F,
0x00, 0x00, 0x80, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78,
0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x38, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1C, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1C, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x3E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x80, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0xC0, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00,
0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01,
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C,
0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7C, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC0, 0x0F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xE8, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x40,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0x52, 0xAA, 0xA4, 0x24, 0xAA, 0x49, 0x49, 0x8A, 0xA2,
0x22, 0x8A, 0x28, 0x49, 0x8A, 0xA2, 0x22, 0x8A, 0x0D, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x6A,
0xAA, 0xA6, 0x6A, 0xAA, 0xA6, 0x6A, 0xAA, 0xA6, 0x6A, 0xAA, 0xA6, 0x6A,
0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF,
0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF,
0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE,
0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03,
0xFC, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x0F, 0xF8, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x3F, 0xE0, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x7F, 0xC0, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0x7F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x7F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0x3F, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xF8, 0x1F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF8,
0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F,
0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xE1, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0xC0, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0xF0,
0xFF, 0x07, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0xFE,
0xFF, 0x01, 0x00, 0xF0, 0xFF, 0xFF, 0x83, 0x83, 0xFF, 0xFF, 0xFF, 0x00,
0xFC, 0xFF, 0x1F, 0x80, 0xFF, 0xFF, 0x1F, 0x00, 0xFC, 0x7F, 0x00, 0x00,
0xFC, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x87, 0x81, 0xFF, 0xFF, 0xFF,
0x00, 0xFE, 0xFF, 0x3F, 0x80, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0x3F, 0x00,
0x00, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x87, 0x81, 0xFF, 0xFF,
0xFF, 0x00, 0xFF, 0xFF, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0xFC, 0x1F,
0x00, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x0F, 0x81, 0xFF,
0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0xFC,
0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x0F, 0x81,
0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, 0x03,
0xFE, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x0F,
0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0x81, 0x3F, 0x80, 0xFF, 0xFF, 0xFF,
0x07, 0xFE, 0x1F, 0xF0, 0x03, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0x80, 0xFF,
0x0F, 0x80, 0xFF, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0x3C, 0x80, 0xFF, 0x80,
0xFF, 0x07, 0xFE, 0x1F, 0xFE, 0x07, 0xC0, 0xFF, 0x00, 0xFE, 0x03, 0x80,
0xFF, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x30, 0x80, 0xFF,
0x00, 0xFE, 0x07, 0xFE, 0x9F, 0xFF, 0x0F, 0xC0, 0xFF, 0x00, 0xFE, 0x0F,
0x00, 0xFF, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x80,
0xFF, 0x00, 0xFC, 0x0F, 0xFE, 0xFF, 0xFF, 0x1F, 0xC0, 0xFF, 0x00, 0xFE,
0x3F, 0x00, 0xFE, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00,
0x80, 0xFF, 0x00, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF, 0x1F, 0xC0, 0xFF, 0x00,
0xFE, 0x7F, 0x00, 0xFE, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xE0, 0x3F, 0x00,
0x00, 0x80, 0xFF, 0x00, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF, 0x1F, 0xC0, 0xFF,
0x00, 0xFE, 0xFF, 0x00, 0xFC, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xE0, 0x7F,
0x00, 0x00, 0x80, 0xFF, 0x00, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF, 0x1F, 0xC0,
0xFF, 0x00, 0xFE, 0xFF, 0x00, 0xFC, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xE0,
0x7F, 0x00, 0x00, 0x80, 0xFF, 0x00, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF, 0x1F,
0xC0, 0xFF, 0x00, 0xFE, 0xFF, 0x01, 0xFC, 0x0F, 0x80, 0xFF, 0x00, 0x00,
0xE0, 0xFF, 0x01, 0x00, 0x80, 0xFF, 0x00, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF,
0x0F, 0xE0, 0xFF, 0x00, 0xFE, 0xFF, 0x01, 0xFC, 0x0F, 0x80, 0xFF, 0x00,
0x00, 0xC0, 0xFF, 0x03, 0x00, 0x80, 0xFF, 0x00, 0xF8, 0x0F, 0xFE, 0xFF,
0xFF, 0x0F, 0xE0, 0xFF, 0x00, 0xFE, 0xFF, 0x01, 0xF8, 0x0F, 0x80, 0xFF,
0xFF, 0x3F, 0xC0, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0x00, 0xFC, 0x0F, 0xFE,
0xFF, 0xFF, 0x07, 0xF0, 0xFF, 0x00, 0xFE, 0xFF, 0x03, 0xF8, 0x0F, 0x80,
0xFF, 0xFF, 0x3F, 0x80, 0xFF, 0x7F, 0x00, 0x80, 0xFF, 0x00, 0xFC, 0x07,
0xFE, 0xFF, 0xFF, 0x01, 0xF8, 0xFF, 0x00, 0xFE, 0xFF, 0x03, 0xF8, 0x0F,
0x80, 0xFF, 0xFF, 0x3F, 0x80, 0xFF, 0xFF, 0x01, 0x80, 0xFF, 0x00, 0xFE,
0x07, 0xFE, 0xFF, 0x00, 0x00, 0xFC, 0xFF, 0x00, 0xFE, 0xFF, 0x03, 0xF8,
0x0F, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0x07, 0x80, 0xFF, 0x80,
0xFF, 0x07, 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0xFE, 0xFF, 0x03,
0xF8, 0x0F, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x0F, 0x80, 0xFF,
0xFF, 0xFF, 0x03, 0xFE, 0xFF, 0x00, 0x80, 0xFF, 0xFF, 0x00, 0xFE, 0xFF,
0x03, 0xF8, 0x0F, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0xF8, 0xFF, 0x1F, 0x80,
0xFF, 0xFF, 0xFF, 0x01, 0xFE, 0xFF, 0x00, 0x00, 0xFC, 0xFF, 0x00, 0xFE,
0xFF, 0x03, 0xF8, 0x0F, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0xF0, 0xFF, 0x3F,
0x80, 0xFF, 0xFF, 0xFF, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0xF0, 0xFF, 0x00,
0xFE, 0xFF, 0x03, 0xF8, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xC0, 0xFF,
0x3F, 0x80, 0xFF, 0xFF, 0x7F, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0xE0, 0xFF,
0x00, 0xFE, 0xFF, 0x03, 0xF8, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0x00,
0xFE, 0x7F, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0xC0,
0xFF, 0x00, 0xFE, 0xFF, 0x03, 0xF8, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0x00,
0x00, 0xF8, 0x7F, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0xFE, 0xFF, 0xFF, 0x0F,
0x80, 0xFF, 0x00, 0xFE, 0xFF, 0x03, 0xF8, 0x0F, 0x80, 0xFF, 0x00, 0x00,
0x00, 0x00, 0xF0, 0xFF, 0x80, 0xFF, 0xFF, 0x01, 0x00, 0xFE, 0xFF, 0xFF,
0x1F, 0x80, 0xFF, 0x00, 0xFE, 0xFF, 0x01, 0xFC, 0x0F, 0x80, 0xFF, 0x00,
0x00, 0x00, 0x00, 0xC0, 0xFF, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0xFF,
0xFF, 0x1F, 0x00, 0xFF, 0x00, 0xFE, 0xFF, 0x01, 0xFC, 0x0F, 0x80, 0xFF,
0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFE,
0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0x00, 0xFE, 0xFF, 0x01, 0xFC, 0x0F, 0x80,
0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x80, 0xFF, 0x00, 0x00, 0x00,
0xFE, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0x00, 0xFE, 0xFF, 0x00, 0xFC, 0x0F,
0x80, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x80, 0xFF, 0x00, 0x00,
0x00, 0xFE, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0x00, 0xFE, 0xFF, 0x00, 0xFE,
0x0F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x80, 0xFF, 0x00,
0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0x00, 0xFE, 0x7F, 0x00,
0xFE, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x80, 0xFF,
0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0x00, 0xFE, 0x3F,
0x00, 0xFE, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0x70, 0x00, 0xC0, 0x7F, 0x80,
0xFF, 0x00, 0x00, 0x00, 0xFE, 0xCF, 0xFF, 0x1F, 0x00, 0xFF, 0x00, 0xFE,
0x0F, 0x00, 0xFF, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xF0, 0x01, 0xE0, 0x7F,
0x80, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0xFF, 0x0F, 0x80, 0xFF, 0x00,
0xFE, 0x03, 0x80, 0xFF, 0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0xF0, 0x0F, 0xF8,
0x7F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0xF8, 0x03, 0x80, 0xFF,
0x00, 0x00, 0x00, 0x80, 0xFF, 0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF,
0xFF, 0x3F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0xC0,
0xFF, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x0F, 0x81, 0xFF, 0xFF, 0xFF, 0xF0,
0xFF, 0xFF, 0x1F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00,
0xC0, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x0F, 0x81, 0xFF, 0xFF, 0xFF,
0xF0, 0xFF, 0xFF, 0x1F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00,
0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x0F, 0x81, 0xFF, 0xFF,
0xFF, 0xF0, 0xFF, 0xFF, 0x07, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x1F,
0x00, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x0F, 0x81, 0xFF,
0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0x03, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFF,
0x3F, 0x00, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x07, 0x01,
0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x80,
0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0xF8, 0xFF, 0xFF, 0x87,
0x03, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x80, 0xFF, 0xFF, 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x87, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xC3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xC3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xC1, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFE, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF0, 0x3F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xF8, 0x3F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0x7F, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFE,
0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03,
0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x81, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x80, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x3F, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x1F, 0xF8, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x03, 0xFC, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF9, 0xFF, 0xFF, 0xFF, 0xBF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xA0, 0xFF, 0xFF, 0xFF, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 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, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F,
0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
#endif //_esp3d_logo_h

View File

@ -19,7 +19,7 @@
*/
#include "../../include/esp3d_config.h"
#if defined (WIFI_FEATURE) || defined (ETH_FEATURE)
#if defined (WIFI_FEATURE) || defined (ETH_FEATURE) || defined (BLUETOOTH_FEATURE)
#ifdef ARDUINO_ARCH_ESP32
#define WIFI_EVENT_STAMODE_CONNECTED SYSTEM_EVENT_STA_CONNECTED
#define WIFI_EVENT_STAMODE_DISCONNECTED SYSTEM_EVENT_STA_DISCONNECTED
@ -46,7 +46,7 @@ String NetConfig::_hostname = "";
bool NetConfig::_needReconnect2AP = false;
bool NetConfig::_events_registered = false;
bool NetConfig::_started = false;
uint8_t NetConfig::_mode = ESP_RADIO_OFF;
NetConfig::NetConfig()
{
}
@ -127,40 +127,42 @@ bool NetConfig::isValidIP(const char * string)
//wifi event
void NetConfig::onWiFiEvent(WiFiEvent_t event)
{
ESP3DOutput output(ESP_PRINTER_LCD_CLIENT);
ESP3DOutput output(ESP_ALL_CLIENTS);
switch (event) {
case WIFI_EVENT_STAMODE_CONNECTED:
_needReconnect2AP = false;
#ifdef ESP_OLED_FEATURE
OLED_DISPLAY::display_signal(wifi_config.getSignal (WiFi.RSSI ()));
OLED_DISPLAY::setCursor(0, 0);
ESPCOM::print("", OLED_PIPE);
#endif //ESP_OLED_FEATURE
break;
case WIFI_EVENT_STAMODE_DISCONNECTED:
#ifdef ESP_OLED_FEATURE
OLED_DISPLAY::display_signal(-1);
OLED_DISPLAY::setCursor(0, 16);
ESPCOM::print("", OLED_PIPE);
OLED_DISPLAY::setCursor(0, 48);
#endif //ESP_OLED_FEATURE
{
if(_started) {
output.printMSG ("Disconnected");
#if defined (DISPLAY_DEVICE)
ESP3DOutput outputscr(ESP_SCREEN_CLIENT);
#endif //DISPLAY_DEVICE
_needReconnect2AP = true;
}
}
break;
case WIFI_EVENT_STAMODE_GOT_IP:
{
output.printMSG ("Connected");
#if defined (DISPLAY_DEVICE)
{
ESP3DOutput outputscr(ESP_SCREEN_CLIENT);
outputscr.printMSG("Connected");
}
#endif //DISPLAY_DEVICE
output.printMSG (WiFi.localIP().toString().c_str());
#ifdef ESP_OLED_FEATURE
OLED_DISPLAY::setCursor(0, 16);
ESPCOM::print(WiFi.localIP().toString().c_str(), OLED_PIPE);
OLED_DISPLAY::setCursor(0, 48);
ESPCOM::print("", OLED_PIPE);
#endif //ESP_OLED_FEATURE
}
break;
case WIFI_EVENT_SOFTAPMODE_STACONNECTED:
{
output.printMSG ("New client");
#if defined (DISPLAY_DEVICE)
ESP3DOutput outputscr(ESP_SCREEN_CLIENT);
outputscr.printMSG("New client");
#endif //DISPLAY_DEVICE
}
break;
#ifdef ARDUINO_ARCH_ESP32
case SYSTEM_EVENT_STA_LOST_IP:
@ -170,10 +172,22 @@ void NetConfig::onWiFiEvent(WiFiEvent_t event)
break;
#ifdef ETH_FEATURE
case SYSTEM_EVENT_ETH_CONNECTED:
{
output.printMSG ("Cable connected");
#if defined (DISPLAY_DEVICE)
ESP3DOutput outputscr(ESP_SCREEN_CLIENT);
outputscr.printMSG("Cable connected");
#endif //DISPLAY_DEVICE
}
break;
case SYSTEM_EVENT_ETH_DISCONNECTED:
{
output.printMSG ("Cable disconnected");
#if defined (DISPLAY_DEVICE)
ESP3DOutput outputscr(ESP_SCREEN_CLIENT);
outputscr.printMSG("Cable disconnected");
#endif //DISPLAY_DEVICE
}
break;
case SYSTEM_EVENT_ETH_GOT_IP:
output.printMSG (ETH.localIP().toString().c_str());
@ -183,7 +197,11 @@ void NetConfig::onWiFiEvent(WiFiEvent_t event)
default:
break;
}
}
uint8_t NetConfig::getMode()
{
return _mode;
}
/**
@ -211,6 +229,7 @@ bool NetConfig::begin()
//Get hostname
_hostname = Settings_ESP3D::read_string(ESP_HOSTNAME);
int8_t espMode =Settings_ESP3D::read_byte(ESP_RADIO_MODE);
_mode = espMode;
if (espMode == NO_NETWORK) {
return true;
}
@ -270,7 +289,7 @@ bool NetConfig::begin()
void NetConfig::end()
{
NetServices::end();
_mode = ESP_RADIO_OFF;
#if defined (WIFI_FEATURE)
WiFiConfig::end();
_needReconnect2AP=false;

View File

@ -66,6 +66,7 @@ public:
static bool begin();
static void end();
static void handle();
static uint8_t getMode();
static bool started()
{
return _started;
@ -76,6 +77,7 @@ private :
static bool _needReconnect2AP;
static bool _events_registered;
static bool _started;
static uint8_t _mode;
};
#endif //_NET_CONFIG_H