├── .gitignore ├── README.md ├── SqueezeESP32.ino ├── config.h.example ├── flac_plugin.h ├── slimproto.cpp ├── slimproto.h ├── stRingBuffer.cpp └── stRingBuffer.h /.gitignore: -------------------------------------------------------------------------------- 1 | config.h 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SqueezeEsp32 2 | Squeezebox player for ESP32 board and ESP8266 3 | 4 | Use a vs1053 module or I2S DAC as audio output. 5 | 6 | * With the vs1053 module audio decoding is perform by the module. 7 | * With the I2S DAC the player use the library available here : https://github.com/earlephilhower/ESP8266Audio 8 | 9 | The configuration is define in the file config.h via some #define 10 | 11 | #define VS1053_MODULE = VS_1053 12 | #define I2S_DAC_MODULE = I2S DAC 13 | 14 | 15 | I have try two differents library for the module VS_1053. Set #define ADAFRUIT_VS1053 to switch to the second library. I had some issues with the library so i decide to stay away from but you can do some tests by your side. 16 | 17 | Wifi configuration is done via a AP started on the first boot. It use the library https://github.com/bbx10/WiFiManager 18 | 19 | Once connected to the network, the player send multicast packet to discovery LMS. 20 | 21 | 22 | -------------------------------------------------------------------------------- /SqueezeESP32.ino: -------------------------------------------------------------------------------- 1 | #include 2 | #include "config.h" 3 | 4 | #ifdef ESP32 5 | #include 6 | #else 7 | #include 8 | #endif 9 | 10 | #include 11 | 12 | 13 | #ifdef VS1053_MODULE 14 | #include "flac_plugin.h" 15 | 16 | /* 17 | DIN = 22 18 | BCK = 25 19 | LCK = 26 20 | 21 | 22 | */ 23 | 24 | 25 | #undef I2S_DAC_MODULE 26 | #ifdef ESP32 27 | #define VS1053_CS 5 // D1 // 5 28 | #define VS1053_DCS 16 // D0 // 16 29 | #define VS1053_DREQ 4 // D3 // 4 30 | #else 31 | // ESP8266 32 | #define VS1053_CS D1 // 5 33 | #define VS1053_DCS D0 // 16 34 | #define VS1053_DREQ D3 // 4 35 | #endif 36 | #ifdef ADAFRUIT_VS1053 37 | #include 38 | #else 39 | #include 40 | #endif 41 | #endif 42 | 43 | #ifdef I2S_DAC_MODULE 44 | #include "AudioFileSourceICYStream.h" 45 | #include "AudioFileSourceBuffer.h" 46 | #include "AudioGeneratorMP3.h" 47 | #include "AudioOutputI2SNoDAC.h" 48 | #endif 49 | 50 | #include "slimproto.h" 51 | 52 | 53 | #ifdef VS1053_MODULE 54 | #ifdef ADAFRUIT_VS1053 55 | Adafruit_VS1053 viplayer(-1, VS1053_CS, VS1053_DCS, VS1053_DREQ); 56 | #else 57 | VS1053 viplayer(VS1053_CS, VS1053_DCS, VS1053_DREQ); 58 | #endif 59 | #endif 60 | 61 | 62 | 63 | #include //Local DNS Server used for redirecting all requests to the configuration portal 64 | #ifdef ESP32 65 | #include 66 | #else 67 | #include //Local WebServer used to serve the configuration portal 68 | #endif 69 | 70 | 71 | #include //https://github.com/tzapu/WiFiManager WiFi Configuration Magic 72 | 73 | slimproto * vislimCli = 0; 74 | WiFiClient client; 75 | int viCnxAttempt = -1; 76 | 77 | WiFiUDP udp; 78 | 79 | #ifdef VS1053_MODULE 80 | void LoadPlugin(const uint16_t* plugin, uint16_t plugin_size) 81 | { 82 | int i = 0; 83 | while (i 0) 201 | { 202 | char upd_packet; 203 | upd_packet = udp.read(); 204 | 205 | if(upd_packet == 'E') 206 | { 207 | LMS_addr = udp.remoteIP(); 208 | Serial.print("Found LMS server @ "); 209 | Serial.println(LMS_addr); 210 | //udp.stop(); 211 | break; // LMS found we can go to the next step 212 | } 213 | } 214 | else 215 | delay(2000); 216 | } 217 | } 218 | 219 | if(LMS_addr[0] != 0) 220 | { 221 | Serial.print("Connecting to server @"); 222 | Serial.print(LMS_addr); 223 | Serial.println("..."); 224 | 225 | // DEBUG server 3484 226 | // Real server 3483 227 | 228 | viCnxAttempt++; 229 | 230 | if (!client.connect(LMS_addr, 3483)) { 231 | Serial.println("connection failed, pause and try connect..."); 232 | 233 | viCnxAttempt++; 234 | if(viCnxAttempt > 30) 235 | viCnxAttempt = -1; // Will erase LMS addr in the next attempt 236 | 237 | delay(2000); 238 | return; 239 | } 240 | 241 | 242 | viCnxAttempt = 0; 243 | 244 | if(vislimCli) delete vislimCli,vislimCli = 0; 245 | 246 | #ifdef VS1053_MODULE 247 | vislimCli = new slimproto(LMS_addr.toString(), & client, &viplayer); 248 | #else 249 | vislimCli = new slimproto(LMS_addr.toString(), & client); 250 | #endif 251 | 252 | Serial.println("Connection Ok, send hello to LMS"); 253 | reponseHelo * HeloRsp = new reponseHelo(&client); 254 | HeloRsp->sendResponse(); 255 | 256 | while(client.connected()) 257 | { 258 | if(!vislimCli->HandleMessages()) 259 | break; 260 | vislimCli->HandleAudio(); 261 | } 262 | } 263 | else 264 | { 265 | Serial.println("No LMS server found, try again in 10 seconds"); 266 | delay(10000); 267 | } 268 | } 269 | -------------------------------------------------------------------------------- /config.h.example: -------------------------------------------------------------------------------- 1 | #ifndef config_h 2 | #define config_h 3 | 4 | #include 5 | #include 6 | 7 | 8 | #define VS1053_MODULE 9 | //#define ADAFRUIT_VS1053 10 | 11 | //#define I2S_DAC_MODULE 12 | 13 | #define DEFAULT_LMS_ADDR "192.168.42.123" 14 | 15 | #define UDP_PORT 3483 16 | 17 | static IPAddress LMS_addr(0,0,0,0); 18 | 19 | #endif 20 | -------------------------------------------------------------------------------- /flac_plugin.h: -------------------------------------------------------------------------------- 1 | #ifndef SKIP_PLUGIN_VARNAME 2 | const unsigned short plugin[] = { /* Compressed plugin */ 3 | #endif 4 | 0x0007,0x0001, /*copy 1*/ 5 | 0x8050, 6 | 0x0006,0x001e, /*copy 30*/ 7 | 0x2a00,0xc000,0x3e12,0xb817,0x3e14,0xf812,0x3e01,0xb811, 8 | 0x0007,0x9717,0x0020,0xffd2,0x0030,0x11d1,0x3111,0x8024, 9 | 0x3704,0xc024,0x3b81,0x8024,0x3101,0x8024,0x3b81,0x8024, 10 | 0x3f04,0xc024,0x2808,0x4800,0x36f1,0x9811, 11 | 0x0007,0x0001, /*copy 1*/ 12 | 0x8060, 13 | 0x0006,0x053e, /*copy 1342*/ 14 | 0xf400,0x4095,0x0000,0x02c2,0x6124,0x0024,0x0000,0x0024, 15 | 0x2800,0x1ac5,0x4192,0x4542,0x0000,0x0041,0x2000,0x0015, 16 | 0x0030,0x0317,0x2000,0x0000,0x3f00,0x4024,0x2000,0x0000, 17 | 0x0000,0x0000,0x3e12,0x3800,0x3e00,0xb804,0x0030,0x0015, 18 | 0x0007,0x8257,0x3700,0x984c,0xf224,0x1444,0xf224,0x0024, 19 | 0x0008,0x0002,0x2910,0x0181,0x0000,0x1bc8,0xb428,0x1402, 20 | 0x0000,0x8004,0x2910,0x0195,0x0000,0x1bc8,0xb428,0x0024, 21 | 0x0006,0x0095,0x2800,0x2945,0x3e13,0x780e,0x3e11,0x7803, 22 | 0x3e13,0xf806,0x3e11,0xf801,0x3510,0xb808,0x003f,0xe004, 23 | 0xfec4,0x3800,0x48be,0x17c3,0xfec6,0x41c2,0x48be,0x4497, 24 | 0x4090,0x1c46,0xf06c,0x0024,0x2400,0x2580,0x6090,0x41c3, 25 | 0x6628,0x1c47,0x0000,0x0024,0x2800,0x2449,0xf07e,0x0024, 26 | 0xf400,0x4182,0x673a,0x1c46,0x0000,0x0024,0x2800,0x2589, 27 | 0xf06c,0x0024,0xf400,0x41c3,0x0000,0x0024,0x4224,0x3442, 28 | 0x2903,0xbf80,0x4336,0x37c3,0x0000,0x1805,0x2903,0xbf80, 29 | 0x4508,0x40c2,0x450a,0x9808,0x0000,0x0207,0xa478,0x1bc0, 30 | 0xc45a,0x1807,0x0030,0x03d5,0x3d01,0x5bc1,0x36f3,0xd806, 31 | 0x3601,0x5803,0x36f3,0x0024,0x36f3,0x580e,0x0007,0x8257, 32 | 0x0000,0x6004,0x3730,0x8024,0xb244,0x1c04,0xd428,0x3c02, 33 | 0x0006,0xc717,0x2800,0x2d05,0x4284,0x0024,0x3613,0x3c02, 34 | 0x0006,0xc357,0x2901,0x6ac0,0x3e11,0x5c05,0x4284,0x1bc5, 35 | 0x0000,0x0024,0x2800,0x2fc5,0x0000,0x0024,0x3613,0x0024, 36 | 0x3e10,0x3813,0x3e14,0x8024,0x3e04,0x8024,0x2900,0x4880, 37 | 0x0006,0x02d3,0x36e3,0x0024,0x3009,0x1bd3,0x0007,0x8257, 38 | 0x3700,0x8024,0xf224,0x0024,0x0000,0x0024,0x2800,0x31d1, 39 | 0x3600,0x9844,0x2900,0x3780,0x0000,0x3248,0x2911,0xf140, 40 | 0x0000,0x0024,0x0030,0x0057,0x3700,0x0024,0xf200,0x4595, 41 | 0x0fff,0xfe02,0xa024,0x164c,0x8000,0x17cc,0x3f00,0x0024, 42 | 0x3500,0x0024,0x0021,0x6d82,0xd024,0x44c0,0x0006,0xa402, 43 | 0x2800,0x3695,0xd024,0x0024,0x0000,0x0000,0x2800,0x3695, 44 | 0x000b,0x6d57,0x3009,0x3c00,0x36f0,0x8024,0x36f2,0x1800, 45 | 0x2000,0x0000,0x0000,0x0024,0x3e14,0x7810,0x3e13,0xb80d, 46 | 0x3e13,0xf80a,0x3e10,0xb803,0x3e11,0x3805,0x3e11,0xb807, 47 | 0x3e14,0xf801,0x3e15,0x3815,0x0001,0x000a,0x0006,0xc4d7, 48 | 0xbf8e,0x9c42,0x3e01,0x9c03,0x0006,0xa017,0x0023,0xffd1, 49 | 0x0007,0x8250,0x0fff,0xfd85,0x3001,0x0024,0xa45a,0x4494, 50 | 0x0000,0x0093,0x2800,0x3dd1,0xf25a,0x104c,0x34f3,0x0024, 51 | 0x2800,0x3dd1,0x0000,0x0024,0x3413,0x084c,0x0000,0x0095, 52 | 0x3281,0xf806,0x4091,0x4d64,0x2400,0x4000,0x4efa,0x9c10, 53 | 0xf1eb,0x6061,0xfe55,0x2f66,0x5653,0x4d64,0x48b2,0xa201, 54 | 0x4efa,0xa201,0x36f3,0x3c10,0x36f5,0x1815,0x36f4,0xd801, 55 | 0x36f1,0x9807,0x36f1,0x1805,0x36f0,0x9803,0x36f3,0xd80a, 56 | 0x36f3,0x980d,0x2000,0x0000,0x36f4,0x5810,0x36f3,0x0024, 57 | 0x3009,0x3848,0x3e14,0x3811,0x3e00,0x0024,0x0000,0x4000, 58 | 0x0001,0x0010,0x2915,0x94c0,0x0001,0xcc11,0x36f0,0x0024, 59 | 0x2927,0x9e40,0x3604,0x1811,0x3613,0x0024,0x3e14,0x3811, 60 | 0x3e00,0x0024,0x0000,0x4000,0x0001,0x0010,0x2915,0x94c0, 61 | 0x0001,0xcc11,0x36f0,0x0024,0x36f4,0x1811,0x3009,0x1808, 62 | 0x2000,0x0000,0x0000,0x190d,0x3613,0x0024,0x3e22,0xb815, 63 | 0x3e05,0xb814,0x3615,0x0024,0x0000,0x800a,0x3e13,0x7801, 64 | 0x3e10,0xb803,0x3e11,0x3805,0x3e11,0xb807,0x3e14,0x3811, 65 | 0x3e14,0xb813,0x3e03,0xf80e,0xb488,0x44d5,0x3543,0x134c, 66 | 0x34e5,0xc024,0x3524,0x8024,0x35a4,0xc024,0x3710,0x8a0c, 67 | 0x3540,0x4a0c,0x3d44,0x8024,0x3a10,0x8024,0x3590,0x0024, 68 | 0x4010,0x15c1,0x6010,0x3400,0x3710,0x8024,0x2800,0x5444, 69 | 0x3af0,0x8024,0x3df0,0x0024,0x3591,0x4024,0x3530,0x4024, 70 | 0x4192,0x4050,0x6100,0x1482,0x4020,0x1753,0xbf8e,0x1582, 71 | 0x4294,0x4011,0xbd86,0x408e,0x2400,0x524e,0xfe6d,0x2819, 72 | 0x520e,0x0a00,0x5207,0x2819,0x4fbe,0x0024,0xad56,0x904c, 73 | 0xaf5e,0x1010,0xf7d4,0x0024,0xf7fc,0x2042,0x6498,0x2046, 74 | 0x3cf4,0x0024,0x3400,0x170c,0x4090,0x1492,0x35a4,0xc024, 75 | 0x2800,0x4cd5,0x3c00,0x0024,0x4480,0x914c,0x36f3,0xd80e, 76 | 0x36f4,0x9813,0x36f4,0x1811,0x36f1,0x9807,0x36f1,0x1805, 77 | 0x36f0,0x9803,0x36f3,0x5801,0x3405,0x9014,0x36e3,0x0024, 78 | 0x2000,0x0000,0x36f2,0x9815,0x2814,0x9c91,0x0000,0x004d, 79 | 0x2814,0x9940,0x003f,0x0013,0x3e12,0xb817,0x3e12,0x3815, 80 | 0x3e05,0xb814,0x3625,0x0024,0x0000,0x800a,0x3e10,0x3801, 81 | 0x3e10,0xb803,0x3e11,0x3805,0x3e11,0xb807,0x3e14,0x3811, 82 | 0x0006,0xa090,0x2912,0x0d00,0x3e14,0xc024,0x4088,0x8000, 83 | 0x4080,0x0024,0x0007,0x90d1,0x2800,0x5f45,0x0000,0x0024, 84 | 0x0007,0x9051,0x3100,0x4024,0x4100,0x0024,0x3900,0x0024, 85 | 0x0007,0x90d1,0x0004,0x0000,0x31f0,0x4024,0x6014,0x0400, 86 | 0x0000,0x0024,0x2800,0x6391,0x4080,0x0024,0x0000,0x0000, 87 | 0x2800,0x6305,0x0000,0x0024,0x0007,0x9053,0x3300,0x0024, 88 | 0x4080,0x0024,0x0000,0x0000,0x2800,0x6398,0x0000,0x0024, 89 | 0x0007,0x9051,0x3900,0x0024,0x3200,0x504c,0x6410,0x0024, 90 | 0x3cf0,0x0000,0x4080,0x0024,0x0006,0xc691,0x2800,0x7c45, 91 | 0x3009,0x0400,0x0007,0x9051,0x0000,0x1001,0x3100,0x0024, 92 | 0x6012,0x0024,0x0006,0xc6d0,0x2800,0x7089,0x003f,0xe000, 93 | 0x0006,0xc693,0x3900,0x0c00,0x3009,0x0001,0x6014,0x0024, 94 | 0x0007,0x1ad0,0x2800,0x7095,0x3009,0x0000,0x4080,0x0024, 95 | 0x0000,0x0301,0x2800,0x6a85,0x4090,0x0024,0x0000,0x0024, 96 | 0x2800,0x6b95,0x0000,0x0024,0x3009,0x0000,0xc012,0x0024, 97 | 0x2800,0x7080,0x3009,0x2001,0x3009,0x0000,0x6012,0x0024, 98 | 0x0000,0x0341,0x2800,0x6d95,0x0000,0x0024,0x6190,0x0024, 99 | 0x2800,0x7080,0x3009,0x2000,0x6012,0x0024,0x0000,0x0381, 100 | 0x2800,0x6f55,0x0000,0x0024,0x6190,0x0024,0x2800,0x7080, 101 | 0x3009,0x2000,0x6012,0x0024,0x0000,0x00c0,0x2800,0x7095, 102 | 0x0000,0x0024,0x3009,0x2000,0x0006,0xa090,0x3009,0x0000, 103 | 0x4080,0x0024,0x0000,0x0081,0x2800,0x7555,0x0007,0x8c13, 104 | 0x3300,0x104c,0xb010,0x0024,0x0002,0x8001,0x2800,0x77c5, 105 | 0x34f0,0x0024,0x2800,0x7540,0x0000,0x0024,0x0006,0xc351, 106 | 0x3009,0x0000,0x6090,0x0024,0x3009,0x2000,0x2900,0x0b80, 107 | 0x3009,0x0405,0x0006,0xc690,0x0006,0xc6d1,0x3009,0x0000, 108 | 0x3009,0x0401,0x6014,0x0024,0x0006,0xa093,0x2800,0x73d1, 109 | 0xb880,0x0024,0x2800,0x8500,0x3009,0x2c00,0x4040,0x0024, 110 | 0x6012,0x0024,0x0006,0xc6d0,0x2800,0x8518,0x0000,0x0024, 111 | 0x0006,0xc693,0x3009,0x0c00,0x3009,0x0001,0x6014,0x0024, 112 | 0x0006,0xc350,0x2800,0x8501,0x0000,0x0024,0x6090,0x0024, 113 | 0x3009,0x2c00,0x3009,0x0005,0x2900,0x0b80,0x0000,0x8508, 114 | 0x3009,0x0400,0x4080,0x0024,0x0003,0x8000,0x2800,0x8505, 115 | 0x0000,0x0024,0x6400,0x0024,0x0000,0x0081,0x2800,0x8509, 116 | 0x0000,0x0024,0x0007,0x8c13,0x3300,0x0024,0xb010,0x0024, 117 | 0x0006,0xc650,0x2800,0x8515,0x0000,0x0024,0x0001,0x0002, 118 | 0x3413,0x0000,0x3009,0x0401,0x4010,0x8406,0x0000,0x0281, 119 | 0xa010,0x13c1,0x4122,0x0024,0x0000,0x03c2,0x6122,0x8002, 120 | 0x462c,0x0024,0x469c,0x0024,0xfee2,0x0024,0x48be,0x0024, 121 | 0x6066,0x8400,0x0006,0xc350,0x2800,0x8501,0x0000,0x0024, 122 | 0x4090,0x0024,0x3009,0x2400,0x2900,0x0b80,0x3009,0x0005, 123 | 0x0007,0x1b50,0x2912,0x0d00,0x3613,0x0024,0x3a00,0x0380, 124 | 0x4080,0x0024,0x0000,0x00c1,0x2800,0x8dc5,0x3009,0x0000, 125 | 0xb010,0x008c,0x4192,0x0024,0x6012,0x0024,0x0006,0xf051, 126 | 0x2800,0x8bd8,0x3009,0x0400,0x0007,0x1fd1,0x30e3,0x0400, 127 | 0x4080,0x0024,0x0000,0x0301,0x2800,0x8dc5,0x3009,0x0000, 128 | 0xb010,0x0024,0x0000,0x0101,0x6012,0x0024,0x0006,0xf051, 129 | 0x2800,0x8dd5,0x0000,0x0024,0x3023,0x0400,0xf200,0x184c, 130 | 0xb880,0xa400,0x3009,0x2000,0x3009,0x0441,0x3e10,0x4402, 131 | 0x2909,0xa9c0,0x3e10,0x8024,0x36e3,0x0024,0x36f4,0xc024, 132 | 0x36f4,0x1811,0x36f1,0x9807,0x36f1,0x1805,0x36f0,0x9803, 133 | 0x36f0,0x1801,0x3405,0x9014,0x36f3,0x0024,0x36f2,0x1815, 134 | 0x2000,0x0000,0x36f2,0x9817,0x3613,0x0024,0x3e12,0xb817, 135 | 0x3e12,0x3815,0x3e05,0xb814,0x3615,0x0024,0x0000,0x800a, 136 | 0x3e10,0xb803,0x0012,0x5103,0x3e11,0x3805,0x3e11,0xb807, 137 | 0x3e14,0x380d,0x0030,0x0250,0x3e13,0xf80e,0xbe8b,0x83e0, 138 | 0x290c,0x4840,0x3613,0x0024,0x290c,0x4840,0x4086,0x984c, 139 | 0x0000,0x00ce,0x2400,0x97ce,0x3009,0x1bc0,0x0000,0x01c3, 140 | 0xae3a,0x184c,0x0000,0x0043,0x3009,0x3842,0x290c,0x4840, 141 | 0x3009,0x3840,0x4084,0x9bc0,0xfe26,0x9bc2,0xceba,0x0024, 142 | 0x4e8e,0x0024,0x4e9a,0x0024,0x4f8e,0x0024,0x0000,0x0102, 143 | 0x2800,0x9d05,0x0030,0x0010,0x0000,0x0206,0x3613,0x0024, 144 | 0x290c,0x4840,0x3009,0x3840,0x3000,0xdbc0,0xb366,0x0024, 145 | 0x0000,0x0024,0x2800,0x9d15,0x4e8e,0x0024,0x4e9a,0x0024, 146 | 0x4f8e,0x0024,0x0030,0x0010,0x2800,0x99d5,0x0000,0x0206, 147 | 0x36f3,0xd80e,0x36f4,0x180d,0x36f1,0x9807,0x36f1,0x1805, 148 | 0x36f0,0x9803,0x3405,0x9014,0x36f3,0x0024,0x36f2,0x1815, 149 | 0x2000,0x0000,0x36f2,0x9817,0x3613,0x0024,0x3e12,0xb817, 150 | 0x3e12,0x3815,0x3e05,0xb814,0x3635,0x0024,0x0000,0x800a, 151 | 0x3e10,0x7802,0x3e14,0x0024,0x2903,0x5740,0x0000,0x0201, 152 | 0x0000,0x0601,0x3413,0x184c,0x2903,0x5e80,0x3cf0,0x0024, 153 | 0x3413,0x184c,0x3400,0x3040,0x3009,0x33c1,0x0000,0x1fc1, 154 | 0xb010,0x0024,0x6014,0x9040,0x0006,0x8010,0x2800,0xa655, 155 | 0x0000,0x0024,0x34e3,0x1bcc,0x6890,0x0024,0x2800,0xa800, 156 | 0xb880,0x2000,0x3e10,0x1381,0x2903,0x9e80,0x3e00,0x4024, 157 | 0x003f,0xfe41,0x36e3,0x104c,0x34f0,0x0024,0xa010,0x0024, 158 | 0x36f4,0x0024,0x36f0,0x5802,0x3405,0x9014,0x36f3,0x0024, 159 | 0x36f2,0x1815,0x2000,0x0000,0x36f2,0x9817,0x3613,0x0024, 160 | 0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814,0x3615,0x0024, 161 | 0x0000,0x800a,0x3e10,0xb804,0x3e01,0x534c,0xbe8a,0x10c0, 162 | 0x4080,0x0024,0x0000,0x0024,0x2800,0xb145,0x0000,0x0024, 163 | 0x2903,0x5e80,0x4082,0x184c,0x4c8a,0x134c,0x0000,0x0001, 164 | 0x6890,0x10c2,0x4294,0x0024,0xac22,0x0024,0xbec2,0x0024, 165 | 0x0000,0x0024,0x2800,0xb145,0x0000,0x0024,0x6890,0x134c, 166 | 0xb882,0x10c2,0xac22,0x0024,0x4c92,0x0024,0xdc92,0x0024, 167 | 0xceca,0x0024,0x4e82,0x1bc5,0x36f0,0x9804,0x3405,0x9014, 168 | 0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000,0x36f2,0x9817, 169 | 0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814, 170 | 0x3615,0x0024,0x0000,0x800a,0x3e10,0x3801,0x3e10,0xb804, 171 | 0x3e11,0xb807,0x3e14,0x3811,0x3e04,0x934c,0x3430,0x0024, 172 | 0x4080,0x0024,0x0000,0x0206,0x2800,0xb985,0x0006,0x8151, 173 | 0x3101,0x130c,0xff0c,0x1102,0x6408,0x0024,0x4204,0x0024, 174 | 0xb882,0x4092,0x1005,0xfe02,0x48be,0x0024,0x4264,0x0024, 175 | 0x2903,0xab00,0xf400,0x4090,0x36f4,0x8024,0x36f4,0x1811, 176 | 0x36f1,0x9807,0x36f0,0x9804,0x36f0,0x1801,0x3405,0x9014, 177 | 0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000,0x36f2,0x9817, 178 | 0x0003,0x6d57,0x3613,0x0024,0x3e00,0x3801,0xf400,0x55c0, 179 | 0x0000,0x0897,0xf400,0x57c0,0x0000,0x0024,0x2000,0x0000, 180 | 0x36f0,0x1801,0x2a08,0x1b8e,0x2800,0xbc40,0x0000,0xbe57, 181 | 0x0006,0xd397,0x2000,0x0000,0x3f00,0x0024, 182 | 0x0007,0x0001, /*copy 1*/ 183 | 0x8300, 184 | 0x0006,0x184c, /*copy 6220*/ 185 | 0x0030,0x0055,0xb080,0x1402,0x0fdf,0xffc1,0x0007,0x9257, 186 | 0xb212,0x3c00,0x3d00,0x4024,0x0006,0x0097,0x3f10,0x0024, 187 | 0x3f00,0x0024,0x0030,0x0297,0x3f00,0x0024,0x0007,0x9017, 188 | 0x3f00,0x0024,0x0007,0x81d7,0x3f10,0x0024,0xc090,0x3c00, 189 | 0x0006,0x0297,0xb080,0x3c00,0x0000,0x0401,0x000a,0x1055, 190 | 0x0006,0x0017,0x3f10,0x3401,0x000a,0x2795,0x3f00,0x3401, 191 | 0x0001,0x6a97,0xf400,0x55c0,0x0000,0x0817,0xb080,0x57c0, 192 | 0x0014,0x958f,0x0000,0x588e,0x0030,0x0017,0x3700,0x0024, 193 | 0x0004,0x0001,0xb012,0x0024,0x0000,0x004d,0x280f,0xe115, 194 | 0x0006,0x2016,0x0006,0x01d7,0x3f00,0x0024,0x0000,0x190d, 195 | 0x000f,0xf94f,0x0000,0xcd0e,0x280f,0xe100,0x0006,0x2016, 196 | 0x0000,0x0080,0x0005,0x4f92,0x2909,0xf840,0x3613,0x2800, 197 | 0x0006,0x0197,0x0006,0xa115,0xb080,0x0024,0x3f00,0x3400, 198 | 0x0007,0x8a57,0x3700,0x0024,0x4080,0x0024,0x0000,0x0040, 199 | 0x2800,0xced5,0x0006,0xa2d7,0x3009,0x3c00,0x0006,0xa157, 200 | 0x3009,0x1c00,0x0006,0x01d7,0x0000,0x190d,0x000a,0x708f, 201 | 0x0000,0xd7ce,0x290b,0x1a80,0x3f00,0x184c,0x0030,0x0017, 202 | 0x4080,0x1c01,0x0000,0x0200,0x2800,0xcb15,0xb102,0x0024, 203 | 0x0000,0xcd08,0x2800,0xcb15,0x0000,0xd3ce,0x0011,0x210f, 204 | 0x0000,0x190d,0x280f,0xcb00,0x3613,0x0024,0x0006,0xa115, 205 | 0x0006,0x01d7,0x37f0,0x1401,0x6100,0x1c01,0x4012,0x0024, 206 | 0x0000,0x8000,0x6010,0x0024,0x34f3,0x0400,0x2800,0xd698, 207 | 0x0000,0x0024,0x0000,0x8001,0x6010,0x3c01,0x0000,0x000d, 208 | 0x2811,0x8259,0x0000,0x0024,0x2a11,0x2100,0x0030,0x0257, 209 | 0x3700,0x0024,0x4080,0x0024,0x0000,0x0024,0x2800,0xd9d5, 210 | 0x0006,0x0197,0x0006,0xa115,0x3f00,0x3400,0x003f,0xc000, 211 | 0xb600,0x41c1,0x0012,0x5103,0x000c,0xc002,0xdcd6,0x0024, 212 | 0x0019,0xd4c2,0x2800,0x9085,0x0001,0x1188,0x0013,0xd9c3, 213 | 0x6fd6,0x0024,0x0000,0x190d,0x2800,0xdf95,0x0014,0x1b01, 214 | 0x0020,0x480f,0x0000,0xde4e,0x0000,0x190d,0x2820,0x41c0, 215 | 0x0001,0x1188,0x0039,0x324f,0x0001,0x3e8e,0x2820,0x4a18, 216 | 0xb882,0x0024,0x2a20,0x48c0,0x003f,0xfd00,0xb700,0x0024, 217 | 0x003f,0xf901,0x6010,0x0024,0x0000,0x0024,0x280a,0xc505, 218 | 0x0000,0x190d,0x0014,0x1b01,0x0015,0x59c0,0x6fc2,0x0024, 219 | 0x0019,0x9301,0x2800,0xe9d5,0x0018,0x50c0,0x290c,0x4840, 220 | 0x3613,0x0024,0x290c,0x4840,0x4086,0x184c,0x0000,0x18c2, 221 | 0x6234,0x0024,0x0000,0x1d02,0x2800,0xe5d5,0x6234,0x0024, 222 | 0x0030,0x0317,0x2800,0xeb40,0x3f00,0x0024,0x0000,0x1d82, 223 | 0x2800,0xe855,0x6234,0x0024,0x2912,0x0d00,0x4084,0x184c, 224 | 0xf200,0x0024,0x6200,0x0024,0x0006,0x0017,0x2800,0xe540, 225 | 0xb080,0x3c40,0x0000,0x0202,0x2800,0xeb55,0xa024,0x0024, 226 | 0xc020,0x0024,0x2800,0xe540,0x0030,0x02d7,0x6fc2,0x0024, 227 | 0x0000,0x0024,0x2800,0xeb55,0x0000,0x0024,0x2803,0x0300, 228 | 0x000a,0xcac8,0x000a,0x8c8f,0x0000,0xec8e,0x000c,0x0981, 229 | 0x280a,0x71c0,0x002c,0x9d40,0x000a,0x708f,0x0000,0xd7ce, 230 | 0x280a,0xc0d5,0x0012,0x5182,0x6fd6,0x0024,0x003f,0xfd81, 231 | 0x280a,0x8e45,0xb710,0x0024,0xb710,0x0024,0x003f,0xfc01, 232 | 0x6012,0x0024,0x0000,0x0101,0x2801,0x0855,0xffd2,0x0024, 233 | 0x48b2,0x0024,0x4190,0x0024,0x0000,0x190d,0x2801,0x0855, 234 | 0x0030,0x0250,0xb880,0x104c,0x3cf0,0x0024,0x0010,0x5500, 235 | 0xb880,0x23c0,0xb882,0x2000,0x0007,0x8590,0x2914,0xbec0, 236 | 0x0000,0x0440,0x0007,0x8b50,0xb880,0x0024,0x2920,0x0100, 237 | 0x3800,0x0024,0x2920,0x0000,0x0006,0x8a91,0x0000,0x0800, 238 | 0xb880,0xa440,0x003f,0xfd81,0xb710,0xa7c0,0x003f,0xfc01, 239 | 0x6012,0x0024,0x0000,0x0101,0x2801,0x1195,0x0000,0x0024, 240 | 0xffe2,0x0024,0x48b2,0x0024,0x4190,0x0024,0x0000,0x0024, 241 | 0x2801,0x1195,0x0000,0x0024,0x2912,0x2d80,0x0000,0x0780, 242 | 0x4080,0x0024,0x0006,0x8a90,0x2801,0x1195,0x0000,0x01c2, 243 | 0xb886,0x8040,0x3613,0x03c1,0xbcd2,0x0024,0x0030,0x0011, 244 | 0x2800,0xfe15,0x003f,0xff42,0xb886,0x8040,0x3009,0x03c1, 245 | 0x0000,0x0020,0xac22,0x0024,0x0000,0x0102,0x6cd2,0x0024, 246 | 0x3e10,0x0024,0x2909,0x8c80,0x3e00,0x4024,0x36f3,0x0024, 247 | 0x3e11,0x8024,0x3e01,0xc024,0x2901,0x3540,0x0000,0x0201, 248 | 0xf400,0x4512,0x2900,0x0c80,0x3213,0x1b8c,0x3100,0x0024, 249 | 0xb010,0x0024,0x0000,0x0024,0x2801,0x1195,0x0000,0x0024, 250 | 0x291a,0x8a40,0x0000,0x0100,0x2920,0x0200,0x3633,0x0024, 251 | 0x2920,0x0280,0x0000,0x0401,0x408e,0x0024,0x2920,0x0280, 252 | 0x0000,0x0401,0x003f,0xfd81,0xb710,0x4006,0x003f,0xfc01, 253 | 0x6012,0x0024,0x0000,0x0101,0x2801,0x1195,0x0000,0x0024, 254 | 0xffe2,0x0024,0x48b2,0x0024,0x4190,0x0024,0x0000,0x0024, 255 | 0x2801,0x1195,0x0000,0x0024,0x2912,0x2d80,0x0000,0x0780, 256 | 0x4080,0x0024,0x0000,0x01c2,0x2800,0xfa05,0x0006,0x8a90, 257 | 0x2a01,0x1180,0x2920,0x0100,0x0000,0x0401,0x0000,0x0180, 258 | 0x2920,0x0200,0x3613,0x0024,0x2920,0x0280,0x3613,0x0024, 259 | 0x0000,0x0401,0x2920,0x0280,0x4084,0x984c,0x0019,0x9d01, 260 | 0x6212,0x0024,0x001e,0x5c01,0x2801,0x0cd5,0x6012,0x0024, 261 | 0x0000,0x0024,0x2801,0x0ec5,0x0000,0x0024,0x001b,0x5bc1, 262 | 0x6212,0x0024,0x001b,0xdd81,0x2801,0x1295,0x6012,0x0024, 263 | 0x0000,0x0024,0x2801,0x1295,0x0000,0x0024,0x0000,0x004d, 264 | 0x000a,0xbf4f,0x280a,0xb880,0x0001,0x0fce,0x0020,0xfb4f, 265 | 0x0000,0x190d,0x0001,0x16ce,0x2920,0xf440,0x3009,0x2bc1, 266 | 0x291a,0x8a40,0x36e3,0x0024,0x0000,0x190d,0x000a,0x708f, 267 | 0x280a,0xcac0,0x0000,0xd7ce,0x0030,0x0017,0x3700,0x4024, 268 | 0x0000,0x0200,0xb102,0x0024,0x0000,0x00c0,0x2801,0x15c5, 269 | 0x0005,0x4f92,0x2909,0xf840,0x3613,0x2800,0x0006,0x0197, 270 | 0x0006,0xa115,0xb080,0x0024,0x3f00,0x3400,0x0000,0x190d, 271 | 0x000a,0x708f,0x280a,0xc0c0,0x0000,0xd7ce,0x0000,0x004d, 272 | 0x0020,0xfe0f,0x2820,0xfb40,0x0001,0x17ce,0x2801,0x1995, 273 | 0x3009,0x1000,0x6012,0x93cc,0x0000,0x0024,0x2801,0x3445, 274 | 0x0000,0x0024,0x3413,0x0024,0x34b0,0x0024,0x4080,0x0024, 275 | 0x0000,0x0200,0x2801,0x1c95,0xb882,0x0024,0x3453,0x0024, 276 | 0x3009,0x13c0,0x4080,0x0024,0x0000,0x0200,0x2801,0x3445, 277 | 0x0000,0x0024,0xb882,0x130c,0x0000,0x004d,0x0021,0x058f, 278 | 0x2821,0x0340,0x0001,0x1d8e,0x2801,0x2dd5,0x6012,0x0024, 279 | 0x0000,0x0024,0x2801,0x2dd5,0x0000,0x0024,0x34c3,0x184c, 280 | 0x3e13,0xb80f,0xf400,0x4500,0x0026,0x9dcf,0x0001,0x218e, 281 | 0x0000,0xfa0d,0x2926,0x8e80,0x3e10,0x110c,0x36f3,0x0024, 282 | 0x2801,0x2dc0,0x36f3,0x980f,0x001c,0xdd00,0x001c,0xd901, 283 | 0x6ec2,0x0024,0x001c,0xdd00,0x2801,0x2495,0x0018,0xdbc1, 284 | 0x3413,0x184c,0xf400,0x4500,0x2926,0xc640,0x3e00,0x13cc, 285 | 0x2801,0x2b80,0x36f3,0x0024,0x6ec2,0x0024,0x003f,0xc000, 286 | 0x2801,0x2715,0x002a,0x4001,0x3413,0x184c,0xf400,0x4500, 287 | 0x2926,0xafc0,0x3e00,0x13cc,0x2801,0x2b80,0x36f3,0x0024, 288 | 0xb400,0x0024,0xd100,0x0024,0x0000,0x0024,0x2801,0x2b85, 289 | 0x0000,0x0024,0x3613,0x0024,0x3e11,0x4024,0x2926,0x8540, 290 | 0x3e01,0x0024,0x4080,0x1b8c,0x0000,0x0024,0x2801,0x2b85, 291 | 0x0000,0x0024,0x3413,0x184c,0xf400,0x4500,0x2926,0x8e80, 292 | 0x3e10,0x13cc,0x36f3,0x0024,0x3110,0x8024,0x31f0,0xc024, 293 | 0x0000,0x4000,0x0000,0x0021,0x6d06,0x0024,0x3110,0x8024, 294 | 0x2826,0xa8c4,0x31f0,0xc024,0x2a26,0xad00,0x34c3,0x184c, 295 | 0x3410,0x8024,0x3430,0xc024,0x0000,0x4000,0x0000,0x0021, 296 | 0x6d06,0x0024,0x0000,0x0024,0x2801,0x3454,0x4d06,0x0024, 297 | 0x0000,0x0200,0x2922,0x1885,0x0001,0x32c8,0x0000,0x0200, 298 | 0x3e10,0x8024,0x2921,0xca80,0x3e00,0xc024,0x291a,0x8a40, 299 | 0x0000,0x0024,0x2922,0x1880,0x36f3,0x0024,0x0000,0x004d, 300 | 0x0021,0x0ecf,0x2821,0x0bc0,0x0001,0x33ce,0x2801,0x16c0, 301 | 0x3c30,0x4024,0x0000,0x190d,0x0000,0x42ce,0x2821,0x0f80, 302 | 0x0027,0x9e0f,0x0020,0xcd4f,0x2820,0xc780,0x0001,0x360e, 303 | 0x0006,0xf017,0x0000,0x0015,0xb070,0xbc15,0x0000,0x42ce, 304 | 0x0027,0x9e0f,0x2820,0xcd80,0x0000,0x190d,0x3613,0x0024, 305 | 0x3e10,0xb803,0x3e14,0x3811,0x3e11,0x3805,0x3e00,0x3801, 306 | 0x0007,0xc390,0x0006,0xa011,0x3010,0x0444,0x3050,0x4405, 307 | 0x6458,0x0302,0xff94,0x4081,0x0003,0xffc5,0x48b6,0x0024, 308 | 0xff82,0x0024,0x42b2,0x0042,0xb458,0x0003,0x4cd6,0x9801, 309 | 0xf248,0x1bc0,0xb58a,0x0024,0x6de6,0x1804,0x0006,0x0010, 310 | 0x3810,0x9bc5,0x3800,0xc024,0x36f4,0x1811,0x36f0,0x9803, 311 | 0x283e,0x2d80,0x0fff,0xffc3,0x2801,0x4c40,0x0000,0x0024, 312 | 0x3413,0x0024,0x2801,0x4045,0xf400,0x4517,0x2801,0x4440, 313 | 0x6894,0x13cc,0x37b0,0x184c,0x6090,0x1d51,0x0000,0x0910, 314 | 0x3f00,0x060c,0x3100,0x4024,0x6016,0xb812,0x000c,0x8012, 315 | 0x2801,0x42d1,0xb884,0x0024,0x6894,0x3002,0x0000,0x028d, 316 | 0x003a,0x5e0f,0x0001,0x544e,0x2939,0xb0c0,0x3e10,0x93cc, 317 | 0x4084,0x9bd2,0x4282,0x0024,0x0000,0x0040,0x2801,0x4645, 318 | 0x4292,0x130c,0x3443,0x0024,0x2801,0x4785,0x000c,0x8390, 319 | 0x2a01,0x4b00,0x3444,0x0024,0x3073,0x0024,0xc090,0x014c, 320 | 0x2801,0x4b00,0x3800,0x0024,0x000c,0x4113,0xb880,0x2380, 321 | 0x3304,0x4024,0x3800,0x05cc,0xcc92,0x05cc,0x3910,0x0024, 322 | 0x3910,0x4024,0x000c,0x8110,0x3910,0x0024,0x39f0,0x4024, 323 | 0x3810,0x0024,0x38d0,0x4024,0x3810,0x0024,0x38f0,0x4024, 324 | 0x34c3,0x0024,0x3444,0x0024,0x3073,0x0024,0x3063,0x0024, 325 | 0x3000,0x0024,0x4080,0x0024,0x0000,0x0024,0x2839,0x53d5, 326 | 0x4284,0x0024,0x3613,0x0024,0x2801,0x4e45,0x6898,0xb804, 327 | 0x0000,0x0084,0x293b,0x1cc0,0x3613,0x0024,0x000c,0x8117, 328 | 0x3711,0x0024,0x37d1,0x4024,0x4e8a,0x0024,0x0000,0x0015, 329 | 0x2801,0x5105,0xce9a,0x0024,0x3f11,0x0024,0x3f01,0x4024, 330 | 0x000c,0x8197,0x408a,0x9bc4,0x3f15,0x4024,0x2801,0x5345, 331 | 0x4284,0x3c15,0x6590,0x0024,0x0000,0x0024,0x2839,0x53d5, 332 | 0x4284,0x0024,0x0000,0x0024,0x2801,0x3f18,0x458a,0x0024, 333 | 0x2a39,0x53c0,0x003e,0x2d4f,0x283a,0x5ed5,0x0001,0x37ce, 334 | 0x000c,0x4653,0x0000,0x0246,0xffac,0x0c01,0x48be,0x0024, 335 | 0x4162,0x4546,0x6642,0x4055,0x3501,0x8024,0x0000,0x0087, 336 | 0x667c,0x4057,0x000c,0x41d5,0x283a,0x62d5,0x3501,0x8024, 337 | 0x667c,0x1c47,0x3701,0x8024,0x283a,0x62d5,0xc67c,0x0024, 338 | 0x0000,0x0024,0x283a,0x62c5,0x0000,0x0024,0x2a3a,0x5ec0, 339 | 0x3009,0x3851,0x3e14,0xf812,0x3e12,0xb817,0x3e11,0x8024, 340 | 0x0006,0x0293,0x3301,0x8024,0x468c,0x3804,0x0006,0xa057, 341 | 0x2801,0x6044,0x0006,0x0011,0x469c,0x0024,0x3be1,0x8024, 342 | 0x2801,0x6055,0x0006,0xc392,0x3311,0x0024,0x33f1,0x2844, 343 | 0x3009,0x2bc4,0x0030,0x04d2,0x3311,0x0024,0x3a11,0x0024, 344 | 0x3201,0x8024,0x003f,0xfc04,0xb64c,0x0fc4,0xc648,0x0024, 345 | 0x3a01,0x0024,0x3111,0x1fd3,0x6498,0x07c6,0x868c,0x2444, 346 | 0x0023,0xffd2,0x3901,0x8e06,0x0030,0x0551,0x3911,0x8e06, 347 | 0x3961,0x9c44,0xf400,0x44c6,0xd46c,0x1bc4,0x36f1,0xbc13, 348 | 0x2801,0x69d5,0x36f2,0x9817,0x002b,0xffd2,0x3383,0x188c, 349 | 0x3e01,0x8c06,0x0006,0xa097,0x3009,0x1c12,0x3213,0x0024, 350 | 0x468c,0xbc12,0x002b,0xffd2,0xf400,0x4197,0x2801,0x66c4, 351 | 0x3713,0x0024,0x2801,0x6705,0x37e3,0x0024,0x3009,0x2c17, 352 | 0x3383,0x0024,0x3009,0x0c06,0x468c,0x4197,0x0006,0xa052, 353 | 0x2801,0x6904,0x3713,0x2813,0x2801,0x6945,0x37e3,0x0024, 354 | 0x3009,0x2c17,0x36f1,0x8024,0x36f2,0x9817,0x36f4,0xd812, 355 | 0x2100,0x0000,0x3904,0x5bd1,0x2a01,0x5a0e,0x3e11,0x7804, 356 | 0x0030,0x0257,0x3701,0x0024,0x0013,0x4d05,0xd45b,0xe0e1, 357 | 0x0007,0xc795,0x2801,0x7155,0x0fff,0xff45,0x3511,0x184c, 358 | 0x4488,0xb808,0x0006,0x8a97,0x2801,0x7105,0x3009,0x1c40, 359 | 0x3511,0x1fc1,0x0000,0x0020,0xac52,0x1405,0x6ce2,0x0024, 360 | 0x0000,0x0024,0x2801,0x7101,0x68c2,0x0024,0x291a,0x8a40, 361 | 0x3e10,0x0024,0x2921,0xca80,0x3e00,0x4024,0x36f3,0x0024, 362 | 0x3009,0x1bc8,0x36f0,0x1801,0x3601,0x5804,0x3e13,0x780f, 363 | 0x3e13,0xb808,0x0008,0x9b0f,0x0001,0x740e,0x2908,0x9300, 364 | 0x0000,0x004d,0x36f3,0x9808,0x2000,0x0000,0x36f3,0x580f, 365 | 0x0007,0x81d7,0x3711,0x8024,0x3711,0xc024,0x3700,0x0024, 366 | 0x0000,0x2001,0xb012,0x0024,0x0034,0x0000,0x2801,0x76c5, 367 | 0x0000,0x01c1,0x0014,0xc000,0x0000,0x01c1,0x4fce,0x0024, 368 | 0xffea,0x0024,0x48b6,0x0024,0x4384,0x4097,0xb886,0x45c6, 369 | 0xfede,0x0024,0x4db6,0x0024,0x466c,0x0024,0x0006,0xc610, 370 | 0x8dd6,0x8007,0x0000,0x00c6,0xff6e,0x0024,0x48b2,0x0024, 371 | 0x0034,0x2406,0xffee,0x0024,0x2914,0xaa80,0x40b2,0x0024, 372 | 0xf1c6,0x0024,0xf1d6,0x0024,0x0000,0x0201,0x8d86,0x0024, 373 | 0x61de,0x0024,0x0006,0xc612,0x2801,0x7d41,0x0006,0xc713, 374 | 0x4c86,0x0024,0x2912,0x1180,0x0006,0xc351,0x0006,0x0210, 375 | 0x2912,0x0d00,0x3810,0x984c,0xf200,0x2043,0x2808,0xa000, 376 | 0x3800,0x0024,0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815, 377 | 0x3e05,0xb814,0x3645,0x0024,0x0000,0x800a,0x3e10,0x3801, 378 | 0x3e10,0xb803,0x3e11,0x3805,0x3e11,0xb807,0x3e14,0x104c, 379 | 0x2903,0x5740,0x0000,0x0081,0x4080,0x3040,0x0000,0x0101, 380 | 0x2801,0x8485,0x0000,0x0024,0x4090,0x0024,0x0006,0x8050, 381 | 0x2801,0x9895,0x0000,0x0024,0x2903,0x5740,0x3613,0x0024, 382 | 0xb880,0x3000,0x2801,0x9640,0x3009,0x3380,0x2903,0x5740, 383 | 0x4122,0x10cc,0x3cf0,0x0024,0x3001,0x0024,0x3400,0x0024, 384 | 0x6800,0x0024,0xa408,0x9040,0x4080,0x0024,0x0000,0x07c1, 385 | 0x2801,0x8a15,0x6894,0x1380,0x6894,0x130c,0x3460,0x0024, 386 | 0x6408,0x4481,0x4102,0x1380,0xf400,0x4052,0x0000,0x07c1, 387 | 0x34f0,0xc024,0x6234,0x0024,0x6824,0x0024,0xa122,0x0024, 388 | 0x6014,0x0024,0x0000,0x0141,0x2801,0x9115,0x0000,0x0024, 389 | 0x2903,0x5740,0x3613,0x0024,0x2801,0x8f80,0xb88a,0x4002, 390 | 0x2900,0xa9c0,0x3e00,0x8024,0x4c8e,0xa801,0x0000,0x0201, 391 | 0x3a10,0x1bcc,0x3000,0x0024,0xb010,0x0024,0x0000,0x0024, 392 | 0x2801,0x9515,0x659a,0x0024,0x6540,0x184c,0x0030,0x0010, 393 | 0x2801,0x8d08,0x0000,0x0024,0x2801,0x9500,0x36f3,0x0024, 394 | 0x2801,0x93c0,0xb88a,0x0024,0x2903,0x1f80,0x34d0,0x4024, 395 | 0x4c8f,0xa0a1,0x0000,0x0201,0x3000,0x084c,0xb010,0x0024, 396 | 0x0000,0x0024,0x2801,0x9515,0x659a,0x0024,0x6540,0x10cc, 397 | 0x0030,0x0010,0x2801,0x9188,0x0000,0x0024,0x34d3,0x0024, 398 | 0x3423,0x0024,0xf400,0x4510,0x3009,0x1380,0x6090,0x0024, 399 | 0x3009,0x2000,0x6892,0x108c,0x34f0,0x9000,0xa122,0x984c, 400 | 0x6016,0x13c1,0x0000,0x0102,0x2801,0x85c8,0x0006,0x8150, 401 | 0x2801,0x9900,0x3009,0x1bcc,0x6890,0x938c,0x3800,0x0024, 402 | 0x36f4,0x0024,0x36f1,0x9807,0x36f1,0x1805,0x36f0,0x9803, 403 | 0x36f0,0x1801,0x3405,0x9014,0x36f3,0x0024,0x36f2,0x1815, 404 | 0x2000,0x0000,0x36f2,0x9817,0x3613,0x0024,0x3e12,0xb817, 405 | 0x3e12,0x3815,0x3e05,0xb814,0x3675,0x0024,0x3643,0x0024, 406 | 0x0000,0x800a,0x3e10,0x3801,0x0000,0x0181,0x3e10,0xb803, 407 | 0x3e11,0x3806,0x3e11,0xf810,0x3e14,0x7812,0x3e13,0xf80e, 408 | 0x2903,0x2880,0x3e03,0x4024,0x2903,0x5740,0x4088,0x184c, 409 | 0x3413,0x184c,0x2903,0x5740,0x6892,0x3040,0x4080,0x3040, 410 | 0x0000,0x0000,0x2801,0xa685,0x0000,0x0024,0x6890,0x0024, 411 | 0x2903,0x2880,0x3cd0,0x0024,0x4080,0x0024,0x0000,0x0024, 412 | 0x2801,0xa6d5,0x0000,0x0024,0x3433,0x0024,0xf400,0x4510, 413 | 0x34d0,0x0024,0x6090,0x0024,0x2903,0x2880,0x3800,0x0024, 414 | 0x4080,0x10cc,0xf400,0x4510,0x2801,0xa445,0x34d0,0x0024, 415 | 0x2801,0xa6c0,0x0000,0x0024,0x3cd0,0x0024,0x3433,0x0024, 416 | 0x34a0,0x0024,0xf400,0x4510,0x3430,0x4024,0x6100,0x0024, 417 | 0x0000,0x0341,0x3840,0x0024,0x3000,0x0024,0x6012,0x0024, 418 | 0x0006,0x0581,0x2801,0xc441,0x4012,0x0024,0xf400,0x4057, 419 | 0x3702,0x0024,0x2000,0x0000,0x0000,0x0024,0x34d3,0x184c, 420 | 0x3430,0x8024,0x2900,0xa9c0,0x3e00,0x8024,0x36f3,0x11cc, 421 | 0xb888,0x104c,0x3c10,0x0024,0x3c90,0x4024,0x2801,0xb000, 422 | 0x34e3,0x0024,0x3411,0x8024,0x3491,0xc024,0x4f82,0x128c, 423 | 0x3400,0x4024,0x4142,0x0024,0xf400,0x4050,0x3800,0x0024, 424 | 0x3440,0x4024,0x4142,0x0024,0x6498,0x4050,0x3009,0x2007, 425 | 0x0006,0x8150,0x3000,0x11cc,0x6402,0x104c,0x0000,0x0024, 426 | 0x2801,0xad48,0x0000,0x0024,0x3493,0x0024,0x2801,0xe000, 427 | 0x34f3,0x0024,0x2801,0xb780,0xb888,0x0024,0x3430,0x8024, 428 | 0x2900,0xa9c0,0x3e00,0x8024,0x4c8e,0x130c,0x3400,0x5bcc, 429 | 0x4142,0x0024,0xf400,0x4050,0x3800,0x0024,0x3440,0x4024, 430 | 0x4142,0x0024,0xf400,0x4050,0x0000,0x0201,0x3009,0x2007, 431 | 0x0030,0x0010,0x3000,0x0024,0xb010,0x0024,0x0000,0x0024, 432 | 0x2801,0xe015,0x6498,0x0024,0x0006,0x8150,0x3000,0x134c, 433 | 0x6402,0x984c,0x0000,0x0024,0x2801,0xb2c8,0x0000,0x0024, 434 | 0x2801,0xe000,0x3433,0x1bcc,0x0000,0x0201,0xb888,0x104c, 435 | 0x3430,0x184c,0x6010,0x0024,0x6402,0x3000,0x0000,0x0201, 436 | 0x2801,0xc018,0x0030,0x0010,0x4090,0x124c,0x2401,0xbf00, 437 | 0x0000,0x0024,0x3430,0x8024,0x2900,0xa9c0,0x3e00,0x8024, 438 | 0x4c8e,0x130c,0x3400,0x4024,0x4142,0x0024,0xf400,0x4050, 439 | 0x3800,0x0024,0x3410,0x4024,0x4142,0x0024,0x6498,0x4050, 440 | 0x3009,0x2007,0x0030,0x0010,0x0000,0x0201,0x3473,0x0024, 441 | 0x3490,0x0024,0x3e00,0x13cc,0x2901,0x7f40,0x3444,0x8024, 442 | 0x3000,0x1bcc,0xb010,0x0024,0x0000,0x0024,0x2801,0xe015, 443 | 0x0000,0x0024,0x34c3,0x184c,0x3470,0x0024,0x3e10,0x104c, 444 | 0x34c0,0x4024,0x2900,0xb300,0x3e00,0x4024,0x2801,0xe000, 445 | 0x36e3,0x0024,0x0000,0x0801,0x3413,0x0024,0x34f0,0x0024, 446 | 0x6012,0x0024,0x0000,0x07c1,0x2801,0xdf48,0x0000,0x0024, 447 | 0x6010,0x114c,0xb888,0x32c0,0x6402,0x0024,0x0000,0x0101, 448 | 0x2801,0xcbd8,0x0000,0x0024,0x4090,0x134c,0x2401,0xcb00, 449 | 0x3009,0x184c,0x3430,0x8024,0x2900,0xa9c0,0x3e00,0x8024, 450 | 0x4c8e,0x130c,0x3400,0x4024,0x4142,0x0024,0xf400,0x4050, 451 | 0x3800,0x0024,0x3410,0x4024,0x4142,0x0024,0x6498,0x4050, 452 | 0x3009,0x2007,0x0000,0x0101,0x3433,0x1bcc,0x2903,0x5740, 453 | 0x3613,0x0024,0x0000,0x0141,0x6090,0x118c,0x2903,0x5740, 454 | 0x3ca0,0x184c,0x3473,0x184c,0xb888,0x3380,0x3400,0x0024, 455 | 0x6402,0x0024,0x0000,0x0201,0x2801,0xd298,0x0000,0x0024, 456 | 0x4090,0x104c,0x2401,0xd1c0,0x0000,0x0024,0x34a0,0x8024, 457 | 0x2900,0xa9c0,0x3e00,0x8024,0x0006,0x8002,0x4244,0x118c, 458 | 0x4244,0x0024,0x6498,0x4095,0x3009,0x3440,0x3009,0x37c1, 459 | 0x0000,0x0201,0x34f3,0x0024,0x0030,0x0010,0x3490,0x0024, 460 | 0x3e00,0x138c,0x2901,0x7f40,0x3444,0x8024,0x3000,0x1bcc, 461 | 0xb010,0x0024,0x0000,0x0024,0x2801,0xe015,0x4112,0x0024, 462 | 0x3463,0x0024,0x34a0,0x0024,0x6012,0x0024,0x0006,0x8111, 463 | 0x2801,0xdbd9,0x0000,0x0024,0x3100,0x11cc,0x3490,0x4024, 464 | 0x4010,0x0024,0x0000,0x0a01,0x6012,0x0024,0x0006,0x8151, 465 | 0x2801,0xdbd8,0x0000,0x0024,0x3613,0x114c,0x3101,0x3804, 466 | 0x3490,0x8024,0x6428,0x138c,0x3470,0x8024,0x3423,0x0024, 467 | 0x3420,0xc024,0x4234,0x1241,0x4380,0x4092,0x2903,0xab00, 468 | 0x0006,0x8010,0x2801,0xe000,0x3009,0x1bcc,0x0006,0x8151, 469 | 0x3613,0x114c,0x3101,0x3804,0x3490,0x8024,0x6428,0x138c, 470 | 0x3470,0x8024,0x3423,0x0024,0x3420,0xc024,0x4234,0x1241, 471 | 0x4380,0x4092,0x2903,0xb4c0,0x0006,0x8010,0x2801,0xe000, 472 | 0x3009,0x1bcc,0x0006,0x8050,0x6890,0x0024,0x3800,0x0024, 473 | 0x3433,0x0024,0x34d0,0x0024,0x4080,0x0024,0x0006,0x8150, 474 | 0x2801,0xe585,0x0000,0x0024,0x3000,0x11cc,0xb888,0x10cc, 475 | 0x6402,0x3240,0x3493,0x0024,0x3444,0x8024,0x2801,0xe598, 476 | 0x4090,0x0024,0x2401,0xe540,0x0000,0x0024,0x6499,0x2620, 477 | 0xb78e,0x4001,0x0000,0x0000,0x3433,0x0024,0xcfce,0x1340, 478 | 0xaf0e,0x0024,0x3a11,0xa807,0x36f3,0x4024,0x36f3,0xd80e, 479 | 0x36f4,0x5812,0x36f1,0xd810,0x36f1,0x1806,0x36f0,0x9803, 480 | 0x36f0,0x1801,0x3405,0x9014,0x36f3,0x0024,0x36f2,0x1815, 481 | 0x2000,0x0000,0x36f2,0x9817,0x3613,0x0024,0x3e12,0xb817, 482 | 0x3e12,0x3815,0x3e05,0xb814,0x3615,0x0024,0x0000,0x800a, 483 | 0x3e10,0x7802,0x3e10,0xf804,0x0000,0x3fc3,0x3e11,0x7806, 484 | 0x3e11,0xf810,0xbc82,0x12cc,0x3404,0x0024,0x3023,0x0024, 485 | 0x3810,0x0024,0x38f0,0x4024,0x3454,0x0024,0x3810,0x0024, 486 | 0x38f0,0x4024,0x2903,0x5740,0x0000,0x0201,0x0006,0x9301, 487 | 0x4088,0x134c,0x3400,0x8024,0xd204,0x0024,0xb234,0x0024, 488 | 0x4122,0x0024,0xf400,0x4055,0x3500,0x0024,0x3c30,0x0024, 489 | 0x0000,0x2000,0xb400,0x0024,0x0000,0x3001,0x2801,0xf315, 490 | 0x0000,0x3800,0x0000,0x0041,0xfe42,0x12cc,0x48b2,0x1090, 491 | 0x3810,0x0024,0x38f0,0x4024,0x2802,0x1400,0x3430,0x0024, 492 | 0xb400,0x0024,0x6012,0x0024,0x0000,0x3801,0x2801,0xf655, 493 | 0x0000,0x3c00,0x0000,0x07c0,0x0000,0x0041,0xb400,0x12cc, 494 | 0xfe02,0x1150,0x48b2,0x0024,0x689a,0x2040,0x2802,0x12c0, 495 | 0x38f0,0x4024,0xb400,0x0024,0x6012,0x0024,0x0000,0x3c01, 496 | 0x2801,0xf9d5,0x0000,0x3e00,0x0000,0x03c0,0x0000,0x0085, 497 | 0x4592,0x12cc,0xb400,0x1150,0xfe02,0x0024,0x48b2,0x0024, 498 | 0x3810,0x0024,0x2802,0x12c0,0x38f0,0x4024,0xb400,0x0024, 499 | 0x6012,0x0024,0x0000,0x3e01,0x2801,0xfd55,0x0000,0x3f00, 500 | 0x0000,0x01c0,0xf20a,0x12cc,0xb400,0x1150,0xf252,0x0024, 501 | 0xfe02,0x0024,0x48b2,0x0024,0x3810,0x0024,0x2802,0x12c0, 502 | 0x38f0,0x4024,0xb400,0x130c,0x6012,0x0024,0x0000,0x3f01, 503 | 0x2802,0x00d5,0x4390,0x0024,0x0000,0x0041,0x0000,0x0105, 504 | 0x4590,0x13cc,0xb400,0x1150,0xfe02,0x0024,0x48b2,0x0024, 505 | 0x3810,0x0024,0x2802,0x12c0,0x38f0,0x4024,0xb400,0x0024, 506 | 0x6012,0x1100,0x0000,0x01c1,0x2802,0x0455,0x0000,0x0024, 507 | 0x0000,0x0041,0x0000,0x0145,0x6890,0x12cc,0xb400,0x1150, 508 | 0xfe02,0x0024,0x48b2,0x0024,0x3810,0x0024,0x2802,0x12c0, 509 | 0x38f0,0x4024,0x6012,0x0024,0x0000,0x3f81,0x2802,0x06d5, 510 | 0xb430,0x0024,0x6012,0x0024,0x0000,0x0024,0x2802,0x06d5, 511 | 0x0000,0x0024,0x2802,0x12c0,0x0000,0x0185,0x2802,0x1400, 512 | 0xc890,0x0024,0x0000,0x3fc3,0x0000,0x0201,0x34d3,0x0024, 513 | 0x2903,0x5740,0x3433,0x184c,0x0006,0x9301,0x4088,0x134c, 514 | 0x3400,0x8024,0xd204,0x0024,0xb234,0x0024,0x4122,0x0024, 515 | 0xf400,0x4055,0x0000,0x2001,0x3500,0x0024,0x3c30,0x0024, 516 | 0x0000,0x3000,0xb400,0x0024,0x6012,0x0024,0x0000,0x0182, 517 | 0x2802,0x0d05,0x0000,0x0024,0x2802,0x1400,0xc890,0x0024, 518 | 0x459a,0x12cc,0x3404,0x0024,0x3023,0x0024,0x3010,0x0024, 519 | 0x30d0,0x4024,0xac22,0x0046,0x003f,0xf982,0x3011,0xc024, 520 | 0x0000,0x0023,0xaf2e,0x0024,0x0000,0x0182,0xccf2,0x0024, 521 | 0x0000,0x0fc6,0x0000,0x0047,0xb46c,0x2040,0xfe6e,0x23c1, 522 | 0x3454,0x0024,0x3010,0x0024,0x30f0,0x4024,0xac22,0x0024, 523 | 0xccb2,0x0024,0x3810,0x0024,0x38f0,0x4024,0x458a,0x134c, 524 | 0x0000,0x0201,0x2802,0x0815,0x0000,0x3fc3,0x3430,0x0024, 525 | 0x36f1,0xd810,0x36f1,0x5806,0x36f0,0xd804,0x36f0,0x5802, 526 | 0x3405,0x9014,0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000, 527 | 0x36f2,0x9817,0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815, 528 | 0x3e05,0xb814,0x3675,0x0024,0x3633,0x0024,0x0000,0x800a, 529 | 0x3e10,0x3801,0x3e10,0xb803,0x3e11,0x3805,0x3e11,0xb807, 530 | 0x3e14,0x3811,0x3e14,0xb813,0x3e13,0xf80e,0x3e03,0x4024, 531 | 0x2903,0x9200,0x0000,0x0381,0x000f,0xff81,0x6012,0x184c, 532 | 0x0000,0x0201,0x2802,0x1c85,0x0000,0x0024,0x2903,0x5740, 533 | 0x0002,0xffc8,0x3613,0x0024,0x0000,0x0401,0x0006,0x8a10, 534 | 0x2900,0xbf00,0xb880,0x1bcc,0xb880,0x11cc,0x3413,0x184c, 535 | 0x3c90,0x0024,0x2903,0x5740,0x34f3,0x0024,0x3473,0x184c, 536 | 0x3c00,0x0000,0x4080,0x0024,0x0006,0x9301,0x2802,0x2205, 537 | 0x003f,0xfe04,0x3490,0x8024,0xa244,0x0024,0x2903,0x7500, 538 | 0xb880,0x0024,0x2900,0xbf00,0x003f,0xfe04,0x3473,0x184c, 539 | 0x0006,0x8091,0x3413,0x0024,0x34f0,0x8024,0x3400,0xc024, 540 | 0xa346,0x0024,0xd234,0x0024,0x0000,0x3fc3,0xb234,0x0024, 541 | 0x4122,0x1042,0xf400,0x4055,0x0006,0x9301,0x3500,0x0024, 542 | 0xd024,0x3000,0xb234,0x0024,0x4122,0x0024,0x6892,0x4055, 543 | 0x3500,0x0024,0x3cf0,0x0024,0x34a0,0x0024,0xf100,0x0024, 544 | 0xb010,0x0024,0x3c60,0x0024,0x34b0,0x0024,0xb010,0x0024, 545 | 0x0000,0x0201,0x2903,0x5740,0x3ce0,0x0024,0x0006,0x9301, 546 | 0x3473,0x184c,0x3c10,0x0024,0x34f0,0x8024,0x3410,0xc024, 547 | 0xd234,0x0024,0x0000,0x3fc3,0xb234,0x0024,0x4122,0x0024, 548 | 0xf400,0x4055,0x003f,0xff01,0x3500,0x0024,0x3cf0,0x0024, 549 | 0x34c0,0x0024,0xa010,0x0024,0x0000,0x03c1,0x3c40,0x0024, 550 | 0x34d0,0x0024,0xb010,0x0024,0x0000,0x0201,0x2903,0x5740, 551 | 0x3cc0,0x0024,0x0006,0x9301,0x3473,0x0024,0x3c10,0x0024, 552 | 0x34f0,0x8024,0x3410,0xc024,0xd234,0x0024,0x0000,0x3fc3, 553 | 0xb234,0x0024,0x4122,0x0024,0xf400,0x4055,0x003f,0xff01, 554 | 0x3500,0x0024,0x3cf0,0x0024,0x3400,0x0024,0xa010,0x0024, 555 | 0x0000,0x01c1,0x3900,0x0024,0x34e0,0x0024,0xf100,0x0024, 556 | 0xb010,0x0024,0x6892,0x3080,0x34f0,0x0024,0xb010,0x0024, 557 | 0x3cb0,0x0024,0x3450,0x0024,0x34a0,0x4024,0xc010,0x0024, 558 | 0x0000,0x0181,0x2802,0x3685,0x3100,0x0024,0x6890,0x07cc, 559 | 0x2802,0xffc0,0x3900,0x0024,0x6012,0x0024,0x0000,0x0201, 560 | 0x2802,0x3818,0x0000,0x0024,0x2802,0x3b00,0x6090,0x044c, 561 | 0x6012,0x0024,0x0000,0x0281,0x2802,0x3a48,0x6012,0x0024, 562 | 0x0000,0x0080,0x2802,0x3a59,0x0000,0x0024,0x2802,0x3b00, 563 | 0x3113,0x0024,0x6890,0x07cc,0x2802,0xffc0,0x3900,0x0024, 564 | 0x0000,0x0201,0x3900,0x114c,0x34b0,0x0024,0x6012,0x0024, 565 | 0x0006,0x08c1,0x2802,0x4541,0x4012,0x0024,0xf400,0x4057, 566 | 0x3702,0x0024,0x2000,0x0000,0x0000,0x0024,0x2802,0x4540, 567 | 0x0000,0x0024,0x0000,0x0200,0x0006,0x8110,0x2802,0x4540, 568 | 0x3800,0x0024,0x0000,0x0300,0x0006,0x8110,0x2802,0x4540, 569 | 0x3800,0x0024,0x0006,0x8050,0x6890,0x0024,0x2802,0xffc0, 570 | 0x3800,0x0024,0x0000,0x0400,0x0006,0x8110,0x2802,0x4540, 571 | 0x3800,0x0024,0x0000,0x0500,0x0006,0x8110,0x2802,0x4540, 572 | 0x3800,0x0024,0x0000,0x0600,0x0006,0x8110,0x2802,0x4540, 573 | 0x3800,0x0024,0x0006,0x8050,0x6890,0x0024,0x2802,0xffc0, 574 | 0x3800,0x0024,0x3423,0x184c,0x3460,0x0024,0x4080,0x0024, 575 | 0x0006,0x8200,0x2802,0x4a85,0x3e10,0x0024,0x0000,0x01c0, 576 | 0x3e10,0x0024,0x3490,0x0024,0x2901,0xe880,0x3e00,0x13cc, 577 | 0x36d3,0x11cc,0x3413,0x0024,0x4080,0x3240,0x34f3,0x0024, 578 | 0x2802,0x4e58,0x0000,0x0024,0x0006,0x8010,0x6890,0x0024, 579 | 0x2802,0xffc0,0x3800,0x0024,0x0000,0x0180,0x3e10,0x0024, 580 | 0x3490,0x0024,0x2901,0xe880,0x3e00,0x13cc,0x36d3,0x11cc, 581 | 0x3413,0x0024,0x4080,0x3240,0x34f3,0x0024,0x2802,0x4e58, 582 | 0x0000,0x0024,0x0006,0x8010,0x6890,0x0024,0x2802,0xffc0, 583 | 0x3800,0x0024,0x0000,0x0201,0x3433,0x0024,0x34d0,0x0024, 584 | 0x6012,0x0024,0x0006,0x0ac1,0x2802,0x6041,0x4012,0x0024, 585 | 0xf400,0x4057,0x3702,0x0024,0x2000,0x0000,0x0000,0x0024, 586 | 0x0006,0x8050,0x6890,0x0024,0x2802,0xffc0,0x3800,0x0024, 587 | 0x0000,0x3000,0x2802,0x6200,0x0006,0x8150,0x0000,0x9000, 588 | 0x0006,0x8150,0x3433,0x0024,0x34d0,0x4024,0x4192,0x0024, 589 | 0x4192,0x0024,0x2802,0x6200,0xa010,0x0024,0x0000,0x0201, 590 | 0x0006,0x8150,0x2903,0x5740,0x3613,0x0024,0x0006,0x9301, 591 | 0x3473,0x0024,0x3c10,0x0024,0x34f0,0x8024,0x3410,0xc024, 592 | 0xd234,0x0024,0x0000,0x3fc3,0xb234,0x0024,0x4122,0x0024, 593 | 0xf400,0x4055,0x3500,0x0024,0x3cf0,0x0024,0x3490,0x0024, 594 | 0x2802,0x6200,0x6090,0x0024,0x003f,0xfe04,0x0000,0x0401, 595 | 0x0006,0x8150,0x2903,0x5740,0x3613,0x0024,0x0006,0x9301, 596 | 0x3473,0x0024,0x3c10,0x0024,0x34f0,0x8024,0x3400,0xc024, 597 | 0xa346,0x0024,0xd234,0x0024,0x0000,0x3fc3,0xb234,0x0024, 598 | 0x4122,0x1042,0xf400,0x4055,0x0006,0x9301,0x3500,0x0024, 599 | 0xd024,0x3000,0xb234,0x0024,0x4122,0x0024,0xf400,0x4055, 600 | 0x3500,0x0024,0x3cf0,0x0024,0x3490,0x0024,0x2802,0x6200, 601 | 0x6090,0x0024,0x0000,0x4000,0x0000,0x0202,0x0006,0x8150, 602 | 0x3433,0x0024,0x34d0,0x4024,0x6122,0x0024,0xa010,0x0024, 603 | 0x0004,0x8001,0x3800,0x110c,0x0006,0x8150,0x3000,0x0024, 604 | 0x6012,0x1300,0x0000,0x0401,0x2802,0x64c9,0x0000,0x0024, 605 | 0x6890,0x82cc,0x2802,0xffc0,0x3800,0x0024,0x6012,0x0024, 606 | 0x0006,0x0cc1,0x2802,0x8c41,0x4012,0x0024,0xf400,0x4057, 607 | 0x3702,0x0024,0x2000,0x0000,0x0000,0x0024,0x2802,0x8c40, 608 | 0x0000,0x0024,0x0016,0x2200,0x0006,0x8190,0x6892,0x2040, 609 | 0x2802,0x8c40,0x38f0,0x4024,0x002c,0x4400,0x0000,0x0081, 610 | 0x0006,0x8190,0x3810,0x0024,0x2802,0x8c40,0x38f0,0x4024, 611 | 0x003b,0x8000,0x0000,0x0081,0x0006,0x8190,0x3810,0x0024, 612 | 0x2802,0x8c40,0x38f0,0x4024,0x0007,0xd000,0x0006,0x8190, 613 | 0xb882,0x2040,0x2802,0x8c40,0x38f0,0x4024,0x000f,0xa000, 614 | 0x0006,0x8190,0xb882,0x2040,0x2802,0x8c40,0x38f0,0x4024, 615 | 0x0015,0x8880,0x0006,0x8190,0xb882,0x2040,0x2802,0x8c40, 616 | 0x38f0,0x4024,0x0017,0x7000,0x0006,0x8190,0xb882,0x2040, 617 | 0x2802,0x8c40,0x38f0,0x4024,0x001f,0x4000,0x0006,0x8190, 618 | 0xb882,0x2040,0x2802,0x8c40,0x38f0,0x4024,0x002b,0x1100, 619 | 0x0006,0x8190,0xb882,0x2040,0x2802,0x8c40,0x38f0,0x4024, 620 | 0x002e,0xe000,0x0006,0x8190,0xb882,0x2040,0x2802,0x8c40, 621 | 0x38f0,0x4024,0x001d,0xc000,0x0006,0x8190,0x6892,0x2040, 622 | 0x2802,0x8c40,0x38f0,0x4024,0x0006,0x8190,0x0000,0x0201, 623 | 0x0000,0xfa04,0x2903,0x5740,0x3613,0x0024,0x0006,0x9301, 624 | 0xb88a,0x11cc,0x3c10,0x0024,0x34f0,0x8024,0x3410,0xc024, 625 | 0xd234,0x0024,0x0000,0x3fc3,0xb234,0x0024,0x4122,0x0024, 626 | 0xf400,0x4055,0x3500,0x0024,0x3cf0,0x0024,0x3490,0x0024, 627 | 0xfe50,0x4005,0x48b2,0x0024,0xfeca,0x0024,0x40b2,0x0024, 628 | 0x3810,0x0024,0x2802,0x8c40,0x38f0,0x4024,0x003f,0xfe04, 629 | 0x0000,0x0401,0x0006,0x8190,0x2903,0x5740,0x3613,0x0024, 630 | 0x0006,0x9301,0x3473,0x0024,0x3c10,0x0024,0x34f0,0x8024, 631 | 0x3400,0xc024,0xa346,0x0024,0xd234,0x0024,0x0000,0x3fc3, 632 | 0xb234,0x0024,0x4122,0x1042,0xf400,0x4055,0x0006,0x9301, 633 | 0x3500,0x0024,0xd024,0x3000,0xb234,0x0024,0x4122,0x0024, 634 | 0xf400,0x4055,0x0000,0x0041,0x3500,0x0024,0x3cf0,0x0024, 635 | 0x3490,0x0024,0xfe02,0x0024,0x48b2,0x0024,0x3810,0x0024, 636 | 0x2802,0x8c40,0x38f0,0x4024,0x003f,0xfe04,0x0000,0x0401, 637 | 0x0006,0x8190,0x2903,0x5740,0x3613,0x0024,0x0006,0x9301, 638 | 0x3473,0x0024,0x3c10,0x0024,0x34f0,0x8024,0x3400,0xc024, 639 | 0xa346,0x0024,0xd234,0x0024,0x0000,0x3fc3,0xb234,0x0024, 640 | 0x4122,0x1042,0xf400,0x4055,0x0006,0x9301,0x3500,0x0024, 641 | 0xd024,0x3000,0xb234,0x0024,0x4122,0x0024,0xf400,0x4055, 642 | 0x3500,0x0024,0x3cf0,0x0024,0x0000,0x0280,0x3490,0x4024, 643 | 0xfe02,0x0024,0x48b2,0x0024,0x3810,0x0024,0x2802,0x8c40, 644 | 0x38f0,0x4024,0x0006,0x8010,0x6890,0x0024,0x2802,0xffc0, 645 | 0x3800,0x0024,0x0000,0x0201,0x2903,0x5740,0x3613,0x11cc, 646 | 0x3c10,0x0024,0x3490,0x4024,0x6014,0x13cc,0x0000,0x0081, 647 | 0x2802,0x8f85,0x0006,0x80d0,0x0006,0x8010,0x6890,0x0024, 648 | 0x2802,0xffc0,0x3800,0x0024,0x3010,0x0024,0x6012,0x0024, 649 | 0x0000,0x0241,0x2802,0xaf09,0x0006,0x8112,0x0008,0x0001, 650 | 0x3009,0x184c,0x3e10,0x4024,0x3000,0x8024,0x2901,0x9b80, 651 | 0x3e00,0x8024,0x36f3,0x004c,0x3000,0x3844,0x0008,0x0010, 652 | 0xb884,0x3840,0x0000,0x0400,0x3e00,0x8024,0x3201,0x0024, 653 | 0x2903,0x3740,0x6408,0x4091,0x0001,0x0000,0x000b,0x8011, 654 | 0x0004,0x0010,0x36e3,0x0024,0x2915,0x8300,0x3009,0x1bc4, 655 | 0x000b,0x8000,0x3613,0x0024,0x3e10,0x0024,0x3200,0xc024, 656 | 0x2901,0x9b80,0x3e00,0xc024,0x36f3,0x084c,0x32f0,0xf844, 657 | 0x3e10,0xc024,0x3e00,0x8024,0x2b01,0x0091,0x0000,0x0400, 658 | 0xf204,0x0804,0x2903,0x3740,0x6408,0x0024,0x000b,0x8011, 659 | 0x0008,0x0010,0x0000,0x0084,0x36d3,0x0024,0x2915,0x8300, 660 | 0x0003,0x8000,0x0005,0x0010,0x0001,0x0000,0x2915,0x8300, 661 | 0x000f,0x0011,0x1006,0x0ac0,0x32f3,0x11cc,0x3200,0xd08c, 662 | 0xff34,0x0024,0x48b6,0x0024,0x4020,0x0024,0x3c90,0x0024, 663 | 0x2802,0xab40,0x34e3,0x0024,0x0006,0x8112,0x3613,0x0024, 664 | 0x3e10,0x0024,0x3000,0x4024,0x2901,0x9b80,0x3e00,0x4024, 665 | 0x36f3,0x004c,0x3000,0x7844,0xb884,0x3841,0x2b01,0x0091, 666 | 0x0000,0x0400,0x3e00,0x8024,0x3201,0x0024,0x2903,0x3740, 667 | 0x6408,0x0024,0x0003,0x8000,0x000b,0x8011,0x0008,0x0010, 668 | 0x36e3,0x11cc,0x3423,0x0024,0x3494,0xc024,0x2903,0x62c0, 669 | 0x3301,0x138c,0x0001,0x0000,0x000f,0x0011,0x0004,0x0010, 670 | 0x2903,0x6800,0x3301,0x0024,0xf400,0x4510,0x000b,0x8011, 671 | 0x3073,0x0024,0x3023,0x0024,0x3000,0x0024,0x6090,0x0024, 672 | 0x3800,0x0024,0x0003,0x8000,0x3004,0xc024,0x0008,0x0010, 673 | 0x2903,0x6800,0x3301,0x0024,0x0001,0x0000,0x000f,0x0011, 674 | 0x0005,0x0010,0x2903,0x6800,0x3301,0x0024,0xf400,0x4510, 675 | 0x3073,0x1bc4,0x6498,0x008c,0x3000,0x0024,0x6090,0x0024, 676 | 0x3800,0x0024,0x0006,0x80d0,0x3000,0x0024,0x6402,0x0024, 677 | 0x0006,0x8110,0x2802,0x9e88,0x000b,0x8000,0x000b,0x8010, 678 | 0x0001,0x0000,0x2903,0xc680,0x0004,0x0011,0x0005,0x0011, 679 | 0x000b,0x8010,0x0001,0x0000,0x291f,0xc6c0,0x0002,0xc048, 680 | 0x30e1,0x184c,0x3000,0x0024,0x6012,0x0024,0x0008,0x0001, 681 | 0x2802,0xb0d5,0x0000,0x0024,0x6498,0x0024,0x3e10,0x4024, 682 | 0x0000,0x0081,0x2901,0x9b80,0x3e01,0x0024,0x36e3,0x004c, 683 | 0x3000,0x0024,0x6012,0x0024,0x000b,0x8011,0x2802,0xbd15, 684 | 0x0006,0x8112,0x0000,0x0201,0x0004,0x0010,0x2915,0x8300, 685 | 0x0001,0x0000,0x000b,0x8011,0x0005,0x0010,0x291f,0xc6c0, 686 | 0x0001,0x0000,0x0006,0x8110,0x30e1,0x0024,0x3000,0x0024, 687 | 0x6012,0x0024,0x0000,0x0281,0x2802,0xb805,0x6012,0x0024, 688 | 0x000b,0x8001,0x2802,0xb895,0x3613,0x0024,0x36f3,0x0024, 689 | 0x000b,0x8001,0x6498,0x184c,0x0006,0x8112,0x0003,0x8000, 690 | 0x3e10,0x4024,0x2901,0x9b80,0x3e01,0x0024,0x36f3,0x0024, 691 | 0x3009,0x3844,0x3e10,0x0024,0x0000,0x0400,0x3000,0x8024, 692 | 0x0008,0x0010,0x3e00,0x8024,0x3201,0x0024,0x2903,0x3740, 693 | 0x6408,0x4051,0x36e3,0x0024,0x2802,0xc040,0x3009,0x1bc4, 694 | 0x0000,0x0400,0x0000,0x0011,0x3613,0x008c,0x30d0,0x7844, 695 | 0x3e10,0x4024,0x3000,0x8024,0x0008,0x0010,0x3e00,0x8024, 696 | 0x3201,0x0024,0x2903,0x3740,0x6408,0x0024,0x36e3,0x0024, 697 | 0x3009,0x1bc4,0x0006,0x8a10,0x0000,0x01c1,0x3009,0x0000, 698 | 0xb010,0x0024,0x0000,0x0024,0x2802,0xc445,0x6192,0x0024, 699 | 0x2903,0x5740,0x6102,0x184c,0x4088,0x0024,0x0000,0x0024, 700 | 0x2802,0xc445,0x0000,0x0024,0x0006,0x8051,0x6890,0x0024, 701 | 0x3900,0x0024,0x3009,0x0000,0x4080,0x0024,0x0000,0x0024, 702 | 0x2903,0x7445,0x0002,0xc908,0x0006,0x9f92,0x0000,0x4003, 703 | 0x3009,0x0811,0x3100,0x8024,0xffa6,0x0024,0x48b6,0x0024, 704 | 0x2903,0x7440,0x4384,0x0024,0x2903,0x7500,0x3613,0x0024, 705 | 0x2900,0xbf00,0x0000,0x0024,0x2903,0x7440,0x0000,0x0024, 706 | 0x0000,0x0401,0x3473,0x184c,0x2903,0x5740,0x3c10,0x0024, 707 | 0x3c90,0x0024,0x290b,0x1400,0x34f3,0x0024,0x4080,0x0024, 708 | 0x0000,0x0024,0x2802,0xfc55,0x0000,0x0024,0x3473,0x0024, 709 | 0x3410,0x0024,0x34a0,0x4024,0x6014,0x1380,0x0000,0x0024, 710 | 0x2802,0xd105,0x4080,0x0024,0x0006,0x8011,0x6890,0x0024, 711 | 0xb882,0x2400,0x0004,0x8000,0x2914,0xbec0,0x0008,0x0010, 712 | 0x0000,0x0400,0x3143,0x108c,0x6890,0x27c0,0x3920,0x0024, 713 | 0x0004,0x8000,0x3900,0x0024,0x34e0,0x0024,0x4080,0x0024, 714 | 0x0006,0x8150,0x2802,0xd505,0x0000,0x3200,0x0000,0x0142, 715 | 0x0006,0x8210,0x3613,0x0024,0x3e00,0x7800,0x3011,0x8024, 716 | 0x30d1,0xc024,0xfef4,0x4087,0x48b6,0x0040,0xfeee,0x03c1, 717 | 0x2914,0xa580,0x42b6,0x0024,0x2802,0xd900,0x0007,0x89d0, 718 | 0x0000,0x0142,0x3613,0x0024,0x3e00,0x7800,0x3031,0x8024, 719 | 0x3010,0x0024,0x30d0,0x4024,0xfe9c,0x4181,0x48be,0x0024, 720 | 0xfe82,0x0040,0x46be,0x03c1,0xfef4,0x4087,0x48b6,0x0024, 721 | 0xfeee,0x0024,0x2914,0xa580,0x42b6,0x0024,0x0007,0x89d0, 722 | 0x0006,0x8191,0x4c8a,0x9800,0xfed0,0x4005,0x48b2,0x0024, 723 | 0xfeca,0x0024,0x40b2,0x0024,0x3810,0x0024,0x38f0,0x4024, 724 | 0x3111,0x8024,0x468a,0x0707,0x2908,0xbe80,0x3101,0x0024, 725 | 0x3123,0x11cc,0x3100,0x108c,0x3009,0x3000,0x0004,0x8000, 726 | 0x3009,0x1241,0x6014,0x138c,0x000b,0x8011,0x2802,0xdf41, 727 | 0x0000,0x0024,0x3473,0x0024,0x3423,0x0024,0x3009,0x3240, 728 | 0x34e3,0x0024,0x2802,0xfa80,0x0008,0x0012,0x0000,0x0081, 729 | 0x2802,0xe0c9,0x0006,0x80d0,0xf400,0x4004,0x3000,0x0024, 730 | 0x6012,0x0024,0x0000,0x0005,0x2802,0xe649,0x0000,0x0024, 731 | 0x6540,0x0024,0x0000,0x0024,0x2802,0xf698,0x4490,0x0024, 732 | 0x2402,0xe580,0x0000,0x0024,0x0006,0x8301,0x4554,0x0800, 733 | 0x4122,0x0024,0x659a,0x4055,0x0006,0x8341,0x3d00,0x0840, 734 | 0x4122,0x0024,0xf400,0x4055,0x3d00,0x0024,0x2802,0xf680, 735 | 0x0000,0x0024,0x4090,0x0024,0xf400,0x4480,0x2802,0xeb95, 736 | 0x000b,0x8001,0x6540,0x0024,0x0000,0x0024,0x2802,0xf698, 737 | 0x4490,0x0024,0x2402,0xeac0,0x0000,0x0024,0x0006,0x8301, 738 | 0x4554,0x0800,0x4122,0x0024,0x659a,0x4055,0x0006,0x8341, 739 | 0x4122,0x3400,0xf400,0x4055,0x3210,0x0024,0x3d00,0x0024, 740 | 0x2802,0xf680,0x0000,0x0024,0x6014,0x0024,0x0001,0x0000, 741 | 0x2802,0xf2d5,0x0003,0x8001,0x0008,0x0012,0x0008,0x0010, 742 | 0x0006,0x8153,0x3613,0x0024,0x3009,0x3811,0x2903,0xc680, 743 | 0x0004,0x0011,0x0008,0x0010,0x0001,0x0000,0x291f,0xc6c0, 744 | 0x0005,0x0011,0x000f,0x0011,0x0008,0x0010,0x33d0,0x184c, 745 | 0x6010,0xb844,0x3e10,0x0024,0x0000,0x0400,0x3320,0x4024, 746 | 0x3e00,0x4024,0x3301,0x0024,0x2903,0x3740,0x6408,0x0024, 747 | 0x36e3,0x0024,0x3009,0x1bc4,0x3009,0x1bd1,0x6540,0x0024, 748 | 0x0000,0x0024,0x2802,0xf698,0x4490,0x0024,0x2402,0xf640, 749 | 0x0000,0x0024,0x0006,0x8301,0x4554,0x0840,0x4122,0x0024, 750 | 0x659a,0x4055,0x0006,0x8341,0x4122,0x3400,0xf400,0x4055, 751 | 0x3110,0x0024,0x3d00,0x0024,0xf400,0x4510,0x0030,0x0013, 752 | 0x3073,0x184c,0x3e11,0x008c,0x3009,0x0001,0x6140,0x0024, 753 | 0x0000,0x0201,0x3009,0x2000,0x0006,0x8300,0x290c,0x7300, 754 | 0x3e10,0x0024,0x3300,0x1b8c,0xb010,0x0024,0x0000,0x0024, 755 | 0x2802,0xfc55,0x0000,0x0024,0x3473,0x0024,0x3423,0x0024, 756 | 0x3009,0x1240,0x4080,0x138c,0x0000,0x0804,0x2802,0xdfd5, 757 | 0x6402,0x0024,0x0006,0xd312,0x0006,0xd310,0x0006,0x8191, 758 | 0x3010,0x984c,0x30f0,0xc024,0x0000,0x0021,0xf2d6,0x07c6, 759 | 0x290a,0xf5c0,0x4682,0x0400,0x6894,0x0840,0xb886,0x0bc1, 760 | 0xbcd6,0x0024,0x3a10,0x8024,0x3af0,0xc024,0x36f3,0x4024, 761 | 0x36f3,0xd80e,0x36f4,0x9813,0x36f4,0x1811,0x36f1,0x9807, 762 | 0x36f1,0x1805,0x36f0,0x9803,0x36f0,0x1801,0x3405,0x9014, 763 | 0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000,0x36f2,0x9817, 764 | 0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814, 765 | 0x3615,0x0024,0x0000,0x800a,0x3e10,0x3801,0x0020,0x0001, 766 | 0x3e14,0x3811,0x0030,0x0050,0x0030,0x0251,0x3e04,0xb813, 767 | 0x3000,0x0024,0xc012,0x0024,0x0019,0x9300,0x3800,0x4024, 768 | 0x2900,0xbc00,0x3900,0x0024,0x2903,0x8600,0x0000,0x0300, 769 | 0xb882,0x0024,0x2914,0xbec0,0x0006,0x8010,0x0000,0x1540, 770 | 0x0007,0x8190,0x2900,0x9f80,0x3800,0x0024,0x4080,0x0024, 771 | 0x0000,0x0024,0x2803,0x1015,0x0000,0x0024,0x0006,0x8012, 772 | 0x3200,0x0024,0x4080,0x0024,0x0030,0x0010,0x2803,0x1015, 773 | 0x0000,0x0201,0x3000,0x0024,0xb010,0x0024,0x0000,0x0024, 774 | 0x2803,0x1015,0x0000,0x0024,0x2900,0x9f80,0x0000,0x0024, 775 | 0x4080,0x0024,0x0006,0x8010,0x2803,0x1015,0x3000,0x0024, 776 | 0x4080,0x0024,0x0000,0x0201,0x2803,0x0c45,0x0030,0x0010, 777 | 0x0030,0x0050,0xf292,0x0000,0xb012,0x0024,0x3800,0x4024, 778 | 0x0030,0x0010,0x0000,0x0201,0x3000,0x0024,0xb010,0x0024, 779 | 0x0000,0x0024,0x2900,0xbe95,0x0003,0x19c8,0x0006,0x8011, 780 | 0x3100,0x0024,0x4080,0x0024,0x0000,0x0024,0x2803,0x1805, 781 | 0x0000,0x0024,0x0007,0x8a52,0x3200,0x0024,0x4080,0x0024, 782 | 0x0000,0x0024,0x2803,0x1809,0x0000,0x0024,0xf292,0x0800, 783 | 0x6012,0x0024,0x0000,0x0000,0x2803,0x17c5,0x0000,0x0024, 784 | 0x3200,0x0024,0x4090,0x0024,0xb880,0x2800,0x3900,0x0024, 785 | 0x3100,0x0024,0x4080,0x0024,0x0000,0x0024,0x2902,0x1645, 786 | 0x0003,0x1108,0x2900,0xbe80,0x0000,0x0024,0x0000,0x0010, 787 | 0x0006,0x9f51,0x0006,0x9f92,0x0030,0x0493,0x0000,0x0201, 788 | 0x6890,0xa410,0x3b00,0x2810,0x0006,0x8a10,0x3009,0x0000, 789 | 0x6012,0x0024,0x0006,0x9fd0,0x2803,0x1d48,0xb880,0x0024, 790 | 0x6890,0x0024,0x3009,0x2000,0x36f4,0x9813,0x36f4,0x1811, 791 | 0x36f0,0x1801,0x3405,0x9014,0x36f3,0x0024,0x36f2,0x1815, 792 | 0x2000,0x0000,0x36f2,0x9817,0x3613,0x0024,0x3e10,0xb810, 793 | 0x3e11,0x3805,0x3e02,0x0024,0x0030,0x0010,0xce9a,0x0002, 794 | 0x0000,0x0200,0x2903,0x2880,0xb024,0x0024,0xc020,0x0024, 795 | 0x0000,0x0200,0x2803,0x2145,0x6e9a,0x0002,0x4182,0x0024, 796 | 0x0000,0x0400,0x2803,0x2705,0xae1a,0x0024,0x6104,0x984c, 797 | 0x0000,0x0024,0x2903,0x5749,0x0003,0x26c8,0x6103,0xe4e5, 798 | 0x2903,0x5740,0x408a,0x188c,0x2903,0x5740,0x408a,0x4141, 799 | 0x4583,0x6465,0x2803,0x2700,0xceca,0x1bcc,0xc408,0x0024, 800 | 0xf2e2,0x1bc8,0x36f1,0x1805,0x2000,0x0011,0x36f0,0x9810, 801 | 0x2000,0x0000,0xdc92,0x0024,0x0006,0x8a17,0x3613,0x1c00, 802 | 0x6093,0xe1e3,0x0000,0x03c3,0x0006,0x9f95,0xb132,0x9415, 803 | 0x3500,0xfc01,0x2803,0x3695,0xa306,0x0024,0x0006,0xd397, 804 | 0x003f,0xc001,0x3500,0x184c,0xb011,0xe4e5,0xb182,0x1c04, 805 | 0xd400,0x184c,0x0000,0x0205,0xac52,0x3802,0x0006,0xd3c2, 806 | 0x4212,0x0024,0xf400,0x4057,0xb182,0x1c04,0xd400,0x0024, 807 | 0xac52,0x1404,0xd142,0x0024,0x0000,0x3fc4,0xb142,0x0024, 808 | 0x4122,0x1bc2,0xf400,0x4057,0x3700,0x4024,0xd101,0x6465, 809 | 0x0006,0xd397,0x3f00,0x3814,0x0025,0xffd4,0x0006,0xd317, 810 | 0x3710,0x160c,0x0006,0x9f94,0x37f0,0x73d5,0x6c92,0x3808, 811 | 0x3f10,0x0024,0x3ff0,0x4024,0x3009,0x1040,0x3009,0x13c1, 812 | 0x6010,0x0024,0x0000,0x0024,0x2903,0x8ec5,0x0003,0x3288, 813 | 0x2803,0x34d4,0x0006,0x0001,0x4010,0x0024,0x0005,0xf601, 814 | 0x6010,0x0024,0x0000,0x0040,0x2803,0x3654,0x0030,0x0497, 815 | 0x3f00,0x0024,0x36f2,0x1814,0x4330,0x9803,0x2000,0x0000, 816 | 0x8880,0x1bc1,0x3613,0x0024,0x3e22,0xb806,0x3e05,0xb814, 817 | 0x3615,0x0024,0x0000,0x800a,0x3e10,0x3801,0x3e10,0xb803, 818 | 0x3e11,0x7807,0x6848,0x930c,0x3411,0x780d,0x459a,0x10c0, 819 | 0x0000,0x0201,0x6012,0x384e,0x0000,0x0241,0x2803,0x3dd5, 820 | 0x6012,0x380f,0x2403,0x3d05,0x0000,0x0024,0x3000,0x0001, 821 | 0x3101,0x8407,0x6cfe,0x0024,0xac42,0x0024,0xaf4e,0x2040, 822 | 0x3911,0x8024,0x2803,0x4980,0x0000,0x0024,0x0000,0x0281, 823 | 0x2803,0x4115,0x6012,0x4455,0x2403,0x4045,0x0000,0x0024, 824 | 0x3000,0x0001,0x3101,0x8407,0x4cf2,0x0024,0xac42,0x0024, 825 | 0xaf4e,0x2040,0x3911,0x8024,0x2803,0x4980,0x0000,0x0024, 826 | 0x0000,0x0024,0x2803,0x4555,0x4080,0x0024,0x3110,0x0401, 827 | 0xf20f,0x0203,0x2403,0x4485,0x8dd6,0x0024,0x4dce,0x0024, 828 | 0xf1fe,0x0024,0xaf4e,0x0024,0x6dc6,0x2046,0xf1df,0x0203, 829 | 0xaf4f,0x1011,0xf20e,0x07cc,0x8dd6,0x2486,0x2803,0x4980, 830 | 0x0000,0x0024,0x0000,0x0024,0x2803,0x47d5,0x0000,0x0024, 831 | 0x0fff,0xffd1,0x2403,0x4705,0x3010,0x0001,0xac4f,0x0801, 832 | 0x3821,0x8024,0x2803,0x4980,0x0000,0x0024,0x0fff,0xffd1, 833 | 0x2403,0x4945,0x3010,0x0001,0x3501,0x9407,0xac47,0x0801, 834 | 0xaf4e,0x2082,0x3d11,0x8024,0x36f3,0xc024,0x36f3,0x980d, 835 | 0x36f1,0x5807,0x36f0,0x9803,0x36f0,0x1801,0x3405,0x9014, 836 | 0x36e3,0x0024,0x2000,0x0000,0x36f2,0x9806,0x0006,0x9f97, 837 | 0x3e00,0x5c15,0x0006,0xd397,0x003f,0xc001,0x3500,0x3840, 838 | 0xb011,0xe4e5,0xb182,0x1c04,0xd400,0x184c,0x0000,0x0205, 839 | 0xac52,0x3802,0x0006,0xd3c2,0x4212,0x0024,0xb182,0x4057, 840 | 0x3701,0x0024,0xd400,0x0024,0xac52,0x1404,0xd142,0x0024, 841 | 0x0000,0x3fc4,0xb142,0x0024,0x4122,0x1bc2,0xf400,0x4057, 842 | 0x3700,0x4024,0xd101,0x6465,0x0006,0xd397,0x3f00,0x3814, 843 | 0x0025,0xffd4,0x0006,0xd317,0x3710,0x160c,0x0006,0x9f94, 844 | 0x37f0,0x73d5,0x6c92,0x0024,0x3f10,0x1040,0x3ff0,0x53c1, 845 | 0x6010,0x0024,0x0000,0x0024,0x2803,0x5554,0x0006,0x0001, 846 | 0x4010,0x0024,0x0005,0xf601,0x6010,0x9bd4,0x0000,0x0040, 847 | 0x2803,0x56d4,0x0030,0x0497,0x3f00,0x0024,0x2000,0x0000, 848 | 0x36f0,0x5800,0x3e10,0xb812,0x3e11,0xb810,0x3e12,0x0024, 849 | 0x0006,0x9f92,0x0025,0xffd0,0x3e04,0x4bd1,0x3181,0xf847, 850 | 0xb68c,0x4440,0x3009,0x0802,0x6024,0x3806,0x0006,0x8a10, 851 | 0x2903,0x8ec5,0x0003,0x5948,0x0000,0x0800,0x6101,0x1602, 852 | 0xaf2e,0x0024,0x4214,0x1be3,0xaf0e,0x1811,0x0fff,0xfc00, 853 | 0xb200,0x9bc7,0x0000,0x03c0,0x2803,0x5d85,0xb204,0xa002, 854 | 0x2903,0x4bc0,0x3613,0x2002,0x4680,0x1bc8,0x36f1,0x9810, 855 | 0x2000,0x0000,0x36f0,0x9812,0x0000,0x0400,0x6102,0x0024, 856 | 0x3e11,0x3805,0x2803,0x6189,0x3e02,0x0024,0x2903,0x5740, 857 | 0x408a,0x188c,0x2903,0x5740,0x408a,0x4141,0x4582,0x1bc8, 858 | 0x2000,0x0000,0x36f1,0x1805,0x2903,0x5740,0x4102,0x184c, 859 | 0xb182,0x1bc8,0x2000,0x0000,0x36f1,0x1805,0x3613,0x0024, 860 | 0x3e12,0xb815,0x3e11,0xb807,0x3e13,0xf80e,0x3e03,0x4024, 861 | 0x680c,0x0024,0x0000,0x0024,0x2803,0x66d8,0x409c,0x0024, 862 | 0x2403,0x6686,0x0000,0x000a,0x3111,0xc024,0xfe4e,0x0007, 863 | 0x47be,0x0024,0xf6fe,0x0024,0x3811,0xc024,0x36f3,0x4024, 864 | 0x36f3,0xd80e,0x36f1,0x9807,0x2000,0x0000,0x36f2,0x9815, 865 | 0x3613,0x0024,0x3e12,0xb815,0x3e11,0xb807,0x3e13,0xf80e, 866 | 0x3e03,0x4024,0x680c,0x0024,0x0000,0x0024,0x2803,0x6c18, 867 | 0x409c,0x0024,0x2403,0x6bc6,0x0000,0x000a,0x3111,0xc024, 868 | 0xfe4e,0x8007,0x47be,0x0024,0xf6fe,0x0024,0x3009,0x2047, 869 | 0x36f3,0x4024,0x36f3,0xd80e,0x36f1,0x9807,0x2000,0x0000, 870 | 0x36f2,0x9815,0x2a03,0x6d8e,0x3e12,0xb817,0x3e10,0x3802, 871 | 0x0000,0x800a,0x0006,0x9f97,0x3009,0x1fc2,0x3e04,0x5c00, 872 | 0x6020,0xb810,0x0030,0x0451,0x2803,0x7054,0x0006,0x0002, 873 | 0x4020,0x0024,0x0005,0xfb02,0x6024,0x0024,0x0025,0xffd0, 874 | 0x2803,0x7291,0x3100,0x1c11,0xb284,0x0024,0x0030,0x0490, 875 | 0x3800,0x8024,0x0025,0xffd0,0x3980,0x1810,0x36f4,0x7c11, 876 | 0x36f0,0x1802,0x0030,0x0717,0x3602,0x8024,0x2100,0x0000, 877 | 0x3f05,0xdbd7,0x0006,0xd397,0x2000,0x0000,0x3700,0x0024, 878 | 0xb183,0xe1e3,0x0000,0x0203,0xac32,0x40d5,0xd122,0x0024, 879 | 0x0000,0x3fc3,0xb132,0x0024,0x0006,0xd3c3,0x4316,0x0024, 880 | 0xf400,0x40d5,0x3500,0x5803,0x2000,0x0000,0xd010,0x1bc1, 881 | 0x3613,0x0024,0x3e22,0xb815,0x3e05,0xb814,0x3615,0x0024, 882 | 0x0000,0x800a,0x3e10,0x3801,0x3e10,0xb803,0xb884,0xb805, 883 | 0xb888,0x3844,0x3e11,0xb80d,0x3e03,0xf80e,0x0000,0x03ce, 884 | 0xf400,0x4083,0x2403,0x808e,0xf400,0x4105,0x0000,0x0206, 885 | 0xa562,0x0024,0x455a,0x0024,0x0020,0x0006,0xd312,0x0024, 886 | 0xb16c,0x0024,0x0020,0x0006,0x2803,0x7f05,0xd342,0x0024, 887 | 0x0000,0x01c6,0xd342,0x0024,0xd56a,0x0024,0x0020,0x0006, 888 | 0x4448,0x0024,0xb16c,0x0024,0x0020,0x0146,0x2803,0x8085, 889 | 0x0000,0x0024,0xd468,0x0024,0x4336,0x0024,0x0000,0x4000, 890 | 0x0006,0xd3c1,0x0006,0x9306,0x4122,0x0024,0x462c,0x4055, 891 | 0x4092,0x3404,0xb512,0x4195,0x6294,0x3401,0x6200,0x0024, 892 | 0x0000,0x03ce,0x2803,0x7b11,0xb888,0x0024,0x36f3,0xd80e, 893 | 0x36f1,0x980d,0x36f1,0x1805,0x36f0,0x9803,0x36f0,0x1801, 894 | 0x3405,0x9014,0x36e3,0x0024,0x2000,0x0000,0x36f2,0x9815, 895 | 0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814, 896 | 0x3615,0x0024,0x0000,0x800a,0x3e10,0x3801,0xb880,0xb810, 897 | 0x0006,0x9fd0,0x3e10,0x8001,0x4182,0x3811,0x0006,0xd311, 898 | 0x2803,0x89c5,0x0006,0x8a10,0x0000,0x0200,0xbc82,0xa000, 899 | 0x3910,0x0024,0x2903,0x7800,0x39f0,0x4024,0x0006,0x9f90, 900 | 0x0006,0x9f51,0x3009,0x0000,0x3009,0x0401,0x6014,0x0024, 901 | 0x0000,0x0024,0x2903,0x8ec5,0x0003,0x8ac8,0x36f4,0x4024, 902 | 0x36f0,0x9810,0x36f0,0x1801,0x3405,0x9014,0x36f3,0x0024, 903 | 0x36f2,0x1815,0x2000,0x0000,0x36f2,0x9817,0x3613,0x0024, 904 | 0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814,0x290a,0xd900, 905 | 0x3605,0x0024,0x2910,0x0180,0x3613,0x0024,0x3405,0x9014, 906 | 0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000,0x36f2,0x9817, 907 | 0x3613,0x0024,0x3e12,0xb817,0x3e12,0x3815,0x3e05,0xb814, 908 | 0x3615,0x0024,0x0000,0x800a,0x3e10,0xb803,0x0006,0x0002, 909 | 0x3e11,0x3805,0x3e11,0xb807,0x3e14,0x3811,0x0006,0x9f90, 910 | 0x3e04,0xb813,0x3009,0x0012,0x3213,0x0024,0xf400,0x4480, 911 | 0x6026,0x0024,0x0000,0x0024,0x2803,0x9755,0x0000,0x0024, 912 | 0x0000,0x0012,0xf400,0x4480,0x0006,0x9f50,0x3009,0x0002, 913 | 0x6026,0x0024,0x0000,0x0024,0x2903,0x8ec5,0x0003,0x9748, 914 | 0x0006,0x9f93,0x3201,0x0c11,0xb58a,0x0406,0x0006,0x8a11, 915 | 0x468e,0x8400,0xb68c,0x9813,0xcfee,0x1bd2,0x0000,0x0804, 916 | 0xaf0e,0x9811,0x4f86,0x1bd0,0x0000,0x0021,0x6418,0x9807, 917 | 0x6848,0x1bc6,0xad46,0x9805,0xf400,0x4080,0x36f1,0x0024, 918 | 0x36f0,0x9803,0x3405,0x9014,0x36f3,0x0024,0x36f2,0x1815, 919 | 0x2000,0x0000,0x36f2,0x9817,0x3613,0x0024,0x3e12,0xb817, 920 | 0x3e12,0x3815,0x3e05,0xb814,0x3615,0x0024,0x0000,0x800a, 921 | 0x3e10,0x3801,0x3e10,0xb803,0x3e11,0x3805,0x2803,0xa580, 922 | 0x3e04,0x3811,0x0000,0x0401,0x2903,0x5740,0x3613,0x0024, 923 | 0x0000,0x0080,0xb882,0x130c,0xf400,0x4510,0x3010,0x910c, 924 | 0x30f0,0xc024,0x6dc2,0x0024,0x3810,0x0024,0x38f0,0x4024, 925 | 0x0000,0x0201,0x3100,0x0024,0xb010,0x0024,0x0000,0x0024, 926 | 0x2803,0xa8d5,0x0000,0x0024,0x6894,0x130c,0xb886,0x1040, 927 | 0x3430,0x4024,0x6dca,0x0024,0x0030,0x0011,0x2803,0xa151, 928 | 0x0000,0x0024,0xbcd2,0x0024,0x0000,0x0201,0x2803,0xa8c5, 929 | 0x0000,0x0024,0x2903,0x5740,0x3613,0x0024,0x36f4,0x1811, 930 | 0x36f1,0x1805,0x36f0,0x9803,0x36f0,0x1801,0x3405,0x9014, 931 | 0x36f3,0x0024,0x36f2,0x1815,0x2000,0x0000,0x36f2,0x9817, 932 | 0x3613,0x0024,0x3e12,0xb815,0x0000,0x800a,0x3e14,0x7813, 933 | 0x3e10,0xb803,0x3e11,0x3805,0x3e11,0xb807,0x3e13,0xf80e, 934 | 0x6812,0x0024,0x3e03,0x7810,0x0fff,0xffd3,0x0000,0x0091, 935 | 0xbd86,0x9850,0x3e10,0x3804,0x3e00,0x7812,0xbe8a,0x8bcc, 936 | 0x409e,0x8086,0x2403,0xb007,0xfe49,0x2821,0x526a,0x8801, 937 | 0x5c87,0x280e,0x4eba,0x9812,0x4286,0x40e1,0xb284,0x1bc1, 938 | 0x4de6,0x0024,0xad17,0x2627,0x4fde,0x9804,0x4498,0x1bc0, 939 | 0x0000,0x0024,0x2803,0xae15,0x3a11,0xa807,0x36f3,0x4024, 940 | 0x36f3,0xd80e,0x36f1,0x9807,0x36f1,0x1805,0x36f0,0x9803, 941 | 0x36f4,0x5813,0x2000,0x0000,0x36f2,0x9815,0x3613,0x0024, 942 | 0x3e12,0xb815,0x0000,0x800a,0x3e10,0xb803,0x3e11,0x3805, 943 | 0x3e11,0xb807,0x3e13,0xf80e,0x6812,0x0024,0x3e03,0x7810, 944 | 0x3009,0x1850,0x3e10,0x3804,0x3e10,0x7812,0x32f3,0x0024, 945 | 0xbd86,0x0024,0x4091,0xe2e3,0x3009,0x0046,0x2403,0xbb80, 946 | 0x3009,0x0047,0x32f0,0x0801,0xfe1f,0x6465,0x5e8a,0x0024, 947 | 0x44ba,0x0024,0xfee2,0x0024,0x5d8a,0x1800,0x4482,0x4160, 948 | 0x48ba,0x8046,0x4dc6,0x1822,0x4de6,0x8047,0x36f3,0x0024, 949 | 0x36f0,0x5812,0xad17,0x2627,0x4fde,0x9804,0x4498,0x1bc0, 950 | 0x0000,0x0024,0x2803,0xb715,0x3a11,0xa807,0x36f3,0x4024, 951 | 0x36f3,0xd80e,0x36f1,0x9807,0x36f1,0x1805,0x36f0,0x9803, 952 | 0x2000,0x0000,0x36f2,0x9815,0xb386,0x40d7,0x4284,0x184c, 953 | 0x0000,0x05c0,0x2803,0xc115,0xf5d8,0x3804,0x0000,0x0984, 954 | 0x6400,0xb84a,0x3e13,0xf80d,0xa204,0x380e,0x0000,0x800a, 955 | 0x0000,0x00ce,0x2403,0xc44e,0xffa4,0x0024,0x48b6,0x0024, 956 | 0x0000,0x0024,0x2803,0xc444,0x4000,0x40c2,0x4224,0x0024, 957 | 0x6090,0x0024,0xffa4,0x0024,0x0fff,0xfe83,0xfe86,0x1bce, 958 | 0x36f3,0xd80d,0x48b6,0x0024,0x0fff,0xff03,0xa230,0x45c3, 959 | 0x2000,0x0000,0x36f1,0x180a,0x4080,0x184c,0x3e13,0x780f, 960 | 0x2803,0xc885,0x4090,0xb80e,0x2403,0xc800,0x3e04,0x0440, 961 | 0x3810,0x0440,0x3604,0x0024,0x3009,0x1bce,0x3603,0x5bcf, 962 | 0x2000,0x0000,0x0000,0x0024, 963 | 0x0007,0x0001, /*copy 1*/ 964 | 0x802e, 965 | 0x0006,0x0002, /*copy 2*/ 966 | 0x2801,0x6ac0, 967 | 0x0007,0x0001, /*copy 1*/ 968 | 0x8030, 969 | 0x0006,0x0002, /*copy 2*/ 970 | 0x2800,0x1b40, 971 | 0x0007,0x0001, /*copy 1*/ 972 | 0x8028, 973 | 0x0006,0x0002, /*copy 2*/ 974 | 0x2a00,0x144e, 975 | 0x0007,0x0001, /*copy 1*/ 976 | 0x8032, 977 | 0x0006,0x0002, /*copy 2*/ 978 | 0x2800,0x5980, 979 | 0x0007,0x0001, /*copy 1*/ 980 | 0x3580, 981 | 0x0006, 0x8038, 0x0000, /*Rle(56)*/ 982 | 0x0007,0x0001, /*copy 1*/ 983 | 0xfab3, 984 | 0x0006,0x01a4, /*copy 420*/ 985 | 0x0001,0x0001,0x0001,0x0001,0x0000,0xffff,0xfffe,0xfffb, 986 | 0xfff9,0xfff5,0xfff2,0xffed,0xffe8,0xffe3,0xffde,0xffd8, 987 | 0xffd3,0xffce,0xffca,0xffc7,0xffc4,0xffc4,0xffc5,0xffc7, 988 | 0xffcc,0xffd3,0xffdc,0xffe6,0xfff3,0x0001,0x0010,0x001f, 989 | 0x002f,0x003f,0x004e,0x005b,0x0066,0x006f,0x0074,0x0075, 990 | 0x0072,0x006b,0x005f,0x004f,0x003c,0x0024,0x0009,0xffed, 991 | 0xffcf,0xffb0,0xff93,0xff77,0xff5f,0xff4c,0xff3d,0xff35, 992 | 0xff34,0xff3b,0xff4a,0xff60,0xff7e,0xffa2,0xffcd,0xfffc, 993 | 0x002e,0x0061,0x0094,0x00c4,0x00f0,0x0114,0x0131,0x0144, 994 | 0x014b,0x0146,0x0134,0x0116,0x00eb,0x00b5,0x0075,0x002c, 995 | 0xffde,0xff8e,0xff3d,0xfeef,0xfea8,0xfe6a,0xfe39,0xfe16, 996 | 0xfe05,0xfe06,0xfe1b,0xfe43,0xfe7f,0xfecd,0xff2a,0xff95, 997 | 0x0009,0x0082,0x00fd,0x0173,0x01e1,0x0242,0x0292,0x02cc, 998 | 0x02ec,0x02f2,0x02da,0x02a5,0x0253,0x01e7,0x0162,0x00c9, 999 | 0x0021,0xff70,0xfebc,0xfe0c,0xfd68,0xfcd5,0xfc5b,0xfc00, 1000 | 0xfbc9,0xfbb8,0xfbd2,0xfc16,0xfc85,0xfd1b,0xfdd6,0xfeae, 1001 | 0xff9e,0x009c,0x01a0,0x02a1,0x0392,0x046c,0x0523,0x05b0, 1002 | 0x060a,0x062c,0x0613,0x05bb,0x0526,0x0456,0x0351,0x021f, 1003 | 0x00c9,0xff5a,0xfde1,0xfc6a,0xfb05,0xf9c0,0xf8aa,0xf7d0, 1004 | 0xf73d,0xf6fa,0xf70f,0xf77e,0xf848,0xf96b,0xfadf,0xfc9a, 1005 | 0xfe8f,0x00ad,0x02e3,0x051a,0x073f,0x0939,0x0af4,0x0c5a, 1006 | 0x0d59,0x0de1,0x0de5,0x0d5c,0x0c44,0x0a9e,0x0870,0x05c7, 1007 | 0x02b4,0xff4e,0xfbaf,0xf7f8,0xf449,0xf0c7,0xed98,0xeae0, 1008 | 0xe8c4,0xe765,0xe6e3,0xe756,0xe8d2,0xeb67,0xef19,0xf3e9, 1009 | 0xf9cd,0x00b5,0x088a,0x112b,0x1a72,0x2435,0x2e42,0x3866, 1010 | 0x426b,0x4c1b,0x553e,0x5da2,0x6516,0x6b6f,0x7087,0x7441, 1011 | 0x7686,0x774a,0x7686,0x7441,0x7087,0x6b6f,0x6516,0x5da2, 1012 | 0x553e,0x4c1b,0x426b,0x3866,0x2e42,0x2435,0x1a72,0x112b, 1013 | 0x088a,0x00b5,0xf9cd,0xf3e9,0xef19,0xeb67,0xe8d2,0xe756, 1014 | 0xe6e3,0xe765,0xe8c4,0xeae0,0xed98,0xf0c7,0xf449,0xf7f8, 1015 | 0xfbaf,0xff4e,0x02b4,0x05c7,0x0870,0x0a9e,0x0c44,0x0d5c, 1016 | 0x0de5,0x0de1,0x0d59,0x0c5a,0x0af4,0x0939,0x073f,0x051a, 1017 | 0x02e3,0x00ad,0xfe8f,0xfc9a,0xfadf,0xf96b,0xf848,0xf77e, 1018 | 0xf70f,0xf6fa,0xf73d,0xf7d0,0xf8aa,0xf9c0,0xfb05,0xfc6a, 1019 | 0xfde1,0xff5a,0x00c9,0x021f,0x0351,0x0456,0x0526,0x05bb, 1020 | 0x0613,0x062c,0x060a,0x05b0,0x0523,0x046c,0x0392,0x02a1, 1021 | 0x01a0,0x009c,0xff9e,0xfeae,0xfdd6,0xfd1b,0xfc85,0xfc16, 1022 | 0xfbd2,0xfbb8,0xfbc9,0xfc00,0xfc5b,0xfcd5,0xfd68,0xfe0c, 1023 | 0xfebc,0xff70,0x0021,0x00c9,0x0162,0x01e7,0x0253,0x02a5, 1024 | 0x02da,0x02f2,0x02ec,0x02cc,0x0292,0x0242,0x01e1,0x0173, 1025 | 0x00fd,0x0082,0x0009,0xff95,0xff2a,0xfecd,0xfe7f,0xfe43, 1026 | 0xfe1b,0xfe06,0xfe05,0xfe16,0xfe39,0xfe6a,0xfea8,0xfeef, 1027 | 0xff3d,0xff8e,0xffde,0x002c,0x0075,0x00b5,0x00eb,0x0116, 1028 | 0x0134,0x0146,0x014b,0x0144,0x0131,0x0114,0x00f0,0x00c4, 1029 | 0x0094,0x0061,0x002e,0xfffc,0xffcd,0xffa2,0xff7e,0xff60, 1030 | 0xff4a,0xff3b,0xff34,0xff35,0xff3d,0xff4c,0xff5f,0xff77, 1031 | 0xff93,0xffb0,0xffcf,0xffed,0x0009,0x0024,0x003c,0x004f, 1032 | 0x005f,0x006b,0x0072,0x0075,0x0074,0x006f,0x0066,0x005b, 1033 | 0x004e,0x003f,0x002f,0x001f,0x0010,0x0001,0xfff3,0xffe6, 1034 | 0xffdc,0xffd3,0xffcc,0xffc7,0xffc5,0xffc4,0xffc4,0xffc7, 1035 | 0xffca,0xffce,0xffd3,0xffd8,0xffde,0xffe3,0xffe8,0xffed, 1036 | 0xfff2,0xfff5,0xfff9,0xfffb,0xfffe,0xffff,0x0000,0x0001, 1037 | 0x0001,0x0001,0x0001,0x0000, 1038 | 0x0007,0x0001, /*copy 1*/ 1039 | 0x180b, 1040 | 0x0006,0x000d, /*copy 13*/ 1041 | 0x000f,0x0010,0x001c,0xfab3,0x3580,0x8037,0xa037,0x0001, 1042 | 0x0000,0x3580,0x01a4,0x06ab,0x06c9, 1043 | 0x0006, 0x8006, 0x0711, /*Rle(6)*/ 1044 | 0x0006,0x0027, /*copy 39*/ 1045 | 0x06e6,0x06e6,0x06e6,0x06e6,0x06e6,0x0915,0x08f9,0x08fd, 1046 | 0x0901,0x0905,0x0909,0x090d,0x0911,0x0944,0x0948,0x094b, 1047 | 0x094b,0x094b,0x094b,0x0953,0x0966,0x0a31,0x099d,0x09a2, 1048 | 0x09a8,0x09ae,0x09b3,0x09b8,0x09bd,0x09c2,0x09c7,0x09cc, 1049 | 0x09d1,0x09d6,0x09ef,0x0a0e,0x0a2d,0x5a82,0x5a82, 1050 | 0x0006, 0x8006, 0x0000, /*Rle(6)*/ 1051 | 0x0006,0x0018, /*copy 24*/ 1052 | 0x6fb8,0xc180,0xc180,0x6fb8,0x0000,0x0000,0x0000,0x0000, 1053 | 0x5a82,0x5a82,0x6fb8,0xc180,0xc180,0x6fb8,0x0000,0x0000, 1054 | 0x5a82,0x5a82,0x5a82,0x5a82,0x6fb8,0xc180,0xc180,0x6fb8, 1055 | 0x0007,0x0001, /*copy 1*/ 1056 | 0x5800, 1057 | 0x0006,0x0001, /*copy 1*/ 1058 | 0x0001, 1059 | 0x0006, 0x8007, 0x0000, /*Rle(7)*/ 1060 | 0x0006,0x0018, /*copy 24*/ 1061 | 0x0002,0x0000,0xffff,0xffff,0x0000,0x0000,0x0000,0x0000, 1062 | 0x0003,0x0000,0xfffd,0xffff,0x0001,0x0000,0x0000,0x0000, 1063 | 0x0004,0x0000,0xfffa,0xffff,0x0004,0x0000,0xffff,0xffff, 1064 | 0x000a,0x0001, /*copy 1*/ 1065 | 0x0050, 1066 | #define PLUGIN_SIZE 8195 1067 | #ifndef SKIP_PLUGIN_VARNAME 1068 | }; 1069 | #endif -------------------------------------------------------------------------------- /slimproto.cpp: -------------------------------------------------------------------------------- 1 | #include "slimproto.h" 2 | 3 | //#define ADAFRUIT_VS1053 4 | 5 | // Default volume 6 | #define VOLUME 80 7 | 8 | 9 | #ifdef I2S_DAC_MODULE 10 | // Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc. 11 | void MDCallback(void *cbData, const char *type, bool isUnicode, const char *string) 12 | { 13 | const char *ptr = reinterpret_cast(cbData); 14 | (void) isUnicode; // Punt this ball for now 15 | // Note that the type and string may be in PROGMEM, so copy them to RAM for printf 16 | char s1[32], s2[64]; 17 | strncpy_P(s1, type, sizeof(s1)); 18 | s1[sizeof(s1)-1]=0; 19 | strncpy_P(s2, string, sizeof(s2)); 20 | s2[sizeof(s2)-1]=0; 21 | Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2); 22 | Serial.flush(); 23 | } 24 | 25 | // Called when there's a warning or error (like a buffer underflow or decode hiccup) 26 | void StatusCallback(void *cbData, int code, const char *string) 27 | { 28 | const char *ptr = reinterpret_cast(cbData); 29 | // Note that the string may be in PROGMEM, so copy it to RAM for printf 30 | char s1[64]; 31 | strncpy_P(s1, string, sizeof(s1)); 32 | s1[sizeof(s1)-1]=0; 33 | Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1); 34 | Serial.flush(); 35 | } 36 | 37 | #endif //I2S_DAC_MODULE 38 | 39 | 40 | 41 | responseBase::responseBase(WiFiClient * pClient) 42 | { 43 | vcClient = pClient; 44 | } 45 | 46 | responseBase::~responseBase() 47 | { 48 | 49 | } 50 | 51 | 52 | /* 53 | void responseBase::sendResponse() 54 | { 55 | vcResponse.sizeResponse = sizeof(vcResponse); 56 | vcClient->write((char*) &vcResponse, sizeof(vcResponse)); 57 | } 58 | */ 59 | 60 | 61 | reponseHelo::reponseHelo(WiFiClient * pClient) : responseBase(pClient) 62 | { 63 | } 64 | 65 | void reponseHelo::sendResponse() 66 | { 67 | vcResponse.sizeResponse = __builtin_bswap32(sizeof(vcResponse) - 8); // N'inclus pas la commande ni la taille. 68 | vcClient->write((char*) &vcResponse, sizeof(vcResponse)); 69 | } 70 | 71 | 72 | 73 | reponseSTAT::reponseSTAT(WiFiClient * pClient) : responseBase(pClient) 74 | { 75 | // Clear the reponse struct 76 | memset((void *) &vcResponse,'\0', sizeof(vcResponse)); 77 | } 78 | 79 | void reponseSTAT::sendResponse() 80 | { 81 | // Type of response -> STAT 82 | memcpy((void *) vcResponse.opcode, "STAT", 4); 83 | 84 | vcResponse.sizeResponse = __builtin_bswap32(sizeof(vcResponse) - 8); // N'inclus pas la commande ni la taille. 85 | vcClient->write((char*) &vcResponse, sizeof(vcResponse)); 86 | } 87 | 88 | /** 89 | * Constructor for VS1053 version 90 | **/ 91 | 92 | #ifdef VS1053_MODULE 93 | #ifdef ADAFRUIT_VS1053 94 | slimproto::slimproto(String pAdrLMS, WiFiClient pClient, Adafruit_VS1053 * pPlayer) 95 | #else 96 | slimproto::slimproto(String pAdrLMS, WiFiClient * pClient, VS1053 * pPlayer) 97 | #endif 98 | { 99 | vcCommandSize = 0; 100 | 101 | vcPlayerStat = StopStatus; /* 0 = stop , 1 = play , 2 = pause */ 102 | 103 | 104 | u32_t viFreeMem = system_get_free_heap_size(); 105 | 106 | Serial.print("Free Memory for RingBuffer : "), Serial.print(viFreeMem), Serial.println(" bytes"); 107 | 108 | // Initialize the ringbuffer for audio 109 | //vcRingBuffer = new stRingBuffer(RINGBFSIZ > viFreeMem ? viFreeMem-5000 : RINGBFSIZ); // if not enought memory for the ringbuffer use free memory minus 5ko 110 | vcRingBuffer = new stRingBuffer(RINGBFSIZ); // if not enought memory for the ringbuffer use free memory minus 5ko 111 | vcAdrLMS = pAdrLMS; 112 | 113 | vcClient = pClient; 114 | vcplayer = pPlayer; 115 | 116 | LastStatMsg = millis(); 117 | TimeCounter = millis(); 118 | 119 | EndTimeCurrentSong = StartTimeCurrentSong = 0; 120 | 121 | } 122 | 123 | #else 124 | 125 | /** 126 | * Constructor for DAC version 127 | **/ 128 | slimproto::slimproto(String pAdrLMS, WiFiClient * pClient) 129 | { 130 | vcDacAudioGen = 0; 131 | vcDacFile = 0; 132 | vcDacBuff = 0; 133 | vcDacOut = 0; 134 | vcAdrLMS = pAdrLMS; 135 | 136 | vcCommandSize = 0; 137 | 138 | vcPlayerStat = StopStatus; /* 0 = stop , 1 = play , 2 = pause */ 139 | 140 | vcClient = pClient; 141 | 142 | LastStatMsg = millis(); 143 | TimeCounter = millis(); 144 | EndTimeCurrentSong = StartTimeCurrentSong = 0; 145 | } 146 | 147 | #endif //VS1053_MODULE 148 | 149 | slimproto::~slimproto() 150 | { 151 | if(vcRingBuffer) delete vcRingBuffer, vcRingBuffer = 0; 152 | 153 | #ifdef I2S_DAC_MODULE 154 | if(vcDacAudioGen) delete vcDacAudioGen, vcDacAudioGen = 0; 155 | if(vcDacFile) delete vcDacFile, vcDacFile = 0; 156 | if(vcDacBuff) delete vcDacBuff, vcDacBuff = 0; 157 | if(vcDacOut) delete vcDacOut,vcDacOut = 0; 158 | #endif 159 | } 160 | 161 | int slimproto::HandleMessages() 162 | { 163 | uint8_t viBuffer; 164 | int viSizeRead; 165 | 166 | if(vcClient->connected()) 167 | { 168 | if(vcCommandSize == 0 && vcClient->available() >= 2) 169 | { 170 | uint8_t viExtractSize[2]; 171 | 172 | vcClient->read(viExtractSize,2); 173 | 174 | // Convert string size into integer 175 | vcCommandSize = (viExtractSize[0] << 8) | viExtractSize[1]; 176 | 177 | if(vcCommandSize != 172) 178 | Serial.print("Expected command size : "), Serial.println(vcCommandSize); 179 | } 180 | 181 | 182 | if(vcCommandSize > 250) 183 | { 184 | uint8_t availableSize = vcClient->available(); 185 | 186 | Serial.println("Expected command size to big ??!!??"); 187 | Serial.print("Available size : "),Serial.println(availableSize); 188 | uint8_t viExtractCommand[availableSize]; 189 | viSizeRead = vcClient->read(viExtractCommand,availableSize); 190 | PrintByteArray(viExtractCommand,viSizeRead ); 191 | vcCommandSize = 0; 192 | } 193 | 194 | 195 | if(vcCommandSize && vcClient->available() >= vcCommandSize) 196 | { 197 | uint8_t viExtractCommand[vcCommandSize]; 198 | 199 | viSizeRead = vcClient->read(viExtractCommand,vcCommandSize); 200 | 201 | if(viSizeRead != vcCommandSize) 202 | { 203 | Serial.println("Not enought data as expected !!!"); 204 | } 205 | 206 | if(vcCommandSize != 172) 207 | PrintByteArray(viExtractCommand,viSizeRead); 208 | 209 | HandleCommand(viExtractCommand,viSizeRead); 210 | vcCommandSize = 0; 211 | } 212 | } 213 | 214 | // Send Stat Message if last one is more than 60 seconds 215 | if(millis() - LastStatMsg >= ( 60 * 1000)) 216 | { 217 | Serial.println("No Stat request from 60 seconds, Is there any probem ?"); 218 | 219 | //reponseSTAT viResponse(vcClient); 220 | //viResponse.vcResponse.elapsed_seconds = 0; 221 | //viResponse.sendResponse(); 222 | //LastStatMsg = millis(); 223 | return false; 224 | } 225 | 226 | return true; 227 | } 228 | 229 | 230 | 231 | #ifdef VS1053_MODULE 232 | 233 | int slimproto::HandleAudio() // Handle audio in vs1053 mode 234 | { 235 | // Lire des données du stream et les envoyer dans le vs1053 236 | uint32_t viRead; 237 | __attribute__((aligned(4))) uint8_t buf[32] ; // Buffer for chunk 238 | 239 | if(vcStreamClient.connected()) 240 | { 241 | viRead = vcStreamClient.available() ; 242 | 243 | while (vcRingBuffer->isFreeSpace() && viRead-- ) 244 | { 245 | vcRingBuffer->putData(vcStreamClient.read()) ; // Yes, store one byte in ringbuffer 246 | yield() ; 247 | } 248 | 249 | if(millis() - TimeCounter >= ( 5 * 1000)) 250 | { 251 | TimeCounter = millis(); 252 | Serial.print("Audio : RingBuffer Size : "); 253 | Serial.print(vcRingBuffer->dataSize()); 254 | Serial.print(" / "); 255 | Serial.println(vcRingBuffer->getBufferSize()); 256 | } 257 | } 258 | else 259 | { 260 | // End of stream 261 | 262 | if(vcPlayerStat == PlayStatus) 263 | { 264 | vcPlayerStat = PauseStatus; /* 0 = stop , 1 = play , 2 = pause */ 265 | 266 | EndTimeCurrentSong = millis(); 267 | 268 | // Stream buffer empty 269 | reponseSTAT viResponse(vcClient); 270 | memcpy((void *) viResponse.vcResponse.event, "STMd", 4); 271 | viResponse.vcResponse.bytes_received_L = ByteReceivedCurrentSong; 272 | 273 | viResponse.vcResponse.elapsed_seconds = (EndTimeCurrentSong - StartTimeCurrentSong)/ 1000; 274 | viResponse.sendResponse(); 275 | 276 | reponseSTAT viResponseU(vcClient); 277 | memcpy((void *) viResponseU.vcResponse.event, "STMu", 4); 278 | viResponseU.vcResponse.bytes_received_L = ByteReceivedCurrentSong; 279 | 280 | viResponseU.vcResponse.elapsed_seconds = (EndTimeCurrentSong - StartTimeCurrentSong)/ 1000; 281 | viResponseU.sendResponse(); 282 | } 283 | 284 | if(millis() - TimeCounter >= ( 5 * 1000)) 285 | { 286 | TimeCounter = millis(); 287 | Serial.println("Audio : Streaming not connected"); 288 | } 289 | } 290 | 291 | /* 292 | if(vcStreamClient.connected()) 293 | { 294 | if(vcplayer->readyForData()) 295 | Serial.println("VS1053 ready for data"); 296 | } 297 | */ 298 | // Send data to the vs1053 if available 299 | #ifdef ADAFRUIT_VS1053 300 | while(vcplayer->readyForData() && vcRingBuffer->dataSize()> 0) // Try to keep VS1053 filled 301 | #else 302 | while(vcplayer->data_request() && vcRingBuffer->dataSize()> 0) // Try to keep VS1053 filled 303 | #endif 304 | { 305 | int viByteRetrieve = 0; 306 | 307 | // Get Max 32 byte of data from the RingBuffer 308 | while(vcRingBuffer->dataSize() && viByteRetrieve < 32 ) 309 | { 310 | buf[viByteRetrieve++] = vcRingBuffer->getData(); 311 | } 312 | 313 | ByteReceivedCurrentSong += viByteRetrieve; 314 | 315 | #ifdef ADAFRUIT_VS1053 316 | vcplayer->playData (buf, viByteRetrieve) ; 317 | #else 318 | vcplayer->playChunk (buf, viByteRetrieve) ; 319 | #endif 320 | 321 | yield() ; 322 | } 323 | } 324 | #else // Handle Audio in DAC mode 325 | int slimproto::HandleAudio() 326 | { 327 | if(vcDacAudioGen && vcPlayerStat != PauseStatus) 328 | if(vcDacAudioGen->isRunning()){ 329 | if(!vcDacAudioGen->loop()) vcDacAudioGen->stop(); 330 | } 331 | } 332 | 333 | #endif // VS1053_MODULE 334 | /** 335 | * Stop command 336 | */ 337 | 338 | void slimproto::HandleStrmQCmd(byte pCommand [], int pSize) 339 | { 340 | #ifdef VS1053_MODULE 341 | #ifndef ADAFRUIT_VS1053 342 | vcplayer->stopSong(); 343 | #endif 344 | #else 345 | if(vcDacAudioGen) 346 | vcDacAudioGen->stop(); 347 | 348 | if(vcDacAudioGen) delete vcDacAudioGen, vcDacAudioGen = 0; 349 | if(vcDacOut) delete vcDacOut, vcDacOut = 0; 350 | if(vcDacBuff) delete vcDacBuff, vcDacBuff = 0; 351 | if(vcDacFile) delete vcDacFile, vcDacFile = 0; 352 | 353 | #endif //VS1053_MODULE 354 | 355 | reponseSTAT * viResponse = 0; 356 | 357 | vcPlayerStat = StopStatus; 358 | EndTimeCurrentSong = millis(); 359 | 360 | viResponse = new reponseSTAT(vcClient); 361 | memcpy((void *) viResponse->vcResponse.event, "STMf", 4); 362 | 363 | viResponse->vcResponse.elapsed_seconds = 0; 364 | 365 | // Send stop confirm 366 | viResponse->sendResponse(); 367 | } 368 | 369 | /** 370 | * Status command 371 | * 372 | */ 373 | void slimproto::HandleStrmTCmd(byte pCommand [], int pSize) 374 | { 375 | StrmStruct strmInfo; 376 | memcpy(&strmInfo, pCommand+4, sizeof(strmInfo)); 377 | 378 | 379 | reponseSTAT viResponse(vcClient); 380 | memcpy((void *) viResponse.vcResponse.event, "STMt", 4); 381 | viResponse.vcResponse.bytes_received_L = ByteReceivedCurrentSong; 382 | 383 | viResponse.vcResponse.server_timestamp = strmInfo.replay_gain; 384 | 385 | 386 | 387 | // If current stat is 'stop' send 0 as elapsed time 388 | if(vcPlayerStat == StopStatus) 389 | viResponse.vcResponse.elapsed_seconds = 0; 390 | 391 | // else elapsed time of the current song 392 | else 393 | viResponse.vcResponse.elapsed_seconds = (millis() - StartTimeCurrentSong)/ 1000; 394 | 395 | 396 | viResponse.sendResponse(); 397 | LastStatMsg = millis(); 398 | 399 | //debug 400 | PrintByteArray((byte *)&viResponse.vcResponse, sizeof(viResponse.vcResponse)); 401 | 402 | //vcClient->write(staT, sizeof(staT)); 403 | } 404 | 405 | 406 | /** 407 | * Handle start command 408 | */ 409 | 410 | void slimproto::HandleStrmSCmd(byte pCommand [], int pSize) 411 | { 412 | char viUrl[pSize +100]; 413 | char viUrl2[pSize +100]; 414 | byte viTmpUrl[pSize +100]; 415 | 416 | 417 | memset(viUrl,0,sizeof(viUrl)); 418 | memset(viUrl2,0,sizeof(viUrl2)); 419 | memset(viTmpUrl,0,sizeof(viTmpUrl)); 420 | 421 | 422 | StrmStruct strmInfo; 423 | memcpy(&strmInfo, pCommand+4, sizeof(strmInfo)); 424 | 425 | // Format MP3 426 | if(strmInfo.formatbyte == 'm') 427 | { 428 | Serial.println("Format MP3"); 429 | 430 | #ifdef I2S_DAC_MODULE 431 | vcDacAudioGen = new AudioGeneratorMP3(); 432 | vcDacAudioGen->RegisterStatusCB(StatusCallback, (void*)"mp3"); 433 | #endif //I2S_DAC_MODULE 434 | 435 | } 436 | // Format FLAC 437 | else if(strmInfo.formatbyte == 'f') 438 | { 439 | Serial.println("Format flac"); 440 | 441 | #ifdef I2S_DAC_MODULE 442 | vcDacAudioGen = new AudioGeneratorFLAC(); 443 | vcDacAudioGen->RegisterStatusCB(StatusCallback, (void*)"flac"); 444 | #endif //I2S_DAC_MODULE 445 | 446 | } 447 | else if(strmInfo.formatbyte == '0') 448 | { 449 | Serial.println("Format ogg"); 450 | #ifdef I2S_DAC_MODULE 451 | Serial.println("Ogg format not supported in DAC mode"); 452 | return; 453 | #endif //I2S_DAC_MODULE 454 | } 455 | 456 | 457 | ByteArrayCpy(viTmpUrl,pCommand+sizeof(strmInfo)+4 , pSize-sizeof(strmInfo)-4); 458 | if(strmInfo.server_ip[0] == 0) 459 | { 460 | #ifdef VS1053_MODULE 461 | vcAdrLMS.toCharArray(viUrl, pSize); 462 | #else 463 | vcAdrLMS.toCharArray(viUrl2, pSize); 464 | sprintf(viUrl,"http://%s:9000/%s",viUrl2,"stream.mp3"); 465 | #endif //VS1053_MODULE 466 | } 467 | 468 | else 469 | { 470 | #ifdef VS1053_MODULE 471 | sprintf(viUrl, "%d.%d.%d.%d",strmInfo.server_ip[0],strmInfo.server_ip[1],strmInfo.server_ip[2],strmInfo.server_ip[3]); 472 | #else 473 | sprintf(viUrl, "http://%d.%d.%d.%d:9000%s",strmInfo.server_ip[0],strmInfo.server_ip[1],strmInfo.server_ip[2],strmInfo.server_ip[3],(char*) viTmpUrl); 474 | #endif //VS1053_MODULE 475 | } 476 | 477 | Serial.print("Url : "); 478 | Serial.println(viUrl); 479 | 480 | 481 | Serial.println("Let's play music"); 482 | 483 | #ifdef VS1053_MODULE 484 | #ifndef ADAFRUIT_VS1053 485 | vcplayer->startSong(); 486 | #else 487 | //vcplayer-> begin(); 488 | //vcplayer->softReset(); 489 | #endif //ADAFRUIT_VS1053 490 | 491 | #else // Mode DAC 492 | vcDacFile = new AudioFileSourceICYStream((char *) viUrl); 493 | vcDacFile->RegisterMetadataCB(MDCallback, (void*)"ICY"); 494 | 495 | // Use 8k of audio buffer 496 | vcDacBuff = new AudioFileSourceBuffer(vcDacFile, 4096); 497 | vcDacBuff->RegisterStatusCB(StatusCallback, (void*)"buffer"); 498 | 499 | vcDacOut = new AudioOutputI2S(); 500 | vcDacAudioGen->begin(vcDacBuff, vcDacOut); 501 | vcDacAudioGen->loop(); 502 | #endif //VS1053_MODULE 503 | 504 | 505 | 506 | // on flag l'état à 'lecture' 507 | vcPlayerStat = PlayStatus; 508 | 509 | // Starting time 510 | StartTimeCurrentSong = millis(); 511 | 512 | ByteReceivedCurrentSong = 0; 513 | 514 | #ifdef VS1053_MODULE 515 | Serial.println("connecting to stream... "); 516 | 517 | if (!vcStreamClient.connect(viUrl, 9000)) { 518 | Serial.println("Connection failed"); 519 | return; 520 | } 521 | Serial.println("Connexion ok"); 522 | Serial.print("Ask for : "),Serial.println(String((char*) viTmpUrl)); 523 | vcStreamClient.print(String("") + String((char*) viTmpUrl) + "\r\n" + 524 | "Host: " + viUrl + "\r\n" + 525 | "Connection: close\r\n\r\n"); 526 | #endif VS1053_MODULE 527 | 528 | 529 | // Send connect 530 | 531 | reponseSTAT viResponseSTMc(vcClient); 532 | memcpy((void *) viResponseSTMc.vcResponse.event, "STMc", 4); 533 | viResponseSTMc.sendResponse(); 534 | //vcClient->write(staC, sizeof(staC)); 535 | // Send connected 536 | 537 | reponseSTAT viResponseSTMe(vcClient); 538 | memcpy((void *) viResponseSTMe.vcResponse.event, "STMe", 4); 539 | viResponseSTMe.sendResponse(); 540 | //vcClient->write(staE, sizeof(staE)); 541 | 542 | // Send HTTP headers received from stream connection 543 | reponseSTAT viResponseSTMh(vcClient); 544 | memcpy((void *) viResponseSTMh.vcResponse.event, "STMh", 4); 545 | viResponseSTMh.sendResponse(); 546 | //vcClient->write(staH, sizeof(staH)); 547 | 548 | // Send Track Started 549 | reponseSTAT viResponseSTMs(vcClient); 550 | memcpy((void *) viResponseSTMs.vcResponse.event, "STMs", 4); 551 | viResponseSTMs.sendResponse(); 552 | } 553 | 554 | /** 555 | * Handle pause command 556 | */ 557 | void slimproto::HandleStrmPCmd(byte pCommand [], int pSize) 558 | { 559 | // Send Pause confirm 560 | reponseSTAT viResponseSTMp(vcClient); 561 | memcpy((void *) viResponseSTMp.vcResponse.event, "STMp", 4); 562 | viResponseSTMp.sendResponse(); 563 | 564 | vcPlayerStat = PauseStatus; 565 | } 566 | 567 | /** 568 | * Handle unpause command 569 | */ 570 | 571 | void slimproto::HandleStrmUCmd(byte pCommand [], int pSize) 572 | { 573 | //vcplayer->pausePlaying(false); 574 | 575 | // Send UnPause confirm 576 | reponseSTAT viResponseSTMp(vcClient); 577 | memcpy((void *) viResponseSTMp.vcResponse.event, "STMr", 4); 578 | viResponseSTMp.sendResponse(); 579 | 580 | vcPlayerStat = PlayStatus; 581 | } 582 | 583 | /** 584 | * Handle volum control 585 | */ 586 | void slimproto::HandleAudgCmd(byte pCommand [], int pSize) 587 | { 588 | #ifdef VS1053_MODULE 589 | audg_packet viVolDef; 590 | memcpy(&viVolDef, pCommand, sizeof(audg_packet)); 591 | u32_t viVol = unpackN((u32_t*) (pCommand+14)) ; 592 | 593 | Serial.print("Volume : "); 594 | Serial.println(viVol); 595 | u32_t newvolume = ((100 * log10((viVol*100)/65))/5); 596 | Serial.print("new volume : "); 597 | Serial.println(newvolume); 598 | 599 | #ifdef ADAFRUIT_VS1053 600 | vcplayer->setVolume((viVol *100) / 65536,(viVol *100) / 65536); 601 | #else 602 | vcplayer->setVolume(newvolume); 603 | #endif //ADAFRUIT_VS1053 604 | #else 605 | Serial.println("Sorry, no volume control in DAC mode"); 606 | #endif // VS1053_MODULE 607 | } 608 | 609 | 610 | void slimproto::HandleCommand(byte pCommand[], int pSize) 611 | { 612 | byte viCommand[5] = {0}; 613 | 614 | ByteArrayCpy(viCommand, pCommand,4); 615 | 616 | //Serial.print("Handle command : "); 617 | //Serial.println((char *) viCommand); 618 | 619 | if(strcmp((const char *)viCommand,"strm") == 0) 620 | { 621 | //Serial.println("strm command"); 622 | unsigned char viSubCmd; 623 | 624 | viSubCmd = (unsigned char) pCommand[4]; 625 | 626 | Serial.print("Sub command : "); 627 | Serial.println(viSubCmd); 628 | switch (viSubCmd) { 629 | case 'q': 630 | Serial.println("Sub command q (stop)"); 631 | HandleStrmQCmd(pCommand,pSize ); 632 | break; 633 | case 't': 634 | Serial.println("Sub command t (status)"); 635 | HandleStrmTCmd(pCommand,pSize ); 636 | break; 637 | case 'p': 638 | Serial.println("Sub command p (pause)"); 639 | HandleStrmPCmd(pCommand,pSize ); 640 | break; 641 | case 'u': 642 | Serial.println("Sub command u (unpause)"); 643 | HandleStrmUCmd(pCommand,pSize ); 644 | break; 645 | case 's': 646 | Serial.println("Sub command s (start)"); 647 | HandleStrmSCmd(pCommand,pSize ); 648 | break; 649 | default: 650 | Serial.println("default SubCommand"); 651 | } 652 | } 653 | else if (strcmp((const char *)viCommand,"vfdc") == 0) 654 | { 655 | //Serial.println("vfdc command"); 656 | } 657 | else if (strcmp((const char *)viCommand,"audg") == 0) 658 | { 659 | Serial.println("audg command"); 660 | HandleAudgCmd(pCommand,pSize); 661 | 662 | } 663 | else 664 | { 665 | Serial.print("Autre command : ["); 666 | Serial.print((char*)viCommand); 667 | Serial.println("]"); 668 | Serial.print("Size : "); 669 | Serial.println(pSize); 670 | } 671 | } 672 | 673 | void slimproto::ExtractCommand(byte * pBuf, int pSize) 674 | { 675 | for(int i = 0; i < pSize; i++) 676 | { 677 | pBuf[i]= vcBufferInput[i]; 678 | } 679 | 680 | vcBufferInput.remove(0,pSize); 681 | } 682 | 683 | void slimproto::ByteArrayCpy(byte * pDst, byte * pSrv, int pSize) 684 | { 685 | for(int i = 0; i < pSize; i++) 686 | { 687 | pDst[i]= pSrv[i]; 688 | } 689 | } 690 | 691 | 692 | u32_t slimproto::unpackN(u32_t *src) { 693 | u8_t *ptr = (u8_t *)src; 694 | return *(ptr) << 24 | *(ptr+1) << 16 | *(ptr+2) << 8 | *(ptr+3); 695 | } 696 | 697 | u16_t slimproto::unpackn(u16_t *src) { 698 | u8_t *ptr = (u8_t *)src; 699 | return *(ptr) << 8 | *(ptr+1); 700 | } 701 | 702 | 703 | void slimproto::PrintByteArray(byte * psrc, int pSize) 704 | { 705 | 706 | Serial.print("Array("); 707 | Serial.print(pSize); 708 | Serial.print(") : "); 709 | 710 | char tmp[16]; 711 | for (int i=0; i 14 | #include "stRingBuffer.h" 15 | #include 16 | 17 | #ifdef ESP32 18 | #include 19 | #else 20 | #include 21 | #endif 22 | 23 | #ifdef VS1053_MODULE 24 | #ifdef ADAFRUIT_VS1053 25 | #include 26 | #else 27 | #include 28 | #endif 29 | #endif //VS1053_MODULE 30 | 31 | #ifdef I2S_DAC_MODULE 32 | #include "AudioFileSourceICYStream.h" 33 | #include "AudioFileSourceBuffer.h" 34 | #include "AudioGeneratorMP3.h" 35 | #include "AudioGeneratorFLAC.h" 36 | #include "AudioOutputI2SNoDAC.h" 37 | #endif 38 | 39 | 40 | struct __attribute__((packed)) StrmStructDef 41 | { 42 | byte command; 43 | byte autostart; 44 | byte formatbyte; 45 | byte pcmsamplesize; 46 | byte pcmsamplerate; 47 | byte pcmchannels; 48 | byte pcmendian; 49 | byte threshold; 50 | byte spdif_enable; 51 | byte trans_period; 52 | byte trans_type; 53 | byte flags; 54 | byte output_threshold; 55 | byte RESERVED; 56 | u32_t replay_gain; 57 | byte server_port[2]; 58 | byte server_ip[4]; 59 | 60 | }; 61 | 62 | struct __attribute__((packed)) audg_packet { 63 | char opcode[4]; 64 | u32_t old_gainL; // unused 65 | u32_t old_gainR; // unused 66 | u8_t adjust; 67 | u8_t preamp; // unused 68 | u32_t gainL; 69 | u32_t gainR; 70 | // squence ids - unused 71 | }; 72 | 73 | 74 | class responseBase 75 | { 76 | public : 77 | responseBase(WiFiClient * pClient); 78 | ~responseBase(); 79 | virtual void sendResponse() = 0; 80 | 81 | protected : 82 | 83 | struct stResponse{ 84 | byte command[4]; 85 | long sizeResponse = 1; 86 | }; 87 | 88 | WiFiClient * vcClient; 89 | stResponse vcResponse; 90 | }; 91 | 92 | 93 | class reponseHelo : public responseBase { 94 | 95 | public : 96 | reponseHelo(WiFiClient * pClient); 97 | void sendResponse(); 98 | 99 | private : 100 | 101 | // H E L 0 { SIZE } {ID} {REV} { MAC ADDRESS } { UUID }{ WLAN CHANNEL} { BYTE RECEIVED ??? }{LANGUAGE} 102 | // const unsigned char helo[] = {0x48,0x45,0x4c,0x4f ,0x00,0x00,0x00,0x24,0x08, 0x0b ,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x4e}; 103 | 104 | /* 105 | struct HELO_packet { 106 | char opcode[4] = {0x48,0x45,0x4c,0x4f}; 107 | u32_t length; 108 | u8_t deviceid = 0x08; 109 | u8_t revision = 0x0b; 110 | u8_t mac[6] = {0x00,0x00,0x00,0x00,0x00,0x01}; 111 | u8_t uuid[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}; 112 | u16_t wlan_channellist = 0; 113 | u32_t bytes_received_H, bytes_received_L = 0; 114 | char lang[2] = {0x45,0x4e}; 115 | // u8_t capabilities[]; 116 | }; 117 | 118 | */ 119 | 120 | struct __attribute__((packed)) stResponse 121 | { 122 | byte command[4] = {0x48,0x45,0x4c,0x4f}; // HELO 123 | long sizeResponse ; 124 | char diviceID = 0x08; 125 | char firmwareRevision = 0x0b; 126 | byte macAddr[6] = {0x00,0x00,0x00,0x00,0x00,0x01}; 127 | byte uuid[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}; 128 | byte wlanChannel[2] = {0x00,0x00}; 129 | byte receivedData[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; 130 | byte language[2] = {0x45,0x4e}; 131 | char capabilites[92] = "Model=squeezeesp,ModelName=SqueezeEsp,Firmware=7,ogg,flc,pcm,mp3,SampleRate=44100,HasPreAmp"; 132 | }; 133 | 134 | stResponse vcResponse; 135 | }; 136 | 137 | 138 | class reponseSTAT : public responseBase { 139 | 140 | public : 141 | reponseSTAT(WiFiClient * pClient); 142 | void sendResponse(); 143 | 144 | private : 145 | 146 | 147 | struct __attribute__((packed)) STAT_packet { 148 | char opcode[4] = {0x53,0x54,0x41,0x54}; // STAT 149 | u32_t sizeResponse; 150 | //u32_t event; 151 | char event[4]; 152 | u8_t num_crlf; 153 | u8_t mas_initialized; 154 | u8_t mas_mode; 155 | u32_t stream_buffer_size; 156 | u32_t stream_buffer_fullness; 157 | u32_t bytes_received_H; 158 | u32_t bytes_received_L; 159 | u16_t signal_strength; 160 | u32_t jiffies; 161 | u32_t output_buffer_size; 162 | u32_t output_buffer_fullness; 163 | u32_t elapsed_seconds; 164 | u16_t voltage; 165 | u32_t elapsed_milliseconds; 166 | u32_t server_timestamp; 167 | u16_t error_code; 168 | }; 169 | 170 | public : 171 | 172 | STAT_packet vcResponse; 173 | 174 | }; 175 | 176 | typedef struct StrmStructDef StrmStruct; 177 | typedef struct audg_packet AudgStruct; 178 | 179 | 180 | class slimproto 181 | { 182 | public: 183 | 184 | #ifdef VS1053_MODULE 185 | #ifdef ADAFRUIT_VS1053 186 | slimproto(String pAdrLMS, WiFiClient pClient, Adafruit_VS1053 * pPlayer); 187 | #else 188 | slimproto(String pAdrLMS,WiFiClient * pClient, VS1053 * pPlayer); 189 | #endif 190 | #endif 191 | 192 | 193 | slimproto(String pAdrLMS, WiFiClient * pClient); 194 | ~slimproto(); 195 | 196 | /** 197 | * Read message from socket and push them in a local buffer 198 | **/ 199 | int HandleMessages(); 200 | 201 | int HandleAudio(); 202 | 203 | private: 204 | 205 | 206 | stRingBuffer * vcRingBuffer; 207 | //stRingBuffer * vcCommandRingBuf; 208 | 209 | 210 | String vcAdrLMS; 211 | 212 | int _pin; 213 | String vcBufferInput; 214 | 215 | int vcCommandSize; 216 | 217 | // uint8_t* ringbuf ; // Ringbuffer for VS1053 218 | 219 | unsigned long StartTimeCurrentSong = 0; 220 | unsigned long EndTimeCurrentSong = 0; 221 | uint32_t ByteReceivedCurrentSong = 0; 222 | 223 | unsigned long TimeCounter = 0; 224 | 225 | unsigned long LastStatMsg = 0; 226 | 227 | 228 | void HandleCommand(byte pCommand [], int pSize); 229 | void HandleStrmQCmd(byte pCommand [], int pSize); 230 | void HandleStrmTCmd(byte pCommand [], int pSize); 231 | void HandleStrmSCmd(byte pCommand [], int pSize); 232 | void HandleStrmPCmd(byte pCommand [], int pSize); 233 | void HandleStrmUCmd(byte pCommand [], int pSize); 234 | 235 | void HandleAudgCmd(byte pCommand [], int pSize); 236 | 237 | void ExtractCommand(byte * pBuf, int pSize); 238 | void ByteArrayCpy(byte * pDst, byte * pSrv, int pSize); 239 | 240 | void PrintByteArray(byte * psrc, int pSize); 241 | void PrintByteArray(String psrc, int pSize); 242 | void PrintHex8(uint8_t *data, uint8_t length); 243 | 244 | u32_t unpackN(u32_t *src); 245 | u16_t unpackn(u16_t *src); 246 | 247 | WiFiClient * vcClient; // Client to handle control messages 248 | WiFiClient vcStreamClient; // Client to handle audio stream 249 | 250 | /* 251 | #define VS1053_CS D1 (1) 252 | #define VS1053_DCS D0 (3) 253 | #define VS1053_DREQ D3 (5) 254 | */ 255 | 256 | #ifdef VS1053_MODULE 257 | #ifdef ADAFRUIT_VS1053 258 | Adafruit_VS1053 * vcplayer; 259 | #else 260 | VS1053 * vcplayer; 261 | #endif 262 | #endif 263 | 264 | 265 | #ifdef I2S_DAC_MODULE 266 | AudioGenerator * vcDacAudioGen = 0; 267 | AudioFileSourceICYStream * vcDacFile = 0; 268 | AudioFileSourceBuffer * vcDacBuff = 0; 269 | AudioOutputI2S * vcDacOut = 0; 270 | #endif 271 | 272 | 273 | enum player_status { 274 | StopStatus, 275 | PlayStatus, 276 | PauseStatus 277 | }; 278 | 279 | 280 | player_status vcPlayerStat = StopStatus ; /* 0 = stop , 1 = play , 2 = pause */ 281 | 282 | 283 | 284 | }; 285 | 286 | #endif 287 | -------------------------------------------------------------------------------- /stRingBuffer.cpp: -------------------------------------------------------------------------------- 1 | #include "stRingBuffer.h" 2 | 3 | 4 | stRingBuffer::stRingBuffer(uint32_t pBufferSize) 5 | { 6 | vcRBwindex = 0 ; // Fill pointer in ringbuffer 7 | vcRBrindex = pBufferSize - 1 ; // Emptypointer in ringbuffer 8 | 9 | vcRingBufferSize = pBufferSize; 10 | vcRBcount = 0; 11 | vcRingBuffer = (uint8_t *) malloc ( vcRingBufferSize ) ; // Create ring buffer 12 | } 13 | 14 | stRingBuffer::~stRingBuffer() 15 | { 16 | free(vcRingBuffer), vcRingBuffer = 0; 17 | } 18 | 19 | 20 | uint32_t stRingBuffer::getBufferSize() 21 | { 22 | return vcRingBufferSize; 23 | } 24 | 25 | void stRingBuffer::PrintRingBuffer(uint32_t pSize) 26 | { 27 | Serial.print("Array : "); 28 | if(pSize > dataSize()) 29 | pSize = dataSize(); 30 | 31 | for(uint32_t i = 0; i < pSize; i++) 32 | { 33 | Serial.print((unsigned char) *(vcRingBuffer + vcRBrindex +i) , HEX); 34 | } 35 | 36 | Serial.println(""); 37 | } 38 | 39 | 40 | void stRingBuffer::clearBuffer() 41 | { 42 | vcRBwindex = 0 ; // Reset ringbuffer administration 43 | vcRBrindex = vcRingBufferSize - 1 ; 44 | vcRBcount = 0 ; 45 | } 46 | 47 | uint8_t stRingBuffer::readDataAt(uint16_t x) 48 | { 49 | return *(vcRingBuffer + vcRBrindex + x); 50 | } 51 | 52 | 53 | /** 54 | * Return true if free space in the buffer for at least one byte 55 | */ 56 | bool stRingBuffer::isFreeSpace() 57 | { 58 | return ( vcRBcount < vcRingBufferSize ) ; 59 | } 60 | 61 | /** 62 | * Return data size in the buffer 63 | */ 64 | uint32_t stRingBuffer::dataSize() 65 | { 66 | return vcRBcount; 67 | } 68 | 69 | /** 70 | * Push one byte of data to the ringbuffer 71 | */ 72 | void stRingBuffer::putData(uint8_t pData) 73 | { 74 | // No check on available space. See ringspace() 75 | *(vcRingBuffer + vcRBwindex) = pData ; // Put byte in ringbuffer 76 | if ( ++vcRBwindex == vcRingBufferSize ) // Increment pointer and 77 | { 78 | vcRBwindex = 0 ; // wrap at end 79 | } 80 | vcRBcount++ ; // Count number of bytes in the 81 | } 82 | 83 | /** 84 | * Retreive one byte of data from the ringbuffer 85 | */ 86 | uint8_t stRingBuffer::getData() 87 | { 88 | if ( ++vcRBrindex == vcRingBufferSize ) // Increment pointer and 89 | { 90 | vcRBrindex = 0 ; // wrap at end 91 | } 92 | vcRBcount-- ; // Count is now one less 93 | return *(vcRingBuffer + vcRBrindex) ; // return the oldest byte 94 | } 95 | 96 | 97 | -------------------------------------------------------------------------------- /stRingBuffer.h: -------------------------------------------------------------------------------- 1 | #ifndef stRingBuffer_h 2 | #define stRingBuffer_h 3 | 4 | #include 5 | 6 | class stRingBuffer 7 | { 8 | public : 9 | 10 | stRingBuffer(uint32_t pBufferSize); 11 | ~stRingBuffer(); 12 | 13 | 14 | void PrintRingBuffer(uint32_t pSize); 15 | 16 | bool isFreeSpace(); 17 | uint32_t dataSize(); 18 | 19 | uint32_t getBufferSize(); 20 | uint8_t readDataAt(uint16_t x); 21 | 22 | void putData(uint8_t); 23 | uint8_t getData(); 24 | 25 | void clearBuffer(); 26 | 27 | private : 28 | 29 | uint32_t vcRingBufferSize; // Size of RingBuffer 30 | uint8_t* vcRingBuffer; // RingBuffer 31 | uint32_t vcRBcount; // Number of bytes in ringbuffer 32 | 33 | uint32_t vcRBwindex = 0 ; // Fill pointer in ringbuffer 34 | uint32_t vcRBrindex = vcRingBufferSize - 1 ; // Emptypointer in ringbuffer 35 | 36 | }; 37 | 38 | #endif 39 | --------------------------------------------------------------------------------