fter some experimenting with the esp32, the idea came up to make an internet radio with it.
There are already a whole bunch of them on the internet and in the end I came up with a combination of two examples:
- Simple_esp32_radio - https://www.hackster.io/mircemk/simple-esp32-internet-radio-with-oled-display-83e49d and
- ESP radio hot tub - https://github.com/Edzelf/Esp-radio
Including code for a rotary decoder and an IR set to control the radio.
The two main components are the ESP32 and the VS1053, as in most examples and besides that there is a display and as said the rotary decoder and IR receiver.
The basic code was provided by the 'simple-esp-radio' and from the 'ESP-radio-github' the ring buffer has been added because the internet here in the French countryside in the evening which gets slow. Once in a while the music faltered.
And besides that the code was added to read out the metadata and to be able to display the artist and song title. Unfortunately I was not able to do it for all stations to find this metadata; maybe another protocol? If someone knows the solution, I'm recommended for the adapted code :-).
When the base worked, I worked out the rotary decoder and IR control in a separate project after which the code was added to the first part of the project.
Unfortunately, the radio crashed immediately after that... The cause appeared to be in the used library for the IR receiver. In one way or another Ken Shirriff's library doesn't work well with the rest of my radio project. In the project of the rotary decoder with the IR receiver it worked fine, but not with the total code. After some searching I came across another library set (IRremoteESP8266), which is derived from the library of Ken, but he works fine with my version of the internet radio.
The way it works:
The project occupies a few files:
- Internetradio_hans.ino : the code for the internet radio
- helloMp3.h : a file that is played while the radio is starting up and the text 'Hello' is heard.
- Preferences.h : code to store and read some data in the NVRAM of the ESP32; The code stores the set volume and selected station
- radiostations.h : about 14 (dutch) streaming radio stations; easy to adapt to your own choice of stations.
After the experimental version I connected the parts together with soldered wires and everything was built into a 3D printed cabinet. The STL files have been added to the project. (Anet E12 : appr. 11 h and 45 m fillament)
When the radio is started, it will first connect to the specified WiFi network, and then the volume and last station used will become retrieved from the memory of ESP32. Then the connection is made to the streaming server and the broadcast is made audible via the VS 1053.
With the rotary decoder you can change stations by turning it. When there are 2 seconds (to be set in the code at 'interval') nothing more is turned, the then selected station is made active.
By briefly pressing the rotarty decoder the 'volume' mode is activated and the volume can be adjusted. Again the 2 second active: no more action for 2 seconds, then the entered value is sent to VS 1053 as a new volume.
The IR set works as follows:
- when a numeric key is pressed, the code starts to adjust the volume according to the ruined digits. Again the 2 seconds: 2 seconds no more input, then the volume is send to the VS 1053.
- The * key switches the code to 'volume' mode: use the numeric keys to set the desired volume.
- The # key switches the code to 'station' mode: use the number keys to select the desired station.
- The < and > keys : change the station
- The 'up' and 'down' keys : change the volume
- the OK key : activate the selected value immediately and do not wait for 2 seconds without action.
I ordered most of the hardware online at Aliexpres, but of course there are more possibilities.
And all that for about 20 € total (a bit depending on your possibilities as far as the box is concerned)
To be found also on https://www.htm63.com/arduino/internet-radio
In november 2021 I've changed the radio station file new project can be found via link just above.... or the files foun here.
// internet_radio.ino
/*
internet radio; combined code from
Simple_esp32_radio - https://www.hackster.io/mircemk/simple-esp32-internet-radio-with-oled-display-83e49d
with
ESP-radio-github - https://github.com/Edzelf/Esp-radio
ESP32 libraries used:
- ESP32 for Arduino - https://dl.espressif.com/dl/package_esp32_index.json (include in Menu | Preferences | Board managers)
- Preferences - https://github.com/espressif/arduino-esp32/blob/master/libraries/Preferences/src/Preferences.h
- helloMp3.h - included with code
- radiostations.h - included with code
- WiFi.h - WIFININA - to include via Library manager
- HTTPClient.h - https://github.com/espressif/arduino-esp32/blob/master/libraries/HTTPClient/src/HTTPClient.h
- Adafruit_GFX - https://github.com/adafruit/Adafruit-GFX-Library
- Adafruit_ST7735.h - https://github.com/adafruit/Adafruit-ST7735-Library
- SPI.h - Part of ESP8266 Arduino default libraries.
- Ticker.h - https://github.com/sstaub/Ticker
- esp_wifi.h - https://github.com/madhephaestus/Esp32WifiManager
- Arduino.h - Part of ESP8266 Arduino default libraries.
- IRremoteESP8266.h - https://github.com/esp8266/Basic/tree/master/libraries/IRremoteESP8266
- IRrecv.h - https://github.com/esp8266/Basic/tree/master/libraries/IRremoteESP8266
- IRutils.h - https://github.com/esp8266/Basic/tree/master/libraries/IRremoteESP8266
- VS1053.h - https://github.com/baldram/ESP_VS1053_Library/tree/master/src
hardware
- ESP32 - https://www.aliexpress.com/item/32799253567.html?spm=a2g0s.9042311.0.0.27424c4dLpU1BO
- Rotary decoder - https://www.aliexpress.com/item/32969404416.html?spm=a2g0s.9042311.0.0.27424c4dLpU1BO
- IR set - https://www.aliexpress.com/item/32859719981.html?spm=a2g0s.9042311.0.0.27424c4dLpU1BO
- TFT display - https://www.aliexpress.com/item/32817839166.html?spm=a2g0s.9042311.0.0.27424c4dLpU1BO
- VS1053 - https://www.aliexpress.com/item/32966454016.html?spm=a2g0s.9042311.0.0.27424c4dLpU1BO
If possible streaming info of artist and song title is shown. For some reason i've not been able to show this streaming information
for all streams.....
Please let me know if you are able to show more streaming info and I'd be honered if you will share the updated code with me!
*/
#include <Preferences.h> //For reading and writing into the FLASH memory
#include "helloMp3.h" // to say 'Hello' to listener
#include "radiostations.h" // all streaming channels used in this player
// display
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <Ticker.h>
// ESP32
#include <esp_wifi.h>
#include <WiFi.h>
#include <HTTPClient.h>
// IR
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>
// This ESP_VS1053_Library
#include <VS1053.h>
Preferences preferences; // instance to acces NVRAM
bool DEBUG = false; // if "true" all info will be shown in serial monitor; id "false" no info is shown on serial monitor
// Rotary Encoder start
const int PinSW=5; // Rotary Encoder Switch
const int PinDT=4; // DATA signal
const int PinCLK=2; // CLOCK signal
// Variables to debounce Rotary Encoder start
long TimeOfLastDebounce = 0;
int DelayofDebounce = 0.01;
unsigned long previousMillisrotating = 0;
unsigned long previousMillispressed = 0;
unsigned long interval = 2000;
// Store previous Pins state
int PreviousCLK;
int PreviousDATA;
int rotary_step_counter = 0;
bool rotating = false;
bool pressed = false;
// Rotary Encoder end
// IR init start
unsigned long key_value = 0;
const uint16_t kRecvPin = 27; // An IR detector/demodulator is connected to GPIO pin 27
IRrecv irrecv(kRecvPin);
decode_results results;
unsigned long previousMillisIR = 0;
unsigned long IR_interval = 2000; // after 2 seconds no input : stop waiting and activate info received
bool IR_volume = false;
bool IR_station = false;
bool digitinput = false;
unsigned int IR_value, Nbr_chars;
//IR init end
// Display init start
// pin definition for ESP32 for display
// VCC - +5Volt
// Gnd - Gnd
#define TFT_CS 17
#define TFT_Rst 16
#define TFT_DC 15 // A0
// SDA - 23
// SCK - 18
// LED - backlight +5 Volt via Resistor
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_Rst);
// Display init end
// WiFi init start
//WiFi network info
char ssid[] = "hcg"; // your network SSID (name)
char pass[] = "!!snapper123hans"; // your network password
String LocalIP="";
int status = WL_IDLE_STATUS;
WiFiClient client;
// WiFi init end
/* VS1053 player init start
VS1053 - connections detail
XRST = EN (D3)
MISO = D19
MOSI = D23
SCLK = D18
VCC = 5V / 3.3 V
Gnd = Gnd
*/
// Wiring of VS1053 board (SPI connected in a standard way)
#define VS1053_CS 32 //32
#define VS1053_DCS 33 //33
#define VS1053_DREQ 35 //15
uint8_t mp3buff[32]; // vs1053 likes 32 bytes at a time
VS1053 player(VS1053_CS, VS1053_DCS, VS1053_DREQ);
int my_volume = 75; // volume level 0-100
// VS1053 init end
// data definitions for getting radio data and playing it start
#define RINGBFSIZ 20000 // Ringbuffer for smooth playing. 20000 bytes is 160 Kbits, about 1.5 seconds at 128kb bitrate.
uint8_t* ringbuf ; // Ringbuffer for VS1053
uint16_t rbwindex = 0 ; // Fill pointer in ringbuffer
uint16_t rbrindex = RINGBFSIZ - 1 ; // Emptypointer in ringbuffer
uint16_t rcount = 0 ; // Number of bytes in ringbuffer
String icystreamtitle ; // Streamtitle from metadata
String icyname ; // Icecast station name
enum datamode_t { INIT = 1, HEADER = 2, DATA = 4,
METADATA = 8, NoMETA = 16,
PLAYLISTHEADER = 32, PLAYLISTDATA = 64,
STOPREQD = 128, STOPPED = 256} ; // State for datastream
datamode_t datamode ; // State of datastream
bool chunked = false ; // Station provides chunked transfer
int chunkcount = 0 ; // Counter for chunked transfer
int metaint = 0 ; // Number of databytes between metadata
int bitrate ; // Bitrate in kb/sec
uint32_t totalcount = 0 ; // Counter mp3 data
String metaline ; // Readable line in metadata
int datacount ; // Counter databytes before metadata
int metacount ; // Number of bytes in metadata
int8_t playlist_num = 0 ; // Nonzero for selection from playlist
char newstreamtitle[150] = ""; // storeStreamtitle from metadata
Ticker tckr ; // For timing 100 msec
int radioStation,old_radioStation,new_radioStation;
// data definitions for getting radio data and playing it end
// start music code
// Ringbuffer code start
//******************************************************************************************
// Ringbuffer (fifo) routines. *
//******************************************************************************************
//******************************************************************************************
// R I N G S P A C E *
//******************************************************************************************
inline bool ringspace()
{
return ( rcount < RINGBFSIZ ) ; // True is at least one byte of free space is available
}
//******************************************************************************************
// R I N G A V A I L *
//******************************************************************************************
inline uint16_t ringavail()
{
return rcount ; // Return number of bytes available
}
//******************************************************************************************
// P U T R I N G *
//******************************************************************************************
void putring ( uint8_t b ) // Put one byte in the ringbuffer
{
// No check on available space. See ringspace()
*(ringbuf + rbwindex) = b ; // Put byte in ringbuffer
if ( ++rbwindex == RINGBFSIZ ) // Increment pointer and
{
rbwindex = 0 ; // wrap at end
}
rcount++ ; // Count number of bytes in the ringbuffer
}
//******************************************************************************************
// G E T R I N G *
//******************************************************************************************
uint8_t getring()
{
// Assume there is always something in the bufferpace. See ringavail()
if ( ++rbrindex == RINGBFSIZ ) // Increment pointer and
{
rbrindex = 0 ; // wrap at end
}
rcount-- ; // Count is now one less
return *(ringbuf + rbrindex) ; // return the oldest byte
}
//******************************************************************************************
// E M P T Y R I N G *
//******************************************************************************************
void emptyring()
{
rbwindex = 0 ; // Reset ringbuffer administration
rbrindex = RINGBFSIZ - 1 ;
rcount = 0 ;
}
// Ringbuffer code end
// data evaluation to find streaming info and play music start
//******************************************************************************************
// C H K H D R L I N E *
//******************************************************************************************
// Check if a line in the header is a reasonable headerline. *
// Normally it should contain something like "icy-xxxx:abcdef". *
//******************************************************************************************
bool chkhdrline ( const char* str )
{
char b ; // Byte examined
int len = 0 ; // Lengte van de string
while ( ( b = *str++ ) ) // Search to end of string
{
len++ ; // Update string length
if ( ! isalpha ( b ) ) // Alpha (a-z, A-Z)
{
if ( b != '-' ) // Minus sign is allowed
{
if ( b == ':' ) // Found a colon?
{
return ( ( len > 5 ) && ( len < 50 ) ) ; // Yes, okay if length is okay
}
else
{
return false ; // Not a legal character
}
}
}
}
return false ; // End of string without colon
}
//******************************************************************************************
// H A N D L E B Y T E _ C H *
//******************************************************************************************
// Handle the next byte of data from server. *
// Chunked transfer encoding aware. Chunk extensions are not supported. *
//******************************************************************************************
void handlebyte_ch ( uint8_t b, bool force )
{
static int chunksize = 0 ; // Chunkcount read from stream
if ( chunked && !force &&
( datamode & ( DATA | // Test op DATA handling
METADATA |
PLAYLISTDATA ) ) )
{
if ( chunkcount == 0 ) // Expecting a new chunkcount?
{
if ( b == '\r' ) // Skip CR
{
return ;
}
else if ( b == '\n' ) // LF ?
{
chunkcount = chunksize ; // Yes, set new count
chunksize = 0 ; // For next decode
return ;
}
// We have received a hexadecimal character. Decode it and add to the result.
b = toupper ( b ) - '0' ; // Be sure we have uppercase
if ( b > 9 )
{
b = b - 7 ; // Translate A..F to 10..15
}
chunksize = ( chunksize << 4 ) + b ;
}
else
{
handlebyte ( b, force ) ; // Normal data byte
chunkcount-- ; // Update count to next chunksize block
}
}
else
{
handlebyte ( b, force ) ; // Normal handling of this byte
}
}
//******************************************************************************************
// H A N D L E B Y T E *
//******************************************************************************************
// Handle the next byte of data from server. *
// This byte will be send to the VS1053 most of the time. *
// Note that the buffer the data chunk must start at an address that is a muttiple of 4. *
// Set force to true if chunkbuffer must be flushed. *
//******************************************************************************************
void handlebyte ( uint8_t b, bool force )
{
static uint16_t playlistcnt ; // Counter to find right entry in playlist
static bool firstmetabyte ; // True if first metabyte (counter)
static int LFcount ; // Detection of end of header
static __attribute__((aligned(4))) uint8_t buf[32] ; // Buffer for chunk
static int bufcnt = 0 ; // Data in chunk
static bool firstchunk = true ; // First chunk as input
String lcml ; // Lower case metaline
String ct ; // Contents type
static bool ctseen = false ; // First line of header seen or not
int inx ; // Pointer in metaline
int i ; // Loop control
if ( datamode == INIT ) // Initialize for header receive
{
ctseen = false ; // Contents type not seen yet
metaint = 0 ; // No metaint found
LFcount = 0 ; // For detection end of header
bitrate = 0 ; // Bitrate still unknown
if (DEBUG == true) Serial.println ( "Switch to HEADER" ) ;
datamode = HEADER ; // Handle header
totalcount = 0 ; // Reset totalcount
metaline = "" ; // No metadata yet
firstchunk = true ; // First chunk expected
}
if ( datamode == DATA ) // Handle next byte of MP3/Ogg data
{
buf[bufcnt++] = b ; // Save byte in chunkbuffer
if ( bufcnt == sizeof(buf) || force ) // Buffer full?
{
if ( firstchunk )
{
firstchunk = false ;
if (DEBUG == true) {
Serial.println ( "First chunk:" ) ; // Header for printout of first chunk
for ( i = 0 ; i < 32 ; i += 8 ) // Print 4 lines
{ Serial.printf ( "%02X %02X %02X %02X %02X %02X %02X %02X",
buf[i], buf[i + 1], buf[i + 2], buf[i + 3],
buf[i + 4], buf[i + 5], buf[i + 6], buf[i + 7] ) ;
Serial.println ("");
}
}
}
player.playChunk ( buf, bufcnt ) ; // Yes, send to player
bufcnt = 0 ; // Reset count
}
totalcount++ ; // Count number of bytes, ignore overflow
if ( metaint != 0 ) // No METADATA on Ogg streams or mp3 files
{
if ( --datacount == 0 ) // End of datablock?
{
if ( bufcnt ) // Yes, still data in buffer?
{
player.playChunk ( buf, bufcnt ) ; // Yes, send to player
bufcnt = 0 ; // Reset count
}
if (DEBUG == true) Serial.println ( "Switch to METADATA" ) ;
datamode = METADATA ;
firstmetabyte = true ; // Expecting first metabyte (counter)
}
} else {
if (DEBUG == true) Serial.println("Switching to NoMeta");
datamode = NoMETA;
station_connect(radioStation);
}
return ;
}
if ( datamode == HEADER ) // Handle next byte of MP3 header
{
if ( ( b > 0x7F ) || // Ignore unprintable characters
( b == '\r' ) || // Ignore CR
( b == '\0' ) ) // Ignore NULL
{
// Yes, ignore
}
else if ( b == '\n' ) // Linefeed ?
{
LFcount++ ; // Count linefeeds
if ( chkhdrline ( metaline.c_str() ) ) // Reasonable input?
{
lcml = metaline ; // Use lower case for compare
lcml.toLowerCase() ;
if (DEBUG == true) {
Serial.println("metaline :");
Serial.printf ( metaline.c_str() ) ; // Yes, Show it
Serial.println("");
}
if ( lcml.indexOf ( "content-type" ) >= 0 ) // Line with "Content-Type: xxxx/yyy"
{
ctseen = true ; // Yes, remember seeing this
ct = metaline.substring ( 14 ) ; // Set contentstype. Not used yet
if (DEBUG == true) {
Serial.printf ( "%s seen.", ct.c_str() ) ;
Serial.println("");
}
}
if ( lcml.startsWith ( "icy-br:" ) )
{
bitrate = metaline.substring(7).toInt() ; // Found bitrate tag, read the bitrate
if ( bitrate == 0 ) // For Ogg br is like "Quality 2"
{
bitrate = 87 ; // Dummy bitrate
}
}
else if ( lcml.startsWith ( "icy-metaint:" ) )
{
metaint = metaline.substring(12).toInt() ; // Found metaint tag, read the value
}
else if ( lcml.startsWith ( "icy-name:" ) )
{
icyname = metaline.substring(9) ; // Get station name
icyname.trim() ; // Remove leading and trailing spaces
if (DEBUG == true) {
Serial.println(icyname);
Serial.println("");
}
}
else if ( lcml.startsWith ( "transfer-encoding:" ) )
{
// Station provides chunked transfer
if ( lcml.endsWith ( "chunked" ) )
{
chunked = true ; // Remember chunked transfer mode
chunkcount = 0 ; // Expect chunkcount in DATA
}
}
}
metaline = "" ; // Reset this line
if ( ( LFcount == 2 ) && ctseen ) // Some data seen and a double LF? ( ( LFcount == 2 ) && ctseen )
{
if (DEBUG == true) {
Serial.printf ( "Switch to DATA, bitrate is %d" // Show bitrate
", metaint is %d", // and metaint
bitrate, metaint ) ;
Serial.println("");
}
datamode = DATA ; // Expecting data now
datacount = metaint ; // Number of bytes before first metadata
bufcnt = 0 ; // Reset buffer count
player.startSong() ; // Start a new song
}
}
else
{
metaline += (char)b ; // Normal character, put new char in metaline
LFcount = 0 ; // Reset double CRLF detection
}
return ;
}
if ( datamode == METADATA ) // Handle next byte of metadata
{
if ( firstmetabyte ) // First byte of metadata?
{
firstmetabyte = false ; // Not the first anymore
metacount = b * 16 + 1 ; // New count for metadata including length byte
if ( metacount > 1 )
{
if (DEBUG == true) Serial.printf ( "Metadata block %d bytes",
metacount - 1 ) ; // Most of the time there are zero bytes of metadata
}
metaline = "" ; // Set to empty
}
else
{
metaline += (char)b ; // Normal character, put new char in metaline
}
if ( --metacount == 0 )
{
if ( metaline.length() ) // Any info present?
{
// metaline contains artist and song name. For example:
// "StreamTitle='Don McLean - American Pie';StreamUrl='';"
// Sometimes it is just other info like:
// "StreamTitle='60s 03 05 Magic60s';StreamUrl='';"
// Isolate the StreamTitle, remove leading and trailing quotes if present.
showstreamtitle ( metaline.c_str(),false ) ; // Show artist and title if present in metadata
}
if ( metaline.length() > 1500 ) // Unlikely metaline length?
{
if (DEBUG == true) Serial.printf ( "Metadata block too long! Skipping all Metadata from now on." ) ;
metaint = 0 ; // Probably no metadata
metaline = "" ; // Do not waste memory on this
}
datacount = metaint ; // Reset data count
bufcnt = 0 ; // Reset buffer count
if (DEBUG == true) Serial.println ( "Switch to DATA" ) ;
datamode = DATA ; // Expecting data
}
}
}
// end song tilte code
//******************************************************************************************
// T I M E R 1 0 S E C *
//******************************************************************************************
// Extra watchdog. Called every 10 seconds. *
// If totalcount has not been changed, there is a problem and playing will stop. *
// Note that a "yield()" within this routine or in called functions will cause a crash! *
//******************************************************************************************
void timer10sec()
{
static uint32_t oldtotalcount = 7321 ; // Needed foor change detection
static uint8_t morethanonce = 0 ; // Counter for succesive fails
static uint8_t t600 = 0 ; // Counter for 10 minutes
if (DEBUG == true) Serial.println("timer10sec");
if ( datamode & ( INIT | HEADER | DATA | // Test op playing
METADATA | NoMETA ) )
{
if ( totalcount == oldtotalcount ) // Still playing?
{
if (DEBUG == true) Serial.println ( "No data input" ) ; // No data detected!
if ( morethanonce > 10 ) // Happened too many times?
{
if (DEBUG == true) Serial.println ( "Going to restart connection" ) ;
datamode = INIT ;
station_connect(radioStation);
if (DEBUG == true) Serial.println ( "Switch to INIT" ) ;
}
morethanonce++ ; // Count the fails
}
else
{
if ( morethanonce ) // Recovered from data loss?
{
if (DEBUG == true) Serial.println ( "Recovered from dataloss" ) ;
morethanonce = 0 ; // Data see, reset failcounter
}
oldtotalcount = totalcount ; // Save for comparison in next cycle
}
if ( t600++ == 60 ) // 10 minutes over?
{
t600 = 0 ; // Yes, reset counter
if (DEBUG == true) Serial.println ( "10 minutes over" ) ;
// publishIP() ; // Re-publish IP
}
}
}
// data evaluation to find streaming info and play music end
void setup () {
// Start display
tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab
tft.fillScreen(ST7735_BLACK);
tft.setRotation(1);
display_Title();
// rotary decoder
pinMode (PinCLK, INPUT_PULLUP); // Set pinA (Clk) as input
pinMode (PinDT, INPUT_PULLUP); // Set pinB as input
// Put current pins state in variables
PreviousCLK=digitalRead(PinCLK);
PreviousDATA=digitalRead(PinDT);
// Set the Switch pin to use Arduino PULLUP resistors
pinMode(PinSW, INPUT_PULLUP);
// IR Start
irrecv.enableIRIn(); // Start the receiver
// IR end
// play part buffer and timer initialisation
ringbuf = (uint8_t *) malloc ( RINGBFSIZ ) ; // Create ring buffer
tckr.attach ( 10.0, timer10sec ) ; // Every 10 sec
// start serial port
Serial.begin(115200);
// get data from ESP NVRAM
preferences.begin("my-app", false);
radioStation = preferences.getUInt("radioStation", 0);
my_volume = preferences.getUInt("Volume",70);
// initialize SPI bus;
SPI.begin();
// initialize VS1053 player
player.begin();
// player.switchToMp3Mode(); // optional, some boards require this
player.setVolume(my_volume);
// connect tot FiFi
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
if (DEBUG == true) Serial.print(".");
}
if (DEBUG == true) {
Serial.println("WiFi connected");
Serial.print("IP address:");
}
LocalIP=WiFi.localIP().toString();
if (DEBUG == true) Serial.println(LocalIP);
display_Connectto();
displayIP();
display_Volume(my_volume);
// store staion for later reference
old_radioStation=radioStation;
if (DEBUG == true) Serial.printf("Current radioStation value: %u\n", radioStation);
delay(100);
// play 'HELLO' text
player.playChunk(hello2, sizeof(hello2)); //VS1053 is wake up & running
// connect to stored station
if (DEBUG == true) Serial.println ( "Switch to INIT" ) ;
datamode = INIT ;
station_connect(radioStation);
display_Station(radioStation);
}
// update radiostation after new input from IR or rotary decoder
void change_radiostation(){
new_radioStation=radioStation;
if(old_radioStation != new_radioStation) {
if (DEBUG == true) {
Serial.printf("Set radioStation to new_value: %u\n", radioStation);
Serial.println ( "Switch to INIT" ) ;
}
player.softReset();
datamode = INIT ;
}
station_connect(new_radioStation);
preferences.putUInt("radioStation",new_radioStation); // save station in nvram
display_Station(new_radioStation);
old_radioStation = new_radioStation;
}
// update volume after new input from IR or rotary decoder
void change_volume(){
player.setVolume(my_volume);
if (DEBUG == true) Serial.printf("Volume: %u\n", my_volume);
preferences.putUInt("Volume",my_volume);
display_Volume(my_volume);
player.startSong();
}
// rotary extra code start
// update display information on volume or station after IR or rotary switch change
void update_vol_or_station(){
if (rotating != true){
rotating = true;
if (DEBUG == true) Serial.println("rotating = true");
if (pressed != true) rotary_step_counter = radioStation;
}
previousMillisrotating = millis();
if (pressed == true) {
previousMillispressed = millis();
if (rotary_step_counter >= 101) rotary_step_counter = 100;
if (rotary_step_counter <= 0) rotary_step_counter = 0;
if (DEBUG == true) {
Serial.print("Volume = ");
Serial.println(rotary_step_counter);
}
display_Volume(rotary_step_counter);
} else {
if(rotary_step_counter==nbrStations) rotary_step_counter=0;
if (rotary_step_counter <= -1) rotary_step_counter=nbrStations-1;
if (DEBUG == true) {
Serial.print("Station = ");
Serial.println(rotary_step_counter);
}
display_Station(rotary_step_counter);
}
}
// Check if Rotary Encoder was moved
void check_rotary() {
if ((PreviousCLK == 0) && (PreviousDATA == 1)) {
if ((digitalRead(PinCLK) == 1) && (digitalRead(PinDT) == 0)) {
rotary_step_counter++;
update_vol_or_station();
}
if ((digitalRead(PinCLK) == 1) && (digitalRead(PinDT) == 1)) {
rotary_step_counter--;
update_vol_or_station();
}
}
if ((PreviousCLK == 1) && (PreviousDATA == 1)) {
if ((digitalRead(PinCLK) == 0) && (digitalRead(PinDT) == 1)) {
rotary_step_counter++;
update_vol_or_station();
}
if ((digitalRead(PinCLK) == 0) && (digitalRead(PinDT) == 0)) {
rotary_step_counter--;
update_vol_or_station();
}
}
}
// rotary extra code end
// IR code start
// show debug info on serial monitor
void check_for_input(){
if (IR_value >= 0) {
if (IR_volume == true){
if (DEBUG == true) {
Serial.print("Volume update naar : ");
Serial.println(IR_value);
}
}
if (IR_station == true){
if (DEBUG == true) {
Serial.print("Station update naar : ");
Serial.println(IR_value);
}
}
}
}
// if IR receives digit ('0' .. '9') without leading '#' or '*' act on it as input for volume
void setdigitinput(){
previousMillisIR = millis();
if (DEBUG == true) Serial.println("IR actief zonder keuze -> volume");
IR_volume = true;
digitinput = true;
IR_value = 0;
Nbr_chars = 0;
display_Volume(my_volume);
}
// Set volume to new value in player
void Update_volume(){
if (DEBUG == true) {
Serial.println("Update_volume()");
Serial.print("Volume update naar : ");
Serial.println(my_volume);
}
change_volume();
}
// Set station to new value in player
void Update_Station(){
if (DEBUG == true) {
Serial.println("Update_Station()");
Serial.print("Station update naar : ");
Serial.println(radioStation);
}
change_radiostation();
}
// IR code end
void process_IR_Digit(int digit) {
if (DEBUG == true) {
Serial.print("digit 1 : ");
Serial.println(digit);
Serial.print("Nbr_chars 1 : ");
Serial.println(Nbr_chars);
}
if (Nbr_chars == 0) {
Serial.println("clear IR_Value and my_volume; volume was set to 100 and new input was detected; so we start over again ");
IR_value = 0;
my_volume = 0;
}
if (DEBUG == true) {
Serial.print("digit 2 : ");
Serial.println(digit);
Serial.print("Nbr_chars 2 : ");
Serial.println(Nbr_chars);
}
if ((IR_volume == false) && (IR_station == false)) {
if (DEBUG == true) {
Serial.println(" - setdigitinput");
Serial.println(digit);
}
setdigitinput();
}
if (Nbr_chars = 0) {
IR_value = digit;
Nbr_chars++;
} else {
if (Nbr_chars = 1) {
IR_value = 10 * IR_value + digit;
Nbr_chars++;
}
}
}
void loop() {
// IR code start
unsigned long currentMillis = millis();
if ( (IR_volume == true) || (IR_station == true)) {
if (currentMillis - previousMillisIR >= IR_interval) {
if (DEBUG == true) Serial.println("currentMillis - previousMillisIR >= IR_interval");
if (digitinput == true){
check_for_input();
if (IR_volume == true) {
my_volume = IR_value;
} else {
radioStation = IR_value;
}
}
IR_value = 0;
Nbr_chars = 0;
digitinput = false;
if (DEBUG == true) {
Serial.println("Took to long after last key input; use input end start waiting for new input on IR");
Serial.print("Volume 0 : ");
Serial.println(my_volume);
Serial.print("Radiostation 0 : ");
Serial.println(radioStation);
}
if (IR_volume == true) { Update_volume(); }
if (IR_station == true) { Update_Station(); }
IR_volume = false;
IR_station = false;
}
}
if (irrecv.decode(&results)){
if (results.value == 0XFFFFFFFF) // repeat
results.value = key_value;
previousMillisIR = millis();
switch(results.value){
case 0xFF38C7: // OK pressed; activate value entered to player
if (DEBUG == true) Serial.println("OK");
if (digitinput == true){
if (DEBUG == true){
Serial.print("OK : ");
Serial.println(IR_value);
}
check_for_input();
if (IR_volume == true) {
my_volume = IR_value;
} else {
radioStation = IR_value;
}
}
digitinput = false;
IR_value = 0;
Nbr_chars = 0;
if (DEBUG == true) {
Serial.println("Update IR data to player");
Serial.print("Volume 1 : ");
Serial.println(my_volume);
Serial.print("Radiostation 1 : ");
Serial.println(radioStation);
}
if (IR_volume == true) { Update_volume(); }
if (IR_station == true) { Update_Station(); }
IR_volume = false;
IR_station = false;
break ;
case 0xFF18E7:
if (DEBUG == true) Serial.println("Volume Up (Up)");
IR_volume = true;
digitinput = false;
my_volume++;
if (my_volume >= 101) my_volume = 100;
if (DEBUG == true) {
Serial.print("Volume 2 : ");
Serial.println(my_volume);
}
display_Volume(my_volume);
break ;
case 0xFF10EF:
if (DEBUG == true) Serial.println("Station terug (Left)");
IR_station = true;
digitinput = false;
radioStation--;
if (radioStation < 0){
radioStation = nbrStations-1;
}
display_Station(radioStation);
break ;
case 0xFF5AA5:
if (DEBUG == true) Serial.println("Station vooruit (Right)");
IR_station = true;
digitinput = false;
radioStation++;
if (radioStation >= nbrStations) radioStation = 0;
if (DEBUG == true) {
Serial.print("Radiostation 3 : ");
Serial.println(radioStation);
}
display_Station(radioStation);
break ;
case 0xFF4AB5:
if (DEBUG == true) Serial.println("Volume Down (Down)");
IR_volume = true;
digitinput = false;
my_volume--;
if (my_volume < 0) my_volume = 0;
if (DEBUG == true) {
Serial.print("Volume 3 : ");
Serial.println(my_volume);
}
display_Volume(my_volume);
break ;
case 0xFFA25D:
process_IR_Digit(1);
break;
case 0xFF629D:
process_IR_Digit(2);
break;
case 0xFFE21D:
process_IR_Digit(3);
break;
case 0xFF22DD:
process_IR_Digit(4);
break;
case 0xFF02FD:
process_IR_Digit(5);
break ;
case 0xFFC23D:
process_IR_Digit(6);
break ;
case 0xFFE01F:
process_IR_Digit(7);
break ;
case 0xFFA857:
process_IR_Digit(8);
break ;
case 0xFF906F:
process_IR_Digit(9);
break ;
case 0xFF9867:
process_IR_Digit(0);
break ;
case 0xFF6897:
if (DEBUG == true) Serial.println("* - volume");
if ((IR_volume == false) && (IR_station == false)) {
if (DEBUG == true) {
Serial.println(" - setdigitinput");
Serial.println("*");
}
setdigitinput();
}
IR_volume = true;
IR_station = false;
IR_value = 0;
Nbr_chars = 0;
display_Volume(my_volume);
break ;
case 0xFFB04F:
if (DEBUG == true) Serial.println("# - station");
if ((IR_volume == false) && (IR_station == false)) {
if (DEBUG == true) {
Serial.println(" - setdigitinput");
Serial.println("#");
}
setdigitinput();
}
IR_volume = false;
IR_station = true;
IR_value = 0;
Nbr_chars = 0;
display_Station(radioStation);
break ;
}
// do check on entered data to keep it in right value 0 <-> 100 for volume; 0 <-> nbrStations-1 for stations and update player
if (digitinput == true) {
if (DEBUG == true) {
Serial.print("IR_value 1 : ");
Serial.println(IR_value);
}
if (IR_station == true) {
if (DEBUG == true) Serial.println("IR_station == true");
if (IR_value >= nbrStations) {
if (DEBUG == true) Serial.println("IR_value >= nbrStations");
IR_value = 0;
} else {
if (IR_value < 0) {
if (DEBUG == true) Serial.println("IR_value < 0");
IR_value = nbrStations-1;
}
}
radioStation = IR_value;
if (DEBUG == true) {
Serial.print("Radiostation 2 : ");
Serial.println(radioStation);
}
display_Station(radioStation);
}
if (IR_volume == true) {
if (DEBUG == true) Serial.println("IR_volume == true");
if (IR_value > 100) {
if (DEBUG == true) Serial.println("IR_value > 100");
IR_value = 100;
Nbr_chars = 0;
} else {
if (IR_value < 0) {
if (DEBUG == true) Serial.println("IR_value < 0");
IR_value = 0;
}
}
my_volume = IR_value;
if (DEBUG == true) {
...
This file has been truncated, please download it to see its full contents.
// Preferences.h
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef _PREFERENCES_H_
#define _PREFERENCES_H_
#include "Arduino.h"
class Preferences {
protected:
uint32_t _handle;
bool _started;
bool _readOnly;
public:
Preferences();
~Preferences();
bool begin(const char * name, bool readOnly=false);
void end();
bool clear();
bool remove(const char * key);
size_t putChar(const char* key, int8_t value);
size_t putUChar(const char* key, uint8_t value);
size_t putShort(const char* key, int16_t value);
size_t putUShort(const char* key, uint16_t value);
size_t putInt(const char* key, int32_t value);
size_t putUInt(const char* key, uint32_t value);
size_t putLong(const char* key, int32_t value);
size_t putULong(const char* key, uint32_t value);
size_t putLong64(const char* key, int64_t value);
size_t putULong64(const char* key, uint64_t value);
size_t putFloat(const char* key, float_t value);
size_t putDouble(const char* key, double_t value);
size_t putBool(const char* key, bool value);
size_t putString(const char* key, const char* value);
size_t putString(const char* key, String value);
size_t putBytes(const char* key, const void* value, size_t len);
int8_t getChar(const char* key, int8_t defaultValue = 0);
uint8_t getUChar(const char* key, uint8_t defaultValue = 0);
int16_t getShort(const char* key, int16_t defaultValue = 0);
uint16_t getUShort(const char* key, uint16_t defaultValue = 0);
int32_t getInt(const char* key, int32_t defaultValue = 0);
uint32_t getUInt(const char* key, uint32_t defaultValue = 0);
int32_t getLong(const char* key, int32_t defaultValue = 0);
uint32_t getULong(const char* key, uint32_t defaultValue = 0);
int64_t getLong64(const char* key, int64_t defaultValue = 0);
uint64_t getULong64(const char* key, uint64_t defaultValue = 0);
float_t getFloat(const char* key, float_t defaultValue = NAN);
double_t getDouble(const char* key, double_t defaultValue = NAN);
bool getBool(const char* key, bool defaultValue = false);
size_t getString(const char* key, char* value, size_t maxLen);
String getString(const char* key, String defaultValue = String());
size_t getBytesLength(const char* key);
size_t getBytes(const char* key, void * buf, size_t maxLen);
size_t freeEntries();
};
#endif
// helloMp3.h
/**
* A test sound for ESP_VS1053_Library usage example.
* https://github.com/baldram/ESP_VS1053_Library
* If you like this project, please add a star.
*
* Copyright (C) 2017 Marcin Szalomski
* Licensed under GNU GPLv3
*/
unsigned char hello1[] = {
73, 68, 51, 4, 0, 64, 0, 0, 0, 61, 0, 0, 0, 12, 1, 32,
5, 14, 95, 61, 41, 39, 84, 80, 69, 49, 0, 0, 0, 17, 0, 0,
0, 77, 97, 114, 99, 105, 110, 32, 83, 122, 97, 108, 111, 109, 115, 107,
105, 84, 73, 84, 50, 0, 0, 0, 12, 0, 0, 0, 72, 101, 108, 108,
111, 32, 115, 111, 117, 110, 100, 255, 251, 112, 196, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 110, 102, 111,
0, 0, 0, 15, 0, 0, 0, 29, 0, 0, 36, 188, 0, 8, 8, 8,
17, 17, 17, 26, 26, 26, 26, 35, 35, 35, 44, 44, 44, 44, 52, 52,
52, 61, 61, 61, 61, 70, 70, 70, 79, 79, 79, 79, 88, 88, 88, 97,
97, 97, 105, 105, 105, 105, 114, 114, 114, 123, 123, 123, 123, 132, 132, 132,
141, 141, 141, 141, 150, 150, 150, 158, 158, 158, 158, 167, 167, 167, 176, 176,
176, 185, 185, 185, 185, 194, 194, 194, 203, 203, 203, 203, 211, 211, 211, 220,
220, 220, 220, 229, 229, 229, 238, 238, 238, 238, 247, 247, 247, 255, 255, 255,
0, 0, 0, 57, 76, 65, 77, 69, 51, 46, 57, 57, 114, 1, 205, 0,
0, 0, 0, 0, 0, 0, 0, 20, 96, 36, 3, 93, 66, 0, 0, 96,
0, 0, 36, 188, 245, 90, 78, 232, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
255, 251, 112, 196, 0, 1, 140, 124, 45, 38, 76, 48, 192, 137, 239, 191,
163, 149, 193, 138, 121, 0, 1, 96, 86, 215, 128, 12, 6, 130, 32, 144,
76, 48, 0, 0, 201, 147, 38, 76, 153, 50, 100, 200, 16, 66, 0, 0,
0, 195, 195, 195, 195, 192, 0, 0, 0, 0, 195, 195, 195, 195, 192, 0,
0, 0, 0, 195, 195, 195, 199, 128, 48, 0, 0, 140, 127, 199, 30, 129,
223, 255, 63, 255, 187, 255, 255, 48, 240, 241, 230, 0, 8, 128, 232, 225,
225, 254, 100, 15, 195, 255, 255, 255, 255, 246, 30, 30, 30, 30, 0, 0,
103, 0, 207, 253, 255, 192, 0, 0, 70, 23, 3, 91, 198, 15, 8, 32,
25, 42, 149, 51, 14, 119, 156, 166, 36, 236, 196, 99, 47, 236, 102, 29,
140, 198, 101, 53, 169, 165, 84, 212, 212, 212, 212, 193, 130, 128, 168, 8,
80, 160, 42, 172, 204, 25, 153, 153, 149, 85, 85, 85, 75, 102, 102, 102,
105, 74, 173, 214, 216, 123, 67, 99, 148, 137, 117, 182, 25, 251, 156, 242,
92, 138, 238, 185, 180, 228, 44, 170, 51, 86, 118, 252, 245, 211, 189, 127,
244, 239, 255, 95, 251, 253, 187, 162, 94, 251, 118, 91, 111, 165, 220, 34,
42, 162, 21, 235, 58, 28, 89, 30, 117, 66, 206, 123, 148, 215, 54, 38,
97, 28, 67, 105, 157, 176, 15, 126, 26, 10, 138, 64, 192, 52, 111, 134,
156, 75, 21, 251, 114, 237, 187, 18, 172, 177, 181, 79, 106, 50, 84, 161,
181, 139, 26, 174, 245, 5, 207, 9, 202, 88, 224, 184, 242, 97, 137, 183,
55, 239, 143, 78, 230, 119, 190, 116, 174, 190, 167, 153, 189, 103, 239, 151,
231, 253, 62, 95, 187, 28, 179, 45, 46, 255, 251, 114, 196, 34, 0, 17,
166, 13, 22, 53, 196, 0, 3, 39, 175, 171, 127, 53, 48, 0, 149, 198,
57, 110, 45, 249, 215, 35, 125, 95, 138, 145, 245, 47, 29, 76, 85, 183,
117, 21, 253, 79, 253, 245, 113, 242, 223, 244, 151, 107, 197, 223, 160, 215,
229, 210, 111, 40, 119, 80, 244, 93, 55, 172, 163, 85, 146, 166, 206, 242,
50, 152, 234, 67, 145, 237, 210, 72, 61, 58, 136, 113, 182, 48, 61, 105,
29, 74, 67, 18, 121, 212, 77, 184, 4, 65, 196, 18, 187, 67, 163, 168,
93, 55, 114, 139, 5, 128, 84, 80, 30, 54, 97, 64, 174, 166, 89, 41,
201, 183, 62, 207, 13, 231, 68, 202, 183, 24, 224, 106, 19, 114, 125, 83,
23, 40, 210, 0, 240, 24, 36, 249, 22, 64, 209, 48, 249, 194, 201, 195,
27, 23, 76, 77, 102, 232, 48, 128, 1, 104, 0, 212, 96, 21, 115, 137,
44, 100, 77, 19, 188, 32, 8, 92, 208, 54, 32, 90, 5, 100, 116, 144,
18, 112, 225, 121, 246, 65, 97, 247, 32, 194, 8, 8, 92, 58, 16, 216,
206, 169, 104, 150, 15, 186, 106, 100, 22, 225, 242, 8, 12, 23, 208, 66,
225, 164, 9, 76, 86, 138, 169, 37, 36, 233, 169, 155, 226, 100, 32, 161,
100, 61, 193, 103, 146, 229, 98, 161, 23, 69, 170, 73, 212, 167, 109, 246,
93, 228, 68, 174, 92, 28, 129, 210, 39, 113, 174, 65, 133, 192, 62, 7,
141, 37, 36, 141, 21, 82, 255, 254, 65, 202, 166, 250, 141, 14, 21, 19,
39, 12, 201, 242, 153, 121, 34, 171, 45, 98, 215, 255, 248, 64, 6, 77,
201, 36, 72, 147, 13, 24, 132, 34, 37, 8, 136, 52, 33, 2, 1, 105,
228, 45, 11, 255, 251, 112, 196, 9, 0, 17, 205, 95, 97, 184, 246, 128,
2, 70, 163, 40, 175, 176, 240, 0, 25, 143, 163, 192, 138, 125, 161, 91,
172, 83, 112, 200, 47, 69, 196, 236, 142, 48, 132, 145, 44, 130, 166, 160,
173, 137, 145, 176, 212, 19, 163, 84, 202, 141, 194, 168, 55, 142, 1, 224,
11, 73, 56, 57, 67, 2, 109, 180, 96, 201, 135, 150, 110, 162, 113, 45,
244, 234, 82, 5, 101, 49, 206, 145, 146, 51, 136, 36, 165, 84, 189, 141,
9, 50, 154, 37, 244, 210, 70, 235, 68, 179, 170, 173, 26, 166, 136, 32,
162, 227, 34, 138, 52, 76, 84, 232, 161, 208, 85, 85, 208, 65, 148, 105,
160, 198, 139, 82, 75, 50, 90, 58, 255, 255, 230, 224, 224, 148, 24, 123,
195, 225, 107, 61, 161, 232, 64, 0, 0, 4, 220, 147, 48, 80, 36, 180,
149, 20, 122, 149, 228, 113, 105, 105, 27, 170, 24, 152, 2, 175, 91, 88,
119, 37, 195, 116, 45, 61, 128, 198, 238, 5, 17, 140, 76, 234, 81, 186,
29, 42, 21, 194, 129, 199, 81, 78, 209, 13, 66, 92, 95, 78, 221, 140,
70, 133, 188, 248, 213, 175, 245, 215, 221, 237, 77, 211, 54, 102, 132, 233,
67, 172, 99, 17, 183, 157, 231, 16, 171, 13, 77, 31, 13, 239, 116, 177,
93, 192, 133, 61, 109, 184, 83, 231, 227, 234, 250, 245, 214, 247, 237, 253,
96, 215, 110, 53, 189, 253, 235, 237, 243, 143, 35, 21, 131, 167, 207, 161,
46, 32, 184, 230, 139, 220, 24, 132, 214, 69, 66, 145, 80, 40, 108, 52,
165, 61, 52, 210, 255, 235, 7, 52, 64, 0, 18, 192, 14, 33, 102, 211,
188, 75, 249, 210, 147, 59, 18, 44, 37, 78, 75, 226, 255, 251, 114, 196,
11, 1, 210, 9, 55, 66, 140, 177, 13, 194, 29, 39, 103, 121, 135, 153,
56, 201, 65, 251, 156, 198, 189, 151, 53, 29, 17, 57, 49, 166, 49, 67,
160, 182, 19, 3, 88, 35, 63, 34, 23, 9, 237, 204, 27, 93, 189, 53,
29, 79, 74, 196, 81, 220, 72, 51, 72, 157, 34, 232, 155, 128, 195, 204,
114, 144, 210, 22, 34, 39, 161, 177, 120, 171, 242, 88, 81, 210, 84, 195,
196, 240, 179, 190, 214, 96, 210, 151, 137, 133, 119, 20, 60, 80, 250, 53,
148, 236, 242, 241, 133, 39, 59, 8, 132, 140, 88, 38, 120, 159, 152, 232,
120, 85, 46, 48, 244, 26, 156, 112, 215, 24, 11, 5, 132, 229, 11, 144,
142, 23, 53, 239, 81, 58, 64, 97, 27, 255, 251, 65, 96, 204, 68, 63,
9, 203, 58, 129, 161, 45, 37, 223, 125, 26, 91, 217, 12, 229, 77, 141,
52, 53, 129, 141, 13, 73, 48, 90, 21, 89, 75, 148, 118, 54, 214, 119,
171, 149, 90, 96, 247, 63, 19, 41, 95, 229, 94, 103, 67, 159, 93, 34,
17, 92, 192, 232, 24, 69, 19, 128, 106, 58, 90, 229, 68, 130, 105, 102,
209, 180, 146, 20, 201, 188, 94, 118, 162, 170, 247, 24, 180, 200, 203, 158,
2, 197, 80, 19, 201, 127, 88, 140, 86, 188, 101, 130, 221, 106, 53, 132,
66, 80, 156, 156, 221, 111, 53, 92, 228, 137, 81, 102, 247, 199, 205, 248,
213, 221, 23, 71, 32, 88, 176, 119, 44, 250, 137, 57, 203, 117, 94, 90,
173, 25, 101, 55, 64, 0, 0, 5, 140, 137, 18, 9, 200, 106, 22, 220,
88, 131, 162, 235, 198, 164, 233, 80, 155, 194, 212, 12, 115, 218, 235, 48,
55, 153, 185, 212, 130, 170, 255, 251, 112, 196, 17, 129, 148, 5, 69, 47,
12, 48, 215, 10, 23, 162, 101, 237, 167, 153, 112, 160, 5, 212, 127, 96,
103, 142, 134, 11, 95, 107, 169, 75, 18, 149, 76, 172, 198, 210, 165, 65,
65, 12, 138, 181, 203, 59, 178, 215, 163, 107, 142, 108, 234, 107, 93, 171,
63, 199, 163, 128, 254, 229, 19, 186, 98, 79, 170, 215, 52, 215, 223, 164,
250, 95, 41, 169, 46, 170, 72, 199, 53, 72, 104, 114, 52, 37, 59, 112,
54, 184, 60, 15, 62, 107, 208, 150, 34, 105, 26, 17, 92, 177, 159, 76,
191, 167, 70, 69, 50, 138, 244, 86, 239, 155, 157, 124, 167, 199, 239, 45,
69, 33, 5, 9, 225, 67, 232, 171, 142, 254, 114, 213, 211, 114, 155, 236,
190, 183, 239, 243, 121, 182, 255, 253, 7, 16, 1, 60, 96, 89, 109, 149,
140, 241, 195, 45, 227, 213, 117, 172, 205, 173, 82, 74, 49, 70, 0, 245,
146, 85, 131, 122, 203, 246, 103, 101, 68, 18, 117, 180, 243, 105, 110, 81,
40, 198, 105, 186, 169, 17, 5, 183, 22, 216, 167, 42, 41, 24, 201, 21,
200, 223, 70, 77, 75, 243, 151, 213, 105, 110, 77, 150, 41, 17, 104, 54,
22, 52, 218, 202, 196, 47, 146, 90, 71, 200, 147, 158, 169, 101, 169, 51,
182, 225, 44, 215, 122, 201, 201, 230, 191, 95, 50, 168, 250, 41, 243, 133,
146, 107, 103, 236, 204, 85, 8, 134, 16, 14, 53, 226, 195, 137, 45, 194,
85, 189, 143, 83, 162, 146, 185, 20, 176, 161, 109, 191, 255, 235, 58, 128,
0, 0, 56, 240, 104, 227, 149, 42, 151, 53, 182, 192, 192, 149, 141, 157,
74, 209, 249, 24, 197, 65, 155, 147, 65, 83, 104, 118, 101, 213, 183, 255,
251, 114, 196, 16, 129, 146, 45, 61, 41, 13, 164, 215, 2, 40, 159, 100,
161, 151, 153, 224, 17, 148, 229, 56, 215, 221, 135, 34, 33, 35, 123, 159,
5, 140, 210, 110, 186, 54, 155, 21, 54, 100, 247, 102, 122, 211, 242, 244,
43, 25, 244, 241, 147, 46, 202, 86, 100, 112, 210, 4, 20, 221, 178, 109,
186, 110, 56, 210, 171, 73, 139, 59, 130, 50, 89, 194, 41, 53, 25, 146,
161, 211, 9, 23, 230, 124, 7, 220, 236, 248, 206, 212, 68, 179, 129, 146,
100, 169, 75, 243, 147, 209, 156, 245, 117, 189, 213, 184, 237, 185, 116, 251,
245, 22, 52, 49, 37, 97, 122, 144, 91, 115, 89, 253, 244, 122, 183, 251,
61, 93, 86, 57, 5, 160, 34, 122, 234, 191, 144, 107, 42, 119, 95, 71,
186, 84, 250, 59, 105, 34, 174, 89, 36, 81, 110, 219, 88, 199, 154, 169,
137, 201, 205, 152, 90, 148, 12, 111, 167, 97, 56, 14, 66, 140, 228, 10,
152, 145, 41, 121, 208, 215, 105, 181, 68, 32, 131, 195, 127, 71, 8, 28,
111, 150, 42, 159, 185, 240, 157, 143, 50, 108, 242, 196, 52, 21, 205, 248,
216, 158, 172, 216, 9, 62, 37, 159, 8, 200, 92, 148, 241, 139, 125, 32,
238, 140, 61, 74, 219, 115, 209, 79, 134, 208, 4, 52, 0, 34, 13, 32,
149, 133, 106, 107, 137, 30, 113, 193, 91, 68, 201, 253, 55, 36, 183, 85,
203, 210, 149, 221, 97, 187, 209, 220, 197, 212, 40, 165, 140, 32, 149, 25,
64, 0, 2, 46, 177, 19, 100, 181, 173, 191, 151, 35, 142, 115, 149, 26,
119, 210, 149, 124, 67, 236, 91, 142, 27, 49, 41, 61, 61, 78, 0, 32,
52, 164, 226, 8, 138, 73, 100, 126, 19, 255, 251, 112, 196, 21, 1, 206,
212, 195, 37, 12, 48, 207, 2, 17, 36, 100, 97, 151, 153, 56, 4, 193,
114, 62, 94, 176, 232, 180, 169, 110, 26, 83, 85, 150, 141, 18, 147, 125,
75, 182, 238, 210, 145, 132, 91, 210, 174, 101, 14, 250, 103, 108, 167, 80,
75, 116, 249, 170, 140, 88, 58, 167, 10, 15, 150, 120, 31, 52, 195, 64,
97, 238, 34, 208, 147, 125, 69, 64, 188, 89, 19, 200, 244, 47, 255, 255,
101, 59, 190, 193, 115, 209, 210, 35, 3, 208, 144, 84, 15, 136, 60, 109,
37, 135, 66, 211, 181, 58, 235, 187, 232, 74, 28, 65, 195, 0, 56, 199,
130, 26, 153, 178, 173, 14, 165, 166, 57, 251, 156, 86, 53, 66, 10, 237,
10, 67, 141, 154, 172, 93, 175, 72, 61, 77, 250, 79, 114, 108, 23, 1,
194, 44, 146, 22, 206, 82, 193, 20, 147, 166, 87, 40, 129, 230, 237, 43,
101, 45, 195, 78, 151, 238, 220, 54, 140, 182, 63, 84, 132, 16, 54, 179,
255, 88, 197, 118, 157, 84, 31, 72, 175, 38, 125, 213, 196, 236, 22, 197,
58, 113, 159, 214, 20, 151, 49, 9, 181, 233, 94, 253, 55, 237, 254, 234,
157, 214, 179, 61, 14, 20, 74, 194, 173, 22, 181, 131, 152, 136, 62, 52,
0, 41, 241, 45, 214, 127, 182, 48, 212, 228, 23, 93, 172, 57, 46, 175,
43, 189, 13, 57, 216, 32, 57, 23, 46, 87, 153, 158, 141, 205, 123, 6,
140, 2, 161, 157, 67, 217, 15, 151, 37, 119, 68, 111, 155, 170, 147, 174,
69, 146, 140, 131, 159, 200, 98, 149, 80, 49, 148, 204, 186, 124, 55, 139,
110, 127, 249, 249, 255, 242, 202, 179, 162, 88, 202, 111, 228, 157, 99, 248,
162, 70, 255, 251, 114, 196, 41, 128, 141, 161, 23, 34, 172, 36, 111, 1,
215, 191, 163, 213, 166, 9, 225, 160, 243, 211, 255, 255, 179, 207, 247, 41,
164, 197, 238, 117, 195, 150, 60, 211, 153, 98, 78, 148, 107, 92, 187, 79,
150, 26, 2, 61, 6, 18, 234, 181, 206, 76, 210, 196, 249, 43, 134, 164,
241, 39, 115, 6, 135, 10, 134, 150, 158, 95, 155, 100, 170, 59, 46, 57,
57, 58, 43, 174, 16, 68, 129, 185, 37, 248, 229, 147, 87, 161, 143, 145,
207, 209, 108, 102, 213, 72, 138, 99, 32, 237, 193, 140, 9, 22, 138, 200,
122, 161, 12, 133, 113, 148, 81, 12, 239, 77, 187, 247, 233, 234, 136, 214,
212, 202, 174, 191, 162, 244, 242, 255, 233, 191, 209, 191, 223, 255, 223, 223,
77, 245, 247, 173, 223, 152, 150, 177, 90, 173, 66, 232, 236, 135, 58, 55,
71, 149, 129, 177, 82, 121, 177, 0, 128, 192, 53, 16, 15, 113, 50, 219,
72, 44, 219, 179, 189, 139, 198, 230, 165, 2, 176, 54, 2, 129, 120, 146,
177, 209, 220, 245, 138, 186, 163, 84, 81, 131, 237, 70, 144, 45, 36, 70,
125, 74, 174, 34, 134, 135, 209, 106, 226, 237, 126, 29, 55, 85, 111, 50,
197, 196, 111, 85, 213, 13, 44, 53, 213, 226, 55, 0, 28, 120, 233, 245,
188, 107, 206, 231, 26, 199, 58, 145, 81, 139, 255, 243, 255, 171, 238, 101,
155, 244, 157, 97, 124, 210, 34, 57, 64, 56, 184, 21, 176, 129, 67, 194,
129, 208, 160, 192, 138, 12, 141, 4, 32, 64, 248, 61, 17, 66, 109, 185,
28, 106, 221, 139, 17, 154, 72, 68, 13, 85, 133, 84, 8, 0, 136, 201,
140, 175, 147, 70, 82, 19, 100, 104, 230, 196, 236, 118, 255, 251, 112, 196,
74, 128, 14, 0, 149, 31, 45, 49, 7, 193, 223, 193, 35, 161, 148, 137,
177, 214, 205, 132, 26, 107, 103, 36, 182, 95, 111, 25, 66, 81, 164, 67,
41, 220, 128, 182, 144, 142, 117, 49, 51, 57, 84, 137, 87, 43, 163, 43,
238, 101, 73, 154, 199, 71, 118, 209, 236, 169, 237, 79, 182, 158, 205, 254,
94, 255, 255, 253, 159, 71, 215, 116, 255, 255, 106, 45, 26, 70, 127, 71,
70, 114, 204, 83, 92, 140, 89, 157, 93, 119, 116, 45, 174, 252, 133, 133,
156, 194, 142, 30, 2, 114, 212, 47, 154, 66, 86, 35, 204, 216, 106, 205,
165, 33, 62, 80, 14, 25, 8, 115, 141, 9, 169, 154, 90, 174, 146, 249,
237, 18, 216, 111, 20, 24, 238, 74, 41, 129, 18, 114, 173, 20, 205, 244,
171, 152, 242, 223, 24, 75, 178, 72, 19, 40, 16, 13, 36, 244, 192, 177,
65, 118, 211, 160, 120, 198, 32, 208, 32, 198, 49, 227, 84, 10, 129, 218,
105, 134, 149, 85, 140, 34, 94, 48, 106, 254, 202, 174, 212, 226, 136, 157,
91, 121, 120, 171, 97, 152, 112, 252, 232, 168, 76, 17, 149, 46, 152, 141,
142, 6, 129, 34, 0, 33, 49, 105, 233, 108, 80, 80, 83, 89, 171, 67,
71, 241, 89, 75, 170, 132, 38, 76, 25, 135, 114, 211, 196, 11, 97, 196,
50, 100, 209, 178, 109, 158, 202, 207, 33, 147, 56, 143, 18, 188, 173, 204,
137, 249, 151, 49, 230, 54, 179, 156, 137, 99, 46, 239, 107, 165, 76, 9,
21, 27, 159, 106, 54, 221, 108, 228, 99, 187, 59, 255, 181, 255, 250, 125,
117, 215, 191, 255, 222, 140, 143, 255, 93, 63, 187, 90, 166, 170, 169, 222,
214, 103, 89, 84, 242, 255, 251, 114, 196, 104, 128, 13, 160, 157, 33, 39,
176, 99, 193, 206, 192, 99, 153, 132, 137, 177, 50, 181, 95, 18, 215, 33,
78, 68, 107, 186, 152, 228, 193, 156, 168, 45, 16, 28, 208, 136, 137, 36,
0, 135, 135, 160, 111, 185, 197, 197, 189, 165, 92, 161, 9, 16, 194, 2,
123, 203, 204, 203, 6, 204, 93, 99, 75, 109, 79, 59, 54, 22, 63, 102,
172, 207, 164, 101, 230, 211, 212, 193, 8, 226, 164, 247, 168, 188, 226, 170,
69, 13, 197, 28, 69, 36, 68, 43, 224, 130, 59, 120, 217, 40, 66, 200,
208, 116, 144, 99, 138, 43, 30, 164, 139, 79, 204, 141, 9, 54, 75, 122,
6, 200, 51, 197, 222, 212, 10, 8, 106, 115, 125, 83, 255, 255, 236, 233,
239, 46, 247, 77, 37, 206, 36, 40, 195, 234, 139, 9, 69, 35, 194, 226,
229, 156, 19, 14, 134, 232, 240, 4, 0, 1, 164, 100, 25, 105, 129, 24,
52, 95, 94, 126, 4, 4, 114, 216, 112, 58, 152, 64, 78, 57, 90, 118,
113, 85, 230, 105, 215, 86, 81, 4, 41, 196, 140, 44, 138, 134, 60, 35,
129, 50, 104, 185, 9, 212, 212, 188, 150, 233, 136, 148, 30, 81, 39, 244,
70, 93, 162, 69, 76, 188, 206, 200, 153, 103, 76, 209, 11, 117, 61, 221,
122, 52, 124, 22, 50, 30, 16, 81, 17, 17, 4, 50, 140, 123, 222, 38,
82, 144, 243, 231, 218, 60, 48, 15, 155, 106, 207, 237, 46, 218, 126, 205,
44, 79, 255, 239, 73, 117, 222, 180, 140, 124, 77, 14, 164, 211, 160, 117,
42, 88, 130, 182, 39, 27, 106, 86, 10, 132, 234, 17, 3, 52, 66, 208,
152, 44, 44, 48, 213, 243, 221, 175, 111, 5, 100, 15, 225, 144, 184, 255,
251, 112, 196, 138, 128, 15, 68, 251, 33, 71, 176, 107, 193, 237, 162, 36,
164, 246, 32, 176, 44, 162, 50, 57, 8, 192, 29, 205, 121, 175, 112, 132,
134, 100, 161, 235, 82, 16, 82, 227, 191, 33, 117, 212, 64, 202, 63, 10,
168, 110, 32, 64, 228, 2, 4, 250, 140, 36, 154, 148, 162, 171, 10, 12,
19, 186, 108, 83, 10, 24, 64, 199, 251, 254, 215, 251, 15, 252, 178, 250,
141, 233, 1, 80, 112, 101, 8, 88, 82, 112, 64, 118, 77, 146, 46, 222,
133, 23, 122, 115, 54, 194, 198, 36, 178, 29, 197, 34, 249, 97, 211, 108,
77, 184, 71, 97, 174, 120, 32, 60, 224, 123, 75, 138, 6, 46, 66, 157,
83, 94, 65, 5, 63, 169, 253, 22, 152, 142, 142, 165, 34, 173, 232, 221,
45, 6, 202, 101, 212, 99, 72, 179, 160, 105, 243, 175, 132, 194, 3, 105,
87, 16, 129, 95, 128, 137, 149, 67, 25, 162, 131, 219, 19, 136, 84, 96,
25, 0, 43, 209, 140, 15, 25, 128, 29, 135, 224, 104, 33, 25, 46, 42,
114, 43, 166, 182, 225, 38, 163, 48, 65, 102, 131, 18, 77, 168, 195, 29,
141, 180, 6, 119, 62, 109, 8, 66, 233, 112, 206, 48, 101, 242, 23, 230,
251, 130, 227, 218, 177, 102, 95, 13, 150, 204, 186, 106, 209, 19, 179, 90,
173, 169, 31, 214, 146, 61, 175, 220, 211, 199, 62, 221, 25, 99, 136, 143,
244, 217, 213, 152, 198, 173, 170, 185, 219, 252, 233, 245, 98, 145, 175, 191,
119, 223, 200, 132, 131, 46, 253, 94, 217, 177, 39, 150, 203, 49, 183, 220,
59, 250, 235, 47, 152, 135, 24, 60, 63, 167, 254, 95, 151, 62, 174, 190,
198, 27, 253, 243, 117, 251, 159, 63, 255, 251, 114, 196, 161, 128, 18, 77,
75, 61, 180, 244, 128, 3, 165, 179, 44, 55, 53, 146, 2, 255, 185, 233,
99, 181, 248, 30, 49, 142, 29, 175, 217, 102, 185, 142, 59, 214, 91, 214,
255, 247, 255, 252, 195, 60, 243, 203, 152, 94, 175, 223, 195, 185, 94, 194,
24, 150, 75, 238, 88, 139, 215, 202, 87, 27, 151, 197, 43, 255, 255, 255,
248, 16, 49, 40, 8, 61, 20, 132, 17, 34, 33, 0, 80, 7, 37, 69,
16, 222, 67, 137, 209, 1, 217, 110, 124, 138, 83, 161, 40, 213, 49, 114,
56, 173, 1, 81, 218, 77, 163, 100, 206, 212, 121, 214, 195, 164, 233, 105,
41, 0, 73, 0, 81, 165, 148, 214, 241, 239, 184, 102, 200, 239, 115, 161,
213, 77, 237, 201, 27, 62, 239, 235, 111, 246, 231, 27, 30, 185, 100, 182,
29, 127, 14, 107, 91, 91, 90, 218, 249, 107, 90, 218, 108, 67, 183, 59,
218, 231, 57, 215, 237, 175, 255, 255, 175, 229, 181, 19, 241, 119, 126, 214,
183, 255, 229, 181, 255, 203, 141, 172, 236, 3, 82, 223, 131, 64, 208, 104,
119, 73, 0, 0, 10, 17, 145, 119, 81, 151, 147, 156, 165, 85, 164, 135,
251, 195, 25, 12, 48, 88, 158, 163, 164, 134, 229, 9, 181, 145, 191, 29,
201, 198, 3, 60, 7, 187, 101, 87, 38, 4, 44, 210, 39, 104, 74, 129,
28, 196, 161, 103, 100, 2, 53, 48, 218, 12, 183, 34, 198, 207, 164, 169,
249, 46, 11, 148, 22, 104, 5, 40, 41, 99, 86, 191, 158, 178, 72, 191,
86, 150, 213, 159, 51, 1, 219, 163, 35, 68, 211, 46, 60, 41, 112, 211,
74, 246, 228, 229, 91, 166, 44, 151, 233, 212, 71, 73, 230, 137, 90, 95,
203, 198, 255, 251, 112, 196, 118, 0, 15, 57, 115, 103, 220, 245, 128, 1,
236, 23, 171, 100, 243, 39, 9, 253, 21, 203, 206, 255, 255, 185, 103, 245,
6, 148, 48, 19, 16, 0, 2, 0, 151, 0, 77, 11, 160, 189, 63, 65,
207, 43, 180, 15, 66, 215, 105, 196, 114, 18, 214, 58, 165, 85, 199, 87,
62, 127, 159, 91, 4, 23, 137, 236, 254, 184, 164, 5, 4, 66, 190, 101,
147, 177, 203, 241, 206, 197, 136, 36, 49, 141, 143, 141, 88, 40, 22, 16,
177, 78, 237, 255, 255, 161, 86, 91, 166, 146, 43, 146, 127, 118, 251, 126,
203, 153, 166, 249, 162, 173, 111, 247, 28, 76, 85, 158, 9, 138, 184, 229,
127, 44, 247, 186, 255, 174, 255, 223, 93, 201, 43, 165, 30, 129, 0, 0,
0, 207, 218, 11, 228, 234, 179, 102, 106, 222, 56, 48, 211, 109, 38, 101,
47, 232, 80, 184, 204, 112, 100, 150, 110, 255, 211, 27, 33, 64, 181, 105,
219, 41, 250, 96, 101, 97, 233, 56, 130, 224, 86, 233, 194, 216, 155, 180,
126, 236, 43, 107, 23, 169, 1, 232, 164, 178, 133, 84, 6, 37, 3, 43,
187, 181, 30, 162, 193, 171, 145, 12, 238, 86, 78, 66, 188, 141, 186, 94,
116, 123, 17, 34, 156, 168, 201, 181, 149, 12, 211, 59, 175, 95, 174, 191,
67, 63, 167, 238, 138, 96, 198, 77, 195, 32, 21, 12, 14, 178, 158, 177,
50, 47, 66, 128, 0, 7, 196, 45, 102, 174, 211, 202, 215, 96, 55, 117,
229, 114, 232, 66, 215, 79, 66, 144, 132, 196, 154, 34, 85, 90, 113, 230,
17, 197, 122, 2, 234, 159, 39, 97, 245, 175, 149, 67, 20, 65, 200, 114,
11, 102, 218, 71, 69, 201, 180, 122, 157, 172, 211, 255, 251, 114, 196, 141,
128, 13, 128, 123, 83, 231, 177, 13, 9, 210, 173, 168, 165, 150, 9, 120,
91, 240, 237, 109, 83, 18, 106, 140, 16, 190, 34, 59, 84, 185, 50, 237,
106, 134, 199, 87, 27, 207, 94, 212, 221, 255, 59, 204, 218, 164, 145, 85,
7, 118, 207, 135, 251, 181, 203, 221, 162, 76, 102, 168, 8, 195, 133, 45,
189, 249, 223, 217, 217, 202, 233, 137, 129, 0, 5, 195, 196, 214, 159, 118,
26, 233, 190, 142, 227, 134, 196, 159, 85, 252, 201, 222, 231, 97, 232, 118,
97, 251, 246, 163, 184, 197, 51, 140, 190, 180, 149, 104, 105, 55, 99, 189,
181, 198, 97, 35, 173, 23, 122, 25, 148, 106, 154, 103, 8, 153, 70, 150,
145, 244, 213, 113, 221, 206, 44, 144, 163, 5, 143, 160, 113, 197, 15, 150,
145, 197, 52, 91, 43, 202, 215, 45, 16, 147, 254, 185, 36, 141, 206, 213,
113, 144, 81, 72, 164, 26, 154, 181, 228, 188, 181, 71, 213, 221, 105, 179,
2, 122, 180, 218, 10, 88, 70, 10, 128, 92, 182, 110, 174, 21, 128, 0,
0, 6, 195, 173, 139, 49, 154, 114, 226, 239, 46, 221, 213, 164, 188, 160,
86, 106, 254, 195, 143, 245, 28, 136, 92, 108, 97, 179, 68, 160, 184, 78,
237, 69, 210, 209, 75, 136, 65, 240, 52, 193, 9, 224, 174, 10, 101, 47,
85, 9, 174, 148, 47, 37, 24, 220, 228, 228, 47, 234, 251, 69, 83, 26,
40, 205, 231, 150, 198, 210, 26, 183, 170, 219, 64, 214, 210, 213, 143, 59,
195, 150, 115, 239, 197, 100, 11, 66, 26, 62, 101, 205, 79, 135, 151, 206,
50, 94, 244, 203, 208, 200, 165, 225, 124, 252, 129, 68, 133, 57, 134, 86,
50, 0, 49, 119, 134, 255, 251, 112, 196, 175, 128, 142, 40, 255, 67, 44,
49, 9, 137, 214, 40, 39, 101, 132, 11, 24, 75, 5, 73, 124, 48, 156,
198, 201, 6, 18, 32, 18, 11, 24, 61, 84, 37, 192, 81, 65, 248, 204,
97, 104, 161, 18, 11, 135, 209, 107, 105, 140, 154, 192, 50, 60, 161, 8,
98, 194, 16, 138, 112, 183, 23, 173, 95, 19, 89, 232, 120, 220, 173, 25,
39, 60, 181, 22, 117, 186, 154, 108, 21, 16, 17, 35, 181, 216, 204, 106,
192, 168, 172, 75, 19, 56, 130, 31, 42, 95, 52, 203, 125, 87, 52, 233,
155, 17, 43, 145, 66, 182, 44, 161, 33, 86, 66, 78, 123, 155, 181, 51,
129, 202, 228, 187, 100, 170, 110, 74, 85, 37, 142, 130, 38, 2, 201, 40,
155, 163, 127, 144, 52, 208, 3, 103, 45, 26, 12, 47, 114, 240, 191, 238,
253, 87, 93, 229, 99, 113, 84, 254, 114, 251, 46, 104, 209, 183, 94, 44,
250, 51, 40, 41, 164, 37, 171, 28, 114, 153, 82, 181, 179, 54, 155, 27,
169, 40, 132, 197, 33, 164, 14, 140, 146, 17, 176, 72, 34, 136, 100, 136,
80, 91, 88, 68, 102, 172, 137, 8, 248, 193, 49, 253, 182, 97, 21, 16,
52, 189, 89, 194, 209, 228, 2, 134, 141, 81, 114, 163, 128, 203, 140, 158,
118, 206, 233, 191, 93, 89, 68, 131, 159, 166, 133, 93, 201, 185, 88, 111,
245, 239, 181, 124, 255, 187, 127, 187, 27, 231, 115, 186, 44, 56, 89, 170,
28, 42, 199, 91, 211, 255, 75, 169, 180, 230, 187, 237, 183, 136, 144, 245,
36, 122, 11, 172, 3, 134, 153, 58, 219, 247, 21, 232, 103, 237, 85, 213,
126, 193, 166, 53, 2, 204, 169, 194, 148, 131, 25, 48, 216, 143, 255, 251,
114, 196, 206, 1, 142, 93, 93, 57, 44, 36, 111, 193, 203, 158, 166, 36,
246, 33, 176, 46, 74, 146, 251, 206, 96, 149, 43, 153, 108, 171, 114, 86,
72, 228, 143, 102, 56, 203, 137, 156, 133, 133, 164, 184, 49, 46, 216, 91,
33, 178, 203, 2, 143, 160, 186, 108, 122, 176, 97, 130, 201, 36, 194, 22,
161, 243, 134, 5, 43, 60, 70, 163, 3, 57, 140, 34, 32, 201, 165, 38,
25, 177, 194, 188, 93, 173, 87, 233, 5, 12, 186, 34, 120, 100, 53, 172,
217, 53, 69, 242, 2, 97, 54, 54, 71, 127, 169, 17, 123, 147, 165, 95,
127, 186, 218, 191, 181, 14, 70, 251, 18, 44, 237, 49, 0, 197, 136, 42,
9, 0, 0, 1, 56, 128, 24, 178, 58, 202, 31, 118, 134, 208, 159, 215,
165, 100, 168, 107, 128, 134, 233, 1, 94, 84, 49, 15, 58, 154, 224, 191,
46, 204, 8, 211, 245, 82, 238, 34, 173, 194, 93, 169, 221, 16, 83, 200,
194, 79, 20, 101, 171, 66, 194, 149, 228, 107, 24, 168, 9, 76, 9, 36,
46, 14, 190, 105, 148, 74, 47, 18, 2, 164, 69, 221, 152, 228, 99, 188,
239, 138, 43, 207, 58, 201, 19, 104, 94, 60, 190, 231, 215, 247, 45, 127,
88, 214, 166, 152, 250, 115, 238, 164, 203, 147, 20, 52, 118, 69, 215, 167,
66, 243, 189, 124, 246, 157, 213, 209, 27, 173, 234, 89, 181, 118, 138, 165,
15, 40, 188, 86, 85, 34, 147, 34, 1, 133, 18, 6, 215, 30, 229, 110,
83, 120, 234, 149, 151, 65, 114, 152, 160, 108, 145, 20, 33, 43, 145, 53,
87, 167, 101, 143, 163, 83, 166, 148, 183, 88, 229, 12, 190, 81, 40, 149,
203, 115, 145, 53, 231, 41, 175, 53, 255, 251, 112, 196, 237, 129, 211, 101,
63, 36, 12, 36, 216, 130, 28, 159, 164, 149, 151, 161, 176, 166, 120, 176,
209, 213, 129, 127, 103, 233, 101, 227, 75, 101, 21, 88, 29, 105, 185, 8,
99, 187, 92, 13, 124, 179, 112, 128, 70, 26, 106, 211, 29, 3, 56, 68,
90, 106, 101, 203, 129, 240, 203, 21, 21, 173, 171, 50, 202, 172, 243, 81,
78, 10, 113, 134, 59, 58, 58, 61, 107, 84, 68, 28, 173, 201, 100, 213,
101, 204, 230, 77, 221, 117, 175, 167, 247, 209, 173, 205, 235, 87, 110, 151,
117, 216, 212, 39, 109, 85, 210, 215, 178, 163, 244, 99, 31, 50, 165, 153,
152, 199, 67, 176, 165, 25, 17, 0, 0, 89, 64, 226, 22, 130, 111, 55,
69, 14, 132, 69, 90, 99, 14, 90, 236, 189, 197, 148, 177, 231, 2, 25,
132, 182, 241, 152, 228, 150, 138, 101, 255, 110, 241, 152, 213, 28, 213, 216,
119, 144, 12, 98, 2, 163, 143, 73, 100, 80, 213, 201, 153, 101, 235, 70,
111, 66, 5, 210, 192, 98, 133, 73, 40, 154, 12, 31, 246, 14, 142, 2,
93, 66, 1, 8, 3, 177, 189, 63, 162, 80, 89, 136, 43, 35, 172, 200,
242, 171, 14, 234, 89, 136, 132, 72, 163, 208, 234, 62, 206, 140, 118, 118,
71, 107, 24, 164, 228, 166, 203, 95, 254, 159, 251, 105, 126, 252, 181, 121,
89, 190, 185, 117, 244, 221, 211, 84, 173, 165, 156, 166, 73, 77, 98, 73,
121, 236, 46, 207, 157, 128, 144, 33, 34, 191, 17, 36, 219, 82, 15, 171,
6, 211, 91, 76, 82, 64, 46, 85, 10, 209, 143, 63, 235, 250, 212, 21,
13, 67, 181, 102, 32, 25, 3, 179, 169, 79, 41, 38, 170, 246, 212, 57,
36, 255, 251, 112, 196, 238, 1, 144, 237, 1, 35, 13, 60, 205, 66, 97,
65, 35, 133, 164, 23, 32, 135, 223, 216, 102, 49, 1, 51, 90, 25, 31,
115, 58, 108, 44, 239, 122, 85, 69, 29, 185, 48, 248, 244, 83, 36, 158,
132, 180, 70, 203, 118, 94, 244, 94, 62, 152, 157, 94, 110, 239, 162, 84,
27, 50, 117, 212, 154, 93, 215, 106, 80, 183, 229, 149, 172, 252, 205, 87,
221, 85, 189, 59, 178, 210, 169, 255, 254, 157, 81, 242, 93, 153, 146, 170,
140, 117, 82, 44, 142, 140, 73, 10, 239, 101, 37, 198, 80, 108, 56, 66,
57, 200, 225, 206, 217, 202, 130, 138, 24, 166, 28, 103, 56, 84, 85, 76,
65, 77, 56, 162, 33, 32, 2, 202, 193, 110, 226, 161, 147, 59, 139, 176,
128, 12, 72, 1, 175, 217, 80, 87, 69, 239, 154, 113, 158, 155, 22, 163,
245, 169, 229, 16, 52, 147, 87, 101, 145, 139, 113, 202, 244, 15, 189, 50,
247, 134, 36, 121, 86, 161, 163, 211, 150, 198, 53, 89, 106, 59, 117, 146,
99, 42, 175, 94, 75, 26, 113, 195, 138, 143, 23, 253, 201, 89, 69, 74,
169, 105, 131, 207, 59, 220, 167, 62, 174, 149, 26, 82, 180, 182, 59, 49,
40, 233, 90, 177, 174, 207, 191, 212, 139, 109, 191, 191, 95, 175, 235, 244,
162, 165, 46, 133, 127, 43, 218, 142, 91, 29, 142, 69, 105, 164, 51, 147,
113, 142, 103, 16, 36, 65, 209, 40, 86, 10, 22, 65, 35, 143, 23, 88,
104, 160, 162, 9, 15, 65, 54, 19, 6, 120, 88, 241, 146, 126, 70, 250,
96, 226, 8, 78, 112, 176, 182, 91, 28, 143, 159, 39, 8, 33, 73, 105,
131, 145, 88, 25, 47, 165, 42, 37, 80, 240, 255, 251, 114, 196, 240, 0,
146, 49, 251, 31, 45, 12, 185, 10, 77, 64, 227, 85, 163, 11, 25, 192,
65, 40, 61, 49, 134, 122, 166, 7, 175, 4, 204, 117, 51, 85, 190, 85,
95, 199, 131, 241, 217, 166, 188, 215, 236, 93, 145, 34, 163, 192, 98, 19,
166, 210, 130, 237, 141, 31, 66, 169, 60, 235, 78, 190, 112, 93, 186, 40,
94, 165, 86, 223, 236, 103, 255, 182, 246, 182, 182, 50, 166, 100, 216, 183,
45, 212, 40, 82, 45, 8, 19, 154, 50, 4, 74, 100, 117, 145, 15, 120,
77, 48, 156, 230, 105, 36, 79, 151, 234, 153, 43, 87, 34, 190, 141, 181,
116, 85, 98, 113, 150, 224, 222, 191, 48, 76, 178, 24, 141, 74, 160, 94,
208, 94, 169, 98, 151, 181, 234, 88, 127, 235, 71, 35, 211, 55, 170, 88,
165, 187, 71, 51, 106, 245, 44, 205, 236, 108, 219, 232, 48, 198, 72, 200,
4, 113, 99, 192, 227, 226, 216, 168, 54, 28, 96, 50, 18, 55, 72, 214,
136, 48, 100, 136, 77, 230, 226, 82, 185, 218, 91, 52, 204, 156, 150, 117,
183, 203, 159, 150, 113, 125, 178, 133, 195, 120, 134, 180, 236, 54, 62, 204,
247, 42, 164, 214, 127, 75, 238, 230, 196, 167, 78, 223, 82, 167, 236, 142,
20, 33, 186, 15, 109, 37, 148, 221, 138, 157, 67, 243, 105, 201, 26, 196,
91, 81, 164, 165, 120, 208, 69, 1, 111, 71, 34, 48, 42, 73, 70, 4,
233, 209, 128, 128, 0, 73, 168, 125, 204, 173, 103, 194, 156, 121, 4, 52,
212, 156, 134, 217, 232, 67, 200, 10, 137, 212, 131, 166, 45, 80, 194, 32,
187, 176, 115, 133, 30, 221, 107, 178, 171, 29, 143, 70, 105, 45, 82, 95,
154, 165, 183, 87, 255, 251, 112, 196, 238, 128, 19, 50, 13, 22, 13, 152,
184, 129, 161, 146, 228, 37, 166, 24, 56, 241, 187, 48, 160, 227, 45, 75,
169, 185, 169, 87, 54, 140, 234, 6, 40, 94, 84, 178, 221, 99, 123, 62,
79, 166, 138, 236, 144, 21, 88, 237, 180, 254, 155, 178, 18, 74, 100, 116,
144, 243, 180, 114, 47, 251, 231, 153, 26, 103, 114, 45, 149, 238, 146, 239,
205, 16, 143, 140, 253, 179, 83, 226, 238, 70, 70, 143, 130, 11, 132, 194,
182, 167, 32, 59, 10, 143, 189, 242, 68, 159, 86, 115, 130, 241, 213, 133,
141, 195, 90, 35, 46, 98, 34, 164, 144, 42, 232, 161, 35, 101, 16, 250,
68, 52, 202, 138, 193, 52, 49, 70, 243, 9, 85, 0, 97, 8, 0, 101,
64, 116, 91, 172, 15, 187, 242, 186, 176, 76, 5, 38, 150, 200, 236, 68,
158, 203, 181, 148, 104, 176, 37, 0, 5, 188, 42, 135, 69, 0, 50, 131,
19, 219, 130, 28, 137, 9, 170, 145, 88, 215, 42, 167, 232, 53, 140, 141,
207, 245, 35, 251, 51, 162, 161, 153, 111, 211, 47, 111, 167, 103, 84, 215,
115, 45, 63, 245, 79, 246, 209, 250, 179, 34, 111, 167, 106, 163, 125, 236,
100, 19, 55, 116, 87, 100, 67, 188, 118, 207, 32, 212, 71, 34, 34, 138,
74, 89, 148, 230, 41, 3, 84, 167, 83, 137, 48, 152, 199, 21, 24, 81,
199, 32, 177, 133, 71, 11, 192, 81, 49, 32, 0, 16, 76, 177, 152, 103,
33, 72, 158, 39, 253, 253, 146, 94, 127, 98, 244, 55, 99, 144, 75, 177,
40, 169, 122, 123, 30, 209, 115, 118, 119, 102, 173, 124, 165, 95, 90, 126,
213, 92, 3, 5, 20, 40, 12, 118, 106, 68, 32, 219, 200, 255, 251, 114,
196, 255, 128, 21, 42, 7, 21, 45, 140, 219, 138, 139, 193, 162, 21, 145,
167, 56, 88, 85, 195, 145, 162, 170, 34, 26, 198, 0, 84, 47, 164, 100,
115, 47, 133, 101, 108, 31, 73, 99, 204, 140, 154, 60, 51, 35, 203, 242,
134, 247, 72, 167, 224, 168, 230, 151, 51, 161, 151, 127, 148, 234, 109, 196,
175, 215, 60, 187, 217, 229, 66, 165, 31, 63, 187, 40, 74, 238, 49, 186,
188, 150, 206, 171, 43, 8, 61, 205, 26, 72, 226, 210, 8, 65, 188, 148,
177, 121, 23, 60, 162, 200, 17, 28, 76, 71, 25, 179, 34, 78, 254, 177,
43, 107, 161, 89, 83, 3, 107, 78, 3, 103, 148, 154, 234, 147, 162, 73,
35, 240, 90, 48, 9, 226, 33, 13, 173, 47, 201, 124, 131, 25, 200, 30,
121, 173, 65, 245, 42, 80, 67, 244, 183, 106, 99, 67, 102, 127, 27, 55,
55, 206, 243, 119, 53, 220, 102, 112, 185, 220, 121, 173, 103, 154, 32, 7,
112, 210, 121, 200, 26, 138, 46, 188, 133, 240, 65, 180, 36, 203, 63, 142,
215, 203, 251, 254, 158, 107, 122, 95, 159, 157, 235, 112, 191, 167, 219, 157,
176, 235, 151, 231, 26, 122, 47, 124, 243, 171, 240, 204, 208, 207, 215, 185,
253, 79, 135, 168, 98, 153, 95, 51, 75, 10, 66, 65, 196, 83, 62, 23,
6, 36, 237, 169, 69, 12, 22, 213, 230, 219, 16, 147, 219, 93, 109, 70,
226, 44, 201, 82, 107, 20, 45, 36, 117, 163, 187, 203, 76, 85, 206, 168,
81, 69, 86, 80, 113, 163, 164, 155, 113, 127, 169, 95, 73, 76, 235, 241,
141, 29, 61, 233, 83, 221, 53, 156, 207, 123, 126, 165, 62, 118, 117, 220,
242, 203, 151, 185, 246, 114, 198, 255, 251, 112, 196, 235, 130, 80, 86, 11,
22, 204, 12, 175, 138, 128, 65, 97, 193, 129, 166, 248, 231, 227, 141, 142,
96, 12, 220, 39, 1, 33, 249, 74, 71, 61, 162, 244, 162, 17, 228, 228,
70, 55, 110, 186, 143, 117, 32, 72, 217, 113, 63, 175, 97, 212, 200, 155,
115, 233, 179, 125, 43, 230, 253, 204, 239, 114, 182, 204, 248, 124, 255, 62,
151, 87, 135, 10, 121, 186, 174, 139, 205, 76, 201, 37, 87, 176, 31, 20,
222, 237, 84, 47, 7, 50, 210, 131, 204, 155, 80, 153, 247, 132, 57, 102,
38, 97, 148, 90, 91, 213, 101, 202, 9, 16, 60, 152, 14, 138, 76, 144,
58, 106, 73, 20, 128, 134, 148, 152, 73, 163, 139, 218, 0, 4, 45, 110,
145, 9, 6, 166, 205, 165, 12, 21, 79, 43, 139, 87, 130, 174, 222, 164,
191, 98, 237, 217, 220, 96, 189, 24, 90, 16, 20, 32, 59, 148, 66, 88,
254, 177, 90, 26, 148, 67, 139, 10, 75, 206, 143, 217, 194, 151, 117, 42,
35, 66, 52, 226, 100, 10, 81, 122, 62, 217, 50, 51, 130, 125, 114, 23,
147, 83, 220, 94, 207, 211, 70, 120, 249, 148, 46, 115, 204, 191, 159, 100,
255, 143, 149, 237, 57, 148, 58, 219, 240, 202, 242, 210, 43, 249, 127, 51,
252, 251, 206, 115, 153, 18, 75, 162, 246, 147, 145, 133, 136, 75, 224, 164,
246, 4, 110, 172, 96, 246, 105, 228, 64, 40, 4, 41, 196, 163, 208, 192,
120, 144, 93, 11, 65, 46, 64, 118, 46, 3, 5, 219, 169, 4, 229, 12,
88, 175, 34, 129, 108, 74, 241, 220, 191, 123, 237, 235, 152, 106, 237, 141,
97, 172, 185, 170, 109, 209, 213, 160, 192, 34, 11, 10, 132, 0, 13, 34,
255, 251, 114, 196, 236, 3, 82, 2, 11, 18, 44, 141, 57, 202, 78, 65,
226, 1, 129, 155, 56, 12, 173, 72, 235, 154, 158, 98, 13, 227, 145, 83,
65, 8, 183, 222, 216, 197, 159, 212, 74, 197, 103, 84, 210, 214, 71, 204,
206, 30, 148, 201, 35, 166, 84, 194, 188, 224, 34, 166, 114, 153, 219, 153,
25, 242, 101, 182, 174, 133, 169, 25, 181, 159, 185, 174, 123, 247, 61, 242,
172, 91, 255, 138, 255, 21, 99, 72, 39, 42, 107, 193, 164, 170, 24, 131,
11, 47, 53, 118, 213, 155, 18, 20, 172, 115, 122, 5, 207, 32, 26, 181,
53, 86, 17, 166, 194, 230, 17, 16, 84, 216, 33, 81, 76, 178, 20, 217,
85, 131, 104, 213, 54, 25, 85, 102, 166, 208, 14, 224, 80, 149, 172, 225,
211, 195, 251, 164, 164, 155, 164, 167, 212, 90, 246, 122, 238, 123, 183, 107,
153, 255, 247, 12, 185, 119, 60, 170, 111, 124, 17, 43, 46, 59, 89, 45,
207, 33, 244, 104, 142, 136, 104, 211, 233, 76, 148, 225, 78, 41, 206, 23,
221, 178, 53, 166, 101, 175, 215, 35, 47, 200, 201, 243, 138, 233, 203, 251,
28, 57, 207, 72, 71, 223, 168, 127, 222, 235, 74, 28, 37, 159, 103, 75,
117, 187, 62, 231, 239, 141, 155, 49, 116, 197, 239, 136, 101, 126, 85, 228,
53, 63, 215, 43, 105, 219, 29, 251, 158, 131, 61, 149, 175, 53, 151, 200,
208, 189, 186, 52, 65, 226, 105, 102, 129, 145, 49, 41, 52, 84, 36, 64,
145, 88, 69, 1, 38, 60, 90, 69, 149, 231, 7, 228, 215, 101, 20, 92,
130, 117, 157, 201, 86, 122, 199, 157, 207, 14, 90, 199, 149, 119, 126, 154,
181, 46, 120, 101, 188, 251, 203, 56, 239, 155, 255, 251, 112, 196, 236, 130,
17, 53, 251, 23, 44, 32, 109, 202, 121, 193, 98, 5, 145, 166, 249, 231,
97, 6, 32, 232, 90, 35, 87, 6, 165, 66, 57, 212, 51, 203, 207, 201,
75, 157, 133, 105, 29, 51, 250, 94, 83, 52, 254, 115, 252, 182, 179, 165,
167, 175, 74, 246, 241, 44, 249, 58, 133, 175, 63, 67, 47, 43, 198, 254,
181, 50, 203, 63, 143, 236, 104, 100, 185, 126, 197, 192, 88, 202, 204, 165,
113, 131, 78, 212, 22, 244, 97, 137, 55, 83, 77, 19, 16, 162, 7, 126,
231, 55, 148, 145, 28, 148, 162, 89, 162, 52, 202, 22, 148, 44, 85, 114,
210, 144, 73, 132, 104, 24, 34, 93, 106, 61, 209, 19, 41, 74, 30, 214,
245, 244, 142, 209, 82, 76, 74, 233, 106, 76, 234, 83, 91, 84, 24, 91,
231, 50, 239, 57, 86, 147, 155, 252, 251, 247, 119, 115, 122, 239, 49, 195,
70, 78, 185, 3, 166, 72, 121, 248, 41, 151, 223, 56, 183, 79, 249, 148,
178, 207, 44, 79, 133, 86, 251, 228, 91, 158, 66, 191, 242, 38, 211, 62,
159, 205, 140, 215, 134, 135, 109, 52, 54, 60, 138, 185, 29, 149, 112, 124,
135, 122, 123, 164, 204, 139, 247, 98, 245, 202, 212, 166, 78, 44, 224, 14,
12, 65, 7, 97, 99, 40, 2, 64, 252, 42, 54, 146, 35, 45, 162, 169,
198, 38, 9, 149, 50, 246, 146, 110, 217, 180, 17, 26, 46, 68, 228, 145,
181, 34, 52, 96, 112, 251, 32, 201, 82, 238, 237, 29, 17, 14, 162, 39,
94, 38, 3, 173, 152, 10, 33, 22, 33, 109, 115, 134, 71, 144, 38, 137,
227, 52, 14, 187, 36, 96, 186, 138, 233, 164, 232, 109, 62, 179, 10, 20,
92, 253, 146, 255, 251, 114, 196, 234, 131, 81, 110, 11, 18, 44, 12, 215,
202, 60, 193, 98, 5, 145, 167, 57, 90, 232, 91, 74, 125, 147, 66, 65,
33, 133, 145, 18, 232, 147, 243, 131, 81, 69, 67, 169, 76, 101, 197, 18,
207, 179, 36, 178, 4, 160, 58, 50, 157, 74, 107, 0, 32, 98, 204, 250,
167, 243, 177, 130, 1, 67, 255, 234, 178, 151, 245, 91, 223, 252, 191, 187,
182, 154, 166, 171, 32, 172, 224, 221, 234, 172, 172, 203, 153, 64, 190, 24,
115, 104, 151, 108, 73, 109, 145, 198, 224, 102, 126, 155, 60, 198, 148, 66,
68, 136, 47, 70, 133, 101, 196, 229, 20, 117, 170, 67, 32, 249, 245, 90,
39, 48, 164, 234, 96, 14, 156, 9, 48, 0, 25, 91, 156, 9, 13, 4,
74, 49, 149, 46, 169, 112, 199, 61, 225, 187, 151, 251, 175, 223, 63, 43,
153, 97, 151, 127, 242, 223, 168, 49, 8, 106, 196, 194, 158, 113, 29, 251,
234, 71, 153, 67, 204, 172, 137, 59, 205, 207, 38, 164, 87, 50, 75, 236,
73, 37, 99, 54, 211, 238, 70, 119, 52, 121, 2, 68, 123, 23, 166, 80,
155, 211, 249, 115, 171, 251, 118, 247, 121, 246, 112, 156, 151, 231, 231, 102,
251, 21, 59, 175, 255, 51, 207, 252, 185, 45, 93, 147, 135, 20, 227, 242,
154, 40, 224, 72, 92, 213, 180, 217, 159, 163, 208, 58, 250, 189, 43, 46,
187, 232, 82, 124, 195, 136, 225, 62, 64, 63, 43, 105, 105, 98, 1, 249,
105, 36, 100, 120, 11, 6, 15, 18, 14, 15, 93, 242, 104, 214, 83, 36,
145, 12, 215, 202, 99, 182, 29, 76, 23, 226, 196, 174, 142, 95, 95, 44,
55, 172, 50, 202, 246, 26, 231, 115, 189, 151, 53, 188, 245, 255, 251, 112,
196, 239, 131, 83, 14, 15, 14, 12, 141, 57, 194, 51, 193, 225, 197, 64,
167, 104, 249, 119, 61, 247, 93, 228, 200, 73, 166, 241, 16, 101, 56, 85,
113, 111, 167, 243, 234, 254, 72, 208, 78, 200, 137, 176, 206, 105, 216, 88,
96, 145, 6, 138, 148, 134, 56, 69, 36, 114, 156, 17, 25, 105, 72, 50,
139, 88, 107, 254, 94, 171, 214, 110, 82, 118, 182, 95, 184, 231, 103, 42,
86, 210, 243, 214, 217, 139, 211, 59, 42, 106, 90, 166, 20, 106, 18, 80,
145, 201, 185, 148, 137, 75, 226, 71, 144, 178, 70, 109, 121, 204, 82, 112,
37, 222, 120, 175, 100, 28, 113, 115, 232, 158, 36, 36, 108, 87, 38, 1,
131, 137, 59, 42, 1, 3, 0, 3, 97, 1, 133, 193, 237, 15, 131, 2,
145, 241, 201, 46, 169, 148, 231, 104, 178, 214, 232, 39, 162, 202, 82, 75,
90, 74, 82, 25, 23, 45, 178, 109, 148, 243, 60, 83, 88, 223, 255, 66,
151, 9, 120, 102, 174, 125, 86, 204, 202, 95, 153, 223, 142, 33, 151, 22,
232, 19, 135, 92, 163, 219, 119, 40, 102, 168, 215, 133, 159, 102, 110, 71,
30, 20, 47, 44, 155, 50, 246, 215, 231, 63, 207, 249, 231, 55, 183, 165,
158, 248, 91, 206, 186, 207, 133, 8, 237, 115, 234, 214, 68, 112, 130, 193,
140, 46, 68, 173, 65, 117, 227, 210, 108, 75, 99, 56, 251, 220, 236, 160,
113, 68, 90, 35, 172, 33, 97, 177, 233, 241, 96, 178, 61, 92, 78, 16,
203, 105, 136, 39, 247, 125, 209, 5, 122, 34, 201, 96, 68, 28, 25, 6,
135, 224, 200, 159, 0, 142, 4, 201, 239, 128, 24, 129, 195, 22, 210, 113,
35, 54, 54, 69, 42, 70, 255, 251, 114, 196, 238, 131, 83, 254, 13, 10,
46, 13, 151, 202, 41, 193, 225, 133, 176, 166, 248, 78, 203, 69, 125, 255,
191, 253, 127, 175, 255, 255, 183, 255, 214, 212, 167, 86, 57, 54, 65, 246,
100, 87, 90, 53, 11, 177, 217, 206, 166, 90, 221, 152, 115, 29, 22, 205,
122, 85, 157, 169, 247, 183, 110, 172, 149, 255, 241, 77, 255, 105, 53, 253,
43, 104, 116, 150, 242, 71, 165, 247, 136, 239, 169, 125, 50, 198, 121, 118,
55, 178, 193, 126, 231, 168, 123, 113, 107, 97, 195, 214, 102, 237, 65, 87,
178, 176, 176, 205, 148, 210, 45, 96, 246, 171, 5, 215, 232, 164, 67, 38,
133, 85, 65, 160, 167, 90, 101, 74, 33, 173, 170, 200, 108, 10, 153, 213,
164, 109, 201, 158, 30, 103, 0, 18, 225, 1, 40, 145, 0, 0, 4, 194,
184, 213, 208, 234, 182, 202, 221, 186, 183, 237, 205, 165, 229, 204, 191, 255,
229, 135, 203, 175, 255, 103, 136, 79, 155, 66, 50, 120, 114, 242, 23, 228,
33, 5, 26, 206, 109, 57, 161, 24, 76, 154, 225, 231, 255, 248, 115, 140,
211, 126, 223, 118, 222, 51, 171, 214, 214, 131, 23, 215, 18, 205, 60, 70,
91, 86, 19, 106, 166, 72, 111, 30, 19, 168, 240, 159, 70, 139, 102, 22,
216, 180, 67, 154, 218, 163, 205, 212, 174, 167, 86, 178, 192, 67, 155, 212,
135, 77, 20, 200, 84, 26, 178, 182, 144, 145, 202, 120, 45, 178, 42, 139,
234, 18, 186, 71, 62, 149, 58, 241, 50, 75, 100, 98, 57, 148, 58, 5,
162, 1, 185, 2, 108, 236, 113, 202, 158, 168, 138, 159, 68, 95, 255, 255,
255, 234, 139, 255, 253, 81, 87, 234, 138, 169, 204, 80, 192, 193, 144, 253,
255, 251, 112, 196, 235, 130, 84, 166, 15, 6, 170, 13, 151, 194, 31, 194,
33, 1, 49, 62, 248, 81, 87, 244, 85, 255, 84, 95, 48, 80, 160, 142,
71, 209, 85, 23, 245, 250, 47, 179, 148, 202, 78, 253, 153, 157, 205, 222,
250, 230, 217, 150, 154, 135, 42, 242, 210, 80, 114, 42, 26, 138, 231, 13,
180, 114, 57, 2, 161, 112, 152, 57, 156, 55, 2, 82, 176, 158, 60, 28,
43, 118, 109, 180, 120, 228, 170, 92, 59, 80, 141, 73, 144, 226, 61, 16,
139, 233, 33, 76, 85, 41, 21, 207, 20, 153, 28, 161, 55, 2, 82, 176,
242, 65, 46, 29, 177, 9, 209, 84, 132, 75, 63, 139, 234, 76, 65, 77,
69, 51, 46, 57, 57, 46, 53, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
170, 170, 170, 170, 170, 170, 170, 170, 170, 255, 251, 114, 196, 231, 0, 81,
34, 15, 5, 165, 5, 247, 194, 33, 66, 25, 192, 113, 50, 248, 170, 170
};
unsigned char hello2[] = {
0xFF,0xF2,0x40,0xC0,0x19,0xB7,0x00,0x14,0x02,0xE6,0x5C, /* ..@.......\ */
0x01,0x92,0x68,0x01,0xF1,0x5E,0x03,0x08,0xF0,0x24,0x80, /* ..h..^...$. */
0x05,0x9E,0x20,0xC6,0xFC,0x12,0x32,0x5C,0xBF,0xF9,0xB9, /* .. ...2\... */
0x20,0x4A,0x7F,0x85,0xEC,0x4C,0xCD,0xC7,0x27,0xFE,0x5C, /* J...L..'.\ */
0x34,0x25,0xCB,0xE6,0xFF,0xFF,0x8E,0x42,0xE1,0xA0,0x5E, /* 4%.....B..^ */
0xCA,0x6E,0x30,0x9F,0xFF,0xF8,0xC2,0x12,0x84,0xB9,0x7C, /* .n0.......| */
0xDC,0x61,0x09,0x4A,0x7F,0xFF,0xFF,0xF9,0x7D,0x32,0x51, /* .a.J....}2Q */
0x09,0x7C,0xE1,0xA5,0x6E,0xB4,0xFF,0xFF,0xFF,0xFF,0xD3, /* .|..n...... */
0x34,0x41,0x91,0xF0,0x11,0x8F,0x00,0x0F,0x81,0x9C,0x10, /* 4A......... */
0xEE,0x59,0xCE,0x56,0x67,0xFF,0xF2,0x42,0xC0,0xEC,0x53, /* .Y.Vg..B..S */
0x09,0x15,0xF9,0xAA,0xA8,0x0D,0xD9,0x40,0x00,0xCA,0x34, /* .......@..4 */
0x53,0xD9,0x18,0xAB,0x7D,0xF7,0x89,0x3F,0x11,0x38,0x94, /* S...}..?.8. */
0x82,0x59,0x93,0x20,0x6A,0x0C,0xEE,0x8E,0x58,0xFA,0x38, /* .Y. j...X.8 */
0x82,0xCA,0xF0,0x58,0xBB,0xDA,0x0C,0x50,0x56,0x1F,0xBB, /* ...X...PV.. */
0x18,0x5D,0x8B,0x9F,0xDA,0x71,0x4F,0xFF,0xBD,0xFE,0xEF, /* .]...qO.... */
0x69,0x36,0x86,0x3C,0x50,0xBB,0x0A,0x07,0x89,0x54,0xF0, /* i6.<P....T. */
0x88,0x9F,0x90,0x95,0x30,0x94,0x2E,0x7E,0xF0,0x64,0x96, /* ....0..~.d. */
0x79,0x08,0x3E,0x20,0x97,0x28,0x34,0x9C,0x09,0x7F,0xD2, /* y.> .(4.... */
0xC0,0x01,0x75,0xF8,0x05,0x6B,0x5F,0x41,0x17,0x0B,0xE7, /* ..u..k_A... */
0xFF,0xF2,0x40,0xC0,0x61,0xE5,0x0B,0x16,0x09,0xC6,0xC5, /* ..@.a...... */
0x74,0x7B,0xCC,0x94,0x7A,0xF7,0x80,0x76,0xB2,0xD2,0xF8, /* t{..z..v... */
0x39,0x06,0x38,0xFD,0x71,0xC5,0xDE,0x3A,0x38,0xBF,0xD5, /* 9.8.q..:8.. */
0xF7,0x12,0x37,0xCB,0xF5,0x63,0x0C,0x9B,0xCE,0x77,0x25, /* ..7..c...w% */
0xED,0xFB,0x3D,0x6B,0x35,0xF9,0x6D,0xD7,0xF9,0x2C,0xD1, /* ..=k5.m..,. */
0x97,0x15,0x87,0x93,0xA4,0x49,0x4A,0x18,0x16,0x07,0xA1, /* .....IJ.... */
0x60,0xF7,0x52,0x94,0xDB,0x02,0x16,0x70,0xB2,0xD8,0x80, /* `.R....p... */
0x30,0xC2,0x94,0x40,0x81,0x74,0x5A,0x19,0x7A,0x80,0x60, /* 0..@.tZ.z.` */
0x41,0x21,0x46,0x95,0xD5,0xC4,0x40,0xD2,0x01,0xC0,0x01, /* A!F...@.... */
0xDA,0xD9,0xA0,0xB1,0x01,0xFF,0xF2,0x42,0xC0,0x82,0x10, /* .......B... */
0x0B,0x12,0xF9,0x9E,0xC9,0x7E,0x7A,0xC6,0x95,0x55,0x09, /* .....~z..U. */
0x8B,0x19,0x5E,0x8B,0x26,0xCA,0xEB,0x68,0x8A,0x05,0x8F, /* ..^.&..h... */
0x36,0xA5,0xA5,0x03,0xB8,0x9C,0xED,0x24,0x51,0x59,0x90, /* 6......$QY. */
0xF6,0xC5,0x7D,0xB5,0xAD,0xAF,0xF6,0x3B,0x18,0xEF,0x3F, /* ..}....;..? */
0xFF,0xFF,0x4E,0xDE,0x16,0x66,0x0B,0xAA,0x33,0x23,0xDD, /* ..N..f..3#. */
0x9C,0x4E,0x6E,0x55,0x22,0x9D,0xA2,0x40,0xA6,0x36,0x31, /* .NnU"..@.61 */
0x69,0xA5,0xE1,0xD9,0x7F,0xF7,0xC6,0xCC,0x48,0x00,0x0E, /* i.......H.. */
0x90,0x16,0x00,0x0F,0xDE,0x6E,0x80,0x11,0x0C,0x9A,0x4F, /* .....n....O */
0x56,0xDB,0x88,0xD3,0xB2,0x1C,0x00,0xE0,0x2E,0x3E,0xAC, /* V........>. */
0xFF,0xF2,0x40,0xC0,0x1C,0xE5,0x19,0x13,0x31,0x4E,0xCD, /* ..@.....1N. */
0x9E,0xC3,0x06,0x71,0x03,0x85,0xE5,0xB5,0x6D,0x88,0x50, /* ...q....m.P */
0x8E,0x0E,0x17,0x3B,0x19,0xFB,0x4E,0x3B,0x99,0xEF,0x4C, /* ...;..N;..L */
0x9E,0xF7,0x7B,0x31,0x7C,0x3C,0x5F,0xFF,0xF4,0xF8,0xE3, /* ..{1|<_.... */
0x92,0x42,0x07,0x8E,0x83,0x8E,0x0F,0x05,0x08,0x91,0xA3, /* .B......... */
0x16,0xE2,0xDF,0xB7,0x62,0x60,0x48,0x31,0x3C,0xFF,0xD4, /* ....b`H1<.. */
0x9E,0x0C,0x68,0x00,0x77,0x54,0xE3,0x1E,0x05,0xC5,0xF8, /* ..h.wT..... */
0xEA,0x8D,0x82,0x9D,0x08,0xA9,0x06,0x8D,0x1E,0x5D,0x7C, /* .........]| */
0x7F,0x08,0xC0,0x50,0x45,0x42,0xD0,0x36,0xF8,0xB2,0x4D, /* ...PEB.6..M */
0x53,0x0C,0x80,0x3B,0x4D,0xFF,0xF2,0x42,0xC0,0x2F,0x3C, /* S..;M..B./< */
0x25,0x19,0x29,0xFE,0xBC,0x2E,0xC4,0xD0,0x99,0x4C,0x48, /* %.)......LH */
0xB0,0x9C,0x49,0xD2,0x1A,0x2D,0x02,0xC2,0x79,0x69,0x16, /* ..I..-..yi. */
0x92,0xA8,0xC5,0xAB,0x45,0x5A,0x68,0xE8,0x75,0x57,0xCD, /* ....EZh.uW. */
0xF1,0xB9,0xAA,0x13,0x88,0xE4,0x87,0x42,0x15,0xB3,0x58, /* .......B..X */
0xF5,0xA3,0x46,0xB1,0xCF,0xD3,0x59,0x7E,0xBA,0xB5,0xA7, /* ..F...Y~... */
0x6B,0x0B,0x17,0x57,0x6B,0x5C,0x4A,0xCD,0x53,0x76,0x2A, /* k..Wk\J.Sv* */
0x1D,0x28,0xC5,0x1C,0x76,0x5C,0xDD,0x0A,0x00,0x4B,0xC0, /* .(..v\...K. */
0x1B,0xCA,0xA8,0xE9,0x81,0x5B,0xA6,0xDC,0xA4,0x59,0x13, /* .....[...Y. */
0xFC,0xBA,0x8F,0x98,0x79,0x44,0x25,0xC9,0x35,0x38,0xCA, /* ....yD%.58. */
0xFF,0xF2,0x40,0xC0,0xB9,0x7D,0x1A,0x13,0x79,0x6A,0xC8, /* ..@..}..yj. */
0x3E,0xC4,0x46,0x94,0x8D,0x3C,0x67,0x85,0xB1,0xA8,0x89, /* >.F..<g.... */
0xC0,0xF2,0xE6,0x2F,0x9D,0x7C,0xC9,0xB4,0xBE,0xCF,0xE1, /* .../.|..... */
0x7D,0xFE,0x1F,0x03,0x00,0x12,0x84,0x72,0x8C,0xE7,0xD8, /* }......r... */
0x5E,0xC9,0xA9,0x01,0xBA,0x9B,0xC4,0x10,0x5C,0x70,0x2E, /* ^.......\p. */
0x6C,0x48,0xE7,0x8C,0x15,0x0B,0x06,0x01,0xE5,0xFF,0xFF, /* lH......... */
0xD4,0x0D,0x00,0x0F,0xCE,0x58,0x95,0x61,0xA8,0x9E,0x7B, /* .....X.a..{ */
0x19,0x98,0xB0,0xF0,0xC6,0x72,0x82,0xD5,0x27,0x06,0x47, /* .....r..'.G */
0x41,0x22,0x0F,0x65,0x93,0xC9,0x8A,0x09,0x19,0x48,0x1B, /* A".e.....H. */
0xBD,0xD6,0x64,0x1A,0xAC,0xFF,0xF2,0x42,0xC0,0xF1,0x11, /* ..d....B... */
0x25,0x14,0x22,0x06,0xBC,0x0E,0xD4,0x4E,0x99,0x90,0xA8, /* %."....N... */
0xD8,0xB7,0xAD,0x5D,0x3E,0xAF,0x6E,0xBE,0x66,0x83,0xA4, /* ...]>.n.f.. */
0xE3,0xC2,0xE0,0x29,0x43,0x87,0x5F,0x4F,0x27,0x9C,0x2C, /* ...)C._O'., */
0xD0,0x91,0xF3,0x87,0x9B,0x54,0xED,0xD1,0xB4,0xF3,0x39, /* .....T....9 */
0x87,0x22,0x06,0x86,0x0D,0x71,0xE4,0x6F,0x2A,0x08,0x04, /* ."...q.o*.. */
0xC0,0x03,0x2A,0xB1,0xE2,0x05,0x4D,0x64,0xA1,0x9C,0xA6, /* ..*...Md... */
0x0D,0x41,0xA6,0xF2,0x7A,0xC1,0x30,0xC3,0x38,0x26,0x09, /* .A..z.0.8&. */
0x50,0x08,0xC4,0xF6,0x30,0x0C,0xA6,0xA9,0x17,0x00,0x13, /* P...0...... */
0x0C,0xDC,0xC4,0x2F,0x28,0xEB,0x3F,0xCD,0x7A,0x3D,0x2F, /* .../(.?.z=/ */
0xFF,0xF2,0x40,0xC0,0x18,0x6F,0x2E,0x13,0xA1,0xF2,0xBC, /* ..@..o..... */
0x36,0xCB,0x4E,0x99,0x6E,0xFC,0xEE,0xC5,0xF0,0xA0,0xB7, /* 6.N.n...... */
0x92,0xD4,0xEE,0x79,0x7C,0x50,0x5D,0xE5,0x04,0x94,0xA9, /* ...y|P].... */
0x76,0xCF,0x6C,0x70,0xDD,0x0D,0xD4,0xEE,0xED,0x98,0xE8, /* v.lp....... */
0xC8,0x35,0x36,0x7A,0x0C,0x05,0x80,0x03,0xBC,0xBE,0x91, /* .56z....... */
0x00,0x7C,0xAE,0x65,0xB8,0x91,0xA3,0x33,0xBA,0x68,0x60, /* .|.e...3.h` */
0xD4,0x1A,0x66,0xF8,0x43,0xA0,0x20,0x89,0xE7,0x80,0xD8, /* ..f.C. .... */
0x1E,0x4F,0xA0,0x04,0x60,0x06,0x0A,0xA4,0x91,0x24,0xFA, /* .O..`....$. */
0x9F,0x57,0x53,0xF4,0x7A,0xDB,0x5F,0x56,0xE3,0x6E,0x0B, /* .WS.z._V.n. */
0x8B,0x3A,0x1C,0xF9,0x5E,0xFF,0xF2,0x42,0xC0,0xB1,0x00, /* .:..^..B... */
0x38,0x14,0x09,0xEE,0xB4,0x36,0xD3,0x4E,0x99,0xA4,0x78, /* 8....6.N..x */
0x94,0x73,0xC4,0x66,0x30,0xF5,0xEA,0xDB,0xBA,0x67,0x67, /* .s.f0....gg */
0x95,0x6B,0xAB,0x68,0x5D,0x08,0xA1,0x39,0x56,0xAB,0x1E, /* .k.h]..9V.. */
0xD5,0x03,0xE8,0x01,0x70,0x00,0xB3,0x93,0x33,0x19,0x8C, /* ....p...3.. */
0x61,0x8F,0xBB,0x5D,0x24,0x12,0x63,0xD3,0x4B,0x5D,0x91, /* a..]$.c.K]. */
0x08,0x43,0x22,0x56,0x1A,0xC5,0x10,0x21,0x84,0xA8,0xEA, /* .C"V...!... */
0x80,0xBF,0x16,0x8E,0x3D,0x46,0x18,0x9C,0x6E,0x9A,0x91, /* ....=F..n.. */
0xE6,0xC9,0x6F,0xD2,0x7D,0x27,0xD7,0xE9,0x6B,0xFF,0x0A, /* ..o.}'..k.. */
0x03,0x43,0x89,0xD5,0xBF,0x52,0x97,0x0A,0x25,0x95,0x0D, /* .C...R..%.. */
0xFF,0xF2,0x40,0xC0,0xF5,0xC3,0x41,0x13,0x81,0xEE,0xA8, /* ..@...A.... */
0x5E,0xD3,0x44,0x98,0xFC,0xCF,0x97,0xF9,0x58,0xB5,0x33, /* ^.D.....X.3 */
0xB1,0x85,0x47,0x86,0xD7,0x98,0x01,0x3B,0xA3,0x4F,0x7E, /* ..G....;.O~ */
0x04,0xA6,0xC3,0x39,0x21,0x70,0x27,0x62,0xB5,0x18,0x10, /* ...9!p'b... */
0x09,0x99,0x00,0x8B,0x7E,0xF2,0xBF,0x52,0x18,0x26,0x30, /* ....~..R.&0 */
0x1C,0xB0,0x01,0x49,0x30,0xE0,0xC3,0x11,0x46,0x05,0xCC, /* ...I0...F.. */
0x49,0x14,0x28,0xB2,0xED,0x4B,0x57,0x5A,0x2F,0xB7,0x46, /* I.(..KWZ/.F */
0x63,0x34,0xD2,0xDA,0x9F,0x56,0x32,0xB7,0xA2,0x25,0xFF, /* c4...V2..%. */
0x94,0x28,0x33,0x7F,0x3B,0xC4,0x50,0xEC,0xB1,0xE2,0x26, /* .(3.;.P...& */
0xA1,0xB7,0x07,0x7F,0xFB,0xFF,0xF2,0x42,0xC0,0x67,0x6A, /* .......B.gj */
0x4C,0x13,0xF9,0x6A,0x90,0x7E,0xDB,0x44,0x94,0x3F,0xFF, /* L..j.~.D.?. */
0x14,0xD6,0x2A,0xFF,0xFF,0xC1,0x34,0x8C,0x48,0x22,0x00, /* ..*...4.H". */
0x06,0x8F,0x21,0xFD,0x64,0x60,0x04,0x92,0x42,0xEA,0x74, /* ..!.d`..B.t */
0x32,0x37,0xAA,0x5A,0x9F,0x67,0x01,0x8B,0x3F,0x37,0x31, /* 27.Z.g..?71 */
0xDD,0x06,0x3C,0x01,0x34,0x30,0xE0,0x5C,0x78,0x78,0xCB, /* ..<.40.\xx. */
0xD6,0xF1,0x31,0x8A,0x69,0x61,0x93,0x92,0x42,0xCE,0x4B, /* ..1.ia..B.K */
0xC5,0x02,0x4E,0x73,0xC6,0x24,0x30,0xCD,0x08,0x66,0xC6, /* ..Ns.$0..f. */
0x35,0xAB,0xA2,0x3D,0x2F,0xB3,0xBD,0x34,0x87,0x13,0xEE, /* 5..=/..4... */
0x71,0x45,0x68,0xFA,0xEA,0x05,0x84,0x41,0x36,0x4C,0x9A, /* qEh....A6L. */
0xFF,0xF2,0x40,0xC0,0xC9,0x92,0x56,0x13,0xD0,0x6E,0x70, /* ..@...V..np */
0x54,0xD3,0xCC,0x28,0x06,0xD7,0x0E,0xA4,0x1D,0x9C,0x9D, /* T..(....... */
0xD9,0xA9,0x88,0x7B,0xB5,0xA3,0x56,0xB7,0x4B,0x4B,0x5A, /* ...{..V.KKZ */
0x9B,0x2C,0xA9,0xAD,0x6F,0x99,0x6C,0xC0,0x4C,0x14,0x14, /* .,..o.l.L.. */
0xEF,0xB4,0x20,0x91,0x5F,0xBC,0x81,0x41,0x41,0x5D,0xD4, /* .. ._..AA]. */
0x20,0xBD,0x05,0x1A,0x6F,0xE2,0x68,0x56,0x41,0x41,0x57, /* ...o.hVAAW */
0xF9,0xBF,0x89,0x82,0x8E,0xC7,0x8F,0x0A,0x0A,0x09,0x37, /* ..........7 */
0xF1,0x05,0x0A,0x0A,0x0A,0x0A,0x09,0x05,0x37,0xFF,0x10, /* ........7.. */
0x50,0x50,0x53,0x65,0xFF,0xFF,0xFD,0x75,0xDF,0xFF,0xFF, /* PPSe...u... */
0x68,0x4F,0xFF,0x84,0x70,0xFF,0xF2,0x42,0xC0,0x27,0x50, /* hO..p..B.'P */
0x5F,0x17,0xE8,0x82,0x3C,0x11,0x58,0x18,0x01,0x55,0x48, /* _...<.X..UH */
0xBC,0x52,0xFC,0x4A,0x4C,0x3C,0xD5,0xF6,0x11,0x2D,0xBF, /* .R.JL<...-. */
0xEA,0x03,0x5C,0x57,0x29,0xBF,0xC3,0x75,0x1C,0xE6,0xDD, /* ..\W)..u... */
0xBF,0xED,0xEF,0xD0,0x98,0x77,0x71,0x95,0x73,0xFF,0xED, /* .....wq.s.. */
0x54,0xBE,0xD5,0xEE,0xAE,0xC2,0xD5,0x0B,0xFF,0xF1,0x97, /* T.......... */
0x8A,0xE4,0x42,0x09,0x99,0xB1,0xEA,0x94,0xDC,0x78,0xB5, /* ..B......x. */
0x34,0x0F,0xF1,0x8F,0xFC,0x15,0xF6,0xFA,0xB1,0x47,0xA9, /* 4........G. */
0x6C,0x67,0x43,0x8B,0xF2,0x76,0x22,0xED,0xDA,0x85,0xBA, /* lgC..v".... */
0x2F,0xC7,0xF9,0xCF,0xFC,0xDB,0x46,0x2E,0x50,0x0A,0x84, /* /.....F.P.. */
0xFF,0xF2,0x40,0xC0,0xC6,0x4A,0x59,0x28,0x2B,0x19,0xE0, /* ..@..JY(+.. */
0x01,0x89,0x78,0x00,0x52,0x85,0x3C,0x8E,0x54,0x9A,0x48, /* ..x.R.<.T.H */
0x5A,0x72,0x32,0x94,0xBF,0x43,0x4F,0x24,0x53,0x4B,0xEC, /* Zr2..CO$SK. */
0x4B,0x99,0x0E,0x66,0x1F,0xFF,0xCE,0x7F,0xFF,0x3F,0x10, /* K..f.....?. */
0xAE,0x82,0x62,0x71,0x34,0x18,0x59,0x9B,0x51,0xC7,0x59, /* ..bq4.Y.Q.Y */
0xCE,0xEE,0xA5,0xFE,0x02,0xBB,0x30,0x91,0x49,0xD5,0x4B, /* ......0.I.K */
0xF3,0xDC,0x9A,0xA9,0x57,0x8E,0x72,0x10,0xC0,0x5D,0x60, /* ....W.r..]` */
0x67,0xFC,0x7D,0xD6,0xBA,0xDD,0xB3,0x8B,0x5A,0x0A,0x4C, /* g.}.....Z.L */
0x41,0x4D,0x45,0x33,0x2E,0x39,0x33,0xAA,0xAA,0xAA,0xAA, /* AME3.93.... */
0xAA,0xAA,0xAA,0xAA,0xAA,0x54,0x41,0x47,0x48,0x65,0x6C, /* .....TAGHel */
0x6C,0x6F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /* lo */
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /* */
0x20,0x20,0x20,0x20,0x20,0x50,0x61,0x6E,0x75,0x2D,0x4B, /* Panu-K */
0x72,0x69,0x73,0x74,0x69,0x61,0x6E,0x20,0x50,0x6F,0x69, /* ristian Poi */
0x6B,0x73,0x61,0x6C,0x6F,0x20,0x20,0x20,0x20,0x20,0x20, /* ksalo */
0x20,0x20,0x56,0x53,0x44,0x53,0x50,0x20,0x54,0x65,0x73, /* VSDSP Tes */
0x74,0x69,0x6E,0x67,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /* ting */
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /* */
0x20,0x20,0x20,0x4D,0x50,0x33,0x20,0x48,0x65,0x6C,0x6C, /* MP3 Hell */
0x6F,0x2C,0x20,0x57,0x6F,0x72,0x6C,0x64,0x21,0x20,0x20, /* o, World! */
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, /* */
0x00, /* . */
};
// Number of radio stations 28-11-2021
const int nbrStations = 14;
// Radio Stations - main URL
char *host[nbrStations] = {"icecast.omroep.nl",
"icecast.omroep.nl",
"icecast.omroep.nl",
"icecast.omroep.nl",
"icecast.omroep.nl",
"21233.live.streamtheworld.com",
"22553.live.streamtheworld.com",
"icecast-qmusicnl-cdp.triple-it.nl",
"22593.live.streamtheworld.com",
"20873.live.streamtheworld.com",
"25683.live.streamtheworld.com",
"22593.live.streamtheworld.com",
"rva.ice.infomaniak.ch",
"stream.gal.io"};
// Radio Stations - part following main URL
char *path[nbrStations] = {"/radio1-bb-mp3",
"/radio2-bb-mp3",
"/3fm-bb-mp3",
"/radio4-bb-mp3",
"/radio5-bb-mp3",
"/100PNL_MP3_SC?",
"/RADIO538.mp3",
"/Qmusic_nl_live_96.mp3",
"/RADIO10.mp3",
"/VERONICA.mp3",
"/SKYRADIO.mp3",
"/SLAM_MP3_SC",
"/rva-high.mp3",
"/arrow"};
// Radio Stations - port number
int port[nbrStations] = {80,80,80,80,80,80,80,80,80,80,80,80,80,80};
// Radio Stations - info shown on display
char *sname[nbrStations] = {"Radio 1",
"Radio 2",
"Radio 3",
"Radio 4",
"Radio 5",
"100% NL",
"RADIO 538",
"QMusic",
"Radio 10",
"Veronica",
"Sky Radio",
"Slam",
"RVA",
"Arrow Classic Rock"};
Comments