From 4c8449a1752eb04abd96ac03a7af4e1f31d83aac Mon Sep 17 00:00:00 2001 From: maxxir_w Date: Fri, 18 Jan 2019 14:28:29 +0400 Subject: [PATCH] Add [11_m644p_WIZNET_HTTPServer_FLASH_pages] prj --- 11_m644p_WIZNET_HTTPServer_FLASH_pages/.cproject | 79 + 11_m644p_WIZNET_HTTPServer_FLASH_pages/.project | 28 + .../Application/loopback/loopback.c | 225 ++ .../Application/loopback/loopback.h | 38 + .../Application/webserver_simple/webpages.h | 29 + .../webserver_simple/webserver_simple.c | 257 +++ .../webserver_simple/webserver_simple.h | 33 + .../Ethernet/W5500/w5500.c | 267 +++ .../Ethernet/W5500/w5500.h | 2163 ++++++++++++++++++ .../Ethernet/socket.c | 930 ++++++++ .../Ethernet/socket.h | 489 ++++ .../Ethernet/wizchip_conf.c | 903 ++++++++ .../Ethernet/wizchip_conf.h | 660 ++++++ .../Internet/httpServer_avr/httpParser.c | 402 ++++ .../Internet/httpServer_avr/httpParser.h | 159 ++ .../Internet/httpServer_avr/httpServer.c | 1399 ++++++++++++ .../Internet/httpServer_avr/httpServer.h | 123 + .../Internet/httpServer_avr/httpUtil.c | 65 + .../Internet/httpServer_avr/httpUtil.h | 32 + .../WWW/bin2hex_v2.py | 52 + .../WWW/brd_wiznet.png | Bin 0 -> 13702 bytes .../WWW/brd_wiznet_png.h | 860 +++++++ .../WWW/favicon.ico | Bin 0 -> 1662 bytes .../WWW/favicon_ico.h | 107 + .../WWW/m1284p.png | Bin 0 -> 12987 bytes .../WWW/m1284p_png.h | 815 +++++++ 11_m644p_WIZNET_HTTPServer_FLASH_pages/clean.bat | 3 + 11_m644p_WIZNET_HTTPServer_FLASH_pages/globals.h | 45 + 11_m644p_WIZNET_HTTPServer_FLASH_pages/main.c | 618 +++++ 11_m644p_WIZNET_HTTPServer_FLASH_pages/spi.c | 83 + 11_m644p_WIZNET_HTTPServer_FLASH_pages/spi.h | 132 ++ 11_m644p_WIZNET_HTTPServer_FLASH_pages/uart_extd.c | 706 ++++++ 11_m644p_WIZNET_HTTPServer_FLASH_pages/uart_extd.h | 209 ++ .../userHandler.c | 327 +++ .../userHandler.h | 42 + 11_m644p_WIZNET_HTTPServer_FLASH_pages/webpage.h | 2408 ++++++++++++++++++++ 36 files changed, 14688 insertions(+) create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/.cproject create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/.project create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/loopback/loopback.c create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/loopback/loopback.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/webserver_simple/webpages.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/webserver_simple/webserver_simple.c create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/webserver_simple/webserver_simple.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/W5500/w5500.c create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/W5500/w5500.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/socket.c create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/socket.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/wizchip_conf.c create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/wizchip_conf.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpParser.c create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpParser.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpServer.c create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpServer.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpUtil.c create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpUtil.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/bin2hex_v2.py create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/brd_wiznet.png create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/brd_wiznet_png.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/favicon.ico create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/favicon_ico.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/m1284p.png create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/m1284p_png.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/clean.bat create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/globals.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/main.c create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/spi.c create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/spi.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/uart_extd.c create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/uart_extd.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/userHandler.c create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/userHandler.h create mode 100644 11_m644p_WIZNET_HTTPServer_FLASH_pages/webpage.h diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/.cproject b/11_m644p_WIZNET_HTTPServer_FLASH_pages/.cproject new file mode 100644 index 0000000..a9150f2 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/.cproject @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/.project b/11_m644p_WIZNET_HTTPServer_FLASH_pages/.project new file mode 100644 index 0000000..f3ab3f4 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/.project @@ -0,0 +1,28 @@ + + + 11_m644p_WIZNET_HTTPServer_FLASH_pages + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + de.innot.avreclipse.core.avrnature + + diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/loopback/loopback.c b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/loopback/loopback.c new file mode 100644 index 0000000..a921092 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/loopback/loopback.c @@ -0,0 +1,225 @@ +#include +#include "loopback.h" +#include "socket.h" +#include "wizchip_conf.h" + +#if LOOPBACK_MODE == LOOPBACK_MAIN_NOBLCOK + +int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port) +{ + int32_t ret; + uint16_t size = 0, sentsize=0; + +#ifdef _LOOPBACK_DEBUG_ + uint8_t destip[4]; + uint16_t destport; +#endif + + switch(getSn_SR(sn)) + { + case SOCK_ESTABLISHED : + if(getSn_IR(sn) & Sn_IR_CON) + { +#ifdef _LOOPBACK_DEBUG_ + getSn_DIPR(sn, destip); + destport = getSn_DPORT(sn); + + printf("%d:Connected - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport); +#endif + setSn_IR(sn,Sn_IR_CON); + } + if((size = getSn_RX_RSR(sn)) > 0) // Don't need to check SOCKERR_BUSY because it doesn't not occur. + { + if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; + ret = recv(sn, buf, size); + + if(ret <= 0) return ret; // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY. + size = (uint16_t) ret; + sentsize = 0; + + while(size != sentsize) + { + ret = send(sn, buf+sentsize, size-sentsize); + if(ret < 0) + { + close(sn); + return ret; + } + sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero. + } + } + break; + case SOCK_CLOSE_WAIT : +#ifdef _LOOPBACK_DEBUG_ + //printf("%d:CloseWait\r\n",sn); +#endif + if((ret = disconnect(sn)) != SOCK_OK) return ret; +#ifdef _LOOPBACK_DEBUG_ + printf("%d:Socket Closed\r\n", sn); +#endif + break; + case SOCK_INIT : +#ifdef _LOOPBACK_DEBUG_ + printf("%d:Listen, TCP server loopback, port [%d]\r\n", sn, port); +#endif + if( (ret = listen(sn)) != SOCK_OK) return ret; + break; + case SOCK_CLOSED: +#ifdef _LOOPBACK_DEBUG_ + //printf("%d:TCP server loopback start\r\n",sn); +#endif + if((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn) return ret; +#ifdef _LOOPBACK_DEBUG_ + //printf("%d:Socket opened\r\n",sn); +#endif + break; + default: + break; + } + return 1; +} + + +int32_t loopback_tcpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport) +{ + int32_t ret; // return value for SOCK_ERRORs + uint16_t size = 0, sentsize=0; + + // Destination (TCP Server) IP info (will be connected) + // >> loopback_tcpc() function parameter + // >> Ex) + // uint8_t destip[4] = {192, 168, 0, 214}; + // uint16_t destport = 5000; + + // Port number for TCP client (will be increased) + static uint16_t any_port = 50000; + + // Socket Status Transitions + // Check the W5500 Socket n status register (Sn_SR, The 'Sn_SR' controlled by Sn_CR command or Packet send/recv status) + switch(getSn_SR(sn)) + { + case SOCK_ESTABLISHED : + if(getSn_IR(sn) & Sn_IR_CON) // Socket n interrupt register mask; TCP CON interrupt = connection with peer is successful + { +#ifdef _LOOPBACK_DEBUG_ + printf("%d:Connected to - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport); +#endif + setSn_IR(sn, Sn_IR_CON); // this interrupt should be write the bit cleared to '1' + } + + ////////////////////////////////////////////////////////////////////////////////////////////// + // Data Transaction Parts; Handle the [data receive and send] process + ////////////////////////////////////////////////////////////////////////////////////////////// + if((size = getSn_RX_RSR(sn)) > 0) // Sn_RX_RSR: Socket n Received Size Register, Receiving data length + { + if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; // DATA_BUF_SIZE means user defined buffer size (array) + ret = recv(sn, buf, size); // Data Receive process (H/W Rx socket buffer -> User's buffer) + + if(ret <= 0) return ret; // If the received data length <= 0, receive failed and process end + size = (uint16_t) ret; + sentsize = 0; + + // Data sentsize control + while(size != sentsize) + { + ret = send(sn, buf+sentsize, size-sentsize); // Data send process (User's buffer -> Destination through H/W Tx socket buffer) + if(ret < 0) // Send Error occurred (sent data length < 0) + { + close(sn); // socket close + return ret; + } + sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero. + } + } + ////////////////////////////////////////////////////////////////////////////////////////////// + break; + + case SOCK_CLOSE_WAIT : +#ifdef _LOOPBACK_DEBUG_ + //printf("%d:CloseWait\r\n",sn); +#endif + if((ret=disconnect(sn)) != SOCK_OK) return ret; +#ifdef _LOOPBACK_DEBUG_ + printf("%d:Socket Closed\r\n", sn); +#endif + break; + + case SOCK_INIT : +#ifdef _LOOPBACK_DEBUG_ + printf("%d:Try to connect to the %d.%d.%d.%d : %d\r\n", sn, destip[0], destip[1], destip[2], destip[3], destport); +#endif + if( (ret = connect(sn, destip, destport)) != SOCK_OK) return ret; // Try to TCP connect to the TCP server (destination) + break; + + case SOCK_CLOSED: + close(sn); + if((ret=socket(sn, Sn_MR_TCP, any_port++, 0x00)) != sn){ + if(any_port == 0xffff) any_port = 50000; + return ret; // TCP socket open with 'any_port' port number + } +#ifdef _LOOPBACK_DEBUG_ + //printf("%d:TCP client loopback start\r\n",sn); + //printf("%d:Socket opened\r\n",sn); +#endif + break; + default: + break; + } + return 1; +} + + +int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port) +{ + int32_t ret; + uint16_t size, sentsize; + uint8_t destip[4]; + uint16_t destport; + + switch(getSn_SR(sn)) + { + case SOCK_UDP : + if((size = getSn_RX_RSR(sn)) > 0) + { + if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; + ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport); + if(ret <= 0) + { +#ifdef _LOOPBACK_DEBUG_ + printf("%d: recvfrom error. %ld\r\n",sn,ret); +#endif + return ret; + } + size = (uint16_t) ret; + sentsize = 0; + while(sentsize != size) + { + ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport); + if(ret < 0) + { +#ifdef _LOOPBACK_DEBUG_ + printf("%d: sendto error. %ld\r\n",sn,ret); +#endif + return ret; + } + sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero. + } + } + break; + case SOCK_CLOSED: +#ifdef _LOOPBACK_DEBUG_ + //printf("%d:UDP loopback start\r\n",sn); +#endif + if((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn) + return ret; +#ifdef _LOOPBACK_DEBUG_ + printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, port); +#endif + break; + default : + break; + } + return 1; +} + +#endif diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/loopback/loopback.h b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/loopback/loopback.h new file mode 100644 index 0000000..8f5a3d6 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/loopback/loopback.h @@ -0,0 +1,38 @@ +#ifndef _LOOPBACK_H_ +#define _LOOPBACK_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* Loopback test debug message printout enable */ +#define _LOOPBACK_DEBUG_ + +/* DATA_BUF_SIZE define for Loopback example */ +#ifndef DATA_BUF_SIZE + #define DATA_BUF_SIZE 2048 +#endif + +/************************/ +/* Select LOOPBACK_MODE */ +/************************/ +#define LOOPBACK_MAIN_NOBLOCK 0 +#define LOOPBACK_MODE LOOPBACK_MAIN_NOBLOCK + + +/* TCP server Loopback test example */ +int32_t loopback_tcps(uint8_t sn, uint8_t* buf, uint16_t port); + +/* TCP client Loopback test example */ +int32_t loopback_tcpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport); + +/* UDP Loopback test example */ +int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/webserver_simple/webpages.h b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/webserver_simple/webpages.h new file mode 100644 index 0000000..47f7c72 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/webserver_simple/webpages.h @@ -0,0 +1,29 @@ +/* + * webpages.h + * + * Created on: 05 дек. 2018 г. + * Author: maxx + */ + +#ifndef WEBPAGES_H_ +#define WEBPAGES_H_ + +#define index_page \ +"\n"\ +"

W5500 Simple Web Server


\n"\ +"

AVR Mega1284p and WIZ5500


\n"\ +"

\n"\ +"Uptime: sec\n"\ +"

LED1 OFF\n"\ +"
LED1 ON\n"\ +"

\n"\ +"\n"\ +"

\n" + +#define page_404 \ +"HTTP/1.0 404 Not Found\r\n"\ +"Content-Type: text/html\r\n"\ +"\r\n"\ +"

404 Not Found

" + +#endif /* WEBPAGES_H_ */ diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/webserver_simple/webserver_simple.c b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/webserver_simple/webserver_simple.c new file mode 100644 index 0000000..8879627 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/webserver_simple/webserver_simple.c @@ -0,0 +1,257 @@ +#include +#include +#include "webserver_simple.h" +#include "socket.h" +#include "wizchip_conf.h" + + +int strindex(char *s,char *t) +{ + uint16_t i,n; + + n=strlen(t); + for(i=0; *(s+i); i++) + { + if (strncmp(s+i,t,n) == 0) + return i; + } + return -1; +} +void SetAutoKeepAlive(sn, time) // time > 0 +{ + setSn_KPALVTR(sn, time); + printf("Sn:%d - kpalvtime: %u sec\r\n",sn, 5*getSn_KPALVTR(sn)); +} + +int32_t websrv_simple(uint8_t sn, uint8_t* buf, uint16_t port) +{ + int32_t ret; + uint16_t size = 0; + int getidx, postidx, getidx_htm, postidx_htm; + char radiostat0[10],radiostat1[10],temp[12]; + + static uint32_t httpd_active_millis; + +#ifdef _WEBSRV_DEBUG_ + uint8_t destip[4]; + uint16_t destport; +#endif + + switch(getSn_SR(sn)) + { + case SOCK_ESTABLISHED : + if(getSn_IR(sn) & Sn_IR_CON) + { +#ifdef _WEBSRV_DEBUG_ + getSn_DIPR(sn, destip); + destport = getSn_DPORT(sn); + + printf("%d:WEB Connected - %d.%d.%d.%d : %u\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport); +#endif + setSn_IR(sn,Sn_IR_CON); + //Get timetick to open socket + httpd_active_millis = millis(); + } + if((size = getSn_RX_RSR(sn)) > 0) // Don't need to check SOCKERR_BUSY because it doesn't not occur. + { + if(size > WEBSRV_DATA_BUF_SIZE) size = WEBSRV_DATA_BUF_SIZE; + ret = recv(sn, buf, size); + + if(ret <= 0) return ret; // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY. + + //Get timetick to read data from socket + httpd_active_millis = millis(); + + size = (uint16_t) ret; + buf[size] = 0x0;// insert null-terminate symbol to correct parse data + +#ifdef _WEBSRV_DEBUG_ + PRINTF("\r\n>>HTTP REQUEST %u bytes:\r\n%s\rn\n",size, buf); +#endif + + // Check the HTTP Request Header + getidx=strindex((char *)buf,"GET / "); + getidx_htm=strindex((char *)buf,"GET /index.htm"); + postidx=strindex((char *)buf,"POST / "); + postidx_htm=strindex((char *)buf,"POST /index.htm"); + + if (getidx >= 0 || postidx >= 0 || getidx_htm >= 0 || postidx_htm >= 0) + { +#ifdef _WEBSRV_DEBUG_ + PRINTF(">>Req. ROOT check!\n"); +#endif + // Now check the Radio Button for POST request + if (postidx >= 0 || postidx_htm >= 0) + { + if (strindex((char *)buf,"radio=0") > 0) + { + //ledmode=0; + //PRINTF("++LED=0\r\n"); + led1_low(); + } + + if (strindex((char *)buf,"radio=1") > 0) + { + //ledmode=1; + //PRINTF("++LED=1\r\n"); + led1_high(); + } + + } +#ifdef _WEBSRV_DEBUG_ + PRINTF(">>Req. Send!\n"); +#endif + //Old method with every string fill + /* + // Create the HTTP Response Header + strcpy_P((char *)buf,PSTR("HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n")); + strcat_P((char *)buf,PSTR(""\ + ""\ + )); + strcat_P((char *)buf,PSTR("\r\n")); + strcat_P((char *)buf,PSTR("

W5500 Simple Web Server


\r\n")); + strcat_P((char *)buf,PSTR("

AVR Mega1284p and WIZ5500


\r\n")); + strcat_P((char *)buf,PSTR("

\r\n")); + + // Now Send the HTTP Response + if (send(sn,buf,strlen((char *)buf)) <= 0) break; + + // Create the HTTP Temperature Response + sprintf((char *)temp,"%lu",(millis()/1000)); // Convert temperature value to string + + strcpy_P((char *)buf,PSTR("Uptime: OC\r\n")); // for celsius + strcat_P((char *)buf,PSTR("\"> sec\r\n")); // for seconds + if (led1_read()) + { + strcpy(radiostat0,""); + strcpy_P(radiostat1,PSTR("checked")); + } + else + { + strcpy_P(radiostat0,PSTR("checked")); + strcpy(radiostat1,""); + } + + // Create the HTTP Radio Button 0 Response + strcat_P((char *)buf,PSTR("

LED1 OFF\r\n")); + strcat_P((char *)buf,PSTR("
LED1 ON\r\n")); + strcat_P((char *)buf,PSTR("

\r\n")); + strcat_P((char *)buf,PSTR("\r\n")); + strcat_P((char *)buf,PSTR("

\r\n")); + */ + + //New method, send page at once, (no more then ~1500 bytes content!!) + //Prepare additional data to send + if (led1_read()) + { + strcpy(radiostat0,""); + strcpy_P(radiostat1,PSTR("checked")); + } + else + { + strcpy_P(radiostat0,PSTR("checked")); + strcpy(radiostat1,""); + } + + //copy page to buffer and send to http client, without additional data + //strcpy_P((char *)buf,PSTR(index_page)); + + //copy page to buffer and send to http client, with additional data + sprintf_P((char *)buf,PSTR(index_page), millis()/1000, radiostat0, radiostat1); + + // Now Send the HTTP Remaining Response + if (send(sn,buf,strlen((char *)buf)) <= 0) break; + + } + else + { + //Page not found + /* + strcpy_P((char *)buf,PSTR(\ + "HTTP/1.0 404 Not Found\r\n" + "Content-Type: text/html\r\n" + "\r\n" + //" " // Redirect через 5 сек на основную страницу + "

404 Not Found

"\ + )); + */ + + //copy page to buffer and send to http client, without additional data + strcpy_P((char *)buf,PSTR(page_404)); + + // Now Send the HTTP Remaining Response + if (send(sn,buf,strlen((char *)buf)) <= 0) break; + } + // Disconnect the socket + disconnect(sn); + } + else + { + //here when opened socket connection but no data received + if((millis()-httpd_active_millis) > HTTPD_OPEN_TIMEOUT) + { + //Force close socket, after 3 sec idle (To beat Chrome "persistent connection") +#ifdef _WEBSRV_DEBUG_ + PRINTF("!!HTTPD timeout, Force close socket\r\n"); +#endif + close(sn); + } + } + break; + /* + case SOCK_FIN_WAIT: + case SOCK_CLOSING: + case SOCK_TIME_WAIT: + case SOCK_LAST_ACK: + //case SOCK_CLOSE_WAIT: + //Force close socket + close(sn); + */ + + break; + case SOCK_CLOSE_WAIT : +#ifdef _WEBSRV_DEBUG_ + //printf("%d:CloseWait\r\n",sn); +#endif + if((ret = disconnect(sn)) != SOCK_OK) return ret; +#ifdef _WEBSRV_DEBUG_ + printf("%d:WEB Socket Closed\r\n", sn); +#endif + break; + case SOCK_INIT : +#ifdef _WEBSRV_DEBUG_ + printf("%d:Listen, WEB server, port [%d]\r\n", sn, port); +#endif + if( (ret = listen(sn)) != SOCK_OK) return ret; + break; + case SOCK_CLOSED: +#ifdef _WEBSRV_DEBUG_ + //printf("%d:TCP server loopback start\r\n",sn); +#endif + if((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn) return ret; + //This is not helped with Chrome keep-alive sessions + //SetAutoKeepAlive(sn, 1); // set Auto keepalive 5sec(1*5) (This is for TCP IP only!) +#ifdef _WEBSRV_DEBUG_ + //printf("%d:Socket opened\r\n",sn); +#endif + break; + default: + break; + } + return 1; +} diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/webserver_simple/webserver_simple.h b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/webserver_simple/webserver_simple.h new file mode 100644 index 0000000..b851fbc --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Application/webserver_simple/webserver_simple.h @@ -0,0 +1,33 @@ +#ifndef _WEBSERVER_SIMPLE_H_ +#define _WEBSERVER_SIMPLE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "../../globals.h" +#include "webpages.h" + +/* Loopback test debug message printout enable */ +#define _WEBSRV_DEBUG_ + +/* DATA_BUF_SIZE define for Loopback example */ +#ifndef WEBSRV_DATA_BUF_SIZE + #define WEBSRV_DATA_BUF_SIZE 2048 +#endif + +//Timeout (ms) to close too long opened socket (Help from freeze with work with Chrome browser (keep persistent connection on WIN7 ~ 120 sec)) +#define HTTPD_OPEN_TIMEOUT 3000 + +/* WEB SERVER test example */ +int32_t websrv_simple(uint8_t sn, uint8_t* buf, uint16_t port); + +int strindex(char *s,char *t); + + +#ifdef __cplusplus +} +#endif + +#endif //_WEBSERVER_SIMPLE_H_ diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/W5500/w5500.c b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/W5500/w5500.c new file mode 100644 index 0000000..68d4cb8 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/W5500/w5500.c @@ -0,0 +1,267 @@ +//***************************************************************************** +// +//! \file w5500.c +//! \brief W5500 HAL Interface. +//! \version 1.0.2 +//! \date 2013/10/21 +//! \par Revision history +//! <2015/02/05> Notice +//! The version history is not updated after this point. +//! Download the latest version directly from GitHub. Please visit the our GitHub repository for ioLibrary. +//! >> https://github.com/Wiznet/ioLibrary_Driver +//! <2014/05/01> V1.0.2 +//! 1. Implicit type casting -> Explicit type casting. Refer to M20140501 +//! Fixed the problem on porting into under 32bit MCU +//! Issued by Mathias ClauBen, wizwiki forum ID Think01 and bobh +//! Thank for your interesting and serious advices. +//! <2013/12/20> V1.0.1 +//! 1. Remove warning +//! 2. WIZCHIP_READ_BUF WIZCHIP_WRITE_BUF in case _WIZCHIP_IO_MODE_SPI_FDM_ +//! for loop optimized(removed). refer to M20131220 +//! <2013/10/21> 1st Release +//! \author MidnightCow +//! \copyright +//! +//! Copyright (c) 2013, WIZnet Co., LTD. +//! All rights reserved. +//! +//! Redistribution and use in source and binary forms, with or without +//! modification, are permitted provided that the following conditions +//! are met: +//! +//! * Redistributions of source code must retain the above copyright +//! notice, this list of conditions and the following disclaimer. +//! * Redistributions in binary form must reproduce the above copyright +//! notice, this list of conditions and the following disclaimer in the +//! documentation and/or other materials provided with the distribution. +//! * Neither the name of the nor the names of its +//! contributors may be used to endorse or promote products derived +//! from this software without specific prior written permission. +//! +//! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +//! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +//! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +//! THE POSSIBILITY OF SUCH DAMAGE. +// +//***************************************************************************** +//#include +#include "w5500.h" + +#define _W5500_SPI_VDM_OP_ 0x00 +#define _W5500_SPI_FDM_OP_LEN1_ 0x01 +#define _W5500_SPI_FDM_OP_LEN2_ 0x02 +#define _W5500_SPI_FDM_OP_LEN4_ 0x03 + +#if (_WIZCHIP_ == 5500) +//////////////////////////////////////////////////// + +uint8_t WIZCHIP_READ(uint32_t AddrSel) +{ + uint8_t ret; + uint8_t spi_data[3]; + + WIZCHIP_CRITICAL_ENTER(); + WIZCHIP.CS._select(); + + AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_); + + if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) // byte operation + { + WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16); + WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8); + WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0); + } + else // burst operation + { + spi_data[0] = (AddrSel & 0x00FF0000) >> 16; + spi_data[1] = (AddrSel & 0x0000FF00) >> 8; + spi_data[2] = (AddrSel & 0x000000FF) >> 0; + WIZCHIP.IF.SPI._write_burst(spi_data, 3); + } + ret = WIZCHIP.IF.SPI._read_byte(); + + WIZCHIP.CS._deselect(); + WIZCHIP_CRITICAL_EXIT(); + return ret; +} + +void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb ) +{ + uint8_t spi_data[4]; + + WIZCHIP_CRITICAL_ENTER(); + WIZCHIP.CS._select(); + + AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_); + + //if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) // byte operation + if(!WIZCHIP.IF.SPI._write_burst) // byte operation + { + WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16); + WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8); + WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0); + WIZCHIP.IF.SPI._write_byte(wb); + } + else // burst operation + { + spi_data[0] = (AddrSel & 0x00FF0000) >> 16; + spi_data[1] = (AddrSel & 0x0000FF00) >> 8; + spi_data[2] = (AddrSel & 0x000000FF) >> 0; + spi_data[3] = wb; + WIZCHIP.IF.SPI._write_burst(spi_data, 4); + } + + WIZCHIP.CS._deselect(); + WIZCHIP_CRITICAL_EXIT(); +} + +void WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len) +{ + uint8_t spi_data[3]; + uint16_t i; + + WIZCHIP_CRITICAL_ENTER(); + WIZCHIP.CS._select(); + + AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_); + + if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst) // byte operation + { + WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16); + WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8); + WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0); + for(i = 0; i < len; i++) + pBuf[i] = WIZCHIP.IF.SPI._read_byte(); + } + else // burst operation + { + spi_data[0] = (AddrSel & 0x00FF0000) >> 16; + spi_data[1] = (AddrSel & 0x0000FF00) >> 8; + spi_data[2] = (AddrSel & 0x000000FF) >> 0; + WIZCHIP.IF.SPI._write_burst(spi_data, 3); + WIZCHIP.IF.SPI._read_burst(pBuf, len); + } + + WIZCHIP.CS._deselect(); + WIZCHIP_CRITICAL_EXIT(); +} + +void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len) +{ + uint8_t spi_data[3]; + uint16_t i; + + WIZCHIP_CRITICAL_ENTER(); + WIZCHIP.CS._select(); + + AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_); + + if(!WIZCHIP.IF.SPI._write_burst) // byte operation + { + WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16); + WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8); + WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0); + for(i = 0; i < len; i++) + WIZCHIP.IF.SPI._write_byte(pBuf[i]); + } + else // burst operation + { + spi_data[0] = (AddrSel & 0x00FF0000) >> 16; + spi_data[1] = (AddrSel & 0x0000FF00) >> 8; + spi_data[2] = (AddrSel & 0x000000FF) >> 0; + WIZCHIP.IF.SPI._write_burst(spi_data, 3); + WIZCHIP.IF.SPI._write_burst(pBuf, len); + } + + WIZCHIP.CS._deselect(); + WIZCHIP_CRITICAL_EXIT(); +} + + +uint16_t getSn_TX_FSR(uint8_t sn) +{ + uint16_t val=0,val1=0; + + do + { + val1 = WIZCHIP_READ(Sn_TX_FSR(sn)); + val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1)); + if (val1 != 0) + { + val = WIZCHIP_READ(Sn_TX_FSR(sn)); + val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1)); + } + }while (val != val1); + return val; +} + + +uint16_t getSn_RX_RSR(uint8_t sn) +{ + uint16_t val=0,val1=0; + + do + { + val1 = WIZCHIP_READ(Sn_RX_RSR(sn)); + val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1)); + if (val1 != 0) + { + val = WIZCHIP_READ(Sn_RX_RSR(sn)); + val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1)); + } + }while (val != val1); + return val; +} + +void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len) +{ + uint16_t ptr = 0; + uint32_t addrsel = 0; + + if(len == 0) return; + ptr = getSn_TX_WR(sn); + //M20140501 : implict type casting -> explict type casting + //addrsel = (ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3); + addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3); + // + WIZCHIP_WRITE_BUF(addrsel,wizdata, len); + + ptr += len; + setSn_TX_WR(sn,ptr); +} + +void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len) +{ + uint16_t ptr = 0; + uint32_t addrsel = 0; + + if(len == 0) return; + ptr = getSn_RX_RD(sn); + //M20140501 : implict type casting -> explict type casting + //addrsel = ((ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3); + addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3); + // + WIZCHIP_READ_BUF(addrsel, wizdata, len); + ptr += len; + + setSn_RX_RD(sn,ptr); +} + + +void wiz_recv_ignore(uint8_t sn, uint16_t len) +{ + uint16_t ptr = 0; + + ptr = getSn_RX_RD(sn); + ptr += len; + setSn_RX_RD(sn,ptr); +} + +#endif diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/W5500/w5500.h b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/W5500/w5500.h new file mode 100644 index 0000000..3afc16e --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/W5500/w5500.h @@ -0,0 +1,2163 @@ +//***************************************************************************** +// +//! \file w5500.h +//! \brief W5500 HAL Header File. +//! \version 1.0.0 +//! \date 2013/10/21 +//! \par Revision history +//! <2015/02/05> Notice +//! The version history is not updated after this point. +//! Download the latest version directly from GitHub. Please visit the our GitHub repository for ioLibrary. +//! >> https://github.com/Wiznet/ioLibrary_Driver +//! <2013/10/21> 1st Release +//! \author MidnightCow +//! \copyright +//! +//! Copyright (c) 2013, WIZnet Co., LTD. +//! All rights reserved. +//! +//! Redistribution and use in source and binary forms, with or without +//! modification, are permitted provided that the following conditions +//! are met: +//! +//! * Redistributions of source code must retain the above copyright +//! notice, this list of conditions and the following disclaimer. +//! * Redistributions in binary form must reproduce the above copyright +//! notice, this list of conditions and the following disclaimer in the +//! documentation and/or other materials provided with the distribution. +//! * Neither the name of the nor the names of its +//! contributors may be used to endorse or promote products derived +//! from this software without specific prior written permission. +//! +//! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +//! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +//! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +//! THE POSSIBILITY OF SUCH DAMAGE. +// +//***************************************************************************** + +// + +#ifndef _W5500_H_ +#define _W5500_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "wizchip_conf.h" + +/// @cond DOXY_APPLY_CODE +#if (_WIZCHIP_ == 5500) +/// @endcond + +#define _W5500_IO_BASE_ 0x00000000 + +#define _W5500_SPI_READ_ (0x00 << 2) //< SPI interface Read operation in Control Phase +#define _W5500_SPI_WRITE_ (0x01 << 2) //< SPI interface Write operation in Control Phase + +#define WIZCHIP_CREG_BLOCK 0x00 //< Common register block +#define WIZCHIP_SREG_BLOCK(N) (1+4*N) //< Socket N register block +#define WIZCHIP_TXBUF_BLOCK(N) (2+4*N) //< Socket N Tx buffer address block +#define WIZCHIP_RXBUF_BLOCK(N) (3+4*N) //< Socket N Rx buffer address block + +#define WIZCHIP_OFFSET_INC(ADDR, N) (ADDR + (N<<8)) //< Increase offset address + + +/////////////////////////////////////// +// Definition For Legacy Chip Driver // +/////////////////////////////////////// +#define IINCHIP_READ(ADDR) WIZCHIP_READ(ADDR) ///< The defined for legacy chip driver +#define IINCHIP_WRITE(ADDR,VAL) WIZCHIP_WRITE(ADDR,VAL) ///< The defined for legacy chip driver +#define IINCHIP_READ_BUF(ADDR,BUF,LEN) WIZCHIP_READ_BUF(ADDR,BUF,LEN) ///< The defined for legacy chip driver +#define IINCHIP_WRITE_BUF(ADDR,BUF,LEN) WIZCHIP_WRITE(ADDR,BUF,LEN) ///< The defined for legacy chip driver + +////////////////////////////// +//-------------------------- defgroup --------------------------------- +/** + * @defgroup W5500 W5500 + * + * @brief WHIZCHIP register defines and I/O functions of @b W5500. + * + * - @ref WIZCHIP_register : @ref Common_register_group and @ref Socket_register_group + * - @ref WIZCHIP_IO_Functions : @ref Basic_IO_function, @ref Common_register_access_function and @ref Socket_register_access_function + */ + + +/** + * @defgroup WIZCHIP_register WIZCHIP register + * @ingroup W5500 + * + * @brief WHIZCHIP register defines register group of @b W5500. + * + * - @ref Common_register_group : Common register group + * - @ref Socket_register_group : \c SOCKET n register group + */ + + +/** + * @defgroup WIZCHIP_IO_Functions WIZCHIP I/O functions + * @ingroup W5500 + * + * @brief This supports the basic I/O functions for @ref WIZCHIP_register. + * + * - Basic I/O function \n + * WIZCHIP_READ(), WIZCHIP_WRITE(), WIZCHIP_READ_BUF(), WIZCHIP_WRITE_BUF() \n\n + * + * - @ref Common_register_group access functions \n + * -# @b Mode \n + * getMR(), setMR() + * -# @b Interrupt \n + * getIR(), setIR(), getIMR(), setIMR(), getSIR(), setSIR(), getSIMR(), setSIMR(), getINTLEVEL(), setINTLEVEL() + * -# Network Information \n + * getSHAR(), setSHAR(), getGAR(), setGAR(), getSUBR(), setSUBR(), getSIPR(), setSIPR() + * -# @b Retransmission \n + * getRCR(), setRCR(), getRTR(), setRTR() + * -# @b PPPoE \n + * getPTIMER(), setPTIMER(), getPMAGIC(), getPMAGIC(), getPSID(), setPSID(), getPHAR(), setPHAR(), getPMRU(), setPMRU() + * -# ICMP packet \n + * getUIPR(), getUPORTR() + * -# @b etc. \n + * getPHYCFGR(), setPHYCFGR(), getVERSIONR() \n\n + * + * - \ref Socket_register_group access functions \n + * -# SOCKET control \n + * getSn_MR(), setSn_MR(), getSn_CR(), setSn_CR(), getSn_IMR(), setSn_IMR(), getSn_IR(), setSn_IR() + * -# SOCKET information \n + * getSn_SR(), getSn_DHAR(), setSn_DHAR(), getSn_PORT(), setSn_PORT(), getSn_DIPR(), setSn_DIPR(), getSn_DPORT(), setSn_DPORT() + * getSn_MSSR(), setSn_MSSR() + * -# SOCKET communication \n + * getSn_RXBUF_SIZE(), setSn_RXBUF_SIZE(), getSn_TXBUF_SIZE(), setSn_TXBUF_SIZE() \n + * getSn_TX_RD(), getSn_TX_WR(), setSn_TX_WR() \n + * getSn_RX_RD(), setSn_RX_RD(), getSn_RX_WR() \n + * getSn_TX_FSR(), getSn_RX_RSR(), getSn_KPALVTR(), setSn_KPALVTR() + * -# IP header field \n + * getSn_FRAG(), setSn_FRAG(), getSn_TOS(), setSn_TOS() \n + * getSn_TTL(), setSn_TTL() + */ + + + +/** + * @defgroup Common_register_group Common register + * @ingroup WIZCHIP_register + * + * @brief Common register group\n + * It set the basic for the networking\n + * It set the configuration such as interrupt, network information, ICMP, etc. + * @details + * @sa MR : Mode register. + * @sa GAR, SUBR, SHAR, SIPR + * @sa INTLEVEL, IR, IMR, SIR, SIMR : Interrupt. + * @sa _RTR_, _RCR_ : Data retransmission. + * @sa PTIMER, PMAGIC, PHAR, PSID, PMRU : PPPoE. + * @sa UIPR, UPORTR : ICMP message. + * @sa PHYCFGR, VERSIONR : etc. + */ + + + +/** + * @defgroup Socket_register_group Socket register + * @ingroup WIZCHIP_register + * + * @brief Socket register group.\n + * Socket register configures and control SOCKETn which is necessary to data communication. + * @details + * @sa Sn_MR, Sn_CR, Sn_IR, Sn_IMR : SOCKETn Control + * @sa Sn_SR, Sn_PORT, Sn_DHAR, Sn_DIPR, Sn_DPORT : SOCKETn Information + * @sa Sn_MSSR, Sn_TOS, Sn_TTL, Sn_KPALVTR, Sn_FRAG : Internet protocol. + * @sa Sn_RXBUF_SIZE, Sn_TXBUF_SIZE, Sn_TX_FSR, Sn_TX_RD, Sn_TX_WR, Sn_RX_RSR, Sn_RX_RD, Sn_RX_WR : Data communication + */ + + + + /** + * @defgroup Basic_IO_function Basic I/O function + * @ingroup WIZCHIP_IO_Functions + * @brief These are basic input/output functions to read values from register or write values to register. + */ + +/** + * @defgroup Common_register_access_function Common register access functions + * @ingroup WIZCHIP_IO_Functions + * @brief These are functions to access common registers. + */ + +/** + * @defgroup Socket_register_access_function Socket register access functions + * @ingroup WIZCHIP_IO_Functions + * @brief These are functions to access socket registers. + */ + +//------------------------------- defgroup end -------------------------------------------- +//----------------------------- W5500 Common Registers IOMAP ----------------------------- +/** + * @ingroup Common_register_group + * @brief Mode Register address(R/W)\n + * @ref MR is used for S/W reset, ping block mode, PPPoE mode and etc. + * @details Each bit of @ref MR defined as follows. + * + * + * + *
7 6 5 4 3 2 1 0
RST Reserved WOL PB PPPoE Reserved FARP Reserved
+ * - \ref MR_RST : Reset + * - \ref MR_WOL : Wake on LAN + * - \ref MR_PB : Ping block + * - \ref MR_PPPOE : PPPoE mode + * - \ref MR_FARP : Force ARP mode + */ +#define MR (_W5500_IO_BASE_ + (0x0000 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief Gateway IP Register address(R/W) + * @details @ref GAR configures the default gateway address. + */ +#define GAR (_W5500_IO_BASE_ + (0x0001 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief Subnet mask Register address(R/W) + * @details @ref SUBR configures the subnet mask address. + */ +#define SUBR (_W5500_IO_BASE_ + (0x0005 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief Source MAC Register address(R/W) + * @details @ref SHAR configures the source hardware address. + */ +#define SHAR (_W5500_IO_BASE_ + (0x0009 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief Source IP Register address(R/W) + * @details @ref SIPR configures the source IP address. + */ +#define SIPR (_W5500_IO_BASE_ + (0x000F << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief Set Interrupt low level timer register address(R/W) + * @details @ref INTLEVEL configures the Interrupt Assert Time. + */ +#define INTLEVEL (_W5500_IO_BASE_ + (0x0013 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief Interrupt Register(R/W) + * @details @ref IR indicates the interrupt status. Each bit of @ref IR will be still until the bit will be written to by the host. + * If @ref IR is not equal to x00 INTn PIN is asserted to low until it is x00\n\n + * Each bit of @ref IR defined as follows. + * + * + * + *
7 6 5 4 3 2 1 0
CONFLICT UNREACH PPPoE MP Reserved Reserved Reserved Reserved
+ * - \ref IR_CONFLICT : IP conflict + * - \ref IR_UNREACH : Destination unreachable + * - \ref IR_PPPoE : PPPoE connection close + * - \ref IR_MP : Magic packet + */ +#define IR (_W5500_IO_BASE_ + (0x0015 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief Interrupt mask register(R/W) + * @details @ref _IMR_ is used to mask interrupts. Each bit of @ref _IMR_ corresponds to each bit of @ref IR. + * When a bit of @ref _IMR_ is and the corresponding bit of @ref IR is an interrupt will be issued. In other words, + * if a bit of @ref _IMR_ is an interrupt will not be issued even if the corresponding bit of @ref IR is \n\n + * Each bit of @ref _IMR_ defined as the following. + * + * + * + *
7 6 5 4 3 2 1 0
IM_IR7 IM_IR6 IM_IR5 IM_IR4 Reserved Reserved Reserved Reserved
+ * - \ref IM_IR7 : IP Conflict Interrupt Mask + * - \ref IM_IR6 : Destination unreachable Interrupt Mask + * - \ref IM_IR5 : PPPoE Close Interrupt Mask + * - \ref IM_IR4 : Magic Packet Interrupt Mask + */ +//M20150401 : Rename SYMBOE ( Re-define error in a compile) +//#define IMR (_W5500_IO_BASE_ + (0x0016 << 8) + (WIZCHIP_CREG_BLOCK << 3)) +#define _IMR_ (_W5500_IO_BASE_ + (0x0016 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief Socket Interrupt Register(R/W) + * @details @ref SIR indicates the interrupt status of Socket.\n + * Each bit of @ref SIR be still until @ref Sn_IR is cleared by the host.\n + * If @ref Sn_IR is not equal to x00 the n-th bit of @ref SIR is and INTn PIN is asserted until @ref SIR is x00 */ +#define SIR (_W5500_IO_BASE_ + (0x0017 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief Socket Interrupt Mask Register(R/W) + * @details Each bit of @ref SIMR corresponds to each bit of @ref SIR. + * When a bit of @ref SIMR is and the corresponding bit of @ref SIR is Interrupt will be issued. + * In other words, if a bit of @ref SIMR is an interrupt will be not issued even if the corresponding bit of @ref SIR is + */ +#define SIMR (_W5500_IO_BASE_ + (0x0018 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief Timeout register address( 1 is 100us )(R/W) + * @details @ref _RTR_ configures the retransmission timeout period. The unit of timeout period is 100us and the default of @ref _RTR_ is x07D0. + * And so the default timeout period is 200ms(100us X 2000). During the time configured by @ref _RTR_, W5500 waits for the peer response + * to the packet that is transmitted by \ref Sn_CR (CONNECT, DISCON, CLOSE, SEND, SEND_MAC, SEND_KEEP command). + * If the peer does not respond within the @ref _RTR_ time, W5500 retransmits the packet or issues timeout. + */ +//M20150401 : Rename SYMBOE ( Re-define error in a compile) +//#define RTR (_W5500_IO_BASE_ + (0x0019 << 8) + (WIZCHIP_CREG_BLOCK << 3)) +#define _RTR_ (_W5500_IO_BASE_ + (0x0019 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief Retry count register(R/W) + * @details @ref _RCR_ configures the number of time of retransmission. + * When retransmission occurs as many as ref _RCR_+1 Timeout interrupt is issued (@ref Sn_IR_TIMEOUT = '1'). + */ +//M20150401 : Rename SYMBOE ( Re-define error in a compile) +//#define RCR (_W5500_IO_BASE_ + (0x001B << 8) + (WIZCHIP_CREG_BLOCK << 3)) +#define _RCR_ (_W5500_IO_BASE_ + (0x001B << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief PPP LCP Request Timer register in PPPoE mode(R/W) + * @details @ref PTIMER configures the time for sending LCP echo request. The unit of time is 25ms. + */ +#define PTIMER (_W5500_IO_BASE_ + (0x001C << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief PPP LCP Magic number register in PPPoE mode(R/W) + * @details @ref PMAGIC configures the 4bytes magic number to be used in LCP negotiation. + */ +#define PMAGIC (_W5500_IO_BASE_ + (0x001D << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief PPP Destination MAC Register address(R/W) + * @details @ref PHAR configures the PPPoE server hardware address that is acquired during PPPoE connection process. + */ +#define PHAR (_W5500_IO_BASE_ + (0x001E << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief PPP Session Identification Register(R/W) + * @details @ref PSID configures the PPPoE sever session ID acquired during PPPoE connection process. + */ +#define PSID (_W5500_IO_BASE_ + (0x0024 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief PPP Maximum Segment Size(MSS) register(R/W) + * @details @ref PMRU configures the maximum receive unit of PPPoE. + */ +#define PMRU (_W5500_IO_BASE_ + (0x0026 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief Unreachable IP register address in UDP mode(R) + * @details W5500 receives an ICMP packet(Destination port unreachable) when data is sent to a port number + * which socket is not open and @ref IR_UNREACH bit of @ref IR becomes and @ref UIPR & @ref UPORTR indicates + * the destination IP address & port number respectively. + */ +#define UIPR (_W5500_IO_BASE_ + (0x0028 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief Unreachable Port register address in UDP mode(R) + * @details W5500 receives an ICMP packet(Destination port unreachable) when data is sent to a port number + * which socket is not open and @ref IR_UNREACH bit of @ref IR becomes and @ref UIPR & @ref UPORTR + * indicates the destination IP address & port number respectively. + */ +#define UPORTR (_W5500_IO_BASE_ + (0x002C << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief PHY Status Register(R/W) + * @details @ref PHYCFGR configures PHY operation mode and resets PHY. In addition, @ref PHYCFGR indicates the status of PHY such as duplex, Speed, Link. + */ +#define PHYCFGR (_W5500_IO_BASE_ + (0x002E << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +// Reserved (_W5500_IO_BASE_ + (0x002F << 8) + (WIZCHIP_CREG_BLOCK << 3)) +// Reserved (_W5500_IO_BASE_ + (0x0030 << 8) + (WIZCHIP_CREG_BLOCK << 3)) +// Reserved (_W5500_IO_BASE_ + (0x0031 << 8) + (WIZCHIP_CREG_BLOCK << 3)) +// Reserved (_W5500_IO_BASE_ + (0x0032 << 8) + (WIZCHIP_CREG_BLOCK << 3)) +// Reserved (_W5500_IO_BASE_ + (0x0033 << 8) + (WIZCHIP_CREG_BLOCK << 3)) +// Reserved (_W5500_IO_BASE_ + (0x0034 << 8) + (WIZCHIP_CREG_BLOCK << 3)) +// Reserved (_W5500_IO_BASE_ + (0x0035 << 8) + (WIZCHIP_CREG_BLOCK << 3)) +// Reserved (_W5500_IO_BASE_ + (0x0036 << 8) + (WIZCHIP_CREG_BLOCK << 3)) +// Reserved (_W5500_IO_BASE_ + (0x0037 << 8) + (WIZCHIP_CREG_BLOCK << 3)) +// Reserved (_W5500_IO_BASE_ + (0x0038 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + +/** + * @ingroup Common_register_group + * @brief chip version register address(R) + * @details @ref VERSIONR always indicates the W5500 version as @b 0x04. + */ +#define VERSIONR (_W5500_IO_BASE_ + (0x0039 << 8) + (WIZCHIP_CREG_BLOCK << 3)) + + +//----------------------------- W5500 Socket Registers IOMAP ----------------------------- +/** + * @ingroup Socket_register_group + * @brief socket Mode register(R/W) + * @details @ref Sn_MR configures the option or protocol type of Socket n.\n\n + * Each bit of @ref Sn_MR defined as the following. + * + * + * + *
7 6 5 4 3 2 1 0
MULTI/MFEN BCASTB ND/MC/MMB UCASTB/MIP6B Protocol[3] Protocol[2] Protocol[1] Protocol[0]
+ * - @ref Sn_MR_MULTI : Support UDP Multicasting + * - @ref Sn_MR_BCASTB : Broadcast block in UDP Multicasting + * - @ref Sn_MR_ND : No Delayed Ack(TCP) flag + * - @ref Sn_MR_MC : IGMP version used in UDP mulitcasting + * - @ref Sn_MR_MMB : Multicast Blocking in @ref Sn_MR_MACRAW mode + * - @ref Sn_MR_UCASTB : Unicast Block in UDP Multicating + * - @ref Sn_MR_MIP6B : IPv6 packet Blocking in @ref Sn_MR_MACRAW mode + * - Protocol + * + * + * + * + * + * + *
Protocol[3] Protocol[2] Protocol[1] Protocol[0] @b Meaning
0 0 0 0 Closed
0 0 0 1 TCP
0 0 1 0 UDP
0 1 0 0 MACRAW
+ * - @ref Sn_MR_MACRAW : MAC LAYER RAW SOCK \n + * - @ref Sn_MR_UDP : UDP + * - @ref Sn_MR_TCP : TCP + * - @ref Sn_MR_CLOSE : Unused socket + * @note MACRAW mode should be only used in Socket 0. + */ +#define Sn_MR(N) (_W5500_IO_BASE_ + (0x0000 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Socket command register(R/W) + * @details This is used to set the command for Socket n such as OPEN, CLOSE, CONNECT, LISTEN, SEND, and RECEIVE.\n + * After W5500 accepts the command, the @ref Sn_CR register is automatically cleared to 0x00. + * Even though @ref Sn_CR is cleared to 0x00, the command is still being processed.\n + * To check whether the command is completed or not, please check the @ref Sn_IR or @ref Sn_SR. + * - @ref Sn_CR_OPEN : Initialize or open socket. + * - @ref Sn_CR_LISTEN : Wait connection request in TCP mode(Server mode) + * - @ref Sn_CR_CONNECT : Send connection request in TCP mode(Client mode) + * - @ref Sn_CR_DISCON : Send closing request in TCP mode. + * - @ref Sn_CR_CLOSE : Close socket. + * - @ref Sn_CR_SEND : Update TX buffer pointer and send data. + * - @ref Sn_CR_SEND_MAC : Send data with MAC address, so without ARP process. + * - @ref Sn_CR_SEND_KEEP : Send keep alive message. + * - @ref Sn_CR_RECV : Update RX buffer pointer and receive data. + */ +#define Sn_CR(N) (_W5500_IO_BASE_ + (0x0001 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Socket interrupt register(R) + * @details @ref Sn_IR indicates the status of Socket Interrupt such as establishment, termination, receiving data, timeout).\n + * When an interrupt occurs and the corresponding bit of @ref Sn_IMR is the corresponding bit of @ref Sn_IR becomes \n + * In order to clear the @ref Sn_IR bit, the host should write the bit to \n + * + * + * + *
7 6 5 4 3 2 1 0
Reserved Reserved Reserved SEND_OK TIMEOUT RECV DISCON CON
+ * - \ref Sn_IR_SENDOK : SEND_OK Interrupt + * - \ref Sn_IR_TIMEOUT : TIMEOUT Interrupt + * - \ref Sn_IR_RECV : RECV Interrupt + * - \ref Sn_IR_DISCON : DISCON Interrupt + * - \ref Sn_IR_CON : CON Interrupt + */ +#define Sn_IR(N) (_W5500_IO_BASE_ + (0x0002 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Socket status register(R) + * @details @ref Sn_SR indicates the status of Socket n.\n + * The status of Socket n is changed by @ref Sn_CR or some special control packet as SYN, FIN packet in TCP. + * @par Normal status + * - @ref SOCK_CLOSED : Closed + * - @ref SOCK_INIT : Initiate state + * - @ref SOCK_LISTEN : Listen state + * - @ref SOCK_ESTABLISHED : Success to connect + * - @ref SOCK_CLOSE_WAIT : Closing state + * - @ref SOCK_UDP : UDP socket + * - @ref SOCK_MACRAW : MAC raw mode socket + *@par Temporary status during changing the status of Socket n. + * - @ref SOCK_SYNSENT : This indicates Socket n sent the connect-request packet (SYN packet) to a peer. + * - @ref SOCK_SYNRECV : It indicates Socket n successfully received the connect-request packet (SYN packet) from a peer. + * - @ref SOCK_FIN_WAIT : Connection state + * - @ref SOCK_CLOSING : Closing state + * - @ref SOCK_TIME_WAIT : Closing state + * - @ref SOCK_LAST_ACK : Closing state + */ +#define Sn_SR(N) (_W5500_IO_BASE_ + (0x0003 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief source port register(R/W) + * @details @ref Sn_PORT configures the source port number of Socket n. + * It is valid when Socket n is used in TCP/UDP mode. It should be set before OPEN command is ordered. + */ +#define Sn_PORT(N) (_W5500_IO_BASE_ + (0x0004 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Peer MAC register address(R/W) + * @details @ref Sn_DHAR configures the destination hardware address of Socket n when using SEND_MAC command in UDP mode or + * it indicates that it is acquired in ARP-process by CONNECT/SEND command. + */ +#define Sn_DHAR(N) (_W5500_IO_BASE_ + (0x0006 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Peer IP register address(R/W) + * @details @ref Sn_DIPR configures or indicates the destination IP address of Socket n. It is valid when Socket n is used in TCP/UDP mode. + * In TCP client mode, it configures an IP address of TCP serverbefore CONNECT command. + * In TCP server mode, it indicates an IP address of TCP clientafter successfully establishing connection. + * In UDP mode, it configures an IP address of peer to be received the UDP packet by SEND or SEND_MAC command. + */ +#define Sn_DIPR(N) (_W5500_IO_BASE_ + (0x000C << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Peer port register address(R/W) + * @details @ref Sn_DPORT configures or indicates the destination port number of Socket n. It is valid when Socket n is used in TCP/UDP mode. + * In TCP clientmode, it configures the listen port number of TCP serverbefore CONNECT command. + * In TCP Servermode, it indicates the port number of TCP client after successfully establishing connection. + * In UDP mode, it configures the port number of peer to be transmitted the UDP packet by SEND/SEND_MAC command. + */ +#define Sn_DPORT(N) (_W5500_IO_BASE_ + (0x0010 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Maximum Segment Size(Sn_MSSR0) register address(R/W) + * @details @ref Sn_MSSR configures or indicates the MTU(Maximum Transfer Unit) of Socket n. + */ +#define Sn_MSSR(N) (_W5500_IO_BASE_ + (0x0012 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +// Reserved (_W5500_IO_BASE_ + (0x0014 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief IP Type of Service(TOS) Register(R/W) + * @details @ref Sn_TOS configures the TOS(Type Of Service field in IP Header) of Socket n. + * It is set before OPEN command. + */ +#define Sn_TOS(N) (_W5500_IO_BASE_ + (0x0015 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) +/** + * @ingroup Socket_register_group + * @brief IP Time to live(TTL) Register(R/W) + * @details @ref Sn_TTL configures the TTL(Time To Live field in IP header) of Socket n. + * It is set before OPEN command. + */ +#define Sn_TTL(N) (_W5500_IO_BASE_ + (0x0016 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) +// Reserved (_W5500_IO_BASE_ + (0x0017 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) +// Reserved (_W5500_IO_BASE_ + (0x0018 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) +// Reserved (_W5500_IO_BASE_ + (0x0019 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) +// Reserved (_W5500_IO_BASE_ + (0x001A << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) +// Reserved (_W5500_IO_BASE_ + (0x001B << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) +// Reserved (_W5500_IO_BASE_ + (0x001C << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) +// Reserved (_W5500_IO_BASE_ + (0x001D << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Receive memory size register(R/W) + * @details @ref Sn_RXBUF_SIZE configures the RX buffer block size of Socket n. + * Socket n RX Buffer Block size can be configured with 1,2,4,8, and 16 Kbytes. + * If a different size is configured, the data cannot be normally received from a peer. + * Although Socket n RX Buffer Block size is initially configured to 2Kbytes, + * user can re-configure its size using @ref Sn_RXBUF_SIZE. The total sum of @ref Sn_RXBUF_SIZE can not be exceed 16Kbytes. + * When exceeded, the data reception error is occurred. + */ +#define Sn_RXBUF_SIZE(N) (_W5500_IO_BASE_ + (0x001E << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Transmit memory size register(R/W) + * @details @ref Sn_TXBUF_SIZE configures the TX buffer block size of Socket n. Socket n TX Buffer Block size can be configured with 1,2,4,8, and 16 Kbytes. + * If a different size is configured, the data canпїЅt be normally transmitted to a peer. + * Although Socket n TX Buffer Block size is initially configured to 2Kbytes, + * user can be re-configure its size using @ref Sn_TXBUF_SIZE. The total sum of @ref Sn_TXBUF_SIZE can not be exceed 16Kbytes. + * When exceeded, the data transmission error is occurred. + */ +#define Sn_TXBUF_SIZE(N) (_W5500_IO_BASE_ + (0x001F << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Transmit free memory size register(R) + * @details @ref Sn_TX_FSR indicates the free size of Socket n TX Buffer Block. It is initialized to the configured size by @ref Sn_TXBUF_SIZE. + * Data bigger than @ref Sn_TX_FSR should not be saved in the Socket n TX Buffer because the bigger data overwrites the previous saved data not yet sent. + * Therefore, check before saving the data to the Socket n TX Buffer, and if data is equal or smaller than its checked size, + * transmit the data with SEND/SEND_MAC command after saving the data in Socket n TX buffer. But, if data is bigger than its checked size, + * transmit the data after dividing into the checked size and saving in the Socket n TX buffer. + */ +#define Sn_TX_FSR(N) (_W5500_IO_BASE_ + (0x0020 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Transmit memory read pointer register address(R) + * @details @ref Sn_TX_RD is initialized by OPEN command. However, if Sn_MR(P[3:0]) is TCP mode(001, it is re-initialized while connecting with TCP. + * After its initialization, it is auto-increased by SEND command. + * SEND command transmits the saved data from the current @ref Sn_TX_RD to the @ref Sn_TX_WR in the Socket n TX Buffer. + * After transmitting the saved data, the SEND command increases the @ref Sn_TX_RD as same as the @ref Sn_TX_WR. + * If its increment value exceeds the maximum value 0xFFFF, (greater than 0x10000 and the carry bit occurs), + * then the carry bit is ignored and will automatically update with the lower 16bits value. + */ +#define Sn_TX_RD(N) (_W5500_IO_BASE_ + (0x0022 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Transmit memory write pointer register address(R/W) + * @details @ref Sn_TX_WR is initialized by OPEN command. However, if Sn_MR(P[3:0]) is TCP mode(001, it is re-initialized while connecting with TCP.\n + * It should be read or be updated like as follows.\n + * 1. Read the starting address for saving the transmitting data.\n + * 2. Save the transmitting data from the starting address of Socket n TX buffer.\n + * 3. After saving the transmitting data, update @ref Sn_TX_WR to the increased value as many as transmitting data size. + * If the increment value exceeds the maximum value 0xFFFF(greater than 0x10000 and the carry bit occurs), + * then the carry bit is ignored and will automatically update with the lower 16bits value.\n + * 4. Transmit the saved data in Socket n TX Buffer by using SEND/SEND command + */ +#define Sn_TX_WR(N) (_W5500_IO_BASE_ + (0x0024 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Received data size register(R) + * @details @ref Sn_RX_RSR indicates the data size received and saved in Socket n RX Buffer. + * @ref Sn_RX_RSR does not exceed the @ref Sn_RXBUF_SIZE and is calculated as the difference between + * пїЅSocket n RX Write Pointer (@ref Sn_RX_WR)and пїЅSocket n RX Read Pointer (@ref Sn_RX_RD) + */ +#define Sn_RX_RSR(N) (_W5500_IO_BASE_ + (0x0026 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Read point of Receive memory(R/W) + * @details @ref Sn_RX_RD is initialized by OPEN command. Make sure to be read or updated as follows.\n + * 1. Read the starting save address of the received data.\n + * 2. Read data from the starting address of Socket n RX Buffer.\n + * 3. After reading the received data, Update @ref Sn_RX_RD to the increased value as many as the reading size. + * If the increment value exceeds the maximum value 0xFFFF, that is, is greater than 0x10000 and the carry bit occurs, + * update with the lower 16bits value ignored the carry bit.\n + * 4. Order RECV command is for notifying the updated @ref Sn_RX_RD to W5500. + */ +#define Sn_RX_RD(N) (_W5500_IO_BASE_ + (0x0028 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Write point of Receive memory(R) + * @details @ref Sn_RX_WR is initialized by OPEN command and it is auto-increased by the data reception. + * If the increased value exceeds the maximum value 0xFFFF, (greater than 0x10000 and the carry bit occurs), + * then the carry bit is ignored and will automatically update with the lower 16bits value. + */ +#define Sn_RX_WR(N) (_W5500_IO_BASE_ + (0x002A << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief socket interrupt mask register(R) + * @details @ref Sn_IMR masks the interrupt of Socket n. + * Each bit corresponds to each bit of @ref Sn_IR. When a Socket n Interrupt is occurred and the corresponding bit of @ref Sn_IMR is + * the corresponding bit of @ref Sn_IR becomes When both the corresponding bit of @ref Sn_IMR and @ref Sn_IR are and the n-th bit of @ref IR is + * Host is interrupted by asserted INTn PIN to low. + */ +#define Sn_IMR(N) (_W5500_IO_BASE_ + (0x002C << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Fragment field value in IP header register(R/W) + * @details @ref Sn_FRAG configures the FRAG(Fragment field in IP header). + */ +#define Sn_FRAG(N) (_W5500_IO_BASE_ + (0x002D << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +/** + * @ingroup Socket_register_group + * @brief Keep Alive Timer register(R/W) + * @details @ref Sn_KPALVTR configures the transmitting timer of пїЅKEEP ALIVE(KA)packet of SOCKETn. It is valid only in TCP mode, + * and ignored in other modes. The time unit is 5s. + * KA packet is transmittable after @ref Sn_SR is changed to SOCK_ESTABLISHED and after the data is transmitted or received to/from a peer at least once. + * In case of '@ref Sn_KPALVTR > 0', W5500 automatically transmits KA packet after time-period for checking the TCP connection (Auto-keepalive-process). + * In case of '@ref Sn_KPALVTR = 0', Auto-keep-alive-process will not operate, + * and KA packet can be transmitted by SEND_KEEP command by the host (Manual-keep-alive-process). + * Manual-keep-alive-process is ignored in case of '@ref Sn_KPALVTR > 0'. + */ +#define Sn_KPALVTR(N) (_W5500_IO_BASE_ + (0x002F << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + +//#define Sn_TSR(N) (_W5500_IO_BASE_ + (0x0030 << 8) + (WIZCHIP_SREG_BLOCK(N) << 3)) + + +//----------------------------- W5500 Register values ----------------------------- + +/* MODE register values */ +/** + * @brief Reset + * @details If this bit is All internal registers will be initialized. It will be automatically cleared as after S/W reset. + */ +#define MR_RST 0x80 + +/** + * @brief Wake on LAN + * @details 0 : Disable WOL mode\n + * 1 : Enable WOL mode\n + * If WOL mode is enabled and the received magic packet over UDP has been normally processed, the Interrupt PIN (INTn) asserts to low. + * When using WOL mode, the UDP Socket should be opened with any source port number. (Refer to Socket n Mode Register (@ref Sn_MR) for opening Socket.) + * @note The magic packet over UDP supported by W5500 consists of 6 bytes synchronization stream (xFFFFFFFFFFFF and + * 16 times Target MAC address stream in UDP payload. The options such like password are ignored. You can use any UDP source port number for WOL mode. + */ +#define MR_WOL 0x20 + +/** + * @brief Ping block + * @details 0 : Disable Ping block\n + * 1 : Enable Ping block\n + * If the bit is it blocks the response to a ping request. + */ +#define MR_PB 0x10 + +/** + * @brief Enable PPPoE + * @details 0 : DisablePPPoE mode\n + * 1 : EnablePPPoE mode\n + * If you use ADSL, this bit should be + */ +#define MR_PPPOE 0x08 + +/** + * @brief Enable UDP_FORCE_ARP CHECHK + * @details 0 : Disable Force ARP mode\n + * 1 : Enable Force ARP mode\n + * In Force ARP mode, It forces on sending ARP Request whenever data is sent. + */ +#define MR_FARP 0x02 + +/* IR register values */ +/** + * @brief Check IP conflict. + * @details Bit is set as when own source IP address is same with the sender IP address in the received ARP request. + */ +#define IR_CONFLICT 0x80 + +/** + * @brief Get the destination unreachable message in UDP sending. + * @details When receiving the ICMP (Destination port unreachable) packet, this bit is set as + * When this bit is Destination Information such as IP address and Port number may be checked with the corresponding @ref UIPR & @ref UPORTR. + */ +#define IR_UNREACH 0x40 + +/** + * @brief Get the PPPoE close message. + * @details When PPPoE is disconnected during PPPoE mode, this bit is set. + */ +#define IR_PPPoE 0x20 + +/** + * @brief Get the magic packet interrupt. + * @details When WOL mode is enabled and receives the magic packet over UDP, this bit is set. + */ +#define IR_MP 0x10 + + +/* PHYCFGR register value */ +#define PHYCFGR_RST ~(1<<7) //< For PHY reset, must operate AND mask. +#define PHYCFGR_OPMD (1<<6) // Configre PHY with OPMDC value +#define PHYCFGR_OPMDC_ALLA (7<<3) +#define PHYCFGR_OPMDC_PDOWN (6<<3) +#define PHYCFGR_OPMDC_NA (5<<3) +#define PHYCFGR_OPMDC_100FA (4<<3) +#define PHYCFGR_OPMDC_100F (3<<3) +#define PHYCFGR_OPMDC_100H (2<<3) +#define PHYCFGR_OPMDC_10F (1<<3) +#define PHYCFGR_OPMDC_10H (0<<3) +#define PHYCFGR_DPX_FULL (1<<2) +#define PHYCFGR_DPX_HALF (0<<2) +#define PHYCFGR_SPD_100 (1<<1) +#define PHYCFGR_SPD_10 (0<<1) +#define PHYCFGR_LNK_ON (1<<0) +#define PHYCFGR_LNK_OFF (0<<0) + +/* IMR register values */ +/** + * @brief IP Conflict Interrupt Mask. + * @details 0: Disable IP Conflict Interrupt\n + * 1: Enable IP Conflict Interrupt + */ +#define IM_IR7 0x80 + +/** + * @brief Destination unreachable Interrupt Mask. + * @details 0: Disable Destination unreachable Interrupt\n + * 1: Enable Destination unreachable Interrupt + */ +#define IM_IR6 0x40 + +/** + * @brief PPPoE Close Interrupt Mask. + * @details 0: Disable PPPoE Close Interrupt\n + * 1: Enable PPPoE Close Interrupt + */ +#define IM_IR5 0x20 + +/** + * @brief Magic Packet Interrupt Mask. + * @details 0: Disable Magic Packet Interrupt\n + * 1: Enable Magic Packet Interrupt + */ +#define IM_IR4 0x10 + +/* Sn_MR Default values */ +/** + * @brief Support UDP Multicasting + * @details 0 : disable Multicasting\n + * 1 : enable Multicasting\n + * This bit is applied only during UDP mode(P[3:0] = 010.\n + * To use multicasting, @ref Sn_DIPR & @ref Sn_DPORT should be respectively configured with the multicast group IP address & port number + * before Socket n is opened by OPEN command of @ref Sn_CR. + */ +#define Sn_MR_MULTI 0x80 + +/** + * @brief Broadcast block in UDP Multicasting. + * @details 0 : disable Broadcast Blocking\n + * 1 : enable Broadcast Blocking\n + * This bit blocks to receive broadcasting packet during UDP mode(P[3:0] = 010.\m + * In addition, This bit does when MACRAW mode(P[3:0] = 100 + */ +#define Sn_MR_BCASTB 0x40 + +/** + * @brief No Delayed Ack(TCP), Multicast flag + * @details 0 : Disable No Delayed ACK option\n + * 1 : Enable No Delayed ACK option\n + * This bit is applied only during TCP mode (P[3:0] = 001.\n + * When this bit is It sends the ACK packet without delay as soon as a Data packet is received from a peer.\n + * When this bit is It sends the ACK packet after waiting for the timeout time configured by @ref _RTR_. + */ +#define Sn_MR_ND 0x20 + +/** + * @brief Unicast Block in UDP Multicasting + * @details 0 : disable Unicast Blocking\n + * 1 : enable Unicast Blocking\n + * This bit blocks receiving the unicast packet during UDP mode(P[3:0] = 010 and MULTI = + */ +#define Sn_MR_UCASTB 0x10 + +/** + * @brief MAC LAYER RAW SOCK + * @details This configures the protocol mode of Socket n. + * @note MACRAW mode should be only used in Socket 0. + */ +#define Sn_MR_MACRAW 0x04 + +#define Sn_MR_IPRAW 0x03 /**< IP LAYER RAW SOCK */ + +/** + * @brief UDP + * @details This configures the protocol mode of Socket n. + */ +#define Sn_MR_UDP 0x02 + +/** + * @brief TCP + * @details This configures the protocol mode of Socket n. + */ +#define Sn_MR_TCP 0x01 + +/** + * @brief Unused socket + * @details This configures the protocol mode of Socket n. + */ +#define Sn_MR_CLOSE 0x00 + +/* Sn_MR values used with Sn_MR_MACRAW */ +/** + * @brief MAC filter enable in @ref Sn_MR_MACRAW mode + * @details 0 : disable MAC Filtering\n + * 1 : enable MAC Filtering\n + * This bit is applied only during MACRAW mode(P[3:0] = 100.\n + * When set as W5500 can only receive broadcasting packet or packet sent to itself. + * When this bit is W5500 can receive all packets on Ethernet. + * If user wants to implement Hybrid TCP/IP stack, + * it is recommended that this bit is set as for reducing host overhead to process the all received packets. + */ +#define Sn_MR_MFEN Sn_MR_MULTI + +/** + * @brief Multicast Blocking in @ref Sn_MR_MACRAW mode + * @details 0 : using IGMP version 2\n + * 1 : using IGMP version 1\n + * This bit is applied only during UDP mode(P[3:0] = 010 and MULTI = + * It configures the version for IGMP messages (Join/Leave/Report). + */ +#define Sn_MR_MMB Sn_MR_ND + +/** + * @brief IPv6 packet Blocking in @ref Sn_MR_MACRAW mode + * @details 0 : disable IPv6 Blocking\n + * 1 : enable IPv6 Blocking\n + * This bit is applied only during MACRAW mode (P[3:0] = 100. It blocks to receiving the IPv6 packet. + */ +#define Sn_MR_MIP6B Sn_MR_UCASTB + +/* Sn_MR value used with Sn_MR_UDP & Sn_MR_MULTI */ +/** + * @brief IGMP version used in UDP mulitcasting + * @details 0 : disable Multicast Blocking\n + * 1 : enable Multicast Blocking\n + * This bit is applied only when MACRAW mode(P[3:0] = 100. It blocks to receive the packet with multicast MAC address. + */ +#define Sn_MR_MC Sn_MR_ND + +/* Sn_MR alternate values */ +/** + * @brief For Berkeley Socket API + */ +#define SOCK_STREAM Sn_MR_TCP + +/** + * @brief For Berkeley Socket API + */ +#define SOCK_DGRAM Sn_MR_UDP + + +/* Sn_CR values */ +/** + * @brief Initialize or open socket + * @details Socket n is initialized and opened according to the protocol selected in Sn_MR(P3:P0). + * The table below shows the value of @ref Sn_SR corresponding to @ref Sn_MR.\n + * + * + * + * + * + * + *
\b Sn_MR (P[3:0]) \b Sn_SR
Sn_MR_CLOSE (000)
Sn_MR_TCP (001) SOCK_INIT (0x13)
Sn_MR_UDP (010) SOCK_UDP (0x22)
S0_MR_MACRAW (100) SOCK_MACRAW (0x02)
+ */ +#define Sn_CR_OPEN 0x01 + +/** + * @brief Wait connection request in TCP mode(Server mode) + * @details This is valid only in TCP mode (\ref Sn_MR(P3:P0) = \ref Sn_MR_TCP). + * In this mode, Socket n operates as a TCP serverand waits for connection-request (SYN packet) from any TCP client + * The @ref Sn_SR changes the state from \ref SOCK_INIT to \ref SOCKET_LISTEN. + * When a TCP clientconnection request is successfully established, + * the @ref Sn_SR changes from SOCK_LISTEN to SOCK_ESTABLISHED and the @ref Sn_IR(0) becomes + * But when a TCP clientconnection request is failed, @ref Sn_IR(3) becomes and the status of @ref Sn_SR changes to SOCK_CLOSED. + */ +#define Sn_CR_LISTEN 0x02 + +/** + * @brief Send connection request in TCP mode(Client mode) + * @details To connect, a connect-request (SYN packet) is sent to TCP serverconfigured by @ref Sn_DIPR & Sn_DPORT(destination address & port). + * If the connect-request is successful, the @ref Sn_SR is changed to @ref SOCK_ESTABLISHED and the Sn_IR(0) becomes \n\n + * The connect-request fails in the following three cases.\n + * 1. When a @b ARPTO occurs (@ref Sn_IR[3] = ) because destination hardware address is not acquired through the ARP-process.\n + * 2. When a @b SYN/ACK packet is not received and @b TCPTO (Sn_IR(3) = )\n + * 3. When a @b RST packet is received instead of a @b SYN/ACK packet. In these cases, @ref Sn_SR is changed to @ref SOCK_CLOSED. + * @note This is valid only in TCP mode and operates when Socket n acts as TCP client + */ +#define Sn_CR_CONNECT 0x04 + +/** + * @brief Send closing request in TCP mode + * @details Regardless of TCP serveror TCP client the DISCON command processes the disconnect-process (b>Active closeor Passive close.\n + * @par Active close + * it transmits disconnect-request(FIN packet) to the connected peer\n + * @par Passive close + * When FIN packet is received from peer, a FIN packet is replied back to the peer.\n + * @details When the disconnect-process is successful (that is, FIN/ACK packet is received successfully), @ref Sn_SR is changed to @ref SOCK_CLOSED.\n + * Otherwise, TCPTO occurs (\ref Sn_IR(3)='1') and then @ref Sn_SR is changed to @ref SOCK_CLOSED. + * @note Valid only in TCP mode. + */ +#define Sn_CR_DISCON 0x08 + +/** + * @brief Close socket + * @details Sn_SR is changed to @ref SOCK_CLOSED. + */ +#define Sn_CR_CLOSE 0x10 + +/** + * @brief Update TX buffer pointer and send data + * @details SEND transmits all the data in the Socket n TX buffer.\n + * For more details, please refer to Socket n TX Free Size Register (@ref Sn_TX_FSR), Socket n, + * TX Write Pointer Register(@ref Sn_TX_WR), and Socket n TX Read Pointer Register(@ref Sn_TX_RD). + */ +#define Sn_CR_SEND 0x20 + +/** + * @brief Send data with MAC address, so without ARP process + * @details The basic operation is same as SEND.\n + * Normally SEND transmits data after destination hardware address is acquired by the automatic ARP-process(Address Resolution Protocol).\n + * But SEND_MAC transmits data without the automatic ARP-process.\n + * In this case, the destination hardware address is acquired from @ref Sn_DHAR configured by host, instead of APR-process. + * @note Valid only in UDP mode. + */ +#define Sn_CR_SEND_MAC 0x21 + +/** + * @brief Send keep alive message + * @details It checks the connection status by sending 1byte keep-alive packet.\n + * If the peer can not respond to the keep-alive packet during timeout time, the connection is terminated and the timeout interrupt will occur. + * @note Valid only in TCP mode. + */ +#define Sn_CR_SEND_KEEP 0x22 + +/** + * @brief Update RX buffer pointer and receive data + * @details RECV completes the processing of the received data in Socket n RX Buffer by using a RX read pointer register (@ref Sn_RX_RD).\n + * For more details, refer to Socket n RX Received Size Register (@ref Sn_RX_RSR), Socket n RX Write Pointer Register (@ref Sn_RX_WR), + * and Socket n RX Read Pointer Register (@ref Sn_RX_RD). + */ +#define Sn_CR_RECV 0x40 + +/* Sn_IR values */ +/** + * @brief SEND_OK Interrupt + * @details This is issued when SEND command is completed. + */ +#define Sn_IR_SENDOK 0x10 + +/** + * @brief TIMEOUT Interrupt + * @details This is issued when ARPTO or TCPTO occurs. + */ +#define Sn_IR_TIMEOUT 0x08 + +/** + * @brief RECV Interrupt + * @details This is issued whenever data is received from a peer. + */ +#define Sn_IR_RECV 0x04 + +/** + * @brief DISCON Interrupt + * @details This is issued when FIN or FIN/ACK packet is received from a peer. + */ +#define Sn_IR_DISCON 0x02 + +/** + * @brief CON Interrupt + * @details This is issued one time when the connection with peer is successful and then @ref Sn_SR is changed to @ref SOCK_ESTABLISHED. + */ +#define Sn_IR_CON 0x01 + +/* Sn_SR values */ +/** + * @brief Closed + * @details This indicates that Socket n is released.\n + * When DICON, CLOSE command is ordered, or when a timeout occurs, it is changed to @ref SOCK_CLOSED regardless of previous status. + */ +#define SOCK_CLOSED 0x00 + +/** + * @brief Initiate state + * @details This indicates Socket n is opened with TCP mode.\n + * It is changed to @ref SOCK_INIT when @ref Sn_MR(P[3:0]) = 001 and OPEN command is ordered.\n + * After @ref SOCK_INIT, user can use LISTEN /CONNECT command. + */ +#define SOCK_INIT 0x13 + +/** + * @brief Listen state + * @details This indicates Socket n is operating as TCP servermode and waiting for connection-request (SYN packet) from a peer TCP client.\n + * It will change to @ref SOCK_ESTALBLISHED when the connection-request is successfully accepted.\n + * Otherwise it will change to @ref SOCK_CLOSED after TCPTO @ref Sn_IR(TIMEOUT) = '1') is occurred. + */ +#define SOCK_LISTEN 0x14 + +/** + * @brief Connection state + * @details This indicates Socket n sent the connect-request packet (SYN packet) to a peer.\n + * It is temporarily shown when @ref Sn_SR is changed from @ref SOCK_INIT to @ref SOCK_ESTABLISHED by CONNECT command.\n + * If connect-accept(SYN/ACK packet) is received from the peer at SOCK_SYNSENT, it changes to @ref SOCK_ESTABLISHED.\n + * Otherwise, it changes to @ref SOCK_CLOSED after TCPTO (@ref Sn_IR[TIMEOUT] = '1') is occurred. + */ +#define SOCK_SYNSENT 0x15 + +/** + * @brief Connection state + * @details It indicates Socket n successfully received the connect-request packet (SYN packet) from a peer.\n + * If socket n sends the response (SYN/ACK packet) to the peer successfully, it changes to @ref SOCK_ESTABLISHED. \n + * If not, it changes to @ref SOCK_CLOSED after timeout (@ref Sn_IR[TIMEOUT] = '1') is occurred. + */ +#define SOCK_SYNRECV 0x16 + +/** + * @brief Success to connect + * @details This indicates the status of the connection of Socket n.\n + * It changes to @ref SOCK_ESTABLISHED when the TCP SERVERprocessed the SYN packet from the TCP CLIENTduring @ref SOCK_LISTEN, or + * when the CONNECT command is successful.\n + * During @ref SOCK_ESTABLISHED, DATA packet can be transferred using SEND or RECV command. + */ +#define SOCK_ESTABLISHED 0x17 + +/** + * @brief Closing state + * @details These indicate Socket n is closing.\n + * These are shown in disconnect-process such as active-close and passive-close.\n + * When Disconnect-process is successfully completed, or when timeout occurs, these change to @ref SOCK_CLOSED. + */ +#define SOCK_FIN_WAIT 0x18 + +/** + * @brief Closing state + * @details These indicate Socket n is closing.\n + * These are shown in disconnect-process such as active-close and passive-close.\n + * When Disconnect-process is successfully completed, or when timeout occurs, these change to @ref SOCK_CLOSED. + */ +#define SOCK_CLOSING 0x1A + +/** + * @brief Closing state + * @details These indicate Socket n is closing.\n + * These are shown in disconnect-process such as active-close and passive-close.\n + * When Disconnect-process is successfully completed, or when timeout occurs, these change to @ref SOCK_CLOSED. + */ +#define SOCK_TIME_WAIT 0x1B + +/** + * @brief Closing state + * @details This indicates Socket n received the disconnect-request (FIN packet) from the connected peer.\n + * This is half-closing status, and data can be transferred.\n + * For full-closing, DISCON command is used. But For just-closing, CLOSE command is used. + */ +#define SOCK_CLOSE_WAIT 0x1C + +/** + * @brief Closing state + * @details This indicates Socket n is waiting for the response (FIN/ACK packet) to the disconnect-request (FIN packet) by passive-close.\n + * It changes to @ref SOCK_CLOSED when Socket n received the response successfully, or when timeout(@ref Sn_IR[TIMEOUT] = '1') is occurred. + */ +#define SOCK_LAST_ACK 0x1D + +/** + * @brief UDP socket + * @details This indicates Socket n is opened in UDP mode(@ref Sn_MR(P[3:0]) = '010').\n + * It changes to SOCK_UDP when @ref Sn_MR(P[3:0]) = '010' and @ref Sn_CR_OPEN command is ordered.\n + * Unlike TCP mode, data can be transfered without the connection-process. + */ +#define SOCK_UDP 0x22 + +#define SOCK_IPRAW 0x32 /**< IP raw mode socket */ + +/** + * @brief MAC raw mode socket + * @details This indicates Socket 0 is opened in MACRAW mode (S0_MR(P[3:0]) = 100and is valid only in Socket 0.\n + * It changes to SOCK_MACRAW when S0_MR(P[3:0] = 100and OPEN command is ordered.\n + * Like UDP mode socket, MACRAW mode Socket 0 can transfer a MAC packet (Ethernet frame) without the connection-process. + */ +#define SOCK_MACRAW 0x42 + +//#define SOCK_PPPOE 0x5F + +/* IP PROTOCOL */ +#define IPPROTO_IP 0 //< Dummy for IP +#define IPPROTO_ICMP 1 //< Control message protocol +#define IPPROTO_IGMP 2 //< Internet group management protocol +#define IPPROTO_GGP 3 //< Gateway^2 (deprecated) +#define IPPROTO_TCP 6 //< TCP +#define IPPROTO_PUP 12 //< PUP +#define IPPROTO_UDP 17 //< UDP +#define IPPROTO_IDP 22 //< XNS idp +#define IPPROTO_ND 77 //< UNOFFICIAL net disk protocol +#define IPPROTO_RAW 255 //< Raw IP packet + + +/** + * @brief Enter a critical section + * + * @details It is provided to protect your shared code which are executed without distribution. \n \n + * + * In non-OS environment, It can be just implemented by disabling whole interrupt.\n + * In OS environment, You can replace it to critical section api supported by OS. + * + * \sa WIZCHIP_READ(), WIZCHIP_WRITE(), WIZCHIP_READ_BUF(), WIZCHIP_WRITE_BUF() + * \sa WIZCHIP_CRITICAL_EXIT() + */ +#define WIZCHIP_CRITICAL_ENTER() WIZCHIP.CRIS._enter() + +#ifdef _exit +#undef _exit +#endif + +/** + * @brief Exit a critical section + * + * @details It is provided to protect your shared code which are executed without distribution. \n\n + * + * In non-OS environment, It can be just implemented by disabling whole interrupt. \n + * In OS environment, You can replace it to critical section api supported by OS. + * + * @sa WIZCHIP_READ(), WIZCHIP_WRITE(), WIZCHIP_READ_BUF(), WIZCHIP_WRITE_BUF() + * @sa WIZCHIP_CRITICAL_ENTER() + */ +#define WIZCHIP_CRITICAL_EXIT() WIZCHIP.CRIS._exit() + + +//////////////////////// +// Basic I/O Function // +//////////////////////// + +/** + * @ingroup Basic_IO_function + * @brief It reads 1 byte value from a register. + * @param AddrSel Register address + * @return The value of register + */ +uint8_t WIZCHIP_READ (uint32_t AddrSel); + +/** + * @ingroup Basic_IO_function + * @brief It writes 1 byte value to a register. + * @param AddrSel Register address + * @param wb Write data + * @return void + */ +void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb ); + +/** + * @ingroup Basic_IO_function + * @brief It reads sequence data from registers. + * @param AddrSel Register address + * @param pBuf Pointer buffer to read data + * @param len Data length + */ +void WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len); + +/** + * @ingroup Basic_IO_function + * @brief It writes sequence data to registers. + * @param AddrSel Register address + * @param pBuf Pointer buffer to write data + * @param len Data length + */ +void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len); + +///////////////////////////////// +// Common Register I/O function // +///////////////////////////////// +/** + * @ingroup Common_register_access_function + * @brief Set Mode Register + * @param (uint8_t)mr The value to be set. + * @sa getMR() + */ +#define setMR(mr) \ + WIZCHIP_WRITE(MR,mr) + + +/** + * @ingroup Common_register_access_function + * @brief Get Mode Register + * @return uint8_t. The value of Mode register. + * @sa setMR() + */ +#define getMR() \ + WIZCHIP_READ(MR) + +/** + * @ingroup Common_register_access_function + * @brief Set gateway IP address + * @param (uint8_t*)gar Pointer variable to set gateway IP address. It should be allocated 4 bytes. + * @sa getGAR() + */ +#define setGAR(gar) \ + WIZCHIP_WRITE_BUF(GAR,gar,4) + +/** + * @ingroup Common_register_access_function + * @brief Get gateway IP address + * @param (uint8_t*)gar Pointer variable to get gateway IP address. It should be allocated 4 bytes. + * @sa setGAR() + */ +#define getGAR(gar) \ + WIZCHIP_READ_BUF(GAR,gar,4) + +/** + * @ingroup Common_register_access_function + * @brief Set subnet mask address + * @param (uint8_t*)subr Pointer variable to set subnet mask address. It should be allocated 4 bytes. + * @sa getSUBR() + */ +#define setSUBR(subr) \ + WIZCHIP_WRITE_BUF(SUBR, subr,4) + + +/** + * @ingroup Common_register_access_function + * @brief Get subnet mask address + * @param (uint8_t*)subr Pointer variable to get subnet mask address. It should be allocated 4 bytes. + * @sa setSUBR() + */ +#define getSUBR(subr) \ + WIZCHIP_READ_BUF(SUBR, subr, 4) + +/** + * @ingroup Common_register_access_function + * @brief Set local MAC address + * @param (uint8_t*)shar Pointer variable to set local MAC address. It should be allocated 6 bytes. + * @sa getSHAR() + */ +#define setSHAR(shar) \ + WIZCHIP_WRITE_BUF(SHAR, shar, 6) + +/** + * @ingroup Common_register_access_function + * @brief Get local MAC address + * @param (uint8_t*)shar Pointer variable to get local MAC address. It should be allocated 6 bytes. + * @sa setSHAR() + */ +#define getSHAR(shar) \ + WIZCHIP_READ_BUF(SHAR, shar, 6) + +/** + * @ingroup Common_register_access_function + * @brief Set local IP address + * @param (uint8_t*)sipr Pointer variable to set local IP address. It should be allocated 4 bytes. + * @sa getSIPR() + */ +#define setSIPR(sipr) \ + WIZCHIP_WRITE_BUF(SIPR, sipr, 4) + +/** + * @ingroup Common_register_access_function + * @brief Get local IP address + * @param (uint8_t*)sipr Pointer variable to get local IP address. It should be allocated 4 bytes. + * @sa setSIPR() + */ +#define getSIPR(sipr) \ + WIZCHIP_READ_BUF(SIPR, sipr, 4) + +/** + * @ingroup Common_register_access_function + * @brief Set INTLEVEL register + * @param (uint16_t)intlevel Value to set @ref INTLEVEL register. + * @sa getINTLEVEL() + */ +#define setINTLEVEL(intlevel) {\ + WIZCHIP_WRITE(INTLEVEL, (uint8_t)(intlevel >> 8)); \ + WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(INTLEVEL,1), (uint8_t) intlevel); \ + } + + +/** + * @ingroup Common_register_access_function + * @brief Get INTLEVEL register + * @return uint16_t. Value of @ref INTLEVEL register. + * @sa setINTLEVEL() + */ +//M20150401 : Type explict declaration +/* +#define getINTLEVEL() \ + ((WIZCHIP_READ(INTLEVEL) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(INTLEVEL,1))) +*/ +#define getINTLEVEL() \ + (((uint16_t)WIZCHIP_READ(INTLEVEL) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(INTLEVEL,1))) + +/** + * @ingroup Common_register_access_function + * @brief Set @ref IR register + * @param (uint8_t)ir Value to set @ref IR register. + * @sa getIR() + */ +#define setIR(ir) \ + WIZCHIP_WRITE(IR, (ir & 0xF0)) + +/** + * @ingroup Common_register_access_function + * @brief Get @ref IR register + * @return uint8_t. Value of @ref IR register. + * @sa setIR() + */ +#define getIR() \ + (WIZCHIP_READ(IR) & 0xF0) +/** + * @ingroup Common_register_access_function + * @brief Set @ref _IMR_ register + * @param (uint8_t)imr Value to set @ref _IMR_ register. + * @sa getIMR() + */ +#define setIMR(imr) \ + WIZCHIP_WRITE(_IMR_, imr) + +/** + * @ingroup Common_register_access_function + * @brief Get @ref _IMR_ register + * @return uint8_t. Value of @ref _IMR_ register. + * @sa setIMR() + */ +#define getIMR() \ + WIZCHIP_READ(_IMR_) + +/** + * @ingroup Common_register_access_function + * @brief Set @ref SIR register + * @param (uint8_t)sir Value to set @ref SIR register. + * @sa getSIR() + */ +#define setSIR(sir) \ + WIZCHIP_WRITE(SIR, sir) + +/** + * @ingroup Common_register_access_function + * @brief Get @ref SIR register + * @return uint8_t. Value of @ref SIR register. + * @sa setSIR() + */ +#define getSIR() \ + WIZCHIP_READ(SIR) +/** + * @ingroup Common_register_access_function + * @brief Set @ref SIMR register + * @param (uint8_t)simr Value to set @ref SIMR register. + * @sa getSIMR() + */ +#define setSIMR(simr) \ + WIZCHIP_WRITE(SIMR, simr) + +/** + * @ingroup Common_register_access_function + * @brief Get @ref SIMR register + * @return uint8_t. Value of @ref SIMR register. + * @sa setSIMR() + */ +#define getSIMR() \ + WIZCHIP_READ(SIMR) + +/** + * @ingroup Common_register_access_function + * @brief Set @ref _RTR_ register + * @param (uint16_t)rtr Value to set @ref _RTR_ register. + * @sa getRTR() + */ +#define setRTR(rtr) {\ + WIZCHIP_WRITE(_RTR_, (uint8_t)(rtr >> 8)); \ + WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(_RTR_,1), (uint8_t) rtr); \ + } + +/** + * @ingroup Common_register_access_function + * @brief Get @ref _RTR_ register + * @return uint16_t. Value of @ref _RTR_ register. + * @sa setRTR() + */ +//M20150401 : Type explict declaration +/* +#define getRTR() \ + ((WIZCHIP_READ(_RTR_) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(_RTR_,1))) +*/ +#define getRTR() \ + (((uint16_t)WIZCHIP_READ(_RTR_) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(_RTR_,1))) + + +/** + * @ingroup Common_register_access_function + * @brief Set @ref _RCR_ register + * @param (uint8_t)rcr Value to set @ref _RCR_ register. + * @sa getRCR() + */ +#define setRCR(rcr) \ + WIZCHIP_WRITE(_RCR_, rcr) + +/** + * @ingroup Common_register_access_function + * @brief Get @ref _RCR_ register + * @return uint8_t. Value of @ref _RCR_ register. + * @sa setRCR() + */ +#define getRCR() \ + WIZCHIP_READ(_RCR_) + +//================================================== test done =========================================================== + +/** + * @ingroup Common_register_access_function + * @brief Set @ref PTIMER register + * @param (uint8_t)ptimer Value to set @ref PTIMER register. + * @sa getPTIMER() + */ +#define setPTIMER(ptimer) \ + WIZCHIP_WRITE(PTIMER, ptimer) + +/** + * @ingroup Common_register_access_function + * @brief Get @ref PTIMER register + * @return uint8_t. Value of @ref PTIMER register. + * @sa setPTIMER() + */ +#define getPTIMER() \ + WIZCHIP_READ(PTIMER) + +/** + * @ingroup Common_register_access_function + * @brief Set @ref PMAGIC register + * @param (uint8_t)pmagic Value to set @ref PMAGIC register. + * @sa getPMAGIC() + */ +#define setPMAGIC(pmagic) \ + WIZCHIP_WRITE(PMAGIC, pmagic) + +/** + * @ingroup Common_register_access_function + * @brief Get @ref PMAGIC register + * @return uint8_t. Value of @ref PMAGIC register. + * @sa setPMAGIC() + */ +#define getPMAGIC() \ + WIZCHIP_READ(PMAGIC) + +/** + * @ingroup Common_register_access_function + * @brief Set @ref PHAR address + * @param (uint8_t*)phar Pointer variable to set PPP destination MAC register address. It should be allocated 6 bytes. + * @sa getPHAR() + */ +#define setPHAR(phar) \ + WIZCHIP_WRITE_BUF(PHAR, phar, 6) + +/** + * @ingroup Common_register_access_function + * @brief Get @ref PHAR address + * @param (uint8_t*)phar Pointer variable to PPP destination MAC register address. It should be allocated 6 bytes. + * @sa setPHAR() + */ +#define getPHAR(phar) \ + WIZCHIP_READ_BUF(PHAR, phar, 6) + +/** + * @ingroup Common_register_access_function + * @brief Set @ref PSID register + * @param (uint16_t)psid Value to set @ref PSID register. + * @sa getPSID() + */ +#define setPSID(psid) {\ + WIZCHIP_WRITE(PSID, (uint8_t)(psid >> 8)); \ + WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(PSID,1), (uint8_t) psid); \ + } + +/** + * @ingroup Common_register_access_function + * @brief Get @ref PSID register + * @return uint16_t. Value of @ref PSID register. + * @sa setPSID() + */ +//uint16_t getPSID(void); +//M20150401 : Type explict declaration +/* +#define getPSID() \ + ((WIZCHIP_READ(PSID) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(PSID,1))) +*/ +#define getPSID() \ + (((uint16_t)WIZCHIP_READ(PSID) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(PSID,1))) + +/** + * @ingroup Common_register_access_function + * @brief Set @ref PMRU register + * @param (uint16_t)pmru Value to set @ref PMRU register. + * @sa getPMRU() + */ +#define setPMRU(pmru) { \ + WIZCHIP_WRITE(PMRU, (uint8_t)(pmru>>8)); \ + WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(PMRU,1), (uint8_t) pmru); \ + } + +/** + * @ingroup Common_register_access_function + * @brief Get @ref PMRU register + * @return uint16_t. Value of @ref PMRU register. + * @sa setPMRU() + */ +//M20150401 : Type explict declaration +/* +#define getPMRU() \ + ((WIZCHIP_READ(PMRU) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(PMRU,1))) +*/ +#define getPMRU() \ + (((uint16_t)WIZCHIP_READ(PMRU) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(PMRU,1))) + +/** + * @ingroup Common_register_access_function + * @brief Get unreachable IP address + * @param (uint8_t*)uipr Pointer variable to get unreachable IP address. It should be allocated 4 bytes. + */ +//M20150401 : Size Error of UIPR (6 -> 4) +/* +#define getUIPR(uipr) \ + WIZCHIP_READ_BUF(UIPR,uipr,6) +*/ +#define getUIPR(uipr) \ + WIZCHIP_READ_BUF(UIPR,uipr,4) + +/** + * @ingroup Common_register_access_function + * @brief Get @ref UPORTR register + * @return uint16_t. Value of @ref UPORTR register. + */ +//M20150401 : Type explict declaration +/* +#define getUPORTR() \ + ((WIZCHIP_READ(UPORTR) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(UPORTR,1))) +*/ +#define getUPORTR() \ + (((uint16_t)WIZCHIP_READ(UPORTR) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(UPORTR,1))) + +/** + * @ingroup Common_register_access_function + * @brief Set @ref PHYCFGR register + * @param (uint8_t)phycfgr Value to set @ref PHYCFGR register. + * @sa getPHYCFGR() + */ +#define setPHYCFGR(phycfgr) \ + WIZCHIP_WRITE(PHYCFGR, phycfgr) + +/** + * @ingroup Common_register_access_function + * @brief Get @ref PHYCFGR register + * @return uint8_t. Value of @ref PHYCFGR register. + * @sa setPHYCFGR() + */ +#define getPHYCFGR() \ + WIZCHIP_READ(PHYCFGR) + +/** + * @ingroup Common_register_access_function + * @brief Get @ref VERSIONR register + * @return uint8_t. Value of @ref VERSIONR register. + */ +#define getVERSIONR() \ + WIZCHIP_READ(VERSIONR) + +///////////////////////////////////// + +/////////////////////////////////// +// Socket N register I/O function // +/////////////////////////////////// +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_MR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint8_t)mr Value to set @ref Sn_MR + * @sa getSn_MR() + */ +#define setSn_MR(sn, mr) \ + WIZCHIP_WRITE(Sn_MR(sn),mr) + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_MR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint8_t. Value of @ref Sn_MR. + * @sa setSn_MR() + */ +#define getSn_MR(sn) \ + WIZCHIP_READ(Sn_MR(sn)) + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_CR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint8_t)cr Value to set @ref Sn_CR + * @sa getSn_CR() + */ +#define setSn_CR(sn, cr) \ + WIZCHIP_WRITE(Sn_CR(sn), cr) + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_CR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint8_t. Value of @ref Sn_CR. + * @sa setSn_CR() + */ +#define getSn_CR(sn) \ + WIZCHIP_READ(Sn_CR(sn)) + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_IR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint8_t)ir Value to set @ref Sn_IR + * @sa getSn_IR() + */ +#define setSn_IR(sn, ir) \ + WIZCHIP_WRITE(Sn_IR(sn), (ir & 0x1F)) + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_IR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint8_t. Value of @ref Sn_IR. + * @sa setSn_IR() + */ +#define getSn_IR(sn) \ + (WIZCHIP_READ(Sn_IR(sn)) & 0x1F) + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_IMR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint8_t)imr Value to set @ref Sn_IMR + * @sa getSn_IMR() + */ +#define setSn_IMR(sn, imr) \ + WIZCHIP_WRITE(Sn_IMR(sn), (imr & 0x1F)) + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_IMR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint8_t. Value of @ref Sn_IMR. + * @sa setSn_IMR() + */ +#define getSn_IMR(sn) \ + (WIZCHIP_READ(Sn_IMR(sn)) & 0x1F) + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_SR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint8_t. Value of @ref Sn_SR. + */ +#define getSn_SR(sn) \ + WIZCHIP_READ(Sn_SR(sn)) + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_PORT register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint16_t)port Value to set @ref Sn_PORT. + * @sa getSn_PORT() + */ +#define setSn_PORT(sn, port) { \ + WIZCHIP_WRITE(Sn_PORT(sn), (uint8_t)(port >> 8)); \ + WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(Sn_PORT(sn),1), (uint8_t) port); \ + } + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_PORT register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint16_t. Value of @ref Sn_PORT. + * @sa setSn_PORT() + */ +//M20150401 : Type explict declaration +/* +#define getSn_PORT(sn) \ + ((WIZCHIP_READ(Sn_PORT(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_PORT(sn),1))) +*/ +#define getSn_PORT(sn) \ + (((uint16_t)WIZCHIP_READ(Sn_PORT(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_PORT(sn),1))) + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_DHAR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint8_t*)dhar Pointer variable to set socket n destination hardware address. It should be allocated 6 bytes. + * @sa getSn_DHAR() + */ +#define setSn_DHAR(sn, dhar) \ + WIZCHIP_WRITE_BUF(Sn_DHAR(sn), dhar, 6) + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_MR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint8_t*)dhar Pointer variable to get socket n destination hardware address. It should be allocated 6 bytes. + * @sa setSn_DHAR() + */ +#define getSn_DHAR(sn, dhar) \ + WIZCHIP_READ_BUF(Sn_DHAR(sn), dhar, 6) + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_DIPR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint8_t*)dipr Pointer variable to set socket n destination IP address. It should be allocated 4 bytes. + * @sa getSn_DIPR() + */ +#define setSn_DIPR(sn, dipr) \ + WIZCHIP_WRITE_BUF(Sn_DIPR(sn), dipr, 4) + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_DIPR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint8_t*)dipr Pointer variable to get socket n destination IP address. It should be allocated 4 bytes. + * @sa setSn_DIPR() + */ +#define getSn_DIPR(sn, dipr) \ + WIZCHIP_READ_BUF(Sn_DIPR(sn), dipr, 4) + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_DPORT register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint16_t)dport Value to set @ref Sn_DPORT + * @sa getSn_DPORT() + */ +#define setSn_DPORT(sn, dport) { \ + WIZCHIP_WRITE(Sn_DPORT(sn), (uint8_t) (dport>>8)); \ + WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(Sn_DPORT(sn),1), (uint8_t) dport); \ + } + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_DPORT register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint16_t. Value of @ref Sn_DPORT. + * @sa setSn_DPORT() + */ +//M20150401 : Type explict declaration +/* +#define getSn_DPORT(sn) \ + ((WIZCHIP_READ(Sn_DPORT(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_DPORT(sn),1))) +*/ +#define getSn_DPORT(sn) \ + (((uint16_t)WIZCHIP_READ(Sn_DPORT(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_DPORT(sn),1))) + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_MSSR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint16_t)mss Value to set @ref Sn_MSSR + * @sa setSn_MSSR() + */ +#define setSn_MSSR(sn, mss) { \ + WIZCHIP_WRITE(Sn_MSSR(sn), (uint8_t)(mss>>8)); \ + WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(Sn_MSSR(sn),1), (uint8_t) mss); \ + } + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_MSSR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint16_t. Value of @ref Sn_MSSR. + * @sa setSn_MSSR() + */ +//M20150401 : Type explict declaration +/* +#define getSn_MSSR(sn) \ + ((WIZCHIP_READ(Sn_MSSR(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_MSSR(sn),1))) +*/ +#define getSn_MSSR(sn) \ + (((uint16_t)WIZCHIP_READ(Sn_MSSR(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_MSSR(sn),1))) + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_TOS register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint8_t)tos Value to set @ref Sn_TOS + * @sa getSn_TOS() + */ +#define setSn_TOS(sn, tos) \ + WIZCHIP_WRITE(Sn_TOS(sn), tos) + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_TOS register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint8_t. Value of Sn_TOS. + * @sa setSn_TOS() + */ +#define getSn_TOS(sn) \ + WIZCHIP_READ(Sn_TOS(sn)) + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_TTL register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint8_t)ttl Value to set @ref Sn_TTL + * @sa getSn_TTL() + */ +#define setSn_TTL(sn, ttl) \ + WIZCHIP_WRITE(Sn_TTL(sn), ttl) + + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_TTL register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint8_t. Value of @ref Sn_TTL. + * @sa setSn_TTL() + */ +#define getSn_TTL(sn) \ + WIZCHIP_READ(Sn_TTL(sn)) + + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_RXBUF_SIZE register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint8_t)rxbufsize Value to set @ref Sn_RXBUF_SIZE + * @sa getSn_RXBUF_SIZE() + */ +#define setSn_RXBUF_SIZE(sn, rxbufsize) \ + WIZCHIP_WRITE(Sn_RXBUF_SIZE(sn),rxbufsize) + + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_RXBUF_SIZE register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint8_t. Value of @ref Sn_RXBUF_SIZE. + * @sa setSn_RXBUF_SIZE() + */ +#define getSn_RXBUF_SIZE(sn) \ + WIZCHIP_READ(Sn_RXBUF_SIZE(sn)) + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_TXBUF_SIZE register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint8_t)txbufsize Value to set @ref Sn_TXBUF_SIZE + * @sa getSn_TXBUF_SIZE() + */ +#define setSn_TXBUF_SIZE(sn, txbufsize) \ + WIZCHIP_WRITE(Sn_TXBUF_SIZE(sn), txbufsize) + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_TXBUF_SIZE register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint8_t. Value of @ref Sn_TXBUF_SIZE. + * @sa setSn_TXBUF_SIZE() + */ +#define getSn_TXBUF_SIZE(sn) \ + WIZCHIP_READ(Sn_TXBUF_SIZE(sn)) + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_TX_FSR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint16_t. Value of @ref Sn_TX_FSR. + */ +uint16_t getSn_TX_FSR(uint8_t sn); + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_TX_RD register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint16_t. Value of @ref Sn_TX_RD. + */ +//M20150401 : Type explict declaration +/* +#define getSn_TX_RD(sn) \ + ((WIZCHIP_READ(Sn_TX_RD(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_RD(sn),1))) +*/ +#define getSn_TX_RD(sn) \ + (((uint16_t)WIZCHIP_READ(Sn_TX_RD(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_RD(sn),1))) + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_TX_WR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint16_t)txwr Value to set @ref Sn_TX_WR + * @sa GetSn_TX_WR() + */ +#define setSn_TX_WR(sn, txwr) { \ + WIZCHIP_WRITE(Sn_TX_WR(sn), (uint8_t)(txwr>>8)); \ + WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(Sn_TX_WR(sn),1), (uint8_t) txwr); \ + } + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_TX_WR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint16_t. Value of @ref Sn_TX_WR. + * @sa setSn_TX_WR() + */ +//M20150401 : Type explict declaration +/* +#define getSn_TX_WR(sn) \ + ((WIZCHIP_READ(Sn_TX_WR(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_WR(sn),1))) +*/ +#define getSn_TX_WR(sn) \ + (((uint16_t)WIZCHIP_READ(Sn_TX_WR(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_WR(sn),1))) + + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_RX_RSR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint16_t. Value of @ref Sn_RX_RSR. + */ +uint16_t getSn_RX_RSR(uint8_t sn); + + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_RX_RD register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint16_t)rxrd Value to set @ref Sn_RX_RD + * @sa getSn_RX_RD() + */ +#define setSn_RX_RD(sn, rxrd) { \ + WIZCHIP_WRITE(Sn_RX_RD(sn), (uint8_t)(rxrd>>8)); \ + WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(Sn_RX_RD(sn),1), (uint8_t) rxrd); \ + } + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_RX_RD register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint16_t. Value of @ref Sn_RX_RD. + * @sa setSn_RX_RD() + */ +//M20150401 : Type explict declaration +/* +#define getSn_RX_RD(sn) \ + ((WIZCHIP_READ(Sn_RX_RD(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RD(sn),1))) +*/ +#define getSn_RX_RD(sn) \ + (((uint16_t)WIZCHIP_READ(Sn_RX_RD(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RD(sn),1))) + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_RX_WR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint16_t. Value of @ref Sn_RX_WR. + */ +//M20150401 : Type explict declaration +/* +#define getSn_RX_WR(sn) \ + ((WIZCHIP_READ(Sn_RX_WR(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_WR(sn),1))) +*/ +#define getSn_RX_WR(sn) \ + (((uint16_t)WIZCHIP_READ(Sn_RX_WR(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_WR(sn),1))) + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_FRAG register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint16_t)frag Value to set @ref Sn_FRAG + * @sa getSn_FRAD() + */ +#define setSn_FRAG(sn, frag) { \ + WIZCHIP_WRITE(Sn_FRAG(sn), (uint8_t)(frag >>8)); \ + WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(Sn_FRAG(sn),1), (uint8_t) frag); \ + } + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_FRAG register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint16_t. Value of @ref Sn_FRAG. + * @sa setSn_FRAG() + */ +//M20150401 : Type explict declaration +/* +#define getSn_FRAG(sn) \ + ((WIZCHIP_READ(Sn_FRAG(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_FRAG(sn),1))) +*/ +#define getSn_FRAG(sn) \ + (((uint16_t)WIZCHIP_READ(Sn_FRAG(sn)) << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_FRAG(sn),1))) + +/** + * @ingroup Socket_register_access_function + * @brief Set @ref Sn_KPALVTR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param (uint8_t)kpalvt Value to set @ref Sn_KPALVTR + * @sa getSn_KPALVTR() + */ +#define setSn_KPALVTR(sn, kpalvt) \ + WIZCHIP_WRITE(Sn_KPALVTR(sn), kpalvt) + +/** + * @ingroup Socket_register_access_function + * @brief Get @ref Sn_KPALVTR register + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint8_t. Value of @ref Sn_KPALVTR. + * @sa setSn_KPALVTR() + */ +#define getSn_KPALVTR(sn) \ + WIZCHIP_READ(Sn_KPALVTR(sn)) + +////////////////////////////////////// + +///////////////////////////////////// +// Sn_TXBUF & Sn_RXBUF IO function // +///////////////////////////////////// +/** + * @brief Socket_register_access_function + * @brief Gets the max buffer size of socket sn passed as parameter. + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint16_t. Value of Socket n RX max buffer size. + */ +//M20150401 : Type explict declaration +/* +#define getSn_RxMAX(sn) \ + (getSn_RXBUF_SIZE(sn) << 10) +*/ +#define getSn_RxMAX(sn) \ + (((uint16_t)getSn_RXBUF_SIZE(sn)) << 10) + +/** + * @brief Socket_register_access_function + * @brief Gets the max buffer size of socket sn passed as parameters. + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @return uint16_t. Value of Socket n TX max buffer size. + */ +//M20150401 : Type explict declaration +/* +#define getSn_TxMAX(sn) \ + (getSn_TXBUF_SIZE(sn) << 10) +*/ +#define getSn_TxMAX(sn) \ + (((uint16_t)getSn_TXBUF_SIZE(sn)) << 10) + +/** + * @ingroup Basic_IO_function + * @brief It copies data to internal TX memory + * + * @details This function reads the Tx write pointer register and after that, + * it copies the wizdata(pointer buffer) of the length of len(variable) bytes to internal TX memory + * and updates the Tx write pointer register. + * This function is being called by send() and sendto() function also. + * + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param wizdata Pointer buffer to write data + * @param len Data length + * @sa wiz_recv_data() + */ +void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len); + +/** + * @ingroup Basic_IO_function + * @brief It copies data to your buffer from internal RX memory + * + * @details This function read the Rx read pointer register and after that, + * it copies the received data from internal RX memory + * to wizdata(pointer variable) of the length of len(variable) bytes. + * This function is being called by recv() also. + * + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param wizdata Pointer buffer to read data + * @param len Data length + * @sa wiz_send_data() + */ +void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len); + +/** + * @ingroup Basic_IO_function + * @brief It discard the received data in RX memory. + * @details It discards the data of the length of len(variable) bytes in internal RX memory. + * @param (uint8_t)sn Socket number. It should be 0 ~ 7. + * @param len Data length + */ +void wiz_recv_ignore(uint8_t sn, uint16_t len); + +/// @cond DOXY_APPLY_CODE +#endif +/// @endcond + +#ifdef __cplusplus +} +#endif + +#endif // _W5500_H_ diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/socket.c b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/socket.c new file mode 100644 index 0000000..961d9a4 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/socket.c @@ -0,0 +1,930 @@ +//***************************************************************************** +// +//! \file socket.c +//! \brief SOCKET APIs Implements file. +//! \details SOCKET APIs like as Berkeley Socket APIs. +//! \version 1.0.3 +//! \date 2013/10/21 +//! \par Revision history +//! <2015/02/05> Notice +//! The version history is not updated after this point. +//! Download the latest version directly from GitHub. Please visit the our GitHub repository for ioLibrary. +//! >> https://github.com/Wiznet/ioLibrary_Driver +//! <2014/05/01> V1.0.3. Refer to M20140501 +//! 1. Implicit type casting -> Explicit type casting. +//! 2. replace 0x01 with PACK_REMAINED in recvfrom() +//! 3. Validation a destination ip in connect() & sendto(): +//! It occurs a fatal error on converting unint32 address if uint8* addr parameter is not aligned by 4byte address. +//! Copy 4 byte addr value into temporary uint32 variable and then compares it. +//! <2013/12/20> V1.0.2 Refer to M20131220 +//! Remove Warning. +//! <2013/11/04> V1.0.1 2nd Release. Refer to "20131104". +//! In sendto(), Add to clear timeout interrupt status (Sn_IR_TIMEOUT) +//! <2013/10/21> 1st Release +//! \author MidnightCow +//! \copyright +//! +//! Copyright (c) 2013, WIZnet Co., LTD. +//! All rights reserved. +//! +//! Redistribution and use in source and binary forms, with or without +//! modification, are permitted provided that the following conditions +//! are met: +//! +//! * Redistributions of source code must retain the above copyright +//! notice, this list of conditions and the following disclaimer. +//! * Redistributions in binary form must reproduce the above copyright +//! notice, this list of conditions and the following disclaimer in the +//! documentation and/or other materials provided with the distribution. +//! * Neither the name of the nor the names of its +//! contributors may be used to endorse or promote products derived +//! from this software without specific prior written permission. +//! +//! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +//! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +//! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +//! THE POSSIBILITY OF SUCH DAMAGE. +// +//***************************************************************************** +#include "socket.h" + +//M20150401 : Typing Error +//#define SOCK_ANY_PORT_NUM 0xC000; +#define SOCK_ANY_PORT_NUM 0xC000 + +static uint16_t sock_any_port = SOCK_ANY_PORT_NUM; +static uint16_t sock_io_mode = 0; +static uint16_t sock_is_sending = 0; + +static uint16_t sock_remained_size[_WIZCHIP_SOCK_NUM_] = {0,0,}; + +//M20150601 : For extern decleation +//static uint8_t sock_pack_info[_WIZCHIP_SOCK_NUM_] = {0,}; +uint8_t sock_pack_info[_WIZCHIP_SOCK_NUM_] = {0,}; +// + +#if _WIZCHIP_ == 5200 + static uint16_t sock_next_rd[_WIZCHIP_SOCK_NUM_] ={0,}; +#endif + +//A20150601 : For integrating with W5300 +#if _WIZCHIP_ == 5300 + uint8_t sock_remained_byte[_WIZCHIP_SOCK_NUM_] = {0,}; // set by wiz_recv_data() +#endif + + +#define CHECK_SOCKNUM() \ + do{ \ + if(sn > _WIZCHIP_SOCK_NUM_) return SOCKERR_SOCKNUM; \ + }while(0); \ + +#define CHECK_SOCKMODE(mode) \ + do{ \ + if((getSn_MR(sn) & 0x0F) != mode) return SOCKERR_SOCKMODE; \ + }while(0); \ + +#define CHECK_SOCKINIT() \ + do{ \ + if((getSn_SR(sn) != SOCK_INIT)) return SOCKERR_SOCKINIT; \ + }while(0); \ + +#define CHECK_SOCKDATA() \ + do{ \ + if(len == 0) return SOCKERR_DATALEN; \ + }while(0); \ + + + +int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag) +{ + CHECK_SOCKNUM(); + switch(protocol) + { + case Sn_MR_TCP : + { + //M20150601 : Fixed the warning - taddr will never be NULL + /* + uint8_t taddr[4]; + getSIPR(taddr); + */ + uint32_t taddr; + getSIPR((uint8_t*)&taddr); + if(taddr == 0) return SOCKERR_SOCKINIT; + } + case Sn_MR_UDP : + case Sn_MR_MACRAW : + case Sn_MR_IPRAW : + break; + #if ( _WIZCHIP_ < 5200 ) + case Sn_MR_PPPoE : + break; + #endif + default : + return SOCKERR_SOCKMODE; + } + //M20150601 : For SF_TCP_ALIGN & W5300 + //if((flag & 0x06) != 0) return SOCKERR_SOCKFLAG; + if((flag & 0x04) != 0) return SOCKERR_SOCKFLAG; +#if _WIZCHIP_ == 5200 + if(flag & 0x10) return SOCKERR_SOCKFLAG; +#endif + + if(flag != 0) + { + switch(protocol) + { + case Sn_MR_TCP: + //M20150601 : For SF_TCP_ALIGN & W5300 + #if _WIZCHIP_ == 5300 + if((flag & (SF_TCP_NODELAY|SF_IO_NONBLOCK|SF_TCP_ALIGN))==0) return SOCKERR_SOCKFLAG; + #else + if((flag & (SF_TCP_NODELAY|SF_IO_NONBLOCK))==0) return SOCKERR_SOCKFLAG; + #endif + + break; + case Sn_MR_UDP: + if(flag & SF_IGMP_VER2) + { + if((flag & SF_MULTI_ENABLE)==0) return SOCKERR_SOCKFLAG; + } + #if _WIZCHIP_ == 5500 + if(flag & SF_UNI_BLOCK) + { + if((flag & SF_MULTI_ENABLE) == 0) return SOCKERR_SOCKFLAG; + } + #endif + break; + default: + break; + } + } + close(sn); + //M20150601 + #if _WIZCHIP_ == 5300 + setSn_MR(sn, ((uint16_t)(protocol | (flag & 0xF0))) | (((uint16_t)(flag & 0x02)) << 7) ); + #else + setSn_MR(sn, (protocol | (flag & 0xF0))); + #endif + if(!port) + { + port = sock_any_port++; + if(sock_any_port == 0xFFF0) sock_any_port = SOCK_ANY_PORT_NUM; + } + setSn_PORT(sn,port); + setSn_CR(sn,Sn_CR_OPEN); + while(getSn_CR(sn)); + //A20150401 : For release the previous sock_io_mode + sock_io_mode &= ~(1 < sn + //if( ((getSn_MR(s)& 0x0F) == Sn_MR_TCP) && (getSn_TX_FSR(s) != getSn_TxMAX(s)) ) + if( ((getSn_MR(sn)& 0x0F) == Sn_MR_TCP) && (getSn_TX_FSR(sn) != getSn_TxMAX(sn)) ) + { + uint8_t destip[4] = {0, 0, 0, 1}; + // TODO + // You can wait for completing to sending data; + // wait about 1 second; + // if you have completed to send data, skip the code of erratum 1 + // ex> wait_1s(); + // if (getSn_TX_FSR(s) == getSn_TxMAX(s)) continue; + // + //M20160503 : The socket() of close() calls close() itself again. It occures a infinite loop - close()->socket()->close()->socket()-> ~ + //socket(s,Sn_MR_UDP,0x3000,0); + //sendto(s,destip,1,destip,0x3000); // send the dummy data to an unknown destination(0.0.0.1). + setSn_MR(sn,Sn_MR_UDP); + setSn_PORTR(sn, 0x3000); + setSn_CR(sn,Sn_CR_OPEN); + while(getSn_CR(sn) != 0); + while(getSn_SR(sn) != SOCK_UDP); + sendto(sn,destip,1,destip,0x3000); // send the dummy data to an unknown destination(0.0.0.1). + }; +#endif + setSn_CR(sn,Sn_CR_CLOSE); + /* wait to process the command... */ + while( getSn_CR(sn) ); + /* clear all interrupt of the socket. */ + setSn_IR(sn, 0xFF); + //A20150401 : Release the sock_io_mode of socket n. + sock_io_mode &= ~(1< freesize) len = freesize; // check size not to exceed MAX size. + while(1) + { + freesize = getSn_TX_FSR(sn); + tmp = getSn_SR(sn); + if ((tmp != SOCK_ESTABLISHED) && (tmp != SOCK_CLOSE_WAIT)) + { + close(sn); + return SOCKERR_SOCKSTATUS; + } + if( (sock_io_mode & (1< freesize) ) return SOCK_BUSY; + if(len <= freesize) break; + } + wiz_send_data(sn, buf, len); + #if _WIZCHIP_ == 5200 + sock_next_rd[sn] = getSn_TX_RD(sn) + len; + #endif + + #if _WIZCHIP_ == 5300 + setSn_TX_WRSR(sn,len); + #endif + + setSn_CR(sn,Sn_CR_SEND); + /* wait to process the command... */ + while(getSn_CR(sn)); + sock_is_sending |= (1 << sn); + //M20150409 : Explicit Type Casting + //return len; + return (int32_t)len; +} + + +int32_t recv(uint8_t sn, uint8_t * buf, uint16_t len) +{ + uint8_t tmp = 0; + uint16_t recvsize = 0; +//A20150601 : For integarating with W5300 +#if _WIZCHIP_ == 5300 + uint8_t head[2]; + uint16_t mr; +#endif +// + CHECK_SOCKNUM(); + CHECK_SOCKMODE(Sn_MR_TCP); + CHECK_SOCKDATA(); + + recvsize = getSn_RxMAX(sn); + if(recvsize < len) len = recvsize; + +//A20150601 : For Integrating with W5300 +#if _WIZCHIP_ == 5300 + //sock_pack_info[sn] = PACK_COMPLETED; // for clear + if(sock_remained_size[sn] == 0) + { +#endif +// + while(1) + { + recvsize = getSn_RX_RSR(sn); + tmp = getSn_SR(sn); + if (tmp != SOCK_ESTABLISHED) + { + if(tmp == SOCK_CLOSE_WAIT) + { + if(recvsize != 0) break; + else if(getSn_TX_FSR(sn) == getSn_TxMAX(sn)) + { + close(sn); + return SOCKERR_SOCKSTATUS; + } + } + else + { + close(sn); + return SOCKERR_SOCKSTATUS; + } + } + if((sock_io_mode & (1< sock_remained_size[sn]) len = sock_remained_size[sn]; + recvsize = len; + if(sock_pack_info[sn] & PACK_FIFOBYTE) + { + *buf = sock_remained_byte[sn]; + buf++; + sock_pack_info[sn] &= ~(PACK_FIFOBYTE); + recvsize -= 1; + sock_remained_size[sn] -= 1; + } + if(recvsize != 0) + { + wiz_recv_data(sn, buf, recvsize); + setSn_CR(sn,Sn_CR_RECV); + while(getSn_CR(sn)); + } + sock_remained_size[sn] -= recvsize; + if(sock_remained_size[sn] != 0) + { + sock_pack_info[sn] |= PACK_REMAINED; + if(recvsize & 0x1) sock_pack_info[sn] |= PACK_FIFOBYTE; + } + else sock_pack_info[sn] = PACK_COMPLETED; + if(getSn_MR(sn) & Sn_MR_ALIGN) sock_remained_size[sn] = 0; + //len = recvsize; +#else + if(recvsize < len) len = recvsize; + wiz_recv_data(sn, buf, len); + setSn_CR(sn,Sn_CR_RECV); + while(getSn_CR(sn)); +#endif + + //M20150409 : Explicit Type Casting + //return len; + return (int32_t)len; +} + +int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port) +{ + uint8_t tmp = 0; + uint16_t freesize = 0; + uint32_t taddr; + + CHECK_SOCKNUM(); + switch(getSn_MR(sn) & 0x0F) + { + case Sn_MR_UDP: + case Sn_MR_MACRAW: +// break; +// #if ( _WIZCHIP_ < 5200 ) + case Sn_MR_IPRAW: + break; +// #endif + default: + return SOCKERR_SOCKMODE; + } + CHECK_SOCKDATA(); + //M20140501 : For avoiding fatal error on memory align mismatched + //if(*((uint32_t*)addr) == 0) return SOCKERR_IPINVALID; + //{ + //uint32_t taddr; + taddr = ((uint32_t)addr[0]) & 0x000000FF; + taddr = (taddr << 8) + ((uint32_t)addr[1] & 0x000000FF); + taddr = (taddr << 8) + ((uint32_t)addr[2] & 0x000000FF); + taddr = (taddr << 8) + ((uint32_t)addr[3] & 0x000000FF); + //} + // + //if(*((uint32_t*)addr) == 0) return SOCKERR_IPINVALID; + if((taddr == 0) && ((getSn_MR(sn)&Sn_MR_MACRAW) != Sn_MR_MACRAW)) return SOCKERR_IPINVALID; + if((port == 0) && ((getSn_MR(sn)&Sn_MR_MACRAW) != Sn_MR_MACRAW)) return SOCKERR_PORTZERO; + tmp = getSn_SR(sn); +//#if ( _WIZCHIP_ < 5200 ) + if((tmp != SOCK_MACRAW) && (tmp != SOCK_UDP) && (tmp != SOCK_IPRAW)) return SOCKERR_SOCKSTATUS; +//#else +// if(tmp != SOCK_MACRAW && tmp != SOCK_UDP) return SOCKERR_SOCKSTATUS; +//#endif + + setSn_DIPR(sn,addr); + setSn_DPORT(sn,port); + freesize = getSn_TxMAX(sn); + if (len > freesize) len = freesize; // check size not to exceed MAX size. + while(1) + { + freesize = getSn_TX_FSR(sn); + if(getSn_SR(sn) == SOCK_CLOSED) return SOCKERR_SOCKCLOSED; + if( (sock_io_mode & (1< freesize) ) return SOCK_BUSY; + if(len <= freesize) break; + }; + wiz_send_data(sn, buf, len); + + #if _WIZCHIP_ < 5500 //M20150401 : for WIZCHIP Errata #4, #5 (ARP errata) + getSIPR((uint8_t*)&taddr); + if(taddr == 0) + { + getSUBR((uint8_t*)&taddr); + setSUBR((uint8_t*)"\x00\x00\x00\x00"); + } + else taddr = 0; + #endif + +//A20150601 : For W5300 +#if _WIZCHIP_ == 5300 + setSn_TX_WRSR(sn, len); +#endif +// + setSn_CR(sn,Sn_CR_SEND); + /* wait to process the command... */ + while(getSn_CR(sn)); + while(1) + { + tmp = getSn_IR(sn); + if(tmp & Sn_IR_SENDOK) + { + setSn_IR(sn, Sn_IR_SENDOK); + break; + } + //M:20131104 + //else if(tmp & Sn_IR_TIMEOUT) return SOCKERR_TIMEOUT; + else if(tmp & Sn_IR_TIMEOUT) + { + setSn_IR(sn, Sn_IR_TIMEOUT); + //M20150409 : Fixed the lost of sign bits by type casting. + //len = (uint16_t)SOCKERR_TIMEOUT; + //break; + #if _WIZCHIP_ < 5500 //M20150401 : for WIZCHIP Errata #4, #5 (ARP errata) + if(taddr) setSUBR((uint8_t*)&taddr); + #endif + return SOCKERR_TIMEOUT; + } + //////////// + } + #if _WIZCHIP_ < 5500 //M20150401 : for WIZCHIP Errata #4, #5 (ARP errata) + if(taddr) setSUBR((uint8_t*)&taddr); + #endif + //M20150409 : Explicit Type Casting + //return len; + return (int32_t)len; +} + + + +int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port) +{ +//M20150601 : For W5300 +#if _WIZCHIP_ == 5300 + uint16_t mr; + uint16_t mr1; +#else + uint8_t mr; +#endif +// + uint8_t head[8]; + uint16_t pack_len=0; + + CHECK_SOCKNUM(); + //CHECK_SOCKMODE(Sn_MR_UDP); +//A20150601 +#if _WIZCHIP_ == 5300 + mr1 = getMR(); +#endif + + switch((mr=getSn_MR(sn)) & 0x0F) + { + case Sn_MR_UDP: + case Sn_MR_IPRAW: + case Sn_MR_MACRAW: + break; + #if ( _WIZCHIP_ < 5200 ) + case Sn_MR_PPPoE: + break; + #endif + default: + return SOCKERR_SOCKMODE; + } + CHECK_SOCKDATA(); + if(sock_remained_size[sn] == 0) + { + while(1) + { + pack_len = getSn_RX_RSR(sn); + if(getSn_SR(sn) == SOCK_CLOSED) return SOCKERR_SOCKCLOSED; + if( (sock_io_mode & (1< 1514) + { + close(sn); + return SOCKFATAL_PACKLEN; + } + sock_pack_info[sn] = PACK_FIRST; + } + if(len < sock_remained_size[sn]) pack_len = len; + else pack_len = sock_remained_size[sn]; + wiz_recv_data(sn,buf,pack_len); + break; + //#if ( _WIZCHIP_ < 5200 ) + case Sn_MR_IPRAW: + if(sock_remained_size[sn] == 0) + { + wiz_recv_data(sn, head, 6); + setSn_CR(sn,Sn_CR_RECV); + while(getSn_CR(sn)); + addr[0] = head[0]; + addr[1] = head[1]; + addr[2] = head[2]; + addr[3] = head[3]; + sock_remained_size[sn] = head[4]; + //M20150401 : For Typing Error + //sock_remaiend_size[sn] = (sock_remained_size[sn] << 8) + head[5]; + sock_remained_size[sn] = (sock_remained_size[sn] << 8) + head[5]; + sock_pack_info[sn] = PACK_FIRST; + } + // + // Need to packet length check + // + if(len < sock_remained_size[sn]) pack_len = len; + else pack_len = sock_remained_size[sn]; + wiz_recv_data(sn, buf, pack_len); // data copy. + break; + //#endif + default: + wiz_recv_ignore(sn, pack_len); // data copy. + sock_remained_size[sn] = pack_len; + break; + } + setSn_CR(sn,Sn_CR_RECV); + /* wait to process the command... */ + while(getSn_CR(sn)) ; + sock_remained_size[sn] -= pack_len; + //M20150601 : + //if(sock_remained_size[sn] != 0) sock_pack_info[sn] |= 0x01; + if(sock_remained_size[sn] != 0) + { + sock_pack_info[sn] |= PACK_REMAINED; + #if _WIZCHIP_ == 5300 + if(pack_len & 0x01) sock_pack_info[sn] |= PACK_FIFOBYTE; + #endif + } + else sock_pack_info[sn] = PACK_COMPLETED; +#if _WIZCHIP_ == 5300 + pack_len = len; +#endif + // + //M20150409 : Explicit Type Casting + //return pack_len; + return (int32_t)pack_len; +} + + +int8_t ctlsocket(uint8_t sn, ctlsock_type cstype, void* arg) +{ + uint8_t tmp = 0; + CHECK_SOCKNUM(); + switch(cstype) + { + case CS_SET_IOMODE: + tmp = *((uint8_t*)arg); + if(tmp == SOCK_IO_NONBLOCK) sock_io_mode |= (1< explict type casting + //*((uint8_t*)arg) = (sock_io_mode >> sn) & 0x0001; + *((uint8_t*)arg) = (uint8_t)((sock_io_mode >> sn) & 0x0001); + // + break; + case CS_GET_MAXTXBUF: + *((uint16_t*)arg) = getSn_TxMAX(sn); + break; + case CS_GET_MAXRXBUF: + *((uint16_t*)arg) = getSn_RxMAX(sn); + break; + case CS_CLR_INTERRUPT: + if( (*(uint8_t*)arg) > SIK_ALL) return SOCKERR_ARG; + setSn_IR(sn,*(uint8_t*)arg); + break; + case CS_GET_INTERRUPT: + *((uint8_t*)arg) = getSn_IR(sn); + break; + #if _WIZCHIP_ != 5100 + case CS_SET_INTMASK: + if( (*(uint8_t*)arg) > SIK_ALL) return SOCKERR_ARG; + setSn_IMR(sn,*(uint8_t*)arg); + break; + case CS_GET_INTMASK: + *((uint8_t*)arg) = getSn_IMR(sn); + break; + #endif + default: + return SOCKERR_ARG; + } + return SOCK_OK; +} + +int8_t setsockopt(uint8_t sn, sockopt_type sotype, void* arg) +{ + // M20131220 : Remove warning + //uint8_t tmp; + CHECK_SOCKNUM(); + switch(sotype) + { + case SO_TTL: + setSn_TTL(sn,*(uint8_t*)arg); + break; + case SO_TOS: + setSn_TOS(sn,*(uint8_t*)arg); + break; + case SO_MSS: + setSn_MSSR(sn,*(uint16_t*)arg); + break; + case SO_DESTIP: + setSn_DIPR(sn, (uint8_t*)arg); + break; + case SO_DESTPORT: + setSn_DPORT(sn, *(uint16_t*)arg); + break; +#if _WIZCHIP_ != 5100 + case SO_KEEPALIVESEND: + CHECK_SOCKMODE(Sn_MR_TCP); + #if _WIZCHIP_ > 5200 + if(getSn_KPALVTR(sn) != 0) return SOCKERR_SOCKOPT; + #endif + setSn_CR(sn,Sn_CR_SEND_KEEP); + while(getSn_CR(sn) != 0) + { + // M20131220 + //if ((tmp = getSn_IR(sn)) & Sn_IR_TIMEOUT) + if (getSn_IR(sn) & Sn_IR_TIMEOUT) + { + setSn_IR(sn, Sn_IR_TIMEOUT); + return SOCKERR_TIMEOUT; + } + } + break; + #if _WIZCHIP_ > 5200 + case SO_KEEPALIVEAUTO: + CHECK_SOCKMODE(Sn_MR_TCP); + setSn_KPALVTR(sn,*(uint8_t*)arg); + break; + #endif +#endif + default: + return SOCKERR_ARG; + } + return SOCK_OK; +} + +int8_t getsockopt(uint8_t sn, sockopt_type sotype, void* arg) +{ + CHECK_SOCKNUM(); + switch(sotype) + { + case SO_FLAG: + *(uint8_t*)arg = getSn_MR(sn) & 0xF0; + break; + case SO_TTL: + *(uint8_t*) arg = getSn_TTL(sn); + break; + case SO_TOS: + *(uint8_t*) arg = getSn_TOS(sn); + break; + case SO_MSS: + *(uint16_t*) arg = getSn_MSSR(sn); + break; + case SO_DESTIP: + getSn_DIPR(sn, (uint8_t*)arg); + break; + case SO_DESTPORT: + *(uint16_t*) arg = getSn_DPORT(sn); + break; + #if _WIZCHIP_ > 5200 + case SO_KEEPALIVEAUTO: + CHECK_SOCKMODE(Sn_MR_TCP); + *(uint16_t*) arg = getSn_KPALVTR(sn); + break; + #endif + case SO_SENDBUF: + *(uint16_t*) arg = getSn_TX_FSR(sn); + break; + case SO_RECVBUF: + *(uint16_t*) arg = getSn_RX_RSR(sn); + break; + case SO_STATUS: + *(uint8_t*) arg = getSn_SR(sn); + break; + case SO_REMAINSIZE: + if(getSn_MR(sn) & Sn_MR_TCP) + *(uint16_t*)arg = getSn_RX_RSR(sn); + else + *(uint16_t*)arg = sock_remained_size[sn]; + break; + case SO_PACKINFO: + //CHECK_SOCKMODE(Sn_MR_TCP); +#if _WIZCHIP_ != 5300 + if((getSn_MR(sn) == Sn_MR_TCP)) + return SOCKERR_SOCKMODE; +#endif + *(uint8_t*)arg = sock_pack_info[sn]; + break; + default: + return SOCKERR_SOCKOPT; + } + return SOCK_OK; +} diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/socket.h b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/socket.h new file mode 100644 index 0000000..7d703ba --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/socket.h @@ -0,0 +1,489 @@ +//***************************************************************************** +// +//! \file socket.h +//! \brief SOCKET APIs Header file. +//! \details SOCKET APIs like as berkeley socket api. +//! \version 1.0.2 +//! \date 2013/10/21 +//! \par Revision history +//! <2015/02/05> Notice +//! The version history is not updated after this point. +//! Download the latest version directly from GitHub. Please visit the our GitHub repository for ioLibrary. +//! >> https://github.com/Wiznet/ioLibrary_Driver +//! <2014/05/01> V1.0.2. Refer to M20140501 +//! 1. Modify the comment : SO_REMAINED -> PACK_REMAINED +//! 2. Add the comment as zero byte udp data reception in getsockopt(). +//! <2013/10/21> 1st Release +//! \author MidnightCow +//! \copyright +//! +//! Copyright (c) 2013, WIZnet Co., LTD. +//! All rights reserved. +//! +//! Redistribution and use in source and binary forms, with or without +//! modification, are permitted provided that the following conditions +//! are met: +//! +//! * Redistributions of source code must retain the above copyright +//! notice, this list of conditions and the following disclaimer. +//! * Redistributions in binary form must reproduce the above copyright +//! notice, this list of conditions and the following disclaimer in the +//! documentation and/or other materials provided with the distribution. +//! * Neither the name of the nor the names of its +//! contributors may be used to endorse or promote products derived +//! from this software without specific prior written permission. +//! +//! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +//! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +//! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +//! THE POSSIBILITY OF SUCH DAMAGE. +// +//***************************************************************************** +/** + * @defgroup WIZnet_socket_APIs 1. WIZnet socket APIs + * @brief WIZnet socket APIs are based on Berkeley socket APIs, thus it has much similar name and interface. + * But there is a little bit of difference. + * @details + * Comparison between WIZnet and Berkeley SOCKET APIs + * + * + * + * + * + * + * + * + * + * + * + * + *
API WIZnet Berkeley
socket() O O
bind() X O
listen() O O
connect() O O
accept() X O
recv() O O
send() O O
recvfrom() O O
sendto() O O
closesocket() O
close() & disconnect()
O
+ * There are @b bind() and @b accept() functions in @b Berkeley SOCKET API but, + * not in @b WIZnet SOCKET API. Because socket() of WIZnet is not only creating a SOCKET but also binding a local port number, + * and listen() of WIZnet is not only listening to connection request from client but also accepting the connection request. \n + * When you program "TCP SERVER" with Berkeley SOCKET API, you can use only one listen port. + * When the listen SOCKET accepts a connection request from a client, it keeps listening. + * After accepting the connection request, a new SOCKET is created and the new SOCKET is used in communication with the client. \n + * Following figure shows network flow diagram by Berkeley SOCKET API. + * @image html Berkeley_SOCKET.jpg "" + * But, When you program "TCP SERVER" with WIZnet SOCKET API, you can use as many as 8 listen SOCKET with same port number. \n + * Because there's no accept() in WIZnet SOCKET APIs, when the listen SOCKET accepts a connection request from a client, + * it is changed in order to communicate with the client. + * And the changed SOCKET is not listening any more and is dedicated for communicating with the client. \n + * If there're many listen SOCKET with same listen port number and a client requests a connection, + * the SOCKET which has the smallest SOCKET number accepts the request and is changed as communication SOCKET. \n + * Following figure shows network flow diagram by WIZnet SOCKET API. + * @image html WIZnet_SOCKET.jpg "" + */ +#ifndef _SOCKET_H_ +#define _SOCKET_H_ +#ifdef __cplusplus + extern "C" { +#endif + +#include "wizchip_conf.h" + +#define SOCKET uint8_t ///< SOCKET type define for legacy driver + +#define SOCK_OK 1 ///< Result is OK about socket process. +#define SOCK_BUSY 0 ///< Socket is busy on processing the operation. Valid only Non-block IO Mode. +#define SOCK_FATAL -1000 ///< Result is fatal error about socket process. + +#define SOCK_ERROR 0 +#define SOCKERR_SOCKNUM (SOCK_ERROR - 1) ///< Invalid socket number +#define SOCKERR_SOCKOPT (SOCK_ERROR - 2) ///< Invalid socket option +#define SOCKERR_SOCKINIT (SOCK_ERROR - 3) ///< Socket is not initialized or SIPR is Zero IP address when Sn_MR_TCP +#define SOCKERR_SOCKCLOSED (SOCK_ERROR - 4) ///< Socket unexpectedly closed. +#define SOCKERR_SOCKMODE (SOCK_ERROR - 5) ///< Invalid socket mode for socket operation. +#define SOCKERR_SOCKFLAG (SOCK_ERROR - 6) ///< Invalid socket flag +#define SOCKERR_SOCKSTATUS (SOCK_ERROR - 7) ///< Invalid socket status for socket operation. +#define SOCKERR_ARG (SOCK_ERROR - 10) ///< Invalid argument. +#define SOCKERR_PORTZERO (SOCK_ERROR - 11) ///< Port number is zero +#define SOCKERR_IPINVALID (SOCK_ERROR - 12) ///< Invalid IP address +#define SOCKERR_TIMEOUT (SOCK_ERROR - 13) ///< Timeout occurred +#define SOCKERR_DATALEN (SOCK_ERROR - 14) ///< Data length is zero or greater than buffer max size. +#define SOCKERR_BUFFER (SOCK_ERROR - 15) ///< Socket buffer is not enough for data communication. + +#define SOCKFATAL_PACKLEN (SOCK_FATAL - 1) ///< Invalid packet length. Fatal Error. + +/* + * SOCKET FLAG + */ +#define SF_ETHER_OWN (Sn_MR_MFEN) ///< In @ref Sn_MR_MACRAW, Receive only the packet as broadcast, multicast and own packet +#define SF_IGMP_VER2 (Sn_MR_MC) ///< In @ref Sn_MR_UDP with \ref SF_MULTI_ENABLE, Select IGMP version 2. +#define SF_TCP_NODELAY (Sn_MR_ND) ///< In @ref Sn_MR_TCP, Use to nodelayed ack. +#define SF_MULTI_ENABLE (Sn_MR_MULTI) ///< In @ref Sn_MR_UDP, Enable multicast mode. + +#if _WIZCHIP_ == 5500 + #define SF_BROAD_BLOCK (Sn_MR_BCASTB) ///< In @ref Sn_MR_UDP or @ref Sn_MR_MACRAW, Block broadcast packet. Valid only in W5500 + #define SF_MULTI_BLOCK (Sn_MR_MMB) ///< In @ref Sn_MR_MACRAW, Block multicast packet. Valid only in W5500 + #define SF_IPv6_BLOCK (Sn_MR_MIP6B) ///< In @ref Sn_MR_MACRAW, Block IPv6 packet. Valid only in W5500 + #define SF_UNI_BLOCK (Sn_MR_UCASTB) ///< In @ref Sn_MR_UDP with \ref SF_MULTI_ENABLE. Valid only in W5500 +#endif + +//A201505 : For W5300 +#if _WIZCHIP_ == 5300 + #define SF_TCP_ALIGN 0x02 ///< Valid only \ref Sn_MR_TCP and W5300, refer to \ref Sn_MR_ALIGN +#endif + +#define SF_IO_NONBLOCK 0x01 ///< Socket nonblock io mode. It used parameter in \ref socket(). + +/* + * UDP & MACRAW Packet Infomation + */ +#define PACK_FIRST 0x80 ///< In Non-TCP packet, It indicates to start receiving a packet. (When W5300, This flag can be applied) +#define PACK_REMAINED 0x01 ///< In Non-TCP packet, It indicates to remain a packet to be received. (When W5300, This flag can be applied) +#define PACK_COMPLETED 0x00 ///< In Non-TCP packet, It indicates to complete to receive a packet. (When W5300, This flag can be applied) +//A20150601 : For Integrating with W5300 +#define PACK_FIFOBYTE 0x02 ///< Valid only W5300, It indicate to have read already the Sn_RX_FIFOR. +// + +/** + * @ingroup WIZnet_socket_APIs + * @brief Open a socket. + * @details Initializes the socket with 'sn' passed as parameter and open. + * + * @param sn Socket number. It should be 0 ~ @ref \_WIZCHIP_SOCK_NUM_. + * @param protocol Protocol type to operate such as TCP, UDP and MACRAW. + * @param port Port number to be bined. + * @param flag Socket flags as \ref SF_ETHER_OWN, \ref SF_IGMP_VER2, \ref SF_TCP_NODELAY, \ref SF_MULTI_ENABLE, \ref SF_IO_NONBLOCK and so on.\n + * Valid flags only in W5500 : @ref SF_BROAD_BLOCK, @ref SF_MULTI_BLOCK, @ref SF_IPv6_BLOCK, and @ref SF_UNI_BLOCK. + * @sa Sn_MR + * + * @return @b Success : The socket number @b 'sn' passed as parameter\n + * @b Fail :\n @ref SOCKERR_SOCKNUM - Invalid socket number\n + * @ref SOCKERR_SOCKMODE - Not support socket mode as TCP, UDP, and so on. \n + * @ref SOCKERR_SOCKFLAG - Invaild socket flag. + */ +int8_t socket(uint8_t sn, uint8_t protocol, uint16_t port, uint8_t flag); + +/** + * @ingroup WIZnet_socket_APIs + * @brief Close a socket. + * @details It closes the socket with @b'sn' passed as parameter. + * + * @param sn Socket number. It should be 0 ~ @ref \_WIZCHIP_SOCK_NUM_. + * + * @return @b Success : @ref SOCK_OK \n + * @b Fail : @ref SOCKERR_SOCKNUM - Invalid socket number + */ +int8_t close(uint8_t sn); + +/** + * @ingroup WIZnet_socket_APIs + * @brief Listen to a connection request from a client. + * @details It is listening to a connection request from a client. + * If connection request is accepted successfully, the connection is established. Socket sn is used in passive(server) mode. + * + * @param sn Socket number. It should be 0 ~ @ref \_WIZCHIP_SOCK_NUM_. + * @return @b Success : @ref SOCK_OK \n + * @b Fail :\n @ref SOCKERR_SOCKINIT - Socket is not initialized \n + * @ref SOCKERR_SOCKCLOSED - Socket closed unexpectedly. + */ +int8_t listen(uint8_t sn); + +/** + * @ingroup WIZnet_socket_APIs + * @brief Try to connect a server. + * @details It requests connection to the server with destination IP address and port number passed as parameter.\n + * @note It is valid only in TCP client mode. + * In block io mode, it does not return until connection is completed. + * In Non-block io mode, it return @ref SOCK_BUSY immediately. + * + * @param sn Socket number. It should be 0 ~ @ref \_WIZCHIP_SOCK_NUM_. + * @param addr Pointer variable of destination IP address. It should be allocated 4 bytes. + * @param port Destination port number. + * + * @return @b Success : @ref SOCK_OK \n + * @b Fail :\n @ref SOCKERR_SOCKNUM - Invalid socket number\n + * @ref SOCKERR_SOCKMODE - Invalid socket mode\n + * @ref SOCKERR_SOCKINIT - Socket is not initialized\n + * @ref SOCKERR_IPINVALID - Wrong server IP address\n + * @ref SOCKERR_PORTZERO - Server port zero\n + * @ref SOCKERR_TIMEOUT - Timeout occurred during request connection\n + * @ref SOCK_BUSY - In non-block io mode, it returned immediately\n + */ +int8_t connect(uint8_t sn, uint8_t * addr, uint16_t port); + +/** + * @ingroup WIZnet_socket_APIs + * @brief Try to disconnect a connection socket. + * @details It sends request message to disconnect the TCP socket 'sn' passed as parameter to the server or client. + * @note It is valid only in TCP server or client mode. \n + * In block io mode, it does not return until disconnection is completed. \n + * In Non-block io mode, it return @ref SOCK_BUSY immediately. \n + + * @param sn Socket number. It should be 0 ~ @ref \_WIZCHIP_SOCK_NUM_. + * @return @b Success : @ref SOCK_OK \n + * @b Fail :\n @ref SOCKERR_SOCKNUM - Invalid socket number \n + * @ref SOCKERR_SOCKMODE - Invalid operation in the socket \n + * @ref SOCKERR_TIMEOUT - Timeout occurred \n + * @ref SOCK_BUSY - Socket is busy. + */ +int8_t disconnect(uint8_t sn); + +/** + * @ingroup WIZnet_socket_APIs + * @brief Send data to the connected peer in TCP socket. + * @details It is used to send outgoing data to the connected socket. + * @note It is valid only in TCP server or client mode. It can't send data greater than socket buffer size. \n + * In block io mode, It doesn't return until data send is completed - socket buffer size is greater than data. \n + * In non-block io mode, It return @ref SOCK_BUSY immediately when socket buffer is not enough. \n + * @param sn Socket number. It should be 0 ~ @ref \_WIZCHIP_SOCK_NUM_. + * @param buf Pointer buffer containing data to be sent. + * @param len The byte length of data in buf. + * @return @b Success : The sent data size \n + * @b Fail : \n @ref SOCKERR_SOCKSTATUS - Invalid socket status for socket operation \n + * @ref SOCKERR_TIMEOUT - Timeout occurred \n + * @ref SOCKERR_SOCKMODE - Invalid operation in the socket \n + * @ref SOCKERR_SOCKNUM - Invalid socket number \n + * @ref SOCKERR_DATALEN - zero data length \n + * @ref SOCK_BUSY - Socket is busy. + */ +int32_t send(uint8_t sn, uint8_t * buf, uint16_t len); + +/** + * @ingroup WIZnet_socket_APIs + * @brief Receive data from the connected peer. + * @details It is used to read incoming data from the connected socket.\n + * It waits for data as much as the application wants to receive. + * @note It is valid only in TCP server or client mode. It can't receive data greater than socket buffer size. \n + * In block io mode, it doesn't return until data reception is completed - data is filled as len in socket buffer. \n + * In non-block io mode, it return @ref SOCK_BUSY immediately when len is greater than data size in socket buffer. \n + * + * @param sn Socket number. It should be 0 ~ @ref \_WIZCHIP_SOCK_NUM_. + * @param buf Pointer buffer to read incoming data. + * @param len The max data length of data in buf. + * @return @b Success : The real received data size \n + * @b Fail :\n + * @ref SOCKERR_SOCKSTATUS - Invalid socket status for socket operation \n + * @ref SOCKERR_SOCKMODE - Invalid operation in the socket \n + * @ref SOCKERR_SOCKNUM - Invalid socket number \n + * @ref SOCKERR_DATALEN - zero data length \n + * @ref SOCK_BUSY - Socket is busy. + */ +int32_t recv(uint8_t sn, uint8_t * buf, uint16_t len); + +/** + * @ingroup WIZnet_socket_APIs + * @brief Sends datagram to the peer with destination IP address and port number passed as parameter. + * @details It sends datagram of UDP or MACRAW to the peer with destination IP address and port number passed as parameter.\n + * Even if the connectionless socket has been previously connected to a specific address, + * the address and port number parameters override the destination address for that particular datagram only. + * @note In block io mode, It doesn't return until data send is completed - socket buffer size is greater than len. + * In non-block io mode, It return @ref SOCK_BUSY immediately when socket buffer is not enough. + * + * @param sn Socket number. It should be 0 ~ @ref \_WIZCHIP_SOCK_NUM_. + * @param buf Pointer buffer to send outgoing data. + * @param len The byte length of data in buf. + * @param addr Pointer variable of destination IP address. It should be allocated 4 bytes. + * @param port Destination port number. + * + * @return @b Success : The sent data size \n + * @b Fail :\n @ref SOCKERR_SOCKNUM - Invalid socket number \n + * @ref SOCKERR_SOCKMODE - Invalid operation in the socket \n + * @ref SOCKERR_SOCKSTATUS - Invalid socket status for socket operation \n + * @ref SOCKERR_DATALEN - zero data length \n + * @ref SOCKERR_IPINVALID - Wrong server IP address\n + * @ref SOCKERR_PORTZERO - Server port zero\n + * @ref SOCKERR_SOCKCLOSED - Socket unexpectedly closed \n + * @ref SOCKERR_TIMEOUT - Timeout occurred \n + * @ref SOCK_BUSY - Socket is busy. + */ +int32_t sendto(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port); + +/** + * @ingroup WIZnet_socket_APIs + * @brief Receive datagram of UDP or MACRAW + * @details This function is an application I/F function which is used to receive the data in other then TCP mode. \n + * This function is used to receive UDP and MAC_RAW mode, and handle the header as well. + * This function can divide to received the packet data. + * On the MACRAW SOCKET, the addr and port parameters are ignored. + * @note In block io mode, it doesn't return until data reception is completed - data is filled as len in socket buffer + * In non-block io mode, it return @ref SOCK_BUSY immediately when len is greater than data size in socket buffer. + * + * @param sn Socket number. It should be 0 ~ @ref \_WIZCHIP_SOCK_NUM_. + * @param buf Pointer buffer to read incoming data. + * @param len The max data length of data in buf. + * When the received packet size <= len, receives data as packet sized. + * When others, receives data as len. + * @param addr Pointer variable of destination IP address. It should be allocated 4 bytes. + * It is valid only when the first call recvfrom for receiving the packet. + * When it is valid, @ref packinfo[7] should be set as '1' after call @ref getsockopt(sn, SO_PACKINFO, &packinfo). + * @param port Pointer variable of destination port number. + * It is valid only when the first call recvform for receiving the packet. +* When it is valid, @ref packinfo[7] should be set as '1' after call @ref getsockopt(sn, SO_PACKINFO, &packinfo). + * + * @return @b Success : This function return real received data size for success.\n + * @b Fail : @ref SOCKERR_DATALEN - zero data length \n + * @ref SOCKERR_SOCKMODE - Invalid operation in the socket \n + * @ref SOCKERR_SOCKNUM - Invalid socket number \n + * @ref SOCKBUSY - Socket is busy. + */ +int32_t recvfrom(uint8_t sn, uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t *port); + + +///////////////////////////// +// SOCKET CONTROL & OPTION // +///////////////////////////// +#define SOCK_IO_BLOCK 0 ///< Socket Block IO Mode in @ref setsockopt(). +#define SOCK_IO_NONBLOCK 1 ///< Socket Non-block IO Mode in @ref setsockopt(). + +/** + * @defgroup DATA_TYPE DATA TYPE + */ + +/** + * @ingroup DATA_TYPE + * @brief The kind of Socket Interrupt. + * @sa Sn_IR, Sn_IMR, setSn_IR(), getSn_IR(), setSn_IMR(), getSn_IMR() + */ +typedef enum +{ + SIK_CONNECTED = (1 << 0), ///< connected + SIK_DISCONNECTED = (1 << 1), ///< disconnected + SIK_RECEIVED = (1 << 2), ///< data received + SIK_TIMEOUT = (1 << 3), ///< timeout occurred + SIK_SENT = (1 << 4), ///< send ok + //M20150410 : Remove the comma of last member + //SIK_ALL = 0x1F, ///< all interrupt + SIK_ALL = 0x1F ///< all interrupt +}sockint_kind; + +/** + * @ingroup DATA_TYPE + * @brief The type of @ref ctlsocket(). + */ +typedef enum +{ + CS_SET_IOMODE, ///< set socket IO mode with @ref SOCK_IO_BLOCK or @ref SOCK_IO_NONBLOCK + CS_GET_IOMODE, ///< get socket IO mode + CS_GET_MAXTXBUF, ///< get the size of socket buffer allocated in TX memory + CS_GET_MAXRXBUF, ///< get the size of socket buffer allocated in RX memory + CS_CLR_INTERRUPT, ///< clear the interrupt of socket with @ref sockint_kind + CS_GET_INTERRUPT, ///< get the socket interrupt. refer to @ref sockint_kind +#if _WIZCHIP_ > 5100 + CS_SET_INTMASK, ///< set the interrupt mask of socket with @ref sockint_kind, Not supported in W5100 + CS_GET_INTMASK ///< get the masked interrupt of socket. refer to @ref sockint_kind, Not supported in W5100 +#endif +}ctlsock_type; + + +/** + * @ingroup DATA_TYPE + * @brief The type of socket option in @ref setsockopt() or @ref getsockopt() + */ +typedef enum +{ + SO_FLAG, ///< Valid only in getsockopt(), For set flag of socket refer to flag in @ref socket(). + SO_TTL, ///< Set TTL. @ref Sn_TTL ( @ref setSn_TTL(), @ref getSn_TTL() ) + SO_TOS, ///< Set TOS. @ref Sn_TOS ( @ref setSn_TOS(), @ref getSn_TOS() ) + SO_MSS, ///< Set MSS. @ref Sn_MSSR ( @ref setSn_MSSR(), @ref getSn_MSSR() ) + SO_DESTIP, ///< Set the destination IP address. @ref Sn_DIPR ( @ref setSn_DIPR(), @ref getSn_DIPR() ) + SO_DESTPORT, ///< Set the destination Port number. @ref Sn_DPORT ( @ref setSn_DPORT(), @ref getSn_DPORT() ) +#if _WIZCHIP_ != 5100 + SO_KEEPALIVESEND, ///< Valid only in setsockopt. Manually send keep-alive packet in TCP mode, Not supported in W5100 + #if _WIZCHIP_ > 5200 + SO_KEEPALIVEAUTO, ///< Set/Get keep-alive auto transmission timer in TCP mode, Not supported in W5100, W5200 + #endif +#endif + SO_SENDBUF, ///< Valid only in getsockopt. Get the free data size of Socekt TX buffer. @ref Sn_TX_FSR, @ref getSn_TX_FSR() + SO_RECVBUF, ///< Valid only in getsockopt. Get the received data size in socket RX buffer. @ref Sn_RX_RSR, @ref getSn_RX_RSR() + SO_STATUS, ///< Valid only in getsockopt. Get the socket status. @ref Sn_SR, @ref getSn_SR() + SO_REMAINSIZE, ///< Valid only in getsockopt. Get the remained packet size in other then TCP mode. + SO_PACKINFO ///< Valid only in getsockopt. Get the packet information as @ref PACK_FIRST, @ref PACK_REMAINED, and @ref PACK_COMPLETED in other then TCP mode. +}sockopt_type; + +/** + * @ingroup WIZnet_socket_APIs + * @brief Control socket. + * @details Control IO mode, Interrupt & Mask of socket and get the socket buffer information. + * Refer to @ref ctlsock_type. + * @param sn socket number + * @param cstype type of control socket. refer to @ref ctlsock_type. + * @param arg Data type and value is determined according to @ref ctlsock_type. \n + * + * + * + * + * + *
@b cstype @b data type@b value
@ref CS_SET_IOMODE \n @ref CS_GET_IOMODE uint8_t @ref SOCK_IO_BLOCK @ref SOCK_IO_NONBLOCK
@ref CS_GET_MAXTXBUF \n @ref CS_GET_MAXRXBUF uint16_t 0 ~ 16K
@ref CS_CLR_INTERRUPT \n @ref CS_GET_INTERRUPT \n @ref CS_SET_INTMASK \n @ref CS_GET_INTMASK @ref sockint_kind @ref SIK_CONNECTED, etc.
+ * @return @b Success @ref SOCK_OK \n + * @b fail @ref SOCKERR_ARG - Invalid argument\n + */ +int8_t ctlsocket(uint8_t sn, ctlsock_type cstype, void* arg); + +/** + * @ingroup WIZnet_socket_APIs + * @brief set socket options + * @details Set socket option like as TTL, MSS, TOS, and so on. Refer to @ref sockopt_type. + * + * @param sn socket number + * @param sotype socket option type. refer to @ref sockopt_type + * @param arg Data type and value is determined according to sotype. \n + * + * + * + * + * + * + * + * + * + *
@b sotype @b data type@b value
@ref SO_TTL uint8_t 0 ~ 255
@ref SO_TOS uint8_t 0 ~ 255
@ref SO_MSS uint16_t 0 ~ 65535
@ref SO_DESTIP uint8_t[4]
@ref SO_DESTPORT uint16_t 0 ~ 65535
@ref SO_KEEPALIVESEND null null
@ref SO_KEEPALIVEAUTO uint8_t 0 ~ 255
+ * @return + * - @b Success : @ref SOCK_OK \n + * - @b Fail + * - @ref SOCKERR_SOCKNUM - Invalid Socket number \n + * - @ref SOCKERR_SOCKMODE - Invalid socket mode \n + * - @ref SOCKERR_SOCKOPT - Invalid socket option or its value \n + * - @ref SOCKERR_TIMEOUT - Timeout occurred when sending keep-alive packet \n + */ +int8_t setsockopt(uint8_t sn, sockopt_type sotype, void* arg); + +/** + * @ingroup WIZnet_socket_APIs + * @brief get socket options + * @details Get socket option like as FLAG, TTL, MSS, and so on. Refer to @ref sockopt_type + * @param sn socket number + * @param sotype socket option type. refer to @ref sockopt_type + * @param arg Data type and value is determined according to sotype. \n + * + * + * + * + * + * + * + * + * + * + * + * + * + *
@b sotype @b data type@b value
@ref SO_FLAG uint8_t @ref SF_ETHER_OWN, etc...
@ref SO_TOS uint8_t 0 ~ 255
@ref SO_MSS uint16_t 0 ~ 65535
@ref SO_DESTIP uint8_t[4]
@ref SO_DESTPORT uint16_t
@ref SO_KEEPALIVEAUTO uint8_t 0 ~ 255
@ref SO_SENDBUF uint16_t 0 ~ 65535
@ref SO_RECVBUF uint16_t 0 ~ 65535
@ref SO_STATUS uint8_t @ref SOCK_ESTABLISHED, etc..
@ref SO_REMAINSIZE uint16_t 0~ 65535
@ref SO_PACKINFO uint8_t @ref PACK_FIRST, etc...
+ * @return + * - @b Success : @ref SOCK_OK \n + * - @b Fail + * - @ref SOCKERR_SOCKNUM - Invalid Socket number \n + * - @ref SOCKERR_SOCKOPT - Invalid socket option or its value \n + * - @ref SOCKERR_SOCKMODE - Invalid socket mode \n + * @note + * The option as PACK_REMAINED and SO_PACKINFO is valid only in NON-TCP mode and after call @ref recvfrom(). \n + * When SO_PACKINFO value is PACK_FIRST and the return value of recvfrom() is zero, + * This means the zero byte UDP data(UDP Header only) received. + */ +int8_t getsockopt(uint8_t sn, sockopt_type sotype, void* arg); + +#ifdef __cplusplus + } +#endif + +#endif // _SOCKET_H_ diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/wizchip_conf.c b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/wizchip_conf.c new file mode 100644 index 0000000..6592b0c --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/wizchip_conf.c @@ -0,0 +1,903 @@ +//****************************************************************************/ +//! +//! \file wizchip_conf.c +//! \brief WIZCHIP Config Header File. +//! \version 1.0.1 +//! \date 2013/10/21 +//! \par Revision history +//! <2015/02/05> Notice +//! The version history is not updated after this point. +//! Download the latest version directly from GitHub. Please visit the our GitHub repository for ioLibrary. +//! >> https://github.com/Wiznet/ioLibrary_Driver +//! <2014/05/01> V1.0.1 Refer to M20140501 +//! 1. Explicit type casting in wizchip_bus_readdata() & wizchip_bus_writedata() +// Issued by Mathias ClauBen. +//! uint32_t type converts into ptrdiff_t first. And then recoverting it into uint8_t* +//! For remove the warning when pointer type size is not 32bit. +//! If ptrdiff_t doesn't support in your complier, You should must replace ptrdiff_t into your suitable pointer type. +//! <2013/10/21> 1st Release +//! \author MidnightCow +//! \copyright +//! +//! Copyright (c) 2013, WIZnet Co., LTD. +//! All rights reserved. +//! +//! Redistribution and use in source and binary forms, with or without +//! modification, are permitted provided that the following conditions +//! are met: +//! +//! * Redistributions of source code must retain the above copyright +//! notice, this list of conditions and the following disclaimer. +//! * Redistributions in binary form must reproduce the above copyright +//! notice, this list of conditions and the following disclaimer in the +//! documentation and/or other materials provided with the distribution. +//! * Neither the name of the nor the names of its +//! contributors may be used to endorse or promote products derived +//! from this software without specific prior written permission. +//! +//! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +//! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +//! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +//! THE POSSIBILITY OF SUCH DAMAGE. +// +//*****************************************************************************/ +//A20140501 : for use the type - ptrdiff_t +#include +// + +#include "wizchip_conf.h" + +///////////// +//M20150401 : Remove ; in the default callback function such as wizchip_cris_enter(), wizchip_cs_select() and etc. +///////////// + +/** + * @brief Default function to enable interrupt. + * @note This function help not to access wrong address. If you do not describe this function or register any functions, + * null function is called. + */ +//void wizchip_cris_enter(void) {}; +void wizchip_cris_enter(void) {} + +/** + * @brief Default function to disable interrupt. + * @note This function help not to access wrong address. If you do not describe this function or register any functions, + * null function is called. + */ +//void wizchip_cris_exit(void) {}; +void wizchip_cris_exit(void) {} + +/** + * @brief Default function to select chip. + * @note This function help not to access wrong address. If you do not describe this function or register any functions, + * null function is called. + */ +//void wizchip_cs_select(void) {}; +void wizchip_cs_select(void) {} + +/** + * @brief Default function to deselect chip. + * @note This function help not to access wrong address. If you do not describe this function or register any functions, + * null function is called. + */ +//void wizchip_cs_deselect(void) {}; +void wizchip_cs_deselect(void) {} + +/** + * @brief Default function to read in direct or indirect interface. + * @note This function help not to access wrong address. If you do not describe this function or register any functions, + * null function is called. + */ + //M20150601 : Rename the function for integrating with W5300 +//uint8_t wizchip_bus_readbyte(uint32_t AddrSel) { return * ((volatile uint8_t *)((ptrdiff_t) AddrSel)); } +iodata_t wizchip_bus_readdata(uint32_t AddrSel) { return * ((volatile iodata_t *)((ptrdiff_t) AddrSel)); } + +/** + * @brief Default function to write in direct or indirect interface. + * @note This function help not to access wrong address. If you do not describe this function or register any functions, + * null function is called. + */ +//M20150601 : Rename the function for integrating with W5300 +//void wizchip_bus_writebyte(uint32_t AddrSel, uint8_t wb) { *((volatile uint8_t*)((ptrdiff_t)AddrSel)) = wb; } +void wizchip_bus_writedata(uint32_t AddrSel, iodata_t wb) { *((volatile iodata_t*)((ptrdiff_t)AddrSel)) = wb; } + +/** + * @brief Default function to read in SPI interface. + * @note This function help not to access wrong address. If you do not describe this function or register any functions, + * null function is called. + */ +//uint8_t wizchip_spi_readbyte(void) {return 0;}; +uint8_t wizchip_spi_readbyte(void) {return 0;} + +/** + * @brief Default function to write in SPI interface. + * @note This function help not to access wrong address. If you do not describe this function or register any functions, + * null function is called. + */ +//void wizchip_spi_writebyte(uint8_t wb) {}; +void wizchip_spi_writebyte(uint8_t wb) {} + +/** + * @brief Default function to burst read in SPI interface. + * @note This function help not to access wrong address. If you do not describe this function or register any functions, + * null function is called. + */ +//void wizchip_spi_readburst(uint8_t* pBuf, uint16_t len) {}; +void wizchip_spi_readburst(uint8_t* pBuf, uint16_t len) {} + +/** + * @brief Default function to burst write in SPI interface. + * @note This function help not to access wrong address. If you do not describe this function or register any functions, + * null function is called. + */ +//void wizchip_spi_writeburst(uint8_t* pBuf, uint16_t len) {}; +void wizchip_spi_writeburst(uint8_t* pBuf, uint16_t len) {} + +/** + * @\ref _WIZCHIP instance + */ +// +//M20150401 : For a compiler didnot support a member of structure +// Replace the assignment of struct members with the assingment of array +// +/* +_WIZCHIP WIZCHIP = + { + .id = _WIZCHIP_ID_, + .if_mode = _WIZCHIP_IO_MODE_, + .CRIS._enter = wizchip_cris_enter, + .CRIS._exit = wizchip_cris_exit, + .CS._select = wizchip_cs_select, + .CS._deselect = wizchip_cs_deselect, + .IF.BUS._read_byte = wizchip_bus_readbyte, + .IF.BUS._write_byte = wizchip_bus_writebyte +// .IF.SPI._read_byte = wizchip_spi_readbyte, +// .IF.SPI._write_byte = wizchip_spi_writebyte + }; +*/ +_WIZCHIP WIZCHIP = +{ + _WIZCHIP_IO_MODE_, + _WIZCHIP_ID_ , + { + wizchip_cris_enter, + wizchip_cris_exit + }, + { + wizchip_cs_select, + wizchip_cs_deselect + }, + { + { + //M20150601 : Rename the function + //wizchip_bus_readbyte, + //wizchip_bus_writebyte + wizchip_bus_readdata, + wizchip_bus_writedata + }, + + } +}; + + +static uint8_t _DNS_[4]; // DNS server ip address +static dhcp_mode _DHCP_; // DHCP mode + +void reg_wizchip_cris_cbfunc(void(*cris_en)(void), void(*cris_ex)(void)) +{ + if(!cris_en || !cris_ex) + { + WIZCHIP.CRIS._enter = wizchip_cris_enter; + WIZCHIP.CRIS._exit = wizchip_cris_exit; + } + else + { + WIZCHIP.CRIS._enter = cris_en; + WIZCHIP.CRIS._exit = cris_ex; + } +} + +void reg_wizchip_cs_cbfunc(void(*cs_sel)(void), void(*cs_desel)(void)) +{ + if(!cs_sel || !cs_desel) + { + WIZCHIP.CS._select = wizchip_cs_select; + WIZCHIP.CS._deselect = wizchip_cs_deselect; + } + else + { + WIZCHIP.CS._select = cs_sel; + WIZCHIP.CS._deselect = cs_desel; + } +} + +//M20150515 : For integrating with W5300 +//void reg_wizchip_bus_cbfunc(uint8_t(*bus_rb)(uint32_t addr), void (*bus_wb)(uint32_t addr, uint8_t wb)) +void reg_wizchip_bus_cbfunc(iodata_t(*bus_rb)(uint32_t addr), void (*bus_wb)(uint32_t addr, iodata_t wb)) +{ + while(!(WIZCHIP.if_mode & _WIZCHIP_IO_MODE_BUS_)); + //M20150601 : Rename call back function for integrating with W5300 + /* + if(!bus_rb || !bus_wb) + { + WIZCHIP.IF.BUS._read_byte = wizchip_bus_readbyte; + WIZCHIP.IF.BUS._write_byte = wizchip_bus_writebyte; + } + else + { + WIZCHIP.IF.BUS._read_byte = bus_rb; + WIZCHIP.IF.BUS._write_byte = bus_wb; + } + */ + if(!bus_rb || !bus_wb) + { + WIZCHIP.IF.BUS._read_data = wizchip_bus_readdata; + WIZCHIP.IF.BUS._write_data = wizchip_bus_writedata; + } + else + { + WIZCHIP.IF.BUS._read_data = bus_rb; + WIZCHIP.IF.BUS._write_data = bus_wb; + } +} + +void reg_wizchip_spi_cbfunc(uint8_t (*spi_rb)(void), void (*spi_wb)(uint8_t wb)) +{ + while(!(WIZCHIP.if_mode & _WIZCHIP_IO_MODE_SPI_)); + + if(!spi_rb || !spi_wb) + { + WIZCHIP.IF.SPI._read_byte = wizchip_spi_readbyte; + WIZCHIP.IF.SPI._write_byte = wizchip_spi_writebyte; + } + else + { + WIZCHIP.IF.SPI._read_byte = spi_rb; + WIZCHIP.IF.SPI._write_byte = spi_wb; + } +} + +// 20140626 Eric Added for SPI burst operations +void reg_wizchip_spiburst_cbfunc(void (*spi_rb)(uint8_t* pBuf, uint16_t len), void (*spi_wb)(uint8_t* pBuf, uint16_t len)) +{ + while(!(WIZCHIP.if_mode & _WIZCHIP_IO_MODE_SPI_)); + + if(!spi_rb || !spi_wb) + { + WIZCHIP.IF.SPI._read_burst = wizchip_spi_readburst; + WIZCHIP.IF.SPI._write_burst = wizchip_spi_writeburst; + } + else + { + WIZCHIP.IF.SPI._read_burst = spi_rb; + WIZCHIP.IF.SPI._write_burst = spi_wb; + } +} + +int8_t ctlwizchip(ctlwizchip_type cwtype, void* arg) +{ +#if _WIZCHIP_ == W5100S || _WIZCHIP_ == W5200 || _WIZCHIP_ == W5500 + uint8_t tmp = 0; +#endif + uint8_t* ptmp[2] = {0,0}; + switch(cwtype) + { + case CW_RESET_WIZCHIP: + wizchip_sw_reset(); + break; + case CW_INIT_WIZCHIP: + if(arg != 0) + { + ptmp[0] = (uint8_t*)arg; + ptmp[1] = ptmp[0] + _WIZCHIP_SOCK_NUM_; + } + return wizchip_init(ptmp[0], ptmp[1]); + case CW_CLR_INTERRUPT: + wizchip_clrinterrupt(*((intr_kind*)arg)); + break; + case CW_GET_INTERRUPT: + *((intr_kind*)arg) = wizchip_getinterrupt(); + break; + case CW_SET_INTRMASK: + wizchip_setinterruptmask(*((intr_kind*)arg)); + break; + case CW_GET_INTRMASK: + *((intr_kind*)arg) = wizchip_getinterruptmask(); + break; + //M20150601 : This can be supported by W5200, W5500 + //#if _WIZCHIP_ > W5100 + #if (_WIZCHIP_ == W5200 || _WIZCHIP_ == W5500) + case CW_SET_INTRTIME: + setINTLEVEL(*(uint16_t*)arg); + break; + case CW_GET_INTRTIME: + *(uint16_t*)arg = getINTLEVEL(); + break; + #endif + case CW_GET_ID: + ((uint8_t*)arg)[0] = WIZCHIP.id[0]; + ((uint8_t*)arg)[1] = WIZCHIP.id[1]; + ((uint8_t*)arg)[2] = WIZCHIP.id[2]; + ((uint8_t*)arg)[3] = WIZCHIP.id[3]; + ((uint8_t*)arg)[4] = WIZCHIP.id[4]; + ((uint8_t*)arg)[5] = 0; + break; + #if _WIZCHIP_ == W5100S || _WIZCHIP_ == W5500 + case CW_RESET_PHY: + wizphy_reset(); + break; + case CW_SET_PHYCONF: + wizphy_setphyconf((wiz_PhyConf*)arg); + break; + case CW_GET_PHYCONF: + wizphy_getphyconf((wiz_PhyConf*)arg); + break; + case CW_GET_PHYSTATUS: + break; + case CW_SET_PHYPOWMODE: + return wizphy_setphypmode(*(uint8_t*)arg); + #endif + #if _WIZCHIP_ == W5100S || _WIZCHIP_ == W5200 || _WIZCHIP_ == W5500 + case CW_GET_PHYPOWMODE: + tmp = wizphy_getphypmode(); + if((int8_t)tmp == -1) return -1; + *(uint8_t*)arg = tmp; + break; + case CW_GET_PHYLINK: + tmp = wizphy_getphylink(); + if((int8_t)tmp == -1) return -1; + *(uint8_t*)arg = tmp; + break; + #endif + default: + return -1; + } + return 0; +} + + +int8_t ctlnetwork(ctlnetwork_type cntype, void* arg) +{ + + switch(cntype) + { + case CN_SET_NETINFO: + wizchip_setnetinfo((wiz_NetInfo*)arg); + break; + case CN_GET_NETINFO: + wizchip_getnetinfo((wiz_NetInfo*)arg); + break; + case CN_SET_NETMODE: + return wizchip_setnetmode(*(netmode_type*)arg); + case CN_GET_NETMODE: + *(netmode_type*)arg = wizchip_getnetmode(); + break; + case CN_SET_TIMEOUT: + wizchip_settimeout((wiz_NetTimeout*)arg); + break; + case CN_GET_TIMEOUT: + wizchip_gettimeout((wiz_NetTimeout*)arg); + break; + default: + return -1; + } + return 0; +} + +void wizchip_sw_reset(void) +{ + uint8_t gw[4], sn[4], sip[4]; + uint8_t mac[6]; +//A20150601 +#if _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_ + uint16_t mr = (uint16_t)getMR(); + setMR(mr | MR_IND); +#endif +// + getSHAR(mac); + getGAR(gw); getSUBR(sn); getSIPR(sip); + setMR(MR_RST); + getMR(); // for delay +//A2015051 : For indirect bus mode +#if _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_ + setMR(mr | MR_IND); +#endif +// + setSHAR(mac); + setGAR(gw); + setSUBR(sn); + setSIPR(sip); +} + +int8_t wizchip_init(uint8_t* txsize, uint8_t* rxsize) +{ + int8_t i; +#if _WIZCHIP_ < W5200 + int8_t j; +#endif + int8_t tmp = 0; + wizchip_sw_reset(); + if(txsize) + { + tmp = 0; + //M20150601 : For integrating with W5300 + #if _WIZCHIP_ == W5300 + for(i = 0 ; i < _WIZCHIP_SOCK_NUM_; i++) + { + if(txsize[i] >= 64) return -1; //No use 64KB even if W5300 support max 64KB memory allocation + tmp += txsize[i]; + if(tmp > 128) return -1; + } + if(tmp % 8) return -1; + #else + for(i = 0 ; i < _WIZCHIP_SOCK_NUM_; i++) + { + tmp += txsize[i]; + + #if _WIZCHIP_ < W5200 //2016.10.28 peter add condition for w5100 and w5100s + if(tmp > 8) return -1; + #else + if(tmp > 16) return -1; + #endif + } + for(i = 0 ; i < _WIZCHIP_SOCK_NUM_; i++) + { + #if _WIZCHIP_ < W5200 //2016.10.28 peter add condition for w5100 + j = 0; + while((txsize[i] >> j != 1)&&(txsize[i] !=0)){j++;} + setSn_TXBUF_SIZE(i, j); + #else + setSn_TXBUF_SIZE(i, txsize[i]); + #endif + } + + #endif + } + + if(rxsize) + { + tmp = 0; + #if _WIZCHIP_ == W5300 + for(i = 0 ; i < _WIZCHIP_SOCK_NUM_; i++) + { + if(rxsize[i] >= 64) return -1; //No use 64KB even if W5300 support max 64KB memory allocation + tmp += rxsize[i]; + if(tmp > 128) return -1; + } + if(tmp % 8) return -1; + #else + for(i = 0 ; i < _WIZCHIP_SOCK_NUM_; i++) + { + tmp += rxsize[i]; + #if _WIZCHIP_ < W5200 //2016.10.28 peter add condition for w5100 and w5100s + if(tmp > 8) return -1; + #else + if(tmp > 16) return -1; + #endif + } + + for(i = 0 ; i < _WIZCHIP_SOCK_NUM_; i++) + { + #if _WIZCHIP_ < W5200 // add condition for w5100 + j = 0; + while((rxsize[i] >> j != 1)&&(txsize[i] !=0)){j++;} + setSn_RXBUF_SIZE(i, j); + #else + setSn_RXBUF_SIZE(i, rxsize[i]); + #endif + } + #endif + } + return 0; +} + +void wizchip_clrinterrupt(intr_kind intr) +{ + uint8_t ir = (uint8_t)intr; + uint8_t sir = (uint8_t)((uint16_t)intr >> 8); +#if _WIZCHIP_ < W5500 + ir |= (1<<4); // IK_WOL +#endif +#if _WIZCHIP_ == W5200 + ir |= (1 << 6); +#endif + +#if _WIZCHIP_ < W5200 + sir &= 0x0F; +#endif + +#if _WIZCHIP_ <= W5100S + ir |= sir; + setIR(ir); +//A20150601 : For integrating with W5300 +#elif _WIZCHIP_ == W5300 + setIR( ((((uint16_t)ir) << 8) | (((uint16_t)sir) & 0x00FF)) ); +#else + setIR(ir); + setSIR(sir); +#endif +} + +intr_kind wizchip_getinterrupt(void) +{ + uint8_t ir = 0; + uint8_t sir = 0; + uint16_t ret = 0; +#if _WIZCHIP_ <= W5100S + ir = getIR(); + sir = ir & 0x0F; +//A20150601 : For integrating with W5300 +#elif _WIZCHIP_ == W5300 + ret = getIR(); + ir = (uint8_t)(ret >> 8); + sir = (uint8_t)ret; +#else + ir = getIR(); + sir = getSIR(); +#endif + +//M20150601 : For Integrating with W5300 +//#if _WIZCHIP_ < W5500 +#if _WIZCHIP_ < W5200 + ir &= ~(1<<4); // IK_WOL +#endif +#if _WIZCHIP_ == W5200 + ir &= ~(1 << 6); +#endif + ret = sir; + ret = (ret << 8) + ir; + return (intr_kind)ret; +} + +void wizchip_setinterruptmask(intr_kind intr) +{ + uint8_t imr = (uint8_t)intr; + uint8_t simr = (uint8_t)((uint16_t)intr >> 8); +#if _WIZCHIP_ < W5500 + imr &= ~(1<<4); // IK_WOL +#endif +#if _WIZCHIP_ == W5200 + imr &= ~(1 << 6); +#endif + +#if _WIZCHIP_ < W5200 + simr &= 0x0F; + imr |= simr; + setIMR(imr); +//A20150601 : For integrating with W5300 +#elif _WIZCHIP_ == W5300 + setIMR( ((((uint16_t)imr) << 8) | (((uint16_t)simr) & 0x00FF)) ); +#else + setIMR(imr); + setSIMR(simr); +#endif +} + +intr_kind wizchip_getinterruptmask(void) +{ + uint8_t imr = 0; + uint8_t simr = 0; + uint16_t ret = 0; +#if _WIZCHIP_ < W5200 + imr = getIMR(); + simr = imr & 0x0F; +//A20150601 : For integrating with W5300 +#elif _WIZCHIP_ == W5300 + ret = getIMR(); + imr = (uint8_t)(ret >> 8); + simr = (uint8_t)ret; +#else + imr = getIMR(); + simr = getSIMR(); +#endif + +#if _WIZCHIP_ < W5500 + imr &= ~(1<<4); // IK_WOL +#endif +#if _WIZCHIP_ == W5200 + imr &= ~(1 << 6); // IK_DEST_UNREACH +#endif + ret = simr; + ret = (ret << 8) + imr; + return (intr_kind)ret; +} + +int8_t wizphy_getphylink(void) +{ + int8_t tmp = PHY_LINK_OFF; +#if _WIZCHIP_ == W5100S + if(getPHYSR() & PHYSR_LNK) + tmp = PHY_LINK_ON; +#elif _WIZCHIP_ == W5200 + if(getPHYSTATUS() & PHYSTATUS_LINK) + tmp = PHY_LINK_ON; +#elif _WIZCHIP_ == W5500 + if(getPHYCFGR() & PHYCFGR_LNK_ON) + tmp = PHY_LINK_ON; + +#else + tmp = -1; +#endif + return tmp; +} + +#if _WIZCHIP_ > W5100 + +int8_t wizphy_getphypmode(void) +{ + int8_t tmp = 0; + #if _WIZCHIP_ == W5200 + if(getPHYSTATUS() & PHYSTATUS_POWERDOWN) + tmp = PHY_POWER_DOWN; + else + tmp = PHY_POWER_NORM; + #elif _WIZCHIP_ == 5500 + if((getPHYCFGR() & PHYCFGR_OPMDC_ALLA) == PHYCFGR_OPMDC_PDOWN) + tmp = PHY_POWER_DOWN; + else + tmp = PHY_POWER_NORM; + #else + tmp = -1; + #endif + return tmp; +} +#endif + +#if _WIZCHIP_ == W5100S +void wizphy_reset(void) +{ + uint16_t tmp = wiz_mdio_read(PHYMDIO_BMCR); + tmp |= BMCR_RESET; + wiz_mdio_write(PHYMDIO_BMCR, tmp); + while(wiz_mdio_read(PHYMDIO_BMCR)&BMCR_RESET){} +} + +void wizphy_setphyconf(wiz_PhyConf* phyconf) +{ + uint16_t tmp = wiz_mdio_read(PHYMDIO_BMCR); + if(phyconf->mode == PHY_MODE_AUTONEGO) + tmp |= BMCR_AUTONEGO; + else + { + tmp &= ~BMCR_AUTONEGO; + if(phyconf->duplex == PHY_DUPLEX_FULL) + { + tmp |= BMCR_DUP; + } + else + { + tmp &= ~BMCR_DUP; + } + if(phyconf->speed == PHY_SPEED_100) + { + tmp |= BMCR_SPEED; + } + else + { + tmp &= ~BMCR_SPEED; + } + } + wiz_mdio_write(PHYMDIO_BMCR, tmp); +} + +void wizphy_getphyconf(wiz_PhyConf* phyconf) +{ + uint16_t tmp = 0; + tmp = wiz_mdio_read(PHYMDIO_BMCR); + phyconf->by = PHY_CONFBY_SW; + if(tmp & BMCR_AUTONEGO) + { + phyconf->mode = PHY_MODE_AUTONEGO; + } + else + { + phyconf->mode = PHY_MODE_MANUAL; + if(tmp&BMCR_DUP) phyconf->duplex = PHY_DUPLEX_FULL; + else phyconf->duplex = PHY_DUPLEX_HALF; + if(tmp&BMCR_SPEED) phyconf->speed = PHY_SPEED_100; + else phyconf->speed = PHY_SPEED_10; + } +} + +int8_t wizphy_setphypmode(uint8_t pmode) +{ + uint16_t tmp = 0; + tmp = wiz_mdio_read(PHYMDIO_BMCR); + if( pmode == PHY_POWER_DOWN) + { + tmp |= BMCR_PWDN; + } + else + { + tmp &= ~BMCR_PWDN; + } + wiz_mdio_write(PHYMDIO_BMCR, tmp); + tmp = wiz_mdio_read(PHYMDIO_BMCR); + if( pmode == PHY_POWER_DOWN) + { + if(tmp & BMCR_PWDN) return 0; + } + else + { + if((tmp & BMCR_PWDN) != BMCR_PWDN) return 0; + } + return -1; +} + +#endif +#if _WIZCHIP_ == W5500 +void wizphy_reset(void) +{ + uint8_t tmp = getPHYCFGR(); + tmp &= PHYCFGR_RST; + setPHYCFGR(tmp); + tmp = getPHYCFGR(); + tmp |= ~PHYCFGR_RST; + setPHYCFGR(tmp); +} + +void wizphy_setphyconf(wiz_PhyConf* phyconf) +{ + uint8_t tmp = 0; + if(phyconf->by == PHY_CONFBY_SW) + tmp |= PHYCFGR_OPMD; + else + tmp &= ~PHYCFGR_OPMD; + if(phyconf->mode == PHY_MODE_AUTONEGO) + tmp |= PHYCFGR_OPMDC_ALLA; + else + { + if(phyconf->duplex == PHY_DUPLEX_FULL) + { + if(phyconf->speed == PHY_SPEED_100) + tmp |= PHYCFGR_OPMDC_100F; + else + tmp |= PHYCFGR_OPMDC_10F; + } + else + { + if(phyconf->speed == PHY_SPEED_100) + tmp |= PHYCFGR_OPMDC_100H; + else + tmp |= PHYCFGR_OPMDC_10H; + } + } + setPHYCFGR(tmp); + wizphy_reset(); +} + +void wizphy_getphyconf(wiz_PhyConf* phyconf) +{ + uint8_t tmp = 0; + tmp = getPHYCFGR(); + phyconf->by = (tmp & PHYCFGR_OPMD) ? PHY_CONFBY_SW : PHY_CONFBY_HW; + switch(tmp & PHYCFGR_OPMDC_ALLA) + { + case PHYCFGR_OPMDC_ALLA: + case PHYCFGR_OPMDC_100FA: + phyconf->mode = PHY_MODE_AUTONEGO; + break; + default: + phyconf->mode = PHY_MODE_MANUAL; + break; + } + switch(tmp & PHYCFGR_OPMDC_ALLA) + { + case PHYCFGR_OPMDC_100FA: + case PHYCFGR_OPMDC_100F: + case PHYCFGR_OPMDC_100H: + phyconf->speed = PHY_SPEED_100; + break; + default: + phyconf->speed = PHY_SPEED_10; + break; + } + switch(tmp & PHYCFGR_OPMDC_ALLA) + { + case PHYCFGR_OPMDC_100FA: + case PHYCFGR_OPMDC_100F: + case PHYCFGR_OPMDC_10F: + phyconf->duplex = PHY_DUPLEX_FULL; + break; + default: + phyconf->duplex = PHY_DUPLEX_HALF; + break; + } +} + +void wizphy_getphystat(wiz_PhyConf* phyconf) +{ + uint8_t tmp = getPHYCFGR(); + phyconf->duplex = (tmp & PHYCFGR_DPX_FULL) ? PHY_DUPLEX_FULL : PHY_DUPLEX_HALF; + phyconf->speed = (tmp & PHYCFGR_SPD_100) ? PHY_SPEED_100 : PHY_SPEED_10; +} + +int8_t wizphy_setphypmode(uint8_t pmode) +{ + uint8_t tmp = 0; + tmp = getPHYCFGR(); + if((tmp & PHYCFGR_OPMD)== 0) return -1; + tmp &= ~PHYCFGR_OPMDC_ALLA; + if( pmode == PHY_POWER_DOWN) + tmp |= PHYCFGR_OPMDC_PDOWN; + else + tmp |= PHYCFGR_OPMDC_ALLA; + setPHYCFGR(tmp); + wizphy_reset(); + tmp = getPHYCFGR(); + if( pmode == PHY_POWER_DOWN) + { + if(tmp & PHYCFGR_OPMDC_PDOWN) return 0; + } + else + { + if(tmp & PHYCFGR_OPMDC_ALLA) return 0; + } + return -1; +} +#endif + + +void wizchip_setnetinfo(wiz_NetInfo* pnetinfo) +{ + setSHAR(pnetinfo->mac); + setGAR(pnetinfo->gw); + setSUBR(pnetinfo->sn); + setSIPR(pnetinfo->ip); + _DNS_[0] = pnetinfo->dns[0]; + _DNS_[1] = pnetinfo->dns[1]; + _DNS_[2] = pnetinfo->dns[2]; + _DNS_[3] = pnetinfo->dns[3]; + _DHCP_ = pnetinfo->dhcp; +} + +void wizchip_getnetinfo(wiz_NetInfo* pnetinfo) +{ + getSHAR(pnetinfo->mac); + getGAR(pnetinfo->gw); + getSUBR(pnetinfo->sn); + getSIPR(pnetinfo->ip); + pnetinfo->dns[0]= _DNS_[0]; + pnetinfo->dns[1]= _DNS_[1]; + pnetinfo->dns[2]= _DNS_[2]; + pnetinfo->dns[3]= _DNS_[3]; + pnetinfo->dhcp = _DHCP_; +} + +int8_t wizchip_setnetmode(netmode_type netmode) +{ + uint8_t tmp = 0; +#if _WIZCHIP_ != W5500 + if(netmode & ~(NM_WAKEONLAN | NM_PPPOE | NM_PINGBLOCK)) return -1; +#else + if(netmode & ~(NM_WAKEONLAN | NM_PPPOE | NM_PINGBLOCK | NM_FORCEARP)) return -1; +#endif + tmp = getMR(); + tmp |= (uint8_t)netmode; + setMR(tmp); + return 0; +} + +netmode_type wizchip_getnetmode(void) +{ + return (netmode_type) getMR(); +} + +void wizchip_settimeout(wiz_NetTimeout* nettime) +{ + setRCR(nettime->retry_cnt); + setRTR(nettime->time_100us); +} + +void wizchip_gettimeout(wiz_NetTimeout* nettime) +{ + nettime->retry_cnt = getRCR(); + nettime->time_100us = getRTR(); +} diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/wizchip_conf.h b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/wizchip_conf.h new file mode 100644 index 0000000..5d6c1c1 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Ethernet/wizchip_conf.h @@ -0,0 +1,660 @@ +//***************************************************************************** +// +//! \file wizchip_conf.h +//! \brief WIZCHIP Config Header File. +//! \version 1.0.0 +//! \date 2013/10/21 +//! \par Revision history +//! <2015/02/05> Notice +//! The version history is not updated after this point. +//! Download the latest version directly from GitHub. Please visit the our GitHub repository for ioLibrary. +//! >> https://github.com/Wiznet/ioLibrary_Driver +//! <2013/10/21> 1st Release +//! \author MidnightCow +//! \copyright +//! +//! Copyright (c) 2013, WIZnet Co., LTD. +//! All rights reserved. +//! +//! Redistribution and use in source and binary forms, with or without +//! modification, are permitted provided that the following conditions +//! are met: +//! +//! * Redistributions of source code must retain the above copyright +//! notice, this list of conditions and the following disclaimer. +//! * Redistributions in binary form must reproduce the above copyright +//! notice, this list of conditions and the following disclaimer in the +//! documentation and/or other materials provided with the distribution. +//! * Neither the name of the nor the names of its +//! contributors may be used to endorse or promote products derived +//! from this software without specific prior written permission. +//! +//! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +//! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +//! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +//! THE POSSIBILITY OF SUCH DAMAGE. +// +//***************************************************************************** + +/** + * @defgroup extra_functions 2. WIZnet Extra Functions + * + * @brief These functions is optional function. It could be replaced at WIZCHIP I/O function because they were made by WIZCHIP I/O functions. + * @details There are functions of configuring WIZCHIP, network, interrupt, phy, network information and timer. \n + * + */ + +#ifndef _WIZCHIP_CONF_H_ +#define _WIZCHIP_CONF_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +/** + * @brief Select WIZCHIP. + * @todo You should select one, \b W5100, \b W5100S, \b W5200, \b W5300, \b W5500 or etc. \n\n + * ex> #define \_WIZCHIP_ W5500 + */ + +#define W5100 5100 +#define W5100S 5100+5 +#define W5200 5200 +#define W5300 5300 +#define W5500 5500 + +#ifndef _WIZCHIP_ +#define _WIZCHIP_ W5500 // W5100, W5100S, W5200, W5300, W5500 +#endif + +#define _WIZCHIP_IO_MODE_NONE_ 0x0000 +#define _WIZCHIP_IO_MODE_BUS_ 0x0100 /**< Bus interface mode */ +#define _WIZCHIP_IO_MODE_SPI_ 0x0200 /**< SPI interface mode */ +//#define _WIZCHIP_IO_MODE_IIC_ 0x0400 +//#define _WIZCHIP_IO_MODE_SDIO_ 0x0800 +// Add to +// + +#define _WIZCHIP_IO_MODE_BUS_DIR_ (_WIZCHIP_IO_MODE_BUS_ + 1) /**< BUS interface mode for direct */ +#define _WIZCHIP_IO_MODE_BUS_INDIR_ (_WIZCHIP_IO_MODE_BUS_ + 2) /**< BUS interface mode for indirect */ + +#define _WIZCHIP_IO_MODE_SPI_VDM_ (_WIZCHIP_IO_MODE_SPI_ + 1) /**< SPI interface mode for variable length data*/ +#define _WIZCHIP_IO_MODE_SPI_FDM_ (_WIZCHIP_IO_MODE_SPI_ + 2) /**< SPI interface mode for fixed length data mode*/ +#define _WIZCHIP_IO_MODE_SPI_5500_ (_WIZCHIP_IO_MODE_SPI_ + 3) /**< SPI interface mode for fixed length data mode*/ + +#if (_WIZCHIP_ == W5100) + #define _WIZCHIP_ID_ "W5100\0" +/** + * @brief Define interface mode. + * @todo you should select interface mode as chip. Select one of @ref \_WIZCHIP_IO_MODE_SPI_ , @ref \_WIZCHIP_IO_MODE_BUS_DIR_ or @ref \_WIZCHIP_IO_MODE_BUS_INDIR_ + */ +// #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_BUS_DIR_ +// #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_BUS_INDIR_ + #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_ + +//A20150601 : Define the unit of IO DATA. + typedef uint8_t iodata_t; +//A20150401 : Indclude W5100.h file + #include "W5100/w5100.h" + +#elif (_WIZCHIP_ == W5100S) +#define _WIZCHIP_ID_ "W5100S\0" +/** +* @brief Define interface mode. +* @todo you should select interface mode as chip. Select one of @ref \_WIZCHIP_IO_MODE_SPI_ , @ref \_WIZCHIP_IO_MODE_BUS_DIR_ or @ref \_WIZCHIP_IO_MODE_BUS_INDIR_ +*/ +// #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_BUS_INDIR_ + //#define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_5500_ + #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_ + +//A20150601 : Define the unit of IO DATA. + typedef uint8_t iodata_t; +//A20150401 : Indclude W5100.h file + #include "W5100S/w5100s.h" +#elif (_WIZCHIP_ == W5200) + #define _WIZCHIP_ID_ "W5200\0" +/** + * @brief Define interface mode. + * @todo you should select interface mode as chip. Select one of @ref \_WIZCHIP_IO_MODE_SPI_ or @ref \ _WIZCHIP_IO_MODE_BUS_INDIR_ + */ +#ifndef _WIZCHIP_IO_MODE_ +// #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_BUS_INDIR_ + #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_ +#endif +//A20150601 : Define the unit of IO DATA. + typedef uint8_t iodata_t; + #include "W5200/w5200.h" +#elif (_WIZCHIP_ == W5500) + #define _WIZCHIP_ID_ "W5500\0" + +/** + * @brief Define interface mode. \n + * @todo Should select interface mode as chip. + * - @ref \_WIZCHIP_IO_MODE_SPI_ \n + * -@ref \_WIZCHIP_IO_MODE_SPI_VDM_ : Valid only in @ref \_WIZCHIP_ == W5500 \n + * -@ref \_WIZCHIP_IO_MODE_SPI_FDM_ : Valid only in @ref \_WIZCHIP_ == W5500 \n + * - @ref \_WIZCHIP_IO_MODE_BUS_ \n + * - @ref \_WIZCHIP_IO_MODE_BUS_DIR_ \n + * - @ref \_WIZCHIP_IO_MODE_BUS_INDIR_ \n + * - Others will be defined in future. \n\n + * ex> #define \_WIZCHIP_IO_MODE_ \_WIZCHIP_IO_MODE_SPI_VDM_ + * + */ +#ifndef _WIZCHIP_IO_MODE_ + //#define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_FDM_ + #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_SPI_VDM_ +#endif +//A20150601 : Define the unit of IO DATA. + typedef uint8_t iodata_t; + #include "W5500/w5500.h" +#elif ( _WIZCHIP_ == W5300) + #define _WIZCHIP_ID_ "W5300\0" +/** + * @brief Define interface mode. + * @todo you should select interface mode as chip. Select one of @ref \_WIZCHIP_IO_MODE_SPI_ , @ref \_WIZCHIP_IO_MODE_BUS_DIR_ or @ref \_WIZCHIP_IO_MODE_BUS_INDIR_ + */ +#ifndef _WIZCHIP_IO_MODE_ +// #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_BUS_DIR_ + #define _WIZCHIP_IO_MODE_ _WIZCHIP_IO_MODE_BUS_INDIR_ +#endif + +//A20150601 : Define the unit and bus width of IO DATA. + /** + * @brief Select the data width 8 or 16 bits. + * @todo you should select the bus width. Select one of 8 or 16. + */ + #ifndef _WIZCHIP_IO_BUS_WIDTH_ + #define _WIZCHIP_IO_BUS_WIDTH_ 8 // 16 + #endif + #if _WIZCHIP_IO_BUS_WIDTH_ == 8 + typedef uint8_t iodata_t; + #elif _WIZCHIP_IO_BUS_WIDTH_ == 16 + typedef uint16_t iodata_t; + #else + #error "Unknown _WIZCHIP_IO_BUS_WIDTH_. It should be 8 or 16." + #endif +// + #include "W5300/w5300.h" +#else + #error "Unknown defined _WIZCHIP_. You should define one of 5100, 5200, and 5500 !!!" +#endif + +#ifndef _WIZCHIP_IO_MODE_ + #error "Undefined _WIZCHIP_IO_MODE_. You should define it !!!" +#endif + +/** + * @brief Define I/O base address when BUS IF mode. + * @todo Should re-define it to fit your system when BUS IF Mode (@ref \_WIZCHIP_IO_MODE_BUS_, + * @ref \_WIZCHIP_IO_MODE_BUS_DIR_, @ref \_WIZCHIP_IO_MODE_BUS_INDIR_). \n\n + * ex> #define \_WIZCHIP_IO_BASE_ 0x00008000 + */ +#if _WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_ + #define _WIZCHIP_IO_BASE_ 0x60000000 // for 5100S IND +#elif _WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_ + #define _WIZCHIP_IO_BASE_ 0x00000000 // for 5100S SPI +#endif + +#ifndef _WIZCHIP_IO_BASE_ +#define _WIZCHIP_IO_BASE_ 0x00000000 // 0x8000 +#endif + +//M20150401 : Typing Error +//#if _WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS +#if _WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_ + #ifndef _WIZCHIP_IO_BASE_ + #error "You should be define _WIZCHIP_IO_BASE to fit your system memory map." + #endif +#endif + +#if _WIZCHIP_ >= W5200 + #define _WIZCHIP_SOCK_NUM_ 8 ///< The count of independant socket of @b WIZCHIP +#else + #define _WIZCHIP_SOCK_NUM_ 4 ///< The count of independant socket of @b WIZCHIP +#endif + + +/******************************************************** +* WIZCHIP BASIC IF functions for SPI, SDIO, I2C , ETC. +*********************************************************/ +/** + * @ingroup DATA_TYPE + * @brief The set of callback functions for W5500:@ref WIZCHIP_IO_Functions W5200:@ref WIZCHIP_IO_Functions_W5200 + */ +typedef struct __WIZCHIP +{ + uint16_t if_mode; ///< host interface mode + uint8_t id[6]; ///< @b WIZCHIP ID such as @b 5100, @b 5200, @b 5500, and so on. + /** + * The set of critical section callback func. + */ + struct _CRIS + { + void (*_enter) (void); ///< crtical section enter + void (*_exit) (void); ///< critial section exit + }CRIS; + /** + * The set of @ref \_WIZCHIP_ select control callback func. + */ + struct _CS + { + void (*_select) (void); ///< @ref \_WIZCHIP_ selected + void (*_deselect)(void); ///< @ref \_WIZCHIP_ deselected + }CS; + /** + * The set of interface IO callback func. + */ + union _IF + { + /** + * For BUS interface IO + */ + //M20156501 : Modify the function name for integrating with W5300 + //struct + //{ + // uint8_t (*_read_byte) (uint32_t AddrSel); + // void (*_write_byte) (uint32_t AddrSel, uint8_t wb); + //}BUS; + struct + { + iodata_t (*_read_data) (uint32_t AddrSel); + void (*_write_data) (uint32_t AddrSel, iodata_t wb); + }BUS; + + /** + * For SPI interface IO + */ + struct + { + uint8_t (*_read_byte) (void); + void (*_write_byte) (uint8_t wb); + void (*_read_burst) (uint8_t* pBuf, uint16_t len); + void (*_write_burst) (uint8_t* pBuf, uint16_t len); + }SPI; + // To be added + // + }IF; +}_WIZCHIP; + +extern _WIZCHIP WIZCHIP; + +/** + * @ingroup DATA_TYPE + * WIZCHIP control type enumration used in @ref ctlwizchip(). + */ +typedef enum +{ + CW_RESET_WIZCHIP, ///< Resets WIZCHIP by softly + CW_INIT_WIZCHIP, ///< Initializes to WIZCHIP with SOCKET buffer size 2 or 1 dimension array typed uint8_t. + CW_GET_INTERRUPT, ///< Get Interrupt status of WIZCHIP + CW_CLR_INTERRUPT, ///< Clears interrupt + CW_SET_INTRMASK, ///< Masks interrupt + CW_GET_INTRMASK, ///< Get interrupt mask + CW_SET_INTRTIME, ///< Set interval time between the current and next interrupt. + CW_GET_INTRTIME, ///< Set interval time between the current and next interrupt. + CW_GET_ID, ///< Gets WIZCHIP name. + +//D20150601 : For no modification your application code +//#if _WIZCHIP_ == W5500 + CW_RESET_PHY, ///< Resets internal PHY. Valid Only W5500 + CW_SET_PHYCONF, ///< When PHY configured by internal register, PHY operation mode (Manual/Auto, 10/100, Half/Full). Valid Only W5000 + CW_GET_PHYCONF, ///< Get PHY operation mode in internal register. Valid Only W5500 + CW_GET_PHYSTATUS, ///< Get real PHY status on operating. Valid Only W5500 + CW_SET_PHYPOWMODE, ///< Set PHY power mode as normal and down when PHYSTATUS.OPMD == 1. Valid Only W5500 +//#endif +//D20150601 : For no modification your application code +//#if _WIZCHIP_ == W5200 || _WIZCHIP_ == W5500 + CW_GET_PHYPOWMODE, ///< Get PHY Power mode as down or normal, Valid Only W5100, W5200 + CW_GET_PHYLINK ///< Get PHY Link status, Valid Only W5100, W5200 +//#endif +}ctlwizchip_type; + +/** + * @ingroup DATA_TYPE + * Network control type enumration used in @ref ctlnetwork(). + */ +typedef enum +{ + CN_SET_NETINFO, ///< Set Network with @ref wiz_NetInfo + CN_GET_NETINFO, ///< Get Network with @ref wiz_NetInfo + CN_SET_NETMODE, ///< Set network mode as WOL, PPPoE, Ping Block, and Force ARP mode + CN_GET_NETMODE, ///< Get network mode as WOL, PPPoE, Ping Block, and Force ARP mode + CN_SET_TIMEOUT, ///< Set network timeout as retry count and time. + CN_GET_TIMEOUT, ///< Get network timeout as retry count and time. +}ctlnetwork_type; + +/** + * @ingroup DATA_TYPE + * Interrupt kind when CW_SET_INTRRUPT, CW_GET_INTERRUPT, CW_SET_INTRMASK + * and CW_GET_INTRMASK is used in @ref ctlnetwork(). + * It can be used with OR operation. + */ +typedef enum +{ +#if _WIZCHIP_ == W5500 + IK_WOL = (1 << 4), ///< Wake On Lan by receiving the magic packet. Valid in W500. +#elif _WIZCHIP_ == W5300 + IK_FMTU = (1 << 4), ///< Received a ICMP message (Fragment MTU) +#endif + + IK_PPPOE_TERMINATED = (1 << 5), ///< PPPoE Disconnected + +#if _WIZCHIP_ != W5200 + IK_DEST_UNREACH = (1 << 6), ///< Destination IP & Port Unreachable, No use in W5200 +#endif + + IK_IP_CONFLICT = (1 << 7), ///< IP conflict occurred + + IK_SOCK_0 = (1 << 8), ///< Socket 0 interrupt + IK_SOCK_1 = (1 << 9), ///< Socket 1 interrupt + IK_SOCK_2 = (1 << 10), ///< Socket 2 interrupt + IK_SOCK_3 = (1 << 11), ///< Socket 3 interrupt +#if _WIZCHIP_ > W5100S + IK_SOCK_4 = (1 << 12), ///< Socket 4 interrupt, No use in 5100 + IK_SOCK_5 = (1 << 13), ///< Socket 5 interrupt, No use in 5100 + IK_SOCK_6 = (1 << 14), ///< Socket 6 interrupt, No use in 5100 + IK_SOCK_7 = (1 << 15), ///< Socket 7 interrupt, No use in 5100 +#endif + +#if _WIZCHIP_ > W5100S + IK_SOCK_ALL = (0xFF << 8) ///< All Socket interrupt +#else + IK_SOCK_ALL = (0x0F << 8) ///< All Socket interrupt +#endif +}intr_kind; + +#define PHY_CONFBY_HW 0 ///< Configured PHY operation mode by HW pin +#define PHY_CONFBY_SW 1 ///< Configured PHY operation mode by SW register +#define PHY_MODE_MANUAL 0 ///< Configured PHY operation mode with user setting. +#define PHY_MODE_AUTONEGO 1 ///< Configured PHY operation mode with auto-negotiation +#define PHY_SPEED_10 0 ///< Link Speed 10 +#define PHY_SPEED_100 1 ///< Link Speed 100 +#define PHY_DUPLEX_HALF 0 ///< Link Half-Duplex +#define PHY_DUPLEX_FULL 1 ///< Link Full-Duplex +#define PHY_LINK_OFF 0 ///< Link Off +#define PHY_LINK_ON 1 ///< Link On +#define PHY_POWER_NORM 0 ///< PHY power normal mode +#define PHY_POWER_DOWN 1 ///< PHY power down mode + + +#if _WIZCHIP_ == W5100S || _WIZCHIP_ == W5500 +/** + * @ingroup DATA_TYPE + * It configures PHY configuration when CW_SET PHYCONF or CW_GET_PHYCONF in W5500, + * and it indicates the real PHY status configured by HW or SW in all WIZCHIP. \n + * Valid only in W5500. + */ +typedef struct wiz_PhyConf_t +{ + uint8_t by; ///< set by @ref PHY_CONFBY_HW or @ref PHY_CONFBY_SW + uint8_t mode; ///< set by @ref PHY_MODE_MANUAL or @ref PHY_MODE_AUTONEGO + uint8_t speed; ///< set by @ref PHY_SPEED_10 or @ref PHY_SPEED_100 + uint8_t duplex; ///< set by @ref PHY_DUPLEX_HALF @ref PHY_DUPLEX_FULL + //uint8_t power; ///< set by @ref PHY_POWER_NORM or @ref PHY_POWER_DOWN + //uint8_t link; ///< Valid only in CW_GET_PHYSTATUS. set by @ref PHY_LINK_ON or PHY_DUPLEX_OFF + }wiz_PhyConf; +#endif + +/** + * @ingroup DATA_TYPE + * It used in setting dhcp_mode of @ref wiz_NetInfo. + */ +typedef enum +{ + NETINFO_STATIC = 1, ///< Static IP configuration by manually. + NETINFO_DHCP ///< Dynamic IP configruation from a DHCP sever +}dhcp_mode; + +/** + * @ingroup DATA_TYPE + * Network Information for WIZCHIP + */ +typedef struct wiz_NetInfo_t +{ + uint8_t mac[6]; ///< Source Mac Address + uint8_t ip[4]; ///< Source IP Address + uint8_t sn[4]; ///< Subnet Mask + uint8_t gw[4]; ///< Gateway IP Address + uint8_t dns[4]; ///< DNS server IP Address + dhcp_mode dhcp; ///< 1 - Static, 2 - DHCP +}wiz_NetInfo; + +/** + * @ingroup DATA_TYPE + * Network mode + */ +typedef enum +{ +#if _WIZCHIP_ == W5500 + NM_FORCEARP = (1<<1), ///< Force to APP send whenever udp data is sent. Valid only in W5500 +#endif + NM_WAKEONLAN = (1<<5), ///< Wake On Lan + NM_PINGBLOCK = (1<<4), ///< Block ping-request + NM_PPPOE = (1<<3), ///< PPPoE mode +}netmode_type; + +/** + * @ingroup DATA_TYPE + * Used in CN_SET_TIMEOUT or CN_GET_TIMEOUT of @ref ctlwizchip() for timeout configruation. + */ +typedef struct wiz_NetTimeout_t +{ + uint8_t retry_cnt; ///< retry count + uint16_t time_100us; ///< time unit 100us +}wiz_NetTimeout; + +/** + *@brief Registers call back function for critical section of I/O functions such as + *\ref WIZCHIP_READ, @ref WIZCHIP_WRITE, @ref WIZCHIP_READ_BUF and @ref WIZCHIP_WRITE_BUF. + *@param cris_en : callback function for critical section enter. + *@param cris_ex : callback function for critical section exit. + *@todo Describe @ref WIZCHIP_CRITICAL_ENTER and @ref WIZCHIP_CRITICAL_EXIT marco or register your functions. + *@note If you do not describe or register, default functions(@ref wizchip_cris_enter & @ref wizchip_cris_exit) is called. + */ +void reg_wizchip_cris_cbfunc(void(*cris_en)(void), void(*cris_ex)(void)); + + +/** + *@brief Registers call back function for WIZCHIP select & deselect. + *@param cs_sel : callback function for WIZCHIP select + *@param cs_desel : callback fucntion for WIZCHIP deselect + *@todo Describe @ref wizchip_cs_select and @ref wizchip_cs_deselect function or register your functions. + *@note If you do not describe or register, null function is called. + */ +void reg_wizchip_cs_cbfunc(void(*cs_sel)(void), void(*cs_desel)(void)); + +/** + *@brief Registers call back function for bus interface. + *@param bus_rb : callback function to read byte data using system bus + *@param bus_wb : callback function to write byte data using system bus + *@todo Describe @ref wizchip_bus_readbyte and @ref wizchip_bus_writebyte function + *or register your functions. + *@note If you do not describe or register, null function is called. + */ +//M20150601 : For integrating with W5300 +//void reg_wizchip_bus_cbfunc(uint8_t (*bus_rb)(uint32_t addr), void (*bus_wb)(uint32_t addr, uint8_t wb)); +void reg_wizchip_bus_cbfunc(iodata_t (*bus_rb)(uint32_t addr), void (*bus_wb)(uint32_t addr, iodata_t wb)); + +/** + *@brief Registers call back function for SPI interface. + *@param spi_rb : callback function to read byte using SPI + *@param spi_wb : callback function to write byte using SPI + *@todo Describe \ref wizchip_spi_readbyte and \ref wizchip_spi_writebyte function + *or register your functions. + *@note If you do not describe or register, null function is called. + */ +void reg_wizchip_spi_cbfunc(uint8_t (*spi_rb)(void), void (*spi_wb)(uint8_t wb)); + +/** + *@brief Registers call back function for SPI interface. + *@param spi_rb : callback function to burst read using SPI + *@param spi_wb : callback function to burst write using SPI + *@todo Describe \ref wizchip_spi_readbyte and \ref wizchip_spi_writebyte function + *or register your functions. + *@note If you do not describe or register, null function is called. + */ +void reg_wizchip_spiburst_cbfunc(void (*spi_rb)(uint8_t* pBuf, uint16_t len), void (*spi_wb)(uint8_t* pBuf, uint16_t len)); + +/** + * @ingroup extra_functions + * @brief Controls to the WIZCHIP. + * @details Resets WIZCHIP & internal PHY, Configures PHY mode, Monitor PHY(Link,Speed,Half/Full/Auto), + * controls interrupt & mask and so on. + * @param cwtype : Decides to the control type + * @param arg : arg type is dependent on cwtype. + * @return 0 : Success \n + * -1 : Fail because of invalid \ref ctlwizchip_type or unsupported \ref ctlwizchip_type in WIZCHIP + */ +int8_t ctlwizchip(ctlwizchip_type cwtype, void* arg); + +/** + * @ingroup extra_functions + * @brief Controls to network. + * @details Controls to network environment, mode, timeout and so on. + * @param cntype : Input. Decides to the control type + * @param arg : Inout. arg type is dependent on cntype. + * @return -1 : Fail because of invalid \ref ctlnetwork_type or unsupported \ref ctlnetwork_type in WIZCHIP \n + * 0 : Success + */ +int8_t ctlnetwork(ctlnetwork_type cntype, void* arg); + + +/* + * The following functions are implemented for internal use. + * but You can call these functions for code size reduction instead of ctlwizchip() and ctlnetwork(). + */ + +/** + * @ingroup extra_functions + * @brief Reset WIZCHIP by softly. + */ +void wizchip_sw_reset(void); + +/** + * @ingroup extra_functions + * @brief Initializes WIZCHIP with socket buffer size + * @param txsize Socket tx buffer sizes. If null, initialized the default size 2KB. + * @param rxsize Socket rx buffer sizes. If null, initialized the default size 2KB. + * @return 0 : succcess \n + * -1 : fail. Invalid buffer size + */ +int8_t wizchip_init(uint8_t* txsize, uint8_t* rxsize); + +/** + * @ingroup extra_functions + * @brief Clear Interrupt of WIZCHIP. + * @param intr : @ref intr_kind value operated OR. It can type-cast to uint16_t. + */ +void wizchip_clrinterrupt(intr_kind intr); + +/** + * @ingroup extra_functions + * @brief Get Interrupt of WIZCHIP. + * @return @ref intr_kind value operated OR. It can type-cast to uint16_t. + */ +intr_kind wizchip_getinterrupt(void); + +/** + * @ingroup extra_functions + * @brief Mask or Unmask Interrupt of WIZCHIP. + * @param intr : @ref intr_kind value operated OR. It can type-cast to uint16_t. + */ +void wizchip_setinterruptmask(intr_kind intr); + +/** + * @ingroup extra_functions + * @brief Get Interrupt mask of WIZCHIP. + * @return : The operated OR vaule of @ref intr_kind. It can type-cast to uint16_t. + */ +intr_kind wizchip_getinterruptmask(void); + +//todo +#if _WIZCHIP_ > W5100 + int8_t wizphy_getphylink(void); ///< get the link status of phy in WIZCHIP. No use in W5100 + int8_t wizphy_getphypmode(void); ///< get the power mode of PHY in WIZCHIP. No use in W5100 +#endif + +#if _WIZCHIP_ == W5100S || _WIZCHIP_ == W5500 + void wizphy_reset(void); ///< Reset phy. Vailid only in W5500 +/** + * @ingroup extra_functions + * @brief Set the phy information for WIZCHIP without power mode + * @param phyconf : @ref wiz_PhyConf + */ + void wizphy_setphyconf(wiz_PhyConf* phyconf); + /** + * @ingroup extra_functions + * @brief Get phy configuration information. + * @param phyconf : @ref wiz_PhyConf + */ + void wizphy_getphyconf(wiz_PhyConf* phyconf); + /** + * @ingroup extra_functions + * @brief Get phy status. + * @param phyconf : @ref wiz_PhyConf + */ + void wizphy_getphystat(wiz_PhyConf* phyconf); + /** + * @ingroup extra_functions + * @brief set the power mode of phy inside WIZCHIP. Refer to @ref PHYCFGR in W5500, @ref PHYSTATUS in W5200 + * @param pmode Settig value of power down mode. + */ + int8_t wizphy_setphypmode(uint8_t pmode); +#endif + +/** +* @ingroup extra_functions + * @brief Set the network information for WIZCHIP + * @param pnetinfo : @ref wizNetInfo + */ +void wizchip_setnetinfo(wiz_NetInfo* pnetinfo); + +/** + * @ingroup extra_functions + * @brief Get the network information for WIZCHIP + * @param pnetinfo : @ref wizNetInfo + */ +void wizchip_getnetinfo(wiz_NetInfo* pnetinfo); + +/** + * @ingroup extra_functions + * @brief Set the network mode such WOL, PPPoE, Ping Block, and etc. + * @param pnetinfo Value of network mode. Refer to @ref netmode_type. + */ +int8_t wizchip_setnetmode(netmode_type netmode); + +/** + * @ingroup extra_functions + * @brief Get the network mode such WOL, PPPoE, Ping Block, and etc. + * @return Value of network mode. Refer to @ref netmode_type. + */ +netmode_type wizchip_getnetmode(void); + +/** + * @ingroup extra_functions + * @brief Set retry time value(@ref _RTR_) and retry count(@ref _RCR_). + * @details @ref _RTR_ configures the retransmission timeout period and @ref _RCR_ configures the number of time of retransmission. + * @param nettime @ref _RTR_ value and @ref _RCR_ value. Refer to @ref wiz_NetTimeout. + */ +void wizchip_settimeout(wiz_NetTimeout* nettime); + +/** + * @ingroup extra_functions + * @brief Get retry time value(@ref _RTR_) and retry count(@ref _RCR_). + * @details @ref _RTR_ configures the retransmission timeout period and @ref _RCR_ configures the number of time of retransmission. + * @param nettime @ref _RTR_ value and @ref _RCR_ value. Refer to @ref wiz_NetTimeout. + */ +void wizchip_gettimeout(wiz_NetTimeout* nettime); +#ifdef __cplusplus + } +#endif + +#endif // _WIZCHIP_CONF_H_ diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpParser.c b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpParser.c new file mode 100644 index 0000000..0aead49 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpParser.c @@ -0,0 +1,402 @@ +/** + @file httpd.c + @brief functions associated http processing + */ + +#include +#include +#include "socket.h" +#include "httpParser.h" + +/***************************************************************************** + * Public types/enumerations/variables + ****************************************************************************/ +//uint8_t BUFPUB[2048]; +uint8_t BUFPUB[256]; + +/***************************************************************************** + * Private functions + ****************************************************************************/ +static void replacetochar(uint8_t * str, uint8_t oldchar, uint8_t newchar); /* Replace old character with new character in the string */ +static uint8_t C2D(uint8_t c); /* Convert a character to HEX */ + +/** + @brief convert escape characters(%XX) to ASCII character + */ +void unescape_http_url( + char * url /**< pointer to be converted ( escape characters )*/ + ) +{ + int x, y; + + for (x = 0, y = 0; url[y]; ++x, ++y) { + if ((url[x] = url[y]) == '%') { + url[x] = C2D(url[y+1])*0x10+C2D(url[y+2]); + y+=2; + } + } + url[x] = '\0'; +} + + +/** + @brief make response header such as html, gif, jpeg,etc. + */ +void make_http_response_head( + char * buf, /**< pointer to response header to be made */ + char type, /**< response type */ + uint32_t len /**< size of response header */ + ) +{ + const char * head; + char tmp[10]; + + /* file type*/ + if (type == PTYPE_HTML) head = PSTR(RES_HTMLHEAD_OK); + else if (type == PTYPE_GIF) head = PSTR(RES_GIFHEAD_OK); + else if (type == PTYPE_TEXT) head = PSTR(RES_TEXTHEAD_OK); + else if (type == PTYPE_JPEG) head = PSTR(RES_JPEGHEAD_OK); + else if (type == PTYPE_FLASH) head = PSTR(RES_FLASHHEAD_OK); + else if (type == PTYPE_XML) head = PSTR(RES_XMLHEAD_OK); + else if (type == PTYPE_CSS) head = PSTR(RES_CSSHEAD_OK); + else if (type == PTYPE_JSON) head = PSTR(RES_JSONHEAD_OK); + else if (type == PTYPE_JS) head = PSTR(RES_JSHEAD_OK); + else if (type == PTYPE_CGI) head = PSTR(RES_CGIHEAD_OK); + else if (type == PTYPE_PNG) head = PSTR(RES_PNGHEAD_OK); + else if (type == PTYPE_ICO) head = PSTR(RES_ICOHEAD_OK); + else if (type == PTYPE_TTF) head = PSTR(RES_TTFHEAD_OK); + else if (type == PTYPE_OTF) head = PSTR(RES_OTFHEAD_OK); + else if (type == PTYPE_WOFF) head = PSTR(RES_WOFFHEAD_OK); + else if (type == PTYPE_EOT) head = PSTR(RES_EOTHEAD_OK); + else if (type == PTYPE_SVG) head = PSTR(RES_SVGHEAD_OK); +#ifdef _HTTPPARSER_DEBUG_ + else + { + head = NULL; + PRINTF("\r\n\r\n-MAKE HEAD UNKNOWN-\r\n"); + } +#else + else head = NULL; +#endif + + sprintf(tmp, "%ld", len); + strcpy_P(buf, head); + strcat(buf, tmp); + strcat(buf, "\r\n\r\n"); +} + + +/** + @brief find MIME type of a file + */ +void find_http_uri_type( + uint8_t * type, /**< type to be returned */ + uint8_t * buff /**< file name */ + ) +{ + /* Decide type according to extension*/ + + char * buf; + buf = (char *)buff; + + if (strstr_P(buf, PSTR(".htm")) || strstr_P(buf, PSTR(".html"))) *type = PTYPE_HTML; + else if (strstr_P(buf, PSTR(".gif"))) *type = PTYPE_GIF; + else if (strstr_P(buf, PSTR(".text")) || strstr_P(buf,PSTR(".txt"))) *type = PTYPE_TEXT; + else if (strstr_P(buf, PSTR(".jpeg")) || strstr_P(buf,PSTR(".jpg"))) *type = PTYPE_JPEG; + else if (strstr_P(buf, PSTR(".swf"))) *type = PTYPE_FLASH; + else if (strstr_P(buf, PSTR(".cgi")) || strstr_P(buf,PSTR(".CGI"))) *type = PTYPE_CGI; + else if (strstr_P(buf, PSTR(".json")) || strstr_P(buf,PSTR(".JSON"))) *type = PTYPE_JSON; + else if (strstr_P(buf, PSTR(".js")) || strstr_P(buf,PSTR(".JS"))) *type = PTYPE_JS; + else if (strstr_P(buf, PSTR(".CGI")) || strstr_P(buf,PSTR(".cgi"))) *type = PTYPE_CGI; + else if (strstr_P(buf, PSTR(".xml")) || strstr_P(buf,PSTR(".XML"))) *type = PTYPE_XML; + else if (strstr_P(buf, PSTR(".css")) || strstr_P(buf,PSTR(".CSS"))) *type = PTYPE_CSS; + else if (strstr_P(buf, PSTR(".png")) || strstr_P(buf,PSTR(".PNG"))) *type = PTYPE_PNG; + else if (strstr_P(buf, PSTR(".ico")) || strstr_P(buf,PSTR(".ICO"))) *type = PTYPE_ICO; + else if (strstr_P(buf, PSTR(".ttf")) || strstr_P(buf,PSTR(".TTF"))) *type = PTYPE_TTF; + else if (strstr_P(buf, PSTR(".otf")) || strstr_P(buf,PSTR(".OTF"))) *type = PTYPE_OTF; + else if (strstr_P(buf, PSTR(".woff")) || strstr_P(buf,PSTR(".WOFF"))) *type = PTYPE_WOFF; + else if (strstr_P(buf, PSTR(".eot")) || strstr_P(buf,PSTR(".EOT"))) *type = PTYPE_EOT; + else if (strstr_P(buf, PSTR(".svg")) || strstr_P(buf,PSTR(".SVG"))) *type = PTYPE_SVG; + else *type = PTYPE_ERR; +} + + +/** + @brief parse http request from a peer + */ +void parse_http_request( + st_http_request * request, /**< request to be returned */ + uint8_t * buf /**< pointer to be parsed */ + ) +{ + char * nexttok; + nexttok = strtok((char*)buf," "); + if(!nexttok) + { + request->METHOD = METHOD_ERR; + return; + } + if(!strcmp_P(nexttok, PSTR("GET")) || !strcmp_P(nexttok,PSTR("get"))) + { + request->METHOD = METHOD_GET; + nexttok = strtok(NULL," "); + + } + else if (!strcmp_P(nexttok, PSTR("HEAD")) || !strcmp_P(nexttok,PSTR("head"))) + { + request->METHOD = METHOD_HEAD; + nexttok = strtok(NULL," "); + + } + else if (!strcmp_P(nexttok, PSTR("POST")) || !strcmp_P(nexttok,PSTR("post"))) + { + nexttok = strtok(NULL,"\0"); + request->METHOD = METHOD_POST; + } + else + { + request->METHOD = METHOD_ERR; + } + + if(!nexttok) + { + request->METHOD = METHOD_ERR; + return; + } + strcpy((char *)request->URI, nexttok); +} + +#ifdef _OLD_ +/** + @brief get next parameter value in the request + */ +uint8_t * get_http_param_value( + char* uri, + char* param_name + ) +{ + char tempURI[MAX_URI_SIZE]; + uint8_t * name = 0; + + + if(!uri || !param_name) return 0; + + strcpy((char*)tempURI,uri); + if((name = (uint8_t*)strstr(tempURI, param_name))) + { + name += strlen(param_name) + 1; // strlen(para_name) + strlen("=") + if((name = (uint8_t*)strtok((char *)name,"& \r\n\t\0"))) + { + unescape_http_url((char *)name); + replacetochar(name, '+', ' '); + } + } +#ifdef _HTTPPARSER_DEBUG_ + printf(" %s=%s",param_name,name); +#endif + + return name; +} +#else +/** + @brief get next parameter value in the request + */ +uint8_t * get_http_param_value(char* uri, char* param_name) +{ + + uint8_t * name = 0; + uint8_t * ret = BUFPUB; + uint8_t * pos2; + uint16_t len = 0, content_len = 0; + uint8_t tmp_buf[10]={0x00, }; + + if(!uri || !param_name) return 0; + + /***************/ + mid(uri, "Content-Length: ", "\r\n", (char *)tmp_buf); + content_len = ATOI(tmp_buf, 10); + uri = strstr(uri, "\r\n\r\n"); + uri += 4; + uri[content_len] = 0; + /***************/ + + if((name = (uint8_t *)strstr(uri, param_name))) + { + name += strlen(param_name) + 1; + pos2 = (uint8_t*)strstr((char*)name, "&"); + if(!pos2) + { + pos2 = name + strlen((char*)name); + } + len = pos2 - name; + + if(len) + { + ret[len] = 0; + strncpy((char*)ret,(char*)name, len); + unescape_http_url((char *)ret); + replacetochar(ret, '+' ,' '); + //ret[len] = 0; + //ret[strlen((int8*)ret)] = 0; + //printf("len=%d\r\n",len); + } + else + { + ret[0] = 0; + } + } + else + { + return 0; + } +#ifdef _HTTPPARSER_DEBUG_ + printf(" %s=%s\r\n", param_name, ret); +#endif + return ret; +} +#endif + +#ifdef _OLD_ +uint8_t * get_http_uri_name(uint8_t * uri) +{ + char tempURI[MAX_URI_SIZE]; + uint8_t * uri_name; + + if(!uri) return 0; + + strcpy(tempURI, (char *)uri); + + uri_name = (uint8_t *)strtok(tempURI, " ?"); + + if(strcmp((char *)uri_name,"/")) uri_name++; + +#ifdef _HTTPPARSER_DEBUG_ + printf(" uri_name = %s\r\n", uri_name); +#endif + + return uri_name; +} +#else + +uint8_t get_http_uri_name(uint8_t * uri, uint8_t * uri_buf) +{ + uint8_t * uri_ptr; + if(!uri) return 0; + + strcpy((char *)uri_buf, (char *)uri); + + uri_ptr = (uint8_t *)strtok((char *)uri_buf, " ?"); + + if(strcmp((char *)uri_ptr,"/")) uri_ptr++; + strcpy((char *)uri_buf, (char *)uri_ptr); + +#ifdef _HTTPPARSER_DEBUG_ + PRINTF(" uri_name = %s\r\n", uri_buf); +#endif + + return 1; +} + +#endif + +void inet_addr_(uint8_t * addr, uint8_t *ip) +{ + uint8_t i; + uint8_t taddr[30]; + uint8_t * nexttok; + uint8_t num; + + strcpy((char *)taddr, (char *)addr); + + nexttok = taddr; + for(i = 0; i < 4 ; i++) + { + nexttok = (uint8_t *)strtok((char *)nexttok, "."); + if(nexttok[0] == '0' && nexttok[1] == 'x') num = ATOI(nexttok+2,0x10); + else num = ATOI(nexttok,10); + ip[i] = num; + nexttok = NULL; + } +} + + +/** +@brief CONVERT STRING INTO INTEGER +@return a integer number +*/ +uint16_t ATOI( + uint8_t * str, /**< is a pointer to convert */ + uint8_t base /**< is a base value (must be in the range 2 - 16) */ + ) +{ + unsigned int num = 0; +// debug_2013_11_25 +// while (*str !=0) + while ((*str !=0) && (*str != 0x20)) // not include the space(0x020) + num = num * base + C2D(*str++); + return num; +} + +/** + * @brief Check strings and then execute callback function by each string. + * @param src The information of URI + * @param s1 The start string to be researched + * @param s2 The end string to be researched + * @param sub The string between s1 and s2 + * @return The length value atfer working + */ +void mid(char* src, char* s1, char* s2, char* sub) +{ + char* sub1; + char* sub2; + uint16_t n; + + sub1=strstr((char*)src,(char*)s1); + sub1+=strlen((char*)s1); + sub2=strstr((char*)sub1,(char*)s2); + + n=sub2-sub1; + strncpy((char*)sub,(char*)sub1,n); + sub[n]='\0'; +} + +//////////////////////////////////////////////////////////////////// +// Static functions +//////////////////////////////////////////////////////////////////// + +/** +@brief replace the specified character in a string with new character +*/ +static void replacetochar( + uint8_t * str, /**< pointer to be replaced */ + uint8_t oldchar, /**< old character */ + uint8_t newchar /**< new character */ + ) +{ + int x; + for (x = 0; str[x]; x++) + if (str[x] == oldchar) str[x] = newchar; +} + +/** +@brief CONVERT CHAR INTO HEX +@return HEX + +This function converts HEX(0-F) to a character +*/ +static uint8_t C2D( + uint8_t c /**< is a character('0'-'F') to convert to HEX */ + ) +{ + if (c >= '0' && c <= '9') + return c - '0'; + if (c >= 'a' && c <= 'f') + return 10 + c -'a'; + if (c >= 'A' && c <= 'F') + return 10 + c -'A'; + + return (char)c; +} + + + diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpParser.h b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpParser.h new file mode 100644 index 0000000..c289c2e --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpParser.h @@ -0,0 +1,159 @@ +/** + @file httpd.h + @brief Define Constants and fucntions associated with HTTP protocol. + */ + +#include +#include "../../globals.h" + +#ifndef __HTTPPARSER_H__ +#define __HTTPPARSER_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +//#define _HTTPPARSER_DEBUG_ + +#define HTTP_SERVER_PORT 80 /**< HTTP server well-known port number */ + +/* HTTP Method */ +#define METHOD_ERR 0 /**< Error Method. */ +#define METHOD_GET 1 /**< GET Method. */ +#define METHOD_HEAD 2 /**< HEAD Method. */ +#define METHOD_POST 3 /**< POST Method. */ + +/* HTTP GET Method */ +#define PTYPE_ERR 0 /**< Error file. */ +#define PTYPE_HTML 1 /**< HTML file. */ +#define PTYPE_GIF 2 /**< GIF file. */ +#define PTYPE_TEXT 3 /**< TEXT file. */ +#define PTYPE_JPEG 4 /**< JPEG file. */ +#define PTYPE_FLASH 5 /**< FLASH file. */ +#define PTYPE_MPEG 6 /**< MPEG file. */ +#define PTYPE_PDF 7 /**< PDF file. */ +#define PTYPE_CGI 8 /**< CGI file. */ +#define PTYPE_XML 9 /**< XML file. */ +#define PTYPE_CSS 10 /**< CSS file. */ +#define PTYPE_JS 11 /**< JavaScript file. */ +#define PTYPE_JSON 12 /**< JSON (JavaScript Standard Object Notation) file. */ +#define PTYPE_PNG 13 /**< PNG file. */ +#define PTYPE_ICO 14 /**< ICON file. */ + +#define PTYPE_TTF 20 /**< Font type: TTF file. */ +#define PTYPE_OTF 21 /**< Font type: OTF file. */ +#define PTYPE_WOFF 22 /**< Font type: WOFF file. */ +#define PTYPE_EOT 23 /**< Font type: EOT file. */ +#define PTYPE_SVG 24 /**< Font type: SVG file. */ + + +/* HTTP response */ +#define STATUS_OK 200 +#define STATUS_CREATED 201 +#define STATUS_ACCEPTED 202 +#define STATUS_NO_CONTENT 204 +#define STATUS_MV_PERM 301 +#define STATUS_MV_TEMP 302 +#define STATUS_NOT_MODIF 304 +#define STATUS_BAD_REQ 400 +#define STATUS_UNAUTH 401 +#define STATUS_FORBIDDEN 403 +#define STATUS_NOT_FOUND 404 +#define STATUS_INT_SERR 500 +#define STATUS_NOT_IMPL 501 +#define STATUS_BAD_GATEWAY 502 +#define STATUS_SERV_UNAVAIL 503 + +/* HTML Doc. for ERROR */ +static const char PROGMEM ERROR_HTML_PAGE[] = "HTTP/1.1 404 Not Found\r\nContent-Type: text/html\r\nContent-Length: 78\r\n\r\n\r\n\r\nSorry, the page you requested was not found.\r\n\r\n\r\n\0"; +static const char PROGMEM ERROR_REQUEST_PAGE[] = "HTTP/1.1 400 OK\r\nContent-Type: text/html\r\nContent-Length: 50\r\n\r\n\r\n\r\nInvalid request.\r\n\r\n\r\n\0"; + +/* HTML Doc. for CGI result */ +#define HTML_HEADER "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: " + +/* Response header for HTML*/ +#define RES_HTMLHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: keep-alive\r\nContent-Length: " + +/* Response head for TEXT */ +#define RES_TEXTHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: " + +/* Response head for GIF */ +#define RES_GIFHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: image/gif\r\nContent-Length: " + +/* Response head for JPEG */ +#define RES_JPEGHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: image/jpeg\r\nContent-Length: " + +/* Response head for PNG */ +#define RES_PNGHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: image/png\r\nContent-Length: " + +/* Response head for FLASH */ +#define RES_FLASHHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: application/x-shockwave-flash\r\nContent-Length: " + +/* Response head for XML */ +#define RES_XMLHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: text/xml\r\nConnection: keep-alive\r\nContent-Length: " + +/* Response head for CSS */ +#define RES_CSSHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: text/css\r\nContent-Length: " + +/* Response head for JavaScript */ +#define RES_JSHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: application/javascript\r\nContent-Length: " + +/* Response head for JSON */ +#define RES_JSONHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: " + +/* Response head for ICO */ +#define RES_ICOHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: image/x-icon\r\nContent-Length: " + +/* Response head for CGI */ +#define RES_CGIHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: " + +/* Response head for TTF, Font */ +#define RES_TTFHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: application/x-font-truetype\r\nContent-Length: " + +/* Response head for OTF, Font */ +#define RES_OTFHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: application/x-font-opentype\r\nContent-Length: " + +/* Response head for WOFF, Font */ +#define RES_WOFFHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: application/font-woff\r\nContent-Length: " + +/* Response head for EOT, Font */ +#define RES_EOTHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.ms-fontobject\r\nContent-Length: " + +/* Response head for SVG, Font */ +#define RES_SVGHEAD_OK "HTTP/1.1 200 OK\r\nContent-Type: image/svg+xml\r\nContent-Length: " + +/** + @brief Structure of HTTP REQUEST + */ + +//#define MAX_URI_SIZE 1461 +#define MAX_URI_SIZE 512 + +typedef struct _st_http_request +{ + uint8_t METHOD; /**< request method(METHOD_GET...). */ + uint8_t TYPE; /**< request type(PTYPE_HTML...). */ + uint8_t URI[MAX_URI_SIZE]; /**< request file name. */ +}st_http_request; + +// HTTP Parsing functions +void unescape_http_url(char * url); /* convert escape character to ascii */ +void parse_http_request(st_http_request *, uint8_t *); /* parse request from peer */ +void find_http_uri_type(uint8_t *, uint8_t *); /* find MIME type of a file */ +void make_http_response_head(char *, char, uint32_t); /* make response header */ +uint8_t * get_http_param_value(char* uri, char* param_name); /* get the user-specific parameter value */ +uint8_t get_http_uri_name(uint8_t * uri, uint8_t * uri_buf); /* get the requested URI name */ +#ifdef _OLD_ +uint8_t * get_http_uri_name(uint8_t * uri); +#endif + +// Utility functions +uint16_t ATOI(uint8_t * str, uint8_t base); +void mid(char* src, char* s1, char* s2, char* sub); +void inet_addr_(uint8_t * addr, uint8_t * ip); + +#ifdef __cplusplus +} +#endif + +#endif /* end of __HTTPPARSER_H__ */ diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpServer.c b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpServer.c new file mode 100644 index 0000000..8df7015 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpServer.c @@ -0,0 +1,1399 @@ +#include +#include +#include + +#include "socket.h" +#include "wizchip_conf.h" + +#include "httpServer.h" +#include "httpParser.h" +#include "httpUtil.h" +//Find Content +/* +#include +#include +#include "avr/wdt.h" // WatchDog +#ifndef PRINTF + #define PRINTF(FORMAT,args...) printf_P(PSTR(FORMAT),##args) +#endif +*/ +#include "../../globals.h" //add AVR specific useful headers + +#ifdef _USE_SDCARD_ +#include "ff.h" // header file for FatFs library (FAT file system) +#endif + +/* +#ifndef DATA_BUF_SIZE + #define DATA_BUF_SIZE 2048 +#endif +*/ +#define DATA_BUF_SIZE HTTPD_MAX_BUF_SIZE +/***************************************************************************** + * Private types/enumerations/variables + ****************************************************************************/ +static uint8_t HTTPSock_Num[_WIZCHIP_SOCK_NUM_] = {0, }; +static st_http_request * http_request; /**< Pointer to received HTTP request */ +static st_http_request * parsed_http_request; /**< Pointer to parsed HTTP request */ +static uint8_t * http_response; /**< Pointer to HTTP response */ + +// ## For Debugging +//static uint8_t uri_buf[128]; + +// Number of registered web content in code flash memory +static uint16_t total_content_cnt = 0; +/***************************************************************************** + * Public types/enumerations/variables + ****************************************************************************/ +uint8_t * pHTTP_TX; +uint8_t * pHTTP_RX; + +volatile uint32_t httpServer_tick_1s = 0; +st_http_socket HTTPSock_Status[_WIZCHIP_SOCK_NUM_] = { {STATE_HTTP_IDLE, }, }; +httpServer_webContent web_content[MAX_CONTENT_CALLBACK]; + +#ifdef _USE_SDCARD_ +FIL fs; // FatFs: File object +FRESULT fr; // FatFs: File function return code +#endif + +/***************************************************************************** + * Private functions + ****************************************************************************/ +void httpServer_Sockinit(uint8_t cnt, uint8_t * socklist); +static uint8_t getHTTPSocketNum(uint8_t seqnum); +static int8_t getHTTPSequenceNum(uint8_t socket); +static int8_t http_disconnect(uint8_t sn); + +//static void http_process_handler(uint8_t s, st_http_request * p_http_request); +static void http_process_handler_avr(uint8_t s, st_http_request * p_http_request); + +static void send_http_response_header(uint8_t s, uint8_t content_type, uint32_t body_len, uint16_t http_status); + +//static void send_http_response_body(uint8_t s, uint8_t * uri_name, uint8_t * buf, uint32_t start_addr, uint32_t file_len); +static void send_http_response_body_avr(uint8_t s, uint8_t * uri_name, uint8_t * buf, uint32_t start_addr, uint32_t file_len); + +static void send_http_response_cgi(uint8_t s, uint8_t * buf, uint8_t * http_body, uint16_t file_len); + +/***************************************************************************** + * Public functions + ****************************************************************************/ +// Callback functions definition: MCU Reset / WDT Reset +void default_mcu_reset(void) {;} +void default_wdt_reset(void) {;} +void (*HTTPServer_ReStart)(void) = default_mcu_reset; +void (*HTTPServer_WDT_Reset)(void) = default_wdt_reset; + +void httpServer_Sockinit(uint8_t cnt, uint8_t * socklist) +{ + uint8_t i; + + for(i = 0; i < cnt; i++) + { + // Mapping the H/W socket numbers to the sequential index numbers + HTTPSock_Num[i] = socklist[i]; + } +} + +static uint8_t getHTTPSocketNum(uint8_t seqnum) +{ + // Return the 'H/W socket number' corresponding to the index number + return HTTPSock_Num[seqnum]; +} + +static int8_t getHTTPSequenceNum(uint8_t socket) +{ + uint8_t i; + + for(i = 0; i < _WIZCHIP_SOCK_NUM_; i++) + if(HTTPSock_Num[i] == socket) return i; + + return -1; +} + +void httpServer_init(uint8_t * tx_buf, uint8_t * rx_buf, uint8_t cnt, uint8_t * socklist) +{ + // User's shared buffer + pHTTP_TX = tx_buf; + pHTTP_RX = rx_buf; + + // H/W Socket number mapping + httpServer_Sockinit(cnt, socklist); +} + + +/* Register the call back functions for HTTP Server */ +void reg_httpServer_cbfunc(void(*mcu_reset)(void), void(*wdt_reset)(void)) +{ + // Callback: HW Reset and WDT reset function for each MCU platforms + if(mcu_reset) HTTPServer_ReStart = mcu_reset; + if(wdt_reset) HTTPServer_WDT_Reset = wdt_reset; +} + + +//void httpServer_run(uint8_t seqnum) +//{ +// uint8_t s; // socket number +// uint16_t len; +// uint32_t gettime = 0; +// +//#ifdef _HTTPSERVER_DEBUG_ +// uint8_t destip[4] = {0, }; +// uint16_t destport = 0; +//#endif +// +// http_request = (st_http_request *)pHTTP_RX; // Structure of HTTP Request +// parsed_http_request = (st_http_request *)pHTTP_TX; +// +// // Get the H/W socket number +// s = getHTTPSocketNum(seqnum); +// +// /* HTTP Service Start */ +// switch(getSn_SR(s)) +// { +// case SOCK_ESTABLISHED: +// // Interrupt clear +// if(getSn_IR(s) & Sn_IR_CON) +// { +// setSn_IR(s, Sn_IR_CON); +// } +// +// // HTTP Process states +// switch(HTTPSock_Status[seqnum].sock_status) +// { +// +// case STATE_HTTP_IDLE : +// if ((len = getSn_RX_RSR(s)) > 0) +// { +// if (len > DATA_BUF_SIZE) len = DATA_BUF_SIZE; +// len = recv(s, (uint8_t *)http_request, len); +// +// *(((uint8_t *)http_request) + len) = '\0'; +// +// parse_http_request(parsed_http_request, (uint8_t *)http_request); +//#ifdef _HTTPSERVER_DEBUG_ +// getSn_DIPR(s, destip); +// destport = getSn_DPORT(s); +// printf("\r\n"); +// printf("> HTTPSocket[%d] : HTTP Request received ", s); +// printf("from %d.%d.%d.%d : %d\r\n", destip[0], destip[1], destip[2], destip[3], destport); +//#endif +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : [State] STATE_HTTP_REQ_DONE\r\n", s); +//#endif +// // HTTP 'response' handler; includes send_http_response_header / body function +// http_process_handler(s, parsed_http_request); +// +// gettime = get_httpServer_timecount(); +// // Check the TX socket buffer for End of HTTP response sends +// while(getSn_TX_FSR(s) != (getSn_TXBUF_SIZE(s)*1024)) +// { +// if((get_httpServer_timecount() - gettime) > 3) +// { +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : [State] STATE_HTTP_REQ_DONE: TX Buffer clear timeout\r\n", s); +//#endif +// break; +// } +// } +// +// if(HTTPSock_Status[seqnum].file_len > 0) HTTPSock_Status[seqnum].sock_status = STATE_HTTP_RES_INPROC; +// else HTTPSock_Status[seqnum].sock_status = STATE_HTTP_RES_DONE; // Send the 'HTTP response' end +// } +// break; +// +// case STATE_HTTP_RES_INPROC : +// /* Repeat: Send the remain parts of HTTP responses */ +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : [State] STATE_HTTP_RES_INPROC\r\n", s); +//#endif +// // Repeatedly send remaining data to client +// send_http_response_body(s, 0, http_response, 0, 0); +// +// if(HTTPSock_Status[seqnum].file_len == 0) HTTPSock_Status[seqnum].sock_status = STATE_HTTP_RES_DONE; +// break; +// +// case STATE_HTTP_RES_DONE : +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : [State] STATE_HTTP_RES_DONE\r\n", s); +//#endif +// // Socket file info structure re-initialize +// HTTPSock_Status[seqnum].file_len = 0; +// HTTPSock_Status[seqnum].file_offset = 0; +// HTTPSock_Status[seqnum].file_start = 0; +// HTTPSock_Status[seqnum].sock_status = STATE_HTTP_IDLE; +// +////#ifdef _USE_SDCARD_ +//// f_close(&fs); +////#endif +//#ifdef _USE_WATCHDOG_ +// HTTPServer_WDT_Reset(); +//#endif +// http_disconnect(s); +// break; +// +// default : +// break; +// } +// break; +// +// case SOCK_CLOSE_WAIT: +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : ClOSE_WAIT\r\n", s); // if a peer requests to close the current connection +//#endif +// disconnect(s); +// break; +// +// case SOCK_CLOSED: +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : CLOSED\r\n", s); +//#endif +// if(socket(s, Sn_MR_TCP, HTTP_SERVER_PORT, 0x00) == s) /* Reinitialize the socket */ +// { +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : OPEN\r\n", s); +//#endif +// } +// break; +// +// case SOCK_INIT: +// listen(s); +// break; +// +// case SOCK_LISTEN: +// break; +// +// default : +// break; +// +// } // end of switch +// +//#ifdef _USE_WATCHDOG_ +// HTTPServer_WDT_Reset(); +//#endif +//} + +void httpServer_run_avr(uint8_t seqnum) +{ + uint8_t s; // socket number + uint16_t len; + uint32_t gettime = 0; + +#ifdef _HTTPSERVER_DEBUG_ + uint8_t destip[4] = {0, }; + uint16_t destport = 0; +#endif + + http_request = (st_http_request *)pHTTP_RX; // Structure of HTTP Request + parsed_http_request = (st_http_request *)pHTTP_TX; + + // Get the H/W socket number + s = getHTTPSocketNum(seqnum); + + /* HTTP Service Start */ + switch(getSn_SR(s)) + { + case SOCK_ESTABLISHED: + // Interrupt clear + if(getSn_IR(s) & Sn_IR_CON) + { + setSn_IR(s, Sn_IR_CON); + } + + // HTTP Process states + switch(HTTPSock_Status[seqnum].sock_status) + { + + case STATE_HTTP_IDLE : + if ((len = getSn_RX_RSR(s)) > 0) + { + if (len > DATA_BUF_SIZE) len = DATA_BUF_SIZE; + len = recv(s, (uint8_t *)http_request, len); + + *(((uint8_t *)http_request) + len) = '\0'; + + parse_http_request(parsed_http_request, (uint8_t *)http_request); +#ifdef _HTTPSERVER_DEBUG_ + getSn_DIPR(s, destip); + destport = getSn_DPORT(s); + PRINTF("\r\n"); + PRINTF("> HTTPSocket[%d] : HTTP Request received ", s); + PRINTF("from %d.%d.%d.%d : %u\r\n", destip[0], destip[1], destip[2], destip[3], destport); +#endif +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : [State] STATE_HTTP_REQ_DONE\r\n", s); +#endif + // HTTP 'response' handler; includes send_http_response_header / body function + http_process_handler_avr(s, parsed_http_request); + + gettime = get_httpServer_timecount(); + // Check the TX socket buffer for End of HTTP response sends + while(getSn_TX_FSR(s) != (getSn_TXBUF_SIZE(s)*1024)) + { + if((get_httpServer_timecount() - gettime) > 3) + { +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : [State] STATE_HTTP_REQ_DONE: TX Buffer clear timeout\r\n", s); +#endif + break; + } + } + + if(HTTPSock_Status[seqnum].file_len > 0) HTTPSock_Status[seqnum].sock_status = STATE_HTTP_RES_INPROC; + else HTTPSock_Status[seqnum].sock_status = STATE_HTTP_RES_DONE; // Send the 'HTTP response' end + } + break; + + case STATE_HTTP_RES_INPROC : + /* Repeat: Send the remain parts of HTTP responses */ +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : [State] STATE_HTTP_RES_INPROC\r\n", s); +#endif + // Repeatedly send remaining data to client + send_http_response_body_avr(s, 0, http_response, 0, 0); + + if(HTTPSock_Status[seqnum].file_len == 0) HTTPSock_Status[seqnum].sock_status = STATE_HTTP_RES_DONE; + break; + + case STATE_HTTP_RES_DONE : +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : [State] STATE_HTTP_RES_DONE\r\n", s); +#endif + // Socket file info structure re-initialize + HTTPSock_Status[seqnum].file_len = 0; + HTTPSock_Status[seqnum].file_offset = 0; + HTTPSock_Status[seqnum].file_start = 0; + HTTPSock_Status[seqnum].sock_status = STATE_HTTP_IDLE; + +//#ifdef _USE_SDCARD_ +// f_close(&fs); +//#endif +#ifdef _USE_WATCHDOG_ + HTTPServer_WDT_Reset(); +#endif + http_disconnect(s); + break; + + default : + break; + } + break; + + case SOCK_CLOSE_WAIT: +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : ClOSE_WAIT\r\n", s); // if a peer requests to close the current connection +#endif + disconnect(s); + break; + + case SOCK_CLOSED: +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : CLOSED\r\n", s); +#endif + if(socket(s, Sn_MR_TCP, HTTP_SERVER_PORT, 0x00) == s) /* Reinitialize the socket */ + { +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : OPEN\r\n", s); +#endif + } + break; + + case SOCK_INIT: + listen(s); + break; + + case SOCK_LISTEN: + break; + + default : + break; + + } // end of switch + +#ifdef _USE_WATCHDOG_ + HTTPServer_WDT_Reset(); +#endif +} + +//////////////////////////////////////////// +// Private Functions +//////////////////////////////////////////// +static void send_http_response_header(uint8_t s, uint8_t content_type, uint32_t body_len, uint16_t http_status) +{ + switch(http_status) + { + case STATUS_OK: // HTTP/1.1 200 OK + if((content_type != PTYPE_CGI) && (content_type != PTYPE_XML)) // CGI/XML type request does not respond HTTP header + { +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : HTTP Response Header - STATUS_OK\r\n", s); +#endif + make_http_response_head((char*)http_response, content_type, body_len); + } + else + { +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : HTTP Response Header - NONE / CGI or XML\r\n", s); +#endif + // CGI/XML type request does not respond HTTP header to client + http_status = 0; + } + break; + case STATUS_BAD_REQ: // HTTP/1.1 400 OK +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : HTTP Response Header - STATUS_BAD_REQ\r\n", s); +#endif + memcpy_P(http_response, ERROR_REQUEST_PAGE, sizeof(ERROR_REQUEST_PAGE)); + break; + case STATUS_NOT_FOUND: // HTTP/1.1 404 Not Found +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : HTTP Response Header - STATUS_NOT_FOUND\r\n", s); +#endif + memcpy_P(http_response, ERROR_HTML_PAGE, sizeof(ERROR_HTML_PAGE)); + break; + default: + break; + } + + // Send the HTTP Response 'header' + if(http_status) + { +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : [Send] HTTP Response Header [ %d ]byte\r\n", s, (uint16_t)strlen((char *)http_response)); +#endif + send(s, http_response, strlen((char *)http_response)); + } +} + + +//static void send_http_response_body(uint8_t s, uint8_t * uri_name, uint8_t * buf, uint32_t start_addr, uint32_t file_len) +//{ +// int8_t get_seqnum; +// uint32_t send_len; +// +// uint8_t flag_datasend_end = 0; +// +//#ifdef _USE_SDCARD_ +// uint16_t blocklen; +//#endif +//#ifdef _USE_FLASH_ +// uint32_t addr = 0; +//#endif +// +// if((get_seqnum = getHTTPSequenceNum(s)) == -1) return; // exception handling; invalid number +// +// // Send the HTTP Response 'body'; requested file +// if(!HTTPSock_Status[get_seqnum].file_len) // ### Send HTTP response body: First part ### +// { +// if (file_len > DATA_BUF_SIZE - 1) +// { +// HTTPSock_Status[get_seqnum].file_start = start_addr; +// HTTPSock_Status[get_seqnum].file_len = file_len; +// send_len = DATA_BUF_SIZE - 1; +// +/////////////////////////////////////////////////////////////////////////////////////////////////// +//// ## 20141219 Eric added, for 'File object structure' (fs) allocation reduced (8 -> 1) +// memset(HTTPSock_Status[get_seqnum].file_name, 0x00, MAX_CONTENT_NAME_LEN); +// strcpy((char *)HTTPSock_Status[get_seqnum].file_name, (char *)uri_name); +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : HTTP Response body - file name [ %s ]\r\n", s, HTTPSock_Status[get_seqnum].file_name); +//#endif +/////////////////////////////////////////////////////////////////////////////////////////////////// +// +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : HTTP Response body - file len [ %ld ]byte\r\n", s, file_len); +//#endif +// } +// else +// { +// // Send process end +// send_len = file_len; +// +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : HTTP Response end - file len [ %ld ]byte\r\n", s, send_len); +//#endif +// } +//#ifdef _USE_FLASH_ +// if(HTTPSock_Status[get_seqnum]->storage_type == DATAFLASH) addr = start_addr; +//#endif +// } +// else // remained parts +// { +//#ifdef _USE_FLASH_ +// if(HTTPSock_Status[get_seqnum]->storage_type == DATAFLASH) +// { +// addr = HTTPSock_Status[get_seqnum].file_start + HTTPSock_Status[get_seqnum].file_offset; +// } +//#endif +// send_len = HTTPSock_Status[get_seqnum].file_len - HTTPSock_Status[get_seqnum].file_offset; +// +// if(send_len > DATA_BUF_SIZE - 1) +// { +// send_len = DATA_BUF_SIZE - 1; +// //HTTPSock_Status[get_seqnum]->file_offset += send_len; +// } +// else +// { +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : HTTP Response end - file len [ %ld ]byte\r\n", s, HTTPSock_Status[get_seqnum].file_len); +//#endif +// // Send process end +// flag_datasend_end = 1; +// } +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : HTTP Response body - send len [ %ld ]byte\r\n", s, send_len); +//#endif +// } +// +///*****************************************************/ +// //HTTPSock_Status[get_seqnum]->storage_type == NONE +// //HTTPSock_Status[get_seqnum]->storage_type == CODEFLASH +// //HTTPSock_Status[get_seqnum]->storage_type == SDCARD +// //HTTPSock_Status[get_seqnum]->storage_type == DATAFLASH +///*****************************************************/ +// +// if(HTTPSock_Status[get_seqnum].storage_type == CODEFLASH) +// { +// if(HTTPSock_Status[get_seqnum].file_len) start_addr = HTTPSock_Status[get_seqnum].file_start; +// read_userReg_webContent(start_addr, &buf[0], HTTPSock_Status[get_seqnum].file_offset, send_len); +// } +//#ifdef _USE_SDCARD_ +// else if(HTTPSock_Status[get_seqnum].storage_type == SDCARD) +// { +// // Data read from SD Card +// fr = f_read(&fs, &buf[0], send_len, (void *)&blocklen); +// if(fr != FR_OK) +// { +// send_len = 0; +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : [FatFs] Error code return: %d (File Read) / HTTP Send Failed - %s\r\n", s, fr, HTTPSock_Status[get_seqnum].file_name); +//#endif +// } +// else +// { +// *(buf+send_len+1) = 0; // Insert '/0' for indicates the 'End of String' (null terminated) +// } +// } +//#endif +// +//#ifdef _USE_FLASH_ +// else if(HTTPSock_Status[get_seqnum]->storage_type == DATAFLASH) +// { +// // Data read from external data flash memory +// read_from_flashbuf(addr, &buf[0], send_len); +// *(buf+send_len+1) = 0; // Insert '/0' for indicates the 'End of String' (null terminated) +// } +//#endif +// else +// { +// send_len = 0; +// } +// // Requested content send to HTTP client +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : [Send] HTTP Response body [ %ld ]byte\r\n", s, send_len); +//#endif +// +// if(send_len) send(s, buf, send_len); +// else flag_datasend_end = 1; +// +// if(flag_datasend_end) +// { +// HTTPSock_Status[get_seqnum].file_start = 0; +// HTTPSock_Status[get_seqnum].file_len = 0; +// HTTPSock_Status[get_seqnum].file_offset = 0; +// flag_datasend_end = 0; +// } +// else +// { +// HTTPSock_Status[get_seqnum].file_offset += send_len; +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : HTTP Response body - offset [ %ld ]\r\n", s, HTTPSock_Status[get_seqnum].file_offset); +//#endif +// } +// +//// ## 20141219 Eric added, for 'File object structure' (fs) allocation reduced (8 -> 1) +//#ifdef _USE_SDCARD_ +// f_close(&fs); +//#endif +//// ## 20141219 added end +//} + +static void send_http_response_body_avr(uint8_t s, uint8_t * uri_name, uint8_t * buf, uint32_t start_addr, uint32_t file_len) +{ + int8_t get_seqnum; + uint32_t send_len; + + uint8_t flag_datasend_end = 0; + +#ifdef _USE_SDCARD_ + uint16_t blocklen; +#endif +#ifdef _USE_FLASH_ + uint32_t addr = 0; +#endif + + if((get_seqnum = getHTTPSequenceNum(s)) == -1) return; // exception handling; invalid number + + // Send the HTTP Response 'body'; requested file + if(!HTTPSock_Status[get_seqnum].file_len) // ### Send HTTP response body: First part ### + { + if (file_len > DATA_BUF_SIZE - 1) + { + HTTPSock_Status[get_seqnum].file_start = start_addr; + HTTPSock_Status[get_seqnum].file_len = file_len; + send_len = DATA_BUF_SIZE - 1; + +///////////////////////////////////////////////////////////////////////////////////////////////// +// ## 20141219 Eric added, for 'File object structure' (fs) allocation reduced (8 -> 1) + memset(HTTPSock_Status[get_seqnum].file_name, 0x00, MAX_CONTENT_NAME_LEN); + strcpy((char *)HTTPSock_Status[get_seqnum].file_name, (char *)uri_name); +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : HTTP Response body - file name [ %s ]\r\n", s, HTTPSock_Status[get_seqnum].file_name); +#endif +///////////////////////////////////////////////////////////////////////////////////////////////// + +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : HTTP Response body - file len [ %ld ]byte\r\n", s, file_len); +#endif + } + else + { + // Send process end + send_len = file_len; + +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : HTTP Response end - file len [ %ld ]byte\r\n", s, send_len); +#endif + } +#ifdef _USE_FLASH_ + if(HTTPSock_Status[get_seqnum]->storage_type == DATAFLASH) addr = start_addr; +#endif + } + else // remained parts + { +#ifdef _USE_FLASH_ + if(HTTPSock_Status[get_seqnum]->storage_type == DATAFLASH) + { + addr = HTTPSock_Status[get_seqnum].file_start + HTTPSock_Status[get_seqnum].file_offset; + } +#endif + send_len = HTTPSock_Status[get_seqnum].file_len - HTTPSock_Status[get_seqnum].file_offset; + + if(send_len > DATA_BUF_SIZE - 1) + { + send_len = DATA_BUF_SIZE - 1; + //HTTPSock_Status[get_seqnum]->file_offset += send_len; + } + else + { +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : HTTP Response end - file len [ %ld ]byte\r\n", s, HTTPSock_Status[get_seqnum].file_len); +#endif + // Send process end + flag_datasend_end = 1; + } +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : HTTP Response body - send len [ %ld ]byte\r\n", s, send_len); +#endif + } + +/*****************************************************/ + //HTTPSock_Status[get_seqnum]->storage_type == NONE + //HTTPSock_Status[get_seqnum]->storage_type == CODEFLASH + //HTTPSock_Status[get_seqnum]->storage_type == SDCARD + //HTTPSock_Status[get_seqnum]->storage_type == DATAFLASH +/*****************************************************/ + + if(HTTPSock_Status[get_seqnum].storage_type == CODEFLASH) + { + if(HTTPSock_Status[get_seqnum].file_len) start_addr = HTTPSock_Status[get_seqnum].file_start; + read_userReg_webContent_avr(start_addr, &buf[0], HTTPSock_Status[get_seqnum].file_offset, send_len); + } +#ifdef _USE_SDCARD_ + else if(HTTPSock_Status[get_seqnum].storage_type == SDCARD) + { + // Data read from SD Card + fr = f_read(&fs, &buf[0], send_len, (void *)&blocklen); + if(fr != FR_OK) + { + send_len = 0; +#ifdef _HTTPSERVER_DEBUG_ + printf("> HTTPSocket[%d] : [FatFs] Error code return: %d (File Read) / HTTP Send Failed - %s\r\n", s, fr, HTTPSock_Status[get_seqnum].file_name); +#endif + } + else + { + *(buf+send_len+1) = 0; // Insert '/0' for indicates the 'End of String' (null terminated) + } + } +#endif + +#ifdef _USE_FLASH_ + else if(HTTPSock_Status[get_seqnum]->storage_type == DATAFLASH) + { + // Data read from external data flash memory + read_from_flashbuf(addr, &buf[0], send_len); + *(buf+send_len+1) = 0; // Insert '/0' for indicates the 'End of String' (null terminated) + } +#endif + else + { + send_len = 0; + } + // Requested content send to HTTP client +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : [Send] HTTP Response body [ %ld ]byte\r\n", s, send_len); +#endif + + if(send_len) send(s, buf, send_len); + else flag_datasend_end = 1; + + if(flag_datasend_end) + { + HTTPSock_Status[get_seqnum].file_start = 0; + HTTPSock_Status[get_seqnum].file_len = 0; + HTTPSock_Status[get_seqnum].file_offset = 0; + flag_datasend_end = 0; + } + else + { + HTTPSock_Status[get_seqnum].file_offset += send_len; +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : HTTP Response body - offset [ %ld ]\r\n", s, HTTPSock_Status[get_seqnum].file_offset); +#endif + } + +// ## 20141219 Eric added, for 'File object structure' (fs) allocation reduced (8 -> 1) +#ifdef _USE_SDCARD_ + f_close(&fs); +#endif +// ## 20141219 added end +} + + +static void send_http_response_cgi(uint8_t s, uint8_t * buf, uint8_t * http_body, uint16_t file_len) +{ + uint16_t send_len = 0; + +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : HTTP Response Header + Body - CGI\r\n", s); +#endif + //send_len = sprintf((char *)buf, "%s%d\r\n\r\n%s", RES_CGIHEAD_OK, file_len, http_body); + send_len = sprintf_P((char *)buf, PSTR("%S%d\r\n\r\n%s"), PSTR(RES_CGIHEAD_OK), file_len, http_body); +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : HTTP Response Header + Body - send len [ %d ]byte\r\n", s, send_len); +#endif + + send(s, buf, send_len); +} + + +static int8_t http_disconnect(uint8_t sn) +{ + setSn_CR(sn,Sn_CR_DISCON); + /* wait to process the command... */ + while(getSn_CR(sn)); + + return SOCK_OK; +} + + +//static void http_process_handler(uint8_t s, st_http_request * p_http_request) +//{ +// uint8_t * uri_name; +// uint32_t content_addr = 0; +// uint16_t content_num = 0; +// uint32_t file_len = 0; +// +// uint8_t uri_buf[MAX_URI_SIZE]={0x00, }; +// +// uint16_t http_status; +// int8_t get_seqnum; +// uint8_t content_found; +// +// if((get_seqnum = getHTTPSequenceNum(s)) == -1) return; // exception handling; invalid number +// +// http_status = 0; +// http_response = pHTTP_RX; +// file_len = 0; +// +// //method Analyze +// switch (p_http_request->METHOD) +// { +// case METHOD_ERR : +// http_status = STATUS_BAD_REQ; +// send_http_response_header(s, 0, 0, http_status); +// break; +// +// case METHOD_HEAD : +// case METHOD_GET : +// get_http_uri_name(p_http_request->URI, uri_buf); +// uri_name = uri_buf; +// +// if (!strcmp((char *)uri_name, "/")) strcpy((char *)uri_name, INITIAL_WEBPAGE); // If URI is "/", respond by index.html +// if (!strcmp((char *)uri_name, "m")) strcpy((char *)uri_name, M_INITIAL_WEBPAGE); +// if (!strcmp((char *)uri_name, "mobile")) strcpy((char *)uri_name, MOBILE_INITIAL_WEBPAGE); +// find_http_uri_type(&p_http_request->TYPE, uri_name); // Checking requested file types (HTML, TEXT, GIF, JPEG and Etc. are included) +// +//#ifdef _HTTPSERVER_DEBUG_ +// printf("\r\n> HTTPSocket[%d] : HTTP Method GET\r\n", s); +// printf("> HTTPSocket[%d] : Request Type = %d\r\n", s, p_http_request->TYPE); +// printf("> HTTPSocket[%d] : Request URI = %s\r\n", s, uri_name); +//#endif +// +// if(p_http_request->TYPE == PTYPE_CGI) +// { +// content_found = http_get_cgi_handler(uri_name, pHTTP_TX, &file_len); +// if(content_found && (file_len <= (DATA_BUF_SIZE-(strlen(RES_CGIHEAD_OK)+8)))) +// { +// send_http_response_cgi(s, http_response, pHTTP_TX, (uint16_t)file_len); +// } +// else +// { +// send_http_response_header(s, PTYPE_CGI, 0, STATUS_NOT_FOUND); +// } +// } +// else +// { +// // Find the User registered index for web content +// if(find_userReg_webContent(uri_buf, &content_num, &file_len)) +// { +// content_found = 1; // Web content found in code flash memory +// content_addr = (uint32_t)content_num; +// HTTPSock_Status[get_seqnum].storage_type = CODEFLASH; +// } +// // Not CGI request, Web content in 'SD card' or 'Data flash' requested +//#ifdef _USE_SDCARD_ +//#ifdef _HTTPSERVER_DEBUG_ +// printf("\r\n> HTTPSocket[%d] : Searching the requested content\r\n", s); +//#endif +// if((fr = f_open(&fs, (const char *)uri_name, FA_READ)) == 0) +// { +// content_found = 1; // file open succeed +// +// file_len = fs.fsize; +// content_addr = fs.sclust; +// HTTPSock_Status[get_seqnum].storage_type = SDCARD; +// } +//#elif _USE_FLASH_ +// else if(/* Read content from Dataflash */) +// { +// content_found = 1; +// HTTPSock_Status[get_seqnum]->storage_type = DATAFLASH; +// ; // To do +// } +//#endif +// else +// { +// content_found = 0; // fail to find content +// } +// +// if(!content_found) +// { +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : Unknown Page Request\r\n", s); +//#endif +// http_status = STATUS_NOT_FOUND; +// } +// else +// { +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : Find Content [%s] ok - Start [%ld] len [ %ld ]byte\r\n", s, uri_name, content_addr, file_len); +//#endif +// http_status = STATUS_OK; +// } +// +// // Send HTTP header +// if(http_status) +// { +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : Requested content len = [ %ld ]byte\r\n", s, file_len); +//#endif +// send_http_response_header(s, p_http_request->TYPE, file_len, http_status); +// } +// +// // Send HTTP body (content) +// if(http_status == STATUS_OK) +// { +// send_http_response_body(s, uri_name, http_response, content_addr, file_len); +// } +// } +// break; +// +// case METHOD_POST : +// mid((char *)p_http_request->URI, "/", " HTTP", (char *)uri_buf); +// uri_name = uri_buf; +// find_http_uri_type(&p_http_request->TYPE, uri_name); // Check file type (HTML, TEXT, GIF, JPEG are included) +// +//#ifdef _HTTPSERVER_DEBUG_ +// printf("\r\n> HTTPSocket[%d] : HTTP Method POST\r\n", s); +// printf("> HTTPSocket[%d] : Request URI = %s ", s, uri_name); +// printf("Type = %d\r\n", p_http_request->TYPE); +//#endif +// +// if(p_http_request->TYPE == PTYPE_CGI) // HTTP POST Method; CGI Process +// { +// content_found = http_post_cgi_handler(uri_name, p_http_request, http_response, &file_len); +//#ifdef _HTTPSERVER_DEBUG_ +// printf("> HTTPSocket[%d] : [CGI: %s] / Response len [ %ld ]byte\r\n", s, content_found?"Content found":"Content not found", file_len); +//#endif +// if(content_found && (file_len <= (DATA_BUF_SIZE-(strlen(RES_CGIHEAD_OK)+8)))) +// { +// send_http_response_cgi(s, pHTTP_TX, http_response, (uint16_t)file_len); +// +// // Reset the H/W for apply to the change configuration information +// if(content_found == HTTP_RESET) HTTPServer_ReStart(); +// } +// else +// { +// send_http_response_header(s, PTYPE_CGI, 0, STATUS_NOT_FOUND); +// } +// } +// else // HTTP POST Method; Content not found +// { +// send_http_response_header(s, 0, 0, STATUS_NOT_FOUND); +// } +// break; +// +// default : +// http_status = STATUS_BAD_REQ; +// send_http_response_header(s, 0, 0, http_status); +// break; +// } +//} + +static void http_process_handler_avr(uint8_t s, st_http_request * p_http_request) +{ + uint8_t * uri_name; + uint32_t content_addr = 0; + uint16_t content_num = 0; + uint32_t file_len = 0; + + uint8_t uri_buf[MAX_URI_SIZE]={0x00, }; + + uint16_t http_status; + int8_t get_seqnum; + uint8_t content_found; + + if((get_seqnum = getHTTPSequenceNum(s)) == -1) return; // exception handling; invalid number + + http_status = 0; + http_response = pHTTP_RX; + file_len = 0; + + //method Analyze + switch (p_http_request->METHOD) + { + case METHOD_ERR : + http_status = STATUS_BAD_REQ; + send_http_response_header(s, 0, 0, http_status); + break; + + case METHOD_HEAD : + case METHOD_GET : + get_http_uri_name(p_http_request->URI, uri_buf); + uri_name = uri_buf; + + if (!strcmp((char *)uri_name, "/")) strcpy((char *)uri_name, INITIAL_WEBPAGE); // If URI is "/", respond by index.html + if (!strcmp((char *)uri_name, "m")) strcpy((char *)uri_name, M_INITIAL_WEBPAGE); + if (!strcmp((char *)uri_name, "mobile")) strcpy((char *)uri_name, MOBILE_INITIAL_WEBPAGE); + find_http_uri_type(&p_http_request->TYPE, uri_name); // Checking requested file types (HTML, TEXT, GIF, JPEG and Etc. are included) + +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("\r\n> HTTPSocket[%d] : HTTP Method GET\r\n", s); + PRINTF("> HTTPSocket[%d] : Request Type = %d\r\n", s, p_http_request->TYPE); + PRINTF("> HTTPSocket[%d] : Request URI = %s\r\n", s, uri_name); +#endif + + if(p_http_request->TYPE == PTYPE_CGI) + { + content_found = http_get_cgi_handler(uri_name, pHTTP_TX, &file_len); + if(content_found && (file_len <= (DATA_BUF_SIZE-(strlen(RES_CGIHEAD_OK)+8)))) + { + send_http_response_cgi(s, http_response, pHTTP_TX, (uint16_t)file_len); + } + else + { + send_http_response_header(s, PTYPE_CGI, 0, STATUS_NOT_FOUND); + } + } + else + { + // Find the User registered index for web content + if(find_userReg_webContent_avr(uri_buf, &content_num, &file_len)) + { + content_found = 1; // Web content found in code flash memory + content_addr = (uint32_t)content_num; + HTTPSock_Status[get_seqnum].storage_type = CODEFLASH; + } + // Not CGI request, Web content in 'SD card' or 'Data flash' requested +#ifdef _USE_SDCARD_ +#ifdef _HTTPSERVER_DEBUG_ + printf("\r\n> HTTPSocket[%d] : Searching the requested content\r\n", s); +#endif + if((fr = f_open(&fs, (const char *)uri_name, FA_READ)) == 0) + { + content_found = 1; // file open succeed + + file_len = fs.fsize; + content_addr = fs.sclust; + HTTPSock_Status[get_seqnum].storage_type = SDCARD; + } +#elif _USE_FLASH_ + else if(/* Read content from Dataflash */) + { + content_found = 1; + HTTPSock_Status[get_seqnum]->storage_type = DATAFLASH; + ; // To do + } +#endif + else + { + content_found = 0; // fail to find content + } + + if(!content_found) + { +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : Unknown Page Request\r\n", s); +#endif + http_status = STATUS_NOT_FOUND; + } + else + { +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : Find Content [%s] ok - Start [%ld] len [ %ld ]byte\r\n", s, uri_name, content_addr, file_len); +#endif + http_status = STATUS_OK; + } + + // Send HTTP header + if(http_status) + { +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : Requested content len = [ %ld ]byte\r\n", s, file_len); +#endif + send_http_response_header(s, p_http_request->TYPE, file_len, http_status); + } + + // Send HTTP body (content) + if(http_status == STATUS_OK) + { + send_http_response_body_avr(s, uri_name, http_response, content_addr, file_len); + } + } + break; + + case METHOD_POST : + mid((char *)p_http_request->URI, "/", " HTTP", (char *)uri_buf); + uri_name = uri_buf; + find_http_uri_type(&p_http_request->TYPE, uri_name); // Check file type (HTML, TEXT, GIF, JPEG are included) + +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("\r\n> HTTPSocket[%d] : HTTP Method POST\r\n", s); + PRINTF("> HTTPSocket[%d] : Request URI = %s ", s, uri_name); + PRINTF("Type = %d\r\n", p_http_request->TYPE); +#endif + + if(p_http_request->TYPE == PTYPE_CGI) // HTTP POST Method; CGI Process + { + content_found = http_post_cgi_handler(uri_name, p_http_request, http_response, &file_len); +#ifdef _HTTPSERVER_DEBUG_ + PRINTF("> HTTPSocket[%d] : [CGI: %s] / Response len [ %ld ]byte\r\n", s, content_found?"Content found":"Content not found", file_len); +#endif + if(content_found && (file_len <= (DATA_BUF_SIZE-(strlen(RES_CGIHEAD_OK)+8)))) + { + send_http_response_cgi(s, pHTTP_TX, http_response, (uint16_t)file_len); + + // Reset the H/W for apply to the change configuration information + if(content_found == HTTP_RESET) HTTPServer_ReStart(); + } + else + { + send_http_response_header(s, PTYPE_CGI, 0, STATUS_NOT_FOUND); + } + } + else // HTTP POST Method; Content not found + { + send_http_response_header(s, 0, 0, STATUS_NOT_FOUND); + } + break; + + default : + http_status = STATUS_BAD_REQ; + send_http_response_header(s, 0, 0, http_status); + break; + } +} + + +void httpServer_time_handler(void) +{ + httpServer_tick_1s++; +} + +uint32_t get_httpServer_timecount(void) +{ + return httpServer_tick_1s; +} +void reg_httpServer_webContent_avr(const uint8_t * content_name,const uint8_t * content) +{ + uint16_t name_len; + uint32_t content_len; + + if(content_name == NULL || content == NULL) + { + return; + } + else if(total_content_cnt >= MAX_CONTENT_CALLBACK) + { + return; + } + + name_len = strlen_P((const char *)content_name); + content_len = strlen_P((const char *)content); + + web_content[total_content_cnt].content_name = malloc(name_len+1); + strcpy_P((char *)web_content[total_content_cnt].content_name, (const char *)content_name); + web_content[total_content_cnt].content_len = content_len; + web_content[total_content_cnt].content = content; + + total_content_cnt++; +} + +void reg_httpServer_binContent_avr(const uint8_t * content_name,const uint8_t * content, const uint32_t content_len) +{ + uint16_t name_len; + //uint32_t content_len; + + if(content_name == NULL || content == NULL) + { + return; + } + else if(total_content_cnt >= MAX_CONTENT_CALLBACK) + { + return; + } + + name_len = strlen_P((const char *)content_name); + //content_len = (uint32_t) sizeof(content); + + web_content[total_content_cnt].content_name = malloc(name_len+1); + strcpy_P((char *)web_content[total_content_cnt].content_name, (const char *)content_name); + web_content[total_content_cnt].content_len = content_len; + web_content[total_content_cnt].content = content; + + total_content_cnt++; +} + +//void reg_httpServer_webContent(uint8_t * content_name, uint8_t * content) +//{ +// uint16_t name_len; +// uint32_t content_len; +// +// if(content_name == NULL || content == NULL) +// { +// return; +// } +// else if(total_content_cnt >= MAX_CONTENT_CALLBACK) +// { +// return; +// } +// +// name_len = strlen((char *)content_name); +// content_len = strlen((char *)content); +// +// web_content[total_content_cnt].content_name = malloc(name_len+1); +// strcpy((char *)web_content[total_content_cnt].content_name, (const char *)content_name); +// web_content[total_content_cnt].content_len = content_len; +// web_content[total_content_cnt].content = content; +// +// total_content_cnt++; +//} + +//uint8_t display_reg_webContent_list(void) +//{ +// uint16_t i; +// uint8_t ret; +// +// if(total_content_cnt == 0) +// { +// printf(">> Web content file not found\r\n"); +// ret = 0; +// } +// else +// { +// printf("\r\n=== List of Web content in code flash ===\r\n"); +// for(i = 0; i < total_content_cnt; i++) +// { +// printf(" [%d] ", i+1); +// printf("%s, ", web_content[i].content_name); +// printf("%ld byte, ", web_content[i].content_len); +// +// if(web_content[i].content_len < 30) printf("[%s]\r\n", web_content[i].content); +// else printf("[ ... ]\r\n"); +// } +// printf("=========================================\r\n\r\n"); +// ret = 1; +// } +// +// return ret; +//} + +uint8_t display_reg_webContent_list_avr(void) +{ + uint16_t i; + uint8_t ret; + + if(total_content_cnt == 0) + { + PRINTF(">> Web content file not found\r\n"); + ret = 0; + } + else + { + PRINTF("\r\n=== List of Web content in code flash ===\r\n"); + for(i = 0; i < total_content_cnt; i++) + { + PRINTF(" [%d] ", i+1); + PRINTF("%s, ", web_content[i].content_name); + PRINTF("%ld byte\r\n", web_content[i].content_len); + + + if(web_content[i].content_len < 30) + { + PRINTF("[%s]\r\n", web_content[i].content); + } + else + { + PRINTF("[ ... ]\r\n"); + } + //Dump head 16 bytes every file.. + /* + else + { + const char PROGMEM * tst_char = web_content[i].content; + if(strstr_P(web_content[i].content_name,PSTR("favicon.ico"))==NULL) + { + //ASCII Dump first 0x10 symbols, for all files without + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:%c]\r\n",tst_char, pgm_read_byte(tst_char++)); + } + else + { + //HEX dump first 0x10 symbols, for + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + PRINTF("[0x%04X:0x%02X]\r\n",tst_char, pgm_read_byte(tst_char++)); + } + } + */ + wdt_reset(); // WDT reset at least every sec + + } + PRINTF("=========================================\r\n\r\n"); + ret = 1; + } + + return ret; +} + +//uint8_t find_userReg_webContent(uint8_t * content_name, uint16_t * content_num, uint32_t * file_len) +//{ +// uint16_t i; +// uint8_t ret = 0; // '0' means 'File Not Found' +// +// for(i = 0; i < total_content_cnt; i++) +// { +// if(!strcmp((char *)content_name, (char *)web_content[i].content_name)) +// { +// *file_len = web_content[i].content_len; +// *content_num = i; +// ret = 1; // If the requested content found, ret set to '1' (Found) +// break; +// } +// } +// return ret; +//} + +uint8_t find_userReg_webContent_avr(uint8_t * content_name, uint16_t * content_num, uint32_t * file_len) +{ + uint16_t i; + uint8_t ret = 0; // '0' means 'File Not Found' + + for(i = 0; i < total_content_cnt; i++) + { + if(!strcmp((const char *)content_name, (const char *)web_content[i].content_name)) + { + *file_len = web_content[i].content_len; + *content_num = i; + ret = 1; // If the requested content found, ret set to '1' (Found) + break; + } + } + return ret; +} + + +//uint16_t read_userReg_webContent(uint16_t content_num, uint8_t * buf, uint32_t offset, uint16_t size) +//{ +// uint16_t ret = 0; +// uint8_t * ptr; +// +// if(content_num > total_content_cnt) return 0; +// +// ptr = web_content[content_num].content; +// if(offset) ptr += offset; +// +// strncpy((char *)buf, (char *)ptr, size); +// *(buf+size) = 0; // Insert '/0' for indicates the 'End of String' (null terminated) +// +// ret = strlen((void *)buf); +// return ret; +//} + +uint16_t read_userReg_webContent_avr(uint16_t content_num, uint8_t * buf, uint32_t offset, uint16_t size) +{ + uint16_t ret = 0; + uint8_t * ptr; + + if(content_num > total_content_cnt) return 0; + + ptr = web_content[content_num].content; + if(offset) ptr += offset; + + //strncpy_P((char *)buf, (const char *)ptr, size); //not suit for case binary data + memcpy_P((char *)buf, (const char *)ptr, size); + *(buf+size) = 0; // Insert '/0' for indicates the 'End of String' (null terminated) + + //ret = strlen((void *)buf); //Useless for memcpy_P + ret = 0; //All ok + return ret; +} diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpServer.h b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpServer.h new file mode 100644 index 0000000..0ca80c2 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpServer.h @@ -0,0 +1,123 @@ +/** + @file httpServer.h + @brief Define constants and functions related HTTP Web server. + */ + +#include + +#ifndef __HTTPSERVER_H__ +#define __HTTPSERVER_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +// HTTP Server debug message enable +#define _HTTPSERVER_DEBUG_ + +#define INITIAL_WEBPAGE "index.html" +#define M_INITIAL_WEBPAGE "m/index.html" +#define MOBILE_INITIAL_WEBPAGE "mobile/index.html" + +/* Web Server Content Storage Select */ +//#define _USE_SDCARD_ +#ifndef _USE_SDCARD_ +//#define _USE_FLASH_ +#endif + +#if !defined(_USE_SDCARD_) && !defined(_USE_FLASH_) +#define _NOTUSED_STORAGE_ +#endif + + +/* Watchdog timer */ +//#define _USE_WATCHDOG_ + +/********************************************* +* HTTP Process states list +*********************************************/ +#define STATE_HTTP_IDLE 0 /* IDLE, Waiting for data received (TCP established) */ +#define STATE_HTTP_REQ_INPROC 1 /* Received HTTP request from HTTP client */ +#define STATE_HTTP_REQ_DONE 2 /* The end of HTTP request parse */ +#define STATE_HTTP_RES_INPROC 3 /* Sending the HTTP response to HTTP client (in progress) */ +#define STATE_HTTP_RES_DONE 4 /* The end of HTTP response send (HTTP transaction ended) */ + +/********************************************* +* HTTP Simple Return Value +*********************************************/ +#define HTTP_FAILED 0 +#define HTTP_OK 1 +#define HTTP_RESET 2 + +/********************************************* +* HTTP Content NAME length +*********************************************/ +//#define MAX_CONTENT_NAME_LEN 128 ? Wastefull +#define MAX_CONTENT_NAME_LEN 16 + +/********************************************* +* HTTP Timeout +*********************************************/ +#define HTTP_MAX_TIMEOUT_SEC 3 // Sec. + +typedef enum +{ + NONE, ///< Web storage none + CODEFLASH, ///< Code flash memory + SDCARD, ///< SD card + DATAFLASH ///< External data flash memory +}StorageType; + +typedef struct _st_http_socket +{ + uint8_t sock_status; + uint8_t file_name[MAX_CONTENT_NAME_LEN]; + uint32_t file_start; + uint32_t file_len; + uint32_t file_offset; // (start addr + sent size...) + uint8_t storage_type; // Storage type; Code flash, SDcard, Data flash ... +}st_http_socket; + +// Web content structure for file in code flash memory +#define MAX_CONTENT_CALLBACK 20 + +typedef struct _httpServer_webContent +{ + uint8_t * content_name; + uint32_t content_len; + uint8_t * content; +}httpServer_webContent; + + +void httpServer_init(uint8_t * tx_buf, uint8_t * rx_buf, uint8_t cnt, uint8_t * socklist); +void reg_httpServer_cbfunc(void(*mcu_reset)(void), void(*wdt_reset)(void)); + +//void httpServer_run(uint8_t seqnum); +void httpServer_run_avr(uint8_t seqnum); + +//void reg_httpServer_webContent(uint8_t * content_name, uint8_t * content); +void reg_httpServer_webContent_avr(const uint8_t * content_name,const uint8_t * content); + +void reg_httpServer_binContent_avr(const uint8_t * content_name,const uint8_t * content, const uint32_t content_len); + +//uint8_t find_userReg_webContent(uint8_t * content_name, uint16_t * content_num, uint32_t * file_len); +uint8_t find_userReg_webContent_avr(uint8_t * content_name, uint16_t * content_num, uint32_t * file_len); + +//uint16_t read_userReg_webContent(uint16_t content_num, uint8_t * buf, uint32_t offset, uint16_t size); +uint16_t read_userReg_webContent_avr(uint16_t content_num, uint8_t * buf, uint32_t offset, uint16_t size); + +//uint8_t display_reg_webContent_list(void); +uint8_t display_reg_webContent_list_avr(void); + +/* + * @brief HTTP Server 1sec Tick Timer handler + * @note SHOULD BE register to your system 1s Tick timer handler + */ +void httpServer_time_handler(void); +uint32_t get_httpServer_timecount(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpUtil.c b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpUtil.c new file mode 100644 index 0000000..77c9a9d --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpUtil.c @@ -0,0 +1,65 @@ +/** + * @file httpUtil.c + * @brief HTTP Server Utilities + * @version 1.0 + * @date 2014/07/15 + * @par Revision + * 2014/07/15 - 1.0 Release + * @author + * \n\n @par Copyright (C) 1998 - 2014 WIZnet. All rights reserved. + */ + +#include +#include +#include +#include "httpUtil.h" + +uint8_t http_get_cgi_handler(uint8_t * uri_name, uint8_t * buf, uint32_t * file_len) +{ + uint8_t ret = HTTP_OK; + uint16_t len = 0; + + if(predefined_get_cgi_processor(uri_name, buf, &len)) + { + ; + } + else if(strcmp((const char *)uri_name, "example.cgi") == 0) + { + // To do + ; + } + else + { + // CGI file not found + ret = HTTP_FAILED; + } + + if(ret) *file_len = len; + return ret; +} + +uint8_t http_post_cgi_handler(uint8_t * uri_name, st_http_request * p_http_request, uint8_t * buf, uint32_t * file_len) +{ + uint8_t ret = HTTP_OK; + uint16_t len = 0; + uint8_t val = 0; + + if(predefined_set_cgi_processor(uri_name, p_http_request->URI, buf, &len)) + { + ; + } + else if(strcmp((const char *)uri_name, "example.cgi") == 0) + { + // To do + val = 1; + len = sprintf((char *)buf, "%d", val); + } + else + { + // CGI file not found + ret = HTTP_FAILED; + } + + if(ret) *file_len = len; + return ret; +} diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpUtil.h b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpUtil.h new file mode 100644 index 0000000..f2c384a --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/Internet/httpServer_avr/httpUtil.h @@ -0,0 +1,32 @@ +/** + * @file httpUtil.h + * @brief Header File for HTTP Server Utilities + * @version 1.0 + * @date 2014/07/15 + * @par Revision + * 2014/07/15 - 1.0 Release + * @author + * \n\n @par Copyright (C) 1998 - 2014 WIZnet. All rights reserved. + */ + +#ifndef __HTTPUTIL_H__ +#define __HTTPUTIL_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "httpServer.h" +#include "httpParser.h" + +uint8_t http_get_cgi_handler(uint8_t * uri_name, uint8_t * buf, uint32_t * file_len); +uint8_t http_post_cgi_handler(uint8_t * uri_name, st_http_request * p_http_request, uint8_t * buf, uint32_t * file_len); + +uint8_t predefined_get_cgi_processor(uint8_t * uri_name, uint8_t * buf, uint16_t * len); +uint8_t predefined_set_cgi_processor(uint8_t * uri_name, uint8_t * uri, uint8_t * buf, uint16_t * len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/bin2hex_v2.py b/11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/bin2hex_v2.py new file mode 100644 index 0000000..cfd3991 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/bin2hex_v2.py @@ -0,0 +1,52 @@ +# -- coding: utf-8 -- +#Reading file in binary & print in HEX AVR PROGCHAR ARRAY every symbol & to ***.h +#Ethercard helper utilites for something like: +#(c) Ibragimov M. Russia Togliatty 19/08/2014 +# .PS used for build <***.h> from images(*.gif, *.jpg), *.css, static htm(l) pages, javascript etc.. +import sys, os +if len(sys.argv) < 2: + sys.exit('Usage: %s file-name' % sys.argv[0]) + +file_name = sys.argv[1] +if not os.path.exists(sys.argv[1]): + sys.exit('ERROR: Filename %s was not found!' % file_name) +else: + print('File %s is OK!' % file_name) +file_out = file_name.replace(".", "_") + ".h" +print('File_to_write is: %s' % file_out) +fhex = open(file_out, "w") +fhex_str = 'const char %s[] PROGMEM = {' % file_name.replace(".", "_") +print(fhex_str) +fhex.write(fhex_str + '\n') +with open(file_name, "rb") as f: + byte = f.read(1) + i = 0 + fhex_size = 0 + _str = "" + while byte != "": + # Do stuff with byte. + _byte = f.read(1) + fhex_size = fhex_size + 1 + if _byte != "": + #print ('%s, ' % hex(ord(byte))) + _str = _str + "%s," % hex(ord(byte)) + else: + #Last byte wo <,> + #print hex(ord(byte)) + _str = _str + "%s" % hex(ord(byte)) + if i < 15: + print _str + fhex.write(_str + '\n') + byte = _byte; + i = i + 1; + if i > 15: + i = 0; + print _str + fhex.write(_str + '\n') + _str = "" +print'};' +fhex.write('};\n') +_str = '%s: %d bytes' % (file_name, fhex_size) +print(_str); +fhex.write('//' + _str + '\n'); +fhex.close() diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/brd_wiznet.png b/11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/brd_wiznet.png new file mode 100644 index 0000000000000000000000000000000000000000..90d075a63dbbb93b94950f0972e022e9c3cdd5e3 GIT binary patch literal 13702 zcmY*=bySp3)c*#%OLylYA@t z36P6Yy{Vwa`es@;_4W02{&e;{000N*YThvmnAyoRisZf9vMBYz(U&P)S9EXWrL#$l z$BE-l^7aPEj-d*p2q$#QgW$l}HrkfLx`t;IQ!JT}nSp(hJiFCa5ppz+@0UuIvlNq9 zePw*HnOIeq{57VcYA)jKNz6b%tG(tUXH92w=SSw|Tki`s2e=IULlmW!PybxR*lSvC zd)XHslb-!oenS`R79`M5eSYA^e=9-D7XKB4ug~^v!PyHEh`)q)*hl|VUa%_Gak9(% zte3m=KU-0uDr>1bCFNz8SJ>O!q{Mj1z=qBFD#i$pI2)O8T>f}Jwd9Evo4H4sVp8rB>@FudhHPF zPQYa*3*iX@f4FANx=l{rCc?}dR)IPsY97Qcm%6v85<)*-ZTT|FeR?R}#>cb7 z_ql~2z0ov)qno^UJwCkTUcOlU>jlsaPzS?}m7k9&;`bw98}=$!M;(8}xzrYc#Npng z%?gIso0;WaWvYLtSa}Z(uQO?vc7pJ&0Q}(#FmR)Y-fDeynyu1(NH% z`Lu*xwd|YnXCn8BcQgs}(~6Qpdv|Jz~5a@_Z# zLM0gg2t|2AW6{FMM%NI|80jN9=#I(y?w@mDwF_n@b|nwXl9*4C?BU$A)@YJNsBAi^ zi{Q=vQ4SSGybsUHM;*FByW}1`olueY4&@T(ZAfyALv!IQu!@T4-V>mi%TImSOUrFw z(I7KskE>`P6$xH$rR2hlvw+c#8>`hzzqwDvQzUmru_d$LJ3D@Q{(kZ0Mcu3t2`;*8 zZsCrynY-t{YVu*g_pt+q?ch+oajRLb#Yb)kdBSs!qKTOaHJ4&F>A0R?=_QtQyK}4T zr@|bKcIWQYQYj)Q^FnCB(q|TMox*`9ZJ~Q4)k9A_*;tZb<@_M@YBX()ojYAih#HOz zcr!?@be%X}A24pk=IlAP$VA=gVB_nlJnj$6&bJtEeWXVnp^NxBF(bB1%^Yz7SXPhX zd9u(c4pjMgNWSZ4v*hMV(j&|oC1(FMJjJtRiZ9sB3UqLpy-tGs?f$15`=xA3JkCtT z|MP={OrFpN82tIe;I;(zGZBRzQh(JL_>rUH=gD&@fYzmpNyI04jVu|Ekpa0Rg~9kw zNVknk%T{kVHHIMejNdDT20I zS_t?#vmEi-71-xS67M(InP=I~9F)T}$?)6$L)QZ;6dGtuYy`;c6_Hjr{3yI*NnDp+7`%k5yDx^*bGW z9Yf5&%Z~A0pdes5{uYM;abb1Ug@WUHQcD!0u)FtTSI$S@3lbOm1DSWpMLvjE)4sY* zD&)9O)|v~r1l;0v@CRSgV~)UtyS=-(9Fu=S54_Oidpu}|SMVv7E`rc_IeTap-@?8G zXc7@VysMjJT^zbPBv3+IE(nMs!(CS>RjhG3Kg?(Y>HyXO1e8Cj*e=b!5(I^(cI^x_ zZJ*w40$V$iGv#fK6?i;-+O|A8kM)%5UR58?-*yIno8R@DQgo6IX`MXJ?$~R2npGQmM=$A=y zHGNkj3IOqc`dq&FN8-5BPtQqk-)=^rjD^A+n{I28(nkCJ3fy)%M;zkgVJJGT+2R^tQJr5G^!&}1%~*y@$FR+vN0wl_)D4W zkORfej!ACLD-nIF1?Cxo-as6)XaNg)9>P^|@IuqioQb~tAiYAxTV#Gd4 zC-OM^c`=A3YI!;3_}(Jc8>0=##Ifb)&Iw58h<_;NCaol1tdllaqB8jwt^h}qBYXT( z;*JLQzdzdc9ZdCaGod>C-G+@Lc)@42j$3eYysf6h53e%v+dvDW4{_PVgdk)!8o#r) zb!MI0C5*=pFEbDr2!)h2Cj`a>M)Rb4-*e3XX=mc+2jgdFt^-%wwcBES z{M4*5ZWA;0!f{j-&i!$gpKvZ`WG1l{=6I|rBCcX z@PmvrKd*x@uhu)t!F!b~tucw0=G)LD4RCciseTL%ndPuk6B}Ys#Z3xPTl&tg5+V=* zRc-v6Y%>1CA0)Kj=Ay+^Hwoh1lskq5eS3i4E&($BP!5keFqp^CQKT*k7J8A#2(ol{ z8BNd>H5a^jfZ?71EDB=o?GS?T?XDzGqAUg+ z`Zh}9O|v$>ILqT0#+dzEHYhFL>-%@C+rEM!4yo)mWhGdDfT>r4}fC>kj47o4=EQY}=4>|;x0eBeO6aFvdDGjFJye>Jti+Ld0#L*@lt@Qw`dXoim^M<*fOdyC83c@$P@=N?4ftUN181;NQPaL2%f$#|Dy& z_TNh-sIn2Q_i4_Di-&txETwy%HG#dEP-4MvVNTl}7kM3l%ZyLkm#C#I9b22wjPf^sc`@}koZ%|3a1KVT3ymZjJ#!em$a0hRs1$#!d{A)ol z>5B66j|M7h)Z)*hj4r^_hB&hrcoq;bL!l#+;|{2KIggn!u&M`-;>)m0tUKEGvrT?nG^$R`NY5^E9i#8U=$Ze{JrCkuP|D_HYAcR{vQ$d{-a<`YN9w*Zy0uId0|y3t(nNpqU6Cl*pMMw+*FBgfGbf6VY2Urj#|8 zN}z;zE!TBt98QrewmoN(Xl1`5R6)E_R#)d&a6|s04_t*LmQm!7HD-Yoquf~vOGOKX1&?Ax*J%|nHp*a*kXkNh(V4W)pZ7a9f|G} ztd&IzCJn9>7L%+%QSo@#$bT!p52qF1@$jD;chwMHC(|7BZcc2 zPU96RfvuY@@F~g^{2nUpe*fSJg_^Omn`uk}RC?>YacXx)5~VSja?^01tpT&0&(wsn zRu8IlO?rT3pY3iSKQCzhN3)*tcWdhw7lJxy36dp2`=8vvY2O)15u)H@)7BZU;%WD3 zqOo7>>`>crp&{qgD}F-|<}D<(1jY>0Sq`4* zbWSM_gKTc_rk=I9h)oK}wjR7aIL2M3&Lr4Wr=|yim;?Xgo7m{!FJ8H-Akt+UZIt-n zlXE3|)IByG)y|$@J&Hh(jb^`R>RmA5u=`a~rc4y}x_kU}?u2=uBCw zUG`RfXpT~AunxOe)>cp^Um>Y?C~w0vX&6E&O_1&s$`${M@SQm9`M!p9i#Rk^c(IpJ zE@!rC6%>x-vG05Dm7rj~X}F!em3kTNG2SEN@ezum5v>ES?zgmeqV9PI z_uJhfL>=X`BDxr=a)c)H-~(VZ*qC!q*pG9ex^$GT|DHf_KOKvxG+aMj*H*(_!N3Dx zs2Tlp=T=C6)w>_bGJ_aqs^{?IO*Sh%OKY%kG{B2#qxdn0dT2-nP@-!HTf{bJiz!Z0 z2xcCMr(1kKzm9;Z(>?(4A5(ng-Xi7&t@EEciLc?dt?wa81Fa~AWMJ<+HX8miBwSQx zOM||S&LrDDg;zcmO?(%syY~a=M${5&171mA7{JIf;Pfb!S?fWzn|RstHM2#4{2v@0 zPY#0_M%M)&4hBB~1>c7lPR)awewrw_^?2cON-WV$I(I{xEae~l5Ke+HgqD>TFYQT& z2SR>`f2*VBu^z9z|IG7FpaPY%p!v}bF9msKy?}ekpi+%y${mu(uY#n;Vt*XE{XO1t zS3ts-qJG3Yi$$#`PUQ#m?_$liWXxyZMX+Er{@p$z zgQvLj5`AM#piyB}yVov@x*`JBkS$i}pr)0Vv)l2}^cre(tfsNZM0Z}B<)`U^57fLU zaJuG`noX&O+i%r;l8M>x1PLSva75}RQR;X4ES?dt#YyTQV-FN`hUC|a}Oa$bm9`YMCT`eBq7A(HVaJ}E3(=U6T= z@wV2NMPj1LZl~F_TSKO@R<*sgkoqTF3qaey;mA05>ZZScJBpw8l@D2z&7(^geLXoY z2ZG$+*esF1d|_Kc-#M^Cr8~flV*DnZh)0Uf=0crC4^YvR+nmle3W;hmV>7 zx8w$0c;%p^5uMNd-&$M;C`mL(tmtpYt_MJK#S z3qsA*+!DrK9_n&ZrDM%^_38l{%fqtpG$M{atNq%jw{-&Gf3i74XLketRy`)4#nf;F z2*$jr3Z9nLv&O{FlCFGm%t{fr-bPC(coG?An8W2d1I=4J4yDPq%nF#N>X^UGORy84 z=NYK%8~bE^5T6a+(A&~+_KdsL%>XCP^rTSaW-Zcbukuc{n}lZr4<4+5cr zbI}zm$fOWYB)im5QdKa?X$3LvMhRyRg-OzI&LYNpKFZVqb+|W3^D8_V@~~epK#M$P zcXM5d7IMD0tQH6(Lm}cl&AJ*@pileT-FndTx7VT*f`PPeaQA2*0PgbG*y2y z^XxH@zQi3Apj1nQfbZZK%K4o?6gfUFU~C8|0*ae%aR8O2VUG75o+-<4&BWD@MhH)}o|?$1zLpNSi@2 z_!9tH%E`0LKr}tINj57=2R}8F1V$$wnv;>;`+H!mot9Bgs$4CMDsyoqx%T@%7a(h95dzL;%tt`;((NU*rY2)C8M53MBZxNAK4PT2sn%FAu(9PGd{ z<$l~Aq6}vK+o8padxbSmMp|c3gzCZWm%-#CKgbUyKk(&fMzcz^a~5(c`R?O2I<&Dea~g>{9}h?FOJMAk#4^>T6*! zP&@Fi$*$VU%**gu6$+S_JlYhnmFZ7G7;O#~JmvB|HmlB<1eH=5$>1UaZ$9(4b-@X$ z`tU+gLG2Jg87Sr;pNJHq-|-a~U~Ooc?l=Z`01@%Z?!sD|#v1CHQ5cV(EuUC&gX;P3 zXO47Qq3(B0L8b4}xzjBv=9sjs;9#^#c9s5Bu`k8d zYu|y#@Ja2`L>tqaZg@$ttGv-Sd@56iqn}RjNlvZVkCpPlFJVe0(wAb3xhpUk*|j?3AcwMR5#iGM z#&F}rZvP~Y1+QAoP^6}ar@vDb^i2L7P)9On==;)FbfN#9gjGkXHqIoHTFJk*oesn1tKhn@!_eBh=S3_%+UFDBq*%yK(R|QH{2MbLm~U zvt)HqP};d}b^eK}gAbVc;ms_N^DEfr`CE(2N$HBZ-daY~if|Vj zAy2vpmeybEjQa8{ibNr3oWz1|KOGxo?~&2CI!tI}8$uKc>Z_dJ?CY--FP-z>Ey?g6`Yjx)$s^9f zEBCzO)_QJW^U5=5Ys`|7vJ{H7{rTLSFMLk#lL#+*rmMF1CrmG|whq4@~kjjkawUbAZ?zZUe6{mg)J=va{PaR-(n~(;+9y=zbk+diD?TuCf@V15eiDXZVSJa%R3yX;Gx;sM%|?J!-)dKo-3QD_;P0iXP@cGeICb}> zjZ!A#@Y~9u>F>KaRNMelO7hR<@JlUF3?Mi*hS?dX+=a3CCaTzY{)TFXoHR#Yf?(!0 zOP$JhzW~YX)e7k2-Hcx~645{<^QVCv)L+mNyWJ|+%OqB z0m%Aknk0eNH%;DpZ}ZmVIY{e4wqJ@nYlWcV2aMzV%Nsfb>-cyrg2aXrL@x;4DWiG; zrrXEw51tRvTO3FSMyR`lxISV0hvf@t2t(;|od6lf0W-E-CxC*kP4OME$smAkWxGLB zzl?0#s&7-jh(Yvr>P@e)<-`7`*;A621%=DY~_=`NR34wM*| zgV}YqJ)%GGmVr5XJKE>4MGU*4Q*Z*Y@BWdy%IgW^M(Dn>Vv6NRK1bNyMLi}Tz|yzK z9n8JM^@(UHS+Y%YtAq;2sy1vBmri}+rdFm<2%^<7XaQD?JK)gd4wm}v0A&zUlI^&~(PAP4+Y zJ?-4`(=?XItno$DHncR4*;^XG)IY5~93er(_`Z7{^MQABEzJW~<@$NOW0l@C_CC}@ zj!ZRlRk{*#W;PtrFHDGadx%n?@dAaqh5fY{X4L!Xeo7wv4dS}yb`A)ug zzX_SdJ%z|`k=oeLKZ6b)St?y&`}+ zDmqX(<0FvH&Q+YHML$=6)#`x!*44lqdE|qCtU192#g?}+V(~xhY*T?g^SPjHfl0Xd z@z>Mwx{EZ?%*{i~m!HD* z62S@y$Jq{mwxnqQi(~_sE?>K8f|AIet{ke`a#sLjf8gWE34lniOmg$;78@liX4BWM zc%qKOBEdbj`Toq}D4R#(;QoC-VBNUh4PDtW0xc-R)kULq%iJK_p}6EU z{~L<$+!-&uT^nnh;NHCE32okm-Sq6t)!@$r05FLEmkV%Zg6Vq7akI}|fb5T~1O$6) z?T`k)>)(A6n^XiGUYUH4{sflu^!>_&*w6IDJxI6N0$uWhyO%uJ(8K(b=fD`AaU%2w zaQWB)u59-b2`BDC?tAHbtjo5_^ z(%2>zjvtf%l-tO$)C5}JVC8AGr?o8LLr)#ov-lqq)$N38+dGr5K!^)9f=9<1e`57PukK(anwoXGWbkyn z<=c-#_4wi@lOn*&rj?!Hceg|Qvu1fkfP!rF79Ja&5x!PGC{=l^zzdRKB^zNEgSzHu z+p4LhuoW}e_ui@4!VSRBQ{Y{JJj40EwfzsESdL9z#?MaaMm6mzegOXII@Ys+Ds3?y zETv5eGJT3zx%Ny-INEg>n7XstEiF++YovUo4zw#l3fE~f^6+elfTIC(z*Lx!4jrBF zNzIQ09>P7KSR!8_sXw1?H;Zu|vkE4a--HdTTLcVY&@n#}ROL_4a=vkC$AAOr;qGwj zFGA%^2W~A2ah~j{cb_GJ1JkBpH`|i(f$95itOyYx9h+B>WS?`f&g&O|z_b7<5f87NcZKhnSooL3zt0u%ip>j{lA9p#URtA5k_}ONZQ(rtSMR{JrvhN4!Y5T3G`30^zsxvY<4b5^wOW~R@|bz_bnge z&tjACJ?OXYY%(sx^ynAiNP^cLM~)zxexvZQRjUB3@7o_8)j7p>Pe@}&CQ?(QYnVnNZ!Q>x>eBVGFBn|CV_7S(p;ity+B4whW}7M~T2b|X9<^wch4 z%#GvSg_GQS9eO68`pZX~zz!^h-cO44)-v?ft}wskwjW}KMpD6wU?b=^zM?D<^i)rH z&G)LspTisLwmW@o%ii2r7fmA!V$ZWfih+WPd)xYc|8WH;%~Saowi+@DU0HTY$ILu- zYJ`x)dctN#g|gNFgzCnP#9X4*k2El{#2T9Gq=BDuXi)mK(U_6aTEYG~YpBPR{O=0p zoF2T*&l@^9Ui%f9rP=GkGX}on^d@nz#N8U({x+siZ48_e`*xnw#a;;4@C@&D5*!nR ze_46k;eECE2VK)p$N>rGG4lPxKWy)EdCjLlH6?nivsglT!_*W&pLNnu5!`m18S(bl z>bvw3ep{>*L3;pK6ufz0h?{b_&nzq6X0eOLO_7>J$bd!rS;!+h5{U+I$p)oz`XM=X zWN}8Y^m&%J!-_gd`HBSso$5T#1gY{4dFgY{mnn@q$Qc%kKh3M(E_{YaYeolgX@sNJ zJegS!7rX(31s!I!t*CPmM#xKWT^Mir z;O^ZL!G`%wg!*=iLk!EuHDe(!lnF`xEDL@~u9Tce@|%?{T*rS%$izKhVjzP2e_ zslAw-h0)FcmpWk7i0U}QS@va+J?qkxH@NTh{2ur+rsUjJ!iWvyv*V=p6SHUYL!P-f z!>>W~<&O@CJ3!l-)6)^4pDpV6DDrI}d{0zQ^HLkHsk&VPi&M5fq?8h`=l(b<4SM=` z65L~JJ+brFPTkp4O#qdqwq2rREWfwS40zToc@y2NQ5A1^MatDHb2=;KAZm0_i5v;! z>!*kqRotWgL;s)H>1i7IQ3}ldgbVo&U@W&w&XjwnQ^Tc0AZ&A?1!MX!>EX*r@NJf% z1tx;jLp$!%rcWlL8>Y-w2eEew0t}raW|%`y$V0#JC1w6z984U}c zo->`*o90JK6UQlebDRkiWqA>M8Mu4~ty6*MeML$168TlWPZM+xA8oy=`1!=sk40d` zs&vrgYHQf)QNW&z@^(M{x*pu;2K>4Y4PZWa@j_&SAm!Gx&1}ML%}Az6D2C`4p-e zkd=Sl%w!7d2KHm$QA@u9-cIAVhsp)ma!*6SRx&u=!$%{_y%qH}q_I*){2{Cyj78cp zX~IblmVhp945@c7+pr(1dZ~Z{Vf7JDJ=1lk05w|gCb=x0FZAnH7@=g82lzv$1BHwRiQtO{=9-F^;?z$M!n1p>5oDg+$!yr$*SF9DS99gaLWd^edf!C z39{Ry1lO=(toWW3Nz6UMvEKPIKGX7%61LJh0bu(Q1qQfBlNKOt)R$c5E-vYbpEzt# zsl}`HFsGPVu0%3MMx}t=`}hZN?W1^=N@Y8%_J|+Um}S>aM#dg=s{+Pjc*WrxacsMR zCtn}6&QhYl<%4bN!?RoLS5tUS2TX-dxc#qL3zPod+XjAfL}klkWo4ca+R&5S4j3do z)~SVQup^W*yqIwXda&Qo&>GL>i1RMpK4?D~o*A#*s0$$e$bj=u-66zN(ja{{EicI* zt1(bLq$JQhBjh_C5gB{<`AvE5Y|fa&Csg+{Rcb(@EDKYKVEFs!KdL#@*!ZffgMW-5 z<`*pJtxYRiL%P7Yyo>+6`=$tdW#G9?t>hC$*A>Sjn`cp}~2`!3S!vAjbP%+*nLN zv*|Q}oS9@uDAGnPPu7bVn5PFw0f?RK2RaTrwYX>l$|phcvn`G0WaP_mQXt7FN33M+ zM~dQ9gL!)N7#}A*WV!1ONX_yxb&oV5Q5)3iYF~e5hxu3++0KjkMLg($M!i!{3#6R> zO5r=fZMR9A-AEESE6=MMyy3KvR}S``O?hc{TmvRpK@4XwA63~&U2B0-kY+I9UQ>Q4 zB-QQm3VB7nL5Z~NT36Ex)Y1g_B-eo+CyXo-ye%k8pWTrIzG$j@4lF$iOu^jy`nCSB z`v*_dxWPtqI_93t{-2PJL{f60bnrc7zTLU=FFw>C5=U?_1ua6>*sJMQQQscEN;xzA!NM$xnF3m zZ-#E8EQ^Ss2`Z+ku&~`CdqmXr2A{$OVy*~z&yR@JUtGpm}gT{{iY+`8W zU`0cd3Mqz)Y0wc5cF6_&6-=F>+l%r9Cm`#I;}BXP$DzI#jqC_bTf&5MXiy-(VhcH3 zr|4wZ5i$}T&t{Fx7UEHWNBl7nuRyn<&hi2XNePVzN}~UtEmKe)>GzJm37FUfO=yCi z1pJG`&gm31_P6idx~Hzhi}(r*dPIfP|FjX3Ei6EE@EgSKp+%!N{~Z_x{nGnb5e>@X zcjy3Ev6ukSX6({5Q4wmB+ES;Oju9oA_E5h9s09*dbI_NS-VVmF)|uy^R^YvuBc2+!L=nt23U@Moefp)N~HmEP@b_NVy5~0J=uw!?*P{C18v&n z24IjGCPaScun}?W(7=8r9gZS+^ob7KN9`Lf;4P#cBO;C=}$?D;a&Li z!nr^uo1t>44n+kdZ71ifgP=s#8hD4!4X`%FmI|B z$+yF;>2nGF9iKV2$Pb;5zii3LVV63cSP3+9?_!5(&swK{yHmS|1q4p8ME(GZ1$=$h zec=_%|8A4mM2^H%{H3naosb_}4T0*u=`H=(>t=CuuZ^sWBDHC33|WH-jQ=U9&8Zl$ z@dGiN(7H=u)ApjRwG`k;EAwjhY>!(zn=bh$nL|Sh-wG*)Yo3iY(n~B{hXIH#2FcN5 zelKCCIzQsP_XYK685%%gNt|Ivx|5b^1W;2txY9+FaY})j=PuF1RQ5_DDqB(VYi2It zx~sgBrFvksM4orWqf0#q^PNk_KU;%k29RZu2iQ#!6>znDB@DeVW{-U=zLEy%RA<(B z1~`<)_ro}uzjN(t#24Qw{)rlC5I!>lc7kNF^gIf$il}f=nJ?06R^0pmcI_e$F!UHA zOcc=#vZ(}M0%VBM_Ywh_F}ynuL>H_BW;k@<@zd)+ls;P$wrYqwt`mF*w(dfS3cu;T ztb#M(OtsY`8JBzksDuX_PQ*C;55|L-;q*ocSiyvKoPsv~$FB%LIH-|`OEx?3lGt52 zhFugN+^v^*#Qd|P33E#Amm2AcGk;3RKNM8+Vv#e%yWC|01*{QsOGk1n7eMrbACdvY z3fSLK3=$8nSP@s~XujpPNq6NQ#7JKG2xu!)(%+Gv-EQGAUg#iC?Gs)@l>_{m)Z0s1 z?|ZV?FSL@U+Da^JdXUphd6LuFEoP00ne|-MH@~*r4Eh_}b|_M1Ns4<{U9&;D`Y&b= z8`SuRL24~yzgZfesWrb-v830T!$+me_`AwQ)+u*x6pealG)ka7jl)nIa6%8F|2}YO zNdhaKkLXC-ju#Mr^zLoxVlr+tRnCYk5PtE(&Z_yK`56;xlwtQapuVMVQgAZqwWUtB zgEy2&%yPp4=6F@$E8XQ3_|rvDExBNV$)rLh+R|Epvi}ZU#!E}(n$9T8GPL6BCaOct z)a*p7EwaGxW46SLEX3>5q|@9JdNIabSSJ^Z@Jew@HFe5TR5(U2brgmexD`15hc>kl z9P4mEBz!++E^OJ>Vh)CvH`ZWCnJbnfqIUPR5Xp=J21m)T5)@%>IpIRUqX>}Wj*0dZ zL^VwVWGU-zLqZ-}gA_?7jTm6Wo2RfK`is~V+@N3+9~SusOsIbnpkI$@JKpc?ctlX( z&|-g@`m2W_hP@iu9PhxPY3xQ;zqzq(5TxyfZlOm!zKU9Bm!~Tx0f^;ocugj_yz~;~ z#SB8s8P(*p(Tn9p(ve9kdr&FQJPl|(3}8N-E&g>8#jc^3)>VN#+txAxy(2?e1eyJM z=d}Lxt`sapKvA4!uepYZ+FE5;l=mtJX=W^C1SvRuuMnqL8F|IY_ESXp@h0`Z0gQ%^lCtYx<2JyU3nNSqpK< z?Mwi*+_3>L+TEzl8-jjzgHhIjmwp({(IRMZqo38KC}Em~w$OIIZ;0^UuWp5~QKsTQ z4rW1*a0g<507t|+a8{Kn^_ruv8~foW z%?DcP)Cdc;m0OXB?(iYTW*PPPWg)cMKA{Y|Xsvw7iLqQV`MwxP+ZD5Y+S~*lDeEVm zz5O<`_%5*X4|%txt${9`9$9kJ6t~l*AR8@n)8*2=<;(jJ`FqG|3Wu|(xuJOA-*C#i ztW6+&;-Z(_zkk8Or;6l}Wq*2zTHqW($d(#o(?2lLA!9^)Xv>(9DU)vk+y zBzYGk(H}uQV)$$Oo7`wbxDhm6npWo@gg0A}`al=aCk znB=90E@S$FiM=&=?O%RXHve-*@V7elfQL&PgIKkdppA<2im!Hxsj6lSXx-90G2uSX zR~sGbbquhFkHz!t6f;zRf-CJa@-lu|n47giMbxRYUQv7TDFSx)-6xqERS~Z1cgQ(LZ{gf$#;6U<#jSBB zoCB=`#ri`m>^*bHGa=02kl)!zx;f@YVQyL^ZaU5{a?@>TGyK{LCyx$>^ZF~xqszdz zX#<=|Zal9m-UOyi%X|+WsQhRGdXCNtSfv(h6u(VSid_omv5Y>ixSWI0uKde)z3fPX zY<5&FIrZ&`E@eB4-Gj*nw=UHB_z1}bl5fx0y(z?EdB5(~r_w*J7*uIjQ_qpAutW*# z2Hqu6o9$h@Nor&3r{MLkYtx8l*1SoQbc~+ zFGC^CFHrL$^TO2rejk=UnZM-pn7?%@-H@*NK0-|bUjk4L2KZH)Vn0ZEhZ+|1sr7Ku zrphnFB}A36AMnFg<~_gIrT$ik6}Py~47VsKSq_w^cQys35&8bgGkenXnwJ@K+gErj zKnLz6Cg#~?@Cwqbr9tCxh5Q~>jw#0|>F$1go))4RldVd4pd1YOzeNNSM)lr0gOf^i T|KjF{DuAw*p=Oyn>gE3f6puRT literal 0 HcmV?d00001 diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/brd_wiznet_png.h b/11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/brd_wiznet_png.h new file mode 100644 index 0000000..a316c18 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/brd_wiznet_png.h @@ -0,0 +1,860 @@ +const char brd_wiznet_png[] PROGMEM = { +0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52, +0x0,0x0,0x3,0x7f,0x0,0x0,0x3,0x91,0x1,0x3,0x0,0x0,0x0,0x78,0x37,0x89, +0x3e,0x0,0x0,0x0,0x6,0x50,0x4c,0x54,0x45,0x0,0x0,0x0,0xff,0xff,0xff,0xa5, +0xd9,0x9f,0xdd,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x78,0xda,0xed,0x9d,0x4f, +0x88,0x24,0x47,0xbe,0xdf,0x33,0x95,0x62,0x72,0x17,0x86,0x49,0x2d,0xef,0xd2,0x82, +0x66,0x52,0x8b,0x6c,0xf6,0x62,0xcc,0xc,0xc2,0xb8,0x5,0xed,0x4e,0x3d,0x16,0x2c, +0x1e,0x6,0xeb,0x6c,0xf0,0x61,0x16,0xc1,0xd3,0xc1,0x97,0x1a,0xe6,0xe0,0x16,0x2e, +0x3a,0xab,0xdd,0x8b,0xda,0x7,0xa1,0x32,0xf8,0x22,0xc1,0xb0,0x7d,0xf4,0xd5,0xe0, +0xcb,0x33,0x98,0x37,0x59,0x2e,0x31,0xe5,0x83,0x50,0xfb,0xea,0x93,0xb2,0xb6,0x96, +0xad,0x8b,0xb0,0xb2,0xdc,0x87,0x8d,0xf6,0x8b,0xcd,0x78,0xbf,0x5f,0x44,0x64,0x66, +0x44,0x66,0x56,0x66,0x64,0x56,0x56,0xeb,0x8f,0xa7,0x44,0xcd,0x1f,0x4d,0x77,0x7d, +0x3a,0x33,0xe2,0xf7,0xe7,0xfb,0x8b,0x5f,0x44,0x5a,0xec,0x6e,0x5f,0xa9,0xf5,0xa, +0xf8,0xa,0xf8,0xa,0xf8,0xe3,0x6,0xde,0x5e,0xde,0x31,0x70,0x73,0x71,0xc7,0xc0, +0xd5,0xe3,0x3b,0x6,0xae,0xdf,0xfd,0xa9,0x3,0xff,0xf8,0xf1,0x5d,0x3,0x9f,0xde, +0x31,0x30,0xf9,0xf0,0x8e,0x81,0x64,0xfd,0x3d,0x7b,0x1a,0x3a,0xb6,0x1e,0x1c,0x38, +0x71,0xe8,0xaf,0x67,0xcb,0x74,0xe4,0x3d,0xf,0xae,0xbe,0xb6,0xf7,0xa,0x24,0x1c, +0x38,0x39,0xf1,0xd7,0x93,0x88,0x8e,0xdc,0xbf,0xf1,0xfd,0xcf,0xac,0x61,0x5d,0xdb, +0x77,0x25,0x60,0x70,0xfd,0xe0,0x4d,0xf6,0xd9,0x43,0xef,0xf2,0xf9,0x57,0xe3,0x67, +0x8b,0x77,0x0,0x78,0x3a,0xac,0x6b,0x9b,0x97,0x7e,0x80,0xe0,0xfa,0x1f,0xbf,0xc9, +0xfc,0x93,0xf,0xdc,0xe7,0x5f,0x9f,0x3e,0x5b,0xbf,0x93,0xfa,0xf,0xc6,0xc3,0xba, +0xb6,0x55,0xe9,0x7,0x8,0xae,0xff,0xd1,0x17,0x2c,0xa0,0x1f,0x7c,0x44,0xbf,0x1a, +0x3d,0x5b,0x3c,0x3a,0x7e,0xf8,0x60,0xd8,0x2b,0x5c,0x6f,0xf4,0xbf,0xdf,0xf8,0xd7, +0xff,0xe0,0x73,0x37,0xa0,0x8b,0x35,0x89,0xff,0xef,0xc8,0x1d,0x1d,0xfe,0xee,0x5f, +0xe,0x3b,0x86,0xeb,0xdb,0x12,0xf0,0xa,0x81,0xc7,0x87,0xeb,0xf5,0x26,0xfe,0xe3, +0xe8,0xe1,0xb3,0x37,0x9f,0x7f,0xed,0xec,0x15,0x18,0xfb,0xd7,0xff,0xf0,0xb,0x76, +0x7c,0xe0,0xae,0x57,0x5f,0xfd,0xf5,0xb3,0xf4,0xd9,0x17,0xcf,0xbf,0xe,0xf7,0x7a, +0x4b,0x63,0xef,0xfa,0x9f,0x7c,0xc1,0xfc,0x3,0x67,0xbd,0xf8,0xfa,0xbd,0xbf,0x48, +0x9f,0xfd,0x47,0xeb,0xb5,0x61,0x81,0x37,0xa5,0x49,0xb3,0xbe,0xbe,0x7e,0xfc,0x5, +0x9b,0xbe,0x79,0xb3,0x9e,0x7e,0x5,0xc0,0xcd,0x1b,0x43,0x3,0x89,0xab,0xff,0x7d, +0x1,0xc0,0xcf,0x9d,0xc9,0xe3,0x1b,0x30,0xfc,0xb3,0x67,0x94,0x80,0xa7,0x19,0x16, +0x48,0xbd,0x12,0x70,0x81,0xc0,0xf8,0xe9,0x66,0x6d,0xc5,0xe9,0x33,0x4a,0xc3,0x3e, +0x40,0x7a,0xcf,0x83,0xf,0x5e,0xe0,0xc7,0xb1,0xc4,0xa,0xf6,0x9f,0xb5,0x11,0xcb, +0x85,0x5b,0x27,0x80,0xb1,0xe5,0x97,0xfe,0xf5,0xc5,0xf0,0xc0,0xc4,0x72,0x58,0x22, +0x81,0x91,0xe5,0xdd,0x1,0xf0,0xc9,0x9c,0x25,0x73,0x9,0xf4,0x3d,0x96,0xfe,0x66, +0xdf,0xc0,0xcd,0x8a,0x6d,0x96,0x2,0xf8,0xa5,0x37,0x65,0xf4,0xc9,0x5d,0x0,0x13, +0x1c,0x3f,0x97,0xbd,0x74,0xa7,0x8c,0x7c,0x15,0xde,0x1,0x90,0xbc,0xcf,0x81,0xb, +0x67,0xca,0x6e,0xbf,0xbe,0xb,0x20,0x75,0x5,0x70,0xd6,0xa,0x4c,0xc0,0x5b,0xa7, +0x87,0x60,0x3d,0xdf,0xf4,0x6,0x32,0x0,0xa6,0x2e,0x4b,0xc2,0x5,0x5b,0xc4,0x0, +0xfc,0x9d,0x19,0xf0,0x6a,0x30,0xe0,0xf3,0xe6,0x5b,0x1a,0xec,0xc,0xc,0xc1,0x2c, +0x18,0x18,0x7f,0xb0,0x60,0xf3,0x4,0xbc,0xce,0x81,0xe2,0xac,0x6b,0xbe,0x3e,0xf0, +0x7e,0x99,0xfe,0xeb,0xe3,0xe3,0x4f,0xee,0x79,0x3f,0x9f,0xf7,0xf3,0x34,0xc1,0x25, +0x23,0xe1,0x25,0xa3,0xbe,0xf0,0x34,0xe9,0xbb,0xcd,0xc0,0x13,0xd7,0x4a,0xff,0xd5, +0xd1,0xe1,0x6b,0xaf,0xdf,0xb3,0xcf,0x7b,0x1,0x69,0x0,0xb6,0x7,0xc0,0xd4,0xaf, +0xfa,0xd2,0x3a,0xe0,0xf1,0x87,0x7,0xe9,0x5f,0x3d,0xfe,0xf4,0xc3,0xe7,0x2f,0x1f, +0x3f,0xdf,0x1,0x8,0x86,0x6f,0xa,0xbc,0x39,0x4e,0xff,0xea,0x9d,0xaf,0x6e,0xae, +0x3e,0xf9,0xd8,0x1a,0x24,0xf3,0x4e,0xff,0x9d,0x12,0xe1,0xed,0x7a,0xe0,0xbf,0x0, +0xe0,0xf3,0x7b,0x3,0x1,0xe9,0xa8,0x1d,0xf8,0x6f,0x10,0xf8,0xf2,0x63,0xbf,0x1f, +0x30,0x2,0xcb,0x9a,0x40,0x68,0x7,0xc3,0x4f,0x21,0x5a,0x10,0xa2,0xdf,0xd2,0xe9, +0x45,0x75,0xc,0x3f,0x7c,0xfc,0xe9,0xcd,0xe7,0x7d,0xc7,0x90,0x4d,0x1c,0x9,0x73, +0x19,0x5,0xe0,0x2d,0xd,0x75,0x60,0x29,0x11,0x3c,0x86,0x59,0xfa,0xe1,0xa3,0xc3, +0x9b,0xdf,0xf6,0x9d,0xa5,0xc,0xe2,0xa1,0x80,0x81,0x2d,0x22,0x30,0xd5,0x81,0xf, +0xec,0xb2,0x1d,0xbe,0x9d,0x7e,0x78,0x7c,0x7c,0xf3,0xdb,0x5f,0xf5,0xb4,0x43,0xa, +0x1f,0x48,0x1d,0x91,0x30,0x25,0xf0,0x2e,0x1,0xd3,0xc3,0x37,0x6a,0x7c,0x8d,0x48, +0xfc,0x7b,0xa6,0x18,0xbf,0x80,0xf7,0xdb,0x0,0x7b,0x1f,0x26,0x9,0x58,0x87,0x7a, +0x4b,0xf1,0x3,0x8e,0x8f,0xb6,0x0,0x53,0xa7,0xa7,0x6b,0x7b,0x2c,0xa4,0x35,0xc2, +0x66,0xf0,0xa6,0x44,0xab,0x62,0xa4,0xc7,0xa7,0xdb,0xae,0xd0,0xed,0x9,0x7c,0xa, +0x6f,0x48,0x78,0x31,0xe8,0x63,0xa6,0x91,0xda,0x6d,0xc0,0x5d,0xe3,0x61,0xe9,0xa, +0x99,0xb3,0x67,0x60,0x79,0xc,0x4b,0x85,0xa1,0xe1,0x81,0xe5,0x59,0xca,0xd8,0x77, +0x1a,0xf0,0x60,0x34,0x74,0x15,0xa3,0x64,0x87,0x65,0xa0,0xf5,0x64,0x68,0x60,0xc9, +0xd3,0x94,0x80,0xcc,0x5a,0xe,0xd,0x2c,0xf9,0x52,0x15,0x88,0xce,0xfb,0x7c,0xb5, +0xf7,0xc2,0xd0,0x77,0x8d,0xd1,0x62,0xaf,0xc0,0xbd,0xa8,0xa7,0x3b,0x7,0x26,0xd2, +0xd,0xaf,0xb8,0xba,0xa8,0xde,0xd2,0xe9,0xc5,0xd0,0xc0,0x50,0x40,0x71,0x32,0xce, +0x6b,0x80,0x9e,0xbd,0x77,0xa0,0xf2,0x5a,0xee,0x3,0x18,0x8,0x68,0xc,0x7f,0x9e, +0x31,0xdd,0x97,0x32,0xc8,0x1e,0xef,0x5b,0x43,0xbb,0x36,0x30,0x3d,0xea,0x63,0x42, +0x2c,0xe0,0x54,0xfd,0xe,0xd0,0xa7,0x87,0x8f,0x86,0x9e,0xa5,0x60,0xf3,0x69,0x6, +0xc5,0x37,0x55,0x73,0xd6,0x3d,0x38,0x6f,0x7e,0x1f,0x2f,0x24,0xb8,0x94,0x62,0x90, +0x70,0x1f,0xc0,0x58,0x81,0x3a,0x3a,0x70,0xc9,0xf6,0x1,0x54,0x67,0xcc,0x4c,0x7, +0x82,0x59,0xec,0x1,0xa8,0xce,0x18,0x80,0xef,0x1f,0xa8,0xcd,0x98,0x40,0x3,0xe2, +0xbf,0xe,0x1f,0x80,0xd5,0x19,0x3,0x70,0x62,0xe9,0xe5,0xb3,0xe1,0xe3,0x21,0xf7, +0x2f,0x97,0x32,0xed,0xd3,0x81,0xab,0xdb,0xbd,0xc4,0xc3,0xcc,0x6d,0xe3,0x7b,0xaa, +0x7b,0xb6,0xdb,0x3b,0x9,0xc0,0x8a,0xc5,0xdc,0xde,0x41,0x3c,0x54,0x6b,0x6d,0xf1, +0x3e,0x96,0xf3,0x78,0xbd,0xd4,0xf2,0x61,0xec,0x7c,0x7e,0x4b,0xd5,0x5a,0xdb,0x1f, +0xdf,0x64,0x69,0x30,0x38,0xf0,0x75,0x1d,0xa8,0xd6,0xda,0xd6,0x3f,0x67,0xa9,0x3f, +0x34,0x90,0xc8,0x7c,0x34,0xe1,0x19,0x9b,0x5e,0xfa,0x5a,0x9f,0x73,0x2b,0x1d,0xba, +0x5e,0xfa,0x6b,0x10,0x33,0x97,0x2c,0xf6,0xdd,0x2a,0x70,0x29,0xac,0x74,0x58,0x20, +0x48,0xa7,0xcd,0x6a,0xc1,0x7e,0xef,0x9,0xb3,0xd0,0x6a,0x6d,0x1b,0x19,0x94,0x7, +0xaf,0x26,0x2,0x70,0xe5,0x8a,0x12,0xb4,0x5e,0x6b,0x13,0xbe,0x7d,0x3f,0xc0,0xb, +0x1,0x54,0x6b,0x6d,0xa2,0x34,0xb6,0x2f,0xe0,0x4c,0x0,0xd5,0x5a,0x1b,0x66,0x6d, +0xd4,0xdf,0x17,0x10,0xc4,0x61,0x5c,0x72,0x6d,0x3c,0xd5,0x77,0x7,0x9f,0xa5,0x58, +0xd5,0xbf,0x64,0x4b,0x10,0x87,0x49,0x30,0xad,0xd6,0xda,0x2e,0xee,0x10,0x18,0x87, +0xfb,0x0,0xe2,0x42,0x89,0x23,0x6a,0xde,0xc4,0x2f,0x1,0x3d,0x99,0xf3,0xc,0xee, +0x69,0x5c,0xe1,0x69,0x68,0x9,0xc8,0x2b,0x1a,0x89,0x2e,0x5f,0xad,0x86,0x97,0x6d, +0xbe,0xd8,0x25,0x7c,0x69,0x5a,0x2,0xf2,0xfc,0x9f,0xe8,0x9,0x40,0xe3,0x6b,0xe7, +0xc6,0x81,0xaa,0xae,0xd8,0x2f,0x90,0x54,0x3d,0x77,0xa3,0x55,0x92,0x9d,0x23,0x7e, +0xb8,0x7,0x20,0x75,0x57,0x7c,0xc1,0x92,0x1c,0xf8,0x2c,0x39,0xc8,0xa,0x77,0x3e, +0x8b,0x20,0xf4,0x62,0x3a,0xa3,0xd7,0xfa,0x6,0x0,0x12,0x67,0xc5,0x17,0x2c,0x71, +0x96,0xe6,0xb,0x96,0x0,0x9c,0x9c,0x5,0xfc,0xa,0x7,0x7,0x26,0xf6,0xa,0xec, +0x50,0xac,0xae,0xe5,0xb,0x96,0x0,0xb4,0x4e,0x2,0x1c,0xc3,0xd4,0xb2,0x86,0x6, +0x3e,0x1,0x20,0x38,0xee,0xe5,0x85,0xcb,0xe6,0x4e,0x1,0xbc,0xff,0x20,0xc0,0x59, +0xba,0x7,0x60,0xf2,0x21,0xdb,0x80,0xe3,0x5e,0x2d,0x16,0x6c,0xb1,0x98,0xe6,0xc0, +0x87,0xf7,0x2,0xb4,0xc3,0x3d,0x0,0xc9,0xdb,0x6c,0x93,0xbc,0xaf,0x1,0x27,0x30, +0x96,0xfe,0x6b,0x1,0xf7,0x34,0xaf,0x6b,0x63,0x18,0x5b,0x2c,0xdc,0x15,0x48,0x1d, +0xb6,0x21,0x6e,0x15,0x38,0x81,0x49,0x3,0xa1,0x69,0x52,0x2,0x36,0x5,0x64,0x33, +0x60,0xea,0xf0,0x5,0xcb,0xa,0x30,0x12,0xb3,0x34,0x2a,0x1,0xa3,0x9d,0xaf,0x30, +0x84,0x68,0x1,0xca,0x69,0x9,0x91,0x76,0xce,0xc4,0xa4,0x59,0xc2,0x18,0x7a,0xa0, +0x17,0xd7,0x15,0xe3,0x5f,0x95,0xc5,0x55,0xf,0x60,0x70,0x1,0x50,0x8,0x4f,0x0, +0x9d,0xc9,0x2c,0x34,0x39,0xf3,0x99,0x2b,0xef,0x5d,0x52,0x2,0xfe,0x97,0x5d,0x81, +0x24,0x98,0xf3,0xf5,0xc3,0x4,0x60,0x4b,0x99,0x67,0x13,0x0,0x5e,0xd2,0x20,0x2b, +0x2c,0x68,0xc0,0x78,0x67,0xd7,0x16,0xac,0xf8,0x72,0x1e,0x1,0xd8,0x46,0x2a,0x9, +0xa,0xc0,0x45,0xf6,0xe7,0x12,0xf0,0xcb,0x7d,0x3a,0xef,0x1a,0x2d,0x49,0x3e,0xbd, +0x13,0x20,0xe8,0x80,0x8,0x26,0xee,0x1c,0x80,0x6f,0xde,0xd,0xf0,0x81,0x1d,0xf9, +0xa9,0x7f,0x1,0xc0,0x7f,0xb6,0xb3,0xa7,0x29,0xd5,0x4b,0x33,0xe1,0xd,0xd3,0x7, +0x47,0x51,0x8c,0xe4,0xfa,0xd3,0x8f,0x29,0x8,0xa9,0x77,0x1,0x18,0xee,0xc,0x2c, +0x95,0x2f,0xb3,0x12,0x83,0x27,0xa,0x2a,0x62,0xde,0xae,0xbf,0xa2,0x0,0xfc,0x0, +0x22,0x24,0x61,0x77,0x3,0xfc,0x14,0x80,0xf4,0x3,0xf0,0x47,0xc9,0xee,0xc0,0xa0, +0x52,0xfd,0x2a,0x55,0x6e,0x70,0xc,0xef,0x23,0x70,0x61,0x83,0x20,0xd8,0x3d,0xc5, +0xf0,0x2a,0xd5,0xaf,0x1c,0x7e,0x9e,0x25,0xde,0xf1,0x31,0x2,0xd7,0x30,0x86,0xd1, +0xee,0x49,0x94,0x5b,0xa9,0x7e,0xe5,0xd0,0x28,0xab,0x12,0xaf,0x29,0x0,0x89,0xb, +0xc0,0xff,0xb0,0x3b,0xb0,0xe6,0x1e,0x66,0x57,0x9c,0xc1,0x1,0x48,0x0,0xe8,0x0, +0xf0,0x60,0x77,0x60,0xa9,0x5e,0x9a,0x5f,0xb1,0x2,0x6,0x20,0x98,0xc5,0xed,0xcd, +0xbb,0xec,0xf7,0x47,0xbb,0x3,0x5b,0x66,0xc,0x17,0xa4,0xeb,0xd4,0xa6,0x6c,0x73, +0x73,0xc1,0xe2,0xd3,0xdd,0x81,0x6d,0x33,0xc6,0xe5,0x42,0xd1,0xa5,0xec,0x66,0x3, +0xb9,0xdd,0xee,0x76,0xd8,0x3a,0x63,0x34,0x7d,0xb8,0x1c,0x0,0x58,0x3b,0x63,0x4a, +0xf0,0x5c,0x2c,0xae,0x86,0x0,0xea,0xf5,0x52,0xee,0x5b,0x10,0x8a,0x1,0x98,0x84, +0x85,0x3e,0xe4,0xc0,0xf9,0x10,0xc0,0x3a,0xb7,0x2d,0x5d,0x37,0x46,0x5f,0xd,0x71, +0x31,0x4,0xb0,0xcb,0xcb,0xb9,0x63,0x60,0xfa,0xf6,0x1d,0x3,0xe9,0x87,0xbb,0x3, +0xcb,0xd,0xad,0x9,0x26,0x9e,0x52,0x1f,0x4e,0x66,0xa5,0x24,0x8a,0xc,0x30,0x4b, +0xcb,0xd,0xad,0x31,0x36,0x62,0x49,0x7d,0x88,0x42,0x46,0x3,0x6e,0x86,0x8,0xc0, +0xbc,0x4e,0x53,0x34,0xb4,0x46,0x96,0x9f,0xe9,0x43,0x50,0x4e,0xa1,0xae,0x9e,0x56, +0xb1,0x35,0x80,0x3e,0x9c,0x73,0x7d,0x98,0x35,0xb4,0x46,0x27,0x7e,0xa6,0xf,0xd3, +0xfb,0x7,0x39,0x50,0xd4,0x67,0xdc,0x21,0x80,0x58,0xdc,0x8b,0x5,0xf0,0xa5,0x37, +0x65,0x2f,0x7d,0x3f,0xd3,0x87,0xe9,0xc9,0x71,0xe,0xbc,0xe2,0xbf,0x7e,0x37,0x14, +0x30,0x91,0xfd,0xa5,0xee,0x94,0x2d,0x3c,0x3f,0xd3,0x87,0x8,0xcc,0xf4,0xe1,0xd5, +0x70,0x82,0x94,0x37,0xb4,0xca,0xfe,0xd2,0x39,0x0,0x2f,0xfd,0x4c,0x1f,0x72,0xe0, +0x64,0x2f,0xc0,0xac,0xa1,0x75,0x9,0xc0,0xb9,0x9f,0xe9,0x43,0xe,0x8c,0x6,0x7, +0x62,0xbb,0x27,0x44,0xa,0x12,0x8a,0x76,0xcf,0x79,0xec,0x67,0xfa,0x30,0xf5,0xc0, +0x79,0xc7,0x3f,0x7e,0xa0,0x14,0xa4,0xd8,0x5f,0x9a,0xd9,0xa1,0x14,0xa4,0xa9,0xb, +0xf1,0x30,0x19,0x1a,0x98,0x35,0xb4,0xa6,0x7e,0xe1,0x69,0x32,0x41,0xea,0x26,0xb9, +0x20,0x1d,0xe,0x58,0xee,0x2f,0x45,0x5f,0x9a,0x9,0xd2,0xcb,0x4d,0xee,0xda,0x86, +0x3,0x1a,0xbe,0x5e,0x1,0x3b,0x0,0x4b,0x4d,0x58,0xc9,0x23,0x30,0x85,0x27,0xf0, +0xbf,0x21,0x4d,0xc4,0x78,0x78,0x7e,0x31,0x34,0xb0,0xd4,0x66,0x96,0xbc,0x5,0xc0, +0xf7,0x0,0x38,0x81,0x7f,0x82,0x64,0xf8,0xdc,0x19,0x1a,0x58,0x6a,0xa4,0x43,0xb3, +0x88,0x60,0xa6,0x4e,0xe0,0x8d,0x91,0xc2,0xb2,0x87,0x36,0x8b,0x52,0xab,0xe0,0xfc, +0x35,0x9f,0x7d,0xf2,0x3a,0xc4,0xc3,0xd7,0x21,0x1e,0xfe,0x2c,0x4c,0xf,0xde,0x18, +0xda,0xf0,0x4b,0xcd,0x90,0x18,0x2d,0xa6,0xf,0x20,0x1e,0x42,0x0,0x3e,0x39,0xc, +0xb3,0x86,0xd6,0x1,0x5d,0x5b,0xa9,0xdd,0x73,0x31,0x5,0xe0,0x43,0x0,0x9e,0x88, +0x0,0x2c,0x9b,0x3f,0x6,0x4,0x96,0x1a,0x5a,0xf7,0xf,0xbc,0xeb,0x2b,0xac,0x8c, +0xe1,0xbe,0x81,0xe5,0x59,0xba,0x77,0x60,0xd9,0xe,0x31,0x1e,0x62,0x8a,0x61,0x59, +0x5a,0x5e,0xba,0x3f,0x4f,0xb3,0x7f,0x60,0xc9,0x97,0xee,0x1f,0xf8,0x2a,0x1e,0xb2, +0x3d,0x9b,0x5,0x64,0x8a,0xc,0x32,0x45,0x16,0x81,0x6a,0x9b,0x4,0x6c,0xf8,0xcc, +0xfb,0xce,0x81,0x4,0xbe,0x82,0xd8,0x62,0x8f,0x58,0x8c,0x6f,0x80,0x46,0x0,0x9d, +0xc0,0x1b,0xa5,0xa2,0xdc,0x28,0x34,0xa0,0x2f,0x95,0xa9,0x21,0xa,0xb1,0x8,0xdf, +0xb6,0x34,0x4d,0xe1,0xf,0x52,0xb9,0x86,0x39,0x20,0x70,0xc,0x40,0xc8,0x76,0x97, +0x90,0xf4,0xce,0xf1,0xbd,0x64,0xec,0x72,0xce,0x98,0x77,0xc1,0x52,0xf,0xf3,0xe3, +0xc1,0x81,0x90,0xf0,0x6e,0x20,0xdb,0x45,0xf5,0xbe,0xc0,0x37,0x24,0xbf,0x53,0x8, +0x57,0xfe,0x9c,0xa5,0xc1,0x2,0xde,0xd3,0x57,0xc0,0x9f,0x8,0xf0,0x7a,0x40,0xb3, +0x70,0xe0,0xed,0xe6,0xeb,0xf8,0x5b,0xa2,0xc5,0x2b,0xe0,0xe0,0xd1,0xe2,0x15,0xf0, +0x15,0xf0,0xa7,0xe,0xb4,0xf6,0xf0,0xa,0x9a,0x80,0x21,0x6,0x77,0x2c,0xf0,0xee, +0x7e,0x85,0x44,0xf6,0xb3,0xf1,0x6d,0xe6,0x4d,0x40,0x5e,0x52,0x76,0x76,0x7,0x26, +0x1c,0x18,0xb6,0x3,0xb3,0x5e,0xc2,0x5d,0x81,0x71,0x76,0x3f,0x5b,0x80,0x69,0xd6, +0xda,0xb7,0x2b,0x90,0xf,0xd,0x66,0x77,0x2d,0x40,0x6a,0x65,0xb7,0x62,0x47,0xa0, +0xa8,0xf6,0x7b,0x3f,0x3c,0x20,0x29,0xe6,0xf2,0x6e,0x40,0xf1,0x39,0x6e,0x2b,0x50, +0x4c,0x2e,0xcb,0xdf,0x15,0x28,0xe7,0x82,0xd3,0xa,0x14,0x93,0xcb,0xf2,0x76,0x5, +0xd2,0xbc,0x75,0xb6,0x5,0x18,0xe5,0xb7,0x62,0x37,0x20,0xc9,0x3b,0x59,0x5b,0x80, +0x93,0xfc,0x56,0xec,0x6,0x94,0x43,0x3,0xb3,0xaf,0xa,0x4c,0x8b,0x11,0xb,0x59, +0xd1,0x63,0xbb,0x1b,0x30,0xce,0x3d,0x69,0x33,0x30,0xb5,0xac,0x8e,0x76,0xb1,0x5, +0x28,0x87,0x6,0x3e,0xba,0xf9,0x96,0x52,0xd5,0xc7,0x77,0x2,0x2a,0xf1,0xc1,0x67, +0x45,0x17,0xb6,0xd7,0x2,0x24,0xea,0x37,0xf5,0x5,0x7a,0xb9,0x55,0xe0,0xec,0xab, +0x1,0x16,0xc7,0x3c,0x86,0x89,0xf2,0x4d,0xdd,0x80,0x13,0xd,0x98,0xdf,0x29,0xa7, +0x6e,0xc,0x8b,0x29,0x19,0xc6,0xc5,0x4f,0xd6,0x11,0xa8,0xbc,0xa6,0x85,0x55,0x80, +0x21,0xd6,0x0,0xdf,0x29,0x80,0x51,0xf1,0x93,0xed,0x4,0x4c,0x8a,0x96,0xf2,0x1a, +0xe0,0xb3,0x2,0x38,0x51,0xba,0xeb,0x77,0x1,0xc6,0x45,0x86,0xd1,0xc,0x54,0x9b, +0xdd,0x77,0x1,0x46,0xc5,0x94,0x6d,0x4,0x9e,0x15,0xc0,0x70,0x27,0x60,0x31,0x85, +0xbc,0x46,0xe0,0xa9,0x9e,0x6c,0xf5,0x7,0x16,0x9f,0xe3,0x36,0x7a,0x9a,0x91,0x6e, +0xbd,0xbd,0x81,0x69,0xf1,0x39,0x4e,0x23,0xf0,0x89,0x66,0x4c,0xfd,0x81,0x54,0xd9, +0xdb,0xd1,0xe8,0x69,0xde,0x53,0x6e,0xc5,0x2e,0x40,0xa2,0xf8,0x9d,0x17,0x86,0x99, +0xb7,0xb3,0xb,0x30,0x69,0xce,0xbc,0x3f,0xf,0x6b,0x80,0xf6,0x2e,0xc0,0xb8,0x19, +0x78,0x10,0x68,0x40,0x3f,0x19,0x6,0xe8,0xa4,0x5b,0x80,0xe9,0x3b,0xbe,0x6,0x14, +0xbf,0xed,0xe,0xf4,0x85,0xf9,0xd7,0x0,0x9f,0x5d,0x7d,0xaf,0x40,0x47,0x75,0x4c, +0x6d,0x7b,0x7d,0x9a,0x80,0x32,0xe7,0xac,0x1,0x7e,0xa4,0x1,0x5d,0xa6,0x8d,0x79, +0xd3,0x2b,0x6c,0x2,0xda,0x32,0x48,0xd5,0x1,0xb5,0x31,0xf4,0xc5,0x17,0x1a,0xdc, +0xd2,0xb4,0x11,0xe8,0xca,0xb8,0x5f,0x33,0x4b,0xef,0x69,0xb3,0x34,0x10,0xf1,0x7a, +0x67,0xa0,0x57,0x7c,0x5e,0x19,0xf8,0x99,0x66,0x87,0xa1,0xf8,0xc9,0x76,0x6,0xfa, +0x32,0x77,0xb,0xda,0x3c,0x4d,0xe,0x94,0xe5,0x7b,0x74,0xb5,0x14,0xbe,0x8d,0x5a, +0x21,0xaf,0xf4,0x27,0xf8,0xb6,0xb1,0xd2,0xdf,0x1f,0xf8,0x77,0x2a,0x50,0xfe,0x6e, +0x67,0x8b,0x5c,0xb8,0xb2,0x46,0xf8,0x6,0xe4,0xac,0xca,0x1f,0xca,0x2a,0x7f,0x33, +0x30,0x90,0xe9,0x70,0x1b,0xd0,0x96,0x29,0x98,0x4d,0xc1,0x40,0xc4,0xda,0xa1,0xcb, +0x37,0x5b,0x25,0xbc,0xc5,0x5,0x8d,0x2b,0xe0,0x6b,0xf9,0x13,0xab,0x19,0x18,0xca, +0x84,0xdf,0x18,0x48,0xe0,0x8f,0x84,0x97,0x30,0x1d,0x5e,0xc2,0x8c,0x79,0x9,0xd3, +0xcb,0x4a,0x98,0xf0,0x3e,0x1b,0x4,0xe8,0xca,0x44,0xdd,0x86,0x2f,0x86,0x6f,0xb0, +0xe1,0x9b,0x6d,0xf8,0xbb,0x3,0x6f,0x17,0x60,0x2e,0x7c,0x8d,0x7,0x63,0xec,0xc3, +0xfb,0xa4,0x11,0x98,0x69,0x28,0x63,0x20,0x7c,0x13,0xa6,0xa9,0x98,0x39,0x2,0x8, +0x86,0x14,0xa0,0xc2,0x23,0xbb,0x60,0x36,0x1e,0xbc,0x1f,0xe,0xb,0x8c,0xbc,0x49, +0x10,0xf9,0x56,0x30,0x39,0xb1,0x42,0xeb,0xc4,0x4a,0xad,0xb1,0x9d,0x5a,0xc4,0xa6, +0x36,0x71,0x88,0x9d,0xb8,0xc4,0x89,0xef,0xd,0x2,0xf4,0xa4,0xd8,0xb2,0x23,0x3f, +0xa,0xa2,0x60,0x12,0x4c,0x42,0x0,0x32,0x0,0xa6,0x76,0xa,0x38,0xea,0x50,0x7, +0x90,0x2e,0x71,0x93,0x46,0xa0,0x9d,0xe9,0x60,0x73,0x60,0x10,0x7,0x51,0x8,0x48, +0x16,0x85,0x60,0x94,0xa9,0xcd,0xec,0xd4,0x1,0xa4,0x9b,0x2,0x8e,0xba,0xc4,0x23, +0x43,0x3,0xc3,0x24,0x88,0x58,0x1c,0x9c,0xb3,0x38,0x84,0x29,0x3,0xa,0xe4,0x3c, +0x75,0x99,0x4d,0x3d,0xe6,0x10,0x2f,0x75,0x89,0x4f,0xfb,0x3,0xd9,0x4e,0xc0,0x54, +0x8b,0x20,0x9e,0x1,0x30,0xda,0xd,0x48,0x35,0xa0,0x6b,0x0,0xb4,0x82,0xdd,0x80, +0xda,0x4d,0x5a,0xb7,0x3,0xd3,0xe0,0xae,0x81,0xe1,0xd5,0x4e,0xb3,0x74,0x30,0xa0, +0xa9,0x1d,0xee,0x8,0xec,0xee,0x69,0xea,0x81,0xd,0x9e,0x66,0xb,0xd0,0xd8,0x97, +0xfe,0x8,0x80,0x96,0xbf,0x53,0x78,0xda,0x11,0xd8,0x3d,0x0,0x6f,0x1,0x36,0x5, +0x60,0xb6,0x53,0x8a,0xb1,0x23,0xb0,0x7b,0x12,0xb5,0x5,0xd8,0x90,0x44,0x7d,0x1e, +0xee,0x94,0x26,0x6e,0x1,0x36,0xa4,0x89,0xba,0x3e,0xec,0x9c,0x8,0x53,0x55,0x8b, +0x84,0x6,0xc0,0x92,0x3e,0xec,0x9c,0xea,0x53,0xf5,0x6c,0xbc,0x2,0xb8,0x3d,0xd5, +0x2f,0xc9,0x35,0x9f,0x69,0x35,0x81,0x76,0xf5,0x44,0xd9,0xff,0x29,0x82,0x53,0x18, +0xb7,0x8b,0x99,0x12,0xb0,0xb3,0x5c,0xa3,0xec,0xdb,0xa2,0x14,0x11,0xc6,0xa1,0x81, +0x5c,0xab,0x13,0xa4,0xe6,0xa,0x18,0x80,0xf9,0xdf,0x6e,0x42,0x1a,0x1a,0x8,0xd2, +0xdd,0x34,0xfe,0x36,0xe0,0x56,0xc9,0x5d,0xd2,0x87,0x9d,0xab,0x18,0xdb,0x80,0x5b, +0xab,0x18,0x25,0x7d,0xd8,0xb9,0x4e,0xb3,0xd,0x68,0xb2,0x24,0xdb,0xab,0x12,0x55, +0x3,0xac,0xaf,0x44,0x25,0x76,0xe2,0xe0,0xb6,0x7d,0x30,0xa7,0xf4,0x71,0x7a,0x2, +0xbe,0x8c,0x58,0x7d,0x6a,0x6d,0x35,0xc0,0xfa,0x5a,0x5b,0x62,0x25,0x36,0x7,0x82, +0xcf,0x7c,0x44,0x8f,0x21,0xa6,0x9f,0x5a,0x7d,0xaa,0x89,0x35,0xc0,0xfa,0x6a,0x62, +0x62,0x8d,0x0,0x11,0xfe,0x19,0x92,0x24,0xfa,0x68,0x74,0x64,0x3d,0xb2,0x8e,0xac, +0x3e,0xf5,0xd2,0x1a,0x60,0x7d,0xbd,0x74,0x43,0x9e,0x92,0x53,0xc6,0x6e,0x19,0xf5, +0xc9,0xe8,0xad,0xa3,0xf1,0xa3,0xf1,0xc9,0x51,0x9f,0x8a,0x70,0xd,0xb0,0xbe,0x22, +0xbc,0xa1,0x4f,0xe9,0x29,0xdf,0xab,0xfd,0x4d,0x92,0x58,0x47,0xe9,0xa3,0xf4,0xe4, +0xa4,0x4f,0xcd,0xbb,0xe,0x58,0x5b,0xf3,0xe6,0xc0,0x73,0xb6,0x84,0x49,0xb3,0xe1, +0x40,0x48,0x89,0xfb,0x54,0xf5,0xeb,0x80,0xb5,0x55,0x7d,0x0,0x92,0x53,0x8b,0xcd, +0x0,0xb8,0xdc,0xbc,0x6,0xc0,0x30,0xd,0xfa,0xac,0x5b,0xd4,0x1,0x6b,0xd7,0x2d, +0x36,0x94,0x4f,0x9a,0xb,0x0,0xae,0x36,0x9f,0x1,0xd0,0x4a,0x83,0x3e,0x2b,0x33, +0x75,0xc0,0xda,0x95,0x19,0x0,0xda,0xe4,0x28,0xbc,0x4,0xe0,0x7a,0x93,0x1e,0xa5, +0x90,0xec,0x6,0x13,0x93,0x20,0xe1,0x37,0x1,0x93,0x70,0xeb,0xda,0x53,0xe,0xb4, +0xfc,0x3b,0x2,0x92,0x91,0x45,0x68,0xe8,0x66,0xc0,0xc0,0x3a,0xb,0x8c,0xc2,0xa0, +0xd7,0x4,0xe4,0xf1,0xb0,0x7e,0x39,0x2f,0xb1,0x36,0x49,0x48,0xcf,0x7c,0xb8,0xa5, +0xdf,0x71,0x20,0x3d,0x9,0x8c,0x16,0x2c,0xe7,0x5b,0x80,0xde,0x1a,0x80,0x3c,0xc5, +0xa8,0x5f,0xb0,0x4c,0xec,0xd,0x9,0xe9,0x38,0xc0,0xd4,0x84,0x3,0xd3,0x93,0xc0, +0x68,0x49,0x76,0x53,0xf,0x4c,0x9d,0x2,0x58,0xbb,0x24,0xb,0x40,0x7a,0x4a,0xc7, +0x61,0x6,0x4,0xc3,0xf,0x8c,0x16,0x9d,0xb5,0x13,0x29,0xa,0x20,0x79,0xaa,0x0, +0xeb,0x16,0x9d,0x37,0x30,0x8a,0xa7,0xa7,0xa7,0x19,0x10,0x5d,0x5b,0x60,0xb4,0xac, +0xae,0x1d,0x99,0x28,0x80,0x98,0xa6,0x13,0xaa,0x0,0xeb,0x96,0xd5,0x37,0x30,0x8a, +0xa7,0x96,0x38,0x14,0x14,0x80,0xe8,0xbc,0x5d,0xb3,0xc6,0x1,0xaf,0x1e,0x98,0x7e, +0x54,0x0,0xeb,0x1a,0x7,0x0,0x8,0x2,0x62,0xc3,0xb3,0xb6,0x4d,0xca,0xc3,0x93, +0x6b,0xd6,0x1a,0xb1,0xa8,0xde,0x52,0xb8,0x68,0xd,0x58,0xd7,0x1a,0x1,0x40,0xd0, +0xec,0x19,0x90,0x7,0x60,0xd7,0xac,0xf9,0x63,0x59,0xf,0x64,0xbf,0x2a,0x80,0x4d, +0xcd,0x1f,0x4a,0x5e,0x6a,0xd8,0xde,0x42,0xaa,0xc0,0x2b,0xc6,0x37,0x2b,0xe6,0xc0, +0xa6,0xf6,0x16,0xd,0x68,0xd4,0xc0,0x43,0x83,0xa,0xf0,0x1b,0xc6,0x1b,0x79,0x73, +0x60,0x53,0x3,0x8f,0x6,0x34,0x6b,0x51,0xf2,0x6a,0xd,0x3f,0x50,0x66,0x69,0x53, +0x8b,0x92,0x6,0x34,0xeb,0xfa,0xba,0xd8,0xee,0xda,0x32,0x60,0x43,0xd7,0x97,0x6, +0x34,0xeb,0x6b,0xdb,0xb4,0x3,0x1b,0xfa,0xda,0xb4,0x7e,0x1a,0xb3,0xce,0x3d,0xc5, +0xd7,0x6c,0x3,0x36,0x74,0xee,0xe9,0x40,0xa3,0xde,0x44,0xc5,0xd7,0x6c,0x3,0x1a, +0xf7,0x26,0xc6,0x46,0x49,0xa9,0xa7,0x2,0xc3,0x12,0xf0,0x32,0xab,0x7a,0xf1,0xa1, +0x69,0x3,0x9a,0xbd,0x16,0xa,0x30,0x2d,0x3,0xf5,0x53,0xbf,0xda,0x6e,0xa9,0xd9, +0x6b,0xd9,0x4,0xd4,0xcf,0x1c,0x1c,0x6,0x48,0x9a,0x80,0xec,0xbc,0x19,0xa8,0x1c, +0x98,0x6b,0xc,0x2c,0x7c,0x4d,0x1d,0x30,0x9,0x9a,0x81,0xc5,0x24,0x37,0x6,0x16, +0x3f,0xa3,0x0,0x62,0x15,0x10,0xf7,0xa,0x9,0xa0,0xf6,0x94,0x92,0x17,0x9a,0x5c, +0xe3,0x3b,0xb2,0x13,0x94,0x6b,0x47,0x2e,0xd6,0x63,0xcb,0x1f,0x1c,0x1b,0x64,0x54, +0x39,0x10,0x86,0x46,0x0,0xb5,0x69,0xa3,0xcb,0x35,0xbe,0xab,0x7e,0x8e,0x72,0xed, +0xc8,0x9d,0xf8,0x13,0x9f,0x31,0x56,0x5a,0x16,0x30,0x7,0x62,0x9d,0x4c,0x2,0xd5, +0x47,0xdd,0xd5,0x0,0x2f,0xb7,0x3,0x7d,0x83,0xcc,0xad,0x6,0xc8,0x26,0xf5,0xc0, +0x91,0x15,0x4e,0xc2,0x3f,0xc3,0x78,0xa0,0x3e,0xbc,0x67,0xb9,0xc2,0xe0,0x53,0x93, +0x91,0x4c,0xaa,0x40,0x2c,0x3b,0x66,0xc0,0xc4,0xaf,0x1,0xa2,0x3e,0xc,0xcf,0xd9, +0x2d,0x98,0x5,0xe8,0xc3,0x93,0x13,0xff,0xd2,0x33,0x7,0x2a,0xde,0x34,0x3,0x62, +0x61,0x35,0x3,0x2a,0x8f,0x19,0xd0,0xe5,0x5a,0x88,0xc7,0xdb,0x59,0x3e,0xe8,0xc3, +0x93,0x93,0x60,0xe1,0x9b,0x3,0x95,0xb3,0xa7,0x33,0xa0,0x28,0x1d,0xcb,0xd9,0x1f, +0x7,0xf5,0xc0,0x33,0x9f,0x3b,0x8d,0xd,0x7,0xb2,0xe,0x40,0xe5,0x50,0x5f,0xe, +0xf4,0x27,0x61,0xe4,0x5b,0x5,0x90,0xba,0xb5,0x40,0x32,0xe,0xf8,0x81,0x48,0xa0, +0xf,0xe1,0x96,0x76,0x2,0xce,0x75,0x60,0xb6,0xa6,0x92,0xc7,0xee,0xa8,0xe,0x8, +0xfa,0xd0,0x66,0x17,0x69,0x70,0x5,0xfa,0x10,0xe4,0x76,0xd0,0x5,0x18,0xeb,0x40, +0x10,0x31,0x80,0x54,0x80,0xc4,0xaf,0x3,0xda,0xc4,0x66,0x97,0xa9,0x7f,0x5,0xea, +0xe9,0x24,0x98,0xf8,0xbe,0x67,0x2e,0xd7,0x28,0x36,0xbf,0xf2,0x8d,0xf2,0xf5,0xc0, +0xfc,0x98,0xda,0x92,0x5c,0xb3,0x98,0x9b,0x7a,0x2,0x18,0x79,0xbe,0x67,0x2e,0xd7, +0x52,0x5c,0x48,0xe0,0xfb,0x83,0x68,0x3d,0x30,0x9b,0x36,0xba,0x5c,0x3b,0x25,0x20, +0xd7,0xdc,0xab,0xef,0x10,0xc8,0x5c,0xc3,0x5b,0x2a,0x82,0xe1,0x14,0xae,0xd1,0xa7, +0x21,0xa8,0x3c,0x56,0xb,0x4c,0xdd,0xaa,0x2f,0x5,0x31,0x83,0x72,0xed,0x37,0x3c, +0xf3,0xe,0xd8,0xa5,0x21,0x50,0x1c,0xa8,0x8f,0x47,0x51,0x4d,0xe1,0xed,0x6f,0x1, +0x66,0xe,0xb5,0x46,0xae,0x8d,0x38,0xd0,0xdc,0xe,0x45,0xce,0xb6,0x81,0xdf,0xae, +0xc1,0xa6,0xae,0x38,0xb0,0x32,0x4b,0xf3,0x38,0x5c,0x23,0xd7,0x4e,0x7d,0xe,0x34, +0xf0,0x34,0xc4,0x2a,0xa2,0x2f,0xf9,0x30,0x72,0xd6,0xf3,0xc8,0xbd,0xe6,0x40,0x69, +0x87,0xf3,0x50,0x39,0x7b,0xef,0x9c,0xaf,0x37,0x54,0xe5,0x5a,0x7a,0x86,0x40,0x23, +0x5f,0xca,0x8f,0x6e,0x92,0x39,0x5b,0xea,0x4e,0xec,0x9b,0xcb,0x89,0xb3,0xc2,0x74, +0x29,0xf3,0x34,0x1a,0x10,0xe2,0x70,0x6c,0xd5,0xc8,0x35,0x6c,0x99,0x6,0x60,0x11, +0x2d,0xb6,0x3,0xe5,0xf1,0xbe,0xc2,0xc4,0x60,0x4a,0x6f,0x7c,0xcb,0x5e,0x22,0xf0, +0x89,0xf4,0xa5,0x1a,0x30,0xc5,0x15,0xb2,0xa0,0x2a,0xd7,0xa4,0x20,0xcd,0x3,0x70, +0x3,0x50,0x1e,0xef,0x2b,0x76,0x1e,0xde,0xb3,0xac,0xd3,0x13,0xcb,0x4a,0x28,0x7c, +0xcb,0x13,0x19,0x2d,0x34,0x20,0x4c,0x9b,0x49,0x5d,0x43,0x6b,0x39,0x4d,0x6c,0x0, +0x4e,0x44,0x8a,0xcc,0xed,0x22,0x7d,0xcb,0xb2,0x8e,0xc7,0x96,0x35,0xce,0x80,0x18, +0xf,0x75,0x20,0xf5,0xea,0x1b,0x5a,0x4b,0x59,0x5b,0x3,0x50,0x8a,0x0,0x6e,0x17, +0xe9,0xa9,0x65,0x1d,0x42,0x7e,0x7d,0x9c,0x1,0x31,0xc5,0xd0,0x81,0xa8,0x1b,0xdc, +0x5d,0x80,0xa9,0x94,0x39,0x7c,0x18,0xd2,0x91,0x13,0xdf,0x8f,0xdd,0xe8,0x30,0x7, +0x42,0x12,0x55,0x2,0x26,0xf5,0xd,0xad,0x21,0xeb,0x8,0x24,0x2,0xe8,0x26,0xf7, +0x63,0x2f,0xe6,0xc0,0xec,0x5b,0x4a,0x40,0xa,0x79,0x5a,0xd,0xd0,0x35,0x7,0x8e, +0x6c,0xe9,0xb8,0xf9,0x15,0x92,0xfb,0xb1,0x9f,0x34,0x2,0xad,0xd3,0xda,0x96,0x5d, +0x73,0x20,0xb1,0x73,0x2d,0x93,0x8e,0x7e,0x49,0xef,0xc7,0x1,0x69,0x4,0xbe,0x7e, +0x5c,0x3,0xe4,0x9b,0xde,0xcd,0x80,0x36,0x15,0xc0,0x4b,0xe,0x3c,0x1a,0xb7,0x2, +0x5d,0xea,0xe0,0x36,0xfa,0xe6,0x54,0xdf,0x0,0x38,0xe7,0xc0,0x13,0x23,0xa0,0x15, +0x54,0x80,0x49,0x67,0xe0,0x86,0x3,0x3,0x6a,0x2,0x7c,0x51,0x5,0x4e,0xd8,0xdd, +0x2,0xbb,0xcc,0x52,0x39,0x69,0xc8,0x6e,0xc0,0xa0,0xab,0x59,0x70,0xbb,0x48,0x47, +0x7e,0xbb,0x59,0x38,0x64,0xc7,0x2b,0x94,0x5,0x15,0x7e,0xae,0xaf,0xa9,0xe1,0xef, +0x32,0x86,0x79,0x5,0xc7,0x2f,0xb9,0xb6,0x10,0x23,0x5b,0xd5,0xb5,0x51,0x74,0x6d, +0x41,0x79,0x39,0xf,0x66,0x29,0x56,0xf4,0xed,0x24,0xd,0xc,0x9d,0xb7,0x28,0x6b, +0xab,0xce,0x3b,0xb4,0x44,0x97,0x41,0x9,0x88,0xad,0x29,0xa,0x50,0x2e,0xe7,0x61, +0xc6,0x77,0x6c,0x8d,0x21,0xb0,0x5,0x86,0xe1,0x89,0xc7,0x8b,0x74,0x8c,0x30,0x19, +0x9e,0xce,0x64,0x1f,0x45,0x9,0x88,0xad,0x29,0x2a,0x50,0x2e,0xe7,0xc5,0x3e,0xc5, +0xa5,0xbc,0x47,0xa4,0x15,0x98,0x9f,0xaf,0xf,0x76,0x1,0x77,0xc5,0x1a,0x9f,0x59, +0x16,0xa5,0x1c,0xee,0x30,0x19,0x80,0x43,0xfd,0x27,0xf4,0xb,0x20,0x97,0x6b,0x24, +0x4,0xb9,0x16,0x92,0x11,0x3d,0x1a,0x3f,0x4a,0xc2,0x36,0x60,0xfe,0x4,0x1,0xb4, +0xb,0xdf,0xb2,0x48,0x60,0xd9,0x3c,0xe2,0x9f,0xc2,0xe0,0x8a,0x14,0x43,0x3f,0x13, +0x1a,0x53,0x8c,0x40,0x93,0x6b,0x24,0x5c,0xe2,0x73,0x9b,0x79,0x55,0x3f,0x6e,0xd, +0xc0,0x49,0x56,0xd7,0x44,0xbb,0x98,0x4e,0xec,0x8d,0x3f,0x71,0x96,0x8,0x1c,0x41, +0x7a,0x28,0x92,0x28,0x1d,0x88,0x49,0x94,0xe,0x4c,0xc4,0x72,0xde,0x6,0xfe,0x5f, +0x32,0x6b,0x5,0x12,0x4b,0xb1,0xdd,0x45,0xe4,0xac,0x2e,0x23,0x77,0xce,0x3,0x70, +0x9e,0x26,0xea,0x40,0x4c,0x13,0x55,0x20,0x5c,0x9f,0x90,0x6b,0x9,0x2,0x2f,0x5a, +0x81,0xc5,0xcb,0xe7,0xe3,0xb8,0x58,0x62,0xca,0x7f,0x1b,0xa5,0x4f,0x8a,0x44,0xb8, +0xfc,0xdd,0x2a,0x10,0x34,0xfe,0x9c,0x17,0x5b,0x57,0x89,0x45,0xf0,0x88,0x16,0x73, +0xe0,0x94,0x7f,0x8a,0x48,0xf5,0x37,0x93,0x93,0x27,0x45,0xaa,0xdf,0x8,0x4,0xb1, +0xc6,0x63,0xdb,0x9a,0x22,0xd0,0x53,0x36,0x5a,0xb5,0xc9,0xb5,0x5,0xb7,0x6a,0x1f, +0xde,0x1,0x5d,0xf9,0x86,0x40,0x90,0x6b,0x10,0xbb,0xf9,0xf9,0xc3,0xa9,0x75,0xca, +0xaf,0xd0,0x58,0xae,0xdd,0x70,0xab,0x16,0x72,0x6d,0x1d,0xfc,0xce,0x8,0x88,0x72, +0xd,0xc4,0x1a,0xfe,0xbc,0xdf,0x31,0x7a,0x84,0x7,0xd1,0x98,0xdd,0xd2,0x85,0xbe, +0x92,0x60,0xe,0x4,0xb9,0x36,0xe,0x64,0x99,0x2e,0x5,0xe0,0x5f,0x1a,0x2,0x4b, +0xf,0xc,0xe9,0x2,0xa4,0xa7,0xa1,0xf8,0x4e,0x43,0x3b,0x2c,0xe4,0x9a,0x12,0xd3, +0xe8,0xfa,0xc5,0xef,0xcc,0x66,0x29,0xca,0x35,0x69,0x37,0x49,0xe1,0x69,0xd2,0x86, +0x65,0x12,0xe1,0x4b,0x6f,0xb,0x41,0xc3,0x81,0x9b,0xab,0x93,0x27,0x45,0xd9,0x24, +0xa4,0xca,0xf7,0x73,0x3b,0x8c,0x1c,0x45,0xae,0xc9,0x1a,0x56,0x52,0xf8,0xd2,0xb4, +0x61,0x99,0x44,0x0,0x69,0x96,0xb8,0x49,0x20,0xb1,0xce,0x32,0x4f,0x13,0x71,0x51, +0xe3,0xeb,0x9e,0x26,0xb2,0xb,0xb9,0x46,0xa4,0x9c,0xa5,0x4a,0xb4,0x68,0x5,0xf2, +0x7b,0x5e,0xd4,0x69,0x68,0x6a,0xe5,0xbe,0x14,0x97,0xd5,0x13,0xa5,0x46,0xcf,0x7d, +0x69,0x64,0x15,0x72,0x2d,0x3,0xa6,0x4a,0x3c,0x6c,0x58,0x97,0x91,0xc0,0x40,0xab, +0x7a,0xab,0xd1,0x2,0x57,0xb9,0x63,0x65,0x15,0x42,0x44,0xb,0x6c,0xf9,0x68,0x90, +0x6b,0x93,0x36,0x20,0x1f,0x3f,0xa2,0x1,0xb3,0x78,0x88,0xab,0xdc,0x91,0xb2,0xce, +0x22,0xe2,0x21,0x3e,0xee,0xab,0x9,0x68,0xb7,0x1,0xa7,0xda,0x34,0x55,0x23,0x3e, +0x56,0x13,0x27,0xc5,0x4a,0x92,0x8c,0xf8,0x69,0x33,0x30,0xba,0x73,0xa0,0x63,0xa4, +0x80,0x7d,0xd,0x28,0x93,0x28,0x4,0x2a,0x8b,0x73,0x32,0x89,0x6a,0xb9,0xa5,0x71, +0x2b,0x70,0x55,0x8,0xfd,0xc,0xa8,0x2c,0x23,0xa8,0x40,0x91,0x26,0x92,0xa3,0x66, +0xa0,0xdb,0x6,0xdc,0x68,0xab,0x41,0x15,0xe0,0x91,0x55,0x4a,0x84,0x93,0xd3,0xbe, +0xc0,0x2b,0x71,0x5d,0xb7,0x45,0x1,0xac,0xe,0x38,0xb6,0xf4,0x54,0x3f,0xb3,0xc3, +0x2d,0xc0,0xa6,0xf5,0x4a,0x9,0xa4,0xe2,0x32,0x65,0xf9,0xb2,0x2,0x64,0x1a,0x70, +0x92,0x7b,0x9a,0x7a,0x60,0xda,0xb4,0x22,0x2b,0x81,0xfc,0xf3,0x49,0x1e,0xf,0x9b, +0x81,0x56,0xee,0x4b,0xb7,0x0,0x43,0xe2,0xd1,0x36,0x20,0x9a,0x4,0x1d,0xe7,0xe5, +0xcb,0x46,0x60,0x8d,0xb6,0x28,0x3,0xfd,0x36,0xa0,0xd0,0xf8,0x47,0x79,0xf9,0xb2, +0x65,0xc,0xdb,0x80,0xb4,0x1d,0x78,0x29,0x8b,0x85,0xb2,0x7c,0xd9,0x36,0x4b,0x5b, +0x80,0x91,0xdb,0xa,0xe4,0xa1,0x62,0x9e,0x97,0x2f,0x5b,0xec,0x70,0x31,0x39,0x6d, +0x4,0x4e,0x9c,0x56,0x20,0x37,0xc4,0x79,0x56,0xbe,0x6c,0xf3,0x34,0xb,0xeb,0x54, +0xa6,0x18,0xd8,0xb6,0x18,0xaa,0xdd,0x31,0x1c,0x8,0xfa,0xa4,0x4d,0x3d,0xf1,0x50, +0x71,0x9e,0x95,0x2f,0xdb,0x7c,0xe9,0x4b,0xeb,0x48,0x66,0x6d,0x90,0x22,0xc6,0x15, +0x20,0x8,0xa2,0x71,0x1b,0x90,0xff,0x44,0x7,0x4a,0xf9,0xb2,0x8,0x4f,0x6b,0x56, +0x9,0x4f,0x5f,0x3e,0x3c,0x90,0xc0,0x33,0x87,0x4d,0x42,0x7a,0x2,0x60,0x7c,0xa2, +0x70,0xb0,0xe4,0x40,0x94,0x7d,0x6d,0x40,0x1c,0x33,0xd0,0x94,0xb2,0x7c,0x9,0xf7, +0xb0,0x8,0xc0,0x6b,0x56,0x9,0xc0,0x5f,0x6,0x7,0x32,0x11,0x1e,0xdb,0x30,0xd5, +0xc8,0x99,0x35,0xb6,0x1,0x48,0x21,0xe9,0xa,0xa5,0xb0,0x6d,0x15,0xa4,0x81,0xaa, +0x80,0x1,0x58,0xa4,0x18,0x6b,0x56,0x49,0x31,0xbe,0xc,0x25,0x90,0x9e,0xbe,0x5, +0x16,0x15,0xa7,0x30,0x8f,0x11,0xe8,0x3f,0xf,0x79,0x71,0xc2,0x8d,0xee,0xb7,0x2, +0x75,0x8d,0xff,0x2d,0xd6,0x29,0x79,0x12,0x85,0xc0,0x4a,0x12,0x55,0x0,0x47,0x23, +0x5c,0x5d,0x4b,0x4f,0x1e,0x11,0xf8,0x4,0xea,0xfb,0xfc,0xa,0x47,0x5e,0xdc,0xe, +0x9c,0x72,0x60,0x56,0xc5,0x28,0xaa,0xfa,0x8,0xac,0xa4,0x89,0xf9,0x2d,0xa5,0x23, +0xbe,0xba,0x96,0x9e,0x3c,0xa6,0xa1,0xcf,0xc8,0x95,0x2d,0x80,0x7e,0xd2,0xe,0x5c, +0xe0,0x17,0xda,0x59,0x9d,0xa6,0x58,0xb7,0xc8,0x17,0x2c,0xd5,0x44,0xf8,0x65,0x1, +0x14,0xab,0x6b,0x2,0x78,0x3b,0xb5,0x4,0x30,0x20,0xed,0xc0,0x15,0xaf,0x26,0x66, +0x95,0xa8,0x62,0x65,0xa6,0x16,0xb8,0x78,0xa8,0x1,0x2f,0x53,0xeb,0x1d,0x1,0x3c, +0x34,0x7,0x62,0x51,0x61,0x74,0x3c,0x36,0x3,0x46,0xf7,0x8f,0x72,0xb9,0x76,0x8a, +0xab,0x6b,0xd6,0x33,0x4,0x6e,0xae,0xf,0xc3,0x36,0xa0,0xda,0x1a,0xa1,0x94,0x2f, +0x5b,0x81,0xa7,0x99,0x5c,0xa3,0x7c,0x75,0xd,0x7e,0x7,0x60,0xe2,0x76,0x0,0x82, +0x4,0x52,0x8a,0x7b,0xa6,0x40,0xb1,0xd8,0x15,0xa4,0x1,0x7,0xc6,0x5d,0x80,0x69, +0x17,0x60,0x69,0x75,0xd,0x80,0x9,0x9a,0x45,0xec,0xdc,0x11,0x10,0x9c,0x29,0xb1, +0x0,0xb8,0x5a,0x7d,0xda,0x6a,0x16,0xc5,0x2b,0x50,0xcb,0x97,0x2d,0x66,0xa1,0xe8, +0x43,0xca,0x97,0xf3,0x2,0x6a,0x3,0x70,0xb1,0x9a,0xb4,0x1a,0xbe,0x1a,0xa8,0x94, +0xf2,0x65,0x8b,0xe1,0x6b,0x40,0x5c,0xce,0xb,0x20,0x6a,0x0,0x70,0x33,0x63,0x6d, +0xae,0x4d,0x2d,0x9b,0x98,0xbb,0x36,0x9e,0x89,0x48,0xe0,0xd8,0xda,0x94,0x3,0x70, +0x93,0xf3,0x56,0xb,0xb,0x4a,0xf9,0xf2,0x5b,0x46,0x9a,0x9c,0xb7,0xa,0x3c,0xb3, +0x2b,0xc0,0xa6,0xf0,0xa4,0x16,0x16,0x94,0xf2,0xa5,0xec,0x2f,0xdd,0x16,0x9e,0x32, +0x60,0xa9,0xd8,0x1b,0x18,0x4,0x60,0xb5,0xb0,0xa0,0x94,0x2f,0xbf,0xcd,0xcf,0xdd, +0xad,0xd,0xc0,0x2d,0xc0,0xa6,0x14,0x43,0x73,0x35,0x45,0xf9,0xf2,0x5b,0xf8,0xe4, +0x86,0x14,0x23,0xb1,0x7a,0x27,0x51,0x9a,0xab,0x29,0xca,0x97,0x0,0x6c,0x4a,0xa2, +0xda,0x80,0xd,0x69,0xa2,0x66,0xf9,0x45,0xf9,0x52,0xef,0xfa,0xaa,0xa4,0x89,0x6d, +0x40,0xc6,0xc,0x80,0x60,0xf9,0x79,0xf9,0xb2,0xc,0xac,0x24,0xc2,0x53,0x32,0x0, +0xf0,0x8a,0xa9,0x9d,0xa,0xac,0x31,0xd5,0x1f,0x4,0x78,0x59,0x94,0x2f,0xcb,0xc0, +0xb2,0x5c,0x1b,0x6,0x38,0x2f,0xca,0x97,0xcd,0x40,0x6b,0x20,0xa0,0x5a,0x18,0x6a, +0x4,0xe,0x75,0x4b,0xc9,0x76,0x60,0x57,0xb9,0x66,0x6,0x2c,0xa,0xa6,0xed,0xb3, +0xb4,0xbf,0x5c,0x53,0xd,0x31,0xd8,0xa,0xac,0x94,0x4d,0x5a,0x80,0x46,0x9e,0x86, +0x67,0xfb,0xed,0xc0,0xd2,0xea,0x1a,0x44,0x35,0x74,0xc2,0x36,0x81,0xe9,0x16,0x2c, +0xe0,0x7f,0x9b,0xfb,0xd2,0xe2,0x98,0xeb,0xa,0xb0,0x5a,0xfa,0xca,0x8b,0xec,0xc, +0x1f,0xbe,0xb,0x2a,0x88,0x3,0x2f,0x58,0xd2,0x21,0x5a,0x28,0xc7,0x45,0x94,0x81, +0xd5,0x68,0x91,0x3,0x41,0xae,0xcd,0x18,0x3d,0x82,0xec,0x34,0xa0,0x81,0xcd,0xe2, +0xe,0xf1,0x90,0xef,0x30,0xae,0x7,0x56,0xe3,0x61,0xbe,0x6e,0x21,0xe4,0x1a,0xa4, +0x35,0x34,0x48,0xce,0x2c,0x16,0x75,0x88,0xf8,0x5a,0x25,0x4a,0x7,0x56,0x23,0x7e, +0xbe,0x32,0x3,0x72,0xd,0xae,0x8b,0xd0,0x90,0x4,0x31,0x7d,0x23,0x9c,0x74,0xc8, +0x69,0x94,0xf6,0xf9,0x32,0xb0,0x9a,0xd3,0x7c,0x7f,0x40,0xd0,0x87,0x36,0x4c,0x1b, +0x1a,0x26,0xe1,0x92,0x1c,0x5,0x3f,0xeb,0x90,0x26,0x2a,0xae,0xa6,0xc,0xdc,0x9e, +0x26,0xa2,0x3e,0xfc,0x5,0x4c,0x1b,0x12,0xc6,0x6c,0x46,0xc6,0xc7,0x7,0x1d,0x12, +0x61,0xc5,0xd5,0x54,0x7a,0xf5,0x9b,0x96,0xf3,0x70,0x77,0x1e,0x4b,0xc2,0x19,0xbb, +0x20,0xd6,0x23,0x2b,0x30,0x4e,0xf5,0x55,0x57,0xd3,0x15,0x78,0x9,0xe6,0x70,0x1, +0xe,0xbd,0x2b,0x10,0x93,0x28,0x59,0xbe,0xd4,0xf6,0xae,0xb1,0xc6,0xe5,0x3c,0x0, +0xba,0x70,0x53,0x5d,0xe6,0x75,0x7,0xfe,0xae,0x36,0x1e,0xc6,0x8d,0xcb,0x79,0x34, +0xdc,0xa4,0x3e,0x88,0x6e,0x2f,0xf5,0x9,0x68,0x1a,0xd6,0x9,0xf8,0x95,0xd2,0x7d, +0x59,0x0,0x69,0xf3,0xea,0x5a,0xb8,0xc1,0x87,0x9a,0x51,0x9f,0x6,0xdd,0x81,0x71, +0x6d,0x4e,0xd3,0xe,0xc,0x53,0x8f,0x4,0x60,0x8a,0x39,0xb0,0x76,0x96,0xa6,0x9e, +0x13,0x27,0x67,0x9e,0x1b,0x27,0xa7,0x81,0x7b,0x91,0xc5,0xfc,0xbc,0xfb,0xd2,0x8, +0x88,0xda,0x22,0xc4,0x1d,0x81,0x3e,0xf6,0xf,0x14,0xc0,0x5a,0x3b,0xac,0x3,0x2a, +0xdd,0x97,0xc2,0x53,0xfb,0x1c,0xd8,0x28,0xd7,0xc2,0x4d,0x2,0x9e,0x1,0x17,0xf5, +0xa,0x60,0xad,0xa7,0xa9,0x1,0x46,0x79,0xf9,0x52,0xee,0x3f,0xe4,0xda,0x82,0x86, +0xdb,0x3d,0xd,0x7,0x6e,0x38,0x70,0x53,0x0,0xeb,0x9d,0x77,0xd,0xf0,0xd3,0xbc, +0x7c,0x29,0xf7,0x1f,0x72,0xf5,0x54,0xb3,0x9c,0xd7,0x2,0xac,0xf,0x4f,0x35,0xc0, +0x87,0x79,0xf9,0xf2,0x5b,0xb9,0xe8,0x29,0xd6,0xf,0xb7,0x86,0xa7,0x2d,0x29,0x46, +0x7d,0x0,0xae,0x2,0x8b,0xf2,0xa5,0x4,0xa,0x5,0x4c,0xc3,0xad,0x1,0x78,0x5b, +0x4e,0x53,0x9b,0x62,0xd4,0x0,0x55,0x5,0x2c,0x6e,0x9f,0xc5,0x81,0x5b,0x53,0x8c, +0x4e,0x49,0x54,0xd,0x50,0xd5,0xf8,0xe2,0xf6,0x59,0x21,0x2,0xb7,0x26,0x51,0x9d, +0xd2,0xc4,0x5a,0x60,0x51,0xc5,0xd8,0x6,0x34,0x4a,0x13,0x6b,0x13,0xe1,0x3a,0xa0, +0x52,0xbe,0xe4,0xc0,0x7,0x12,0xd8,0x35,0x11,0x36,0x6,0x2a,0xe5,0x4b,0xe,0xf4, +0x25,0x70,0x90,0x54,0xbf,0xe,0x58,0x94,0x2f,0x95,0xa3,0x46,0x92,0xb0,0x2a,0xd7, +0x86,0x2,0x9e,0xd4,0x1,0xe3,0xb0,0x2a,0xd7,0x86,0x2,0xe6,0xc5,0x3d,0x71,0x5c, +0xc,0x9e,0x61,0xc5,0x6a,0xe4,0x1a,0xdb,0x1b,0x10,0xc6,0x90,0xd5,0xc8,0x35,0x36, +0x8c,0x5c,0x53,0xab,0x89,0xfa,0x9,0x3c,0xe5,0x59,0xca,0x86,0x91,0x6b,0x5a,0x33, +0x64,0x6e,0x87,0xa8,0x0,0xca,0x76,0xf8,0xc3,0x3,0x1a,0xea,0x43,0xb5,0xfb,0x72, +0x2b,0x50,0x6b,0x2c,0x47,0x7d,0x48,0xac,0x10,0x77,0x71,0xa7,0xa8,0xf,0x13,0x91, +0xb5,0x99,0xea,0x43,0xb5,0xfb,0x32,0x77,0xde,0x8,0x2c,0x3b,0x6f,0xa6,0xea,0x43, +0x4,0x1e,0xc3,0x1f,0x51,0x1f,0x4a,0xa0,0xa9,0x3e,0x54,0xbb,0x2f,0xf3,0xf0,0x84, +0xc0,0x72,0x78,0x62,0xaa,0x3e,0x4,0x20,0xe8,0xc3,0x30,0x42,0x7d,0x28,0x81,0xa6, +0xfa,0x50,0xed,0xbe,0xcc,0x3,0x30,0x2,0xcb,0x1,0x98,0xa9,0xfa,0x10,0xfe,0x84, +0xfa,0x70,0xc2,0x40,0x1f,0x26,0xac,0x93,0x3e,0x54,0xbb,0x2f,0xf3,0x14,0x3,0x81, +0xe5,0x14,0x83,0xa9,0x72,0xd,0xfe,0x84,0x72,0xcd,0x65,0x20,0xd7,0x46,0xac,0x93, +0x5c,0x53,0xbb,0x2f,0xf3,0x24,0xa,0x81,0xe5,0x24,0x8a,0xa9,0x72,0xd,0xf,0x53, +0x61,0xf4,0xcc,0x63,0x20,0xd7,0x1e,0x45,0xdb,0xd2,0xc4,0xb4,0xdc,0x2c,0x91,0xe2, +0xdd,0x53,0xba,0x2f,0xf3,0x34,0x11,0x81,0xe5,0x34,0x51,0x5,0xf2,0xc3,0x54,0x18, +0x19,0xfb,0x28,0xd7,0x1e,0x59,0xe1,0x96,0x44,0xb8,0x1e,0x58,0x94,0x2f,0x6b,0xa5, +0x7f,0x9e,0x8,0xb3,0xaa,0x5c,0xc3,0x45,0xbd,0x26,0x31,0x53,0xf,0x2c,0xca,0x97, +0x5d,0x80,0x47,0x28,0xd7,0x88,0xc5,0xe5,0xda,0x61,0x37,0x60,0x5e,0xbe,0x2c,0x1f, +0x45,0xb9,0x15,0x88,0x72,0xd,0x27,0xcc,0xc,0x8c,0x3,0xe5,0x5a,0xda,0xd,0x98, +0x97,0x2f,0x9b,0x8e,0x3e,0x29,0x6d,0x96,0xa3,0x78,0xb6,0x9,0xdc,0x4e,0x72,0x82, +0x72,0x2d,0xed,0xa6,0xf,0xb7,0xad,0x69,0xda,0x5b,0x81,0xa8,0x9e,0xe8,0x18,0xe4, +0x1a,0xa1,0xc7,0xc1,0x40,0x40,0xea,0xe9,0x1b,0xab,0x6b,0x37,0xcb,0x79,0x24,0x3d, +0x6,0xf5,0x94,0xdd,0x52,0xc3,0xa2,0x42,0xfd,0x2b,0x9,0x21,0x56,0x6f,0x1b,0x43, +0xb9,0xba,0x6,0x72,0x6d,0x7c,0x84,0xc0,0x71,0xd0,0xa5,0x6c,0xb2,0xbd,0x50,0x7c, +0xd9,0x4,0xb4,0x46,0x28,0x66,0xac,0x47,0x20,0x66,0x32,0xb3,0xa8,0x7a,0x9a,0xfa, +0x49,0xb3,0xa5,0xf6,0x3e,0x61,0x71,0x3,0x10,0x57,0xd7,0x88,0xc5,0x7f,0x5,0x67, +0x1c,0x6e,0xf1,0xa5,0x1d,0x80,0x60,0x28,0x81,0xde,0xea,0xad,0x3,0x71,0x75,0x8d, +0x58,0xfc,0xd7,0x34,0xb0,0xb6,0xc9,0xb5,0x16,0x60,0xe4,0x2b,0xc5,0x1b,0xf0,0xa4, +0x34,0xa8,0x7,0x9a,0xcb,0xb5,0x66,0x60,0xaa,0x74,0x89,0x9,0x39,0x7a,0xd5,0x9, +0x58,0x13,0xf1,0x9b,0x81,0x89,0x5f,0x6c,0x9c,0xba,0xe5,0xd1,0xf0,0xba,0x1b,0xd0, +0x30,0xa7,0x29,0x4c,0x3d,0x3f,0x61,0x0,0x93,0xc,0x8c,0xf7,0xeb,0x6e,0x40,0xc3, +0xac,0x2d,0x7f,0x81,0xf7,0x9c,0x69,0xc0,0xeb,0x9b,0x6e,0x40,0xc3,0x44,0x58,0x2d, +0xf2,0x91,0x2,0x38,0x39,0xb4,0xaf,0x37,0x54,0x19,0x83,0x1f,0x3a,0xb0,0xfd,0x6c, +0x3a,0x2c,0x3d,0xc9,0xf2,0x13,0x7,0x9e,0xd8,0xce,0xed,0x5e,0x81,0x31,0x8b,0x7d, +0xb9,0xdd,0x8e,0x3,0x71,0x96,0xef,0x2,0xc,0x22,0xbf,0xd9,0x2c,0xe6,0xd4,0x8f, +0x65,0x7f,0x9d,0x0,0xda,0xd7,0xe0,0xc0,0x8a,0x9e,0xd1,0xc1,0x81,0x53,0x98,0x93, +0xc1,0x42,0x3,0xa2,0xb7,0xca,0xf,0xe,0x1a,0x1c,0xe8,0x83,0x3a,0xfc,0x66,0xa5, +0x8e,0xe1,0x35,0x24,0xf3,0x76,0xde,0xf3,0x3f,0x38,0x30,0xf8,0x86,0xb1,0xef,0x6e, +0x90,0xe6,0xc8,0x59,0xca,0xd8,0xb1,0xf8,0x6,0xbf,0x8b,0xe1,0x4f,0x3c,0x33,0x60, +0x1a,0xc2,0x75,0xdc,0xdc,0x72,0x20,0xdc,0x4b,0xa1,0x2c,0x24,0x70,0xda,0xc5,0xb5, +0xc9,0xf4,0x8b,0x3,0x1b,0xad,0xe2,0xc,0x7e,0xf9,0x33,0x11,0x40,0x42,0x5,0xf0, +0xb9,0x0,0x5e,0x37,0x1,0x23,0x7b,0xbe,0x51,0x9c,0x77,0x76,0xd,0xed,0xc0,0x3f, +0xe3,0x65,0xd2,0x1c,0xc8,0xa5,0x4c,0x27,0xa0,0x8,0x4f,0x54,0xc6,0x9c,0x56,0x20, +0x41,0x20,0x1b,0x87,0x19,0x90,0x4b,0x99,0x76,0x20,0xd,0x73,0xa0,0x8,0xc0,0x44, +0x4e,0xea,0x56,0xe0,0x2d,0xf7,0xd4,0x67,0x2,0xb8,0xa1,0x42,0xca,0x7c,0x65,0x0, +0x5c,0x30,0x9,0x14,0x29,0x46,0x22,0x27,0x75,0xeb,0xa4,0xb9,0xf9,0x4e,0x56,0xd2, +0x25,0x90,0x4b,0x99,0x4e,0x40,0x91,0x44,0xc5,0xd2,0xa5,0xb5,0x2,0x57,0x1c,0xf8, +0x4d,0xe,0xe4,0xfb,0x35,0x4d,0x80,0x2f,0xbd,0xc,0xc8,0xd3,0x44,0x63,0xe0,0xfa, +0x1b,0xfc,0xf5,0xbb,0xab,0x1c,0xc8,0xc,0x81,0x20,0xf4,0x36,0xca,0xba,0x45,0xec, +0x76,0x5,0x5e,0xb3,0x75,0x7,0x60,0x64,0xe7,0x93,0x46,0xa4,0xfa,0xb1,0x37,0xd9, +0x37,0x70,0xa9,0x3,0x7d,0x31,0x3b,0x5b,0xc3,0xd3,0xfa,0x45,0x4f,0xe0,0x62,0xd3, +0xf,0xb8,0x50,0x81,0xeb,0xe,0x63,0xc8,0xb6,0x0,0xdb,0xec,0xf0,0x9a,0x3,0xff, +0xd4,0xf5,0xa,0x11,0x38,0x5b,0xea,0x63,0xf8,0xd0,0xe8,0xd8,0xd4,0xde,0xc0,0xc5, +0x26,0x9a,0xe9,0xb3,0xd4,0x10,0x18,0xf6,0x4,0xce,0x97,0xb1,0xab,0xdb,0x61,0x1, +0x6c,0x9a,0xa5,0xbd,0x81,0x91,0x8d,0x5b,0x3a,0x55,0x4f,0x63,0x6,0x9c,0x66,0xc0, +0xcc,0xf0,0xd1,0x7,0x7f,0x25,0xfc,0xe2,0xf,0x9,0x8,0xde,0xda,0xa5,0xbe,0xee, +0xbc,0x4f,0x0,0x98,0x72,0xb3,0x68,0x2,0x5e,0x95,0x80,0xd2,0x79,0xe3,0xe1,0xb2, +0x7e,0x23,0x90,0x78,0x90,0x42,0x6b,0xe1,0xe9,0xac,0x17,0x50,0x86,0x27,0x3c,0x2, +0xd9,0xbd,0xee,0xa0,0xf,0x21,0x0,0x53,0xe,0xc,0xa3,0x56,0x20,0xfc,0x45,0x2, +0x8b,0x0,0x7c,0x8c,0x8b,0x18,0x66,0xc0,0x3c,0xc5,0x80,0x5f,0x6f,0x4,0xb0,0xe9, +0x75,0x85,0xf,0xda,0xc,0xa,0xa0,0x4c,0x31,0xf0,0x54,0x69,0xdb,0x10,0x98,0x25, +0x51,0xa6,0x40,0x18,0x6e,0xbf,0x0,0xca,0x24,0xea,0x91,0xe5,0x4f,0x2c,0x43,0x60, +0x96,0x26,0x9a,0x2,0x61,0x42,0x7b,0x12,0x8,0x69,0x22,0xaf,0x44,0x1d,0x63,0xa5, +0x30,0x32,0x5,0x66,0x89,0xb0,0x29,0x30,0x72,0x2d,0x57,0x0,0x95,0x44,0xf8,0x2d, +0x3c,0x73,0xe8,0x83,0xbe,0xc0,0xe6,0x49,0x13,0x79,0x13,0x15,0x88,0x8b,0x4,0x8, +0x84,0xe9,0xb3,0xf,0x20,0x8c,0x5f,0xe4,0x47,0x8,0x2c,0xc4,0xc,0x9a,0xd6,0x3e, +0x81,0x93,0xa,0x90,0x8e,0xef,0xf8,0xa,0x41,0x90,0xee,0x15,0x28,0xc6,0xb0,0x90, +0x6b,0xec,0x76,0x57,0x60,0xc3,0xb,0x81,0x62,0x96,0x16,0x45,0x5,0xb6,0xa1,0x9d, +0x66,0x69,0x56,0xa7,0x31,0x5,0x4a,0x3b,0xcc,0x80,0x70,0x37,0x56,0xb4,0x93,0x1d, +0x66,0x95,0x28,0x53,0xa0,0xf4,0x34,0x6a,0x25,0x8a,0x1a,0x78,0x9a,0x92,0x5c,0xeb, +0x0,0x94,0xbe,0x54,0xad,0xb5,0x51,0x3,0x5f,0x5a,0x92,0x6b,0x39,0xd0,0x7a,0xaf, +0x6d,0xd2,0xc8,0xf0,0x24,0xbf,0x7,0xa3,0x85,0x4f,0x5b,0xa3,0x45,0x45,0xae,0x15, +0xc0,0xe6,0x78,0x78,0x75,0x15,0xa8,0x40,0x59,0x2f,0xa5,0xad,0xf1,0xb0,0x22,0xd7, +0x4c,0xcd,0xa2,0x4,0x94,0x15,0x61,0xda,0x1a,0xf1,0x2b,0x72,0x4d,0x2,0x5b,0x73, +0x9a,0x32,0xf0,0x12,0x72,0x9a,0x38,0x5b,0xef,0xea,0x22,0xd7,0xfa,0x2,0x45,0x55, +0x9f,0x76,0x97,0x6b,0x1a,0xb0,0x29,0x3a,0x95,0x80,0x62,0xdd,0x82,0x76,0x97,0x6b, +0x7d,0x81,0x62,0x65,0xe6,0x87,0x9,0x5c,0xe,0x2,0x14,0x29,0x6,0xed,0xae,0xf, +0x7b,0x3,0x13,0xf1,0xe0,0xf1,0xce,0xfa,0xd0,0x14,0x58,0xf2,0x34,0x79,0x87,0x42, +0x67,0x7d,0x68,0x6a,0x16,0xfd,0x81,0x25,0x7d,0xb8,0x7f,0x60,0x49,0x1f,0xf6,0x1, +0x16,0xd5,0x0,0xda,0x5d,0x1f,0xf6,0x0,0xa6,0xc5,0xea,0x2f,0xed,0x2e,0xd7,0x7a, +0x0,0x49,0xb1,0xc2,0x4d,0xbb,0xcb,0x35,0x36,0xc1,0xe5,0x72,0xbb,0xcb,0x2c,0x4d, +0x8a,0xec,0x98,0x76,0x97,0x6b,0x8c,0xaf,0xd1,0x77,0x2,0xc6,0xc5,0x97,0xd3,0x3e, +0x72,0xcd,0x4b,0x3b,0x2,0x23,0xb5,0x53,0x48,0xa4,0x18,0x69,0xed,0xd9,0x97,0xb5, +0x49,0x14,0xb5,0x5c,0x23,0x60,0xa1,0x80,0x65,0x8b,0x92,0x4,0x8a,0x24,0xca,0xc, +0x88,0x69,0xe2,0x9f,0x88,0xe5,0xfc,0x3f,0xa3,0xa2,0xc2,0x56,0x20,0xa6,0x89,0x66, +0x40,0x9c,0x9f,0x2b,0xc8,0xfd,0x12,0x4,0x62,0xb3,0x85,0x29,0xf0,0x81,0x2,0x14, +0x89,0xb0,0x39,0x70,0x1e,0xfb,0x78,0xcc,0x6b,0x37,0xa0,0xaf,0x1,0x31,0xd5,0x37, +0x7,0x5e,0xc4,0xc1,0x64,0x14,0xf2,0x6f,0x35,0x7,0x62,0x6f,0x62,0x5f,0xa0,0x1b, +0x87,0xd1,0x69,0x70,0x97,0xc0,0x28,0x8c,0x8e,0xfd,0xc,0x68,0x38,0x4b,0x2b,0xc0, +0xd2,0x13,0xad,0x1a,0x80,0xa9,0x37,0x9,0xa3,0x87,0x5e,0x47,0x60,0x65,0xc,0xcd, +0x81,0x14,0xbe,0x37,0xf2,0xdc,0x8e,0xc0,0xca,0x2c,0x45,0x3b,0x59,0x1b,0xd9,0x21, +0x3d,0x7e,0x2b,0x8c,0x3e,0xb8,0xec,0x8,0xac,0xd8,0xa1,0x21,0x10,0x3c,0xd,0x39, +0x7a,0x12,0x4c,0xde,0xbf,0xd8,0x9,0xe8,0x4f,0x9a,0x80,0x89,0x7,0x11,0xdf,0xcd, +0x7d,0x29,0x19,0x81,0x1d,0x7e,0x38,0xe7,0x81,0x12,0xb7,0xde,0x1b,0xcd,0xd2,0x8a, +0x2f,0xfd,0x41,0x1,0x63,0x7,0x80,0x4e,0x1e,0x9e,0xc8,0x33,0x98,0x62,0x37,0x1d, +0x81,0x95,0xf0,0xd4,0x4,0xc4,0xbc,0x3b,0xb2,0xf3,0x0,0x9c,0x7c,0x4,0xce,0xfb, +0x76,0x66,0xe,0x8c,0xe5,0xf6,0x78,0x2d,0x0,0x37,0x1,0xe7,0xb3,0xd9,0x66,0xbe, +0xcc,0x53,0x8c,0x4,0x54,0xba,0x7b,0xbb,0xec,0x6,0xac,0xa4,0x18,0x6f,0x34,0x0, +0x17,0xcb,0xd9,0x46,0xd1,0x87,0x31,0x4,0x16,0x8f,0xc6,0xdd,0x80,0x95,0x24,0xea, +0xe6,0x9a,0x6c,0x7,0xb2,0x68,0xa3,0xe8,0xc3,0xe5,0x14,0x53,0x8c,0x51,0x6,0x6c, +0x37,0xb,0x3e,0x7e,0xe5,0x34,0xb1,0x5,0xf8,0x54,0xd1,0x87,0xcb,0x2b,0xf0,0x8c, +0x69,0x57,0x60,0x39,0x11,0x6e,0x2,0x7e,0x69,0x7f,0xf9,0x58,0xd1,0x16,0x4b,0xcc, +0x6b,0xf7,0xc,0x7c,0xb9,0x5,0x68,0xe6,0x69,0xfa,0x0,0x7f,0xb1,0x1d,0x68,0x36, +0x69,0x3a,0x1,0x17,0xcb,0x85,0x7d,0xd7,0xc0,0x73,0x5,0x38,0xeb,0xa,0x5c,0x5f, +0xdd,0x74,0x6,0xce,0xf4,0x59,0x3a,0x0,0x30,0x69,0xf4,0x34,0x0,0x5c,0x16,0x76, +0xb8,0x77,0x20,0x68,0xfc,0xa5,0xf4,0xa5,0xe8,0x69,0x3a,0xcf,0xd2,0xa,0x30,0x68, +0x1,0x2a,0xd1,0x2,0x7d,0xa9,0x0,0x3e,0xd9,0x5,0xd8,0xe2,0x4b,0x95,0x78,0x88, +0xd1,0x2,0x5c,0x1b,0xc8,0xb5,0xdf,0xec,0x0,0x6c,0x8b,0x16,0x25,0xb9,0xb6,0xbc, +0x46,0x5f,0xba,0x64,0x6,0x2f,0xb1,0xba,0x56,0x1,0x1e,0x9b,0x3,0x31,0xe2,0x2f, +0xd7,0xe0,0xfa,0x6f,0xd,0x81,0x58,0x11,0xae,0x0,0x8f,0x3a,0x0,0x21,0x89,0x8a, +0x79,0x3c,0x9c,0x99,0x1,0x13,0x5e,0x68,0x2f,0x19,0xbe,0x4c,0xa2,0x4c,0xe5,0x5a, +0xf2,0xc,0x22,0xfe,0xcd,0xdc,0xc,0x88,0x55,0xfd,0x1a,0xa0,0x7c,0xa6,0xa9,0x59, +0x22,0x9c,0x8c,0xe0,0xc7,0x5e,0x5d,0x98,0x1,0x71,0xdd,0xa2,0x2,0xec,0x28,0xd7, +0x20,0x2f,0xf5,0xad,0xf7,0xd5,0xb6,0xfb,0x9a,0x2d,0x9d,0xea,0xea,0x5a,0xd,0xb0, +0x93,0x98,0xa1,0x87,0x6f,0x5,0x93,0xf,0x4c,0x81,0x7e,0xb4,0x33,0x30,0xf5,0x2c, +0x29,0x66,0xc,0x80,0x93,0x1f,0x27,0x10,0xe4,0xda,0xa1,0x7f,0x77,0xb7,0x54,0x28, +0x60,0xff,0xee,0x26,0xd,0x68,0xfc,0x30,0x1a,0x5,0x86,0xc0,0x5d,0xcd,0x2,0xeb, +0x34,0x11,0x0,0xdf,0xb,0xcd,0x80,0xc5,0x72,0x5e,0xd9,0xf0,0x3b,0x2c,0xe7,0xc5, +0xa0,0xf,0xb5,0xaf,0x68,0x0,0x16,0xcb,0x79,0x65,0xd7,0xd6,0x0,0x2c,0xc9,0x35, +0x96,0xbc,0xe5,0xeb,0x1b,0xe,0x1a,0x80,0xea,0x72,0x5e,0xa9,0xd6,0xb6,0x1d,0x58, +0x92,0x6b,0x8c,0xbc,0x51,0xda,0xdf,0xd3,0x0,0xac,0x2d,0x41,0xb7,0x55,0x13,0x4b, +0x72,0x8d,0xd1,0x3,0xcb,0xf1,0x76,0x1,0xb6,0xd5,0x4b,0x4b,0x72,0x8d,0xb1,0xc3, +0xd2,0x6,0xa6,0xae,0xc0,0xb6,0x8a,0x70,0x49,0xae,0x69,0x5,0xec,0x7e,0xc0,0x96, +0x9a,0x77,0x49,0xae,0x69,0x25,0xfa,0x66,0xe0,0x34,0xec,0xb5,0x8c,0x50,0x92,0x6b, +0xbc,0xe6,0x6d,0x6,0xbc,0xee,0x7,0x2c,0xc9,0x35,0x66,0x1f,0xb8,0x77,0x17,0x0, +0x0,0x15,0x2f,0x49,0x44,0x41,0x54,0xfe,0x52,0x80,0xc5,0x73,0x1d,0x4d,0x80,0x2f, +0xfb,0x2,0x5f,0xf4,0x5a,0x28,0x29,0xc9,0xb5,0x5e,0x40,0x4d,0xe3,0xb7,0x8e,0xa1, +0x2e,0xd7,0x3a,0x0,0xf3,0xfe,0x52,0xbd,0x8a,0xa1,0x3,0x37,0x6d,0x72,0xad,0x17, +0x30,0xf1,0x9d,0x6d,0xc0,0x55,0x9b,0x5c,0xeb,0x2,0xfc,0x26,0x3,0xc6,0xe1,0x6c, +0x1b,0x70,0xd1,0x26,0xd7,0xfa,0x1,0x8b,0x23,0xd5,0x4,0x70,0x95,0x3,0xaf,0xdb, +0xe4,0x5a,0x7,0x60,0xde,0xe7,0xcd,0xa2,0x62,0x97,0x9c,0x0,0x4e,0x72,0xe0,0x55, +0x9b,0x5c,0xeb,0x0,0xcc,0x3b,0xd9,0xd9,0xac,0x78,0x56,0x68,0x19,0x18,0xb4,0xc9, +0xb5,0xe,0x40,0xd1,0xab,0xff,0xb7,0x61,0xd,0xf0,0x7e,0xd6,0x31,0xc4,0xf,0x56, +0xee,0x78,0xb6,0xc9,0xd6,0x57,0xbe,0x1b,0x41,0x2,0xff,0xae,0x0,0x1e,0x66,0x40, +0x7a,0xd7,0x40,0xfe,0x3c,0xaa,0x8e,0x87,0xa9,0x6c,0x7d,0xe5,0x1b,0x3c,0x10,0xb8, +0xe6,0xcd,0x18,0x15,0xe0,0x2d,0x6b,0x5f,0xce,0x4b,0xda,0xa4,0x76,0xe,0xcc,0xb6, +0xb0,0x20,0x30,0x96,0x4f,0x1c,0x2b,0x4d,0x9a,0x1b,0xd6,0xde,0xf5,0x65,0xc,0xcc, +0x37,0xe9,0xa0,0x59,0x44,0x1,0x5b,0xb9,0x55,0xe0,0x9a,0xb5,0xf7,0xb5,0x19,0x3, +0xf3,0x6d,0x48,0x68,0xf8,0x91,0xc7,0xd6,0xb3,0xc2,0xf0,0xb3,0x5d,0x41,0xd7,0x83, +0x2,0xf3,0x8d,0x56,0xe0,0xda,0x26,0xe,0x5b,0xe0,0x2,0x14,0xd5,0xf7,0x3d,0x4d, +0x7,0x5,0xe6,0x5b,0xc9,0xc0,0x79,0x43,0xf2,0x7c,0x8d,0xdb,0x26,0xa8,0xf2,0xd0, +0xfb,0x17,0x2,0x3c,0x1c,0x70,0x4e,0x43,0xca,0xaf,0x1,0xc2,0x13,0x7c,0xd3,0xd4, +0xba,0xcc,0x81,0x4c,0x2,0x83,0x41,0x81,0x31,0xbb,0xbc,0x48,0xc5,0x35,0xe0,0x13, +0x24,0xaf,0xec,0x65,0x7e,0x4b,0x25,0x90,0xd7,0x94,0x87,0x3,0xe2,0x53,0xb1,0xc4, +0x86,0x47,0xec,0x7d,0x77,0x9e,0xdb,0x24,0x2c,0x1,0x29,0x1b,0x14,0x58,0x6c,0xe9, +0xc4,0x87,0x72,0x5a,0xc7,0xe,0x3e,0x23,0x5a,0x3,0xde,0x32,0x3,0x3b,0x5c,0x2b, +0x67,0x4d,0xb6,0xbc,0x8a,0x5d,0xb2,0xd8,0xe1,0x7f,0xe4,0x54,0x36,0x8f,0x6f,0x98, +0x81,0xa7,0xe9,0x0,0xcc,0xf7,0x1,0x47,0x28,0xa4,0x4e,0xdd,0xca,0xe6,0xf1,0x95, +0x2,0x8c,0x1d,0xea,0x24,0x16,0xa3,0x63,0x9b,0x4f,0xb4,0xc2,0x97,0x76,0x0,0x26, +0xd9,0xb6,0x1a,0xf8,0xcd,0xb2,0x46,0x2e,0x23,0x81,0xe,0x5c,0xab,0x40,0x9b,0xd8, +0x8,0x3c,0xb5,0xf8,0x33,0x2b,0x8a,0x68,0xd1,0x1,0x98,0xed,0xe5,0xc6,0x34,0x31, +0xb2,0x12,0x4f,0x3c,0xfe,0x42,0x1,0x5e,0xab,0x40,0x2b,0xb6,0x46,0x16,0x23,0x23, +0xeb,0x2c,0x3,0x8a,0x0,0xdc,0x1,0x98,0x7,0x2a,0x48,0x13,0x13,0x2b,0xf6,0xb4, +0xc7,0x92,0x23,0xf0,0x4a,0x1,0x2e,0x93,0x25,0x79,0xa,0x77,0x25,0x49,0xc6,0x19, +0x50,0xa4,0x18,0x3d,0x80,0x98,0x26,0x52,0x1b,0x81,0x49,0xa8,0x1,0x7d,0x15,0x48, +0x56,0xf4,0x29,0x3e,0x26,0x9b,0x9e,0x66,0x40,0x91,0x44,0xf5,0x0,0xf2,0x34,0xd1, +0xc6,0x86,0x5b,0xaa,0x2a,0xaf,0x17,0xf2,0x69,0xbe,0x39,0x90,0x6d,0x1c,0x98,0x47, +0x74,0x94,0x3,0x79,0x9a,0xd8,0x7,0x88,0x69,0xe2,0x3c,0xf2,0x53,0x8f,0xb9,0x1a, +0x30,0x2c,0x1,0x13,0x1b,0x6e,0x7a,0x32,0xca,0x66,0xa9,0x48,0x84,0x7b,0x0,0x79, +0x9a,0x78,0x33,0x9,0x0,0xa8,0x96,0x76,0x5f,0x50,0x56,0x6,0x5a,0x60,0xaa,0xf1, +0xd3,0x1c,0xc8,0x53,0xfd,0x1e,0x40,0x9e,0xd3,0xac,0x1,0x18,0x6a,0x83,0xf8,0xe2, +0xb6,0x2,0x1c,0x81,0xd,0x46,0x6c,0x20,0x20,0x7f,0xd0,0x8d,0x3a,0x88,0x2f,0x6e, +0x34,0x60,0x2,0x63,0x48,0xc0,0x70,0xce,0xb,0xe0,0x3f,0xdd,0x5,0x78,0x6d,0x8d, +0xc7,0xec,0x4f,0x4c,0x5,0xae,0x98,0x66,0xf8,0x2b,0x7c,0x8,0x8f,0xcf,0x9c,0x2, +0xe8,0xee,0x2,0xfc,0xda,0xa2,0x6f,0x26,0xae,0x7a,0x8c,0xc3,0x8b,0x45,0x1b,0xd0, +0x1b,0x18,0x78,0xad,0x1,0x1d,0x4,0x52,0x9c,0x59,0xc3,0x8c,0xe1,0x67,0x16,0x7f, +0x26,0x85,0xa,0xbc,0x2a,0x1,0xe9,0x53,0x2,0x49,0x82,0xcf,0xda,0xcd,0x22,0x6d, +0xde,0xfc,0xc8,0xcd,0xe2,0xb9,0xc5,0x62,0x77,0xad,0x7e,0xef,0x8b,0x40,0x9b,0x34, +0x30,0x4f,0x47,0x9,0x9,0xc1,0xc1,0x4f,0x5b,0xd,0xbf,0x5,0xc8,0xd,0xff,0xd0, +0x61,0x49,0x70,0xad,0x7e,0xef,0xdf,0x86,0x3a,0x10,0x9d,0x77,0xcc,0x1f,0x11,0x1a, +0xa,0xe0,0x93,0xad,0xae,0xad,0xd,0x88,0xae,0xd,0xe2,0x6f,0xe2,0x5d,0xab,0x2b, +0xe3,0xff,0xbd,0x4,0x24,0x10,0xa0,0x96,0x2a,0xf0,0x67,0x5b,0x9d,0x77,0xb,0x90, +0x6b,0xfc,0x3,0x97,0xfd,0xe1,0xd7,0x57,0x2a,0xf0,0x6f,0x98,0xe,0xa4,0x10,0x82, +0x35,0xe0,0xe1,0xd6,0xf0,0xd4,0x2,0xe4,0x55,0xc,0x78,0xff,0x71,0xa4,0x1d,0xac, +0xf4,0xdf,0x34,0x60,0x35,0xc5,0xa0,0xdb,0x3,0x70,0xb,0x90,0xd7,0x69,0x20,0xd9, +0xbf,0x3e,0xd6,0x80,0xff,0xb5,0x5,0x98,0x6c,0x4f,0x31,0x5a,0x80,0xbc,0x12,0x5, +0x1,0xff,0xda,0x77,0x94,0x7,0x4e,0xb2,0xff,0xdc,0x2,0xfc,0xfd,0xf6,0x24,0xaa, +0xd,0x88,0xb5,0x36,0xf0,0x21,0xd7,0x57,0x6f,0xa9,0x59,0xcd,0xb4,0x5,0xf8,0xc9, +0xf6,0x34,0x31,0x6d,0x3d,0x94,0x83,0xf1,0x3,0x86,0xbe,0x3a,0x25,0x9e,0x39,0xf0, +0xe1,0xf6,0x44,0x18,0xe6,0x5e,0xbb,0xf7,0x1,0xe3,0xff,0x32,0x4c,0x94,0x2,0xbd, +0xdf,0xc,0xa4,0x27,0x3b,0x2,0xe1,0x6e,0xc6,0xc5,0x43,0x6e,0x59,0x7e,0xa3,0xb6, +0x1,0x49,0xda,0x1f,0x28,0x6e,0x38,0xa4,0x6e,0xc5,0x63,0x7c,0x8b,0x23,0xa3,0xb7, +0x1,0x97,0x3b,0x3,0x67,0x1c,0x58,0x14,0x16,0x5f,0x34,0x3,0x17,0x3b,0x3,0x31, +0xbd,0x88,0xa,0x31,0x73,0xdb,0x2,0xf4,0x77,0x6,0x62,0x7a,0xa1,0x3c,0xff,0x74, +0xd3,0xc,0x4c,0x83,0x9d,0x81,0x98,0x23,0xe2,0xa2,0x85,0x3c,0x5a,0x69,0xd5,0xc, +0x24,0x4d,0x65,0x13,0x43,0xe0,0xc,0xa3,0xa2,0xe5,0x4d,0x70,0x18,0x13,0x7b,0xdd, +0xc,0xdc,0x34,0x15,0x86,0x4c,0x5c,0x1b,0x1a,0x46,0xc8,0xae,0x0,0xc8,0x17,0xcb, +0x62,0xeb,0x5a,0x7,0xa2,0x5c,0xc3,0xbc,0x7b,0x6c,0x53,0xfc,0xf7,0x70,0xd1,0x54, +0xfa,0x32,0x4,0x82,0x77,0xb,0x22,0x90,0xdf,0x38,0x6f,0x22,0x71,0x50,0xa3,0x2e, +0xd7,0x20,0xef,0x6,0xb9,0xc6,0x9f,0xb,0x1f,0x4e,0x9b,0x8a,0x7b,0x86,0x40,0xf0, +0x6e,0x41,0x62,0x1d,0x7a,0x11,0xcb,0x4f,0x86,0xd4,0xe5,0x5a,0x78,0x81,0x72,0x8d, +0xc7,0xc3,0xb3,0xa0,0xa9,0x5e,0x6a,0xa,0x8c,0xd3,0x90,0x5a,0x7,0x1,0xda,0x87, +0x3c,0xfb,0x52,0x97,0x6b,0xa1,0x83,0x72,0x6d,0x84,0x87,0x9e,0x9d,0x86,0x4d,0x15, +0x61,0x53,0x20,0x1,0x7f,0x3c,0x39,0xc2,0x7,0xff,0x66,0x6b,0xc0,0x5b,0x81,0x4f, +0xd9,0xde,0x81,0xa0,0xf,0xcf,0x1c,0xd4,0x87,0x4f,0xf1,0xe,0xfc,0xba,0xb1,0xc8, +0x6e,0xa,0x64,0xaf,0xc3,0x6d,0x7d,0x84,0x99,0x60,0x76,0x60,0xaa,0x2e,0x66,0xc4, +0x3c,0x7d,0x8a,0xe7,0xd3,0x7b,0x8d,0xcb,0x8,0xc6,0x40,0x98,0x2e,0x64,0xc4,0x68, +0x90,0x1f,0x9,0xab,0x3,0xc9,0xdb,0xa8,0xf,0x9f,0x42,0xbc,0xc6,0xa,0x56,0xc3, +0x42,0x89,0x31,0x30,0xe1,0x2d,0x63,0x8,0x74,0xe2,0x1a,0xa0,0xd4,0x87,0x93,0x50, +0x14,0xc3,0x47,0xef,0x92,0x5d,0x81,0x2,0x8a,0x40,0xf7,0xf,0xf5,0x40,0xd0,0x87, +0x9b,0xd7,0x85,0x8e,0xe4,0x87,0x58,0xb3,0x5e,0xaf,0x3a,0x20,0x75,0x26,0x61,0x59, +0x1f,0x26,0x58,0xa3,0x39,0x4f,0xee,0x87,0x6c,0x55,0xc8,0xb5,0xe1,0x80,0x56,0x50, +0x91,0x6b,0x2b,0x94,0x6b,0xc9,0x61,0xc8,0xd7,0x73,0x77,0x38,0x8a,0x52,0x7,0xf2, +0x59,0x2a,0x8f,0xd7,0x2e,0xc9,0xb5,0x15,0xca,0xb5,0xe4,0x18,0x82,0x21,0x5f,0xd0, +0x18,0x6,0x88,0xf,0x7,0xa8,0x7,0xd2,0x70,0x85,0x72,0x2d,0x19,0x87,0x14,0xf, +0x6a,0x24,0x56,0xef,0xb3,0x2f,0x75,0x20,0xba,0xb6,0xec,0xc4,0x72,0x5d,0xae,0x85, +0x2b,0x94,0x6b,0xa8,0xd9,0x30,0x4d,0x8c,0xfa,0x9f,0x7d,0xa9,0x1,0x29,0x3a,0xef, +0xec,0x4c,0x76,0x5d,0xae,0x85,0x2b,0x29,0xd7,0x56,0x98,0x26,0xde,0xeb,0xb8,0x9c, +0xa7,0x68,0x19,0xed,0xac,0xd4,0x54,0x6c,0xed,0xb4,0x2a,0x40,0x8,0x4b,0x2b,0x54, +0x4f,0xa7,0x36,0x5b,0x0,0x30,0x3e,0xe9,0xb8,0x9c,0xa7,0x56,0x31,0xb5,0x76,0xa, +0x79,0x88,0xab,0x5b,0x6,0xa2,0x63,0x43,0xe0,0xd8,0x61,0xb8,0x3b,0xcf,0xe9,0xba, +0x9c,0x97,0xbf,0xb0,0x1c,0xa3,0x9e,0xd0,0xc8,0x53,0xc,0xf9,0xe4,0x80,0xfa,0x14, +0x3,0xec,0x26,0x24,0x7e,0xd7,0xd5,0xb5,0xad,0x40,0x9e,0x44,0xc9,0x67,0x23,0xd4, +0x3,0x41,0x63,0x85,0x93,0xce,0xab,0x6b,0x5b,0x81,0xc2,0x8d,0x8b,0xa7,0x3f,0xd4, +0x3,0x97,0x8c,0x8d,0xdd,0x1e,0x67,0x5f,0x2a,0xc0,0xb8,0x74,0xe0,0x6e,0xf6,0x7c, +0x8b,0x7a,0xe0,0x82,0xb1,0x27,0x61,0x8f,0xb3,0x2f,0x95,0x49,0x53,0x7e,0x5,0xf2, +0x9,0x1e,0xf5,0x40,0x8f,0x57,0xe7,0x1b,0x8e,0xa2,0x24,0x56,0xd8,0x2,0xb4,0xab, +0x4b,0x1a,0xdb,0x81,0xf0,0xaf,0xb8,0xd8,0xd8,0x0,0x4c,0x1a,0xd7,0x4e,0x3a,0x3, +0xc1,0xf5,0x9d,0x87,0x8d,0xcf,0xe5,0x8e,0x9b,0xab,0x26,0x5d,0x81,0x33,0xf0,0x46, +0xcd,0xc0,0xa8,0x7c,0xea,0xf2,0x4e,0xc0,0xd8,0x61,0x51,0x18,0x36,0x2f,0xc1,0x58, +0xee,0x70,0xc0,0xd8,0xa,0x52,0x87,0x35,0x3,0x2d,0xcb,0x19,0xc,0x88,0xc3,0x93, +0x4,0xcd,0xc0,0x96,0x4d,0xac,0x37,0x4c,0x7d,0xa0,0x5e,0xb,0x90,0x4f,0x7,0x9b, +0xdd,0x19,0x90,0xf3,0xb0,0xb6,0x32,0x38,0xb0,0xde,0xf0,0x13,0x3e,0xdd,0x23,0xd6, +0xa,0x3c,0xed,0xc,0xac,0x75,0x6d,0x82,0x97,0xba,0xed,0x40,0xda,0x19,0x58,0xe7, +0xbc,0xe5,0xb9,0xfb,0x71,0xd0,0xa,0xb4,0xd3,0xce,0xc0,0x9a,0xf0,0xf4,0xbf,0xa4, +0x35,0xdb,0x6c,0x67,0xe0,0x4d,0x15,0x58,0x13,0x80,0xe5,0xc1,0xa8,0xc4,0xdf,0x7, +0xf0,0xa4,0x92,0x62,0xe4,0xc5,0xbe,0x9,0x63,0x3b,0x8f,0x61,0x15,0x78,0x5c,0x49, +0xa2,0x32,0x20,0x75,0x4d,0x80,0xa7,0x9d,0x81,0x95,0x34,0x31,0x3,0xca,0x87,0x97, +0xed,0x66,0x87,0x35,0xc0,0x4a,0x22,0x2c,0x81,0x7f,0x76,0xd8,0x7e,0x80,0x95,0x54, +0x5f,0x2,0x89,0x6f,0x0,0x6c,0x71,0xde,0x37,0xc4,0x72,0xeb,0x80,0x93,0x5a,0x60, +0x51,0x11,0x8e,0x6b,0x9e,0x36,0x60,0x14,0x9e,0x6e,0x12,0xcb,0xa9,0x3,0x5a,0x2d, +0xc0,0xa8,0xf6,0x89,0xa,0x6,0x1,0xf8,0x86,0x6d,0x3a,0xdc,0xd2,0x2,0xc8,0xb7, +0xd6,0x38,0x3d,0x52,0x8c,0x1b,0xb5,0x39,0xb1,0x3,0x90,0xa7,0x77,0x76,0x8f,0x24, +0xa,0x80,0xa1,0xf1,0x2c,0x2d,0x80,0xa9,0xd2,0xeb,0xd3,0x2d,0x4d,0xbc,0x61,0xff, +0x23,0xac,0xb7,0x43,0x5e,0x72,0xdf,0x6,0xa4,0xca,0xc1,0xd8,0x5d,0x33,0xef,0x8b, +0xa0,0xde,0xd3,0xc4,0x78,0x67,0xb6,0x1,0x89,0xd2,0x3e,0xd5,0x15,0xf8,0x9f,0xfc, +0x7a,0x5f,0x1a,0xe1,0xd8,0x6f,0x3,0xca,0x84,0xdd,0xef,0x3,0xfc,0x8b,0xab,0xfa, +0x68,0x31,0x4f,0x1b,0x80,0x71,0xed,0x63,0x3f,0xcc,0x80,0xef,0x5c,0xc7,0x38,0x18, +0xa9,0x9c,0x76,0xb8,0x2d,0x82,0xc7,0xc3,0x5,0x6b,0x0,0x46,0x5b,0x1e,0x6d,0x62, +0x0,0x4c,0x9f,0x2d,0x62,0x64,0x88,0x8d,0x79,0x20,0xef,0x2d,0x4b,0x44,0xfc,0x46, +0xe0,0x44,0x3e,0xec,0xab,0x7,0x90,0x3c,0x5b,0xf3,0xe,0x33,0x2f,0xb7,0x21,0x99, +0xd3,0x34,0x2,0x73,0x65,0xd7,0x3,0xc8,0x5d,0x5b,0xd6,0xed,0x8d,0x5e,0x42,0x66, +0x6d,0x3f,0x28,0x60,0x9a,0x3f,0xec,0xab,0x3b,0x50,0x38,0xef,0xec,0x18,0x0,0x74, +0xbc,0x32,0x11,0x6e,0x2,0xe6,0xf,0xa9,0xe9,0x6e,0x88,0x37,0xb7,0x3c,0x1e,0x66, +0x3b,0xa0,0x30,0xb4,0x48,0x60,0x93,0x1d,0x92,0xc,0xe8,0xf7,0x30,0x8b,0x3e,0xc0, +0x64,0xcb,0xf3,0x77,0xcc,0x81,0xd9,0xd9,0x11,0x38,0xd3,0xd,0x80,0xf1,0xd6,0x67, +0xc,0xed,0x0,0xd4,0xa2,0xc5,0x37,0x53,0x21,0xed,0xc4,0x43,0x67,0xc3,0x28,0x7f, +0xea,0xde,0xbe,0x80,0x53,0x57,0x94,0x57,0x82,0x88,0x3,0x27,0x19,0xd0,0xde,0x17, +0xf0,0x33,0x57,0x5e,0x21,0xf7,0xbb,0xa1,0x52,0xd3,0xe9,0x53,0x18,0x5a,0xf2,0x8c, +0x41,0xa6,0x78,0x4e,0x66,0x87,0xda,0x18,0x7e,0xf6,0xc,0x7e,0xb9,0x25,0x94,0x9d, +0xe3,0xdf,0xce,0x94,0xa7,0xee,0xd,0x2,0xe4,0xae,0x4d,0x7,0xfe,0x5b,0xcc,0xbb, +0xc9,0x6d,0xfa,0x17,0xf8,0xb7,0x53,0xa5,0x88,0x34,0x8,0x90,0x3b,0x6f,0x1d,0xf8, +0x2b,0x4,0x9e,0x6e,0x8,0x6e,0x4d,0x67,0xa3,0x2,0xe8,0xf,0x2,0x14,0x72,0x2d, +0x9,0x4b,0x93,0x26,0x3d,0xbd,0xd9,0xf0,0x49,0xf3,0x64,0xeb,0x83,0xb0,0xcc,0x6a, +0x6d,0x76,0x19,0x28,0xe4,0x5a,0xac,0xce,0x52,0xfe,0xeb,0xd1,0x5a,0x64,0x78,0xef, +0x35,0x3c,0xec,0xcb,0x14,0xe8,0x4b,0x20,0x71,0x72,0xb9,0x76,0x51,0x1,0x1e,0xac, +0xc5,0xa4,0x51,0xa,0x81,0x3d,0x22,0xa2,0xe5,0x6f,0x0,0x18,0xf2,0x7b,0x95,0x3a, +0xa9,0x93,0xcb,0x35,0xb7,0x2,0xfc,0xfc,0x5a,0x4c,0x1a,0x5,0x68,0xf7,0x5,0x8a, +0x16,0xe1,0xd4,0x85,0xeb,0x92,0x69,0x22,0xf5,0xa,0xa0,0x7c,0xbe,0xd6,0xff,0xbc, +0x12,0xf,0x85,0x12,0xd3,0x25,0x19,0xe,0xc8,0x13,0x61,0xde,0x5d,0xa3,0x3,0xa3, +0xab,0xd,0xcb,0x81,0xe2,0xb7,0xbe,0xc0,0xb,0xb1,0x73,0x6,0x3e,0x78,0x9e,0xa5, +0xfa,0xbc,0x17,0x53,0x7,0xc6,0x1,0xcb,0x81,0x8e,0x10,0x34,0x83,0x1,0x27,0x9a, +0x1d,0x4a,0x60,0xa2,0x0,0x5d,0x21,0xd9,0x6,0x3,0x5a,0x35,0xc0,0x24,0xf3,0x64, +0xd2,0xe2,0xc9,0xb0,0xb7,0xb4,0xa,0x8c,0x33,0x4f,0x26,0x7d,0x1a,0x1d,0x16,0xa8, +0x46,0x8b,0x9a,0x2b,0x94,0x55,0xe1,0x1,0x67,0x69,0x15,0x98,0x47,0xfc,0xc1,0x81, +0x95,0xb2,0xc9,0xf,0x1,0x28,0x7f,0xb7,0x87,0x73,0x6d,0x9b,0x49,0xd8,0x0,0xb4, +0x45,0x8e,0xd7,0x1f,0x58,0x75,0xde,0xcb,0x49,0xb0,0x4f,0x60,0x35,0x3c,0xcd,0x26, +0x7e,0xd9,0x79,0x2b,0x40,0x57,0xe4,0xe9,0x3,0x1,0x79,0x0,0x9e,0x7f,0x76,0x77, +0x40,0xa1,0xf,0xa7,0x77,0x7,0x14,0xfa,0xb0,0x11,0x98,0xb9,0x9e,0x61,0x80,0x42, +0xae,0x69,0x40,0x77,0x60,0x60,0x4d,0x22,0xac,0xc9,0x35,0x9e,0xb5,0xed,0x19,0xa8, +0x55,0x31,0x78,0x22,0x5c,0x7,0xec,0xf8,0x72,0x1b,0x80,0x7a,0x5e,0xea,0xe,0x3, +0xb4,0x1b,0x80,0x5a,0x25,0x6a,0xa8,0x31,0xdc,0x64,0xc0,0x1a,0x41,0xaa,0xd5,0xda, +0xbe,0x99,0xe,0x7,0xe4,0xbf,0xd6,0x0,0x1b,0xaa,0x89,0x3,0x0,0x6b,0x8a,0xa, +0xa6,0x40,0x5c,0x42,0xe1,0x67,0xdc,0xfb,0xfc,0x14,0x8,0x6a,0x61,0xe9,0xf,0x3f, +0x91,0x3f,0xc8,0x18,0x97,0x54,0x59,0xe4,0x88,0x16,0x88,0x89,0x97,0x3,0x6b,0xca, +0x26,0xcd,0xc0,0xc2,0xd3,0xe0,0x3d,0xb1,0x3c,0x5e,0x5a,0xc2,0x87,0xc7,0x10,0x80, +0xe2,0x68,0xc4,0x16,0x16,0xc8,0x70,0xbf,0x39,0x80,0x6c,0xd1,0xe4,0x61,0xb9,0x8, +0x8c,0xc2,0x4d,0x6d,0x25,0xca,0x10,0x48,0xe1,0x93,0x28,0xfc,0x55,0xec,0x10,0xf3, +0xf8,0x22,0x1c,0xfe,0xd8,0xe0,0x1e,0x61,0x80,0xb0,0x48,0x86,0x5f,0xcf,0xdb,0x58, +0x52,0xcb,0xc9,0x27,0x4d,0x76,0xdc,0x4,0xae,0xe2,0xd4,0xae,0xae,0x6d,0x5,0x12, +0x7e,0xf6,0xa2,0xc3,0x7,0x5,0x9b,0x8c,0x63,0xbe,0x17,0xce,0xc3,0x7e,0xe,0x86, +0xa9,0x16,0xe4,0x6,0xf2,0xf1,0xc3,0xb8,0xbf,0x91,0x1f,0x62,0xc0,0x6f,0xac,0xec, +0xf2,0xc2,0xf6,0xd1,0xda,0xd5,0xb5,0xe9,0xb6,0x78,0x8,0x99,0x15,0xc0,0x6c,0x3e, +0xed,0xf0,0x91,0xe,0x11,0x40,0x71,0xea,0x59,0xfc,0xc,0x65,0x3f,0x15,0xf,0x57, +0xe,0xf0,0x11,0x74,0xf0,0xa5,0x62,0xf4,0x4,0x50,0x6c,0x76,0x76,0xd8,0x6d,0xed, +0xea,0xda,0x56,0x20,0xd6,0x3e,0xf1,0x9d,0x3d,0xb4,0x2,0x2d,0x19,0xde,0xd8,0x93, +0x3,0x20,0x8f,0x8a,0xe7,0x3e,0xa0,0x10,0x81,0x91,0xb2,0x9e,0xf2,0xfd,0x16,0x2, +0x18,0x7b,0x19,0x70,0xeb,0xea,0x5a,0x5d,0x4e,0x13,0x79,0x90,0xa4,0xfb,0x56,0x30, +0x39,0xb1,0x42,0xeb,0xc4,0x4a,0xad,0xb1,0xd,0x79,0x83,0x4d,0x6d,0xe2,0x10,0x3b, +0x71,0x89,0x13,0xbb,0x89,0x1b,0x79,0xb1,0x17,0xe1,0x43,0x43,0x1e,0xf3,0x1d,0x25, +0x2,0xb8,0x58,0x8,0xe0,0x72,0xfb,0xea,0x5a,0x5d,0xd6,0x6,0x9f,0x13,0x44,0x1, +0x1e,0x9d,0xb,0x40,0x6,0x40,0x5c,0x3f,0xa4,0x36,0x6e,0x8,0x1,0xa4,0x4b,0x0, +0x97,0x0,0x2e,0xf6,0xf1,0x79,0x62,0xd1,0x63,0xbe,0x67,0x46,0x0,0xaf,0xd7,0x2, +0x38,0xdb,0xbe,0xba,0x56,0xb,0xc,0xe2,0x20,0xa,0x1,0x9,0xd3,0x1d,0x8c,0x32, +0xb5,0x99,0xd,0xa9,0x98,0x4d,0xdd,0x14,0x70,0xd4,0x25,0x1e,0x20,0x7d,0xe2,0xc5, +0x41,0x2,0x3f,0x59,0xfc,0x98,0xef,0xa,0x92,0x93,0x46,0x2,0xbf,0x68,0x5f,0xb7, +0xf8,0x5e,0x80,0x99,0xb6,0x88,0xc2,0x24,0x80,0xcf,0x8,0xce,0x61,0x70,0x60,0x8e, +0x42,0x9a,0x79,0xe,0xd9,0xad,0xd,0x72,0xd6,0x21,0x5e,0xea,0x12,0x9f,0xba,0x9, +0x88,0xdb,0x38,0x24,0x3e,0x7c,0xe9,0x63,0xde,0xa4,0xaf,0x3,0x6f,0xdb,0x97,0x82, +0x54,0xf5,0xb4,0x3,0xf0,0x5a,0x5,0x4e,0xda,0x80,0x99,0x3e,0x1c,0xa,0x68,0xb5, +0x1,0x33,0x5,0xbc,0x3,0xf0,0x4a,0xbb,0xa5,0xac,0x5,0x98,0x69,0xfc,0xfe,0x40, +0xfe,0x10,0xe9,0xe,0x40,0x59,0xc5,0xe8,0x3f,0x4b,0x79,0x45,0x44,0x0,0x71,0x96, +0xb6,0x2,0x65,0x92,0xd2,0xdf,0xf0,0x6f,0x58,0xe,0xac,0x74,0x41,0x37,0x1,0x7b, +0xbb,0xb6,0x75,0x1,0xac,0xf4,0x79,0x97,0x80,0x4a,0xad,0xad,0xb7,0xf3,0xc6,0xc7, +0x23,0x89,0xd5,0x4d,0xe9,0xbc,0x9b,0x80,0x4a,0x35,0xf1,0xe7,0x7d,0xc3,0x93,0xa, +0xc,0x2a,0x9b,0x3,0x4a,0x40,0xa5,0x5e,0xfa,0x66,0xcf,0x0,0xac,0xa7,0x18,0x95, +0xed,0xf,0x25,0xa0,0x52,0x11,0x7e,0xb7,0x67,0x8a,0xa1,0x3,0x31,0xc5,0x68,0x2, +0x2a,0x35,0xef,0x8f,0x7b,0x26,0x51,0x7a,0xd6,0x86,0x49,0x54,0x13,0x50,0xa9,0xea, +0xdf,0xf6,0x4e,0x13,0xdf,0x17,0xc0,0xd7,0xb2,0x34,0xb1,0x11,0x58,0xac,0x5b,0xdc, +0xf6,0x4c,0x84,0x75,0x20,0x63,0x2d,0xc0,0x62,0x65,0xa6,0x2f,0x50,0x1f,0xc3,0x2a, +0x50,0xec,0xa3,0xcb,0x2a,0xdc,0xca,0xda,0x13,0xe9,0xae,0x9e,0x4,0xf0,0x44,0x2, +0xa9,0x11,0xb0,0x58,0x5d,0xeb,0xb,0x64,0xf,0xc4,0x2,0x4,0x19,0x85,0x26,0xc0, +0x1d,0xd6,0xf,0xb,0xd1,0x96,0xf7,0x51,0xd4,0x1,0x37,0xfc,0x58,0x12,0x7f,0xb1, +0xfb,0xa,0x69,0x6,0x8c,0xd4,0xcc,0xbb,0x15,0xb8,0xc3,0x1a,0x70,0x6,0x94,0xa7, +0xd,0xd0,0xa9,0x11,0x70,0x87,0x55,0xee,0xc,0x28,0x77,0x39,0x53,0x66,0x6,0xec, +0xdf,0x38,0xf0,0x63,0x1,0x1a,0xf6,0x62,0xd0,0x70,0x28,0xa0,0x61,0xb7,0xc9,0x70, +0x40,0xc3,0x7e,0x9a,0xe1,0x80,0x86,0x1d,0x43,0xd,0x40,0xad,0x81,0xa7,0x1d,0x68, +0xd8,0x13,0x35,0x1c,0x30,0x35,0x31,0xc3,0x74,0xdb,0x4f,0x54,0xde,0x91,0x60,0x0, +0x64,0x26,0x8b,0x87,0x83,0x2,0x27,0x6,0x66,0x38,0x28,0x30,0x32,0x31,0x43,0x87, +0xe,0x4,0xb4,0xf6,0xf0,0xa,0x9a,0x80,0xa6,0xaf,0x88,0x76,0x8e,0x26,0xbb,0x1, +0x93,0xbb,0x6,0x92,0xbb,0x6,0xf6,0x78,0xfd,0x90,0x81,0xdc,0x48,0xa6,0xba,0xcb, +0xc2,0xef,0x22,0x4a,0x42,0x3b,0x24,0x30,0xad,0x1,0x7a,0x64,0xf,0x40,0x4c,0xa1, +0xe9,0x7d,0x9f,0x2b,0x28,0x4,0xf2,0xe3,0x2,0x21,0x6c,0x45,0x11,0x4b,0xdd,0xbd, +0x1,0x7f,0x6,0xaa,0xc9,0x65,0x3a,0x70,0x2,0x9e,0x26,0x61,0xc3,0x3,0x9,0xd7, +0x86,0xa0,0xb,0xdf,0x97,0x40,0xf4,0x19,0x3e,0xe3,0xda,0xf0,0x7c,0xb9,0x7,0x60, +0xf2,0x74,0xce,0x92,0xe8,0x92,0xc5,0xb,0x1,0x7c,0xf9,0xd0,0xe7,0xea,0xf7,0xfe, +0xeb,0x1,0x8b,0xe6,0xfc,0x94,0x36,0xda,0x21,0x9d,0xac,0x4f,0xf5,0x35,0xe0,0x66, +0xc5,0x36,0xcb,0x5,0x5b,0x66,0xc0,0x40,0x0,0x1f,0x3e,0x0,0x61,0xea,0xee,0xb, +0xb8,0x5a,0x14,0x57,0x98,0x1,0x4f,0x2,0xdc,0x41,0xb4,0x3f,0x60,0x36,0x86,0x8, +0x9c,0xc1,0x18,0x22,0x10,0xf,0xdb,0x70,0x9,0x9a,0x47,0x67,0xa0,0x2e,0x48,0x7f, +0x10,0xc0,0xcc,0x2c,0x5e,0xfa,0x3e,0xdf,0x88,0x8a,0x40,0x5c,0x8d,0xbf,0x20,0x1c, +0x3a,0x3c,0x10,0xd,0x1f,0xeb,0x33,0xb,0x0,0xe2,0x8a,0x84,0x9f,0x6,0x3c,0xc5, +0x98,0x11,0x1,0x1d,0xe,0xf8,0x1b,0x30,0x8b,0xd9,0x25,0x77,0x6d,0x1c,0x8,0x66, +0x41,0x0,0xe8,0x51,0x1,0x5c,0xc2,0x37,0xcd,0x7,0x5,0xda,0x17,0x30,0xa5,0xc4, +0xd1,0x4f,0x8,0x8c,0xd0,0xcd,0xf1,0xb1,0x13,0xc0,0xd,0x7c,0xd3,0x6a,0x48,0x20, +0x71,0x2e,0xb9,0xa7,0xc9,0xd3,0x8a,0xfb,0x1,0x3f,0x74,0xe1,0x92,0x34,0x7,0xdf, +0xdb,0xe4,0xc3,0x15,0x63,0xe7,0xab,0x97,0x4e,0x47,0x20,0x75,0xa7,0xdc,0x79,0x17, +0x40,0xe1,0x4b,0x17,0x2d,0x57,0x75,0x1b,0xbf,0xbd,0x86,0x8f,0x5f,0xbd,0xb4,0x3a, +0x2,0x7b,0xbe,0xd6,0xcb,0xf5,0x3b,0x0,0x3c,0xfa,0xcd,0xcb,0x71,0xd8,0xf,0x88, +0x75,0xb6,0x4d,0xaa,0xab,0x9b,0xcb,0xd,0x3e,0xf2,0x1b,0xcf,0x4a,0x15,0xe1,0x52, +0xb9,0xf3,0xeb,0xd9,0xfa,0x31,0x4c,0xed,0x71,0xdc,0x1b,0x88,0x95,0xc4,0x65,0xaa, +0xeb,0x37,0x37,0x81,0xe1,0xc4,0x63,0x1a,0xf0,0x11,0xdc,0x8e,0x8c,0xd1,0x12,0xf8, +0xbf,0xd9,0xe3,0x6b,0x10,0x6b,0x7f,0x78,0x79,0xd6,0x19,0x88,0xc7,0x1,0x2e,0x78, +0xad,0x74,0xc6,0xfb,0x6e,0x7c,0x26,0x8e,0xea,0x8,0x52,0x37,0x9,0x53,0x2f,0x82, +0x49,0x3b,0x41,0x7d,0xc7,0xeb,0xb8,0x79,0x42,0x72,0x9b,0xbe,0xcb,0x81,0xff,0xbc, +0x2f,0x70,0xc9,0x5c,0x36,0x67,0x3a,0x10,0x53,0x8c,0x8b,0xb,0xb8,0x52,0x7,0x26, +0x73,0x2,0xc1,0x63,0xa9,0x0,0xe9,0xc7,0x30,0xdb,0x92,0xbf,0xee,0xd,0x5c,0xc1, +0x7b,0xc1,0xbf,0xac,0x0,0x62,0x12,0x35,0x83,0xdb,0xf8,0xef,0x21,0x46,0x9f,0x13, +0x96,0xcc,0xb,0x61,0xb8,0xbe,0x25,0xe4,0xa,0x80,0x1f,0xdd,0x1b,0x1a,0x88,0x6e, +0x2e,0x86,0x48,0x15,0x1,0x70,0xa9,0x2,0x37,0x14,0x80,0xe3,0xe1,0x81,0xd8,0xc4, +0x99,0xc0,0x6f,0xf1,0x29,0x4b,0x12,0x15,0xb8,0x2,0x7f,0x94,0x1e,0x7f,0xf4,0x49, +0xd7,0x59,0x9a,0xf0,0x2,0xbb,0x9b,0x3,0xb1,0x67,0x44,0x16,0xd8,0x39,0x10,0x23, +0x47,0x4,0x57,0x98,0x1c,0xb1,0x4,0xf,0x5d,0x2d,0xc,0xff,0x18,0x1f,0x2b,0xb6, +0xfe,0xa4,0xab,0xe1,0xb7,0x1,0xb3,0x31,0xa4,0x6f,0xb0,0x64,0xfc,0x4b,0x5,0x18, +0x41,0xfc,0x62,0xe7,0xeb,0xce,0xae,0x4d,0x5,0xe2,0x2c,0x55,0x81,0xea,0x2c,0x3d, +0x3,0xb3,0x38,0xb1,0x7,0x70,0xde,0xd4,0x5f,0x81,0x65,0x2f,0xe4,0x9a,0x5,0xc4, +0x42,0x18,0x43,0x74,0x0,0xf3,0x34,0xe0,0xcb,0x7,0x1e,0x18,0xbd,0x1f,0xf1,0x43, +0x91,0xa9,0x41,0xa9,0xcc,0x60,0xd2,0xb8,0x2b,0xf8,0x54,0x1,0xc4,0x2,0x36,0x81, +0x14,0x23,0x39,0x83,0xa8,0xf,0xc0,0x89,0x9d,0x7b,0x9a,0xb4,0xe4,0x69,0x76,0x0, +0x5e,0xc2,0x2c,0x55,0x80,0x14,0x80,0x4,0x80,0x89,0x4,0x6e,0xf1,0xa5,0x3b,0x0, +0x17,0x0,0x9c,0x2e,0x14,0xc9,0x4,0x1,0x18,0x80,0x24,0xed,0x55,0x2d,0xde,0x5b, +0x78,0xda,0x1d,0x48,0x20,0x91,0xd9,0xe8,0xc7,0x3b,0xa3,0x59,0xf0,0xeb,0xb4,0x8, +0xc3,0xff,0x92,0x72,0xcd,0xeb,0x47,0x6,0x4,0xa7,0xb9,0x49,0x82,0xb2,0x20,0x15, +0xc0,0x53,0x46,0x42,0x88,0x16,0xe1,0x72,0x0,0x60,0x92,0x55,0xe9,0x63,0x8,0xc0, +0xe0,0xc7,0x16,0xf2,0x8b,0xd1,0x9b,0xba,0x31,0x7,0xa6,0xd6,0x5b,0x90,0x39,0x46, +0xe0,0xc7,0xcf,0x87,0x0,0x86,0x2,0xba,0x4,0x1f,0x36,0x9f,0x79,0xfc,0x8,0x6b, +0x3c,0x8b,0x1c,0x2d,0xe0,0x7c,0xc6,0x4b,0x93,0xf4,0x18,0xcc,0xc3,0xbb,0x80,0xf7, +0x10,0x76,0x98,0x88,0x68,0xc0,0x56,0x73,0xf0,0xa5,0xf3,0x29,0x3f,0x6e,0x19,0x37, +0x4e,0xe0,0x67,0x47,0x17,0x2,0x78,0xe6,0x8,0x21,0x34,0x88,0x1d,0xe2,0xa6,0x5, +0x4c,0x7c,0x57,0xb,0x0,0x2e,0xa6,0x1c,0x8e,0xd,0xce,0x8,0xce,0xe4,0x5a,0x8, +0xb0,0x48,0x44,0x8d,0x21,0x5c,0x9b,0x68,0x21,0xce,0x80,0x32,0xfe,0x71,0x28,0x46, +0x3c,0xe,0x14,0x41,0x38,0xdb,0xec,0xbe,0x23,0x50,0xde,0xc3,0xc,0x98,0xca,0x2b, +0xe6,0x60,0xaf,0x0,0x76,0xbb,0x42,0xc2,0xab,0xbf,0x51,0x6d,0x19,0x5f,0xde,0xbf, +0xc,0x98,0x5d,0x31,0xde,0xea,0x6c,0xc,0x11,0xd8,0x6d,0xc,0x13,0x5e,0xdf,0x9e, +0xd4,0x2e,0x54,0xc8,0xfb,0xb7,0xbc,0x84,0x59,0xea,0x7a,0xf9,0x8c,0xc1,0xf3,0x2c, +0xb2,0x59,0xa,0xc0,0x8e,0xb3,0xb4,0xe9,0xa,0xe5,0xfd,0x8b,0xef,0x81,0x7a,0xba, +0xe7,0x15,0x33,0xe6,0x9c,0xf1,0xbc,0x34,0xe0,0x9d,0x45,0xdd,0xed,0xb0,0xe1,0x4b, +0xc4,0xa0,0x25,0xf,0x3c,0x16,0xe3,0xb2,0x67,0x36,0x63,0xa2,0xdc,0xd3,0x70,0x60, +0x57,0x4f,0xd3,0xf0,0x12,0xf7,0x90,0x80,0x10,0x4d,0x1e,0x6,0xf2,0x8a,0xf9,0x55, +0x67,0xbe,0x94,0x3,0x3b,0xfa,0xd2,0x48,0x34,0x5d,0xd5,0xa6,0x8,0x99,0x6f,0xc9, +0xbe,0xc5,0x17,0x50,0xba,0x53,0x3c,0x9c,0x88,0xa6,0x2b,0x7b,0x7b,0x5e,0x5a,0xbc, +0xf2,0xbc,0x74,0x17,0x60,0xd3,0x15,0xee,0x27,0x0,0xb7,0xbe,0xca,0xd7,0x29,0xd7, +0x94,0x84,0x59,0x48,0x9f,0x61,0x6f,0x6,0x4,0x2e,0x59,0xe9,0x61,0x7,0x62,0xfe, +0xa6,0x72,0x34,0xc5,0x63,0x79,0xcc,0x67,0x29,0x3f,0x96,0xa6,0xd6,0x17,0x52,0xb0, +0x3d,0x8a,0x59,0x5b,0x28,0xe,0xcb,0x41,0x13,0x9c,0x82,0x59,0x3c,0xb4,0xc4,0x89, +0x59,0xae,0x70,0x3a,0x84,0xbb,0xf,0xf3,0x44,0x98,0x9f,0x93,0x5a,0xeb,0xb,0x79, +0xbd,0xd4,0x5d,0x8,0xdf,0x19,0x8,0xe8,0x34,0xa,0xd9,0x21,0xd6,0x4b,0x8b,0x50, +0xc5,0x81,0x63,0x67,0x80,0x2b,0xe4,0xa9,0xbe,0xb3,0x10,0x97,0xe1,0x89,0x86,0x80, +0x4b,0x98,0xd3,0x7,0x30,0xcd,0x22,0x79,0xd5,0xe7,0x12,0x98,0xba,0x3,0x8c,0x61, +0xf2,0x4,0x2b,0x51,0x8b,0xdc,0x7f,0xe2,0x5d,0x58,0xdc,0x7,0xe0,0x38,0x50,0x43, +0x15,0x97,0xdc,0xa9,0x37,0x4,0x10,0x6b,0x6d,0x58,0x2c,0x9d,0x89,0x1,0x7c,0x89, +0x35,0x1a,0xf0,0x3a,0x7,0x69,0xa0,0x86,0x2a,0x1,0xf4,0x87,0x2,0x62,0xed,0x52, +0x46,0xd8,0x5,0x3e,0x9a,0x43,0x2,0x59,0x36,0x6b,0x5c,0x9,0xc,0x7e,0xb4,0x40, +0x2c,0x96,0xa,0x87,0xcd,0x16,0xe0,0x56,0x97,0x19,0x30,0xcb,0xa8,0x1c,0x39,0x69, +0x6,0x3,0x52,0x71,0x19,0x38,0x55,0x17,0x60,0xfd,0x31,0x2,0xcf,0x64,0x12,0xc3, +0x8f,0xed,0xed,0x6c,0x87,0xd,0xc0,0x70,0x2e,0xe7,0xbb,0xcb,0xb3,0xd1,0x5,0x4e, +0xc9,0x43,0x9f,0x1d,0x8e,0x3,0x7e,0x9a,0x1c,0x4f,0x5a,0xe3,0x21,0x81,0xc1,0x5, +0x40,0x5d,0xe9,0x49,0xa7,0x6c,0x91,0xe0,0xb2,0x10,0x48,0xee,0x23,0xc5,0x8b,0x92, +0x1,0x81,0x24,0xb8,0x84,0xb,0x29,0xe2,0xe1,0x82,0x60,0x6e,0x18,0x2,0x30,0xdc, +0x4f,0xb4,0xa0,0xc1,0x14,0x2e,0xa4,0x88,0x13,0xb,0x34,0x3c,0x6c,0xf,0x3c,0xda, +0x73,0x78,0xba,0xf3,0x78,0x18,0xf3,0xdb,0xa9,0xcf,0xfb,0x89,0x1c,0x43,0x4b,0x9a, +0xc5,0xb0,0x40,0xf8,0xec,0x45,0x52,0x2,0x8e,0xb,0x60,0x58,0x7a,0x54,0xcf,0x8e, +0x63,0xe8,0x73,0x47,0x33,0x7,0x7d,0x28,0x3a,0x2f,0x19,0xef,0xbc,0xb4,0x4,0x10, +0x5b,0x3d,0xd1,0x2d,0x24,0xfe,0xa0,0x40,0x54,0x50,0x33,0x4f,0x5,0xa6,0xf7,0x8f, +0x39,0x90,0x3a,0xb1,0x88,0xfe,0x1e,0x1b,0xcc,0x2c,0x3c,0xf6,0x7b,0x54,0x50,0xa0, +0xf,0x71,0x7f,0x56,0xc4,0x1b,0x59,0xc3,0xf4,0xe4,0x50,0x0,0xff,0x92,0x88,0x83, +0xde,0x1c,0x36,0x94,0xa7,0x81,0xbc,0x14,0x1f,0x86,0xb7,0x4,0x31,0x83,0x5b,0xde, +0x2e,0xc1,0x34,0x70,0x65,0x26,0xb8,0x1f,0x72,0xf5,0xf4,0x84,0x14,0xe9,0xc7,0xee, +0x40,0xc8,0xd7,0x36,0x58,0x2f,0x5,0x27,0x9d,0x0,0x10,0x37,0xf5,0x4d,0x1,0x8a, +0x6b,0x4f,0xc1,0x6f,0x5,0x70,0x74,0xda,0x5d,0x1f,0xb6,0x3,0xe1,0xc7,0x4f,0xdc, +0x12,0x30,0x12,0xc0,0xd3,0xa3,0x42,0x33,0xe,0x7,0x44,0xa7,0x5d,0x6,0xc2,0x25, +0xb9,0x30,0x86,0xe3,0x83,0x22,0x7d,0x1b,0xe,0x98,0xe0,0x99,0xce,0x9e,0x6,0xf4, +0xc0,0xf2,0x2e,0x0,0x78,0x62,0x29,0x95,0x86,0xc1,0x80,0x44,0x74,0x43,0xab,0x40, +0x6c,0x1c,0x98,0x11,0xb9,0x6,0x2c,0xd3,0xb7,0xe1,0x66,0x29,0x6,0x60,0xcb,0x57, +0x81,0xc,0x81,0x4b,0x61,0xf8,0xb2,0x98,0x33,0x84,0x1d,0xca,0xc6,0x81,0x95,0xcc, +0x11,0x95,0x12,0x34,0x98,0x87,0x58,0x3f,0xe4,0x22,0x88,0x30,0xc6,0x86,0xd0,0x16, +0xbc,0x35,0x42,0x91,0xe2,0x2a,0x70,0x3f,0xf1,0xf0,0xae,0x81,0xdf,0x5b,0x3c,0xfc, +0x1e,0x80,0x59,0xe1,0x52,0xbd,0xdf,0x79,0x12,0xc5,0x8b,0xec,0xf7,0xbc,0xbb,0x3, +0xd2,0xae,0xcb,0x8,0xdb,0x27,0x8d,0x9d,0xa9,0x47,0x1,0xc4,0xe7,0xc,0xc6,0x59, +0x5d,0x4d,0x49,0x13,0x4b,0xb,0x96,0xbb,0xd8,0x21,0x63,0xfc,0x29,0x1b,0x12,0x18, +0xbb,0xfc,0xe1,0x4a,0xe2,0xfc,0x51,0x5,0x38,0x4a,0x40,0xd9,0xd,0x61,0xf8,0x89, +0xdc,0xd0,0x91,0x1,0xf9,0x86,0xe,0x47,0x1a,0xbb,0x2,0x4c,0x8,0xa8,0x82,0x21, +0xc,0x3f,0x81,0x94,0x3e,0x21,0x21,0x5f,0x99,0xc1,0x4e,0x85,0x39,0x5c,0xc5,0x25, +0xe8,0xb,0x2c,0xe6,0x89,0xfd,0x32,0xa2,0x12,0x35,0x1c,0x10,0x7c,0x26,0x36,0x30, +0x65,0xc0,0x5,0x7c,0xe8,0x74,0xc5,0x98,0x3f,0xff,0xa9,0x1,0x9,0xa4,0xfb,0x9, +0x8a,0x99,0x2,0xc8,0x2e,0xe0,0xff,0x5f,0xc2,0x18,0x7a,0x30,0x86,0x4f,0x6,0x9b, +0x34,0x12,0x48,0xfd,0x5,0x24,0x9f,0x3a,0x10,0xfb,0x4b,0x65,0x3f,0xd,0xb1,0xa2, +0xa1,0xe4,0x9a,0x4,0xa6,0x0,0xa4,0x25,0x20,0xf6,0x97,0xca,0x7e,0x1a,0x6a,0xcf, +0x7,0x32,0xfc,0x6c,0x49,0x16,0x9b,0xde,0x52,0x5f,0x5b,0x3,0xe6,0xfd,0xa5,0xb2, +0x9f,0x26,0x75,0x16,0x3,0xb9,0xb6,0x1c,0x78,0x57,0xe1,0xe9,0xce,0x81,0x3f,0xe4, +0x7a,0xe9,0xb0,0xfa,0xb0,0xad,0x5e,0x3a,0x98,0x3e,0x54,0x15,0x70,0x49,0xac,0xa4, +0x2e,0x2b,0xca,0x6d,0x83,0xe9,0xc3,0x42,0xb6,0x15,0x7,0x57,0x65,0x2f,0xa5,0x5e, +0x3a,0x9c,0x3e,0xcc,0x3,0xb1,0x5f,0x9c,0xa4,0x9c,0xcf,0x58,0x56,0x54,0xbf,0x6, +0xd3,0x87,0xf9,0xcb,0xcd,0xca,0xb8,0xa5,0xab,0xe,0xb3,0x85,0x9a,0x81,0xf4,0x61, +0xfe,0xba,0xa8,0x5e,0x42,0xbe,0xac,0x17,0xe,0xa8,0xf,0xf3,0xd7,0xac,0x66,0xd6, +0x28,0x6b,0x89,0x83,0xe9,0xc3,0xef,0xf,0x98,0xad,0x3e,0x97,0x6f,0xb3,0x1c,0xdb, +0xc1,0x4,0x69,0x31,0x43,0x6a,0x2e,0x61,0xa6,0x8c,0xed,0x50,0x82,0xb4,0x62,0xe6, +0xba,0x78,0x2c,0xa6,0xe8,0x50,0x82,0x54,0xb3,0xb,0x56,0x2,0x16,0x5,0xda,0xe1, +0x4,0xa9,0x61,0xaa,0x3f,0x9c,0x20,0xfd,0xff,0x49,0xae,0x7d,0xf,0xfa,0xb0,0x7c, +0x38,0x3a,0x46,0xdf,0x73,0x30,0x7,0x47,0x8e,0xa1,0x35,0xb4,0x3e,0x2c,0x1f,0xff, +0x8e,0x40,0xdc,0x16,0x6f,0x2b,0xa2,0x74,0x50,0x60,0xe9,0x80,0xfb,0x22,0xd5,0x17, +0xc0,0x61,0x12,0x61,0xd,0xe8,0x57,0x81,0x7,0x8f,0x18,0x7d,0x74,0x2a,0x80,0xce, +0xd0,0x76,0xf8,0xd2,0x9b,0x56,0x80,0xc7,0xa7,0xa2,0x9a,0x88,0xc0,0xd9,0x90,0x76, +0x88,0xea,0x69,0xe1,0xea,0x86,0xff,0x5a,0xc0,0x38,0x70,0x7c,0x20,0x24,0x77,0x3c, +0x38,0x70,0xae,0x3,0x27,0x12,0x78,0x66,0x9,0x60,0xf2,0x74,0x68,0xe0,0x52,0x7, +0x46,0x12,0x18,0x4a,0x20,0x79,0x3c,0x64,0xd6,0x6,0xfa,0x70,0x9e,0x78,0xe5,0x10, +0x29,0xba,0x2f,0x27,0xf0,0x3b,0x8c,0xe1,0x78,0xc8,0x59,0x8a,0xfa,0xb0,0xfc,0xdc, +0x7,0x12,0xe4,0xfd,0xa5,0x68,0xfc,0xc3,0x9a,0x5,0xea,0xc3,0xb2,0xe1,0x63,0xca, +0xed,0x2d,0xe1,0x9f,0x62,0x2e,0x4a,0x7,0x36,0x7c,0xbf,0xde,0xb5,0x71,0x71,0x2a, +0x37,0x79,0xc,0xec,0xda,0x5e,0x85,0xa7,0x81,0x81,0x24,0xad,0xee,0xb7,0x98,0x14, +0x65,0xb0,0xce,0x3d,0xc2,0x3f,0x42,0xa0,0x33,0xb0,0x59,0x60,0x2b,0x49,0x79,0x47, +0x9,0x3f,0xdb,0xc9,0xe6,0xeb,0x16,0x9d,0x1b,0xcb,0xd,0x24,0x77,0xb6,0xc1,0x43, +0x91,0x16,0x24,0xcc,0x1a,0xcb,0x49,0x18,0x83,0xa7,0x9b,0xd,0x8,0x2c,0xb6,0x3f, +0x28,0x76,0x8f,0x8d,0x74,0xa2,0xb1,0x1c,0xdb,0xe8,0x86,0xea,0xdc,0x33,0x4,0x76, +0xec,0x82,0x7e,0x5,0xbc,0x7b,0x60,0xdd,0x2c,0xdd,0x2b,0x10,0x77,0x76,0x95,0xe2, +0xa1,0x56,0x82,0x1e,0x6c,0xdd,0x22,0xf7,0x34,0xb8,0x9b,0x44,0x8f,0x87,0x3f,0x31, +0xe0,0xab,0x0,0x3c,0x7c,0x0,0x76,0xb1,0x53,0x81,0x95,0x33,0x6f,0x7e,0x4e,0xa9, +0x25,0x3f,0xc8,0x1e,0x12,0x98,0x38,0xe2,0x20,0x31,0x2d,0x3c,0x81,0x95,0xe0,0xd1, +0x5a,0x56,0xc8,0xcf,0x1c,0x33,0xf9,0xb0,0x2e,0xa9,0xbe,0x68,0xda,0xd1,0xbe,0x39, +0x3b,0x59,0xcd,0xaf,0x9b,0xc4,0xbb,0x7a,0x9a,0x4,0x72,0xcf,0xa4,0x54,0x6a,0xbb, +0x84,0x24,0x18,0x80,0x27,0x72,0x2b,0xd4,0x78,0x48,0x20,0x6e,0x2e,0x2e,0x6d,0xc5, +0x4d,0x83,0x5,0xbc,0x45,0x43,0x11,0x61,0xfe,0x40,0xbd,0x89,0xaf,0x80,0xaf,0x80, +0x3b,0x49,0xee,0xad,0x75,0x9a,0x7d,0x44,0x8b,0x9f,0x3e,0xf0,0x55,0x3c,0x7c,0x5, +0x7c,0x5,0x7c,0x5,0x7c,0x5,0x7c,0x5,0x7c,0x5,0x7c,0x5,0x7c,0x5,0x2c,0x80, +0x7f,0xf,0x8f,0x5b,0x9c,0x1e,0xf,0x3e,0xf1,0xfb,0x0,0x0,0x0,0x0,0x49,0x45, +0x4e,0x44,0xae,0x42,0x60,0x82 +}; +//brd_wiznet.png: 13702 bytes diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/favicon.ico b/11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f63da062eae75ac7da2e0ed4df6c946fd24ae0c2 GIT binary patch literal 1662 zcmeH`Jxc>Y5QgU<3P#b4hWJ4&lpvDoQuqT7EJQ6L7FI&+tkhl`I}uaZ2zEv!>Vic; zYfWKg73&nyUy$@coY}dLy}P8)#>Nf1*?VT@-JQ8P0E>RMouV}XyMq8309d4H(=5?s z?u`}N@JzWNH=l#Eiv+yAmtkugK|QU3vpfmyb`$mwhv5130GgkV(EaK{X>SD9H`8!= zy8wkk7LHC5png57<@9Mh_!{-dL@X7-w1x};##zH~uf3NBYWzPF82GWJ6R*=Q?-^Ld zEeBW_C>a=_hPWyLI428jph|)$urHK&`L6{^qL_tMVdI^X~ zC-f>45do>8g&-{;gwR4DA)QHH?(h5FdwCio7z>+0fmz+Oy@_IlYdk}c5*N}*uyJ@xc-~5t=ZKxIBs}}04p7=UF*y&bM{6PgH znO~;bX@C+dnOkbVimLkS6WF74XN&s4z&4c0xuF9ORYW7Va+jHZxxX*nB&KLZ&CS2s zm-maf1mvw<$eZc+TpRBwAAPi5kv3#Ux90d37&UGjJp-}wkze#H8Il?tfB0h#Nuyk2lVK?%X?q7-k^e0r3{ z2!-cW-~&`+lB|NiRQdZ=%M9GJQTu86iFQ(|6|`j}Uqx(7)2Wm@uJu0(eT2zUcW`1! zq=s}Vz4-9UzkOzS$K6k)xtp_Lqk-KbGGby5fBo`kn0n_j{Iipk(K*=cQfQRsegs30 zHGe6RORg7`9ET3Da6ei={DC~&;89ZOnf;*BZNmYr$wi$N%;a)(q4VO5&A84-=M`-K zjq6K-k3xs}D~j$vgigM!9Qjl<*SM78_@3!m@|o)1aL(2^*rwLMcSQ7hOH#r0_W|(b zYYV6LFgz1lR@3L z8-9vdulALvT4e4ku1Eaw*d~2B*m@_X0Ds#2ctrTb&Q{|ic%_O z+{X7T@9fb#Yf^~l0y=A&X2NUfPHz?}J_nP-LgjkS(&|)XMQSBYe)xs?AVIA=CGIaPEr2PkIGGj|y;b^yiDf0g32{O^E%axt6&0 zC$eJNvCZ!*(2QrRgeG=$!8$jIGW%Va?*tx@l4VT&1(H4*$ z<(}B!8)6E5;3IW?21W_$xnC0Z`4aydx8m|PhB#fik6kw1f$zf%Wt7+*miD*NjQ6Vg zBnZ0j(RR6(KD$Q+zPiA~QRu{0Z@lnfcJP6jI|Bq$NM==qzV&OmcBD({`gY6RX+6)! zKsjSymmhx7+WJ0ez9!>iF6Zr0aN4}m=bG?#2{DgVW4xnnz-Gtnzy^kKqe!x3KoE8f z^H7?kEV{EW?Nd2z{FpEzAppbDc45_4M|t!+#EN1hNLh7F@^p~0L$F*xojZS!!SaxA zAEU(f)Ch_dMV39h@(8%EQG3aKTr*vlv)~$bi@|J)2lgMD{-7=1~c8KIJ zQ_HvT8vk7Ybb4^f`SZA6bJp4lGv%52ewgd0R|Y(#PLaYK7$dz?BzjD^ROt_?h?_YZ_7EQh;f`Pq?i6N3JoYldR7KxQ?~;>Nr#98}IxwHguy4e8F`9CuhUkb}XHQ zqHe6~azsXtkC;BY+wGMF-DAw}upofx`Fk+*ftPNa{jTUy8C&&U6yl(u<35jeA86s9 zo#Km3yGP+qk&IwJfYGc`RVq?pbAd)wuui{HlxyqlGM#ESI0U&*#S zi9pb@-1BeDvO&K-juiPdpgWBGG?Z!0tqewH06sVBkI&RQN$KpdDWMdN%xY`) zZ}-rKUQlv;@OztuT#|cU*G=^G8)+7Z%KfRM&EN!8N0;=a7m`t2pi-eUK~IXh{4i1Q znD8l)^K8TuvLBahxq;5y+)ZHphR}yd<-GouesZHH=Iv&-{_-ur@_xAa<-Yb1>qCt0 zS<;ov%W~&*`8@;F>y@mE*|JZJ`#?e#?3;zuKA(7|uRQ3kT> z@u`hDuvY|K7sV~)lfJXZG}5&Z#b}}+p!z%)i&>CH`G!R{;T(fzc#uQ zKKTIe6^BDs&pC?rfm+ZihJsW1k2F8SWie)Q#|QO+!J0=#6tr1jzy;4I3zKC8i-3hT zZ$k!ppfwW*2=Py=7}N->eVP%Io>^$|luCdIILKRVYy0vMdQVD9ZAc_(WLsMcJ*i^9 z`#0Q6gcd*JD7Cd7SEZ48p`ck(>b`Y!m0k6++1DpSaz|8WdAaYo8h?0eyeRg z{8hJmAV<-IzUk8@z+D)5;->WRtJNQt`G1k9IAVU{ zm^p(_EoQS?RQ{AP2I*Y3#)E$JZ9lIMZP74)dT!lP`m+!9WhA`3Oo?11Ghb(YX^~{_ zjrV~1Zo$5S(U4SP{j#i3j$`;B<=nWEewNi{BFh-Mz0~&C*~6u{m&+}nI1*yzT)2kV zttNuQV!c=f?u#Xtei${~^}=o$DULk1n1{duN>j<3DDe9JXuSOIV)u`}B|GOv`WCr1 zeZHrtSep19PFv*W?K=dyKj1~qA0X8Mv9NUp1@3Jt=H17P-UQXlmHZ~=&3QtvxTUW; zi+a&7O?_LiD{?-+!?|3BNflW;N)WB?iyOP%g1(!Ge?0b{B<_1u7kKVa9-?hGMbt-q zy%_F#|H&OueYUSq+=i*8D>GHm7rYn=@5$o(IduAmUjgX-WYA_|f%+}H-VD0sB=*1r zhktobP(8%>&W#jS)pPw0F^UgS=e-i@(<#SJ?%Q_|h(&L#Gxqzw_{EF^8t8DA-hnOG zBfs%*80nV5UQI)S+>F5s=Y-iI3-f?uLaE+cbxFp4lEfyERCre$=Sz}*2x}M2M}N|) zrd!l<-}q`1HSbcVd#%G81$l-_QICi-i7<)*UsHLhRp3l2Z4Gu(5KX` zNHTHT@a0$N!bJ0{`I`&@l0%?B7^TTr229<)e2j{a6S) zSh(0EOf~p_f1LD=v%{Vg7wd<-@@?7foCk!)9MvyXOiy4acsYYVy>K_0ybOP?3N0vc zidXfZI=awHyJu>h30qLRblMea_6>B;5wtJ6z1@;Xt)edpE*MJeXCbuCys zjnabqqPKrj2=eJBtWL<|G`jyD*B5wx?o}y!{HZ1Y^Irrqb}?qMuej`k zhQZ)R$V1aQ)gM% zXu3{LVrDliL`3$Y4+D`9w5qIl8jGVmuA9^T9qS_Q26w)b zsMz$#m)?@JG+MD`N+wbaEIHbVS91&t!p9^A%XTN9gF4PkB317%F8QlhV*Zyqo?qq%S;6sfxY}s)!gO>!g+P1R*5i0)!CgFMkb(1_WqeMW zJPj$<4_K60NwafaTzQ`=N)TtIv$6|@dE!~(YG7u*mZ_J11#AP;Hi|<_knXW)BK%{a zZZokFc??`2na?ZcUl$7;B0a$?OPpEJP?we|aC^`=f0jz`mIVWp3nR6=ya^rnvTdgF zjAQ}z(6k_a!?kfkgO)rXZLUKko@%aoc&&<%l0;U%{TMb#QP6p3NwLJHnwZQ0W-Gao z?0&?ATz!DJW9|u$X4>t*fNbvwDbT#04$17s?$6uDvOVD!Ur@kpcl~nc*~cEhSy~M4 zWM_$g#FO*83qfd6y}@{2`n)^e@G!6qK>z3*{Wz)fjXTL)QETiccNf2&wQ$3H9XEWB zyYv0ko(a*}Jkl~ZfO4o5wI682F8wD5sN+SlrN-E_3p~el0~FH@+s6&>w^jH~W6$IB zsIlYH$_YV4tT;3VZRQN&o#bYOygaXKq@Thw7{~~efrk&{CswNJFsy}7DifR1=fI{G z(60^rbhVt5)|a~rdVHW;|BN6paSF{o9#+&-rUR{beMCMomzX}M&GrvErN`9j#_vtR zz14+0ld?Ba=Sp_&j>9bucy3-R6VQi~1E_>pw%i$7R(S6VEtiI%E_ zgXleP`frb-e)8>hFn0TW*R?inph=yIn!ZZPyMmodp0mLdz>pXE@0j7d?F}f@3_9s5 zU01hm{quf~UvoN*EV-5Xvk_}LBif!6Ud-QnO3#Thvp6a~$^uHB>+-XklWz`>WkbyW z40u*YpA|=*v-*r@pY!1|Do<@!EB1*p8(c0;USlH8Y5+edY`XQE5k1={MLE^w-Avw) znyOmX;)KEzPiaFMGi_Ml9{R^Lpc=3<4tG`Xma?{WZaFjiS}LKAOLLu(dA*=xG~ly` zo?9(*SAhTSm{Jk+Y@J#w_Uolov7`+=4AT$b+vbHwqYyjhM{Iod2kcd`fNF~G4 zmp>$thcT~}rm*{I@J=#RGjF3bjXlTT##l^_Blp5r^l7jO+2@1#uJcnKK_4VEGmx8>>~rfd0S-+he((oB(X2ELh%Y!r0@E-D zie&vOX7(Ml`h?4B-Gi8bi8icNZN6;hABpbN+#9TBhfpPAZ2~#j6u8MZ{7nL4zAX$c zF1Cyq0Rh8&6Q1TnR z4o+eHHhB|1?64yyOBecY=UE+@K7IOs=MPg*$#TnL*#+Sw^JPy4UEOhWVk*IJZ47x6 z0r(+WM}$}LCYdpb+0{{ll;Y+*iKbc$7Q+RQOGk0Kq(N=ar6JZj5UAaBQ1Vk zq5LJ|NbE3gI1o&tG9n$siiz8>K|i*;HR|PYjK)}4hdfwX9P8ly7;cI|Uf(Wtev2%^ z-%=d?#=3Ukb+jehyNwBH(xd=zskE%2SvZ1T+vqPSn7y`vqw~PR19KcXkVK&doL)?F zO^eysNRKjulC9K8^RGlbll$Ek=eo&pRcn>U4JA(sVk)eHPA~S&KMP)~gzsA%=D{z# zOo1o()Rj%0>3nyI&fn!y(W$k6buQV#FYF%^-1q*}FG)nRC5~Flrm<}-6%+I?eqA<2 z1pb)T_@%%he{m}cxI6R7av#YdZe$gK&<>$*y+SL;;x6&F9j$_Y@-#PJS zi3!&C-O+jtr{`WcKecMcnkH|V(MxS-hyIn8W(r=3kn4s2FiM@i$WC^Yqrdr^@Ux>v zy6FB~@KimT&3mz(6TRN})D*V&CZ!OKT`7!=ji3W{+>W#7U^Ua}(?(Vc8PnuWal$An zloeJkYl5}cJ8Y$*c311QfQ0>pQE;=alMG;3msSf;ho;QQCbLYagGQ>{7yCtS_#b|Ni;lmkFJImGW zEguUqF04EK-l_xt&Whe-)Q_4G$F3iZ_b#%6?uc4|KJk=EtFU2kL(Jr=Ai}>D)Lm}Y zX+3NYbj7c1d3Eo^&sZp*uhNL0agm7ljaoVZ0{*&E*;YrmX%4P*6A##js*MGF!wIC@ zu1a;;76Xc9%WHdpaYe7yn$fXwB@v6j-BamBV3RTxA|#@R`0;(h4b*fx`E%oEx;#;N zJbOV3h|xma_ussc50bDm4MI}GcaW)zdD&kdRPi^LqPFQ0*kGK4K6AS$BtTqOAsZg| z%y=Mb)8cq;bXlPfn1J=I?oFdQV^ul_F&S$@)P~0l>C!T%z;|DTx$&l#rFdGt!1QG3 z#Bc1tsI-$EABEHNMXt0bnm76}qx68KL;QIUrd~6aI^fz({^i-5wVPs?dO0PTgUU)u zyr#HpI|`__D`=yfnMOE3c(TG0R_~$Z*#Egu(w9M7UtU)*)7`sKDpt1Nlc6OfxAzD8L`N0_8hXvTf2-UbUlj;B z>t&*n54G|XypiVmPh~ytcn(}nP2bTfY{aV_m%W*od*jRB{q^&YGMx164{jQf@M`qh zt&7NSsq{PlvD$H^NfPP&jA;Y8Ip4Z{YV;g`T@^e7F7M=^>gGGnL5)J%Q=4pe-YO*; zs~o+*7@QQcE{tANDUU0VM;`K7K>ZFR`mB(~&x2b-tt8oM_j^1Thw+c)X3f#XGH2;8 zH;8__C_nJH2h`NAe}=bG^Dy%IC^LEw`0}h7)CiuRPH!=W^&{$mO#959d*Z9dNxGh( z-VjXw*YWVJm4Wh*R62QlJf16vKFFi(4$jYCb+4P;%eYW3^LWJ>n6B+^!Zth-tsGh^ zlYIC+C|CI0?3)ePl{&-_q@fuj{E2wytR$QL57>aYa^^iJcL|Wd-)S3nVY0uBXA^Eu zDa04_0F9>(A=gl`q4!ya{S6efb1r35*B!|BJ4Kjb-FpY^%*swbEu@E4$UMT~u)`Lf zgZn(BtluXUYZJfsFy(cND}Xc-{MX;)tO??CO6Bc0R9mq8s6_G(3;DrO@mRn#Ij8x> z4a2m)mJ~MQ>+$MM`(-`mhXHMA*oF79C*!g}#VjHsCy)xQs}-Ba$3}2%zR&NyB;D;n zI9b43<&IE3Cg)l4OFoL9u5BnovL(#1?0eaUo6DC}}0F!Uken;oou^R>{qC03bp19(=PtF-BfAB)elAH2n$rWfF zL&1DvGaTRS%BL2hDN8mRiZ`u3OnG#l5#Hp)kU7i}9no~r*|Qog^V-DCp^zZn68^#V zWhx!?=|N|y(me#SFFC~eF6RS9k}%PTU4Y#9VJ^i-JUf)DX_Ra&Qnn}_&Wj{Joz&s7Fbba%s7`CR$xzM# z(>USR-Cy5B?~jrNGAMVYZKI-l4#;h2Q%V57>>^_+QMR{!zRvBe{3p2M4ouU~BZWpG z?yx@5FJ$)PzLqfzg*TzXHp&XQsNRw2myt9z9fz|!`^cdaj6YMg?frz#gcLYg1dnCg zO1w#y{`@d* zKNqdg>ts^Q$O5rV8Z|0Jo7XQU56PGI&PkUESfLe!R4XL$zNDRG{14Iu*0UlA#6$Aj zsUl(YU(xgWvY2T=QcMfFC5huitwvT}Q|0e&;0O!48YHfVf!3OaK5}CpVz8qhx9K|N zY9MmK`*w*23fS2vH)zp1N=chJ;#6NSeOeK(t`hKlX8YaEeick(4>d}%PrFIJQH>bm zZF`V^+!tEKH9tVjeCT+c#E>D{Fyq@z{w_8U!S;uklI#gIJ8Y@gL*0RqtgUe76RX;= zr6@PzzRDX&!IyN5#uwStq9qB+`fX5fv_gs ze>R@sGnTD%9BKAVVGO4DSO=h&ch_nGjyJ&c?Mp%^iUO?us|83^^!|j&_r#|JIAi?% z#S)&T+T7tErxbvaIvx0L23`k{3P3UB9tdO{T1@z}plPf~tbuhyR{k^(%x?<%FNa7w z#*RmKANrQEfzidTx z-jOQ!L60YeD#cP_?S2}@(!u| z{W5EWSAs0$+E5*lr#5#9UmMFl9!ao}!ss1}k21V>p2>`UDFs@&iE17A$o-^4NZ7hTvqa6tG8=z0(Q(;@y2BW^R^0Jtw_!_x5NBa4 z$KoO81mLk+wm8hW2`|4_F1LA2-NaBOxQC1y@gk37jz+`e=XhK6*6vBAl5btC801S{ z1`sUD;bSex75F4R+cy_5cgHNg>erHrzgLJJ8}aV~6oseaI~hiynia3PJ7j^ck|#q9 zkvH*P)IfU_%tq+l1KboF^s@ToQ?sqjuW-l0#o82V6Sf9Tmtko`zvdEA^{($I|2vHA zxI<`&9ymW8lzDJFkJmx^COmH(i(A8^INSZFj;`a;w7lVZVF3>{C{d#GEM{CUayq-w ze95^2x#k@F4_lo3L2~jUU^5ML&SJhIhFi92omPbEU=rM)Z6{CQ%dj<6L_J?&Fhkoa z;NG$eC6t@5SV&<}{Il>N_}-Xhf!t=!wMVjACRNF-cu$w+e$1m>nC)T!=^;**YY8wV@a~&#zw7ICk*x zxQeC8!b;79+e{u%E~FjacH+5#K+OKiLB1uChob+zp}Gmv(>>ZRS#(L_IF&+vzIVwe zVE3n$@PimKdg_W#Bg=9@Rx^y~uOEyiuRjbpBAT#M{P}yH-J{6R`whmMKKyrfc^l5= zKsB8wsi%L+rCj)H#I;E#f7=4k(s%9&3V5Z`NJrEyWYTett=MN!<&;h)x24&@| zRoqGOg@}wHdE)TXX%` zJ5o|iZ$AOq3h^(L`@Z0||3m1YAbKheT8CD}Vd8Sb+qk=5S?!BQ_sxlp zxc`|eS=A@`mV-yOa1}(wX8%KJv3BtD*`Oa_y$pNx8%**!+8pu@Chyu$2d=n$ipi7( z-tekuBdM)ntUTJ-lfJm;w?(LZpX|%;UZ82=cJM|z=emab%2nt+Chu`QqxLa~Ng+k4 zmVOuF+4QH&`vw1cQeMp9l`-QA)jC>Ntd{)EO{99tiSbmNN8N^eD0S_!2#d0Ua88us z30~tj+_7lMs@0Y9t-ivFV691|RZiJ%JY5p_`dB1s_H?Pa+zuRS8k<=koaS^|USay{b^6`E*xr$RPBVj#QRfm()&Sm&m+!|8~{fKXS53h^Sw@788-(fvl zycbD4#$C7NxLI0a-$DGwCsWuQxR|9fKan`vlgbpmHo>S4@(r8Q+0I%_a}zI^;(s5*OSbk<*7i^)sJKQf=Ev#RQDa5Zs5S}h+ka|nCc42;OUs@T zS3$`bpFWkZ3*3O4JSYuWRt_H#7IW<34Gw&KSsI;OI4C!;femiS4HG7LUAwuo4>Z_?>>0IhfB*>}WhN5@r`N0EI-U8sn0 zW8hgB7-;}JOJEtchPYHCUFSy|+NUKp)I>FrcBQS@{2!fCDs-ra+ z^3`+jrOWTh6*9Ga1&Ij|i#?i;$zu=-C#oXOYLZ~u6a$=uvfAR14nF^{88-uLe3Qso zCR8l&Qe1NaxXg|0*9Quws3wir2gohk638HvfBQ38Ar1CZGZEurQ4`h+*hfax377@M z0+vd25_uW8jpN_;0yP7-Sqhm3fOkL2Ld;ynX>Q=_+@SRRz6N_dEc?Zctbk&^By^LX zIx*JX#Gj6*s}V4R>hC!UJ|y^D8G%slQt`ctlpJNDQ)La~;b%prEz#NHlU?cK*{qAm z8{_=><2Pr4eH&&Zk;morQ>a^S;8hXUe1Y=GD#Bedr4Y27A+3C<_zpp$%a$puT1LC6 zMhjj(d=CxY@zG{ICRhuZ0kTW{U=FJCKIx^0hSzTA%REh!h=#KBS9l|}x;^A#i}$TC z`SO3Pv}q6EH8vu1$QMu!@@$%$uwN!Md=JWIuLxz>J(R_xSaF>|kz}ck)F90-GI7n2 znC8%mkgdoEgLx0}38a6zL1qlHn8kRgn2W~BEU^KF_d>(Ef;}KtD-@qxZo{+2d{}aw zNAqWcb>k`u^j&8tYTf9*rkIRU#tteEr=Bs^ub;^d;hJKOnmkiKAi?Mk_uJo-hs-FV zF4VDd9F1(fWtLiyNPY{)_wtVGxez;anTE5nFIhMveR16!+}DI!eMC0?%XJ3jK?YpV z37ZAL@dYPF zY~V&%ySG5Dp{vN5650nSms_zjGPm+y^QW_~6o7ZTjn70OawPD63;t?P;uQ;+xm7Xc z-|5GjLwv`tnW2wh27lYYS%!hrSRKpnXh`4C4p!^qXDfBsQ|z4Or*=G2q|5yjP*7N$ zR6=l+LTj;p0`N@)TESmpQWfiaeSI$BE(g^lVS(M`L;o#pxKAAUtw68*W7p!BO9&6> zloMV(D;urs8%O^ArcZwUtE#VLF&WY;Fa;F2CXfA9=)ckA8}LvYR`Ir*94?`?>`_03H?DEt)EQ%=f9miS~^2ex-{ zYYPB<3DpDq%)|x=s>M1BC~&M1o0#y9(*B9Og}DbfX$3hqXfX$)Q~wioJEV(S9UefE zIDKH{5V$-lp1jtccvm#TXSb9U41j5p1aW9C#@a{W1LMf;o3T)(y|dUr3qnZx6u0t* zI>#Be-t!{Il}y^OSt!bMKMmZOEzVkNOL?xa2IGs#!?}Q;&qwlG{-68AD^&#kF02&z zBMmzUIFYE*pQ5NIV1Jrc_u{euDxyb$CO69|OO4{qg2myh3`EDrA6_o<%i#JkMa@*N zL}NG*jVOf8dGm`~b6p;?3VGs_r4+ZzJ!PJ33$EfpaxJ$~#pZmzzA}?eUxvyM@1#h> zLTw2qD;M?_$(3vg5gA1U<^t1&xMI+iMoxghF~ctU@@E{1Lmr2hASFawGRkUJ-NTkFzv1<9CF^ln*ha#f)0ya10(Z-}@L+xCJ3W?+8-+^7^!-i>(1wx}7BOOo z^Zg$HI0#-*?C1gvjQp{>xT;kyspda7kw;Aw{eTh6&?K!e%LNkwMpg9oU$%Ut?QNBPaNm25I8du4E0cfpKC0)#m zgwl7pvFuikHTu6jhFb@M2FJB)`dwWo#Onsy;;pW{53h0C@l4<9Yme$sQ#5DTJa~)C zl9aETQZf$m#->wV5P65#Bf!s(3zn_=j?J;0GDl{92xe)%@H|=N*U&C3Gm3ti zOUPdStH(PJG_Ay`2!ry606@hVE^|HWAuLME(C_t*ZakZUMWH+txe7jZbD(I%}DdZ^Fr*-Rm-BVC>B`Xd|e*Lr$r_ z!!Y_9aA@^{SBKnS4_!!ee?n#I9K)LjdNo3Ru@8PP^IDZSI9VdOksNe=-}!;tO6-)n>>hsURqFPdU6;8r24 z^W`&{fnYd#H!^pN-^9bJ)0C3?fYdO$Z)e|=s_#DX%%4%Srh}Cgb_1MtJ(>^|#h%^> zH~0T+8ce^?{|YCq_sHx@NoTIXdrU&_M^c%eh`a32kv%D{%(gjhAzs>oJthg^+&}Ic z_;oYG^>Xvnd}MIjP)QnqG;gItr;O{Z;C{h7nuY;6OTG&c`lzzBvJASi5s!=sB zo0z{Ki2vE<&g#?NOY#DCCuWpIPd^H>+LwD=pRwanpt~YE`~3JldUs+3_fM^1zeOC! zX}(6peTUfyR9U50SqdA!mdnq(`x_*DckFwx>XB$Jwh-*AC?G88XL0UNLZ93-d135# zyN^pa{r%H-`HMkkW48D`Smev}spB>NXUa-tbitd8LizomAp0tGQVRPvs~&YM(Lq$| zmR?+ie|)O!$aO~Pti3TP-;03MXFdzJBqersewz%6aykI&WZ}wZWX#Ut!glDf`#D=W zIVUfAVn|YCN5V6;*ngp^e*4Gr?_VU{^DalLyJc~<69M_MJ&xLdtO>QEV(v<)dFXOB zf8V)wMQyjck{ufnwx1$S`@{jwL&btjlkx2sc`6SkK5$=ZqnearsQB;6lJn-5&*YuD H_5A+;kwDBL literal 0 HcmV?d00001 diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/m1284p_png.h b/11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/m1284p_png.h new file mode 100644 index 0000000..c1be58d --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/WWW/m1284p_png.h @@ -0,0 +1,815 @@ +const char m1284p_png[] PROGMEM = { +0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52, +0x0,0x0,0x4,0xf8,0x0,0x0,0x3,0x3b,0x1,0x3,0x0,0x0,0x0,0xed,0x52,0xbc, +0x4d,0x0,0x0,0x0,0x6,0x50,0x4c,0x54,0x45,0x0,0x0,0x0,0xff,0xff,0xff,0xa5, +0xd9,0x9f,0xdd,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0x12,0x74,0x0, +0x0,0x12,0x74,0x1,0xde,0x66,0x1f,0x78,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54, +0x78,0xda,0xed,0xdd,0x5f,0x8c,0x23,0xc7,0x9d,0x1f,0xf0,0x59,0x4f,0x20,0x26,0xb0, +0xb5,0xf4,0x21,0x2f,0x6,0xbc,0xbb,0xf4,0xc5,0x4f,0x79,0x73,0x5e,0x6e,0x25,0x68, +0xb5,0xb4,0x90,0x7,0x3f,0xfa,0xf1,0x2,0x8,0xd2,0x2a,0x2f,0xf9,0x3,0x45,0x4b, +0x19,0x86,0x96,0xbb,0xe2,0x72,0x7a,0xd6,0x3,0x64,0x1e,0x12,0xdc,0xdc,0x21,0x2f, +0x39,0x48,0xde,0x31,0x70,0x7,0xf8,0xe1,0x60,0xad,0x2,0x45,0xa2,0x6c,0x2e,0xa7, +0x39,0x98,0xb3,0x6,0xc1,0x59,0xe2,0x19,0x4e,0x30,0xb6,0x29,0xb2,0x38,0x37,0x97, +0xa3,0x90,0x11,0xbb,0x38,0x1e,0x2f,0xab,0x67,0x8a,0x5d,0x95,0xfe,0x57,0xfd,0xb7, +0xba,0xd9,0xff,0x48,0xb6,0x70,0x43,0xdc,0x59,0xda,0x9d,0xdd,0x99,0x8f,0xaa,0xbb, +0xab,0xbe,0xfd,0xab,0xea,0xea,0x15,0x9a,0xef,0xcf,0xca,0x85,0xef,0xc2,0xe7,0xfe, +0xf4,0x4b,0xc5,0x5c,0xfb,0x7a,0x12,0xca,0xb5,0xaf,0x3b,0xc9,0xb9,0x8f,0x5e,0xf8, +0xd2,0xf9,0x60,0xce,0x7d,0x60,0x91,0xbe,0xc1,0x5a,0x71,0x73,0x73,0x73,0x5a,0xda, +0x23,0xd7,0xae,0x14,0x89,0x2c,0xcc,0xf6,0x21,0x71,0x91,0x3e,0xd8,0x42,0xb5,0x5a, +0x4d,0xa1,0x2d,0x65,0x34,0x42,0xd3,0x8,0x3f,0xbb,0x7,0x85,0x85,0xfa,0xba,0x58, +0xf5,0x61,0xc3,0x77,0x1e,0xc1,0xd7,0xbf,0x56,0x58,0xac,0x8f,0xaa,0x40,0xb9,0xdc, +0x52,0xe0,0x8,0x11,0xba,0xc0,0x63,0x17,0xd9,0xb7,0xaf,0xb6,0x1f,0xc8,0xaf,0x6f, +0x4f,0x6d,0x3f,0xaa,0xf9,0x3e,0x2d,0x12,0x2a,0xe4,0xcf,0x87,0x71,0xed,0xcd,0x12, +0x68,0x3d,0xd,0x5b,0xd3,0x9b,0x84,0xe6,0xd0,0x57,0x33,0x8f,0x6f,0x9d,0x12,0x25, +0x7f,0x3e,0xbd,0x7f,0xc1,0x62,0x4b,0x91,0x14,0x4a,0xf0,0xec,0xbf,0xd2,0x3e,0x3c, +0x1c,0xb4,0x6f,0x81,0x45,0xf9,0xcc,0xfe,0xf9,0xf9,0x3d,0x72,0xe5,0x69,0x4a,0xc6, +0xe5,0x99,0x7f,0x85,0xf4,0xfb,0x10,0x83,0x85,0xf9,0x62,0x7f,0x94,0x7e,0x1f,0x60, +0x28,0xe6,0xd9,0xb7,0x9b,0x67,0x1f,0x3e,0xec,0xf7,0x31,0xa,0xe8,0x87,0xc6,0xfe, +0x13,0x93,0x90,0xc3,0x8,0xa3,0x7a,0x86,0xbe,0x7e,0x9f,0x4,0xfa,0x10,0xe0,0xf8, +0xfa,0xc9,0x13,0x45,0x52,0xdf,0x79,0xc0,0xb1,0x87,0x9c,0x3,0x5f,0x17,0x2b,0x60, +0x81,0x3e,0xd4,0x57,0x8f,0x6f,0x90,0x6f,0xc0,0xf5,0x41,0xba,0x58,0x5f,0xf,0x2b, +0x41,0xed,0x57,0xf5,0x1f,0xf8,0xe6,0x7c,0x7c,0x2d,0x24,0x15,0x8a,0x9c,0x5b,0x5d, +0x74,0x78,0x78,0x18,0xe4,0x1b,0x94,0x17,0xe7,0xbb,0x81,0x3a,0x93,0xb8,0xb7,0x92, +0xa,0x7d,0xd3,0xff,0x9b,0x7,0x73,0xf1,0x91,0x56,0xf5,0x91,0x14,0xdb,0x7,0xb9, +0xbe,0xb9,0x5c,0x1f,0xad,0x6a,0x5,0xc6,0xf6,0x49,0x9c,0x3,0xf,0xe7,0xd3,0xbf, +0xb4,0x1a,0x15,0x80,0x38,0xe7,0xdf,0x8a,0xfd,0xf1,0x7,0xfd,0x31,0xcf,0x37,0x9f, +0xfe,0xb9,0xf5,0x1,0x4,0xbc,0x52,0x4b,0xa8,0x6f,0x81,0xe3,0x5b,0xeb,0xff,0x40, +0xd0,0x9f,0xa3,0x4f,0xbe,0x1e,0xe1,0xb0,0x7,0xf9,0x56,0xd5,0x1b,0xba,0xff,0x5d, +0x10,0x77,0x38,0xbe,0x92,0xfd,0xaf,0xfb,0x69,0x7c,0xe8,0x0,0x95,0x13,0xfb,0xea, +0xa7,0xb4,0x35,0x84,0xe2,0xda,0x3c,0x7d,0x5d,0x29,0x79,0xfb,0xad,0x1d,0xab,0xfd, +0x33,0xdc,0x29,0xf8,0xaf,0xf,0xe8,0xf0,0x7d,0x54,0x4e,0xe3,0x8b,0x12,0xd2,0x2, +0x7d,0x81,0x41,0xbf,0xe3,0xf0,0xfd,0x3c,0x4d,0x8a,0x96,0x15,0x30,0xf,0xdf,0x23, +0xe7,0xf1,0x4d,0x95,0xf2,0xaf,0xc6,0xf6,0xb5,0x3d,0xbe,0x31,0xe7,0x6f,0xc0,0xcc, +0x7c,0x7d,0x31,0xae,0x6f,0xdd,0x38,0x9f,0x8a,0x44,0x30,0x7c,0x3,0x61,0x2b,0xdc, +0x17,0xe9,0xfc,0x1b,0x6,0xe5,0xa0,0xb8,0x3e,0xb2,0x62,0xfc,0xec,0x55,0xe6,0x1b, +0x92,0x62,0x6,0xed,0x77,0x18,0x14,0xb5,0x85,0x38,0xbe,0x35,0xf5,0x6,0xb3,0x6c, +0x70,0xbe,0x41,0x84,0xba,0xe1,0x93,0xb3,0xf0,0xc9,0x1,0xbf,0x5d,0x8e,0xe5,0x6b, +0xb5,0x94,0xcf,0x69,0xc7,0x48,0x56,0x37,0x85,0x55,0xc3,0x77,0xd8,0xe1,0xf8,0x88, +0x1e,0x9e,0xb1,0x54,0x8e,0x78,0xfd,0x4e,0x53,0xf4,0x42,0x2e,0xdf,0x67,0x6a,0x87, +0xab,0x75,0xb9,0xe5,0xcb,0xe6,0x78,0x3e,0xdc,0x34,0x7d,0x53,0xc1,0xea,0x90,0x2d, +0xdf,0x8,0x58,0xfd,0xdf,0x54,0xf0,0xf7,0xde,0x47,0xf6,0xf,0x29,0x66,0xe1,0xeb, +0x2a,0x54,0xf3,0x6d,0x68,0xbe,0xb6,0xf9,0xf3,0xfe,0xbe,0xd4,0x61,0xc7,0xc2,0xf8, +0xe7,0x86,0x2e,0xb8,0xa3,0x47,0xa9,0x2e,0xb4,0xc6,0xf,0xd9,0x6a,0x21,0xfb,0x84, +0xdd,0xcd,0x64,0x98,0xb1,0x7d,0x43,0x45,0x3d,0x91,0x8f,0xe8,0x25,0xcd,0x37,0x36, +0x7d,0x3,0xc1,0xf4,0x8d,0xcd,0x66,0xb9,0xc4,0xf7,0x8d,0xad,0x56,0x9b,0x5a,0x91, +0x61,0x7d,0xd6,0x5,0xd2,0xd6,0x23,0x46,0x39,0xb2,0xf,0xd3,0x5f,0xd2,0xc1,0xca, +0xec,0x8f,0xc3,0xd7,0x5e,0x89,0xf4,0xb9,0x94,0x85,0xaf,0x8b,0x8a,0xff,0x23,0x62, +0xfb,0xbd,0xa3,0x1f,0xc9,0x66,0x82,0xf6,0x1b,0x8,0x89,0x7d,0x2d,0x48,0xef,0xa9, +0x5d,0xa9,0x7e,0xfe,0xb1,0x6f,0xf3,0xf7,0x65,0xee,0xf9,0xe7,0xf3,0x45,0x3e,0xff, +0x9c,0x23,0x9a,0xfe,0xbb,0x24,0xba,0xf,0x10,0x99,0x5d,0xbf,0xff,0x99,0x5d,0xbf, +0x45,0xff,0xf5,0xab,0xfa,0xfa,0x46,0x4,0x3,0xd6,0xf,0x9e,0x71,0xfd,0xda,0x83, +0x90,0x8,0x12,0xfb,0xd6,0x1e,0x4c,0xbf,0xa2,0xf6,0x7f,0xda,0xad,0xe0,0xcd,0x6b, +0x2,0xac,0xe3,0xbd,0x3d,0x3c,0xdc,0x33,0x7d,0xac,0xec,0xb,0x1d,0xbe,0xb5,0xb2, +0xe5,0x73,0x54,0x85,0xad,0x6,0xb2,0x93,0x23,0xb1,0x7b,0x74,0xb1,0x6f,0xfd,0x97, +0x94,0x4c,0x5f,0x31,0xfa,0xf8,0x36,0x55,0x87,0x5b,0x4d,0xf0,0xcc,0x9a,0xd0,0x79, +0xfe,0xb4,0xd5,0x3a,0x1d,0x8e,0xb9,0x3e,0xdf,0x81,0xb,0xf7,0x39,0x5a,0xd7,0xf6, +0x11,0x68,0xfa,0x4,0xed,0xa4,0xbd,0xb4,0xdb,0x7e,0xa5,0x3c,0x7b,0xfc,0xbd,0x59, +0xd2,0x5,0x7f,0x48,0x84,0x47,0x2f,0x1d,0xb7,0x5a,0xc7,0xc3,0x69,0x31,0x3,0x9f, +0x63,0x7c,0x73,0xf8,0xcc,0xe3,0x7b,0x53,0xeb,0xa,0xb0,0xb0,0x3,0x94,0x68,0xf9, +0x45,0x13,0x14,0x88,0x0,0x5f,0xea,0xb6,0x5a,0x5d,0x2b,0x1f,0xa4,0xf2,0x1d,0x72, +0x7d,0xdb,0xfb,0xac,0x49,0xa2,0xfb,0xda,0x86,0x40,0xcd,0x57,0xf0,0x35,0xdd,0xc7, +0x4e,0xed,0x54,0x3e,0x47,0xbe,0x5a,0xbf,0x66,0xf9,0x2a,0xa6,0xf,0xea,0x3e,0x31, +0x92,0xcf,0x14,0xa8,0x3f,0x3,0xbe,0xd6,0x6c,0xb5,0x9a,0x94,0x4d,0xf5,0xa6,0xf2, +0xb9,0x4e,0x21,0xdf,0xf9,0xa7,0xfb,0x2e,0xed,0xb7,0xeb,0xd1,0x7d,0xda,0x3f,0xde, +0xa8,0xb5,0x5a,0x35,0xfb,0xdb,0xce,0xd5,0x37,0x2d,0x8,0x72,0x9c,0xf6,0xd3,0x7d, +0x97,0x5a,0xad,0x4b,0x72,0x29,0xe3,0xf6,0x73,0x1c,0x5f,0xe8,0x38,0xbe,0x40,0x20, +0x71,0x7d,0xf7,0x70,0xab,0x85,0x31,0xec,0x64,0xdc,0x7e,0x3b,0xbe,0xfe,0x4f,0xbb, +0x3e,0x60,0xc4,0xeb,0xc3,0xe1,0xd3,0xfb,0x67,0x8c,0x1e,0x65,0xeb,0x23,0x6b,0x76, +0x5f,0xb8,0xdf,0x2e,0xd3,0x75,0x7d,0xfc,0x50,0x50,0x6c,0x9f,0xf1,0xc1,0xa8,0x92, +0xad,0xef,0x8c,0x38,0x7c,0xeb,0x45,0xba,0x72,0x53,0xf7,0x61,0xb5,0x7f,0xae,0xe7, +0xc1,0x37,0x24,0xce,0xdc,0x55,0x24,0xee,0xdc,0x16,0xdf,0x37,0xc9,0xf8,0xfa,0x0, +0xdc,0xf6,0x8b,0x53,0x3f,0x70,0xfb,0x9e,0x4,0xf8,0x64,0xf4,0xeb,0x72,0xba,0xeb, +0x37,0x76,0x7e,0xe1,0xfa,0x7e,0x5f,0xe0,0xfb,0xd0,0xf7,0xbb,0x20,0x5d,0xff,0x97, +0x8d,0xf,0x6,0xb4,0x1f,0x7c,0xbf,0xb,0x53,0xfa,0x80,0xdd,0xbf,0x24,0xf6,0x5, +0xf6,0xcf,0xf0,0x49,0x32,0xdf,0xe7,0x6a,0xff,0x22,0xdc,0xbd,0x79,0x59,0xfd,0xd7, +0x6d,0xbb,0x7f,0x26,0xc5,0x4d,0x51,0x48,0xe2,0xb,0x1c,0xdf,0xa4,0x3f,0x4a,0xe6, +0xeb,0xa9,0xfd,0xf3,0xcd,0x6a,0x6f,0x62,0xfb,0xf4,0xf1,0x17,0xd5,0x76,0x68,0xa6, +0x3e,0xd8,0x78,0x31,0x91,0xaf,0xa5,0xe6,0xab,0x9b,0x95,0x91,0xe6,0xbb,0xe5,0xf0, +0x4d,0x94,0x56,0x7e,0x7c,0x2f,0x55,0x46,0xc4,0xe1,0xdb,0x56,0x7d,0x84,0x36,0xb3, +0xf5,0xa1,0xea,0x5b,0x89,0xae,0x5f,0x51,0xf7,0x49,0x6a,0x68,0x26,0xc0,0x6e,0x3f, +0x35,0x44,0x37,0xb2,0xf5,0x25,0xed,0xff,0x34,0xdf,0xab,0x15,0xf8,0x91,0x76,0x4d, +0xd8,0x3e,0xfa,0x11,0xfd,0xab,0x6c,0x7d,0x49,0xc7,0xf,0xd3,0x37,0xb1,0xfb,0x17, +0xed,0xfa,0xa5,0x13,0xfa,0xc3,0x7c,0xf8,0xb4,0xfb,0xf3,0x57,0x8d,0xeb,0xc3,0xd1, +0xff,0x65,0x7f,0x7d,0x24,0xf5,0x69,0x85,0x89,0xaa,0xd1,0xbf,0xb8,0xf2,0x55,0x84, +0xfe,0x45,0xae,0x45,0xf4,0x71,0xe6,0xb7,0xa2,0x8f,0x1f,0xea,0xa7,0x6a,0xf4,0xcf, +0x8e,0x7c,0x10,0xa9,0x7f,0x46,0x8d,0x85,0xf8,0x12,0xe7,0x2b,0x33,0x2a,0x43,0x3a, +0xbe,0x59,0x9a,0x6b,0xfb,0x25,0xcc,0x57,0x68,0xdb,0x14,0xa0,0x1e,0xc,0xf5,0xe9, +0x1f,0x85,0xfb,0x65,0xb7,0xef,0x50,0x19,0x87,0xfa,0xe2,0xe5,0x17,0x73,0xb2,0x53, +0xf5,0x8d,0x78,0xbe,0x43,0xdd,0x0,0x49,0x49,0x6f,0xb3,0x93,0x91,0xf7,0xcb,0xac, +0x88,0x21,0xca,0x77,0x4b,0xa6,0xaf,0x7f,0x16,0xba,0x92,0x36,0xb1,0xf,0xf2,0x7c, +0xfd,0xa9,0xfe,0x55,0xc5,0xf8,0x91,0xd2,0x6b,0xde,0x2f,0xb3,0x5,0x45,0x22,0x32, +0x6b,0x68,0x88,0x8a,0x6f,0x84,0xf9,0xd8,0xfd,0x9b,0x18,0xdf,0xc7,0x3b,0xff,0x44, +0x7d,0xe1,0x3,0xc4,0x13,0xe3,0x4f,0xfd,0xc4,0xfb,0xe5,0xa,0x6b,0x3f,0x68,0xd6, +0x20,0x55,0x9f,0x12,0xb2,0x5a,0xd4,0xba,0x3f,0x57,0x1b,0x50,0x51,0x3e,0xbc,0x59, +0x9c,0xe5,0x1b,0xaf,0x86,0xb6,0x9f,0x38,0x31,0x7c,0x46,0xc5,0x8,0x7e,0xec,0xfd, +0x32,0xb4,0x7c,0x34,0x92,0x8f,0xb2,0xfb,0x73,0xf5,0x4f,0x4f,0xcf,0x1a,0x3d,0x14, +0xb9,0x7f,0x9e,0xe1,0xd3,0xbf,0x11,0xf2,0x9e,0x7f,0xe2,0x67,0xb6,0x4f,0xb0,0x7c, +0xbc,0xd5,0xac,0xc8,0xed,0x2b,0x1b,0xbe,0x2e,0x9e,0xe5,0x3b,0xa5,0xa1,0xd7,0x87, +0x28,0x19,0x3e,0xf3,0xfb,0x7b,0xaf,0x5f,0x71,0x28,0x78,0x7d,0x50,0x54,0x94,0xa0, +0xcb,0xc2,0x31,0xbe,0xa9,0x3e,0xe5,0x8d,0x6,0x9e,0xe9,0x33,0xab,0x9c,0x41,0xfd, +0x8b,0xd8,0xf,0xf7,0x41,0x8e,0xaf,0xce,0xfb,0xa1,0x9b,0x3c,0xdf,0x87,0xb3,0x7d, +0x66,0xa9,0x2f,0xa8,0x7f,0x16,0xbf,0x2d,0x18,0xd7,0x47,0x80,0xaf,0x62,0xf9,0xfa, +0xe6,0x71,0xdc,0xe8,0x2b,0x9c,0x93,0xca,0x2a,0x46,0x8b,0xe,0xdf,0x4f,0xc4,0xaf, +0xcf,0xf6,0x19,0x7,0x18,0x6e,0xf3,0xc7,0xb7,0xbe,0xd1,0xff,0x29,0x12,0xe4,0xfa, +0xfa,0x56,0xfb,0x21,0x73,0xa8,0x47,0xf0,0x50,0x19,0xf8,0xaf,0xf,0x6b,0xa9,0x8e, +0xe0,0xf2,0x75,0x23,0xb7,0x5f,0x80,0xcf,0xea,0x9f,0x8b,0x5c,0xdf,0xe1,0xd8,0xea, +0x9f,0xd7,0x98,0x8f,0xfb,0x3,0xd9,0x9f,0xb3,0xf2,0xa9,0xee,0x8b,0x70,0x7d,0x98, +0xff,0x61,0x41,0xbe,0x4,0xe3,0x1b,0xf7,0xb3,0xc7,0xab,0x5f,0xf5,0x22,0xf4,0x2f, +0xc6,0x1f,0x18,0xf0,0x63,0x44,0x7c,0xdf,0x20,0x60,0x71,0x51,0x91,0x57,0xbf,0xea, +0x45,0xe8,0x9f,0x8d,0xf6,0x6b,0x67,0xe5,0x6b,0xaf,0xac,0x66,0x9b,0xaf,0x8c,0xf3, +0xaf,0xb3,0x4f,0xb3,0xf1,0x75,0x58,0x87,0x1a,0xa1,0xfd,0xa2,0xd5,0x37,0xf4,0xef, +0xd7,0xd9,0x98,0xb3,0x6f,0x3f,0x71,0x7d,0x68,0xcb,0xf4,0xc9,0xcf,0xe1,0xfd,0x4b, +0x68,0xf7,0x50,0x99,0x8b,0xef,0x30,0xa9,0xcf,0x18,0x3f,0x3a,0xdf,0xa4,0xe8,0x37, +0xa7,0x4d,0x38,0x4,0x7d,0xc7,0x12,0xe2,0x81,0x7a,0xae,0x68,0xdf,0x4c,0x3d,0x4b, +0x78,0x3e,0xf3,0xcb,0xda,0x49,0xbc,0xc2,0x4e,0xbb,0xa0,0xf3,0x4f,0x4e,0xea,0x33, +0xff,0x73,0xff,0xa5,0xe6,0x13,0xe0,0x81,0x28,0xbe,0x39,0x17,0x9f,0xbd,0x98,0x23, +0x51,0xfd,0x8f,0xfc,0x47,0x8a,0xce,0x8f,0x5,0x88,0x36,0xc4,0x74,0xed,0x17,0x9c, +0x4b,0x13,0xfa,0x8c,0xfe,0x85,0xfc,0x27,0x2a,0x9f,0x1f,0x7f,0x7,0xa2,0x96,0x88, +0xc2,0xc2,0x79,0xf2,0xe7,0x6c,0x36,0x53,0xe5,0xfb,0xe9,0xe7,0x94,0x7e,0xfd,0xc5, +0xe7,0x20,0x52,0xe6,0xe5,0x1b,0xa6,0xf3,0x49,0x2,0xed,0xbe,0x58,0xd3,0x7c,0x83, +0xf2,0x5c,0x7c,0xe9,0xee,0x8f,0xce,0x24,0x1,0xe9,0xbe,0x96,0x58,0x11,0xd3,0x5d, +0x1f,0x97,0xe6,0xe1,0x3b,0x81,0x65,0xd4,0x6d,0xaa,0xbe,0x66,0xdf,0xf1,0x24,0x47, +0x7e,0x7c,0xa7,0xb0,0x2c,0x3f,0xd7,0xdc,0x84,0x68,0xef,0x30,0x67,0x3e,0xe3,0xfe, +0xed,0x8,0x66,0x96,0xf,0x32,0xf6,0xd1,0x6c,0xf3,0xd5,0x6c,0x5f,0xcc,0xf5,0x43, +0xec,0x2f,0xcd,0xd5,0x7,0x3e,0xb5,0xd7,0xbb,0x24,0xf2,0xc1,0xd9,0xf5,0xb5,0x54, +0xbe,0xae,0xbd,0x62,0x3e,0x91,0x8f,0x66,0xe5,0xa3,0xa7,0x87,0x87,0xb4,0xed,0xed, +0xe2,0x61,0x63,0x84,0x63,0x75,0x92,0x91,0x7d,0x68,0x4f,0x5b,0x91,0x6,0xa7,0x65, +0xa4,0xaf,0x56,0xf3,0xfa,0xf6,0xf6,0xcc,0x5,0x6b,0xe2,0x98,0x2,0xdd,0x75,0xda, +0xef,0xfb,0x1f,0xa4,0x87,0x8d,0x98,0x1d,0x7b,0x64,0xdf,0xb0,0xa5,0x2f,0x3b,0xc1, +0x60,0xa8,0xdf,0xa9,0x78,0x7d,0xad,0x96,0xd9,0x72,0xea,0x8d,0xfa,0xb6,0xee,0x3a, +0xea,0xf7,0xfb,0x3e,0x1f,0xaa,0xce,0xcb,0x77,0xd0,0x6a,0x19,0xbe,0x83,0xbf,0xac, +0x72,0x7d,0x2d,0xcb,0xf7,0xf2,0x9f,0x69,0xae,0xd3,0x59,0x3e,0x54,0x58,0xa5,0x47, +0xf,0xba,0x30,0xa3,0xe3,0xcb,0x7c,0xe8,0xcf,0x1b,0x1c,0x9f,0xa2,0xd8,0xbe,0xfe, +0xbf,0x63,0xbe,0xb6,0xf7,0xfb,0x9c,0x23,0xfb,0x2f,0x4e,0x70,0x9d,0xf6,0x76,0x7e, +0x93,0x9d,0xef,0x81,0xe1,0x6b,0xbe,0x5b,0xe6,0xfa,0x1e,0x58,0x3e,0xa9,0x1d,0xd4, +0x7e,0xe7,0xc8,0xbe,0x3e,0x34,0x9f,0xb8,0xf3,0xdb,0xcc,0xdb,0xaf,0xc9,0x6b,0x3f, +0x8c,0x1d,0xed,0x27,0x5,0x1e,0x5f,0x5,0xdb,0xfd,0xcb,0x84,0x2e,0xd0,0x87,0x50, +0x34,0xdf,0xd4,0xee,0x9f,0x51,0xa9,0x4e,0xff,0x62,0xa7,0x5b,0x59,0x88,0xf,0x42, +0x8e,0xef,0x53,0x10,0xf6,0xa3,0xd1,0xd1,0x2a,0xfd,0xe1,0x83,0xec,0x7c,0x3f,0xd, +0xf3,0x1,0xf0,0x53,0xaf,0xef,0xf0,0xf0,0xef,0xc2,0x7d,0x58,0xa0,0x2d,0xb1,0xfb, +0x28,0xab,0xfe,0xf9,0xe7,0x9a,0x6f,0xfa,0x3c,0xdf,0xf7,0xe0,0xc1,0xcf,0x4d,0xdf, +0x18,0x19,0xbe,0x99,0xf3,0x33,0x93,0x4c,0x7d,0x59,0xd5,0xaf,0x7c,0xbe,0x4e,0x5e, +0x7d,0xa8,0x20,0xd0,0x3d,0x31,0xab,0xfe,0x39,0x7b,0x5f,0xb6,0xe3,0xdb,0x3f,0x4a, +0xdf,0xca,0x45,0xfb,0x5d,0xf8,0xbe,0x38,0xbe,0x76,0xce,0x7d,0xda,0xe3,0x83,0x39, +0xf6,0x11,0xad,0x4a,0x91,0x57,0xdf,0xda,0x1e,0x7d,0xac,0xad,0x2d,0xc8,0xab,0x4f, +0xbd,0x1,0xbb,0xa1,0x4d,0xd9,0xe5,0xd7,0x47,0x1e,0x6b,0x25,0x1b,0xfe,0xfc,0x8c, +0xf3,0xf9,0x23,0xa3,0x50,0xc5,0xfd,0x32,0x75,0x94,0x97,0x33,0xf6,0x75,0x15,0xfa, +0xa1,0xf6,0x4c,0x13,0x7f,0x7e,0xc6,0xf9,0xfc,0x96,0x51,0xed,0x12,0x78,0x5f,0x76, +0x3e,0xbf,0x95,0xb1,0x6f,0xa8,0xd0,0x9f,0x6a,0x3e,0x7e,0xd5,0xc9,0xf9,0xfc,0x9b, +0x51,0xe7,0x2a,0xf3,0xbe,0xec,0x7c,0xfe,0x2d,0x6b,0x1f,0x56,0x7d,0xe3,0x95,0xec, +0x3e,0x85,0x8c,0x8f,0x2f,0x2a,0xfe,0x54,0x9b,0xa3,0xc9,0xac,0xfd,0x68,0xc6,0xd7, +0x7,0x34,0x8e,0x6f,0x66,0xe7,0x5f,0xd6,0x3e,0x40,0x1f,0x6b,0x73,0x13,0x99,0x5d, +0xbf,0x19,0xfb,0xd6,0x1e,0xd0,0xc7,0x31,0x1e,0xd4,0x5d,0xd4,0x3e,0x6d,0xce,0xf1, +0x6d,0x5a,0xde,0xcc,0xb5,0x8f,0xc4,0xd8,0x58,0x77,0x19,0x3e,0xb6,0xfd,0x41,0x6e, +0x7d,0x6d,0x9a,0x6f,0x1f,0xbd,0xf0,0x5d,0xf8,0x2e,0x7c,0x17,0xbe,0xb,0xdf,0x85, +0xef,0xc2,0x77,0xe1,0xcb,0x81,0x6f,0xaa,0xdf,0xec,0xad,0xe6,0xdd,0x27,0x5f,0xdd, +0xc1,0x74,0x33,0xbf,0x3e,0x3c,0x7a,0x78,0x4a,0x6b,0x79,0xf4,0xe9,0xb7,0x7e,0x47, +0x78,0xf4,0xce,0x71,0x2b,0xdf,0x3e,0xdc,0xcd,0xa9,0x6f,0x5f,0xf7,0x7d,0x80,0xbb, +0xdf,0xcf,0x91,0x4f,0x2e,0x15,0x91,0xe9,0x6b,0xaa,0x3e,0xf9,0xea,0x7,0x78,0xf8, +0x5f,0x32,0xf3,0xd,0x56,0x56,0x84,0x74,0x3e,0x2c,0xa1,0xa1,0xc3,0x87,0x95,0x9f, +0xe1,0x21,0xce,0xcc,0xd7,0x9e,0xb9,0x30,0x69,0xa6,0x6f,0x84,0xf,0x3c,0xbe,0x6e, +0x76,0xbe,0xf4,0x1f,0x3c,0x32,0x9e,0x49,0x56,0x7d,0xef,0xe9,0xbe,0xc7,0xb8,0x5b, +0xcd,0xa7,0xef,0x6f,0xe4,0xb2,0xea,0xdb,0xc1,0xad,0xad,0x1c,0xf9,0xe4,0xab,0xb4, +0x6a,0xfa,0x30,0x2,0x47,0x59,0x8f,0x6f,0xe9,0xdb,0x4f,0x21,0xd6,0xf5,0xb,0x61, +0xd6,0xbe,0x5d,0xf8,0x6e,0xda,0xeb,0x43,0x39,0x5f,0x65,0xfd,0x1f,0x40,0x59,0xfb, +0x76,0x86,0xd,0x90,0x2,0x77,0xa2,0xfa,0x8,0x62,0xed,0x47,0x45,0x9c,0xb5,0x4f, +0x78,0xb5,0x91,0xe6,0x25,0x3e,0x3,0xd5,0x47,0x8b,0xf3,0xf4,0x1d,0xa7,0xf3,0xb9, +0x4b,0xfd,0xe5,0xec,0x7d,0xa3,0xb4,0xed,0xe7,0xcc,0x7,0xd9,0xb7,0xdf,0xdd,0xd7, +0xf2,0xed,0x13,0x6e,0xdb,0x3e,0x61,0x75,0x6d,0x90,0xce,0x97,0xfd,0xf5,0xeb,0xf0, +0x11,0x1,0xd7,0x81,0x90,0xc6,0xb7,0x9f,0x7d,0xff,0xb7,0x3,0xaf,0xb3,0xfe,0x45, +0x11,0x50,0x4d,0xfc,0x9f,0x5b,0x71,0x7d,0x6a,0xbe,0xda,0x60,0xfd,0x73,0xf6,0xe3, +0x87,0xa3,0x7f,0xc6,0x2,0xaa,0x8a,0xef,0x5d,0x8f,0xdd,0xbf,0x48,0xe6,0x3,0x27, +0xaa,0x4f,0x1d,0x7f,0xe7,0x37,0xbe,0x61,0x1,0x56,0xc4,0x46,0x35,0xb6,0x6f,0x84, +0x5,0x47,0xbe,0x9a,0x9f,0xf,0x9,0xf0,0x8f,0x13,0xf9,0x68,0xc1,0x91,0xef,0xe7, +0xe7,0x83,0x2,0x7c,0x2e,0x99,0xaf,0xb6,0x90,0xe3,0x3b,0x28,0x83,0x5a,0x2,0x9f, +0x9a,0xaf,0xf0,0xfc,0xae,0xf,0x57,0x5f,0x3,0xea,0xa0,0x1a,0xbf,0xfd,0x14,0xdb, +0x97,0x7d,0xff,0xe2,0xfc,0xd4,0xc0,0xda,0x0,0x25,0xf0,0xe1,0xda,0xfc,0xf2,0x55, +0xda,0x73,0x42,0xcf,0x57,0xd5,0xf9,0x8d,0x6f,0x19,0xf8,0x68,0x71,0x73,0xde,0xbe, +0x69,0x6e,0xf3,0x95,0xf1,0x31,0x9f,0xc5,0x5f,0x99,0xfd,0x50,0xa8,0xbf,0xfd,0xd8, +0xce,0xb4,0xf3,0x6c,0x3f,0xe3,0x59,0x7c,0x12,0xb8,0x3,0x75,0xe8,0xf1,0x45,0xf3, +0xf7,0x6d,0x9a,0x1,0x86,0xd2,0xb3,0xd8,0x3e,0x84,0x3b,0x73,0xcc,0x57,0x6,0xac, +0x94,0x8d,0x6f,0x63,0x4e,0xfd,0x9f,0xb9,0xaa,0x24,0xb5,0xf,0xcd,0x69,0xfc,0x18, +0xd3,0x8c,0x7c,0x73,0x1a,0x7f,0xd9,0x6a,0x2d,0x41,0x7f,0x2e,0x74,0xc5,0x7a,0x48, +0x34,0xae,0xf,0xce,0x29,0xbf,0xf8,0xda,0xcf,0x88,0xfc,0x8f,0x67,0x6c,0x79,0x64, +0xf8,0xc6,0xab,0x73,0xf7,0xf9,0xce,0x3f,0xc3,0xd7,0x4,0xe5,0x8,0x3e,0x4a,0x6d, +0xdf,0x9c,0x8e,0xaf,0xf9,0x6c,0xac,0xd7,0xd7,0x90,0xc4,0x78,0x3e,0x30,0xaf,0x7c, +0x55,0xf4,0xf4,0xcf,0xa6,0x8f,0xc6,0x3c,0xbe,0x60,0x5e,0xf9,0x6a,0x3f,0x85,0x8f, +0xa2,0x8e,0x7e,0x8,0x34,0xdf,0xbc,0xf2,0x95,0xf7,0xbb,0xc6,0xf2,0x75,0x34,0xdf, +0xb4,0x34,0xcf,0xf1,0x6d,0x9c,0xc6,0xa7,0xbf,0x3a,0x41,0x2e,0x2e,0x32,0x5f,0x99, +0x3e,0x18,0xc5,0x37,0x75,0xbc,0xfc,0xa2,0x3c,0xef,0x7c,0x2a,0x1b,0xef,0x1,0x64, +0xfd,0x4b,0x14,0x1f,0xa6,0xf3,0x6f,0x3f,0xfb,0x1e,0xdd,0xd8,0x15,0x2b,0x7e,0xff, +0x3c,0xdf,0xf3,0x8f,0xef,0x8b,0x5a,0x1f,0xb2,0xae,0x5f,0x3a,0xf7,0xfb,0x23,0x8c, +0x12,0xfa,0xa8,0x30,0x9f,0xfa,0x55,0x7a,0x9f,0xb2,0x65,0xf9,0x9a,0x73,0x9f,0xff, +0x90,0x8b,0xd0,0xf6,0xf1,0x97,0x93,0x17,0xbd,0xd7,0x47,0xc3,0xf2,0x89,0x73,0x19, +0x7f,0x15,0x65,0xcf,0xea,0xff,0xb0,0xb1,0xa7,0x23,0x64,0xc3,0xc9,0xac,0xe5,0xee, +0x5a,0xbe,0x6a,0x5a,0xbe,0x1f,0xcf,0x25,0xbf,0x28,0x4a,0xcb,0xda,0x5e,0x12,0x1b, +0x5d,0xa,0x64,0x71,0x81,0xf3,0x19,0x6,0xfb,0xde,0xe2,0xf9,0x48,0x9b,0xa4,0xf3, +0x11,0xbc,0x66,0x75,0x74,0xd8,0x90,0xc6,0xf2,0x61,0xfb,0xfc,0xe3,0x1d,0x5f,0x2, +0xee,0x27,0xf0,0x4d,0xbf,0x2a,0xd8,0x3e,0x1,0xd8,0xfd,0x4b,0x21,0x8d,0x8f,0x77, +0x7d,0x10,0xf0,0x66,0x3a,0x1f,0xad,0xda,0x3e,0x7b,0x7c,0x23,0xc1,0xbe,0x93,0xa3, +0x20,0x1f,0xaf,0x7f,0x21,0xe0,0x4e,0x86,0x3e,0xb2,0xba,0x3e,0x18,0x7c,0xab,0xa8, +0xd,0xab,0x81,0x3e,0xa9,0xc7,0xb9,0x3f,0x17,0x82,0xea,0x57,0xe9,0x7d,0x8f,0x9c, +0x3e,0x45,0x4,0x15,0x2,0x43,0x7d,0xa4,0xc7,0xa9,0x6f,0x8,0x41,0xe3,0x1b,0x69, +0x4b,0x69,0x7d,0xf6,0xf5,0x61,0xfb,0xce,0xa3,0xfa,0xcc,0x4f,0xb0,0xf,0xf4,0x53, +0xfa,0x80,0xdd,0xbf,0xe8,0x3e,0x38,0xc3,0x77,0xc6,0xf3,0x5,0xe6,0x2b,0x9,0xe8, +0x9b,0xb3,0xa4,0xf1,0xd9,0xfd,0xb3,0xea,0x5b,0x3f,0x1a,0x68,0x5b,0x89,0x4f,0xe8, +0x53,0xb1,0xda,0x2f,0xb0,0x3e,0x24,0x1,0x92,0xb2,0xfd,0x5c,0x47,0x63,0x55,0x9c, +0xea,0xc7,0x77,0xbc,0x76,0x9e,0x8d,0xef,0x24,0x5b,0x9f,0x9a,0x99,0x75,0x1f,0x51, +0xa6,0x2,0x29,0xac,0x6e,0x7e,0xc9,0xac,0x8,0xa2,0xbb,0xe5,0x6b,0x5f,0xde,0x85, +0x5,0xdf,0xf5,0xeb,0xf4,0x65,0x97,0xaf,0x2,0x7d,0x48,0xbb,0x3e,0xf6,0xb5,0x5e, +0x9b,0x8,0x6a,0xcf,0x5d,0x63,0xd7,0xb6,0xd4,0xec,0xc3,0x5e,0xff,0x0,0xfa,0xfa, +0x3f,0x87,0x6f,0x2f,0xbb,0x7c,0x15,0xe8,0xc3,0x9a,0x4f,0x9b,0xf0,0x43,0x5e,0xdf, +0x8,0x99,0x3e,0x6f,0xfe,0xa3,0x73,0xb8,0x3f,0xf,0xf4,0x29,0x6a,0xff,0x7c,0xf3, +0x92,0xe5,0x13,0x98,0xaf,0xdf,0x1c,0xd1,0x9d,0xfe,0x1,0xf0,0xfb,0x88,0xe5,0xe3, +0xe6,0x2b,0x73,0x77,0xa7,0x88,0x3e,0x2b,0x34,0x7d,0x95,0x13,0x9d,0x4,0xb6,0xa, +0x52,0xcf,0x51,0x44,0x3f,0xff,0x56,0x4d,0x5f,0xaf,0xab,0xfa,0x76,0x9b,0x40,0x2f, +0x89,0x97,0x9c,0xbe,0xa9,0xe5,0xdb,0xe4,0xe5,0x97,0x98,0xbe,0xb0,0xf6,0xb3,0x7e, +0x8b,0xb5,0x1f,0x14,0xac,0xec,0xf0,0xe9,0xd7,0x55,0x1f,0xd8,0xe0,0xb4,0xdf,0xd8, +0xf2,0x35,0x17,0xe5,0x63,0xe7,0x1f,0xb2,0xcf,0x3f,0xb5,0xfd,0xd0,0x1a,0x68,0x8a, +0x7e,0xdf,0x91,0xe5,0xc3,0xbc,0xe3,0x6b,0xee,0xce,0x96,0xa9,0x4f,0xfb,0x9e,0xd8, +0xed,0xeb,0x1e,0xf7,0xe1,0x1a,0xa8,0x73,0x7c,0xfb,0xb6,0x8f,0x77,0x7d,0xcc,0xc3, +0xa7,0xc7,0x6a,0xb5,0xff,0xc3,0xf6,0xf9,0x77,0xfc,0x59,0xb9,0x54,0x37,0x7c,0x27, +0xc8,0xe5,0xb3,0xe7,0x3f,0xb8,0xf9,0x6a,0x5f,0xfb,0x99,0x73,0xf0,0x11,0xf7,0xf8, +0xa1,0x45,0x56,0xc5,0xcc,0x57,0x5a,0x13,0xb6,0xb1,0x6c,0xf8,0x8c,0xe2,0xa1,0x7e, +0xff,0xeb,0xca,0x57,0x1b,0x87,0x10,0x18,0xbe,0xe9,0x5c,0x7c,0x9e,0xf1,0x57,0x6b, +0x33,0x6c,0x8e,0x6f,0xda,0x7a,0x49,0xf0,0x86,0xb6,0xed,0xe6,0x80,0x15,0x5f,0xfd, +0xf5,0x83,0x7a,0xdf,0x28,0xdf,0xec,0xab,0x51,0x63,0x2e,0xbe,0xe0,0x7c,0x85,0x74, +0x1f,0x34,0xeb,0x1b,0xe6,0x8d,0xa9,0xcf,0x67,0xee,0x14,0x3e,0xaf,0xe3,0x1b,0x92, +0xaf,0xdc,0xbe,0x80,0xf9,0x41,0xc1,0xd8,0x28,0x3e,0x91,0x4f,0x11,0xd2,0xb7,0xdf, +0xed,0xcf,0xc2,0xdb,0x6f,0x4b,0x1c,0x59,0xbe,0x8d,0xc5,0xfb,0xda,0xd2,0x30,0xfc, +0xfc,0x3b,0x11,0xff,0x9f,0xe5,0xab,0xc7,0xf4,0x91,0x95,0xd8,0x3e,0x35,0x5f,0x95, +0xbe,0xbe,0xb,0xb7,0xb4,0xeb,0x57,0x6f,0xbf,0x76,0xc5,0xf0,0x19,0x93,0x77,0xfe, +0xfa,0x95,0x62,0xee,0xf4,0xaf,0xfa,0xd4,0x4f,0xcc,0xf3,0x4f,0x6d,0xbf,0xd7,0x57, +0x63,0xf9,0xd4,0x7c,0x25,0x8d,0xfa,0x7,0x55,0xd6,0xff,0x1,0x60,0xfa,0xcc,0xc9, +0x4f,0xed,0xfe,0x3,0x39,0xfb,0x3f,0xfd,0xfa,0x38,0xd2,0x7d,0xa,0x5d,0x8b,0x7b, +0x7d,0x98,0x9d,0x85,0xfe,0x29,0xa0,0x48,0xbe,0xd1,0x44,0xe9,0x1f,0x8,0x6c,0xfc, +0x0,0xe2,0x23,0xc1,0x39,0xbe,0x69,0xbe,0xa1,0x73,0xfc,0xd0,0xfb,0x97,0x5d,0x7d, +0xfc,0xc0,0x74,0x27,0xa6,0xef,0x81,0x63,0xe1,0x3d,0xc1,0xc3,0x8,0x3e,0x35,0x5f, +0x91,0x87,0xfd,0x83,0xef,0xda,0xbe,0x77,0x5d,0xf9,0x40,0xf7,0x39,0xc7,0x5f,0xbd, +0x7f,0x5e,0x4f,0xe8,0x5b,0x73,0xd5,0x87,0xe,0x22,0xf8,0xd4,0x7c,0x40,0x6e,0xef, +0x36,0xaf,0x7b,0x96,0x1c,0x68,0x97,0x6,0x42,0xc5,0x3d,0xdd,0x77,0xe0,0xc8,0x2f, +0xce,0xea,0xd7,0x6a,0x4a,0x5f,0x94,0xe3,0xab,0xe6,0x2b,0x22,0x81,0x8d,0x2a,0x27, +0x3f,0xa3,0x9,0x6a,0xf9,0x7c,0xc6,0x27,0x9b,0xf6,0x43,0xd1,0xda,0x6f,0x22,0x81, +0x26,0xcf,0x87,0x47,0x78,0x4d,0xf7,0x35,0x7c,0xf9,0x2a,0xe9,0xf9,0xd7,0xd2,0xde, +0xf5,0x19,0xcb,0xa7,0xe6,0x2b,0x49,0x2,0x75,0xbe,0x4f,0xfd,0x9b,0x9a,0x6f,0xc3, +0x97,0xaf,0xf4,0xeb,0x97,0xc6,0xbf,0x7e,0xd5,0x84,0xce,0xd6,0x5d,0x44,0xf4,0x69, +0xf9,0xea,0x2a,0xa8,0x6f,0x71,0xee,0xdf,0x94,0x9e,0xe9,0x43,0xbe,0x7c,0x85,0x74, +0x5f,0xfc,0xfe,0x4f,0xfb,0xab,0xac,0x83,0x51,0x8e,0xa3,0xf8,0x9c,0xf9,0xaa,0xa7, +0xe7,0xab,0xb1,0xe0,0xf3,0xf9,0xee,0x7f,0xd,0x5f,0xec,0xf1,0xc3,0xe5,0x23,0xa7, +0x51,0x7c,0xce,0x7c,0xa5,0x18,0xf9,0x8a,0xb5,0x1f,0x69,0x99,0x3e,0x7f,0xfd,0xc0, +0xf4,0xc5,0x1d,0x7f,0xc9,0x1f,0x3a,0x7c,0xf4,0x9f,0x45,0xf1,0x39,0xc7,0x5f,0xc5, +0x99,0x5f,0x34,0x9f,0x79,0x7d,0x4,0xfa,0x62,0xe7,0x97,0xbe,0xd3,0x17,0x3b,0x5f, +0x61,0xdd,0x37,0xb0,0xee,0xcf,0xd7,0xd4,0xfe,0x85,0x5f,0xbf,0x4a,0xe1,0xc3,0x28, +0x71,0x7e,0xd1,0x7d,0xb7,0x21,0x3b,0xff,0xa8,0xa0,0xf6,0xcf,0x34,0xeb,0xf6,0x9b, +0x16,0x53,0xe6,0x2b,0x2a,0xcc,0xae,0x5f,0xa5,0xf0,0xd1,0xf8,0xf9,0xea,0xcb,0xbb, +0x70,0x53,0xbb,0x7e,0xa1,0x9e,0xaf,0x4,0x61,0x76,0xfd,0x2a,0xa1,0x4f,0xbb,0x3e, +0x62,0xfa,0xb4,0xfa,0x55,0xbd,0x7f,0xa0,0xdf,0x5f,0xee,0xba,0xf2,0x95,0xed,0xdb, +0xf,0xe8,0xff,0x12,0xdc,0x7f,0x24,0xf0,0x79,0xf3,0xd5,0x3b,0xd4,0x5c,0xdf,0xbe, +0x56,0x64,0xf7,0xbf,0xbe,0xf1,0x23,0x1b,0x9f,0x3c,0x58,0x29,0x94,0x22,0xe4,0xab, +0x6b,0xfd,0x83,0xa2,0x2f,0x5f,0x61,0x69,0x27,0xb8,0xbe,0x81,0x92,0xd6,0x5f,0x62, +0xfb,0xb4,0x7c,0x25,0xed,0xaa,0xf9,0xc0,0x9b,0xaf,0xb0,0xd4,0xb2,0x7c,0xbe,0xfc, +0x12,0xc7,0x37,0x2e,0xa7,0xf1,0x69,0xf5,0x2b,0x35,0x5f,0x21,0x5f,0x3e,0xc0,0xd2, +0xe3,0x92,0xe9,0x1b,0xa6,0xf2,0xe9,0xe5,0x6,0xc3,0x37,0x75,0xff,0x69,0xf9,0x88, +0xee,0x47,0x68,0x3f,0xa4,0xe6,0x2b,0x8e,0x6f,0x64,0xbc,0x86,0x2c,0xe8,0xf8,0x46, +0xae,0x9f,0x2,0x68,0x5f,0xbf,0x34,0xb6,0x2f,0x30,0x5f,0xc9,0x57,0x1,0xc,0xac, +0x5f,0xc5,0xf3,0x95,0xed,0xfb,0x37,0x57,0xa5,0x4a,0xf3,0x5d,0x11,0xdc,0xbf,0x3b, +0x16,0x22,0xe6,0x2b,0x6c,0xce,0xb9,0x73,0xeb,0x57,0x49,0x7d,0xae,0xcf,0x99,0xe6, +0xfb,0xba,0xe8,0xf6,0x91,0x99,0xf9,0x8a,0x98,0x3e,0x3c,0x62,0xbe,0x7d,0x5e,0xff, +0x3c,0x7e,0xae,0xae,0x6d,0x53,0x9f,0xc2,0xf7,0x44,0x3f,0xbe,0x33,0x7c,0xfe,0x7c, +0x35,0x35,0x7d,0xe8,0x9,0x8,0x1b,0xdf,0x50,0xf7,0x79,0xba,0x9d,0xca,0xa7,0xf0, +0x7c,0xca,0xcc,0x7c,0x75,0xce,0x7c,0x93,0x52,0xb8,0xef,0xa5,0xda,0xad,0x28,0xbe, +0x76,0x31,0xd4,0x27,0x44,0xf6,0x9d,0x9d,0xea,0x3e,0xed,0x3d,0x8b,0xb3,0xd6,0xb7, +0x1b,0xbe,0x6,0x88,0x36,0xff,0xe1,0xf0,0x9d,0xa7,0xf0,0x19,0xed,0x77,0x7b,0x42, +0x23,0xe5,0x17,0xd4,0x7d,0x2d,0xa1,0x6f,0x8c,0x1c,0xbe,0x6b,0x9e,0xab,0x1a,0xcf, +0xf0,0xb5,0x25,0x29,0x9a,0x6f,0xfc,0xdc,0x6b,0x1d,0x10,0xfb,0xf8,0x4e,0x2f,0xa9, +0x97,0x64,0xd5,0xe1,0xbb,0xca,0xf1,0x29,0xe3,0xa7,0xad,0xe,0x43,0xcb,0x57,0xdd, +0x5d,0x8,0xd9,0xf5,0xb,0xda,0x2f,0xd3,0x48,0xf9,0xa,0xe1,0x37,0xa2,0xf9,0xa8, +0xb6,0x1c,0x97,0x6d,0x40,0xa8,0x39,0x61,0xc3,0xe1,0xfb,0x5a,0xd9,0xfd,0xa,0x19, +0xcd,0x47,0xe0,0x9b,0xb0,0xe7,0xc8,0x57,0x3f,0xec,0x1f,0x74,0x58,0xff,0x7,0xc0, +0xb7,0xa3,0xe5,0x2b,0xd5,0x17,0xf1,0xf8,0x6a,0x6f,0x48,0x95,0x1d,0x6,0x78,0xe0, +0x1e,0x3f,0xa6,0x25,0xcf,0xf8,0xa1,0xf9,0x14,0x3b,0x5f,0x21,0xd3,0x67,0xe6,0x97, +0x1d,0x96,0xaf,0x4,0x10,0x96,0xaf,0x10,0xbe,0x17,0xcd,0x37,0xd5,0xce,0x3f,0x6b, +0x3,0xcc,0x55,0xd5,0x37,0x74,0xfb,0xe4,0xa2,0x77,0x7c,0xbb,0x65,0xfb,0xb4,0xf9, +0xc1,0x97,0xfb,0x7,0x8f,0x7c,0x3e,0x2c,0x89,0xdb,0x61,0xe3,0x2f,0xc2,0xf5,0x5a, +0x24,0xdf,0x29,0x75,0xbc,0x1c,0x50,0x3b,0xc7,0xd5,0xfb,0x5e,0xb3,0xca,0xa4,0xfa, +0xb8,0xd3,0x85,0x62,0xb5,0x82,0xed,0x7c,0x40,0x5f,0xde,0x6d,0x3e,0xe2,0xe4,0x2b, +0xf1,0x56,0x58,0xbe,0x8a,0x3c,0xbe,0x41,0x67,0xfb,0x11,0xc5,0x11,0x14,0x82,0xdb, +0xef,0x75,0xcb,0xa7,0xd5,0xaf,0xfa,0x60,0xa3,0xc2,0xc9,0x57,0x3b,0xec,0xf8,0x22, +0x9e,0x8f,0xb4,0xf5,0x2d,0x42,0x23,0x5e,0xbf,0xec,0xfc,0xe3,0xf9,0x38,0xe7,0x5f, +0xb5,0x82,0x1c,0xf5,0xab,0xcb,0xa0,0x59,0xe0,0xe4,0xab,0xbe,0xe5,0xe3,0x1d,0x5f, +0x2,0xaa,0xd1,0xda,0x4f,0xef,0xff,0xac,0xd,0x44,0x6b,0xda,0x62,0x35,0xb7,0xcf, +0xf3,0xa,0x28,0xcd,0x57,0x79,0x4,0xed,0x7c,0x5,0xfb,0xa0,0xe,0x39,0xf9,0xaa, +0xc7,0x7c,0x90,0x77,0x7d,0x10,0x50,0x89,0xe1,0x23,0x56,0x79,0xb3,0xac,0xbd,0xb8, +0xd4,0xe5,0xf3,0xde,0xa,0x8,0xa,0xaa,0xfc,0xe8,0x5,0x47,0xbe,0xea,0x19,0xbe, +0x13,0xec,0xce,0x57,0x5f,0x66,0x3e,0xc0,0xeb,0x5f,0x8,0x78,0x25,0x9a,0x6f,0x52, +0xf6,0x8c,0xbf,0x10,0xcd,0xf0,0x5,0xe5,0xab,0x53,0xa3,0x7e,0xc5,0xf2,0xd5,0x67, +0xec,0xfe,0x6d,0x83,0xd7,0x3f,0x13,0xfd,0x46,0x34,0x82,0x4f,0x2,0x69,0x7c,0xce, +0x7c,0x65,0xe4,0x3,0xb3,0xbe,0x81,0x11,0xa,0xcd,0x57,0xa4,0x4d,0xa3,0xf9,0xfa, +0xce,0x7c,0x35,0xfd,0xd7,0x31,0x7d,0xce,0xf1,0xf7,0x38,0x96,0xf,0x24,0xf1,0xe1, +0x56,0x72,0xdf,0x99,0xe1,0xd3,0xeb,0x2f,0xb3,0xf3,0x95,0x4,0x60,0x34,0x1f,0xf0, +0xfa,0x66,0x5e,0x1f,0x41,0xed,0xd7,0xd5,0xf3,0x95,0x1c,0x2d,0xbf,0x48,0x20,0xe2, +0xfa,0x3a,0x9f,0x4f,0x2e,0x25,0xf4,0xed,0xc6,0xa9,0x5f,0x9d,0x80,0x71,0x42,0x9f, +0xb7,0x7f,0xe,0xbf,0x3e,0x1c,0xf3,0x83,0x38,0x4e,0xfd,0x2a,0xfa,0xf8,0x6,0xa8, +0xfb,0xfa,0xe0,0xfb,0x84,0xc0,0xfa,0x95,0x35,0x3f,0x88,0x3,0xea,0x57,0x30,0xd5, +0xfd,0x25,0xaf,0xbe,0xc1,0xf1,0x55,0x3,0xeb,0x57,0x48,0xf5,0x21,0xdf,0xfc,0xa0, +0x9a,0xaf,0xd8,0xfd,0x51,0x27,0xd5,0xfd,0x39,0xaf,0x72,0x40,0x5c,0xf5,0x97,0x30, +0x9f,0x96,0xaf,0x24,0x97,0xcf,0xae,0x5f,0xb1,0xfb,0xdf,0x47,0x99,0xd7,0xaf,0xa2, +0xfb,0xb4,0x7c,0xf5,0x70,0xb7,0xd9,0x9,0xab,0x5f,0xc1,0x54,0xf5,0xa1,0x74,0xbe, +0x90,0xfa,0xd5,0x3c,0x7c,0xf2,0xa5,0xa0,0x72,0x60,0x35,0x7e,0xfd,0x8a,0x9d,0x7f, +0x90,0x77,0x7c,0x93,0xd5,0x4f,0x15,0x2a,0x7f,0x83,0xef,0xb3,0xf6,0x3b,0x8b,0x5c, +0xbf,0xfa,0x14,0x86,0xe5,0xab,0x64,0x3e,0x12,0xe8,0x63,0xd,0x1c,0x32,0x3f,0x78, +0xe8,0xce,0x57,0x4f,0xc3,0xb0,0xfe,0x25,0xd9,0xfa,0x1c,0xea,0xf0,0x89,0x57,0x15, +0xd1,0xf7,0x7,0x91,0x10,0x9c,0xaf,0xa0,0x3b,0x5f,0x59,0xf5,0x2b,0xc8,0x9f,0x5f, +0x98,0xa6,0xf4,0xdd,0xfc,0xfc,0xcc,0xe1,0x33,0x5f,0x78,0xe0,0xf5,0x39,0xf3,0x15, +0x70,0xe7,0x97,0x27,0x30,0x7c,0x7e,0xe6,0x3c,0x9d,0x8f,0xb4,0xa6,0x67,0x7f,0x61, +0x2f,0x36,0x1,0xfc,0xf6,0x73,0x8e,0xbf,0x7b,0x6e,0x5f,0x78,0xfd,0x2a,0xfd,0xf1, +0x6d,0x29,0x6f,0xfc,0x10,0x79,0x7d,0xf2,0x8c,0xf5,0xed,0x91,0xf3,0x55,0x6,0xbe, +0xab,0x6f,0xb4,0xec,0x27,0xb6,0x3a,0xb3,0xdb,0xcf,0xa8,0x5f,0x45,0x9e,0x7f,0x8b, +0xbf,0xfe,0xca,0xed,0x7b,0x3c,0xfa,0x89,0xc3,0x17,0x70,0xfe,0xf9,0xeb,0x57,0x84, +0x46,0xf6,0xd5,0xd3,0xb5,0x9f,0xea,0x3,0xbc,0xf3,0x4f,0xab,0x5f,0x21,0x4e,0xbe, +0x32,0xea,0x57,0x75,0x1a,0x71,0x7e,0x90,0x24,0x5a,0x7f,0xa0,0xfb,0xf4,0xdb,0x61, +0xae,0x4f,0x36,0xeb,0x43,0x43,0x4e,0xbe,0x32,0xea,0x57,0x35,0xbf,0x2f,0xa0,0xff, +0x4b,0xb4,0xfe,0x4a,0xf7,0xe9,0xe5,0x84,0xd6,0xa8,0xd7,0x12,0x5d,0x1d,0x9d,0xa3, +0x7e,0x75,0x10,0x98,0xaf,0x1a,0x7e,0x5f,0xc0,0xf8,0x11,0x7f,0xfd,0xb,0xf3,0xe9, +0xe5,0x98,0x9d,0xab,0xbd,0x96,0xdd,0xbf,0xb4,0xcb,0xae,0xfa,0x15,0xa,0xcc,0x57, +0x3f,0xf2,0x5f,0x1f,0x1,0xe3,0x6f,0x1c,0x9f,0xdd,0x19,0x7c,0x63,0xd6,0x8b,0x71, +0xf4,0xfa,0x95,0xa3,0xfe,0x42,0xfb,0xbb,0x4d,0xe8,0x5f,0x7f,0xe5,0xf0,0xf9,0xf2, +0xcb,0x38,0xee,0xfa,0x2b,0xca,0x69,0xbf,0xa0,0xff,0x14,0xbd,0x7e,0x85,0x1c,0xf9, +0xaa,0xf,0x36,0x42,0x9f,0x5f,0xa0,0xbc,0xf5,0xed,0xf1,0xda,0x8f,0x72,0xce,0xbf, +0x40,0x9f,0xa7,0x7e,0x85,0x76,0x40,0x13,0x2c,0xd6,0x37,0x15,0xc2,0x7d,0x95,0x47, +0xc8,0x51,0xbf,0xe2,0xaf,0x6f,0x9f,0xed,0x8b,0x71,0xfd,0x7a,0x7c,0x9e,0xcf,0xdf, +0x95,0x5c,0xf9,0x4f,0xab,0x5f,0x55,0xed,0x7c,0x75,0xed,0x69,0x50,0x2f,0x84,0x3d, +0x3f,0x13,0xe4,0x8b,0xd1,0xff,0x85,0xfb,0xb4,0x99,0x5c,0x71,0x76,0xfd,0xca,0x98, +0x1f,0x54,0x22,0xfb,0x62,0x8c,0x1f,0xb3,0x7d,0x60,0x76,0xfd,0xca,0xc8,0x57,0x67, +0xd1,0x7d,0x1b,0x19,0xfa,0x22,0xd4,0x37,0x7e,0xa5,0xfb,0x9e,0x78,0x7c,0x1,0xfb, +0xb7,0xc7,0xcb,0xf7,0xe1,0x3e,0x10,0xc9,0x77,0xf6,0xb1,0xee,0x53,0x16,0xef,0x1b, +0x6e,0x47,0x6a,0x3f,0x3d,0x1f,0xdc,0x9e,0xbf,0xcf,0x78,0x43,0xfc,0x9e,0x67,0xa5, +0x98,0x18,0xc9,0xd7,0x96,0x3c,0xbe,0xa0,0x4f,0xa,0x9f,0xf1,0x86,0xf8,0xd6,0xe9, +0x30,0x68,0xfc,0xf0,0xd4,0xaf,0x9a,0xbb,0x10,0x4,0xe6,0x2b,0xfa,0x79,0xb1,0x98, +0xb9,0x4f,0x7b,0x43,0xfc,0xda,0xf1,0x81,0x85,0x10,0x3,0x7d,0xda,0xfc,0xe0,0xf3, +0xfd,0x83,0x6d,0x3b,0x5f,0x79,0x7d,0xa3,0x9,0xca,0xd2,0xa7,0xf5,0x69,0xfa,0x1b, +0xe2,0x5,0xfb,0xf8,0x42,0x10,0xe2,0x1b,0x4d,0x5a,0xfd,0x83,0x5b,0x76,0x7e,0x69, +0x2d,0xc2,0x27,0xb5,0x9d,0x3e,0xed,0xfa,0x5d,0x17,0x2,0xeb,0x57,0xce,0xe7,0x7, +0x39,0x3e,0xc4,0xf5,0xc5,0xab,0xbf,0xf8,0x7c,0xc0,0xeb,0x13,0xc4,0xc0,0xfa,0x95, +0xf5,0xfc,0x20,0x2f,0x5f,0x65,0xec,0x93,0x4b,0x2e,0x9f,0x5c,0x9a,0xe1,0xb,0x7e, +0x7e,0xd0,0xbe,0x3e,0x60,0x86,0x3e,0x4,0x99,0x6f,0x4d,0xf3,0x21,0x38,0xbb,0xfd, +0xc2,0xf3,0x15,0x1d,0x51,0x10,0xf2,0xf3,0xe2,0xfa,0xb4,0xe0,0xae,0xf9,0x7e,0x50, +0x6c,0x69,0x3e,0x23,0xc7,0x43,0xf0,0x83,0x62,0x80,0x4f,0xcb,0x57,0x3b,0xa0,0x1e, +0xec,0x23,0xa3,0xd0,0xed,0x8a,0xe2,0xfb,0xb6,0xa9,0xf6,0x86,0xf8,0x1f,0x14,0xf7, +0xc,0xdf,0xb6,0x5e,0xa2,0xfe,0x41,0xd1,0xb8,0x3e,0xa6,0x77,0x39,0xf5,0xab,0x96, +0xe1,0xd3,0xd7,0x77,0xf2,0x7c,0x42,0xc6,0x3e,0xed,0xf3,0x83,0x22,0xef,0x97,0x14, +0x37,0x42,0xea,0x57,0xd8,0x59,0xbf,0xb2,0x3e,0x57,0x9,0xf7,0x95,0x99,0x91,0xd7, +0x5f,0xc5,0xf2,0xd1,0x46,0x48,0xfd,0xa,0x3b,0xeb,0x43,0x33,0x4f,0xf4,0xa8,0xeb, +0xaf,0xd2,0xf9,0x9c,0xe3,0x2f,0x8a,0xe7,0x8b,0xb8,0xfe,0xca,0xfd,0x19,0x14,0x5c, +0x20,0xcf,0x2f,0x29,0xbd,0x23,0xcc,0x7c,0x7e,0x30,0xb2,0xaf,0x1,0x92,0xec,0xff, +0xe2,0x1,0x79,0x7e,0x79,0x6f,0x56,0xfb,0xdd,0x8e,0xec,0x7b,0x6d,0xe,0x3e,0x42, +0x43,0x7c,0x7a,0x7d,0x57,0x8a,0xe8,0x8b,0xbc,0xfe,0x2a,0xd6,0xf1,0x55,0xf4,0xfa, +0xda,0xe3,0xcb,0x4f,0x15,0x39,0xf5,0x2b,0x63,0x7d,0x7b,0x25,0x62,0xfb,0x45,0x5e, +0x7f,0xe5,0xb9,0x40,0xdc,0x20,0xcf,0x2f,0xe5,0x67,0xb4,0xfe,0xef,0xa5,0x9,0xa1, +0x9c,0xfa,0x95,0xee,0x3,0xd1,0x7d,0x89,0x8e,0xef,0xb6,0x1b,0xe4,0xf9,0xa5,0x31, +0x7e,0xb8,0x7c,0xa3,0x89,0xe9,0x33,0xf3,0xcb,0xa3,0xa8,0xbe,0x7b,0x49,0x7c,0x44, +0x70,0x81,0x3c,0xbf,0xf4,0xfb,0xb4,0xf5,0xed,0x92,0xcb,0xf7,0x6e,0xb4,0xfb,0x8f, +0xc8,0xeb,0xaf,0xdc,0x9f,0x33,0xba,0xae,0x7f,0xc3,0x2f,0x19,0x9b,0x6e,0xb9,0x7f, +0x69,0xd6,0xaf,0xc8,0xe7,0x97,0x9f,0x2a,0xd9,0xf9,0x80,0xbf,0xbe,0xdd,0xe3,0xcb, +0xea,0xfd,0x5b,0xc8,0x75,0xc1,0x42,0x44,0x39,0xed,0x47,0x9e,0xee,0x13,0x47,0xbe, +0xa,0x7a,0x7e,0xd0,0xe5,0xf3,0xbd,0x7f,0x8b,0xb4,0xe5,0x24,0x3e,0xf7,0x5,0xb, +0x7d,0xfd,0xb3,0xee,0x1b,0x49,0xc4,0x91,0xaf,0x82,0x9e,0x1f,0x74,0xd5,0xf,0x7c, +0xef,0xdf,0x22,0xa0,0x2a,0xd0,0xb4,0xfd,0x1f,0xa4,0xbc,0xf6,0x53,0x9e,0xd8,0xbe, +0x90,0xe7,0x7,0xbd,0x3e,0xf7,0xfb,0xb7,0x62,0xac,0xbf,0x8a,0xe1,0x9b,0xbe,0xae, +0xd5,0xef,0x9f,0x4c,0x9e,0x72,0xe6,0x2b,0x73,0x7e,0x30,0xd0,0xc7,0x7d,0xff,0x56, +0x42,0x1f,0x2e,0xb9,0x7c,0xee,0x5f,0xaa,0x5f,0xde,0x9,0xae,0x5f,0xb9,0x7d,0x72, +0x69,0xad,0x64,0xfa,0xb8,0xef,0xdf,0x22,0xe0,0x3f,0x24,0xba,0x3e,0x2a,0xee,0xeb, +0xa3,0xe2,0x39,0xbe,0x3b,0xc1,0xf5,0x2b,0xb7,0xf,0x4b,0x2d,0xe8,0xf0,0xf9,0xde, +0xbf,0x45,0xda,0xc3,0x24,0xe7,0x1f,0xac,0xba,0x7c,0xee,0x5f,0x52,0xed,0x9,0xd7, +0x88,0xfb,0xaf,0x71,0x7c,0xae,0xf7,0x6f,0x91,0xa8,0xeb,0x9b,0xe2,0xf9,0xea,0xd1, +0x7d,0x22,0xf3,0x71,0xdf,0xbf,0x25,0x25,0xf4,0x21,0xb7,0xf,0x25,0xf6,0x8d,0x0, +0x3b,0xff,0xb8,0xef,0xdf,0x9a,0x8f,0x8f,0xe0,0xa8,0xbe,0xd0,0xe7,0x67,0x68,0x8c, +0xf5,0x57,0x7c,0xdf,0x4a,0x11,0x43,0x8e,0x4f,0xd1,0x7d,0x8d,0x4f,0xd7,0xca,0x33, +0xdb,0x2f,0xec,0xf9,0x99,0x14,0xe3,0x9b,0x71,0xb3,0x4f,0xbe,0x64,0xf8,0xcc,0x5f, +0xda,0xf9,0xea,0x39,0xcd,0xf7,0xc7,0xdd,0x16,0x98,0xe9,0xb,0x7b,0x7e,0x26,0xb9, +0xcf,0x28,0x68,0x50,0xa5,0xd6,0xed,0x6a,0x3e,0xb9,0xc4,0xab,0xff,0xbd,0xd8,0xe8, +0xc2,0x99,0xbe,0xb0,0xf5,0x7,0xc9,0x7d,0xec,0x63,0xfa,0xf8,0xf5,0xc9,0x17,0x1b, +0x78,0xf6,0xf5,0x11,0xb6,0xfe,0x20,0x5d,0xfd,0xca,0xf0,0xfd,0xba,0x68,0xf9,0xdc, +0x5b,0x8a,0xa,0xe4,0x78,0xa6,0x6f,0xf6,0xfb,0x21,0x52,0xfb,0x1c,0xed,0x47,0xdc, +0xed,0x47,0x9e,0xae,0xce,0x6e,0x3f,0x67,0x3e,0x10,0x17,0xec,0x1b,0x55,0x67,0x9f, +0x7f,0xb3,0x7c,0x29,0xea,0xa7,0xb3,0x7c,0xca,0x4,0xcf,0xbe,0x7e,0x9d,0x3e,0xde, +0xf5,0x9b,0xda,0xf7,0x16,0xcf,0xa7,0xd7,0xaf,0x94,0xc9,0x94,0xd7,0xff,0x9d,0x4, +0xe6,0xab,0xf4,0xfb,0x5f,0xf9,0x3e,0xf7,0x6f,0xbc,0xc8,0xf3,0xe1,0x90,0xfa,0x8b, +0x44,0xc7,0xf7,0x9f,0xc7,0xbc,0x7c,0xe5,0x1c,0x3f,0x84,0xdb,0xc6,0x7b,0xb9,0xe2, +0xad,0xbf,0xa,0x1a,0x4d,0x7c,0xc7,0x37,0xac,0x3e,0x44,0x61,0xb3,0x87,0x78,0xf9, +0xc5,0xb9,0xfe,0xe0,0xe6,0x6b,0xa8,0x6e,0xf8,0xce,0x17,0xef,0x6b,0x18,0x63,0x6, +0x27,0x5f,0x39,0x7c,0xc6,0xcd,0x69,0xca,0xe3,0x1b,0xe4,0xbb,0x1b,0x32,0x3f,0xa8, +0xe,0x87,0xa,0xe0,0xe4,0x2b,0xd7,0xfb,0xb7,0x5e,0x7a,0x8d,0xa4,0xf7,0xad,0x9b, +0x3b,0x4e,0xfb,0x7d,0xd5,0xb0,0xf6,0x3b,0x41,0x8a,0xe8,0xc8,0x57,0xdc,0xe3,0xfb, +0xd2,0xed,0x9b,0x96,0x6f,0x23,0x73,0x1f,0x9,0x5b,0x7f,0x45,0xc9,0x75,0xe5,0x96, +0x23,0x5f,0x1,0xde,0xf5,0xf1,0x6a,0xe5,0x23,0xcb,0x57,0xcf,0xdc,0x67,0xd4,0xaf, +0xc4,0x6b,0xd8,0xaa,0x29,0xbf,0x2b,0xa3,0x4e,0xa1,0xa0,0xef,0x2f,0xaa,0x9e,0x9d, +0x53,0xe8,0xc8,0x57,0x22,0x2f,0x5f,0xbd,0x5a,0xb1,0xce,0xbf,0x44,0xeb,0xf,0x5c, +0xbe,0x7d,0xaf,0xcf,0xa8,0x5f,0xbd,0x2c,0xd5,0xac,0x5b,0xd9,0x4a,0xb5,0xda,0xa8, +0xd5,0xf4,0xe7,0x7b,0xdc,0xd7,0x87,0xb9,0xa7,0xb5,0x37,0x5f,0xbd,0xaa,0x5d,0x1f, +0xb1,0xf7,0xbf,0xa,0xf0,0x6d,0x70,0xc7,0xf,0xfa,0xd2,0xa4,0x59,0xb7,0x7c,0x95, +0x46,0xd5,0xf0,0x51,0x77,0xff,0x82,0x26,0xdc,0xf1,0xad,0xaa,0xf5,0x2f,0xbb,0xc9, +0xd7,0xbf,0xb8,0x7c,0x97,0x2,0x7c,0xc4,0xf2,0x11,0x8,0x27,0xb8,0x56,0x33,0xe6, +0x67,0x9c,0xfd,0x33,0x46,0xbf,0x2f,0x72,0x7d,0x5a,0xff,0xbc,0x9e,0xdc,0xd7,0xe6, +0x2d,0xb9,0x32,0x2a,0xb2,0x56,0xbe,0x1a,0x7d,0xd4,0xb5,0x7c,0x63,0xf8,0x4,0x17, +0x56,0x9d,0xf3,0x83,0xa1,0xf9,0x2a,0xe1,0xfe,0x57,0xf6,0x7,0x70,0xda,0xcf,0xbe, +0x15,0x37,0xf3,0xd5,0xe4,0xd8,0xf2,0xd1,0xca,0xef,0xb0,0x50,0x3,0xf1,0xf2,0x4b, +0x8a,0xf6,0x3,0x9c,0xf3,0xcf,0xeb,0x1b,0x39,0x7c,0xb0,0xd2,0xa8,0x9,0x35,0x31, +0x9e,0x6f,0x37,0x23,0xdf,0x3e,0xd7,0xa7,0x4c,0xa4,0xd3,0x9a,0xe5,0xab,0x56,0x9b, +0xb3,0x7c,0xbe,0x7c,0x75,0x94,0x7c,0xfd,0x95,0xcb,0x47,0xf9,0x3e,0xe4,0xe8,0xff, +0x5e,0x97,0xd1,0x81,0x50,0x10,0xc3,0xf2,0xd5,0x46,0xfa,0xfd,0xaf,0x62,0xf9,0x5c, +0xbf,0x2b,0x98,0x5f,0xd0,0xfa,0x67,0x38,0xda,0xd5,0x1f,0x4a,0x35,0x9f,0x9f,0x61, +0xfd,0x33,0xa,0x7a,0x3e,0xa0,0xbe,0x0,0x9f,0x68,0x8e,0x32,0xda,0xf8,0x36,0xfc, +0x78,0xc7,0xd8,0x3c,0xd4,0xc8,0x7,0x65,0xe6,0xb,0x7a,0xbe,0x62,0x23,0xa9,0x2f, +0xa0,0x34,0xcd,0xf3,0x39,0xc7,0x5f,0xd5,0x67,0xc,0xba,0xc6,0xf3,0x3d,0xac,0xfd, +0xb8,0xcf,0xa7,0x24,0xcd,0xf7,0xc9,0x7d,0xa,0x3d,0xfe,0x89,0xe8,0xf0,0x89,0x73, +0xf5,0x29,0xa4,0x94,0xc0,0xb7,0x6f,0xfb,0x46,0xc0,0xf2,0xa5,0x7f,0x7e,0x86,0xe3, +0x53,0x60,0x4c,0x1f,0xa6,0xa3,0xd7,0x64,0xcb,0xa7,0xe6,0x2b,0xe6,0x3,0xe9,0x9f, +0x9f,0x49,0xec,0x3b,0xc7,0xaf,0xcb,0xb0,0x50,0xd0,0xea,0xe3,0x48,0xf5,0x11,0xbb, +0xfd,0xec,0x7c,0x5,0xd2,0xef,0x2f,0xc5,0xf1,0xd1,0x48,0xbe,0xc9,0xf7,0xd5,0x80, +0x55,0xab,0x69,0xf3,0xb,0x3,0xd5,0xe7,0xb8,0x3e,0x30,0xb4,0x7c,0xe9,0xf7,0xe7, +0x4a,0xe3,0x53,0x7,0xb8,0x9a,0xb1,0xff,0x95,0x34,0x72,0xf4,0x2f,0xc8,0x7a,0x7f, +0x72,0x6,0xfb,0x9b,0xf1,0x7c,0x20,0x8a,0x4f,0xfa,0xab,0xa,0x6c,0xd6,0x6a,0xdf, +0x35,0x7d,0x76,0xff,0x3c,0xcb,0x97,0xb4,0xfe,0x62,0xfb,0xc4,0x68,0xbe,0xd7,0x61, +0xb3,0xb0,0x7a,0x3d,0x6a,0xbe,0xca,0xd0,0x27,0x44,0xf3,0x9,0x15,0x35,0x1f,0x54, +0xe3,0xe5,0x97,0x2c,0x7c,0x84,0x46,0x3c,0xbe,0xc9,0x7c,0x49,0xeb,0xa7,0xcc,0x37, +0xfd,0x27,0x91,0xc6,0x5f,0xa9,0x5b,0xa9,0xd6,0x66,0xf9,0x52,0x3d,0x9f,0x1c,0x6b, +0x7c,0x23,0xde,0xfd,0xaf,0x26,0x5d,0x35,0x60,0x9,0x7a,0xff,0x87,0xa3,0xd7,0xaf, +0xe6,0xe6,0x9b,0xf2,0xf6,0x97,0x32,0xf3,0xd5,0x29,0x85,0xb0,0xb0,0xb,0x66,0xd4, +0xaf,0xd8,0xdf,0x4a,0xb8,0xfe,0x6a,0x86,0xef,0xdc,0xeb,0xc3,0xd4,0xca,0x57,0xc7, +0x74,0xf8,0x9,0xde,0x1,0xfe,0xfa,0x90,0xc8,0xdd,0xff,0x25,0xd9,0xfa,0xab,0x59, +0xc7,0x57,0x9,0x1b,0x7f,0x87,0x1f,0x2b,0x3c,0xdf,0x8f,0x79,0xf9,0x25,0xee,0xfa, +0xab,0xed,0xc,0x7c,0xc7,0x3f,0x51,0x44,0x8e,0xef,0xad,0x0,0x5f,0x9c,0xf5,0x25, +0x56,0x9a,0x4a,0xe9,0xdb,0xb7,0xf3,0x55,0x8f,0x5b,0xbf,0xb2,0x7d,0xb1,0xd6,0x5f, +0xc9,0x42,0x34,0x1f,0xe,0xcf,0x57,0x8a,0x6c,0xe7,0x2b,0xdb,0xc7,0xbf,0x3e,0x62, +0xad,0xbf,0x1a,0xd3,0x64,0xbe,0x73,0xbc,0xbf,0xf7,0xa8,0x50,0xd8,0x64,0x3e,0x62, +0xe7,0xab,0xa7,0x43,0xf7,0xd7,0x8b,0xb9,0xfe,0x6a,0x8f,0xfd,0x8b,0x35,0x47,0x6b, +0xdd,0x2e,0x6a,0xfb,0xe7,0xc8,0x41,0xbe,0xc9,0xf7,0x9b,0x2d,0x35,0xbf,0x88,0xcc, +0x67,0x5f,0x1f,0x33,0xf6,0xd7,0x8b,0xb9,0xfe,0xca,0x62,0x15,0x7c,0x7d,0xac,0xb6, +0xff,0xd0,0x58,0x8,0xcc,0x57,0xf5,0x96,0x9d,0xaf,0x24,0x47,0xff,0x32,0xe3,0xf9, +0xe4,0x78,0xeb,0xaf,0xac,0xcb,0x83,0x58,0x2b,0xa5,0xda,0xcc,0xa1,0xed,0xdf,0xa4, +0x3d,0xbd,0x1a,0x30,0xfe,0xd6,0x45,0x35,0x5f,0x19,0xfb,0x8b,0x4a,0x8e,0xfe,0x79, +0xe6,0xfe,0x7a,0xb1,0xd6,0x5f,0x91,0x95,0xe8,0x1f,0xaf,0x6f,0x4f,0xcd,0x57,0xae, +0xf5,0x57,0x91,0xf2,0x55,0xbc,0xf1,0x2d,0x4d,0xfb,0x29,0x6a,0x7e,0x41,0xb1,0xf3, +0xb,0x69,0xf,0x4,0x3a,0xff,0xf3,0x4f,0xf5,0xb5,0x92,0xf9,0x80,0x10,0xc7,0xb7, +0x1f,0xed,0xfa,0xe5,0xe4,0xab,0x66,0xab,0x99,0x24,0x5f,0x11,0xb0,0x16,0x27,0xbf, +0x1c,0xfa,0xfa,0x3f,0xec,0x2c,0x1,0x29,0xcc,0x27,0xfb,0xf2,0xd5,0xfe,0x5e,0xc3, +0xc8,0x57,0xa,0xe,0xf0,0xed,0xf1,0xf7,0xbf,0x8a,0xe5,0x93,0x23,0xfa,0x70,0x70, +0xbe,0xd2,0xf7,0x9f,0x54,0xcf,0x2a,0xc1,0x18,0x3f,0xae,0x14,0x8b,0x61,0xf7,0xe7, +0x44,0x7f,0x10,0x28,0xb2,0x6f,0x2a,0x44,0xf3,0xa1,0xe0,0x7c,0x65,0xec,0x8f,0x59, +0xd9,0x11,0xcc,0xf1,0xd7,0x78,0xae,0x27,0x28,0x5f,0x91,0xb6,0x12,0xc7,0xe7,0xcf, +0x7,0x7c,0xdf,0x38,0x78,0xfc,0x7d,0xa2,0xef,0x2f,0x55,0x69,0xf9,0x7c,0x9b,0xdc, +0xfd,0xeb,0x40,0x2c,0x9f,0x3f,0x5f,0x5,0xb4,0x9f,0x30,0xcb,0xd7,0xf4,0xf9,0x9a, +0x3c,0x9f,0x4,0x70,0xba,0x7c,0xcf,0xf7,0x85,0xac,0x1f,0x1f,0xe9,0xfb,0x5f,0xbd, +0x52,0x33,0x7d,0x9f,0x5f,0x66,0x3e,0xee,0xfe,0x89,0x8b,0xf7,0xd,0xf4,0xfd,0xaf, +0x60,0xc3,0xbc,0x3e,0xae,0x5a,0xed,0xc7,0xdd,0xbf,0xf8,0x64,0x3e,0x3e,0x7d,0x7f, +0x6,0x54,0x72,0xac,0x44,0xfb,0xf5,0xdd,0x4a,0xa1,0x0,0x59,0xff,0x2,0xa0,0xb9, +0x3e,0x1b,0x2b,0xf6,0xf1,0x9d,0xcb,0xfd,0x9b,0xcb,0x67,0xf5,0xcf,0xb2,0x3e,0xbf, +0x0,0x1d,0x2b,0xf9,0x1a,0xd,0x35,0xbf,0x74,0x6c,0xdf,0x8f,0xca,0x5e,0xdf,0xfe, +0x5c,0xee,0x7f,0x5d,0x3e,0xd7,0xf8,0x46,0x46,0x13,0xcc,0xf1,0x19,0x7f,0x1d,0x8a, +0xbe,0xf6,0x9b,0x4b,0xfd,0xc0,0xed,0x73,0xe5,0x3,0x32,0x72,0xd6,0x3e,0xaa,0x8, +0xd7,0x6a,0xf6,0xfe,0xa2,0xac,0x7f,0xc6,0xd3,0x62,0x31,0xb3,0xfa,0x8b,0xf8,0xe1, +0x5a,0x78,0xff,0x37,0x70,0xad,0xbf,0x72,0xf9,0xee,0xde,0xad,0x15,0x56,0xbd,0xfb, +0x8b,0x66,0x5c,0xbf,0x12,0x1b,0xd6,0x4e,0x2a,0x11,0xda,0x8f,0xbe,0xe4,0xf4,0x9, +0xa2,0x9a,0xf,0x2a,0xf3,0xad,0x5f,0x81,0x4a,0x17,0x45,0x3f,0xff,0xe8,0x4b,0xce, +0xf3,0xaf,0xda,0x50,0x7d,0x85,0xd8,0xbe,0x58,0xf5,0x53,0x60,0xed,0xb7,0x3a,0xeb, +0xfa,0xd5,0x7d,0x3b,0xce,0xeb,0x57,0xf7,0xc1,0xd8,0xf9,0x2a,0x96,0x4f,0x82,0x38, +0x5a,0xff,0x67,0x3c,0x3f,0x28,0x3a,0xfb,0xbf,0xf,0xef,0x56,0x5,0xa3,0xff,0xb, +0xda,0x9f,0x1,0xa5,0xde,0xff,0x2a,0xb2,0x8f,0xb3,0xfe,0x4a,0xb4,0xf2,0x95,0xfe, +0xfc,0xf9,0xe0,0xae,0x95,0xaf,0x80,0xe9,0x1b,0xf2,0xe7,0x3f,0x62,0xac,0xbf,0x7a, +0x12,0xd5,0xc7,0x59,0xdf,0x4,0xac,0x7c,0xa5,0xef,0x8f,0x54,0x69,0x88,0x66,0x3e, +0x30,0x96,0xfe,0x7a,0xdf,0xbf,0x65,0xfb,0xce,0xe3,0xf8,0x66,0x5c,0x1f,0x21,0x3e, +0x3b,0xbf,0x78,0x7d,0xb7,0x4c,0xdf,0x1,0x7f,0xfe,0x2d,0xc6,0xf1,0xc5,0x68,0x46, +0xff,0xc2,0x7c,0x24,0x64,0xfd,0xd5,0x13,0x23,0x9f,0x8a,0x96,0xf,0x64,0xe7,0x93, +0xd7,0x4a,0xa9,0xdb,0x6f,0xa4,0xb7,0xdf,0x2b,0xf7,0x59,0xbe,0xb2,0xce,0xbf,0x6, +0xff,0xf8,0xc6,0x5d,0x7f,0x75,0xa8,0x9e,0xea,0xeb,0x9a,0x6f,0x5a,0x46,0x74,0x5c, +0xd2,0x7c,0x9b,0x44,0xbb,0x21,0x8e,0xe8,0x1b,0xe8,0xfb,0x5f,0x41,0xb3,0xfd,0xe4, +0xab,0x56,0xfb,0x6d,0xf0,0xaf,0x8f,0xb8,0xeb,0xaf,0xfa,0xb4,0xac,0xa,0x81,0xb6, +0xc1,0xb2,0x36,0xd9,0xa7,0xf9,0x6a,0x53,0xed,0x28,0x84,0x5e,0xbf,0xd5,0x46,0xdf, +0x9c,0x1f,0x54,0x7a,0x46,0x3e,0x30,0x8f,0xaf,0x62,0xf9,0x82,0xfa,0x97,0x98,0xeb, +0xf,0xfa,0xa4,0xf5,0x4d,0xd3,0x77,0xf0,0x97,0x55,0xc3,0x77,0xfe,0xfb,0x3f,0xe1, +0xf4,0x7f,0xce,0xfb,0x96,0xe3,0xf7,0x3e,0x45,0xc6,0xfc,0xa0,0xde,0xff,0x1,0xd8, +0xf0,0xfb,0x2,0xf6,0xe7,0x8a,0xb9,0x7e,0xa3,0x4f,0x1f,0x7f,0x6c,0xfa,0xd0,0x9f, +0x37,0xc,0x1f,0x39,0xfd,0x23,0x4f,0x7e,0xf6,0xf9,0xde,0xff,0xad,0xea,0xb3,0xf7, +0x97,0xe2,0xf8,0x82,0xc6,0xb7,0x98,0xeb,0x5f,0xfa,0xb4,0xd5,0x7b,0x60,0xfa,0x9a, +0xef,0x96,0xd,0x1f,0xba,0x53,0x8,0xf5,0x29,0xc7,0xef,0xf7,0xb1,0xd3,0xc7,0xfa, +0x67,0x35,0x5f,0xcd,0xc1,0xc7,0xda,0xaf,0xc9,0xda,0xf,0xdd,0xd1,0xdb,0x6f,0x1a, +0x54,0xbf,0x52,0x7a,0x1f,0xf4,0x71,0x61,0xb5,0x13,0x2f,0x5f,0x25,0xda,0xff,0x2a, +0xcc,0x17,0x38,0xbf,0xa5,0xec,0x36,0x5e,0xc6,0xb1,0xeb,0x43,0x34,0xeb,0xf6,0xb, +0xf6,0xf5,0x72,0xee,0xdb,0x69,0x3c,0xc4,0xb1,0xeb,0x57,0x34,0xc9,0xfa,0xab,0x43, +0x68,0xfa,0xa6,0xcf,0x33,0xdf,0xe6,0xce,0x2c,0x1f,0xd9,0x69,0xf4,0xcd,0xf9,0xc1, +0xc0,0x7c,0x15,0xb0,0xbe,0x3d,0xc5,0xfa,0x2b,0xdf,0xf8,0x16,0xec,0x73,0xd4,0xaf, +0xbc,0xf9,0x2a,0xf8,0xfd,0x5b,0x34,0xe5,0xfa,0xab,0xe8,0x3e,0xed,0x8b,0x1,0xf9, +0x6a,0x12,0x5c,0xdf,0xa0,0x19,0xac,0xbf,0x8a,0xe8,0xb,0xce,0x57,0xb6,0x2f,0x68, +0x7f,0x2e,0xba,0x58,0x1f,0xf6,0xe4,0x2b,0xe6,0x1b,0xe6,0xc3,0x37,0xd2,0x7d,0xaf, +0x8,0x22,0xcb,0x57,0x33,0x8f,0xef,0x62,0x7d,0x3,0x64,0xe4,0x2b,0x56,0xbf,0x42, +0xa1,0xcf,0xf,0x26,0xf3,0xa9,0xe3,0x98,0xb9,0x66,0x77,0x7d,0xc5,0xdc,0x51,0x4f, +0x1d,0x8b,0xa,0x21,0xbe,0x6a,0xe3,0xd3,0x8a,0x99,0xaf,0xf4,0xfd,0xf,0x20,0x7b, +0x7f,0x8a,0x9d,0xf,0x2,0xde,0x1f,0xbf,0x10,0x9f,0x9a,0xaf,0xba,0xd,0x33,0x5f, +0xe9,0xef,0x1f,0x84,0x2d,0xcb,0x27,0x6,0xd6,0xaf,0x16,0xe9,0x7b,0x5f,0xf3,0x39, +0xf2,0x55,0xd3,0xf2,0x9,0x33,0xc6,0xb7,0xf4,0xcf,0xa7,0xf0,0x8a,0x62,0xbe,0x7c, +0xd5,0x6d,0xba,0xf2,0xd5,0xeb,0x66,0xfd,0x6f,0x7a,0xb9,0x10,0xe6,0x4b,0xf9,0xfc, +0x5b,0x64,0x5f,0xef,0x83,0x6e,0xb3,0xb0,0xa,0xe3,0xe5,0xab,0x5,0xfa,0x76,0x1b, +0x2f,0xce,0xac,0xbf,0x64,0xd7,0x7e,0xb1,0xcf,0x3f,0x35,0x5f,0x69,0x3e,0x10,0xdb, +0x97,0xac,0x7e,0x1a,0xdf,0xb7,0xd3,0x78,0x2b,0xfe,0xfa,0xf6,0xb9,0xf9,0x88,0xec, +0xcf,0x57,0x9f,0x56,0x5,0xfd,0xf9,0x1e,0x5,0xc5,0xc9,0x57,0xd9,0xd6,0x9f,0x99, +0x6f,0xea,0x9d,0x3f,0x72,0xe6,0xab,0xa1,0x9e,0xaf,0xd6,0x68,0xa4,0x7c,0x95,0x7a, +0xfd,0x15,0xd7,0x77,0xee,0x9b,0xdf,0x72,0xe4,0xab,0x3,0x3d,0x1f,0x3c,0xa6,0x91, +0xf2,0x55,0xea,0xf5,0x57,0x5c,0x5f,0xd8,0xf3,0x65,0x4f,0xf4,0xfd,0x9b,0x2a,0x3f, +0xda,0x2e,0x9e,0xf,0x0,0x0,0x12,0x4f,0x49,0x44,0x41,0x54,0xa3,0x91,0xf2,0x55, +0xc2,0xfd,0xaf,0x66,0xf9,0x42,0xf6,0x6f,0x37,0x7d,0x6c,0xfc,0xb5,0xf3,0x15,0xa, +0xf0,0x35,0xc0,0x42,0xdb,0x6f,0xa4,0xfb,0x5e,0x31,0xcf,0x3f,0x35,0x5f,0x6d,0x31, +0x1f,0xff,0xf8,0xc6,0xdf,0xff,0x6a,0xf,0x1f,0x9a,0x3e,0xf9,0x7e,0xd9,0xf4,0x15, +0x37,0xa3,0xfa,0xcc,0x7c,0xc5,0xde,0x4f,0x77,0xd5,0x6a,0x3f,0xc8,0xbf,0x3e,0xe2, +0xef,0x7f,0xd5,0x3a,0xed,0x9b,0x3e,0xd4,0x34,0xa6,0x17,0x55,0x50,0x6d,0x86,0x6f, +0x7c,0x19,0x16,0xa,0x80,0xf5,0x2f,0xce,0x7c,0xc5,0x7c,0x80,0xd7,0xbf,0x24,0xd9, +0xff,0x6a,0xed,0x98,0xf9,0x60,0xd7,0xf4,0x29,0xd8,0xf2,0x1d,0xf1,0xcf,0x3f,0x78, +0x1f,0xd5,0x6a,0xdb,0x1c,0x9f,0x75,0x7d,0x6c,0xf0,0xfa,0xe7,0x24,0xfb,0x5f,0x9, +0xd8,0xf2,0x61,0xe6,0xa3,0x96,0x6f,0x97,0x9f,0x9f,0xe1,0x9b,0xaa,0xcf,0xde,0x5f, +0x94,0xe3,0xe3,0x8e,0x6f,0x49,0xf6,0xbf,0x72,0xfa,0xb6,0x99,0xcf,0x3a,0xff,0xd6, +0xf9,0x3e,0xb0,0x66,0x3d,0x3f,0xa8,0xe7,0x2b,0x76,0x7d,0x84,0xcd,0xf,0xd2,0x64, +0xfb,0x5f,0x39,0x7c,0xd3,0x5b,0xbe,0xf6,0x5b,0xe7,0xd5,0xaf,0x74,0x9f,0xfb,0xf9, +0xc1,0x68,0xf9,0x2a,0xc9,0xf8,0xe6,0xf0,0x51,0xff,0xf1,0xd,0x6e,0xbf,0x24,0xf9, +0x85,0xb4,0xe3,0xef,0xaf,0xb2,0x66,0xfb,0x80,0xff,0xfa,0xd8,0xcd,0xd6,0x17,0xf5, +0xfd,0x74,0xce,0xfe,0x5,0xdb,0xfd,0x8b,0xe8,0xeb,0x5f,0x8e,0x12,0xfb,0x78,0xd7, +0x6f,0x12,0x9f,0xb3,0x7f,0x16,0xb8,0xfd,0x33,0xe7,0xfd,0x24,0x70,0xd,0x9,0x46, +0xff,0x17,0x54,0xbf,0x82,0xbc,0xfe,0x2f,0x89,0x2f,0xc2,0xfd,0xb9,0xbf,0x7f,0x86, +0x81,0xf5,0x2b,0x76,0x7f,0xde,0xe1,0x8d,0x1f,0x4,0xbc,0x4e,0xe7,0xe1,0xf3,0xb5, +0x1f,0xb2,0xf2,0x55,0xcf,0x5d,0x1f,0x42,0x1d,0xd3,0xf7,0x88,0x37,0xfe,0x92,0x36, +0x9c,0x47,0xfb,0xfd,0x3e,0x24,0xbf,0x78,0x7d,0x8f,0xd8,0xf1,0xe5,0xe5,0x97,0x84, +0xfb,0x5f,0xcd,0xf2,0x9d,0xa,0xd1,0x7d,0x95,0x30,0x9f,0x34,0x1f,0x5f,0x58,0xbe, +0xd2,0x7d,0xaf,0x54,0xad,0xfa,0x95,0xe5,0xe3,0x1d,0xdf,0xc5,0xfb,0x6,0xfa,0xf5, +0xc1,0xe6,0x8f,0xe4,0xab,0x13,0x18,0x96,0xaf,0x12,0xee,0x7f,0x15,0xc9,0xb7,0x55, +0x77,0x3c,0xf8,0x3d,0xfe,0x4a,0xc5,0x35,0x3f,0x68,0xcd,0x6f,0x3d,0x81,0x61,0xfd, +0x4b,0xf6,0xf7,0x6f,0x47,0x56,0xff,0x57,0x7d,0xbe,0xe5,0xe8,0x5f,0x6a,0xd,0xfe, +0xfc,0xe0,0xef,0x59,0xfd,0x5,0x66,0xb8,0xff,0x55,0x88,0xcf,0x1a,0xdf,0x8,0x7e, +0x69,0x87,0xe3,0x33,0xf3,0x95,0x3d,0x3f,0x38,0x97,0xfd,0xaf,0x82,0x7d,0x56,0x3e, +0x20,0xd4,0xe9,0x3,0xb5,0xa6,0xd3,0xe7,0x98,0x1f,0x84,0xf3,0xa8,0x5f,0x85,0xf8, +0xac,0xf5,0x57,0x47,0xaf,0xb9,0x7d,0x9e,0xf5,0xed,0x73,0xad,0x5f,0x45,0x69,0x3f, +0xfc,0x86,0xdb,0x17,0xfb,0xf9,0xbc,0xb9,0xf8,0x76,0x33,0xf5,0x65,0x5f,0xbf,0xb7, +0xf3,0x55,0xf5,0x5e,0x2b,0x96,0x2f,0xcb,0xfd,0xaf,0x66,0xd4,0x87,0xf4,0xf5,0x7, +0xae,0xfe,0xf,0xde,0xaf,0x1a,0xf3,0x83,0xc1,0xbe,0x2c,0xf7,0xbf,0xa,0xf7,0x71, +0xd6,0x5f,0x59,0xf9,0x2a,0xd8,0xe7,0xda,0xff,0xea,0xee,0xcd,0xcb,0x86,0x6f,0x3a, +0x8f,0xf9,0x19,0xbf,0xcf,0xca,0x57,0xc1,0x3e,0xd7,0xfe,0x57,0xd5,0xde,0xc4,0xf0, +0x9d,0x2f,0xc6,0x67,0x8d,0xbf,0xc1,0x3e,0xd7,0xfe,0x57,0x95,0xd1,0x64,0x7e,0xc7, +0x97,0xdc,0x49,0xeb,0x7b,0xa9,0x32,0x22,0xf3,0xf3,0xd1,0x9f,0xa6,0xf7,0x49,0x37, +0x99,0x6f,0xe,0xf3,0xbf,0x62,0x5a,0xdf,0xab,0x15,0xf8,0x11,0xf3,0xd5,0x17,0x71, +0xfd,0xc6,0xf7,0xb1,0xf3,0x2f,0xdd,0xfa,0x3,0xd7,0xf3,0x47,0xec,0x67,0x4c,0xef, +0xd2,0xd4,0x3e,0xf5,0xfa,0x48,0xb1,0xff,0x15,0xf0,0xfd,0xc,0xed,0xf9,0xad,0x90, +0xfa,0x41,0x4c,0x5f,0x55,0xeb,0x5f,0xd2,0xee,0x3f,0xa4,0xf,0xe0,0xcc,0x21,0x17, +0x43,0xeb,0x2f,0xb3,0x7c,0x9e,0xfd,0xdb,0xab,0x5a,0xff,0x9c,0xf5,0xfe,0x57,0xc1, +0xcf,0xf,0xc6,0xf5,0xa5,0xde,0xff,0x8a,0xce,0xb9,0xfd,0xd8,0xb7,0x4a,0xb5,0xbf, +0x59,0x86,0xe7,0x1f,0xf7,0xb3,0x9b,0x81,0x8f,0x7b,0xfd,0x66,0xe4,0x4b,0xb1,0xff, +0x55,0xf0,0x67,0xd6,0xfa,0xd,0xfe,0xfb,0x7,0xa9,0xb9,0x8e,0xd7,0xfb,0xad,0x92, +0xae,0xbf,0x4a,0xee,0xd3,0xdf,0x5f,0xe6,0xf7,0x99,0xeb,0xc8,0x39,0xbe,0xe4,0xfb, +0x27,0x26,0xf2,0x11,0x10,0xe0,0xbb,0x15,0xe4,0xdb,0x58,0xac,0xef,0x57,0x1,0xbe, +0xa0,0xe3,0xbb,0x88,0xf5,0x1b,0xe,0x9f,0xf2,0x71,0xce,0x7d,0xbd,0x98,0xd7,0xc7, +0x82,0x7d,0x38,0xe0,0xfa,0xa0,0x4b,0xf4,0xad,0x7f,0x6f,0x2c,0xcb,0xfd,0xe2,0x96, +0xb6,0xfe,0x0,0x71,0x7d,0x64,0xa9,0xbe,0x9a,0x4,0xab,0xd5,0xdb,0xa8,0xaa,0xad, +0x7f,0x19,0x1c,0xe5,0xd0,0x7,0x2a,0x15,0xf1,0xf6,0x4,0x7,0xaf,0xcf,0xa1,0x57, +0x97,0xe8,0x23,0x18,0x54,0x20,0xbd,0x33,0xa1,0x20,0xde,0xf8,0x86,0x16,0xb4,0xbe, +0x49,0xf5,0xbd,0xe,0xc9,0xe4,0x32,0x35,0xe6,0x7,0x4b,0x39,0xf4,0x9,0x15,0x32, +0x21,0x39,0x6e,0xbf,0x4a,0xa5,0x35,0x21,0x58,0xc,0xf5,0x61,0xf9,0x2b,0x45,0x7a, +0xa9,0xfd,0xca,0xda,0x83,0x31,0xad,0x6f,0x6e,0xa6,0x7a,0x7e,0x35,0xa6,0x4f,0xbd, +0x7e,0x6b,0x13,0x5a,0x9d,0xe1,0xc3,0xa,0xa2,0x6b,0x0,0xee,0xec,0xc0,0xb5,0xba, +0xb6,0xb5,0xf0,0xa2,0x7c,0xb4,0x76,0x32,0x96,0xc7,0xb7,0xe9,0x96,0xbe,0xbf,0xe8, +0x61,0x88,0xf,0x6b,0xbe,0xde,0xe,0x68,0xd5,0x16,0xea,0x13,0x8c,0xa,0x96,0x91, +0xaf,0x60,0x4,0x1f,0xae,0xe1,0x5a,0xaa,0xfd,0xaf,0xe2,0xf9,0x44,0xeb,0x96,0x2f, +0x30,0x5f,0xe9,0xe7,0xdf,0xd3,0xaa,0xaf,0x5d,0x71,0xfa,0x92,0xae,0xbf,0x4a,0x91, +0xaf,0xf6,0x42,0xdb,0xef,0x12,0x80,0xdd,0x7,0x0,0x55,0x51,0x2d,0xd1,0xfe,0x57, +0x73,0xcb,0x2f,0xcc,0x57,0x55,0x7d,0x22,0x80,0x55,0x58,0x4b,0xb2,0xff,0x55,0x16, +0x3e,0x25,0xd4,0x57,0xd3,0x7d,0x3f,0xba,0xe,0x6a,0x49,0xf6,0xbf,0xca,0x22,0x5f, +0xf1,0x7c,0x97,0x54,0x18,0xd2,0xfb,0x97,0xba,0x36,0xb5,0x4,0x85,0x8a,0x58,0x4b, +0xb2,0xff,0x55,0x8a,0x7c,0xa5,0xa8,0xf9,0x6a,0x2b,0x28,0x5f,0xad,0x9d,0x92,0x1a, +0x94,0xff,0xa9,0xda,0x3f,0xaf,0xb5,0x5f,0xa9,0x8a,0x63,0x5a,0x59,0xdd,0x4c,0xb2, +0xff,0x55,0x8a,0x7c,0x75,0x4f,0x42,0xd5,0x6a,0x50,0xbe,0x5a,0x3b,0x56,0x6a,0xfd, +0xab,0xdf,0xf4,0x7f,0xab,0xa4,0xef,0x1f,0x8c,0x9f,0xaf,0xde,0x97,0x26,0x58,0x8, +0x1a,0x3f,0xd6,0xd4,0xe3,0xdb,0xfa,0xfc,0x63,0x9e,0xef,0x5e,0xb6,0xbe,0x75,0x73, +0x65,0xaf,0x2f,0x5f,0x29,0x93,0x9,0xfd,0x6e,0x98,0xaf,0x3e,0xea,0x51,0x72,0xc9, +0xe7,0x4b,0xf4,0xfe,0xc1,0xe0,0xf,0xdb,0xc6,0xdd,0x97,0xaf,0x14,0x35,0x5f,0x5d, +0xf,0xca,0x57,0xea,0xf5,0xf1,0x66,0x6b,0xd4,0xe3,0x1f,0x8a,0x6c,0xc7,0x37,0x1a, +0x90,0xaf,0x14,0x35,0x5f,0x5,0xce,0x6f,0x55,0x31,0xbd,0xd7,0xf3,0xfa,0xc6,0xd7, +0x93,0xad,0xbf,0x4a,0xe2,0x33,0xf2,0x55,0xa0,0xaf,0xa6,0x1e,0x5f,0xd5,0xa7,0x25, +0x2c,0x7b,0x78,0x86,0x7,0xc9,0xd7,0xf,0xc5,0xf4,0xa9,0xd7,0x6f,0x5d,0xcd,0x57, +0x81,0xbe,0xba,0xea,0x1b,0xa9,0x3e,0xb5,0x7,0xec,0x58,0xbf,0x9,0x86,0xb,0xf2, +0xe9,0xf9,0x4a,0x91,0xa8,0xde,0xff,0x9d,0xe0,0x80,0xeb,0x63,0x72,0x55,0xf3,0xe1, +0x47,0xec,0xf7,0x4e,0xe7,0xe2,0x2b,0xec,0xb4,0x67,0xe4,0x2b,0x7d,0xff,0x2b,0xf9, +0x7e,0xc9,0xdc,0x5f,0xb4,0x88,0xdc,0x23,0x1c,0xf4,0xf8,0x6e,0x67,0xea,0x23,0xf8, +0x21,0x10,0xc2,0xf3,0x95,0xbe,0xbf,0x40,0x95,0x3d,0x7f,0x24,0xa1,0xa1,0x3b,0x61, +0x79,0x7c,0xed,0x93,0x4c,0x7d,0x8a,0xf2,0x8e,0xb1,0x61,0x77,0x70,0xbe,0x32,0xf6, +0x97,0xea,0x9a,0xbe,0x11,0x3e,0x8,0x6f,0x3f,0x9a,0xad,0x8f,0xce,0xf2,0x29,0x86, +0x4f,0x2e,0x9b,0x3e,0xda,0xf0,0xf8,0x36,0x69,0xd9,0xf0,0xb5,0xb,0xda,0xfa,0xa6, +0xac,0x7d,0x1f,0xcc,0xf2,0xe9,0xfb,0x5f,0x55,0x30,0x70,0xfb,0xb4,0x19,0x85,0x82, +0xee,0x7b,0xc0,0x7c,0xc6,0xfe,0x57,0x52,0xa6,0xfd,0x9f,0x72,0x38,0xcb,0x87,0x8d, +0xfd,0xaf,0x28,0x30,0xd7,0x5f,0x51,0x63,0x93,0x98,0xa9,0xfe,0x7a,0x58,0x6d,0xb9, +0xce,0x9f,0xa,0xe,0xdf,0x9,0x38,0xc9,0xd6,0xa7,0xfc,0x2c,0xc8,0x47,0x8a,0x5b, +0xda,0xfe,0xa2,0xc8,0xd8,0x5f,0xca,0xf4,0x61,0x85,0x18,0xd7,0xef,0x54,0x13,0x69, +0x9,0xb,0x3e,0x2c,0x39,0x8e,0x6f,0xd6,0xe3,0x5b,0x98,0xf,0xe9,0xf7,0xbf,0x3, +0xc3,0xd7,0x65,0xbe,0xf3,0x55,0xdb,0xa7,0xff,0xdb,0xf6,0x26,0x6b,0xbf,0x83,0xec, +0x7d,0x4,0x3f,0xe6,0xf4,0x2f,0xc6,0x97,0x1c,0xf9,0xa,0xa0,0xa6,0x68,0xf8,0x8, +0x42,0x5e,0xdf,0x80,0xf9,0xae,0xcf,0x21,0x1f,0x70,0xfb,0x67,0xd3,0x47,0x8b,0x96, +0x4f,0xbe,0x6f,0x5e,0xbf,0xb4,0xe8,0xf3,0xc9,0xa6,0x6f,0x3a,0x97,0xfa,0xb,0xd, +0xba,0xff,0x20,0x97,0x69,0xd8,0xfa,0x2b,0x6a,0xbf,0x5a,0xc7,0x9c,0x17,0x3c,0x5d, +0xb0,0x8f,0xd0,0xe0,0xfd,0xf,0x78,0xed,0x7,0x17,0xed,0xc3,0xd1,0x7c,0x63,0xc7, +0xf5,0x9b,0x7d,0xfd,0x34,0xd8,0x17,0x92,0xaf,0x5c,0xbe,0x3d,0x47,0xff,0xb7,0x50, +0x9f,0x91,0xaf,0xf8,0xf3,0x83,0x53,0x6b,0xfa,0x77,0xbb,0xe8,0xf2,0x91,0x45,0xf9, +0xcc,0xf1,0x43,0x9f,0x1f,0x6c,0xcb,0xe6,0xf3,0xf1,0x1c,0xdf,0xdb,0x65,0xd3,0x37, +0xb9,0x9e,0xd1,0xfb,0x7,0x63,0xf9,0x88,0xbe,0xff,0x41,0x55,0x2c,0x7,0xd5,0x77, +0xff,0x94,0x8d,0xbf,0xd2,0x41,0x46,0xef,0x1f,0x4c,0xe0,0xab,0xf4,0xc5,0x20,0xdf, +0x6,0xf3,0xf5,0x87,0xcb,0x38,0xbe,0x8a,0xb1,0xff,0x95,0x12,0xe8,0xdb,0x5c,0xb2, +0x4f,0x99,0xe1,0x3,0xce,0x7c,0x9a,0xea,0xfd,0x83,0x89,0x7c,0xd8,0xd8,0xff,0xa, +0x8b,0xb3,0xe6,0x17,0x2c,0x5f,0x7d,0x41,0xfd,0x4b,0x71,0xb,0xb2,0xfa,0x15,0x80, +0x28,0xd8,0x87,0xdd,0xbe,0x8c,0xd7,0x1f,0x4,0xfb,0x50,0xb5,0xc3,0xea,0x57,0x0, +0xfe,0x6d,0x29,0xc8,0x67,0x15,0x30,0xe1,0x41,0xca,0xf7,0xf,0xc6,0xf4,0x4d,0xb0, +0xbd,0xbf,0x28,0x12,0x3,0xdb,0x8f,0x10,0x47,0x7d,0x23,0xf5,0xfa,0x97,0x38,0x3e, +0x6a,0xef,0x2f,0xea,0xed,0x9f,0x9d,0xeb,0x87,0x84,0x7f,0x6f,0xd7,0x87,0x16,0xe9, +0xbb,0x4c,0xbd,0xfb,0x8b,0xf2,0x7d,0xef,0x6d,0xb2,0x6,0xcc,0x60,0xfd,0x55,0xac, +0x7c,0x55,0x89,0xb4,0xfe,0x6a,0x6f,0xd3,0xfe,0xfd,0x45,0xb6,0x1f,0xc1,0x85,0x48, +0xeb,0xff,0xf6,0xa,0xcb,0xf1,0xd1,0x2a,0x8c,0xe4,0x7b,0xb0,0xe1,0xf2,0x2d,0xec, +0xfa,0xa5,0x7a,0xff,0x77,0x12,0xf0,0xfc,0x20,0xb2,0xde,0xaf,0xbb,0x7b,0xe8,0xf2, +0x2d,0xaa,0xff,0x73,0xe7,0x2b,0xf3,0xfe,0x48,0x2e,0x15,0x37,0xd,0xdf,0xd0,0xda, +0xdf,0x7b,0x8a,0x5d,0xbe,0x45,0x8d,0x1f,0xee,0x7c,0xd5,0x4,0xac,0x7e,0x55,0x33, +0x7c,0x7,0x81,0xfb,0x4b,0x6d,0x2c,0x23,0x5f,0xb1,0xfb,0xf3,0x11,0x36,0x7d,0x28, +0xd3,0xfd,0xaf,0x52,0xe4,0x17,0x63,0xff,0x2b,0x6a,0xd5,0x87,0xb0,0xe9,0xd3,0xf6, +0x67,0x90,0xaf,0xee,0x60,0xa,0x37,0x73,0xe0,0x23,0x56,0x7d,0x6d,0x9f,0xf9,0xe4, +0xf2,0x11,0x1e,0x3d,0x3c,0xa5,0x9d,0xda,0x32,0x7d,0x18,0x79,0xea,0x57,0xac,0xfd, +0xb4,0xe7,0x7,0xf1,0xe8,0x9d,0xe3,0xd6,0xa3,0xe5,0xf8,0x88,0x39,0x3f,0x8,0xdd, +0xf5,0x2b,0xcb,0xa7,0xed,0xcf,0xa0,0xfa,0x70,0x17,0xe2,0xe5,0xf8,0xcc,0xf9,0xc1, +0x5d,0x77,0xfd,0xca,0xba,0x3e,0xb4,0xfd,0x19,0xf0,0xe8,0x83,0xe5,0xf9,0x26,0x76, +0xfd,0x0,0x20,0xd6,0xbf,0x10,0xd6,0xbf,0xe8,0xcf,0x6f,0xc9,0x57,0x3f,0xc0,0x43, +0x88,0x96,0xe4,0xb3,0xeb,0x2f,0xce,0xfa,0xd5,0xa6,0xc3,0x87,0x95,0x9f,0xa9,0x3e, +0xc7,0x2b,0x17,0x17,0x5b,0xbf,0x9a,0xb9,0xbf,0xa8,0xe6,0xeb,0x42,0xb0,0x1c,0x5f, +0x58,0xfd,0xca,0x6a,0xbf,0xc7,0xaa,0x4f,0x5c,0x92,0xf,0x47,0xf0,0xed,0xe0,0x16, +0x5c,0xf5,0x7d,0xb7,0xa5,0xd7,0xaf,0xb2,0xdd,0xff,0x2a,0x55,0xfd,0x2a,0x60,0xff, +0x2b,0x9c,0xe9,0xf3,0xd3,0x29,0xf2,0xd5,0x90,0x9f,0xaf,0x4e,0x3b,0x59,0xee,0x7f, +0x95,0x22,0xbf,0x1c,0xf0,0xf3,0xd5,0xf1,0xa3,0x2c,0xf7,0xbf,0x4a,0xe1,0x43,0xfc, +0x7c,0x85,0x61,0x96,0xfb,0x5f,0xa5,0xc8,0x2f,0x88,0x9f,0xaf,0x2,0x7d,0xd,0x90, +0x13,0x5f,0x56,0xfb,0x5f,0x65,0x93,0xaf,0x44,0x96,0xaf,0x10,0xf3,0x65,0xb5,0xff, +0x55,0xca,0x7c,0x65,0xec,0x2f,0xa5,0xbf,0x2e,0x44,0xcf,0x57,0x30,0xac,0x7f,0xc9, +0x7e,0xfd,0xd5,0xcc,0x7c,0x65,0xf8,0xfa,0x94,0xe5,0x2b,0xc0,0x7c,0x59,0xed,0x7f, +0x95,0x49,0xbe,0x62,0xeb,0xf,0x48,0xc8,0xfb,0x93,0xe9,0x1c,0xd6,0x5f,0x45,0xcd, +0x57,0x77,0x4b,0x2c,0x5f,0xad,0x86,0xfb,0x32,0x5e,0x7f,0x15,0x9a,0xaf,0xe0,0x42, +0xf6,0xbf,0x4a,0x9e,0xaf,0xe0,0x82,0xf6,0xef,0x4c,0x9a,0xaf,0x40,0xae,0x7d,0x61, +0xeb,0xdb,0xf3,0x91,0xaf,0xa,0xa1,0xf5,0xab,0x9c,0xe4,0x2b,0x73,0x7e,0x50,0x60, +0xf9,0xa,0xb2,0xfa,0x15,0x6f,0xfc,0x58,0xbc,0x8f,0xe8,0xf3,0x1f,0x55,0xf6,0xfe, +0x41,0x89,0xed,0x7f,0x75,0xd0,0xe4,0x8d,0xbf,0xcb,0xf2,0x55,0x7a,0x2,0xcb,0x57, +0xe6,0xfe,0x57,0xa8,0xc9,0xcb,0x2f,0x8b,0xf7,0x19,0xfb,0x23,0x55,0xd8,0xf8,0x3b, +0x62,0xe3,0x6f,0xfe,0x7d,0xf9,0x38,0xbe,0xd8,0xd8,0xff,0xca,0xf4,0xa9,0xf9,0xca, +0xf2,0x2d,0xf9,0xfa,0x50,0xf3,0x15,0xb0,0xe7,0x7,0x7d,0xf9,0xa,0x35,0x97,0xdc, +0xbf,0xa8,0xf9,0x6a,0xdb,0x9e,0x1f,0x4,0xcc,0x87,0x99,0x6f,0x7f,0xd9,0xfd,0xf3, +0x4,0xdf,0x72,0xcc,0xf,0xa,0x2c,0x5f,0xcd,0x65,0xff,0xab,0x64,0xf9,0xa,0x38, +0xe6,0x7,0x5,0x96,0xaf,0x72,0xe3,0x63,0xcf,0xf,0xe6,0x37,0x5f,0x81,0x8b,0x7c, +0x95,0x2a,0x5f,0x81,0x9c,0xe7,0x2b,0xcd,0x87,0x63,0xbd,0x1f,0x67,0xf1,0xe3,0xc7, +0x69,0xc0,0xfc,0x20,0xcd,0x49,0xbe,0x3a,0xee,0xf1,0xeb,0x57,0x34,0x4f,0xe3,0x2f, +0xa7,0x7e,0x45,0x73,0x92,0x5f,0xf0,0x6f,0xa8,0x7b,0xfd,0x38,0xf3,0xbd,0x97,0x13, +0xdf,0xff,0xd,0xf0,0xfd,0x4d,0x4e,0x8e,0xaf,0xb9,0xfe,0xa,0xb0,0x7c,0xc5,0x7c, +0x78,0xf9,0xf9,0x6a,0xcb,0x3a,0xff,0x98,0xf,0x2b,0x96,0x2f,0x7,0xf9,0xaa,0xca, +0xfa,0x3f,0xce,0xfc,0x20,0xcd,0x41,0xbe,0xaa,0xce,0x9a,0x1f,0x5c,0x72,0xbe,0xaa, +0xce,0x9a,0x1f,0x5c,0x72,0xbe,0xaa,0xe6,0x3c,0x5f,0x55,0x73,0x9e,0xaf,0xaa,0x39, +0xcf,0x57,0x5f,0x84,0xf9,0xc1,0x40,0x5f,0x4e,0xf2,0x95,0xdb,0x27,0x5f,0xb1,0xea, +0xcf,0x39,0xc9,0x57,0x6e,0x1f,0x1e,0x21,0x9c,0xaf,0x7c,0xe5,0xf5,0x61,0x94,0xaf, +0x7c,0x15,0xe8,0xdb,0xcf,0xa9,0xf,0xe6,0xf9,0xf8,0xca,0x57,0x6d,0x5f,0x2e,0xaf, +0xf,0xc5,0xf6,0xe5,0xb1,0x7f,0xb1,0xe7,0x7,0x97,0x9e,0xaf,0x2,0x7c,0x21,0xef, +0x77,0xce,0x83,0x2f,0xec,0xfd,0xce,0x4b,0xf7,0xe5,0x2a,0x5f,0x71,0xdb,0x2f,0x47, +0xf9,0xe5,0xb,0xef,0xcb,0xc7,0xf5,0x1b,0x58,0xbf,0xda,0xc8,0x53,0xfd,0x6a,0x70, +0xb7,0xc4,0xf2,0x95,0xb9,0xbe,0x98,0xa2,0x9c,0xd4,0xaf,0x80,0x5e,0xdf,0x10,0x59, +0x7d,0x43,0x9b,0xd7,0xa,0x7e,0x3f,0xdd,0x12,0x8e,0xef,0xaf,0x74,0x9f,0xf6,0x94, +0xba,0x91,0xf,0x4,0xd3,0x7,0x73,0x52,0x1f,0xfa,0x38,0xe7,0x3e,0xa3,0xfe,0xc7, +0xe6,0x8f,0x46,0xf8,0x3b,0xcc,0x97,0xab,0xf9,0x41,0xd3,0xa7,0xe6,0xab,0xe7,0x4c, +0x1f,0x58,0xe6,0xf5,0xf1,0x3d,0x59,0xee,0x5f,0x2e,0x16,0xec,0xfa,0x95,0x3d,0xff, +0xc6,0xea,0x2f,0x60,0x89,0xfd,0xb,0x91,0x50,0xf5,0xf6,0x4,0x41,0xbb,0x7e,0x65, +0xaf,0xbf,0xb2,0x7c,0x4b,0xec,0x9f,0x9,0x70,0xef,0x2f,0xea,0x7c,0x7f,0x63,0x1e, +0xea,0x57,0xa,0xa8,0xd0,0x3b,0x13,0xcc,0x7d,0xff,0xe0,0x66,0x3e,0x7c,0x64,0x72, +0x19,0xe7,0x76,0x7e,0x50,0xf7,0xe5,0x78,0xfe,0x4d,0xf5,0x85,0xef,0x2f,0xba,0x6c, +0x9f,0x84,0x6a,0x13,0x6d,0x29,0x62,0x4e,0xf3,0x15,0x39,0x91,0xc7,0xb7,0x49,0x51, +0xf3,0xe1,0xc3,0x1c,0xd6,0xaf,0xb4,0x47,0x8e,0xcd,0xfd,0xaf,0x4e,0xa1,0x9e,0xaf, +0xd6,0xca,0x2c,0x5f,0x6d,0xe4,0xe1,0xfe,0x5c,0xb0,0xf6,0xbf,0x32,0xf3,0x55,0xcb, +0xca,0x57,0xa2,0xe9,0x13,0x73,0x32,0xfe,0xee,0x51,0xf7,0xfe,0x57,0x2c,0xbf,0xfc, +0x38,0x57,0xf9,0xc5,0xf6,0xb1,0xf7,0xbf,0xbd,0x95,0x13,0x9f,0xf1,0xfc,0xe5,0x6f, +0xcb,0xbe,0xf9,0xd5,0x5c,0xcd,0xf,0xfe,0x6,0xb0,0x7c,0x85,0xf3,0x70,0x7d,0x9c, +0x9f,0xc,0xd4,0x7c,0xe5,0x98,0x1f,0xb4,0xe7,0xdf,0x70,0x1e,0xea,0x57,0x13,0x9, +0xaa,0xf9,0x2a,0xbf,0xf3,0x83,0x13,0x50,0xb9,0xed,0xdc,0xff,0xa,0xb2,0xf9,0x41, +0x5,0x55,0xf3,0x50,0x3f,0x90,0x0,0x54,0xf3,0xd5,0x77,0xed,0x7c,0xc5,0xe6,0x7, +0xf3,0x91,0xaf,0x54,0xdf,0x40,0xcd,0x57,0xd7,0x73,0x3b,0x3f,0xa8,0xb6,0xdf,0x24, +0xcf,0xf3,0x6f,0x12,0xa8,0xe4,0xdb,0x27,0xa9,0xed,0x87,0xf2,0x3b,0x3f,0x38,0x39, +0x81,0x12,0x31,0xfa,0x3f,0x1c,0xe0,0xdb,0x5b,0x66,0xff,0x87,0xec,0x7c,0xa5,0xef, +0x2f,0x3a,0xb8,0x6f,0xd5,0xaf,0x50,0x1e,0xee,0xcf,0xb1,0x9d,0xaf,0x8c,0xfd,0x9b, +0xd8,0xf3,0x3d,0x23,0x63,0x7f,0xd1,0x1c,0xe5,0x2b,0xee,0xfe,0xa2,0xaa,0x6f,0x33, +0x27,0xf9,0xc5,0xf0,0xfd,0xda,0xca,0x2f,0xd,0x36,0xfe,0xe6,0xc4,0x67,0xec,0x2f, +0x6a,0xaf,0x5f,0x63,0x3e,0x9c,0x93,0xe3,0x6b,0xec,0x2f,0xa,0xac,0x7c,0xc5,0xc6, +0xdf,0x65,0xae,0xbf,0xfa,0x70,0xba,0xa6,0xa8,0xf9,0x6a,0x93,0xf5,0x2f,0x80,0xf9, +0xb0,0x72,0x8e,0x72,0x90,0xaf,0xaa,0xb5,0xc7,0xe7,0xd2,0x44,0xbf,0xff,0xc5,0xdc, +0xfd,0x45,0x97,0x9c,0xaf,0x2a,0x8d,0xdf,0x9e,0x4b,0xee,0x7c,0x25,0xb2,0x7c,0x85, +0x96,0x3f,0xbe,0x11,0xd8,0x20,0xe7,0x93,0x9,0x2e,0xf2,0xf2,0x55,0x4e,0x7c,0xe8, +0xce,0x65,0x9c,0xd7,0xf5,0x57,0x9a,0x6f,0x7c,0x27,0xc2,0xfe,0x7,0xcb,0xf3,0xf5, +0x51,0x9e,0x7d,0xa8,0xb6,0x3,0x3f,0xc8,0x71,0xbe,0xba,0x3b,0x5d,0x83,0xef,0x98, +0xf9,0x2a,0x68,0x7e,0x10,0x2d,0xb1,0xff,0x13,0x1c,0xf5,0x2b,0x63,0x7e,0xd0,0xdc, +0xbf,0x4e,0xcd,0x57,0xec,0xfe,0x68,0xb8,0xc4,0xf1,0x43,0xab,0x51,0xb1,0x7c,0x65, +0xd4,0x37,0x44,0x96,0xf,0xac,0xfa,0xfd,0x30,0x47,0xf5,0xd,0x6b,0x7f,0x51,0x47, +0xfd,0xe5,0x20,0x27,0xf9,0xc5,0xc8,0xa7,0x3d,0xcb,0x87,0x73,0xe6,0x53,0x3c,0x3e, +0x36,0x3f,0xdd,0xc8,0x55,0xfd,0xaa,0x2b,0x7a,0xeb,0x57,0x1b,0x4b,0xbc,0x3e,0xbe, +0x27,0x2b,0x5a,0xfd,0xa,0xda,0xf5,0xab,0x3,0xd1,0x5b,0xbf,0x5a,0x62,0xff,0x42, +0x24,0x74,0x4f,0xab,0x5f,0x75,0xec,0xfa,0x95,0xb9,0xbf,0xa8,0xa3,0x7e,0x85,0x96, +0xd7,0x3f,0x13,0x50,0x79,0x5f,0xf5,0x39,0xf6,0x17,0x85,0xa2,0x98,0xa3,0xf9,0x41, +0x5,0x54,0x14,0xad,0x7e,0x65,0xef,0x2f,0xca,0xfa,0xe7,0x7c,0xd4,0xaf,0x34,0xdf, +0x40,0xcd,0x57,0x8f,0x72,0x9a,0xaf,0x8c,0xf6,0x23,0xb8,0x92,0xd3,0xfc,0xa2,0x4d, +0xf,0x6a,0xbe,0x42,0x5e,0x7d,0x12,0xaa,0xab,0x3e,0x4,0x73,0x9a,0xaf,0xc8,0x89, +0xda,0xff,0x49,0xa4,0x8,0x73,0xfa,0xfc,0xa0,0xbe,0x23,0xb1,0x3b,0x5f,0xb1,0xe7, +0x7,0xaf,0xe4,0xe2,0xf9,0x41,0xc1,0x97,0xaf,0x58,0xfd,0xde,0xce,0x57,0x38,0x57, +0xf9,0xca,0xff,0xfc,0x20,0xce,0x49,0x7e,0x31,0xf6,0xef,0x4,0xc0,0x9b,0xaf,0x86, +0xb9,0xf2,0xf5,0xcb,0x5e,0x5f,0x5e,0x8e,0x2f,0xf2,0xd4,0xaf,0x50,0xe,0xea,0x57, +0xa4,0xf1,0xb7,0x57,0xd9,0xfc,0x20,0x74,0xd7,0xaf,0x72,0xb1,0xbe,0x5d,0x79,0xaf, +0x7f,0x26,0x99,0xf3,0x83,0xde,0xfd,0x45,0x41,0xe,0xea,0x57,0xca,0xfb,0xfd,0x27, +0x92,0x73,0xff,0x2b,0xc7,0xfc,0xa0,0xb8,0xfc,0xf1,0x8d,0xe2,0xf7,0xfb,0xca,0xc4, +0xe9,0x73,0xd4,0xaf,0x56,0xf3,0xe0,0xfb,0x40,0xf5,0x5d,0xc6,0x9d,0xbc,0xce,0xf, +0xe2,0xc6,0xcb,0xca,0x24,0xbf,0xf5,0xa1,0x2f,0x80,0xef,0xa1,0x92,0xe7,0xf9,0x41, +0xa5,0xd1,0x57,0xd8,0xfc,0x20,0xcc,0x5f,0xbe,0xa2,0x8a,0x23,0x5f,0x75,0x3c,0xf9, +0x2a,0xf,0xcf,0x47,0x11,0x47,0xbe,0x7a,0xe4,0xc9,0x57,0x9d,0x9c,0x8d,0xbf,0xd0, +0x93,0xaf,0x1e,0xe5,0x2c,0x5f,0x41,0x4f,0xbe,0x62,0xc7,0x17,0xe5,0xdd,0x97,0xa3, +0xe3,0xab,0xe6,0x2b,0xd1,0xfb,0xfc,0x20,0x5c,0x6e,0xbe,0xfa,0x9a,0x27,0x5f,0x9, +0xde,0x7c,0x5,0x96,0x9b,0xaf,0x10,0x5b,0x7f,0x65,0xf8,0xec,0xf5,0xed,0xcc,0xb7, +0xb1,0xdc,0x7c,0xa5,0xfa,0x9c,0xf9,0x8a,0xad,0x3f,0x50,0x72,0xb1,0xff,0x95,0x9a, +0xaf,0xd0,0x1d,0x57,0xbe,0xba,0x5b,0x62,0xf9,0x2a,0x17,0xbe,0xf,0xfa,0xda,0xfc, +0x20,0xcc,0x71,0xbe,0xd2,0xe6,0xdf,0x60,0x8e,0xf3,0x95,0xe6,0x3,0x39,0xce,0x57, +0xaa,0x2f,0xbf,0xeb,0xdb,0xd5,0x7c,0x25,0xab,0xf9,0xaa,0x10,0x56,0xbf,0x82,0x39, +0xc9,0x57,0xe6,0xfc,0xa0,0xe0,0xad,0x5f,0x75,0x72,0x92,0xaf,0x8c,0xf5,0xd9,0x6c, +0x7f,0x51,0xbb,0x7e,0xf5,0x28,0x57,0xfb,0x5f,0xd9,0xfb,0x8b,0x32,0x5f,0x5e,0x9f, +0xcf,0xfb,0xc2,0xf8,0x96,0x79,0x7c,0xdb,0xa5,0x17,0xd4,0xfc,0x2,0x78,0xcf,0xf, +0xd6,0x72,0x90,0xaf,0x68,0x4b,0xea,0x4b,0x13,0xb4,0x1d,0xf6,0xfc,0xe0,0x52,0xdf, +0xf,0xd1,0x92,0xc0,0x6d,0x63,0xff,0x4e,0x7c,0x14,0xe4,0x5b,0xe6,0xfa,0xd8,0xfa, +0x13,0xe0,0x7a,0x3e,0xf,0xb2,0xfd,0x45,0xf3,0xf1,0xfc,0x20,0xad,0x63,0x70,0xe7, +0xb2,0xf3,0xf9,0x41,0xb6,0xbf,0x68,0x4e,0xd6,0xb7,0x6b,0xed,0x47,0xf2,0xfb,0xfc, +0x20,0xad,0x4b,0x20,0xcf,0xf9,0x45,0xf5,0xf5,0x27,0x4,0xe5,0xd7,0xd7,0x2,0x2f, +0xa8,0xf9,0x25,0xbf,0xfb,0x8b,0x8a,0x56,0x7e,0x39,0x9,0xf4,0x2d,0xb3,0xff,0x3, +0x56,0x7e,0x91,0xa8,0xb3,0x7e,0xe5,0xf4,0xe5,0x63,0x7f,0x6,0xdd,0x67,0xd5,0xaf, +0x9c,0xbe,0x7c,0xe4,0x2b,0xd3,0xd7,0x5,0x81,0xef,0xbf,0x5c,0xae,0xef,0xf3,0x9c, +0xfb,0x7e,0x97,0x4b,0xdf,0xb7,0xc1,0xb,0x66,0x7d,0x48,0x9f,0x4b,0x6f,0xc3,0x7c, +0xf9,0x8,0xb8,0xdd,0x37,0xe7,0xdf,0x8c,0xf3,0x2f,0x7f,0x3e,0x2d,0x5f,0x55,0x59, +0xff,0x97,0x37,0x9f,0x2,0xde,0xd0,0xf2,0x55,0xd5,0x37,0x3f,0x98,0x17,0x5f,0x5b, +0xcf,0x57,0x55,0xdf,0xfc,0xa0,0xe5,0x73,0xbc,0x9f,0x78,0x19,0xbe,0x9e,0x9e,0xaf, +0xaa,0x91,0xde,0xef,0xbc,0xc,0x5f,0x5f,0x32,0x7c,0x51,0xde,0xef,0xbc,0x1c,0x5f, +0xdf,0x3f,0xff,0x76,0x12,0xf9,0xbb,0xcd,0xff,0xfa,0xbd,0xf5,0x82,0x39,0xff,0x96, +0xe8,0xb3,0xc0,0xfd,0xf,0x2,0x3e,0x9f,0x17,0x8b,0x4b,0xf4,0x39,0xf6,0x3f,0x8, +0xf8,0x8c,0x26,0x68,0x99,0x3e,0x7b,0xfc,0xfd,0xa2,0xfa,0x50,0xde,0x7d,0x5b,0xb9, +0xf6,0x7d,0x5e,0xcc,0x79,0xfb,0xd1,0x5c,0xfb,0xc8,0x88,0x5c,0xf8,0xd2,0x1c,0xdf, +0xab,0x74,0xc1,0xfd,0x33,0xbf,0x6,0x54,0xc8,0xcd,0xf8,0x96,0x73,0x5f,0xb6,0x9f, +0xb,0xdf,0x85,0x2f,0xe6,0x7,0xad,0x83,0x5f,0x17,0xb,0x8,0x9f,0x4c,0xae,0x95, +0xbe,0xa7,0x28,0x68,0xe7,0x5a,0x9,0xe4,0xc9,0x77,0x8c,0x3a,0x6f,0x11,0x7c,0x7c, +0x2a,0x3d,0x19,0xc1,0xdb,0x67,0x67,0xe8,0xf9,0x11,0xdc,0xce,0x9b,0x4f,0x51,0x8e, +0x8f,0xc1,0x68,0x24,0x81,0x27,0x4f,0xa4,0xd6,0x8,0xde,0xca,0x97,0xef,0xe0,0x45, +0x85,0x1e,0x63,0x0,0xa1,0xa4,0x1a,0xa1,0xa8,0x32,0xf3,0xe4,0xeb,0xa1,0x83,0x7f, +0xf3,0x34,0xed,0xe1,0x5f,0xc2,0x92,0xf4,0x4b,0xcd,0x27,0x5d,0xcb,0x99,0xef,0xb7, +0x5d,0xe5,0xb0,0x87,0x3f,0x1,0xb0,0xf7,0x49,0xaf,0x7,0xc4,0xde,0x28,0x57,0xbe, +0x75,0xcd,0xa7,0xac,0xe3,0x3e,0x80,0xad,0x7e,0xab,0x5,0xc4,0xd6,0x71,0xae,0x7c, +0x3b,0xba,0x6f,0x7,0xf7,0x7b,0xb0,0xde,0x5f,0x5f,0x7,0x62,0xfd,0xb3,0x62,0x9e, +0x7c,0x42,0xb5,0xd7,0x25,0x58,0xa8,0xf5,0x5b,0x12,0xee,0x2b,0x8a,0xb8,0xa3,0x40, +0x90,0x33,0x9f,0xda,0x3f,0xb,0xb5,0xc3,0x9d,0x2b,0x5f,0x3e,0x54,0x7d,0x8f,0x2f, +0xe7,0xab,0x7f,0xbe,0x18,0x7f,0x2f,0x7c,0x17,0xbe,0xb,0xdf,0x85,0xef,0xc2,0x77, +0xe1,0xbb,0xf0,0x5d,0xf8,0x2e,0x7c,0x5f,0x28,0x1f,0x21,0x14,0x62,0xfd,0xc9,0x79, +0xee,0x7,0xd2,0xc3,0xe5,0xfa,0xa6,0xf7,0xe9,0xd6,0x29,0x11,0xa8,0xfe,0x7c,0x99, +0x59,0xe,0x3e,0x33,0xbe,0xd4,0xd1,0xff,0xbf,0xbd,0x64,0xdf,0x33,0xa4,0x78,0x34, +0xd,0xf4,0x6d,0xd1,0xff,0x2a,0x2c,0xd7,0xf7,0xd5,0x69,0x79,0xcf,0xe5,0x1b,0x3a, +0x7d,0x45,0x7a,0x6d,0xc9,0xbe,0x75,0x99,0x6e,0xc8,0x2,0x6d,0xb,0x9d,0xdd,0xe9, +0xb5,0xfa,0x58,0xa0,0x7b,0x54,0x2e,0xe,0x48,0xf1,0x4c,0x2e,0x52,0x48,0x8a,0xf4, +0xc6,0x92,0x7d,0x7f,0x7d,0x42,0xff,0xf9,0xef,0x54,0xdf,0x8d,0xcd,0x75,0xf9,0xf2, +0xf7,0x6,0xcf,0x9e,0x3e,0xa0,0x72,0xa1,0x7d,0xbf,0xf0,0xad,0x71,0x91,0xe,0xdf, +0xfe,0x2e,0x7d,0x66,0xc9,0xbe,0xe9,0xe0,0xe6,0xea,0xa0,0x4c,0x3b,0x57,0x4a,0x6f, +0xb,0x1f,0xbd,0xb0,0xff,0xec,0xa9,0x7a,0x7c,0x8f,0x3e,0x29,0x1f,0xad,0x1e,0x75, +0xe8,0x70,0xbb,0x43,0xbf,0xb5,0x6c,0x5f,0xfb,0x2b,0x97,0xda,0x25,0xda,0x79,0xbb, +0xbc,0x72,0xff,0xa9,0xc2,0x96,0xee,0x3b,0xdd,0xba,0xb9,0x5a,0xdc,0xef,0xd0,0x23, +0xd5,0xf7,0x2f,0x96,0xed,0xeb,0x18,0xfd,0xcb,0xdb,0xc2,0xca,0xdd,0xa7,0x4a,0xdb, +0x86,0x6f,0xfb,0xc6,0x6a,0xa9,0xd3,0xa1,0xa7,0xe5,0xe,0x7d,0x6a,0xe9,0xbe,0x8e, +0xe1,0xa3,0xe5,0x93,0x7f,0x28,0x5a,0x3e,0x95,0xd6,0xa1,0x67,0xe5,0xce,0xf0,0xf2, +0xb2,0x7d,0xfb,0xcc,0x57,0x3a,0xfa,0x87,0xef,0x6c,0x3d,0x73,0x7a,0xa4,0x1d,0xdf, +0x67,0x4e,0xcb,0xea,0xf1,0x95,0x85,0xce,0xde,0xb5,0xa5,0x5f,0x1f,0x45,0xcd,0xd7, +0xbe,0x42,0x37,0xc6,0x4f,0xfd,0xdb,0xf6,0x8d,0xd5,0x13,0x2a,0xaf,0xaa,0xff,0x28, +0xf,0x8a,0x74,0xba,0xb6,0xba,0xb7,0xbe,0x6c,0xdf,0xb8,0xa4,0xfb,0x6e,0xd0,0x7, +0xf2,0x53,0xf7,0xd4,0x8b,0xf9,0x4c,0xef,0x5f,0x56,0xcb,0x6a,0xff,0x32,0xbd,0x7f, +0x69,0x6f,0xc9,0xe3,0x9b,0xe3,0x3,0xb4,0xff,0x31,0x5a,0xb,0x12,0x23,0x3c,0x5c, +0xe4,0xab,0xb,0xdf,0x85,0xef,0xc2,0x77,0xe1,0xcb,0x9b,0xaf,0x9c,0x17,0xdf,0x86, +0x5c,0x56,0x73,0xc0,0x26,0xa5,0x85,0xb1,0x0,0xd4,0x31,0x64,0xcf,0xe9,0x23,0xca, +0xd2,0xef,0x7f,0x57,0x6,0xc5,0xb3,0xc1,0xb5,0x4b,0xf4,0xa1,0x9a,0x52,0xb7,0xa7, +0x25,0xfa,0x60,0xdb,0xe1,0x9b,0xde,0x5b,0xb6,0x6f,0xfa,0xcc,0xde,0xd6,0xd9,0xde, +0x95,0x7f,0x45,0xdf,0xfe,0xde,0xe6,0xb5,0x92,0x5c,0x52,0x33,0xbd,0xf3,0xab,0x7f, +0xb0,0xf4,0xf6,0x9b,0xc2,0xce,0x69,0xe7,0xda,0x19,0x2d,0x9f,0x6d,0x5f,0x29,0x9d, +0xa8,0xb7,0x97,0xeb,0x74,0x7b,0x4f,0x2e,0xad,0x3d,0x27,0xdf,0x24,0x74,0x7a,0x69, +0xe9,0xe7,0xdf,0x94,0x76,0x8e,0x3e,0x29,0x9d,0x91,0xf2,0xd9,0xc3,0x2b,0xdb,0x47, +0x9a,0xef,0x5e,0xf1,0xc1,0xf8,0xf2,0x8d,0x3f,0x18,0x5f,0xbb,0x4f,0xa7,0xbb,0x4b, +0xf7,0xc9,0xa4,0xb8,0xff,0x49,0x69,0x77,0x2a,0x9c,0xbc,0x5d,0xda,0x6e,0xb,0x74, +0xf8,0xf0,0x99,0xb2,0x7c,0xda,0xb9,0xb1,0x7e,0xf4,0x27,0xaa,0xef,0x6c,0xe9,0xbe, +0x93,0x69,0xa9,0xf3,0x8b,0xed,0x8d,0x29,0x3d,0xfa,0xef,0xdb,0xdb,0xeb,0x65,0xf5, +0xfc,0x7b,0x46,0x98,0x1e,0x75,0x6e,0xfc,0xf5,0xfe,0x27,0xcf,0xe6,0xc1,0x77,0x44, +0xb7,0xb6,0xfe,0xd7,0xf6,0x89,0x4c,0xf7,0xff,0x6c,0x7b,0x7b,0x5b,0xbb,0x3e,0x9e, +0xa1,0xed,0x61,0xe7,0xc6,0x2f,0x3a,0x9d,0x5c,0xf8,0xb6,0x68,0xa7,0xb4,0xbb,0x7d, +0x76,0x42,0xb7,0x36,0x54,0xdf,0xb6,0xee,0x5b,0x37,0x7c,0xff,0x2d,0xf,0xbe,0x12, +0xec,0x94,0xf7,0x1e,0x9e,0x9d,0xd2,0xd2,0xa6,0xe9,0x7b,0x96,0x5e,0x31,0x7c,0x1b, +0xaa,0x6f,0xb8,0xec,0xfe,0xe5,0xd2,0xe0,0xb2,0xd0,0xbe,0x76,0x69,0x48,0x56,0xd7, +0xaf,0xac,0xae,0x97,0xe8,0xde,0xfa,0xb3,0x5a,0x9f,0x7d,0xe5,0x17,0xed,0xe2,0xbe, +0xea,0xdb,0x5b,0x76,0xff,0xbc,0xa2,0xfa,0xd4,0xf1,0x63,0x38,0xbd,0xd4,0xfe,0x9a, +0x56,0xe8,0x78,0xb0,0xfe,0x2c,0x5d,0x19,0x5f,0xfe,0xca,0x2f,0x6,0xb9,0xf0,0x51, +0x8a,0x45,0x8a,0x5,0xed,0xf5,0x2e,0x48,0xd0,0xfe,0x4f,0xbb,0x69,0x3,0x5a,0xed, +0xf,0x8b,0x30,0xbf,0xf9,0xa5,0x93,0xef,0x7c,0x45,0x8a,0xf9,0xf6,0xa9,0x39,0xe6, +0x22,0x3f,0xff,0xa3,0xf3,0xfd,0x7f,0x6e,0x69,0x1,0x55,0x8,0x9e,0xa1,0x2b,0x0, +0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82 +}; +//m1284p.png: 12987 bytes diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/clean.bat b/11_m644p_WIZNET_HTTPServer_FLASH_pages/clean.bat new file mode 100644 index 0000000..9977613 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/clean.bat @@ -0,0 +1,3 @@ +del *.b#* +del *.s#* +pause diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/globals.h b/11_m644p_WIZNET_HTTPServer_FLASH_pages/globals.h new file mode 100644 index 0000000..d51e7f4 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/globals.h @@ -0,0 +1,45 @@ +/* + * globals.h + * + * Created on: 29 нояб. 2018 г. + * Author: maxx + */ + +#ifndef GLOBALS_H_ +#define GLOBALS_H_ + +#include +#include +#include +#include "avr/wdt.h" // WatchDog + +//#define HTTPD_MAX_BUF_SIZE 2048 //For Mega1284p(16kb RAM)/Mega2560(8kb RAM) +#define HTTPD_MAX_BUF_SIZE 512 //For Mega644p(4kb RAM)/Mega128(4kb RAM) + +#define PRINTF_EN 1 +#if PRINTF_EN +#define PRINTF(FORMAT,args...) printf_P(PSTR(FORMAT),##args) +#else +#define PRINTF(...) +#endif + +extern unsigned long millis(void); +extern int freeRam (void); + +//M644P/M1284p Users LEDS: +//LED1/PORTC.4- m644p/m1284p maxxir +#define led1_conf() DDRC |= (1< +#include +#include +#include +#include //sbi, cbi etc.. +#include "avr/wdt.h" // WatchDog +#include // printf etc.. +#include "uart_extd.h" +#include "spi.h" + +#include "globals.h" //Global definitions for project + +#include "stdbool.h" +#include "Ethernet/socket.h" +#include "Ethernet/wizchip_conf.h" +#include "Internet/httpServer_avr/httpServer.h" +#include "webpage.h" + +#define _MAIN_DEBUG_ + +//#include "Application/loopback/loopback.h" +//#include "Application/webserver_simple/webserver_simple.h" + +//#include // itoa etc.. +/* + * (11) Try move all pages saved at from RAM to FLASH address space + * Example of flash data access look at: + * <01_m1284p_bb00_minimum_PSTR_webpage_test> + * <09_m1284p_WIZNET_simple_webserver> + * + * Success initial porting on 10/12/2018 - FREE RAM on webserver: 7936 bytes (From total 16kbytes)! + * NEED further optimization to AVR_RAM->AVR_FLASH point (damn Harvard architecture :( )! + * + * It works on AtMega1284p(16kbytes RAM), but need TODO finish (DONE on v2.3b 12/12/2018)!! + * + * TODO DONE: + * After v2.3 optimization: + * (+4kb HTTP Buffers READ-WRITE(with HTTPD_MAX_BUF_SIZE 2048 see )) : FREE RAM on webserver: 10372 bytes - much better! (RAM enough for AtMega1284/AtMega2560 ie. AVR with 8-16Kb RAM) + * (+1kb HTTP Buffers READ-WRITE(with HTTPD_MAX_BUF_SIZE 512 see )) : FREE RAM on webserver: 13444 bytes - awesome! (RAM enough for AtMega644/AtMega128 ie. AVR with 4Kb RAM) + * + * OK 1) Father optimization / (v2.3 12/12/2018) + * OK 2) Father optimization / (v2.3 12/12/2018) + * OK 3) Rename httpServer.*->httpServer_avr.*, httpParser.*->httpParser_avr.*, httpUtil.*->httpUtil_avr.* (v2.3b 12/12/2018) + * Actually made another way: rename parent folder to + * OK 4) Fix not correct showed value on (v2.2 12/12/2018) + * OK 5) Correct indentation in all <*.html> and <*.js> sources and repack it again in . (v2.2 12/12/2018) + * OK 6) Add to webserver (v2.1 12/12/2018) + also added binary files support in webserver via: , bin2hex_v2.py + * 7) Publish sources in my github, wiznetmuseim, avrfreaks etc.. (optional) + * + * (10) Try repeat example HTTPServer_LPC11E36_LPCXpresso on AVR Mega1284p (All pages still in RAM) + * Here used to WEB-server handle cgi-like requests, with AJAX + JSON + * Description here: + * http://wiznetmuseum.com/portfolio-items/w5500-evb-web-server/ + * + * To better undestand AJAX look here (actually here used AJAX + XHTML): + * https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/web-server-read-switch-using-AJAX/ + * https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/web-server-read-switch-automatically-using-AJAX/ + * https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/AJAX-read-switches-analog/ + * https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-AJAX-web-server/ + * https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-AJAX-XML-web-server/ + * https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-gauge/ + * https://startingelectronics.org/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-IO/ + * + * To online encode text file to C source use online utility (Text->Cpp): + * https://tomeko.net/online_tools/cpp_text_escape.php?lang=en + * add option (this is for good reading into browser, as source code) + * after that insert in any text editor and replace <\n"> sequence to <\n"\> (this is for recognize multiple string into C-source headers) + * + * For prepare binary data (some image data, like favicon.ico) use script. + * Example usage: + * >bin2hex_v2.py favicon.ico + * >out favicon_ico.h + * After that insert into end content from favicon.ico; + * Then use this resource in www server like (look in ): + * reg_httpServer_binContent_avr(PSTR("favicon.ico"),favicon_ico, (uint32_t)sizeof(favicon_ico)); // favicon.ico : webserver icon + * + * + * + * Also can use File->HEX (BIN2HEX) - for prepare images for example (bin2hex_v2.py BETTER SUIT for AVR!!): + * https://tomeko.net/online_tools/file_to_hex.php?lang=en + * + * (9) Simple webserver, based on code from: + * http://www.ermicro.com/blog/?p=1773 + * Article: Integrating Wiznet W5100, WIZ811MJ network module with Atmel AVR Microcontroller + * + * (3) Trying WIZNET5500 init with using official Wiznet ioLibrary_Driver + * working ping on static IP + * LED1 = ON when phy_link detected + * and loopback test on TCP-IP:5000 and UDP:3000 ports. + * use Hercules terminal utility to check network connection see: + * + * https://wizwiki.net/wiki/doku.php?id=osh:cookie:loopback_test + * https://www.hw-group.com/software/hercules-setup-utility + * + * + * Author of porting to AVR Mega: + * Ibragimov Maxim, Russia Togliatty ~10..12.2018 + */ +/* +#define PRINTF_EN 1 +#if PRINTF_EN +#define PRINTF(FORMAT,args...) printf_P(PSTR(FORMAT),##args) +#else +#define PRINTF(...) +#endif +*/ +//*********Program metrics +const char compile_date[] PROGMEM = __DATE__; // Mmm dd yyyy - Дата компиляции +const char compile_time[] PROGMEM = __TIME__; // hh:mm:ss - Время компиляции +const char str_prog_name[] PROGMEM = "\r\nAtMega1284p v2.3d Static IP HTTP_server FLASH Pages WIZNET_5500 ETHERNET 12/12/2018\r\n"; // Program name + +/* + * m1284p minimum template, with one button & one led + */ + +//M644P/M1284p Users LEDS: +//LED1/PORTC.4- m644p/m1284p maxxir +#define led1_conf() DDRC |= (1<getchar() там опрос блокируется пока символ не будет принят (поллинг) + через UART1_RX, т.е. неудобно. + */ + +// STDOUT UART0 TX handler +static int uart0_putchar(char ch,FILE *stream) +{ + uart_putc(ch); + return 0; +} + +// Очищаем буфер приема UART1 RX (иногда нужно) +static void uart0_rx_flash(void) +{ + // Считываем все из ring-buffer UART1 RX + unsigned int c; + do + { + c = uart_getc(); + } while (( c & UART_NO_DATA ) == 0); // Check RX1 none-empty + +} +//***************** UART0: END + +//***************** ADC: BEGIN + +#ifndef ADC_DIV +//12.5MHz or over use this ADC reference clock +#define ADC_DIV (1<> MCU is: %S; CLK is: %luHz\r\n", str_mcu, F_CPU);// MCU Name && FREQ + PRINTF(">> Free RAM is: %d bytes\r\n", freeRam()); + + //Short Blink LED 3 times on startup + unsigned char i = 3; + while(i--) + { + led1_high(); + _delay_ms(100); + led1_low(); + _delay_ms(400); + wdt_reset(); + } + + //Wizchip WIZ5500 Ethernet initialize + IO_LIBRARY_Init(); //After that ping must working + print_network_information(); + +//**************************************HTTPD init: BEGIN + /* HTTP Server Initialization */ + httpServer_init(TX_BUF, RX_BUF, MAX_HTTPSOCK, socknumlist); // Tx/Rx buffers (1kB) / The number of W5500 chip H/W sockets in use + //reg_httpServer_cbfunc(NVIC_SystemReset, NULL); // Callback: NXP MCU Reset + reg_httpServer_cbfunc(NULL, NULL); // Callback: Still not used here ARV System reset, AVR WDT reset + if(1) + { + /* Web content registration (web content in webpage.h, Example web pages) */ + + // Index page and netinfo / base64 image demo + reg_httpServer_webContent_avr(PSTR("index.html"), PSTR(index_page)); // index.html : Main page example + + //favicon.ico + reg_httpServer_binContent_avr(PSTR("favicon.ico"),favicon_ico, (uint32_t)sizeof(favicon_ico)); // favicon.ico : webserver icon + + //brd_wiznet.png + reg_httpServer_binContent_avr(PSTR("brd_wiznet.png"),brd_wiznet_png, (uint32_t)sizeof(brd_wiznet_png)); // brd_wiznet.png : webserver image + + /* + //m1284p.png + reg_httpServer_binContent_avr(PSTR("m1284p.png"),m1284p_png, (uint32_t)sizeof(m1284p_png)); // m1284p.png : webserver image + */ + + reg_httpServer_webContent_avr(PSTR("netinfo.html"), PSTR(netinfo_page)); // netinfo.html : Network information example page + reg_httpServer_webContent_avr(PSTR("netinfo.js"), PSTR(wiz550web_netinfo_js)); // netinfo.js : JavaScript for Read Network configuration (+ ajax.js) + //reg_httpServer_webContent((uint8_t *)"netinfo.html", (uint8_t *)netinfo_page); // netinfo.html : Network information example page + //reg_httpServer_webContent((uint8_t *)"netinfo.js", (uint8_t *)wiz550web_netinfo_js); // netinfo.js : JavaScript for Read Network configuration (+ ajax.js) + + // AJAX JavaScript functions + reg_httpServer_webContent_avr(PSTR("ajax.js"), PSTR(wiz550web_ajax_js)); // ajax.js : JavaScript for AJAX request transfer + //reg_httpServer_webContent((uint8_t *)"ajax.js", (uint8_t *)wiz550web_ajax_js); // ajax.js : JavaScript for AJAX request transfer + + //Device info page && related ajax script + reg_httpServer_webContent_avr(PSTR("info.html"), PSTR(info_page)); //info.html + reg_httpServer_webContent_avr(PSTR("info.js"), PSTR(wiz550web_info_js)); // info.js : JavaScript for Device information (+ ajax.js) + //reg_httpServer_webContent((uint8_t *)"info.html", (uint8_t *)info_page); //info.html + //reg_httpServer_webContent((uint8_t *)"info.js", (uint8_t *)wiz550web_info_js); // info.js : JavaScript for Device information (+ ajax.js) + + reg_httpServer_webContent_avr(PSTR("img.html"), PSTR(img_page)); // img.html : Base64 Image data example page + //reg_httpServer_webContent((uint8_t *)"img.html", (uint8_t *)img_page); // img.html : Base64 Image data example page + + // Example #1 + reg_httpServer_webContent_avr(PSTR("dio.html"), PSTR(dio_page)); // dio.html : Digital I/O control example page + reg_httpServer_webContent_avr(PSTR("dio.js"), PSTR(wiz550web_dio_js)); // dio.js : JavaScript for digital I/O control (+ ajax.js) + //reg_httpServer_webContent((uint8_t *)"dio.html", (uint8_t *)dio_page); // dio.html : Digital I/O control example page + //reg_httpServer_webContent((uint8_t *)"dio.js", (uint8_t *)wiz550web_dio_js); // dio.js : JavaScript for digital I/O control (+ ajax.js) + + // Example #2 + reg_httpServer_webContent_avr(PSTR("ain.html"), PSTR(ain_page)); // ain.html : Analog input monitor example page + reg_httpServer_webContent_avr(PSTR("ain.js"), PSTR(wiz550web_ain_js)); // ain.js : JavaScript for Analog input monitor (+ ajax.js) + //reg_httpServer_webContent((uint8_t *)"ain.html", (uint8_t *)ain_page); // ain.html : Analog input monitor example page + //reg_httpServer_webContent((uint8_t *)"ain.js", (uint8_t *)wiz550web_ain_js); // ain.js : JavaScript for Analog input monitor (+ ajax.js) + + // Example #3 + reg_httpServer_webContent_avr(PSTR("ain_gauge.html"), PSTR(ain_gauge_page)); // ain_gauge.html : Analog input monitor example page; using Google Gauge chart + reg_httpServer_webContent_avr(PSTR("ain_gauge.js"), PSTR(ain_gauge_js)); // ain_gauge.js : JavaScript for Google Gauge chart (+ ajax.js) + //reg_httpServer_webContent((uint8_t *)"ain_gauge.html", (uint8_t *)ain_gauge_page); // ain_gauge.html : Analog input monitor example page; using Google Gauge chart + //reg_httpServer_webContent((uint8_t *)"ain_gauge.js", (uint8_t *)ain_gauge_js); // ain_gauge.js : JavaScript for Google Gauge chart (+ ajax.js) + +#ifdef _MAIN_DEBUG_ + //display_reg_webContent_list(); + display_reg_webContent_list_avr(); +#endif + } +//**************************************HTTPD init: END + + /* Loopback Test: TCP Server and UDP */ + // Test for Ethernet data transfer validation + //uint32_t timer_link_1sec = millis(); + uint32_t timer_httpd_1sec = millis(); + bool run_user_applications = true; + while(1) + { + //Here at least every 1sec + wdt_reset(); // WDT reset at least every sec + + /* HTTPD */ + /*HTTPD timer 1 sec interval tick*/ + if((millis()-timer_httpd_1sec)> 1000) + { + //here every 1 sec + timer_httpd_1sec = millis(); + //////////////////////////////////////////////////////// + // SHOULD BE Added HTTP Server Time Handler to your 1s tick timer + httpServer_time_handler(); // for HTTP server time counter + //////////////////////////////////////////////////////// + //Printout RAM usage every 1 minute + static uint16_t j_ram = 0; + if(j_ram++%60 == 0) + { + PRINTF(">> Free RAM is: %d bytes\r\n", freeRam()); + } + } + + // TODO: insert user's code here + if(run_user_applications) + { + //for(i = 0; i < MAX_HTTPSOCK; i++) httpServer_run(i); // HTTP Server handler + for(i = 0; i < MAX_HTTPSOCK; i++) httpServer_run_avr(i); // HTTP Server handler avr optimized + + //loopback_tcps(SOCK_TCPS, RX_BUF, 5000); //not used here + + } // End of user's code + + //Use Hercules Terminal to check loopback tcp:5000 and udp:3000 + /* + * https://www.hw-group.com/software/hercules-setup-utility + * */ + //loopback_tcps(0,ethBuf0,5000); + //loopback_udps(1, ethBuf1, 3000); + + //Use WEBbrowser to connect to webserver: http://192.168.0.199/index.html + //websrv_simple(2, ethBuf2_WEBSRV, 80); + + + //loopback_ret = loopback_tcpc(SOCK_TCPS, gDATABUF, destip, destport); + //if(loopback_ret < 0) printf("loopback ret: %ld\r\n", loopback_ret); // TCP Socket Error code + + //Not used here, because led1 handle via websrv + /* + if((millis()-timer_link_1sec)> 1000) + { + //here every 1 sec + timer_link_1sec = millis(); + if(wizphy_getphylink() == PHY_LINK_ON) + { + led1_high(); + } + else + { + led1_low(); + } + } + */ + + } + return 0; +} + +// Timer0 +// 1ms IRQ +// Used for millis() timing +void timer0_init(void) +{ + /* + * + * For M128 + TCCR0 = (1<250kHz:250-=>1kHz) + TIMSK |= 1<250kHz:250-=>1kHz) + TIMSK0 |= 1< +#include "spi.h" +//#include "contiki-conf.h" + +/* + * On the Tmote sky access to I2C/SPI/UART0 must always be + * exclusive. Set spi_busy so that interrupt handlers can check if + * they are allowed to use the bus or not. Only the CC2420 radio needs + * this in practice. + * + */ +unsigned char spi_busy = 0; + +/* + * Initialize SPI bus. + */ + +//~ // From working SPI ENC28J60 driver +//~ #define ENC28J60_CONTROL_PORT PORTB +//~ #define ENC28J60_CONTROL_DDR DDRB +//~ +//~ #define ENC28J60_CONTROL_CS PORTB6 +//~ #define ENC28J60_CONTROL_SO PORTB3 +//~ #define ENC28J60_CONTROL_SI PORTB2 +//~ #define ENC28J60_CONTROL_SCK PORTB1 +//~ #define ENC28J60_CONTROL_SS PORTB0 +//~ +//~ // set CS to 0 = active +//~ #define CSACTIVE ENC28J60_CONTROL_PORT&=~(1< + * Niclas Finne + */ + +#ifndef SPI_H_ +#define SPI_H_ + +/* SPI input/output registers. */ +#define SPI_TXBUF SPDR +#define SPI_RXBUF SPDR + +#define BV(bitno) _BV(bitno) + +#define SPI_WAITFOREOTx() do { while (!(SPSR & BV(SPIF))); } while (0) +#define SPI_WAITFOREORx() do { while (!(SPSR & BV(SPIF))); } while (0) + +//M128 +//#define SCK 1 /* - Output: SPI Serial Clock (SCLK) - ATMEGA128 PORTB, PIN1 */ +//#define MOSI 2 /* - Output: SPI Master out - slave in (MOSI) - ATMEGA128 PORTB, PIN2 */ +//#define MISO 3 /* - Input: SPI Master in - slave out (MISO) - ATMEGA128 PORTB, PIN3 */ +//#define CSN 0 /*SPI - SS*/ +//#define FLASH_CS 6 /* PB.6 Output as CS*/ + +//M644p/M1284p +#define SCK 7 /* - Output: SPI Serial Clock (SCLK) - ATMEGA644/1284 PORTB, PIN7 */ +#define MOSI 5 /* - Output: SPI Master out - slave in (MOSI) - ATMEGA644/1284 PORTB, PIN5 */ +#define MISO 6 /* - Input: SPI Master in - slave out (MISO) - ATMEGA644/1284 PORTB, PIN6 */ +#define CSN 4 /*SPI - SS*/ + +//#define FLASH_CS 3 /* PB.2 Output as CS*/ +//#define FLASH_CS 2 /* PB.2 Output as CS*/ +//#define CAN_CS 1 /* PB.1 Output as CS for CAN MCP2515*/ + +//#define SPI_FLASH_ENABLE() ( PORTB &= ~BV(FLASH_CS) ) +//#define SPI_FLASH_DISABLE() ( PORTB |= BV(FLASH_CS) ) + +#define WIZNET_CS 3 /* PB.3 Output as CS for Wiznet ETHERNET*/ +#define SPI_WIZNET_ENABLE() ( PORTB &= ~BV(WIZNET_CS) ) +#define SPI_WIZNET_DISABLE() ( PORTB |= BV(WIZNET_CS) ) + +#define SD_CS 0 /* PB.0 Output as CS for SD-reader*/ +#define SPI_SD_ENABLE() ( PORTB &= ~BV(SD_CS) ) +#define SPI_SD_DISABLE() ( PORTB |= BV(SD_CS) ) + + + + +/* Define macros to use for checking SPI transmission status depending + on if it is possible to wait for TX buffer ready. This is possible + on for example MSP430 but not on AVR. */ +#ifdef SPI_WAITFORTxREADY +#define SPI_WAITFORTx_BEFORE() SPI_WAITFORTxREADY() +#define SPI_WAITFORTx_AFTER() +#define SPI_WAITFORTx_ENDED() SPI_WAITFOREOTx() +#else /* SPI_WAITFORTxREADY */ +#define SPI_WAITFORTx_BEFORE() +#define SPI_WAITFORTx_AFTER() SPI_WAITFOREOTx() +#define SPI_WAITFORTx_ENDED() +#endif /* SPI_WAITFORTxREADY */ + +extern unsigned char spi_busy; + +void spi_init(void); + +/* Write one character to SPI */ +#define SPI_WRITE(data) \ + do { \ + SPI_WAITFORTx_BEFORE(); \ + SPI_TXBUF = data; \ + SPI_WAITFOREOTx(); \ + } while(0) + +/* Write one character to SPI - will not wait for end + useful for multiple writes with wait after final */ +#define SPI_WRITE_FAST(data) \ + do { \ + SPI_WAITFORTx_BEFORE(); \ + SPI_TXBUF = data; \ + SPI_WAITFORTx_AFTER(); \ + } while(0) + +/* Read one character from SPI */ +#define SPI_READ(data) \ + do { \ + SPI_TXBUF = 0; \ + SPI_WAITFOREORx(); \ + data = SPI_RXBUF; \ + } while(0) + +/* Flush the SPI read register */ +#ifndef SPI_FLUSH +#define SPI_FLUSH() \ + do { \ + SPI_RXBUF; \ + } while(0); +#endif + +#endif /* SPI_H_ */ diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/uart_extd.c b/11_m644p_WIZNET_HTTPServer_FLASH_pages/uart_extd.c new file mode 100644 index 0000000..f4ad484 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/uart_extd.c @@ -0,0 +1,706 @@ +/* + * Modified for different BUFFER_SIZE for UART0 && UART1 + * see below: UART0_RX_BUFFER_SIZE/UART1_RX_BUFFER_SIZE && UART0_TX_BUFFER_SIZE/UART1_TX_BUFFER_SIZE + * Ibragimov M. 7/03/2015 +*/ +/************************************************************************* +Title: Interrupt UART library with receive/transmit circular buffers +Author: Peter Fleury http://jump.to/fleury +File: $Id: uart.c,v 1.12 2014/01/08 21:58:12 peter Exp $ +Software: AVR-GCC 4.1, AVR Libc 1.4.6 or higher +Hardware: any AVR with built-in UART, +License: GNU General Public License + +DESCRIPTION: + An interrupt is generated when the UART has finished transmitting or + receiving a byte. The interrupt handling routines use circular buffers + for buffering received and transmitted data. + + The UART0[1]_RX_BUFFER_SIZE and UART0[1]_TX_BUFFER_SIZE variables define + the buffer size in bytes. Note that these variables must be a + power of 2. + +USAGE: + Refere to the header file uart.h for a description of the routines. + See also example test_uart.c. + +NOTES: + Based on Atmel Application Note AVR306 + +LICENSE: + Copyright (C) 2006 Peter Fleury + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + any later version. + + This program 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 General Public License for more details. + +*************************************************************************/ +#include +#include +#include +#include "uart_extd.h" + + +/* + * constants and macros + */ + +/* size of RX0/TX0 buffers */ +#define UART0_RX_BUFFER_MASK ( UART0_RX_BUFFER_SIZE - 1) +#define UART0_TX_BUFFER_MASK ( UART0_TX_BUFFER_SIZE - 1) + +#if ( UART0_RX_BUFFER_SIZE & UART0_RX_BUFFER_MASK ) +#error RX0 buffer size is not a power of 2 +#endif +#if ( UART0_TX_BUFFER_SIZE & UART0_TX_BUFFER_MASK ) +#error TX0 buffer size is not a power of 2 +#endif + +/* size of RX1/TX1 buffers */ +#define UART1_RX_BUFFER_MASK ( UART1_RX_BUFFER_SIZE - 1) +#define UART1_TX_BUFFER_MASK ( UART1_TX_BUFFER_SIZE - 1) + +#if ( UART1_RX_BUFFER_SIZE & UART1_RX_BUFFER_MASK ) +#error RX1 buffer size is not a power of 2 +#endif +#if ( UART1_TX_BUFFER_SIZE & UART1_TX_BUFFER_MASK ) +#error TX1 buffer size is not a power of 2 +#endif + + +#if defined(__AVR_AT90S2313__) \ + || defined(__AVR_AT90S4414__) || defined(__AVR_AT90S4434__) \ + || defined(__AVR_AT90S8515__) || defined(__AVR_AT90S8535__) \ + || defined(__AVR_ATmega103__) + /* old AVR classic or ATmega103 with one UART */ + #define AT90_UART + #define UART0_RECEIVE_INTERRUPT UART_RX_vect + #define UART0_TRANSMIT_INTERRUPT UART_UDRE_vect + #define UART0_STATUS USR + #define UART0_CONTROL UCR + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__) + /* old AVR classic with one UART */ + #define AT90_UART + #define UART0_RECEIVE_INTERRUPT UART_RX_vect + #define UART0_TRANSMIT_INTERRUPT UART_UDRE_vect + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) \ + || defined(__AVR_ATmega323__) + /* ATmega with one USART */ + #define ATMEGA_USART + #define UART0_RECEIVE_INTERRUPT USART_RXC_vect + #define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined (__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) + #define ATMEGA_USART + #define UART0_RECEIVE_INTERRUPT USART_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_ATmega163__) + /* ATmega163 with one UART */ + #define ATMEGA_UART + #define UART0_RECEIVE_INTERRUPT UART_RX_vect + #define UART0_TRANSMIT_INTERRUPT UART_UDRE_vect + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_ATmega162__) + /* ATmega with two USART */ + #define ATMEGA_USART0 + #define ATMEGA_USART1 + #define UART0_RECEIVE_INTERRUPT USART0_RXC_vect + #define UART1_RECEIVE_INTERRUPT USART1_RXC_vect + #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect + #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 + #define UART1_STATUS UCSR1A + #define UART1_CONTROL UCSR1B + #define UART1_DATA UDR1 + #define UART1_UDRIE UDRIE1 +#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) + /* ATmega with two USART */ + #define ATMEGA_USART0 + #define ATMEGA_USART1 + #define UART0_RECEIVE_INTERRUPT USART0_RX_vect + #define UART1_RECEIVE_INTERRUPT USART1_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect + #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 + #define UART1_STATUS UCSR1A + #define UART1_CONTROL UCSR1B + #define UART1_DATA UDR1 + #define UART1_UDRIE UDRIE1 +#elif defined(__AVR_ATmega161__) + /* ATmega with UART */ + #error "AVR ATmega161 currently not supported by this libaray !" +#elif defined(__AVR_ATmega169__) + /* ATmega with one USART */ + #define ATMEGA_USART + #define UART0_RECEIVE_INTERRUPT USART0_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_ATmega48__) || defined(__AVR_ATmega88__) || defined(__AVR_ATmega168__) || defined(__AVR_ATmega48P__) || defined(__AVR_ATmega88P__) || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega328P__) \ + || defined(__AVR_ATmega3250__) || defined(__AVR_ATmega3290__) ||defined(__AVR_ATmega6450__) || defined(__AVR_ATmega6490__) + /* ATmega with one USART */ + #define ATMEGA_USART0 + #define UART0_RECEIVE_INTERRUPT USART_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 +#elif defined(__AVR_ATtiny2313__) + #define ATMEGA_USART + #define UART0_RECEIVE_INTERRUPT USART_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART_UDRE_vect + #define UART0_STATUS UCSRA + #define UART0_CONTROL UCSRB + #define UART0_DATA UDR + #define UART0_UDRIE UDRIE +#elif defined(__AVR_ATmega329__) || \ + defined(__AVR_ATmega649__) || \ + defined(__AVR_ATmega325__) || \ + defined(__AVR_ATmega645__) + /* ATmega with one USART */ + #define ATMEGA_USART0 + #define UART0_RECEIVE_INTERRUPT USART0_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 +#elif defined(__AVR_ATmega2560__) || defined(__AVR_ATmega2561__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega640__) +/* ATmega with two USART */ + #define ATMEGA_USART0 + #define ATMEGA_USART1 + #define UART0_RECEIVE_INTERRUPT USART0_RX_vect + #define UART1_RECEIVE_INTERRUPT USART1_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect + #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 + #define UART1_STATUS UCSR1A + #define UART1_CONTROL UCSR1B + #define UART1_DATA UDR1 + #define UART1_UDRIE UDRIE1 +#elif defined(__AVR_ATmega644__) + /* ATmega with one USART */ + #define ATMEGA_USART0 + #define UART0_RECEIVE_INTERRUPT USART0_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 +#elif defined(__AVR_ATmega164P__) || defined(__AVR_ATmega324P__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega1284P__) + /* ATmega with two USART */ + #define ATMEGA_USART0 + #define ATMEGA_USART1 + #define UART0_RECEIVE_INTERRUPT USART0_RX_vect + #define UART1_RECEIVE_INTERRUPT USART1_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect + #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect + #define UART0_STATUS UCSR0A + #define UART0_CONTROL UCSR0B + #define UART0_DATA UDR0 + #define UART0_UDRIE UDRIE0 + #define UART1_STATUS UCSR1A + #define UART1_CONTROL UCSR1B + #define UART1_DATA UDR1 + #define UART1_UDRIE UDRIE1 +#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1287__) + /* AT90USBxx with one USART */ + #define AT90USB_USART + #define UART0_RECEIVE_INTERRUPT USART1_RX_vect + #define UART0_TRANSMIT_INTERRUPT USART1_UDRE_vect + #define UART0_STATUS UCSR1A + #define UART0_CONTROL UCSR1B + #define UART0_DATA UDR1 + #define UART0_UDRIE UDRIE1 +#else + #error "no UART definition for MCU available" +#endif + + +/* + * module global variables + */ +static volatile unsigned char UART_TxBuf[UART0_TX_BUFFER_SIZE]; +static volatile unsigned char UART_RxBuf[UART0_RX_BUFFER_SIZE]; +static volatile unsigned char UART_TxHead; +static volatile unsigned char UART_TxTail; +static volatile unsigned char UART_RxHead; +static volatile unsigned char UART_RxTail; +static volatile unsigned char UART_LastRxError; + +#if defined( ATMEGA_USART1 ) +static volatile unsigned char UART1_TxBuf[UART1_TX_BUFFER_SIZE]; +static volatile unsigned char UART1_RxBuf[UART1_RX_BUFFER_SIZE]; +static volatile unsigned char UART1_TxHead; +static volatile unsigned char UART1_TxTail; +static volatile unsigned char UART1_RxHead; +static volatile unsigned char UART1_RxTail; +static volatile unsigned char UART1_LastRxError; +#endif + + + +ISR (UART0_RECEIVE_INTERRUPT) +/************************************************************************* +Function: UART Receive Complete interrupt +Purpose: called when the UART has received a character +**************************************************************************/ +{ + unsigned char tmphead; + unsigned char data; + unsigned char usr; + unsigned char lastRxError; + + + /* read UART status register and UART data register */ + usr = UART0_STATUS; + data = UART0_DATA; + + /* */ +#if defined( AT90_UART ) + lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); +#elif defined( ATMEGA_USART ) + lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); +#elif defined( ATMEGA_USART0 ) + lastRxError = (usr & (_BV(FE0)|_BV(DOR0)) ); +#elif defined ( ATMEGA_UART ) + lastRxError = (usr & (_BV(FE)|_BV(DOR)) ); +#elif defined( AT90USB_USART ) + lastRxError = (usr & (_BV(FE1)|_BV(DOR1)) ); +#endif + + /* calculate buffer index */ + tmphead = ( UART_RxHead + 1) & UART0_RX_BUFFER_MASK; + + if ( tmphead == UART_RxTail ) { + /* error: receive buffer overflow */ + lastRxError = UART_BUFFER_OVERFLOW >> 8; + }else{ + /* store new index */ + UART_RxHead = tmphead; + /* store received data in buffer */ + UART_RxBuf[tmphead] = data; + } + UART_LastRxError |= lastRxError; +} + + +ISR (UART0_TRANSMIT_INTERRUPT) +/************************************************************************* +Function: UART Data Register Empty interrupt +Purpose: called when the UART is ready to transmit the next byte +**************************************************************************/ +{ + unsigned char tmptail; + + + if ( UART_TxHead != UART_TxTail) { + /* calculate and store new buffer index */ + tmptail = (UART_TxTail + 1) & UART0_TX_BUFFER_MASK; + UART_TxTail = tmptail; + /* get one byte from buffer and write it to UART */ + UART0_DATA = UART_TxBuf[tmptail]; /* start transmission */ + }else{ + /* tx buffer empty, disable UDRE interrupt */ + UART0_CONTROL &= ~_BV(UART0_UDRIE); + } +} + + +/************************************************************************* +Function: uart_init() +Purpose: initialize UART and set baudrate +Input: baudrate using macro UART_BAUD_SELECT() +Returns: none +**************************************************************************/ +void uart_init(unsigned int baudrate) +{ + UART_TxHead = 0; + UART_TxTail = 0; + UART_RxHead = 0; + UART_RxTail = 0; + +#if defined( AT90_UART ) + /* set baud rate */ + UBRR = (unsigned char)baudrate; + + /* enable UART receiver and transmmitter and receive complete interrupt */ + UART0_CONTROL = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN); + +#elif defined (ATMEGA_USART) + /* Set baud rate */ + if ( baudrate & 0x8000 ) + { + UART0_STATUS = (1<>8); + UBRRL = (unsigned char) baudrate; + + /* Enable USART receiver and transmitter and receive complete interrupt */ + UART0_CONTROL = _BV(RXCIE)|(1<>8); + UBRR0L = (unsigned char) baudrate; + + /* Enable USART receiver and transmitter and receive complete interrupt */ + UART0_CONTROL = _BV(RXCIE0)|(1<>8); + UBRR = (unsigned char) baudrate; + + /* Enable UART receiver and transmitter and receive complete interrupt */ + UART0_CONTROL = _BV(RXCIE)|(1<>8); + UBRR1L = (unsigned char) baudrate; + + /* Enable UART receiver and transmitter and receive complete interrupt */ + UART0_CONTROL = _BV(RXCIE1)|(1<> 8; + }else{ + /* store new index */ + UART1_RxHead = tmphead; + /* store received data in buffer */ + UART1_RxBuf[tmphead] = data; + } + UART1_LastRxError |= lastRxError; +} + + +ISR(UART1_TRANSMIT_INTERRUPT) +/************************************************************************* +Function: UART1 Data Register Empty interrupt +Purpose: called when the UART1 is ready to transmit the next byte +**************************************************************************/ +{ + unsigned char tmptail; + + + if ( UART1_TxHead != UART1_TxTail) { + /* calculate and store new buffer index */ + tmptail = (UART1_TxTail + 1) & UART1_TX_BUFFER_MASK; + UART1_TxTail = tmptail; + /* get one byte from buffer and write it to UART */ + UART1_DATA = UART1_TxBuf[tmptail]; /* start transmission */ + }else{ + /* tx buffer empty, disable UDRE interrupt */ + UART1_CONTROL &= ~_BV(UART1_UDRIE); + } +} + + +/************************************************************************* +Function: uart1_init() +Purpose: initialize UART1 and set baudrate +Input: baudrate using macro UART_BAUD_SELECT() +Returns: none +**************************************************************************/ +void uart1_init(unsigned int baudrate) +{ + UART1_TxHead = 0; + UART1_TxTail = 0; + UART1_RxHead = 0; + UART1_RxTail = 0; + + + /* Set baud rate */ + if ( baudrate & 0x8000 ) + { + UART1_STATUS = (1<>8); + UBRR1L = (unsigned char) baudrate; + + /* Enable USART receiver and transmitter and receive complete interrupt */ + UART1_CONTROL = _BV(RXCIE1)|(1< http://jump.to/fleury +File: $Id: uart.h,v 1.12 2012/11/19 19:52:27 peter Exp $ +Software: AVR-GCC 4.1, AVR Libc 1.4 +Hardware: any AVR with built-in UART, tested on AT90S8515 & ATmega8 at 4 Mhz +License: GNU General Public License +Usage: see Doxygen manual + +LICENSE: + Copyright (C) 2006 Peter Fleury + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + any later version. + + This program 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 General Public License for more details. + +************************************************************************/ + +/** + * @defgroup pfleury_uart UART Library + * @code #include @endcode + * + * @brief Interrupt UART library using the built-in UART with transmit and receive circular buffers. + * + * This library can be used to transmit and receive data through the built in UART. + * + * An interrupt is generated when the UART has finished transmitting or + * receiving a byte. The interrupt handling routines use circular buffers + * for buffering received and transmitted data. + * + * The UART0[1]_RX_BUFFER_SIZE and UART0[1]_TX_BUFFER_SIZE constants define + * the size of the circular buffers in bytes. Note that these constants must be a power of 2. + * You may need to adapt this constants to your target and your application by adding + * CDEFS += -DUART0[1]_RX_BUFFER_SIZE=nn -DUART0[1]_RX_BUFFER_SIZE=nn to your Makefile. + * + * @note Based on Atmel Application Note AVR306 + * @author Peter Fleury pfleury@gmx.ch http://jump.to/fleury + */ + +/**@{*/ + + +#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304 +#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !" +#endif + + +/* +** constants and macros +*/ + +/** @brief UART Baudrate Expression + * @param xtalcpu system clock in Mhz, e.g. 4000000UL for 4Mhz + * @param baudrate baudrate in bps, e.g. 1200, 2400, 9600 + */ +#define UART_BAUD_SELECT(baudRate,xtalCpu) (((xtalCpu) + 8UL * (baudRate)) / (16UL * (baudRate)) -1UL) + +/** @brief UART Baudrate Expression for ATmega double speed mode + * @param xtalcpu system clock in Mhz, e.g. 4000000UL for 4Mhz + * @param baudrate baudrate in bps, e.g. 1200, 2400, 9600 + */ +#define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) ( ((((xtalCpu) + 4UL * (baudRate)) / (8UL * (baudRate)) -1UL)) | 0x8000) + + +/** Size of the circular receive buffer UART0, must be power of 2 */ +#ifndef UART0_RX_BUFFER_SIZE +#define UART0_RX_BUFFER_SIZE 32 +#endif +/** Size of the circular transmit buffer UART0, must be power of 2 */ +#ifndef UART0_TX_BUFFER_SIZE +#define UART0_TX_BUFFER_SIZE 32 +#endif + +/** Size of the circular receive buffer UART1, must be power of 2 */ +#ifndef UART1_RX_BUFFER_SIZE +#define UART1_RX_BUFFER_SIZE 128 +#endif +/** Size of the circular transmit buffer UART1, must be power of 2 */ +#ifndef UART1_TX_BUFFER_SIZE +#define UART1_TX_BUFFER_SIZE 128 +#endif + +/* test if the size of the circular buffers fits into SRAM */ +#if ( (UART0_RX_BUFFER_SIZE+UART0_TX_BUFFER_SIZE+UART1_RX_BUFFER_SIZE+UART1_TX_BUFFER_SIZE) >= (RAMEND-0x60 ) ) +#error "size of UART0[1]_RX_BUFFER_SIZE + UART0[1]_TX_BUFFER_SIZE larger than size of SRAM" +#endif + +/* +** high byte error return code of uart_getc() +*/ +#define UART_FRAME_ERROR 0x1000 /* Framing Error by UART */ +#define UART_OVERRUN_ERROR 0x0800 /* Overrun condition by UART */ +#define UART_PARITY_ERROR 0x0400 /* Parity Error by UART */ +#define UART_BUFFER_OVERFLOW 0x0200 /* receive ringbuffer overflow */ +#define UART_NO_DATA 0x0100 /* no receive data available */ + + +/* +** function prototypes +*/ + +/** + @brief Initialize UART and set baudrate + @param baudrate Specify baudrate using macro UART_BAUD_SELECT() + @return none +*/ +extern void uart_init(unsigned int baudrate); + + +/** + * @brief Get received byte from ringbuffer + * + * Returns in the lower byte the received character and in the + * higher byte the last receive error. + * UART_NO_DATA is returned when no data is available. + * + * @param void + * @return lower byte: received byte from ringbuffer + * @return higher byte: last receive status + * - \b 0 successfully received data from UART + * - \b UART_NO_DATA + *
no receive data available + * - \b UART_BUFFER_OVERFLOW + *
Receive ringbuffer overflow. + * We are not reading the receive buffer fast enough, + * one or more received character have been dropped + * - \b UART_OVERRUN_ERROR + *
Overrun condition by UART. + * A character already present in the UART UDR register was + * not read by the interrupt handler before the next character arrived, + * one or more received characters have been dropped. + * - \b UART_FRAME_ERROR + *
Framing Error by UART + */ +extern unsigned int uart_getc(void); + + +/** + * @brief Put byte to ringbuffer for transmitting via UART + * @param data byte to be transmitted + * @return none + */ +extern void uart_putc(unsigned char data); + + +/** + * @brief Put string to ringbuffer for transmitting via UART + * + * The string is buffered by the uart library in a circular buffer + * and one character at a time is transmitted to the UART using interrupts. + * Blocks if it can not write the whole string into the circular buffer. + * + * @param s string to be transmitted + * @return none + */ +extern void uart_puts(const char *s ); + + +/** + * @brief Put string from program memory to ringbuffer for transmitting via UART. + * + * The string is buffered by the uart library in a circular buffer + * and one character at a time is transmitted to the UART using interrupts. + * Blocks if it can not write the whole string into the circular buffer. + * + * @param s program memory string to be transmitted + * @return none + * @see uart_puts_P + */ +extern void uart_puts_p(const char *s ); + +/** + * @brief Macro to automatically put a string constant into program memory + */ +#define uart_puts_P(__s) uart_puts_p(PSTR(__s)) + + + +/** @brief Initialize USART1 (only available on selected ATmegas) @see uart_init */ +extern void uart1_init(unsigned int baudrate); +/** @brief Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc */ +extern unsigned int uart1_getc(void); +/** @brief Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc */ +extern void uart1_putc(unsigned char data); +/** @brief Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts */ +extern void uart1_puts(const char *s ); +/** @brief Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p */ +extern void uart1_puts_p(const char *s ); +/** @brief Macro to automatically put a string constant into program memory */ +#define uart1_puts_P(__s) uart1_puts_p(PSTR(__s)) + +/**@}*/ + + +#endif // UART_H + diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/userHandler.c b/11_m644p_WIZNET_HTTPServer_FLASH_pages/userHandler.c new file mode 100644 index 0000000..6d0e5d1 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/userHandler.c @@ -0,0 +1,327 @@ +/** + * @file userHandler.c + * @brief User Control Example + * @version 1.0 + * @date 2014/07/15 + * @par Revision + * 2014/07/15 - 1.0 Release + * @author + * \n\n @par Copyright (C) 1998 - 2014 WIZnet. All rights reserved. + */ + +#include +#include +#include +//#include "board.h" +#include "httpUtil.h" +#include "userHandler.h" +//#include "adcHandler.h" +#include "wizchip_conf.h" +#include "globals.h" + +/* Unavailable Pins (W5500-EVB component preempted) */ +// >> UART Rx/Tx : D0 (Rx), D1 (Tx) +// >> W5500 SPI(SPI0) : D11 (MOSI), D12 (MISO), D13 (SCK) + +/* On-board Devices */ +// >> Input : D14 (SW1) / D15 (SW2) +// >> Input : AIN (Potentiometer / TEMP.Sensor) +// >> Output : D8 (LED R) / D9 (LED G) / D10 (LED B) + +/* NXP LPC11Exx GPIO functions */ +// GPIO: Pin state +//Chip_GPIO_GetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin]); +//Chip_GPIO_SetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin], true); +//Chip_GPIO_SetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin], false); + +// GPIO: Pin direction +//Chip_GPIO_GetPinDIR((LPC_GPIO, dio_ports[pin], dio_pins[pin]); +//Chip_GPIO_SetPinDIROutput(LPC_GPIO, dio_ports[pin], dio_pins[pin]); +//Chip_GPIO_SetPinDIRInput(LPC_GPIO, dio_ports[pin], dio_pins[pin]); + +// Pre-defined Get CGI functions +//void make_json_dio(uint8_t * buf, uint16_t * len, uint8_t pin); +void make_json_ain(uint8_t * buf, uint16_t * len, uint8_t pin); +void make_json_netinfo(uint8_t * buf, uint16_t * len); +void make_json_led1(uint8_t * buf, uint16_t * len); +void make_info(uint8_t * buf, uint16_t * len); + +// Pre-defined Set CGI functions +int8_t set_diodir(uint8_t * uri); +int8_t set_diostate(uint8_t * uri); + +uint8_t predefined_get_cgi_processor(uint8_t * uri_name, uint8_t * buf, uint16_t * len) +{ + //return 0; //Just a stub, not used yet.. + //uint8_t ret = 1; // ret = 1 means 'uri_name' matched + uint8_t ret = 0; // ret = 0 means 'uri_name' not matched + uint8_t cgibuf[14] = {0, }; + int8_t cgi_dio = -1; + int8_t cgi_ain = -1; + + uint8_t i; + + if(strcmp_P((const char *)uri_name,PSTR("todo.cgi")) == 0) + { +// // to do +// ;//make_json_todo(buf, len); + } + else if(strcmp_P((const char *)uri_name,PSTR("get_netinfo.cgi")) == 0) + { + make_json_netinfo(buf, len); + ret = 1; // ret = 1 means 'uri_name' matched + } + else if(strcmp_P((const char *)uri_name,PSTR("get_led1.cgi")) == 0) + { + make_json_led1(buf, len); + ret = 1; // ret = 1 means 'uri_name' matched + } + else if(strcmp_P((const char *)uri_name,PSTR("get_info.cgi")) == 0) + { + make_info(buf, len); + ret = 1; // ret = 1 means 'uri_name' matched + } + else + { +// // get_dio0.cgi ~ get_dio15.cgi +// for(i = 0; i < DIOn; i++) +// { +// memset(cgibuf, 0x00, 14); +// sprintf((char *)cgibuf, "get_dio%d.cgi", i); +// if(strcmp((const char *)uri_name, (const char *)cgibuf) == 0) +// { +// make_json_dio(buf, len, i); +// cgi_dio = i; +// break; +// } +// } +// +// if(cgi_dio < 0) + //Analog Ins reading get_ain0.cgi ~ get_ain7.cgi + if(1) + { + // get_ain0.cgi ~ get_ain5.cgi (A0 - A5), get_ain6.cgi for on-board potentiometer / Temp.Sensor - LPC11Exx + //for(i = 0; i < AINn; i++) //for LPC11xx + for(i = 0; i < 8; i++) //for AVR Mega1284p, available AIN0..AIN7 + { + memset(cgibuf, 0x00, 14); + sprintf((char *)cgibuf, "get_ain%d.cgi", i); + if(strcmp((const char *)uri_name, (const char *)cgibuf) == 0) + { + make_json_ain(buf, len, i); + cgi_ain = i; + ret = 1; + break; + } + } + } + +// if((cgi_dio < 0) && (cgi_ain < 0)) ret = 0; + } + + return ret; +} + + +uint8_t predefined_set_cgi_processor(uint8_t * uri_name, uint8_t * uri, uint8_t * buf, uint16_t * len) +{ +// return 0; //Just a stub, not used yet.. + uint8_t ret = 0; // ret = 0 means 'uri_name' not matched +// uint8_t ret = 1; // ret = '1' means 'uri_name' matched + uint8_t val = 0; + + if(strcmp_P((const char *)uri_name,PSTR("todo.cgi")) == 0) + { + // to do + ;//val = todo(uri); + //*len = sprintf((char *)buf, "%d", val); + } +// // Digital I/O; dio_s, dio_d +// else if(strcmp_P((const char *)uri_name,PSTR("set_diodir.cgi")) == 0) +// { +// //val = set_diodir(uri); +// //printf_P(PSTR("+++set_diodir.cgi uri_name: %s; uri: %s;\r\n")); +// *len = sprintf_P((char *)buf, PSTR("%d"), val); +// ret = 1; +// } + else if(strcmp((const char *)uri_name, "set_diostate.cgi") == 0) + { + //When uri_name=set_diostate.cgi, and uri HTTP POST request which contains something like: + //pin=8&val=1; or pin=8&val=1; (look && ) + + /* + This is LPC11xx handler + val = set_diostate(uri); + len = sprintf((char *)buf, "%d", val); + len ret = 1; + */ + + + //!!Just for debug + PRINTF("\r\n+++set_diostate.cgi uri_name: %s\r\nuri: %s\r\n", uri_name, uri); + + //Parse URI (Very dirty!!) + if(strstr_P(uri,PSTR("pin=LED1&val=0"))) + { + led1_low(); + *len = sprintf_P((char *)buf, PSTR("LED1: OFF")); + ret = 1; + } + else if(strstr_P(uri,PSTR("pin=LED1&val=1"))) + { + led1_high(); + *len = sprintf_P((char *)buf, PSTR("LED1: ON")); + ret = 1; + } + else + { + //*len = sprintf_P((char *)buf, PSTR("%d"), -1); + *len = sprintf_P((char *)buf, PSTR("???")); + ret = 1; + } + } +// else +// { +// ret = 0; +// } +// + return ret; +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Pre-defined Get CGI functions +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//void make_json_dio(uint8_t * buf, uint16_t * len, uint8_t pin) +//{ +// uint8_t pin_state = Chip_GPIO_GetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin]); +// uint8_t pin_dir = Chip_GPIO_GetPinDIR(LPC_GPIO, dio_ports[pin], dio_pins[pin]); +// +// *len = sprintf((char *)buf, "DioCallback({\"dio_p\":\"%d\",\ +// \"dio_s\":\"%d\",\ +// \"dio_d\":\"%d\"\ +// });", +// pin, // Digital io pin number +// pin_state, // Digital io status +// pin_dir // Digital io directions +// ); +//} +// +void make_json_led1(uint8_t * buf, uint16_t * len) +{ + if(led1_read()) + { + *len = sprintf_P((char *)buf,PSTR( "led1Callback({\"led1_txt\":\"LED1: ON\"});")); //Send back LED1 state via call-back function + } + else + { + *len = sprintf_P((char *)buf,PSTR( "led1Callback({\"led1_txt\":\"LED1: OFF\"});")); //Send back LED1 state via call-back function + } + +} + +void make_info(uint8_t * buf, uint16_t * len) +{ + /* + * Send program metrics: + * Program name + * time-date compile + * MCU info + * free ram info + * uptime device + */ + *len = sprintf_P((char *)buf,PSTR(\ + "
%S"\
+			"Compiled at: %S %S\r\n"\
+			"MCU is: %S; CLK is: %luHz\r\n"\
+			"Free RAM: %dbytes\r\n"\
+			"Uptime: %lusec\r\n
"),\ + str_prog_name,\ + compile_time, compile_date,\ + str_mcu, F_CPU,\ + freeRam(),\ + millis()/1000); +} + +void make_json_ain(uint8_t * buf, uint16_t * len, uint8_t pin) +{ + *len = sprintf_P((char *)buf,PSTR( "AinCallback({\"ain_p\":\"%d\",\ + \"ain_v\":\"%d\"\ + });"), + pin, // ADC input pin number + //get_ADC_val(pin) // ADC input value for LPC11xx + adc_read(pin) // ADC input value for AVR + ); +} + +void make_json_netinfo(uint8_t * buf, uint16_t * len) +{ + wiz_NetInfo netinfo; + ctlnetwork(CN_GET_NETINFO, (void*) &netinfo); + + // DHCP: 1 - Static, 2 - DHCP + *len = sprintf_P((char *)buf,PSTR( "NetinfoCallback({\"mac\":\"%.2X:%.2X:%.2X:%.2X:%.2X:%.2X\",\ + \"ip\":\"%d.%d.%d.%d\",\ + \"gw\":\"%d.%d.%d.%d\",\ + \"sn\":\"%d.%d.%d.%d\",\ + \"dns\":\"%d.%d.%d.%d\",\ + \"dhcp\":\"%d\"\ + });"), + netinfo.mac[0], netinfo.mac[1], netinfo.mac[2], netinfo.mac[3], netinfo.mac[4], netinfo.mac[5], + netinfo.ip[0], netinfo.ip[1], netinfo.ip[2], netinfo.ip[3], + netinfo.gw[0], netinfo.gw[1], netinfo.gw[2], netinfo.gw[3], + netinfo.sn[0], netinfo.sn[1], netinfo.sn[2], netinfo.sn[3], + netinfo.dns[0], netinfo.dns[1], netinfo.dns[2], netinfo.dns[3], + netinfo.dhcp + ); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Pre-defined Set CGI functions +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//int8_t set_diodir(uint8_t * uri) +//{ +// uint8_t * param; +// uint8_t pin = 0, val = 0; +// +// if((param = get_http_param_value((char *)uri, "pin"))) // GPIO; D0 ~ D15 +// { +// pin = (uint8_t)ATOI(param, 10); +// if(pin > 15) return -1; +// +// if((param = get_http_param_value((char *)uri, "val"))) // Direction; NotUsed/Input/Output +// { +// val = (uint8_t)ATOI(param, 10); +// if(val > Output) val = Output; +// } +// } +// +// if(val == Input) Chip_GPIO_SetPinDIRInput(LPC_GPIO, dio_ports[pin], dio_pins[pin]); // Input +// else Chip_GPIO_SetPinDIROutput(LPC_GPIO, dio_ports[pin], dio_pins[pin]); // Output +// +// return pin; +//} +// +//int8_t set_diostate(uint8_t * uri) +//{ +// uint8_t * param; +// uint8_t pin = 0, val = 0; +// +// if((param = get_http_param_value((char *)uri, "pin"))) // GPIO; D0 ~ D15 +// { +// pin = (uint8_t)ATOI(param, 10); +// if(pin > 15) return -1; +// +// if((param = get_http_param_value((char *)uri, "val"))) // State; high(on)/low(off) +// { +// val = (uint8_t)ATOI(param, 10); +// if(val > On) val = On; +// } +// +// if(val == On) Chip_GPIO_SetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin], true); // High +// else Chip_GPIO_SetPinState(LPC_GPIO, dio_ports[pin], dio_pins[pin], false); // Low +// } +// +// return pin; +//} diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/userHandler.h b/11_m644p_WIZNET_HTTPServer_FLASH_pages/userHandler.h new file mode 100644 index 0000000..1f9af30 --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/userHandler.h @@ -0,0 +1,42 @@ +/** + * @file userHandler.h + * @brief Header File for User Control Example + * @version 1.0 + * @date 2014/07/15 + * @par Revision + * 2014/07/15 - 1.0 Release + * @author + * \n\n @par Copyright (C) 1998 - 2014 WIZnet. All rights reserved. + */ + +#ifndef __USERHANDLER_H +#define __USERHANDLER_H + +#include +//#define _WEB_DEBUG_ + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Public Functions +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// to do + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Pre-defined CGI Interface Functions Handler +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +uint8_t predefined_get_cgi_processor(uint8_t * uri_name, uint8_t * buf, uint16_t * len); +uint8_t predefined_set_cgi_processor(uint8_t * uri_name, uint8_t * uri, uint8_t * buf, uint16_t * len); + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// HTTP GET Method CGI Functions +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// to do + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// HTTP POST Method CGI Functions +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// to do + + +#endif + diff --git a/11_m644p_WIZNET_HTTPServer_FLASH_pages/webpage.h b/11_m644p_WIZNET_HTTPServer_FLASH_pages/webpage.h new file mode 100644 index 0000000..e82d7af --- /dev/null +++ b/11_m644p_WIZNET_HTTPServer_FLASH_pages/webpage.h @@ -0,0 +1,2408 @@ +#ifndef _WEBPAGE_H_ +#define _WEBPAGE_H_ +/* + * To online encode text file to C source use online utility (Text->Cpp): + * https://tomeko.net/online_tools/cpp_text_escape.php?lang=en + * add option (this is for good reading into browser, as source code) + * after that insert in any text editor and replace <\n"> sequence to <\n"\> (this is for recognize multiple string into C-source headers) + * + * Also can use File->HEX (BIN2HEX) - for prepare images for example: + * https://tomeko.net/online_tools/file_to_hex.php?lang=en +*/ + +/************************************************************************************* + * JavaScript Functions + *************************************************************************************/ +//main AJAX code +#define wiz550web_ajax_js \ +"function AJAX(a, e)\n"\ +"{\n"\ +" var c = d();\n"\ +" c.onreadystatechange = b;\n"\ +" function d()\n"\ +" {\n"\ +" if(window.XMLHttpRequest)\n"\ +" {\n"\ +" return new XMLHttpRequest()\n"\ +" }\n"\ +" else\n"\ +" {\n"\ +" if(window.ActiveXObject)\n"\ +" {\n"\ +" return new ActiveXObject(\"Microsoft.XMLHTTP\")\n"\ +" }\n"\ +" }\n"\ +" }\n"\ +" function b()\n"\ +" {\n"\ +" if(c.readyState==4)\n"\ +" {\n"\ +" if(c.status==200)\n"\ +" {\n"\ +" if(e)\n"\ +" {\n"\ +" e(c.responseText)\n"\ +" }\n"\ +" }\n"\ +" }\n"\ +" }\n"\ +" this.doGet = function()\n"\ +" {\n"\ +" c.open(\"GET\", a, true); c.send(null)\n"\ +" };\n"\ +" this.doPost = function(f)\n"\ +" {\n"\ +" c.open(\"POST\", a, true);\n"\ +" c.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n"\ +" c.setRequestHeader(\"ISAJAX\", \"yes\");\n"\ +" c.send(f)\n"\ +" }\n"\ +"}\n"\ +"function $(a)\n"\ +"{\n"\ +" return document.getElementById(a)\n"\ +"}\n"\ +"function $$(a)\n"\ +"{\n"\ +" return document.getElementsByName(a)\n"\ +"}\n"\ +"function $$_ie(a, c)\n"\ +"{\n"\ +" if(!a)\n"\ +" {\n"\ +" a = \"*\"\n"\ +" }\n"\ +" var b = document.getElementsByTagName(a);\n"\ +" var e = []; for(var d = 0; d\n"\ +"\n"\ +"\n"\ +"\n"\ +" W5500-AtMEGA1284p Web Server\n"\ +" \n"\ +"\n"\ +"\n"\ +"\n"\ +"
\n"\ +" W5500-AtMEGA1284p Web Server Demopage\n"\ +"

\n"\ +" Network Information
\n"\ +" Base64 Image Data
\n"\ +"
\n"\ +" Board Schematic
\n"\ +" Mounting Scheme
\n"\ +"
\n"\ +" Ex1> Digital I/O
\n"\ +" Ex2> Analog Input
\n"\ +" Ex3> Analog Input: Google Gauge Chart
\n"\ +"
\n"\ +" Device Information
\n"\ +"\n"\ +"\n"\ +"" +#define wiz550web_info_js \ +"function getInfo()\n"\ +"{\n"\ +" var oUpdate;\n"\ +" setTimeout(function()\n"\ +" {\n"\ +" oUpdate = new AJAX('get_info.cgi', function(t)\n"\ +" {\n"\ +" try\n"\ +" {\n"\ +" //*eval(t);\n"\ +" document.getElementById('info_txt').innerHTML = t;\n"\ +" }\n"\ +" catch(e)\n"\ +" {\n"\ +" alert(e);\n"\ +" }\n"\ +" }\n"\ +" ); oUpdate.doGet();\n"\ +" }\n"\ +" , 300); setTimeout('getInfo()', 3000);\n"\ +"}\n"\ +"" + + +#define netinfo_page \ +"\n"\ +"\n"\ +"\n"\ +"\n"\ +" W5500-AtMEGA1284p Web Server Network Info\n"\ +" \n"\ +" \n"\ +" \n"\ +" \n"\ +"\n"\ +"\n"\ +"\n"\ +"
\n"\ +" W5500-AtMEGA1284p Web Server Network Information\n"\ +"

\n"\ +"\n"\ +"
    \n"\ +"
  • \n"\ +"\n"\ +"
  • \n"\ +"\n"\ +"
  • \n"\ +"\n"\ +"
  • \n"\ +"\n"\ +"
  • \n"\ +"
\n"\ +"\n"\ +"\n"\ +"" + + +#define dio_page \ +"\n"\ +"\n"\ +"\n"\ +"\n"\ +" W5500-AtMEGA1284p Web Server Digital I/O v1.1\n"\ +" \n"\ +" \n"\ +" \n"\ +"\n"\ +"\n"\ +"\n"\ +" \n"\ +"\n"\ +"

LED1: unknown..

\n"\ +"\n"\ +"
\n"\ +" \n"\ +"
\n"\ +"
\n"\ +"\n"\ +"\n"\ +"\n"\ +"" + +#define ain_page \ +"\n"\ +"\n"\ +"\n"\ +"\n"\ +" W5500-AtMEGA1284p Web Server Analog Input\n"\ +" \n"\ +" \n"\ +" \n"\ +" \n"\ +" \n"\ +" \n"\ +"\n"\ +"\n"\ +"\n"\ +"
\n"\ +" \n"\ +" \n"\ +"
\n"\ +"\n"\ +"
\n"\ +" \n"\ +"
\n"\ +"
\n"\ +"\n"\ +"\n"\ +"" + +#define info_page \ +"\n"\ +"\n"\ +"\n"\ +"\n"\ +" W5500-AtMEGA1284p Device Info\n"\ +" \n"\ +" \n"\ +" \n"\ +"\n"\ +"\n"\ +"\n"\ +"
\n"\ +" W5500-AtMEGA1284p Device Information\n"\ +"

\n"\ +"

..

\n"\ +"\n"\ +"\n"\ +"" + + +//!! No space at RAM in AtMega1284p (16kb only..) +//!! Need replace all pages into FLASH memory (PROGMEM) - Shame AVR-8bit HARVARD Architecture!! + +#define ain_gauge_page \ +"\n"\ +"\n"\ +"\n"\ +"\n"\ +" W5500-AtMEGA1284p Web Server Analog Input Gauge\n"\ +" \n"\ +" \n"\ +" \n"\ +" \n"\ +" \n"\ +" \n"\ +"\n"\ +"\n"\ +"\n"\ +"
\n"\ +" \n"\ +" \n"\ +"
\n"\ +" \n"\ +"\n"\ +"
\n"\ +"
\n"\ +"\n"\ +"\n"\ +"" + +/* Base64 Image converter: http://base64.wutils.com/encoding-online/ */ +#define img_page \ +"\n"\ +"\n"\ +"\n"\ +"\n"\ +" W5500-AtMEGA1284p Web Server Image\n"\ +" \n"\ +" \n"\ +" \n"\ +"\n"\ +"\n"\ +"\n"\ +"
wizwebserver.png
\n"\ +"\n"\ +"\n"\ +"" + +const char favicon_ico[] PROGMEM = { +0x0,0x0,0x1,0x0,0x1,0x0,0x30,0x30,0x10,0x0,0x1,0x0,0x4,0x0,0x68,0x6, +0x0,0x0,0x16,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x30,0x0,0x0,0x0,0x60,0x0, +0x0,0x0,0x1,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x48,0x0, +0x0,0x0,0x48,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x24,0x22, +0x24,0x0,0x8c,0x96,0x4,0x0,0xcb,0xd2,0x8d,0x0,0x57,0x5d,0x11,0x0,0xaa,0xb5, +0x4b,0x0,0x41,0x44,0x17,0x0,0xf0,0xf0,0xdc,0x0,0x6f,0x7b,0x9,0x0,0xbf,0xc5, +0x70,0x0,0xdc,0xe2,0xb4,0x0,0xfc,0xfe,0xfc,0x0,0x60,0x6e,0xc,0x0,0x4c,0x53, +0x14,0x0,0x99,0xa7,0x26,0x0,0x31,0x31,0x1c,0x0,0x7c,0x88,0x4,0x0,0xaa,0xaa, +0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xa6,0x8d,0x14,0x8a,0xaa,0xaa,0xaa,0xaa, +0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xa2,0x11, +0x11,0x11,0x11,0x11,0x11,0x16,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0xaa,0xaa,0xaa,0xaa,0xa1,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0xaa, +0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xa1,0x11,0x11,0x11, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x1d,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0xaa,0xaa,0xa9,0x11,0x11,0x11,0x11,0x11,0x35,0x5,0xb1,0x11,0x11,0x11,0x11, +0x1a,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x11,0x11,0x11,0x11,0xe0, +0x0,0x0,0x0,0x0,0x0,0xc1,0x11,0x11,0x11,0x2a,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0xaa,0xa1,0x11,0x11,0x11,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x11, +0x11,0x1d,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x11,0x11,0x11,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xb1,0x11,0x11,0x4a,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0xa1,0x11,0x11,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x11,0x11,0x19,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x91,0x11,0x11,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x11,0x11,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0x11,0x11,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x11,0x11,0x1a,0xaa,0xaa,0xaa,0xaa,0xa1,0x11,0x11,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x11,0x18,0xaa,0xaa,0xaa,0xaa, +0xa1,0x11,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0xf,0x11,0x11,0xaa,0xaa,0xaa,0xaa,0x11,0x11,0x10,0x0,0xaa,0xaa,0xaa,0xaa, +0x0,0x0,0x0,0xa,0xaa,0x0,0x0,0x0,0xa,0xaa,0x11,0x11,0x2a,0xaa,0xaa,0xaa, +0x11,0x11,0x0,0x0,0xaa,0xaa,0xaa,0xaa,0x0,0x0,0x0,0xa,0xaa,0x0,0x0,0x0, +0xa,0xaa,0x51,0x11,0x1a,0xaa,0xaa,0xa8,0x11,0x11,0x0,0x0,0xaa,0xaa,0xaa,0xaa, +0x0,0x0,0x0,0xa,0xaa,0x0,0x0,0x0,0xa,0xaa,0x1,0x11,0x1a,0xaa,0xaa,0xa1, +0x11,0x10,0xa,0xaa,0x0,0x0,0x0,0xa,0xaa,0x0,0x0,0xa,0xaa,0x0,0x0,0xaa, +0xa0,0x0,0x1,0x11,0x14,0xaa,0xaa,0xa1,0x11,0x10,0xa,0xaa,0x0,0x0,0x0,0xa, +0xaa,0x0,0x0,0xa,0xaa,0x0,0x0,0xaa,0xa0,0x0,0x0,0x11,0x11,0xaa,0xaa,0xa1, +0x11,0x10,0xa,0xaa,0x0,0x0,0x0,0xa,0xaa,0x0,0x0,0xa,0xaa,0x0,0xaa,0xaa, +0xa0,0x0,0x0,0x11,0x11,0xaa,0xaa,0x61,0x11,0x10,0xa,0xaa,0x0,0x0,0x0,0xa, +0xaa,0x0,0x0,0xa,0xaa,0x0,0xaa,0xa0,0x0,0x0,0x0,0x11,0x11,0xaa,0xaa,0x41, +0x11,0xc0,0xa,0xaa,0x0,0x0,0x0,0xa,0xaa,0x0,0x0,0xa,0xaa,0x0,0xaa,0xa0, +0x0,0x0,0x0,0x11,0x11,0xaa,0xaa,0xd1,0x11,0xe0,0xa,0xaa,0x0,0x0,0x0,0xa, +0xaa,0x0,0x0,0xa,0xaa,0xaa,0x0,0x0,0x0,0x0,0x0,0x11,0x11,0xaa,0xaa,0x11, +0x11,0x0,0xa,0xaa,0x0,0x0,0x0,0xa,0xaa,0x0,0x0,0xa,0xaa,0xaa,0x0,0x0, +0x0,0x0,0x0,0x11,0x11,0xaa,0xaa,0x41,0x11,0x50,0xa,0xaa,0x0,0x0,0x0,0xa, +0xaa,0x0,0x0,0xa,0xaa,0xaa,0xaa,0xa0,0x0,0x0,0x0,0x11,0x11,0xaa,0xaa,0x81, +0x11,0x30,0xa,0xaa,0x0,0x0,0x0,0xa,0xaa,0x0,0x0,0xa,0xaa,0x0,0xaa,0xa0, +0x0,0x0,0x0,0x11,0x11,0xaa,0xaa,0xa1,0x11,0x10,0xa,0xaa,0x0,0x0,0x0,0xa, +0xaa,0x0,0x0,0xa,0xaa,0x0,0xaa,0xa0,0x0,0x0,0x0,0x11,0x11,0xaa,0xaa,0xa1, +0x11,0x10,0xa,0xaa,0x0,0x0,0x0,0xa,0xaa,0x0,0x0,0xa,0xaa,0x0,0x0,0xaa, +0xa0,0x0,0x0,0x11,0x11,0xaa,0xaa,0xa1,0x11,0x10,0xa,0xaa,0x0,0x0,0x0,0xa, +0xaa,0x0,0x0,0xa,0xaa,0x0,0x0,0xaa,0xa0,0x0,0xe,0x11,0x11,0xaa,0xaa,0xa1, +0x11,0x1c,0xa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x0,0x0,0xa,0xaa,0x0,0x0,0xaa, +0xaa,0xaa,0x1,0x11,0x12,0xaa,0xaa,0xa6,0x11,0x11,0x0,0x0,0xaa,0xaa,0xaa,0xaa, +0x0,0x0,0x0,0xa,0xaa,0x0,0x0,0x0,0xa,0xaa,0x1,0x11,0x1a,0xaa,0xaa,0xaa, +0x11,0x11,0x0,0x0,0xaa,0xaa,0xaa,0xaa,0x0,0x0,0x0,0xa,0xaa,0x0,0x0,0x0, +0xa,0xaa,0xf1,0x11,0x1a,0xaa,0xaa,0xaa,0x11,0x11,0x10,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x11,0x11,0xaa,0xaa,0xaa,0xaa, +0xa1,0x11,0x13,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x1,0x11,0x11,0xaa,0xaa,0xaa,0xaa,0xad,0x11,0x11,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc1,0x11,0x1a,0xaa,0xaa,0xaa,0xaa, +0xaa,0x11,0x11,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x11,0x11,0x1a,0xaa,0xaa,0xaa,0xaa,0xaa,0xa1,0x11,0x11,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xe1,0x11,0x11,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0xa2,0x11,0x11,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xb, +0x11,0x11,0x1a,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xd1,0x11,0x11,0xf0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x11,0x11,0x11,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0xaa,0xa4,0x11,0x11,0x11,0x50,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf1,0x11, +0x11,0x1a,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x21,0x11,0x11,0x11,0xf0, +0x0,0x0,0x0,0x0,0xe,0x11,0x11,0x11,0x11,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0xaa,0xaa,0xaa,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11, +0x1a,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xa9,0x11,0x11,0x11, +0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x1a,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0xaa,0xaa,0xaa,0xaa,0xa2,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x1a,0xaa, +0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x41, +0x11,0x11,0x11,0x11,0x11,0x2a,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa, +0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0 +}; +//favicon.ico: 1662 bytes + +const char brd_wiznet_png[] PROGMEM = { +0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52, +0x0,0x0,0x3,0x7f,0x0,0x0,0x3,0x91,0x1,0x3,0x0,0x0,0x0,0x78,0x37,0x89, +0x3e,0x0,0x0,0x0,0x6,0x50,0x4c,0x54,0x45,0x0,0x0,0x0,0xff,0xff,0xff,0xa5, +0xd9,0x9f,0xdd,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54,0x78,0xda,0xed,0x9d,0x4f, +0x88,0x24,0x47,0xbe,0xdf,0x33,0x95,0x62,0x72,0x17,0x86,0x49,0x2d,0xef,0xd2,0x82, +0x66,0x52,0x8b,0x6c,0xf6,0x62,0xcc,0xc,0xc2,0xb8,0x5,0xed,0x4e,0x3d,0x16,0x2c, +0x1e,0x6,0xeb,0x6c,0xf0,0x61,0x16,0xc1,0xd3,0xc1,0x97,0x1a,0xe6,0xe0,0x16,0x2e, +0x3a,0xab,0xdd,0x8b,0xda,0x7,0xa1,0x32,0xf8,0x22,0xc1,0xb0,0x7d,0xf4,0xd5,0xe0, +0xcb,0x33,0x98,0x37,0x59,0x2e,0x31,0xe5,0x83,0x50,0xfb,0xea,0x93,0xb2,0xb6,0x96, +0xad,0x8b,0xb0,0xb2,0xdc,0x87,0x8d,0xf6,0x8b,0xcd,0x78,0xbf,0x5f,0x44,0x64,0x66, +0x44,0x66,0x56,0x66,0x64,0x56,0x56,0xeb,0x8f,0xa7,0x44,0xcd,0x1f,0x4d,0x77,0x7d, +0x3a,0x33,0xe2,0xf7,0xe7,0xfb,0x8b,0x5f,0x44,0x5a,0xec,0x6e,0x5f,0xa9,0xf5,0xa, +0xf8,0xa,0xf8,0xa,0xf8,0xe3,0x6,0xde,0x5e,0xde,0x31,0x70,0x73,0x71,0xc7,0xc0, +0xd5,0xe3,0x3b,0x6,0xae,0xdf,0xfd,0xa9,0x3,0xff,0xf8,0xf1,0x5d,0x3,0x9f,0xde, +0x31,0x30,0xf9,0xf0,0x8e,0x81,0x64,0xfd,0x3d,0x7b,0x1a,0x3a,0xb6,0x1e,0x1c,0x38, +0x71,0xe8,0xaf,0x67,0xcb,0x74,0xe4,0x3d,0xf,0xae,0xbe,0xb6,0xf7,0xa,0x24,0x1c, +0x38,0x39,0xf1,0xd7,0x93,0x88,0x8e,0xdc,0xbf,0xf1,0xfd,0xcf,0xac,0x61,0x5d,0xdb, +0x77,0x25,0x60,0x70,0xfd,0xe0,0x4d,0xf6,0xd9,0x43,0xef,0xf2,0xf9,0x57,0xe3,0x67, +0x8b,0x77,0x0,0x78,0x3a,0xac,0x6b,0x9b,0x97,0x7e,0x80,0xe0,0xfa,0x1f,0xbf,0xc9, +0xfc,0x93,0xf,0xdc,0xe7,0x5f,0x9f,0x3e,0x5b,0xbf,0x93,0xfa,0xf,0xc6,0xc3,0xba, +0xb6,0x55,0xe9,0x7,0x8,0xae,0xff,0xd1,0x17,0x2c,0xa0,0x1f,0x7c,0x44,0xbf,0x1a, +0x3d,0x5b,0x3c,0x3a,0x7e,0xf8,0x60,0xd8,0x2b,0x5c,0x6f,0xf4,0xbf,0xdf,0xf8,0xd7, +0xff,0xe0,0x73,0x37,0xa0,0x8b,0x35,0x89,0xff,0xef,0xc8,0x1d,0x1d,0xfe,0xee,0x5f, +0xe,0x3b,0x86,0xeb,0xdb,0x12,0xf0,0xa,0x81,0xc7,0x87,0xeb,0xf5,0x26,0xfe,0xe3, +0xe8,0xe1,0xb3,0x37,0x9f,0x7f,0xed,0xec,0x15,0x18,0xfb,0xd7,0xff,0xf0,0xb,0x76, +0x7c,0xe0,0xae,0x57,0x5f,0xfd,0xf5,0xb3,0xf4,0xd9,0x17,0xcf,0xbf,0xe,0xf7,0x7a, +0x4b,0x63,0xef,0xfa,0x9f,0x7c,0xc1,0xfc,0x3,0x67,0xbd,0xf8,0xfa,0xbd,0xbf,0x48, +0x9f,0xfd,0x47,0xeb,0xb5,0x61,0x81,0x37,0xa5,0x49,0xb3,0xbe,0xbe,0x7e,0xfc,0x5, +0x9b,0xbe,0x79,0xb3,0x9e,0x7e,0x5,0xc0,0xcd,0x1b,0x43,0x3,0x89,0xab,0xff,0x7d, +0x1,0xc0,0xcf,0x9d,0xc9,0xe3,0x1b,0x30,0xfc,0xb3,0x67,0x94,0x80,0xa7,0x19,0x16, +0x48,0xbd,0x12,0x70,0x81,0xc0,0xf8,0xe9,0x66,0x6d,0xc5,0xe9,0x33,0x4a,0xc3,0x3e, +0x40,0x7a,0xcf,0x83,0xf,0x5e,0xe0,0xc7,0xb1,0xc4,0xa,0xf6,0x9f,0xb5,0x11,0xcb, +0x85,0x5b,0x27,0x80,0xb1,0xe5,0x97,0xfe,0xf5,0xc5,0xf0,0xc0,0xc4,0x72,0x58,0x22, +0x81,0x91,0xe5,0xdd,0x1,0xf0,0xc9,0x9c,0x25,0x73,0x9,0xf4,0x3d,0x96,0xfe,0x66, +0xdf,0xc0,0xcd,0x8a,0x6d,0x96,0x2,0xf8,0xa5,0x37,0x65,0xf4,0xc9,0x5d,0x0,0x13, +0x1c,0x3f,0x97,0xbd,0x74,0xa7,0x8c,0x7c,0x15,0xde,0x1,0x90,0xbc,0xcf,0x81,0xb, +0x67,0xca,0x6e,0xbf,0xbe,0xb,0x20,0x75,0x5,0x70,0xd6,0xa,0x4c,0xc0,0x5b,0xa7, +0x87,0x60,0x3d,0xdf,0xf4,0x6,0x32,0x0,0xa6,0x2e,0x4b,0xc2,0x5,0x5b,0xc4,0x0, +0xfc,0x9d,0x19,0xf0,0x6a,0x30,0xe0,0xf3,0xe6,0x5b,0x1a,0xec,0xc,0xc,0xc1,0x2c, +0x18,0x18,0x7f,0xb0,0x60,0xf3,0x4,0xbc,0xce,0x81,0xe2,0xac,0x6b,0xbe,0x3e,0xf0, +0x7e,0x99,0xfe,0xeb,0xe3,0xe3,0x4f,0xee,0x79,0x3f,0x9f,0xf7,0xf3,0x34,0xc1,0x25, +0x23,0xe1,0x25,0xa3,0xbe,0xf0,0x34,0xe9,0xbb,0xcd,0xc0,0x13,0xd7,0x4a,0xff,0xd5, +0xd1,0xe1,0x6b,0xaf,0xdf,0xb3,0xcf,0x7b,0x1,0x69,0x0,0xb6,0x7,0xc0,0xd4,0xaf, +0xfa,0xd2,0x3a,0xe0,0xf1,0x87,0x7,0xe9,0x5f,0x3d,0xfe,0xf4,0xc3,0xe7,0x2f,0x1f, +0x3f,0xdf,0x1,0x8,0x86,0x6f,0xa,0xbc,0x39,0x4e,0xff,0xea,0x9d,0xaf,0x6e,0xae, +0x3e,0xf9,0xd8,0x1a,0x24,0xf3,0x4e,0xff,0x9d,0x12,0xe1,0xed,0x7a,0xe0,0xbf,0x0, +0xe0,0xf3,0x7b,0x3,0x1,0xe9,0xa8,0x1d,0xf8,0x6f,0x10,0xf8,0xf2,0x63,0xbf,0x1f, +0x30,0x2,0xcb,0x9a,0x40,0x68,0x7,0xc3,0x4f,0x21,0x5a,0x10,0xa2,0xdf,0xd2,0xe9, +0x45,0x75,0xc,0x3f,0x7c,0xfc,0xe9,0xcd,0xe7,0x7d,0xc7,0x90,0x4d,0x1c,0x9,0x73, +0x19,0x5,0xe0,0x2d,0xd,0x75,0x60,0x29,0x11,0x3c,0x86,0x59,0xfa,0xe1,0xa3,0xc3, +0x9b,0xdf,0xf6,0x9d,0xa5,0xc,0xe2,0xa1,0x80,0x81,0x2d,0x22,0x30,0xd5,0x81,0xf, +0xec,0xb2,0x1d,0xbe,0x9d,0x7e,0x78,0x7c,0x7c,0xf3,0xdb,0x5f,0xf5,0xb4,0x43,0xa, +0x1f,0x48,0x1d,0x91,0x30,0x25,0xf0,0x2e,0x1,0xd3,0xc3,0x37,0x6a,0x7c,0x8d,0x48, +0xfc,0x7b,0xa6,0x18,0xbf,0x80,0xf7,0xdb,0x0,0x7b,0x1f,0x26,0x9,0x58,0x87,0x7a, +0x4b,0xf1,0x3,0x8e,0x8f,0xb6,0x0,0x53,0xa7,0xa7,0x6b,0x7b,0x2c,0xa4,0x35,0xc2, +0x66,0xf0,0xa6,0x44,0xab,0x62,0xa4,0xc7,0xa7,0xdb,0xae,0xd0,0xed,0x9,0x7c,0xa, +0x6f,0x48,0x78,0x31,0xe8,0x63,0xa6,0x91,0xda,0x6d,0xc0,0x5d,0xe3,0x61,0xe9,0xa, +0x99,0xb3,0x67,0x60,0x79,0xc,0x4b,0x85,0xa1,0xe1,0x81,0xe5,0x59,0xca,0xd8,0x77, +0x1a,0xf0,0x60,0x34,0x74,0x15,0xa3,0x64,0x87,0x65,0xa0,0xf5,0x64,0x68,0x60,0xc9, +0xd3,0x94,0x80,0xcc,0x5a,0xe,0xd,0x2c,0xf9,0x52,0x15,0x88,0xce,0xfb,0x7c,0xb5, +0xf7,0xc2,0xd0,0x77,0x8d,0xd1,0x62,0xaf,0xc0,0xbd,0xa8,0xa7,0x3b,0x7,0x26,0xd2, +0xd,0xaf,0xb8,0xba,0xa8,0xde,0xd2,0xe9,0xc5,0xd0,0xc0,0x50,0x40,0x71,0x32,0xce, +0x6b,0x80,0x9e,0xbd,0x77,0xa0,0xf2,0x5a,0xee,0x3,0x18,0x8,0x68,0xc,0x7f,0x9e, +0x31,0xdd,0x97,0x32,0xc8,0x1e,0xef,0x5b,0x43,0xbb,0x36,0x30,0x3d,0xea,0x63,0x42, +0x2c,0xe0,0x54,0xfd,0xe,0xd0,0xa7,0x87,0x8f,0x86,0x9e,0xa5,0x60,0xf3,0x69,0x6, +0xc5,0x37,0x55,0x73,0xd6,0x3d,0x38,0x6f,0x7e,0x1f,0x2f,0x24,0xb8,0x94,0x62,0x90, +0x70,0x1f,0xc0,0x58,0x81,0x3a,0x3a,0x70,0xc9,0xf6,0x1,0x54,0x67,0xcc,0x4c,0x7, +0x82,0x59,0xec,0x1,0xa8,0xce,0x18,0x80,0xef,0x1f,0xa8,0xcd,0x98,0x40,0x3,0xe2, +0xbf,0xe,0x1f,0x80,0xd5,0x19,0x3,0x70,0x62,0xe9,0xe5,0xb3,0xe1,0xe3,0x21,0xf7, +0x2f,0x97,0x32,0xed,0xd3,0x81,0xab,0xdb,0xbd,0xc4,0xc3,0xcc,0x6d,0xe3,0x7b,0xaa, +0x7b,0xb6,0xdb,0x3b,0x9,0xc0,0x8a,0xc5,0xdc,0xde,0x41,0x3c,0x54,0x6b,0x6d,0xf1, +0x3e,0x96,0xf3,0x78,0xbd,0xd4,0xf2,0x61,0xec,0x7c,0x7e,0x4b,0xd5,0x5a,0xdb,0x1f, +0xdf,0x64,0x69,0x30,0x38,0xf0,0x75,0x1d,0xa8,0xd6,0xda,0xd6,0x3f,0x67,0xa9,0x3f, +0x34,0x90,0xc8,0x7c,0x34,0xe1,0x19,0x9b,0x5e,0xfa,0x5a,0x9f,0x73,0x2b,0x1d,0xba, +0x5e,0xfa,0x6b,0x10,0x33,0x97,0x2c,0xf6,0xdd,0x2a,0x70,0x29,0xac,0x74,0x58,0x20, +0x48,0xa7,0xcd,0x6a,0xc1,0x7e,0xef,0x9,0xb3,0xd0,0x6a,0x6d,0x1b,0x19,0x94,0x7, +0xaf,0x26,0x2,0x70,0xe5,0x8a,0x12,0xb4,0x5e,0x6b,0x13,0xbe,0x7d,0x3f,0xc0,0xb, +0x1,0x54,0x6b,0x6d,0xa2,0x34,0xb6,0x2f,0xe0,0x4c,0x0,0xd5,0x5a,0x1b,0x66,0x6d, +0xd4,0xdf,0x17,0x10,0xc4,0x61,0x5c,0x72,0x6d,0x3c,0xd5,0x77,0x7,0x9f,0xa5,0x58, +0xd5,0xbf,0x64,0x4b,0x10,0x87,0x49,0x30,0xad,0xd6,0xda,0x2e,0xee,0x10,0x18,0x87, +0xfb,0x0,0xe2,0x42,0x89,0x23,0x6a,0xde,0xc4,0x2f,0x1,0x3d,0x99,0xf3,0xc,0xee, +0x69,0x5c,0xe1,0x69,0x68,0x9,0xc8,0x2b,0x1a,0x89,0x2e,0x5f,0xad,0x86,0x97,0x6d, +0xbe,0xd8,0x25,0x7c,0x69,0x5a,0x2,0xf2,0xfc,0x9f,0xe8,0x9,0x40,0xe3,0x6b,0xe7, +0xc6,0x81,0xaa,0xae,0xd8,0x2f,0x90,0x54,0x3d,0x77,0xa3,0x55,0x92,0x9d,0x23,0x7e, +0xb8,0x7,0x20,0x75,0x57,0x7c,0xc1,0x92,0x1c,0xf8,0x2c,0x39,0xc8,0xa,0x77,0x3e, +0x8b,0x20,0xf4,0x62,0x3a,0xa3,0xd7,0xfa,0x6,0x0,0x12,0x67,0xc5,0x17,0x2c,0x71, +0x96,0xe6,0xb,0x96,0x0,0x9c,0x9c,0x5,0xfc,0xa,0x7,0x7,0x26,0xf6,0xa,0xec, +0x50,0xac,0xae,0xe5,0xb,0x96,0x0,0xb4,0x4e,0x2,0x1c,0xc3,0xd4,0xb2,0x86,0x6, +0x3e,0x1,0x20,0x38,0xee,0xe5,0x85,0xcb,0xe6,0x4e,0x1,0xbc,0xff,0x20,0xc0,0x59, +0xba,0x7,0x60,0xf2,0x21,0xdb,0x80,0xe3,0x5e,0x2d,0x16,0x6c,0xb1,0x98,0xe6,0xc0, +0x87,0xf7,0x2,0xb4,0xc3,0x3d,0x0,0xc9,0xdb,0x6c,0x93,0xbc,0xaf,0x1,0x27,0x30, +0x96,0xfe,0x6b,0x1,0xf7,0x34,0xaf,0x6b,0x63,0x18,0x5b,0x2c,0xdc,0x15,0x48,0x1d, +0xb6,0x21,0x6e,0x15,0x38,0x81,0x49,0x3,0xa1,0x69,0x52,0x2,0x36,0x5,0x64,0x33, +0x60,0xea,0xf0,0x5,0xcb,0xa,0x30,0x12,0xb3,0x34,0x2a,0x1,0xa3,0x9d,0xaf,0x30, +0x84,0x68,0x1,0xca,0x69,0x9,0x91,0x76,0xce,0xc4,0xa4,0x59,0xc2,0x18,0x7a,0xa0, +0x17,0xd7,0x15,0xe3,0x5f,0x95,0xc5,0x55,0xf,0x60,0x70,0x1,0x50,0x8,0x4f,0x0, +0x9d,0xc9,0x2c,0x34,0x39,0xf3,0x99,0x2b,0xef,0x5d,0x52,0x2,0xfe,0x97,0x5d,0x81, +0x24,0x98,0xf3,0xf5,0xc3,0x4,0x60,0x4b,0x99,0x67,0x13,0x0,0x5e,0xd2,0x20,0x2b, +0x2c,0x68,0xc0,0x78,0x67,0xd7,0x16,0xac,0xf8,0x72,0x1e,0x1,0xd8,0x46,0x2a,0x9, +0xa,0xc0,0x45,0xf6,0xe7,0x12,0xf0,0xcb,0x7d,0x3a,0xef,0x1a,0x2d,0x49,0x3e,0xbd, +0x13,0x20,0xe8,0x80,0x8,0x26,0xee,0x1c,0x80,0x6f,0xde,0xd,0xf0,0x81,0x1d,0xf9, +0xa9,0x7f,0x1,0xc0,0x7f,0xb6,0xb3,0xa7,0x29,0xd5,0x4b,0x33,0xe1,0xd,0xd3,0x7, +0x47,0x51,0x8c,0xe4,0xfa,0xd3,0x8f,0x29,0x8,0xa9,0x77,0x1,0x18,0xee,0xc,0x2c, +0x95,0x2f,0xb3,0x12,0x83,0x27,0xa,0x2a,0x62,0xde,0xae,0xbf,0xa2,0x0,0xfc,0x0, +0x22,0x24,0x61,0x77,0x3,0xfc,0x14,0x80,0xf4,0x3,0xf0,0x47,0xc9,0xee,0xc0,0xa0, +0x52,0xfd,0x2a,0x55,0x6e,0x70,0xc,0xef,0x23,0x70,0x61,0x83,0x20,0xd8,0x3d,0xc5, +0xf0,0x2a,0xd5,0xaf,0x1c,0x7e,0x9e,0x25,0xde,0xf1,0x31,0x2,0xd7,0x30,0x86,0xd1, +0xee,0x49,0x94,0x5b,0xa9,0x7e,0xe5,0xd0,0x28,0xab,0x12,0xaf,0x29,0x0,0x89,0xb, +0xc0,0xff,0xb0,0x3b,0xb0,0xe6,0x1e,0x66,0x57,0x9c,0xc1,0x1,0x48,0x0,0xe8,0x0, +0xf0,0x60,0x77,0x60,0xa9,0x5e,0x9a,0x5f,0xb1,0x2,0x6,0x20,0x98,0xc5,0xed,0xcd, +0xbb,0xec,0xf7,0x47,0xbb,0x3,0x5b,0x66,0xc,0x17,0xa4,0xeb,0xd4,0xa6,0x6c,0x73, +0x73,0xc1,0xe2,0xd3,0xdd,0x81,0x6d,0x33,0xc6,0xe5,0x42,0xd1,0xa5,0xec,0x66,0x3, +0xb9,0xdd,0xee,0x76,0xd8,0x3a,0x63,0x34,0x7d,0xb8,0x1c,0x0,0x58,0x3b,0x63,0x4a, +0xf0,0x5c,0x2c,0xae,0x86,0x0,0xea,0xf5,0x52,0xee,0x5b,0x10,0x8a,0x1,0x98,0x84, +0x85,0x3e,0xe4,0xc0,0xf9,0x10,0xc0,0x3a,0xb7,0x2d,0x5d,0x37,0x46,0x5f,0xd,0x71, +0x31,0x4,0xb0,0xcb,0xcb,0xb9,0x63,0x60,0xfa,0xf6,0x1d,0x3,0xe9,0x87,0xbb,0x3, +0xcb,0xd,0xad,0x9,0x26,0x9e,0x52,0x1f,0x4e,0x66,0xa5,0x24,0x8a,0xc,0x30,0x4b, +0xcb,0xd,0xad,0x31,0x36,0x62,0x49,0x7d,0x88,0x42,0x46,0x3,0x6e,0x86,0x8,0xc0, +0xbc,0x4e,0x53,0x34,0xb4,0x46,0x96,0x9f,0xe9,0x43,0x50,0x4e,0xa1,0xae,0x9e,0x56, +0xb1,0x35,0x80,0x3e,0x9c,0x73,0x7d,0x98,0x35,0xb4,0x46,0x27,0x7e,0xa6,0xf,0xd3, +0xfb,0x7,0x39,0x50,0xd4,0x67,0xdc,0x21,0x80,0x58,0xdc,0x8b,0x5,0xf0,0xa5,0x37, +0x65,0x2f,0x7d,0x3f,0xd3,0x87,0xe9,0xc9,0x71,0xe,0xbc,0xe2,0xbf,0x7e,0x37,0x14, +0x30,0x91,0xfd,0xa5,0xee,0x94,0x2d,0x3c,0x3f,0xd3,0x87,0x8,0xcc,0xf4,0xe1,0xd5, +0x70,0x82,0x94,0x37,0xb4,0xca,0xfe,0xd2,0x39,0x0,0x2f,0xfd,0x4c,0x1f,0x72,0xe0, +0x64,0x2f,0xc0,0xac,0xa1,0x75,0x9,0xc0,0xb9,0x9f,0xe9,0x43,0xe,0x8c,0x6,0x7, +0x62,0xbb,0x27,0x44,0xa,0x12,0x8a,0x76,0xcf,0x79,0xec,0x67,0xfa,0x30,0xf5,0xc0, +0x79,0xc7,0x3f,0x7e,0xa0,0x14,0xa4,0xd8,0x5f,0x9a,0xd9,0xa1,0x14,0xa4,0xa9,0xb, +0xf1,0x30,0x19,0x1a,0x98,0x35,0xb4,0xa6,0x7e,0xe1,0x69,0x32,0x41,0xea,0x26,0xb9, +0x20,0x1d,0xe,0x58,0xee,0x2f,0x45,0x5f,0x9a,0x9,0xd2,0xcb,0x4d,0xee,0xda,0x86, +0x3,0x1a,0xbe,0x5e,0x1,0x3b,0x0,0x4b,0x4d,0x58,0xc9,0x23,0x30,0x85,0x27,0xf0, +0xbf,0x21,0x4d,0xc4,0x78,0x78,0x7e,0x31,0x34,0xb0,0xd4,0x66,0x96,0xbc,0x5,0xc0, +0xf7,0x0,0x38,0x81,0x7f,0x82,0x64,0xf8,0xdc,0x19,0x1a,0x58,0x6a,0xa4,0x43,0xb3, +0x88,0x60,0xa6,0x4e,0xe0,0x8d,0x91,0xc2,0xb2,0x87,0x36,0x8b,0x52,0xab,0xe0,0xfc, +0x35,0x9f,0x7d,0xf2,0x3a,0xc4,0xc3,0xd7,0x21,0x1e,0xfe,0x2c,0x4c,0xf,0xde,0x18, +0xda,0xf0,0x4b,0xcd,0x90,0x18,0x2d,0xa6,0xf,0x20,0x1e,0x42,0x0,0x3e,0x39,0xc, +0xb3,0x86,0xd6,0x1,0x5d,0x5b,0xa9,0xdd,0x73,0x31,0x5,0xe0,0x43,0x0,0x9e,0x88, +0x0,0x2c,0x9b,0x3f,0x6,0x4,0x96,0x1a,0x5a,0xf7,0xf,0xbc,0xeb,0x2b,0xac,0x8c, +0xe1,0xbe,0x81,0xe5,0x59,0xba,0x77,0x60,0xd9,0xe,0x31,0x1e,0x62,0x8a,0x61,0x59, +0x5a,0x5e,0xba,0x3f,0x4f,0xb3,0x7f,0x60,0xc9,0x97,0xee,0x1f,0xf8,0x2a,0x1e,0xb2, +0x3d,0x9b,0x5,0x64,0x8a,0xc,0x32,0x45,0x16,0x81,0x6a,0x9b,0x4,0x6c,0xf8,0xcc, +0xfb,0xce,0x81,0x4,0xbe,0x82,0xd8,0x62,0x8f,0x58,0x8c,0x6f,0x80,0x46,0x0,0x9d, +0xc0,0x1b,0xa5,0xa2,0xdc,0x28,0x34,0xa0,0x2f,0x95,0xa9,0x21,0xa,0xb1,0x8,0xdf, +0xb6,0x34,0x4d,0xe1,0xf,0x52,0xb9,0x86,0x39,0x20,0x70,0xc,0x40,0xc8,0x76,0x97, +0x90,0xf4,0xce,0xf1,0xbd,0x64,0xec,0x72,0xce,0x98,0x77,0xc1,0x52,0xf,0xf3,0xe3, +0xc1,0x81,0x90,0xf0,0x6e,0x20,0xdb,0x45,0xf5,0xbe,0xc0,0x37,0x24,0xbf,0x53,0x8, +0x57,0xfe,0x9c,0xa5,0xc1,0x2,0xde,0xd3,0x57,0xc0,0x9f,0x8,0xf0,0x7a,0x40,0xb3, +0x70,0xe0,0xed,0xe6,0xeb,0xf8,0x5b,0xa2,0xc5,0x2b,0xe0,0xe0,0xd1,0xe2,0x15,0xf0, +0x15,0xf0,0xa7,0xe,0xb4,0xf6,0xf0,0xa,0x9a,0x80,0x21,0x6,0x77,0x2c,0xf0,0xee, +0x7e,0x85,0x44,0xf6,0xb3,0xf1,0x6d,0xe6,0x4d,0x40,0x5e,0x52,0x76,0x76,0x7,0x26, +0x1c,0x18,0xb6,0x3,0xb3,0x5e,0xc2,0x5d,0x81,0x71,0x76,0x3f,0x5b,0x80,0x69,0xd6, +0xda,0xb7,0x2b,0x90,0xf,0xd,0x66,0x77,0x2d,0x40,0x6a,0x65,0xb7,0x62,0x47,0xa0, +0xa8,0xf6,0x7b,0x3f,0x3c,0x20,0x29,0xe6,0xf2,0x6e,0x40,0xf1,0x39,0x6e,0x2b,0x50, +0x4c,0x2e,0xcb,0xdf,0x15,0x28,0xe7,0x82,0xd3,0xa,0x14,0x93,0xcb,0xf2,0x76,0x5, +0xd2,0xbc,0x75,0xb6,0x5,0x18,0xe5,0xb7,0x62,0x37,0x20,0xc9,0x3b,0x59,0x5b,0x80, +0x93,0xfc,0x56,0xec,0x6,0x94,0x43,0x3,0xb3,0xaf,0xa,0x4c,0x8b,0x11,0xb,0x59, +0xd1,0x63,0xbb,0x1b,0x30,0xce,0x3d,0x69,0x33,0x30,0xb5,0xac,0x8e,0x76,0xb1,0x5, +0x28,0x87,0x6,0x3e,0xba,0xf9,0x96,0x52,0xd5,0xc7,0x77,0x2,0x2a,0xf1,0xc1,0x67, +0x45,0x17,0xb6,0xd7,0x2,0x24,0xea,0x37,0xf5,0x5,0x7a,0xb9,0x55,0xe0,0xec,0xab, +0x1,0x16,0xc7,0x3c,0x86,0x89,0xf2,0x4d,0xdd,0x80,0x13,0xd,0x98,0xdf,0x29,0xa7, +0x6e,0xc,0x8b,0x29,0x19,0xc6,0xc5,0x4f,0xd6,0x11,0xa8,0xbc,0xa6,0x85,0x55,0x80, +0x21,0xd6,0x0,0xdf,0x29,0x80,0x51,0xf1,0x93,0xed,0x4,0x4c,0x8a,0x96,0xf2,0x1a, +0xe0,0xb3,0x2,0x38,0x51,0xba,0xeb,0x77,0x1,0xc6,0x45,0x86,0xd1,0xc,0x54,0x9b, +0xdd,0x77,0x1,0x46,0xc5,0x94,0x6d,0x4,0x9e,0x15,0xc0,0x70,0x27,0x60,0x31,0x85, +0xbc,0x46,0xe0,0xa9,0x9e,0x6c,0xf5,0x7,0x16,0x9f,0xe3,0x36,0x7a,0x9a,0x91,0x6e, +0xbd,0xbd,0x81,0x69,0xf1,0x39,0x4e,0x23,0xf0,0x89,0x66,0x4c,0xfd,0x81,0x54,0xd9, +0xdb,0xd1,0xe8,0x69,0xde,0x53,0x6e,0xc5,0x2e,0x40,0xa2,0xf8,0x9d,0x17,0x86,0x99, +0xb7,0xb3,0xb,0x30,0x69,0xce,0xbc,0x3f,0xf,0x6b,0x80,0xf6,0x2e,0xc0,0xb8,0x19, +0x78,0x10,0x68,0x40,0x3f,0x19,0x6,0xe8,0xa4,0x5b,0x80,0xe9,0x3b,0xbe,0x6,0x14, +0xbf,0xed,0xe,0xf4,0x85,0xf9,0xd7,0x0,0x9f,0x5d,0x7d,0xaf,0x40,0x47,0x75,0x4c, +0x6d,0x7b,0x7d,0x9a,0x80,0x32,0xe7,0xac,0x1,0x7e,0xa4,0x1,0x5d,0xa6,0x8d,0x79, +0xd3,0x2b,0x6c,0x2,0xda,0x32,0x48,0xd5,0x1,0xb5,0x31,0xf4,0xc5,0x17,0x1a,0xdc, +0xd2,0xb4,0x11,0xe8,0xca,0xb8,0x5f,0x33,0x4b,0xef,0x69,0xb3,0x34,0x10,0xf1,0x7a, +0x67,0xa0,0x57,0x7c,0x5e,0x19,0xf8,0x99,0x66,0x87,0xa1,0xf8,0xc9,0x76,0x6,0xfa, +0x32,0x77,0xb,0xda,0x3c,0x4d,0xe,0x94,0xe5,0x7b,0x74,0xb5,0x14,0xbe,0x8d,0x5a, +0x21,0xaf,0xf4,0x27,0xf8,0xb6,0xb1,0xd2,0xdf,0x1f,0xf8,0x77,0x2a,0x50,0xfe,0x6e, +0x67,0x8b,0x5c,0xb8,0xb2,0x46,0xf8,0x6,0xe4,0xac,0xca,0x1f,0xca,0x2a,0x7f,0x33, +0x30,0x90,0xe9,0x70,0x1b,0xd0,0x96,0x29,0x98,0x4d,0xc1,0x40,0xc4,0xda,0xa1,0xcb, +0x37,0x5b,0x25,0xbc,0xc5,0x5,0x8d,0x2b,0xe0,0x6b,0xf9,0x13,0xab,0x19,0x18,0xca, +0x84,0xdf,0x18,0x48,0xe0,0x8f,0x84,0x97,0x30,0x1d,0x5e,0xc2,0x8c,0x79,0x9,0xd3, +0xcb,0x4a,0x98,0xf0,0x3e,0x1b,0x4,0xe8,0xca,0x44,0xdd,0x86,0x2f,0x86,0x6f,0xb0, +0xe1,0x9b,0x6d,0xf8,0xbb,0x3,0x6f,0x17,0x60,0x2e,0x7c,0x8d,0x7,0x63,0xec,0xc3, +0xfb,0xa4,0x11,0x98,0x69,0x28,0x63,0x20,0x7c,0x13,0xa6,0xa9,0x98,0x39,0x2,0x8, +0x86,0x14,0xa0,0xc2,0x23,0xbb,0x60,0x36,0x1e,0xbc,0x1f,0xe,0xb,0x8c,0xbc,0x49, +0x10,0xf9,0x56,0x30,0x39,0xb1,0x42,0xeb,0xc4,0x4a,0xad,0xb1,0x9d,0x5a,0xc4,0xa6, +0x36,0x71,0x88,0x9d,0xb8,0xc4,0x89,0xef,0xd,0x2,0xf4,0xa4,0xd8,0xb2,0x23,0x3f, +0xa,0xa2,0x60,0x12,0x4c,0x42,0x0,0x32,0x0,0xa6,0x76,0xa,0x38,0xea,0x50,0x7, +0x90,0x2e,0x71,0x93,0x46,0xa0,0x9d,0xe9,0x60,0x73,0x60,0x10,0x7,0x51,0x8,0x48, +0x16,0x85,0x60,0x94,0xa9,0xcd,0xec,0xd4,0x1,0xa4,0x9b,0x2,0x8e,0xba,0xc4,0x23, +0x43,0x3,0xc3,0x24,0x88,0x58,0x1c,0x9c,0xb3,0x38,0x84,0x29,0x3,0xa,0xe4,0x3c, +0x75,0x99,0x4d,0x3d,0xe6,0x10,0x2f,0x75,0x89,0x4f,0xfb,0x3,0xd9,0x4e,0xc0,0x54, +0x8b,0x20,0x9e,0x1,0x30,0xda,0xd,0x48,0x35,0xa0,0x6b,0x0,0xb4,0x82,0xdd,0x80, +0xda,0x4d,0x5a,0xb7,0x3,0xd3,0xe0,0xae,0x81,0xe1,0xd5,0x4e,0xb3,0x74,0x30,0xa0, +0xa9,0x1d,0xee,0x8,0xec,0xee,0x69,0xea,0x81,0xd,0x9e,0x66,0xb,0xd0,0xd8,0x97, +0xfe,0x8,0x80,0x96,0xbf,0x53,0x78,0xda,0x11,0xd8,0x3d,0x0,0x6f,0x1,0x36,0x5, +0x60,0xb6,0x53,0x8a,0xb1,0x23,0xb0,0x7b,0x12,0xb5,0x5,0xd8,0x90,0x44,0x7d,0x1e, +0xee,0x94,0x26,0x6e,0x1,0x36,0xa4,0x89,0xba,0x3e,0xec,0x9c,0x8,0x53,0x55,0x8b, +0x84,0x6,0xc0,0x92,0x3e,0xec,0x9c,0xea,0x53,0xf5,0x6c,0xbc,0x2,0xb8,0x3d,0xd5, +0x2f,0xc9,0x35,0x9f,0x69,0x35,0x81,0x76,0xf5,0x44,0xd9,0xff,0x29,0x82,0x53,0x18, +0xb7,0x8b,0x99,0x12,0xb0,0xb3,0x5c,0xa3,0xec,0xdb,0xa2,0x14,0x11,0xc6,0xa1,0x81, +0x5c,0xab,0x13,0xa4,0xe6,0xa,0x18,0x80,0xf9,0xdf,0x6e,0x42,0x1a,0x1a,0x8,0xd2, +0xdd,0x34,0xfe,0x36,0xe0,0x56,0xc9,0x5d,0xd2,0x87,0x9d,0xab,0x18,0xdb,0x80,0x5b, +0xab,0x18,0x25,0x7d,0xd8,0xb9,0x4e,0xb3,0xd,0x68,0xb2,0x24,0xdb,0xab,0x12,0x55, +0x3,0xac,0xaf,0x44,0x25,0x76,0xe2,0xe0,0xb6,0x7d,0x30,0xa7,0xf4,0x71,0x7a,0x2, +0xbe,0x8c,0x58,0x7d,0x6a,0x6d,0x35,0xc0,0xfa,0x5a,0x5b,0x62,0x25,0x36,0x7,0x82, +0xcf,0x7c,0x44,0x8f,0x21,0xa6,0x9f,0x5a,0x7d,0xaa,0x89,0x35,0xc0,0xfa,0x6a,0x62, +0x62,0x8d,0x0,0x11,0xfe,0x19,0x92,0x24,0xfa,0x68,0x74,0x64,0x3d,0xb2,0x8e,0xac, +0x3e,0xf5,0xd2,0x1a,0x60,0x7d,0xbd,0x74,0x43,0x9e,0x92,0x53,0xc6,0x6e,0x19,0xf5, +0xc9,0xe8,0xad,0xa3,0xf1,0xa3,0xf1,0xc9,0x51,0x9f,0x8a,0x70,0xd,0xb0,0xbe,0x22, +0xbc,0xa1,0x4f,0xe9,0x29,0xdf,0xab,0xfd,0x4d,0x92,0x58,0x47,0xe9,0xa3,0xf4,0xe4, +0xa4,0x4f,0xcd,0xbb,0xe,0x58,0x5b,0xf3,0xe6,0xc0,0x73,0xb6,0x84,0x49,0xb3,0xe1, +0x40,0x48,0x89,0xfb,0x54,0xf5,0xeb,0x80,0xb5,0x55,0x7d,0x0,0x92,0x53,0x8b,0xcd, +0x0,0xb8,0xdc,0xbc,0x6,0xc0,0x30,0xd,0xfa,0xac,0x5b,0xd4,0x1,0x6b,0xd7,0x2d, +0x36,0x94,0x4f,0x9a,0xb,0x0,0xae,0x36,0x9f,0x1,0xd0,0x4a,0x83,0x3e,0x2b,0x33, +0x75,0xc0,0xda,0x95,0x19,0x0,0xda,0xe4,0x28,0xbc,0x4,0xe0,0x7a,0x93,0x1e,0xa5, +0x90,0xec,0x6,0x13,0x93,0x20,0xe1,0x37,0x1,0x93,0x70,0xeb,0xda,0x53,0xe,0xb4, +0xfc,0x3b,0x2,0x92,0x91,0x45,0x68,0xe8,0x66,0xc0,0xc0,0x3a,0xb,0x8c,0xc2,0xa0, +0xd7,0x4,0xe4,0xf1,0xb0,0x7e,0x39,0x2f,0xb1,0x36,0x49,0x48,0xcf,0x7c,0xb8,0xa5, +0xdf,0x71,0x20,0x3d,0x9,0x8c,0x16,0x2c,0xe7,0x5b,0x80,0xde,0x1a,0x80,0x3c,0xc5, +0xa8,0x5f,0xb0,0x4c,0xec,0xd,0x9,0xe9,0x38,0xc0,0xd4,0x84,0x3,0xd3,0x93,0xc0, +0x68,0x49,0x76,0x53,0xf,0x4c,0x9d,0x2,0x58,0xbb,0x24,0xb,0x40,0x7a,0x4a,0xc7, +0x61,0x6,0x4,0xc3,0xf,0x8c,0x16,0x9d,0xb5,0x13,0x29,0xa,0x20,0x79,0xaa,0x0, +0xeb,0x16,0x9d,0x37,0x30,0x8a,0xa7,0xa7,0xa7,0x19,0x10,0x5d,0x5b,0x60,0xb4,0xac, +0xae,0x1d,0x99,0x28,0x80,0x98,0xa6,0x13,0xaa,0x0,0xeb,0x96,0xd5,0x37,0x30,0x8a, +0xa7,0x96,0x38,0x14,0x14,0x80,0xe8,0xbc,0x5d,0xb3,0xc6,0x1,0xaf,0x1e,0x98,0x7e, +0x54,0x0,0xeb,0x1a,0x7,0x0,0x8,0x2,0x62,0xc3,0xb3,0xb6,0x4d,0xca,0xc3,0x93, +0x6b,0xd6,0x1a,0xb1,0xa8,0xde,0x52,0xb8,0x68,0xd,0x58,0xd7,0x1a,0x1,0x40,0xd0, +0xec,0x19,0x90,0x7,0x60,0xd7,0xac,0xf9,0x63,0x59,0xf,0x64,0xbf,0x2a,0x80,0x4d, +0xcd,0x1f,0x4a,0x5e,0x6a,0xd8,0xde,0x42,0xaa,0xc0,0x2b,0xc6,0x37,0x2b,0xe6,0xc0, +0xa6,0xf6,0x16,0xd,0x68,0xd4,0xc0,0x43,0x83,0xa,0xf0,0x1b,0xc6,0x1b,0x79,0x73, +0x60,0x53,0x3,0x8f,0x6,0x34,0x6b,0x51,0xf2,0x6a,0xd,0x3f,0x50,0x66,0x69,0x53, +0x8b,0x92,0x6,0x34,0xeb,0xfa,0xba,0xd8,0xee,0xda,0x32,0x60,0x43,0xd7,0x97,0x6, +0x34,0xeb,0x6b,0xdb,0xb4,0x3,0x1b,0xfa,0xda,0xb4,0x7e,0x1a,0xb3,0xce,0x3d,0xc5, +0xd7,0x6c,0x3,0x36,0x74,0xee,0xe9,0x40,0xa3,0xde,0x44,0xc5,0xd7,0x6c,0x3,0x1a, +0xf7,0x26,0xc6,0x46,0x49,0xa9,0xa7,0x2,0xc3,0x12,0xf0,0x32,0xab,0x7a,0xf1,0xa1, +0x69,0x3,0x9a,0xbd,0x16,0xa,0x30,0x2d,0x3,0xf5,0x53,0xbf,0xda,0x6e,0xa9,0xd9, +0x6b,0xd9,0x4,0xd4,0xcf,0x1c,0x1c,0x6,0x48,0x9a,0x80,0xec,0xbc,0x19,0xa8,0x1c, +0x98,0x6b,0xc,0x2c,0x7c,0x4d,0x1d,0x30,0x9,0x9a,0x81,0xc5,0x24,0x37,0x6,0x16, +0x3f,0xa3,0x0,0x62,0x15,0x10,0xf7,0xa,0x9,0xa0,0xf6,0x94,0x92,0x17,0x9a,0x5c, +0xe3,0x3b,0xb2,0x13,0x94,0x6b,0x47,0x2e,0xd6,0x63,0xcb,0x1f,0x1c,0x1b,0x64,0x54, +0x39,0x10,0x86,0x46,0x0,0xb5,0x69,0xa3,0xcb,0x35,0xbe,0xab,0x7e,0x8e,0x72,0xed, +0xc8,0x9d,0xf8,0x13,0x9f,0x31,0x56,0x5a,0x16,0x30,0x7,0x62,0x9d,0x4c,0x2,0xd5, +0x47,0xdd,0xd5,0x0,0x2f,0xb7,0x3,0x7d,0x83,0xcc,0xad,0x6,0xc8,0x26,0xf5,0xc0, +0x91,0x15,0x4e,0xc2,0x3f,0xc3,0x78,0xa0,0x3e,0xbc,0x67,0xb9,0xc2,0xe0,0x53,0x93, +0x91,0x4c,0xaa,0x40,0x2c,0x3b,0x66,0xc0,0xc4,0xaf,0x1,0xa2,0x3e,0xc,0xcf,0xd9, +0x2d,0x98,0x5,0xe8,0xc3,0x93,0x13,0xff,0xd2,0x33,0x7,0x2a,0xde,0x34,0x3,0x62, +0x61,0x35,0x3,0x2a,0x8f,0x19,0xd0,0xe5,0x5a,0x88,0xc7,0xdb,0x59,0x3e,0xe8,0xc3, +0x93,0x93,0x60,0xe1,0x9b,0x3,0x95,0xb3,0xa7,0x33,0xa0,0x28,0x1d,0xcb,0xd9,0x1f, +0x7,0xf5,0xc0,0x33,0x9f,0x3b,0x8d,0xd,0x7,0xb2,0xe,0x40,0xe5,0x50,0x5f,0xe, +0xf4,0x27,0x61,0xe4,0x5b,0x5,0x90,0xba,0xb5,0x40,0x32,0xe,0xf8,0x81,0x48,0xa0, +0xf,0xe1,0x96,0x76,0x2,0xce,0x75,0x60,0xb6,0xa6,0x92,0xc7,0xee,0xa8,0xe,0x8, +0xfa,0xd0,0x66,0x17,0x69,0x70,0x5,0xfa,0x10,0xe4,0x76,0xd0,0x5,0x18,0xeb,0x40, +0x10,0x31,0x80,0x54,0x80,0xc4,0xaf,0x3,0xda,0xc4,0x66,0x97,0xa9,0x7f,0x5,0xea, +0xe9,0x24,0x98,0xf8,0xbe,0x67,0x2e,0xd7,0x28,0x36,0xbf,0xf2,0x8d,0xf2,0xf5,0xc0, +0xfc,0x98,0xda,0x92,0x5c,0xb3,0x98,0x9b,0x7a,0x2,0x18,0x79,0xbe,0x67,0x2e,0xd7, +0x52,0x5c,0x48,0xe0,0xfb,0x83,0x68,0x3d,0x30,0x9b,0x36,0xba,0x5c,0x3b,0x25,0x20, +0xd7,0xdc,0xab,0xef,0x10,0xc8,0x5c,0xc3,0x5b,0x2a,0x82,0xe1,0x14,0xae,0xd1,0xa7, +0x21,0xa8,0x3c,0x56,0xb,0x4c,0xdd,0xaa,0x2f,0x5,0x31,0x83,0x72,0xed,0x37,0x3c, +0xf3,0xe,0xd8,0xa5,0x21,0x50,0x1c,0xa8,0x8f,0x47,0x51,0x4d,0xe1,0xed,0x6f,0x1, +0x66,0xe,0xb5,0x46,0xae,0x8d,0x38,0xd0,0xdc,0xe,0x45,0xce,0xb6,0x81,0xdf,0xae, +0xc1,0xa6,0xae,0x38,0xb0,0x32,0x4b,0xf3,0x38,0x5c,0x23,0xd7,0x4e,0x7d,0xe,0x34, +0xf0,0x34,0xc4,0x2a,0xa2,0x2f,0xf9,0x30,0x72,0xd6,0xf3,0xc8,0xbd,0xe6,0x40,0x69, +0x87,0xf3,0x50,0x39,0x7b,0xef,0x9c,0xaf,0x37,0x54,0xe5,0x5a,0x7a,0x86,0x40,0x23, +0x5f,0xca,0x8f,0x6e,0x92,0x39,0x5b,0xea,0x4e,0xec,0x9b,0xcb,0x89,0xb3,0xc2,0x74, +0x29,0xf3,0x34,0x1a,0x10,0xe2,0x70,0x6c,0xd5,0xc8,0x35,0x6c,0x99,0x6,0x60,0x11, +0x2d,0xb6,0x3,0xe5,0xf1,0xbe,0xc2,0xc4,0x60,0x4a,0x6f,0x7c,0xcb,0x5e,0x22,0xf0, +0x89,0xf4,0xa5,0x1a,0x30,0xc5,0x15,0xb2,0xa0,0x2a,0xd7,0xa4,0x20,0xcd,0x3,0x70, +0x3,0x50,0x1e,0xef,0x2b,0x76,0x1e,0xde,0xb3,0xac,0xd3,0x13,0xcb,0x4a,0x28,0x7c, +0xcb,0x13,0x19,0x2d,0x34,0x20,0x4c,0x9b,0x49,0x5d,0x43,0x6b,0x39,0x4d,0x6c,0x0, +0x4e,0x44,0x8a,0xcc,0xed,0x22,0x7d,0xcb,0xb2,0x8e,0xc7,0x96,0x35,0xce,0x80,0x18, +0xf,0x75,0x20,0xf5,0xea,0x1b,0x5a,0x4b,0x59,0x5b,0x3,0x50,0x8a,0x0,0x6e,0x17, +0xe9,0xa9,0x65,0x1d,0x42,0x7e,0x7d,0x9c,0x1,0x31,0xc5,0xd0,0x81,0xa8,0x1b,0xdc, +0x5d,0x80,0xa9,0x94,0x39,0x7c,0x18,0xd2,0x91,0x13,0xdf,0x8f,0xdd,0xe8,0x30,0x7, +0x42,0x12,0x55,0x2,0x26,0xf5,0xd,0xad,0x21,0xeb,0x8,0x24,0x2,0xe8,0x26,0xf7, +0x63,0x2f,0xe6,0xc0,0xec,0x5b,0x4a,0x40,0xa,0x79,0x5a,0xd,0xd0,0x35,0x7,0x8e, +0x6c,0xe9,0xb8,0xf9,0x15,0x92,0xfb,0xb1,0x9f,0x34,0x2,0xad,0xd3,0xda,0x96,0x5d, +0x73,0x20,0xb1,0x73,0x2d,0x93,0x8e,0x7e,0x49,0xef,0xc7,0x1,0x69,0x4,0xbe,0x7e, +0x5c,0x3,0xe4,0x9b,0xde,0xcd,0x80,0x36,0x15,0xc0,0x4b,0xe,0x3c,0x1a,0xb7,0x2, +0x5d,0xea,0xe0,0x36,0xfa,0xe6,0x54,0xdf,0x0,0x38,0xe7,0xc0,0x13,0x23,0xa0,0x15, +0x54,0x80,0x49,0x67,0xe0,0x86,0x3,0x3,0x6a,0x2,0x7c,0x51,0x5,0x4e,0xd8,0xdd, +0x2,0xbb,0xcc,0x52,0x39,0x69,0xc8,0x6e,0xc0,0xa0,0xab,0x59,0x70,0xbb,0x48,0x47, +0x7e,0xbb,0x59,0x38,0x64,0xc7,0x2b,0x94,0x5,0x15,0x7e,0xae,0xaf,0xa9,0xe1,0xef, +0x32,0x86,0x79,0x5,0xc7,0x2f,0xb9,0xb6,0x10,0x23,0x5b,0xd5,0xb5,0x51,0x74,0x6d, +0x41,0x79,0x39,0xf,0x66,0x29,0x56,0xf4,0xed,0x24,0xd,0xc,0x9d,0xb7,0x28,0x6b, +0xab,0xce,0x3b,0xb4,0x44,0x97,0x41,0x9,0x88,0xad,0x29,0xa,0x50,0x2e,0xe7,0x61, +0xc6,0x77,0x6c,0x8d,0x21,0xb0,0x5,0x86,0xe1,0x89,0xc7,0x8b,0x74,0x8c,0x30,0x19, +0x9e,0xce,0x64,0x1f,0x45,0x9,0x88,0xad,0x29,0x2a,0x50,0x2e,0xe7,0xc5,0x3e,0xc5, +0xa5,0xbc,0x47,0xa4,0x15,0x98,0x9f,0xaf,0xf,0x76,0x1,0x77,0xc5,0x1a,0x9f,0x59, +0x16,0xa5,0x1c,0xee,0x30,0x19,0x80,0x43,0xfd,0x27,0xf4,0xb,0x20,0x97,0x6b,0x24, +0x4,0xb9,0x16,0x92,0x11,0x3d,0x1a,0x3f,0x4a,0xc2,0x36,0x60,0xfe,0x4,0x1,0xb4, +0xb,0xdf,0xb2,0x48,0x60,0xd9,0x3c,0xe2,0x9f,0xc2,0xe0,0x8a,0x14,0x43,0x3f,0x13, +0x1a,0x53,0x8c,0x40,0x93,0x6b,0x24,0x5c,0xe2,0x73,0x9b,0x79,0x55,0x3f,0x6e,0xd, +0xc0,0x49,0x56,0xd7,0x44,0xbb,0x98,0x4e,0xec,0x8d,0x3f,0x71,0x96,0x8,0x1c,0x41, +0x7a,0x28,0x92,0x28,0x1d,0x88,0x49,0x94,0xe,0x4c,0xc4,0x72,0xde,0x6,0xfe,0x5f, +0x32,0x6b,0x5,0x12,0x4b,0xb1,0xdd,0x45,0xe4,0xac,0x2e,0x23,0x77,0xce,0x3,0x70, +0x9e,0x26,0xea,0x40,0x4c,0x13,0x55,0x20,0x5c,0x9f,0x90,0x6b,0x9,0x2,0x2f,0x5a, +0x81,0xc5,0xcb,0xe7,0xe3,0xb8,0x58,0x62,0xca,0x7f,0x1b,0xa5,0x4f,0x8a,0x44,0xb8, +0xfc,0xdd,0x2a,0x10,0x34,0xfe,0x9c,0x17,0x5b,0x57,0x89,0x45,0xf0,0x88,0x16,0x73, +0xe0,0x94,0x7f,0x8a,0x48,0xf5,0x37,0x93,0x93,0x27,0x45,0xaa,0xdf,0x8,0x4,0xb1, +0xc6,0x63,0xdb,0x9a,0x22,0xd0,0x53,0x36,0x5a,0xb5,0xc9,0xb5,0x5,0xb7,0x6a,0x1f, +0xde,0x1,0x5d,0xf9,0x86,0x40,0x90,0x6b,0x10,0xbb,0xf9,0xf9,0xc3,0xa9,0x75,0xca, +0xaf,0xd0,0x58,0xae,0xdd,0x70,0xab,0x16,0x72,0x6d,0x1d,0xfc,0xce,0x8,0x88,0x72, +0xd,0xc4,0x1a,0xfe,0xbc,0xdf,0x31,0x7a,0x84,0x7,0xd1,0x98,0xdd,0xd2,0x85,0xbe, +0x92,0x60,0xe,0x4,0xb9,0x36,0xe,0x64,0x99,0x2e,0x5,0xe0,0x5f,0x1a,0x2,0x4b, +0xf,0xc,0xe9,0x2,0xa4,0xa7,0xa1,0xf8,0x4e,0x43,0x3b,0x2c,0xe4,0x9a,0x12,0xd3, +0xe8,0xfa,0xc5,0xef,0xcc,0x66,0x29,0xca,0x35,0x69,0x37,0x49,0xe1,0x69,0xd2,0x86, +0x65,0x12,0xe1,0x4b,0x6f,0xb,0x41,0xc3,0x81,0x9b,0xab,0x93,0x27,0x45,0xd9,0x24, +0xa4,0xca,0xf7,0x73,0x3b,0x8c,0x1c,0x45,0xae,0xc9,0x1a,0x56,0x52,0xf8,0xd2,0xb4, +0x61,0x99,0x44,0x0,0x69,0x96,0xb8,0x49,0x20,0xb1,0xce,0x32,0x4f,0x13,0x71,0x51, +0xe3,0xeb,0x9e,0x26,0xb2,0xb,0xb9,0x46,0xa4,0x9c,0xa5,0x4a,0xb4,0x68,0x5,0xf2, +0x7b,0x5e,0xd4,0x69,0x68,0x6a,0xe5,0xbe,0x14,0x97,0xd5,0x13,0xa5,0x46,0xcf,0x7d, +0x69,0x64,0x15,0x72,0x2d,0x3,0xa6,0x4a,0x3c,0x6c,0x58,0x97,0x91,0xc0,0x40,0xab, +0x7a,0xab,0xd1,0x2,0x57,0xb9,0x63,0x65,0x15,0x42,0x44,0xb,0x6c,0xf9,0x68,0x90, +0x6b,0x93,0x36,0x20,0x1f,0x3f,0xa2,0x1,0xb3,0x78,0x88,0xab,0xdc,0x91,0xb2,0xce, +0x22,0xe2,0x21,0x3e,0xee,0xab,0x9,0x68,0xb7,0x1,0xa7,0xda,0x34,0x55,0x23,0x3e, +0x56,0x13,0x27,0xc5,0x4a,0x92,0x8c,0xf8,0x69,0x33,0x30,0xba,0x73,0xa0,0x63,0xa4, +0x80,0x7d,0xd,0x28,0x93,0x28,0x4,0x2a,0x8b,0x73,0x32,0x89,0x6a,0xb9,0xa5,0x71, +0x2b,0x70,0x55,0x8,0xfd,0xc,0xa8,0x2c,0x23,0xa8,0x40,0x91,0x26,0x92,0xa3,0x66, +0xa0,0xdb,0x6,0xdc,0x68,0xab,0x41,0x15,0xe0,0x91,0x55,0x4a,0x84,0x93,0xd3,0xbe, +0xc0,0x2b,0x71,0x5d,0xb7,0x45,0x1,0xac,0xe,0x38,0xb6,0xf4,0x54,0x3f,0xb3,0xc3, +0x2d,0xc0,0xa6,0xf5,0x4a,0x9,0xa4,0xe2,0x32,0x65,0xf9,0xb2,0x2,0x64,0x1a,0x70, +0x92,0x7b,0x9a,0x7a,0x60,0xda,0xb4,0x22,0x2b,0x81,0xfc,0xf3,0x49,0x1e,0xf,0x9b, +0x81,0x56,0xee,0x4b,0xb7,0x0,0x43,0xe2,0xd1,0x36,0x20,0x9a,0x4,0x1d,0xe7,0xe5, +0xcb,0x46,0x60,0x8d,0xb6,0x28,0x3,0xfd,0x36,0xa0,0xd0,0xf8,0x47,0x79,0xf9,0xb2, +0x65,0xc,0xdb,0x80,0xb4,0x1d,0x78,0x29,0x8b,0x85,0xb2,0x7c,0xd9,0x36,0x4b,0x5b, +0x80,0x91,0xdb,0xa,0xe4,0xa1,0x62,0x9e,0x97,0x2f,0x5b,0xec,0x70,0x31,0x39,0x6d, +0x4,0x4e,0x9c,0x56,0x20,0x37,0xc4,0x79,0x56,0xbe,0x6c,0xf3,0x34,0xb,0xeb,0x54, +0xa6,0x18,0xd8,0xb6,0x18,0xaa,0xdd,0x31,0x1c,0x8,0xfa,0xa4,0x4d,0x3d,0xf1,0x50, +0x71,0x9e,0x95,0x2f,0xdb,0x7c,0xe9,0x4b,0xeb,0x48,0x66,0x6d,0x90,0x22,0xc6,0x15, +0x20,0x8,0xa2,0x71,0x1b,0x90,0xff,0x44,0x7,0x4a,0xf9,0xb2,0x8,0x4f,0x6b,0x56, +0x9,0x4f,0x5f,0x3e,0x3c,0x90,0xc0,0x33,0x87,0x4d,0x42,0x7a,0x2,0x60,0x7c,0xa2, +0x70,0xb0,0xe4,0x40,0x94,0x7d,0x6d,0x40,0x1c,0x33,0xd0,0x94,0xb2,0x7c,0x9,0xf7, +0xb0,0x8,0xc0,0x6b,0x56,0x9,0xc0,0x5f,0x6,0x7,0x32,0x11,0x1e,0xdb,0x30,0xd5, +0xc8,0x99,0x35,0xb6,0x1,0x48,0x21,0xe9,0xa,0xa5,0xb0,0x6d,0x15,0xa4,0x81,0xaa, +0x80,0x1,0x58,0xa4,0x18,0x6b,0x56,0x49,0x31,0xbe,0xc,0x25,0x90,0x9e,0xbe,0x5, +0x16,0x15,0xa7,0x30,0x8f,0x11,0xe8,0x3f,0xf,0x79,0x71,0xc2,0x8d,0xee,0xb7,0x2, +0x75,0x8d,0xff,0x2d,0xd6,0x29,0x79,0x12,0x85,0xc0,0x4a,0x12,0x55,0x0,0x47,0x23, +0x5c,0x5d,0x4b,0x4f,0x1e,0x11,0xf8,0x4,0xea,0xfb,0xfc,0xa,0x47,0x5e,0xdc,0xe, +0x9c,0x72,0x60,0x56,0xc5,0x28,0xaa,0xfa,0x8,0xac,0xa4,0x89,0xf9,0x2d,0xa5,0x23, +0xbe,0xba,0x96,0x9e,0x3c,0xa6,0xa1,0xcf,0xc8,0x95,0x2d,0x80,0x7e,0xd2,0xe,0x5c, +0xe0,0x17,0xda,0x59,0x9d,0xa6,0x58,0xb7,0xc8,0x17,0x2c,0xd5,0x44,0xf8,0x65,0x1, +0x14,0xab,0x6b,0x2,0x78,0x3b,0xb5,0x4,0x30,0x20,0xed,0xc0,0x15,0xaf,0x26,0x66, +0x95,0xa8,0x62,0x65,0xa6,0x16,0xb8,0x78,0xa8,0x1,0x2f,0x53,0xeb,0x1d,0x1,0x3c, +0x34,0x7,0x62,0x51,0x61,0x74,0x3c,0x36,0x3,0x46,0xf7,0x8f,0x72,0xb9,0x76,0x8a, +0xab,0x6b,0xd6,0x33,0x4,0x6e,0xae,0xf,0xc3,0x36,0xa0,0xda,0x1a,0xa1,0x94,0x2f, +0x5b,0x81,0xa7,0x99,0x5c,0xa3,0x7c,0x75,0xd,0x7e,0x7,0x60,0xe2,0x76,0x0,0x82, +0x4,0x52,0x8a,0x7b,0xa6,0x40,0xb1,0xd8,0x15,0xa4,0x1,0x7,0xc6,0x5d,0x80,0x69, +0x17,0x60,0x69,0x75,0xd,0x80,0x9,0x9a,0x45,0xec,0xdc,0x11,0x10,0x9c,0x29,0xb1, +0x0,0xb8,0x5a,0x7d,0xda,0x6a,0x16,0xc5,0x2b,0x50,0xcb,0x97,0x2d,0x66,0xa1,0xe8, +0x43,0xca,0x97,0xf3,0x2,0x6a,0x3,0x70,0xb1,0x9a,0xb4,0x1a,0xbe,0x1a,0xa8,0x94, +0xf2,0x65,0x8b,0xe1,0x6b,0x40,0x5c,0xce,0xb,0x20,0x6a,0x0,0x70,0x33,0x63,0x6d, +0xae,0x4d,0x2d,0x9b,0x98,0xbb,0x36,0x9e,0x89,0x48,0xe0,0xd8,0xda,0x94,0x3,0x70, +0x93,0xf3,0x56,0xb,0xb,0x4a,0xf9,0xf2,0x5b,0x46,0x9a,0x9c,0xb7,0xa,0x3c,0xb3, +0x2b,0xc0,0xa6,0xf0,0xa4,0x16,0x16,0x94,0xf2,0xa5,0xec,0x2f,0xdd,0x16,0x9e,0x32, +0x60,0xa9,0xd8,0x1b,0x18,0x4,0x60,0xb5,0xb0,0xa0,0x94,0x2f,0xbf,0xcd,0xcf,0xdd, +0xad,0xd,0xc0,0x2d,0xc0,0xa6,0x14,0x43,0x73,0x35,0x45,0xf9,0xf2,0x5b,0xf8,0xe4, +0x86,0x14,0x23,0xb1,0x7a,0x27,0x51,0x9a,0xab,0x29,0xca,0x97,0x0,0x6c,0x4a,0xa2, +0xda,0x80,0xd,0x69,0xa2,0x66,0xf9,0x45,0xf9,0x52,0xef,0xfa,0xaa,0xa4,0x89,0x6d, +0x40,0xc6,0xc,0x80,0x60,0xf9,0x79,0xf9,0xb2,0xc,0xac,0x24,0xc2,0x53,0x32,0x0, +0xf0,0x8a,0xa9,0x9d,0xa,0xac,0x31,0xd5,0x1f,0x4,0x78,0x59,0x94,0x2f,0xcb,0xc0, +0xb2,0x5c,0x1b,0x6,0x38,0x2f,0xca,0x97,0xcd,0x40,0x6b,0x20,0xa0,0x5a,0x18,0x6a, +0x4,0xe,0x75,0x4b,0xc9,0x76,0x60,0x57,0xb9,0x66,0x6,0x2c,0xa,0xa6,0xed,0xb3, +0xb4,0xbf,0x5c,0x53,0xd,0x31,0xd8,0xa,0xac,0x94,0x4d,0x5a,0x80,0x46,0x9e,0x86, +0x67,0xfb,0xed,0xc0,0xd2,0xea,0x1a,0x44,0x35,0x74,0xc2,0x36,0x81,0xe9,0x16,0x2c, +0xe0,0x7f,0x9b,0xfb,0xd2,0xe2,0x98,0xeb,0xa,0xb0,0x5a,0xfa,0xca,0x8b,0xec,0xc, +0x1f,0xbe,0xb,0x2a,0x88,0x3,0x2f,0x58,0xd2,0x21,0x5a,0x28,0xc7,0x45,0x94,0x81, +0xd5,0x68,0x91,0x3,0x41,0xae,0xcd,0x18,0x3d,0x82,0xec,0x34,0xa0,0x81,0xcd,0xe2, +0xe,0xf1,0x90,0xef,0x30,0xae,0x7,0x56,0xe3,0x61,0xbe,0x6e,0x21,0xe4,0x1a,0xa4, +0x35,0x34,0x48,0xce,0x2c,0x16,0x75,0x88,0xf8,0x5a,0x25,0x4a,0x7,0x56,0x23,0x7e, +0xbe,0x32,0x3,0x72,0xd,0xae,0x8b,0xd0,0x90,0x4,0x31,0x7d,0x23,0x9c,0x74,0xc8, +0x69,0x94,0xf6,0xf9,0x32,0xb0,0x9a,0xd3,0x7c,0x7f,0x40,0xd0,0x87,0x36,0x4c,0x1b, +0x1a,0x26,0xe1,0x92,0x1c,0x5,0x3f,0xeb,0x90,0x26,0x2a,0xae,0xa6,0xc,0xdc,0x9e, +0x26,0xa2,0x3e,0xfc,0x5,0x4c,0x1b,0x12,0xc6,0x6c,0x46,0xc6,0xc7,0x7,0x1d,0x12, +0x61,0xc5,0xd5,0x54,0x7a,0xf5,0x9b,0x96,0xf3,0x70,0x77,0x1e,0x4b,0xc2,0x19,0xbb, +0x20,0xd6,0x23,0x2b,0x30,0x4e,0xf5,0x55,0x57,0xd3,0x15,0x78,0x9,0xe6,0x70,0x1, +0xe,0xbd,0x2b,0x10,0x93,0x28,0x59,0xbe,0xd4,0xf6,0xae,0xb1,0xc6,0xe5,0x3c,0x0, +0xba,0x70,0x53,0x5d,0xe6,0x75,0x7,0xfe,0xae,0x36,0x1e,0xc6,0x8d,0xcb,0x79,0x34, +0xdc,0xa4,0x3e,0x88,0x6e,0x2f,0xf5,0x9,0x68,0x1a,0xd6,0x9,0xf8,0x95,0xd2,0x7d, +0x59,0x0,0x69,0xf3,0xea,0x5a,0xb8,0xc1,0x87,0x9a,0x51,0x9f,0x6,0xdd,0x81,0x71, +0x6d,0x4e,0xd3,0xe,0xc,0x53,0x8f,0x4,0x60,0x8a,0x39,0xb0,0x76,0x96,0xa6,0x9e, +0x13,0x27,0x67,0x9e,0x1b,0x27,0xa7,0x81,0x7b,0x91,0xc5,0xfc,0xbc,0xfb,0xd2,0x8, +0x88,0xda,0x22,0xc4,0x1d,0x81,0x3e,0xf6,0xf,0x14,0xc0,0x5a,0x3b,0xac,0x3,0x2a, +0xdd,0x97,0xc2,0x53,0xfb,0x1c,0xd8,0x28,0xd7,0xc2,0x4d,0x2,0x9e,0x1,0x17,0xf5, +0xa,0x60,0xad,0xa7,0xa9,0x1,0x46,0x79,0xf9,0x52,0xee,0x3f,0xe4,0xda,0x82,0x86, +0xdb,0x3d,0xd,0x7,0x6e,0x38,0x70,0x53,0x0,0xeb,0x9d,0x77,0xd,0xf0,0xd3,0xbc, +0x7c,0x29,0xf7,0x1f,0x72,0xf5,0x54,0xb3,0x9c,0xd7,0x2,0xac,0xf,0x4f,0x35,0xc0, +0x87,0x79,0xf9,0xf2,0x5b,0xb9,0xe8,0x29,0xd6,0xf,0xb7,0x86,0xa7,0x2d,0x29,0x46, +0x7d,0x0,0xae,0x2,0x8b,0xf2,0xa5,0x4,0xa,0x5,0x4c,0xc3,0xad,0x1,0x78,0x5b, +0x4e,0x53,0x9b,0x62,0xd4,0x0,0x55,0x5,0x2c,0x6e,0x9f,0xc5,0x81,0x5b,0x53,0x8c, +0x4e,0x49,0x54,0xd,0x50,0xd5,0xf8,0xe2,0xf6,0x59,0x21,0x2,0xb7,0x26,0x51,0x9d, +0xd2,0xc4,0x5a,0x60,0x51,0xc5,0xd8,0x6,0x34,0x4a,0x13,0x6b,0x13,0xe1,0x3a,0xa0, +0x52,0xbe,0xe4,0xc0,0x7,0x12,0xd8,0x35,0x11,0x36,0x6,0x2a,0xe5,0x4b,0xe,0xf4, +0x25,0x70,0x90,0x54,0xbf,0xe,0x58,0x94,0x2f,0x95,0xa3,0x46,0x92,0xb0,0x2a,0xd7, +0x86,0x2,0x9e,0xd4,0x1,0xe3,0xb0,0x2a,0xd7,0x86,0x2,0xe6,0xc5,0x3d,0x71,0x5c, +0xc,0x9e,0x61,0xc5,0x6a,0xe4,0x1a,0xdb,0x1b,0x10,0xc6,0x90,0xd5,0xc8,0x35,0x36, +0x8c,0x5c,0x53,0xab,0x89,0xfa,0x9,0x3c,0xe5,0x59,0xca,0x86,0x91,0x6b,0x5a,0x33, +0x64,0x6e,0x87,0xa8,0x0,0xca,0x76,0xf8,0xc3,0x3,0x1a,0xea,0x43,0xb5,0xfb,0x72, +0x2b,0x50,0x6b,0x2c,0x47,0x7d,0x48,0xac,0x10,0x77,0x71,0xa7,0xa8,0xf,0x13,0x91, +0xb5,0x99,0xea,0x43,0xb5,0xfb,0x32,0x77,0xde,0x8,0x2c,0x3b,0x6f,0xa6,0xea,0x43, +0x4,0x1e,0xc3,0x1f,0x51,0x1f,0x4a,0xa0,0xa9,0x3e,0x54,0xbb,0x2f,0xf3,0xf0,0x84, +0xc0,0x72,0x78,0x62,0xaa,0x3e,0x4,0x20,0xe8,0xc3,0x30,0x42,0x7d,0x28,0x81,0xa6, +0xfa,0x50,0xed,0xbe,0xcc,0x3,0x30,0x2,0xcb,0x1,0x98,0xa9,0xfa,0x10,0xfe,0x84, +0xfa,0x70,0xc2,0x40,0x1f,0x26,0xac,0x93,0x3e,0x54,0xbb,0x2f,0xf3,0x14,0x3,0x81, +0xe5,0x14,0x83,0xa9,0x72,0xd,0xfe,0x84,0x72,0xcd,0x65,0x20,0xd7,0x46,0xac,0x93, +0x5c,0x53,0xbb,0x2f,0xf3,0x24,0xa,0x81,0xe5,0x24,0x8a,0xa9,0x72,0xd,0xf,0x53, +0x61,0xf4,0xcc,0x63,0x20,0xd7,0x1e,0x45,0xdb,0xd2,0xc4,0xb4,0xdc,0x2c,0x91,0xe2, +0xdd,0x53,0xba,0x2f,0xf3,0x34,0x11,0x81,0xe5,0x34,0x51,0x5,0xf2,0xc3,0x54,0x18, +0x19,0xfb,0x28,0xd7,0x1e,0x59,0xe1,0x96,0x44,0xb8,0x1e,0x58,0x94,0x2f,0x6b,0xa5, +0x7f,0x9e,0x8,0xb3,0xaa,0x5c,0xc3,0x45,0xbd,0x26,0x31,0x53,0xf,0x2c,0xca,0x97, +0x5d,0x80,0x47,0x28,0xd7,0x88,0xc5,0xe5,0xda,0x61,0x37,0x60,0x5e,0xbe,0x2c,0x1f, +0x45,0xb9,0x15,0x88,0x72,0xd,0x27,0xcc,0xc,0x8c,0x3,0xe5,0x5a,0xda,0xd,0x98, +0x97,0x2f,0x9b,0x8e,0x3e,0x29,0x6d,0x96,0xa3,0x78,0xb6,0x9,0xdc,0x4e,0x72,0x82, +0x72,0x2d,0xed,0xa6,0xf,0xb7,0xad,0x69,0xda,0x5b,0x81,0xa8,0x9e,0xe8,0x18,0xe4, +0x1a,0xa1,0xc7,0xc1,0x40,0x40,0xea,0xe9,0x1b,0xab,0x6b,0x37,0xcb,0x79,0x24,0x3d, +0x6,0xf5,0x94,0xdd,0x52,0xc3,0xa2,0x42,0xfd,0x2b,0x9,0x21,0x56,0x6f,0x1b,0x43, +0xb9,0xba,0x6,0x72,0x6d,0x7c,0x84,0xc0,0x71,0xd0,0xa5,0x6c,0xb2,0xbd,0x50,0x7c, +0xd9,0x4,0xb4,0x46,0x28,0x66,0xac,0x47,0x20,0x66,0x32,0xb3,0xa8,0x7a,0x9a,0xfa, +0x49,0xb3,0xa5,0xf6,0x3e,0x61,0x71,0x3,0x10,0x57,0xd7,0x88,0xc5,0x7f,0x5,0x67, +0x1c,0x6e,0xf1,0xa5,0x1d,0x80,0x60,0x28,0x81,0xde,0xea,0xad,0x3,0x71,0x75,0x8d, +0x58,0xfc,0xd7,0x34,0xb0,0xb6,0xc9,0xb5,0x16,0x60,0xe4,0x2b,0xc5,0x1b,0xf0,0xa4, +0x34,0xa8,0x7,0x9a,0xcb,0xb5,0x66,0x60,0xaa,0x74,0x89,0x9,0x39,0x7a,0xd5,0x9, +0x58,0x13,0xf1,0x9b,0x81,0x89,0x5f,0x6c,0x9c,0xba,0xe5,0xd1,0xf0,0xba,0x1b,0xd0, +0x30,0xa7,0x29,0x4c,0x3d,0x3f,0x61,0x0,0x93,0xc,0x8c,0xf7,0xeb,0x6e,0x40,0xc3, +0xac,0x2d,0x7f,0x81,0xf7,0x9c,0x69,0xc0,0xeb,0x9b,0x6e,0x40,0xc3,0x44,0x58,0x2d, +0xf2,0x91,0x2,0x38,0x39,0xb4,0xaf,0x37,0x54,0x19,0x83,0x1f,0x3a,0xb0,0xfd,0x6c, +0x3a,0x2c,0x3d,0xc9,0xf2,0x13,0x7,0x9e,0xd8,0xce,0xed,0x5e,0x81,0x31,0x8b,0x7d, +0xb9,0xdd,0x8e,0x3,0x71,0x96,0xef,0x2,0xc,0x22,0xbf,0xd9,0x2c,0xe6,0xd4,0x8f, +0x65,0x7f,0x9d,0x0,0xda,0xd7,0xe0,0xc0,0x8a,0x9e,0xd1,0xc1,0x81,0x53,0x98,0x93, +0xc1,0x42,0x3,0xa2,0xb7,0xca,0xf,0xe,0x1a,0x1c,0xe8,0x83,0x3a,0xfc,0x66,0xa5, +0x8e,0xe1,0x35,0x24,0xf3,0x76,0xde,0xf3,0x3f,0x38,0x30,0xf8,0x86,0xb1,0xef,0x6e, +0x90,0xe6,0xc8,0x59,0xca,0xd8,0xb1,0xf8,0x6,0xbf,0x8b,0xe1,0x4f,0x3c,0x33,0x60, +0x1a,0xc2,0x75,0xdc,0xdc,0x72,0x20,0xdc,0x4b,0xa1,0x2c,0x24,0x70,0xda,0xc5,0xb5, +0xc9,0xf4,0x8b,0x3,0x1b,0xad,0xe2,0xc,0x7e,0xf9,0x33,0x11,0x40,0x42,0x5,0xf0, +0xb9,0x0,0x5e,0x37,0x1,0x23,0x7b,0xbe,0x51,0x9c,0x77,0x76,0xd,0xed,0xc0,0x3f, +0xe3,0x65,0xd2,0x1c,0xc8,0xa5,0x4c,0x27,0xa0,0x8,0x4f,0x54,0xc6,0x9c,0x56,0x20, +0x41,0x20,0x1b,0x87,0x19,0x90,0x4b,0x99,0x76,0x20,0xd,0x73,0xa0,0x8,0xc0,0x44, +0x4e,0xea,0x56,0xe0,0x2d,0xf7,0xd4,0x67,0x2,0xb8,0xa1,0x42,0xca,0x7c,0x65,0x0, +0x5c,0x30,0x9,0x14,0x29,0x46,0x22,0x27,0x75,0xeb,0xa4,0xb9,0xf9,0x4e,0x56,0xd2, +0x25,0x90,0x4b,0x99,0x4e,0x40,0x91,0x44,0xc5,0xd2,0xa5,0xb5,0x2,0x57,0x1c,0xf8, +0x4d,0xe,0xe4,0xfb,0x35,0x4d,0x80,0x2f,0xbd,0xc,0xc8,0xd3,0x44,0x63,0xe0,0xfa, +0x1b,0xfc,0xf5,0xbb,0xab,0x1c,0xc8,0xc,0x81,0x20,0xf4,0x36,0xca,0xba,0x45,0xec, +0x76,0x5,0x5e,0xb3,0x75,0x7,0x60,0x64,0xe7,0x93,0x46,0xa4,0xfa,0xb1,0x37,0xd9, +0x37,0x70,0xa9,0x3,0x7d,0x31,0x3b,0x5b,0xc3,0xd3,0xfa,0x45,0x4f,0xe0,0x62,0xd3, +0xf,0xb8,0x50,0x81,0xeb,0xe,0x63,0xc8,0xb6,0x0,0xdb,0xec,0xf0,0x9a,0x3,0xff, +0xd4,0xf5,0xa,0x11,0x38,0x5b,0xea,0x63,0xf8,0xd0,0xe8,0xd8,0xd4,0xde,0xc0,0xc5, +0x26,0x9a,0xe9,0xb3,0xd4,0x10,0x18,0xf6,0x4,0xce,0x97,0xb1,0xab,0xdb,0x61,0x1, +0x6c,0x9a,0xa5,0xbd,0x81,0x91,0x8d,0x5b,0x3a,0x55,0x4f,0x63,0x6,0x9c,0x66,0xc0, +0xcc,0xf0,0xd1,0x7,0x7f,0x25,0xfc,0xe2,0xf,0x9,0x8,0xde,0xda,0xa5,0xbe,0xee, +0xbc,0x4f,0x0,0x98,0x72,0xb3,0x68,0x2,0x5e,0x95,0x80,0xd2,0x79,0xe3,0xe1,0xb2, +0x7e,0x23,0x90,0x78,0x90,0x42,0x6b,0xe1,0xe9,0xac,0x17,0x50,0x86,0x27,0x3c,0x2, +0xd9,0xbd,0xee,0xa0,0xf,0x21,0x0,0x53,0xe,0xc,0xa3,0x56,0x20,0xfc,0x45,0x2, +0x8b,0x0,0x7c,0x8c,0x8b,0x18,0x66,0xc0,0x3c,0xc5,0x80,0x5f,0x6f,0x4,0xb0,0xe9, +0x75,0x85,0xf,0xda,0xc,0xa,0xa0,0x4c,0x31,0xf0,0x54,0x69,0xdb,0x10,0x98,0x25, +0x51,0xa6,0x40,0x18,0x6e,0xbf,0x0,0xca,0x24,0xea,0x91,0xe5,0x4f,0x2c,0x43,0x60, +0x96,0x26,0x9a,0x2,0x61,0x42,0x7b,0x12,0x8,0x69,0x22,0xaf,0x44,0x1d,0x63,0xa5, +0x30,0x32,0x5,0x66,0x89,0xb0,0x29,0x30,0x72,0x2d,0x57,0x0,0x95,0x44,0xf8,0x2d, +0x3c,0x73,0xe8,0x83,0xbe,0xc0,0xe6,0x49,0x13,0x79,0x13,0x15,0x88,0x8b,0x4,0x8, +0x84,0xe9,0xb3,0xf,0x20,0x8c,0x5f,0xe4,0x47,0x8,0x2c,0xc4,0xc,0x9a,0xd6,0x3e, +0x81,0x93,0xa,0x90,0x8e,0xef,0xf8,0xa,0x41,0x90,0xee,0x15,0x28,0xc6,0xb0,0x90, +0x6b,0xec,0x76,0x57,0x60,0xc3,0xb,0x81,0x62,0x96,0x16,0x45,0x5,0xb6,0xa1,0x9d, +0x66,0x69,0x56,0xa7,0x31,0x5,0x4a,0x3b,0xcc,0x80,0x70,0x37,0x56,0xb4,0x93,0x1d, +0x66,0x95,0x28,0x53,0xa0,0xf4,0x34,0x6a,0x25,0x8a,0x1a,0x78,0x9a,0x92,0x5c,0xeb, +0x0,0x94,0xbe,0x54,0xad,0xb5,0x51,0x3,0x5f,0x5a,0x92,0x6b,0x39,0xd0,0x7a,0xaf, +0x6d,0xd2,0xc8,0xf0,0x24,0xbf,0x7,0xa3,0x85,0x4f,0x5b,0xa3,0x45,0x45,0xae,0x15, +0xc0,0xe6,0x78,0x78,0x75,0x15,0xa8,0x40,0x59,0x2f,0xa5,0xad,0xf1,0xb0,0x22,0xd7, +0x4c,0xcd,0xa2,0x4,0x94,0x15,0x61,0xda,0x1a,0xf1,0x2b,0x72,0x4d,0x2,0x5b,0x73, +0x9a,0x32,0xf0,0x12,0x72,0x9a,0x38,0x5b,0xef,0xea,0x22,0xd7,0xfa,0x2,0x45,0x55, +0x9f,0x76,0x97,0x6b,0x1a,0xb0,0x29,0x3a,0x95,0x80,0x62,0xdd,0x82,0x76,0x97,0x6b, +0x7d,0x81,0x62,0x65,0xe6,0x87,0x9,0x5c,0xe,0x2,0x14,0x29,0x6,0xed,0xae,0xf, +0x7b,0x3,0x13,0xf1,0xe0,0xf1,0xce,0xfa,0xd0,0x14,0x58,0xf2,0x34,0x79,0x87,0x42, +0x67,0x7d,0x68,0x6a,0x16,0xfd,0x81,0x25,0x7d,0xb8,0x7f,0x60,0x49,0x1f,0xf6,0x1, +0x16,0xd5,0x0,0xda,0x5d,0x1f,0xf6,0x0,0xa6,0xc5,0xea,0x2f,0xed,0x2e,0xd7,0x7a, +0x0,0x49,0xb1,0xc2,0x4d,0xbb,0xcb,0x35,0x36,0xc1,0xe5,0x72,0xbb,0xcb,0x2c,0x4d, +0x8a,0xec,0x98,0x76,0x97,0x6b,0x8c,0xaf,0xd1,0x77,0x2,0xc6,0xc5,0x97,0xd3,0x3e, +0x72,0xcd,0x4b,0x3b,0x2,0x23,0xb5,0x53,0x48,0xa4,0x18,0x69,0xed,0xd9,0x97,0xb5, +0x49,0x14,0xb5,0x5c,0x23,0x60,0xa1,0x80,0x65,0x8b,0x92,0x4,0x8a,0x24,0xca,0xc, +0x88,0x69,0xe2,0x9f,0x88,0xe5,0xfc,0x3f,0xa3,0xa2,0xc2,0x56,0x20,0xa6,0x89,0x66, +0x40,0x9c,0x9f,0x2b,0xc8,0xfd,0x12,0x4,0x62,0xb3,0x85,0x29,0xf0,0x81,0x2,0x14, +0x89,0xb0,0x39,0x70,0x1e,0xfb,0x78,0xcc,0x6b,0x37,0xa0,0xaf,0x1,0x31,0xd5,0x37, +0x7,0x5e,0xc4,0xc1,0x64,0x14,0xf2,0x6f,0x35,0x7,0x62,0x6f,0x62,0x5f,0xa0,0x1b, +0x87,0xd1,0x69,0x70,0x97,0xc0,0x28,0x8c,0x8e,0xfd,0xc,0x68,0x38,0x4b,0x2b,0xc0, +0xd2,0x13,0xad,0x1a,0x80,0xa9,0x37,0x9,0xa3,0x87,0x5e,0x47,0x60,0x65,0xc,0xcd, +0x81,0x14,0xbe,0x37,0xf2,0xdc,0x8e,0xc0,0xca,0x2c,0x45,0x3b,0x59,0x1b,0xd9,0x21, +0x3d,0x7e,0x2b,0x8c,0x3e,0xb8,0xec,0x8,0xac,0xd8,0xa1,0x21,0x10,0x3c,0xd,0x39, +0x7a,0x12,0x4c,0xde,0xbf,0xd8,0x9,0xe8,0x4f,0x9a,0x80,0x89,0x7,0x11,0xdf,0xcd, +0x7d,0x29,0x19,0x81,0x1d,0x7e,0x38,0xe7,0x81,0x12,0xb7,0xde,0x1b,0xcd,0xd2,0x8a, +0x2f,0xfd,0x41,0x1,0x63,0x7,0x80,0x4e,0x1e,0x9e,0xc8,0x33,0x98,0x62,0x37,0x1d, +0x81,0x95,0xf0,0xd4,0x4,0xc4,0xbc,0x3b,0xb2,0xf3,0x0,0x9c,0x7c,0x4,0xce,0xfb, +0x76,0x66,0xe,0x8c,0xe5,0xf6,0x78,0x2d,0x0,0x37,0x1,0xe7,0xb3,0xd9,0x66,0xbe, +0xcc,0x53,0x8c,0x4,0x54,0xba,0x7b,0xbb,0xec,0x6,0xac,0xa4,0x18,0x6f,0x34,0x0, +0x17,0xcb,0xd9,0x46,0xd1,0x87,0x31,0x4,0x16,0x8f,0xc6,0xdd,0x80,0x95,0x24,0xea, +0xe6,0x9a,0x6c,0x7,0xb2,0x68,0xa3,0xe8,0xc3,0xe5,0x14,0x53,0x8c,0x51,0x6,0x6c, +0x37,0xb,0x3e,0x7e,0xe5,0x34,0xb1,0x5,0xf8,0x54,0xd1,0x87,0xcb,0x2b,0xf0,0x8c, +0x69,0x57,0x60,0x39,0x11,0x6e,0x2,0x7e,0x69,0x7f,0xf9,0x58,0xd1,0x16,0x4b,0xcc, +0x6b,0xf7,0xc,0x7c,0xb9,0x5,0x68,0xe6,0x69,0xfa,0x0,0x7f,0xb1,0x1d,0x68,0x36, +0x69,0x3a,0x1,0x17,0xcb,0x85,0x7d,0xd7,0xc0,0x73,0x5,0x38,0xeb,0xa,0x5c,0x5f, +0xdd,0x74,0x6,0xce,0xf4,0x59,0x3a,0x0,0x30,0x69,0xf4,0x34,0x0,0x5c,0x16,0x76, +0xb8,0x77,0x20,0x68,0xfc,0xa5,0xf4,0xa5,0xe8,0x69,0x3a,0xcf,0xd2,0xa,0x30,0x68, +0x1,0x2a,0xd1,0x2,0x7d,0xa9,0x0,0x3e,0xd9,0x5,0xd8,0xe2,0x4b,0x95,0x78,0x88, +0xd1,0x2,0x5c,0x1b,0xc8,0xb5,0xdf,0xec,0x0,0x6c,0x8b,0x16,0x25,0xb9,0xb6,0xbc, +0x46,0x5f,0xba,0x64,0x6,0x2f,0xb1,0xba,0x56,0x1,0x1e,0x9b,0x3,0x31,0xe2,0x2f, +0xd7,0xe0,0xfa,0x6f,0xd,0x81,0x58,0x11,0xae,0x0,0x8f,0x3a,0x0,0x21,0x89,0x8a, +0x79,0x3c,0x9c,0x99,0x1,0x13,0x5e,0x68,0x2f,0x19,0xbe,0x4c,0xa2,0x4c,0xe5,0x5a, +0xf2,0xc,0x22,0xfe,0xcd,0xdc,0xc,0x88,0x55,0xfd,0x1a,0xa0,0x7c,0xa6,0xa9,0x59, +0x22,0x9c,0x8c,0xe0,0xc7,0x5e,0x5d,0x98,0x1,0x71,0xdd,0xa2,0x2,0xec,0x28,0xd7, +0x20,0x2f,0xf5,0xad,0xf7,0xd5,0xb6,0xfb,0x9a,0x2d,0x9d,0xea,0xea,0x5a,0xd,0xb0, +0x93,0x98,0xa1,0x87,0x6f,0x5,0x93,0xf,0x4c,0x81,0x7e,0xb4,0x33,0x30,0xf5,0x2c, +0x29,0x66,0xc,0x80,0x93,0x1f,0x27,0x10,0xe4,0xda,0xa1,0x7f,0x77,0xb7,0x54,0x28, +0x60,0xff,0xee,0x26,0xd,0x68,0xfc,0x30,0x1a,0x5,0x86,0xc0,0x5d,0xcd,0x2,0xeb, +0x34,0x11,0x0,0xdf,0xb,0xcd,0x80,0xc5,0x72,0x5e,0xd9,0xf0,0x3b,0x2c,0xe7,0xc5, +0xa0,0xf,0xb5,0xaf,0x68,0x0,0x16,0xcb,0x79,0x65,0xd7,0xd6,0x0,0x2c,0xc9,0x35, +0x96,0xbc,0xe5,0xeb,0x1b,0xe,0x1a,0x80,0xea,0x72,0x5e,0xa9,0xd6,0xb6,0x1d,0x58, +0x92,0x6b,0x8c,0xbc,0x51,0xda,0xdf,0xd3,0x0,0xac,0x2d,0x41,0xb7,0x55,0x13,0x4b, +0x72,0x8d,0xd1,0x3,0xcb,0xf1,0x76,0x1,0xb6,0xd5,0x4b,0x4b,0x72,0x8d,0xb1,0xc3, +0xd2,0x6,0xa6,0xae,0xc0,0xb6,0x8a,0x70,0x49,0xae,0x69,0x5,0xec,0x7e,0xc0,0x96, +0x9a,0x77,0x49,0xae,0x69,0x25,0xfa,0x66,0xe0,0x34,0xec,0xb5,0x8c,0x50,0x92,0x6b, +0xbc,0xe6,0x6d,0x6,0xbc,0xee,0x7,0x2c,0xc9,0x35,0x66,0x1f,0xb8,0x77,0x17,0x0, +0x0,0x15,0x2f,0x49,0x44,0x41,0x54,0xfe,0x52,0x80,0xc5,0x73,0x1d,0x4d,0x80,0x2f, +0xfb,0x2,0x5f,0xf4,0x5a,0x28,0x29,0xc9,0xb5,0x5e,0x40,0x4d,0xe3,0xb7,0x8e,0xa1, +0x2e,0xd7,0x3a,0x0,0xf3,0xfe,0x52,0xbd,0x8a,0xa1,0x3,0x37,0x6d,0x72,0xad,0x17, +0x30,0xf1,0x9d,0x6d,0xc0,0x55,0x9b,0x5c,0xeb,0x2,0xfc,0x26,0x3,0xc6,0xe1,0x6c, +0x1b,0x70,0xd1,0x26,0xd7,0xfa,0x1,0x8b,0x23,0xd5,0x4,0x70,0x95,0x3,0xaf,0xdb, +0xe4,0x5a,0x7,0x60,0xde,0xe7,0xcd,0xa2,0x62,0x97,0x9c,0x0,0x4e,0x72,0xe0,0x55, +0x9b,0x5c,0xeb,0x0,0xcc,0x3b,0xd9,0xd9,0xac,0x78,0x56,0x68,0x19,0x18,0xb4,0xc9, +0xb5,0xe,0x40,0xd1,0xab,0xff,0xb7,0x61,0xd,0xf0,0x7e,0xd6,0x31,0xc4,0xf,0x56, +0xee,0x78,0xb6,0xc9,0xd6,0x57,0xbe,0x1b,0x41,0x2,0xff,0xae,0x0,0x1e,0x66,0x40, +0x7a,0xd7,0x40,0xfe,0x3c,0xaa,0x8e,0x87,0xa9,0x6c,0x7d,0xe5,0x1b,0x3c,0x10,0xb8, +0xe6,0xcd,0x18,0x15,0xe0,0x2d,0x6b,0x5f,0xce,0x4b,0xda,0xa4,0x76,0xe,0xcc,0xb6, +0xb0,0x20,0x30,0x96,0x4f,0x1c,0x2b,0x4d,0x9a,0x1b,0xd6,0xde,0xf5,0x65,0xc,0xcc, +0x37,0xe9,0xa0,0x59,0x44,0x1,0x5b,0xb9,0x55,0xe0,0x9a,0xb5,0xf7,0xb5,0x19,0x3, +0xf3,0x6d,0x48,0x68,0xf8,0x91,0xc7,0xd6,0xb3,0xc2,0xf0,0xb3,0x5d,0x41,0xd7,0x83, +0x2,0xf3,0x8d,0x56,0xe0,0xda,0x26,0xe,0x5b,0xe0,0x2,0x14,0xd5,0xf7,0x3d,0x4d, +0x7,0x5,0xe6,0x5b,0xc9,0xc0,0x79,0x43,0xf2,0x7c,0x8d,0xdb,0x26,0xa8,0xf2,0xd0, +0xfb,0x17,0x2,0x3c,0x1c,0x70,0x4e,0x43,0xca,0xaf,0x1,0xc2,0x13,0x7c,0xd3,0xd4, +0xba,0xcc,0x81,0x4c,0x2,0x83,0x41,0x81,0x31,0xbb,0xbc,0x48,0xc5,0x35,0xe0,0x13, +0x24,0xaf,0xec,0x65,0x7e,0x4b,0x25,0x90,0xd7,0x94,0x87,0x3,0xe2,0x53,0xb1,0xc4, +0x86,0x47,0xec,0x7d,0x77,0x9e,0xdb,0x24,0x2c,0x1,0x29,0x1b,0x14,0x58,0x6c,0xe9, +0xc4,0x87,0x72,0x5a,0xc7,0xe,0x3e,0x23,0x5a,0x3,0xde,0x32,0x3,0x3b,0x5c,0x2b, +0x67,0x4d,0xb6,0xbc,0x8a,0x5d,0xb2,0xd8,0xe1,0x7f,0xe4,0x54,0x36,0x8f,0x6f,0x98, +0x81,0xa7,0xe9,0x0,0xcc,0xf7,0x1,0x47,0x28,0xa4,0x4e,0xdd,0xca,0xe6,0xf1,0x95, +0x2,0x8c,0x1d,0xea,0x24,0x16,0xa3,0x63,0x9b,0x4f,0xb4,0xc2,0x97,0x76,0x0,0x26, +0xd9,0xb6,0x1a,0xf8,0xcd,0xb2,0x46,0x2e,0x23,0x81,0xe,0x5c,0xab,0x40,0x9b,0xd8, +0x8,0x3c,0xb5,0xf8,0x33,0x2b,0x8a,0x68,0xd1,0x1,0x98,0xed,0xe5,0xc6,0x34,0x31, +0xb2,0x12,0x4f,0x3c,0xfe,0x42,0x1,0x5e,0xab,0x40,0x2b,0xb6,0x46,0x16,0x23,0x23, +0xeb,0x2c,0x3,0x8a,0x0,0xdc,0x1,0x98,0x7,0x2a,0x48,0x13,0x13,0x2b,0xf6,0xb4, +0xc7,0x92,0x23,0xf0,0x4a,0x1,0x2e,0x93,0x25,0x79,0xa,0x77,0x25,0x49,0xc6,0x19, +0x50,0xa4,0x18,0x3d,0x80,0x98,0x26,0x52,0x1b,0x81,0x49,0xa8,0x1,0x7d,0x15,0x48, +0x56,0xf4,0x29,0x3e,0x26,0x9b,0x9e,0x66,0x40,0x91,0x44,0xf5,0x0,0xf2,0x34,0xd1, +0xc6,0x86,0x5b,0xaa,0x2a,0xaf,0x17,0xf2,0x69,0xbe,0x39,0x90,0x6d,0x1c,0x98,0x47, +0x74,0x94,0x3,0x79,0x9a,0xd8,0x7,0x88,0x69,0xe2,0x3c,0xf2,0x53,0x8f,0xb9,0x1a, +0x30,0x2c,0x1,0x13,0x1b,0x6e,0x7a,0x32,0xca,0x66,0xa9,0x48,0x84,0x7b,0x0,0x79, +0x9a,0x78,0x33,0x9,0x0,0xa8,0x96,0x76,0x5f,0x50,0x56,0x6,0x5a,0x60,0xaa,0xf1, +0xd3,0x1c,0xc8,0x53,0xfd,0x1e,0x40,0x9e,0xd3,0xac,0x1,0x18,0x6a,0x83,0xf8,0xe2, +0xb6,0x2,0x1c,0x81,0xd,0x46,0x6c,0x20,0x20,0x7f,0xd0,0x8d,0x3a,0x88,0x2f,0x6e, +0x34,0x60,0x2,0x63,0x48,0xc0,0x70,0xce,0xb,0xe0,0x3f,0xdd,0x5,0x78,0x6d,0x8d, +0xc7,0xec,0x4f,0x4c,0x5,0xae,0x98,0x66,0xf8,0x2b,0x7c,0x8,0x8f,0xcf,0x9c,0x2, +0xe8,0xee,0x2,0xfc,0xda,0xa2,0x6f,0x26,0xae,0x7a,0x8c,0xc3,0x8b,0x45,0x1b,0xd0, +0x1b,0x18,0x78,0xad,0x1,0x1d,0x4,0x52,0x9c,0x59,0xc3,0x8c,0xe1,0x67,0x16,0x7f, +0x26,0x85,0xa,0xbc,0x2a,0x1,0xe9,0x53,0x2,0x49,0x82,0xcf,0xda,0xcd,0x22,0x6d, +0xde,0xfc,0xc8,0xcd,0xe2,0xb9,0xc5,0x62,0x77,0xad,0x7e,0xef,0x8b,0x40,0x9b,0x34, +0x30,0x4f,0x47,0x9,0x9,0xc1,0xc1,0x4f,0x5b,0xd,0xbf,0x5,0xc8,0xd,0xff,0xd0, +0x61,0x49,0x70,0xad,0x7e,0xef,0xdf,0x86,0x3a,0x10,0x9d,0x77,0xcc,0x1f,0x11,0x1a, +0xa,0xe0,0x93,0xad,0xae,0xad,0xd,0x88,0xae,0xd,0xe2,0x6f,0xe2,0x5d,0xab,0x2b, +0xe3,0xff,0xbd,0x4,0x24,0x10,0xa0,0x96,0x2a,0xf0,0x67,0x5b,0x9d,0x77,0xb,0x90, +0x6b,0xfc,0x3,0x97,0xfd,0xe1,0xd7,0x57,0x2a,0xf0,0x6f,0x98,0xe,0xa4,0x10,0x82, +0x35,0xe0,0xe1,0xd6,0xf0,0xd4,0x2,0xe4,0x55,0xc,0x78,0xff,0x71,0xa4,0x1d,0xac, +0xf4,0xdf,0x34,0x60,0x35,0xc5,0xa0,0xdb,0x3,0x70,0xb,0x90,0xd7,0x69,0x20,0xd9, +0xbf,0x3e,0xd6,0x80,0xff,0xb5,0x5,0x98,0x6c,0x4f,0x31,0x5a,0x80,0xbc,0x12,0x5, +0x1,0xff,0xda,0x77,0x94,0x7,0x4e,0xb2,0xff,0xdc,0x2,0xfc,0xfd,0xf6,0x24,0xaa, +0xd,0x88,0xb5,0x36,0xf0,0x21,0xd7,0x57,0x6f,0xa9,0x59,0xcd,0xb4,0x5,0xf8,0xc9, +0xf6,0x34,0x31,0x6d,0x3d,0x94,0x83,0xf1,0x3,0x86,0xbe,0x3a,0x25,0x9e,0x39,0xf0, +0xe1,0xf6,0x44,0x18,0xe6,0x5e,0xbb,0xf7,0x1,0xe3,0xff,0x32,0x4c,0x94,0x2,0xbd, +0xdf,0xc,0xa4,0x27,0x3b,0x2,0xe1,0x6e,0xc6,0xc5,0x43,0x6e,0x59,0x7e,0xa3,0xb6, +0x1,0x49,0xda,0x1f,0x28,0x6e,0x38,0xa4,0x6e,0xc5,0x63,0x7c,0x8b,0x23,0xa3,0xb7, +0x1,0x97,0x3b,0x3,0x67,0x1c,0x58,0x14,0x16,0x5f,0x34,0x3,0x17,0x3b,0x3,0x31, +0xbd,0x88,0xa,0x31,0x73,0xdb,0x2,0xf4,0x77,0x6,0x62,0x7a,0xa1,0x3c,0xff,0x74, +0xd3,0xc,0x4c,0x83,0x9d,0x81,0x98,0x23,0xe2,0xa2,0x85,0x3c,0x5a,0x69,0xd5,0xc, +0x24,0x4d,0x65,0x13,0x43,0xe0,0xc,0xa3,0xa2,0xe5,0x4d,0x70,0x18,0x13,0x7b,0xdd, +0xc,0xdc,0x34,0x15,0x86,0x4c,0x5c,0x1b,0x1a,0x46,0xc8,0xae,0x0,0xc8,0x17,0xcb, +0x62,0xeb,0x5a,0x7,0xa2,0x5c,0xc3,0xbc,0x7b,0x6c,0x53,0xfc,0xf7,0x70,0xd1,0x54, +0xfa,0x32,0x4,0x82,0x77,0xb,0x22,0x90,0xdf,0x38,0x6f,0x22,0x71,0x50,0xa3,0x2e, +0xd7,0x20,0xef,0x6,0xb9,0xc6,0x9f,0xb,0x1f,0x4e,0x9b,0x8a,0x7b,0x86,0x40,0xf0, +0x6e,0x41,0x62,0x1d,0x7a,0x11,0xcb,0x4f,0x86,0xd4,0xe5,0x5a,0x78,0x81,0x72,0x8d, +0xc7,0xc3,0xb3,0xa0,0xa9,0x5e,0x6a,0xa,0x8c,0xd3,0x90,0x5a,0x7,0x1,0xda,0x87, +0x3c,0xfb,0x52,0x97,0x6b,0xa1,0x83,0x72,0x6d,0x84,0x87,0x9e,0x9d,0x86,0x4d,0x15, +0x61,0x53,0x20,0x1,0x7f,0x3c,0x39,0xc2,0x7,0xff,0x66,0x6b,0xc0,0x5b,0x81,0x4f, +0xd9,0xde,0x81,0xa0,0xf,0xcf,0x1c,0xd4,0x87,0x4f,0xf1,0xe,0xfc,0xba,0xb1,0xc8, +0x6e,0xa,0x64,0xaf,0xc3,0x6d,0x7d,0x84,0x99,0x60,0x76,0x60,0xaa,0x2e,0x66,0xc4, +0x3c,0x7d,0x8a,0xe7,0xd3,0x7b,0x8d,0xcb,0x8,0xc6,0x40,0x98,0x2e,0x64,0xc4,0x68, +0x90,0x1f,0x9,0xab,0x3,0xc9,0xdb,0xa8,0xf,0x9f,0x42,0xbc,0xc6,0xa,0x56,0xc3, +0x42,0x89,0x31,0x30,0xe1,0x2d,0x63,0x8,0x74,0xe2,0x1a,0xa0,0xd4,0x87,0x93,0x50, +0x14,0xc3,0x47,0xef,0x92,0x5d,0x81,0x2,0x8a,0x40,0xf7,0xf,0xf5,0x40,0xd0,0x87, +0x9b,0xd7,0x85,0x8e,0xe4,0x87,0x58,0xb3,0x5e,0xaf,0x3a,0x20,0x75,0x26,0x61,0x59, +0x1f,0x26,0x58,0xa3,0x39,0x4f,0xee,0x87,0x6c,0x55,0xc8,0xb5,0xe1,0x80,0x56,0x50, +0x91,0x6b,0x2b,0x94,0x6b,0xc9,0x61,0xc8,0xd7,0x73,0x77,0x38,0x8a,0x52,0x7,0xf2, +0x59,0x2a,0x8f,0xd7,0x2e,0xc9,0xb5,0x15,0xca,0xb5,0xe4,0x18,0x82,0x21,0x5f,0xd0, +0x18,0x6,0x88,0xf,0x7,0xa8,0x7,0xd2,0x70,0x85,0x72,0x2d,0x19,0x87,0x14,0xf, +0x6a,0x24,0x56,0xef,0xb3,0x2f,0x75,0x20,0xba,0xb6,0xec,0xc4,0x72,0x5d,0xae,0x85, +0x2b,0x94,0x6b,0xa8,0xd9,0x30,0x4d,0x8c,0xfa,0x9f,0x7d,0xa9,0x1,0x29,0x3a,0xef, +0xec,0x4c,0x76,0x5d,0xae,0x85,0x2b,0x29,0xd7,0x56,0x98,0x26,0xde,0xeb,0xb8,0x9c, +0xa7,0x68,0x19,0xed,0xac,0xd4,0x54,0x6c,0xed,0xb4,0x2a,0x40,0x8,0x4b,0x2b,0x54, +0x4f,0xa7,0x36,0x5b,0x0,0x30,0x3e,0xe9,0xb8,0x9c,0xa7,0x56,0x31,0xb5,0x76,0xa, +0x79,0x88,0xab,0x5b,0x6,0xa2,0x63,0x43,0xe0,0xd8,0x61,0xb8,0x3b,0xcf,0xe9,0xba, +0x9c,0x97,0xbf,0xb0,0x1c,0xa3,0x9e,0xd0,0xc8,0x53,0xc,0xf9,0xe4,0x80,0xfa,0x14, +0x3,0xec,0x26,0x24,0x7e,0xd7,0xd5,0xb5,0xad,0x40,0x9e,0x44,0xc9,0x67,0x23,0xd4, +0x3,0x41,0x63,0x85,0x93,0xce,0xab,0x6b,0x5b,0x81,0xc2,0x8d,0x8b,0xa7,0x3f,0xd4, +0x3,0x97,0x8c,0x8d,0xdd,0x1e,0x67,0x5f,0x2a,0xc0,0xb8,0x74,0xe0,0x6e,0xf6,0x7c, +0x8b,0x7a,0xe0,0x82,0xb1,0x27,0x61,0x8f,0xb3,0x2f,0x95,0x49,0x53,0x7e,0x5,0xf2, +0x9,0x1e,0xf5,0x40,0x8f,0x57,0xe7,0x1b,0x8e,0xa2,0x24,0x56,0xd8,0x2,0xb4,0xab, +0x4b,0x1a,0xdb,0x81,0xf0,0xaf,0xb8,0xd8,0xd8,0x0,0x4c,0x1a,0xd7,0x4e,0x3a,0x3, +0xc1,0xf5,0x9d,0x87,0x8d,0xcf,0xe5,0x8e,0x9b,0xab,0x26,0x5d,0x81,0x33,0xf0,0x46, +0xcd,0xc0,0xa8,0x7c,0xea,0xf2,0x4e,0xc0,0xd8,0x61,0x51,0x18,0x36,0x2f,0xc1,0x58, +0xee,0x70,0xc0,0xd8,0xa,0x52,0x87,0x35,0x3,0x2d,0xcb,0x19,0xc,0x88,0xc3,0x93, +0x4,0xcd,0xc0,0x96,0x4d,0xac,0x37,0x4c,0x7d,0xa0,0x5e,0xb,0x90,0x4f,0x7,0x9b, +0xdd,0x19,0x90,0xf3,0xb0,0xb6,0x32,0x38,0xb0,0xde,0xf0,0x13,0x3e,0xdd,0x23,0xd6, +0xa,0x3c,0xed,0xc,0xac,0x75,0x6d,0x82,0x97,0xba,0xed,0x40,0xda,0x19,0x58,0xe7, +0xbc,0xe5,0xb9,0xfb,0x71,0xd0,0xa,0xb4,0xd3,0xce,0xc0,0x9a,0xf0,0xf4,0xbf,0xa4, +0x35,0xdb,0x6c,0x67,0xe0,0x4d,0x15,0x58,0x13,0x80,0xe5,0xc1,0xa8,0xc4,0xdf,0x7, +0xf0,0xa4,0x92,0x62,0xe4,0xc5,0xbe,0x9,0x63,0x3b,0x8f,0x61,0x15,0x78,0x5c,0x49, +0xa2,0x32,0x20,0x75,0x4d,0x80,0xa7,0x9d,0x81,0x95,0x34,0x31,0x3,0xca,0x87,0x97, +0xed,0x66,0x87,0x35,0xc0,0x4a,0x22,0x2c,0x81,0x7f,0x76,0xd8,0x7e,0x80,0x95,0x54, +0x5f,0x2,0x89,0x6f,0x0,0x6c,0x71,0xde,0x37,0xc4,0x72,0xeb,0x80,0x93,0x5a,0x60, +0x51,0x11,0x8e,0x6b,0x9e,0x36,0x60,0x14,0x9e,0x6e,0x12,0xcb,0xa9,0x3,0x5a,0x2d, +0xc0,0xa8,0xf6,0x89,0xa,0x6,0x1,0xf8,0x86,0x6d,0x3a,0xdc,0xd2,0x2,0xc8,0xb7, +0xd6,0x38,0x3d,0x52,0x8c,0x1b,0xb5,0x39,0xb1,0x3,0x90,0xa7,0x77,0x76,0x8f,0x24, +0xa,0x80,0xa1,0xf1,0x2c,0x2d,0x80,0xa9,0xd2,0xeb,0xd3,0x2d,0x4d,0xbc,0x61,0xff, +0x23,0xac,0xb7,0x43,0x5e,0x72,0xdf,0x6,0xa4,0xca,0xc1,0xd8,0x5d,0x33,0xef,0x8b, +0xa0,0xde,0xd3,0xc4,0x78,0x67,0xb6,0x1,0x89,0xd2,0x3e,0xd5,0x15,0xf8,0x9f,0xfc, +0x7a,0x5f,0x1a,0xe1,0xd8,0x6f,0x3,0xca,0x84,0xdd,0xef,0x3,0xfc,0x8b,0xab,0xfa, +0x68,0x31,0x4f,0x1b,0x80,0x71,0xed,0x63,0x3f,0xcc,0x80,0xef,0x5c,0xc7,0x38,0x18, +0xa9,0x9c,0x76,0xb8,0x2d,0x82,0xc7,0xc3,0x5,0x6b,0x0,0x46,0x5b,0x1e,0x6d,0x62, +0x0,0x4c,0x9f,0x2d,0x62,0x64,0x88,0x8d,0x79,0x20,0xef,0x2d,0x4b,0x44,0xfc,0x46, +0xe0,0x44,0x3e,0xec,0xab,0x7,0x90,0x3c,0x5b,0xf3,0xe,0x33,0x2f,0xb7,0x21,0x99, +0xd3,0x34,0x2,0x73,0x65,0xd7,0x3,0xc8,0x5d,0x5b,0xd6,0xed,0x8d,0x5e,0x42,0x66, +0x6d,0x3f,0x28,0x60,0x9a,0x3f,0xec,0xab,0x3b,0x50,0x38,0xef,0xec,0x18,0x0,0x74, +0xbc,0x32,0x11,0x6e,0x2,0xe6,0xf,0xa9,0xe9,0x6e,0x88,0x37,0xb7,0x3c,0x1e,0x66, +0x3b,0xa0,0x30,0xb4,0x48,0x60,0x93,0x1d,0x92,0xc,0xe8,0xf7,0x30,0x8b,0x3e,0xc0, +0x64,0xcb,0xf3,0x77,0xcc,0x81,0xd9,0xd9,0x11,0x38,0xd3,0xd,0x80,0xf1,0xd6,0x67, +0xc,0xed,0x0,0xd4,0xa2,0xc5,0x37,0x53,0x21,0xed,0xc4,0x43,0x67,0xc3,0x28,0x7f, +0xea,0xde,0xbe,0x80,0x53,0x57,0x94,0x57,0x82,0x88,0x3,0x27,0x19,0xd0,0xde,0x17, +0xf0,0x33,0x57,0x5e,0x21,0xf7,0xbb,0xa1,0x52,0xd3,0xe9,0x53,0x18,0x5a,0xf2,0x8c, +0x41,0xa6,0x78,0x4e,0x66,0x87,0xda,0x18,0x7e,0xf6,0xc,0x7e,0xb9,0x25,0x94,0x9d, +0xe3,0xdf,0xce,0x94,0xa7,0xee,0xd,0x2,0xe4,0xae,0x4d,0x7,0xfe,0x5b,0xcc,0xbb, +0xc9,0x6d,0xfa,0x17,0xf8,0xb7,0x53,0xa5,0x88,0x34,0x8,0x90,0x3b,0x6f,0x1d,0xf8, +0x2b,0x4,0x9e,0x6e,0x8,0x6e,0x4d,0x67,0xa3,0x2,0xe8,0xf,0x2,0x14,0x72,0x2d, +0x9,0x4b,0x93,0x26,0x3d,0xbd,0xd9,0xf0,0x49,0xf3,0x64,0xeb,0x83,0xb0,0xcc,0x6a, +0x6d,0x76,0x19,0x28,0xe4,0x5a,0xac,0xce,0x52,0xfe,0xeb,0xd1,0x5a,0x64,0x78,0xef, +0x35,0x3c,0xec,0xcb,0x14,0xe8,0x4b,0x20,0x71,0x72,0xb9,0x76,0x51,0x1,0x1e,0xac, +0xc5,0xa4,0x51,0xa,0x81,0x3d,0x22,0xa2,0xe5,0x6f,0x0,0x18,0xf2,0x7b,0x95,0x3a, +0xa9,0x93,0xcb,0x35,0xb7,0x2,0xfc,0xfc,0x5a,0x4c,0x1a,0x5,0x68,0xf7,0x5,0x8a, +0x16,0xe1,0xd4,0x85,0xeb,0x92,0x69,0x22,0xf5,0xa,0xa0,0x7c,0xbe,0xd6,0xff,0xbc, +0x12,0xf,0x85,0x12,0xd3,0x25,0x19,0xe,0xc8,0x13,0x61,0xde,0x5d,0xa3,0x3,0xa3, +0xab,0xd,0xcb,0x81,0xe2,0xb7,0xbe,0xc0,0xb,0xb1,0x73,0x6,0x3e,0x78,0x9e,0xa5, +0xfa,0xbc,0x17,0x53,0x7,0xc6,0x1,0xcb,0x81,0x8e,0x10,0x34,0x83,0x1,0x27,0x9a, +0x1d,0x4a,0x60,0xa2,0x0,0x5d,0x21,0xd9,0x6,0x3,0x5a,0x35,0xc0,0x24,0xf3,0x64, +0xd2,0xe2,0xc9,0xb0,0xb7,0xb4,0xa,0x8c,0x33,0x4f,0x26,0x7d,0x1a,0x1d,0x16,0xa8, +0x46,0x8b,0x9a,0x2b,0x94,0x55,0xe1,0x1,0x67,0x69,0x15,0x98,0x47,0xfc,0xc1,0x81, +0x95,0xb2,0xc9,0xf,0x1,0x28,0x7f,0xb7,0x87,0x73,0x6d,0x9b,0x49,0xd8,0x0,0xb4, +0x45,0x8e,0xd7,0x1f,0x58,0x75,0xde,0xcb,0x49,0xb0,0x4f,0x60,0x35,0x3c,0xcd,0x26, +0x7e,0xd9,0x79,0x2b,0x40,0x57,0xe4,0xe9,0x3,0x1,0x79,0x0,0x9e,0x7f,0x76,0x77, +0x40,0xa1,0xf,0xa7,0x77,0x7,0x14,0xfa,0xb0,0x11,0x98,0xb9,0x9e,0x61,0x80,0x42, +0xae,0x69,0x40,0x77,0x60,0x60,0x4d,0x22,0xac,0xc9,0x35,0x9e,0xb5,0xed,0x19,0xa8, +0x55,0x31,0x78,0x22,0x5c,0x7,0xec,0xf8,0x72,0x1b,0x80,0x7a,0x5e,0xea,0xe,0x3, +0xb4,0x1b,0x80,0x5a,0x25,0x6a,0xa8,0x31,0xdc,0x64,0xc0,0x1a,0x41,0xaa,0xd5,0xda, +0xbe,0x99,0xe,0x7,0xe4,0xbf,0xd6,0x0,0x1b,0xaa,0x89,0x3,0x0,0x6b,0x8a,0xa, +0xa6,0x40,0x5c,0x42,0xe1,0x67,0xdc,0xfb,0xfc,0x14,0x8,0x6a,0x61,0xe9,0xf,0x3f, +0x91,0x3f,0xc8,0x18,0x97,0x54,0x59,0xe4,0x88,0x16,0x88,0x89,0x97,0x3,0x6b,0xca, +0x26,0xcd,0xc0,0xc2,0xd3,0xe0,0x3d,0xb1,0x3c,0x5e,0x5a,0xc2,0x87,0xc7,0x10,0x80, +0xe2,0x68,0xc4,0x16,0x16,0xc8,0x70,0xbf,0x39,0x80,0x6c,0xd1,0xe4,0x61,0xb9,0x8, +0x8c,0xc2,0x4d,0x6d,0x25,0xca,0x10,0x48,0xe1,0x93,0x28,0xfc,0x55,0xec,0x10,0xf3, +0xf8,0x22,0x1c,0xfe,0xd8,0xe0,0x1e,0x61,0x80,0xb0,0x48,0x86,0x5f,0xcf,0xdb,0x58, +0x52,0xcb,0xc9,0x27,0x4d,0x76,0xdc,0x4,0xae,0xe2,0xd4,0xae,0xae,0x6d,0x5,0x12, +0x7e,0xf6,0xa2,0xc3,0x7,0x5,0x9b,0x8c,0x63,0xbe,0x17,0xce,0xc3,0x7e,0xe,0x86, +0xa9,0x16,0xe4,0x6,0xf2,0xf1,0xc3,0xb8,0xbf,0x91,0x1f,0x62,0xc0,0x6f,0xac,0xec, +0xf2,0xc2,0xf6,0xd1,0xda,0xd5,0xb5,0xe9,0xb6,0x78,0x8,0x99,0x15,0xc0,0x6c,0x3e, +0xed,0xf0,0x91,0xe,0x11,0x40,0x71,0xea,0x59,0xfc,0xc,0x65,0x3f,0x15,0xf,0x57, +0xe,0xf0,0x11,0x74,0xf0,0xa5,0x62,0xf4,0x4,0x50,0x6c,0x76,0x76,0xd8,0x6d,0xed, +0xea,0xda,0x56,0x20,0xd6,0x3e,0xf1,0x9d,0x3d,0xb4,0x2,0x2d,0x19,0xde,0xd8,0x93, +0x3,0x20,0x8f,0x8a,0xe7,0x3e,0xa0,0x10,0x81,0x91,0xb2,0x9e,0xf2,0xfd,0x16,0x2, +0x18,0x7b,0x19,0x70,0xeb,0xea,0x5a,0x5d,0x4e,0x13,0x79,0x90,0xa4,0xfb,0x56,0x30, +0x39,0xb1,0x42,0xeb,0xc4,0x4a,0xad,0xb1,0xd,0x79,0x83,0x4d,0x6d,0xe2,0x10,0x3b, +0x71,0x89,0x13,0xbb,0x89,0x1b,0x79,0xb1,0x17,0xe1,0x43,0x43,0x1e,0xf3,0x1d,0x25, +0x2,0xb8,0x58,0x8,0xe0,0x72,0xfb,0xea,0x5a,0x5d,0xd6,0x6,0x9f,0x13,0x44,0x1, +0x1e,0x9d,0xb,0x40,0x6,0x40,0x5c,0x3f,0xa4,0x36,0x6e,0x8,0x1,0xa4,0x4b,0x0, +0x97,0x0,0x2e,0xf6,0xf1,0x79,0x62,0xd1,0x63,0xbe,0x67,0x46,0x0,0xaf,0xd7,0x2, +0x38,0xdb,0xbe,0xba,0x56,0xb,0xc,0xe2,0x20,0xa,0x1,0x9,0xd3,0x1d,0x8c,0x32, +0xb5,0x99,0xd,0xa9,0x98,0x4d,0xdd,0x14,0x70,0xd4,0x25,0x1e,0x20,0x7d,0xe2,0xc5, +0x41,0x2,0x3f,0x59,0xfc,0x98,0xef,0xa,0x92,0x93,0x46,0x2,0xbf,0x68,0x5f,0xb7, +0xf8,0x5e,0x80,0x99,0xb6,0x88,0xc2,0x24,0x80,0xcf,0x8,0xce,0x61,0x70,0x60,0x8e, +0x42,0x9a,0x79,0xe,0xd9,0xad,0xd,0x72,0xd6,0x21,0x5e,0xea,0x12,0x9f,0xba,0x9, +0x88,0xdb,0x38,0x24,0x3e,0x7c,0xe9,0x63,0xde,0xa4,0xaf,0x3,0x6f,0xdb,0x97,0x82, +0x54,0xf5,0xb4,0x3,0xf0,0x5a,0x5,0x4e,0xda,0x80,0x99,0x3e,0x1c,0xa,0x68,0xb5, +0x1,0x33,0x5,0xbc,0x3,0xf0,0x4a,0xbb,0xa5,0xac,0x5,0x98,0x69,0xfc,0xfe,0x40, +0xfe,0x10,0xe9,0xe,0x40,0x59,0xc5,0xe8,0x3f,0x4b,0x79,0x45,0x44,0x0,0x71,0x96, +0xb6,0x2,0x65,0x92,0xd2,0xdf,0xf0,0x6f,0x58,0xe,0xac,0x74,0x41,0x37,0x1,0x7b, +0xbb,0xb6,0x75,0x1,0xac,0xf4,0x79,0x97,0x80,0x4a,0xad,0xad,0xb7,0xf3,0xc6,0xc7, +0x23,0x89,0xd5,0x4d,0xe9,0xbc,0x9b,0x80,0x4a,0x35,0xf1,0xe7,0x7d,0xc3,0x93,0xa, +0xc,0x2a,0x9b,0x3,0x4a,0x40,0xa5,0x5e,0xfa,0x66,0xcf,0x0,0xac,0xa7,0x18,0x95, +0xed,0xf,0x25,0xa0,0x52,0x11,0x7e,0xb7,0x67,0x8a,0xa1,0x3,0x31,0xc5,0x68,0x2, +0x2a,0x35,0xef,0x8f,0x7b,0x26,0x51,0x7a,0xd6,0x86,0x49,0x54,0x13,0x50,0xa9,0xea, +0xdf,0xf6,0x4e,0x13,0xdf,0x17,0xc0,0xd7,0xb2,0x34,0xb1,0x11,0x58,0xac,0x5b,0xdc, +0xf6,0x4c,0x84,0x75,0x20,0x63,0x2d,0xc0,0x62,0x65,0xa6,0x2f,0x50,0x1f,0xc3,0x2a, +0x50,0xec,0xa3,0xcb,0x2a,0xdc,0xca,0xda,0x13,0xe9,0xae,0x9e,0x4,0xf0,0x44,0x2, +0xa9,0x11,0xb0,0x58,0x5d,0xeb,0xb,0x64,0xf,0xc4,0x2,0x4,0x19,0x85,0x26,0xc0, +0x1d,0xd6,0xf,0xb,0xd1,0x96,0xf7,0x51,0xd4,0x1,0x37,0xfc,0x58,0x12,0x7f,0xb1, +0xfb,0xa,0x69,0x6,0x8c,0xd4,0xcc,0xbb,0x15,0xb8,0xc3,0x1a,0x70,0x6,0x94,0xa7, +0xd,0xd0,0xa9,0x11,0x70,0x87,0x55,0xee,0xc,0x28,0x77,0x39,0x53,0x66,0x6,0xec, +0xdf,0x38,0xf0,0x63,0x1,0x1a,0xf6,0x62,0xd0,0x70,0x28,0xa0,0x61,0xb7,0xc9,0x70, +0x40,0xc3,0x7e,0x9a,0xe1,0x80,0x86,0x1d,0x43,0xd,0x40,0xad,0x81,0xa7,0x1d,0x68, +0xd8,0x13,0x35,0x1c,0x30,0x35,0x31,0xc3,0x74,0xdb,0x4f,0x54,0xde,0x91,0x60,0x0, +0x64,0x26,0x8b,0x87,0x83,0x2,0x27,0x6,0x66,0x38,0x28,0x30,0x32,0x31,0x43,0x87, +0xe,0x4,0xb4,0xf6,0xf0,0xa,0x9a,0x80,0xa6,0xaf,0x88,0x76,0x8e,0x26,0xbb,0x1, +0x93,0xbb,0x6,0x92,0xbb,0x6,0xf6,0x78,0xfd,0x90,0x81,0xdc,0x48,0xa6,0xba,0xcb, +0xc2,0xef,0x22,0x4a,0x42,0x3b,0x24,0x30,0xad,0x1,0x7a,0x64,0xf,0x40,0x4c,0xa1, +0xe9,0x7d,0x9f,0x2b,0x28,0x4,0xf2,0xe3,0x2,0x21,0x6c,0x45,0x11,0x4b,0xdd,0xbd, +0x1,0x7f,0x6,0xaa,0xc9,0x65,0x3a,0x70,0x2,0x9e,0x26,0x61,0xc3,0x3,0x9,0xd7, +0x86,0xa0,0xb,0xdf,0x97,0x40,0xf4,0x19,0x3e,0xe3,0xda,0xf0,0x7c,0xb9,0x7,0x60, +0xf2,0x74,0xce,0x92,0xe8,0x92,0xc5,0xb,0x1,0x7c,0xf9,0xd0,0xe7,0xea,0xf7,0xfe, +0xeb,0x1,0x8b,0xe6,0xfc,0x94,0x36,0xda,0x21,0x9d,0xac,0x4f,0xf5,0x35,0xe0,0x66, +0xc5,0x36,0xcb,0x5,0x5b,0x66,0xc0,0x40,0x0,0x1f,0x3e,0x0,0x61,0xea,0xee,0xb, +0xb8,0x5a,0x14,0x57,0x98,0x1,0x4f,0x2,0xdc,0x41,0xb4,0x3f,0x60,0x36,0x86,0x8, +0x9c,0xc1,0x18,0x22,0x10,0xf,0xdb,0x70,0x9,0x9a,0x47,0x67,0xa0,0x2e,0x48,0x7f, +0x10,0xc0,0xcc,0x2c,0x5e,0xfa,0x3e,0xdf,0x88,0x8a,0x40,0x5c,0x8d,0xbf,0x20,0x1c, +0x3a,0x3c,0x10,0xd,0x1f,0xeb,0x33,0xb,0x0,0xe2,0x8a,0x84,0x9f,0x6,0x3c,0xc5, +0x98,0x11,0x1,0x1d,0xe,0xf8,0x1b,0x30,0x8b,0xd9,0x25,0x77,0x6d,0x1c,0x8,0x66, +0x41,0x0,0xe8,0x51,0x1,0x5c,0xc2,0x37,0xcd,0x7,0x5,0xda,0x17,0x30,0xa5,0xc4, +0xd1,0x4f,0x8,0x8c,0xd0,0xcd,0xf1,0xb1,0x13,0xc0,0xd,0x7c,0xd3,0x6a,0x48,0x20, +0x71,0x2e,0xb9,0xa7,0xc9,0xd3,0x8a,0xfb,0x1,0x3f,0x74,0xe1,0x92,0x34,0x7,0xdf, +0xdb,0xe4,0xc3,0x15,0x63,0xe7,0xab,0x97,0x4e,0x47,0x20,0x75,0xa7,0xdc,0x79,0x17, +0x40,0xe1,0x4b,0x17,0x2d,0x57,0x75,0x1b,0xbf,0xbd,0x86,0x8f,0x5f,0xbd,0xb4,0x3a, +0x2,0x7b,0xbe,0xd6,0xcb,0xf5,0x3b,0x0,0x3c,0xfa,0xcd,0xcb,0x71,0xd8,0xf,0x88, +0x75,0xb6,0x4d,0xaa,0xab,0x9b,0xcb,0xd,0x3e,0xf2,0x1b,0xcf,0x4a,0x15,0xe1,0x52, +0xb9,0xf3,0xeb,0xd9,0xfa,0x31,0x4c,0xed,0x71,0xdc,0x1b,0x88,0x95,0xc4,0x65,0xaa, +0xeb,0x37,0x37,0x81,0xe1,0xc4,0x63,0x1a,0xf0,0x11,0xdc,0x8e,0x8c,0xd1,0x12,0xf8, +0xbf,0xd9,0xe3,0x6b,0x10,0x6b,0x7f,0x78,0x79,0xd6,0x19,0x88,0xc7,0x1,0x2e,0x78, +0xad,0x74,0xc6,0xfb,0x6e,0x7c,0x26,0x8e,0xea,0x8,0x52,0x37,0x9,0x53,0x2f,0x82, +0x49,0x3b,0x41,0x7d,0xc7,0xeb,0xb8,0x79,0x42,0x72,0x9b,0xbe,0xcb,0x81,0xff,0xbc, +0x2f,0x70,0xc9,0x5c,0x36,0x67,0x3a,0x10,0x53,0x8c,0x8b,0xb,0xb8,0x52,0x7,0x26, +0x73,0x2,0xc1,0x63,0xa9,0x0,0xe9,0xc7,0x30,0xdb,0x92,0xbf,0xee,0xd,0x5c,0xc1, +0x7b,0xc1,0xbf,0xac,0x0,0x62,0x12,0x35,0x83,0xdb,0xf8,0xef,0x21,0x46,0x9f,0x13, +0x96,0xcc,0xb,0x61,0xb8,0xbe,0x25,0xe4,0xa,0x80,0x1f,0xdd,0x1b,0x1a,0x88,0x6e, +0x2e,0x86,0x48,0x15,0x1,0x70,0xa9,0x2,0x37,0x14,0x80,0xe3,0xe1,0x81,0xd8,0xc4, +0x99,0xc0,0x6f,0xf1,0x29,0x4b,0x12,0x15,0xb8,0x2,0x7f,0x94,0x1e,0x7f,0xf4,0x49, +0xd7,0x59,0x9a,0xf0,0x2,0xbb,0x9b,0x3,0xb1,0x67,0x44,0x16,0xd8,0x39,0x10,0x23, +0x47,0x4,0x57,0x98,0x1c,0xb1,0x4,0xf,0x5d,0x2d,0xc,0xff,0x18,0x1f,0x2b,0xb6, +0xfe,0xa4,0xab,0xe1,0xb7,0x1,0xb3,0x31,0xa4,0x6f,0xb0,0x64,0xfc,0x4b,0x5,0x18, +0x41,0xfc,0x62,0xe7,0xeb,0xce,0xae,0x4d,0x5,0xe2,0x2c,0x55,0x81,0xea,0x2c,0x3d, +0x3,0xb3,0x38,0xb1,0x7,0x70,0xde,0xd4,0x5f,0x81,0x65,0x2f,0xe4,0x9a,0x5,0xc4, +0x42,0x18,0x43,0x74,0x0,0xf3,0x34,0xe0,0xcb,0x7,0x1e,0x18,0xbd,0x1f,0xf1,0x43, +0x91,0xa9,0x41,0xa9,0xcc,0x60,0xd2,0xb8,0x2b,0xf8,0x54,0x1,0xc4,0x2,0x36,0x81, +0x14,0x23,0x39,0x83,0xa8,0xf,0xc0,0x89,0x9d,0x7b,0x9a,0xb4,0xe4,0x69,0x76,0x0, +0x5e,0xc2,0x2c,0x55,0x80,0x14,0x80,0x4,0x80,0x89,0x4,0x6e,0xf1,0xa5,0x3b,0x0, +0x17,0x0,0x9c,0x2e,0x14,0xc9,0x4,0x1,0x18,0x80,0x24,0xed,0x55,0x2d,0xde,0x5b, +0x78,0xda,0x1d,0x48,0x20,0x91,0xd9,0xe8,0xc7,0x3b,0xa3,0x59,0xf0,0xeb,0xb4,0x8, +0xc3,0xff,0x92,0x72,0xcd,0xeb,0x47,0x6,0x4,0xa7,0xb9,0x49,0x82,0xb2,0x20,0x15, +0xc0,0x53,0x46,0x42,0x88,0x16,0xe1,0x72,0x0,0x60,0x92,0x55,0xe9,0x63,0x8,0xc0, +0xe0,0xc7,0x16,0xf2,0x8b,0xd1,0x9b,0xba,0x31,0x7,0xa6,0xd6,0x5b,0x90,0x39,0x46, +0xe0,0xc7,0xcf,0x87,0x0,0x86,0x2,0xba,0x4,0x1f,0x36,0x9f,0x79,0xfc,0x8,0x6b, +0x3c,0x8b,0x1c,0x2d,0xe0,0x7c,0xc6,0x4b,0x93,0xf4,0x18,0xcc,0xc3,0xbb,0x80,0xf7, +0x10,0x76,0x98,0x88,0x68,0xc0,0x56,0x73,0xf0,0xa5,0xf3,0x29,0x3f,0x6e,0x19,0x37, +0x4e,0xe0,0x67,0x47,0x17,0x2,0x78,0xe6,0x8,0x21,0x34,0x88,0x1d,0xe2,0xa6,0x5, +0x4c,0x7c,0x57,0xb,0x0,0x2e,0xa6,0x1c,0x8e,0xd,0xce,0x8,0xce,0xe4,0x5a,0x8, +0xb0,0x48,0x44,0x8d,0x21,0x5c,0x9b,0x68,0x21,0xce,0x80,0x32,0xfe,0x71,0x28,0x46, +0x3c,0xe,0x14,0x41,0x38,0xdb,0xec,0xbe,0x23,0x50,0xde,0xc3,0xc,0x98,0xca,0x2b, +0xe6,0x60,0xaf,0x0,0x76,0xbb,0x42,0xc2,0xab,0xbf,0x51,0x6d,0x19,0x5f,0xde,0xbf, +0xc,0x98,0x5d,0x31,0xde,0xea,0x6c,0xc,0x11,0xd8,0x6d,0xc,0x13,0x5e,0xdf,0x9e, +0xd4,0x2e,0x54,0xc8,0xfb,0xb7,0xbc,0x84,0x59,0xea,0x7a,0xf9,0x8c,0xc1,0xf3,0x2c, +0xb2,0x59,0xa,0xc0,0x8e,0xb3,0xb4,0xe9,0xa,0xe5,0xfd,0x8b,0xef,0x81,0x7a,0xba, +0xe7,0x15,0x33,0xe6,0x9c,0xf1,0xbc,0x34,0xe0,0x9d,0x45,0xdd,0xed,0xb0,0xe1,0x4b, +0xc4,0xa0,0x25,0xf,0x3c,0x16,0xe3,0xb2,0x67,0x36,0x63,0xa2,0xdc,0xd3,0x70,0x60, +0x57,0x4f,0xd3,0xf0,0x12,0xf7,0x90,0x80,0x10,0x4d,0x1e,0x6,0xf2,0x8a,0xf9,0x55, +0x67,0xbe,0x94,0x3,0x3b,0xfa,0xd2,0x48,0x34,0x5d,0xd5,0xa6,0x8,0x99,0x6f,0xc9, +0xbe,0xc5,0x17,0x50,0xba,0x53,0x3c,0x9c,0x88,0xa6,0x2b,0x7b,0x7b,0x5e,0x5a,0xbc, +0xf2,0xbc,0x74,0x17,0x60,0xd3,0x15,0xee,0x27,0x0,0xb7,0xbe,0xca,0xd7,0x29,0xd7, +0x94,0x84,0x59,0x48,0x9f,0x61,0x6f,0x6,0x4,0x2e,0x59,0xe9,0x61,0x7,0x62,0xfe, +0xa6,0x72,0x34,0xc5,0x63,0x79,0xcc,0x67,0x29,0x3f,0x96,0xa6,0xd6,0x17,0x52,0xb0, +0x3d,0x8a,0x59,0x5b,0x28,0xe,0xcb,0x41,0x13,0x9c,0x82,0x59,0x3c,0xb4,0xc4,0x89, +0x59,0xae,0x70,0x3a,0x84,0xbb,0xf,0xf3,0x44,0x98,0x9f,0x93,0x5a,0xeb,0xb,0x79, +0xbd,0xd4,0x5d,0x8,0xdf,0x19,0x8,0xe8,0x34,0xa,0xd9,0x21,0xd6,0x4b,0x8b,0x50, +0xc5,0x81,0x63,0x67,0x80,0x2b,0xe4,0xa9,0xbe,0xb3,0x10,0x97,0xe1,0x89,0x86,0x80, +0x4b,0x98,0xd3,0x7,0x30,0xcd,0x22,0x79,0xd5,0xe7,0x12,0x98,0xba,0x3,0x8c,0x61, +0xf2,0x4,0x2b,0x51,0x8b,0xdc,0x7f,0xe2,0x5d,0x58,0xdc,0x7,0xe0,0x38,0x50,0x43, +0x15,0x97,0xdc,0xa9,0x37,0x4,0x10,0x6b,0x6d,0x58,0x2c,0x9d,0x89,0x1,0x7c,0x89, +0x35,0x1a,0xf0,0x3a,0x7,0x69,0xa0,0x86,0x2a,0x1,0xf4,0x87,0x2,0x62,0xed,0x52, +0x46,0xd8,0x5,0x3e,0x9a,0x43,0x2,0x59,0x36,0x6b,0x5c,0x9,0xc,0x7e,0xb4,0x40, +0x2c,0x96,0xa,0x87,0xcd,0x16,0xe0,0x56,0x97,0x19,0x30,0xcb,0xa8,0x1c,0x39,0x69, +0x6,0x3,0x52,0x71,0x19,0x38,0x55,0x17,0x60,0xfd,0x31,0x2,0xcf,0x64,0x12,0xc3, +0x8f,0xed,0xed,0x6c,0x87,0xd,0xc0,0x70,0x2e,0xe7,0xbb,0xcb,0xb3,0xd1,0x5,0x4e, +0xc9,0x43,0x9f,0x1d,0x8e,0x3,0x7e,0x9a,0x1c,0x4f,0x5a,0xe3,0x21,0x81,0xc1,0x5, +0x40,0x5d,0xe9,0x49,0xa7,0x6c,0x91,0xe0,0xb2,0x10,0x48,0xee,0x23,0xc5,0x8b,0x92, +0x1,0x81,0x24,0xb8,0x84,0xb,0x29,0xe2,0xe1,0x82,0x60,0x6e,0x18,0x2,0x30,0xdc, +0x4f,0xb4,0xa0,0xc1,0x14,0x2e,0xa4,0x88,0x13,0xb,0x34,0x3c,0x6c,0xf,0x3c,0xda, +0x73,0x78,0xba,0xf3,0x78,0x18,0xf3,0xdb,0xa9,0xcf,0xfb,0x89,0x1c,0x43,0x4b,0x9a, +0xc5,0xb0,0x40,0xf8,0xec,0x45,0x52,0x2,0x8e,0xb,0x60,0x58,0x7a,0x54,0xcf,0x8e, +0x63,0xe8,0x73,0x47,0x33,0x7,0x7d,0x28,0x3a,0x2f,0x19,0xef,0xbc,0xb4,0x4,0x10, +0x5b,0x3d,0xd1,0x2d,0x24,0xfe,0xa0,0x40,0x54,0x50,0x33,0x4f,0x5,0xa6,0xf7,0x8f, +0x39,0x90,0x3a,0xb1,0x88,0xfe,0x1e,0x1b,0xcc,0x2c,0x3c,0xf6,0x7b,0x54,0x50,0xa0, +0xf,0x71,0x7f,0x56,0xc4,0x1b,0x59,0xc3,0xf4,0xe4,0x50,0x0,0xff,0x92,0x88,0x83, +0xde,0x1c,0x36,0x94,0xa7,0x81,0xbc,0x14,0x1f,0x86,0xb7,0x4,0x31,0x83,0x5b,0xde, +0x2e,0xc1,0x34,0x70,0x65,0x26,0xb8,0x1f,0x72,0xf5,0xf4,0x84,0x14,0xe9,0xc7,0xee, +0x40,0xc8,0xd7,0x36,0x58,0x2f,0x5,0x27,0x9d,0x0,0x10,0x37,0xf5,0x4d,0x1,0x8a, +0x6b,0x4f,0xc1,0x6f,0x5,0x70,0x74,0xda,0x5d,0x1f,0xb6,0x3,0xe1,0xc7,0x4f,0xdc, +0x12,0x30,0x12,0xc0,0xd3,0xa3,0x42,0x33,0xe,0x7,0x44,0xa7,0x5d,0x6,0xc2,0x25, +0xb9,0x30,0x86,0xe3,0x83,0x22,0x7d,0x1b,0xe,0x98,0xe0,0x99,0xce,0x9e,0x6,0xf4, +0xc0,0xf2,0x2e,0x0,0x78,0x62,0x29,0x95,0x86,0xc1,0x80,0x44,0x74,0x43,0xab,0x40, +0x6c,0x1c,0x98,0x11,0xb9,0x6,0x2c,0xd3,0xb7,0xe1,0x66,0x29,0x6,0x60,0xcb,0x57, +0x81,0xc,0x81,0x4b,0x61,0xf8,0xb2,0x98,0x33,0x84,0x1d,0xca,0xc6,0x81,0x95,0xcc, +0x11,0x95,0x12,0x34,0x98,0x87,0x58,0x3f,0xe4,0x22,0x88,0x30,0xc6,0x86,0xd0,0x16, +0xbc,0x35,0x42,0x91,0xe2,0x2a,0x70,0x3f,0xf1,0xf0,0xae,0x81,0xdf,0x5b,0x3c,0xfc, +0x1e,0x80,0x59,0xe1,0x52,0xbd,0xdf,0x79,0x12,0xc5,0x8b,0xec,0xf7,0xbc,0xbb,0x3, +0xd2,0xae,0xcb,0x8,0xdb,0x27,0x8d,0x9d,0xa9,0x47,0x1,0xc4,0xe7,0xc,0xc6,0x59, +0x5d,0x4d,0x49,0x13,0x4b,0xb,0x96,0xbb,0xd8,0x21,0x63,0xfc,0x29,0x1b,0x12,0x18, +0xbb,0xfc,0xe1,0x4a,0xe2,0xfc,0x51,0x5,0x38,0x4a,0x40,0xd9,0xd,0x61,0xf8,0x89, +0xdc,0xd0,0x91,0x1,0xf9,0x86,0xe,0x47,0x1a,0xbb,0x2,0x4c,0x8,0xa8,0x82,0x21, +0xc,0x3f,0x81,0x94,0x3e,0x21,0x21,0x5f,0x99,0xc1,0x4e,0x85,0x39,0x5c,0xc5,0x25, +0xe8,0xb,0x2c,0xe6,0x89,0xfd,0x32,0xa2,0x12,0x35,0x1c,0x10,0x7c,0x26,0x36,0x30, +0x65,0xc0,0x5,0x7c,0xe8,0x74,0xc5,0x98,0x3f,0xff,0xa9,0x1,0x9,0xa4,0xfb,0x9, +0x8a,0x99,0x2,0xc8,0x2e,0xe0,0xff,0x5f,0xc2,0x18,0x7a,0x30,0x86,0x4f,0x6,0x9b, +0x34,0x12,0x48,0xfd,0x5,0x24,0x9f,0x3a,0x10,0xfb,0x4b,0x65,0x3f,0xd,0xb1,0xa2, +0xa1,0xe4,0x9a,0x4,0xa6,0x0,0xa4,0x25,0x20,0xf6,0x97,0xca,0x7e,0x1a,0x6a,0xcf, +0x7,0x32,0xfc,0x6c,0x49,0x16,0x9b,0xde,0x52,0x5f,0x5b,0x3,0xe6,0xfd,0xa5,0xb2, +0x9f,0x26,0x75,0x16,0x3,0xb9,0xb6,0x1c,0x78,0x57,0xe1,0xe9,0xce,0x81,0x3f,0xe4, +0x7a,0xe9,0xb0,0xfa,0xb0,0xad,0x5e,0x3a,0x98,0x3e,0x54,0x15,0x70,0x49,0xac,0xa4, +0x2e,0x2b,0xca,0x6d,0x83,0xe9,0xc3,0x42,0xb6,0x15,0x7,0x57,0x65,0x2f,0xa5,0x5e, +0x3a,0x9c,0x3e,0xcc,0x3,0xb1,0x5f,0x9c,0xa4,0x9c,0xcf,0x58,0x56,0x54,0xbf,0x6, +0xd3,0x87,0xf9,0xcb,0xcd,0xca,0xb8,0xa5,0xab,0xe,0xb3,0x85,0x9a,0x81,0xf4,0x61, +0xfe,0xba,0xa8,0x5e,0x42,0xbe,0xac,0x17,0xe,0xa8,0xf,0xf3,0xd7,0xac,0x66,0xd6, +0x28,0x6b,0x89,0x83,0xe9,0xc3,0xef,0xf,0x98,0xad,0x3e,0x97,0x6f,0xb3,0x1c,0xdb, +0xc1,0x4,0x69,0x31,0x43,0x6a,0x2e,0x61,0xa6,0x8c,0xed,0x50,0x82,0xb4,0x62,0xe6, +0xba,0x78,0x2c,0xa6,0xe8,0x50,0x82,0x54,0xb3,0xb,0x56,0x2,0x16,0x5,0xda,0xe1, +0x4,0xa9,0x61,0xaa,0x3f,0x9c,0x20,0xfd,0xff,0x49,0xae,0x7d,0xf,0xfa,0xb0,0x7c, +0x38,0x3a,0x46,0xdf,0x73,0x30,0x7,0x47,0x8e,0xa1,0x35,0xb4,0x3e,0x2c,0x1f,0xff, +0x8e,0x40,0xdc,0x16,0x6f,0x2b,0xa2,0x74,0x50,0x60,0xe9,0x80,0xfb,0x22,0xd5,0x17, +0xc0,0x61,0x12,0x61,0xd,0xe8,0x57,0x81,0x7,0x8f,0x18,0x7d,0x74,0x2a,0x80,0xce, +0xd0,0x76,0xf8,0xd2,0x9b,0x56,0x80,0xc7,0xa7,0xa2,0x9a,0x88,0xc0,0xd9,0x90,0x76, +0x88,0xea,0x69,0xe1,0xea,0x86,0xff,0x5a,0xc0,0x38,0x70,0x7c,0x20,0x24,0x77,0x3c, +0x38,0x70,0xae,0x3,0x27,0x12,0x78,0x66,0x9,0x60,0xf2,0x74,0x68,0xe0,0x52,0x7, +0x46,0x12,0x18,0x4a,0x20,0x79,0x3c,0x64,0xd6,0x6,0xfa,0x70,0x9e,0x78,0xe5,0x10, +0x29,0xba,0x2f,0x27,0xf0,0x3b,0x8c,0xe1,0x78,0xc8,0x59,0x8a,0xfa,0xb0,0xfc,0xdc, +0x7,0x12,0xe4,0xfd,0xa5,0x68,0xfc,0xc3,0x9a,0x5,0xea,0xc3,0xb2,0xe1,0x63,0xca, +0xed,0x2d,0xe1,0x9f,0x62,0x2e,0x4a,0x7,0x36,0x7c,0xbf,0xde,0xb5,0x71,0x71,0x2a, +0x37,0x79,0xc,0xec,0xda,0x5e,0x85,0xa7,0x81,0x81,0x24,0xad,0xee,0xb7,0x98,0x14, +0x65,0xb0,0xce,0x3d,0xc2,0x3f,0x42,0xa0,0x33,0xb0,0x59,0x60,0x2b,0x49,0x79,0x47, +0x9,0x3f,0xdb,0xc9,0xe6,0xeb,0x16,0x9d,0x1b,0xcb,0xd,0x24,0x77,0xb6,0xc1,0x43, +0x91,0x16,0x24,0xcc,0x1a,0xcb,0x49,0x18,0x83,0xa7,0x9b,0xd,0x8,0x2c,0xb6,0x3f, +0x28,0x76,0x8f,0x8d,0x74,0xa2,0xb1,0x1c,0xdb,0xe8,0x86,0xea,0xdc,0x33,0x4,0x76, +0xec,0x82,0x7e,0x5,0xbc,0x7b,0x60,0xdd,0x2c,0xdd,0x2b,0x10,0x77,0x76,0x95,0xe2, +0xa1,0x56,0x82,0x1e,0x6c,0xdd,0x22,0xf7,0x34,0xb8,0x9b,0x44,0x8f,0x87,0x3f,0x31, +0xe0,0xab,0x0,0x3c,0x7c,0x0,0x76,0xb1,0x53,0x81,0x95,0x33,0x6f,0x7e,0x4e,0xa9, +0x25,0x3f,0xc8,0x1e,0x12,0x98,0x38,0xe2,0x20,0x31,0x2d,0x3c,0x81,0x95,0xe0,0xd1, +0x5a,0x56,0xc8,0xcf,0x1c,0x33,0xf9,0xb0,0x2e,0xa9,0xbe,0x68,0xda,0xd1,0xbe,0x39, +0x3b,0x59,0xcd,0xaf,0x9b,0xc4,0xbb,0x7a,0x9a,0x4,0x72,0xcf,0xa4,0x54,0x6a,0xbb, +0x84,0x24,0x18,0x80,0x27,0x72,0x2b,0xd4,0x78,0x48,0x20,0x6e,0x2e,0x2e,0x6d,0xc5, +0x4d,0x83,0x5,0xbc,0x45,0x43,0x11,0x61,0xfe,0x40,0xbd,0x89,0xaf,0x80,0xaf,0x80, +0x3b,0x49,0xee,0xad,0x75,0x9a,0x7d,0x44,0x8b,0x9f,0x3e,0xf0,0x55,0x3c,0x7c,0x5, +0x7c,0x5,0x7c,0x5,0x7c,0x5,0x7c,0x5,0x7c,0x5,0x7c,0x5,0x7c,0x5,0x2c,0x80, +0x7f,0xf,0x8f,0x5b,0x9c,0x1e,0xf,0x3e,0xf1,0xfb,0x0,0x0,0x0,0x0,0x49,0x45, +0x4e,0x44,0xae,0x42,0x60,0x82 +}; +//brd_wiznet.png: 13702 bytes + +/* +const char m1284p_png[] PROGMEM = { +0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa,0x0,0x0,0x0,0xd,0x49,0x48,0x44,0x52, +0x0,0x0,0x4,0xf8,0x0,0x0,0x3,0x3b,0x1,0x3,0x0,0x0,0x0,0xed,0x52,0xbc, +0x4d,0x0,0x0,0x0,0x6,0x50,0x4c,0x54,0x45,0x0,0x0,0x0,0xff,0xff,0xff,0xa5, +0xd9,0x9f,0xdd,0x0,0x0,0x0,0x9,0x70,0x48,0x59,0x73,0x0,0x0,0x12,0x74,0x0, +0x0,0x12,0x74,0x1,0xde,0x66,0x1f,0x78,0x0,0x0,0x20,0x0,0x49,0x44,0x41,0x54, +0x78,0xda,0xed,0xdd,0x5f,0x8c,0x23,0xc7,0x9d,0x1f,0xf0,0x59,0x4f,0x20,0x26,0xb0, +0xb5,0xf4,0x21,0x2f,0x6,0xbc,0xbb,0xf4,0xc5,0x4f,0x79,0x73,0x5e,0x6e,0x25,0x68, +0xb5,0xb4,0x90,0x7,0x3f,0xfa,0xf1,0x2,0x8,0xd2,0x2a,0x2f,0xf9,0x3,0x45,0x4b, +0x19,0x86,0x96,0xbb,0xe2,0x72,0x7a,0xd6,0x3,0x64,0x1e,0x12,0xdc,0xdc,0x21,0x2f, +0x39,0x48,0xde,0x31,0x70,0x7,0xf8,0xe1,0x60,0xad,0x2,0x45,0xa2,0x6c,0x2e,0xa7, +0x39,0x98,0xb3,0x6,0xc1,0x59,0xe2,0x19,0x4e,0x30,0xb6,0x29,0xb2,0x38,0x37,0x97, +0xa3,0x90,0x11,0xbb,0x38,0x1e,0x2f,0xab,0x67,0x8a,0x5d,0x95,0xfe,0x57,0xfd,0xb7, +0xba,0xd9,0xff,0x48,0xb6,0x70,0x43,0xdc,0x59,0xda,0x9d,0xdd,0x99,0x8f,0xaa,0xbb, +0xab,0xbe,0xfd,0xab,0xea,0xea,0x15,0x9a,0xef,0xcf,0xca,0x85,0xef,0xc2,0xe7,0xfe, +0xf4,0x4b,0xc5,0x5c,0xfb,0x7a,0x12,0xca,0xb5,0xaf,0x3b,0xc9,0xb9,0x8f,0x5e,0xf8, +0xd2,0xf9,0x60,0xce,0x7d,0x60,0x91,0xbe,0xc1,0x5a,0x71,0x73,0x73,0x73,0x5a,0xda, +0x23,0xd7,0xae,0x14,0x89,0x2c,0xcc,0xf6,0x21,0x71,0x91,0x3e,0xd8,0x42,0xb5,0x5a, +0x4d,0xa1,0x2d,0x65,0x34,0x42,0xd3,0x8,0x3f,0xbb,0x7,0x85,0x85,0xfa,0xba,0x58, +0xf5,0x61,0xc3,0x77,0x1e,0xc1,0xd7,0xbf,0x56,0x58,0xac,0x8f,0xaa,0x40,0xb9,0xdc, +0x52,0xe0,0x8,0x11,0xba,0xc0,0x63,0x17,0xd9,0xb7,0xaf,0xb6,0x1f,0xc8,0xaf,0x6f, +0x4f,0x6d,0x3f,0xaa,0xf9,0x3e,0x2d,0x12,0x2a,0xe4,0xcf,0x87,0x71,0xed,0xcd,0x12, +0x68,0x3d,0xd,0x5b,0xd3,0x9b,0x84,0xe6,0xd0,0x57,0x33,0x8f,0x6f,0x9d,0x12,0x25, +0x7f,0x3e,0xbd,0x7f,0xc1,0x62,0x4b,0x91,0x14,0x4a,0xf0,0xec,0xbf,0xd2,0x3e,0x3c, +0x1c,0xb4,0x6f,0x81,0x45,0xf9,0xcc,0xfe,0xf9,0xf9,0x3d,0x72,0xe5,0x69,0x4a,0xc6, +0xe5,0x99,0x7f,0x85,0xf4,0xfb,0x10,0x83,0x85,0xf9,0x62,0x7f,0x94,0x7e,0x1f,0x60, +0x28,0xe6,0xd9,0xb7,0x9b,0x67,0x1f,0x3e,0xec,0xf7,0x31,0xa,0xe8,0x87,0xc6,0xfe, +0x13,0x93,0x90,0xc3,0x8,0xa3,0x7a,0x86,0xbe,0x7e,0x9f,0x4,0xfa,0x10,0xe0,0xf8, +0xfa,0xc9,0x13,0x45,0x52,0xdf,0x79,0xc0,0xb1,0x87,0x9c,0x3,0x5f,0x17,0x2b,0x60, +0x81,0x3e,0xd4,0x57,0x8f,0x6f,0x90,0x6f,0xc0,0xf5,0x41,0xba,0x58,0x5f,0xf,0x2b, +0x41,0xed,0x57,0xf5,0x1f,0xf8,0xe6,0x7c,0x7c,0x2d,0x24,0x15,0x8a,0x9c,0x5b,0x5d, +0x74,0x78,0x78,0x18,0xe4,0x1b,0x94,0x17,0xe7,0xbb,0x81,0x3a,0x93,0xb8,0xb7,0x92, +0xa,0x7d,0xd3,0xff,0x9b,0x7,0x73,0xf1,0x91,0x56,0xf5,0x91,0x14,0xdb,0x7,0xb9, +0xbe,0xb9,0x5c,0x1f,0xad,0x6a,0x5,0xc6,0xf6,0x49,0x9c,0x3,0xf,0xe7,0xd3,0xbf, +0xb4,0x1a,0x15,0x80,0x38,0xe7,0xdf,0x8a,0xfd,0xf1,0x7,0xfd,0x31,0xcf,0x37,0x9f, +0xfe,0xb9,0xf5,0x1,0x4,0xbc,0x52,0x4b,0xa8,0x6f,0x81,0xe3,0x5b,0xeb,0xff,0x40, +0xd0,0x9f,0xa3,0x4f,0xbe,0x1e,0xe1,0xb0,0x7,0xf9,0x56,0xd5,0x1b,0xba,0xff,0x5d, +0x10,0x77,0x38,0xbe,0x92,0xfd,0xaf,0xfb,0x69,0x7c,0xe8,0x0,0x95,0x13,0xfb,0xea, +0xa7,0xb4,0x35,0x84,0xe2,0xda,0x3c,0x7d,0x5d,0x29,0x79,0xfb,0xad,0x1d,0xab,0xfd, +0x33,0xdc,0x29,0xf8,0xaf,0xf,0xe8,0xf0,0x7d,0x54,0x4e,0xe3,0x8b,0x12,0xd2,0x2, +0x7d,0x81,0x41,0xbf,0xe3,0xf0,0xfd,0x3c,0x4d,0x8a,0x96,0x15,0x30,0xf,0xdf,0x23, +0xe7,0xf1,0x4d,0x95,0xf2,0xaf,0xc6,0xf6,0xb5,0x3d,0xbe,0x31,0xe7,0x6f,0xc0,0xcc, +0x7c,0x7d,0x31,0xae,0x6f,0xdd,0x38,0x9f,0x8a,0x44,0x30,0x7c,0x3,0x61,0x2b,0xdc, +0x17,0xe9,0xfc,0x1b,0x6,0xe5,0xa0,0xb8,0x3e,0xb2,0x62,0xfc,0xec,0x55,0xe6,0x1b, +0x92,0x62,0x6,0xed,0x77,0x18,0x14,0xb5,0x85,0x38,0xbe,0x35,0xf5,0x6,0xb3,0x6c, +0x70,0xbe,0x41,0x84,0xba,0xe1,0x93,0xb3,0xf0,0xc9,0x1,0xbf,0x5d,0x8e,0xe5,0x6b, +0xb5,0x94,0xcf,0x69,0xc7,0x48,0x56,0x37,0x85,0x55,0xc3,0x77,0xd8,0xe1,0xf8,0x88, +0x1e,0x9e,0xb1,0x54,0x8e,0x78,0xfd,0x4e,0x53,0xf4,0x42,0x2e,0xdf,0x67,0x6a,0x87, +0xab,0x75,0xb9,0xe5,0xcb,0xe6,0x78,0x3e,0xdc,0x34,0x7d,0x53,0xc1,0xea,0x90,0x2d, +0xdf,0x8,0x58,0xfd,0xdf,0x54,0xf0,0xf7,0xde,0x47,0xf6,0xf,0x29,0x66,0xe1,0xeb, +0x2a,0x54,0xf3,0x6d,0x68,0xbe,0xb6,0xf9,0xf3,0xfe,0xbe,0xd4,0x61,0xc7,0xc2,0xf8, +0xe7,0x86,0x2e,0xb8,0xa3,0x47,0xa9,0x2e,0xb4,0xc6,0xf,0xd9,0x6a,0x21,0xfb,0x84, +0xdd,0xcd,0x64,0x98,0xb1,0x7d,0x43,0x45,0x3d,0x91,0x8f,0xe8,0x25,0xcd,0x37,0x36, +0x7d,0x3,0xc1,0xf4,0x8d,0xcd,0x66,0xb9,0xc4,0xf7,0x8d,0xad,0x56,0x9b,0x5a,0x91, +0x61,0x7d,0xd6,0x5,0xd2,0xd6,0x23,0x46,0x39,0xb2,0xf,0xd3,0x5f,0xd2,0xc1,0xca, +0xec,0x8f,0xc3,0xd7,0x5e,0x89,0xf4,0xb9,0x94,0x85,0xaf,0x8b,0x8a,0xff,0x23,0x62, +0xfb,0xbd,0xa3,0x1f,0xc9,0x66,0x82,0xf6,0x1b,0x8,0x89,0x7d,0x2d,0x48,0xef,0xa9, +0x5d,0xa9,0x7e,0xfe,0xb1,0x6f,0xf3,0xf7,0x65,0xee,0xf9,0xe7,0xf3,0x45,0x3e,0xff, +0x9c,0x23,0x9a,0xfe,0xbb,0x24,0xba,0xf,0x10,0x99,0x5d,0xbf,0xff,0x99,0x5d,0xbf, +0x45,0xff,0xf5,0xab,0xfa,0xfa,0x46,0x4,0x3,0xd6,0xf,0x9e,0x71,0xfd,0xda,0x83, +0x90,0x8,0x12,0xfb,0xd6,0x1e,0x4c,0xbf,0xa2,0xf6,0x7f,0xda,0xad,0xe0,0xcd,0x6b, +0x2,0xac,0xe3,0xbd,0x3d,0x3c,0xdc,0x33,0x7d,0xac,0xec,0xb,0x1d,0xbe,0xb5,0xb2, +0xe5,0x73,0x54,0x85,0xad,0x6,0xb2,0x93,0x23,0xb1,0x7b,0x74,0xb1,0x6f,0xfd,0x97, +0x94,0x4c,0x5f,0x31,0xfa,0xf8,0x36,0x55,0x87,0x5b,0x4d,0xf0,0xcc,0x9a,0xd0,0x79, +0xfe,0xb4,0xd5,0x3a,0x1d,0x8e,0xb9,0x3e,0xdf,0x81,0xb,0xf7,0x39,0x5a,0xd7,0xf6, +0x11,0x68,0xfa,0x4,0xed,0xa4,0xbd,0xb4,0xdb,0x7e,0xa5,0x3c,0x7b,0xfc,0xbd,0x59, +0xd2,0x5,0x7f,0x48,0x84,0x47,0x2f,0x1d,0xb7,0x5a,0xc7,0xc3,0x69,0x31,0x3,0x9f, +0x63,0x7c,0x73,0xf8,0xcc,0xe3,0x7b,0x53,0xeb,0xa,0xb0,0xb0,0x3,0x94,0x68,0xf9, +0x45,0x13,0x14,0x88,0x0,0x5f,0xea,0xb6,0x5a,0x5d,0x2b,0x1f,0xa4,0xf2,0x1d,0x72, +0x7d,0xdb,0xfb,0xac,0x49,0xa2,0xfb,0xda,0x86,0x40,0xcd,0x57,0xf0,0x35,0xdd,0xc7, +0x4e,0xed,0x54,0x3e,0x47,0xbe,0x5a,0xbf,0x66,0xf9,0x2a,0xa6,0xf,0xea,0x3e,0x31, +0x92,0xcf,0x14,0xa8,0x3f,0x3,0xbe,0xd6,0x6c,0xb5,0x9a,0x94,0x4d,0xf5,0xa6,0xf2, +0xb9,0x4e,0x21,0xdf,0xf9,0xa7,0xfb,0x2e,0xed,0xb7,0xeb,0xd1,0x7d,0xda,0x3f,0xde, +0xa8,0xb5,0x5a,0x35,0xfb,0xdb,0xce,0xd5,0x37,0x2d,0x8,0x72,0x9c,0xf6,0xd3,0x7d, +0x97,0x5a,0xad,0x4b,0x72,0x29,0xe3,0xf6,0x73,0x1c,0x5f,0xe8,0x38,0xbe,0x40,0x20, +0x71,0x7d,0xf7,0x70,0xab,0x85,0x31,0xec,0x64,0xdc,0x7e,0x3b,0xbe,0xfe,0x4f,0xbb, +0x3e,0x60,0xc4,0xeb,0xc3,0xe1,0xd3,0xfb,0x67,0x8c,0x1e,0x65,0xeb,0x23,0x6b,0x76, +0x5f,0xb8,0xdf,0x2e,0xd3,0x75,0x7d,0xfc,0x50,0x50,0x6c,0x9f,0xf1,0xc1,0xa8,0x92, +0xad,0xef,0x8c,0x38,0x7c,0xeb,0x45,0xba,0x72,0x53,0xf7,0x61,0xb5,0x7f,0xae,0xe7, +0xc1,0x37,0x24,0xce,0xdc,0x55,0x24,0xee,0xdc,0x16,0xdf,0x37,0xc9,0xf8,0xfa,0x0, +0xdc,0xf6,0x8b,0x53,0x3f,0x70,0xfb,0x9e,0x4,0xf8,0x64,0xf4,0xeb,0x72,0xba,0xeb, +0x37,0x76,0x7e,0xe1,0xfa,0x7e,0x5f,0xe0,0xfb,0xd0,0xf7,0xbb,0x20,0x5d,0xff,0x97, +0x8d,0xf,0x6,0xb4,0x1f,0x7c,0xbf,0xb,0x53,0xfa,0x80,0xdd,0xbf,0x24,0xf6,0x5, +0xf6,0xcf,0xf0,0x49,0x32,0xdf,0xe7,0x6a,0xff,0x22,0xdc,0xbd,0x79,0x59,0xfd,0xd7, +0x6d,0xbb,0x7f,0x26,0xc5,0x4d,0x51,0x48,0xe2,0xb,0x1c,0xdf,0xa4,0x3f,0x4a,0xe6, +0xeb,0xa9,0xfd,0xf3,0xcd,0x6a,0x6f,0x62,0xfb,0xf4,0xf1,0x17,0xd5,0x76,0x68,0xa6, +0x3e,0xd8,0x78,0x31,0x91,0xaf,0xa5,0xe6,0xab,0x9b,0x95,0x91,0xe6,0xbb,0xe5,0xf0, +0x4d,0x94,0x56,0x7e,0x7c,0x2f,0x55,0x46,0xc4,0xe1,0xdb,0x56,0x7d,0x84,0x36,0xb3, +0xf5,0xa1,0xea,0x5b,0x89,0xae,0x5f,0x51,0xf7,0x49,0x6a,0x68,0x26,0xc0,0x6e,0x3f, +0x35,0x44,0x37,0xb2,0xf5,0x25,0xed,0xff,0x34,0xdf,0xab,0x15,0xf8,0x91,0x76,0x4d, +0xd8,0x3e,0xfa,0x11,0xfd,0xab,0x6c,0x7d,0x49,0xc7,0xf,0xd3,0x37,0xb1,0xfb,0x17, +0xed,0xfa,0xa5,0x13,0xfa,0xc3,0x7c,0xf8,0xb4,0xfb,0xf3,0x57,0x8d,0xeb,0xc3,0xd1, +0xff,0x65,0x7f,0x7d,0x24,0xf5,0x69,0x85,0x89,0xaa,0xd1,0xbf,0xb8,0xf2,0x55,0x84, +0xfe,0x45,0xae,0x45,0xf4,0x71,0xe6,0xb7,0xa2,0x8f,0x1f,0xea,0xa7,0x6a,0xf4,0xcf, +0x8e,0x7c,0x10,0xa9,0x7f,0x46,0x8d,0x85,0xf8,0x12,0xe7,0x2b,0x33,0x2a,0x43,0x3a, +0xbe,0x59,0x9a,0x6b,0xfb,0x25,0xcc,0x57,0x68,0xdb,0x14,0xa0,0x1e,0xc,0xf5,0xe9, +0x1f,0x85,0xfb,0x65,0xb7,0xef,0x50,0x19,0x87,0xfa,0xe2,0xe5,0x17,0x73,0xb2,0x53, +0xf5,0x8d,0x78,0xbe,0x43,0xdd,0x0,0x49,0x49,0x6f,0xb3,0x93,0x91,0xf7,0xcb,0xac, +0x88,0x21,0xca,0x77,0x4b,0xa6,0xaf,0x7f,0x16,0xba,0x92,0x36,0xb1,0xf,0xf2,0x7c, +0xfd,0xa9,0xfe,0x55,0xc5,0xf8,0x91,0xd2,0x6b,0xde,0x2f,0xb3,0x5,0x45,0x22,0x32, +0x6b,0x68,0x88,0x8a,0x6f,0x84,0xf9,0xd8,0xfd,0x9b,0x18,0xdf,0xc7,0x3b,0xff,0x44, +0x7d,0xe1,0x3,0xc4,0x13,0xe3,0x4f,0xfd,0xc4,0xfb,0xe5,0xa,0x6b,0x3f,0x68,0xd6, +0x20,0x55,0x9f,0x12,0xb2,0x5a,0xd4,0xba,0x3f,0x57,0x1b,0x50,0x51,0x3e,0xbc,0x59, +0x9c,0xe5,0x1b,0xaf,0x86,0xb6,0x9f,0x38,0x31,0x7c,0x46,0xc5,0x8,0x7e,0xec,0xfd, +0x32,0xb4,0x7c,0x34,0x92,0x8f,0xb2,0xfb,0x73,0xf5,0x4f,0x4f,0xcf,0x1a,0x3d,0x14, +0xb9,0x7f,0x9e,0xe1,0xd3,0xbf,0x11,0xf2,0x9e,0x7f,0xe2,0x67,0xb6,0x4f,0xb0,0x7c, +0xbc,0xd5,0xac,0xc8,0xed,0x2b,0x1b,0xbe,0x2e,0x9e,0xe5,0x3b,0xa5,0xa1,0xd7,0x87, +0x28,0x19,0x3e,0xf3,0xfb,0x7b,0xaf,0x5f,0x71,0x28,0x78,0x7d,0x50,0x54,0x94,0xa0, +0xcb,0xc2,0x31,0xbe,0xa9,0x3e,0xe5,0x8d,0x6,0x9e,0xe9,0x33,0xab,0x9c,0x41,0xfd, +0x8b,0xd8,0xf,0xf7,0x41,0x8e,0xaf,0xce,0xfb,0xa1,0x9b,0x3c,0xdf,0x87,0xb3,0x7d, +0x66,0xa9,0x2f,0xa8,0x7f,0x16,0xbf,0x2d,0x18,0xd7,0x47,0x80,0xaf,0x62,0xf9,0xfa, +0xe6,0x71,0xdc,0xe8,0x2b,0x9c,0x93,0xca,0x2a,0x46,0x8b,0xe,0xdf,0x4f,0xc4,0xaf, +0xcf,0xf6,0x19,0x7,0x18,0x6e,0xf3,0xc7,0xb7,0xbe,0xd1,0xff,0x29,0x12,0xe4,0xfa, +0xfa,0x56,0xfb,0x21,0x73,0xa8,0x47,0xf0,0x50,0x19,0xf8,0xaf,0xf,0x6b,0xa9,0x8e, +0xe0,0xf2,0x75,0x23,0xb7,0x5f,0x80,0xcf,0xea,0x9f,0x8b,0x5c,0xdf,0xe1,0xd8,0xea, +0x9f,0xd7,0x98,0x8f,0xfb,0x3,0xd9,0x9f,0xb3,0xf2,0xa9,0xee,0x8b,0x70,0x7d,0x98, +0xff,0x61,0x41,0xbe,0x4,0xe3,0x1b,0xf7,0xb3,0xc7,0xab,0x5f,0xf5,0x22,0xf4,0x2f, +0xc6,0x1f,0x18,0xf0,0x63,0x44,0x7c,0xdf,0x20,0x60,0x71,0x51,0x91,0x57,0xbf,0xea, +0x45,0xe8,0x9f,0x8d,0xf6,0x6b,0x67,0xe5,0x6b,0xaf,0xac,0x66,0x9b,0xaf,0x8c,0xf3, +0xaf,0xb3,0x4f,0xb3,0xf1,0x75,0x58,0x87,0x1a,0xa1,0xfd,0xa2,0xd5,0x37,0xf4,0xef, +0xd7,0xd9,0x98,0xb3,0x6f,0x3f,0x71,0x7d,0x68,0xcb,0xf4,0xc9,0xcf,0xe1,0xfd,0x4b, +0x68,0xf7,0x50,0x99,0x8b,0xef,0x30,0xa9,0xcf,0x18,0x3f,0x3a,0xdf,0xa4,0xe8,0x37, +0xa7,0x4d,0x38,0x4,0x7d,0xc7,0x12,0xe2,0x81,0x7a,0xae,0x68,0xdf,0x4c,0x3d,0x4b, +0x78,0x3e,0xf3,0xcb,0xda,0x49,0xbc,0xc2,0x4e,0xbb,0xa0,0xf3,0x4f,0x4e,0xea,0x33, +0xff,0x73,0xff,0xa5,0xe6,0x13,0xe0,0x81,0x28,0xbe,0x39,0x17,0x9f,0xbd,0x98,0x23, +0x51,0xfd,0x8f,0xfc,0x47,0x8a,0xce,0x8f,0x5,0x88,0x36,0xc4,0x74,0xed,0x17,0x9c, +0x4b,0x13,0xfa,0x8c,0xfe,0x85,0xfc,0x27,0x2a,0x9f,0x1f,0x7f,0x7,0xa2,0x96,0x88, +0xc2,0xc2,0x79,0xf2,0xe7,0x6c,0x36,0x53,0xe5,0xfb,0xe9,0xe7,0x94,0x7e,0xfd,0xc5, +0xe7,0x20,0x52,0xe6,0xe5,0x1b,0xa6,0xf3,0x49,0x2,0xed,0xbe,0x58,0xd3,0x7c,0x83, +0xf2,0x5c,0x7c,0xe9,0xee,0x8f,0xce,0x24,0x1,0xe9,0xbe,0x96,0x58,0x11,0xd3,0x5d, +0x1f,0x97,0xe6,0xe1,0x3b,0x81,0x65,0xd4,0x6d,0xaa,0xbe,0x66,0xdf,0xf1,0x24,0x47, +0x7e,0x7c,0xa7,0xb0,0x2c,0x3f,0xd7,0xdc,0x84,0x68,0xef,0x30,0x67,0x3e,0xe3,0xfe, +0xed,0x8,0x66,0x96,0xf,0x32,0xf6,0xd1,0x6c,0xf3,0xd5,0x6c,0x5f,0xcc,0xf5,0x43, +0xec,0x2f,0xcd,0xd5,0x7,0x3e,0xb5,0xd7,0xbb,0x24,0xf2,0xc1,0xd9,0xf5,0xb5,0x54, +0xbe,0xae,0xbd,0x62,0x3e,0x91,0x8f,0x66,0xe5,0xa3,0xa7,0x87,0x87,0xb4,0xed,0xed, +0xe2,0x61,0x63,0x84,0x63,0x75,0x92,0x91,0x7d,0x68,0x4f,0x5b,0x91,0x6,0xa7,0x65, +0xa4,0xaf,0x56,0xf3,0xfa,0xf6,0xf6,0xcc,0x5,0x6b,0xe2,0x98,0x2,0xdd,0x75,0xda, +0xef,0xfb,0x1f,0xa4,0x87,0x8d,0x98,0x1d,0x7b,0x64,0xdf,0xb0,0xa5,0x2f,0x3b,0xc1, +0x60,0xa8,0xdf,0xa9,0x78,0x7d,0xad,0x96,0xd9,0x72,0xea,0x8d,0xfa,0xb6,0xee,0x3a, +0xea,0xf7,0xfb,0x3e,0x1f,0xaa,0xce,0xcb,0x77,0xd0,0x6a,0x19,0xbe,0x83,0xbf,0xac, +0x72,0x7d,0x2d,0xcb,0xf7,0xf2,0x9f,0x69,0xae,0xd3,0x59,0x3e,0x54,0x58,0xa5,0x47, +0xf,0xba,0x30,0xa3,0xe3,0xcb,0x7c,0xe8,0xcf,0x1b,0x1c,0x9f,0xa2,0xd8,0xbe,0xfe, +0xbf,0x63,0xbe,0xb6,0xf7,0xfb,0x9c,0x23,0xfb,0x2f,0x4e,0x70,0x9d,0xf6,0x76,0x7e, +0x93,0x9d,0xef,0x81,0xe1,0x6b,0xbe,0x5b,0xe6,0xfa,0x1e,0x58,0x3e,0xa9,0x1d,0xd4, +0x7e,0xe7,0xc8,0xbe,0x3e,0x34,0x9f,0xb8,0xf3,0xdb,0xcc,0xdb,0xaf,0xc9,0x6b,0x3f, +0x8c,0x1d,0xed,0x27,0x5,0x1e,0x5f,0x5,0xdb,0xfd,0xcb,0x84,0x2e,0xd0,0x87,0x50, +0x34,0xdf,0xd4,0xee,0x9f,0x51,0xa9,0x4e,0xff,0x62,0xa7,0x5b,0x59,0x88,0xf,0x42, +0x8e,0xef,0x53,0x10,0xf6,0xa3,0xd1,0xd1,0x2a,0xfd,0xe1,0x83,0xec,0x7c,0x3f,0xd, +0xf3,0x1,0xf0,0x53,0xaf,0xef,0xf0,0xf0,0xef,0xc2,0x7d,0x58,0xa0,0x2d,0xb1,0xfb, +0x28,0xab,0xfe,0xf9,0xe7,0x9a,0x6f,0xfa,0x3c,0xdf,0xf7,0xe0,0xc1,0xcf,0x4d,0xdf, +0x18,0x19,0xbe,0x99,0xf3,0x33,0x93,0x4c,0x7d,0x59,0xd5,0xaf,0x7c,0xbe,0x4e,0x5e, +0x7d,0xa8,0x20,0xd0,0x3d,0x31,0xab,0xfe,0x39,0x7b,0x5f,0xb6,0xe3,0xdb,0x3f,0x4a, +0xdf,0xca,0x45,0xfb,0x5d,0xf8,0xbe,0x38,0xbe,0x76,0xce,0x7d,0xda,0xe3,0x83,0x39, +0xf6,0x11,0xad,0x4a,0x91,0x57,0xdf,0xda,0x1e,0x7d,0xac,0xad,0x2d,0xc8,0xab,0x4f, +0xbd,0x1,0xbb,0xa1,0x4d,0xd9,0xe5,0xd7,0x47,0x1e,0x6b,0x25,0x1b,0xfe,0xfc,0x8c, +0xf3,0xf9,0x23,0xa3,0x50,0xc5,0xfd,0x32,0x75,0x94,0x97,0x33,0xf6,0x75,0x15,0xfa, +0xa1,0xf6,0x4c,0x13,0x7f,0x7e,0xc6,0xf9,0xfc,0x96,0x51,0xed,0x12,0x78,0x5f,0x76, +0x3e,0xbf,0x95,0xb1,0x6f,0xa8,0xd0,0x9f,0x6a,0x3e,0x7e,0xd5,0xc9,0xf9,0xfc,0x9b, +0x51,0xe7,0x2a,0xf3,0xbe,0xec,0x7c,0xfe,0x2d,0x6b,0x1f,0x56,0x7d,0xe3,0x95,0xec, +0x3e,0x85,0x8c,0x8f,0x2f,0x2a,0xfe,0x54,0x9b,0xa3,0xc9,0xac,0xfd,0x68,0xc6,0xd7, +0x7,0x34,0x8e,0x6f,0x66,0xe7,0x5f,0xd6,0x3e,0x40,0x1f,0x6b,0x73,0x13,0x99,0x5d, +0xbf,0x19,0xfb,0xd6,0x1e,0xd0,0xc7,0x31,0x1e,0xd4,0x5d,0xd4,0x3e,0x6d,0xce,0xf1, +0x6d,0x5a,0xde,0xcc,0xb5,0x8f,0xc4,0xd8,0x58,0x77,0x19,0x3e,0xb6,0xfd,0x41,0x6e, +0x7d,0x6d,0x9a,0x6f,0x1f,0xbd,0xf0,0x5d,0xf8,0x2e,0x7c,0x17,0xbe,0xb,0xdf,0x85, +0xef,0xc2,0x77,0xe1,0xcb,0x81,0x6f,0xaa,0xdf,0xec,0xad,0xe6,0xdd,0x27,0x5f,0xdd, +0xc1,0x74,0x33,0xbf,0x3e,0x3c,0x7a,0x78,0x4a,0x6b,0x79,0xf4,0xe9,0xb7,0x7e,0x47, +0x78,0xf4,0xce,0x71,0x2b,0xdf,0x3e,0xdc,0xcd,0xa9,0x6f,0x5f,0xf7,0x7d,0x80,0xbb, +0xdf,0xcf,0x91,0x4f,0x2e,0x15,0x91,0xe9,0x6b,0xaa,0x3e,0xf9,0xea,0x7,0x78,0xf8, +0x5f,0x32,0xf3,0xd,0x56,0x56,0x84,0x74,0x3e,0x2c,0xa1,0xa1,0xc3,0x87,0x95,0x9f, +0xe1,0x21,0xce,0xcc,0xd7,0x9e,0xb9,0x30,0x69,0xa6,0x6f,0x84,0xf,0x3c,0xbe,0x6e, +0x76,0xbe,0xf4,0x1f,0x3c,0x32,0x9e,0x49,0x56,0x7d,0xef,0xe9,0xbe,0xc7,0xb8,0x5b, +0xcd,0xa7,0xef,0x6f,0xe4,0xb2,0xea,0xdb,0xc1,0xad,0xad,0x1c,0xf9,0xe4,0xab,0xb4, +0x6a,0xfa,0x30,0x2,0x47,0x59,0x8f,0x6f,0xe9,0xdb,0x4f,0x21,0xd6,0xf5,0xb,0x61, +0xd6,0xbe,0x5d,0xf8,0x6e,0xda,0xeb,0x43,0x39,0x5f,0x65,0xfd,0x1f,0x40,0x59,0xfb, +0x76,0x86,0xd,0x90,0x2,0x77,0xa2,0xfa,0x8,0x62,0xed,0x47,0x45,0x9c,0xb5,0x4f, +0x78,0xb5,0x91,0xe6,0x25,0x3e,0x3,0xd5,0x47,0x8b,0xf3,0xf4,0x1d,0xa7,0xf3,0xb9, +0x4b,0xfd,0xe5,0xec,0x7d,0xa3,0xb4,0xed,0xe7,0xcc,0x7,0xd9,0xb7,0xdf,0xdd,0xd7, +0xf2,0xed,0x13,0x6e,0xdb,0x3e,0x61,0x75,0x6d,0x90,0xce,0x97,0xfd,0xf5,0xeb,0xf0, +0x11,0x1,0xd7,0x81,0x90,0xc6,0xb7,0x9f,0x7d,0xff,0xb7,0x3,0xaf,0xb3,0xfe,0x45, +0x11,0x50,0x4d,0xfc,0x9f,0x5b,0x71,0x7d,0x6a,0xbe,0xda,0x60,0xfd,0x73,0xf6,0xe3, +0x87,0xa3,0x7f,0xc6,0x2,0xaa,0x8a,0xef,0x5d,0x8f,0xdd,0xbf,0x48,0xe6,0x3,0x27, +0xaa,0x4f,0x1d,0x7f,0xe7,0x37,0xbe,0x61,0x1,0x56,0xc4,0x46,0x35,0xb6,0x6f,0x84, +0x5,0x47,0xbe,0x9a,0x9f,0xf,0x9,0xf0,0x8f,0x13,0xf9,0x68,0xc1,0x91,0xef,0xe7, +0xe7,0x83,0x2,0x7c,0x2e,0x99,0xaf,0xb6,0x90,0xe3,0x3b,0x28,0x83,0x5a,0x2,0x9f, +0x9a,0xaf,0xf0,0xfc,0xae,0xf,0x57,0x5f,0x3,0xea,0xa0,0x1a,0xbf,0xfd,0x14,0xdb, +0x97,0x7d,0xff,0xe2,0xfc,0xd4,0xc0,0xda,0x0,0x25,0xf0,0xe1,0xda,0xfc,0xf2,0x55, +0xda,0x73,0x42,0xcf,0x57,0xd5,0xf9,0x8d,0x6f,0x19,0xf8,0x68,0x71,0x73,0xde,0xbe, +0x69,0x6e,0xf3,0x95,0xf1,0x31,0x9f,0xc5,0x5f,0x99,0xfd,0x50,0xa8,0xbf,0xfd,0xd8, +0xce,0xb4,0xf3,0x6c,0x3f,0xe3,0x59,0x7c,0x12,0xb8,0x3,0x75,0xe8,0xf1,0x45,0xf3, +0xf7,0x6d,0x9a,0x1,0x86,0xd2,0xb3,0xd8,0x3e,0x84,0x3b,0x73,0xcc,0x57,0x6,0xac, +0x94,0x8d,0x6f,0x63,0x4e,0xfd,0x9f,0xb9,0xaa,0x24,0xb5,0xf,0xcd,0x69,0xfc,0x18, +0xd3,0x8c,0x7c,0x73,0x1a,0x7f,0xd9,0x6a,0x2d,0x41,0x7f,0x2e,0x74,0xc5,0x7a,0x48, +0x34,0xae,0xf,0xce,0x29,0xbf,0xf8,0xda,0xcf,0x88,0xfc,0x8f,0x67,0x6c,0x79,0x64, +0xf8,0xc6,0xab,0x73,0xf7,0xf9,0xce,0x3f,0xc3,0xd7,0x4,0xe5,0x8,0x3e,0x4a,0x6d, +0xdf,0x9c,0x8e,0xaf,0xf9,0x6c,0xac,0xd7,0xd7,0x90,0xc4,0x78,0x3e,0x30,0xaf,0x7c, +0x55,0xf4,0xf4,0xcf,0xa6,0x8f,0xc6,0x3c,0xbe,0x60,0x5e,0xf9,0x6a,0x3f,0x85,0x8f, +0xa2,0x8e,0x7e,0x8,0x34,0xdf,0xbc,0xf2,0x95,0xf7,0xbb,0xc6,0xf2,0x75,0x34,0xdf, +0xb4,0x34,0xcf,0xf1,0x6d,0x9c,0xc6,0xa7,0xbf,0x3a,0x41,0x2e,0x2e,0x32,0x5f,0x99, +0x3e,0x18,0xc5,0x37,0x75,0xbc,0xfc,0xa2,0x3c,0xef,0x7c,0x2a,0x1b,0xef,0x1,0x64, +0xfd,0x4b,0x14,0x1f,0xa6,0xf3,0x6f,0x3f,0xfb,0x1e,0xdd,0xd8,0x15,0x2b,0x7e,0xff, +0x3c,0xdf,0xf3,0x8f,0xef,0x8b,0x5a,0x1f,0xb2,0xae,0x5f,0x3a,0xf7,0xfb,0x23,0x8c, +0x12,0xfa,0xa8,0x30,0x9f,0xfa,0x55,0x7a,0x9f,0xb2,0x65,0xf9,0x9a,0x73,0x9f,0xff, +0x90,0x8b,0xd0,0xf6,0xf1,0x97,0x93,0x17,0xbd,0xd7,0x47,0xc3,0xf2,0x89,0x73,0x19, +0x7f,0x15,0x65,0xcf,0xea,0xff,0xb0,0xb1,0xa7,0x23,0x64,0xc3,0xc9,0xac,0xe5,0xee, +0x5a,0xbe,0x6a,0x5a,0xbe,0x1f,0xcf,0x25,0xbf,0x28,0x4a,0xcb,0xda,0x5e,0x12,0x1b, +0x5d,0xa,0x64,0x71,0x81,0xf3,0x19,0x6,0xfb,0xde,0xe2,0xf9,0x48,0x9b,0xa4,0xf3, +0x11,0xbc,0x66,0x75,0x74,0xd8,0x90,0xc6,0xf2,0x61,0xfb,0xfc,0xe3,0x1d,0x5f,0x2, +0xee,0x27,0xf0,0x4d,0xbf,0x2a,0xd8,0x3e,0x1,0xd8,0xfd,0x4b,0x21,0x8d,0x8f,0x77, +0x7d,0x10,0xf0,0x66,0x3a,0x1f,0xad,0xda,0x3e,0x7b,0x7c,0x23,0xc1,0xbe,0x93,0xa3, +0x20,0x1f,0xaf,0x7f,0x21,0xe0,0x4e,0x86,0x3e,0xb2,0xba,0x3e,0x18,0x7c,0xab,0xa8, +0xd,0xab,0x81,0x3e,0xa9,0xc7,0xb9,0x3f,0x17,0x82,0xea,0x57,0xe9,0x7d,0x8f,0x9c, +0x3e,0x45,0x4,0x15,0x2,0x43,0x7d,0xa4,0xc7,0xa9,0x6f,0x8,0x41,0xe3,0x1b,0x69, +0x4b,0x69,0x7d,0xf6,0xf5,0x61,0xfb,0xce,0xa3,0xfa,0xcc,0x4f,0xb0,0xf,0xf4,0x53, +0xfa,0x80,0xdd,0xbf,0xe8,0x3e,0x38,0xc3,0x77,0xc6,0xf3,0x5,0xe6,0x2b,0x9,0xe8, +0x9b,0xb3,0xa4,0xf1,0xd9,0xfd,0xb3,0xea,0x5b,0x3f,0x1a,0x68,0x5b,0x89,0x4f,0xe8, +0x53,0xb1,0xda,0x2f,0xb0,0x3e,0x24,0x1,0x92,0xb2,0xfd,0x5c,0x47,0x63,0x55,0x9c, +0xea,0xc7,0x77,0xbc,0x76,0x9e,0x8d,0xef,0x24,0x5b,0x9f,0x9a,0x99,0x75,0x1f,0x51, +0xa6,0x2,0x29,0xac,0x6e,0x7e,0xc9,0xac,0x8,0xa2,0xbb,0xe5,0x6b,0x5f,0xde,0x85, +0x5,0xdf,0xf5,0xeb,0xf4,0x65,0x97,0xaf,0x2,0x7d,0x48,0xbb,0x3e,0xf6,0xb5,0x5e, +0x9b,0x8,0x6a,0xcf,0x5d,0x63,0xd7,0xb6,0xd4,0xec,0xc3,0x5e,0xff,0x0,0xfa,0xfa, +0x3f,0x87,0x6f,0x2f,0xbb,0x7c,0x15,0xe8,0xc3,0x9a,0x4f,0x9b,0xf0,0x43,0x5e,0xdf, +0x8,0x99,0x3e,0x6f,0xfe,0xa3,0x73,0xb8,0x3f,0xf,0xf4,0x29,0x6a,0xff,0x7c,0xf3, +0x92,0xe5,0x13,0x98,0xaf,0xdf,0x1c,0xd1,0x9d,0xfe,0x1,0xf0,0xfb,0x88,0xe5,0xe3, +0xe6,0x2b,0x73,0x77,0xa7,0x88,0x3e,0x2b,0x34,0x7d,0x95,0x13,0x9d,0x4,0xb6,0xa, +0x52,0xcf,0x51,0x44,0x3f,0xff,0x56,0x4d,0x5f,0xaf,0xab,0xfa,0x76,0x9b,0x40,0x2f, +0x89,0x97,0x9c,0xbe,0xa9,0xe5,0xdb,0xe4,0xe5,0x97,0x98,0xbe,0xb0,0xf6,0xb3,0x7e, +0x8b,0xb5,0x1f,0x14,0xac,0xec,0xf0,0xe9,0xd7,0x55,0x1f,0xd8,0xe0,0xb4,0xdf,0xd8, +0xf2,0x35,0x17,0xe5,0x63,0xe7,0x1f,0xb2,0xcf,0x3f,0xb5,0xfd,0xd0,0x1a,0x68,0x8a, +0x7e,0xdf,0x91,0xe5,0xc3,0xbc,0xe3,0x6b,0xee,0xce,0x96,0xa9,0x4f,0xfb,0x9e,0xd8, +0xed,0xeb,0x1e,0xf7,0xe1,0x1a,0xa8,0x73,0x7c,0xfb,0xb6,0x8f,0x77,0x7d,0xcc,0xc3, +0xa7,0xc7,0x6a,0xb5,0xff,0xc3,0xf6,0xf9,0x77,0xfc,0x59,0xb9,0x54,0x37,0x7c,0x27, +0xc8,0xe5,0xb3,0xe7,0x3f,0xb8,0xf9,0x6a,0x5f,0xfb,0x99,0x73,0xf0,0x11,0xf7,0xf8, +0xa1,0x45,0x56,0xc5,0xcc,0x57,0x5a,0x13,0xb6,0xb1,0x6c,0xf8,0x8c,0xe2,0xa1,0x7e, +0xff,0xeb,0xca,0x57,0x1b,0x87,0x10,0x18,0xbe,0xe9,0x5c,0x7c,0x9e,0xf1,0x57,0x6b, +0x33,0x6c,0x8e,0x6f,0xda,0x7a,0x49,0xf0,0x86,0xb6,0xed,0xe6,0x80,0x15,0x5f,0xfd, +0xf5,0x83,0x7a,0xdf,0x28,0xdf,0xec,0xab,0x51,0x63,0x2e,0xbe,0xe0,0x7c,0x85,0x74, +0x1f,0x34,0xeb,0x1b,0xe6,0x8d,0xa9,0xcf,0x67,0xee,0x14,0x3e,0xaf,0xe3,0x1b,0x92, +0xaf,0xdc,0xbe,0x80,0xf9,0x41,0xc1,0xd8,0x28,0x3e,0x91,0x4f,0x11,0xd2,0xb7,0xdf, +0xed,0xcf,0xc2,0xdb,0x6f,0x4b,0x1c,0x59,0xbe,0x8d,0xc5,0xfb,0xda,0xd2,0x30,0xfc, +0xfc,0x3b,0x11,0xff,0x9f,0xe5,0xab,0xc7,0xf4,0x91,0x95,0xd8,0x3e,0x35,0x5f,0x95, +0xbe,0xbe,0xb,0xb7,0xb4,0xeb,0x57,0x6f,0xbf,0x76,0xc5,0xf0,0x19,0x93,0x77,0xfe, +0xfa,0x95,0x62,0xee,0xf4,0xaf,0xfa,0xd4,0x4f,0xcc,0xf3,0x4f,0x6d,0xbf,0xd7,0x57, +0x63,0xf9,0xd4,0x7c,0x25,0x8d,0xfa,0x7,0x55,0xd6,0xff,0x1,0x60,0xfa,0xcc,0xc9, +0x4f,0xed,0xfe,0x3,0x39,0xfb,0x3f,0xfd,0xfa,0x38,0xd2,0x7d,0xa,0x5d,0x8b,0x7b, +0x7d,0x98,0x9d,0x85,0xfe,0x29,0xa0,0x48,0xbe,0xd1,0x44,0xe9,0x1f,0x8,0x6c,0xfc, +0x0,0xe2,0x23,0xc1,0x39,0xbe,0x69,0xbe,0xa1,0x73,0xfc,0xd0,0xfb,0x97,0x5d,0x7d, +0xfc,0xc0,0x74,0x27,0xa6,0xef,0x81,0x63,0xe1,0x3d,0xc1,0xc3,0x8,0x3e,0x35,0x5f, +0x91,0x87,0xfd,0x83,0xef,0xda,0xbe,0x77,0x5d,0xf9,0x40,0xf7,0x39,0xc7,0x5f,0xbd, +0x7f,0x5e,0x4f,0xe8,0x5b,0x73,0xd5,0x87,0xe,0x22,0xf8,0xd4,0x7c,0x40,0x6e,0xef, +0x36,0xaf,0x7b,0x96,0x1c,0x68,0x97,0x6,0x42,0xc5,0x3d,0xdd,0x77,0xe0,0xc8,0x2f, +0xce,0xea,0xd7,0x6a,0x4a,0x5f,0x94,0xe3,0xab,0xe6,0x2b,0x22,0x81,0x8d,0x2a,0x27, +0x3f,0xa3,0x9,0x6a,0xf9,0x7c,0xc6,0x27,0x9b,0xf6,0x43,0xd1,0xda,0x6f,0x22,0x81, +0x26,0xcf,0x87,0x47,0x78,0x4d,0xf7,0x35,0x7c,0xf9,0x2a,0xe9,0xf9,0xd7,0xd2,0xde, +0xf5,0x19,0xcb,0xa7,0xe6,0x2b,0x49,0x2,0x75,0xbe,0x4f,0xfd,0x9b,0x9a,0x6f,0xc3, +0x97,0xaf,0xf4,0xeb,0x97,0xc6,0xbf,0x7e,0xd5,0x84,0xce,0xd6,0x5d,0x44,0xf4,0x69, +0xf9,0xea,0x2a,0xa8,0x6f,0x71,0xee,0xdf,0x94,0x9e,0xe9,0x43,0xbe,0x7c,0x85,0x74, +0x5f,0xfc,0xfe,0x4f,0xfb,0xab,0xac,0x83,0x51,0x8e,0xa3,0xf8,0x9c,0xf9,0xaa,0xa7, +0xe7,0xab,0xb1,0xe0,0xf3,0xf9,0xee,0x7f,0xd,0x5f,0xec,0xf1,0xc3,0xe5,0x23,0xa7, +0x51,0x7c,0xce,0x7c,0xa5,0x18,0xf9,0x8a,0xb5,0x1f,0x69,0x99,0x3e,0x7f,0xfd,0xc0, +0xf4,0xc5,0x1d,0x7f,0xc9,0x1f,0x3a,0x7c,0xf4,0x9f,0x45,0xf1,0x39,0xc7,0x5f,0xc5, +0x99,0x5f,0x34,0x9f,0x79,0x7d,0x4,0xfa,0x62,0xe7,0x97,0xbe,0xd3,0x17,0x3b,0x5f, +0x61,0xdd,0x37,0xb0,0xee,0xcf,0xd7,0xd4,0xfe,0x85,0x5f,0xbf,0x4a,0xe1,0xc3,0x28, +0x71,0x7e,0xd1,0x7d,0xb7,0x21,0x3b,0xff,0xa8,0xa0,0xf6,0xcf,0x34,0xeb,0xf6,0x9b, +0x16,0x53,0xe6,0x2b,0x2a,0xcc,0xae,0x5f,0xa5,0xf0,0xd1,0xf8,0xf9,0xea,0xcb,0xbb, +0x70,0x53,0xbb,0x7e,0xa1,0x9e,0xaf,0x4,0x61,0x76,0xfd,0x2a,0xa1,0x4f,0xbb,0x3e, +0x62,0xfa,0xb4,0xfa,0x55,0xbd,0x7f,0xa0,0xdf,0x5f,0xee,0xba,0xf2,0x95,0xed,0xdb, +0xf,0xe8,0xff,0x12,0xdc,0x7f,0x24,0xf0,0x79,0xf3,0xd5,0x3b,0xd4,0x5c,0xdf,0xbe, +0x56,0x64,0xf7,0xbf,0xbe,0xf1,0x23,0x1b,0x9f,0x3c,0x58,0x29,0x94,0x22,0xe4,0xab, +0x6b,0xfd,0x83,0xa2,0x2f,0x5f,0x61,0x69,0x27,0xb8,0xbe,0x81,0x92,0xd6,0x5f,0x62, +0xfb,0xb4,0x7c,0x25,0xed,0xaa,0xf9,0xc0,0x9b,0xaf,0xb0,0xd4,0xb2,0x7c,0xbe,0xfc, +0x12,0xc7,0x37,0x2e,0xa7,0xf1,0x69,0xf5,0x2b,0x35,0x5f,0x21,0x5f,0x3e,0xc0,0xd2, +0xe3,0x92,0xe9,0x1b,0xa6,0xf2,0xe9,0xe5,0x6,0xc3,0x37,0x75,0xff,0x69,0xf9,0x88, +0xee,0x47,0x68,0x3f,0xa4,0xe6,0x2b,0x8e,0x6f,0x64,0xbc,0x86,0x2c,0xe8,0xf8,0x46, +0xae,0x9f,0x2,0x68,0x5f,0xbf,0x34,0xb6,0x2f,0x30,0x5f,0xc9,0x57,0x1,0xc,0xac, +0x5f,0xc5,0xf3,0x95,0xed,0xfb,0x37,0x57,0xa5,0x4a,0xf3,0x5d,0x11,0xdc,0xbf,0x3b, +0x16,0x22,0xe6,0x2b,0x6c,0xce,0xb9,0x73,0xeb,0x57,0x49,0x7d,0xae,0xcf,0x99,0xe6, +0xfb,0xba,0xe8,0xf6,0x91,0x99,0xf9,0x8a,0x98,0x3e,0x3c,0x62,0xbe,0x7d,0x5e,0xff, +0x3c,0x7e,0xae,0xae,0x6d,0x53,0x9f,0xc2,0xf7,0x44,0x3f,0xbe,0x33,0x7c,0xfe,0x7c, +0x35,0x35,0x7d,0xe8,0x9,0x8,0x1b,0xdf,0x50,0xf7,0x79,0xba,0x9d,0xca,0xa7,0xf0, +0x7c,0xca,0xcc,0x7c,0x75,0xce,0x7c,0x93,0x52,0xb8,0xef,0xa5,0xda,0xad,0x28,0xbe, +0x76,0x31,0xd4,0x27,0x44,0xf6,0x9d,0x9d,0xea,0x3e,0xed,0x3d,0x8b,0xb3,0xd6,0xb7, +0x1b,0xbe,0x6,0x88,0x36,0xff,0xe1,0xf0,0x9d,0xa7,0xf0,0x19,0xed,0x77,0x7b,0x42, +0x23,0xe5,0x17,0xd4,0x7d,0x2d,0xa1,0x6f,0x8c,0x1c,0xbe,0x6b,0x9e,0xab,0x1a,0xcf, +0xf0,0xb5,0x25,0x29,0x9a,0x6f,0xfc,0xdc,0x6b,0x1d,0x10,0xfb,0xf8,0x4e,0x2f,0xa9, +0x97,0x64,0xd5,0xe1,0xbb,0xca,0xf1,0x29,0xe3,0xa7,0xad,0xe,0x43,0xcb,0x57,0xdd, +0x5d,0x8,0xd9,0xf5,0xb,0xda,0x2f,0xd3,0x48,0xf9,0xa,0xe1,0x37,0xa2,0xf9,0xa8, +0xb6,0x1c,0x97,0x6d,0x40,0xa8,0x39,0x61,0xc3,0xe1,0xfb,0x5a,0xd9,0xfd,0xa,0x19, +0xcd,0x47,0xe0,0x9b,0xb0,0xe7,0xc8,0x57,0x3f,0xec,0x1f,0x74,0x58,0xff,0x7,0xc0, +0xb7,0xa3,0xe5,0x2b,0xd5,0x17,0xf1,0xf8,0x6a,0x6f,0x48,0x95,0x1d,0x6,0x78,0xe0, +0x1e,0x3f,0xa6,0x25,0xcf,0xf8,0xa1,0xf9,0x14,0x3b,0x5f,0x21,0xd3,0x67,0xe6,0x97, +0x1d,0x96,0xaf,0x4,0x10,0x96,0xaf,0x10,0xbe,0x17,0xcd,0x37,0xd5,0xce,0x3f,0x6b, +0x3,0xcc,0x55,0xd5,0x37,0x74,0xfb,0xe4,0xa2,0x77,0x7c,0xbb,0x65,0xfb,0xb4,0xf9, +0xc1,0x97,0xfb,0x7,0x8f,0x7c,0x3e,0x2c,0x89,0xdb,0x61,0xe3,0x2f,0xc2,0xf5,0x5a, +0x24,0xdf,0x29,0x75,0xbc,0x1c,0x50,0x3b,0xc7,0xd5,0xfb,0x5e,0xb3,0xca,0xa4,0xfa, +0xb8,0xd3,0x85,0x62,0xb5,0x82,0xed,0x7c,0x40,0x5f,0xde,0x6d,0x3e,0xe2,0xe4,0x2b, +0xf1,0x56,0x58,0xbe,0x8a,0x3c,0xbe,0x41,0x67,0xfb,0x11,0xc5,0x11,0x14,0x82,0xdb, +0xef,0x75,0xcb,0xa7,0xd5,0xaf,0xfa,0x60,0xa3,0xc2,0xc9,0x57,0x3b,0xec,0xf8,0x22, +0x9e,0x8f,0xb4,0xf5,0x2d,0x42,0x23,0x5e,0xbf,0xec,0xfc,0xe3,0xf9,0x38,0xe7,0x5f, +0xb5,0x82,0x1c,0xf5,0xab,0xcb,0xa0,0x59,0xe0,0xe4,0xab,0xbe,0xe5,0xe3,0x1d,0x5f, +0x2,0xaa,0xd1,0xda,0x4f,0xef,0xff,0xac,0xd,0x44,0x6b,0xda,0x62,0x35,0xb7,0xcf, +0xf3,0xa,0x28,0xcd,0x57,0x79,0x4,0xed,0x7c,0x5,0xfb,0xa0,0xe,0x39,0xf9,0xaa, +0xc7,0x7c,0x90,0x77,0x7d,0x10,0x50,0x89,0xe1,0x23,0x56,0x79,0xb3,0xac,0xbd,0xb8, +0xd4,0xe5,0xf3,0xde,0xa,0x8,0xa,0xaa,0xfc,0xe8,0x5,0x47,0xbe,0xea,0x19,0xbe, +0x13,0xec,0xce,0x57,0x5f,0x66,0x3e,0xc0,0xeb,0x5f,0x8,0x78,0x25,0x9a,0x6f,0x52, +0xf6,0x8c,0xbf,0x10,0xcd,0xf0,0x5,0xe5,0xab,0x53,0xa3,0x7e,0xc5,0xf2,0xd5,0x67, +0xec,0xfe,0x6d,0x83,0xd7,0x3f,0x13,0xfd,0x46,0x34,0x82,0x4f,0x2,0x69,0x7c,0xce, +0x7c,0x65,0xe4,0x3,0xb3,0xbe,0x81,0x11,0xa,0xcd,0x57,0xa4,0x4d,0xa3,0xf9,0xfa, +0xce,0x7c,0x35,0xfd,0xd7,0x31,0x7d,0xce,0xf1,0xf7,0x38,0x96,0xf,0x24,0xf1,0xe1, +0x56,0x72,0xdf,0x99,0xe1,0xd3,0xeb,0x2f,0xb3,0xf3,0x95,0x4,0x60,0x34,0x1f,0xf0, +0xfa,0x66,0x5e,0x1f,0x41,0xed,0xd7,0xd5,0xf3,0x95,0x1c,0x2d,0xbf,0x48,0x20,0xe2, +0xfa,0x3a,0x9f,0x4f,0x2e,0x25,0xf4,0xed,0xc6,0xa9,0x5f,0x9d,0x80,0x71,0x42,0x9f, +0xb7,0x7f,0xe,0xbf,0x3e,0x1c,0xf3,0x83,0x38,0x4e,0xfd,0x2a,0xfa,0xf8,0x6,0xa8, +0xfb,0xfa,0xe0,0xfb,0x84,0xc0,0xfa,0x95,0x35,0x3f,0x88,0x3,0xea,0x57,0x30,0xd5, +0xfd,0x25,0xaf,0xbe,0xc1,0xf1,0x55,0x3,0xeb,0x57,0x48,0xf5,0x21,0xdf,0xfc,0xa0, +0x9a,0xaf,0xd8,0xfd,0x51,0x27,0xd5,0xfd,0x39,0xaf,0x72,0x40,0x5c,0xf5,0x97,0x30, +0x9f,0x96,0xaf,0x24,0x97,0xcf,0xae,0x5f,0xb1,0xfb,0xdf,0x47,0x99,0xd7,0xaf,0xa2, +0xfb,0xb4,0x7c,0xf5,0x70,0xb7,0xd9,0x9,0xab,0x5f,0xc1,0x54,0xf5,0xa1,0x74,0xbe, +0x90,0xfa,0xd5,0x3c,0x7c,0xf2,0xa5,0xa0,0x72,0x60,0x35,0x7e,0xfd,0x8a,0x9d,0x7f, +0x90,0x77,0x7c,0x93,0xd5,0x4f,0x15,0x2a,0x7f,0x83,0xef,0xb3,0xf6,0x3b,0x8b,0x5c, +0xbf,0xfa,0x14,0x86,0xe5,0xab,0x64,0x3e,0x12,0xe8,0x63,0xd,0x1c,0x32,0x3f,0x78, +0xe8,0xce,0x57,0x4f,0xc3,0xb0,0xfe,0x25,0xd9,0xfa,0x1c,0xea,0xf0,0x89,0x57,0x15, +0xd1,0xf7,0x7,0x91,0x10,0x9c,0xaf,0xa0,0x3b,0x5f,0x59,0xf5,0x2b,0xc8,0x9f,0x5f, +0x98,0xa6,0xf4,0xdd,0xfc,0xfc,0xcc,0xe1,0x33,0x5f,0x78,0xe0,0xf5,0x39,0xf3,0x15, +0x70,0xe7,0x97,0x27,0x30,0x7c,0x7e,0xe6,0x3c,0x9d,0x8f,0xb4,0xa6,0x67,0x7f,0x61, +0x2f,0x36,0x1,0xfc,0xf6,0x73,0x8e,0xbf,0x7b,0x6e,0x5f,0x78,0xfd,0x2a,0xfd,0xf1, +0x6d,0x29,0x6f,0xfc,0x10,0x79,0x7d,0xf2,0x8c,0xf5,0xed,0x91,0xf3,0x55,0x6,0xbe, +0xab,0x6f,0xb4,0xec,0x27,0xb6,0x3a,0xb3,0xdb,0xcf,0xa8,0x5f,0x45,0x9e,0x7f,0x8b, +0xbf,0xfe,0xca,0xed,0x7b,0x3c,0xfa,0x89,0xc3,0x17,0x70,0xfe,0xf9,0xeb,0x57,0x84, +0x46,0xf6,0xd5,0xd3,0xb5,0x9f,0xea,0x3,0xbc,0xf3,0x4f,0xab,0x5f,0x21,0x4e,0xbe, +0x32,0xea,0x57,0x75,0x1a,0x71,0x7e,0x90,0x24,0x5a,0x7f,0xa0,0xfb,0xf4,0xdb,0x61, +0xae,0x4f,0x36,0xeb,0x43,0x43,0x4e,0xbe,0x32,0xea,0x57,0x35,0xbf,0x2f,0xa0,0xff, +0x4b,0xb4,0xfe,0x4a,0xf7,0xe9,0xe5,0x84,0xd6,0xa8,0xd7,0x12,0x5d,0x1d,0x9d,0xa3, +0x7e,0x75,0x10,0x98,0xaf,0x1a,0x7e,0x5f,0xc0,0xf8,0x11,0x7f,0xfd,0xb,0xf3,0xe9, +0xe5,0x98,0x9d,0xab,0xbd,0x96,0xdd,0xbf,0xb4,0xcb,0xae,0xfa,0x15,0xa,0xcc,0x57, +0x3f,0xf2,0x5f,0x1f,0x1,0xe3,0x6f,0x1c,0x9f,0xdd,0x19,0x7c,0x63,0xd6,0x8b,0x71, +0xf4,0xfa,0x95,0xa3,0xfe,0x42,0xfb,0xbb,0x4d,0xe8,0x5f,0x7f,0xe5,0xf0,0xf9,0xf2, +0xcb,0x38,0xee,0xfa,0x2b,0xca,0x69,0xbf,0xa0,0xff,0x14,0xbd,0x7e,0x85,0x1c,0xf9, +0xaa,0xf,0x36,0x42,0x9f,0x5f,0xa0,0xbc,0xf5,0xed,0xf1,0xda,0x8f,0x72,0xce,0xbf, +0x40,0x9f,0xa7,0x7e,0x85,0x76,0x40,0x13,0x2c,0xd6,0x37,0x15,0xc2,0x7d,0x95,0x47, +0xc8,0x51,0xbf,0xe2,0xaf,0x6f,0x9f,0xed,0x8b,0x71,0xfd,0x7a,0x7c,0x9e,0xcf,0xdf, +0x95,0x5c,0xf9,0x4f,0xab,0x5f,0x55,0xed,0x7c,0x75,0xed,0x69,0x50,0x2f,0x84,0x3d, +0x3f,0x13,0xe4,0x8b,0xd1,0xff,0x85,0xfb,0xb4,0x99,0x5c,0x71,0x76,0xfd,0xca,0x98, +0x1f,0x54,0x22,0xfb,0x62,0x8c,0x1f,0xb3,0x7d,0x60,0x76,0xfd,0xca,0xc8,0x57,0x67, +0xd1,0x7d,0x1b,0x19,0xfa,0x22,0xd4,0x37,0x7e,0xa5,0xfb,0x9e,0x78,0x7c,0x1,0xfb, +0xb7,0xc7,0xcb,0xf7,0xe1,0x3e,0x10,0xc9,0x77,0xf6,0xb1,0xee,0x53,0x16,0xef,0x1b, +0x6e,0x47,0x6a,0x3f,0x3d,0x1f,0xdc,0x9e,0xbf,0xcf,0x78,0x43,0xfc,0x9e,0x67,0xa5, +0x98,0x18,0xc9,0xd7,0x96,0x3c,0xbe,0xa0,0x4f,0xa,0x9f,0xf1,0x86,0xf8,0xd6,0xe9, +0x30,0x68,0xfc,0xf0,0xd4,0xaf,0x9a,0xbb,0x10,0x4,0xe6,0x2b,0xfa,0x79,0xb1,0x98, +0xb9,0x4f,0x7b,0x43,0xfc,0xda,0xf1,0x81,0x85,0x10,0x3,0x7d,0xda,0xfc,0xe0,0xf3, +0xfd,0x83,0x6d,0x3b,0x5f,0x79,0x7d,0xa3,0x9,0xca,0xd2,0xa7,0xf5,0x69,0xfa,0x1b, +0xe2,0x5,0xfb,0xf8,0x42,0x10,0xe2,0x1b,0x4d,0x5a,0xfd,0x83,0x5b,0x76,0x7e,0x69, +0x2d,0xc2,0x27,0xb5,0x9d,0x3e,0xed,0xfa,0x5d,0x17,0x2,0xeb,0x57,0xce,0xe7,0x7, +0x39,0x3e,0xc4,0xf5,0xc5,0xab,0xbf,0xf8,0x7c,0xc0,0xeb,0x13,0xc4,0xc0,0xfa,0x95, +0xf5,0xfc,0x20,0x2f,0x5f,0x65,0xec,0x93,0x4b,0x2e,0x9f,0x5c,0x9a,0xe1,0xb,0x7e, +0x7e,0xd0,0xbe,0x3e,0x60,0x86,0x3e,0x4,0x99,0x6f,0x4d,0xf3,0x21,0x38,0xbb,0xfd, +0xc2,0xf3,0x15,0x1d,0x51,0x10,0xf2,0xf3,0xe2,0xfa,0xb4,0xe0,0xae,0xf9,0x7e,0x50, +0x6c,0x69,0x3e,0x23,0xc7,0x43,0xf0,0x83,0x62,0x80,0x4f,0xcb,0x57,0x3b,0xa0,0x1e, +0xec,0x23,0xa3,0xd0,0xed,0x8a,0xe2,0xfb,0xb6,0xa9,0xf6,0x86,0xf8,0x1f,0x14,0xf7, +0xc,0xdf,0xb6,0x5e,0xa2,0xfe,0x41,0xd1,0xb8,0x3e,0xa6,0x77,0x39,0xf5,0xab,0x96, +0xe1,0xd3,0xd7,0x77,0xf2,0x7c,0x42,0xc6,0x3e,0xed,0xf3,0x83,0x22,0xef,0x97,0x14, +0x37,0x42,0xea,0x57,0xd8,0x59,0xbf,0xb2,0x3e,0x57,0x9,0xf7,0x95,0x99,0x91,0xd7, +0x5f,0xc5,0xf2,0xd1,0x46,0x48,0xfd,0xa,0x3b,0xeb,0x43,0x33,0x4f,0xf4,0xa8,0xeb, +0xaf,0xd2,0xf9,0x9c,0xe3,0x2f,0x8a,0xe7,0x8b,0xb8,0xfe,0xca,0xfd,0x19,0x14,0x5c, +0x20,0xcf,0x2f,0x29,0xbd,0x23,0xcc,0x7c,0x7e,0x30,0xb2,0xaf,0x1,0x92,0xec,0xff, +0xe2,0x1,0x79,0x7e,0x79,0x6f,0x56,0xfb,0xdd,0x8e,0xec,0x7b,0x6d,0xe,0x3e,0x42, +0x43,0x7c,0x7a,0x7d,0x57,0x8a,0xe8,0x8b,0xbc,0xfe,0x2a,0xd6,0xf1,0x55,0xf4,0xfa, +0xda,0xe3,0xcb,0x4f,0x15,0x39,0xf5,0x2b,0x63,0x7d,0x7b,0x25,0x62,0xfb,0x45,0x5e, +0x7f,0xe5,0xb9,0x40,0xdc,0x20,0xcf,0x2f,0xe5,0x67,0xb4,0xfe,0xef,0xa5,0x9,0xa1, +0x9c,0xfa,0x95,0xee,0x3,0xd1,0x7d,0x89,0x8e,0xef,0xb6,0x1b,0xe4,0xf9,0xa5,0x31, +0x7e,0xb8,0x7c,0xa3,0x89,0xe9,0x33,0xf3,0xcb,0xa3,0xa8,0xbe,0x7b,0x49,0x7c,0x44, +0x70,0x81,0x3c,0xbf,0xf4,0xfb,0xb4,0xf5,0xed,0x92,0xcb,0xf7,0x6e,0xb4,0xfb,0x8f, +0xc8,0xeb,0xaf,0xdc,0x9f,0x33,0xba,0xae,0x7f,0xc3,0x2f,0x19,0x9b,0x6e,0xb9,0x7f, +0x69,0xd6,0xaf,0xc8,0xe7,0x97,0x9f,0x2a,0xd9,0xf9,0x80,0xbf,0xbe,0xdd,0xe3,0xcb, +0xea,0xfd,0x5b,0xc8,0x75,0xc1,0x42,0x44,0x39,0xed,0x47,0x9e,0xee,0x13,0x47,0xbe, +0xa,0x7a,0x7e,0xd0,0xe5,0xf3,0xbd,0x7f,0x8b,0xb4,0xe5,0x24,0x3e,0xf7,0x5,0xb, +0x7d,0xfd,0xb3,0xee,0x1b,0x49,0xc4,0x91,0xaf,0x82,0x9e,0x1f,0x74,0xd5,0xf,0x7c, +0xef,0xdf,0x22,0xa0,0x2a,0xd0,0xb4,0xfd,0x1f,0xa4,0xbc,0xf6,0x53,0x9e,0xd8,0xbe, +0x90,0xe7,0x7,0xbd,0x3e,0xf7,0xfb,0xb7,0x62,0xac,0xbf,0x8a,0xe1,0x9b,0xbe,0xae, +0xd5,0xef,0x9f,0x4c,0x9e,0x72,0xe6,0x2b,0x73,0x7e,0x30,0xd0,0xc7,0x7d,0xff,0x56, +0x42,0x1f,0x2e,0xb9,0x7c,0xee,0x5f,0xaa,0x5f,0xde,0x9,0xae,0x5f,0xb9,0x7d,0x72, +0x69,0xad,0x64,0xfa,0xb8,0xef,0xdf,0x22,0xe0,0x3f,0x24,0xba,0x3e,0x2a,0xee,0xeb, +0xa3,0xe2,0x39,0xbe,0x3b,0xc1,0xf5,0x2b,0xb7,0xf,0x4b,0x2d,0xe8,0xf0,0xf9,0xde, +0xbf,0x45,0xda,0xc3,0x24,0xe7,0x1f,0xac,0xba,0x7c,0xee,0x5f,0x52,0xed,0x9,0xd7, +0x88,0xfb,0xaf,0x71,0x7c,0xae,0xf7,0x6f,0x91,0xa8,0xeb,0x9b,0xe2,0xf9,0xea,0xd1, +0x7d,0x22,0xf3,0x71,0xdf,0xbf,0x25,0x25,0xf4,0x21,0xb7,0xf,0x25,0xf6,0x8d,0x0, +0x3b,0xff,0xb8,0xef,0xdf,0x9a,0x8f,0x8f,0xe0,0xa8,0xbe,0xd0,0xe7,0x67,0x68,0x8c, +0xf5,0x57,0x7c,0xdf,0x4a,0x11,0x43,0x8e,0x4f,0xd1,0x7d,0x8d,0x4f,0xd7,0xca,0x33, +0xdb,0x2f,0xec,0xf9,0x99,0x14,0xe3,0x9b,0x71,0xb3,0x4f,0xbe,0x64,0xf8,0xcc,0x5f, +0xda,0xf9,0xea,0x39,0xcd,0xf7,0xc7,0xdd,0x16,0x98,0xe9,0xb,0x7b,0x7e,0x26,0xb9, +0xcf,0x28,0x68,0x50,0xa5,0xd6,0xed,0x6a,0x3e,0xb9,0xc4,0xab,0xff,0xbd,0xd8,0xe8, +0xc2,0x99,0xbe,0xb0,0xf5,0x7,0xc9,0x7d,0xec,0x63,0xfa,0xf8,0xf5,0xc9,0x17,0x1b, +0x78,0xf6,0xf5,0x11,0xb6,0xfe,0x20,0x5d,0xfd,0xca,0xf0,0xfd,0xba,0x68,0xf9,0xdc, +0x5b,0x8a,0xa,0xe4,0x78,0xa6,0x6f,0xf6,0xfb,0x21,0x52,0xfb,0x1c,0xed,0x47,0xdc, +0xed,0x47,0x9e,0xae,0xce,0x6e,0x3f,0x67,0x3e,0x10,0x17,0xec,0x1b,0x55,0x67,0x9f, +0x7f,0xb3,0x7c,0x29,0xea,0xa7,0xb3,0x7c,0xca,0x4,0xcf,0xbe,0x7e,0x9d,0x3e,0xde, +0xf5,0x9b,0xda,0xf7,0x16,0xcf,0xa7,0xd7,0xaf,0x94,0xc9,0x94,0xd7,0xff,0x9d,0x4, +0xe6,0xab,0xf4,0xfb,0x5f,0xf9,0x3e,0xf7,0x6f,0xbc,0xc8,0xf3,0xe1,0x90,0xfa,0x8b, +0x44,0xc7,0xf7,0x9f,0xc7,0xbc,0x7c,0xe5,0x1c,0x3f,0x84,0xdb,0xc6,0x7b,0xb9,0xe2, +0xad,0xbf,0xa,0x1a,0x4d,0x7c,0xc7,0x37,0xac,0x3e,0x44,0x61,0xb3,0x87,0x78,0xf9, +0xc5,0xb9,0xfe,0xe0,0xe6,0x6b,0xa8,0x6e,0xf8,0xce,0x17,0xef,0x6b,0x18,0x63,0x6, +0x27,0x5f,0x39,0x7c,0xc6,0xcd,0x69,0xca,0xe3,0x1b,0xe4,0xbb,0x1b,0x32,0x3f,0xa8, +0xe,0x87,0xa,0xe0,0xe4,0x2b,0xd7,0xfb,0xb7,0x5e,0x7a,0x8d,0xa4,0xf7,0xad,0x9b, +0x3b,0x4e,0xfb,0x7d,0xd5,0xb0,0xf6,0x3b,0x41,0x8a,0xe8,0xc8,0x57,0xdc,0xe3,0xfb, +0xd2,0xed,0x9b,0x96,0x6f,0x23,0x73,0x1f,0x9,0x5b,0x7f,0x45,0xc9,0x75,0xe5,0x96, +0x23,0x5f,0x1,0xde,0xf5,0xf1,0x6a,0xe5,0x23,0xcb,0x57,0xcf,0xdc,0x67,0xd4,0xaf, +0xc4,0x6b,0xd8,0xaa,0x29,0xbf,0x2b,0xa3,0x4e,0xa1,0xa0,0xef,0x2f,0xaa,0x9e,0x9d, +0x53,0xe8,0xc8,0x57,0x22,0x2f,0x5f,0xbd,0x5a,0xb1,0xce,0xbf,0x44,0xeb,0xf,0x5c, +0xbe,0x7d,0xaf,0xcf,0xa8,0x5f,0xbd,0x2c,0xd5,0xac,0x5b,0xd9,0x4a,0xb5,0xda,0xa8, +0xd5,0xf4,0xe7,0x7b,0xdc,0xd7,0x87,0xb9,0xa7,0xb5,0x37,0x5f,0xbd,0xaa,0x5d,0x1f, +0xb1,0xf7,0xbf,0xa,0xf0,0x6d,0x70,0xc7,0xf,0xfa,0xd2,0xa4,0x59,0xb7,0x7c,0x95, +0x46,0xd5,0xf0,0x51,0x77,0xff,0x82,0x26,0xdc,0xf1,0xad,0xaa,0xf5,0x2f,0xbb,0xc9, +0xd7,0xbf,0xb8,0x7c,0x97,0x2,0x7c,0xc4,0xf2,0x11,0x8,0x27,0xb8,0x56,0x33,0xe6, +0x67,0x9c,0xfd,0x33,0x46,0xbf,0x2f,0x72,0x7d,0x5a,0xff,0xbc,0x9e,0xdc,0xd7,0xe6, +0x2d,0xb9,0x32,0x2a,0xb2,0x56,0xbe,0x1a,0x7d,0xd4,0xb5,0x7c,0x63,0xf8,0x4,0x17, +0x56,0x9d,0xf3,0x83,0xa1,0xf9,0x2a,0xe1,0xfe,0x57,0xf6,0x7,0x70,0xda,0xcf,0xbe, +0x15,0x37,0xf3,0xd5,0xe4,0xd8,0xf2,0xd1,0xca,0xef,0xb0,0x50,0x3,0xf1,0xf2,0x4b, +0x8a,0xf6,0x3,0x9c,0xf3,0xcf,0xeb,0x1b,0x39,0x7c,0xb0,0xd2,0xa8,0x9,0x35,0x31, +0x9e,0x6f,0x37,0x23,0xdf,0x3e,0xd7,0xa7,0x4c,0xa4,0xd3,0x9a,0xe5,0xab,0x56,0x9b, +0xb3,0x7c,0xbe,0x7c,0x75,0x94,0x7c,0xfd,0x95,0xcb,0x47,0xf9,0x3e,0xe4,0xe8,0xff, +0x5e,0x97,0xd1,0x81,0x50,0x10,0xc3,0xf2,0xd5,0x46,0xfa,0xfd,0xaf,0x62,0xf9,0x5c, +0xbf,0x2b,0x98,0x5f,0xd0,0xfa,0x67,0x38,0xda,0xd5,0x1f,0x4a,0x35,0x9f,0x9f,0x61, +0xfd,0x33,0xa,0x7a,0x3e,0xa0,0xbe,0x0,0x9f,0x68,0x8e,0x32,0xda,0xf8,0x36,0xfc, +0x78,0xc7,0xd8,0x3c,0xd4,0xc8,0x7,0x65,0xe6,0xb,0x7a,0xbe,0x62,0x23,0xa9,0x2f, +0xa0,0x34,0xcd,0xf3,0x39,0xc7,0x5f,0xd5,0x67,0xc,0xba,0xc6,0xf3,0x3d,0xac,0xfd, +0xb8,0xcf,0xa7,0x24,0xcd,0xf7,0xc9,0x7d,0xa,0x3d,0xfe,0x89,0xe8,0xf0,0x89,0x73, +0xf5,0x29,0xa4,0x94,0xc0,0xb7,0x6f,0xfb,0x46,0xc0,0xf2,0xa5,0x7f,0x7e,0x86,0xe3, +0x53,0x60,0x4c,0x1f,0xa6,0xa3,0xd7,0x64,0xcb,0xa7,0xe6,0x2b,0xe6,0x3,0xe9,0x9f, +0x9f,0x49,0xec,0x3b,0xc7,0xaf,0xcb,0xb0,0x50,0xd0,0xea,0xe3,0x48,0xf5,0x11,0xbb, +0xfd,0xec,0x7c,0x5,0xd2,0xef,0x2f,0xc5,0xf1,0xd1,0x48,0xbe,0xc9,0xf7,0xd5,0x80, +0x55,0xab,0x69,0xf3,0xb,0x3,0xd5,0xe7,0xb8,0x3e,0x30,0xb4,0x7c,0xe9,0xf7,0xe7, +0x4a,0xe3,0x53,0x7,0xb8,0x9a,0xb1,0xff,0x95,0x34,0x72,0xf4,0x2f,0xc8,0x7a,0x7f, +0x72,0x6,0xfb,0x9b,0xf1,0x7c,0x20,0x8a,0x4f,0xfa,0xab,0xa,0x6c,0xd6,0x6a,0xdf, +0x35,0x7d,0x76,0xff,0x3c,0xcb,0x97,0xb4,0xfe,0x62,0xfb,0xc4,0x68,0xbe,0xd7,0x61, +0xb3,0xb0,0x7a,0x3d,0x6a,0xbe,0xca,0xd0,0x27,0x44,0xf3,0x9,0x15,0x35,0x1f,0x54, +0xe3,0xe5,0x97,0x2c,0x7c,0x84,0x46,0x3c,0xbe,0xc9,0x7c,0x49,0xeb,0xa7,0xcc,0x37, +0xfd,0x27,0x91,0xc6,0x5f,0xa9,0x5b,0xa9,0xd6,0x66,0xf9,0x52,0x3d,0x9f,0x1c,0x6b, +0x7c,0x23,0xde,0xfd,0xaf,0x26,0x5d,0x35,0x60,0x9,0x7a,0xff,0x87,0xa3,0xd7,0xaf, +0xe6,0xe6,0x9b,0xf2,0xf6,0x97,0x32,0xf3,0xd5,0x29,0x85,0xb0,0xb0,0xb,0x66,0xd4, +0xaf,0xd8,0xdf,0x4a,0xb8,0xfe,0x6a,0x86,0xef,0xdc,0xeb,0xc3,0xd4,0xca,0x57,0xc7, +0x74,0xf8,0x9,0xde,0x1,0xfe,0xfa,0x90,0xc8,0xdd,0xff,0x25,0xd9,0xfa,0xab,0x59, +0xc7,0x57,0x9,0x1b,0x7f,0x87,0x1f,0x2b,0x3c,0xdf,0x8f,0x79,0xf9,0x25,0xee,0xfa, +0xab,0xed,0xc,0x7c,0xc7,0x3f,0x51,0x44,0x8e,0xef,0xad,0x0,0x5f,0x9c,0xf5,0x25, +0x56,0x9a,0x4a,0xe9,0xdb,0xb7,0xf3,0x55,0x8f,0x5b,0xbf,0xb2,0x7d,0xb1,0xd6,0x5f, +0xc9,0x42,0x34,0x1f,0xe,0xcf,0x57,0x8a,0x6c,0xe7,0x2b,0xdb,0xc7,0xbf,0x3e,0x62, +0xad,0xbf,0x1a,0xd3,0x64,0xbe,0x73,0xbc,0xbf,0xf7,0xa8,0x50,0xd8,0x64,0x3e,0x62, +0xe7,0xab,0xa7,0x43,0xf7,0xd7,0x8b,0xb9,0xfe,0x6a,0x8f,0xfd,0x8b,0x35,0x47,0x6b, +0xdd,0x2e,0x6a,0xfb,0xe7,0xc8,0x41,0xbe,0xc9,0xf7,0x9b,0x2d,0x35,0xbf,0x88,0xcc, +0x67,0x5f,0x1f,0x33,0xf6,0xd7,0x8b,0xb9,0xfe,0xca,0x62,0x15,0x7c,0x7d,0xac,0xb6, +0xff,0xd0,0x58,0x8,0xcc,0x57,0xf5,0x96,0x9d,0xaf,0x24,0x47,0xff,0x32,0xe3,0xf9, +0xe4,0x78,0xeb,0xaf,0xac,0xcb,0x83,0x58,0x2b,0xa5,0xda,0xcc,0xa1,0xed,0xdf,0xa4, +0x3d,0xbd,0x1a,0x30,0xfe,0xd6,0x45,0x35,0x5f,0x19,0xfb,0x8b,0x4a,0x8e,0xfe,0x79, +0xe6,0xfe,0x7a,0xb1,0xd6,0x5f,0x91,0x95,0xe8,0x1f,0xaf,0x6f,0x4f,0xcd,0x57,0xae, +0xf5,0x57,0x91,0xf2,0x55,0xbc,0xf1,0x2d,0x4d,0xfb,0x29,0x6a,0x7e,0x41,0xb1,0xf3, +0xb,0x69,0xf,0x4,0x3a,0xff,0xf3,0x4f,0xf5,0xb5,0x92,0xf9,0x80,0x10,0xc7,0xb7, +0x1f,0xed,0xfa,0xe5,0xe4,0xab,0x66,0xab,0x99,0x24,0x5f,0x11,0xb0,0x16,0x27,0xbf, +0x1c,0xfa,0xfa,0x3f,0xec,0x2c,0x1,0x29,0xcc,0x27,0xfb,0xf2,0xd5,0xfe,0x5e,0xc3, +0xc8,0x57,0xa,0xe,0xf0,0xed,0xf1,0xf7,0xbf,0x8a,0xe5,0x93,0x23,0xfa,0x70,0x70, +0xbe,0xd2,0xf7,0x9f,0x54,0xcf,0x2a,0xc1,0x18,0x3f,0xae,0x14,0x8b,0x61,0xf7,0xe7, +0x44,0x7f,0x10,0x28,0xb2,0x6f,0x2a,0x44,0xf3,0xa1,0xe0,0x7c,0x65,0xec,0x8f,0x59, +0xd9,0x11,0xcc,0xf1,0xd7,0x78,0xae,0x27,0x28,0x5f,0x91,0xb6,0x12,0xc7,0xe7,0xcf, +0x7,0x7c,0xdf,0x38,0x78,0xfc,0x7d,0xa2,0xef,0x2f,0x55,0x69,0xf9,0x7c,0x9b,0xdc, +0xfd,0xeb,0x40,0x2c,0x9f,0x3f,0x5f,0x5,0xb4,0x9f,0x30,0xcb,0xd7,0xf4,0xf9,0x9a, +0x3c,0x9f,0x4,0x70,0xba,0x7c,0xcf,0xf7,0x85,0xac,0x1f,0x1f,0xe9,0xfb,0x5f,0xbd, +0x52,0x33,0x7d,0x9f,0x5f,0x66,0x3e,0xee,0xfe,0x89,0x8b,0xf7,0xd,0xf4,0xfd,0xaf, +0x60,0xc3,0xbc,0x3e,0xae,0x5a,0xed,0xc7,0xdd,0xbf,0xf8,0x64,0x3e,0x3e,0x7d,0x7f, +0x6,0x54,0x72,0xac,0x44,0xfb,0xf5,0xdd,0x4a,0xa1,0x0,0x59,0xff,0x2,0xa0,0xb9, +0x3e,0x1b,0x2b,0xf6,0xf1,0x9d,0xcb,0xfd,0x9b,0xcb,0x67,0xf5,0xcf,0xb2,0x3e,0xbf, +0x0,0x1d,0x2b,0xf9,0x1a,0xd,0x35,0xbf,0x74,0x6c,0xdf,0x8f,0xca,0x5e,0xdf,0xfe, +0x5c,0xee,0x7f,0x5d,0x3e,0xd7,0xf8,0x46,0x46,0x13,0xcc,0xf1,0x19,0x7f,0x1d,0x8a, +0xbe,0xf6,0x9b,0x4b,0xfd,0xc0,0xed,0x73,0xe5,0x3,0x32,0x72,0xd6,0x3e,0xaa,0x8, +0xd7,0x6a,0xf6,0xfe,0xa2,0xac,0x7f,0xc6,0xd3,0x62,0x31,0xb3,0xfa,0x8b,0xf8,0xe1, +0x5a,0x78,0xff,0x37,0x70,0xad,0xbf,0x72,0xf9,0xee,0xde,0xad,0x15,0x56,0xbd,0xfb, +0x8b,0x66,0x5c,0xbf,0x12,0x1b,0xd6,0x4e,0x2a,0x11,0xda,0x8f,0xbe,0xe4,0xf4,0x9, +0xa2,0x9a,0xf,0x2a,0xf3,0xad,0x5f,0x81,0x4a,0x17,0x45,0x3f,0xff,0xe8,0x4b,0xce, +0xf3,0xaf,0xda,0x50,0x7d,0x85,0xd8,0xbe,0x58,0xf5,0x53,0x60,0xed,0xb7,0x3a,0xeb, +0xfa,0xd5,0x7d,0x3b,0xce,0xeb,0x57,0xf7,0xc1,0xd8,0xf9,0x2a,0x96,0x4f,0x82,0x38, +0x5a,0xff,0x67,0x3c,0x3f,0x28,0x3a,0xfb,0xbf,0xf,0xef,0x56,0x5,0xa3,0xff,0xb, +0xda,0x9f,0x1,0xa5,0xde,0xff,0x2a,0xb2,0x8f,0xb3,0xfe,0x4a,0xb4,0xf2,0x95,0xfe, +0xfc,0xf9,0xe0,0xae,0x95,0xaf,0x80,0xe9,0x1b,0xf2,0xe7,0x3f,0x62,0xac,0xbf,0x7a, +0x12,0xd5,0xc7,0x59,0xdf,0x4,0xac,0x7c,0xa5,0xef,0x8f,0x54,0x69,0x88,0x66,0x3e, +0x30,0x96,0xfe,0x7a,0xdf,0xbf,0x65,0xfb,0xce,0xe3,0xf8,0x66,0x5c,0x1f,0x21,0x3e, +0x3b,0xbf,0x78,0x7d,0xb7,0x4c,0xdf,0x1,0x7f,0xfe,0x2d,0xc6,0xf1,0xc5,0x68,0x46, +0xff,0xc2,0x7c,0x24,0x64,0xfd,0xd5,0x13,0x23,0x9f,0x8a,0x96,0xf,0x64,0xe7,0x93, +0xd7,0x4a,0xa9,0xdb,0x6f,0xa4,0xb7,0xdf,0x2b,0xf7,0x59,0xbe,0xb2,0xce,0xbf,0x6, +0xff,0xf8,0xc6,0x5d,0x7f,0x75,0xa8,0x9e,0xea,0xeb,0x9a,0x6f,0x5a,0x46,0x74,0x5c, +0xd2,0x7c,0x9b,0x44,0xbb,0x21,0x8e,0xe8,0x1b,0xe8,0xfb,0x5f,0x41,0xb3,0xfd,0xe4, +0xab,0x56,0xfb,0x6d,0xf0,0xaf,0x8f,0xb8,0xeb,0xaf,0xfa,0xb4,0xac,0xa,0x81,0xb6, +0xc1,0xb2,0x36,0xd9,0xa7,0xf9,0x6a,0x53,0xed,0x28,0x84,0x5e,0xbf,0xd5,0x46,0xdf, +0x9c,0x1f,0x54,0x7a,0x46,0x3e,0x30,0x8f,0xaf,0x62,0xf9,0x82,0xfa,0x97,0x98,0xeb, +0xf,0xfa,0xa4,0xf5,0x4d,0xd3,0x77,0xf0,0x97,0x55,0xc3,0x77,0xfe,0xfb,0x3f,0xe1, +0xf4,0x7f,0xce,0xfb,0x96,0xe3,0xf7,0x3e,0x45,0xc6,0xfc,0xa0,0xde,0xff,0x1,0xd8, +0xf0,0xfb,0x2,0xf6,0xe7,0x8a,0xb9,0x7e,0xa3,0x4f,0x1f,0x7f,0x6c,0xfa,0xd0,0x9f, +0x37,0xc,0x1f,0x39,0xfd,0x23,0x4f,0x7e,0xf6,0xf9,0xde,0xff,0xad,0xea,0xb3,0xf7, +0x97,0xe2,0xf8,0x82,0xc6,0xb7,0x98,0xeb,0x5f,0xfa,0xb4,0xd5,0x7b,0x60,0xfa,0x9a, +0xef,0x96,0xd,0x1f,0xba,0x53,0x8,0xf5,0x29,0xc7,0xef,0xf7,0xb1,0xd3,0xc7,0xfa, +0x67,0x35,0x5f,0xcd,0xc1,0xc7,0xda,0xaf,0xc9,0xda,0xf,0xdd,0xd1,0xdb,0x6f,0x1a, +0x54,0xbf,0x52,0x7a,0x1f,0xf4,0x71,0x61,0xb5,0x13,0x2f,0x5f,0x25,0xda,0xff,0x2a, +0xcc,0x17,0x38,0xbf,0xa5,0xec,0x36,0x5e,0xc6,0xb1,0xeb,0x43,0x34,0xeb,0xf6,0xb, +0xf6,0xf5,0x72,0xee,0xdb,0x69,0x3c,0xc4,0xb1,0xeb,0x57,0x34,0xc9,0xfa,0xab,0x43, +0x68,0xfa,0xa6,0xcf,0x33,0xdf,0xe6,0xce,0x2c,0x1f,0xd9,0x69,0xf4,0xcd,0xf9,0xc1, +0xc0,0x7c,0x15,0xb0,0xbe,0x3d,0xc5,0xfa,0x2b,0xdf,0xf8,0x16,0xec,0x73,0xd4,0xaf, +0xbc,0xf9,0x2a,0xf8,0xfd,0x5b,0x34,0xe5,0xfa,0xab,0xe8,0x3e,0xed,0x8b,0x1,0xf9, +0x6a,0x12,0x5c,0xdf,0xa0,0x19,0xac,0xbf,0x8a,0xe8,0xb,0xce,0x57,0xb6,0x2f,0x68, +0x7f,0x2e,0xba,0x58,0x1f,0xf6,0xe4,0x2b,0xe6,0x1b,0xe6,0xc3,0x37,0xd2,0x7d,0xaf, +0x8,0x22,0xcb,0x57,0x33,0x8f,0xef,0x62,0x7d,0x3,0x64,0xe4,0x2b,0x56,0xbf,0x42, +0xa1,0xcf,0xf,0x26,0xf3,0xa9,0xe3,0x98,0xb9,0x66,0x77,0x7d,0xc5,0xdc,0x51,0x4f, +0x1d,0x8b,0xa,0x21,0xbe,0x6a,0xe3,0xd3,0x8a,0x99,0xaf,0xf4,0xfd,0xf,0x20,0x7b, +0x7f,0x8a,0x9d,0xf,0x2,0xde,0x1f,0xbf,0x10,0x9f,0x9a,0xaf,0xba,0xd,0x33,0x5f, +0xe9,0xef,0x1f,0x84,0x2d,0xcb,0x27,0x6,0xd6,0xaf,0x16,0xe9,0x7b,0x5f,0xf3,0x39, +0xf2,0x55,0xd3,0xf2,0x9,0x33,0xc6,0xb7,0xf4,0xcf,0xa7,0xf0,0x8a,0x62,0xbe,0x7c, +0xd5,0x6d,0xba,0xf2,0xd5,0xeb,0x66,0xfd,0x6f,0x7a,0xb9,0x10,0xe6,0x4b,0xf9,0xfc, +0x5b,0x64,0x5f,0xef,0x83,0x6e,0xb3,0xb0,0xa,0xe3,0xe5,0xab,0x5,0xfa,0x76,0x1b, +0x2f,0xce,0xac,0xbf,0x64,0xd7,0x7e,0xb1,0xcf,0x3f,0x35,0x5f,0x69,0x3e,0x10,0xdb, +0x97,0xac,0x7e,0x1a,0xdf,0xb7,0xd3,0x78,0x2b,0xfe,0xfa,0xf6,0xb9,0xf9,0x88,0xec, +0xcf,0x57,0x9f,0x56,0x5,0xfd,0xf9,0x1e,0x5,0xc5,0xc9,0x57,0xd9,0xd6,0x9f,0x99, +0x6f,0xea,0x9d,0x3f,0x72,0xe6,0xab,0xa1,0x9e,0xaf,0xd6,0x68,0xa4,0x7c,0x95,0x7a, +0xfd,0x15,0xd7,0x77,0xee,0x9b,0xdf,0x72,0xe4,0xab,0x3,0x3d,0x1f,0x3c,0xa6,0x91, +0xf2,0x55,0xea,0xf5,0x57,0x5c,0x5f,0xd8,0xf3,0x65,0x4f,0xf4,0xfd,0x9b,0x2a,0x3f, +0xda,0x2e,0x9e,0xf,0x0,0x0,0x12,0x4f,0x49,0x44,0x41,0x54,0xa3,0x91,0xf2,0x55, +0xc2,0xfd,0xaf,0x66,0xf9,0x42,0xf6,0x6f,0x37,0x7d,0x6c,0xfc,0xb5,0xf3,0x15,0xa, +0xf0,0x35,0xc0,0x42,0xdb,0x6f,0xa4,0xfb,0x5e,0x31,0xcf,0x3f,0x35,0x5f,0x6d,0x31, +0x1f,0xff,0xf8,0xc6,0xdf,0xff,0x6a,0xf,0x1f,0x9a,0x3e,0xf9,0x7e,0xd9,0xf4,0x15, +0x37,0xa3,0xfa,0xcc,0x7c,0xc5,0xde,0x4f,0x77,0xd5,0x6a,0x3f,0xc8,0xbf,0x3e,0xe2, +0xef,0x7f,0xd5,0x3a,0xed,0x9b,0x3e,0xd4,0x34,0xa6,0x17,0x55,0x50,0x6d,0x86,0x6f, +0x7c,0x19,0x16,0xa,0x80,0xf5,0x2f,0xce,0x7c,0xc5,0x7c,0x80,0xd7,0xbf,0x24,0xd9, +0xff,0x6a,0xed,0x98,0xf9,0x60,0xd7,0xf4,0x29,0xd8,0xf2,0x1d,0xf1,0xcf,0x3f,0x78, +0x1f,0xd5,0x6a,0xdb,0x1c,0x9f,0x75,0x7d,0x6c,0xf0,0xfa,0xe7,0x24,0xfb,0x5f,0x9, +0xd8,0xf2,0x61,0xe6,0xa3,0x96,0x6f,0x97,0x9f,0x9f,0xe1,0x9b,0xaa,0xcf,0xde,0x5f, +0x94,0xe3,0xe3,0x8e,0x6f,0x49,0xf6,0xbf,0x72,0xfa,0xb6,0x99,0xcf,0x3a,0xff,0xd6, +0xf9,0x3e,0xb0,0x66,0x3d,0x3f,0xa8,0xe7,0x2b,0x76,0x7d,0x84,0xcd,0xf,0xd2,0x64, +0xfb,0x5f,0x39,0x7c,0xd3,0x5b,0xbe,0xf6,0x5b,0xe7,0xd5,0xaf,0x74,0x9f,0xfb,0xf9, +0xc1,0x68,0xf9,0x2a,0xc9,0xf8,0xe6,0xf0,0x51,0xff,0xf1,0xd,0x6e,0xbf,0x24,0xf9, +0x85,0xb4,0xe3,0xef,0xaf,0xb2,0x66,0xfb,0x80,0xff,0xfa,0xd8,0xcd,0xd6,0x17,0xf5, +0xfd,0x74,0xce,0xfe,0x5,0xdb,0xfd,0x8b,0xe8,0xeb,0x5f,0x8e,0x12,0xfb,0x78,0xd7, +0x6f,0x12,0x9f,0xb3,0x7f,0x16,0xb8,0xfd,0x33,0xe7,0xfd,0x24,0x70,0xd,0x9,0x46, +0xff,0x17,0x54,0xbf,0x82,0xbc,0xfe,0x2f,0x89,0x2f,0xc2,0xfd,0xb9,0xbf,0x7f,0x86, +0x81,0xf5,0x2b,0x76,0x7f,0xde,0xe1,0x8d,0x1f,0x4,0xbc,0x4e,0xe7,0xe1,0xf3,0xb5, +0x1f,0xb2,0xf2,0x55,0xcf,0x5d,0x1f,0x42,0x1d,0xd3,0xf7,0x88,0x37,0xfe,0x92,0x36, +0x9c,0x47,0xfb,0xfd,0x3e,0x24,0xbf,0x78,0x7d,0x8f,0xd8,0xf1,0xe5,0xe5,0x97,0x84, +0xfb,0x5f,0xcd,0xf2,0x9d,0xa,0xd1,0x7d,0x95,0x30,0x9f,0x34,0x1f,0x5f,0x58,0xbe, +0xd2,0x7d,0xaf,0x54,0xad,0xfa,0x95,0xe5,0xe3,0x1d,0xdf,0xc5,0xfb,0x6,0xfa,0xf5, +0xc1,0xe6,0x8f,0xe4,0xab,0x13,0x18,0x96,0xaf,0x12,0xee,0x7f,0x15,0xc9,0xb7,0x55, +0x77,0x3c,0xf8,0x3d,0xfe,0x4a,0xc5,0x35,0x3f,0x68,0xcd,0x6f,0x3d,0x81,0x61,0xfd, +0x4b,0xf6,0xf7,0x6f,0x47,0x56,0xff,0x57,0x7d,0xbe,0xe5,0xe8,0x5f,0x6a,0xd,0xfe, +0xfc,0xe0,0xef,0x59,0xfd,0x5,0x66,0xb8,0xff,0x55,0x88,0xcf,0x1a,0xdf,0x8,0x7e, +0x69,0x87,0xe3,0x33,0xf3,0x95,0x3d,0x3f,0x38,0x97,0xfd,0xaf,0x82,0x7d,0x56,0x3e, +0x20,0xd4,0xe9,0x3,0xb5,0xa6,0xd3,0xe7,0x98,0x1f,0x84,0xf3,0xa8,0x5f,0x85,0xf8, +0xac,0xf5,0x57,0x47,0xaf,0xb9,0x7d,0x9e,0xf5,0xed,0x73,0xad,0x5f,0x45,0x69,0x3f, +0xfc,0x86,0xdb,0x17,0xfb,0xf9,0xbc,0xb9,0xf8,0x76,0x33,0xf5,0x65,0x5f,0xbf,0xb7, +0xf3,0x55,0xf5,0x5e,0x2b,0x96,0x2f,0xcb,0xfd,0xaf,0x66,0xd4,0x87,0xf4,0xf5,0x7, +0xae,0xfe,0xf,0xde,0xaf,0x1a,0xf3,0x83,0xc1,0xbe,0x2c,0xf7,0xbf,0xa,0xf7,0x71, +0xd6,0x5f,0x59,0xf9,0x2a,0xd8,0xe7,0xda,0xff,0xea,0xee,0xcd,0xcb,0x86,0x6f,0x3a, +0x8f,0xf9,0x19,0xbf,0xcf,0xca,0x57,0xc1,0x3e,0xd7,0xfe,0x57,0xd5,0xde,0xc4,0xf0, +0x9d,0x2f,0xc6,0x67,0x8d,0xbf,0xc1,0x3e,0xd7,0xfe,0x57,0x95,0xd1,0x64,0x7e,0xc7, +0x97,0xdc,0x49,0xeb,0x7b,0xa9,0x32,0x22,0xf3,0xf3,0xd1,0x9f,0xa6,0xf7,0x49,0x37, +0x99,0x6f,0xe,0xf3,0xbf,0x62,0x5a,0xdf,0xab,0x15,0xf8,0x11,0xf3,0xd5,0x17,0x71, +0xfd,0xc6,0xf7,0xb1,0xf3,0x2f,0xdd,0xfa,0x3,0xd7,0xf3,0x47,0xec,0x67,0x4c,0xef, +0xd2,0xd4,0x3e,0xf5,0xfa,0x48,0xb1,0xff,0x15,0xf0,0xfd,0xc,0xed,0xf9,0xad,0x90, +0xfa,0x41,0x4c,0x5f,0x55,0xeb,0x5f,0xd2,0xee,0x3f,0xa4,0xf,0xe0,0xcc,0x21,0x17, +0x43,0xeb,0x2f,0xb3,0x7c,0x9e,0xfd,0xdb,0xab,0x5a,0xff,0x9c,0xf5,0xfe,0x57,0xc1, +0xcf,0xf,0xc6,0xf5,0xa5,0xde,0xff,0x8a,0xce,0xb9,0xfd,0xd8,0xb7,0x4a,0xb5,0xbf, +0x59,0x86,0xe7,0x1f,0xf7,0xb3,0x9b,0x81,0x8f,0x7b,0xfd,0x66,0xe4,0x4b,0xb1,0xff, +0x55,0xf0,0x67,0xd6,0xfa,0xd,0xfe,0xfb,0x7,0xa9,0xb9,0x8e,0xd7,0xfb,0xad,0x92, +0xae,0xbf,0x4a,0xee,0xd3,0xdf,0x5f,0xe6,0xf7,0x99,0xeb,0xc8,0x39,0xbe,0xe4,0xfb, +0x27,0x26,0xf2,0x11,0x10,0xe0,0xbb,0x15,0xe4,0xdb,0x58,0xac,0xef,0x57,0x1,0xbe, +0xa0,0xe3,0xbb,0x88,0xf5,0x1b,0xe,0x9f,0xf2,0x71,0xce,0x7d,0xbd,0x98,0xd7,0xc7, +0x82,0x7d,0x38,0xe0,0xfa,0xa0,0x4b,0xf4,0xad,0x7f,0x6f,0x2c,0xcb,0xfd,0xe2,0x96, +0xb6,0xfe,0x0,0x71,0x7d,0x64,0xa9,0xbe,0x9a,0x4,0xab,0xd5,0xdb,0xa8,0xaa,0xad, +0x7f,0x19,0x1c,0xe5,0xd0,0x7,0x2a,0x15,0xf1,0xf6,0x4,0x7,0xaf,0xcf,0xa1,0x57, +0x97,0xe8,0x23,0x18,0x54,0x20,0xbd,0x33,0xa1,0x20,0xde,0xf8,0x86,0x16,0xb4,0xbe, +0x49,0xf5,0xbd,0xe,0xc9,0xe4,0x32,0x35,0xe6,0x7,0x4b,0x39,0xf4,0x9,0x15,0x32, +0x21,0x39,0x6e,0xbf,0x4a,0xa5,0x35,0x21,0x58,0xc,0xf5,0x61,0xf9,0x2b,0x45,0x7a, +0xa9,0xfd,0xca,0xda,0x83,0x31,0xad,0x6f,0x6e,0xa6,0x7a,0x7e,0x35,0xa6,0x4f,0xbd, +0x7e,0x6b,0x13,0x5a,0x9d,0xe1,0xc3,0xa,0xa2,0x6b,0x0,0xee,0xec,0xc0,0xb5,0xba, +0xb6,0xb5,0xf0,0xa2,0x7c,0xb4,0x76,0x32,0x96,0xc7,0xb7,0xe9,0x96,0xbe,0xbf,0xe8, +0x61,0x88,0xf,0x6b,0xbe,0xde,0xe,0x68,0xd5,0x16,0xea,0x13,0x8c,0xa,0x96,0x91, +0xaf,0x60,0x4,0x1f,0xae,0xe1,0x5a,0xaa,0xfd,0xaf,0xe2,0xf9,0x44,0xeb,0x96,0x2f, +0x30,0x5f,0xe9,0xe7,0xdf,0xd3,0xaa,0xaf,0x5d,0x71,0xfa,0x92,0xae,0xbf,0x4a,0x91, +0xaf,0xf6,0x42,0xdb,0xef,0x12,0x80,0xdd,0x7,0x0,0x55,0x51,0x2d,0xd1,0xfe,0x57, +0x73,0xcb,0x2f,0xcc,0x57,0x55,0x7d,0x22,0x80,0x55,0x58,0x4b,0xb2,0xff,0x55,0x16, +0x3e,0x25,0xd4,0x57,0xd3,0x7d,0x3f,0xba,0xe,0x6a,0x49,0xf6,0xbf,0xca,0x22,0x5f, +0xf1,0x7c,0x97,0x54,0x18,0xd2,0xfb,0x97,0xba,0x36,0xb5,0x4,0x85,0x8a,0x58,0x4b, +0xb2,0xff,0x55,0x8a,0x7c,0xa5,0xa8,0xf9,0x6a,0x2b,0x28,0x5f,0xad,0x9d,0x92,0x1a, +0x94,0xff,0xa9,0xda,0x3f,0xaf,0xb5,0x5f,0xa9,0x8a,0x63,0x5a,0x59,0xdd,0x4c,0xb2, +0xff,0x55,0x8a,0x7c,0x75,0x4f,0x42,0xd5,0x6a,0x50,0xbe,0x5a,0x3b,0x56,0x6a,0xfd, +0xab,0xdf,0xf4,0x7f,0xab,0xa4,0xef,0x1f,0x8c,0x9f,0xaf,0xde,0x97,0x26,0x58,0x8, +0x1a,0x3f,0xd6,0xd4,0xe3,0xdb,0xfa,0xfc,0x63,0x9e,0xef,0x5e,0xb6,0xbe,0x75,0x73, +0x65,0xaf,0x2f,0x5f,0x29,0x93,0x9,0xfd,0x6e,0x98,0xaf,0x3e,0xea,0x51,0x72,0xc9, +0xe7,0x4b,0xf4,0xfe,0xc1,0xe0,0xf,0xdb,0xc6,0xdd,0x97,0xaf,0x14,0x35,0x5f,0x5d, +0xf,0xca,0x57,0xea,0xf5,0xf1,0x66,0x6b,0xd4,0xe3,0x1f,0x8a,0x6c,0xc7,0x37,0x1a, +0x90,0xaf,0x14,0x35,0x5f,0x5,0xce,0x6f,0x55,0x31,0xbd,0xd7,0xf3,0xfa,0xc6,0xd7, +0x93,0xad,0xbf,0x4a,0xe2,0x33,0xf2,0x55,0xa0,0xaf,0xa6,0x1e,0x5f,0xd5,0xa7,0x25, +0x2c,0x7b,0x78,0x86,0x7,0xc9,0xd7,0xf,0xc5,0xf4,0xa9,0xd7,0x6f,0x5d,0xcd,0x57, +0x81,0xbe,0xba,0xea,0x1b,0xa9,0x3e,0xb5,0x7,0xec,0x58,0xbf,0x9,0x86,0xb,0xf2, +0xe9,0xf9,0x4a,0x91,0xa8,0xde,0xff,0x9d,0xe0,0x80,0xeb,0x63,0x72,0x55,0xf3,0xe1, +0x47,0xec,0xf7,0x4e,0xe7,0xe2,0x2b,0xec,0xb4,0x67,0xe4,0x2b,0x7d,0xff,0x2b,0xf9, +0x7e,0xc9,0xdc,0x5f,0xb4,0x88,0xdc,0x23,0x1c,0xf4,0xf8,0x6e,0x67,0xea,0x23,0xf8, +0x21,0x10,0xc2,0xf3,0x95,0xbe,0xbf,0x40,0x95,0x3d,0x7f,0x24,0xa1,0xa1,0x3b,0x61, +0x79,0x7c,0xed,0x93,0x4c,0x7d,0x8a,0xf2,0x8e,0xb1,0x61,0x77,0x70,0xbe,0x32,0xf6, +0x97,0xea,0x9a,0xbe,0x11,0x3e,0x8,0x6f,0x3f,0x9a,0xad,0x8f,0xce,0xf2,0x29,0x86, +0x4f,0x2e,0x9b,0x3e,0xda,0xf0,0xf8,0x36,0x69,0xd9,0xf0,0xb5,0xb,0xda,0xfa,0xa6, +0xac,0x7d,0x1f,0xcc,0xf2,0xe9,0xfb,0x5f,0x55,0x30,0x70,0xfb,0xb4,0x19,0x85,0x82, +0xee,0x7b,0xc0,0x7c,0xc6,0xfe,0x57,0x52,0xa6,0xfd,0x9f,0x72,0x38,0xcb,0x87,0x8d, +0xfd,0xaf,0x28,0x30,0xd7,0x5f,0x51,0x63,0x93,0x98,0xa9,0xfe,0x7a,0x58,0x6d,0xb9, +0xce,0x9f,0xa,0xe,0xdf,0x9,0x38,0xc9,0xd6,0xa7,0xfc,0x2c,0xc8,0x47,0x8a,0x5b, +0xda,0xfe,0xa2,0xc8,0xd8,0x5f,0xca,0xf4,0x61,0x85,0x18,0xd7,0xef,0x54,0x13,0x69, +0x9,0xb,0x3e,0x2c,0x39,0x8e,0x6f,0xd6,0xe3,0x5b,0x98,0xf,0xe9,0xf7,0xbf,0x3, +0xc3,0xd7,0x65,0xbe,0xf3,0x55,0xdb,0xa7,0xff,0xdb,0xf6,0x26,0x6b,0xbf,0x83,0xec, +0x7d,0x4,0x3f,0xe6,0xf4,0x2f,0xc6,0x97,0x1c,0xf9,0xa,0xa0,0xa6,0x68,0xf8,0x8, +0x42,0x5e,0xdf,0x80,0xf9,0xae,0xcf,0x21,0x1f,0x70,0xfb,0x67,0xd3,0x47,0x8b,0x96, +0x4f,0xbe,0x6f,0x5e,0xbf,0xb4,0xe8,0xf3,0xc9,0xa6,0x6f,0x3a,0x97,0xfa,0xb,0xd, +0xba,0xff,0x20,0x97,0x69,0xd8,0xfa,0x2b,0x6a,0xbf,0x5a,0xc7,0x9c,0x17,0x3c,0x5d, +0xb0,0x8f,0xd0,0xe0,0xfd,0xf,0x78,0xed,0x7,0x17,0xed,0xc3,0xd1,0x7c,0x63,0xc7, +0xf5,0x9b,0x7d,0xfd,0x34,0xd8,0x17,0x92,0xaf,0x5c,0xbe,0x3d,0x47,0xff,0xb7,0x50, +0x9f,0x91,0xaf,0xf8,0xf3,0x83,0x53,0x6b,0xfa,0x77,0xbb,0xe8,0xf2,0x91,0x45,0xf9, +0xcc,0xf1,0x43,0x9f,0x1f,0x6c,0xcb,0xe6,0xf3,0xf1,0x1c,0xdf,0xdb,0x65,0xd3,0x37, +0xb9,0x9e,0xd1,0xfb,0x7,0x63,0xf9,0x88,0xbe,0xff,0x41,0x55,0x2c,0x7,0xd5,0x77, +0xff,0x94,0x8d,0xbf,0xd2,0x41,0x46,0xef,0x1f,0x4c,0xe0,0xab,0xf4,0xc5,0x20,0xdf, +0x6,0xf3,0xf5,0x87,0xcb,0x38,0xbe,0x8a,0xb1,0xff,0x95,0x12,0xe8,0xdb,0x5c,0xb2, +0x4f,0x99,0xe1,0x3,0xce,0x7c,0x9a,0xea,0xfd,0x83,0x89,0x7c,0xd8,0xd8,0xff,0xa, +0x8b,0xb3,0xe6,0x17,0x2c,0x5f,0x7d,0x41,0xfd,0x4b,0x71,0xb,0xb2,0xfa,0x15,0x80, +0x28,0xd8,0x87,0xdd,0xbe,0x8c,0xd7,0x1f,0x4,0xfb,0x50,0xb5,0xc3,0xea,0x57,0x0, +0xfe,0x6d,0x29,0xc8,0x67,0x15,0x30,0xe1,0x41,0xca,0xf7,0xf,0xc6,0xf4,0x4d,0xb0, +0xbd,0xbf,0x28,0x12,0x3,0xdb,0x8f,0x10,0x47,0x7d,0x23,0xf5,0xfa,0x97,0x38,0x3e, +0x6a,0xef,0x2f,0xea,0xed,0x9f,0x9d,0xeb,0x87,0x84,0x7f,0x6f,0xd7,0x87,0x16,0xe9, +0xbb,0x4c,0xbd,0xfb,0x8b,0xf2,0x7d,0xef,0x6d,0xb2,0x6,0xcc,0x60,0xfd,0x55,0xac, +0x7c,0x55,0x89,0xb4,0xfe,0x6a,0x6f,0xd3,0xfe,0xfd,0x45,0xb6,0x1f,0xc1,0x85,0x48, +0xeb,0xff,0xf6,0xa,0xcb,0xf1,0xd1,0x2a,0x8c,0xe4,0x7b,0xb0,0xe1,0xf2,0x2d,0xec, +0xfa,0xa5,0x7a,0xff,0x77,0x12,0xf0,0xfc,0x20,0xb2,0xde,0xaf,0xbb,0x7b,0xe8,0xf2, +0x2d,0xaa,0xff,0x73,0xe7,0x2b,0xf3,0xfe,0x48,0x2e,0x15,0x37,0xd,0xdf,0xd0,0xda, +0xdf,0x7b,0x8a,0x5d,0xbe,0x45,0x8d,0x1f,0xee,0x7c,0xd5,0x4,0xac,0x7e,0x55,0x33, +0x7c,0x7,0x81,0xfb,0x4b,0x6d,0x2c,0x23,0x5f,0xb1,0xfb,0xf3,0x11,0x36,0x7d,0x28, +0xd3,0xfd,0xaf,0x52,0xe4,0x17,0x63,0xff,0x2b,0x6a,0xd5,0x87,0xb0,0xe9,0xd3,0xf6, +0x67,0x90,0xaf,0xee,0x60,0xa,0x37,0x73,0xe0,0x23,0x56,0x7d,0x6d,0x9f,0xf9,0xe4, +0xf2,0x11,0x1e,0x3d,0x3c,0xa5,0x9d,0xda,0x32,0x7d,0x18,0x79,0xea,0x57,0xac,0xfd, +0xb4,0xe7,0x7,0xf1,0xe8,0x9d,0xe3,0xd6,0xa3,0xe5,0xf8,0x88,0x39,0x3f,0x8,0xdd, +0xf5,0x2b,0xcb,0xa7,0xed,0xcf,0xa0,0xfa,0x70,0x17,0xe2,0xe5,0xf8,0xcc,0xf9,0xc1, +0x5d,0x77,0xfd,0xca,0xba,0x3e,0xb4,0xfd,0x19,0xf0,0xe8,0x83,0xe5,0xf9,0x26,0x76, +0xfd,0x0,0x20,0xd6,0xbf,0x10,0xd6,0xbf,0xe8,0xcf,0x6f,0xc9,0x57,0x3f,0xc0,0x43, +0x88,0x96,0xe4,0xb3,0xeb,0x2f,0xce,0xfa,0xd5,0xa6,0xc3,0x87,0x95,0x9f,0xa9,0x3e, +0xc7,0x2b,0x17,0x17,0x5b,0xbf,0x9a,0xb9,0xbf,0xa8,0xe6,0xeb,0x42,0xb0,0x1c,0x5f, +0x58,0xfd,0xca,0x6a,0xbf,0xc7,0xaa,0x4f,0x5c,0x92,0xf,0x47,0xf0,0xed,0xe0,0x16, +0x5c,0xf5,0x7d,0xb7,0xa5,0xd7,0xaf,0xb2,0xdd,0xff,0x2a,0x55,0xfd,0x2a,0x60,0xff, +0x2b,0x9c,0xe9,0xf3,0xd3,0x29,0xf2,0xd5,0x90,0x9f,0xaf,0x4e,0x3b,0x59,0xee,0x7f, +0x95,0x22,0xbf,0x1c,0xf0,0xf3,0xd5,0xf1,0xa3,0x2c,0xf7,0xbf,0x4a,0xe1,0x43,0xfc, +0x7c,0x85,0x61,0x96,0xfb,0x5f,0xa5,0xc8,0x2f,0x88,0x9f,0xaf,0x2,0x7d,0xd,0x90, +0x13,0x5f,0x56,0xfb,0x5f,0x65,0x93,0xaf,0x44,0x96,0xaf,0x10,0xf3,0x65,0xb5,0xff, +0x55,0xca,0x7c,0x65,0xec,0x2f,0xa5,0xbf,0x2e,0x44,0xcf,0x57,0x30,0xac,0x7f,0xc9, +0x7e,0xfd,0xd5,0xcc,0x7c,0x65,0xf8,0xfa,0x94,0xe5,0x2b,0xc0,0x7c,0x59,0xed,0x7f, +0x95,0x49,0xbe,0x62,0xeb,0xf,0x48,0xc8,0xfb,0x93,0xe9,0x1c,0xd6,0x5f,0x45,0xcd, +0x57,0x77,0x4b,0x2c,0x5f,0xad,0x86,0xfb,0x32,0x5e,0x7f,0x15,0x9a,0xaf,0xe0,0x42, +0xf6,0xbf,0x4a,0x9e,0xaf,0xe0,0x82,0xf6,0xef,0x4c,0x9a,0xaf,0x40,0xae,0x7d,0x61, +0xeb,0xdb,0xf3,0x91,0xaf,0xa,0xa1,0xf5,0xab,0x9c,0xe4,0x2b,0x73,0x7e,0x50,0x60, +0xf9,0xa,0xb2,0xfa,0x15,0x6f,0xfc,0x58,0xbc,0x8f,0xe8,0xf3,0x1f,0x55,0xf6,0xfe, +0x41,0x89,0xed,0x7f,0x75,0xd0,0xe4,0x8d,0xbf,0xcb,0xf2,0x55,0x7a,0x2,0xcb,0x57, +0xe6,0xfe,0x57,0xa8,0xc9,0xcb,0x2f,0x8b,0xf7,0x19,0xfb,0x23,0x55,0xd8,0xf8,0x3b, +0x62,0xe3,0x6f,0xfe,0x7d,0xf9,0x38,0xbe,0xd8,0xd8,0xff,0xca,0xf4,0xa9,0xf9,0xca, +0xf2,0x2d,0xf9,0xfa,0x50,0xf3,0x15,0xb0,0xe7,0x7,0x7d,0xf9,0xa,0x35,0x97,0xdc, +0xbf,0xa8,0xf9,0x6a,0xdb,0x9e,0x1f,0x4,0xcc,0x87,0x99,0x6f,0x7f,0xd9,0xfd,0xf3, +0x4,0xdf,0x72,0xcc,0xf,0xa,0x2c,0x5f,0xcd,0x65,0xff,0xab,0x64,0xf9,0xa,0x38, +0xe6,0x7,0x5,0x96,0xaf,0x72,0xe3,0x63,0xcf,0xf,0xe6,0x37,0x5f,0x81,0x8b,0x7c, +0x95,0x2a,0x5f,0x81,0x9c,0xe7,0x2b,0xcd,0x87,0x63,0xbd,0x1f,0x67,0xf1,0xe3,0xc7, +0x69,0xc0,0xfc,0x20,0xcd,0x49,0xbe,0x3a,0xee,0xf1,0xeb,0x57,0x34,0x4f,0xe3,0x2f, +0xa7,0x7e,0x45,0x73,0x92,0x5f,0xf0,0x6f,0xa8,0x7b,0xfd,0x38,0xf3,0xbd,0x97,0x13, +0xdf,0xff,0xd,0xf0,0xfd,0x4d,0x4e,0x8e,0xaf,0xb9,0xfe,0xa,0xb0,0x7c,0xc5,0x7c, +0x78,0xf9,0xf9,0x6a,0xcb,0x3a,0xff,0x98,0xf,0x2b,0x96,0x2f,0x7,0xf9,0xaa,0xca, +0xfa,0x3f,0xce,0xfc,0x20,0xcd,0x41,0xbe,0xaa,0xce,0x9a,0x1f,0x5c,0x72,0xbe,0xaa, +0xce,0x9a,0x1f,0x5c,0x72,0xbe,0xaa,0xe6,0x3c,0x5f,0x55,0x73,0x9e,0xaf,0xaa,0x39, +0xcf,0x57,0x5f,0x84,0xf9,0xc1,0x40,0x5f,0x4e,0xf2,0x95,0xdb,0x27,0x5f,0xb1,0xea, +0xcf,0x39,0xc9,0x57,0x6e,0x1f,0x1e,0x21,0x9c,0xaf,0x7c,0xe5,0xf5,0x61,0x94,0xaf, +0x7c,0x15,0xe8,0xdb,0xcf,0xa9,0xf,0xe6,0xf9,0xf8,0xca,0x57,0x6d,0x5f,0x2e,0xaf, +0xf,0xc5,0xf6,0xe5,0xb1,0x7f,0xb1,0xe7,0x7,0x97,0x9e,0xaf,0x2,0x7c,0x21,0xef, +0x77,0xce,0x83,0x2f,0xec,0xfd,0xce,0x4b,0xf7,0xe5,0x2a,0x5f,0x71,0xdb,0x2f,0x47, +0xf9,0xe5,0xb,0xef,0xcb,0xc7,0xf5,0x1b,0x58,0xbf,0xda,0xc8,0x53,0xfd,0x6a,0x70, +0xb7,0xc4,0xf2,0x95,0xb9,0xbe,0x98,0xa2,0x9c,0xd4,0xaf,0x80,0x5e,0xdf,0x10,0x59, +0x7d,0x43,0x9b,0xd7,0xa,0x7e,0x3f,0xdd,0x12,0x8e,0xef,0xaf,0x74,0x9f,0xf6,0x94, +0xba,0x91,0xf,0x4,0xd3,0x7,0x73,0x52,0x1f,0xfa,0x38,0xe7,0x3e,0xa3,0xfe,0xc7, +0xe6,0x8f,0x46,0xf8,0x3b,0xcc,0x97,0xab,0xf9,0x41,0xd3,0xa7,0xe6,0xab,0xe7,0x4c, +0x1f,0x58,0xe6,0xf5,0xf1,0x3d,0x59,0xee,0x5f,0x2e,0x16,0xec,0xfa,0x95,0x3d,0xff, +0xc6,0xea,0x2f,0x60,0x89,0xfd,0xb,0x91,0x50,0xf5,0xf6,0x4,0x41,0xbb,0x7e,0x65, +0xaf,0xbf,0xb2,0x7c,0x4b,0xec,0x9f,0x9,0x70,0xef,0x2f,0xea,0x7c,0x7f,0x63,0x1e, +0xea,0x57,0xa,0xa8,0xd0,0x3b,0x13,0xcc,0x7d,0xff,0xe0,0x66,0x3e,0x7c,0x64,0x72, +0x19,0xe7,0x76,0x7e,0x50,0xf7,0xe5,0x78,0xfe,0x4d,0xf5,0x85,0xef,0x2f,0xba,0x6c, +0x9f,0x84,0x6a,0x13,0x6d,0x29,0x62,0x4e,0xf3,0x15,0x39,0x91,0xc7,0xb7,0x49,0x51, +0xf3,0xe1,0xc3,0x1c,0xd6,0xaf,0xb4,0x47,0x8e,0xcd,0xfd,0xaf,0x4e,0xa1,0x9e,0xaf, +0xd6,0xca,0x2c,0x5f,0x6d,0xe4,0xe1,0xfe,0x5c,0xb0,0xf6,0xbf,0x32,0xf3,0x55,0xcb, +0xca,0x57,0xa2,0xe9,0x13,0x73,0x32,0xfe,0xee,0x51,0xf7,0xfe,0x57,0x2c,0xbf,0xfc, +0x38,0x57,0xf9,0xc5,0xf6,0xb1,0xf7,0xbf,0xbd,0x95,0x13,0x9f,0xf1,0xfc,0xe5,0x6f, +0xcb,0xbe,0xf9,0xd5,0x5c,0xcd,0xf,0xfe,0x6,0xb0,0x7c,0x85,0xf3,0x70,0x7d,0x9c, +0x9f,0xc,0xd4,0x7c,0xe5,0x98,0x1f,0xb4,0xe7,0xdf,0x70,0x1e,0xea,0x57,0x13,0x9, +0xaa,0xf9,0x2a,0xbf,0xf3,0x83,0x13,0x50,0xb9,0xed,0xdc,0xff,0xa,0xb2,0xf9,0x41, +0x5,0x55,0xf3,0x50,0x3f,0x90,0x0,0x54,0xf3,0xd5,0x77,0xed,0x7c,0xc5,0xe6,0x7, +0xf3,0x91,0xaf,0x54,0xdf,0x40,0xcd,0x57,0xd7,0x73,0x3b,0x3f,0xa8,0xb6,0xdf,0x24, +0xcf,0xf3,0x6f,0x12,0xa8,0xe4,0xdb,0x27,0xa9,0xed,0x87,0xf2,0x3b,0x3f,0x38,0x39, +0x81,0x12,0x31,0xfa,0x3f,0x1c,0xe0,0xdb,0x5b,0x66,0xff,0x87,0xec,0x7c,0xa5,0xef, +0x2f,0x3a,0xb8,0x6f,0xd5,0xaf,0x50,0x1e,0xee,0xcf,0xb1,0x9d,0xaf,0x8c,0xfd,0x9b, +0xd8,0xf3,0x3d,0x23,0x63,0x7f,0xd1,0x1c,0xe5,0x2b,0xee,0xfe,0xa2,0xaa,0x6f,0x33, +0x27,0xf9,0xc5,0xf0,0xfd,0xda,0xca,0x2f,0xd,0x36,0xfe,0xe6,0xc4,0x67,0xec,0x2f, +0x6a,0xaf,0x5f,0x63,0x3e,0x9c,0x93,0xe3,0x6b,0xec,0x2f,0xa,0xac,0x7c,0xc5,0xc6, +0xdf,0x65,0xae,0xbf,0xfa,0x70,0xba,0xa6,0xa8,0xf9,0x6a,0x93,0xf5,0x2f,0x80,0xf9, +0xb0,0x72,0x8e,0x72,0x90,0xaf,0xaa,0xb5,0xc7,0xe7,0xd2,0x44,0xbf,0xff,0xc5,0xdc, +0xfd,0x45,0x97,0x9c,0xaf,0x2a,0x8d,0xdf,0x9e,0x4b,0xee,0x7c,0x25,0xb2,0x7c,0x85, +0x96,0x3f,0xbe,0x11,0xd8,0x20,0xe7,0x93,0x9,0x2e,0xf2,0xf2,0x55,0x4e,0x7c,0xe8, +0xce,0x65,0x9c,0xd7,0xf5,0x57,0x9a,0x6f,0x7c,0x27,0xc2,0xfe,0x7,0xcb,0xf3,0xf5, +0x51,0x9e,0x7d,0xa8,0xb6,0x3,0x3f,0xc8,0x71,0xbe,0xba,0x3b,0x5d,0x83,0xef,0x98, +0xf9,0x2a,0x68,0x7e,0x10,0x2d,0xb1,0xff,0x13,0x1c,0xf5,0x2b,0x63,0x7e,0xd0,0xdc, +0xbf,0x4e,0xcd,0x57,0xec,0xfe,0x68,0xb8,0xc4,0xf1,0x43,0xab,0x51,0xb1,0x7c,0x65, +0xd4,0x37,0x44,0x96,0xf,0xac,0xfa,0xfd,0x30,0x47,0xf5,0xd,0x6b,0x7f,0x51,0x47, +0xfd,0xe5,0x20,0x27,0xf9,0xc5,0xc8,0xa7,0x3d,0xcb,0x87,0x73,0xe6,0x53,0x3c,0x3e, +0x36,0x3f,0xdd,0xc8,0x55,0xfd,0xaa,0x2b,0x7a,0xeb,0x57,0x1b,0x4b,0xbc,0x3e,0xbe, +0x27,0x2b,0x5a,0xfd,0xa,0xda,0xf5,0xab,0x3,0xd1,0x5b,0xbf,0x5a,0x62,0xff,0x42, +0x24,0x74,0x4f,0xab,0x5f,0x75,0xec,0xfa,0x95,0xb9,0xbf,0xa8,0xa3,0x7e,0x85,0x96, +0xd7,0x3f,0x13,0x50,0x79,0x5f,0xf5,0x39,0xf6,0x17,0x85,0xa2,0x98,0xa3,0xf9,0x41, +0x5,0x54,0x14,0xad,0x7e,0x65,0xef,0x2f,0xca,0xfa,0xe7,0x7c,0xd4,0xaf,0x34,0xdf, +0x40,0xcd,0x57,0x8f,0x72,0x9a,0xaf,0x8c,0xf6,0x23,0xb8,0x92,0xd3,0xfc,0xa2,0x4d, +0xf,0x6a,0xbe,0x42,0x5e,0x7d,0x12,0xaa,0xab,0x3e,0x4,0x73,0x9a,0xaf,0xc8,0x89, +0xda,0xff,0x49,0xa4,0x8,0x73,0xfa,0xfc,0xa0,0xbe,0x23,0xb1,0x3b,0x5f,0xb1,0xe7, +0x7,0xaf,0xe4,0xe2,0xf9,0x41,0xc1,0x97,0xaf,0x58,0xfd,0xde,0xce,0x57,0x38,0x57, +0xf9,0xca,0xff,0xfc,0x20,0xce,0x49,0x7e,0x31,0xf6,0xef,0x4,0xc0,0x9b,0xaf,0x86, +0xb9,0xf2,0xf5,0xcb,0x5e,0x5f,0x5e,0x8e,0x2f,0xf2,0xd4,0xaf,0x50,0xe,0xea,0x57, +0xa4,0xf1,0xb7,0x57,0xd9,0xfc,0x20,0x74,0xd7,0xaf,0x72,0xb1,0xbe,0x5d,0x79,0xaf, +0x7f,0x26,0x99,0xf3,0x83,0xde,0xfd,0x45,0x41,0xe,0xea,0x57,0xca,0xfb,0xfd,0x27, +0x92,0x73,0xff,0x2b,0xc7,0xfc,0xa0,0xb8,0xfc,0xf1,0x8d,0xe2,0xf7,0xfb,0xca,0xc4, +0xe9,0x73,0xd4,0xaf,0x56,0xf3,0xe0,0xfb,0x40,0xf5,0x5d,0xc6,0x9d,0xbc,0xce,0xf, +0xe2,0xc6,0xcb,0xca,0x24,0xbf,0xf5,0xa1,0x2f,0x80,0xef,0xa1,0x92,0xe7,0xf9,0x41, +0xa5,0xd1,0x57,0xd8,0xfc,0x20,0xcc,0x5f,0xbe,0xa2,0x8a,0x23,0x5f,0x75,0x3c,0xf9, +0x2a,0xf,0xcf,0x47,0x11,0x47,0xbe,0x7a,0xe4,0xc9,0x57,0x9d,0x9c,0x8d,0xbf,0xd0, +0x93,0xaf,0x1e,0xe5,0x2c,0x5f,0x41,0x4f,0xbe,0x62,0xc7,0x17,0xe5,0xdd,0x97,0xa3, +0xe3,0xab,0xe6,0x2b,0xd1,0xfb,0xfc,0x20,0x5c,0x6e,0xbe,0xfa,0x9a,0x27,0x5f,0x9, +0xde,0x7c,0x5,0x96,0x9b,0xaf,0x10,0x5b,0x7f,0x65,0xf8,0xec,0xf5,0xed,0xcc,0xb7, +0xb1,0xdc,0x7c,0xa5,0xfa,0x9c,0xf9,0x8a,0xad,0x3f,0x50,0x72,0xb1,0xff,0x95,0x9a, +0xaf,0xd0,0x1d,0x57,0xbe,0xba,0x5b,0x62,0xf9,0x2a,0x17,0xbe,0xf,0xfa,0xda,0xfc, +0x20,0xcc,0x71,0xbe,0xd2,0xe6,0xdf,0x60,0x8e,0xf3,0x95,0xe6,0x3,0x39,0xce,0x57, +0xaa,0x2f,0xbf,0xeb,0xdb,0xd5,0x7c,0x25,0xab,0xf9,0xaa,0x10,0x56,0xbf,0x82,0x39, +0xc9,0x57,0xe6,0xfc,0xa0,0xe0,0xad,0x5f,0x75,0x72,0x92,0xaf,0x8c,0xf5,0xd9,0x6c, +0x7f,0x51,0xbb,0x7e,0xf5,0x28,0x57,0xfb,0x5f,0xd9,0xfb,0x8b,0x32,0x5f,0x5e,0x9f, +0xcf,0xfb,0xc2,0xf8,0x96,0x79,0x7c,0xdb,0xa5,0x17,0xd4,0xfc,0x2,0x78,0xcf,0xf, +0xd6,0x72,0x90,0xaf,0x68,0x4b,0xea,0x4b,0x13,0xb4,0x1d,0xf6,0xfc,0xe0,0x52,0xdf, +0xf,0xd1,0x92,0xc0,0x6d,0x63,0xff,0x4e,0x7c,0x14,0xe4,0x5b,0xe6,0xfa,0xd8,0xfa, +0x13,0xe0,0x7a,0x3e,0xf,0xb2,0xfd,0x45,0xf3,0xf1,0xfc,0x20,0xad,0x63,0x70,0xe7, +0xb2,0xf3,0xf9,0x41,0xb6,0xbf,0x68,0x4e,0xd6,0xb7,0x6b,0xed,0x47,0xf2,0xfb,0xfc, +0x20,0xad,0x4b,0x20,0xcf,0xf9,0x45,0xf5,0xf5,0x27,0x4,0xe5,0xd7,0xd7,0x2,0x2f, +0xa8,0xf9,0x25,0xbf,0xfb,0x8b,0x8a,0x56,0x7e,0x39,0x9,0xf4,0x2d,0xb3,0xff,0x3, +0x56,0x7e,0x91,0xa8,0xb3,0x7e,0xe5,0xf4,0xe5,0x63,0x7f,0x6,0xdd,0x67,0xd5,0xaf, +0x9c,0xbe,0x7c,0xe4,0x2b,0xd3,0xd7,0x5,0x81,0xef,0xbf,0x5c,0xae,0xef,0xf3,0x9c, +0xfb,0x7e,0x97,0x4b,0xdf,0xb7,0xc1,0xb,0x66,0x7d,0x48,0x9f,0x4b,0x6f,0xc3,0x7c, +0xf9,0x8,0xb8,0xdd,0x37,0xe7,0xdf,0x8c,0xf3,0x2f,0x7f,0x3e,0x2d,0x5f,0x55,0x59, +0xff,0x97,0x37,0x9f,0x2,0xde,0xd0,0xf2,0x55,0xd5,0x37,0x3f,0x98,0x17,0x5f,0x5b, +0xcf,0x57,0x55,0xdf,0xfc,0xa0,0xe5,0x73,0xbc,0x9f,0x78,0x19,0xbe,0x9e,0x9e,0xaf, +0xaa,0x91,0xde,0xef,0xbc,0xc,0x5f,0x5f,0x32,0x7c,0x51,0xde,0xef,0xbc,0x1c,0x5f, +0xdf,0x3f,0xff,0x76,0x12,0xf9,0xbb,0xcd,0xff,0xfa,0xbd,0xf5,0x82,0x39,0xff,0x96, +0xe8,0xb3,0xc0,0xfd,0xf,0x2,0x3e,0x9f,0x17,0x8b,0x4b,0xf4,0x39,0xf6,0x3f,0x8, +0xf8,0x8c,0x26,0x68,0x99,0x3e,0x7b,0xfc,0xfd,0xa2,0xfa,0x50,0xde,0x7d,0x5b,0xb9, +0xf6,0x7d,0x5e,0xcc,0x79,0xfb,0xd1,0x5c,0xfb,0xc8,0x88,0x5c,0xf8,0xd2,0x1c,0xdf, +0xab,0x74,0xc1,0xfd,0x33,0xbf,0x6,0x54,0xc8,0xcd,0xf8,0x96,0x73,0x5f,0xb6,0x9f, +0xb,0xdf,0x85,0x2f,0xe6,0x7,0xad,0x83,0x5f,0x17,0xb,0x8,0x9f,0x4c,0xae,0x95, +0xbe,0xa7,0x28,0x68,0xe7,0x5a,0x9,0xe4,0xc9,0x77,0x8c,0x3a,0x6f,0x11,0x7c,0x7c, +0x2a,0x3d,0x19,0xc1,0xdb,0x67,0x67,0xe8,0xf9,0x11,0xdc,0xce,0x9b,0x4f,0x51,0x8e, +0x8f,0xc1,0x68,0x24,0x81,0x27,0x4f,0xa4,0xd6,0x8,0xde,0xca,0x97,0xef,0xe0,0x45, +0x85,0x1e,0x63,0x0,0xa1,0xa4,0x1a,0xa1,0xa8,0x32,0xf3,0xe4,0xeb,0xa1,0x83,0x7f, +0xf3,0x34,0xed,0xe1,0x5f,0xc2,0x92,0xf4,0x4b,0xcd,0x27,0x5d,0xcb,0x99,0xef,0xb7, +0x5d,0xe5,0xb0,0x87,0x3f,0x1,0xb0,0xf7,0x49,0xaf,0x7,0xc4,0xde,0x28,0x57,0xbe, +0x75,0xcd,0xa7,0xac,0xe3,0x3e,0x80,0xad,0x7e,0xab,0x5,0xc4,0xd6,0x71,0xae,0x7c, +0x3b,0xba,0x6f,0x7,0xf7,0x7b,0xb0,0xde,0x5f,0x5f,0x7,0x62,0xfd,0xb3,0x62,0x9e, +0x7c,0x42,0xb5,0xd7,0x25,0x58,0xa8,0xf5,0x5b,0x12,0xee,0x2b,0x8a,0xb8,0xa3,0x40, +0x90,0x33,0x9f,0xda,0x3f,0xb,0xb5,0xc3,0x9d,0x2b,0x5f,0x3e,0x54,0x7d,0x8f,0x2f, +0xe7,0xab,0x7f,0xbe,0x18,0x7f,0x2f,0x7c,0x17,0xbe,0xb,0xdf,0x85,0xef,0xc2,0x77, +0xe1,0xbb,0xf0,0x5d,0xf8,0x2e,0x7c,0x5f,0x28,0x1f,0x21,0x14,0x62,0xfd,0xc9,0x79, +0xee,0x7,0xd2,0xc3,0xe5,0xfa,0xa6,0xf7,0xe9,0xd6,0x29,0x11,0xa8,0xfe,0x7c,0x99, +0x59,0xe,0x3e,0x33,0xbe,0xd4,0xd1,0xff,0xbf,0xbd,0x64,0xdf,0x33,0xa4,0x78,0x34, +0xd,0xf4,0x6d,0xd1,0xff,0x2a,0x2c,0xd7,0xf7,0xd5,0x69,0x79,0xcf,0xe5,0x1b,0x3a, +0x7d,0x45,0x7a,0x6d,0xc9,0xbe,0x75,0x99,0x6e,0xc8,0x2,0x6d,0xb,0x9d,0xdd,0xe9, +0xb5,0xfa,0x58,0xa0,0x7b,0x54,0x2e,0xe,0x48,0xf1,0x4c,0x2e,0x52,0x48,0x8a,0xf4, +0xc6,0x92,0x7d,0x7f,0x7d,0x42,0xff,0xf9,0xef,0x54,0xdf,0x8d,0xcd,0x75,0xf9,0xf2, +0xf7,0x6,0xcf,0x9e,0x3e,0xa0,0x72,0xa1,0x7d,0xbf,0xf0,0xad,0x71,0x91,0xe,0xdf, +0xfe,0x2e,0x7d,0x66,0xc9,0xbe,0xe9,0xe0,0xe6,0xea,0xa0,0x4c,0x3b,0x57,0x4a,0x6f, +0xb,0x1f,0xbd,0xb0,0xff,0xec,0xa9,0x7a,0x7c,0x8f,0x3e,0x29,0x1f,0xad,0x1e,0x75, +0xe8,0x70,0xbb,0x43,0xbf,0xb5,0x6c,0x5f,0xfb,0x2b,0x97,0xda,0x25,0xda,0x79,0xbb, +0xbc,0x72,0xff,0xa9,0xc2,0x96,0xee,0x3b,0xdd,0xba,0xb9,0x5a,0xdc,0xef,0xd0,0x23, +0xd5,0xf7,0x2f,0x96,0xed,0xeb,0x18,0xfd,0xcb,0xdb,0xc2,0xca,0xdd,0xa7,0x4a,0xdb, +0x86,0x6f,0xfb,0xc6,0x6a,0xa9,0xd3,0xa1,0xa7,0xe5,0xe,0x7d,0x6a,0xe9,0xbe,0x8e, +0xe1,0xa3,0xe5,0x93,0x7f,0x28,0x5a,0x3e,0x95,0xd6,0xa1,0x67,0xe5,0xce,0xf0,0xf2, +0xb2,0x7d,0xfb,0xcc,0x57,0x3a,0xfa,0x87,0xef,0x6c,0x3d,0x73,0x7a,0xa4,0x1d,0xdf, +0x67,0x4e,0xcb,0xea,0xf1,0x95,0x85,0xce,0xde,0xb5,0xa5,0x5f,0x1f,0x45,0xcd,0xd7, +0xbe,0x42,0x37,0xc6,0x4f,0xfd,0xdb,0xf6,0x8d,0xd5,0x13,0x2a,0xaf,0xaa,0xff,0x28, +0xf,0x8a,0x74,0xba,0xb6,0xba,0xb7,0xbe,0x6c,0xdf,0xb8,0xa4,0xfb,0x6e,0xd0,0x7, +0xf2,0x53,0xf7,0xd4,0x8b,0xf9,0x4c,0xef,0x5f,0x56,0xcb,0x6a,0xff,0x32,0xbd,0x7f, +0x69,0x6f,0xc9,0xe3,0x9b,0xe3,0x3,0xb4,0xff,0x31,0x5a,0xb,0x12,0x23,0x3c,0x5c, +0xe4,0xab,0xb,0xdf,0x85,0xef,0xc2,0x77,0xe1,0xcb,0x9b,0xaf,0x9c,0x17,0xdf,0x86, +0x5c,0x56,0x73,0xc0,0x26,0xa5,0x85,0xb1,0x0,0xd4,0x31,0x64,0xcf,0xe9,0x23,0xca, +0xd2,0xef,0x7f,0x57,0x6,0xc5,0xb3,0xc1,0xb5,0x4b,0xf4,0xa1,0x9a,0x52,0xb7,0xa7, +0x25,0xfa,0x60,0xdb,0xe1,0x9b,0xde,0x5b,0xb6,0x6f,0xfa,0xcc,0xde,0xd6,0xd9,0xde, +0x95,0x7f,0x45,0xdf,0xfe,0xde,0xe6,0xb5,0x92,0x5c,0x52,0x33,0xbd,0xf3,0xab,0x7f, +0xb0,0xf4,0xf6,0x9b,0xc2,0xce,0x69,0xe7,0xda,0x19,0x2d,0x9f,0x6d,0x5f,0x29,0x9d, +0xa8,0xb7,0x97,0xeb,0x74,0x7b,0x4f,0x2e,0xad,0x3d,0x27,0xdf,0x24,0x74,0x7a,0x69, +0xe9,0xe7,0xdf,0x94,0x76,0x8e,0x3e,0x29,0x9d,0x91,0xf2,0xd9,0xc3,0x2b,0xdb,0x47, +0x9a,0xef,0x5e,0xf1,0xc1,0xf8,0xf2,0x8d,0x3f,0x18,0x5f,0xbb,0x4f,0xa7,0xbb,0x4b, +0xf7,0xc9,0xa4,0xb8,0xff,0x49,0x69,0x77,0x2a,0x9c,0xbc,0x5d,0xda,0x6e,0xb,0x74, +0xf8,0xf0,0x99,0xb2,0x7c,0xda,0xb9,0xb1,0x7e,0xf4,0x27,0xaa,0xef,0x6c,0xe9,0xbe, +0x93,0x69,0xa9,0xf3,0x8b,0xed,0x8d,0x29,0x3d,0xfa,0xef,0xdb,0xdb,0xeb,0x65,0xf5, +0xfc,0x7b,0x46,0x98,0x1e,0x75,0x6e,0xfc,0xf5,0xfe,0x27,0xcf,0xe6,0xc1,0x77,0x44, +0xb7,0xb6,0xfe,0xd7,0xf6,0x89,0x4c,0xf7,0xff,0x6c,0x7b,0x7b,0x5b,0xbb,0x3e,0x9e, +0xa1,0xed,0x61,0xe7,0xc6,0x2f,0x3a,0x9d,0x5c,0xf8,0xb6,0x68,0xa7,0xb4,0xbb,0x7d, +0x76,0x42,0xb7,0x36,0x54,0xdf,0xb6,0xee,0x5b,0x37,0x7c,0xff,0x2d,0xf,0xbe,0x12, +0xec,0x94,0xf7,0x1e,0x9e,0x9d,0xd2,0xd2,0xa6,0xe9,0x7b,0x96,0x5e,0x31,0x7c,0x1b, +0xaa,0x6f,0xb8,0xec,0xfe,0xe5,0xd2,0xe0,0xb2,0xd0,0xbe,0x76,0x69,0x48,0x56,0xd7, +0xaf,0xac,0xae,0x97,0xe8,0xde,0xfa,0xb3,0x5a,0x9f,0x7d,0xe5,0x17,0xed,0xe2,0xbe, +0xea,0xdb,0x5b,0x76,0xff,0xbc,0xa2,0xfa,0xd4,0xf1,0x63,0x38,0xbd,0xd4,0xfe,0x9a, +0x56,0xe8,0x78,0xb0,0xfe,0x2c,0x5d,0x19,0x5f,0xfe,0xca,0x2f,0x6,0xb9,0xf0,0x51, +0x8a,0x45,0x8a,0x5,0xed,0xf5,0x2e,0x48,0xd0,0xfe,0x4f,0xbb,0x69,0x3,0x5a,0xed, +0xf,0x8b,0x30,0xbf,0xf9,0xa5,0x93,0xef,0x7c,0x45,0x8a,0xf9,0xf6,0xa9,0x39,0xe6, +0x22,0x3f,0xff,0xa3,0xf3,0xfd,0x7f,0x6e,0x69,0x1,0x55,0x8,0x9e,0xa1,0x2b,0x0, +0x0,0x0,0x0,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82 +}; +//m1284p.png: 12987 bytes +*/ +#endif