From d808e641efc88af057b0c17476694eb46a58cca5 Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Sat, 21 Sep 2019 17:57:58 +0200 Subject: [PATCH 01/28] 2.2.7.BETA1.rgbw.3colors --- Arduino/McLighting/McLighting.ino | 179 ++++++++++++------ Arduino/McLighting/definitions.h | 38 ++-- .../mode_custom_ws2812fx_animations.h | 19 ++ Arduino/McLighting/request_handlers.h | 42 ++-- Arduino/McLighting/version.h | 2 +- Arduino/McLighting/version_info.ino | 7 + README.md | 13 +- platformio.ini | 4 +- 8 files changed, 213 insertions(+), 91 deletions(-) diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino index 03df3d6..b2dfae5 100644 --- a/Arduino/McLighting/McLighting.ino +++ b/Arduino/McLighting/McLighting.ino @@ -114,60 +114,57 @@ WS2812FX * strip = NULL; #if USE_WS2812FX_DMA == 0 // Uses GPIO3/RXD0/RX, more info: https://github.com/Makuna/NeoPixelBus/wiki/ESP8266-NeoMethods #if !defined(LED_TYPE_WS2811) - NeoEsp8266Dma800KbpsMethod * dma = NULL ; //800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) + NeoPixelBus * dma = NULL ; //800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) #else - NeoEsp8266Dma400KbpsMethod * dma = NULL; //400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) + NeoPixelBus * dma = NULL; //400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) #endif #endif #if USE_WS2812FX_DMA == 1 // Uses UART1: GPIO1/TXD0/TX, more info: https://github.com/Makuna/NeoPixelBus/wiki/ESP8266-NeoMethods #if !defined(LED_TYPE_WS2811) - NeoEsp8266Uart0800KbpsMethod * dma = NULL; //800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) + NeoPixelBus * dma = NULL; //800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) #else - NeoEsp8266Uart0400KbpsMethod * dma = NULL; //400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) + NeoPixelBus * dma = NULL; //400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) #endif #endif #if USE_WS2812FX_DMA == 2 // Uses UART2: GPIO2/TXD1/D4, more info: https://github.com/Makuna/NeoPixelBus/wiki/ESP8266-NeoMethods #if !defined(LED_TYPE_WS2811) - NeoEsp8266Uart1800KbpsMethod * dma = NULL; //800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) + NeoPixelBus * dma = NULL; //800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) #else - NeoEsp8266Uart1400KbpsMethod * dma = NULL; //400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) + NeoPixelBus * dma = NULL; //400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) #endif #endif void initDMA(uint16_t stripSize = NUMLEDS){ if (dma != NULL) { delete(dma); } - uint8_t ledcolors = 3; - if (strstr(WS2812FXStripSettings.RGBOrder, "W") != NULL) { - ledcolors = 4; - } #if USE_WS2812FX_DMA == 0 // Uses GPIO3/RXD0/RX, more info: https://github.com/Makuna/NeoPixelBus/wiki/ESP8266-NeoMethods #if !defined(LED_TYPE_WS2811) - dma = new NeoEsp8266Dma800KbpsMethod(stripSize, ledcolors); //800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) + dma = new NeoPixelBus(stripSize); //800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) #else - dma = new NeoEsp8266Dma400KbpsMethod(stripSize, ledcolors); //400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) + dma = new NeoPixelBus(stripSize); //400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) #endif #endif #if USE_WS2812FX_DMA == 1 // Uses UART1: GPIO1/TXD0/TX, more info: https://github.com/Makuna/NeoPixelBus/wiki/ESP8266-NeoMethods #if !defined(LED_TYPE_WS2811) - dma = new NeoEsp8266Uart0800KbpsMethod(stripSize, ledcolors); //800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) + dma = new NeoPixelBus(stripSize); //800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) #else - dma = new NeoEsp8266Uart0400KbpsMethod(stripSize, ledcolors); //400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) + dma = new NeoPixelBus(stripSize); //400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) #endif #endif #if USE_WS2812FX_DMA == 2 // Uses UART2: GPIO2/TXD1/D4, more info: https://github.com/Makuna/NeoPixelBus/wiki/ESP8266-NeoMethods #if !defined(LED_TYPE_WS2811) - dma = new NeoEsp8266Uart1800KbpsMethod(stripSize, ledcolors); //800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) + dma = new NeoPixelBus(stripSize); //800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) #else - dma = new NeoEsp8266Uart1400KbpsMethod(stripSize, ledcolors); //400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) + dma = new NeoPixelBus(stripSize); //400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) #endif #endif - dma->Initialize(); + dma->Begin(); } void DMA_Show(void) { - if(dma->IsReadyToUpdate()) { - memcpy(dma->getPixels(), strip->getPixels(), dma->getPixelsSize()); - dma->Update(false); + if(dma->CanShow()) { + memcpy(dma->Pixels(), strip->getPixels(), dma->PixelsSize()); + dma->Dirty(); + dma->Show(); } } #endif @@ -312,12 +309,11 @@ void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, char RGBOrd initDMA(stripSize); strip->setCustomShow(DMA_Show); #endif - strip->setBrightness(brightness); //parameters: index, start, stop, mode, color, speed, options strip->setSegment(0, 0, stripSize - 1, ws2812fx_mode, hex_colors, convertSpeed(ws2812fx_speed), fxoptions); #if defined(CUSTOM_WS2812FX_ANIMATIONS) strip->setCustomMode(0, F("Fire 2012"), myCustomEffect0); -//strip->setCustomMode(1, F("CustEffect"), myCustomEffect1); + strip->setCustomMode(1, F("Gradient"), myCustomEffect1); gReverseDirection = (WS2812FXStripSettings.fxoptions & 128); #endif #if defined(ENABLE_E131) @@ -674,8 +670,6 @@ void setup() { if (mdns_result) { MDNS.addService("http", "tcp", 80); } - - prevmode = mode; #if defined(ENABLE_BUTTON_GY33) tcs.setConfig(MCU_LED_06, MCU_WHITE_ON); @@ -684,9 +678,9 @@ void setup() { #endif #if defined(ENABLE_REMOTE) irrecv.enableIRIn(); // Start the receiver - snprintf(last_state, sizeof(last_state), "STA|%2d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d", mode, ws2812fx_mode, ws2812fx_speed, brightness, main_color.red, main_color.green, main_color.blue, main_color.white, back_color.red, back_color.green, back_color.blue, back_color.white, xtra_color.red, xtra_color.green, xtra_color.blue,xtra_color.white); - last_state[sizeof(last_state)]= 0x00; #endif + snprintf(last_state, sizeof(last_state), "STA|%2d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d", mode, ws2812fx_mode, ws2812fx_speed, brightness, main_color.red, main_color.green, main_color.blue, main_color.white, back_color.red, back_color.green, back_color.blue, back_color.white, xtra_color.red, xtra_color.green, xtra_color.blue,xtra_color.white); + last_state[sizeof(last_state)]= 0x00; DBG_OUTPUT_PORT.println("finished Main Setup!"); initStrip(); @@ -751,35 +745,43 @@ void loop() { if(!strip->isRunning()) strip->start(); } - if ((mode == OFF) || (mode == TV) || (mode == E131)) { + if (((mode == OFF) && (brightness_actual == 0)) || (mode == TV) || (mode == E131)) { if(strip->isRunning()) { - strip->strip_off(); // Workaround: to be shure, + strip->strip_off(); // Workaround: to be shure, delay(10); // that strip is really off. Sometimes strip->stop isn't enought - strip->stop(); // should clear memory + strip->stop(); // should clear memory } else { if (prevmode != mode) { // Start temporarily to clear strip strip->start(); - strip->strip_off(); // Workaround: to be shure, + strip->strip_off(); // Workaround: to be shure, delay(10); // that strip is really off. Sometimes strip->stop isn't enought - strip->stop(); // should clear memory + strip->stop(); // should clear memory } } } - if (( mode == AUTO) || (mode == HOLD)) { // strip->service() is only needed for modes with WS2812FX functionality - strip->service(); + if (( mode == AUTO) || (mode == HOLD) || ((mode == OFF) && (brightness !=0))) { + strip->service(); // strip->service() is only needed for modes with WS2812FX functionality } - if ((prevmode == AUTO) && (mode != AUTO)) { handleAutoStop(); } // stop auto mode + if ((prevmode == AUTO) && (mode != AUTO)) { + handleAutoStop(); // stop auto mode + } if (mode == OFF) { - #if defined(ENABLE_MQTT) - if (prevmode != mode) { snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =off", ""); } - #endif + if (prevmode != mode) { + #if defined(ENABLE_MQTT) + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =off", ""); + #endif + if (fadeEffect) { + brightness_fade = 0; + } + } } if (mode == AUTO) { if (prevmode != mode) { + brightness_fade = brightness; handleAutoStart(); #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =auto", ""); @@ -789,19 +791,25 @@ void loop() { #if defined(ENABLE_TV) if (mode == TV) { - handleTV(); + if (prevmode != mode) { + brightness_fade = brightness; #if defined(ENABLE_MQTT) - if (prevmode != mode) { snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =tv", ""); } + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =tv", ""); #endif + } + handleTV(); } #endif #if defined(ENABLE_E131) if (mode == E131) { - handleE131(); + if (prevmode != mode) { + brightness_fade = brightness; #if defined(ENABLE_MQTT) - if (prevmode != mode) { snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =e131", ""); } + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =e131", ""); #endif + } + handleE131(); } #endif @@ -816,16 +824,18 @@ void loop() { } if (mode == SET_ALL) { - mode = HOLD; - if ((prevmode == OFF) || (prevmode == AUTO) || (prevmode == TV) || (prevmode == E131)) { setModeByStateString(last_state); } + mode = prevmode; + if ((prevmode == OFF) || (prevmode == AUTO) || (prevmode == TV) || (prevmode == E131)) { + setModeByStateString(last_state); + } #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", ws2812fx_mode); #endif strip->setMode(ws2812fx_mode); + if (fade_cnt==0) { fade_cnt=1; } + if (!fadeEffect) { fade_cnt=255; } + brightness_fade = brightness; convertColors(); - strip->setColors(0, hex_colors); - strip->setSpeed(convertSpeed(ws2812fx_speed)); - strip->setBrightness(brightness); prevmode = SET_ALL; strip->trigger(); } @@ -836,40 +846,95 @@ void loop() { snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", ws2812fx_mode); #endif strip->setMode(ws2812fx_mode); + brightness_fade = brightness; prevmode = SET_MODE; strip->trigger(); } if (mode == SET_COLOR) { + if (fade_cnt==0) { fade_cnt=1; } + if (!fadeEffect) { fade_cnt=255; } convertColors(); - strip->setColors(0, hex_colors); mode = prevmode; prevmode = SET_COLOR; - //DBG_OUTPUT_PORT.printf("mode: %d\r\n", mode); - if (mode == HOLD) strip->trigger(); } + // Async color transition + if ((fade_cnt > 0) && (fade_cnt < 254)) { + if ((fadeEffect) && (colorFadeDelay <= millis())) { + hex_colors_actual[0] = fade(hex_colors[0], hex_colors_mem[0], fade_cnt); + hex_colors_actual[1] = fade(hex_colors[1], hex_colors_mem[1], fade_cnt); + hex_colors_actual[2] = fade(hex_colors[2], hex_colors_mem[2], fade_cnt); + fade_cnt++; + colorFadeDelay = millis() + FADE_COLOR_DELAY; + strip->setColors(0, hex_colors_actual); + if ((mode == HOLD) && ((ws2812fx_mode != 1) && (ws2812fx_mode != 2) && (ws2812fx_mode != 8) && (ws2812fx_mode != 9) &&(ws2812fx_mode != 10) && (ws2812fx_mode != 15))) strip->trigger(); + } + } + if (fade_cnt >= 254) { + strip->setColors(0, hex_colors); + if (mode == HOLD) strip->trigger(); + fade_cnt = 0; + } + if (mode == SET_SPEED) { #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK ?%i", ws2812fx_speed); #endif - strip->setSpeed(convertSpeed(ws2812fx_speed)); mode = prevmode; prevmode = SET_SPEED; - if (mode == HOLD) strip->trigger(); } + // Async speed transition + if (ws2812fx_speed_actual != ws2812fx_speed) { + if (fadeEffect) { + if (speedFadeDelay <= millis()) { + if (ws2812fx_speed_actual < ws2812fx_speed) { + ws2812fx_speed_actual++; + } + if (ws2812fx_speed_actual > ws2812fx_speed) { + ws2812fx_speed_actual--; + } + speedFadeDelay = millis() + FADE_DELAY; + strip->setSpeed(convertSpeed(ws2812fx_speed_actual)); + if ((mode == HOLD) && ((ws2812fx_mode != 1) && (ws2812fx_mode != 2) && (ws2812fx_mode != 8) && (ws2812fx_mode != 9) &&(ws2812fx_mode != 10) && (ws2812fx_mode != 15))) strip->trigger(); + } + } else { + ws2812fx_speed_actual = ws2812fx_speed; + strip->setSpeed(ws2812fx_speed); + if (mode == HOLD) strip->trigger(); + } + } + if (mode == SET_BRIGHTNESS) { #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %%%i", brightness); #endif - strip->setBrightness(brightness); + brightness_fade = brightness; mode = prevmode; prevmode = SET_BRIGHTNESS; - //DBG_OUTPUT_PORT.printf("mode: %d\r\n", mode); - if (mode == HOLD) strip->trigger(); } - - if (prevmode != mode) { - if ((prevmode != AUTO) && (prevmode != INIT_STRIP)) { // do not save if AUTO Mode was set + // Async brightness transition + if (brightness_actual != brightness_fade) { + if (fadeEffect) { + if(brightnessFadeDelay <= millis()) { + if (brightness_actual < brightness_fade) { + brightness_actual++; + } + if (brightness_actual > brightness_fade) { + brightness_actual--; + } + brightnessFadeDelay = millis() + FADE_DELAY; + strip->setBrightness(brightness_actual); + if ((mode == HOLD) && ((ws2812fx_mode != 1) && (ws2812fx_mode != 2) && (ws2812fx_mode != 8) && (ws2812fx_mode != 9) &&(ws2812fx_mode != 10) && (ws2812fx_mode != 15))) strip->trigger(); + } + } else { + brightness_actual = brightness; + strip->setBrightness(brightness_actual); + if (mode == HOLD) strip->trigger(); + } + } + + if (prevmode != mode) { + if (prevmode != INIT_STRIP) { // do not save if INIT_STRIP mode was set #if defined(ENABLE_STATE_SAVE) if(!settings_save_state.active()) settings_save_state.once(3, tickerSaveState); #endif diff --git a/Arduino/McLighting/definitions.h b/Arduino/McLighting/definitions.h index 91cb4ed..a136002 100644 --- a/Arduino/McLighting/definitions.h +++ b/Arduino/McLighting/definitions.h @@ -21,7 +21,7 @@ char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just #define ENABLE_HOMEASSISTANT // If defined, enable Homeassistant integration, ENABLE_MQTT must be active #define MQTT_HOME_ASSISTANT_SUPPORT // If defined, use AMQTT and select Tools -> IwIP Variant -> Higher Bandwidth #define ENABLE_BUTTON 14 // If defined, enable button handling code, see: https://github.com/toblum/McLighting/wiki/Button-control, the value defines the input pin (14 / D5) for switching the LED strip on / off, connect this PIN to ground to trigger button. -//#define ENABLE_BUTTON_GY33 12 // If defined, enable button handling code for GY-33 color sensor to scan color. The value defines the input pin (12 / D6) for read color data with RGB sensor, connect this PIN to ground to trigger button. +#define ENABLE_BUTTON_GY33 12 // If defined, enable button handling code for GY-33 color sensor to scan color. The value defines the input pin (12 / D6) for read color data with RGB sensor, connect this PIN to ground to trigger button. #if defined(ENABLE_BUTTON_GY33) #define GAMMA 2.5 // Gamma correction for GY-33 sensor #endif @@ -35,6 +35,15 @@ char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just #define ENABLE_TV // Enable TV Animation #define USE_HTML_MIN_GZ // uncomment for using index.htm & edit.htm from PROGMEM instead of SPIFFs +#define FADE_COLOR_DELAY 5 // Delay for color transition +#define FADE_DELAY 10 // Delay for brightness and speed transition + +bool fadeEffect = true; // Experimental: Enable transitions of color, brightness and speed. It does not work properly for all effects. +uint8_t fade_cnt = 0; +unsigned long colorFadeDelay = 0; +unsigned long brightnessFadeDelay = 0; +unsigned long speedFadeDelay = 0; + #if defined(ENABLE_E131) #define MULTICAST false #define START_UNIVERSE 1 // First DMX Universe to listen for @@ -82,7 +91,7 @@ char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just #endif // parameters for automatically cycling favorite patterns -uint32_t autoParams[][6] = { // main_color, back_color, xtra_color, speed, mode, duration (seconds) +uint32_t autoParams[][6] = { // main_color, back_color, xtra_color, speed, mode, duration (milliseconds) {0x00ff0000, 0x0000ff00, 0x00000000, 200, 1, 5000}, // blink red/geen for 5 seconds {0x0000ff00, 0x000000ff, 0x00000000, 200, 3, 10000}, // wipe green/blue for 10 seconds {0x000000ff, 0x00ff0000, 0x00000000, 60, 14, 10000}, // dual scan blue on red for 10 seconds @@ -133,20 +142,21 @@ uint32_t autoParams[][6] = { // main_color, back_color, xtra_color, speed, mod #define DBG_OUTPUT_PORT Serial // Set debug output port // List of all color modes -#if defined(ENABLE_LEGACY_ANIMATIONS) - enum MODE {OFF, AUTO, TV, E131, CUSTOM, HOLD, SET_ALL, SET_MODE, SET_COLOR, SET_SPEED, SET_BRIGHTNESS, INIT_STRIP, WIPE, RAINBOW, RAINBOWCYCLE, THEATERCHASE, TWINKLERANDOM, THEATERCHASERAINBOW}; -#else - enum MODE {OFF, AUTO, TV, E131, CUSTOM, HOLD, SET_ALL, SET_MODE, SET_COLOR, SET_SPEED, SET_BRIGHTNESS, INIT_STRIP}; -#endif +enum MODE {OFF, AUTO, TV, E131, CUSTOM, HOLD, SET_ALL, SET_MODE, SET_COLOR, SET_SPEED, SET_BRIGHTNESS, INIT_STRIP}; MODE mode = SET_ALL; // Standard mode that is active when software starts -MODE prevmode = mode; +MODE prevmode = INIT_STRIP; -uint8_t ws2812fx_speed = 196; // Global variable for storing the delay between color changes --> smaller == faster -uint8_t brightness = 196; // Global variable for storing the brightness (255 == 100%) -uint8_t ws2812fx_mode = 0; // Global variable for storing the WS2812FX modes +uint8_t ws2812fx_speed = 196; // Global variable for storing the speed for effects --> smaller == slower +uint8_t ws2812fx_speed_actual = 196; // Global variable for storing the speed for effects while fading --> smaller == slower +uint8_t brightness = 196; // Global variable for storing the brightness (255 == 100%) +uint8_t brightness_actual = 0; // Global variable for storing the brightness while fadeing (255 == 100%) +uint8_t brightness_fade = 0; // Global variable for storing the brightness before change +uint8_t ws2812fx_mode = 0; // Global variable for storing the WS2812FX modes -uint32_t hex_colors[3] = {}; // Color array for setting WS2812FX -struct ledstate // Data structure to store a state of a single led +uint32_t hex_colors[3] = {}; // Color array for setting colors of WS2812FX +uint32_t hex_colors_actual[3] = {}; // Color array for actual colors of WS2812FX while fading +uint32_t hex_colors_mem[3] = {}; // Color array of colors of WS2812FX before fading +struct ledstate // Data structure to store a state of a single led { uint8_t red; uint8_t green; @@ -162,7 +172,7 @@ LEDState xtra_color = { 0, 0, 0, 0 }; // Store the "3rd color" of the strip u bool updateConfig = false; // For WiFiManger custom config and config char last_state[67]; // Keeps the state representation before auto or off mode -bool updateState = false; +bool updateState = false; // Button handling diff --git a/Arduino/McLighting/mode_custom_ws2812fx_animations.h b/Arduino/McLighting/mode_custom_ws2812fx_animations.h index a294fef..e025591 100644 --- a/Arduino/McLighting/mode_custom_ws2812fx_animations.h +++ b/Arduino/McLighting/mode_custom_ws2812fx_animations.h @@ -86,7 +86,26 @@ void Fire2012() { } } +void Gradient() { + for( uint16_t j = 0; j < WS2812FXStripSettings.stripSize; j++) { + uint16_t pixelnumber; + uint32_t color; + if( gReverseDirection ) { + pixelnumber = (WS2812FXStripSettings.stripSize - 1) - j; + } else { + pixelnumber = j; + } + color = fade(hex_colors_actual[1], hex_colors_actual[0], (j*255)/(WS2812FXStripSettings.stripSize - 1)); + strip->setPixelColor(pixelnumber, ((color >> 16) & 0xFF), ((color >> 8) & 0xFF), ((color >> 0) & 0xFF), ((color >> 24) & 0xFF)); + } +} + uint16_t myCustomEffect0() { Fire2012(); return (strip->getSpeed() / WS2812FXStripSettings.stripSize); } + +uint16_t myCustomEffect1() { + Gradient(); + return (strip->getSpeed() / WS2812FXStripSettings.stripSize); +} diff --git a/Arduino/McLighting/request_handlers.h b/Arduino/McLighting/request_handlers.h index 9e10a97..1e6f0e8 100644 --- a/Arduino/McLighting/request_handlers.h +++ b/Arduino/McLighting/request_handlers.h @@ -52,13 +52,20 @@ void handleE131(){ // Call convertColors whenever main_color, back_color or xtra_color changes. void convertColors() { + if ((fadeEffect) && (fade_cnt > 1) && (fade_cnt < 254)) { + memcpy(hex_colors_mem, hex_colors_actual, sizeof(hex_colors_actual)); + DBG_OUTPUT_PORT.println("Color transistion aborted. Restarting...!"); + fade_cnt = 1; + } else { + memcpy(hex_colors_mem, hex_colors, sizeof(hex_colors)); + } hex_colors[0] = (uint32_t)(main_color.white << 24) | (main_color.red << 16) | (main_color.green << 8) | main_color.blue; hex_colors[1] = (uint32_t)(back_color.white << 24) | (back_color.red << 16) | (back_color.green << 8) | back_color.blue; hex_colors[2] = (uint32_t)(xtra_color.white << 24) | (xtra_color.red << 16) | (xtra_color.green << 8) | xtra_color.blue; + memcpy(hex_colors_actual, hex_colors, sizeof(hex_colors)); } void getArgs() { - if (mode == SET_ALL || mode == SET_COLOR) { if (server.arg("rgb") != "") { uint32_t rgb = (uint32_t) strtoul(server.arg("rgb").c_str(), NULL, 16); @@ -132,7 +139,6 @@ void getArgs() { xtra_color.green = constrain(xtra_color.green, 0, 255); xtra_color.blue = constrain(xtra_color.blue, 0, 255); xtra_color.white = constrain(xtra_color.white, 0, 255); - convertColors(); } if (mode == SET_ALL || mode == SET_SPEED || mode == TV) { if ((server.arg("s") != "") && (server.arg("s").toInt() >= 0) && (server.arg("s").toInt() <= 255)) { @@ -461,12 +467,13 @@ bool setModeByStateString(String saved_state_string) { xtra_color.blue = str_blue.toInt(); str_white = getValue(saved_state_string, '|', 16); xtra_color.white = str_white.toInt(); - convertColors(); DBG_OUTPUT_PORT.print("Set to state: "); DBG_OUTPUT_PORT.println(listStatusJSON()); + //prevmode=mode; + //mode = SET_ALL; return true; } else { - DBG_OUTPUT_PORT.println("Saved conf not found!"); + DBG_OUTPUT_PORT.println("Saved state not found!"); return false; } return false; @@ -717,9 +724,10 @@ void autoTick() { strip->setColors(0, setcolors); strip->setSpeed(convertSpeed((uint8_t)autoParams[autoCount][3])); strip->setMode((uint8_t)autoParams[autoCount][4]); + strip->trigger(); autoTicker.once_ms((uint32_t)autoParams[autoCount][5], autoTick); DBG_OUTPUT_PORT.print("autoTick "); - DBG_OUTPUT_PORT.printf("autoTick[%d]: {0x%06x, %d, %d, %d}\r\n", autoCount, autoParams[autoCount][0], (uint8_t)autoParams[autoCount][1], (uint8_t)autoParams[autoCount][2], (uint32_t)autoParams[autoCount][3], (uint32_t)autoParams[autoCount][4], (uint32_t)autoParams[autoCount][5]); + DBG_OUTPUT_PORT.printf("autoTick[%d]: {0x%08x, 0x%08x, 0x%08x, %d, %d, %d}\r\n", autoCount, autoParams[autoCount][0], autoParams[autoCount][1], autoParams[autoCount][2], autoParams[autoCount][3], autoParams[autoCount][4], autoParams[autoCount][5]); autoCount++; if (autoCount >= (sizeof(autoParams) / sizeof(autoParams[0]))) autoCount = 0; @@ -1506,7 +1514,6 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght #endif #endif - // *************************************************************************** // Button management // *************************************************************************** @@ -1515,7 +1522,6 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght DBG_OUTPUT_PORT.printf("Short button press\r\n"); if (mode == OFF) { setModeByStateString(BTN_MODE_SHORT); - prevmode = mode; mode = SET_ALL; } else { mode = OFF; @@ -1526,7 +1532,6 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght void mediumKeyPress() { DBG_OUTPUT_PORT.printf("Medium button press\r\n"); setModeByStateString(BTN_MODE_MEDIUM); - prevmode = mode; mode = SET_ALL; } @@ -1534,7 +1539,6 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght void longKeyPress() { DBG_OUTPUT_PORT.printf("Long button press\r\n"); setModeByStateString(BTN_MODE_LONG); - prevmode = mode; mode = SET_ALL; } @@ -1579,9 +1583,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght tcs.getData(&r, &g, &b, &col, &conf); DBG_OUTPUT_PORT.printf("Colors: R: [%d] G: [%d] B: [%d] Color: [%d] Conf: [%d]\r\n", (int)r, (int)g, (int)b, (int)col, (int)conf); main_color.red = (pow((r/255.0), GAMMA)*255); main_color.green = (pow((g/255.0), GAMMA)*255); main_color.blue = (pow((b/255.0), GAMMA)*255);main_color.white = 0; - ws2812fx_mode = FX_MODE_STATIC; - prevmode = HOLD; - mode = SET_ALL; + mode = SET_COLOR; } // called when button is kept pressed for less than 2 seconds @@ -1726,7 +1728,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght checkRGBOrder(tmp_rgbOrder); uint8_t temp_pin; checkPin((uint8_t) root["ws_pin"]); - WS2812FXStripSettings.fxoptions = constrain(root["ws_fxopt"].as(), 0, 255) && 0xFE; + WS2812FXStripSettings.fxoptions = constrain(root["ws_fxopt"].as(), 0, 255) & 0xFE; jsonBuffer.clear(); return true; } else { @@ -2122,3 +2124,17 @@ void handleRemote() { } } #endif + +uint32_t scale_wrgb(uint32_t wrgb, uint8_t level) { + uint8_t w = ((wrgb >> 24) & 0xFF) * level / 255; + uint8_t r = ((wrgb >> 16) & 0xFF) * level / 255; + uint8_t g = ((wrgb >> 8) & 0xFF) * level / 255; + uint8_t b = ((wrgb) & 0xFF) * level / 255; + return (w << 24) | (r << 16) | (g << 8) | b; +} + +uint32_t fade(uint32_t newcolor, uint32_t oldcolor, uint8_t level) { + newcolor = scale_wrgb(newcolor, level); + oldcolor = scale_wrgb(oldcolor, 255-level); + return newcolor + oldcolor; +} diff --git a/Arduino/McLighting/version.h b/Arduino/McLighting/version.h index c1cb01b..abbd427 100644 --- a/Arduino/McLighting/version.h +++ b/Arduino/McLighting/version.h @@ -1 +1 @@ -#define SKETCH_VERSION "2.2.6.RU1.rgbw.3c" +#define SKETCH_VERSION "2.2.7.BETA1.rgbw.3c" diff --git a/Arduino/McLighting/version_info.ino b/Arduino/McLighting/version_info.ino index a74007e..6ecfc3b 100644 --- a/Arduino/McLighting/version_info.ino +++ b/Arduino/McLighting/version_info.ino @@ -165,4 +165,11 @@ * adressed issue: #31 * adressed issue: #32 * + * 15 September 2019 + * Version Bump to 2.2.7.BETA1.rgbw.3colors + * adressed issue: #25 (added Custom Animation 'Gradient') + * adressed issue: #30 (Status 'AUTO' is saved now) + * adressed issue: https://github.com/toblum/McLighting/issues/403 (Experimental Support of transitions: set fadeEffect = true in definitions.h) + * corrected use of DMA for Neopixelbus by Makuna (Tests for other strips than SK6812 GRBW were not made) + * */ diff --git a/README.md b/README.md index 4fd2dcf..17d3c82 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # McLighting v2 - The ESP8266 based multi-client lighting gadget -[![Gitter](https://badges.gitter.im/mclighting/Lobby.svg)](https://gitter.im/mclighting/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.com/toblum/McLighting.svg?branch=master)](https://travis-ci.com/toblum/McLighting) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![version](https://img.shields.io/badge/version-v2.2.4-blue.svg)](https://github.com/toblum/McLighting/blob/master/Arduino/McLighting/version.h) +[![Gitter](https://badges.gitter.im/mclighting/Lobby.svg)](https://gitter.im/mclighting/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.com/toblum/McLighting.svg?branch=master)](https://travis-ci.com/toblum/McLighting) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![version](https://img.shields.io/badge/version-v2.2.7-blue.svg)](https://github.com/toblum/McLighting/blob/master/Arduino/McLighting/version.h) McLighting (the multi-client lighting gadget) is a very cheap internet-controllable lighting solution based on the famous ESP8266 microcontroller and WS2811/2812 led strips. It features among other things a web-interface, a REST-API and a websocket connector. @@ -61,17 +61,20 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so ## Todos - [ ] Support multiple strips and control them separately or together [Issue](https://github.com/toblum/McLighting/issues/118) -- [ ] Make number of pixels, MQTT and PIN configurable via front end [Issue](https://github.com/toblum/McLighting/issues/93) and [Issue](https://github.com/toblum/McLighting/issues/93) -- [ ] Bundle webpages instead of SPIFFS [Issue](https://github.com/toblum/McLighting/issues/93) - [ ] Remove old / wrong EEPROM settings completely [Issue] - [ ] Customer profile to define segments of (in)active areas on the strip [Issue](https://github.com/toblum/McLighting/issues/37) - [ ] Additional clients - [ ] If no wifi, at least enable button mode. - [ ] Also enable McLighting in Wifi AP mode. -- [ ] IR remote support [issue](https://github.com/toblum/McLightingUI/issues/3) - [ ] Multiple buttons/GPIO Inputs. [Issue](https://github.com/toblum/McLighting/issues/119) - [ ] Music visualizer / Bring back ArtNet [Issue](https://github.com/toblum/McLighting/issues/111) - [ ] Display version and parameters (Number of LEDs, definition settings, ..) in the web UI [Issue](https://github.com/toblum/McLighting/issues/150) +- [x] Save status: Added saving of status 'AUTO'. [Issue] https://github.com/FabLab-Luenen/McLighting/issues/30 +- [x] EXPERIMENTAL: Added transition feature on changing values of color brightness and speed. ATTENTION! Does not work proberly for all WS2812fx effects. +- [x] Added Custom Animation 'Gradient': [Issue] https://github.com/FabLab-Luenen/McLighting/issues/25 +- [x] Make number of pixels, MQTT and PIN configurable via front end [Issue](https://github.com/toblum/McLighting/issues/93) and [Issue](https://github.com/toblum/McLighting/issues/93) +- [x] Bundle webpages instead of SPIFFS [Issue](https://github.com/toblum/McLighting/issues/93) +- [x] IR remote support [issue](https://github.com/toblum/McLightingUI/issues/3) - [x] MQTT support - [x] Save favourite effects? [Issue](https://github.com/toblum/McLighting/issues/35)(https://github.com/toblum/McLighting/issues/101) - [x] OTA update [Issue](https://github.com/toblum/McLighting/issues/92) @@ -95,4 +98,4 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so You use this project at your own risk. This is not a solution that should be used in productive environments, but this code and guide could give you a quick start for your own experiments. Please keep also in mind that there are currently some security features missing. -*More information will be added as soon as I clean up the code and complete documentation.* +*More information will be added as soon as I clean up the code and complete documentation.* \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 5803450..53a6bb4 100644 --- a/platformio.ini +++ b/platformio.ini @@ -25,6 +25,8 @@ description = The ESP8266 based multi-client lighting gadget # arduino core 2.4.1 = platformIO 1.7.3 # arduino core 2.4.2 = platformIO 1.8.0 # arduino core 2.5.0 = platformIO 2.0.4 +# arduino core 2.5.1 = platformIO 2.1.1 +# arduino core 2.5.2 = platformIO 2.2.3 # arduino core stage = platformIO feature#stage # ------------------------------------------------------------------------------ arduino_core_2_3_0 = espressif8266@1.5.0 @@ -33,7 +35,7 @@ arduino_core_2_4_1 = espressif8266@1.7.3 arduino_core_2_4_2 = espressif8266@1.8.0 arduino_core_2_5_0 = espressif8266@2.0.4 arduino_core_2_5_1 = espressif8266@2.1.1 -arduino_core_2_5_2 = espressif8266@2.2.0 +arduino_core_2_5_2 = espressif8266@2.2.3 arduino_core_stage = https://github.com/platformio/platform-espressif8266.git#feature/stage framework = arduino From d1e24480e0e89a652180644d78f07565a47e56d1 Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Fri, 27 Sep 2019 21:10:17 +0200 Subject: [PATCH 02/28] Version Bump to 3.0.0.ALPHA1 * removed LEGACY_ANIMATIONS * removed old Custom Animations from beginning of list. * added Custom Animation 'AutoPlay' with number 56 * added Custom Animation 'Custom WS' with number 57 * added Custom Animation 'TV' with number 58 * added Custom Animation 'E1.31' with number 59 * moved Custom Animation 'Fire2012' to number 60 * moved Custom Animation 'Gradients' to number 61 * REST-API changes (will be documented soon) --- Arduino/McLighting/McLighting.ino | 318 +- Arduino/McLighting/WS2812FX.cpp | 1643 ++++++++ Arduino/McLighting/WS2812FX.h | 650 ++++ Arduino/McLighting/data/apple-touch-icon.png | Bin 0 -> 4500 bytes Arduino/McLighting/data/edit.htm | 674 ++++ Arduino/McLighting/data/edit.htm.gz | Bin 4116 -> 5489 bytes Arduino/McLighting/data/favicon.ico | Bin 1150 -> 34494 bytes Arduino/McLighting/data/index.htm | 2624 ++++++++++++- Arduino/McLighting/data/index.htm.gz | Bin 0 -> 19755 bytes Arduino/McLighting/definitions.h | 34 +- Arduino/McLighting/htm_index_gz.h | 3314 ++++++++--------- .../mode_custom_ws2812fx_animations.h | 171 +- Arduino/McLighting/mode_tv.h | 77 - Arduino/McLighting/request_handlers.h | 443 +-- Arduino/McLighting/rest_api.h | 110 +- Arduino/McLighting/version.h | 2 +- Arduino/McLighting/version_info.ino | 16 +- README.md | 5 + 18 files changed, 7623 insertions(+), 2458 deletions(-) create mode 100644 Arduino/McLighting/WS2812FX.cpp create mode 100644 Arduino/McLighting/WS2812FX.h create mode 100644 Arduino/McLighting/data/apple-touch-icon.png create mode 100644 Arduino/McLighting/data/edit.htm create mode 100644 Arduino/McLighting/data/index.htm.gz delete mode 100644 Arduino/McLighting/mode_tv.h diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino index b2dfae5..8a962cb 100644 --- a/Arduino/McLighting/McLighting.ino +++ b/Arduino/McLighting/McLighting.ino @@ -59,7 +59,7 @@ #endif #endif -#if defined(ENABLE_E131) +#if defined(CUSTOM_WS2812FX_ANIMATIONS) // *************************************************************************** // Load libraries for E131 support // *************************************************************************** @@ -106,7 +106,7 @@ WebSocketsServer webSocket = WebSocketsServer(81); // *************************************************************************** // Load and instanciate WS2812FX library // *************************************************************************** -#include // https://github.com/kitesurfer1404/WS2812FX +#include "WS2812FX.h" // https://github.com/kitesurfer1404/WS2812FX WS2812FX * strip = NULL; #if defined(USE_WS2812FX_DMA) @@ -250,19 +250,10 @@ void saveConfigCallback () { // *************************************************************************** #include "request_handlers.h" -#if defined(ENABLE_TV) -// *************************************************************************** -// Include: TV mode -// *************************************************************************** - #include "mode_tv.h" -#endif - -#if defined(CUSTOM_WS2812FX_ANIMATIONS) // *************************************************************************** // Include: Custom animations // *************************************************************************** - #include "mode_custom_ws2812fx_animations.h" // Add animations in this file -#endif +#include "mode_custom_ws2812fx_animations.h" // Add animations in this file // function to Initialize the strip void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, char RGBOrder[5] = WS2812FXStripSettings.RGBOrder, uint8_t pin = WS2812FXStripSettings.pin, uint8_t fxoptions = WS2812FXStripSettings.fxoptions ){ @@ -279,9 +270,7 @@ void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, char RGBOrd WS2812FXStripSettings.pin = pin; WS2812FXStripSettings.fxoptions = fxoptions; } -#if defined(ENABLE_E131) - -#endif + if (ledstates != NULL) { delete(ledstates); } @@ -310,13 +299,16 @@ void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, char RGBOrd strip->setCustomShow(DMA_Show); #endif //parameters: index, start, stop, mode, color, speed, options - strip->setSegment(0, 0, stripSize - 1, ws2812fx_mode, hex_colors, convertSpeed(ws2812fx_speed), fxoptions); + strip->setSegment(selected_segment, 0, stripSize - 1, ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions); + strip->setCustomMode(0, F("Autoplay"), myCustomEffect0); + strip->setCustomMode(1, F("Custom WS"), myCustomEffect1); #if defined(CUSTOM_WS2812FX_ANIMATIONS) - strip->setCustomMode(0, F("Fire 2012"), myCustomEffect0); - strip->setCustomMode(1, F("Gradient"), myCustomEffect1); + strip->setCustomMode(2, F("TV"), myCustomEffect2); + strip->setCustomMode(3, F("E1.31"), myCustomEffect3); + strip->setCustomMode(4, F("Fire 2012"), myCustomEffect4); + strip->setCustomMode(5, F("Gradient"), myCustomEffect5); gReverseDirection = (WS2812FXStripSettings.fxoptions & 128); -#endif -#if defined(ENABLE_E131) + if (e131 != NULL) { delete(e131); } e131 = new ESPAsyncE131(END_UNIVERSE - START_UNIVERSE + 1); float universe_leds = 170.0; // a universe has only 512 (0..511) channels: 3*170 or 4*128 <= 512 @@ -559,15 +551,15 @@ void setup() { (writeConfigFS(updateConfig)) ? DBG_OUTPUT_PORT.println("WiFiManager config FS Save success!"): DBG_OUTPUT_PORT.println("WiFiManager config FS Save failure!"); #endif #if ENABLE_STATE_SAVE == 0 - char last_conf[223]; + char last_conf[225]; DBG_OUTPUT_PORT.println("Saving WiFiManager config"); #if defined(ENABLE_MQTT) - snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d", HOSTNAME, mqtt_host, mqtt_port, mqtt_user, mqtt_pass, WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions); + snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d|%1d", HOSTNAME, mqtt_host, mqtt_port, mqtt_user, mqtt_pass, WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions, transEffect); #else - snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d", HOSTNAME, "", "", "", "", WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions); + snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d|%1d", HOSTNAME, "", "", "", "", WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions, transEffect); #endif last_conf[sizeof(last_conf)] = 0x00; - writeEEPROM(0, 222, last_conf); + writeEEPROM(0, 224, last_conf); EEPROM.commit(); updateConfig = false; #endif @@ -681,9 +673,12 @@ void setup() { #endif snprintf(last_state, sizeof(last_state), "STA|%2d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d", mode, ws2812fx_mode, ws2812fx_speed, brightness, main_color.red, main_color.green, main_color.blue, main_color.white, back_color.red, back_color.green, back_color.blue, back_color.white, xtra_color.red, xtra_color.green, xtra_color.blue,xtra_color.white); last_state[sizeof(last_state)]= 0x00; - DBG_OUTPUT_PORT.println("finished Main Setup!"); - + ws2812fx_speed_actual = ws2812fx_speed; + brightness_trans = brightness; + memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); initStrip(); + strip->setBrightness(0); + DBG_OUTPUT_PORT.println("finished Main Setup!"); } // *************************************************************************** @@ -741,81 +736,38 @@ void loop() { // *************************************************************************** // Simple statemachine that handles the different modes // *************************************************************************** - if ((mode != OFF) && (mode != TV) && (mode != E131)) { // strip->start() is only needed for modes with WS2812FX functionality - if(!strip->isRunning()) strip->start(); - } - - if (((mode == OFF) && (brightness_actual == 0)) || (mode == TV) || (mode == E131)) { + if ((mode == OFF) && ((strip->getBrightness() == 0) || !transEffect)) { if(strip->isRunning()) { strip->strip_off(); // Workaround: to be shure, delay(10); // that strip is really off. Sometimes strip->stop isn't enought strip->stop(); // should clear memory + autoCount = 0; + autoDelay = 0; } else { if (prevmode != mode) { // Start temporarily to clear strip strip->start(); strip->strip_off(); // Workaround: to be shure, delay(10); // that strip is really off. Sometimes strip->stop isn't enought strip->stop(); // should clear memory + autoCount = 0; + autoDelay = 0; } } } - - if (( mode == AUTO) || (mode == HOLD) || ((mode == OFF) && (brightness !=0))) { - strip->service(); // strip->service() is only needed for modes with WS2812FX functionality - } - - if ((prevmode == AUTO) && (mode != AUTO)) { - handleAutoStop(); // stop auto mode - } - + if (mode == OFF) { if (prevmode != mode) { #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =off", ""); #endif - if (fadeEffect) { - brightness_fade = 0; + if (transEffect) { + brightness_trans = 0; } } } - - if (mode == AUTO) { - if (prevmode != mode) { - brightness_fade = brightness; - handleAutoStart(); - #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =auto", ""); - #endif - } - } - - #if defined(ENABLE_TV) - if (mode == TV) { - if (prevmode != mode) { - brightness_fade = brightness; - #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =tv", ""); - #endif - } - handleTV(); - } - #endif - - #if defined(ENABLE_E131) - if (mode == E131) { - if (prevmode != mode) { - brightness_fade = brightness; - #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =e131", ""); - #endif - } - handleE131(); - } - #endif - + if (mode == INIT_STRIP) { mode = prevmode; - //ws2812fx_mode = strip->getMode(); strip->strip_off(); delay(10); if(strip->isRunning()) strip->stop(); @@ -823,58 +775,34 @@ void loop() { prevmode = INIT_STRIP; } - if (mode == SET_ALL) { - mode = prevmode; - if ((prevmode == OFF) || (prevmode == AUTO) || (prevmode == TV) || (prevmode == E131)) { - setModeByStateString(last_state); - } + if (mode == SET) { + mode = HOLD; + if (ws2812fx_mode != strip->getMode(selected_segment)) { // SET_MODE #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", ws2812fx_mode); #endif - strip->setMode(ws2812fx_mode); - if (fade_cnt==0) { fade_cnt=1; } - if (!fadeEffect) { fade_cnt=255; } - brightness_fade = brightness; - convertColors(); - prevmode = SET_ALL; + strip->strip_off(); + autoCount = 0; + autoDelay = 0; + strip->setMode(selected_segment, ws2812fx_mode); + } + if (strip->getBrightness() != brightness) { + #if defined(ENABLE_MQTT) + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %%%i", brightness); + #endif + brightness_trans = brightness; + } + prevmode = SET; strip->trigger(); } - - if (mode == SET_MODE) { + + /*if (mode == SET) { mode = HOLD; - #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", ws2812fx_mode); - #endif - strip->setMode(ws2812fx_mode); - brightness_fade = brightness; - prevmode = SET_MODE; - strip->trigger(); - } - - if (mode == SET_COLOR) { - if (fade_cnt==0) { fade_cnt=1; } - if (!fadeEffect) { fade_cnt=255; } - convertColors(); - mode = prevmode; - prevmode = SET_COLOR; - } - // Async color transition - if ((fade_cnt > 0) && (fade_cnt < 254)) { - if ((fadeEffect) && (colorFadeDelay <= millis())) { - hex_colors_actual[0] = fade(hex_colors[0], hex_colors_mem[0], fade_cnt); - hex_colors_actual[1] = fade(hex_colors[1], hex_colors_mem[1], fade_cnt); - hex_colors_actual[2] = fade(hex_colors[2], hex_colors_mem[2], fade_cnt); - fade_cnt++; - colorFadeDelay = millis() + FADE_COLOR_DELAY; - strip->setColors(0, hex_colors_actual); - if ((mode == HOLD) && ((ws2812fx_mode != 1) && (ws2812fx_mode != 2) && (ws2812fx_mode != 8) && (ws2812fx_mode != 9) &&(ws2812fx_mode != 10) && (ws2812fx_mode != 15))) strip->trigger(); - } - } - if (fade_cnt >= 254) { - strip->setColors(0, hex_colors); - if (mode == HOLD) strip->trigger(); - fade_cnt = 0; - } + if (trans_cnt==0) { trans_cnt=1; } + if (!transEffect) { trans_cnt=255; } + convertColorsFade(); + prevmode = SET; + }*/ if (mode == SET_SPEED) { #if defined(ENABLE_MQTT) @@ -883,57 +811,17 @@ void loop() { mode = prevmode; prevmode = SET_SPEED; } - // Async speed transition - if (ws2812fx_speed_actual != ws2812fx_speed) { - if (fadeEffect) { - if (speedFadeDelay <= millis()) { - if (ws2812fx_speed_actual < ws2812fx_speed) { - ws2812fx_speed_actual++; - } - if (ws2812fx_speed_actual > ws2812fx_speed) { - ws2812fx_speed_actual--; - } - speedFadeDelay = millis() + FADE_DELAY; - strip->setSpeed(convertSpeed(ws2812fx_speed_actual)); - if ((mode == HOLD) && ((ws2812fx_mode != 1) && (ws2812fx_mode != 2) && (ws2812fx_mode != 8) && (ws2812fx_mode != 9) &&(ws2812fx_mode != 10) && (ws2812fx_mode != 15))) strip->trigger(); - } - } else { - ws2812fx_speed_actual = ws2812fx_speed; - strip->setSpeed(ws2812fx_speed); - if (mode == HOLD) strip->trigger(); - } - } - - if (mode == SET_BRIGHTNESS) { - #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %%%i", brightness); - #endif - brightness_fade = brightness; - mode = prevmode; - prevmode = SET_BRIGHTNESS; - } - // Async brightness transition - if (brightness_actual != brightness_fade) { - if (fadeEffect) { - if(brightnessFadeDelay <= millis()) { - if (brightness_actual < brightness_fade) { - brightness_actual++; - } - if (brightness_actual > brightness_fade) { - brightness_actual--; - } - brightnessFadeDelay = millis() + FADE_DELAY; - strip->setBrightness(brightness_actual); - if ((mode == HOLD) && ((ws2812fx_mode != 1) && (ws2812fx_mode != 2) && (ws2812fx_mode != 8) && (ws2812fx_mode != 9) &&(ws2812fx_mode != 10) && (ws2812fx_mode != 15))) strip->trigger(); - } - } else { - brightness_actual = brightness; - strip->setBrightness(brightness_actual); - if (mode == HOLD) strip->trigger(); - } - } - + if (prevmode != mode) { + convertColors(); + if (memcmp(hex_colors_trans, strip->getColors(selected_segment), sizeof(hex_colors_trans)) != 0) { + DBG_OUTPUT_PORT.println("Colors not equal!"); + if (trans_cnt==0) { trans_cnt=1; } + if (!transEffect) { trans_cnt=255; } + convertColorsFade(); + } + strip->setSpeed(selected_segment, convertSpeed(ws2812fx_speed_actual)); + //strip->setBrightness(brightness_actual); if (prevmode != INIT_STRIP) { // do not save if INIT_STRIP mode was set #if defined(ENABLE_STATE_SAVE) if(!settings_save_state.active()) settings_save_state.once(3, tickerSaveState); @@ -970,21 +858,95 @@ void loop() { (writeConfigFS(updateConfig)) ? DBG_OUTPUT_PORT.println("Config FS Save success!"): DBG_OUTPUT_PORT.println("Config FS Save failure!"); #endif #if ENABLE_STATE_SAVE == 0 - char last_conf[223]; + char last_conf[225]; #if defined(ENABLE_MQTT) - snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d", HOSTNAME, mqtt_host, mqtt_port, mqtt_user, mqtt_pass, WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions); + snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d|%1d", HOSTNAME, mqtt_host, mqtt_port, mqtt_user, mqtt_pass, WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions, transEffect); #else - snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d", HOSTNAME, "", "", "", "", WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions); + snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d|%1d", HOSTNAME, "", "", "", "", WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions, transEffect); #endif last_conf[sizeof(last_conf) - 1] = 0x00; - writeEEPROM(0, 222, last_conf); + writeEEPROM(0, 224, last_conf); EEPROM.commit(); updateConfig = false; settings_save_conf.detach(); #endif } #endif + + if ((mode == HOLD) || ((mode == OFF) && ((strip->getBrightness() == 0) || !transEffect))) { + if (ws2812fx_mode == FX_MODE_CUSTOM_0) { + handleAutoPlay(); + } + if(!strip->isRunning()) strip->start(); + strip->service(); + } + // Async color transition + if ((trans_cnt > 0) && (trans_cnt < 255)) { + uint32_t hex_colors_actual[3] = {}; + if ((transEffect) && (colorFadeDelay <= millis())) { + hex_colors_actual[0] = trans(hex_colors_trans[0], hex_colors[0], trans_cnt); + hex_colors_actual[1] = trans(hex_colors_trans[1], hex_colors[1], trans_cnt); + hex_colors_actual[2] = trans(hex_colors_trans[2], hex_colors[2], trans_cnt); + strip->setColors(selected_segment, hex_colors_actual); + trans_cnt++; + colorFadeDelay = millis() + TRANS_COLOR_DELAY; + if (mode == HOLD) strip->trigger(); + } + } + if (trans_cnt > 254) { + memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); + strip->setColors(selected_segment, hex_colors); + if (mode == HOLD) strip->trigger(); + trans_cnt = 0; + DBG_OUTPUT_PORT.println("Color transition finished!"); + } + + // Async speed transition + if (ws2812fx_speed_actual != ws2812fx_speed) { + if (transEffect) { + if (speedFadeDelay <= millis()) { + DBG_OUTPUT_PORT.println("Speed actual: "); + DBG_OUTPUT_PORT.println(ws2812fx_speed_actual); + DBG_OUTPUT_PORT.println(convertSpeed(ws2812fx_speed_actual)); + DBG_OUTPUT_PORT.println(unconvertSpeed(convertSpeed(ws2812fx_speed_actual))); + if (ws2812fx_speed_actual < ws2812fx_speed) { + ws2812fx_speed_actual++; + } + if (ws2812fx_speed_actual > ws2812fx_speed) { + ws2812fx_speed_actual--; + } + speedFadeDelay = millis() + TRANS_DELAY; + strip->setSpeed(selected_segment, convertSpeed(ws2812fx_speed_actual)); + if (mode == HOLD) strip->trigger(); + } + } else { + ws2812fx_speed_actual = ws2812fx_speed; + strip->setSpeed(selected_segment, convertSpeed(ws2812fx_speed_actual)); + if (mode == HOLD) strip->trigger(); + } + } + + // Async brightness transition + if (strip->getBrightness() != brightness_trans) { + if (transEffect) { + if(brightnessFadeDelay <= millis()) { + if (strip->getBrightness() < brightness_trans) { + strip->increaseBrightness(1); + } + if (strip->getBrightness() > brightness_trans) { + strip->decreaseBrightness(1); + } + brightnessFadeDelay = millis() + TRANS_DELAY; + //if (mode == HOLD) strip->trigger(); + strip->trigger(); + } + } else { + strip->setBrightness(brightness); + if (mode == HOLD) strip->trigger(); + } + } + prevmode = mode; #if defined(ENABLE_REMOTE) diff --git a/Arduino/McLighting/WS2812FX.cpp b/Arduino/McLighting/WS2812FX.cpp new file mode 100644 index 0000000..2a665c1 --- /dev/null +++ b/Arduino/McLighting/WS2812FX.cpp @@ -0,0 +1,1643 @@ +/* + WS2812FX.cpp - Library for WS2812 LED effects. + + Harm Aldick - 2016 + www.aldick.org + + + FEATURES + * A lot of blinken modes and counting + * WS2812FX can be used as drop-in replacement for Adafruit NeoPixel Library + + NOTES + * Uses the Adafruit NeoPixel library. Get it here: + https://github.com/adafruit/Adafruit_NeoPixel + + + + LICENSE + + The MIT License (MIT) + + Copyright (c) 2016 Harm Aldick + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + + CHANGELOG + + 2016-05-28 Initial beta release + 2016-06-03 Code cleanup, minor improvements, new modes + 2016-06-04 2 new fx, fixed setColor (now also resets _mode_color) + 2017-02-02 added external trigger functionality (e.g. for sound-to-light) + 2017-02-02 removed "blackout" on mode, speed or color-change + 2017-09-26 implemented segment and reverse features + 2017-11-16 changed speed calc, reduced memory footprint + 2018-02-24 added hooks for user created custom effects +*/ + +#include "WS2812FX.h" + +void WS2812FX::init() { + resetSegmentRuntimes(); + Adafruit_NeoPixel::begin(); +} + +// void WS2812FX::timer() { +// for (int j=0; j < 1000; j++) { +// uint16_t delay = (this->*_mode[SEGMENT.mode])(); +// } +// } + +void WS2812FX::service() { + if(_running || _triggered) { + unsigned long now = millis(); // Be aware, millis() rolls over every 49 days + bool doShow = false; + for(uint8_t i=0; i < _num_segments; i++) { + _segment_index = i; + CLR_FRAME; + if(now > SEGMENT_RUNTIME.next_time || _triggered) { + SET_FRAME; + doShow = true; + uint16_t delay = (this->*_mode[SEGMENT.mode])(); + SEGMENT_RUNTIME.next_time = now + max(delay, SPEED_MIN); + SEGMENT_RUNTIME.counter_mode_call++; + } + } + if(doShow) { + delay(1); // for ESP32 (see https://forums.adafruit.com/viewtopic.php?f=47&t=117327) + show(); + } + _triggered = false; + } +} + +// overload setPixelColor() functions so we can use gamma correction +// (see https://learn.adafruit.com/led-tricks-gamma-correction/the-issue) +void WS2812FX::setPixelColor(uint16_t n, uint32_t c) { + if(IS_GAMMA) { + uint8_t w = (c >> 24) & 0xFF; + uint8_t r = (c >> 16) & 0xFF; + uint8_t g = (c >> 8) & 0xFF; + uint8_t b = c & 0xFF; + Adafruit_NeoPixel::setPixelColor(n, gamma8(r), gamma8(g), gamma8(b), gamma8(w)); + } else { + Adafruit_NeoPixel::setPixelColor(n, c); + } +} + +void WS2812FX::setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b) { + if(IS_GAMMA) { + Adafruit_NeoPixel::setPixelColor(n, gamma8(r), gamma8(g), gamma8(b)); + } else { + Adafruit_NeoPixel::setPixelColor(n, r, g, b); + } +} + +void WS2812FX::setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b, uint8_t w) { + if(IS_GAMMA) { + Adafruit_NeoPixel::setPixelColor(n, gamma8(r), gamma8(g), gamma8(b), gamma8(w)); + } else { + Adafruit_NeoPixel::setPixelColor(n, r, g, b, w); + } +} + +void WS2812FX::copyPixels(uint16_t dest, uint16_t src, uint16_t count) { + uint8_t *pixels = getPixels(); + uint8_t bytesPerPixel = getNumBytesPerPixel(); // 3=RGB, 4=RGBW + + memmove(pixels + (dest * bytesPerPixel), pixels + (src * bytesPerPixel), count * bytesPerPixel); +} + +// overload show() functions so we can use custom show() +void WS2812FX::show(void) { + if(customShow == NULL) { + Adafruit_NeoPixel::show(); + } else { + customShow(); + } +} + +void WS2812FX::start() { + resetSegmentRuntimes(); + _running = true; +} + +void WS2812FX::stop() { + _running = false; + strip_off(); +} + +void WS2812FX::pause() { + _running = false; +} + +void WS2812FX::resume() { + _running = true; +} + +void WS2812FX::trigger() { + _triggered = true; +} + +void WS2812FX::setMode(uint8_t m) { + setMode(0, m); +} + +void WS2812FX::setMode(uint8_t seg, uint8_t m) { + resetSegmentRuntime(seg); + _segments[seg].mode = constrain(m, 0, MODE_COUNT - 1); +} + +void WS2812FX::setOptions(uint8_t seg, uint8_t o) { + _segments[seg].options = o; +} + +void WS2812FX::setSpeed(uint16_t s) { + setSpeed(0, s); +} + +void WS2812FX::setSpeed(uint8_t seg, uint16_t s) { +// resetSegmentRuntime(seg); + _segments[seg].speed = constrain(s, SPEED_MIN, SPEED_MAX); +} + +void WS2812FX::increaseSpeed(uint8_t s) { + uint16_t newSpeed = constrain(SEGMENT.speed + s, SPEED_MIN, SPEED_MAX); + setSpeed(newSpeed); +} + +void WS2812FX::decreaseSpeed(uint8_t s) { + uint16_t newSpeed = constrain(SEGMENT.speed - s, SPEED_MIN, SPEED_MAX); + setSpeed(newSpeed); +} + +void WS2812FX::setColor(uint8_t r, uint8_t g, uint8_t b) { + setColor(((uint32_t)r << 16) | ((uint32_t)g << 8) | b); +} + +void WS2812FX::setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { + setColor((((uint32_t)w << 24)| ((uint32_t)r << 16) | ((uint32_t)g << 8)| ((uint32_t)b))); +} + +void WS2812FX::setColor(uint32_t c) { + setColor(0, c); +} + +void WS2812FX::setColor(uint8_t seg, uint32_t c) { +// resetSegmentRuntime(seg); + _segments[seg].colors[0] = c; +} + +void WS2812FX::setColors(uint8_t seg, uint32_t* c) { +// resetSegmentRuntime(seg); + for(uint8_t i=0; i 1); + + _segments[0].start = 0; + _segments[0].stop = Adafruit_NeoPixel::numLEDs - 1; +} + +void WS2812FX::increaseLength(uint16_t s) { + s = _segments[0].stop - _segments[0].start + 1 + s; + setLength(s); +} + +void WS2812FX::decreaseLength(uint16_t s) { + if (s > _segments[0].stop - _segments[0].start + 1) s = 1; + s = _segments[0].stop - _segments[0].start + 1 - s; + + for(uint16_t i=_segments[0].start + s; i <= (_segments[0].stop - _segments[0].start + 1); i++) { + setPixelColor(i, 0); + } + show(); + + setLength(s); +} + +boolean WS2812FX::isRunning() { + return _running; +} + +boolean WS2812FX::isTriggered() { + return _triggered; +} + +boolean WS2812FX::isFrame() { + return isFrame(0); +} + +boolean WS2812FX::isFrame(uint8_t segIndex) { + return (_segment_runtimes[segIndex].aux_param2 & FRAME); +} + +boolean WS2812FX::isCycle() { + return isCycle(0); +} + +boolean WS2812FX::isCycle(uint8_t segIndex) { + return (_segment_runtimes[segIndex].aux_param2 & CYCLE); +} + +uint8_t WS2812FX::getMode(void) { + return getMode(0); +} + +uint8_t WS2812FX::getMode(uint8_t seg) { + return _segments[seg].mode; +} + +uint16_t WS2812FX::getSpeed(void) { + return getSpeed(0); +} + +uint16_t WS2812FX::getSpeed(uint8_t seg) { + return _segments[seg].speed; +} + + +uint8_t WS2812FX::getOptions(uint8_t seg) { + return _segments[seg].options; +} + +uint16_t WS2812FX::getLength(void) { + return numPixels(); +} + +uint16_t WS2812FX::getNumBytes(void) { + return numBytes; +} + +uint8_t WS2812FX::getNumBytesPerPixel(void) { + return (wOffset == rOffset) ? 3 : 4; // 3=RGB, 4=RGBW +} + +uint8_t WS2812FX::getModeCount(void) { + return MODE_COUNT; +} + +uint8_t WS2812FX::getNumSegments(void) { + return _num_segments; +} + +void WS2812FX::setNumSegments(uint8_t n) { + _num_segments = n; +} + +uint32_t WS2812FX::getColor(void) { + return getColor(0); +} + +uint32_t WS2812FX::getColor(uint8_t seg) { + return _segments[seg].colors[0]; +} + +uint32_t* WS2812FX::getColors(uint8_t seg) { + return _segments[seg].colors; +} + +WS2812FX::Segment* WS2812FX::getSegment(void) { + return &_segments[_segment_index]; +} + +WS2812FX::Segment* WS2812FX::getSegment(uint8_t seg) { + return &_segments[seg]; +} + +WS2812FX::Segment* WS2812FX::getSegments(void) { + return _segments; +} + +WS2812FX::Segment_runtime* WS2812FX::getSegmentRuntime(void) { + return &_segment_runtimes[_segment_index]; +} + +WS2812FX::Segment_runtime* WS2812FX::getSegmentRuntime(uint8_t seg) { + return &_segment_runtimes[seg]; +} + +WS2812FX::Segment_runtime* WS2812FX::getSegmentRuntimes(void) { + return _segment_runtimes; +} + +const __FlashStringHelper* WS2812FX::getModeName(uint8_t m) { + if(m < MODE_COUNT) { + return _names[m]; + } else { + return F(""); + } +} + +void WS2812FX::setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t mode, uint32_t color, uint16_t speed, bool reverse) { + uint32_t colors[] = {color, 0, 0}; + setSegment(n, start, stop, mode, colors, speed, reverse); +} + +void WS2812FX::setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t mode, uint32_t color, uint16_t speed, uint8_t options) { + uint32_t colors[] = {color, 0, 0}; + setSegment(n, start, stop, mode, colors, speed, options); +} + +void WS2812FX::setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t mode, const uint32_t colors[], uint16_t speed, bool reverse) { + setSegment(n, start, stop, mode, colors, speed, (uint8_t)(reverse ? REVERSE : NO_OPTIONS)); +} + +void WS2812FX::setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t mode, const uint32_t colors[], uint16_t speed, uint8_t options) { + if(n < (sizeof(_segments) / sizeof(_segments[0]))) { + if(n + 1 > _num_segments) _num_segments = n + 1; + _segments[n].start = start; + _segments[n].stop = stop; + _segments[n].mode = mode; + _segments[n].speed = speed; + _segments[n].options = options; + + for(uint8_t i=0; i g -> b -> back to r + * Inspired by the Adafruit examples. + */ +uint32_t WS2812FX::color_wheel(uint8_t pos) { + pos = 255 - pos; + if(pos < 85) { + return ((uint32_t)(255 - pos * 3) << 16) | ((uint32_t)(0) << 8) | (pos * 3); + } else if(pos < 170) { + pos -= 85; + return ((uint32_t)(0) << 16) | ((uint32_t)(pos * 3) << 8) | (255 - pos * 3); + } else { + pos -= 170; + return ((uint32_t)(pos * 3) << 16) | ((uint32_t)(255 - pos * 3) << 8) | (0); + } +} + + +/* + * Returns a new, random wheel index with a minimum distance of 42 from pos. + */ +uint8_t WS2812FX::get_random_wheel_index(uint8_t pos) { + uint8_t r = 0; + uint8_t x = 0; + uint8_t y = 0; + uint8_t d = 0; + + while(d < 42) { + r = random8(); + x = abs(pos - r); + y = 255 - x; + d = min(x, y); + } + + return r; +} + +// fast 8-bit random number generator shamelessly borrowed from FastLED +uint8_t WS2812FX::random8() { + _rand16seed = (_rand16seed * 2053) + 13849; + return (uint8_t)((_rand16seed + (_rand16seed >> 8)) & 0xFF); +} + +// note random8(lim) generates numbers in the range 0 to (lim -1) +uint8_t WS2812FX::random8(uint8_t lim) { + uint8_t r = random8(); + r = (r * lim) >> 8; + return r; +} + +uint16_t WS2812FX::random16() { + return (uint16_t)random8() * 256 + random8(); +} + +// note random16(lim) generates numbers in the range 0 to (lim - 1) +uint16_t WS2812FX::random16(uint16_t lim) { + uint16_t r = random16(); + r = ((uint32_t)r * lim) >> 16; + return r; +} + +// Return the sum of all LED intensities (can be used for +// rudimentary power calculations) +uint32_t WS2812FX::intensitySum() { + uint8_t *pixels = getPixels(); + uint32_t sum = 0; + for(uint16_t i=0; i 255) lum = 511 - lum; // lum = 15 -> 255 -> 15 + + uint16_t delay; + if(lum == 15) delay = 970; // 970 pause before each breath + else if(lum <= 25) delay = 38; // 19 + else if(lum <= 50) delay = 36; // 18 + else if(lum <= 75) delay = 28; // 14 + else if(lum <= 100) delay = 20; // 10 + else if(lum <= 125) delay = 14; // 7 + else if(lum <= 150) delay = 11; // 5 + else delay = 10; // 4 + + uint32_t color = SEGMENT.colors[0]; + uint8_t w = (color >> 24 & 0xFF) * lum / 256; + uint8_t r = (color >> 16 & 0xFF) * lum / 256; + uint8_t g = (color >> 8 & 0xFF) * lum / 256; + uint8_t b = (color & 0xFF) * lum / 256; + for(uint16_t i=SEGMENT.start; i <= SEGMENT.stop; i++) { + setPixelColor(i, r, g, b, w); + } + + SEGMENT_RUNTIME.counter_mode_step += 2; + if(SEGMENT_RUNTIME.counter_mode_step > (512-15)) SEGMENT_RUNTIME.counter_mode_step = 15; + return delay; +} + + +/* + * Fades the LEDs between two colors + */ +uint16_t WS2812FX::mode_fade(void) { + int lum = SEGMENT_RUNTIME.counter_mode_step; + if(lum > 255) lum = 511 - lum; // lum = 0 -> 255 -> 0 + + uint32_t color = color_blend(SEGMENT.colors[0], SEGMENT.colors[1], lum); + for(uint16_t i=SEGMENT.start; i <= SEGMENT.stop; i++) { + setPixelColor(i, color); + } + + SEGMENT_RUNTIME.counter_mode_step += 4; + if(SEGMENT_RUNTIME.counter_mode_step > 511) SEGMENT_RUNTIME.counter_mode_step = 0; + return (SEGMENT.speed / 128); +} + + +/* + * scan function - runs a block of pixels back and forth. + */ +uint16_t WS2812FX::scan(uint32_t color1, uint32_t color2, bool dual) { + int8_t dir = SEGMENT_RUNTIME.aux_param ? -1 : 1; + uint8_t size = 1 << SIZE_OPTION; + + for(uint16_t i=SEGMENT.start; i <= SEGMENT.stop; i++) { + setPixelColor(i, color2); + } + + for(uint8_t i = 0; i < size; i++) { + if(IS_REVERSE || dual) { + setPixelColor(SEGMENT.stop - SEGMENT_RUNTIME.counter_mode_step - i, color1); + } + if(!IS_REVERSE || dual) { + setPixelColor(SEGMENT.start + SEGMENT_RUNTIME.counter_mode_step + i, color1); + } + } + + SEGMENT_RUNTIME.counter_mode_step += dir; + if(SEGMENT_RUNTIME.counter_mode_step == 0) SEGMENT_RUNTIME.aux_param = 0; + if(SEGMENT_RUNTIME.counter_mode_step >= (SEGMENT_LENGTH - size)) SEGMENT_RUNTIME.aux_param = 1; + + return (SEGMENT.speed / (SEGMENT_LENGTH * 2)); +} + + +/* + * Runs a block of pixels back and forth. + */ +uint16_t WS2812FX::mode_scan(void) { + return scan(SEGMENT.colors[0], SEGMENT.colors[1], false); +} + + +/* + * Runs two blocks of pixels back and forth in opposite directions. + */ +uint16_t WS2812FX::mode_dual_scan(void) { + return scan(SEGMENT.colors[0], SEGMENT.colors[1], true); +} + + +/* + * Cycles all LEDs at once through a rainbow. + */ +uint16_t WS2812FX::mode_rainbow(void) { + uint32_t color = color_wheel(SEGMENT_RUNTIME.counter_mode_step); + for(uint16_t i=SEGMENT.start; i <= SEGMENT.stop; i++) { + setPixelColor(i, color); + } + + SEGMENT_RUNTIME.counter_mode_step = (SEGMENT_RUNTIME.counter_mode_step + 1) & 0xFF; + return (SEGMENT.speed / 256); +} + + +/* + * Cycles a rainbow over the entire string of LEDs. + */ +uint16_t WS2812FX::mode_rainbow_cycle(void) { + for(uint16_t i=0; i < SEGMENT_LENGTH; i++) { + uint32_t color = color_wheel(((i * 256 / SEGMENT_LENGTH) + SEGMENT_RUNTIME.counter_mode_step) & 0xFF); + setPixelColor(SEGMENT.start + i, color); + } + + SEGMENT_RUNTIME.counter_mode_step = (SEGMENT_RUNTIME.counter_mode_step + 1) & 0xFF; + return (SEGMENT.speed / 256); +} + + +/* + * Theatre-style crawling lights. + * Inspired by the Adafruit examples. + */ +uint16_t WS2812FX::mode_theater_chase(void) { + return tricolor_chase(SEGMENT.colors[0], SEGMENT.colors[1], SEGMENT.colors[1]); +} + + +/* + * Theatre-style crawling lights with rainbow effect. + * Inspired by the Adafruit examples. + */ +uint16_t WS2812FX::mode_theater_chase_rainbow(void) { + SEGMENT_RUNTIME.counter_mode_step = (SEGMENT_RUNTIME.counter_mode_step + 1) & 0xFF; + uint32_t color = color_wheel(SEGMENT_RUNTIME.counter_mode_step); + return tricolor_chase(color, SEGMENT.colors[1], SEGMENT.colors[1]); +} + + +/* + * Running lights effect with smooth sine transition. + */ +uint16_t WS2812FX::mode_running_lights(void) { + uint8_t w = ((SEGMENT.colors[0] >> 24) & 0xFF); + uint8_t r = ((SEGMENT.colors[0] >> 16) & 0xFF); + uint8_t g = ((SEGMENT.colors[0] >> 8) & 0xFF); + uint8_t b = (SEGMENT.colors[0] & 0xFF); + + uint8_t size = 1 << SIZE_OPTION; + uint8_t sineIncr = max(1, (256 / SEGMENT_LENGTH) * size); + for(uint16_t i=0; i < SEGMENT_LENGTH; i++) { + int lum = (int)sine8(((i + SEGMENT_RUNTIME.counter_mode_step) * sineIncr)); + if(IS_REVERSE) { + setPixelColor(SEGMENT.start + i, (r * lum) / 256, (g * lum) / 256, (b * lum) / 256, (w * lum) / 256); + } else { + setPixelColor(SEGMENT.stop - i, (r * lum) / 256, (g * lum) / 256, (b * lum) / 256, (w * lum) / 256); + } + } + SEGMENT_RUNTIME.counter_mode_step = (SEGMENT_RUNTIME.counter_mode_step + 1) % 256; + return (SEGMENT.speed / SEGMENT_LENGTH); +} + + +/* + * twinkle function + */ +uint16_t WS2812FX::twinkle(uint32_t color1, uint32_t color2) { + if(SEGMENT_RUNTIME.counter_mode_step == 0) { + for(uint16_t i=SEGMENT.start; i <= SEGMENT.stop; i++) { + setPixelColor(i, color2); + } + uint16_t min_leds = max(1, SEGMENT_LENGTH / 5); // make sure, at least one LED is on + uint16_t max_leds = max(1, SEGMENT_LENGTH / 2); // make sure, at least one LED is on + SEGMENT_RUNTIME.counter_mode_step = random(min_leds, max_leds); + } + + setPixelColor(SEGMENT.start + random16(SEGMENT_LENGTH), color1); + + SEGMENT_RUNTIME.counter_mode_step--; + return (SEGMENT.speed / SEGMENT_LENGTH); +} + +/* + * Blink several LEDs on, reset, repeat. + * Inspired by www.tweaking4all.com/hardware/arduino/arduino-led-strip-effects/ + */ +uint16_t WS2812FX::mode_twinkle(void) { + return twinkle(SEGMENT.colors[0], SEGMENT.colors[1]); +} + +/* + * Blink several LEDs in random colors on, reset, repeat. + * Inspired by www.tweaking4all.com/hardware/arduino/arduino-led-strip-effects/ + */ +uint16_t WS2812FX::mode_twinkle_random(void) { + return twinkle(color_wheel(random8()), SEGMENT.colors[1]); +} + + +/* + * fade out functions + */ +void WS2812FX::fade_out() { + return fade_out(SEGMENT.colors[1]); +} + +void WS2812FX::fade_out(uint32_t targetColor) { + static const uint8_t rateMapH[] = {0, 1, 1, 1, 2, 3, 4, 6}; + static const uint8_t rateMapL[] = {0, 2, 3, 8, 8, 8, 8, 8}; + + uint8_t rate = FADE_RATE; + uint8_t rateH = rateMapH[rate]; + uint8_t rateL = rateMapL[rate]; + + uint32_t color = targetColor; + int w2 = (color >> 24) & 0xff; + int r2 = (color >> 16) & 0xff; + int g2 = (color >> 8) & 0xff; + int b2 = color & 0xff; + + for(uint16_t i=SEGMENT.start; i <= SEGMENT.stop; i++) { + color = getPixelColor(i); // current color + if(rate == 0) { // old fade-to-black algorithm + setPixelColor(i, (color >> 1) & 0x7F7F7F7F); + } else { // new fade-to-color algorithm + int w1 = (color >> 24) & 0xff; + int r1 = (color >> 16) & 0xff; + int g1 = (color >> 8) & 0xff; + int b1 = color & 0xff; + + // calculate the color differences between the current and target colors + int wdelta = w2 - w1; + int rdelta = r2 - r1; + int gdelta = g2 - g1; + int bdelta = b2 - b1; + + // if the current and target colors are almost the same, jump right to the target + // color, otherwise calculate an intermediate color. (fixes rounding issues) + wdelta = abs(wdelta) < 3 ? wdelta : (wdelta >> rateH) + (wdelta >> rateL); + rdelta = abs(rdelta) < 3 ? rdelta : (rdelta >> rateH) + (rdelta >> rateL); + gdelta = abs(gdelta) < 3 ? gdelta : (gdelta >> rateH) + (gdelta >> rateL); + bdelta = abs(bdelta) < 3 ? bdelta : (bdelta >> rateH) + (bdelta >> rateL); + + setPixelColor(i, r1 + rdelta, g1 + gdelta, b1 + bdelta, w1 + wdelta); + } + } +} + + +/* + * color blend function + */ +uint32_t WS2812FX::color_blend(uint32_t color1, uint32_t color2, uint8_t blend) { + if(blend == 0) return color1; + if(blend == 255) return color2; + + uint8_t w1 = (color1 >> 24) & 0xff; + uint8_t r1 = (color1 >> 16) & 0xff; + uint8_t g1 = (color1 >> 8) & 0xff; + uint8_t b1 = color1 & 0xff; + + uint8_t w2 = (color2 >> 24) & 0xff; + uint8_t r2 = (color2 >> 16) & 0xff; + uint8_t g2 = (color2 >> 8) & 0xff; + uint8_t b2 = color2 & 0xff; + + uint32_t w3 = ((w2 * blend) + (w1 * (255U - blend))) / 256U; + uint32_t r3 = ((r2 * blend) + (r1 * (255U - blend))) / 256U; + uint32_t g3 = ((g2 * blend) + (g1 * (255U - blend))) / 256U; + uint32_t b3 = ((b2 * blend) + (b1 * (255U - blend))) / 256U; + + return ((w3 << 24) | (r3 << 16) | (g3 << 8) | (b3)); +} + + +/* + * twinkle_fade function + */ +uint16_t WS2812FX::twinkle_fade(uint32_t color) { + fade_out(); + + if(random8(3) == 0) { + uint8_t size = 1 << SIZE_OPTION; + uint16_t index = SEGMENT.start + random16(SEGMENT_LENGTH - size); + for(uint8_t i=0; i= ((SEGMENT_LENGTH * 2) - 2)) { + SEGMENT_RUNTIME.counter_mode_step = 0; + } + + return (SEGMENT.speed / (SEGMENT_LENGTH * 2)); +} + + +/* + * Firing comets from one end. + */ +uint16_t WS2812FX::mode_comet(void) { + fade_out(); + + if(IS_REVERSE) { + setPixelColor(SEGMENT.stop - SEGMENT_RUNTIME.counter_mode_step, SEGMENT.colors[0]); + } else { + setPixelColor(SEGMENT.start + SEGMENT_RUNTIME.counter_mode_step, SEGMENT.colors[0]); + } + + SEGMENT_RUNTIME.counter_mode_step = (SEGMENT_RUNTIME.counter_mode_step + 1) % SEGMENT_LENGTH; + return (SEGMENT.speed / SEGMENT_LENGTH); +} + + +/* + * Fireworks function. + */ +uint16_t WS2812FX::fireworks(uint32_t color) { + fade_out(); + +// for better performance, manipulate the Adafruit_NeoPixels pixels[] array directly + uint8_t *pixels = getPixels(); + uint8_t bytesPerPixel = getNumBytesPerPixel(); // 3=RGB, 4=RGBW + uint16_t startPixel = SEGMENT.start * bytesPerPixel + bytesPerPixel; + uint16_t stopPixel = SEGMENT.stop * bytesPerPixel ; + for(uint16_t i=startPixel; i > 2) + + pixels[i] + + (pixels[i + bytesPerPixel] >> 2); + pixels[i] = tmpPixel > 255 ? 255 : tmpPixel; + } + + uint8_t size = 2 << SIZE_OPTION; + if(!_triggered) { + for(uint16_t i=0; i> 24) & 0xFF; + byte r = (SEGMENT.colors[0] >> 16) & 0xFF; + byte g = (SEGMENT.colors[0] >> 8) & 0xFF; + byte b = (SEGMENT.colors[0] & 0xFF); + byte lum = max(w, max(r, max(g, b))) / rev_intensity; + for(uint16_t i=SEGMENT.start; i <= SEGMENT.stop; i++) { + int flicker = random8(lum); + setPixelColor(i, max(r - flicker, 0), max(g - flicker, 0), max(b - flicker, 0), max(w - flicker, 0)); + } + return (SEGMENT.speed / SEGMENT_LENGTH); +} + +/* + * Random flickering. + */ +uint16_t WS2812FX::mode_fire_flicker(void) { + return fire_flicker(3); +} + +/* +* Random flickering, less intensity. +*/ +uint16_t WS2812FX::mode_fire_flicker_soft(void) { + return fire_flicker(6); +} + +/* +* Random flickering, more intensity. +*/ +uint16_t WS2812FX::mode_fire_flicker_intense(void) { + return fire_flicker(1.7); +} + + +/* + * Tricolor chase function + */ +uint16_t WS2812FX::tricolor_chase(uint32_t color1, uint32_t color2, uint32_t color3) { + uint8_t sizeCnt = 1 << SIZE_OPTION; + uint16_t index = SEGMENT_RUNTIME.counter_mode_call % (sizeCnt * 3); + for(uint16_t i=0; i < SEGMENT_LENGTH; i++, index++) { + index = index % (sizeCnt * 3); + + uint32_t color = color3; + if(index < sizeCnt) color = color1; + else if(index < (sizeCnt * 2)) color = color2; + + if(IS_REVERSE) { + setPixelColor(SEGMENT.start + i, color); + } else { + setPixelColor(SEGMENT.stop - i, color); + } + } + + return (SEGMENT.speed / SEGMENT_LENGTH); +} + + +/* + * Tricolor chase mode + */ +uint16_t WS2812FX::mode_tricolor_chase(void) { + return tricolor_chase(SEGMENT.colors[0], SEGMENT.colors[1], SEGMENT.colors[2]); +} + + +/* + * Alternating white/red/black pixels running. + */ +uint16_t WS2812FX::mode_circus_combustus(void) { + return tricolor_chase(RED, WHITE, BLACK); +} + +/* + * ICU mode + */ +uint16_t WS2812FX::mode_icu(void) { + uint16_t dest = SEGMENT_RUNTIME.counter_mode_step & 0xFFFF; + + setPixelColor(SEGMENT.start + dest, SEGMENT.colors[0]); + setPixelColor(SEGMENT.start + dest + SEGMENT_LENGTH/2, SEGMENT.colors[0]); + + if(SEGMENT_RUNTIME.aux_param3 == dest) { // pause between eye movements + if(random8(6) == 0) { // blink once in a while + setPixelColor(SEGMENT.start + dest, BLACK); + setPixelColor(SEGMENT.start + dest + SEGMENT_LENGTH/2, BLACK); + return 200; + } + SEGMENT_RUNTIME.aux_param3 = random16(SEGMENT_LENGTH/2); + return 1000 + random16(2000); + } + + setPixelColor(SEGMENT.start + dest, BLACK); + setPixelColor(SEGMENT.start + dest + SEGMENT_LENGTH/2, BLACK); + + if(SEGMENT_RUNTIME.aux_param3 > SEGMENT_RUNTIME.counter_mode_step) { + SEGMENT_RUNTIME.counter_mode_step++; + dest++; + } else if (SEGMENT_RUNTIME.aux_param3 < SEGMENT_RUNTIME.counter_mode_step) { + SEGMENT_RUNTIME.counter_mode_step--; + dest--; + } + + setPixelColor(SEGMENT.start + dest, SEGMENT.colors[0]); + setPixelColor(SEGMENT.start + dest + SEGMENT_LENGTH/2, SEGMENT.colors[0]); + + return (SEGMENT.speed / SEGMENT_LENGTH); +} + +/* + * Custom modes + */ +uint16_t WS2812FX::mode_custom_0() { + return customModes[0](); +} +uint16_t WS2812FX::mode_custom_1() { + return customModes[1](); +} +uint16_t WS2812FX::mode_custom_2() { + return customModes[2](); +} +uint16_t WS2812FX::mode_custom_3() { + return customModes[3](); +} +uint16_t WS2812FX::mode_custom_4() { + return customModes[4](); +} +uint16_t WS2812FX::mode_custom_5() { + return customModes[5](); +} +uint16_t WS2812FX::mode_custom_6() { + return customModes[6](); +} +uint16_t WS2812FX::mode_custom_7() { + return customModes[7](); +} +uint16_t WS2812FX::mode_custom_8() { + return customModes[8](); +} +uint16_t WS2812FX::mode_custom_9() { + return customModes[9](); +} +/* + * Custom mode helpers + */ +void WS2812FX::setCustomMode(uint16_t (*p)()) { + customModes[0] = p; +} + +uint8_t WS2812FX::setCustomMode(const __FlashStringHelper* name, uint16_t (*p)()) { + static uint8_t custom_mode_index = 0; + return setCustomMode(custom_mode_index++, name, p); +} + +uint8_t WS2812FX::setCustomMode(uint8_t index, const __FlashStringHelper* name, uint16_t (*p)()) { + if((FX_MODE_CUSTOM_0 + index) < MODE_COUNT) { + _names[FX_MODE_CUSTOM_0 + index] = name; // store the custom mode name + customModes[index] = p; // store the custom mode + + return (FX_MODE_CUSTOM_0 + index); + } + return 0; +} + +/* + * Custom show helper + */ +void WS2812FX::setCustomShow(void (*p)()) { + customShow = p; +} diff --git a/Arduino/McLighting/WS2812FX.h b/Arduino/McLighting/WS2812FX.h new file mode 100644 index 0000000..e4d4932 --- /dev/null +++ b/Arduino/McLighting/WS2812FX.h @@ -0,0 +1,650 @@ +/* + WS2812FX.h - Library for WS2812 LED effects. + + Harm Aldick - 2016 + www.aldick.org + FEATURES + * A lot of blinken modes and counting + * WS2812FX can be used as drop-in replacement for Adafruit NeoPixel Library + NOTES + * Uses the Adafruit NeoPixel library. Get it here: + https://github.com/adafruit/Adafruit_NeoPixel + LICENSE + The MIT License (MIT) + Copyright (c) 2016 Harm Aldick + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + CHANGELOG + 2016-05-28 Initial beta release + 2016-06-03 Code cleanup, minor improvements, new modes + 2016-06-04 2 new fx, fixed setColor (now also resets _mode_color) + 2017-02-02 added external trigger functionality (e.g. for sound-to-light) +*/ + +#ifndef WS2812FX_h +#define WS2812FX_h + +#define FSH(x) (__FlashStringHelper*)(x) + +#include + +#define DEFAULT_BRIGHTNESS (uint8_t)50 +#define DEFAULT_MODE (uint8_t)0 +#define DEFAULT_SPEED (uint16_t)1000 +#define DEFAULT_COLOR (uint32_t)0xFF0000 + +#if defined(ESP8266) || defined(ESP32) + //#pragma message("Compiling for ESP") + #define SPEED_MIN (uint16_t)2 +#else + //#pragma message("Compiling for Arduino") + #define SPEED_MIN (uint16_t)10 +#endif +#define SPEED_MAX (uint16_t)65535 + +#define BRIGHTNESS_MIN (uint8_t)0 +#define BRIGHTNESS_MAX (uint8_t)255 + +/* each segment uses 36 bytes of SRAM memory, so if you're application fails because of + insufficient memory, decreasing MAX_NUM_SEGMENTS may help */ +#define MAX_NUM_SEGMENTS 10 +#define NUM_COLORS 3 /* number of colors per segment */ +#define MAX_CUSTOM_MODES 10 +#define SEGMENT _segments[_segment_index] +#define SEGMENT_RUNTIME _segment_runtimes[_segment_index] +#define SEGMENT_LENGTH (SEGMENT.stop - SEGMENT.start + 1) + +// some common colors +#define RED (uint32_t)0xFF0000 +#define GREEN (uint32_t)0x00FF00 +#define BLUE (uint32_t)0x0000FF +#define WHITE (uint32_t)0xFFFFFF +#define BLACK (uint32_t)0x000000 +#define YELLOW (uint32_t)0xFFFF00 +#define CYAN (uint32_t)0x00FFFF +#define MAGENTA (uint32_t)0xFF00FF +#define PURPLE (uint32_t)0x400080 +#define ORANGE (uint32_t)0xFF3000 +#define PINK (uint32_t)0xFF1493 +#define ULTRAWHITE (uint32_t)0xFFFFFFFF +#define DARK(c) (uint32_t)((c >> 4) & 0x0f0f0f0f) + +// segment options +// bit 7: reverse animation +// bits 4-6: fade rate (0-7) +// bit 3: gamma correction +// bits 1-2: size +// bits 0: TBD +#define NO_OPTIONS (uint8_t)B00000000 +#define REVERSE (uint8_t)B10000000 +#define IS_REVERSE ((SEGMENT.options & REVERSE) == REVERSE) +#define FADE_XFAST (uint8_t)B00010000 +#define FADE_FAST (uint8_t)B00100000 +#define FADE_MEDIUM (uint8_t)B00110000 +#define FADE_SLOW (uint8_t)B01000000 +#define FADE_XSLOW (uint8_t)B01010000 +#define FADE_XXSLOW (uint8_t)B01100000 +#define FADE_GLACIAL (uint8_t)B01110000 +#define FADE_RATE ((SEGMENT.options >> 4) & 7) +#define GAMMA (uint8_t)B00001000 +#define IS_GAMMA ((SEGMENT.options & GAMMA) == GAMMA) +#define SIZE_SMALL (uint8_t)B00000000 +#define SIZE_MEDIUM (uint8_t)B00000010 +#define SIZE_LARGE (uint8_t)B00000100 +#define SIZE_XLARGE (uint8_t)B00000110 +#define SIZE_OPTION ((SEGMENT.options >> 1) & 3) + +// segment runtime options (aux_param2) +#define FRAME (uint8_t)B10000000 +#define SET_FRAME (SEGMENT_RUNTIME.aux_param2 |= FRAME) +#define CLR_FRAME (SEGMENT_RUNTIME.aux_param2 &= ~FRAME) +#define CYCLE (uint8_t)B01000000 +#define SET_CYCLE (SEGMENT_RUNTIME.aux_param2 |= CYCLE) +#define CLR_CYCLE (SEGMENT_RUNTIME.aux_param2 &= ~CYCLE) + +#define MODE_COUNT (sizeof(_names)/sizeof(_names[0])) + +#define FX_MODE_STATIC 0 +#define FX_MODE_BLINK 1 +#define FX_MODE_BREATH 2 +#define FX_MODE_COLOR_WIPE 3 +#define FX_MODE_COLOR_WIPE_INV 4 +#define FX_MODE_COLOR_WIPE_REV 5 +#define FX_MODE_COLOR_WIPE_REV_INV 6 +#define FX_MODE_COLOR_WIPE_RANDOM 7 +#define FX_MODE_RANDOM_COLOR 8 +#define FX_MODE_SINGLE_DYNAMIC 9 +#define FX_MODE_MULTI_DYNAMIC 10 +#define FX_MODE_RAINBOW 11 +#define FX_MODE_RAINBOW_CYCLE 12 +#define FX_MODE_SCAN 13 +#define FX_MODE_DUAL_SCAN 14 +#define FX_MODE_FADE 15 +#define FX_MODE_THEATER_CHASE 16 +#define FX_MODE_THEATER_CHASE_RAINBOW 17 +#define FX_MODE_RUNNING_LIGHTS 18 +#define FX_MODE_TWINKLE 19 +#define FX_MODE_TWINKLE_RANDOM 20 +#define FX_MODE_TWINKLE_FADE 21 +#define FX_MODE_TWINKLE_FADE_RANDOM 22 +#define FX_MODE_SPARKLE 23 +#define FX_MODE_FLASH_SPARKLE 24 +#define FX_MODE_HYPER_SPARKLE 25 +#define FX_MODE_STROBE 26 +#define FX_MODE_STROBE_RAINBOW 27 +#define FX_MODE_MULTI_STROBE 28 +#define FX_MODE_BLINK_RAINBOW 29 +#define FX_MODE_CHASE_WHITE 30 +#define FX_MODE_CHASE_COLOR 31 +#define FX_MODE_CHASE_RANDOM 32 +#define FX_MODE_CHASE_RAINBOW 33 +#define FX_MODE_CHASE_FLASH 34 +#define FX_MODE_CHASE_FLASH_RANDOM 35 +#define FX_MODE_CHASE_RAINBOW_WHITE 36 +#define FX_MODE_CHASE_BLACKOUT 37 +#define FX_MODE_CHASE_BLACKOUT_RAINBOW 38 +#define FX_MODE_COLOR_SWEEP_RANDOM 39 +#define FX_MODE_RUNNING_COLOR 40 +#define FX_MODE_RUNNING_RED_BLUE 41 +#define FX_MODE_RUNNING_RANDOM 42 +#define FX_MODE_LARSON_SCANNER 43 +#define FX_MODE_COMET 44 +#define FX_MODE_FIREWORKS 45 +#define FX_MODE_FIREWORKS_RANDOM 46 +#define FX_MODE_MERRY_CHRISTMAS 47 +#define FX_MODE_FIRE_FLICKER 48 +#define FX_MODE_FIRE_FLICKER_SOFT 49 +#define FX_MODE_FIRE_FLICKER_INTENSE 50 +#define FX_MODE_CIRCUS_COMBUSTUS 51 +#define FX_MODE_HALLOWEEN 52 +#define FX_MODE_BICOLOR_CHASE 53 +#define FX_MODE_TRICOLOR_CHASE 54 +#define FX_MODE_ICU 55 +#define FX_MODE_CUSTOM 56 // keep this for backward compatiblity +#define FX_MODE_CUSTOM_0 56 // custom modes need to go at the end +#define FX_MODE_CUSTOM_1 57 +#define FX_MODE_CUSTOM_2 58 +#define FX_MODE_CUSTOM_3 59 +#define FX_MODE_CUSTOM_4 60 +#define FX_MODE_CUSTOM_5 61 +#define FX_MODE_CUSTOM_6 62 +#define FX_MODE_CUSTOM_7 63 +#define FX_MODE_CUSTOM_8 64 +#define FX_MODE_CUSTOM_9 65 + +// create GLOBAL names to allow WS2812FX to compile with sketches and other libs that store strings +// in PROGMEM (get rid of the "section type conflict with __c" errors once and for all. Amen.) +const char name_0[] PROGMEM = "Static"; +const char name_1[] PROGMEM = "Blink"; +const char name_2[] PROGMEM = "Breath"; +const char name_3[] PROGMEM = "Color Wipe"; +const char name_4[] PROGMEM = "Color Wipe Inverse"; +const char name_5[] PROGMEM = "Color Wipe Reverse"; +const char name_6[] PROGMEM = "Color Wipe Reverse Inverse"; +const char name_7[] PROGMEM = "Color Wipe Random"; +const char name_8[] PROGMEM = "Random Color"; +const char name_9[] PROGMEM = "Single Dynamic"; +const char name_10[] PROGMEM = "Multi Dynamic"; +const char name_11[] PROGMEM = "Rainbow"; +const char name_12[] PROGMEM = "Rainbow Cycle"; +const char name_13[] PROGMEM = "Scan"; +const char name_14[] PROGMEM = "Dual Scan"; +const char name_15[] PROGMEM = "Fade"; +const char name_16[] PROGMEM = "Theater Chase"; +const char name_17[] PROGMEM = "Theater Chase Rainbow"; +const char name_18[] PROGMEM = "Running Lights"; +const char name_19[] PROGMEM = "Twinkle"; +const char name_20[] PROGMEM = "Twinkle Random"; +const char name_21[] PROGMEM = "Twinkle Fade"; +const char name_22[] PROGMEM = "Twinkle Fade Random"; +const char name_23[] PROGMEM = "Sparkle"; +const char name_24[] PROGMEM = "Flash Sparkle"; +const char name_25[] PROGMEM = "Hyper Sparkle"; +const char name_26[] PROGMEM = "Strobe"; +const char name_27[] PROGMEM = "Strobe Rainbow"; +const char name_28[] PROGMEM = "Multi Strobe"; +const char name_29[] PROGMEM = "Blink Rainbow"; +const char name_30[] PROGMEM = "Chase White"; +const char name_31[] PROGMEM = "Chase Color"; +const char name_32[] PROGMEM = "Chase Random"; +const char name_33[] PROGMEM = "Chase Rainbow"; +const char name_34[] PROGMEM = "Chase Flash"; +const char name_35[] PROGMEM = "Chase Flash Random"; +const char name_36[] PROGMEM = "Chase Rainbow White"; +const char name_37[] PROGMEM = "Chase Blackout"; +const char name_38[] PROGMEM = "Chase Blackout Rainbow"; +const char name_39[] PROGMEM = "Color Sweep Random"; +const char name_40[] PROGMEM = "Running Color"; +const char name_41[] PROGMEM = "Running Red Blue"; +const char name_42[] PROGMEM = "Running Random"; +const char name_43[] PROGMEM = "Larson Scanner"; +const char name_44[] PROGMEM = "Comet"; +const char name_45[] PROGMEM = "Fireworks"; +const char name_46[] PROGMEM = "Fireworks Random"; +const char name_47[] PROGMEM = "Merry Christmas"; +const char name_48[] PROGMEM = "Fire Flicker"; +const char name_49[] PROGMEM = "Fire Flicker (soft)"; +const char name_50[] PROGMEM = "Fire Flicker (intense)"; +const char name_51[] PROGMEM = "Circus Combustus"; +const char name_52[] PROGMEM = "Halloween"; +const char name_53[] PROGMEM = "Bicolor Chase"; +const char name_54[] PROGMEM = "Tricolor Chase"; +const char name_55[] PROGMEM = "ICU"; +const char name_56[] PROGMEM = "Custom 0"; // custom modes need to go at the end +const char name_57[] PROGMEM = "Custom 1"; +const char name_58[] PROGMEM = "Custom 2"; +const char name_59[] PROGMEM = "Custom 3"; +const char name_60[] PROGMEM = "Custom 4"; +const char name_61[] PROGMEM = "Custom 5"; +const char name_62[] PROGMEM = "Custom 6"; +const char name_63[] PROGMEM = "Custom 7"; +const char name_64[] PROGMEM = "Custom 8"; +const char name_65[] PROGMEM = "Custom 9"; + +static const __FlashStringHelper* _names[] = { + FSH(name_0), + FSH(name_1), + FSH(name_2), + FSH(name_3), + FSH(name_4), + FSH(name_5), + FSH(name_6), + FSH(name_7), + FSH(name_8), + FSH(name_9), + FSH(name_10), + FSH(name_11), + FSH(name_12), + FSH(name_13), + FSH(name_14), + FSH(name_15), + FSH(name_16), + FSH(name_17), + FSH(name_18), + FSH(name_19), + FSH(name_20), + FSH(name_21), + FSH(name_22), + FSH(name_23), + FSH(name_24), + FSH(name_25), + FSH(name_26), + FSH(name_27), + FSH(name_28), + FSH(name_29), + FSH(name_30), + FSH(name_31), + FSH(name_32), + FSH(name_33), + FSH(name_34), + FSH(name_35), + FSH(name_36), + FSH(name_37), + FSH(name_38), + FSH(name_39), + FSH(name_40), + FSH(name_41), + FSH(name_42), + FSH(name_43), + FSH(name_44), + FSH(name_45), + FSH(name_46), + FSH(name_47), + FSH(name_48), + FSH(name_49), + FSH(name_50), + FSH(name_51), + FSH(name_52), + FSH(name_53), + FSH(name_54), + FSH(name_55), + FSH(name_56), + FSH(name_57), + FSH(name_58), + FSH(name_59), + FSH(name_60), + FSH(name_61), + FSH(name_62), + FSH(name_63), + FSH(name_64), + FSH(name_65) +}; + +class WS2812FX : public Adafruit_NeoPixel { + + typedef uint16_t (WS2812FX::*mode_ptr)(void); + + // segment parameters + public: + typedef struct Segment { // 20 bytes + uint16_t start; + uint16_t stop; + uint16_t speed; + uint8_t mode; + uint8_t options; + uint32_t colors[NUM_COLORS]; + } segment; + + // segment runtime parameters + typedef struct Segment_runtime { // 16 bytes + unsigned long next_time; + uint32_t counter_mode_step; + uint32_t counter_mode_call; + uint8_t aux_param; // auxilary param (usually stores a color_wheel index) + uint8_t aux_param2; // auxilary param (usually stores bitwise options) + uint16_t aux_param3; // auxilary param (usually stores a segment index) + } segment_runtime; + + WS2812FX(uint16_t n, uint8_t p, neoPixelType t) : Adafruit_NeoPixel(n, p, t) { + _mode[FX_MODE_STATIC] = &WS2812FX::mode_static; + _mode[FX_MODE_BLINK] = &WS2812FX::mode_blink; + _mode[FX_MODE_COLOR_WIPE] = &WS2812FX::mode_color_wipe; + _mode[FX_MODE_COLOR_WIPE_INV] = &WS2812FX::mode_color_wipe_inv; + _mode[FX_MODE_COLOR_WIPE_REV] = &WS2812FX::mode_color_wipe_rev; + _mode[FX_MODE_COLOR_WIPE_REV_INV] = &WS2812FX::mode_color_wipe_rev_inv; + _mode[FX_MODE_COLOR_WIPE_RANDOM] = &WS2812FX::mode_color_wipe_random; + _mode[FX_MODE_RANDOM_COLOR] = &WS2812FX::mode_random_color; + _mode[FX_MODE_SINGLE_DYNAMIC] = &WS2812FX::mode_single_dynamic; + _mode[FX_MODE_MULTI_DYNAMIC] = &WS2812FX::mode_multi_dynamic; + _mode[FX_MODE_RAINBOW] = &WS2812FX::mode_rainbow; + _mode[FX_MODE_RAINBOW_CYCLE] = &WS2812FX::mode_rainbow_cycle; + _mode[FX_MODE_SCAN] = &WS2812FX::mode_scan; + _mode[FX_MODE_DUAL_SCAN] = &WS2812FX::mode_dual_scan; + _mode[FX_MODE_FADE] = &WS2812FX::mode_fade; + _mode[FX_MODE_THEATER_CHASE] = &WS2812FX::mode_theater_chase; + _mode[FX_MODE_THEATER_CHASE_RAINBOW] = &WS2812FX::mode_theater_chase_rainbow; + _mode[FX_MODE_TWINKLE] = &WS2812FX::mode_twinkle; + _mode[FX_MODE_TWINKLE_RANDOM] = &WS2812FX::mode_twinkle_random; + _mode[FX_MODE_TWINKLE_FADE] = &WS2812FX::mode_twinkle_fade; + _mode[FX_MODE_TWINKLE_FADE_RANDOM] = &WS2812FX::mode_twinkle_fade_random; + _mode[FX_MODE_SPARKLE] = &WS2812FX::mode_sparkle; + _mode[FX_MODE_FLASH_SPARKLE] = &WS2812FX::mode_flash_sparkle; + _mode[FX_MODE_HYPER_SPARKLE] = &WS2812FX::mode_hyper_sparkle; + _mode[FX_MODE_STROBE] = &WS2812FX::mode_strobe; + _mode[FX_MODE_STROBE_RAINBOW] = &WS2812FX::mode_strobe_rainbow; + _mode[FX_MODE_MULTI_STROBE] = &WS2812FX::mode_multi_strobe; + _mode[FX_MODE_BLINK_RAINBOW] = &WS2812FX::mode_blink_rainbow; + _mode[FX_MODE_CHASE_WHITE] = &WS2812FX::mode_chase_white; + _mode[FX_MODE_CHASE_COLOR] = &WS2812FX::mode_chase_color; + _mode[FX_MODE_CHASE_RANDOM] = &WS2812FX::mode_chase_random; + _mode[FX_MODE_CHASE_RAINBOW] = &WS2812FX::mode_chase_rainbow; + _mode[FX_MODE_CHASE_FLASH] = &WS2812FX::mode_chase_flash; + _mode[FX_MODE_CHASE_FLASH_RANDOM] = &WS2812FX::mode_chase_flash_random; + _mode[FX_MODE_CHASE_RAINBOW_WHITE] = &WS2812FX::mode_chase_rainbow_white; + _mode[FX_MODE_CHASE_BLACKOUT] = &WS2812FX::mode_chase_blackout; + _mode[FX_MODE_CHASE_BLACKOUT_RAINBOW] = &WS2812FX::mode_chase_blackout_rainbow; + _mode[FX_MODE_COLOR_SWEEP_RANDOM] = &WS2812FX::mode_color_sweep_random; + _mode[FX_MODE_RUNNING_COLOR] = &WS2812FX::mode_running_color; + _mode[FX_MODE_RUNNING_RED_BLUE] = &WS2812FX::mode_running_red_blue; + _mode[FX_MODE_RUNNING_RANDOM] = &WS2812FX::mode_running_random; + _mode[FX_MODE_LARSON_SCANNER] = &WS2812FX::mode_larson_scanner; + _mode[FX_MODE_COMET] = &WS2812FX::mode_comet; + _mode[FX_MODE_FIREWORKS] = &WS2812FX::mode_fireworks; + _mode[FX_MODE_FIREWORKS_RANDOM] = &WS2812FX::mode_fireworks_random; + _mode[FX_MODE_MERRY_CHRISTMAS] = &WS2812FX::mode_merry_christmas; + _mode[FX_MODE_FIRE_FLICKER] = &WS2812FX::mode_fire_flicker; + _mode[FX_MODE_FIRE_FLICKER_SOFT] = &WS2812FX::mode_fire_flicker_soft; + _mode[FX_MODE_FIRE_FLICKER_INTENSE] = &WS2812FX::mode_fire_flicker_intense; + _mode[FX_MODE_CIRCUS_COMBUSTUS] = &WS2812FX::mode_circus_combustus; + _mode[FX_MODE_HALLOWEEN] = &WS2812FX::mode_halloween; + _mode[FX_MODE_BICOLOR_CHASE] = &WS2812FX::mode_bicolor_chase; + _mode[FX_MODE_TRICOLOR_CHASE] = &WS2812FX::mode_tricolor_chase; +// if flash memory is constrained (I'm looking at you Arduino Nano), replace modes +// that use a lot of flash with mode_static (reduces flash footprint by about 2100 bytes) +#ifdef REDUCED_MODES + _mode[FX_MODE_BREATH] = &WS2812FX::mode_static; + _mode[FX_MODE_RUNNING_LIGHTS] = &WS2812FX::mode_static; + _mode[FX_MODE_ICU] = &WS2812FX::mode_static; +#else + _mode[FX_MODE_BREATH] = &WS2812FX::mode_breath; + _mode[FX_MODE_RUNNING_LIGHTS] = &WS2812FX::mode_running_lights; + _mode[FX_MODE_ICU] = &WS2812FX::mode_icu; +#endif + _mode[FX_MODE_CUSTOM_0] = &WS2812FX::mode_custom_0; + _mode[FX_MODE_CUSTOM_1] = &WS2812FX::mode_custom_1; + _mode[FX_MODE_CUSTOM_2] = &WS2812FX::mode_custom_2; + _mode[FX_MODE_CUSTOM_3] = &WS2812FX::mode_custom_3; + _mode[FX_MODE_CUSTOM_4] = &WS2812FX::mode_custom_4; + _mode[FX_MODE_CUSTOM_5] = &WS2812FX::mode_custom_5; + _mode[FX_MODE_CUSTOM_6] = &WS2812FX::mode_custom_6; + _mode[FX_MODE_CUSTOM_7] = &WS2812FX::mode_custom_7; + _mode[FX_MODE_CUSTOM_8] = &WS2812FX::mode_custom_8; + _mode[FX_MODE_CUSTOM_9] = &WS2812FX::mode_custom_9; + + brightness = DEFAULT_BRIGHTNESS + 1; // Adafruit_NeoPixel internally offsets brightness by 1 + _running = false; + _num_segments = 1; + _segments[0].mode = DEFAULT_MODE; + _segments[0].colors[0] = DEFAULT_COLOR; + _segments[0].start = 0; + _segments[0].stop = n - 1; + _segments[0].speed = DEFAULT_SPEED; + resetSegmentRuntimes(); + } + + void +// timer(void), + init(void), + service(void), + start(void), + stop(void), + pause(void), + resume(void), + strip_off(void), + fade_out(void), + fade_out(uint32_t), + setMode(uint8_t m), + setMode(uint8_t seg, uint8_t m), + setOptions(uint8_t seg, uint8_t o), + setCustomMode(uint16_t (*p)()), + setCustomShow(void (*p)()), + setSpeed(uint16_t s), + setSpeed(uint8_t seg, uint16_t s), + increaseSpeed(uint8_t s), + decreaseSpeed(uint8_t s), + setColor(uint8_t r, uint8_t g, uint8_t b), + setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t w), + setColor(uint32_t c), + setColor(uint8_t seg, uint32_t c), + setColors(uint8_t seg, uint32_t* c), + setBrightness(uint8_t b), + increaseBrightness(uint8_t s), + decreaseBrightness(uint8_t s), + setLength(uint16_t b), + increaseLength(uint16_t s), + decreaseLength(uint16_t s), + trigger(void), + setNumSegments(uint8_t n), + setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t mode, uint32_t color, uint16_t speed, bool reverse), + setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t mode, uint32_t color, uint16_t speed, uint8_t options), + setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t mode, const uint32_t colors[], uint16_t speed, bool reverse), + setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t mode, const uint32_t colors[], uint16_t speed, uint8_t options), + resetSegments(), + resetSegmentRuntimes(), + resetSegmentRuntime(uint8_t), + setPixelColor(uint16_t n, uint32_t c), + setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b), + setPixelColor(uint16_t n, uint8_t r, uint8_t g, uint8_t b, uint8_t w), + copyPixels(uint16_t d, uint16_t s, uint16_t c), + show(void); + + boolean + isRunning(void), + isTriggered(void), + isFrame(void), + isFrame(uint8_t), + isCycle(void), + isCycle(uint8_t); + + uint8_t + random8(void), + random8(uint8_t), + getMode(void), + getMode(uint8_t), + getModeCount(void), + setCustomMode(const __FlashStringHelper* name, uint16_t (*p)()), + setCustomMode(uint8_t i, const __FlashStringHelper* name, uint16_t (*p)()), + getNumSegments(void), + get_random_wheel_index(uint8_t), + getOptions(uint8_t), + getNumBytesPerPixel(void); + + uint16_t + random16(void), + random16(uint16_t), + getSpeed(void), + getSpeed(uint8_t), + getLength(void), + getNumBytes(void); + + uint32_t + color_wheel(uint8_t), + getColor(void), + getColor(uint8_t), + intensitySum(void); + + uint32_t* getColors(uint8_t); + uint32_t* intensitySums(void); + + const __FlashStringHelper* getModeName(uint8_t m); + + WS2812FX::Segment* getSegment(void); + + WS2812FX::Segment* getSegment(uint8_t); + + WS2812FX::Segment* getSegments(void); + + WS2812FX::Segment_runtime* getSegmentRuntime(void); + + WS2812FX::Segment_runtime* getSegmentRuntime(uint8_t); + + WS2812FX::Segment_runtime* getSegmentRuntimes(void); + + // mode helper functions + uint16_t + blink(uint32_t, uint32_t, bool strobe), + color_wipe(uint32_t, uint32_t, bool), + twinkle(uint32_t, uint32_t), + twinkle_fade(uint32_t), + chase(uint32_t, uint32_t, uint32_t), + running(uint32_t, uint32_t), + fireworks(uint32_t), + fire_flicker(int), + tricolor_chase(uint32_t, uint32_t, uint32_t), + scan(uint32_t, uint32_t, bool); + uint32_t + color_blend(uint32_t, uint32_t, uint8_t); + + // builtin modes + uint16_t + mode_static(void), + mode_blink(void), + mode_blink_rainbow(void), + mode_strobe(void), + mode_strobe_rainbow(void), + mode_color_wipe(void), + mode_color_wipe_inv(void), + mode_color_wipe_rev(void), + mode_color_wipe_rev_inv(void), + mode_color_wipe_random(void), + mode_color_sweep_random(void), + mode_random_color(void), + mode_single_dynamic(void), + mode_multi_dynamic(void), + mode_breath(void), + mode_fade(void), + mode_scan(void), + mode_dual_scan(void), + mode_theater_chase(void), + mode_theater_chase_rainbow(void), + mode_rainbow(void), + mode_rainbow_cycle(void), + mode_running_lights(void), + mode_twinkle(void), + mode_twinkle_random(void), + mode_twinkle_fade(void), + mode_twinkle_fade_random(void), + mode_sparkle(void), + mode_flash_sparkle(void), + mode_hyper_sparkle(void), + mode_multi_strobe(void), + mode_chase_white(void), + mode_chase_color(void), + mode_chase_random(void), + mode_chase_rainbow(void), + mode_chase_flash(void), + mode_chase_flash_random(void), + mode_chase_rainbow_white(void), + mode_chase_blackout(void), + mode_chase_blackout_rainbow(void), + mode_running_color(void), + mode_running_red_blue(void), + mode_running_random(void), + mode_larson_scanner(void), + mode_comet(void), + mode_fireworks(void), + mode_fireworks_random(void), + mode_merry_christmas(void), + mode_halloween(void), + mode_fire_flicker(void), + mode_fire_flicker_soft(void), + mode_fire_flicker_intense(void), + mode_circus_combustus(void), + mode_bicolor_chase(void), + mode_tricolor_chase(void), + mode_icu(void), + mode_custom_0(void), + mode_custom_1(void), + mode_custom_2(void), + mode_custom_3(void), + mode_custom_4(void), + mode_custom_5(void), + mode_custom_6(void), + mode_custom_7(void), + mode_custom_8(void), + mode_custom_9(void); + private: + uint16_t _rand16seed; + uint16_t (*customModes[MAX_CUSTOM_MODES])(void) { + []{ return (uint16_t)1000; }, + []{ return (uint16_t)1000; }, + []{ return (uint16_t)1000; }, + []{ return (uint16_t)1000; }, + []{ return (uint16_t)1000; }, + []{ return (uint16_t)1000; }, + []{ return (uint16_t)1000; }, + []{ return (uint16_t)1000; }, + []{ return (uint16_t)1000; }, + []{ return (uint16_t)1000; } + }; + void (*customShow)(void) = NULL; + + boolean + _running, + _triggered; + + mode_ptr _mode[MODE_COUNT]; // SRAM footprint: 4 bytes per element + + uint8_t _segment_index = 0; + uint8_t _num_segments = 1; + segment _segments[MAX_NUM_SEGMENTS] = { // SRAM footprint: 20 bytes per element + // start, stop, speed, mode, options, color[] + { 0, 7, DEFAULT_SPEED, FX_MODE_STATIC, NO_OPTIONS, {DEFAULT_COLOR}} + }; + segment_runtime _segment_runtimes[MAX_NUM_SEGMENTS]; // SRAM footprint: 16 bytes per element +}; + +#endif diff --git a/Arduino/McLighting/data/apple-touch-icon.png b/Arduino/McLighting/data/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c00fb89de57046547094f4785167e3409afdc8ac GIT binary patch literal 4500 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 m_iVO+_x78a5@6?Iw*L#`C2;+Lpe=y_0000 + + + SPIFFS Editor + + + + + +
+
+
+ + + + diff --git a/Arduino/McLighting/data/edit.htm.gz b/Arduino/McLighting/data/edit.htm.gz index 69ce414f47f4b25a70160fc4985b2bd320c9b90a..9466db2415e67a661531a9e7f152554c10cffe2c 100644 GIT binary patch literal 5489 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 literal 1150 zcmd5)T}YZ?6n@3p3@y{hrv0dyWg4`Ks8LiSs1Zp~iZo)Ag)vw}5=AXod1FBkBZ8nH zm^Z-|?V=!w1lNUBASeXo@J`0^VlWvo2dii2d%G#v{l>?6f6jZJbDr~@k1-K_xw(v1 z9ebI0x7Iqot*#Mb_8XCpMW( zReHVNRa#m)qtR%dYqeVa%E}7s=;*k^yt%pgaZOFlCyT}Mt)ikLSyomSAdHVNiTwQh zYlT9AoSdAi?Ck6_l}cqxrBb4{wllAZC#W|h5(!LCPa_ZrfO4a^w-*$T#l=O$<8hpvoWSq* zr+q%3e_~?7OnSW+IMa^f<71qjo??H0AF)^rR;v~3>+77){QNxD*47Y-M377-5sgNF zZ*FeBB8@*378YW1auP>JN7&xpMmQYC!NCEBhljDWw8S}YZEay}Y>emI+uIY~)4^cy z8F70`_|(9_00svKF*G!U(a}+OJRTk|_-LM-)6~=yc6N5SQH{@((@6bGii?Y1E0xNx zGMVg3&{-mpfX*l>DM4Lb9lE=_xgNW_yPVhI;UPky&|8{|m^5NE!wk}(ie_b}IlBq} zMVOVKdwqR9$B&PX3*3JY_m9Nk&GPc{gN==iJO5F2bv2uvofXmS?P|3;LfBta`3zy6F#O-#g&(F`<>gww4@PB>= d7!xdbpRqYH(Gg7acUp7g|4wmf`3*+E{Q*gMMA`rV diff --git a/Arduino/McLighting/data/index.htm b/Arduino/McLighting/data/index.htm index 6aa58cc..647bb87 100644 --- a/Arduino/McLighting/data/index.htm +++ b/Arduino/McLighting/data/index.htm @@ -1,97 +1,2539 @@ - - - - ESP Monitor - - + - - -
- - - - -
-
-
-
- - \ No newline at end of file + //console.log("Hidden items: " + settings.visibility); +} + +function onSelectColNum(colnum) { + data.color_num = colnum; + console.log("selected color:" + colnum); + // Show selected color number + var x = document.getElementsByClassName("color_wheel_legend"); + for (var i = 0; i < x.length; i++) { + x[i].className = x[i].className.replace(/\belevation-9\b/g, "elevation-3"); + } + x = document.getElementById("colorSel" + colnum); + x.className = x.className.replace(/\belevation-3\b/g, "elevation-9"); + // Set ColorPicker and Sliders to selected color + red.value = data.color["r" + (colnum > 1 ? colnum : "")]; + green.value = data.color["g" + (colnum > 1 ? colnum : "")]; + blue.value = data.color["b" + (colnum > 1 ? colnum : "")]; + white.value = data.color["w" + (colnum > 1 ? colnum : "")]; + initSliderColors(); + changeRangeNumVal(); + colorNumrVals(); +} +function initSettings() { + // Add languages to language select + var lang = document.getElementById("language"); + for (var code in language) { + if (!language.hasOwnProperty(code)) continue; + var option = document.createElement("OPTION"); + option.setAttribute("value", code); + option.innerHTML = language[code].lang_name; + lang.appendChild(option); + } + lang.value = settings.lang; + lang.addEventListener('change', ()=>{ + //do something here + }); + var wsmessage = document.getElementById("wsmessage"); + wsmessage.value = ""; + wsmessage.addEventListener('change', ()=>{ + ws_send(wsmessage.value); + wsmessage.value = ""; + }); + var hostname = document.getElementById("hostname"); + hostname.value = config.hostname; + hostname.addEventListener('change', ()=>{ + config.hostname = hostname.value; + ws_send("Ch" + config.hostname); + }); + var mqtt_host = document.getElementById("mqtt_host"); + mqtt_host.value = config.mqtt_host; + mqtt_host.addEventListener('change', ()=>{ + config.mqtt_host = mqtt_host.value; + ws_send("Cmh" + config.mqtt_host); + }); + var mqtt_port = document.getElementById("mqtt_port"); + mqtt_port.value = config.mqtt_port; + mqtt_port.addEventListener('change', ()=>{ + config.mqtt_port = mqtt_port.value; + ws_send("Cmp" + config.mqtt_port); + }); + var mqtt_user = document.getElementById("mqtt_user"); + mqtt_user.value = config.mqtt_user; + mqtt_user.addEventListener('change', ()=>{ + config.mqtt_user = mqtt_user.value; + ws_send("Cmu" + config.mqtt_user); + }); + var mqtt_pass = document.getElementById("mqtt_pass"); + mqtt_pass.value = config.mqtt_pass; + mqtt_pass.addEventListener('change', ()=>{ + config.mqtt_pass = mqtt_pass.value; + ws_send("Cmw" + config.mqtt_pass); + }); + var count = document.getElementById("selectcount"); + count.value = config.ws_cnt; + count.addEventListener('change', ()=>{ + config.ws_cnt = count.value; + ws_send("Csc" + config.ws_cnt); + }); + var pin = document.getElementById("selectpin"); + pin.value = config.ws_pin; + pin.addEventListener('change', ()=>{ + config.ws_pin = pin.value; + ws_send("Csp" + config.ws_pin); + }); + var rgbo = document.getElementById("selectrgbo"); + for (var code in selectrgbo) { + var option = document.createElement("OPTION"); + option.setAttribute("value", code); + option.innerHTML = selectrgbo[code]; + rgbo.appendChild(option); + } + rgbo.value = config.ws_rgbo; + rgbo.addEventListener('change', ()=>{ + config.ws_rgbo = rgbo.value; + ws_send("Csr" + config.ws_rgbo); + }); + var optrev = document.getElementById("selectoptrev"); + for (var code in selectoptrev) { + var option = document.createElement("OPTION"); + option.setAttribute("value", code); + option.innerHTML = selectoptrev[code]; + optrev.appendChild(option); + } + optrev.value = (config.ws_fxopt & 128); + optrev.addEventListener('change', ()=>{ + config.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; + ws_send("Cso" + config.ws_fxopt); + }); + var optfade = document.getElementById("selectoptfade"); + for (var code in selectoptfade) { + var option = document.createElement("OPTION"); + option.setAttribute("value", code); + option.innerHTML = selectoptfade[code]; + optfade.appendChild(option); + } + optfade.value = (config.ws_fxopt & 112); + optfade.addEventListener('change', ()=>{ + config.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; + ws_send("Cso" + config.ws_fxopt); + }); + var optgamma = document.getElementById("selectoptgamma"); + for (var code in selectoptgamma) { + var option = document.createElement("OPTION"); + option.setAttribute("value", code); + option.innerHTML = selectoptgamma[code]; + optgamma.appendChild(option); + } + optgamma.value = (config.ws_fxopt & 8); + optgamma.addEventListener('change', ()=>{ + config.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; + ws_send("Cso" + config.ws_fxopt); + }); + var optsize = document.getElementById("selectoptsize"); + for (var code in selectoptsize) { + var option = document.createElement("OPTION"); + option.setAttribute("value", code); + option.innerHTML = selectoptsize[code]; + optsize.appendChild(option); + } + optsize.value = (config.ws_fxopt & 6) + optsize.addEventListener('change', ()=>{ + config.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; + ws_send("Cso" + config.ws_fxopt); + }); + slavenodes.value = settings.slave_nodes; + lang.addEventListener('change', ()=>{ + settings.lang = lang.options[lang.selectedIndex].value; + }); + var picker = document.getElementById("pickerstyle"); + picker.checked = (settings.picker_type === "circle"); + redrawColorPicker(); // Redraw colorpicker to saved settings + picker.addEventListener('change', ()=>{ + settings.picker_type = (picker.checked) ? "circle" : "wheel"; + redrawColorPicker(); + }); + var settransitionEffects = document.getElementById("set-transitionEffects"); + settransitionEffects.checked = config.transitionEffects; + settransitionEffects.addEventListener('change', ()=>{ + config.transitionEffects = settransitionEffects.checked; + if (settransitionEffects.checked) { + document.getElementById("settransitionEffectsbgcolor").style.backgroundColor = settings.theme_btn; + ws_send("Ce1"); + } else { + document.getElementById("settransitionEffectsbgcolor").style.backgroundColor = ""; + ws_send("Ce0"); + } + }); + var colmain = document.getElementById("color-main"); + colmain.value = settings.theme_color; + colmain.addEventListener('change', ()=>{ + settings.theme_color = colmain.value; + var hexcolor = settings.theme_color; + var yiq = ((parseInt(hexcolor.substr(1,2),16)*299)+(parseInt(hexcolor.substr(3,2),16)*587)+(parseInt(hexcolor.substr(5,2),16)*114))/1000; + document.getElementById("toolbar").style.backgroundColor = settings.theme_color; + document.getElementById("footer").style.backgroundColor = settings.theme_color; + document.getElementById("toolbar").style.color = (yiq >= 125) ? '#111' : '#EEE'; + document.getElementById("footer").style.color = (yiq >= 125) ? '#111' : '#EEE'; + document.getElementById("footer-link").style.color = (yiq >= 125) ? '#111' : '#EEE'; + }); + var colfont = document.getElementById("color-font"); + colfont.value = settings.theme_font; + colfont.addEventListener('change', ()=>{ + settings.theme_font = colfont.value; + document.getElementById("modes").style.color = settings.theme_font; + }); + var colback = document.getElementById("color-back"); + colback.value = settings.theme_back; + colback.addEventListener('change', ()=>{ + settings.theme_back = colback.value; + document.getElementById("container").style.backgroundColor = settings.theme_back; + document.getElementById("language").style.backgroundColor = settings.theme_back; + document.getElementById("selectrgbo").style.backgroundColor = settings.theme_back; + document.getElementById("selectoptrev").style.backgroundColor = settings.theme_back; + document.getElementById("selectoptfade").style.backgroundColor = settings.theme_back; + document.getElementById("selectoptgamma").style.backgroundColor = settings.theme_back; + document.getElementById("selectoptsize").style.backgroundColor = settings.theme_back; + // Set text/icon color depending on background darkness + var hexcolor = settings.theme_back; + var yiq = ((parseInt(hexcolor.substr(1,2),16)*299)+(parseInt(hexcolor.substr(3,2),16)*587)+(parseInt(hexcolor.substr(5,2),16)*114))/1000; + var icons = document.getElementsByClassName("icon--link"); + for (var i = 0; i < icons.length; i++) { + icons[i].style.color = (yiq >= 125) ? '#222' : '#EEE'; + } + document.getElementById("wsmessageLbl").style.color = (yiq >= 125) ? '#111' : '#EEE'; + document.getElementById("redNum").style.color = (yiq >= 125) ? '#111' : '#EEE'; + document.getElementById("greenNum").style.color = (yiq >= 125) ? '#111' : '#EEE'; + document.getElementById("blueNum").style.color = (yiq >= 125) ? '#111' : '#EEE'; + document.getElementById("whiteNum").style.color = (yiq >= 125) ? '#111' : '#EEE'; + document.getElementById("brightNum").style.color = (yiq >= 125) ? '#111' : '#EEE'; + document.getElementById("speedNum").style.color = (yiq >= 125) ? '#111' : '#EEE'; + document.getElementById("settings").style.color = (yiq >= 125) ? '#111' : '#EEE'; + }); + var colbtn = document.getElementById("color-btn"); + colbtn.value = settings.theme_btn; + colbtn.addEventListener('change', ()=>{ + settings.theme_btn = colbtn.value; + document.getElementById("settings-save").style.backgroundColor = settings.theme_btn; + document.getElementById("pickerbgcolor").style.backgroundColor = settings.theme_btn; + if (settransitionEffects.checked) document.getElementById("settransitionEffectsbgcolor").style.backgroundColor = settings.theme_btn; + select_active_button(); + }); + var colbtns = document.getElementById("color-btnsel"); + colbtns.value = settings.theme_btnsel; + colbtns.addEventListener('change', ()=>{ + settings.theme_btnsel = colbtns.value; + select_active_button(); + }); + // Set interface colors + var event = new Event('change'); + colmain.dispatchEvent(event); + colfont.dispatchEvent(event); + colback.dispatchEvent(event); + colbtn.dispatchEvent(event); + colbtns.dispatchEvent(event); + + document.getElementById("settings-open").addEventListener('click', ()=>{ + var icons = document.getElementsByClassName("icon--link"); + var set = document.getElementById("settings"); + var arr = set.className.split(" "); + if (arr.indexOf("hidden") === -1) { + set.className += " hidden"; + // hide checkboxes and disabled buttons + data.modes.map(mode => { + if (mode.hidden) { + document.getElementById(mode.id).parentNode.className += " hidden"; + } + }); + for (var i = 0; i < icons.length; i++) { + icons[i].parentNode.className += "hidden"; + } + } else { + set.className = set.className.replace(/\b hidden\b/g, ""); + // show checkboxes and all buttons + data.modes.map(mode => { + if (mode.hidden) { + var parent = document.getElementById(mode.id).parentNode; + parent.className = parent.className.replace(/\b hidden\b/g, ""); + } + }); + for (var i = 0; i < icons.length; i++) { + icons[i].parentNode.className = icons[i].parentNode.className.replace(/\bhidden\b/g, ""); + } + } + }); + document.getElementById("settings-save").addEventListener('click', ()=>{ + settings.slave_nodes = document.getElementById("slavenodes").value; + saveSettings(); + var icons = document.getElementsByClassName("icon--link"); + data.modes.map(mode => { + if (mode.hidden) { + document.getElementById(mode.id).parentNode.className += " hidden"; + } + }); + for (var i = 0; i < icons.length; i++) { + icons[i].parentNode.className += " hidden"; + } + + + document.getElementById("settings").className += " hidden"; + }); +} + +function showSnackbar(msg, why, time) { + var x = document.getElementById("snackbar"); + x.innerHTML = msg; + x.style.backgroundColor = (why === "error") ? "#ad2727" : "#4caf50"; + // Animation is timed with classname (3000, 5000 or 15000) + x.className = "show" + time; + setTimeout(function(){ x.className = x.className.replace("show" + time, ""); }, time); +} + +/* WebSocket code */ +let ws_options = { + connectionTimeout: 1000, + maxRetries: 2, + reconnectionDelayGrowFactor: 2, + debug: true +}; +function disconnectAllAdditionalNodes() { + // Close potentially open connections + data.additional_connections.forEach((conn) => { + conn.close(1000, "Manually closed::disconnectAllAdditionalNode()", {keepClosed: true}); + }); + data.additional_connections = []; + data.num_additional_connections = 0; + var con = document.getElementById("additional-con"); + var arr = con.className.split(" "); + if (arr.indexOf("hidden") === -1) { + con.className += " hidden"; + } +} +function connectAdditionalNodes() { + disconnectAllAdditionalNodes(); + + // Connect to the configured nodes + let nodes = settings.slave_nodes.split(";"); + nodes.forEach((host) => { + host = host.trim(); + if (host !== "") { + let conn = new ReconnectingWebSocket("ws://" + host + ":81", "arduino", ws_options); + console.log("Connecting to additional node", host); + data.additional_connections.push(conn); + + conn.onopen = () => { + console.log("Connected to additional node", host); + data.num_additional_connections++; + var con = document.getElementById("additional-con"); + con.className = con.className = ""; + con.innerHTML = "+" + data.num_additional_connections; + }; + conn.onclose = () => { + console.log("Disconnected to additional node", host); + data.num_additional_connections--; + var con = document.getElementById("additional-con"); + con.innerHTML = "+" + data.num_additional_connections; + if (data.num_additional_connections <= 1) { + con.className = "hidden"; + } + }; + conn.onerror = () => { + console.log("Error on additional node", host); + }; + } + }); +} +function ws_reconnect() { + //data.connection.reconnect(); + ws_connect(); + var con = document.getElementById("connection-failed"); + con.className = "hidden"; +} + +function ws_connect() { + data.connection = new ReconnectingWebSocket(ws_url, "arduino", ws_options); + document.getElementById("percentage").innerHTML = "67%"; + document.getElementById("percentage-done").setAttribute("stroke-dasharray", "67,100"); + document.getElementById("modal-content").innerHTML = language[settings.lang].loadWebsock; + + // When the connection is open, send some data to the server + data.connection.onopen = function() { + console.log("WebSocket open"); + data.is_connected = true; + data.refresh_interval = setInterval(() => ws_send("$"), 10000); + var con = document.getElementById("disconnected"); + con.className = "hidden"; + con = document.getElementById("connected"); + con.className = con.className = ""; + document.getElementById("percentage").innerHTML = "100%"; + document.getElementById("percentage-done").setAttribute("stroke-dasharray", "100,100"); + document.getElementById("modal-content").innerHTML = language[settings.lang].loadReady; + //setTimeout(function() { ws_send("$"); }, 2000); + //setTimeout(function() { ws_send("C"); }, 3000); + //setTimeout(function() { ws_send("~"); }, 4000); + }; + + // When the connection is open, send some data to the server + data.connection.onclose = function() { + console.log("WebSocket closed"); + data.is_connected = false; + clearInterval(data.refresh_interval); + }; + + // Log errors + data.connection.onerror = function(error) { + console.error("WebSocket error", error); + data.is_connected = false; + if (data.connection.retryCount >= ws_options.maxRetries) { + var con = document.getElementById("disconnected"); + con.className = ""; + con = document.getElementById("connected"); + con.className = con.className = "hidden"; + var con = document.getElementById("connection-failed"); + con.className = con.className = ""; + showSnackbar(language[settings.lang].connectError1 + ws_options.maxRetries + language[settings.lang].connectError2, "error", 15000); + } + }; + + // Log messages from the server + data.connection.onmessage = function(e) { + console.log("WebSocket from server: ", e.data); + try { + var res = JSON.parse(e.data); +// document.getElementById('modal').style.display = "none"; + // console.log("res", res); + if (res) { + // Status starts here + if (typeof res.mode !== "undefined") data.mode = res.mode; + if (typeof res.ws2812fx_mode !== "undefined") data.ws2812fx_mode = res.ws2812fx_mode; + if (typeof res.speed !== "undefined") { + data.speed = res.speed; + // init SliderVals + speed.value = res.speed; + } + if (typeof res.brightness !== "undefined") { + data.brightness = res.brightness; + // init ColorSliderVals + bright.value = res.brightness; + } + if (typeof res.color !== "undefined") { + data.color.w = res.color[0]; + data.color.r = res.color[1]; + data.color.g = res.color[2]; + data.color.b = res.color[3]; + data.color.hex = rgbToHex([res.color[0], res.color[1], res.color[2], res.color[3]]); + data.color.w2 = res.color[4]; + data.color.r2 = res.color[5]; + data.color.g2 = res.color[6]; + data.color.b2 = res.color[7]; + data.color.hex2 = rgbToHex([res.color[4], res.color[5], res.color[6], res.color[7]]); + data.color.w3 = res.color[8]; + data.color.r3 = res.color[9]; + data.color.g3 = res.color[10]; + data.color.b3 = res.color[11]; + data.color.hex3 = rgbToHex([res.color[8], res.color[9], res.color[10], res.color[11]]); + // init ColorSliderVals + if (data.color_num === 1) { + red.value = data.color.r; + green.value = data.color.g; + blue.value = data.color.b; + white.value = data.color.w; + } + if (data.color_num === 2) { + red.value = data.color.r2; + green.value = data.color.g2; + blue.value = data.color.b2; + white.value = data.color.w2; + } + if (data.color_num === 3) { + red.value = data.color.r3; + green.value = data.color.g3; + blue.value = data.color.b3; + white.value = data.color.w3; + } + } + // Config starts here + if (typeof res.hostname !== "undefined") { config.hostname = res.hostname; document.getElementById("hostname").value = config.hostname; } + if (typeof res.mqtt_host !== "undefined") { config.mqtt_host = res.mqtt_host; document.getElementById("mqtt_host").value = config.mqtt_host; } + if (typeof res.mqtt_port !== "undefined") { config.mqtt_port = res.mqtt_port; document.getElementById("mqtt_port").value = config.mqtt_port; } + if (typeof res.mqtt_user !== "undefined") { config.mqtt_user = res.mqtt_user; document.getElementById("mqtt_user").value = config.mqtt_user; } + if (typeof res.mqtt_pass !== "undefined") { config.mqtt_pass = res.mqtt_pass; document.getElementById("mqtt_pass").value = config.mqtt_pass; } + if (typeof res.ws_cnt !== "undefined") { config.ws_cnt = res.ws_cnt; document.getElementById("selectcount").value = config.ws_cnt; } + if (typeof res.ws_rgbo !== "undefined") { + config.ws_rgbo = res.ws_rgbo; + document.getElementById("selectrgbo").value = config.ws_rgbo; + config.enable_rgbw = config.ws_rgbo.includes("W"); + if (config.enable_rgbw) { + document.getElementById("white").parentNode.className = ""; + } else { + document.getElementById("white").parentNode.className = "hidden"; + white.value = 0; + data.color.w = 0; + data.color.w2 = 0; + data.color.w3 = 0; + } + + } + if (typeof res.ws_pin !== "undefined") { config.ws_pin = res.ws_pin; document.getElementById("selectpin").value = config.ws_pin; } + if (typeof res.ws_fxopt !== "undefined") { + config.ws_fxopt = res.ws_fxopt; + document.getElementById("selectoptrev").value = (config.ws_fxopt & 128); + document.getElementById("selectoptfade").value = (config.ws_fxopt & 112); + document.getElementById("selectoptgamma").value = (config.ws_fxopt & 8); + document.getElementById("selectoptsize").value = (config.ws_fxopt & 6); + } + // Modes starts here + if (typeof res[0] !== "undefined") { + res.forEach(item => { + if (item.name && item.name.length > 0) { + data.modes.push({ title: item.name, id: item.mode }); + } + }); + } + // init Color Vals + colorNumrVals(); + initSliderColors(); + // init Change Range Val + changeRangeNumVal(); + // init Colors controls + // init display Colors + displayColors(true); + select_active_button(); + } + if (data.init === true) { + // Set selected mode button + //document.getElementById(data.ws2812fx_mode).style.backgroundColor = settings.theme_btnsel; + // Close Loading Modal + setTimeout(() => { + document.getElementById('modal').style.display = "none"; + document.getElementById('container').style.display = ""; + }, 500); + initSettings(); + initcolorSliders(); + data.init = false; + } + } catch (e) {} + }; +} + +function ws_send(message) { + console.log("WS send: ", message); + data.connection.send(message); + if (message!="$") { + data.additional_connections.forEach((conn) => { + console.log("WS send additional to: ", conn.url); + conn.send(message); + }); + } +} +function disable_color_selection(status) { + data.color_disabled = status; + document.getElementById("red").disabled = status; + document.getElementById("redNum").disabled = status; + document.getElementById("red").disabled = status; + document.getElementById("green").disabled = status; + document.getElementById("greenNum").disabled = status; + document.getElementById("blue").disabled = status; + document.getElementById("blueNum").disabled = status; + document.getElementById("white").disabled = status; + document.getElementById("whiteNum").disabled = status; + if (status) { + } +} + +function select_active_button() { + btns = document.getElementsByClassName("btn"); + for (i = 0; i < btns.length; i++) { + btns[i].style.backgroundColor = settings.theme_btn; + } + if (data.mode != 1 || (data.mode === 1 && data.ws2812fx_mode !== 57)) { // CUSTOM WS MODE + wsmess = document.getElementById("message"); + var arr = wsmess.className.split(" "); + if (arr.indexOf("hidden") === -1) { + wsmess.className += " hidden"; + } + } + if (data.mode >= 1) { + document.getElementById(data.ws2812fx_mode).style.backgroundColor = settings.theme_btnsel; + if (data.ws2812fx_mode === 56) { // AUTOPLAY + disable_modebuttons(false); + disable_color_selection(true); + disable_bright_selection(false); + disable_speed_selection(true); + } else if (data.ws2812fx_mode === 57) { //CUSTOM_WS + wsmess = document.getElementById("message"); + wsmess.className = wsmess.className.replace(/\b hidden\b/g, ""); + disable_modebuttons(false); + disable_color_selection(true); + disable_bright_selection(false); + disable_speed_selection(true); + } else if (data.ws2812fx_mode === 58) { //TV + disable_modebuttons(false); + disable_color_selection(true); + disable_bright_selection(false); + disable_speed_selection(false); + } else if (data.ws2812fx_mode === 59) { //E1.31 + disable_modebuttons(false); + disable_color_selection(true); + disable_bright_selection(false); + disable_speed_selection(true); + } else if (data.ws2812fx_mode === 60) { //Fire2012 + disable_modebuttons(false); + disable_color_selection(true); + disable_bright_selection(false); + disable_speed_selection(false); + } else { + disable_modebuttons(false); + disable_color_selection(false); + disable_bright_selection(false); + disable_speed_selection(false); + } + } else if (data.mode === 0) { + document.getElementById("off").style.backgroundColor = settings.theme_btnsel; + disable_modebuttons(false); + disable_color_selection(true); + disable_bright_selection(true); + disable_speed_selection(true); + } +} + +function disable_bright_selection(status) { + document.getElementById("bright").disabled = status; + document.getElementById("brightNum").disabled = status; +} + +function disable_speed_selection(status) { + document.getElementById("speed").disabled = status; + document.getElementById("speedNum").disabled = status; +} + +function disable_modebuttons(status) { + data.modes.forEach(mode => { + //if (settings.visibility.indexOf(mode.id) > -1) { + document.getElementById(mode.id).disabled = status; + }); +} + +function set_mode(mode_id) { + if (Number.isInteger(mode_id)) { + data.mode = 1; + data.ws2812fx_mode = mode_id; + } else { + // For named modes + if (mode_id == "off") { + data.mode = 0; + } + } + select_active_button(); + ws_send("/" + mode_id); +} +function set_speed() { + ws_send("?" + data.speed); +} +function set_brightness() { + ws_send("%" + data.brightness); +} +function set_color() { + if (data.color_num === 1) { + ws_send("#" + rgbToHex([data.color.w, data.color.r, data.color.g, data.color.b])); + } + if (data.color_num === 2) { + ws_send("##" + rgbToHex([data.color.w2, data.color.r2, data.color.g2, data.color.b2])); + } + if (data.color_num === 3) { + ws_send("###" + rgbToHex([data.color.w3, data.color.r3, data.color.g3, data.color.b3])); + } +} + +/* ColorPicker Code */ +var canvas = document.getElementById('color_wheel_canvas'); +var context = canvas.getContext('2d'); + +function componentToHex(c) { + return ("0" + Number(c).toString(16)).slice(-2).toUpperCase(); +} + +function rgbToHex(rgb) { + return (componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]) + componentToHex(rgb[3])); +} + +function onSelectColor(event) { + if (!data.color_disabled) { + var pos; + event.preventDefault(); + + if (event.type === "touchmove") { + var el = event.target; + pos = { + x: Math.round(event.targetTouches[0].pageX - el.offsetLeft), + y: Math.round(event.targetTouches[0].pageY - el.offsetTop) + }; + } + if (event.type === "click") { + pos = { + x: Math.round(event.offsetX), + y: Math.round(event.offsetY) + }; + } + + var color = context.getImageData(pos.x, pos.y, 1, 1).data; + var hex_color = rgbToHex(color); + var colnum = (data.color_num === 1) ? "" : data.color_num; + data.color["hex" + colnum] = hex_color; + data.color["r" + colnum] = color[0]; + data.color["g" + colnum] = color[1]; + data.color["b" + colnum] = color[2]; + data.color["w" + colnum] = 0; + red.value = color[0]; + green.value = color[1]; + blue.value = color[2]; + white.value = 0; + displayColors(); + initSliderColors(); + changeRangeNumVal(); + colorNumrVals(); +} +} +function redrawColorPicker() { + if (context) { + context.clearRect(0, 0, canvas.width, canvas.height); + } + + if (settings.picker_type === "circle") { + drawCircle(); + } else { + drawWheel(); + } +} + + /** + * Draws color ring + */ +function drawWheel() { + var centerX = canvas.width / 2; + var centerY = canvas.height / 2; + // console.log(centerX, centerY, canvas.width, canvas.height); + var innerRadius = canvas.width / 4.5; + var outerRadius = (canvas.width - 10) / 2; + // outer border + context.beginPath(); + // outer circle + context.arc(centerX, centerY, outerRadius, 0, 2 * Math.PI, false); + // draw the outer border: (gets drawn around the circle!) + context.lineWidth = 4; + context.strokeStyle = "#000000"; + context.stroke(); + context.closePath(); + + // fill with beautiful colors + // taken from here: http://stackoverflow.com/questions/18265804/building-a-color-wheel-in-html5 + for (var angle = 0; angle <= 360; angle += 1) { + var startAngle = (angle - 2) * Math.PI / 180; + var endAngle = angle * Math.PI / 180; + context.beginPath(); + context.moveTo(centerX, centerY); + context.arc( + centerX, + centerY, + outerRadius, + startAngle, + endAngle, + false + ); + context.closePath(); + context.fillStyle = "hsl(" + angle + ", 100%, 50%)"; + context.fill(); + context.closePath(); + } + + // inner border + context.beginPath(); + // this.context.arc(centerX, centerY, radius, startAngle, endAngle, counterClockwise); + context.arc(centerX, centerY, innerRadius, 0, 2 * Math.PI, false); + // fill the center + var my_gradient = context.createLinearGradient(0, 0, 170, 0); + my_gradient.addColorStop(0, "black"); + my_gradient.addColorStop(1, "white"); + + context.fillStyle = my_gradient; + context.fillStyle = "white"; + context.fill(); + + // draw the inner line + context.lineWidth = 2; + context.strokeStyle = "#000000"; + context.stroke(); + context.closePath(); +} + + /** + * Draws color circle + */ +function drawCircle() { + let radius = canvas.width / 2; + let image = context.createImageData(2 * radius, 2 * radius); + let data = image.data; + + for (let x = -radius; x < radius; x++) { + for (let y = -radius; y < radius; y++) { + let [r, phi] = xy2polar(x, y); + + if (r > radius) { + // skip all (x,y) coordinates that are outside of the circle + continue; + } + + let deg = rad2deg(phi); + + // Figure out the starting index of this pixel in the image data array. + let rowLength = 2 * radius; + let adjustedX = x + radius; // convert x from [-50, 50] to [0, 100] (the coordinates of the image data array) + let adjustedY = y + radius; // convert y from [-50, 50] to [0, 100] (the coordinates of the image data array) + let pixelWidth = 4; // each pixel requires 4 slots in the data array + let index = (adjustedX + (adjustedY * rowLength)) * pixelWidth; + + let hue = deg; + let saturation = r / radius; + let value = 1.0; + + let [red, green, blue] = hsv2rgb(hue, saturation, value); + let alpha = 255; + + data[index] = red; + data[index + 1] = green; + data[index + 2] = blue; + data[index + 3] = alpha; + } + } + this.context.putImageData(image, 0, 0); +} +function xy2polar(x, y) { + let r = Math.sqrt(x * x + y * y); + let phi = Math.atan2(y, x); + return [r, phi]; +} +function rad2deg(rad) { + // rad in [-Ï€, Ï€] range + // return degree in [0, 360] range + return ((rad + Math.PI) / (2 * Math.PI)) * 360; +} +function hsv2rgb(hue, saturation, value) { + let chroma = value * saturation; + let hue1 = hue / 60; + let x = chroma * (1 - Math.abs((hue1 % 2) - 1)); + let r1, g1, b1; + + if (hue1 >= 0 && hue1 <= 1) { + ([r1, g1, b1] = [chroma, x, 0]); + } else if (hue1 >= 1 && hue1 <= 2) { + ([r1, g1, b1] = [x, chroma, 0]); + } else if (hue1 >= 2 && hue1 <= 3) { + ([r1, g1, b1] = [0, chroma, x]); + } else if (hue1 >= 3 && hue1 <= 4) { + ([r1, g1, b1] = [0, x, chroma]); + } else if (hue1 >= 4 && hue1 <= 5) { + ([r1, g1, b1] = [x, 0, chroma]); + } else if (hue1 >= 5 && hue1 <= 6) { + ([r1, g1, b1] = [chroma, 0, x]); + } + + let m = value - chroma; + let [r, g, b] = [r1 + m, g1 + m, b1 + m]; + + // Change r,g,b values from [0,1] to [0,255] + return [255 * r, 255 * g, 255 * b]; +} + +function translate(node) { + if (node.nodeType === 3 && node.data in language.en) { + node.data = language[settings.lang][node.data]; + } + if (node.nodeType === 1 && node.nodeName !== "SCRIPT") { + for (var i = 0; i < node.childNodes.length; i++) { + translate(node.childNodes[i]); + } + } +} +document.addEventListener("DOMContentLoaded", function(event) { + // Code to run since DOM is loaded and ready + getModes(); + readSettings(); + ws_connect(); + ws_send("$") + document.getElementById("modal-content").innerHTML = language.en.loadModes; + //ws_send("C"); + getConfig(); + canvas.width = 400; + canvas.height = 400; + + redrawColorPicker(); +}); + + + diff --git a/Arduino/McLighting/data/index.htm.gz b/Arduino/McLighting/data/index.htm.gz new file mode 100644 index 0000000000000000000000000000000000000000..50d463761194d6ce10e47eed6ed6cdc7ed9971be GIT binary patch literal 19755 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∨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 hPV)J>d> smaller == slower uint8_t ws2812fx_speed_actual = 196; // Global variable for storing the speed for effects while fading --> smaller == slower uint8_t brightness = 196; // Global variable for storing the brightness (255 == 100%) -uint8_t brightness_actual = 0; // Global variable for storing the brightness while fadeing (255 == 100%) -uint8_t brightness_fade = 0; // Global variable for storing the brightness before change -uint8_t ws2812fx_mode = 0; // Global variable for storing the WS2812FX modes +uint8_t brightness_trans = 0; // Global variable for storing the brightness before change +uint8_t ws2812fx_mode = 0; // Global variable for storing the WS2812FX mode to set uint32_t hex_colors[3] = {}; // Color array for setting colors of WS2812FX -uint32_t hex_colors_actual[3] = {}; // Color array for actual colors of WS2812FX while fading -uint32_t hex_colors_mem[3] = {}; // Color array of colors of WS2812FX before fading +uint32_t hex_colors_trans[3] = {}; // Color array of colors of WS2812FX before fading struct ledstate // Data structure to store a state of a single led { uint8_t red; @@ -177,7 +175,7 @@ bool updateState = false; // Button handling #if defined(ENABLE_BUTTON) -//#define BTN_MODE_SHORT "STA|mo|fxm| h| s| r1| g1| b1| w1| r2| g2| b2| w2| r3| g3| b3| w3" // Example +//#define BTN_MODE_SHORT "STA|mo|fxm| b| s| r1| g1| b1| w1| r2| g2| b2| w2| r3| g3| b3| w3" // Example #define BTN_MODE_SHORT "STA| 5| 0|255|196| 0| 0| 0|255| 0| 0| 0| 0| 0| 0| 0| 0" // Static white #define BTN_MODE_MEDIUM "STA| 5| 48|200|196|255|102| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0" // Fire flicker #define BTN_MODE_LONG "STA| 5| 46|200|196|255|102| 0| 0| 0| 0| 0| 0| 0| 0| 0| 0" // Fireworks random diff --git a/Arduino/McLighting/htm_index_gz.h b/Arduino/McLighting/htm_index_gz.h index c2be8a4..be6cd62 100644 --- a/Arduino/McLighting/htm_index_gz.h +++ b/Arduino/McLighting/htm_index_gz.h @@ -1,1670 +1,1652 @@ #include -#define index_htm_gz_len 19973 +#define index_htm_gz_len 19755 static const char index_htm_gz[] PROGMEM ={ - 0x1f, 0x8b, 0x08, 0x08, 0x83, 0xe6, 0x93, 0x5c, 0x04, 0x00, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x00, 0xe4, 0x5d, 0xdd, 0x7a, - 0x1b, 0x3d, 0x11, 0x3e, 0xe7, 0x79, 0xb8, 0x87, 0xad, 0x0b, 0xad, 0x0d, - 0xb6, 0xe3, 0x9f, 0x24, 0xa4, 0x4e, 0x1d, 0x48, 0xfb, 0xa5, 0xa5, 0xd0, - 0x9f, 0x8f, 0xa4, 0x50, 0xa0, 0xf4, 0x09, 0x6b, 0x5b, 0xb6, 0x97, 0xac, - 0x77, 0xcd, 0xee, 0xba, 0x49, 0x1a, 0x72, 0x2d, 0x9c, 0x70, 0xc2, 0x0d, - 0x70, 0xc4, 0x11, 0xdc, 0x18, 0xef, 0x8c, 0xa4, 0xd5, 0xfe, 0x3a, 0x76, - 0x9a, 0x98, 0xbf, 0x7c, 0x5f, 0x6d, 0xaf, 0x34, 0x9a, 0x19, 0x8d, 0x46, - 0xa3, 0x91, 0x34, 0xd2, 0x3e, 0x7d, 0xf0, 0xcd, 0xbb, 0xe7, 0xef, 0x7f, - 0xf3, 0xed, 0x91, 0x35, 0x8d, 0x66, 0xee, 0xc1, 0x77, 0xbf, 0xf3, 0x54, - 0x7d, 0x5b, 0xf8, 0x7b, 0x3a, 0x15, 0xf6, 0x48, 0xfd, 0xe6, 0xe7, 0xc8, - 0x89, 0x5c, 0x71, 0xf0, 0x66, 0xf8, 0xda, 0x99, 0x4c, 0x23, 0xc7, 0x9b, - 0x3c, 0xdd, 0xe2, 0x94, 0x24, 0xc8, 0x4c, 0x44, 0xb6, 0x35, 0x9c, 0xda, - 0x41, 0x28, 0xa2, 0x7e, 0xe5, 0x97, 0xef, 0x5f, 0x34, 0xf6, 0x2a, 0xb9, - 0x7c, 0xcf, 0x9e, 0x89, 0x7e, 0xe5, 0xb3, 0x23, 0xce, 0xe7, 0x7e, 0x10, - 0x55, 0xac, 0xa1, 0xef, 0x45, 0xc2, 0x03, 0xfc, 0xb9, 0x33, 0x8a, 0xa6, - 0xfd, 0x91, 0xf8, 0xec, 0x0c, 0x45, 0x83, 0x1f, 0xea, 0x96, 0xe3, 0x39, - 0x91, 0x63, 0xbb, 0x8d, 0x70, 0x68, 0xbb, 0xa2, 0xdf, 0x6e, 0xb6, 0xca, - 0xf0, 0xcd, 0xfc, 0x81, 0xe3, 0xa2, 0x98, 0x18, 0x34, 0xec, 0xf9, 0xbc, - 0x31, 0xb4, 0xe7, 0xf6, 0xc0, 0x15, 0x09, 0xec, 0x97, 0x22, 0x4c, 0x95, - 0x75, 0x1d, 0xef, 0xcc, 0x0a, 0x84, 0xdb, 0xaf, 0x84, 0x53, 0xf0, 0x31, - 0x5c, 0x44, 0x96, 0x03, 0xe0, 0x8a, 0x35, 0x0d, 0xc4, 0xb8, 0x5f, 0x99, - 0x46, 0xd1, 0x3c, 0xec, 0x6d, 0x6d, 0x0d, 0x47, 0x5e, 0x33, 0xb0, 0xcf, - 0x27, 0x4e, 0xd4, 0x1c, 0xfa, 0xb3, 0xad, 0xc8, 0x1f, 0xb8, 0x8b, 0xd9, - 0x96, 0x91, 0xc2, 0x2f, 0x5f, 0x6d, 0xb5, 0xbb, 0xdb, 0xbb, 0xa2, 0xdb, - 0xdd, 0xde, 0x9a, 0xd9, 0x91, 0x08, 0xc0, 0x6d, 0x22, 0xfb, 0xb5, 0x3f, - 0xf1, 0xb7, 0xc6, 0xf6, 0x67, 0x42, 0xdd, 0xc4, 0x47, 0xc5, 0x8a, 0x2e, - 0xe7, 0x60, 0xd7, 0x99, 0xd9, 0x13, 0xb1, 0x75, 0xd1, 0x90, 0x24, 0xb7, - 0x8a, 0x19, 0x43, 0x45, 0x50, 0xa5, 0xc8, 0x5f, 0x0c, 0xa7, 0x8d, 0xfb, - 0xe2, 0x2d, 0x4b, 0xa3, 0x39, 0xf7, 0x26, 0x65, 0x72, 0x8a, 0x2e, 0x5d, - 0x11, 0x4e, 0x85, 0x88, 0xb2, 0x8c, 0x8c, 0x21, 0xe4, 0xb0, 0x39, 0xf1, - 0xfd, 0x89, 0x2b, 0xec, 0xb9, 0x13, 0x32, 0x3b, 0xc3, 0x30, 0xfc, 0xf1, - 0xd8, 0x9e, 0x39, 0xee, 0x65, 0xff, 0x8d, 0x22, 0xfe, 0xc3, 0x57, 0xa0, - 0x90, 0x6e, 0x06, 0x46, 0x8a, 0x84, 0x1f, 0x58, 0x57, 0x94, 0x3a, 0xb0, - 0x87, 0x67, 0x93, 0xc0, 0x5f, 0x78, 0xa3, 0x46, 0x20, 0xe6, 0xc2, 0x8e, - 0x7a, 0x96, 0xe7, 0xab, 0x9f, 0xfb, 0x04, 0x30, 0xb7, 0x47, 0x23, 0xf0, - 0xde, 0xb3, 0x5a, 0xfc, 0x38, 0xb3, 0x83, 0x89, 0xe3, 0xc9, 0xa7, 0x6b, - 0x60, 0xa9, 0x5b, 0x3d, 0x7b, 0x0c, 0x62, 0xf8, 0x1e, 0x88, 0xb1, 0x1f, - 0x08, 0x46, 0x8b, 0x3f, 0xd2, 0x8c, 0x33, 0x27, 0x6a, 0x0c, 0xfc, 0x8b, - 0x46, 0xe8, 0x7c, 0x61, 0x14, 0x8e, 0x37, 0x05, 0x5b, 0x8c, 0x17, 0x7f, - 0x05, 0x39, 0x12, 0x29, 0x75, 0x0a, 0x8d, 0x86, 0x6a, 0x4a, 0x50, 0xa2, - 0xb7, 0xdb, 0x69, 0xee, 0x7c, 0x9f, 0xf3, 0x07, 0xfe, 0xe8, 0x32, 0x9f, - 0xdf, 0x6e, 0xee, 0x88, 0x99, 0x42, 0x0d, 0x19, 0x8a, 0xc6, 0x54, 0x90, - 0xdc, 0x91, 0xbe, 0xbb, 0x9f, 0x80, 0x3d, 0x97, 0xa9, 0xdb, 0xad, 0x56, - 0x32, 0x55, 0xca, 0xad, 0x57, 0x39, 0x86, 0xd6, 0x9f, 0xdb, 0x97, 0x95, - 0x7a, 0xe5, 0xa7, 0xc2, 0xfd, 0x2c, 0x22, 0x67, 0x68, 0xbf, 0x15, 0x0b, - 0x91, 0x7c, 0xb6, 0x64, 0x42, 0xfc, 0x5c, 0x3f, 0x24, 0x49, 0xd7, 0x43, - 0xdb, 0x0b, 0x1b, 0x21, 0x2a, 0x31, 0x56, 0x78, 0x87, 0xbe, 0xeb, 0x07, - 0xbd, 0x87, 0x9d, 0x4e, 0x47, 0x32, 0xbd, 0x88, 0x22, 0xdf, 0xab, 0x5b, - 0x1f, 0xa5, 0x3e, 0xca, 0xc7, 0xca, 0xa7, 0x38, 0x21, 0x10, 0xe8, 0xc3, - 0x89, 0xe7, 0x70, 0x31, 0x98, 0x39, 0x32, 0x21, 0xf0, 0xdd, 0x44, 0x09, - 0x59, 0xf3, 0xe1, 0x22, 0x08, 0x81, 0xde, 0x9a, 0xfb, 0x8e, 0x07, 0xf1, - 0xef, 0xa7, 0x68, 0x38, 0xde, 0x7c, 0x11, 0xd5, 0x2d, 0x7f, 0x1e, 0x51, - 0xd3, 0xce, 0xeb, 0x56, 0x28, 0x5c, 0x31, 0x44, 0x4a, 0x24, 0x2e, 0x22, - 0x3b, 0x10, 0x36, 0xe1, 0x90, 0x35, 0x37, 0xa2, 0xb7, 0xb6, 0x7e, 0x60, - 0x9d, 0xcc, 0xc5, 0xd0, 0x19, 0x5f, 0x72, 0x8e, 0xce, 0xb0, 0xbd, 0xa1, - 0xb0, 0xfc, 0x31, 0xd2, 0x82, 0x99, 0x05, 0x3c, 0x33, 0x01, 0xdd, 0xb3, - 0x7e, 0xb0, 0x95, 0xa0, 0x28, 0xd1, 0xf9, 0x9f, 0x45, 0x30, 0x76, 0xfd, - 0xf3, 0x9e, 0xf5, 0xd9, 0x09, 0x1d, 0x18, 0x03, 0x46, 0x79, 0x38, 0x1a, - 0xa1, 0x6a, 0xa1, 0xf5, 0x7b, 0x9d, 0xfd, 0x7b, 0x0b, 0x15, 0xb5, 0x22, - 0xdf, 0xfa, 0xfd, 0xd4, 0x19, 0x8d, 0x84, 0xf7, 0x7b, 0x10, 0xb2, 0x5e, - 0x1d, 0x59, 0x7b, 0x5b, 0x4f, 0xb6, 0xda, 0xad, 0xad, 0x76, 0x3b, 0x8d, - 0xbb, 0xd7, 0x6b, 0xcc, 0xfc, 0x2f, 0x8d, 0xb1, 0x3f, 0x5c, 0x84, 0x0d, - 0xc7, 0xf3, 0x44, 0x90, 0x93, 0x61, 0x1e, 0x24, 0x2b, 0xd5, 0x3c, 0x44, - 0x4e, 0xce, 0x79, 0x10, 0xd5, 0x41, 0xfc, 0x60, 0x24, 0x82, 0x06, 0x77, - 0x9b, 0x9e, 0x95, 0xef, 0x12, 0x86, 0x51, 0x53, 0x3e, 0x40, 0xee, 0x66, - 0xb9, 0xf4, 0x17, 0x11, 0xe9, 0x3c, 0xb1, 0x64, 0x98, 0xce, 0x30, 0x58, - 0xe7, 0x51, 0x67, 0x6d, 0x05, 0x24, 0x02, 0xa6, 0x3b, 0xdb, 0x73, 0x58, - 0x86, 0x00, 0x3a, 0x01, 0x5a, 0x12, 0x05, 0xb7, 0xf2, 0x73, 0x3f, 0x08, - 0xc4, 0x10, 0xcd, 0x3a, 0x15, 0x68, 0x4e, 0x1b, 0x43, 0x83, 0x13, 0x5d, - 0x52, 0x23, 0xb3, 0xdc, 0xac, 0xa1, 0xeb, 0x0c, 0xcf, 0x68, 0x7c, 0x60, - 0x6b, 0x1c, 0x52, 0x8b, 0x3b, 0xef, 0x4e, 0xd2, 0x0d, 0xad, 0xb5, 0x94, - 0xe9, 0xb1, 0xa6, 0x36, 0x22, 0x10, 0x0a, 0x49, 0xef, 0xc8, 0x28, 0x79, - 0x52, 0x9f, 0x5e, 0x38, 0x01, 0xec, 0xcc, 0x85, 0xb5, 0xdd, 0xfa, 0x61, - 0xdd, 0x7a, 0x45, 0xba, 0xef, 0x41, 0x9d, 0x8e, 0x2e, 0xe6, 0xe8, 0x6d, - 0x90, 0x46, 0xbb, 0xdd, 0x00, 0xda, 0x7c, 0x6f, 0xc8, 0xf7, 0x81, 0x9c, - 0xfd, 0x93, 0x1d, 0xd6, 0x62, 0xa2, 0x73, 0x40, 0x78, 0xd1, 0x7e, 0x56, - 0x01, 0x24, 0x1f, 0x9c, 0xcc, 0xd0, 0x19, 0xc3, 0xd5, 0x1b, 0x39, 0x21, - 0xd5, 0x72, 0x54, 0xff, 0xee, 0x77, 0x3e, 0xea, 0xdf, 0x9f, 0x64, 0x03, - 0xcd, 0xed, 0x21, 0x44, 0x82, 0x26, 0x69, 0x6e, 0x4b, 0xe0, 0xe6, 0x20, - 0xf2, 0x4e, 0x4f, 0xe5, 0x70, 0xa9, 0x2a, 0x6d, 0xbb, 0xce, 0xc4, 0x6b, - 0x38, 0x91, 0x98, 0x85, 0x3d, 0x6b, 0x28, 0xa8, 0x72, 0x49, 0x16, 0x02, - 0x7b, 0xe4, 0x2c, 0xc2, 0x98, 0xa6, 0x61, 0x23, 0x9d, 0x04, 0xc2, 0x73, - 0xd7, 0x06, 0xa9, 0xb1, 0x2b, 0x2e, 0x28, 0x85, 0x7f, 0xf4, 0xac, 0xb6, - 0xd5, 0xb2, 0xec, 0x45, 0xe4, 0x73, 0xd2, 0x1f, 0x16, 0x61, 0x84, 0x9e, - 0xde, 0x50, 0xf4, 0x0d, 0x39, 0x63, 0xe3, 0x93, 0xe0, 0x73, 0x3f, 0x84, - 0x5f, 0x00, 0x25, 0xa7, 0x91, 0xc9, 0x8e, 0x9c, 0xcf, 0x2c, 0x04, 0x96, - 0x95, 0xcc, 0xa0, 0x8a, 0x75, 0x43, 0x98, 0xa5, 0x81, 0x33, 0x6c, 0x0c, - 0xc4, 0x17, 0x47, 0x04, 0xd5, 0x56, 0xb3, 0xb3, 0x53, 0x47, 0xfa, 0x1e, - 0x7d, 0xe0, 0x57, 0xbb, 0xc6, 0x85, 0xce, 0xa7, 0xa8, 0x61, 0x23, 0x84, - 0x40, 0x58, 0x9e, 0xe7, 0x81, 0x3d, 0xe7, 0x74, 0xf6, 0x40, 0xe2, 0xaa, - 0x18, 0x21, 0xad, 0x25, 0x9b, 0xdd, 0xf9, 0x45, 0x52, 0x08, 0x84, 0x8e, - 0x07, 0x03, 0x29, 0x0b, 0x43, 0xa5, 0xd3, 0x6e, 0x29, 0x48, 0x35, 0x4c, - 0x58, 0x5d, 0x2a, 0x6a, 0xa4, 0xd5, 0x32, 0xd5, 0x4f, 0x8e, 0x32, 0x56, - 0x7b, 0x9b, 0xc1, 0xd2, 0xa3, 0x89, 0xb5, 0xd3, 0x6a, 0xad, 0x2c, 0x56, - 0xd0, 0xb1, 0xf6, 0x14, 0x12, 0x63, 0x4a, 0xac, 0xb6, 0xa6, 0x3f, 0x73, - 0xbc, 0x86, 0xe2, 0x72, 0x8f, 0xe0, 0x32, 0xfd, 0x3b, 0xee, 0x1d, 0x23, - 0x31, 0xf4, 0x03, 0x9b, 0x84, 0xcf, 0x6a, 0x79, 0xbb, 0x16, 0xa9, 0x4b, - 0x0d, 0xb2, 0xda, 0xb3, 0x70, 0x59, 0x43, 0xc3, 0x76, 0xd3, 0x58, 0xe7, - 0x36, 0xa8, 0x19, 0x90, 0x39, 0x83, 0xe9, 0x86, 0x81, 0x4f, 0x5a, 0x86, - 0x45, 0x88, 0x66, 0x90, 0x9d, 0xcc, 0xf0, 0x43, 0x7f, 0x64, 0xb1, 0x8a, - 0x73, 0x55, 0x76, 0x58, 0x9c, 0x1b, 0xff, 0xe5, 0x72, 0x8d, 0x6e, 0x34, - 0x1a, 0x03, 0xd7, 0x1f, 0x9e, 0x49, 0x15, 0x31, 0xad, 0x9e, 0xf4, 0x3e, - 0xf6, 0xd3, 0x59, 0x4c, 0x8f, 0x9a, 0x58, 0x67, 0x65, 0x3b, 0x4c, 0xde, - 0x7d, 0x51, 0xdd, 0x47, 0xe6, 0xc4, 0xe5, 0x4d, 0x4a, 0xf2, 0x29, 0x6e, - 0x66, 0xa3, 0x3c, 0xb1, 0xce, 0xed, 0xb5, 0xbe, 0x9f, 0xf2, 0x0d, 0xac, - 0x87, 0x2f, 0x5e, 0xbc, 0x50, 0x29, 0x79, 0x3b, 0xf4, 0xc0, 0x99, 0x91, - 0xbf, 0x6e, 0x2b, 0x33, 0x14, 0x6b, 0xba, 0x2e, 0xbb, 0x3d, 0xb4, 0xc7, - 0x3b, 0x2d, 0x03, 0x65, 0x84, 0xd2, 0x5c, 0xc0, 0x48, 0x07, 0x43, 0x3b, - 0x64, 0x67, 0xcc, 0xa8, 0xfc, 0xae, 0x54, 0xf9, 0xbc, 0x71, 0xd5, 0xf0, - 0x69, 0xc1, 0xfa, 0x30, 0x9f, 0x33, 0x2d, 0x59, 0xf9, 0x64, 0x7a, 0x09, - 0xfe, 0x02, 0x56, 0x7d, 0xa3, 0xb7, 0x49, 0xe5, 0xb1, 0x07, 0xa1, 0xef, - 0x2e, 0x22, 0x91, 0x92, 0x89, 0xd6, 0xde, 0x84, 0x8a, 0x9b, 0xa4, 0xa9, - 0xee, 0x49, 0x06, 0x9d, 0x84, 0x30, 0x29, 0x39, 0x67, 0x34, 0xd7, 0xfb, - 0x77, 0x62, 0x09, 0x7f, 0xc1, 0xe8, 0x38, 0xa2, 0x66, 0xd9, 0xce, 0x88, - 0x7c, 0x3c, 0x1e, 0x97, 0x8a, 0xfc, 0xa1, 0x78, 0xd2, 0x16, 0xbb, 0xdd, - 0xe5, 0x92, 0xcf, 0x43, 0xc5, 0xec, 0xba, 0x6e, 0x03, 0x93, 0x31, 0x6f, - 0x22, 0x7a, 0xd2, 0xb9, 0x9d, 0xda, 0x23, 0xff, 0x5c, 0xe5, 0x9a, 0x04, - 0xea, 0xec, 0x5d, 0xd8, 0x80, 0x1d, 0xfc, 0x6b, 0xb4, 0xf1, 0x11, 0x4c, - 0x06, 0x76, 0xb5, 0x55, 0xa7, 0xff, 0x9a, 0x9d, 0x1a, 0xba, 0x26, 0x9b, - 0x08, 0x32, 0x50, 0xf8, 0x99, 0xcc, 0x6c, 0x6f, 0x73, 0x6e, 0x9b, 0x72, - 0xf7, 0xf2, 0xb9, 0x9d, 0x9a, 0x6c, 0x3f, 0x9a, 0xf7, 0x94, 0x5b, 0xcd, - 0x65, 0xe6, 0xd1, 0xe8, 0xbd, 0xf4, 0x8a, 0x31, 0x09, 0x58, 0x04, 0x02, - 0x7d, 0x2f, 0xa2, 0xf9, 0x0b, 0x50, 0x3c, 0x06, 0x3e, 0xfb, 0x71, 0xaa, - 0x77, 0xde, 0x0c, 0x99, 0xb0, 0x9e, 0x1d, 0x58, 0xcf, 0x1b, 0x0d, 0x65, - 0xd2, 0x7b, 0xb7, 0xda, 0xb7, 0x32, 0x6b, 0x45, 0x46, 0x8b, 0xd5, 0x5e, - 0xa9, 0x75, 0x42, 0x50, 0xfc, 0xd1, 0x68, 0xd0, 0xb4, 0x6b, 0x89, 0x6b, - 0xdd, 0xd4, 0xf3, 0x39, 0x9e, 0xb4, 0x85, 0xcd, 0xd9, 0x08, 0x25, 0xc0, - 0x20, 0x15, 0xd1, 0xca, 0x25, 0x5b, 0xa3, 0xb3, 0x03, 0x0e, 0xd4, 0x07, - 0xf3, 0x52, 0x8a, 0x60, 0x64, 0x07, 0x67, 0xf9, 0xf2, 0xad, 0xba, 0x45, - 0xff, 0x73, 0x7d, 0x54, 0x59, 0xb8, 0x3d, 0xef, 0xe1, 0x58, 0xbd, 0xf1, - 0x47, 0xb6, 0x6b, 0x55, 0x8d, 0xde, 0xd6, 0xd8, 0xd5, 0x79, 0x38, 0xe3, - 0xf4, 0xab, 0xb4, 0xf9, 0x1e, 0x3b, 0x17, 0x62, 0x84, 0xe2, 0x89, 0xae, - 0xd0, 0x4e, 0x0e, 0x39, 0x98, 0x82, 0xce, 0x91, 0xb4, 0x03, 0x2d, 0x63, - 0xbf, 0xea, 0xb5, 0x3f, 0xe4, 0xb1, 0x04, 0xae, 0x3e, 0x79, 0x71, 0xa4, - 0xaf, 0xc0, 0xce, 0xcd, 0x21, 0xc6, 0x91, 0xee, 0x71, 0x5c, 0xa8, 0x95, - 0x1c, 0x48, 0xdb, 0x2d, 0xd5, 0xe7, 0x64, 0x83, 0xc5, 0x09, 0x66, 0x3e, - 0x10, 0x9b, 0xc2, 0x54, 0x97, 0x33, 0x55, 0x96, 0xfa, 0x5b, 0x93, 0xde, - 0x9d, 0xed, 0xba, 0x04, 0x24, 0x25, 0x22, 0x19, 0xc8, 0x97, 0x4a, 0xaa, - 0x3d, 0xfc, 0x29, 0x59, 0xf4, 0x99, 0x4b, 0xe5, 0xce, 0xb7, 0xb4, 0xab, - 0xa5, 0xdd, 0xc0, 0x26, 0x8b, 0x47, 0x2b, 0x9a, 0xf1, 0x2e, 0x95, 0x56, - 0x18, 0xc5, 0x2b, 0xb4, 0x08, 0x63, 0x41, 0xff, 0x21, 0x37, 0x6f, 0xd8, - 0x8d, 0x35, 0x22, 0x21, 0x66, 0x35, 0x7d, 0xbb, 0xd0, 0x4f, 0xd8, 0x6d, - 0xa5, 0x1c, 0x74, 0xee, 0xca, 0xb0, 0x94, 0xce, 0xc8, 0x7a, 0xb8, 0xb7, - 0xb7, 0xc7, 0x59, 0x66, 0xb0, 0x90, 0x8d, 0x8f, 0x1a, 0x10, 0xef, 0xb6, - 0xa3, 0x9c, 0x7d, 0xe3, 0xce, 0xb5, 0x59, 0xd6, 0x4b, 0x79, 0x53, 0x3d, - 0x4e, 0x0a, 0x02, 0x1d, 0xde, 0x5f, 0x40, 0x02, 0xcb, 0x9d, 0xc4, 0x36, - 0x23, 0x89, 0x93, 0x1a, 0xe4, 0x9f, 0x25, 0xfc, 0xb4, 0x9c, 0xf1, 0x36, - 0x98, 0x9b, 0x81, 0x7f, 0x6e, 0x38, 0x6c, 0x8c, 0x1c, 0x4c, 0x09, 0xa4, - 0x32, 0x22, 0x23, 0x07, 0xd9, 0x0c, 0x04, 0x14, 0x24, 0x14, 0xa5, 0x25, - 0x1a, 0x0a, 0x20, 0x5d, 0x12, 0x0d, 0xb3, 0x98, 0x79, 0xc5, 0x85, 0x64, - 0x5e, 0x11, 0xbc, 0x26, 0xb6, 0xac, 0xdc, 0x52, 0x7a, 0x07, 0x56, 0x93, - 0x4a, 0xc9, 0xf2, 0x33, 0xfb, 0xa2, 0x91, 0x50, 0xff, 0x74, 0x01, 0x92, - 0x13, 0xc0, 0xd2, 0xe2, 0xa3, 0x4f, 0x05, 0x06, 0x3f, 0xe6, 0x33, 0xf7, - 0xb4, 0x46, 0x97, 0xc0, 0x32, 0x23, 0x03, 0xf4, 0xa1, 0xab, 0xfe, 0x35, - 0x3a, 0xe9, 0xb1, 0xa1, 0x25, 0x07, 0x07, 0x95, 0xbb, 0x8d, 0x7f, 0xad, - 0x2c, 0x40, 0x7b, 0x5b, 0x42, 0xb0, 0x5e, 0xed, 0x15, 0x42, 0x74, 0x6a, - 0x09, 0xcf, 0xa2, 0x4c, 0x17, 0x77, 0x77, 0x77, 0x73, 0xdc, 0xee, 0x16, - 0x73, 0x6b, 0x46, 0xb2, 0x12, 0x6e, 0xd5, 0x60, 0x76, 0x23, 0xbb, 0xed, - 0xd5, 0xf8, 0x4d, 0x33, 0xf5, 0xa4, 0x98, 0xa9, 0x1d, 0x45, 0xb6, 0xd1, - 0xcd, 0xe2, 0xfb, 0x91, 0xa2, 0xf8, 0x84, 0x28, 0x92, 0x80, 0x73, 0x6c, - 0xef, 0x24, 0x84, 0xdc, 0x26, 0x24, 0xb9, 0x66, 0xe8, 0x96, 0x8a, 0xb0, - 0xbb, 0x5c, 0x84, 0xed, 0x4e, 0x31, 0xbb, 0x3f, 0x52, 0xad, 0xd5, 0xd8, - 0x2e, 0x94, 0x61, 0xcc, 0x2a, 0xc1, 0x75, 0x4a, 0x85, 0xb8, 0x43, 0xb9, - 0x94, 0xbd, 0xbd, 0xa6, 0x10, 0xdb, 0x3b, 0xc5, 0x6c, 0xed, 0x29, 0x39, - 0x35, 0x76, 0x4a, 0xd9, 0x92, 0x34, 0x97, 0xb2, 0xc5, 0x22, 0x24, 0x54, - 0x3b, 0x2b, 0xb1, 0x45, 0x9d, 0xa6, 0x4e, 0x36, 0x6f, 0xea, 0xb8, 0x23, - 0xf6, 0x4b, 0xd0, 0xf7, 0x68, 0xb1, 0x32, 0x6f, 0xa2, 0x4a, 0xbb, 0xe2, - 0xc3, 0xc8, 0xf7, 0x31, 0x8c, 0x48, 0x73, 0x69, 0x7c, 0x07, 0x33, 0x4f, - 0xca, 0xd7, 0x95, 0xe5, 0x56, 0xae, 0xc6, 0x2a, 0x77, 0xe7, 0x66, 0x2d, - 0x6e, 0x95, 0x68, 0xf1, 0xb2, 0xd9, 0x55, 0xba, 0x02, 0x69, 0x4f, 0x32, - 0x1e, 0xaf, 0x69, 0x18, 0xae, 0xc7, 0x4f, 0xe4, 0x7c, 0x6b, 0x91, 0xa9, - 0xda, 0xae, 0xb8, 0x98, 0x90, 0xb7, 0xfc, 0xc6, 0xab, 0xe6, 0xd1, 0x22, - 0x8b, 0x95, 0x77, 0x1d, 0x80, 0x33, 0xe3, 0xc9, 0xb5, 0x96, 0xcd, 0x83, - 0x5d, 0x11, 0x81, 0x1e, 0x4f, 0xf2, 0x25, 0xe6, 0x66, 0xab, 0x23, 0x66, - 0x4b, 0xa7, 0xff, 0xc6, 0x5d, 0x90, 0xeb, 0x82, 0x66, 0xa6, 0x62, 0x72, - 0x84, 0xeb, 0x3a, 0xf3, 0xd0, 0x09, 0x0b, 0x59, 0xec, 0x79, 0x7e, 0x54, - 0xed, 0x8d, 0x9d, 0x20, 0x8c, 0x1a, 0xac, 0x3d, 0x35, 0xeb, 0xca, 0x8c, - 0x8d, 0x2c, 0x3f, 0xc9, 0xb6, 0x52, 0x92, 0xb1, 0xef, 0x83, 0xc7, 0x82, - 0xf5, 0xea, 0xbc, 0x67, 0x60, 0xa6, 0x7d, 0x45, 0x99, 0xc5, 0xb2, 0xbe, - 0xeb, 0x19, 0x69, 0xac, 0x3b, 0x29, 0xd5, 0x31, 0xad, 0xc7, 0xc6, 0xca, - 0x74, 0xa7, 0xd2, 0x79, 0x6c, 0x62, 0xca, 0x68, 0xaa, 0xa6, 0xf3, 0x54, - 0xd7, 0xca, 0x81, 0x94, 0x66, 0x9b, 0xf9, 0x5c, 0x6e, 0x1d, 0xc5, 0x10, - 0x4f, 0xf6, 0xc0, 0x66, 0x27, 0xe3, 0xbc, 0x37, 0xb7, 0x79, 0xde, 0x53, - 0x6f, 0xd7, 0x54, 0xa9, 0xd5, 0xa1, 0xd9, 0x3b, 0xfa, 0xc9, 0x4c, 0x8c, - 0x1c, 0xdb, 0xf2, 0x3d, 0xf7, 0xd2, 0x0a, 0x87, 0x81, 0x10, 0x9e, 0x65, - 0x7b, 0x23, 0xab, 0x9a, 0x70, 0x53, 0x9e, 0xd0, 0xcc, 0x57, 0x69, 0x43, - 0xd6, 0x99, 0x4a, 0x99, 0x90, 0x27, 0x2d, 0xad, 0xd5, 0xd7, 0xc0, 0xbe, - 0x12, 0xee, 0x76, 0x67, 0x77, 0x7b, 0x35, 0xe4, 0xed, 0xf6, 0xde, 0xce, - 0xda, 0xd8, 0x9f, 0xb4, 0x56, 0xc5, 0xfe, 0xa3, 0x55, 0xb1, 0x27, 0xaa, - 0xbb, 0xf3, 0xa4, 0x18, 0x79, 0x5e, 0xb1, 0xf2, 0x88, 0xe1, 0xa9, 0xe7, - 0xd8, 0x6d, 0x69, 0x64, 0xa4, 0x2f, 0xcd, 0x8b, 0xb0, 0x2d, 0x1f, 0x95, - 0x2b, 0x34, 0xb0, 0xd1, 0x75, 0xe1, 0xd9, 0x36, 0xbb, 0xa9, 0xbf, 0xce, - 0xf7, 0xf7, 0x13, 0x40, 0x93, 0x80, 0x4d, 0xf2, 0x7e, 0xa6, 0x82, 0xa5, - 0xc5, 0xae, 0x93, 0xf4, 0x3a, 0x79, 0x7a, 0xc4, 0x7e, 0x73, 0x37, 0xf5, - 0xb7, 0xbd, 0x1a, 0xc1, 0x7c, 0xb9, 0x02, 0x8a, 0xdd, 0x22, 0x8a, 0x9d, - 0x9d, 0xd5, 0x28, 0x00, 0x2e, 0x8f, 0x71, 0xbb, 0x08, 0x63, 0xb7, 0x9b, - 0xa9, 0xfd, 0x6a, 0x04, 0xf2, 0xc5, 0xf2, 0xf4, 0x76, 0x8a, 0xe8, 0x6d, - 0xb7, 0xd3, 0x75, 0xff, 0xd1, 0x6a, 0xf4, 0xf2, 0xc5, 0xf2, 0xf4, 0x76, - 0x8b, 0xe8, 0xed, 0xb4, 0x56, 0x23, 0x00, 0xb8, 0x3c, 0xc6, 0x1f, 0x15, - 0x62, 0xcc, 0xea, 0xcb, 0xee, 0x8a, 0x14, 0xf2, 0xe5, 0xf2, 0x14, 0xf7, - 0x8a, 0x28, 0xee, 0x66, 0xf4, 0x65, 0x45, 0x82, 0xf9, 0x62, 0x79, 0x7a, - 0x4f, 0x8a, 0xe8, 0xfd, 0x68, 0x45, 0x2d, 0xfb, 0x51, 0x91, 0x96, 0xb5, - 0x5b, 0x85, 0x5d, 0x33, 0xa3, 0x2f, 0x2b, 0xf6, 0x94, 0x5c, 0xb1, 0x22, - 0x82, 0x85, 0xb6, 0xe0, 0x49, 0xfb, 0x56, 0x32, 0x7b, 0xd2, 0xbe, 0x59, - 0x66, 0xed, 0x62, 0x63, 0xd0, 0x5a, 0x51, 0xd3, 0x08, 0x70, 0x35, 0xa3, - 0xb7, 0x4b, 0x83, 0x46, 0xca, 0xf0, 0x85, 0xb3, 0xcd, 0x1a, 0xbe, 0x70, - 0xb6, 0x69, 0xc3, 0x17, 0xce, 0xee, 0xda, 0xf0, 0x85, 0xb3, 0xcd, 0x1a, - 0xbe, 0x70, 0xb6, 0x59, 0xc3, 0x17, 0xce, 0xee, 0xda, 0xf0, 0x85, 0xb3, - 0x4d, 0x1b, 0xbe, 0x70, 0xb6, 0x59, 0xc3, 0x17, 0xce, 0xee, 0xda, 0xf0, - 0x85, 0xb3, 0x0d, 0x1b, 0xbe, 0x70, 0xb6, 0x61, 0xc3, 0x17, 0xce, 0x36, - 0x66, 0xf8, 0xb4, 0x5b, 0x6d, 0x88, 0xcf, 0x46, 0x9b, 0x35, 0x7c, 0xb3, - 0xd1, 0xa6, 0x0d, 0xdf, 0x6c, 0x74, 0xd7, 0x86, 0x6f, 0x36, 0xda, 0xac, - 0xe1, 0x9b, 0x8d, 0x36, 0x6b, 0xf8, 0x66, 0xa3, 0xbb, 0x36, 0x7c, 0xb3, - 0xd1, 0xa6, 0x0d, 0xdf, 0x6c, 0xb4, 0x59, 0xc3, 0x37, 0x1b, 0xdd, 0xb5, - 0xe1, 0x9b, 0x8d, 0x36, 0x6c, 0xf8, 0x66, 0xa3, 0x0d, 0x1b, 0xbe, 0xd9, - 0x68, 0x63, 0x86, 0x2f, 0x9e, 0xf3, 0x1b, 0xea, 0xee, 0x64, 0xb3, 0x96, - 0xcf, 0x9d, 0x6c, 0xda, 0xf2, 0xb9, 0x93, 0xbb, 0xb6, 0x7c, 0xee, 0x64, - 0xb3, 0x96, 0xcf, 0x9d, 0x6c, 0xd6, 0xf2, 0xb9, 0x93, 0xbb, 0xb6, 0x7c, - 0xee, 0x64, 0xd3, 0x96, 0xcf, 0x9d, 0x6c, 0xd6, 0xf2, 0xb9, 0x93, 0xbb, - 0xb6, 0x7c, 0xee, 0x64, 0xc3, 0x96, 0xcf, 0x9d, 0x6c, 0xd8, 0xf2, 0xb9, - 0x93, 0xcd, 0x59, 0xbe, 0x78, 0x3d, 0xd2, 0xcc, 0xb4, 0xdd, 0xcd, 0x5a, - 0xbe, 0x0b, 0x77, 0xd3, 0x96, 0xef, 0xc2, 0xbd, 0x6b, 0xcb, 0x77, 0xe1, - 0x6e, 0xd6, 0xf2, 0x5d, 0xb8, 0x9b, 0xb5, 0x7c, 0x17, 0xee, 0x5d, 0x5b, - 0xbe, 0x0b, 0x77, 0xd3, 0x96, 0xef, 0xc2, 0xdd, 0xac, 0xe5, 0xbb, 0x70, - 0xef, 0xda, 0xf2, 0x5d, 0xb8, 0x1b, 0xb6, 0x7c, 0x17, 0xee, 0x86, 0x2d, - 0xdf, 0x85, 0x7b, 0x2f, 0x96, 0x6f, 0xd9, 0x9e, 0xc9, 0xce, 0x93, 0xc4, - 0x9e, 0x89, 0xdc, 0xa9, 0x6c, 0x5c, 0x84, 0x0d, 0x2a, 0x92, 0x89, 0x42, - 0x95, 0xbb, 0xcd, 0xc9, 0x1d, 0x6e, 0x43, 0xa8, 0x49, 0xfb, 0x9f, 0x72, - 0xab, 0x25, 0xc5, 0x62, 0x3b, 0xb7, 0x21, 0xae, 0x68, 0x14, 0xe2, 0x96, - 0x10, 0x1c, 0xbc, 0x65, 0xd3, 0x56, 0x0d, 0xce, 0x6f, 0xc8, 0x33, 0x01, - 0x3f, 0xd8, 0xa2, 0x1d, 0x74, 0x27, 0x18, 0xe2, 0xa8, 0x11, 0x1d, 0x0f, - 0x8b, 0x4e, 0x4f, 0xe5, 0x93, 0xda, 0x1a, 0xf6, 0x9c, 0x99, 0x0a, 0x1c, - 0x4e, 0x02, 0x35, 0xc6, 0x0e, 0x4c, 0x3e, 0x76, 0xdc, 0x64, 0x20, 0x8c, - 0x8c, 0xb7, 0xa7, 0xe3, 0x18, 0x16, 0x15, 0x4a, 0xc4, 0x8b, 0x06, 0x7e, - 0x84, 0x60, 0xb6, 0x6a, 0xe3, 0x49, 0x6b, 0x24, 0x26, 0x32, 0xfa, 0xaa, - 0x53, 0xb7, 0xba, 0x80, 0x4c, 0x01, 0x36, 0x7c, 0xec, 0x52, 0x3b, 0xf1, - 0x5e, 0x29, 0xc3, 0x6d, 0xcb, 0xb0, 0xac, 0x1c, 0x7b, 0x8e, 0x37, 0xf6, - 0x97, 0x31, 0xa7, 0x4f, 0x1e, 0x10, 0x7b, 0xc0, 0x7d, 0x6e, 0x07, 0xa3, - 0x70, 0x3f, 0x1d, 0x58, 0xbf, 0x9f, 0xe6, 0x52, 0xfe, 0x74, 0xc1, 0xe8, - 0x6f, 0xaa, 0x88, 0xd9, 0x10, 0x33, 0xb5, 0x63, 0xf8, 0x93, 0x33, 0x71, - 0x39, 0x0e, 0x70, 0x86, 0x2d, 0xcc, 0x57, 0x5e, 0x05, 0x0c, 0x80, 0x13, - 0x1c, 0x5c, 0x08, 0xfc, 0x33, 0x81, 0x18, 0xbd, 0x10, 0xb9, 0x81, 0x4d, - 0x04, 0x48, 0x5b, 0xf6, 0xad, 0xeb, 0x1c, 0x96, 0x3c, 0x97, 0x1a, 0x8f, - 0xfc, 0x8e, 0x99, 0xd4, 0x21, 0x78, 0xa5, 0x6c, 0xd6, 0x12, 0x2a, 0x42, - 0xc7, 0x71, 0x3c, 0x04, 0xa4, 0x51, 0x1c, 0xc3, 0x96, 0xf5, 0xde, 0xb7, - 0xc3, 0x48, 0x86, 0xfb, 0x85, 0x9c, 0xaa, 0x88, 0xf0, 0x59, 0x1b, 0x79, - 0xdc, 0x22, 0xb5, 0x71, 0x9e, 0x18, 0xb3, 0x3b, 0x1c, 0x9e, 0x96, 0xdb, - 0x09, 0x47, 0x34, 0x0a, 0x36, 0x0c, 0xcb, 0xe2, 0xde, 0xd0, 0xbf, 0x91, - 0x95, 0x0f, 0x9b, 0x35, 0x91, 0x73, 0xcb, 0xa2, 0xf0, 0x3b, 0x8c, 0x38, - 0xbb, 0x85, 0xb8, 0x62, 0x80, 0x22, 0xb1, 0xc7, 0x63, 0x80, 0x89, 0x38, - 0xec, 0x16, 0x04, 0xd8, 0xb5, 0x7f, 0xa4, 0x76, 0xf2, 0x8d, 0x44, 0x9a, - 0x38, 0x59, 0x78, 0xde, 0x6d, 0xb5, 0x5a, 0x39, 0xd1, 0xc8, 0xdf, 0x99, - 0x88, 0xf5, 0x84, 0xa6, 0x8d, 0xed, 0x91, 0x70, 0x3c, 0x8a, 0x1e, 0x0d, - 0xeb, 0xfc, 0x80, 0x48, 0x2e, 0x7e, 0xb2, 0x3a, 0xf8, 0xe0, 0x52, 0xeb, - 0x40, 0xe7, 0x98, 0xda, 0xb9, 0x5b, 0xa6, 0xb6, 0xd7, 0x62, 0x6a, 0xbb, - 0x84, 0xa9, 0xf6, 0x1d, 0x73, 0xd5, 0x5e, 0x8f, 0x2d, 0x06, 0x57, 0x7d, - 0x52, 0xd3, 0x89, 0x7b, 0x95, 0x2a, 0xa7, 0x0c, 0x64, 0x40, 0x81, 0xe8, - 0x2a, 0xf6, 0x34, 0xd9, 0xe3, 0xaf, 0x75, 0x37, 0x33, 0x5a, 0x92, 0xec, - 0x6b, 0xaa, 0xab, 0xde, 0x0b, 0xd2, 0x1c, 0xc7, 0xba, 0x72, 0x06, 0x7b, - 0x09, 0x06, 0x43, 0x20, 0x4f, 0x5c, 0x63, 0xbf, 0x17, 0xac, 0xb0, 0x28, - 0xc7, 0xd4, 0xc9, 0xc5, 0xc8, 0x0a, 0xcf, 0x9d, 0x68, 0x38, 0xb5, 0x1a, - 0x88, 0xff, 0x0e, 0x23, 0x9c, 0x3b, 0xa6, 0xa8, 0xdf, 0xe1, 0x54, 0x0c, - 0xcf, 0x74, 0xd8, 0x6f, 0x53, 0x41, 0x5c, 0x95, 0x85, 0x2d, 0xe5, 0x83, - 0xc8, 0xe5, 0x51, 0x8c, 0x74, 0xbf, 0x4f, 0x5b, 0x1e, 0xf3, 0xac, 0xbd, - 0xa2, 0xdc, 0x21, 0x1c, 0x15, 0x7f, 0x14, 0x33, 0x20, 0x4f, 0x6f, 0x59, - 0x99, 0x33, 0x54, 0x49, 0x1c, 0xad, 0x14, 0x82, 0x96, 0x2e, 0x8d, 0x20, - 0x3c, 0x39, 0xbe, 0x96, 0x1d, 0x4b, 0xc8, 0xc7, 0x79, 0x9b, 0xf8, 0xe6, - 0x6c, 0xd8, 0x73, 0x60, 0x90, 0x9b, 0xa3, 0x10, 0xad, 0x32, 0xdb, 0x39, - 0x18, 0x0c, 0x90, 0x55, 0x12, 0xfe, 0xb2, 0x2d, 0x7b, 0x48, 0x3e, 0xcd, - 0x70, 0xad, 0x4e, 0xd2, 0x2e, 0x65, 0x3e, 0x8e, 0x9b, 0xaf, 0x54, 0x52, - 0xf5, 0xef, 0xec, 0x26, 0x25, 0xac, 0x9e, 0x4d, 0x75, 0xa4, 0x78, 0x4d, - 0x1d, 0xb6, 0xcb, 0x46, 0x00, 0x19, 0xa6, 0x75, 0xbb, 0x6a, 0x70, 0x93, - 0xf5, 0x58, 0x9d, 0xa0, 0x6a, 0x3f, 0xb4, 0xe2, 0xc6, 0x28, 0xa6, 0x94, - 0x2c, 0xc4, 0x07, 0x1b, 0x4d, 0x91, 0x82, 0xb8, 0x44, 0x79, 0xfe, 0x61, - 0x19, 0x21, 0x23, 0xbf, 0x34, 0xf7, 0xf9, 0x11, 0xf7, 0xd7, 0x55, 0x12, - 0x4f, 0x4d, 0xd6, 0x72, 0x16, 0xde, 0x08, 0xb3, 0x3c, 0xdf, 0x34, 0x60, - 0x93, 0xeb, 0x07, 0xfa, 0xd9, 0x91, 0x51, 0x29, 0x78, 0x1e, 0x36, 0xc5, - 0x72, 0xfe, 0x50, 0x8b, 0x2a, 0x01, 0xd9, 0xa0, 0xd5, 0xd4, 0x51, 0xa8, - 0x25, 0x5d, 0x33, 0x7d, 0xa8, 0xd9, 0xe2, 0x03, 0xca, 0xa9, 0x38, 0xd5, - 0x8e, 0x89, 0x53, 0xb5, 0x6d, 0x7b, 0xd9, 0x39, 0x3a, 0x13, 0xe3, 0x9e, - 0x12, 0xba, 0x3a, 0x23, 0xca, 0x2d, 0xa8, 0x8f, 0x88, 0x2e, 0x45, 0x5f, - 0x4a, 0x20, 0xf6, 0x4a, 0x8c, 0x82, 0x6a, 0x63, 0xc5, 0xd8, 0xb5, 0x95, - 0x91, 0xbe, 0x0f, 0x27, 0x35, 0x54, 0xd2, 0x55, 0x8a, 0xc1, 0x6d, 0xb6, - 0x25, 0x79, 0x75, 0xa1, 0x30, 0x56, 0xe6, 0xa3, 0xa4, 0xa6, 0x6d, 0x15, - 0x11, 0x98, 0xc5, 0xde, 0x53, 0x6d, 0x72, 0x95, 0xea, 0x6e, 0x8f, 0xdf, - 0x20, 0x1a, 0xd1, 0x92, 0x4d, 0x17, 0x92, 0xb9, 0x95, 0x61, 0x9a, 0xd6, - 0x73, 0xe6, 0x15, 0xff, 0xb3, 0x4f, 0x64, 0x79, 0x8b, 0xd9, 0x80, 0x00, - 0x06, 0x22, 0x3a, 0xa7, 0x59, 0x44, 0x0b, 0xa0, 0x74, 0x1e, 0x04, 0xe6, - 0x8c, 0x4e, 0x57, 0xa8, 0x7c, 0xf8, 0x40, 0xc2, 0x1d, 0x85, 0x8f, 0xb3, - 0x9e, 0x56, 0xd2, 0xd9, 0x4a, 0x55, 0x65, 0x9b, 0xaa, 0xd2, 0xe5, 0xbf, - 0x58, 0x4a, 0xae, 0x3d, 0x10, 0xae, 0x3c, 0x90, 0xcd, 0x3f, 0xd3, 0x52, - 0xd9, 0x4b, 0x9b, 0x83, 0xd8, 0x15, 0xcc, 0xfb, 0x71, 0x29, 0x26, 0x0e, - 0x0f, 0x0f, 0x13, 0x76, 0x9b, 0x5b, 0xb4, 0x50, 0x4b, 0xf2, 0x22, 0xa7, - 0x11, 0x45, 0x44, 0xcc, 0x6d, 0xc7, 0x70, 0x9b, 0x53, 0x1d, 0x29, 0x00, - 0x9c, 0x36, 0x96, 0x3c, 0x97, 0x0e, 0x27, 0xba, 0x9a, 0x5a, 0x62, 0x8c, - 0x42, 0x8e, 0x50, 0xba, 0x11, 0xf2, 0x58, 0xaf, 0x56, 0xa8, 0x61, 0xbb, - 0xdd, 0xce, 0x8f, 0x44, 0x46, 0x72, 0x5c, 0xb7, 0xf8, 0x24, 0x56, 0xce, - 0x4a, 0xe6, 0x8e, 0x09, 0x9b, 0x11, 0x8e, 0x43, 0x4c, 0xa9, 0xad, 0xd2, - 0x47, 0x37, 0xe5, 0x8c, 0x6d, 0x49, 0x2f, 0x2c, 0xef, 0x88, 0x59, 0x4b, - 0xab, 0x40, 0xac, 0x16, 0x45, 0x47, 0x0a, 0x3b, 0xcc, 0x45, 0x34, 0x1b, - 0xe9, 0xb7, 0xf8, 0x8f, 0x84, 0xb8, 0x54, 0x60, 0xd2, 0xee, 0x5e, 0x95, - 0x30, 0xb7, 0xd3, 0xda, 0x1b, 0x8e, 0x87, 0x99, 0x6e, 0x19, 0xb0, 0xda, - 0x2b, 0x94, 0xa5, 0x0d, 0xc2, 0x50, 0x9f, 0xae, 0xcc, 0x08, 0x15, 0x6b, - 0x64, 0xbe, 0x1b, 0x96, 0xca, 0x2b, 0x31, 0x57, 0x2f, 0xaf, 0xe9, 0x36, - 0xff, 0xd5, 0xa5, 0xfa, 0x65, 0x93, 0x89, 0xf7, 0x65, 0x0c, 0xd6, 0xf3, - 0x49, 0xbd, 0x9e, 0x1e, 0x39, 0x64, 0xa9, 0x46, 0x34, 0x85, 0xac, 0xb8, - 0x26, 0xf1, 0x19, 0xf8, 0x24, 0x93, 0x1a, 0xba, 0x20, 0xf3, 0xda, 0x62, - 0xb9, 0xa9, 0x21, 0x8d, 0xf1, 0xa4, 0x04, 0xb6, 0x16, 0xf1, 0x78, 0xa0, - 0x6f, 0x65, 0x06, 0xfa, 0xed, 0x22, 0xb9, 0x12, 0xdc, 0xf7, 0x8b, 0xbc, - 0x9d, 0x9c, 0x3e, 0x3f, 0x1c, 0xf2, 0x5f, 0x99, 0x82, 0x0a, 0xfe, 0x2b, - 0x14, 0xff, 0xf6, 0x8a, 0xe2, 0x7f, 0x38, 0x60, 0x37, 0x4a, 0x75, 0xf9, - 0x8f, 0xb0, 0xad, 0x7d, 0x99, 0x62, 0xc6, 0x8f, 0xbc, 0x2f, 0x15, 0x6b, - 0xef, 0xc3, 0x70, 0x2e, 0x30, 0xc8, 0x27, 0x4b, 0x73, 0xca, 0x4a, 0x85, - 0xb7, 0x7e, 0xa0, 0x0c, 0xf4, 0x07, 0xdc, 0xa6, 0xe2, 0x26, 0x86, 0x92, - 0xd3, 0x73, 0x4a, 0x38, 0x1d, 0xda, 0xde, 0x67, 0x3b, 0xd4, 0x98, 0xca, - 0x4e, 0x23, 0xeb, 0xe5, 0x4f, 0x0e, 0x12, 0x36, 0x4b, 0x49, 0xf9, 0x64, - 0x63, 0xca, 0x8c, 0x4b, 0x7c, 0xf3, 0x41, 0xe9, 0xd8, 0x53, 0xb1, 0xe7, - 0x8d, 0x29, 0xe4, 0xc2, 0xe7, 0x0b, 0x1b, 0xc5, 0x47, 0x03, 0xc9, 0xdf, - 0x28, 0x3f, 0x5b, 0xad, 0xd4, 0x3d, 0x59, 0x43, 0x57, 0x4c, 0x84, 0x76, - 0x49, 0x8c, 0xce, 0x74, 0xbf, 0x9f, 0x39, 0x7d, 0xbb, 0xad, 0xcd, 0x4d, - 0x7e, 0x28, 0x58, 0xe6, 0xef, 0x97, 0x44, 0xef, 0xe7, 0xb4, 0x2e, 0x35, - 0xe2, 0xab, 0x13, 0x88, 0xcd, 0x9d, 0x40, 0xcc, 0x8a, 0x5c, 0x81, 0x96, - 0xc9, 0x49, 0xce, 0x28, 0x9a, 0x7b, 0x3a, 0xb5, 0xd4, 0xc6, 0x1b, 0x0d, - 0x5e, 0xe6, 0x7b, 0x5c, 0x27, 0x6e, 0xc5, 0xd9, 0xd2, 0xd7, 0xe2, 0xc8, - 0xa7, 0xc4, 0x55, 0x4c, 0x4f, 0xe9, 0xb6, 0x99, 0x83, 0x04, 0xe8, 0xc8, - 0xf9, 0x6c, 0x39, 0x23, 0x5c, 0xa0, 0x81, 0x05, 0x3b, 0x08, 0xfe, 0x14, - 0x4b, 0x51, 0x1e, 0x38, 0xab, 0xc8, 0xab, 0x2e, 0xfa, 0x15, 0x2d, 0x25, - 0x6a, 0x88, 0x8a, 0x2a, 0x18, 0x17, 0x9e, 0xb6, 0x0f, 0x14, 0x3c, 0x88, - 0xb4, 0xb3, 0xb9, 0xf3, 0x83, 0x37, 0xce, 0x30, 0xf0, 0x43, 0x7f, 0x1c, - 0xbd, 0x3a, 0x7a, 0xba, 0x35, 0x4f, 0x92, 0xdd, 0x02, 0xdd, 0x22, 0x36, - 0xf8, 0x74, 0xa3, 0xa6, 0x93, 0xca, 0x1d, 0xba, 0x76, 0x18, 0x32, 0x80, - 0x39, 0xfe, 0xa8, 0x01, 0x53, 0xc0, 0xe1, 0xe7, 0x89, 0x45, 0xd7, 0x43, - 0xa1, 0x63, 0xf7, 0x2b, 0xe8, 0xba, 0xb4, 0xa1, 0xb0, 0xd7, 0x6d, 0x3d, - 0xd9, 0xdb, 0xdb, 0xed, 0x24, 0x7f, 0x57, 0xa4, 0xde, 0xf4, 0x2b, 0x9d, - 0x56, 0xab, 0xa2, 0x54, 0x46, 0x3d, 0x5c, 0xcc, 0x5c, 0x2f, 0x94, 0xf7, - 0x13, 0xe1, 0x7a, 0xa2, 0xf3, 0xf3, 0xf3, 0xe6, 0x79, 0xb7, 0xe9, 0x07, - 0x93, 0x2d, 0xe4, 0xb6, 0xb6, 0x40, 0x40, 0x13, 0xce, 0x11, 0x97, 0xab, - 0x67, 0x6a, 0xb9, 0xad, 0x5f, 0x79, 0x28, 0xc6, 0xf4, 0x5f, 0x45, 0xaf, - 0xbf, 0x29, 0x8a, 0xa0, 0x4d, 0xeb, 0x73, 0xfd, 0x0a, 0x4b, 0xd5, 0x1a, - 0x82, 0x51, 0x6c, 0xdc, 0x3c, 0x69, 0xef, 0x6c, 0x3f, 0xd9, 0xee, 0xb6, - 0x91, 0x70, 0x99, 0x49, 0x08, 0xf0, 0xbc, 0x93, 0x78, 0xde, 0x5a, 0x4e, - 0x9f, 0x45, 0x49, 0x87, 0xe0, 0x21, 0x23, 0x7b, 0x82, 0x65, 0x3f, 0x22, - 0xa3, 0x25, 0x58, 0xb4, 0x90, 0x5a, 0x31, 0x1c, 0xb7, 0x5a, 0xf6, 0x70, - 0xd8, 0xce, 0x73, 0x9c, 0x5d, 0x42, 0x24, 0x16, 0x5b, 0x75, 0x8c, 0x62, - 0x71, 0x0e, 0xf5, 0x22, 0x5c, 0x9c, 0xd5, 0xaf, 0xb0, 0xd9, 0xba, 0xb7, - 0x2a, 0x4e, 0x74, 0x45, 0xf2, 0x4b, 0xae, 0xba, 0x59, 0x0a, 0xcb, 0x51, - 0xef, 0x4a, 0x0b, 0x06, 0x7c, 0x65, 0xd9, 0xba, 0x64, 0x2e, 0x76, 0x2a, - 0xf2, 0x0c, 0xcc, 0x0c, 0x60, 0xb4, 0x08, 0x2f, 0xa8, 0x6a, 0x20, 0x88, - 0xc7, 0x00, 0xea, 0xa9, 0x3a, 0xaa, 0x37, 0x9c, 0xfa, 0xe0, 0x5a, 0x5e, - 0x1e, 0x51, 0x89, 0x17, 0xf3, 0x00, 0x88, 0x6b, 0xcb, 0xda, 0xad, 0xef, - 0x3f, 0xdd, 0x22, 0xb8, 0x95, 0x58, 0x4a, 0x69, 0x75, 0x21, 0x57, 0x9d, - 0xd6, 0x57, 0x73, 0xd5, 0xa9, 0x1c, 0x2c, 0x65, 0xe9, 0xe9, 0xd6, 0xa4, - 0xa8, 0x3f, 0x91, 0xbe, 0x9b, 0x74, 0xd3, 0x7d, 0x57, 0xe9, 0xce, 0x7a, - 0x81, 0x0e, 0x94, 0xcb, 0x40, 0xe2, 0x83, 0x1a, 0xab, 0x99, 0x1c, 0xcf, - 0x96, 0xc5, 0xe4, 0x61, 0x29, 0x53, 0x28, 0x69, 0x84, 0x69, 0xe4, 0x4a, - 0x1f, 0x2d, 0x4b, 0xa7, 0x91, 0x45, 0x56, 0x49, 0x65, 0x4b, 0xd7, 0x34, - 0x07, 0xd6, 0xb4, 0xcb, 0x4c, 0x51, 0xf6, 0xa0, 0x5a, 0xcc, 0x8b, 0x1a, - 0x7e, 0x28, 0xaa, 0x46, 0xe3, 0x58, 0x09, 0x0f, 0x9d, 0xfb, 0x42, 0x8d, - 0xe9, 0x46, 0x3a, 0x16, 0xd7, 0x0a, 0x65, 0x79, 0xe3, 0x25, 0x16, 0x6f, - 0x51, 0xce, 0x52, 0x4c, 0x00, 0xf2, 0x74, 0x2b, 0xa0, 0xf3, 0x46, 0x62, - 0x14, 0x9b, 0x09, 0x39, 0xf0, 0xa1, 0xbc, 0x63, 0xd9, 0x98, 0x71, 0x37, - 0xe4, 0x33, 0xb8, 0x0d, 0x16, 0xc6, 0x96, 0xa4, 0x6f, 0x01, 0xa8, 0x1c, - 0x9c, 0x3b, 0x63, 0xe7, 0xe9, 0x96, 0x73, 0xf0, 0xc8, 0x1b, 0x84, 0xf3, - 0x7d, 0xf9, 0xc9, 0x44, 0x74, 0x81, 0xf4, 0x16, 0x53, 0xe5, 0x80, 0xaa, - 0x8c, 0xca, 0x12, 0xc8, 0x81, 0x64, 0xe7, 0x20, 0x66, 0x45, 0x25, 0xcb, - 0xaf, 0x1b, 0x6b, 0x00, 0xad, 0x89, 0x4b, 0xae, 0xc9, 0x75, 0x88, 0x4e, - 0x65, 0xbb, 0xa7, 0xc4, 0xfc, 0xa9, 0x3f, 0x1e, 0x7f, 0x6d, 0x05, 0xc0, - 0xc9, 0x2d, 0xeb, 0x00, 0xf5, 0xe4, 0x39, 0x91, 0xb4, 0x05, 0xd9, 0xa6, - 0x58, 0x15, 0x8b, 0x24, 0x4e, 0x78, 0xb0, 0x66, 0xe2, 0xb8, 0x45, 0x6d, - 0xaa, 0x2e, 0x3a, 0xf3, 0xbd, 0xe7, 0x74, 0x95, 0x15, 0xee, 0x4e, 0x0c, - 0x4f, 0x03, 0xa1, 0xca, 0x55, 0x6b, 0x24, 0xbe, 0x32, 0x59, 0xd1, 0x81, - 0x39, 0xcc, 0x12, 0xc5, 0xb9, 0x91, 0x92, 0xac, 0x75, 0x5c, 0x3e, 0xae, - 0x32, 0x13, 0x59, 0x52, 0x77, 0xad, 0x99, 0xe9, 0x34, 0x74, 0xf0, 0x25, - 0xc3, 0xbf, 0x3a, 0xf4, 0x0f, 0x67, 0x85, 0x0f, 0xa1, 0xdf, 0xd4, 0x45, - 0xf9, 0xc0, 0x2d, 0x1f, 0x9e, 0x40, 0x80, 0x7c, 0xdc, 0x3f, 0x93, 0x6e, - 0x2e, 0x2f, 0x21, 0xac, 0xd2, 0x4b, 0xf3, 0x76, 0xaa, 0xc0, 0x5d, 0x5b, - 0x3a, 0x00, 0x49, 0xb7, 0x9c, 0x9b, 0x28, 0xef, 0xad, 0x57, 0xd0, 0x18, - 0x43, 0xd9, 0x18, 0xbe, 0x77, 0xc2, 0xde, 0x2f, 0xfb, 0xf8, 0x55, 0xf1, - 0x19, 0xa8, 0x6b, 0x94, 0xcd, 0xb7, 0x2c, 0xce, 0xe0, 0x9a, 0x96, 0x80, - 0x40, 0xd2, 0x12, 0x97, 0x62, 0xa2, 0xac, 0x46, 0x86, 0x03, 0x20, 0x69, - 0xc7, 0xca, 0x51, 0xe0, 0x5f, 0x27, 0x4e, 0xa6, 0x13, 0x03, 0xcf, 0x73, - 0xfc, 0xbd, 0x5d, 0xcc, 0xaa, 0xed, 0xda, 0x92, 0x5a, 0x1b, 0xd5, 0x3c, - 0x60, 0xfc, 0xba, 0xa7, 0xb4, 0x7b, 0x32, 0xd5, 0xf0, 0xf2, 0x53, 0x71, - 0xd1, 0x2e, 0x50, 0xf1, 0x55, 0x94, 0x66, 0x69, 0x05, 0x3b, 0xab, 0x55, - 0xb0, 0x5b, 0x5e, 0xc1, 0xce, 0x6d, 0x2a, 0xd8, 0x29, 0xaa, 0x60, 0xe7, - 0x3e, 0x2a, 0xd8, 0xfd, 0xea, 0x0a, 0x76, 0x6f, 0x53, 0xc1, 0x6e, 0x51, - 0x05, 0xbb, 0x5f, 0x59, 0x41, 0xce, 0x5b, 0xd1, 0x54, 0x2c, 0xeb, 0xeb, - 0x3f, 0x5a, 0xa5, 0x47, 0xeb, 0xf5, 0x8a, 0xb8, 0x67, 0xc7, 0x85, 0x6e, - 0x34, 0x05, 0xa8, 0x2d, 0x5f, 0x85, 0xb1, 0x92, 0xcf, 0xb2, 0xac, 0x05, - 0xcd, 0x02, 0x6d, 0xe5, 0xe0, 0xc6, 0x96, 0xdf, 0xba, 0x59, 0x33, 0x6e, - 0x22, 0xcd, 0xcb, 0x0d, 0x14, 0x72, 0x00, 0x2f, 0x9d, 0xc6, 0xc9, 0x80, - 0x86, 0x28, 0x4e, 0xbc, 0xa9, 0xa4, 0x5c, 0xaa, 0x94, 0x0b, 0xe5, 0x72, - 0x9d, 0xad, 0x82, 0x4a, 0x30, 0x1a, 0xe8, 0xd0, 0x8d, 0x75, 0x96, 0xc5, - 0x3f, 0xdb, 0xee, 0x02, 0xe5, 0xb1, 0x74, 0xac, 0x6f, 0xb2, 0xe5, 0x15, - 0xa2, 0x0a, 0x6d, 0xf0, 0x63, 0xb2, 0x86, 0x6f, 0xfb, 0x82, 0xb3, 0x63, - 0xdc, 0x95, 0xcd, 0x09, 0x64, 0x12, 0x08, 0x1a, 0x1c, 0xf9, 0xeb, 0x2b, - 0x85, 0xc2, 0x38, 0xee, 0x4d, 0x2c, 0x8c, 0x7d, 0x83, 0x82, 0x19, 0x80, - 0xbb, 0xca, 0x01, 0x7d, 0x7e, 0xa5, 0x58, 0x08, 0xc5, 0xbd, 0x49, 0x85, - 0x90, 0x6f, 0x50, 0x28, 0xb4, 0xa3, 0x08, 0x7a, 0xf4, 0xf5, 0xb5, 0x62, - 0x21, 0x1c, 0xf7, 0x27, 0x17, 0xc2, 0xbe, 0x49, 0xc1, 0xc8, 0x55, 0xd0, - 0xd8, 0x32, 0xea, 0xa5, 0xae, 0x3d, 0x75, 0x33, 0x4c, 0x57, 0x7e, 0xef, - 0xaf, 0xe5, 0xa3, 0x5b, 0xfa, 0x82, 0x32, 0x08, 0x7c, 0x80, 0xa9, 0x3e, - 0xfc, 0x9c, 0x91, 0x08, 0xc9, 0xe9, 0x22, 0x37, 0xf4, 0x2b, 0xc5, 0x2f, - 0x19, 0xbe, 0x37, 0xf9, 0x4b, 0xf4, 0x1b, 0x6c, 0x00, 0x5e, 0x48, 0xbe, - 0x5b, 0xf9, 0xd3, 0x3c, 0x67, 0x26, 0x82, 0x3b, 0x10, 0x36, 0x98, 0xbb, - 0xc7, 0x01, 0x03, 0xd8, 0xbf, 0x7e, 0xc8, 0xc8, 0x8e, 0xe9, 0xc9, 0x4b, - 0x05, 0x93, 0x8b, 0xbd, 0x6d, 0xda, 0x46, 0xbc, 0xb1, 0x1e, 0x2c, 0x2d, - 0x2d, 0x55, 0x19, 0x05, 0xa2, 0xcb, 0xac, 0x50, 0x7f, 0x59, 0x67, 0x1d, - 0xcb, 0x22, 0x2b, 0x49, 0x53, 0x30, 0x62, 0x2c, 0x31, 0x65, 0x88, 0xfc, - 0x09, 0xee, 0x4e, 0x3f, 0x54, 0x19, 0xd5, 0x68, 0x8a, 0x4b, 0xd4, 0x55, - 0x20, 0x41, 0xed, 0x46, 0x16, 0x63, 0x07, 0x2f, 0x85, 0x7d, 0x30, 0x91, - 0xdb, 0xe1, 0x69, 0x6f, 0xc9, 0xe2, 0xb5, 0xbd, 0x15, 0xbc, 0x3c, 0xfa, - 0xd3, 0xaa, 0x42, 0x42, 0x4d, 0xe1, 0x7e, 0x3d, 0x70, 0x33, 0x0b, 0x37, - 0x3d, 0xca, 0xe2, 0xcd, 0xb4, 0xc4, 0x15, 0xe8, 0x7b, 0x2c, 0x5f, 0x5d, - 0xe8, 0xc6, 0xa6, 0xbb, 0x23, 0xbf, 0x32, 0x99, 0x96, 0x5f, 0x9f, 0xc6, - 0xe5, 0xdf, 0xb4, 0x70, 0x98, 0x9b, 0x15, 0xaa, 0x8d, 0x82, 0xc2, 0xc9, - 0x21, 0x2d, 0x37, 0xdd, 0xb8, 0x9a, 0xb4, 0xc2, 0xcc, 0xb6, 0xd4, 0xe3, - 0x55, 0x86, 0x3e, 0x54, 0xdc, 0x41, 0xbc, 0xcb, 0xf8, 0xc0, 0xc2, 0xfc, - 0x79, 0xf8, 0x46, 0x82, 0xca, 0x65, 0xf9, 0x95, 0x94, 0x90, 0x30, 0x65, - 0x08, 0xc5, 0x54, 0xca, 0xf7, 0x80, 0x8b, 0x36, 0x2b, 0xd4, 0x86, 0x0d, - 0xef, 0x80, 0x62, 0xa1, 0xf7, 0x3e, 0xdb, 0x6c, 0xbd, 0xc9, 0x7b, 0x72, - 0x1b, 0x02, 0xef, 0x7b, 0x28, 0x6d, 0x1a, 0x49, 0xae, 0x88, 0x68, 0x89, - 0xda, 0xe8, 0x8b, 0x44, 0xd7, 0xd3, 0x1b, 0xc9, 0xd7, 0xbd, 0x6a, 0x0e, - 0xe6, 0x4a, 0xdb, 0xac, 0x11, 0x72, 0xc3, 0xed, 0x35, 0x8c, 0xeb, 0xe2, - 0x66, 0xb5, 0x90, 0xc0, 0x5c, 0x33, 0x57, 0x95, 0x88, 0x6b, 0x96, 0x8a, - 0xea, 0x21, 0x51, 0xc9, 0x5f, 0x6b, 0x36, 0xf2, 0x0a, 0x0c, 0x23, 0xe4, - 0x53, 0x1b, 0x3c, 0xb0, 0xfb, 0x15, 0x36, 0xbd, 0x72, 0xb0, 0x71, 0x13, - 0x0e, 0x7d, 0x68, 0x68, 0xbb, 0xb6, 0x12, 0x2a, 0xb2, 0xb6, 0xba, 0xe4, - 0x3d, 0x58, 0xe8, 0xbb, 0xb5, 0xaa, 0x2b, 0x34, 0x1e, 0xeb, 0xc4, 0xb7, - 0x0e, 0x06, 0xa8, 0xe0, 0x9e, 0x1b, 0x0f, 0xe5, 0x57, 0x1e, 0x6a, 0x78, - 0xe9, 0x44, 0xd6, 0xea, 0x1e, 0x1a, 0x7d, 0xce, 0xd5, 0x25, 0x5e, 0x6e, - 0x5c, 0x22, 0x30, 0x6d, 0x6e, 0x0a, 0xde, 0x61, 0x73, 0xb3, 0x50, 0x56, - 0x96, 0x8a, 0xdc, 0x67, 0xbb, 0x8f, 0xe1, 0xb7, 0x54, 0x51, 0x96, 0x0c, - 0x5f, 0x46, 0x7d, 0x7e, 0xea, 0x87, 0x11, 0xed, 0x95, 0xdc, 0x6a, 0x0c, - 0x9b, 0xca, 0xc2, 0xff, 0x9e, 0x21, 0x6c, 0x59, 0x07, 0x69, 0xb7, 0x56, - 0xaa, 0xfc, 0x9b, 0x5f, 0xbc, 0x7f, 0x4f, 0x02, 0xb8, 0x55, 0xe5, 0x67, - 0x7f, 0x8c, 0xa2, 0x53, 0x92, 0xc0, 0x7f, 0x5c, 0xed, 0x57, 0x6b, 0x79, - 0xaa, 0xfc, 0xb7, 0x7e, 0xb0, 0x4e, 0xe5, 0xe5, 0x1c, 0x24, 0x33, 0x6f, - 0xd8, 0xdd, 0xd9, 0xe9, 0xee, 0x24, 0x44, 0x82, 0xa3, 0x4a, 0xff, 0x79, - 0x22, 0xd9, 0x5d, 0x59, 0x24, 0xbf, 0x0c, 0x6f, 0xb4, 0xa6, 0x4b, 0xf4, - 0x81, 0xe2, 0x6e, 0xfe, 0x8b, 0x2b, 0xff, 0x2d, 0xca, 0xae, 0x51, 0xf9, - 0x39, 0xc0, 0xcf, 0x51, 0x93, 0x84, 0x00, 0x28, 0xe9, 0xdf, 0x22, 0x80, - 0x55, 0x56, 0xb7, 0xef, 0xd0, 0xc9, 0x7b, 0x8e, 0x11, 0xe3, 0x2e, 0xbb, - 0x8e, 0xc4, 0x3a, 0x04, 0xd6, 0xff, 0xbc, 0xce, 0x93, 0xac, 0xf7, 0xf1, - 0xcb, 0x67, 0xef, 0x56, 0x77, 0x6c, 0xe5, 0x4f, 0x04, 0xaa, 0xf9, 0x9b, - 0x77, 0x6d, 0x95, 0x77, 0xe4, 0x7d, 0x6d, 0x23, 0xb5, 0x77, 0x93, 0x2d, - 0x84, 0xd3, 0x94, 0xff, 0x96, 0xf6, 0xd9, 0x80, 0x7a, 0x77, 0x13, 0x72, - 0x7b, 0xf7, 0xed, 0xfb, 0xe3, 0xa3, 0x5f, 0xad, 0xdb, 0xd0, 0x78, 0xbb, - 0x18, 0xce, 0x89, 0x6e, 0xb0, 0xa9, 0x33, 0x2c, 0xbf, 0x38, 0xfc, 0xe6, - 0xe8, 0x16, 0x3c, 0xe3, 0x3c, 0xd5, 0x26, 0xa7, 0x5e, 0x19, 0xa6, 0x5f, - 0x1e, 0xbe, 0x79, 0x73, 0x78, 0x0b, 0xae, 0x27, 0xf6, 0x6c, 0x66, 0xff, - 0xfb, 0xd8, 0x3e, 0x79, 0xf5, 0xdb, 0xdb, 0xc8, 0x1a, 0x3e, 0xf1, 0x5d, - 0xcb, 0xfa, 0xbe, 0xbb, 0x46, 0xf9, 0xe8, 0xa9, 0x23, 0xfc, 0x65, 0x78, - 0xbf, 0x1a, 0x4c, 0x4d, 0x4c, 0x81, 0x1a, 0x4a, 0x97, 0xce, 0x4d, 0x34, - 0xee, 0xa2, 0x2b, 0xb0, 0x99, 0xcb, 0x9b, 0x37, 0x93, 0xdf, 0xd8, 0x64, - 0xe4, 0xf8, 0x39, 0x65, 0xcd, 0xd4, 0x4c, 0xc7, 0x6c, 0x92, 0xce, 0x00, - 0x58, 0xd1, 0xab, 0xc1, 0xea, 0x50, 0xc9, 0x8a, 0x34, 0x5e, 0x60, 0x3e, - 0xb3, 0x12, 0x0d, 0x9a, 0xf8, 0xdc, 0x92, 0xc6, 0x33, 0x84, 0xb9, 0xad, - 0x44, 0x83, 0xc2, 0xba, 0x6f, 0x4b, 0x23, 0x5a, 0x4d, 0x54, 0x83, 0xe8, - 0xb6, 0x92, 0x02, 0x05, 0xc4, 0x05, 0xac, 0x4a, 0x04, 0xda, 0xb2, 0x16, - 0x1d, 0x46, 0xbb, 0x66, 0xff, 0xb8, 0x2b, 0xc5, 0x76, 0xed, 0xcf, 0xe2, - 0x2d, 0xad, 0xe9, 0xad, 0x31, 0xa2, 0x1a, 0xf7, 0x98, 0x8b, 0x7b, 0x28, - 0x7e, 0x17, 0xee, 0xa1, 0xde, 0x41, 0xd0, 0x67, 0x16, 0x69, 0x17, 0xe1, - 0x9e, 0x06, 0xd5, 0x58, 0x5a, 0x71, 0xc4, 0x57, 0x6a, 0x31, 0xb2, 0x11, - 0xa2, 0x5a, 0x7a, 0x5b, 0x45, 0xe6, 0xc7, 0xe6, 0x2d, 0xf9, 0xa2, 0x0c, - 0x7a, 0x69, 0x5d, 0xe2, 0xe5, 0x64, 0xc9, 0x17, 0xfd, 0xdd, 0xb0, 0x89, - 0xc4, 0x6f, 0x6e, 0xca, 0xee, 0x24, 0x11, 0x55, 0x6c, 0x24, 0xf1, 0xf7, - 0x89, 0x62, 0x25, 0x0e, 0x16, 0x5b, 0x75, 0x71, 0x37, 0x03, 0x21, 0x2f, - 0xbf, 0xe7, 0xda, 0xc9, 0x9f, 0x71, 0x43, 0xc5, 0x47, 0x71, 0xcb, 0x36, - 0x6b, 0x9e, 0xf2, 0x6a, 0x8f, 0x9d, 0x79, 0x25, 0xed, 0xc4, 0xc1, 0x19, - 0x95, 0x41, 0xf1, 0x7b, 0x71, 0xb7, 0x2a, 0x09, 0x42, 0xfc, 0xa6, 0x25, - 0x08, 0x11, 0x8d, 0x4a, 0x2f, 0x2d, 0x3e, 0x1d, 0xb8, 0x36, 0x9e, 0x0f, - 0xbe, 0x0d, 0xfc, 0x3f, 0xd0, 0x00, 0x32, 0xf5, 0x69, 0x7d, 0xc2, 0x3e, - 0xc0, 0xd9, 0xe4, 0x7f, 0xfc, 0x15, 0xa7, 0x57, 0xda, 0x7b, 0xb2, 0x36, - 0xd6, 0x3a, 0xa1, 0x9a, 0x85, 0x8d, 0xe7, 0xcf, 0x85, 0x57, 0xd2, 0x78, - 0xba, 0xc1, 0x94, 0x8e, 0x7d, 0x7d, 0x8b, 0xc5, 0xad, 0xe4, 0xc4, 0x61, - 0x7d, 0xb9, 0x36, 0x92, 0xe2, 0x58, 0x16, 0x14, 0x8c, 0x2b, 0x48, 0x9c, - 0x79, 0x72, 0x84, 0x74, 0xc6, 0x56, 0x15, 0xe1, 0x7e, 0x78, 0xb3, 0x16, - 0x62, 0x0a, 0x9b, 0x34, 0xff, 0x3c, 0x9c, 0x80, 0xc5, 0x26, 0xdf, 0x9f, - 0xf0, 0x6e, 0x5c, 0x7d, 0xfc, 0xe6, 0xe4, 0xd5, 0xd1, 0xe3, 0xda, 0x83, - 0x7e, 0xbf, 0xd1, 0xb6, 0xfe, 0xf4, 0x27, 0xcb, 0xc0, 0xe2, 0x58, 0xd2, - 0xaf, 0xb0, 0x94, 0x06, 0xfd, 0x34, 0xc0, 0xef, 0x03, 0x67, 0x84, 0xd2, - 0x5b, 0x8f, 0x6b, 0xd6, 0x41, 0x7c, 0x75, 0xbb, 0xf9, 0xa3, 0xaa, 0xe0, - 0xcd, 0xb3, 0x4d, 0xd7, 0x9f, 0x54, 0x2b, 0x78, 0x41, 0xeb, 0x48, 0x44, - 0x32, 0x56, 0xb4, 0xb6, 0x9f, 0x06, 0x1c, 0xe1, 0xf0, 0xd8, 0x8c, 0xd8, - 0x40, 0x83, 0x1e, 0xc9, 0x17, 0xc4, 0x3e, 0xbb, 0x7c, 0x35, 0xaa, 0xe6, - 0x8e, 0x48, 0xd4, 0x9a, 0xac, 0x63, 0x4d, 0x7d, 0xa4, 0xb3, 0x6f, 0x3d, - 0xe6, 0x1e, 0xf2, 0x78, 0x55, 0x84, 0xf1, 0x26, 0x40, 0x11, 0xaa, 0x29, - 0x6a, 0x93, 0xc4, 0x94, 0x3a, 0xdf, 0xa1, 0x44, 0x99, 0x17, 0x2e, 0x1f, - 0x0e, 0xd2, 0xab, 0xf8, 0xa8, 0xe3, 0x98, 0xdf, 0x80, 0x8d, 0xaa, 0x03, - 0xf4, 0x07, 0xb8, 0x76, 0xc3, 0xc2, 0x6e, 0xb0, 0x05, 0x7f, 0x02, 0x87, - 0x3b, 0xcf, 0x3d, 0x1d, 0xf1, 0xcc, 0xc7, 0xf0, 0x18, 0xe0, 0xb9, 0x3f, - 0xbf, 0xa4, 0x3b, 0x62, 0xe2, 0x1c, 0xc1, 0xe7, 0x3b, 0x2b, 0xa4, 0x6a, - 0xd5, 0x23, 0x6f, 0xe2, 0x3a, 0xe1, 0xb4, 0x66, 0x7d, 0x96, 0xa2, 0xaf, - 0x67, 0x20, 0xf1, 0x1e, 0x69, 0x46, 0xf2, 0x6a, 0x6c, 0xd9, 0x49, 0xd4, - 0x96, 0x13, 0x62, 0x5a, 0x12, 0x86, 0x74, 0xa5, 0x0b, 0x4d, 0xb9, 0xc3, - 0x3a, 0x21, 0xbd, 0xe4, 0xf7, 0x82, 0x10, 0x8b, 0xf6, 0xc2, 0xe5, 0x37, - 0xe8, 0x2a, 0xfc, 0x40, 0xc2, 0x47, 0x9a, 0x3e, 0xe3, 0x4e, 0x10, 0x57, - 0xd7, 0xa4, 0xaf, 0x9b, 0x53, 0x78, 0xbd, 0x44, 0xcb, 0x32, 0xc0, 0x29, - 0xad, 0xe3, 0xe1, 0xe8, 0xb8, 0x2a, 0x5f, 0xa9, 0x9b, 0x6c, 0x8a, 0xce, - 0xa5, 0x2c, 0xd3, 0x79, 0x93, 0xb9, 0x28, 0x27, 0x33, 0x2d, 0x9d, 0x6b, - 0xfd, 0xf2, 0x95, 0x55, 0xc5, 0x3c, 0xf1, 0x43, 0x2d, 0x09, 0x17, 0x47, - 0xf3, 0x02, 0x38, 0xfe, 0x9d, 0x04, 0x40, 0xb3, 0x25, 0x61, 0xe4, 0x63, - 0x1e, 0x2c, 0x0e, 0x91, 0x05, 0xcc, 0xb1, 0xfe, 0x5d, 0x40, 0xe8, 0x28, - 0x08, 0xfc, 0xa0, 0x0d, 0x20, 0xcc, 0xd4, 0xdd, 0x11, 0x5c, 0xaa, 0x48, - 0xe5, 0xb0, 0x98, 0x4c, 0x5d, 0x9a, 0x16, 0x74, 0x1e, 0xa7, 0xc8, 0xca, - 0x50, 0x74, 0x80, 0xc2, 0xa2, 0x8d, 0xfb, 0xb0, 0x69, 0x7d, 0xeb, 0xd2, - 0xd1, 0x4a, 0x1c, 0x06, 0x93, 0x2d, 0x7a, 0x7c, 0xf4, 0xfc, 0xdd, 0xdb, - 0xb7, 0x47, 0xcf, 0xdf, 0xab, 0xd7, 0xde, 0x12, 0xe2, 0x28, 0x40, 0xdb, - 0x4f, 0xa0, 0x90, 0xcd, 0x24, 0x42, 0x17, 0x97, 0xf1, 0xbc, 0xa1, 0xb1, - 0x0f, 0xc8, 0xf4, 0xc5, 0x3c, 0x33, 0x7a, 0xb6, 0x9a, 0x4d, 0x00, 0x5a, - 0x5b, 0xb8, 0xcd, 0x05, 0xdb, 0xcd, 0x71, 0x53, 0x35, 0x70, 0x1a, 0x84, - 0x60, 0x90, 0x04, 0xc6, 0x8d, 0x7a, 0xe0, 0xde, 0x21, 0x65, 0x47, 0x38, - 0x83, 0xf1, 0x22, 0xf1, 0x52, 0x44, 0xb5, 0x34, 0x31, 0x35, 0x26, 0x24, - 0xe9, 0xa9, 0x82, 0xf7, 0x46, 0xf2, 0x83, 0x18, 0x84, 0xe8, 0xb8, 0x24, - 0x71, 0x29, 0x3e, 0x56, 0x55, 0x99, 0x28, 0x22, 0x45, 0x36, 0x5d, 0xe4, - 0x18, 0x67, 0xaa, 0x2e, 0x51, 0x80, 0xbf, 0x8b, 0x00, 0xb8, 0x05, 0x00, - 0xc0, 0xdf, 0x9c, 0x02, 0xa4, 0xe6, 0x2a, 0x11, 0x29, 0x43, 0xbc, 0x01, - 0x87, 0xdb, 0xc5, 0xc8, 0xfe, 0x1e, 0x6a, 0x28, 0x92, 0x9c, 0x24, 0xd9, - 0x54, 0x86, 0x0c, 0x59, 0x1f, 0xe4, 0xaf, 0x64, 0xe6, 0xcc, 0x9c, 0xdd, - 0x02, 0xc0, 0xab, 0x31, 0x59, 0x0d, 0x34, 0x04, 0x58, 0x25, 0xc6, 0xd4, - 0x06, 0x30, 0xde, 0x43, 0x8c, 0x01, 0x0e, 0x29, 0x2c, 0x2f, 0x2f, 0xc2, - 0x0c, 0xc5, 0xf7, 0x26, 0xb1, 0xb6, 0x9d, 0x09, 0x31, 0xa7, 0x33, 0xe2, - 0x33, 0x18, 0x69, 0x94, 0xb3, 0x23, 0x2b, 0xf9, 0x76, 0x79, 0x18, 0x46, - 0x11, 0x7a, 0x8f, 0x23, 0x32, 0x0a, 0x67, 0x00, 0xcb, 0xbf, 0xff, 0x38, - 0xa5, 0xb6, 0x98, 0x70, 0x2c, 0xe6, 0x11, 0x22, 0x2f, 0x1a, 0x23, 0xb2, - 0x36, 0xca, 0x1a, 0xe3, 0xf5, 0x8a, 0x67, 0x38, 0xaf, 0x3e, 0x0d, 0xc0, - 0x47, 0x3d, 0x7e, 0x9d, 0x32, 0x24, 0x7e, 0x34, 0x9a, 0x88, 0x54, 0xa3, - 0xb0, 0xe3, 0x4a, 0x4d, 0x4c, 0xdf, 0xe9, 0x6e, 0x39, 0xa2, 0x86, 0x4c, - 0xf7, 0x55, 0x8e, 0xb1, 0x43, 0xf2, 0x4b, 0xfa, 0x4e, 0x66, 0x50, 0x98, - 0x19, 0xd2, 0x9f, 0xe1, 0x2b, 0x99, 0xcc, 0x93, 0x20, 0x92, 0x24, 0xbe, - 0x93, 0x19, 0xd4, 0x2c, 0xa7, 0x40, 0x06, 0x96, 0x89, 0x38, 0x02, 0x97, - 0x90, 0x90, 0x39, 0x56, 0xaf, 0xb2, 0x49, 0x42, 0x1e, 0x1d, 0xab, 0xcf, - 0x16, 0x77, 0x21, 0xec, 0xb2, 0xb2, 0x94, 0x27, 0x0b, 0xb6, 0x92, 0xc5, - 0xf4, 0x1e, 0x21, 0x8a, 0x1d, 0xaa, 0x9f, 0xc9, 0x6c, 0xbd, 0xff, 0xcf, - 0x1c, 0x6b, 0x3d, 0xb7, 0x74, 0x5a, 0x12, 0x32, 0xb1, 0x2f, 0x2c, 0xc1, - 0x4f, 0x38, 0x41, 0x8d, 0x31, 0x79, 0x60, 0xb3, 0x2f, 0x43, 0xc0, 0xea, - 0x67, 0x1e, 0xca, 0x6c, 0x60, 0x00, 0x8a, 0x7e, 0x5a, 0x27, 0x22, 0xc0, - 0xb8, 0x92, 0x81, 0x33, 0x6b, 0xfd, 0x04, 0x47, 0xc3, 0x0d, 0xff, 0xcc, - 0x42, 0x99, 0xe5, 0x6f, 0x8d, 0x8d, 0x7e, 0xe7, 0x08, 0xa7, 0x17, 0x8b, - 0x35, 0xe8, 0xb7, 0x6a, 0x25, 0x38, 0x0d, 0x6a, 0x56, 0x4a, 0xa9, 0xce, - 0xe8, 0x7d, 0x73, 0xeb, 0xf5, 0xd1, 0x37, 0x16, 0xa7, 0xa4, 0x20, 0xcd, - 0xda, 0x22, 0x00, 0xf1, 0x65, 0xbd, 0x23, 0xf7, 0x3f, 0x05, 0x12, 0xaf, - 0xe7, 0xc5, 0xa8, 0x5e, 0x7e, 0xfb, 0xea, 0x9d, 0x45, 0x09, 0x79, 0xb0, - 0x77, 0x73, 0x1e, 0xaf, 0x63, 0x50, 0xf5, 0x9c, 0x81, 0x34, 0x0b, 0x5d, - 0x44, 0x55, 0x5e, 0x70, 0x96, 0x05, 0x31, 0x0b, 0x4b, 0x80, 0x79, 0x01, - 0xc3, 0x40, 0x2f, 0xc4, 0x17, 0xf9, 0x7a, 0x9a, 0xa5, 0x1c, 0xd2, 0x77, - 0x5a, 0x9a, 0x41, 0x5f, 0x09, 0xd4, 0xeb, 0x04, 0xb3, 0xd0, 0x66, 0x05, - 0x85, 0x75, 0x61, 0x32, 0xa3, 0x5e, 0x7f, 0xe2, 0x7c, 0xc9, 0x52, 0x37, - 0x2b, 0x09, 0x46, 0x67, 0xf8, 0xd0, 0xec, 0x18, 0xbe, 0xae, 0xec, 0x8b, - 0xe9, 0x3a, 0xc5, 0xeb, 0x01, 0x80, 0xc7, 0xeb, 0x41, 0x33, 0x4d, 0x17, - 0xcf, 0xe4, 0x29, 0x57, 0x5c, 0xa4, 0x9b, 0x20, 0x9e, 0x82, 0x53, 0xbf, - 0x34, 0x87, 0xc0, 0xf3, 0x20, 0x91, 0x47, 0x10, 0x3c, 0xe0, 0x65, 0x88, - 0x9b, 0xe9, 0xaf, 0x66, 0x97, 0x8c, 0xab, 0x04, 0x4d, 0x41, 0x26, 0x77, - 0xae, 0x63, 0x50, 0x59, 0xde, 0x92, 0xfb, 0xb4, 0x29, 0x70, 0xb9, 0x77, - 0x4a, 0x56, 0x87, 0x7e, 0x64, 0x2c, 0x86, 0x60, 0x6a, 0x1f, 0xe8, 0x3b, - 0x99, 0x91, 0x8c, 0x6c, 0x20, 0x12, 0x78, 0xb4, 0xe2, 0xe7, 0x24, 0xa0, - 0x7a, 0x27, 0x3b, 0xf9, 0x2b, 0xd4, 0x3b, 0xd0, 0x5e, 0x9f, 0xc9, 0x32, - 0xd2, 0x73, 0x12, 0xcc, 0xcc, 0x7e, 0xc9, 0x1a, 0xc4, 0x47, 0x8c, 0x12, - 0xb6, 0xd8, 0x3a, 0x21, 0x10, 0x8b, 0x61, 0xac, 0xea, 0xef, 0x2a, 0xfb, - 0xbf, 0xab, 0xa0, 0xa2, 0x38, 0x27, 0x49, 0x43, 0x4c, 0xca, 0x15, 0x4a, - 0x4e, 0xda, 0xc8, 0xbb, 0x38, 0xa1, 0x72, 0x3a, 0x21, 0x03, 0xc8, 0x66, - 0x55, 0xe7, 0xc9, 0x84, 0x2c, 0x44, 0x7a, 0x94, 0xa4, 0xa4, 0xc4, 0x70, - 0x5f, 0x36, 0x3a, 0x1a, 0x14, 0x73, 0x39, 0xcb, 0xfa, 0xa9, 0xcf, 0xc6, - 0x26, 0x39, 0xe7, 0xaa, 0x48, 0xa0, 0x6b, 0x05, 0xec, 0xb9, 0xa5, 0x5e, - 0xe3, 0x5b, 0x81, 0xee, 0x8a, 0x84, 0x51, 0x78, 0xbf, 0x8e, 0x23, 0xba, - 0xe8, 0xc0, 0xf7, 0x30, 0x43, 0x59, 0xe2, 0x38, 0x7a, 0x0e, 0xac, 0x70, - 0x0c, 0x58, 0xe6, 0x3a, 0xfe, 0x0a, 0x00, 0x34, 0xa0, 0xfa, 0x73, 0xc0, - 0x2f, 0xce, 0x97, 0x39, 0x90, 0x3f, 0x87, 0xa3, 0x11, 0x23, 0x75, 0x08, - 0x29, 0x46, 0xee, 0xe4, 0x28, 0xdc, 0x5c, 0xee, 0x3c, 0x9e, 0x09, 0x0c, - 0x35, 0x13, 0x01, 0x39, 0x0f, 0xf0, 0x6b, 0xd4, 0xb4, 0x5e, 0x8a, 0x41, - 0xb0, 0x70, 0xce, 0x2c, 0x18, 0x93, 0x0c, 0x1b, 0xd6, 0x99, 0xe7, 0xcf, - 0x2d, 0x7f, 0x16, 0x3f, 0x43, 0x13, 0xb9, 0x5c, 0x20, 0xca, 0x1d, 0x4a, - 0xfe, 0x46, 0x73, 0x8c, 0xc4, 0x7d, 0x38, 0x3e, 0x19, 0x6f, 0xf2, 0x15, - 0x5d, 0x0e, 0xe6, 0xba, 0x78, 0x12, 0xde, 0xbd, 0xd2, 0x54, 0x23, 0x6a, - 0x72, 0x6c, 0x0d, 0x4d, 0x0b, 0x2c, 0x71, 0x26, 0x7f, 0xee, 0xda, 0x76, - 0xb0, 0xc4, 0x97, 0x7c, 0x41, 0x0b, 0xc1, 0x03, 0xe7, 0x0f, 0x92, 0x7b, - 0x2c, 0xbe, 0x79, 0xda, 0xa1, 0x14, 0xda, 0x9f, 0x54, 0x4d, 0xa5, 0x5b, - 0xe1, 0x1e, 0x6a, 0x28, 0x12, 0xcc, 0x94, 0x78, 0x93, 0xa8, 0x45, 0x38, - 0x9c, 0x2e, 0xce, 0x97, 0xba, 0x94, 0x87, 0xb8, 0xe6, 0x67, 0x81, 0x1e, - 0x80, 0x1a, 0x61, 0xb5, 0x61, 0x38, 0x05, 0x39, 0x21, 0x42, 0x5c, 0xa8, - 0x31, 0x21, 0xd6, 0x50, 0x05, 0xe8, 0x2d, 0x4f, 0x1c, 0x9b, 0x69, 0xaf, - 0xf1, 0x5c, 0x04, 0x67, 0x11, 0x6b, 0x75, 0xa1, 0xcf, 0x68, 0x74, 0x94, - 0x6e, 0x2a, 0x1a, 0xdb, 0x51, 0xe8, 0x0b, 0xc4, 0x0b, 0xfd, 0xe1, 0xcc, - 0xb8, 0x8c, 0x5f, 0x7c, 0x1b, 0xb4, 0xa5, 0xcf, 0x88, 0xab, 0xe2, 0xb4, - 0xd7, 0x98, 0xf7, 0x16, 0xb9, 0x49, 0xc4, 0xa2, 0xc8, 0x5b, 0xf4, 0xfd, - 0x12, 0x77, 0xd1, 0x2f, 0x71, 0x17, 0xed, 0xc5, 0x79, 0xa1, 0xbf, 0xe8, - 0x44, 0xe5, 0xde, 0xe2, 0x4b, 0x20, 0x25, 0x4f, 0x6f, 0x46, 0x9e, 0xde, - 0xd4, 0x9f, 0x80, 0xf7, 0x51, 0xb9, 0x8b, 0x98, 0x2d, 0xe0, 0xda, 0x5c, - 0xe0, 0x4e, 0x5c, 0xc3, 0xd9, 0xea, 0xae, 0x21, 0x69, 0xdf, 0x7b, 0xdb, - 0x76, 0x37, 0xe9, 0x19, 0x0a, 0x6f, 0x55, 0xc7, 0x70, 0x22, 0x95, 0x03, - 0xf2, 0xf1, 0x6c, 0x7b, 0xb6, 0x82, 0x7b, 0x78, 0x6e, 0x43, 0x35, 0xcf, - 0xfd, 0xe5, 0x0e, 0x22, 0x5c, 0x43, 0x16, 0xfb, 0xd7, 0x38, 0x7e, 0x2b, - 0xb8, 0x90, 0x59, 0xdf, 0xd0, 0xc7, 0xb3, 0xf8, 0x5f, 0x70, 0x0d, 0x49, - 0x67, 0xe6, 0x36, 0x3a, 0xbe, 0x6d, 0x9d, 0x51, 0x87, 0x13, 0x5e, 0xa9, - 0x6f, 0x78, 0xe8, 0x4e, 0xc4, 0x0c, 0x6a, 0xbe, 0xc4, 0x3d, 0x3c, 0x0b, - 0xcb, 0xfd, 0xc3, 0x43, 0xb4, 0xa6, 0x08, 0xe0, 0x21, 0x96, 0x3b, 0x88, - 0x3f, 0xc7, 0x40, 0x86, 0xc5, 0xd5, 0x25, 0x0e, 0xe2, 0x4b, 0x71, 0x86, - 0x69, 0x27, 0x06, 0x38, 0x02, 0xbd, 0xd9, 0x3d, 0xa4, 0xda, 0xb1, 0x1d, - 0xb1, 0xce, 0x1c, 0xf1, 0x65, 0x89, 0x87, 0x78, 0x26, 0xdc, 0x42, 0x0f, - 0xd1, 0x59, 0xea, 0x20, 0xea, 0x9f, 0x16, 0x7c, 0x55, 0xe1, 0x2d, 0xf1, - 0x10, 0xe9, 0xcb, 0x62, 0x37, 0x91, 0x06, 0xe5, 0x1b, 0x5d, 0x44, 0xf0, - 0x9e, 0xb0, 0xbc, 0x34, 0xc0, 0x2c, 0x5c, 0xe3, 0x1f, 0x4e, 0x04, 0x4c, - 0xbc, 0xa0, 0x25, 0xd7, 0xa5, 0x0e, 0x62, 0x6a, 0xd0, 0xf5, 0xe7, 0x20, - 0x64, 0x7b, 0x45, 0x7e, 0x62, 0x06, 0x0e, 0xd8, 0xc9, 0x7c, 0xe5, 0x40, - 0xf3, 0x43, 0xe1, 0x54, 0x44, 0x1a, 0x6f, 0x6e, 0xf4, 0x5b, 0xc9, 0x5d, - 0x94, 0x7a, 0x97, 0x71, 0x18, 0x47, 0xa2, 0xd4, 0x61, 0xfc, 0x46, 0x2c, - 0xa2, 0x70, 0x78, 0xcf, 0xcb, 0x8c, 0xe4, 0x2d, 0x2c, 0x6e, 0xf0, 0x16, - 0xb1, 0x9c, 0x8c, 0x66, 0xf4, 0xa2, 0x32, 0x3f, 0xf1, 0x83, 0x43, 0xae, - 0xad, 0x71, 0x3c, 0x6e, 0x70, 0x14, 0x3d, 0xe8, 0xb3, 0xc7, 0xe3, 0xf0, - 0xcc, 0x49, 0xba, 0x88, 0x09, 0xcf, 0xc5, 0xfa, 0x29, 0xc2, 0x47, 0x2d, - 0x11, 0x2e, 0x77, 0x1a, 0x67, 0xb6, 0xcb, 0x4b, 0xc4, 0x0b, 0xe0, 0x6a, - 0x5a, 0xcf, 0x84, 0xb7, 0x88, 0xbe, 0x08, 0xeb, 0xc3, 0xab, 0xa3, 0x6f, - 0x8e, 0x8e, 0xad, 0x5f, 0x1d, 0x1d, 0x3f, 0x7b, 0xf5, 0xf6, 0x9b, 0xa3, - 0xb7, 0x75, 0x6b, 0x31, 0x23, 0x54, 0x9e, 0x3f, 0x9c, 0x52, 0x89, 0x2f, - 0x0b, 0x6e, 0x3d, 0x67, 0xa9, 0xbf, 0xf8, 0x9a, 0x4c, 0x15, 0x1e, 0x9c, - 0xfb, 0x5a, 0x09, 0x54, 0xaa, 0x1b, 0xd3, 0x3a, 0x72, 0xa4, 0x5e, 0x2e, - 0x48, 0x2f, 0xef, 0x8b, 0xa8, 0x1a, 0x66, 0x8d, 0x6b, 0x0f, 0x69, 0xad, - 0xb4, 0xf8, 0xf8, 0x42, 0x04, 0x91, 0x33, 0x29, 0x5d, 0x7d, 0x64, 0x88, - 0xa9, 0x0b, 0x1d, 0x18, 0x08, 0x67, 0x66, 0xbd, 0x66, 0xa7, 0x91, 0x54, - 0xe2, 0x50, 0xaf, 0x42, 0x86, 0x0d, 0x12, 0x66, 0x1d, 0x1d, 0x09, 0x2f, - 0xb8, 0x96, 0x4d, 0x61, 0x1a, 0xef, 0x5e, 0xfc, 0x63, 0x91, 0x64, 0x6c, - 0xc9, 0x6a, 0xe4, 0x62, 0x99, 0xeb, 0xf8, 0x01, 0x6a, 0x8f, 0x91, 0x05, - 0x1b, 0x1c, 0x18, 0xfe, 0xa0, 0x10, 0xb8, 0x76, 0x72, 0xc1, 0xf3, 0x46, - 0xf0, 0x5c, 0x07, 0x5f, 0x58, 0x24, 0x8b, 0xce, 0x71, 0xd5, 0x02, 0xba, - 0xa9, 0x23, 0xc6, 0x30, 0x55, 0xf0, 0xbe, 0xc6, 0xa4, 0xbf, 0xcf, 0xb8, - 0x9e, 0x10, 0xc3, 0x99, 0x50, 0x08, 0xe8, 0x72, 0xbb, 0x3a, 0xbe, 0xc2, - 0x30, 0xe5, 0x65, 0xaa, 0x9e, 0xe0, 0xcc, 0xf2, 0x0e, 0xa6, 0x35, 0x5e, - 0x78, 0x67, 0x24, 0x3c, 0x07, 0xd2, 0xd7, 0x28, 0x3d, 0x31, 0x9d, 0x29, - 0x94, 0xb8, 0x92, 0x19, 0xbf, 0xec, 0xb3, 0x68, 0x01, 0xbd, 0xc1, 0xaf, - 0x67, 0xca, 0xeb, 0x3c, 0x47, 0xde, 0x97, 0xe6, 0xb3, 0x66, 0x7e, 0xb1, - 0x72, 0x24, 0x96, 0x2c, 0x57, 0xbe, 0xb0, 0x83, 0x81, 0x28, 0x72, 0x40, - 0xa3, 0x62, 0xff, 0xf3, 0x9f, 0x7f, 0x2f, 0xf3, 0x3f, 0x0b, 0xdd, 0x4f, - 0xe1, 0xfc, 0xf3, 0xcf, 0xe5, 0x0e, 0xe8, 0xe1, 0xd9, 0x17, 0x41, 0x3e, - 0x46, 0x80, 0xb5, 0x5c, 0xaa, 0x97, 0xf5, 0x96, 0x9d, 0x1c, 0x0f, 0xf4, - 0xfe, 0xf9, 0xb7, 0x7f, 0xfe, 0x59, 0x04, 0x65, 0xbe, 0xe8, 0xb2, 0xb2, - 0x67, 0x2e, 0x3d, 0x06, 0x77, 0xe0, 0x95, 0xae, 0xb6, 0x60, 0x39, 0x0f, - 0x6c, 0x28, 0x33, 0x28, 0x84, 0xe7, 0xff, 0xfc, 0xcb, 0x14, 0x4d, 0xb2, - 0x49, 0xcf, 0x74, 0xf1, 0xef, 0x5f, 0xb3, 0x3c, 0xf4, 0xbe, 0xd8, 0x53, - 0x77, 0xb9, 0xc7, 0x79, 0x2c, 0x1c, 0xf4, 0x9d, 0xb1, 0x0f, 0xe7, 0xea, - 0xf6, 0x1e, 0x6c, 0xf1, 0xd2, 0xa5, 0xf0, 0x12, 0xa2, 0xbf, 0x13, 0x5f, - 0xf5, 0x25, 0xb9, 0x1e, 0xe7, 0xcd, 0x55, 0xbc, 0xd5, 0x9f, 0xc3, 0x5b, - 0x6d, 0xae, 0xe4, 0xa8, 0xbe, 0x64, 0x8d, 0x5e, 0xea, 0xab, 0xbe, 0x8a, - 0xd7, 0x2f, 0xa9, 0x53, 0xa6, 0xea, 0xb5, 0x74, 0x29, 0xd3, 0xbe, 0xdd, - 0x52, 0xe6, 0x4f, 0x79, 0xbd, 0x74, 0xb2, 0x64, 0x29, 0xf3, 0x3d, 0xde, - 0xa2, 0x70, 0x83, 0xa3, 0xca, 0xfc, 0xc1, 0x40, 0x31, 0xe8, 0x32, 0x57, - 0x95, 0xaa, 0x74, 0x6e, 0x03, 0xf6, 0x72, 0x9e, 0xa9, 0x57, 0xde, 0x55, - 0xfd, 0x79, 0x20, 0x9c, 0xb0, 0xc8, 0x53, 0x3d, 0xb6, 0x47, 0xab, 0x38, - 0xaa, 0xb6, 0xf7, 0x05, 0x61, 0x19, 0x2b, 0xf8, 0xaa, 0xb0, 0xb3, 0x9f, - 0x9d, 0xa5, 0xce, 0xea, 0xb9, 0x70, 0x22, 0x00, 0xdc, 0xb0, 0x98, 0xa9, - 0x5d, 0xa5, 0x65, 0xae, 0x6a, 0x66, 0xac, 0xc7, 0x51, 0x62, 0x07, 0x66, - 0x23, 0x28, 0xf4, 0x56, 0x53, 0xa0, 0xc0, 0xae, 0x81, 0xa3, 0x07, 0x59, - 0xe8, 0xc2, 0x91, 0xf8, 0x44, 0x81, 0xf3, 0x68, 0x9c, 0xa6, 0x5b, 0x36, - 0x16, 0xaf, 0xb0, 0xf4, 0x89, 0x55, 0x91, 0x9f, 0xea, 0xa5, 0x4f, 0xf9, - 0xda, 0x0d, 0x84, 0x0f, 0xc8, 0x7d, 0x74, 0x13, 0xcc, 0x6c, 0x76, 0xd2, - 0x5f, 0x1e, 0x3f, 0x43, 0x49, 0x7c, 0x6a, 0xb4, 0x2f, 0x9f, 0x1d, 0x23, - 0x01, 0x9f, 0x3a, 0x01, 0x6d, 0x20, 0x5b, 0x22, 0x4e, 0x78, 0xf6, 0x12, - 0x09, 0xf8, 0xd4, 0x09, 0xcf, 0x8e, 0x29, 0x01, 0x9f, 0x71, 0xc2, 0x4b, - 0xc2, 0x81, 0x4f, 0x9d, 0xf0, 0x41, 0x92, 0xa1, 0xaf, 0x38, 0x49, 0x12, - 0xa2, 0xaf, 0x38, 0x49, 0x92, 0xa2, 0xaf, 0x38, 0x49, 0x12, 0xa3, 0xaf, - 0x38, 0x49, 0x92, 0xc3, 0x97, 0x49, 0x92, 0x04, 0xe9, 0x2b, 0xae, 0xc6, - 0x07, 0xa6, 0x48, 0x5f, 0x26, 0x49, 0x56, 0xed, 0x43, 0xa2, 0x6e, 0x1f, - 0x98, 0x22, 0x7d, 0xc5, 0xbc, 0x7f, 0x60, 0xf4, 0xf4, 0x65, 0x92, 0x64, - 0x7d, 0x3e, 0x24, 0xd0, 0x1f, 0x7f, 0xa0, 0x82, 0xf4, 0x65, 0x04, 0xf7, - 0x81, 0xa0, 0xe8, 0xcb, 0x88, 0x8e, 0xa1, 0xe8, 0xcb, 0x08, 0xef, 0x83, - 0x94, 0xde, 0x87, 0x84, 0xf8, 0x38, 0x89, 0xbe, 0x8c, 0x00, 0x19, 0x17, - 0x7d, 0x19, 0x8a, 0xdc, 0x23, 0xe8, 0x2b, 0x47, 0xb1, 0x18, 0xca, 0x34, - 0x17, 0x25, 0xd1, 0x97, 0xa1, 0xc8, 0x49, 0xf8, 0x2a, 0x4c, 0x4a, 0xeb, - 0x8c, 0x89, 0x8b, 0x36, 0x5a, 0xd3, 0xea, 0xe1, 0xa3, 0xf2, 0xf6, 0xdd, - 0xf1, 0x9b, 0xc3, 0xd7, 0x1a, 0x43, 0xbb, 0xb3, 0x47, 0x64, 0x8e, 0xe0, - 0xdb, 0x9f, 0x1c, 0x65, 0x71, 0x98, 0x38, 0x65, 0x85, 0x44, 0x62, 0x21, - 0x1c, 0x6f, 0x8f, 0x62, 0x0c, 0xbb, 0x48, 0x20, 0x13, 0x7f, 0xfa, 0xeb, - 0x17, 0x87, 0x27, 0xef, 0x75, 0x72, 0xb7, 0xa3, 0x93, 0x93, 0xa9, 0xdb, - 0x7b, 0x3a, 0xf5, 0xcd, 0xd1, 0x37, 0xaf, 0x7e, 0xf9, 0x46, 0xa7, 0xef, - 0x6e, 0xeb, 0xf4, 0x93, 0xd7, 0xef, 0xe2, 0xea, 0xed, 0xb5, 0x62, 0xd4, - 0xc9, 0xe4, 0x27, 0x86, 0x62, 0x32, 0xbd, 0xdd, 0x8e, 0x49, 0xbe, 0x7c, - 0x7d, 0xf8, 0xfc, 0xd5, 0xe1, 0xeb, 0xb8, 0x3e, 0xa6, 0x46, 0x26, 0x86, - 0x59, 0x56, 0xc9, 0xd4, 0xc8, 0xe2, 0xd1, 0x27, 0x26, 0x8d, 0x34, 0x4e, - 0xc8, 0xca, 0xc4, 0xc4, 0x13, 0xa7, 0x11, 0x60, 0x48, 0x02, 0xf3, 0x90, - 0x6c, 0x2c, 0xda, 0x8e, 0x4c, 0xcd, 0x56, 0x75, 0x5b, 0x27, 0xbf, 0x3e, - 0x3c, 0x7e, 0x79, 0x14, 0x0b, 0x40, 0xa7, 0xfe, 0x5a, 0x26, 0x1b, 0xce, - 0x29, 0x2c, 0xe8, 0x01, 0xc5, 0xd5, 0x98, 0x09, 0x22, 0xdd, 0x83, 0x18, - 0x87, 0x38, 0x54, 0x1b, 0x8e, 0x33, 0x16, 0xcd, 0x19, 0x76, 0x58, 0xfe, - 0x10, 0xd6, 0x18, 0xb0, 0x20, 0x12, 0x0e, 0xb6, 0x7b, 0x44, 0xa1, 0x63, - 0x5b, 0xc5, 0x48, 0x12, 0x71, 0x3b, 0xc7, 0x09, 0x00, 0xb8, 0x6b, 0x27, - 0x9c, 0xdf, 0x87, 0xe3, 0xcc, 0x0b, 0x47, 0xd5, 0xda, 0x55, 0x85, 0x76, - 0xf4, 0x69, 0x1e, 0x81, 0x00, 0x98, 0x7d, 0x2a, 0x21, 0x4c, 0x6e, 0x54, - 0xf7, 0x6a, 0x57, 0x81, 0x88, 0x16, 0x81, 0x57, 0x15, 0xfd, 0x77, 0x03, - 0xb2, 0x73, 0x4d, 0xcc, 0x2c, 0x60, 0xe4, 0x22, 0x9f, 0x02, 0xde, 0xde, - 0x8d, 0xff, 0xf4, 0xa7, 0xab, 0xd3, 0xd3, 0x39, 0x3d, 0x9f, 0x9e, 0xf6, - 0x3e, 0x7e, 0xba, 0x26, 0x0b, 0x4a, 0x97, 0x54, 0x63, 0x31, 0xf7, 0x90, - 0xee, 0x26, 0x7d, 0xf4, 0x28, 0xc6, 0x26, 0xea, 0x51, 0xed, 0x4a, 0x34, - 0x63, 0xf0, 0x7e, 0x74, 0xfd, 0xa7, 0x3f, 0xa5, 0x73, 0xc7, 0xb8, 0x43, - 0x8d, 0x78, 0xf0, 0xf8, 0x3e, 0xfb, 0x5a, 0xd4, 0x9c, 0xda, 0xe1, 0xbb, - 0x73, 0x0f, 0xf4, 0xe6, 0x30, 0xe9, 0x97, 0x55, 0xaf, 0xf6, 0xe8, 0x51, - 0x55, 0x7c, 0xf4, 0x3e, 0xf5, 0x23, 0x7c, 0xd4, 0xae, 0x6b, 0xcc, 0xe2, - 0xf5, 0xbe, 0xc2, 0x82, 0x32, 0x92, 0xe7, 0xf8, 0xd9, 0x47, 0x0d, 0xe5, - 0x1d, 0x0c, 0xbe, 0x87, 0x4a, 0x2e, 0xd0, 0xdc, 0x01, 0xe8, 0x0a, 0x06, - 0xab, 0x47, 0x4d, 0x66, 0x45, 0xdd, 0x58, 0x8e, 0x3b, 0x52, 0xfb, 0x7d, - 0xef, 0xc7, 0xaa, 0x9a, 0x43, 0x76, 0xbd, 0x41, 0xb1, 0x57, 0xf5, 0x93, - 0x60, 0xe6, 0x77, 0x1d, 0x77, 0xef, 0x59, 0x7e, 0xed, 0x9a, 0x19, 0x36, - 0x42, 0xd3, 0x12, 0xb3, 0x92, 0x55, 0x53, 0x5c, 0xa8, 0xe0, 0xc4, 0xa8, - 0xce, 0x4f, 0x8c, 0x50, 0x5c, 0x5f, 0x57, 0x6b, 0x75, 0xbf, 0x6f, 0xa0, - 0x13, 0xec, 0xab, 0x26, 0x20, 0x0a, 0x7e, 0x5f, 0x34, 0x87, 0x78, 0x75, - 0x62, 0x95, 0x8a, 0xd6, 0x2b, 0x3c, 0x7b, 0xab, 0x20, 0xf3, 0x4f, 0x7f, - 0xa2, 0x84, 0x7d, 0x45, 0xd3, 0x6f, 0xaa, 0xf5, 0xe1, 0x7e, 0xa4, 0x7f, - 0xd5, 0xfd, 0x26, 0x03, 0x83, 0xaa, 0x7f, 0xad, 0xc0, 0xa2, 0xaa, 0x57, - 0x17, 0xb5, 0xba, 0x77, 0x8d, 0xfa, 0xd5, 0x83, 0x25, 0xb4, 0xeb, 0x3e, - 0xa8, 0xfb, 0x08, 0xaa, 0x6d, 0x41, 0x36, 0x11, 0x84, 0x1f, 0xf5, 0xdb, - 0xa2, 0x5b, 0xab, 0xc7, 0x69, 0x1e, 0xd2, 0x10, 0xba, 0x58, 0xa9, 0xb1, - 0xee, 0x04, 0x69, 0x26, 0x87, 0xae, 0x1f, 0x62, 0xc6, 0xe4, 0x67, 0x98, - 0x0c, 0x9a, 0x98, 0x12, 0x3e, 0xc7, 0x86, 0xa2, 0xd7, 0x7f, 0xd0, 0xaa, - 0x07, 0x68, 0x9b, 0x11, 0xf8, 0xc5, 0x0f, 0x88, 0x3c, 0xf4, 0xbd, 0xbe, - 0x57, 0x0f, 0x0a, 0x19, 0x75, 0x92, 0x42, 0x76, 0xc6, 0x55, 0xb8, 0xf4, - 0x1c, 0x57, 0x87, 0xdd, 0xcc, 0x07, 0x7d, 0x08, 0x93, 0x94, 0x2e, 0xd6, - 0xf1, 0x9a, 0xc4, 0x60, 0x12, 0xae, 0xeb, 0x61, 0xff, 0x0a, 0x87, 0x71, - 0x54, 0x8f, 0x60, 0x3c, 0xdf, 0x08, 0xf2, 0x87, 0xda, 0x62, 0xbb, 0x8e, - 0x0e, 0x57, 0x94, 0xd1, 0xfd, 0xe1, 0xb6, 0xe8, 0xfe, 0xe0, 0x8d, 0x1d, - 0x4d, 0x9b, 0x98, 0x9e, 0x8e, 0xfc, 0x59, 0xb5, 0x46, 0xa0, 0xbf, 0x9c, - 0x53, 0x30, 0x57, 0x6f, 0x47, 0x74, 0xeb, 0x41, 0xb6, 0xd4, 0x4b, 0xcc, - 0x32, 0x5f, 0xd8, 0xa4, 0x68, 0xbd, 0x76, 0xb3, 0x5b, 0x37, 0xb9, 0xef, - 0x51, 0x04, 0x6b, 0x65, 0xbd, 0x6d, 0x94, 0x62, 0x3e, 0xa2, 0x80, 0xd6, - 0x8c, 0xdb, 0x5b, 0xad, 0xfa, 0x48, 0x0c, 0x16, 0x93, 0xde, 0x83, 0xf6, - 0xf5, 0x7e, 0x56, 0x77, 0x12, 0x0d, 0x22, 0xa0, 0x48, 0xac, 0x0e, 0x19, - 0xe1, 0x5f, 0x5d, 0x4b, 0xe1, 0xfb, 0x7d, 0x16, 0x32, 0xab, 0xd6, 0xa9, - 0xeb, 0x90, 0x43, 0x2a, 0x02, 0xd4, 0x99, 0x5b, 0x1f, 0x7d, 0xb3, 0xae, - 0x14, 0x82, 0x7e, 0x52, 0xcc, 0x2a, 0x7d, 0x73, 0x0b, 0x51, 0xbf, 0xad, - 0xcb, 0x62, 0x20, 0x1f, 0x5c, 0xf2, 0xc4, 0x05, 0x91, 0x9e, 0x2a, 0x2d, - 0x9c, 0x52, 0xf0, 0x5b, 0x2c, 0x1d, 0xb4, 0x99, 0xca, 0x50, 0x09, 0xaf, - 0x21, 0xde, 0xfe, 0x03, 0x0d, 0x3d, 0xc0, 0x12, 0x5e, 0x70, 0xf9, 0x5e, - 0x46, 0xc3, 0xba, 0xfe, 0xa0, 0xa2, 0xd2, 0x99, 0xd2, 0x73, 0xe8, 0x86, - 0x18, 0x19, 0x60, 0xc5, 0xd1, 0x2f, 0x16, 0x02, 0xb1, 0xeb, 0x1f, 0x3f, - 0xc9, 0x54, 0xdf, 0x63, 0xd8, 0xbe, 0xac, 0xa6, 0x4e, 0xe3, 0x5a, 0x64, - 0xd2, 0x54, 0xf1, 0x4c, 0x2a, 0xd5, 0x2d, 0x95, 0x74, 0x3a, 0x45, 0xd3, - 0xb9, 0xe2, 0x1d, 0xd2, 0x53, 0xaa, 0xee, 0x37, 0x4f, 0x59, 0xf0, 0xd5, - 0x0a, 0x15, 0xb1, 0xf8, 0xf2, 0x46, 0xa5, 0xc8, 0x51, 0x1f, 0x99, 0xbe, - 0x9c, 0x45, 0x35, 0xe3, 0x06, 0xaf, 0x03, 0x6f, 0xdc, 0x19, 0x7e, 0x9c, - 0xc8, 0xe8, 0x45, 0xfb, 0x43, 0xe8, 0x73, 0xa0, 0x9a, 0xb8, 0xea, 0xc7, - 0xc2, 0x51, 0x29, 0xb5, 0x3a, 0x92, 0x16, 0x0c, 0xab, 0x52, 0xfa, 0xb0, - 0xa3, 0x1a, 0x3c, 0x6f, 0x3b, 0x00, 0x8d, 0xcb, 0x9f, 0x31, 0x6b, 0x07, - 0xd3, 0x48, 0xbe, 0xae, 0x7b, 0x8c, 0xe1, 0x3c, 0x6c, 0x26, 0xe4, 0x8b, - 0x04, 0xf3, 0x84, 0xec, 0x94, 0x38, 0x9b, 0xb0, 0xa5, 0x47, 0x98, 0x6e, - 0x1b, 0xe4, 0x22, 0xc6, 0x2e, 0x31, 0x85, 0xb8, 0x96, 0x10, 0x89, 0xd7, - 0xc0, 0x9c, 0x6f, 0x09, 0x5f, 0x09, 0xf2, 0xd1, 0x23, 0xf5, 0x8b, 0xca, - 0x23, 0xd5, 0x28, 0x56, 0x93, 0x12, 0xf3, 0x54, 0xa2, 0x24, 0x15, 0xb2, - 0x05, 0x47, 0x24, 0xd6, 0xd7, 0xaa, 0x14, 0xa9, 0x30, 0x28, 0x5e, 0xa7, - 0x1a, 0x46, 0x2d, 0x1e, 0x94, 0xb4, 0x8d, 0xe2, 0x4c, 0x37, 0x0f, 0x73, - 0xa6, 0xd2, 0xc0, 0x9c, 0x79, 0xc8, 0xf1, 0xa7, 0xd2, 0xef, 0x84, 0x45, - 0x9e, 0x3b, 0x94, 0x30, 0xc8, 0x9a, 0xa9, 0xd8, 0xab, 0x0b, 0x45, 0x56, - 0x32, 0x63, 0xd6, 0x89, 0xab, 0x4a, 0x21, 0x2b, 0xef, 0x5f, 0xbd, 0x39, - 0x7a, 0xf7, 0xcb, 0xf7, 0x15, 0xa8, 0x50, 0x0c, 0xfb, 0xe3, 0x4a, 0x24, - 0x35, 0xa1, 0xd2, 0x93, 0x60, 0xb2, 0x96, 0x8c, 0xf8, 0xd1, 0xa3, 0xf8, - 0x27, 0xd7, 0xd0, 0x90, 0xbd, 0x10, 0x43, 0x4b, 0xd2, 0x8e, 0xeb, 0x5c, - 0xc9, 0x88, 0x80, 0xb3, 0x6f, 0x29, 0x00, 0xc2, 0xa4, 0x99, 0xcf, 0x48, - 0xe3, 0x39, 0xfa, 0x67, 0x59, 0x73, 0x51, 0xdf, 0x4d, 0x36, 0xd6, 0x69, - 0xb2, 0x63, 0x84, 0x34, 0xd4, 0xe5, 0x2c, 0x0a, 0xaa, 0x68, 0x48, 0xc9, - 0xaa, 0x33, 0x16, 0xa4, 0xab, 0x9f, 0xf9, 0xc6, 0xa5, 0xd4, 0xaf, 0x6d, - 0xda, 0x45, 0xe0, 0xf6, 0x85, 0xfa, 0xcd, 0xa3, 0x3a, 0xa6, 0xec, 0xa1, - 0x1a, 0x9c, 0xe3, 0xde, 0xdf, 0xf7, 0xd4, 0xb3, 0x91, 0x85, 0xa2, 0xa0, - 0x1c, 0x05, 0x39, 0x04, 0x69, 0x17, 0x05, 0x24, 0x2a, 0x2a, 0xa0, 0xf7, - 0xd5, 0x5b, 0xcc, 0x25, 0xae, 0x30, 0xde, 0xf7, 0xf2, 0xfd, 0xbb, 0x75, - 0x5d, 0xc7, 0x6a, 0x3c, 0x16, 0xe1, 0x68, 0xa2, 0xdd, 0x83, 0x45, 0x05, - 0xf6, 0xb1, 0x33, 0x59, 0xe8, 0x67, 0x88, 0xbf, 0x14, 0xfd, 0xbb, 0x6f, - 0x8f, 0xde, 0x96, 0x22, 0x6e, 0x7f, 0x05, 0xe2, 0xe7, 0xaf, 0xdf, 0x9d, - 0x2c, 0x63, 0xba, 0xf3, 0x95, 0xb8, 0x8f, 0xbe, 0x29, 0x45, 0xdd, 0xbd, - 0x35, 0xea, 0xd8, 0x1f, 0x5b, 0x4d, 0xf0, 0xa2, 0x69, 0x80, 0xee, 0x84, - 0x26, 0xb5, 0xc6, 0x12, 0x6a, 0x94, 0x7d, 0x27, 0x74, 0x54, 0xe3, 0x2c, - 0x21, 0x45, 0x10, 0x77, 0x55, 0x2b, 0xd9, 0x5c, 0x4b, 0x88, 0x49, 0x80, - 0x3b, 0xa1, 0x65, 0xc6, 0xb0, 0x52, 0x7a, 0xb2, 0x07, 0x9e, 0x87, 0x3f, - 0xa6, 0x1f, 0x99, 0x61, 0xb0, 0x97, 0xf5, 0x3b, 0xe0, 0xe8, 0x31, 0x12, - 0x63, 0x9d, 0xb2, 0x10, 0xe8, 0xf5, 0x1a, 0x11, 0xb9, 0xb4, 0x06, 0xa7, - 0x01, 0xa8, 0xdd, 0x49, 0xd5, 0x8c, 0x3b, 0x55, 0x5a, 0x35, 0xf6, 0x2d, - 0xe1, 0x0e, 0x56, 0xb3, 0x0e, 0x58, 0xbd, 0x75, 0x37, 0x3c, 0x0c, 0x16, - 0xe3, 0xb1, 0xc0, 0x56, 0xc5, 0xe1, 0x6c, 0x29, 0x1f, 0x79, 0x87, 0xac, - 0x89, 0x42, 0x8b, 0xa1, 0xa8, 0x26, 0xe7, 0x31, 0x1a, 0xbc, 0x22, 0x77, - 0x9e, 0x2a, 0x7d, 0xed, 0x77, 0x47, 0x3f, 0x16, 0x3f, 0xc4, 0x9c, 0x03, - 0x0b, 0x95, 0x13, 0x9c, 0xaf, 0x8b, 0xac, 0xc4, 0x3c, 0xf0, 0x19, 0xbc, - 0x40, 0x99, 0xcb, 0x77, 0xd9, 0xf0, 0xaf, 0xc1, 0x65, 0x24, 0x5e, 0x33, - 0x6c, 0x5d, 0x5c, 0xa3, 0xa6, 0x3f, 0xac, 0xe6, 0x9b, 0x38, 0xcd, 0x78, - 0xef, 0x8e, 0xc4, 0x21, 0x2e, 0x30, 0x14, 0x84, 0x64, 0xd9, 0xd7, 0xd0, - 0x36, 0x53, 0xa8, 0x57, 0xa9, 0xdc, 0x09, 0x1b, 0x7a, 0xbc, 0x59, 0x83, - 0x09, 0x5d, 0xe4, 0xae, 0x58, 0x08, 0x68, 0xef, 0xf2, 0x04, 0x6f, 0x5c, - 0x5e, 0xa7, 0xdf, 0x99, 0x42, 0xbd, 0x3b, 0x37, 0xa5, 0x8b, 0x60, 0x1d, - 0x71, 0x2c, 0x82, 0xd5, 0x24, 0x91, 0x20, 0xd1, 0x94, 0x13, 0x8b, 0x94, - 0x42, 0x9b, 0xd9, 0x94, 0xa0, 0xb5, 0x05, 0x9e, 0xde, 0x16, 0x4d, 0x59, - 0x5a, 0xc5, 0xb3, 0x21, 0x3d, 0x97, 0xc9, 0xfb, 0x39, 0xcb, 0x64, 0x87, - 0x83, 0x74, 0x94, 0xaa, 0xac, 0xa8, 0x81, 0x60, 0x8a, 0xcc, 0x16, 0x5b, - 0xb5, 0xb4, 0x53, 0xd5, 0xc3, 0x4b, 0x47, 0x18, 0x85, 0xc5, 0x8f, 0xa3, - 0x4a, 0x11, 0x10, 0x0e, 0x25, 0xfc, 0x91, 0x3a, 0xef, 0x88, 0x0e, 0x80, - 0x63, 0xb3, 0x2e, 0xee, 0x88, 0x95, 0xda, 0x75, 0x4a, 0x14, 0xf1, 0xbc, - 0x35, 0x23, 0x8e, 0xe5, 0x73, 0xbe, 0xfc, 0x34, 0x2e, 0x3f, 0x6b, 0x34, - 0xa6, 0xf5, 0xe6, 0x9a, 0xab, 0x6e, 0x6f, 0xfc, 0x64, 0x66, 0x22, 0xeb, - 0x71, 0xc9, 0x8a, 0x9a, 0x84, 0x74, 0x55, 0x78, 0x22, 0x93, 0xf2, 0x46, - 0x97, 0x72, 0xd0, 0x97, 0x1c, 0xf0, 0xc8, 0xcc, 0xf4, 0x8d, 0x04, 0x09, - 0x11, 0x5c, 0x78, 0x45, 0xdf, 0xcc, 0x91, 0xc0, 0x40, 0x1a, 0x50, 0x09, - 0x59, 0xc2, 0xe6, 0x0d, 0xe7, 0x7c, 0x11, 0x4e, 0x51, 0x2a, 0xc3, 0x26, - 0x0e, 0xfc, 0xa5, 0xbc, 0xd1, 0x8c, 0xe0, 0x33, 0xf3, 0xf6, 0x8f, 0xe2, - 0xd3, 0xa3, 0x47, 0xf9, 0x34, 0x89, 0x3b, 0xca, 0x35, 0x26, 0xbd, 0x8d, - 0x60, 0x5d, 0xec, 0xd5, 0x7c, 0x62, 0xbf, 0x80, 0x22, 0xde, 0x1e, 0x84, - 0x8d, 0x9d, 0xa2, 0x79, 0x24, 0xb7, 0xe6, 0x75, 0xa6, 0x9e, 0x4a, 0x48, - 0x86, 0xbe, 0x59, 0xd6, 0x93, 0x73, 0xfc, 0x7e, 0x6b, 0x3f, 0x7a, 0x8a, - 0x85, 0x30, 0x3e, 0x8a, 0x19, 0xaa, 0x21, 0x63, 0x3f, 0xfa, 0xe1, 0x0f, - 0x6b, 0xe2, 0x63, 0xf4, 0xa9, 0x1f, 0xe7, 0xe0, 0x61, 0x3f, 0xe5, 0x8a, - 0x37, 0x19, 0xf1, 0xa3, 0x47, 0x89, 0x03, 0xa4, 0x74, 0xfe, 0xd4, 0xbd, - 0xac, 0xaa, 0x94, 0xfa, 0x47, 0x6c, 0x23, 0x9c, 0x1c, 0x54, 0x3e, 0xd1, - 0x72, 0xdf, 0xd0, 0x8e, 0xf2, 0x6d, 0x70, 0x0a, 0xeb, 0xf2, 0x16, 0xd6, - 0x9c, 0x57, 0x6a, 0x92, 0x2c, 0x4a, 0xf6, 0x52, 0xe4, 0xc0, 0xa9, 0x68, - 0x2e, 0x59, 0xde, 0xc9, 0xae, 0x06, 0x2c, 0x5b, 0x09, 0xc2, 0xda, 0x1b, - 0x90, 0x15, 0x2d, 0x32, 0xd5, 0x03, 0x83, 0xc5, 0x07, 0x96, 0xc2, 0x85, - 0x28, 0xbf, 0xee, 0x50, 0x71, 0xfb, 0x22, 0x5f, 0x7c, 0x68, 0x8a, 0x3b, - 0x28, 0x5e, 0xb8, 0xc0, 0xe5, 0xd4, 0x17, 0xfd, 0x40, 0x2f, 0x2d, 0x65, - 0xbb, 0xec, 0x41, 0x0b, 0x9a, 0x80, 0x7c, 0xb9, 0xca, 0x35, 0xf7, 0xcf, - 0xab, 0x5e, 0xae, 0x5b, 0x37, 0xda, 0xb5, 0xda, 0xc1, 0x90, 0xe1, 0x86, - 0xb5, 0x7a, 0xaa, 0x2b, 0x78, 0x90, 0x26, 0x36, 0xcf, 0x38, 0x4a, 0x60, - 0x51, 0xab, 0x2f, 0x32, 0xf2, 0x3e, 0xb7, 0x9d, 0xa8, 0x58, 0xce, 0x9a, - 0x1f, 0x5a, 0x45, 0xc5, 0x78, 0x80, 0xf0, 0x62, 0x91, 0x9a, 0xc7, 0x25, - 0xd6, 0x47, 0xa2, 0x7a, 0xa6, 0xe5, 0xaa, 0x68, 0xd7, 0x92, 0x96, 0xfd, - 0x65, 0xe0, 0x26, 0x54, 0x9f, 0xd7, 0x09, 0x73, 0xce, 0x8a, 0x50, 0x8b, - 0x83, 0x8a, 0x2e, 0xb5, 0x32, 0xd4, 0xe7, 0x33, 0xcd, 0x32, 0xf7, 0x09, - 0x5e, 0x97, 0x4f, 0x94, 0x90, 0x9c, 0x43, 0x23, 0xaa, 0x0c, 0x92, 0xf7, - 0x7f, 0xca, 0x50, 0x46, 0x0c, 0x1f, 0x35, 0x23, 0xec, 0x1c, 0x6a, 0x98, - 0xe8, 0x3a, 0x9a, 0xd2, 0x2d, 0x22, 0x47, 0x3c, 0xab, 0xc7, 0x6e, 0xf6, - 0x67, 0x9b, 0x2e, 0x2e, 0xf8, 0xe5, 0xf1, 0xeb, 0x8c, 0x95, 0xd6, 0x26, - 0xaf, 0x44, 0x84, 0x84, 0xf9, 0x41, 0x6e, 0x2d, 0xee, 0xd1, 0xa3, 0x42, - 0x1b, 0x5e, 0xbb, 0x2a, 0x58, 0xb5, 0x6b, 0xc9, 0xd5, 0xae, 0x8c, 0xe2, - 0x7b, 0xf0, 0xd0, 0xcc, 0x0a, 0x25, 0x54, 0xd7, 0xac, 0x38, 0xfe, 0x38, - 0x4c, 0xe4, 0xf4, 0xb0, 0x52, 0x0b, 0xd0, 0xdc, 0x12, 0x67, 0x52, 0x29, - 0x03, 0x94, 0xc8, 0xaf, 0x81, 0x06, 0xf5, 0x05, 0x0a, 0xc6, 0x6b, 0xb3, - 0x75, 0xdb, 0x14, 0x58, 0xfc, 0xd8, 0xa9, 0xd6, 0x7a, 0x0b, 0xaa, 0x5b, - 0x4e, 0x55, 0xfb, 0x7e, 0x2d, 0xa5, 0x7c, 0x60, 0xc5, 0x0a, 0x24, 0x2f, - 0xf8, 0xa6, 0xe0, 0x12, 0xd8, 0xef, 0x9c, 0x23, 0x5d, 0x39, 0xe8, 0xd3, - 0x22, 0xf4, 0x3e, 0x5e, 0x67, 0x2b, 0xae, 0x0a, 0xd0, 0xfe, 0xf0, 0x87, - 0x69, 0x95, 0x56, 0xec, 0xe6, 0x31, 0x69, 0xd5, 0x97, 0xe6, 0x56, 0x5b, - 0x5a, 0x1a, 0xec, 0x63, 0x95, 0x89, 0x57, 0xa2, 0xab, 0xd3, 0xbe, 0x8d, - 0x75, 0xef, 0x0e, 0x4c, 0xe4, 0x54, 0x4f, 0xcd, 0x6a, 0xa9, 0x66, 0x7f, - 0xeb, 0x5b, 0xb2, 0xdd, 0x63, 0x31, 0xc8, 0xb3, 0xff, 0xb4, 0xa3, 0xfc, - 0xd9, 0x41, 0xc0, 0x96, 0x5a, 0x8b, 0x9c, 0xb2, 0x15, 0x94, 0x5d, 0xa9, - 0x5a, 0x63, 0x45, 0x2a, 0x58, 0x31, 0x4c, 0xf5, 0x80, 0xaa, 0xe0, 0xd5, - 0x8d, 0xda, 0x75, 0x16, 0x9c, 0x76, 0x60, 0x52, 0x83, 0xf8, 0x8f, 0x45, - 0x76, 0x1d, 0xb7, 0x87, 0xc2, 0x39, 0x49, 0x5c, 0x01, 0x1b, 0x8c, 0x58, - 0xbc, 0x4a, 0xd2, 0x03, 0x4c, 0xfc, 0x40, 0x4e, 0x16, 0x8d, 0x96, 0xfd, - 0x64, 0xe2, 0x8f, 0xa9, 0x5f, 0xdb, 0xdc, 0x75, 0x4d, 0x62, 0xad, 0xa7, - 0x52, 0x51, 0x22, 0x37, 0xe5, 0x4a, 0xad, 0x66, 0xe6, 0xd8, 0xa2, 0x14, - 0x8c, 0xa0, 0x49, 0xa1, 0x1b, 0x98, 0x95, 0xd6, 0x54, 0x85, 0x5e, 0xbe, - 0xd2, 0x20, 0xe8, 0x6b, 0x43, 0x36, 0x24, 0xd7, 0xc9, 0x4e, 0x97, 0x01, - 0x4b, 0x75, 0xbd, 0xa4, 0x9a, 0xe8, 0x35, 0x3b, 0xbd, 0xd6, 0x95, 0x5f, - 0x2f, 0xac, 0xf2, 0x06, 0x51, 0x55, 0xfe, 0xd6, 0x0b, 0x7f, 0x0a, 0x30, - 0x3f, 0x68, 0x3a, 0x61, 0xa1, 0x43, 0x46, 0x0a, 0x5b, 0xe0, 0xa2, 0xde, - 0xe0, 0x74, 0x2a, 0x56, 0xf3, 0x9a, 0xba, 0x0f, 0x5d, 0xbe, 0x2a, 0xf0, - 0x37, 0xf3, 0xeb, 0x7b, 0xcc, 0x3d, 0x2f, 0x99, 0x69, 0x86, 0x31, 0xa2, - 0x0e, 0xa7, 0x64, 0x53, 0x73, 0x02, 0x33, 0x6b, 0xd5, 0xa5, 0xd2, 0x92, - 0x20, 0x16, 0x5f, 0x96, 0x51, 0xcb, 0xfb, 0x8d, 0xad, 0x34, 0xc6, 0xfc, - 0xda, 0x5d, 0x46, 0x2a, 0x15, 0x25, 0x67, 0x96, 0x3d, 0x6d, 0x16, 0xfe, - 0x38, 0x6a, 0x26, 0x92, 0xc0, 0x65, 0x8f, 0x3e, 0x52, 0x58, 0x73, 0xe2, - 0xc8, 0x32, 0x6b, 0x16, 0x04, 0x0c, 0xdf, 0x99, 0x22, 0x15, 0x23, 0xe3, - 0x22, 0xaf, 0x4b, 0x6e, 0x25, 0x54, 0x72, 0xfb, 0x0e, 0x37, 0x94, 0x52, - 0x3b, 0x65, 0xf9, 0x46, 0xb8, 0xa1, 0x5c, 0x7c, 0x0b, 0x7a, 0xc1, 0x7a, - 0xfa, 0x8d, 0x65, 0xe5, 0x16, 0x62, 0x5e, 0x6d, 0xd3, 0xaa, 0x29, 0xbb, - 0xdd, 0x5a, 0x22, 0x93, 0xf0, 0x79, 0x79, 0x21, 0x7d, 0x5d, 0x61, 0xa1, - 0xc8, 0xfa, 0x92, 0x42, 0xa1, 0xdb, 0x89, 0x09, 0x05, 0x6f, 0x2b, 0xa3, - 0x64, 0x47, 0x4c, 0x09, 0x29, 0x99, 0xc1, 0x62, 0xca, 0x6f, 0x0d, 0xe5, - 0x40, 0x32, 0x5b, 0x45, 0x44, 0x0b, 0x9b, 0xc4, 0xf8, 0x3f, 0x0e, 0x5d, - 0xa0, 0x2b, 0x63, 0x11, 0xb1, 0x80, 0x73, 0x5d, 0x78, 0x5d, 0x32, 0x1c, - 0xe1, 0x21, 0x07, 0x11, 0x37, 0xf5, 0x5d, 0xba, 0x80, 0xa3, 0x2b, 0x5d, - 0x24, 0x54, 0xbf, 0x6f, 0x55, 0x08, 0xc2, 0xa5, 0xc7, 0x0a, 0x5d, 0xdf, - 0x62, 0xd2, 0x2b, 0xfa, 0x76, 0x16, 0x8d, 0xb1, 0xd2, 0x7e, 0xd2, 0x69, - 0xb6, 0x77, 0xf7, 0x9a, 0xed, 0x0e, 0x5e, 0x03, 0xde, 0xee, 0x56, 0xe4, - 0x0b, 0x6d, 0x79, 0xfb, 0x1c, 0xd3, 0x49, 0x1a, 0x55, 0x08, 0xea, 0x9c, - 0x02, 0x12, 0x2a, 0xd6, 0x0f, 0xb9, 0x18, 0xbe, 0x2a, 0xbd, 0xbd, 0x76, - 0x45, 0x73, 0x17, 0x1f, 0x1b, 0x35, 0x31, 0x15, 0xae, 0xcd, 0xf1, 0xc4, - 0x26, 0x7c, 0x2c, 0xa2, 0x83, 0xc5, 0xa7, 0x63, 0x19, 0x7c, 0xf7, 0xf0, - 0x05, 0xff, 0xa5, 0xf3, 0x74, 0xd8, 0x2d, 0xbf, 0x6b, 0x3c, 0x9b, 0x39, - 0x90, 0x81, 0x79, 0xea, 0x2d, 0xf0, 0x99, 0xbc, 0xc8, 0x93, 0xc5, 0xf6, - 0x5a, 0xcf, 0x5b, 0xb9, 0x2c, 0x04, 0x7d, 0x48, 0x8a, 0xc0, 0x1a, 0xe7, - 0x7e, 0x76, 0x42, 0x67, 0xe0, 0xb8, 0x4e, 0x84, 0xe0, 0xb8, 0x8f, 0x9f, - 0x64, 0xa2, 0x3a, 0x44, 0x7c, 0x4a, 0xed, 0x4b, 0xe1, 0x6d, 0xfa, 0x70, - 0x70, 0x3a, 0x46, 0x96, 0xee, 0xec, 0x41, 0x62, 0x1c, 0x0d, 0x77, 0xea, - 0xa9, 0x70, 0x38, 0x8e, 0xf9, 0x90, 0xe2, 0x90, 0x6b, 0x12, 0x46, 0x18, - 0x53, 0x13, 0xe2, 0xaa, 0x11, 0xc6, 0xf7, 0x00, 0x67, 0xd3, 0xe6, 0x1c, - 0xbc, 0xda, 0x52, 0x49, 0xf1, 0xf5, 0xb0, 0x39, 0x30, 0xf8, 0x0d, 0x26, - 0x8d, 0x1a, 0x6a, 0xe8, 0x51, 0x39, 0xf3, 0x4c, 0x21, 0x67, 0x69, 0x08, - 0xdc, 0x42, 0x99, 0x82, 0x18, 0x5f, 0xf8, 0xf3, 0x44, 0x19, 0xe1, 0xd1, - 0x1a, 0x0a, 0x95, 0x3b, 0xef, 0xe1, 0xf4, 0x1e, 0x7c, 0xa7, 0xba, 0xa9, - 0x12, 0x2e, 0x7e, 0x30, 0x21, 0x37, 0x7c, 0xe2, 0xd1, 0x14, 0x54, 0x0d, - 0x77, 0x75, 0xde, 0xc3, 0x1b, 0xa5, 0x03, 0xfa, 0x98, 0xd0, 0xc7, 0x80, - 0x3e, 0xa6, 0xe2, 0xa2, 0x57, 0x69, 0xa9, 0x3f, 0x44, 0xb4, 0x9f, 0x77, - 0x18, 0x88, 0x3f, 0x27, 0xfc, 0x39, 0xe8, 0x28, 0xb8, 0x4e, 0x1a, 0xb0, - 0xcb, 0x80, 0xfc, 0x39, 0xe1, 0xcf, 0x41, 0x57, 0x01, 0x76, 0x13, 0x80, - 0xfa, 0xd4, 0x88, 0x7c, 0xd5, 0x8b, 0xc7, 0xf1, 0xcf, 0xd0, 0x68, 0x95, - 0xca, 0x2f, 0x25, 0xe1, 0x84, 0xb8, 0xd6, 0x9d, 0xbd, 0x76, 0x67, 0x7c, - 0x71, 0x2a, 0x6b, 0x40, 0x31, 0x20, 0xc9, 0x4a, 0x9c, 0x62, 0x69, 0x09, - 0xe0, 0x75, 0x53, 0xcb, 0x30, 0xa1, 0x1f, 0xc6, 0xab, 0x4d, 0x95, 0x34, - 0xaf, 0x8e, 0x3c, 0x35, 0x10, 0xc9, 0x72, 0x40, 0x7a, 0x5a, 0x0c, 0x64, - 0x64, 0xe8, 0x84, 0x3a, 0x5d, 0x8c, 0x8c, 0xf4, 0x65, 0xd0, 0xf9, 0x18, - 0x53, 0x8b, 0xe9, 0x29, 0x87, 0xa4, 0xc2, 0x7f, 0x34, 0x65, 0xe8, 0x82, - 0xa1, 0x58, 0x21, 0x4d, 0x1d, 0x64, 0x34, 0x67, 0x8c, 0xc6, 0xb4, 0x21, - 0xad, 0x6d, 0xbc, 0x8a, 0xf6, 0xf9, 0x54, 0x01, 0xbd, 0x53, 0x86, 0x6e, - 0x9e, 0x99, 0x07, 0xe4, 0xcd, 0xd0, 0x89, 0x81, 0x28, 0xc4, 0x81, 0x4c, - 0x86, 0x41, 0x4f, 0x36, 0x51, 0x4b, 0xbf, 0xc2, 0x31, 0x57, 0xd7, 0xb5, - 0xad, 0x9f, 0x85, 0x14, 0x94, 0xa8, 0xde, 0x7e, 0x7e, 0xa2, 0xde, 0xdf, - 0x36, 0xb8, 0xb4, 0x5e, 0x22, 0x61, 0x62, 0x5b, 0xbf, 0x72, 0x70, 0x82, - 0xc4, 0xff, 0xee, 0x77, 0x28, 0x0c, 0x09, 0xf8, 0xe5, 0x89, 0xa5, 0x91, - 0x85, 0x55, 0x93, 0xe0, 0xf2, 0x44, 0x86, 0x5d, 0x05, 0xdf, 0xfd, 0x4e, - 0x1c, 0xda, 0xf0, 0xc7, 0xb0, 0x1a, 0x72, 0xea, 0x91, 0x5b, 0x53, 0x3a, - 0x25, 0x9d, 0x36, 0x73, 0x65, 0x53, 0xaa, 0xa8, 0x81, 0x96, 0xe6, 0x89, - 0x89, 0xc8, 0x34, 0x62, 0x4b, 0xbe, 0xf8, 0x1e, 0x37, 0x2d, 0xb9, 0xf0, - 0xa9, 0x03, 0xd0, 0xed, 0x13, 0x85, 0xc7, 0x0f, 0xf1, 0xf3, 0x71, 0xad, - 0x2e, 0x43, 0xf4, 0x75, 0x1a, 0x3f, 0x20, 0x95, 0xe3, 0xf3, 0x75, 0x22, - 0xfd, 0x46, 0x1a, 0x07, 0xe7, 0xc7, 0x89, 0xf4, 0x40, 0xa9, 0x4a, 0xb9, - 0x74, 0xb2, 0x7c, 0x42, 0xba, 0x54, 0x2f, 0x9d, 0x8c, 0x07, 0xa2, 0xb6, - 0x6f, 0xc5, 0xbc, 0x45, 0xd4, 0xf2, 0x59, 0xd6, 0x10, 0x8a, 0xff, 0x2b, - 0xdb, 0xd5, 0x85, 0x64, 0x42, 0xcc, 0x63, 0x3a, 0x53, 0x27, 0x69, 0x66, - 0xd3, 0xb9, 0x2a, 0x45, 0x73, 0x9d, 0xc9, 0xd5, 0x49, 0x86, 0xfd, 0x74, - 0x7e, 0x9c, 0x16, 0xd7, 0x23, 0x9d, 0xaf, 0x93, 0x50, 0xa1, 0x84, 0xac, - 0x55, 0xf3, 0x7f, 0x23, 0xef, 0xca, 0xe2, 0x3a, 0x49, 0xa5, 0x53, 0x29, - 0xba, 0x74, 0xea, 0xf5, 0x7a, 0x69, 0x14, 0xf2, 0xb5, 0xfb, 0x46, 0x1e, - 0xaf, 0x07, 0x9a, 0xa6, 0x79, 0x1f, 0x3f, 0x92, 0x3f, 0xc5, 0x32, 0x29, - 0x02, 0xe0, 0x8c, 0x4f, 0x5a, 0x2e, 0x45, 0x10, 0x94, 0xfe, 0x49, 0xcb, - 0xa6, 0x10, 0x82, 0x33, 0x3e, 0x19, 0xf9, 0x14, 0xc1, 0xc8, 0x1c, 0x00, - 0xed, 0x2b, 0x95, 0x53, 0x55, 0x52, 0xb7, 0x68, 0x18, 0x85, 0xd6, 0x19, - 0xcf, 0x39, 0xbd, 0x6a, 0xbb, 0xc0, 0x25, 0xbb, 0x5f, 0x3c, 0xde, 0xd2, - 0xf8, 0xfc, 0x00, 0x19, 0x9c, 0xb0, 0xc2, 0x05, 0x65, 0xf2, 0x15, 0x93, - 0x18, 0x72, 0xd9, 0xf6, 0x36, 0x63, 0xfb, 0xa4, 0x2f, 0x2c, 0x1b, 0xc4, - 0xd7, 0x6d, 0x30, 0x51, 0xd0, 0xfb, 0x3d, 0x4c, 0x77, 0xf5, 0x7b, 0x57, - 0x90, 0x5e, 0x93, 0x2f, 0x87, 0xbc, 0xae, 0x5b, 0xdf, 0xbb, 0x62, 0x51, - 0x25, 0x9e, 0x49, 0x30, 0xea, 0xb1, 0xf6, 0xfb, 0xfd, 0x55, 0x39, 0xc1, - 0x0b, 0x26, 0x8b, 0x38, 0x71, 0x60, 0xb1, 0x82, 0x9f, 0xbe, 0x7f, 0xf3, - 0x9a, 0x5c, 0x84, 0x87, 0x04, 0x01, 0x16, 0xde, 0xfb, 0x80, 0xae, 0x7e, - 0x24, 0xf9, 0x2a, 0x4a, 0x75, 0x2b, 0xe6, 0x49, 0x35, 0xaa, 0x7e, 0x30, - 0xdc, 0x7c, 0x4a, 0x5e, 0x06, 0x07, 0x49, 0x9f, 0xc0, 0x10, 0x49, 0x31, - 0x9b, 0xe4, 0x94, 0xdf, 0x24, 0xad, 0x59, 0xb2, 0x94, 0x4c, 0x01, 0x2b, - 0x85, 0xb3, 0x42, 0xeb, 0x8a, 0xd2, 0xa5, 0x97, 0x51, 0x45, 0x37, 0x85, - 0x34, 0x76, 0x5a, 0xba, 0xf8, 0xb5, 0x45, 0x6b, 0x05, 0x6b, 0xb5, 0x4c, - 0xbb, 0x72, 0x63, 0x4b, 0x18, 0x71, 0x35, 0x03, 0x90, 0x4b, 0x25, 0x4c, - 0xb2, 0x09, 0x83, 0x35, 0xdb, 0x83, 0xe8, 0xe7, 0xe5, 0x9f, 0x40, 0x88, - 0x91, 0x72, 0x65, 0x7c, 0xf4, 0xb6, 0xd6, 0xf5, 0xea, 0xd3, 0xc9, 0x55, - 0x28, 0x97, 0x32, 0xe8, 0xac, 0x59, 0xa5, 0xce, 0x0a, 0x55, 0xea, 0xac, - 0x8c, 0x90, 0x5e, 0xd0, 0xba, 0x5e, 0x9d, 0xba, 0xb9, 0x3a, 0xe5, 0x52, - 0x06, 0xdd, 0x35, 0xeb, 0xd4, 0x5d, 0xa1, 0x4e, 0x5d, 0xad, 0x85, 0x66, - 0x6c, 0xe3, 0xcb, 0x03, 0x61, 0x8e, 0x19, 0x86, 0x96, 0x8d, 0xe2, 0x6b, - 0xa7, 0xce, 0xa7, 0x18, 0xcb, 0xbe, 0x79, 0xf7, 0x06, 0x2e, 0x83, 0x3e, - 0xe7, 0x67, 0xec, 0x90, 0x84, 0x87, 0xdd, 0x0e, 0x7e, 0x05, 0xe3, 0x53, - 0x55, 0x63, 0xab, 0x19, 0x77, 0x64, 0x5f, 0xb3, 0xfa, 0xa6, 0x43, 0x4a, - 0xd2, 0xb2, 0x57, 0xa6, 0x61, 0x64, 0x5a, 0x12, 0x8a, 0xbb, 0x6b, 0x1a, - 0x88, 0x93, 0x52, 0x30, 0xd4, 0xef, 0x33, 0x40, 0x9c, 0x96, 0x86, 0x32, - 0x63, 0x92, 0x01, 0x53, 0x89, 0x49, 0x38, 0x33, 0x34, 0x19, 0x30, 0x99, - 0xa6, 0xa0, 0x8a, 0x25, 0x56, 0x28, 0x26, 0x23, 0x25, 0x86, 0x95, 0x3e, - 0x0c, 0x6b, 0x83, 0x11, 0x14, 0xf0, 0xc8, 0xb7, 0xcf, 0x0c, 0x26, 0x0a, - 0x11, 0xa7, 0xab, 0x81, 0x2a, 0xa7, 0x4b, 0x85, 0x46, 0xb7, 0x85, 0xed, - 0xed, 0xdf, 0x27, 0xc5, 0xba, 0xac, 0x64, 0xab, 0x9e, 0x36, 0xd1, 0x5c, - 0xd6, 0x08, 0x7b, 0x79, 0x51, 0x14, 0xce, 0xda, 0x73, 0xd3, 0x04, 0xcb, - 0xf9, 0x65, 0x10, 0x4d, 0xb3, 0xec, 0xd1, 0x60, 0x35, 0x4d, 0xb6, 0x1c, - 0xad, 0x84, 0xd1, 0x88, 0x96, 0x3f, 0x1b, 0xcc, 0xe4, 0x9c, 0xf2, 0xf5, - 0xa7, 0xfd, 0x04, 0x11, 0x1c, 0x20, 0x75, 0x47, 0x7c, 0x94, 0xe8, 0x63, - 0xeb, 0xd3, 0xbe, 0x19, 0x43, 0x93, 0x28, 0xac, 0x83, 0xbe, 0xd5, 0xde, - 0x4b, 0xdd, 0x38, 0xca, 0x88, 0x9a, 0xbc, 0xae, 0xfa, 0xd6, 0x9e, 0x41, - 0x5d, 0xd2, 0x09, 0xb4, 0x4e, 0x8f, 0x81, 0x1a, 0x51, 0x0e, 0x5b, 0xbf, - 0x1b, 0xe8, 0x57, 0x5b, 0xfe, 0x6e, 0xb0, 0x35, 0xa9, 0x5b, 0x15, 0x3c, - 0x22, 0xc8, 0xfe, 0xac, 0x92, 0x1e, 0x14, 0x6e, 0x8f, 0x9b, 0x90, 0x29, - 0xd4, 0x9a, 0x92, 0xc1, 0xfd, 0xdd, 0xef, 0xc4, 0x1a, 0xa7, 0x5e, 0x27, - 0x94, 0x57, 0xb9, 0x5b, 0xea, 0xdb, 0x6d, 0x95, 0xed, 0xb6, 0x9a, 0x76, - 0x1f, 0x6a, 0x76, 0xa7, 0x3a, 0xa6, 0x4d, 0xc4, 0x70, 0x4a, 0x6f, 0xb0, - 0xb4, 0x02, 0xfe, 0xe4, 0x7c, 0x9a, 0xc2, 0x28, 0xcb, 0x2a, 0x1d, 0x75, - 0x63, 0x24, 0x14, 0xf4, 0x31, 0x3e, 0x94, 0x39, 0xcb, 0x9b, 0xd3, 0xfc, - 0x02, 0xd2, 0x63, 0x59, 0xea, 0x71, 0xdd, 0xaa, 0xd6, 0xfa, 0x07, 0x57, - 0x29, 0x97, 0x66, 0x66, 0x9f, 0xe1, 0xe4, 0x05, 0xae, 0xd8, 0x88, 0x6d, - 0xb9, 0x8d, 0xdf, 0x28, 0x2d, 0x68, 0xca, 0x32, 0xc0, 0xc1, 0x69, 0x9a, - 0xa6, 0xb4, 0x30, 0x2d, 0xa3, 0xb3, 0xbd, 0xa9, 0x63, 0xc7, 0xb1, 0xed, - 0xe3, 0xf7, 0x5a, 0x29, 0x76, 0x62, 0x36, 0x12, 0xfe, 0x95, 0xd6, 0x2f, - 0xdd, 0x5b, 0xd2, 0x1e, 0x1b, 0xaf, 0x01, 0xb5, 0x6b, 0x56, 0x72, 0xd0, - 0x4b, 0x0e, 0x06, 0x37, 0x17, 0xee, 0xa4, 0x0b, 0x77, 0xd6, 0x2b, 0xdd, - 0x4d, 0x97, 0xee, 0x96, 0x94, 0xce, 0x9b, 0x67, 0x93, 0x99, 0xf1, 0xb4, - 0xe3, 0xfe, 0x54, 0x4b, 0xf6, 0x80, 0x4d, 0xb6, 0x0e, 0x13, 0x2c, 0x6c, - 0x9f, 0x04, 0x2b, 0xca, 0xed, 0xbd, 0x65, 0x1b, 0x4d, 0xf4, 0x60, 0xbc, - 0xaa, 0x9c, 0x3b, 0xe9, 0xe2, 0x9d, 0x75, 0xcb, 0x77, 0xd3, 0xe5, 0xbb, - 0xba, 0xfc, 0x9d, 0xb6, 0x14, 0xd9, 0x93, 0x4d, 0x36, 0x14, 0xd1, 0x2b, - 0x6c, 0x27, 0xc3, 0x88, 0x9c, 0x90, 0xdc, 0xb2, 0x95, 0x06, 0xca, 0x1b, - 0x5a, 0x55, 0xc8, 0x9d, 0x74, 0xe9, 0xce, 0x9a, 0xc5, 0xbb, 0xe9, 0xe2, - 0x5d, 0x55, 0xfc, 0x4e, 0x9b, 0x88, 0x0c, 0xf4, 0x46, 0xdb, 0x88, 0x08, - 0x16, 0x37, 0x52, 0x82, 0x15, 0x39, 0xa9, 0xbf, 0x6d, 0x33, 0x9d, 0x2b, - 0x7f, 0x74, 0x65, 0x41, 0x77, 0xd2, 0xc5, 0x3b, 0xeb, 0x96, 0xef, 0xa6, - 0xcb, 0x77, 0x55, 0xf9, 0xbb, 0x6d, 0x29, 0x39, 0xe8, 0x6d, 0xb2, 0xa9, - 0x24, 0xc5, 0xc2, 0xb6, 0x4a, 0x32, 0xa3, 0x97, 0x57, 0x72, 0xad, 0x25, - 0x85, 0x62, 0xd6, 0x6d, 0x63, 0xe7, 0x6f, 0x3d, 0xb9, 0xe8, 0xa5, 0x82, - 0x67, 0x31, 0xa2, 0xbb, 0x5d, 0x2f, 0x30, 0x0c, 0xe6, 0x17, 0x0d, 0x6a, - 0x66, 0x92, 0xb2, 0x59, 0x8f, 0x80, 0x09, 0x16, 0x8a, 0x3e, 0xc1, 0x8a, - 0x5a, 0xd7, 0x2b, 0x11, 0x3c, 0xe7, 0x65, 0x26, 0x53, 0x79, 0xa9, 0x9e, - 0x50, 0xee, 0xdd, 0x0a, 0x94, 0x09, 0x16, 0xcb, 0xf2, 0xda, 0x78, 0x5f, - 0xa9, 0x4a, 0x79, 0xaa, 0x3e, 0xc3, 0x45, 0x80, 0xef, 0xc4, 0x8a, 0x9a, - 0xca, 0xd1, 0x93, 0x01, 0x12, 0x52, 0x6a, 0x2e, 0x60, 0xbb, 0x08, 0x3a, - 0xad, 0xea, 0xdb, 0x73, 0x3e, 0xea, 0x6d, 0xaa, 0x26, 0xa5, 0x7c, 0xfa, - 0x58, 0x49, 0xdc, 0xb8, 0x52, 0x49, 0xad, 0x3f, 0xa5, 0xd0, 0xf6, 0x15, - 0xdd, 0xd4, 0xac, 0x20, 0x47, 0xfc, 0xa9, 0xd5, 0x5a, 0x97, 0x34, 0xdd, - 0xd6, 0xb2, 0x06, 0xdd, 0xe4, 0x32, 0xb9, 0x82, 0xcc, 0x4e, 0x82, 0x33, - 0xcb, 0xf3, 0xf4, 0x96, 0x83, 0x00, 0x51, 0x18, 0x99, 0x99, 0x2f, 0x1b, - 0x22, 0x86, 0xe1, 0x99, 0xaf, 0x99, 0x83, 0xc9, 0xad, 0x80, 0x3e, 0x47, - 0x68, 0xb1, 0x12, 0xc7, 0xca, 0xab, 0x99, 0x84, 0x5a, 0x16, 0x68, 0x38, - 0x7b, 0xce, 0xac, 0xe0, 0x56, 0xff, 0xc0, 0xba, 0x2a, 0x35, 0x5a, 0xab, - 0xf6, 0xe9, 0x9c, 0xe7, 0x9d, 0xcc, 0xcd, 0x2e, 0x71, 0xa4, 0xb5, 0xf6, - 0x3d, 0xba, 0xeb, 0x84, 0xae, 0x21, 0xf3, 0x9e, 0x33, 0x12, 0x55, 0xa7, - 0xc8, 0x67, 0xe5, 0x94, 0x4e, 0xbf, 0x29, 0x60, 0x1c, 0x79, 0xe2, 0x94, - 0xa2, 0x1d, 0x64, 0xb5, 0xb9, 0x50, 0x4a, 0x35, 0x13, 0xce, 0xe5, 0xff, - 0x92, 0x00, 0xb8, 0x42, 0x6b, 0x89, 0x80, 0x7c, 0x8c, 0xff, 0x25, 0x09, - 0x50, 0x7d, 0xd6, 0x12, 0x00, 0x8d, 0xdd, 0xff, 0x53, 0x12, 0xa0, 0x0a, - 0xad, 0x27, 0x02, 0x39, 0x26, 0xae, 0x23, 0x83, 0xff, 0x8c, 0x9a, 0x4a, - 0xbe, 0xd7, 0xaa, 0x2a, 0x46, 0xab, 0xf5, 0x4c, 0xde, 0xc6, 0x2a, 0x03, - 0xce, 0x56, 0xb6, 0x5e, 0xd7, 0xc9, 0x7b, 0x28, 0x5e, 0xcd, 0xe6, 0x72, - 0xa1, 0x5a, 0xbe, 0x0d, 0x83, 0x0e, 0xe3, 0xab, 0xfb, 0x23, 0x12, 0xe3, - 0xc4, 0x05, 0x5d, 0x42, 0x51, 0x5d, 0x04, 0x18, 0x75, 0xe7, 0x3e, 0x5d, - 0x0d, 0x4c, 0xf1, 0x59, 0xb4, 0x1a, 0x53, 0xb3, 0xcc, 0x80, 0x01, 0xa8, - 0x40, 0x0d, 0x17, 0xbf, 0x7e, 0xf3, 0xfa, 0xa7, 0x28, 0x71, 0x2c, 0xfe, - 0x88, 0x45, 0x95, 0x48, 0xd7, 0x8c, 0x00, 0x70, 0xa2, 0x93, 0x63, 0xf1, - 0x43, 0x8a, 0xc5, 0x97, 0xd2, 0x41, 0x99, 0xa4, 0x5b, 0x90, 0xf2, 0xa0, - 0x65, 0x3c, 0x8c, 0x89, 0xde, 0x67, 0x17, 0x7a, 0xdb, 0x7a, 0xf4, 0xc8, - 0xe2, 0x0c, 0xc2, 0xb2, 0x08, 0xa5, 0x5f, 0xde, 0x2a, 0x7c, 0xd5, 0x50, - 0x24, 0xc7, 0x30, 0x85, 0x26, 0x9c, 0x63, 0x9b, 0x5d, 0xd0, 0x65, 0x4f, - 0x8a, 0xa3, 0x24, 0x29, 0x0d, 0xfd, 0x00, 0xd8, 0x1e, 0x3f, 0x06, 0x8d, - 0x38, 0xa9, 0x66, 0x30, 0x9b, 0xbf, 0x58, 0x06, 0x31, 0x54, 0x02, 0xa7, - 0x71, 0x0d, 0x96, 0x96, 0xac, 0x9c, 0x2c, 0x86, 0x43, 0x8c, 0xfb, 0x0f, - 0x2a, 0xb9, 0xc2, 0xf2, 0x31, 0x8f, 0xe7, 0x46, 0xe1, 0xd4, 0x12, 0xe8, - 0x8f, 0x8e, 0x8f, 0xdf, 0x1d, 0x3f, 0xb0, 0x72, 0xaf, 0xaf, 0x91, 0xf4, - 0x32, 0xb4, 0xae, 0x13, 0xcb, 0xaa, 0xd4, 0xca, 0x35, 0x6e, 0x2f, 0x3e, - 0xfb, 0x5d, 0xf9, 0xf6, 0x1d, 0x5d, 0xfb, 0x62, 0xb1, 0x06, 0x44, 0x41, - 0xec, 0x40, 0x4a, 0xce, 0x0c, 0xd8, 0xcb, 0xa3, 0x22, 0x28, 0x06, 0x20, - 0xa5, 0x65, 0xb4, 0x59, 0xd7, 0x0e, 0x5b, 0x25, 0x7c, 0xab, 0x64, 0xdc, - 0xf6, 0x4a, 0xdb, 0x2a, 0xf4, 0x99, 0x09, 0x33, 0xda, 0x02, 0x30, 0x07, - 0x6b, 0xe0, 0xf4, 0x96, 0x0a, 0x8b, 0x30, 0xba, 0x23, 0x37, 0x57, 0x4d, - 0x0f, 0x4a, 0xbd, 0x68, 0xea, 0xa5, 0xf4, 0xb8, 0x64, 0x14, 0x07, 0x9f, - 0x98, 0x46, 0xd4, 0x8f, 0x8d, 0xd7, 0xef, 0x9c, 0xbc, 0xef, 0x01, 0x57, - 0x6e, 0xe2, 0x28, 0xa8, 0xfd, 0xb1, 0x96, 0xb9, 0x18, 0xc8, 0x50, 0x6f, - 0xac, 0x7a, 0xee, 0xd6, 0x58, 0x35, 0x94, 0x50, 0x2b, 0x59, 0x9d, 0x50, - 0xa8, 0xfb, 0xd6, 0xcf, 0x4e, 0xde, 0xbd, 0x6d, 0xce, 0xed, 0x80, 0x8f, - 0x2d, 0x17, 0xe8, 0x99, 0x0a, 0x19, 0x9f, 0xa9, 0xc5, 0x6c, 0x46, 0x6a, - 0xee, 0xb2, 0xc8, 0xe0, 0xcd, 0x11, 0x88, 0x0f, 0x3d, 0xc3, 0x4c, 0xcf, - 0x62, 0x6b, 0x63, 0xfe, 0x32, 0xd4, 0x18, 0xac, 0x89, 0x70, 0x23, 0xae, - 0x50, 0xfc, 0xa0, 0x8e, 0x5d, 0x98, 0x17, 0x74, 0x15, 0xff, 0x99, 0x09, - 0x02, 0xd3, 0x96, 0xa7, 0x4f, 0xae, 0xd4, 0x35, 0xab, 0x06, 0x5b, 0x1d, - 0x6f, 0x44, 0x93, 0x8f, 0x0c, 0xa7, 0xa7, 0x42, 0xe6, 0x2f, 0xaf, 0xd9, - 0xf9, 0xe4, 0xb5, 0x7b, 0x80, 0x6e, 0x5f, 0x75, 0x38, 0x7e, 0xe5, 0xd7, - 0x87, 0xe1, 0xe8, 0xd9, 0x10, 0x0f, 0xf0, 0xc3, 0x33, 0x9b, 0x71, 0xca, - 0x3d, 0x07, 0x46, 0x4f, 0x22, 0x8d, 0x31, 0x9a, 0x5b, 0xd4, 0x4e, 0x3c, - 0x74, 0xac, 0x81, 0x1d, 0x54, 0x93, 0xc0, 0xf1, 0x45, 0x9f, 0x75, 0x4b, - 0x85, 0x0c, 0xd2, 0x64, 0xa6, 0xd5, 0x2a, 0xea, 0x64, 0x94, 0x96, 0xeb, - 0x00, 0xcf, 0x39, 0x44, 0x6c, 0xa5, 0x1e, 0x20, 0xa3, 0xc9, 0x6e, 0x54, - 0xff, 0x42, 0xe5, 0x97, 0x65, 0xef, 0x5c, 0xf1, 0xf9, 0xea, 0x97, 0x95, - 0x54, 0x1f, 0x50, 0x71, 0xe9, 0x92, 0x6e, 0x01, 0x90, 0x38, 0x8e, 0xd1, - 0xca, 0xf5, 0x0d, 0x55, 0x05, 0x03, 0xd1, 0x4f, 0x15, 0xd8, 0xbf, 0x11, - 0x75, 0x1c, 0x69, 0x57, 0x8a, 0xda, 0x40, 0xf4, 0xd3, 0x25, 0x56, 0x44, - 0x8e, 0x90, 0xbd, 0x72, 0xe4, 0x06, 0xa2, 0x9f, 0x2a, 0xb1, 0x2a, 0x72, - 0x0a, 0xfe, 0x2b, 0x45, 0x6e, 0x20, 0xfa, 0xe9, 0x12, 0x2b, 0x22, 0xa7, - 0x28, 0xc2, 0x52, 0xe4, 0x06, 0xa2, 0x9f, 0x2e, 0x71, 0x33, 0x72, 0x19, - 0x8e, 0x88, 0xf4, 0x32, 0xe4, 0x1a, 0xa2, 0x6f, 0xc0, 0x57, 0x10, 0x88, - 0x8a, 0x6a, 0xb4, 0xac, 0xd5, 0x2d, 0xa8, 0x22, 0x67, 0x4a, 0xf6, 0x93, - 0x98, 0xf6, 0x97, 0x97, 0x4a, 0x44, 0x44, 0xa2, 0x5c, 0x1a, 0x15, 0xec, - 0xc8, 0xd0, 0x5d, 0xd0, 0x28, 0x56, 0xf9, 0xc0, 0x63, 0xeb, 0x0a, 0x56, - 0x2f, 0x53, 0x1d, 0x19, 0x92, 0xb9, 0x44, 0x4a, 0x1a, 0xa2, 0x9f, 0x00, - 0x5f, 0x49, 0x4a, 0x1c, 0xd9, 0x59, 0x8a, 0xd6, 0x40, 0xf4, 0x53, 0x05, - 0xfe, 0x2f, 0xcc, 0xb1, 0x16, 0x58, 0xbe, 0x89, 0xa1, 0x44, 0x2b, 0x56, - 0x80, 0x66, 0x4c, 0xe0, 0x9d, 0xec, 0x1e, 0xd2, 0x68, 0x8f, 0x3a, 0xb5, - 0x29, 0x5c, 0xa1, 0xc0, 0xe8, 0x9b, 0x7d, 0xc2, 0x5b, 0xa3, 0xff, 0x57, - 0x79, 0xc7, 0xda, 0xdc, 0x48, 0x0d, 0xfb, 0xcc, 0xbf, 0x58, 0xc2, 0xa3, - 0x1b, 0x48, 0xda, 0x26, 0x69, 0x0f, 0xb8, 0x52, 0x18, 0xb8, 0xe3, 0x71, - 0x33, 0xbc, 0x06, 0x8e, 0xd7, 0x74, 0x3a, 0x37, 0x49, 0xb3, 0x6d, 0x03, - 0x69, 0x12, 0x76, 0xb7, 0xb4, 0x9d, 0xa3, 0x0c, 0xff, 0x90, 0xbf, 0x84, - 0x24, 0xdb, 0x2b, 0x3f, 0x77, 0xbd, 0x7b, 0x2d, 0x30, 0xd0, 0x81, 0x4b, - 0x62, 0x4b, 0xb2, 0x2c, 0xcb, 0x6f, 0x4b, 0x12, 0xe1, 0x43, 0xf5, 0x42, - 0xfc, 0xc7, 0xe7, 0xbb, 0x2e, 0x84, 0x71, 0x12, 0x1d, 0x01, 0x32, 0x8e, - 0x80, 0x99, 0x58, 0x30, 0xb7, 0xfe, 0x13, 0x3d, 0x6a, 0x3d, 0xb1, 0xee, - 0xc3, 0x25, 0xc3, 0x20, 0xa1, 0xf0, 0xa1, 0x24, 0x74, 0xcf, 0xea, 0x0d, - 0x01, 0x1f, 0x26, 0x38, 0x0f, 0x22, 0xf0, 0x36, 0xad, 0x3f, 0x70, 0x36, - 0x4c, 0x86, 0xc9, 0x93, 0xc7, 0x5a, 0xc6, 0x62, 0x2e, 0x53, 0x3f, 0x25, - 0xa1, 0x68, 0x39, 0x42, 0x4a, 0x7d, 0xed, 0x89, 0x01, 0xc6, 0x7d, 0x3d, - 0x54, 0x62, 0x57, 0x0e, 0xdf, 0xa4, 0xe4, 0xd3, 0xde, 0xe3, 0x27, 0xdf, - 0xf5, 0x74, 0xe8, 0x62, 0xb3, 0xaa, 0x81, 0xfe, 0xe6, 0xab, 0x0f, 0xbe, - 0x00, 0x70, 0xe3, 0xfd, 0x42, 0x0d, 0xf8, 0x13, 0x03, 0x76, 0x56, 0xd6, - 0x91, 0xfe, 0xf0, 0xdb, 0xa7, 0x4f, 0xbf, 0x34, 0x89, 0xcf, 0x5a, 0x71, - 0x5e, 0x5e, 0x97, 0x2e, 0x34, 0x6c, 0x81, 0x48, 0x95, 0x52, 0x4b, 0x9e, - 0xa9, 0x25, 0xca, 0xbe, 0x22, 0x85, 0x85, 0xa2, 0xb5, 0x6d, 0x06, 0x4f, - 0xa6, 0xf0, 0x29, 0x46, 0x0a, 0x64, 0xb5, 0x2c, 0x53, 0x25, 0x8d, 0x38, - 0xb7, 0x12, 0x08, 0xd2, 0x0c, 0x7c, 0x40, 0xea, 0x6b, 0x59, 0x30, 0x62, - 0x21, 0xaa, 0x8a, 0xa0, 0xcb, 0x39, 0xc8, 0xc8, 0xa1, 0x62, 0x89, 0x93, - 0xc9, 0x33, 0x10, 0xbc, 0xd0, 0x87, 0x3c, 0xe7, 0x4c, 0x19, 0x81, 0x53, - 0x89, 0x81, 0x27, 0xcb, 0x8c, 0x65, 0xb0, 0x69, 0xc5, 0x56, 0xd6, 0x0b, - 0x0d, 0x3e, 0x13, 0xab, 0x0e, 0x6e, 0x2b, 0x83, 0x02, 0x89, 0x04, 0x0d, - 0x6e, 0x12, 0xa7, 0x17, 0x2c, 0xf8, 0xcf, 0x90, 0x22, 0x13, 0xdb, 0xb1, - 0x7c, 0x19, 0xcd, 0x18, 0xf3, 0x52, 0x4d, 0x59, 0x69, 0x3b, 0x47, 0xdb, - 0xa8, 0xe4, 0xfd, 0xa4, 0x47, 0x27, 0xe0, 0xcf, 0x66, 0xeb, 0xeb, 0x67, - 0x70, 0x8e, 0x0e, 0x14, 0x33, 0x19, 0xe1, 0x38, 0x79, 0xa8, 0xe5, 0x69, - 0x64, 0x43, 0x02, 0x2a, 0xd7, 0x67, 0x67, 0xcb, 0x4c, 0x74, 0x3a, 0xda, - 0x16, 0xb3, 0x84, 0x50, 0xc9, 0x83, 0x63, 0x0b, 0x65, 0x9b, 0x4d, 0x08, - 0xa5, 0xa8, 0x26, 0x9c, 0x5b, 0xda, 0x01, 0xa0, 0xa1, 0xac, 0x59, 0xa9, - 0x67, 0x19, 0xe5, 0x71, 0xa0, 0xec, 0xa4, 0xb8, 0x78, 0x90, 0x5c, 0xcc, - 0xf7, 0x92, 0x25, 0x5c, 0x37, 0x5f, 0x2f, 0xc7, 0xa8, 0x96, 0x69, 0x58, - 0x38, 0x89, 0x48, 0x24, 0x61, 0x90, 0xc6, 0xd6, 0x8e, 0xa8, 0x62, 0x03, - 0xd9, 0x37, 0xb8, 0x02, 0x56, 0xec, 0x11, 0x2a, 0xcf, 0x38, 0x0c, 0x81, - 0x58, 0x9a, 0x77, 0x9b, 0xc7, 0x7a, 0x93, 0xc9, 0x6b, 0xbd, 0x83, 0x68, - 0xec, 0xe1, 0x7c, 0xbd, 0x42, 0x12, 0xa0, 0x6a, 0x1f, 0x94, 0xb0, 0x04, - 0x87, 0x1e, 0x91, 0x91, 0xc1, 0xf1, 0xfa, 0x67, 0xc8, 0x9b, 0x16, 0xe7, - 0xd3, 0x3c, 0x47, 0x6b, 0x6b, 0xa4, 0x3b, 0x18, 0xed, 0xee, 0x46, 0xd5, - 0x17, 0xf4, 0x4e, 0xf5, 0xc7, 0xf0, 0x24, 0xab, 0xc7, 0x5d, 0x38, 0x68, - 0xdc, 0x88, 0x5c, 0x2e, 0xe8, 0x0c, 0x07, 0xfc, 0x94, 0xae, 0x57, 0x8d, - 0xdb, 0x11, 0x6b, 0x3c, 0x37, 0x45, 0x6b, 0x6f, 0x43, 0xca, 0x8b, 0x0d, - 0x9b, 0x10, 0xc5, 0xed, 0x48, 0xde, 0x37, 0xb7, 0x1e, 0xa0, 0x07, 0xcf, - 0x6f, 0xcd, 0xe3, 0xb4, 0xaf, 0xc5, 0x63, 0xac, 0x2a, 0xce, 0x71, 0x55, - 0xc2, 0xd5, 0xa2, 0x3c, 0x17, 0x1e, 0xa2, 0x13, 0x10, 0x7c, 0xc1, 0x48, - 0xa7, 0xd0, 0xe3, 0x53, 0x69, 0xcf, 0x04, 0xd3, 0x53, 0x85, 0x61, 0x54, - 0xac, 0x7a, 0xcb, 0xad, 0x72, 0x6d, 0x9f, 0xa5, 0x90, 0xde, 0xa7, 0xa5, - 0x16, 0xe4, 0x5e, 0x66, 0xc1, 0xe3, 0x80, 0x54, 0xab, 0x34, 0x5e, 0x0f, - 0x1d, 0xf7, 0xdd, 0xf5, 0x9a, 0x91, 0x0f, 0x92, 0xb1, 0x51, 0xfc, 0xcb, - 0x1b, 0x72, 0x91, 0x50, 0x09, 0xbb, 0xcb, 0x76, 0x4f, 0x1e, 0x1a, 0x71, - 0xc4, 0x42, 0x9c, 0x39, 0x4c, 0x52, 0xb4, 0xaa, 0x51, 0x4d, 0x8c, 0x01, - 0x24, 0xe4, 0xd9, 0x53, 0xb2, 0xb4, 0x22, 0x07, 0x73, 0x5b, 0xbb, 0x6b, - 0x02, 0x9b, 0x55, 0x5e, 0x0c, 0x24, 0x9f, 0xab, 0xab, 0x51, 0x8e, 0x44, - 0x2d, 0x83, 0x76, 0x17, 0x09, 0x3e, 0xaf, 0x87, 0xe1, 0x58, 0x84, 0xb4, - 0x4e, 0x4e, 0xf3, 0xf5, 0x85, 0x8a, 0x60, 0xad, 0x07, 0xbf, 0xde, 0xe6, - 0xc3, 0x2d, 0xe3, 0xf6, 0x4d, 0xd4, 0x15, 0xc6, 0x0e, 0x28, 0xce, 0x6d, - 0x7b, 0x22, 0x0a, 0x8d, 0xaf, 0xf7, 0x13, 0x7f, 0xfb, 0x6b, 0x00, 0xb6, - 0x0a, 0x20, 0x0d, 0x57, 0x07, 0xfc, 0x5d, 0x83, 0x60, 0x83, 0x5a, 0x12, - 0xbc, 0x41, 0x44, 0x34, 0x50, 0x99, 0x43, 0x5b, 0x65, 0x6a, 0xe1, 0xcd, - 0xee, 0x4f, 0x69, 0xb6, 0x0e, 0xf1, 0x87, 0x12, 0x65, 0x96, 0x56, 0xe3, - 0xcc, 0x6c, 0x3d, 0xbf, 0xb1, 0x07, 0x1f, 0xb9, 0x96, 0x38, 0x0c, 0x95, - 0x2c, 0xf2, 0x01, 0xa9, 0x5a, 0x37, 0x9a, 0xa7, 0x5a, 0xf8, 0xcb, 0x3a, - 0xd5, 0x32, 0x46, 0x7d, 0x1a, 0x67, 0x14, 0xbe, 0xd3, 0xa0, 0x6c, 0xc8, - 0xa7, 0xc2, 0xd1, 0x57, 0xeb, 0x00, 0x38, 0xea, 0x1a, 0x8e, 0xb8, 0xe9, - 0xbc, 0xb4, 0xcb, 0xdc, 0xd3, 0x3a, 0x74, 0xc8, 0xfa, 0x2a, 0x14, 0x91, - 0xd2, 0x37, 0x62, 0x57, 0x2e, 0x57, 0x07, 0x84, 0xef, 0xdf, 0x56, 0x98, - 0x0b, 0x5c, 0x53, 0xe7, 0xdd, 0x66, 0x67, 0x49, 0x58, 0x7d, 0x82, 0x46, - 0x26, 0xb7, 0x4b, 0xa0, 0x6a, 0x82, 0xc8, 0x2e, 0x1e, 0x03, 0x9e, 0x3c, - 0x73, 0xff, 0x58, 0xfe, 0x4c, 0x8d, 0xa5, 0xe2, 0x72, 0x3d, 0x93, 0xf9, - 0x1f, 0xc2, 0xd7, 0xf4, 0x88, 0x86, 0x49, 0xd1, 0xd5, 0x17, 0xa7, 0x37, - 0x95, 0xe4, 0xfa, 0xc7, 0x83, 0xe4, 0xb9, 0x30, 0x75, 0xdc, 0xc2, 0x5e, - 0xb8, 0x10, 0x16, 0xa5, 0x3b, 0x38, 0xb8, 0x6f, 0x29, 0x9e, 0xab, 0x12, - 0xe5, 0xcc, 0x99, 0x6e, 0x29, 0xf4, 0xad, 0x01, 0x95, 0x34, 0x48, 0xb6, - 0x8c, 0x69, 0x81, 0x2e, 0x8a, 0xbd, 0x0b, 0x7a, 0x7c, 0x4e, 0x20, 0x62, - 0xcc, 0x0c, 0x2a, 0xaa, 0xfd, 0xe6, 0x39, 0x27, 0x83, 0x11, 0x48, 0xc3, - 0xb0, 0xa6, 0x9b, 0xf6, 0x23, 0x9b, 0xa5, 0x0d, 0x26, 0x8b, 0xdf, 0x3e, - 0x7a, 0xf4, 0xd1, 0x37, 0xdf, 0x58, 0x0d, 0x80, 0xe3, 0xd7, 0x80, 0xa7, - 0x82, 0x98, 0x2d, 0xa9, 0xdd, 0x03, 0x68, 0xae, 0x81, 0xe9, 0xbb, 0x10, - 0x67, 0xff, 0x40, 0x71, 0xa2, 0x36, 0xa7, 0xfc, 0x17, 0x33, 0xe8, 0x56, - 0x5d, 0x08, 0xc4, 0x22, 0x56, 0xbd, 0xaa, 0x7f, 0x34, 0xee, 0x38, 0xcd, - 0xcd, 0xba, 0x10, 0x88, 0xa7, 0xa6, 0xdd, 0xeb, 0x17, 0xb9, 0xff, 0xb6, - 0xa7, 0x00, 0x73, 0x79, 0x9a, 0x89, 0xd7, 0x1d, 0x6e, 0x47, 0x7d, 0x59, - 0xfb, 0x59, 0xdd, 0x44, 0x04, 0x17, 0xd2, 0xed, 0xd7, 0xcf, 0xd8, 0x75, - 0x36, 0x6b, 0x5c, 0x7d, 0xc4, 0x0c, 0x2d, 0xda, 0xbd, 0x89, 0xce, 0x18, - 0xe8, 0x1f, 0x12, 0x71, 0x06, 0x1e, 0x2f, 0xcd, 0x02, 0xfb, 0x5c, 0x96, - 0x02, 0xfc, 0x20, 0x19, 0x99, 0x4f, 0xce, 0x89, 0xb0, 0x4b, 0x17, 0x07, - 0xfb, 0x18, 0xca, 0x78, 0x66, 0x6f, 0xb3, 0x7a, 0xeb, 0xed, 0x94, 0x62, - 0xd3, 0x4c, 0xe7, 0xf8, 0x05, 0x6d, 0x9d, 0x7d, 0xf4, 0x64, 0x83, 0x39, - 0x4d, 0xa6, 0x62, 0x8a, 0xa4, 0xe2, 0x4e, 0xce, 0x18, 0xa9, 0xa4, 0xfd, - 0x3d, 0x88, 0x53, 0xe6, 0x52, 0x8b, 0xc0, 0xd7, 0xbc, 0x24, 0xf9, 0x17, - 0x80, 0xaa, 0x44, 0x0f, 0xc7, 0x4f, 0x74, 0x55, 0x24, 0x71, 0x0c, 0xe1, - 0x0a, 0xe4, 0x38, 0x93, 0xb9, 0xa9, 0xe4, 0x07, 0xd6, 0xbb, 0xd4, 0xbc, - 0xd9, 0x5c, 0x75, 0x8e, 0x18, 0x7b, 0x1d, 0x85, 0x3d, 0x3b, 0xa3, 0x63, - 0x8d, 0xb0, 0xe1, 0x10, 0x1f, 0xef, 0xe8, 0xcc, 0xf7, 0x5e, 0xed, 0x75, - 0xb0, 0x25, 0x73, 0x59, 0x76, 0xe6, 0x24, 0x9e, 0x32, 0x21, 0x6b, 0x74, - 0xb7, 0x35, 0x09, 0xee, 0x6d, 0x39, 0x48, 0xcd, 0x33, 0x11, 0xb4, 0xf0, - 0x99, 0xd8, 0xa5, 0xc3, 0x60, 0x64, 0x85, 0x38, 0x61, 0xc7, 0xfb, 0xab, - 0x6f, 0x54, 0xc8, 0x1e, 0xb8, 0x94, 0x4e, 0xa1, 0x68, 0x78, 0xa2, 0x54, - 0x35, 0x9c, 0xfd, 0x2c, 0x32, 0x11, 0xf9, 0x40, 0xc2, 0x19, 0x85, 0x45, - 0xb9, 0x20, 0x09, 0x02, 0x7f, 0x08, 0x4a, 0x29, 0x81, 0x79, 0x1e, 0x4d, - 0x28, 0x30, 0xb7, 0x09, 0x28, 0x5f, 0xd0, 0x69, 0x77, 0xd3, 0x50, 0x8a, - 0x47, 0x46, 0xc5, 0x87, 0x37, 0x8f, 0xd4, 0x06, 0x34, 0xed, 0x09, 0x96, - 0xc8, 0xd4, 0x1f, 0x9e, 0x63, 0x9d, 0x41, 0x4b, 0xaa, 0x66, 0xe4, 0x05, - 0xe1, 0x82, 0xce, 0xb7, 0xe0, 0xe3, 0xdd, 0xe4, 0x5a, 0xde, 0xa2, 0xc1, - 0x2f, 0xf0, 0x5e, 0xa6, 0x37, 0xf1, 0xf5, 0xd1, 0xe2, 0x58, 0xdf, 0xd9, - 0x52, 0x82, 0xdf, 0x32, 0x84, 0x0f, 0x21, 0xde, 0x91, 0xd6, 0x21, 0x9c, - 0x32, 0xe9, 0x59, 0x1d, 0x16, 0x6a, 0xd1, 0x6c, 0xe6, 0xe6, 0xca, 0xe8, - 0xda, 0xe4, 0xa5, 0x89, 0x91, 0x89, 0xc3, 0xc8, 0x3b, 0x3d, 0x5d, 0xdc, - 0x99, 0xb4, 0xfc, 0x15, 0x21, 0x8b, 0x92, 0xe9, 0x6a, 0x5e, 0xbd, 0x31, - 0x2b, 0xd7, 0x56, 0x43, 0x00, 0x96, 0x65, 0xb3, 0xc0, 0x8d, 0x7f, 0xd4, - 0xcb, 0x91, 0x57, 0xa9, 0x1d, 0x30, 0x4e, 0x8e, 0x60, 0x58, 0x90, 0x3f, - 0x68, 0x23, 0x7f, 0xac, 0xbf, 0xe2, 0xf7, 0x12, 0x38, 0x8b, 0x23, 0x30, - 0x03, 0x4c, 0x2f, 0xfe, 0x2c, 0x0e, 0x1f, 0x4f, 0x52, 0xfd, 0x04, 0xae, - 0xe2, 0x08, 0x04, 0x5f, 0xbc, 0x84, 0x1f, 0x88, 0xb8, 0x8f, 0x43, 0x6e, - 0xad, 0x97, 0x7b, 0xde, 0x9d, 0x12, 0x2c, 0x18, 0xaa, 0xb5, 0x37, 0xb5, - 0x87, 0xfa, 0x21, 0x1b, 0x86, 0xbb, 0x04, 0x66, 0xd4, 0xe9, 0x93, 0x42, - 0x74, 0xfa, 0x00, 0x3d, 0x12, 0xd1, 0x37, 0x45, 0x54, 0xbe, 0x77, 0x37, - 0x64, 0x6f, 0x85, 0x10, 0xd3, 0xbf, 0x15, 0x42, 0xba, 0xe4, 0x80, 0xac, - 0xee, 0x30, 0x14, 0xa2, 0x85, 0x3d, 0xe1, 0xc3, 0x50, 0xfc, 0x93, 0x38, - 0xd6, 0x69, 0x09, 0xb5, 0x54, 0x6f, 0x40, 0x8c, 0xba, 0xc0, 0xde, 0x03, - 0x90, 0x23, 0x84, 0x3d, 0xde, 0xae, 0x02, 0x8c, 0x32, 0x16, 0x81, 0x18, - 0x87, 0x45, 0x82, 0x8c, 0xd5, 0x37, 0x09, 0x4a, 0xa9, 0x88, 0xb1, 0x24, - 0x3a, 0x60, 0x80, 0x56, 0x0f, 0x82, 0xe7, 0xd0, 0x99, 0xd6, 0x17, 0x59, - 0x79, 0x0e, 0x94, 0x92, 0xf3, 0x2c, 0xcf, 0xac, 0x2d, 0x04, 0xed, 0x4f, - 0x0b, 0x9e, 0x5c, 0x83, 0x2d, 0x29, 0x81, 0xb8, 0x29, 0x19, 0x4d, 0x71, - 0x0c, 0xca, 0x6a, 0x67, 0xb5, 0xe0, 0x55, 0xcd, 0x7b, 0x16, 0x59, 0x55, - 0x5a, 0xb8, 0x44, 0xb7, 0x42, 0x7c, 0xb3, 0x1b, 0xae, 0x8f, 0x84, 0xe1, - 0xea, 0xa8, 0x04, 0x45, 0xdb, 0xbe, 0x26, 0x36, 0xc1, 0xda, 0xd4, 0xcc, - 0xb9, 0x6f, 0xb6, 0xca, 0xf2, 0x4d, 0xfe, 0x8f, 0xce, 0x61, 0x50, 0xb0, - 0x31, 0xfb, 0x5e, 0xc8, 0x5e, 0xdf, 0x27, 0x03, 0xbe, 0x82, 0xae, 0x11, - 0x42, 0x05, 0xa4, 0x68, 0x30, 0x9a, 0x2d, 0x86, 0x2a, 0xc3, 0x06, 0x6c, - 0x2f, 0x08, 0x9d, 0x35, 0x26, 0x13, 0x16, 0xc5, 0x05, 0xca, 0xc2, 0x41, - 0x6e, 0x2d, 0x0c, 0xb8, 0x22, 0x6f, 0x16, 0x06, 0x00, 0xb1, 0x30, 0x54, - 0x8a, 0x2b, 0x0c, 0x95, 0x61, 0x01, 0x76, 0x15, 0x86, 0x64, 0x4d, 0x7d, - 0xaf, 0x15, 0xc6, 0x06, 0x84, 0x61, 0x23, 0xb7, 0x17, 0x06, 0x5e, 0xe9, - 0x37, 0x0a, 0x03, 0x81, 0x14, 0x0d, 0x46, 0x73, 0x84, 0xa1, 0x32, 0x6c, - 0xc0, 0x8e, 0xc2, 0x10, 0xac, 0x31, 0x99, 0x3a, 0x61, 0x5c, 0x82, 0x30, - 0x1c, 0xe4, 0xd6, 0xc2, 0xc0, 0x27, 0x08, 0x8d, 0xc2, 0x40, 0x20, 0x45, - 0x83, 0xd1, 0x1c, 0x61, 0xa8, 0x0c, 0x1b, 0xb0, 0xa3, 0x30, 0x04, 0x6b, - 0x4c, 0xa6, 0x4e, 0x18, 0xb8, 0x8e, 0x70, 0x90, 0xdb, 0x08, 0xe3, 0x04, - 0x96, 0xf2, 0x35, 0x5d, 0x44, 0xad, 0xa4, 0x09, 0xac, 0xa2, 0x40, 0xbf, - 0x2c, 0x31, 0xa8, 0xf7, 0x17, 0x0c, 0xd1, 0xa1, 0x67, 0xa8, 0x07, 0x1d, - 0x12, 0x3f, 0x5c, 0xf1, 0xe2, 0x04, 0x2a, 0x6e, 0x60, 0xb5, 0xea, 0x0f, - 0xf0, 0x04, 0xa2, 0xb9, 0xce, 0x00, 0xa4, 0xb0, 0x11, 0xc1, 0x53, 0x5f, - 0x48, 0xe5, 0xfc, 0x4e, 0xb5, 0x15, 0x8c, 0xc0, 0xbf, 0x75, 0x75, 0x55, - 0xdd, 0x9f, 0x71, 0xda, 0xd4, 0x15, 0xdf, 0x99, 0x34, 0x57, 0x16, 0xa1, - 0xc2, 0x2b, 0x36, 0x86, 0x81, 0x35, 0xdb, 0x3f, 0xbf, 0xf8, 0x62, 0x76, - 0xc4, 0xf2, 0x4b, 0x83, 0xc6, 0xc4, 0xe6, 0x45, 0x17, 0x41, 0xb9, 0xed, - 0x49, 0xaf, 0x79, 0x18, 0xa2, 0x53, 0x8b, 0x4a, 0x71, 0xe3, 0x47, 0x5d, - 0x9b, 0xe2, 0x16, 0xc6, 0xc2, 0xaa, 0x69, 0xd4, 0x97, 0x5e, 0xf2, 0x34, - 0xac, 0x08, 0xed, 0xd8, 0xdc, 0xb4, 0x02, 0xae, 0xae, 0x71, 0x19, 0xea, - 0x5f, 0xd4, 0xbc, 0x82, 0x21, 0xa7, 0x81, 0x45, 0x72, 0x73, 0x13, 0x4b, - 0x38, 0xd5, 0xc8, 0xa9, 0xfd, 0x6a, 0xe9, 0x75, 0x0c, 0x7b, 0x89, 0x38, - 0x0c, 0xdc, 0xa9, 0xbd, 0xe5, 0x1b, 0x28, 0xb3, 0xbc, 0xdf, 0x12, 0x19, - 0x33, 0x93, 0x7f, 0xcb, 0x88, 0x93, 0x9c, 0x20, 0x02, 0x48, 0xd6, 0xe9, - 0xc8, 0x1a, 0x74, 0xc4, 0x2a, 0xa9, 0xd5, 0x28, 0x27, 0x79, 0x88, 0xd2, - 0x10, 0x04, 0x8c, 0x50, 0x11, 0x04, 0xfb, 0x77, 0xe9, 0x08, 0x72, 0xe4, - 0x28, 0x89, 0x4c, 0x8f, 0xd2, 0x12, 0x04, 0xac, 0x55, 0x93, 0xd1, 0x18, - 0x91, 0x18, 0xba, 0xc3, 0x3e, 0xe0, 0x5f, 0xaf, 0x27, 0x54, 0x66, 0x94, - 0xa2, 0x10, 0x64, 0x84, 0xa6, 0x10, 0xdc, 0xbf, 0x4b, 0x55, 0x88, 0x25, - 0x47, 0x57, 0x54, 0x46, 0x94, 0xb2, 0x10, 0x64, 0x9d, 0xb6, 0xc0, 0x90, - 0x62, 0x02, 0xff, 0x07, 0x95, 0x05, 0x8a, 0x88, 0x1b, 0x54, 0x00, 0x30, - 0x66, 0x50, 0x01, 0xb0, 0x7f, 0xd9, 0xa0, 0x82, 0x1c, 0xb9, 0x8a, 0x42, - 0xe9, 0x71, 0x83, 0x0a, 0x00, 0xd6, 0x0e, 0x2a, 0x0f, 0xfa, 0x3a, 0xe8, - 0x7f, 0x6a, 0x44, 0x21, 0x87, 0xb6, 0xe4, 0xcf, 0xd6, 0x3d, 0xd6, 0xd2, - 0x9c, 0xdd, 0x76, 0x3b, 0xdd, 0x32, 0xdf, 0x60, 0x1c, 0x0a, 0x74, 0xd1, - 0x08, 0xc5, 0x11, 0xfd, 0x50, 0xe7, 0xc8, 0x4f, 0xf0, 0xb6, 0xed, 0x58, - 0xb0, 0xe0, 0xdf, 0x02, 0x9c, 0xfc, 0x5c, 0xbf, 0x1f, 0x16, 0x10, 0x74, - 0xed, 0xa1, 0x6a, 0x29, 0xb1, 0xf8, 0x9e, 0x45, 0x7b, 0x44, 0xa0, 0x39, - 0xfe, 0x15, 0x0f, 0x2a, 0x44, 0xb8, 0xfd, 0x9e, 0x66, 0xf5, 0x9c, 0x4f, - 0xaf, 0xb4, 0x13, 0x70, 0x38, 0x9c, 0xa5, 0x17, 0x46, 0x94, 0x2e, 0xce, - 0x6d, 0x25, 0x53, 0xe5, 0x5a, 0xbe, 0x2c, 0x52, 0xc4, 0xb9, 0xf0, 0x56, - 0x5b, 0x6c, 0x2f, 0x6f, 0xc0, 0xb3, 0x59, 0x0b, 0xb8, 0x55, 0xab, 0x98, - 0x4d, 0x2a, 0x9f, 0xc5, 0x92, 0xeb, 0x10, 0xe7, 0xae, 0x44, 0xb1, 0x34, - 0x75, 0x6b, 0x54, 0x3f, 0x3a, 0x94, 0x43, 0x05, 0xa7, 0x84, 0xa3, 0xe3, - 0xb2, 0x70, 0x99, 0x7f, 0x95, 0x67, 0xdc, 0xea, 0xb9, 0x28, 0xfd, 0xa4, - 0x4a, 0xe1, 0x67, 0xcf, 0xfa, 0x57, 0x6a, 0x4c, 0xed, 0x56, 0xd2, 0xf3, - 0x58, 0x91, 0xa9, 0x76, 0x11, 0x34, 0x0b, 0xc0, 0x57, 0x25, 0xeb, 0xdc, - 0x5a, 0x00, 0x36, 0xdf, 0xc1, 0xf5, 0xfa, 0xde, 0xea, 0x38, 0xcf, 0x59, - 0xdc, 0x02, 0x9d, 0xa7, 0x0a, 0x98, 0xe9, 0x95, 0x02, 0xfd, 0x02, 0x05, - 0x88, 0x7d, 0x7e, 0x0f, 0x85, 0xdd, 0xd1, 0x15, 0xa1, 0xb8, 0xe9, 0x8c, - 0x66, 0x54, 0x34, 0xd7, 0xfd, 0xf0, 0x69, 0xbe, 0xb9, 0xf7, 0x9e, 0x96, - 0x2c, 0x2f, 0xa6, 0x8b, 0x55, 0xe3, 0x75, 0xda, 0x10, 0xa1, 0x94, 0x72, - 0x2b, 0x2c, 0x77, 0x38, 0xd4, 0x5c, 0x96, 0xeb, 0xa0, 0xad, 0xce, 0x12, - 0x7c, 0xc4, 0xa0, 0x0c, 0xa3, 0x4c, 0x4b, 0xef, 0xce, 0xb3, 0x6b, 0x02, - 0xab, 0x63, 0x85, 0xa1, 0x6f, 0x16, 0xbf, 0xe0, 0x98, 0x91, 0xd2, 0x23, - 0xc9, 0x27, 0x30, 0xf3, 0x2a, 0x74, 0xf9, 0x46, 0x26, 0x1d, 0x0d, 0xc6, - 0xfd, 0xc1, 0xe8, 0x41, 0xff, 0x8d, 0xf1, 0x3b, 0xef, 0xf4, 0xdf, 0x0c, - 0xc3, 0x4d, 0x14, 0xdc, 0xfe, 0xdb, 0x6f, 0xd5, 0xc1, 0xed, 0x2b, 0xb8, - 0xd1, 0x68, 0xaf, 0xdf, 0xdf, 0x19, 0xc1, 0x13, 0x90, 0x98, 0x1b, 0xeb, - 0x72, 0xbd, 0x5e, 0xce, 0xa6, 0x2d, 0xd4, 0x90, 0x0a, 0x8d, 0xa1, 0x7c, - 0xba, 0x5e, 0x97, 0xd9, 0x7d, 0x10, 0xb6, 0x59, 0x56, 0xad, 0x92, 0x82, - 0xcc, 0xc9, 0x2b, 0xe1, 0x78, 0x1f, 0x07, 0xe7, 0xad, 0x57, 0x46, 0xa3, - 0xd1, 0x56, 0xf2, 0x10, 0xbe, 0x7c, 0xf4, 0xd1, 0x47, 0x5b, 0x31, 0x94, - 0x89, 0xe5, 0xfb, 0x23, 0x4c, 0x6f, 0xd3, 0xbb, 0x51, 0xb7, 0xfb, 0x13, - 0x3a, 0xf3, 0x6f, 0xee, 0x4f, 0x08, 0xa5, 0xfa, 0x93, 0xc2, 0x0a, 0xf5, - 0x27, 0xcc, 0xd3, 0x21, 0x5b, 0x1d, 0x44, 0xba, 0xb4, 0x80, 0x3b, 0xa3, - 0xc4, 0xa8, 0x87, 0x20, 0xf4, 0x26, 0xcf, 0x16, 0x90, 0x8f, 0x78, 0x40, - 0x2a, 0xa8, 0x63, 0xcd, 0x52, 0x41, 0x28, 0x25, 0x15, 0x85, 0x15, 0x92, - 0x0a, 0xe6, 0x99, 0x90, 0xdd, 0xa5, 0x22, 0xb8, 0x53, 0x74, 0xe2, 0xa5, - 0x22, 0xdf, 0xde, 0xb6, 0xe9, 0x4b, 0x08, 0x10, 0x43, 0x5a, 0xdd, 0xc7, - 0xde, 0x3d, 0x65, 0x3e, 0x6c, 0xbc, 0x2f, 0xda, 0x62, 0x01, 0x7f, 0x8f, - 0xd4, 0x61, 0x3f, 0x70, 0x6f, 0x82, 0x51, 0xdb, 0x8b, 0x7b, 0xa4, 0x0f, - 0xbb, 0x95, 0xee, 0xec, 0xcb, 0x97, 0x27, 0x65, 0x76, 0x5d, 0xee, 0x90, - 0x71, 0x8d, 0xe8, 0x8c, 0xf3, 0x6c, 0x23, 0xde, 0x92, 0x26, 0x90, 0xc4, - 0x34, 0x13, 0x74, 0xb7, 0x8a, 0x7e, 0xba, 0x62, 0x67, 0x4c, 0x44, 0xfd, - 0x77, 0x4f, 0x98, 0xca, 0x2f, 0x6e, 0x11, 0xf3, 0x94, 0xa9, 0xb2, 0x3c, - 0xe2, 0x71, 0x25, 0xf4, 0x8c, 0x89, 0x68, 0x06, 0x9f, 0x32, 0xc1, 0x9f, - 0x80, 0x80, 0x17, 0x4c, 0x4d, 0xd3, 0xc4, 0x78, 0x3c, 0xf6, 0x4e, 0x42, - 0xb7, 0x11, 0x4a, 0xa2, 0x16, 0x77, 0xe0, 0xec, 0xb7, 0xdb, 0x7c, 0x04, - 0x7f, 0x11, 0x2f, 0x20, 0xee, 0x87, 0xbc, 0xf0, 0x1c, 0x75, 0x0f, 0x84, - 0xe9, 0xe5, 0xd3, 0xfd, 0x90, 0xc6, 0x37, 0x51, 0xf7, 0x43, 0x19, 0x5f, - 0x4b, 0xdd, 0x13, 0x69, 0xe1, 0xb3, 0xe7, 0x7e, 0x68, 0x17, 0x9b, 0xec, - 0xbe, 0x9a, 0x51, 0x8d, 0x35, 0xdd, 0x48, 0x3b, 0x6b, 0x8a, 0x32, 0x62, - 0xe3, 0x02, 0x40, 0xc6, 0x8a, 0xa2, 0x0c, 0x6e, 0x5b, 0x20, 0x4b, 0x87, - 0x7b, 0x81, 0x3d, 0x0b, 0x31, 0x26, 0xa9, 0xc4, 0x2f, 0x26, 0x14, 0x91, - 0x21, 0x1c, 0x95, 0xb4, 0x99, 0x1e, 0xca, 0x55, 0x0c, 0x75, 0x71, 0x44, - 0xd2, 0xbc, 0x65, 0x74, 0xa9, 0xc7, 0xec, 0xca, 0xef, 0x66, 0xbb, 0xda, - 0x58, 0x76, 0xe3, 0xa8, 0xd9, 0xeb, 0x47, 0xf0, 0x74, 0x47, 0x0c, 0xf9, - 0x9f, 0x02, 0x87, 0x75, 0xb5, 0x88, 0x52, 0x56, 0xa0, 0x6a, 0xe9, 0x6b, - 0x11, 0x54, 0x58, 0x82, 0x36, 0x60, 0xdb, 0x3c, 0xd1, 0xf0, 0x52, 0x83, - 0x52, 0x8c, 0x52, 0x5b, 0xd7, 0x57, 0x2e, 0x4f, 0x28, 0x2e, 0xd3, 0xe9, - 0xf4, 0x24, 0x93, 0xde, 0xdb, 0xdb, 0xb8, 0x53, 0x94, 0x5b, 0xfd, 0xb0, - 0xff, 0x2e, 0xde, 0x07, 0xd5, 0x83, 0x60, 0x83, 0x36, 0x81, 0x94, 0xab, - 0x66, 0x88, 0x22, 0x00, 0x02, 0x2f, 0xbd, 0xe3, 0x7a, 0xb4, 0x08, 0xf7, - 0xe8, 0x69, 0x1b, 0x32, 0x4d, 0x56, 0x4d, 0x73, 0xb7, 0x4b, 0x1c, 0x65, - 0xb1, 0x79, 0xd8, 0xcc, 0x9f, 0x83, 0x37, 0xcd, 0xa5, 0xf6, 0xf3, 0x13, - 0x69, 0xb2, 0xcc, 0x80, 0x5b, 0x8a, 0xa4, 0x67, 0x9b, 0x4e, 0x02, 0x70, - 0x65, 0x0a, 0xa2, 0x4e, 0xb3, 0xfa, 0xae, 0x55, 0x06, 0xfd, 0x99, 0x34, - 0x93, 0x37, 0x0f, 0xd9, 0x66, 0xd9, 0x31, 0x38, 0xc3, 0x8c, 0x4c, 0x78, - 0x3c, 0x05, 0x93, 0x94, 0xac, 0xa0, 0x07, 0xd6, 0x2a, 0x8c, 0x57, 0x22, - 0xf4, 0x0f, 0xf4, 0x2a, 0xe0, 0xa2, 0xe9, 0x62, 0xba, 0x71, 0x8c, 0xe8, - 0xf8, 0xcf, 0xb6, 0x25, 0xa9, 0xf8, 0x8c, 0x75, 0x47, 0x21, 0x0d, 0x49, - 0xf4, 0x83, 0xcc, 0xb8, 0x7a, 0x59, 0xeb, 0x40, 0xa3, 0xef, 0xbc, 0xd8, - 0xea, 0x54, 0x5f, 0xa1, 0x86, 0xd9, 0x92, 0x5c, 0xb5, 0xf5, 0x6a, 0x62, - 0xb6, 0x1b, 0xe9, 0x86, 0xff, 0xf9, 0xbc, 0xac, 0xb6, 0x7c, 0x3a, 0xdf, - 0xeb, 0x3b, 0xcd, 0x4a, 0xc6, 0x53, 0x76, 0xb3, 0x4e, 0x97, 0xcb, 0xbf, - 0xab, 0x45, 0x51, 0xae, 0x42, 0x3a, 0xc9, 0x61, 0x9b, 0xe6, 0x3d, 0xf0, - 0x93, 0x23, 0x00, 0x53, 0x36, 0x94, 0xd4, 0x4d, 0x3c, 0xff, 0xa4, 0x76, - 0x1c, 0x86, 0xf2, 0xdd, 0x5a, 0xd4, 0x57, 0xe2, 0xd6, 0x3d, 0x73, 0x6e, - 0xb4, 0xcd, 0x37, 0x16, 0x3f, 0x6d, 0x86, 0x4a, 0xdf, 0x55, 0x5c, 0xdd, - 0x98, 0xc7, 0xb7, 0x79, 0x50, 0x8a, 0x35, 0xc5, 0x59, 0x96, 0x7f, 0x77, - 0xbc, 0xe7, 0x8c, 0x53, 0xe5, 0x18, 0x35, 0x6e, 0xa1, 0xb5, 0x71, 0x83, - 0x92, 0xde, 0x62, 0x77, 0xb8, 0x4d, 0x6e, 0xc3, 0x86, 0xc6, 0x02, 0x7f, - 0x8b, 0x58, 0xd7, 0xf2, 0x1c, 0x56, 0x5f, 0xc6, 0xad, 0x63, 0xb0, 0x67, - 0x5a, 0x71, 0x5e, 0x14, 0x67, 0xe8, 0x41, 0xff, 0x66, 0x90, 0x60, 0xc8, - 0x59, 0xa8, 0x53, 0xa3, 0xcd, 0x94, 0x2c, 0x5f, 0x12, 0xa8, 0x9a, 0xfa, - 0xda, 0xb8, 0x81, 0x07, 0xb2, 0x2a, 0x3d, 0xb8, 0xca, 0x4c, 0xa1, 0x58, - 0x9c, 0x2f, 0x95, 0x95, 0x28, 0xdd, 0x5f, 0xbe, 0x32, 0x9d, 0x8f, 0xdf, - 0x1a, 0xbf, 0x45, 0x17, 0x98, 0xaf, 0xec, 0x9d, 0x4c, 0x4f, 0xf7, 0x77, - 0x7b, 0xbc, 0xc4, 0xfa, 0x60, 0xb5, 0xb8, 0x98, 0x52, 0x25, 0x16, 0x05, - 0x31, 0x3c, 0x17, 0xfe, 0x1b, 0x48, 0x04, 0xf4, 0x40, 0x3f, 0x45, 0x63, - 0x5a, 0x61, 0x6f, 0x9a, 0x40, 0x29, 0x23, 0xfc, 0xd2, 0xf7, 0x99, 0x41, - 0xf5, 0x40, 0x0c, 0xf8, 0xea, 0x96, 0xc8, 0xc8, 0x12, 0xfc, 0x01, 0xc4, - 0x23, 0xec, 0xa7, 0x0c, 0x62, 0x62, 0x6c, 0x48, 0x6e, 0xa5, 0x48, 0xd9, - 0xe3, 0xaa, 0x1e, 0xea, 0x1d, 0x94, 0x83, 0xbc, 0xac, 0x2e, 0xe1, 0xc7, - 0x55, 0xa1, 0x62, 0xef, 0x73, 0x50, 0x55, 0x37, 0x68, 0x7e, 0x32, 0xc2, - 0x9a, 0x89, 0x5c, 0x2d, 0x08, 0x7f, 0x32, 0x96, 0x69, 0x79, 0xc6, 0x38, - 0x8f, 0x33, 0x58, 0xe7, 0x7f, 0x92, 0xaf, 0xaf, 0x3e, 0x9e, 0x62, 0xc0, - 0x4c, 0x06, 0xa2, 0x18, 0xcd, 0x22, 0x4c, 0x28, 0x1a, 0xed, 0x99, 0x31, - 0x0b, 0x95, 0xcd, 0xf1, 0x72, 0x69, 0x9a, 0x1d, 0x9b, 0x16, 0x46, 0x14, - 0x6f, 0x39, 0xd9, 0xac, 0x4b, 0xd0, 0x85, 0x05, 0x4c, 0x60, 0x37, 0x14, - 0xd5, 0x5b, 0x63, 0xb8, 0xd0, 0xac, 0xfc, 0xbc, 0x91, 0x4e, 0xd9, 0xdc, - 0x3f, 0xc5, 0x44, 0xc7, 0x69, 0x2e, 0xa4, 0xc9, 0xd8, 0xe4, 0x54, 0xe5, - 0xa4, 0xf7, 0xf9, 0x74, 0x75, 0x49, 0x25, 0x51, 0xea, 0xfc, 0xe1, 0xc3, - 0x1a, 0x66, 0xc9, 0x72, 0xf9, 0xf9, 0xcf, 0x59, 0xb6, 0x79, 0x44, 0xc0, - 0xa2, 0xb2, 0xb7, 0xda, 0x82, 0xbd, 0x91, 0x3d, 0x68, 0x85, 0xa3, 0x63, - 0x1d, 0x2c, 0x1c, 0xb3, 0x15, 0xc7, 0x07, 0x63, 0xc7, 0x53, 0xbb, 0x35, - 0x67, 0x1a, 0x43, 0x80, 0xa4, 0xae, 0x63, 0x2e, 0x3d, 0x21, 0x35, 0xb4, - 0xf4, 0x6c, 0xbd, 0xec, 0x04, 0x5a, 0x0d, 0x43, 0x83, 0x69, 0x52, 0x26, - 0x6b, 0x15, 0x6c, 0xfa, 0x7a, 0x05, 0x01, 0x9a, 0xac, 0x21, 0x02, 0x0c, - 0x9f, 0x3f, 0xc0, 0x1e, 0x4b, 0xbe, 0x3f, 0xb9, 0xcc, 0xa1, 0xb3, 0xd2, - 0x04, 0x24, 0xe0, 0x40, 0xf1, 0xc5, 0xcf, 0xc0, 0xbb, 0x12, 0x55, 0xfb, - 0x03, 0x55, 0x7b, 0x01, 0xcd, 0xaa, 0x83, 0x86, 0x24, 0xb6, 0xea, 0x60, - 0x9a, 0xb4, 0xd1, 0xd9, 0x86, 0xee, 0x71, 0xe1, 0xf8, 0x3b, 0x61, 0xd7, - 0x8f, 0xae, 0xf9, 0x3f, 0x70, 0x44, 0x42, 0x90, 0x9b, 0xb4, 0xaf, 0x55, - 0x7f, 0x02, 0xce, 0xaa, 0x8e, 0x9b, 0xfa, 0x63, 0x5f, 0x83, 0x8e, 0x4e, - 0xf3, 0xf9, 0xe5, 0x62, 0xb5, 0x86, 0xaf, 0xdc, 0x9d, 0xa1, 0xf4, 0xb0, - 0x83, 0x81, 0x47, 0x15, 0x75, 0x14, 0x14, 0xab, 0x06, 0xd5, 0x13, 0xc8, - 0xd8, 0x86, 0x32, 0xf5, 0x4a, 0x2b, 0x9d, 0xb3, 0x62, 0x82, 0x40, 0x72, - 0x4a, 0x46, 0x9f, 0x59, 0xd4, 0x53, 0x0f, 0x6d, 0x3f, 0xd5, 0xf5, 0x0c, - 0x66, 0xf3, 0x78, 0xfe, 0x22, 0x7a, 0xcc, 0x9b, 0x6f, 0x5a, 0x38, 0x2f, - 0xd6, 0x77, 0x2c, 0xee, 0xf5, 0x91, 0xda, 0xf9, 0xdd, 0xeb, 0xf9, 0x91, - 0x4c, 0x77, 0x4d, 0x6f, 0x42, 0xe3, 0x36, 0x55, 0xc2, 0x5e, 0x47, 0x1c, - 0x78, 0xa5, 0x4d, 0xa3, 0x55, 0xb4, 0xb8, 0x1f, 0x43, 0xff, 0xba, 0x17, - 0x89, 0x0f, 0x87, 0xf7, 0x2a, 0xf1, 0x17, 0x15, 0x9e, 0xea, 0x9a, 0x4d, - 0x23, 0xed, 0xbb, 0x87, 0x09, 0x0f, 0x70, 0x1e, 0x46, 0x62, 0xdd, 0x22, - 0xde, 0x46, 0xb5, 0x1d, 0x2d, 0x49, 0xa2, 0xdb, 0xee, 0x23, 0x82, 0x5e, - 0xaf, 0x22, 0x1b, 0xed, 0x36, 0xc2, 0x13, 0x06, 0x8c, 0x22, 0xd5, 0x8c, - 0xae, 0xcf, 0xbf, 0x24, 0x26, 0x96, 0xcb, 0xb6, 0x06, 0xc4, 0x2e, 0x14, - 0xaa, 0xa4, 0xf8, 0xb9, 0x89, 0x49, 0x0e, 0x4f, 0xa7, 0x8b, 0x65, 0xc6, - 0xb6, 0xef, 0x41, 0xd9, 0x12, 0xc3, 0x26, 0xcb, 0x0e, 0xc3, 0x26, 0xbb, - 0xf5, 0x63, 0x2b, 0xe0, 0x5f, 0xe6, 0xcb, 0xc0, 0x58, 0xda, 0xb8, 0x95, - 0x0a, 0x3b, 0x60, 0x7b, 0xf0, 0xd6, 0xfd, 0x38, 0x60, 0x7b, 0xf0, 0xd6, - 0xdd, 0x39, 0x60, 0xb3, 0xbc, 0xa8, 0x90, 0x33, 0x36, 0x90, 0x4c, 0x01, - 0x92, 0xd1, 0xa7, 0xd6, 0xef, 0xcf, 0xb3, 0x95, 0x98, 0x54, 0x59, 0xa4, - 0x8b, 0x82, 0x56, 0x60, 0x03, 0x0a, 0x0c, 0x40, 0x26, 0xc3, 0x24, 0x75, - 0x39, 0xfd, 0x42, 0x6a, 0xfe, 0x6b, 0x96, 0xfb, 0x5a, 0x83, 0x67, 0x04, - 0xd7, 0x03, 0xbf, 0xab, 0xe3, 0x55, 0x3b, 0x51, 0x69, 0xee, 0x16, 0x8f, - 0x83, 0xd6, 0x07, 0x1d, 0x57, 0xd8, 0xd1, 0xeb, 0xc5, 0xd4, 0xff, 0x44, - 0xfe, 0x4a, 0xa9, 0xaf, 0x19, 0x4e, 0x34, 0x06, 0xb4, 0xe8, 0xdd, 0xc5, - 0xb2, 0x5a, 0x0c, 0x5c, 0xbc, 0x52, 0x91, 0x5a, 0xdc, 0x62, 0x94, 0x88, - 0xeb, 0x25, 0x92, 0x6e, 0xa7, 0x89, 0x27, 0x42, 0x05, 0x6d, 0x05, 0x06, - 0x21, 0xbc, 0xd6, 0x92, 0x44, 0xbc, 0x16, 0x03, 0x71, 0xa1, 0xc6, 0x31, - 0x05, 0x74, 0x55, 0xe5, 0xaf, 0x31, 0x4a, 0x81, 0x71, 0x9b, 0x1f, 0x8a, - 0x0a, 0xc5, 0xcd, 0x2f, 0x37, 0x51, 0x63, 0x54, 0x80, 0x76, 0xa8, 0x8f, - 0x24, 0xea, 0xa4, 0x3d, 0xea, 0xef, 0x12, 0x75, 0x4f, 0x43, 0xbd, 0xbd, - 0xd7, 0x1e, 0x48, 0xab, 0x84, 0xb6, 0x5d, 0x50, 0x6c, 0x84, 0x1a, 0x3b, - 0xa1, 0xed, 0xf0, 0x86, 0x42, 0x76, 0x55, 0xfd, 0xcd, 0xdb, 0x27, 0xbd, - 0x95, 0xfe, 0x6c, 0x7d, 0x96, 0xd0, 0x8c, 0x58, 0x84, 0x6a, 0x41, 0xb9, - 0x7a, 0x2d, 0x28, 0xc1, 0x5b, 0x15, 0xca, 0xd1, 0x2b, 0xa3, 0x9c, 0x44, - 0xd1, 0x67, 0xdb, 0x2a, 0xe1, 0xd2, 0xc1, 0x9d, 0x13, 0xcb, 0xfc, 0xe6, - 0x11, 0x59, 0xc4, 0xbe, 0x77, 0xa8, 0xcd, 0x21, 0xdb, 0xbc, 0x6f, 0x26, - 0xce, 0x5a, 0x2e, 0x88, 0x82, 0xe3, 0x0a, 0xfc, 0x35, 0x2f, 0x36, 0x3b, - 0x8d, 0x2c, 0x51, 0xa3, 0x8b, 0x1a, 0xc5, 0x5a, 0x57, 0xc8, 0x9a, 0xf3, - 0xbb, 0x94, 0xdd, 0xeb, 0xe2, 0x22, 0x4c, 0x96, 0x4b, 0xab, 0xa6, 0x51, - 0xf2, 0xa6, 0xbf, 0x85, 0x20, 0x3d, 0x06, 0x7f, 0xac, 0x79, 0x19, 0x1b, - 0x39, 0x6e, 0xc6, 0x02, 0xba, 0x2c, 0x5f, 0x83, 0x08, 0x77, 0x91, 0x11, - 0x7d, 0xb4, 0x72, 0xb2, 0x11, 0x15, 0x6f, 0x81, 0x35, 0x1b, 0xc9, 0x4b, - 0xd2, 0xe4, 0xeb, 0x2e, 0xdb, 0x46, 0xda, 0x3a, 0x87, 0xa0, 0xa8, 0x71, - 0xf1, 0x14, 0x2a, 0xcc, 0x9d, 0x9d, 0xa8, 0x43, 0xd1, 0x2d, 0x1a, 0xaa, - 0xb7, 0xd4, 0x25, 0xaf, 0x8c, 0x3b, 0x85, 0x4d, 0xb6, 0x82, 0xde, 0xea, - 0x5e, 0x3b, 0x99, 0x55, 0x80, 0xf2, 0x81, 0x5d, 0xf8, 0xb7, 0x4d, 0x18, - 0x07, 0xbc, 0x03, 0x15, 0x11, 0x79, 0xc8, 0xb7, 0x57, 0x41, 0x4e, 0x4b, - 0x1a, 0x3d, 0xd4, 0x03, 0x9f, 0x99, 0xe3, 0xec, 0x54, 0x77, 0x74, 0xa5, - 0xa0, 0x22, 0xc2, 0x3b, 0x5c, 0x15, 0xe3, 0xb7, 0x47, 0xe3, 0xd3, 0xeb, - 0x67, 0x61, 0xa2, 0x16, 0xcc, 0xa1, 0x89, 0x17, 0x57, 0x0c, 0x3d, 0x15, - 0x89, 0x0f, 0x3b, 0xa0, 0x87, 0x58, 0x64, 0xfc, 0xc0, 0xc5, 0x8a, 0x0c, - 0x5e, 0x2f, 0x5c, 0x2a, 0x91, 0xf3, 0x1f, 0x07, 0xce, 0x8d, 0xfa, 0xc8, - 0x54, 0x9b, 0x37, 0x3c, 0x9e, 0xfa, 0x70, 0x58, 0xcb, 0xe8, 0x4a, 0x39, - 0xf1, 0x3a, 0x2d, 0x42, 0x0d, 0xb5, 0xa3, 0x33, 0xe0, 0x70, 0x15, 0xdd, - 0xa0, 0xa2, 0x31, 0x05, 0x34, 0x57, 0x94, 0x2e, 0xe5, 0xdb, 0xd5, 0xb1, - 0x72, 0x8f, 0xcf, 0x04, 0x30, 0x04, 0x7d, 0x23, 0x46, 0x6e, 0x60, 0x8c, - 0x22, 0x30, 0xce, 0x0c, 0x8c, 0x71, 0x04, 0xc6, 0xcc, 0xc0, 0x98, 0x44, - 0x60, 0xc0, 0x93, 0x43, 0x61, 0xd4, 0xfe, 0x74, 0xfd, 0x69, 0x76, 0x9d, - 0x1e, 0xe9, 0x75, 0x1a, 0x18, 0xfc, 0x0e, 0x0c, 0x5e, 0x06, 0x46, 0x39, - 0xc7, 0xfd, 0xe6, 0x92, 0xae, 0xc6, 0x06, 0x73, 0x7b, 0x11, 0xcc, 0xe5, - 0x26, 0xca, 0x7e, 0x04, 0xca, 0x99, 0x89, 0xf2, 0x20, 0x02, 0x65, 0x66, - 0xa2, 0xbc, 0x15, 0x81, 0x02, 0x52, 0x1b, 0x07, 0xc4, 0xb6, 0x67, 0x88, - 0x66, 0xdf, 0xf8, 0xf5, 0x00, 0x7f, 0x71, 0x41, 0x71, 0x62, 0x9b, 0x18, - 0xdc, 0xbd, 0x1d, 0xc1, 0x5d, 0x6e, 0xa2, 0xbc, 0x13, 0x81, 0x72, 0x66, - 0xa2, 0x8c, 0x62, 0x14, 0x7a, 0x66, 0xe1, 0xc4, 0xa8, 0x34, 0x08, 0x6e, - 0x12, 0x10, 0xdc, 0xdb, 0x86, 0x70, 0xde, 0x31, 0xb5, 0xcf, 0x52, 0xc6, - 0x11, 0x88, 0xee, 0x2e, 0x06, 0x94, 0x50, 0x48, 0xe8, 0xe0, 0x08, 0x10, - 0x76, 0x5e, 0xb7, 0x9d, 0x07, 0x18, 0x0a, 0x3a, 0xac, 0x23, 0xb9, 0x07, - 0x90, 0xc2, 0x4e, 0xea, 0x40, 0xee, 0x21, 0x9c, 0xb0, 0x63, 0x3a, 0x50, - 0x23, 0x40, 0x6a, 0x11, 0x7d, 0x2b, 0x20, 0x98, 0x71, 0x27, 0xc1, 0x8c, - 0x3b, 0x49, 0x66, 0xdc, 0x45, 0x34, 0xe3, 0x4e, 0xb2, 0x19, 0xb7, 0x12, - 0x4e, 0x40, 0x36, 0x93, 0x4e, 0xb2, 0x99, 0x74, 0x92, 0xcd, 0xa4, 0x8b, - 0x6c, 0x10, 0xa9, 0xb5, 0x68, 0x26, 0xf1, 0xa2, 0xb9, 0xf5, 0x2e, 0x00, - 0x45, 0x28, 0xb3, 0x56, 0x0b, 0xc0, 0x9a, 0x70, 0x5f, 0xcf, 0x1d, 0x07, - 0x6c, 0x76, 0xc4, 0xaf, 0x18, 0x2f, 0x71, 0x41, 0xb7, 0x70, 0x11, 0x2b, - 0x86, 0x9a, 0x80, 0x61, 0xcf, 0x9b, 0x43, 0x86, 0x45, 0xb9, 0x6f, 0x0b, - 0xba, 0x6b, 0x8b, 0xe6, 0x6f, 0xb3, 0xce, 0x1b, 0xf9, 0xf3, 0x44, 0x1d, - 0x6b, 0xe4, 0x0f, 0x60, 0x42, 0xfc, 0x41, 0x56, 0x3c, 0x7f, 0xfe, 0xb0, - 0x65, 0xcf, 0x9b, 0x03, 0x97, 0x45, 0x39, 0x39, 0x0b, 0x3a, 0x35, 0x8b, - 0xe6, 0x6f, 0x33, 0xf5, 0xae, 0x7c, 0x9b, 0x63, 0x9f, 0x25, 0x31, 0x7e, - 0xc7, 0x82, 0x7e, 0xc6, 0x62, 0xf8, 0xab, 0x09, 0x9e, 0xf6, 0xbc, 0x2e, - 0x7c, 0x5a, 0x12, 0xe7, 0x08, 0xcc, 0xeb, 0xfc, 0x2b, 0xaa, 0x61, 0xff, - 0xb6, 0xf0, 0x6b, 0x71, 0x06, 0x5d, 0x56, 0x3d, 0xfe, 0x86, 0x90, 0x6e, - 0x6d, 0x82, 0x87, 0xc5, 0x55, 0xe8, 0xaa, 0x45, 0x24, 0xb1, 0x24, 0x2e, - 0xd4, 0xec, 0x8b, 0x17, 0xaa, 0x1d, 0x2e, 0xc5, 0xcd, 0xb4, 0xbb, 0x15, - 0x68, 0xf3, 0x96, 0x2a, 0x1a, 0x76, 0xdc, 0x06, 0x78, 0x52, 0x07, 0x0c, - 0x9a, 0x1d, 0x35, 0x97, 0xc5, 0x87, 0xe7, 0x7b, 0x5e, 0x13, 0xa0, 0xaf, - 0xb1, 0x1f, 0x02, 0x8c, 0x57, 0x7b, 0x21, 0x3d, 0xb2, 0x17, 0x92, 0x53, - 0x8f, 0xf8, 0x5e, 0xd8, 0x2a, 0xea, 0x5f, 0xa3, 0xf6, 0x98, 0x86, 0x8f, - 0x91, 0x5e, 0xba, 0xda, 0x53, 0x17, 0x86, 0x8f, 0x91, 0xde, 0x9d, 0xda, - 0x93, 0x97, 0x86, 0x8f, 0x51, 0xfe, 0x80, 0xda, 0x53, 0x17, 0x66, 0x8f, - 0xf5, 0x5e, 0x64, 0x0e, 0x92, 0x28, 0xa5, 0xc4, 0x50, 0x38, 0xd0, 0x43, - 0x5b, 0x1d, 0xb0, 0xb5, 0x8a, 0x31, 0x9c, 0xff, 0x8f, 0x22, 0x0c, 0x33, - 0x6c, 0x70, 0x43, 0x99, 0x98, 0x7b, 0xc9, 0xe6, 0xc0, 0xed, 0x51, 0x21, - 0xee, 0xed, 0xa2, 0x64, 0x80, 0xf7, 0xaf, 0xe9, 0x5f, 0x20, 0xc9, 0x90, - 0x71, 0x71, 0xe4, 0xbd, 0xac, 0x17, 0xe4, 0x65, 0x3b, 0x5f, 0x2f, 0x8b, - 0x30, 0xa0, 0x3a, 0x14, 0x26, 0x04, 0x17, 0x4e, 0xe5, 0xcb, 0x2a, 0xe0, - 0x8d, 0xae, 0x5e, 0x6c, 0x94, 0x81, 0x8c, 0x5f, 0xd0, 0xbc, 0xa9, 0x22, - 0x3e, 0x54, 0x30, 0xb7, 0xe0, 0xa9, 0x72, 0x56, 0xb2, 0x5f, 0x79, 0x52, - 0x00, 0x51, 0x8a, 0x0f, 0x38, 0xd4, 0x1f, 0xdd, 0xb3, 0xdf, 0x36, 0xf6, - 0x4f, 0x50, 0xba, 0x5b, 0x73, 0x7e, 0x0d, 0xf9, 0x99, 0x0c, 0x73, 0x05, - 0x9d, 0xd3, 0xd7, 0x7c, 0x7c, 0xeb, 0x28, 0xee, 0xb8, 0xdb, 0x5a, 0x5d, - 0xb4, 0x3b, 0xcb, 0x6f, 0xa4, 0x56, 0x99, 0xef, 0xfb, 0x28, 0x7a, 0x9f, - 0xcc, 0xd0, 0x83, 0xda, 0xa0, 0x9e, 0x0b, 0x69, 0x85, 0x3b, 0xc2, 0x09, - 0x9f, 0xcd, 0xf8, 0x81, 0x58, 0x13, 0xf8, 0x7e, 0x2f, 0x68, 0xa6, 0x71, - 0x82, 0x06, 0x49, 0x09, 0xdd, 0xbf, 0xa8, 0xeb, 0x1d, 0xfb, 0x25, 0x8a, - 0x13, 0x45, 0x04, 0x05, 0xee, 0x5e, 0xd3, 0x7c, 0x93, 0x20, 0x10, 0x5d, - 0xcc, 0x28, 0xc0, 0x03, 0xff, 0x0d, 0x50, 0x20, 0x24, 0x89, 0x4a, 0x7a, - 0xf9, 0x10, 0x6e, 0xab, 0xa9, 0x90, 0x98, 0x87, 0x7a, 0xb5, 0x8f, 0x5f, - 0x43, 0x5c, 0xea, 0x2f, 0x8b, 0xca, 0x35, 0xf1, 0x4c, 0x2f, 0x95, 0xe0, - 0xc1, 0x8c, 0xe7, 0xce, 0xce, 0xe5, 0x98, 0x47, 0x41, 0xef, 0xeb, 0x4f, - 0x69, 0x60, 0x24, 0x7d, 0x9e, 0x80, 0xf0, 0x96, 0x82, 0x5b, 0x3b, 0x9c, - 0x8b, 0x76, 0x10, 0x22, 0x30, 0xe8, 0x4e, 0x43, 0x00, 0x01, 0xe1, 0x26, - 0x2b, 0x69, 0x98, 0x06, 0xbb, 0xa0, 0xc1, 0x98, 0xd7, 0x11, 0xb3, 0x0b, - 0x1a, 0x9d, 0xc3, 0x74, 0x46, 0xec, 0xc8, 0x2b, 0x1e, 0xe3, 0x74, 0xc5, - 0xeb, 0x58, 0x24, 0x2e, 0xdb, 0x3b, 0x95, 0x49, 0x88, 0xf5, 0x85, 0x42, - 0xe7, 0xb0, 0x55, 0xe7, 0xd6, 0xea, 0xa4, 0x81, 0x79, 0x43, 0x81, 0xcf, - 0xca, 0x38, 0xab, 0x13, 0x80, 0x33, 0x5d, 0x13, 0xb2, 0xcd, 0x06, 0xd0, - 0x08, 0x9b, 0x6c, 0x40, 0x26, 0x59, 0x6b, 0xb4, 0x98, 0x04, 0xb8, 0xe7, - 0xe8, 0x53, 0x98, 0xba, 0xc0, 0x4c, 0x46, 0x11, 0xb6, 0xb7, 0xa1, 0x70, - 0x44, 0x2e, 0xb5, 0x3d, 0x60, 0xd6, 0x0e, 0x9f, 0x50, 0x77, 0x97, 0x2f, - 0xfb, 0xba, 0xdf, 0xa6, 0x51, 0xe2, 0xdf, 0xb9, 0x59, 0xa3, 0x20, 0x1b, - 0x6d, 0xe5, 0xe2, 0x95, 0x1c, 0xbc, 0xd0, 0xd8, 0x8f, 0x8a, 0xe9, 0x74, - 0x97, 0x33, 0xb8, 0xd4, 0x5b, 0xa2, 0x22, 0x0d, 0xf0, 0x52, 0x6a, 0x0e, - 0x4d, 0x1c, 0xa1, 0x31, 0x31, 0x0c, 0x28, 0x6e, 0x27, 0x63, 0x20, 0xe9, - 0xae, 0xd6, 0x07, 0xe8, 0x6e, 0xe7, 0x5d, 0x89, 0x1d, 0x82, 0x82, 0xc7, - 0xc7, 0x27, 0x5f, 0x9f, 0x9e, 0xb6, 0x32, 0xf5, 0x66, 0x41, 0xb5, 0x12, - 0x56, 0x8d, 0xc0, 0x8c, 0x95, 0x63, 0xa3, 0xcc, 0x5c, 0xe0, 0xb0, 0xd8, - 0x08, 0xb6, 0xd1, 0x07, 0x9d, 0x23, 0x3d, 0x54, 0x64, 0x32, 0x27, 0xfa, - 0xf6, 0xe9, 0x97, 0xf1, 0x66, 0x66, 0x51, 0x01, 0xba, 0x6a, 0x64, 0x66, - 0x70, 0xdb, 0x55, 0x6c, 0xad, 0x45, 0xd7, 0x46, 0x7c, 0xae, 0x08, 0x6b, - 0xc5, 0x38, 0x6e, 0x6d, 0x3e, 0xdc, 0x2b, 0xdb, 0xb8, 0x47, 0xd2, 0x75, - 0x31, 0x46, 0xbe, 0x86, 0x4e, 0xbe, 0xa8, 0x90, 0xdb, 0xf5, 0xeb, 0x18, - 0x69, 0x57, 0x48, 0xed, 0x8e, 0xef, 0x4c, 0xb1, 0x37, 0xde, 0x3c, 0x05, - 0x45, 0x9f, 0x8d, 0x26, 0xa3, 0x3b, 0x12, 0x7e, 0xa7, 0x06, 0xe8, 0xda, - 0x08, 0xdd, 0x1b, 0xa2, 0xad, 0xea, 0xc7, 0xb5, 0x87, 0xb7, 0x4d, 0xf6, - 0x9a, 0x0f, 0x39, 0x82, 0x8f, 0xf0, 0x2e, 0x8b, 0x72, 0x7d, 0x71, 0x87, - 0x2d, 0xd3, 0x7d, 0xbd, 0x10, 0xa6, 0xa4, 0x9f, 0x09, 0xcb, 0xa4, 0xce, - 0x86, 0xde, 0x2f, 0xac, 0x45, 0x2f, 0xa2, 0x49, 0x2f, 0xa6, 0x4d, 0x5d, - 0x35, 0x8a, 0xb4, 0xaa, 0xeb, 0xcd, 0xaa, 0xbe, 0xfb, 0xf5, 0x2f, 0xa5, - 0x83, 0x35, 0x92, 0x6b, 0xf0, 0xe6, 0xe8, 0xf5, 0x02, 0xb1, 0xcb, 0x66, - 0x40, 0x60, 0x06, 0x77, 0x03, 0x2e, 0xa3, 0x2c, 0xbc, 0x0e, 0x7c, 0x02, - 0x5e, 0xb7, 0x4d, 0x1d, 0x21, 0xb6, 0xe5, 0x52, 0xd3, 0x4a, 0xe6, 0xb0, - 0x4d, 0xec, 0xea, 0x9d, 0x9d, 0xee, 0xf1, 0xa9, 0x1b, 0xad, 0xdd, 0xdd, - 0x7a, 0x84, 0x4d, 0xbe, 0xb3, 0x92, 0x2a, 0x43, 0xc8, 0xcf, 0x00, 0x19, - 0x0b, 0xea, 0xe0, 0x5d, 0x28, 0x51, 0x07, 0x75, 0x56, 0xd4, 0x57, 0xd5, - 0x73, 0x98, 0x28, 0x88, 0x7a, 0x96, 0xc1, 0x4e, 0xa2, 0xc0, 0xd7, 0xe6, - 0x67, 0x59, 0x5e, 0x95, 0x0c, 0x45, 0xfb, 0xc3, 0x99, 0xee, 0x73, 0xdf, - 0xf1, 0x3f, 0xd4, 0x94, 0x14, 0x82, 0x8b, 0x64, 0x58, 0xd0, 0x7d, 0x0c, - 0x03, 0x26, 0x9e, 0x17, 0xcf, 0x09, 0xb8, 0x30, 0x17, 0xd0, 0x02, 0x9f, - 0xea, 0x20, 0x16, 0xc5, 0x0a, 0xd9, 0xe5, 0x65, 0x57, 0x5f, 0x53, 0x86, - 0xa9, 0x94, 0xbf, 0xd6, 0x11, 0x19, 0xc7, 0x11, 0xc1, 0x79, 0xb9, 0x8e, - 0xcc, 0x24, 0x8e, 0x8c, 0x9a, 0x46, 0xc2, 0x84, 0xf6, 0xbc, 0x1b, 0xb2, - 0xc6, 0x13, 0xdc, 0xca, 0x34, 0x82, 0xac, 0x5e, 0x65, 0x91, 0xa4, 0x62, - 0x96, 0x82, 0x51, 0x17, 0xc3, 0x0d, 0xbc, 0x85, 0xf7, 0x3e, 0xe0, 0xf1, - 0x1b, 0x58, 0x2f, 0x2a, 0x3f, 0xeb, 0xf4, 0xe0, 0xbf, 0x56, 0xe1, 0x33, - 0x98, 0x8f, 0x08, 0x4d, 0x05, 0x02, 0x3f, 0xfa, 0xb1, 0x57, 0x55, 0xc8, - 0x2b, 0x58, 0x08, 0xbf, 0x53, 0xd3, 0xaf, 0x13, 0x07, 0xc6, 0x0b, 0x1e, - 0xe3, 0xd7, 0x99, 0xf1, 0x6b, 0x76, 0xdc, 0xd7, 0x4e, 0xd7, 0xa2, 0xdf, - 0x55, 0x31, 0x0f, 0x35, 0x4c, 0x8c, 0x4d, 0x2e, 0xcc, 0x9f, 0x67, 0xe6, - 0xcf, 0xd9, 0x38, 0x96, 0x91, 0x49, 0x80, 0x91, 0x3a, 0x4e, 0x26, 0x26, - 0x27, 0xe6, 0xcf, 0x33, 0xf3, 0xe7, 0x6c, 0x62, 0x70, 0x72, 0x8b, 0x9f, - 0xc2, 0x17, 0x82, 0x11, 0x42, 0xf6, 0x91, 0xf2, 0x86, 0x40, 0x36, 0x0b, - 0xd3, 0xd5, 0xaf, 0xd3, 0xba, 0xa5, 0xcb, 0x96, 0x1e, 0xa7, 0x57, 0x40, - 0x93, 0x0f, 0x2d, 0x69, 0xf0, 0x80, 0x1e, 0x42, 0x01, 0x5b, 0x64, 0x20, - 0xee, 0x23, 0x91, 0x96, 0x6e, 0x8d, 0xe7, 0x04, 0x67, 0xd8, 0xbc, 0x5f, - 0x6c, 0xd6, 0x2b, 0x20, 0x2c, 0xea, 0x79, 0x52, 0x89, 0x23, 0xcf, 0xca, - 0xcb, 0x7c, 0x95, 0xa4, 0xbd, 0x5d, 0x14, 0x84, 0x18, 0xcc, 0x20, 0x7b, - 0xbb, 0x5c, 0x7f, 0x23, 0xa2, 0xc9, 0x83, 0x9b, 0x4e, 0x58, 0xb1, 0x51, - 0xd0, 0xee, 0xe1, 0x18, 0xd3, 0xbf, 0xdd, 0x6c, 0xe0, 0xb2, 0x67, 0x5a, - 0x64, 0xa9, 0x33, 0xfc, 0xb2, 0x20, 0xe1, 0x8b, 0x53, 0x04, 0xf3, 0xa0, - 0x40, 0xe0, 0xc6, 0xae, 0x0f, 0xa5, 0x7a, 0x32, 0x46, 0xa1, 0x8c, 0x71, - 0x28, 0x43, 0x36, 0xc0, 0x6d, 0x28, 0x3c, 0xf3, 0x3a, 0x17, 0x6e, 0xbd, - 0x8c, 0x6e, 0xf3, 0xb2, 0xe7, 0x98, 0x17, 0x00, 0x8c, 0xe0, 0xe8, 0xb2, - 0x55, 0x09, 0x79, 0x7b, 0x93, 0xd3, 0xe7, 0xe3, 0xec, 0x74, 0x7a, 0xb9, - 0x2c, 0x49, 0x02, 0x4c, 0x4d, 0x80, 0x70, 0x3c, 0x85, 0x72, 0x7d, 0x79, - 0x72, 0x7e, 0xb1, 0xfe, 0x35, 0xe3, 0xc1, 0x4a, 0xd1, 0x25, 0x47, 0x6c, - 0x12, 0x7e, 0x9a, 0x43, 0xdb, 0xf1, 0x90, 0x25, 0x62, 0x9e, 0xdb, 0xab, - 0xec, 0xeb, 0x87, 0xc9, 0xe7, 0xd3, 0xf2, 0x7c, 0x9b, 0x16, 0xcc, 0xa9, - 0x8e, 0xf9, 0x14, 0x4b, 0xa1, 0xdb, 0xcf, 0xed, 0x0d, 0xac, 0x73, 0x7f, - 0x48, 0x86, 0x40, 0x7d, 0x1b, 0xc6, 0x7d, 0x18, 0x2a, 0x3e, 0xcb, 0x4e, - 0xcb, 0xfe, 0xc0, 0xa4, 0x74, 0x13, 0x4b, 0xe9, 0x47, 0xa6, 0x84, 0x79, - 0x9b, 0xbe, 0x36, 0xaa, 0x2a, 0x55, 0x0f, 0x57, 0x9e, 0xdc, 0xf9, 0x60, - 0xc5, 0x3b, 0x54, 0x4c, 0x14, 0xf9, 0x43, 0x0c, 0xe7, 0x02, 0xf4, 0x47, - 0x3f, 0x6f, 0xdc, 0x8e, 0xec, 0x65, 0x1e, 0xbb, 0x08, 0xf5, 0xb4, 0x27, - 0x17, 0x50, 0xc7, 0xc7, 0xd0, 0xfe, 0x29, 0xf0, 0xb5, 0x7d, 0x3d, 0x48, - 0xf0, 0xe3, 0x06, 0x6c, 0x6b, 0xe0, 0xbf, 0x3e, 0x19, 0xa1, 0x20, 0x21, - 0xf6, 0xa7, 0xfb, 0x4c, 0xd2, 0x60, 0x25, 0xa7, 0x04, 0xcb, 0x0f, 0x20, - 0x0d, 0x38, 0xa1, 0xf1, 0x18, 0xdc, 0xbe, 0xa0, 0xbf, 0x17, 0x33, 0x53, - 0xe0, 0x1b, 0xc1, 0x96, 0xa1, 0x34, 0x0e, 0x6e, 0x7d, 0x9c, 0x1c, 0x72, - 0xf1, 0x1e, 0xe0, 0xdc, 0x04, 0xe5, 0x87, 0xfb, 0x0e, 0xe4, 0x99, 0x0f, - 0x72, 0xe4, 0x83, 0x9c, 0xf9, 0x20, 0xc7, 0x3e, 0xc8, 0x2b, 0x0d, 0x92, - 0xd7, 0x13, 0xfc, 0x2c, 0xd4, 0xe4, 0xc8, 0x7a, 0xfd, 0xe9, 0x32, 0xc1, - 0x8f, 0x3c, 0xdd, 0x62, 0xdd, 0xd7, 0x37, 0xee, 0xd5, 0x6d, 0xff, 0x8e, - 0xe3, 0x50, 0xeb, 0x53, 0xaf, 0x1b, 0x55, 0xc4, 0x18, 0x4b, 0xa4, 0x6a, - 0x19, 0x1a, 0xaf, 0xd4, 0x8d, 0xcc, 0x11, 0xbf, 0x46, 0x7b, 0xf1, 0xdd, - 0x41, 0x02, 0xff, 0xc9, 0x31, 0xfb, 0x6a, 0x31, 0x2f, 0xcf, 0xab, 0x5f, - 0xe7, 0x19, 0x4e, 0xfa, 0xda, 0x2c, 0xa2, 0x68, 0xc7, 0xc4, 0x6c, 0xd1, - 0x4b, 0x25, 0x36, 0x29, 0x3d, 0x0d, 0x9e, 0xb4, 0x12, 0xd0, 0xf7, 0x38, - 0xb3, 0xa4, 0x5a, 0x89, 0x55, 0xa1, 0x3b, 0x6f, 0xbc, 0x21, 0x41, 0xdf, - 0x48, 0x1e, 0x03, 0x64, 0x21, 0x7b, 0x10, 0x4e, 0x09, 0x2a, 0x63, 0x87, - 0x65, 0xa3, 0x51, 0x33, 0x86, 0xcf, 0x93, 0x0c, 0xea, 0x9f, 0xff, 0x90, - 0x1c, 0x1a, 0x35, 0x4e, 0x76, 0x60, 0xc9, 0x68, 0x03, 0xfd, 0x08, 0x40, - 0x86, 0x20, 0x14, 0x94, 0x6b, 0xb4, 0x25, 0xa9, 0x0e, 0x14, 0x66, 0x94, - 0x3c, 0xb1, 0x24, 0x32, 0xe2, 0xfd, 0x1a, 0x6e, 0xb0, 0x2f, 0x0b, 0x97, - 0xa5, 0xbd, 0xed, 0x7d, 0x0d, 0x14, 0xae, 0xb0, 0x35, 0xd0, 0xd4, 0x80, - 0x1d, 0x82, 0xb1, 0x76, 0xdf, 0x64, 0x8f, 0xc0, 0x93, 0xd9, 0x3a, 0x07, - 0x8d, 0xc3, 0x44, 0x6e, 0xfa, 0x59, 0x76, 0xb6, 0x58, 0x7d, 0x05, 0xc3, - 0x56, 0xda, 0xb7, 0xc1, 0x45, 0xdb, 0x99, 0xe0, 0xd3, 0xfc, 0xc4, 0xad, - 0x9f, 0xce, 0x0d, 0xe9, 0xcf, 0x18, 0x9a, 0x85, 0x86, 0xc2, 0xaf, 0x9e, - 0x0c, 0xc4, 0xed, 0x0a, 0x13, 0xa7, 0xb6, 0x40, 0x53, 0x3f, 0x83, 0xa9, - 0x87, 0x49, 0x0a, 0x63, 0x5e, 0x41, 0x99, 0xab, 0x64, 0x4a, 0x43, 0x28, - 0x02, 0x49, 0x26, 0x5e, 0xee, 0x9b, 0x6c, 0x2c, 0x17, 0xab, 0xec, 0x7b, - 0xaa, 0xac, 0x5a, 0x4e, 0x73, 0x9e, 0xb0, 0xad, 0xfe, 0x06, 0x0f, 0x71, - 0x20, 0xb7, 0xf7, 0xca, 0x2e, 0xfd, 0xf5, 0xbc, 0x50, 0x69, 0xdf, 0x4a, - 0x26, 0x7b, 0xde, 0x4a, 0x1c, 0x15, 0xcf, 0xa7, 0x8b, 0xe5, 0x52, 0x78, - 0xb8, 0x9a, 0x65, 0xb0, 0x1b, 0x5b, 0x9c, 0x5e, 0x2e, 0x95, 0x63, 0x51, - 0x05, 0x52, 0x4e, 0x7f, 0xce, 0x56, 0x64, 0x68, 0x48, 0xaf, 0x81, 0x1e, - 0x26, 0xe7, 0x65, 0xb9, 0x79, 0x08, 0x96, 0xce, 0x25, 0x1c, 0x24, 0xc1, - 0x24, 0x9b, 0x9f, 0x2e, 0xd7, 0x57, 0x30, 0x2c, 0x5d, 0xec, 0xfc, 0x72, - 0x99, 0x15, 0x74, 0x03, 0xbd, 0x33, 0x7a, 0x7b, 0xfc, 0x60, 0xff, 0xed, - 0xdd, 0xbd, 0x9d, 0xd9, 0xe5, 0x62, 0x89, 0x0f, 0x17, 0x86, 0xd3, 0x21, - 0x91, 0x1d, 0xd2, 0xa2, 0x6a, 0xb8, 0x58, 0x0d, 0xcf, 0xcb, 0x8b, 0xe5, - 0xbe, 0x15, 0xf0, 0x0b, 0x46, 0x87, 0xa5, 0x18, 0x63, 0xe4, 0xd7, 0x77, - 0x61, 0x05, 0xf9, 0xa0, 0xfa, 0xf5, 0xa6, 0xbd, 0xb8, 0x06, 0x1c, 0xf1, - 0x50, 0xe9, 0x03, 0x89, 0x98, 0x0a, 0xc0, 0x21, 0x2c, 0x80, 0xb9, 0xa5, - 0x40, 0x63, 0x46, 0x6f, 0xdb, 0x8e, 0xce, 0x61, 0x19, 0xaa, 0x90, 0x08, - 0x27, 0x00, 0x1e, 0xd2, 0x28, 0x37, 0x17, 0xd7, 0x1b, 0x4f, 0xd7, 0x8e, - 0x0e, 0x29, 0x50, 0x5b, 0xd7, 0xcc, 0x19, 0x56, 0x61, 0xb9, 0xa9, 0x40, - 0xc2, 0x4c, 0xd5, 0x75, 0xd2, 0xca, 0x61, 0x51, 0x58, 0x19, 0x50, 0x59, - 0x5f, 0x32, 0x29, 0x30, 0x27, 0x29, 0x56, 0x43, 0x6a, 0xe3, 0xe6, 0xa2, - 0xf6, 0x54, 0xfa, 0x78, 0x5e, 0x2c, 0x53, 0x98, 0x94, 0x54, 0x5b, 0xe1, - 0x03, 0x02, 0x74, 0x2b, 0x80, 0x2f, 0x3b, 0x5e, 0xeb, 0xf7, 0x02, 0xd8, - 0x69, 0x5c, 0xa1, 0xb7, 0xac, 0xb2, 0x38, 0x98, 0xb4, 0xe9, 0xf2, 0xe5, - 0xf9, 0xa2, 0xd8, 0xae, 0xef, 0xe5, 0xb9, 0x10, 0xa6, 0x2e, 0x3f, 0x16, - 0x19, 0x50, 0xbf, 0x44, 0x38, 0x78, 0x87, 0x73, 0xf2, 0xf3, 0xd5, 0x02, - 0x7b, 0x7c, 0xcc, 0xc8, 0x01, 0x5c, 0xc6, 0x8f, 0x1c, 0x28, 0x09, 0x1c, - 0x14, 0x24, 0x3a, 0x8f, 0x86, 0x17, 0x37, 0xcf, 0xce, 0x90, 0x3b, 0x48, - 0xe6, 0x45, 0x94, 0x8c, 0x6f, 0xf7, 0x19, 0x0c, 0x15, 0xd3, 0xfc, 0x13, - 0x91, 0xad, 0x26, 0xb8, 0xd1, 0x5b, 0xf8, 0x29, 0x49, 0xeb, 0xe8, 0xf8, - 0x56, 0x44, 0x98, 0x30, 0xc1, 0x81, 0x0a, 0x02, 0xc3, 0xc5, 0x3e, 0x06, - 0x05, 0x69, 0x04, 0x85, 0x65, 0x99, 0xba, 0xc8, 0xa7, 0x81, 0x23, 0xd0, - 0xfe, 0x3a, 0x81, 0x83, 0x20, 0x94, 0x22, 0x05, 0x10, 0x5e, 0x4d, 0x70, - 0xc6, 0x52, 0xd9, 0xda, 0x38, 0x2c, 0x86, 0x07, 0xca, 0xf1, 0xfd, 0x0d, - 0x94, 0x8d, 0x13, 0xb3, 0x18, 0xc6, 0xfd, 0x53, 0x33, 0xaf, 0x06, 0xd4, - 0xa0, 0xb5, 0xcc, 0x4a, 0xa9, 0x6d, 0xc1, 0xa9, 0x99, 0x60, 0x16, 0xb8, - 0x46, 0x76, 0x5a, 0x9c, 0x57, 0xce, 0xa0, 0x4d, 0x95, 0xd6, 0xf2, 0xf7, - 0x3e, 0x53, 0xa0, 0xb5, 0x22, 0x10, 0x20, 0x42, 0x6a, 0x51, 0xad, 0x8d, - 0xb6, 0x08, 0x72, 0x0d, 0xf9, 0x43, 0x81, 0x79, 0x00, 0x3f, 0xde, 0x4d, - 0xaa, 0xef, 0xe6, 0x43, 0x06, 0xc6, 0xb8, 0xd1, 0x31, 0x6e, 0x34, 0x8c, - 0x1b, 0x0b, 0x43, 0x71, 0x71, 0x94, 0xc3, 0xf2, 0xfe, 0x7c, 0x81, 0x2b, - 0xd4, 0xeb, 0x9b, 0xf1, 0x66, 0xbd, 0x9c, 0xe6, 0x29, 0xac, 0xf8, 0x6f, - 0x90, 0x53, 0x8f, 0xd9, 0x77, 0xf2, 0x9e, 0xa4, 0x18, 0x7a, 0xa7, 0x57, - 0xfc, 0xbc, 0xd8, 0x90, 0x4f, 0x5b, 0xa0, 0x72, 0xd3, 0x07, 0xf1, 0xc0, - 0x28, 0xb0, 0x58, 0x81, 0x68, 0x0a, 0x50, 0x96, 0x69, 0x09, 0xf3, 0x2b, - 0xcd, 0xbe, 0xc5, 0x62, 0x0e, 0x9f, 0xa7, 0xda, 0x3c, 0xeb, 0x75, 0xaf, - 0x04, 0x4b, 0xbb, 0x4b, 0xcf, 0x4b, 0x30, 0xb7, 0x1a, 0xf3, 0x0c, 0x4c, - 0x67, 0x91, 0xb5, 0x31, 0x7c, 0x4b, 0xa1, 0x42, 0x0e, 0xff, 0x74, 0x36, - 0xb8, 0x38, 0xbb, 0x14, 0xe5, 0x53, 0xc1, 0x34, 0x9a, 0xe0, 0x9b, 0x3d, - 0x3a, 0x89, 0x15, 0xec, 0x2c, 0x8a, 0x64, 0xb3, 0xb8, 0xce, 0x96, 0x90, - 0x46, 0x30, 0xd4, 0x3c, 0xa2, 0xad, 0xc8, 0x5d, 0xca, 0xb6, 0x5b, 0x76, - 0xbe, 0xbe, 0xfa, 0x4c, 0xbc, 0x74, 0x3d, 0xd4, 0x9a, 0xfa, 0xc0, 0x05, - 0x9c, 0xce, 0x7f, 0x82, 0x13, 0xba, 0x6c, 0xfe, 0x03, 0x0a, 0x1b, 0xc6, - 0x5f, 0x09, 0x28, 0x17, 0x71, 0x30, 0x4f, 0x43, 0x8b, 0x8b, 0x69, 0xfc, - 0x68, 0xb8, 0x4f, 0x1e, 0x2c, 0x8f, 0xd1, 0x7f, 0xc8, 0xd1, 0x2e, 0x8e, - 0xd3, 0xf0, 0x3d, 0x05, 0x86, 0x74, 0x89, 0x02, 0xc7, 0x5e, 0x1e, 0xfb, - 0xe1, 0xa2, 0x71, 0x2d, 0x79, 0xe3, 0x2f, 0xfa, 0xe6, 0x9e, 0x8a, 0x26, - 0x71, 0xf2, 0x8a, 0x09, 0x8b, 0xcc, 0xe0, 0xac, 0x5c, 0x8a, 0x39, 0xcf, - 0x7e, 0xb9, 0x5c, 0xe4, 0x40, 0x70, 0x2f, 0x29, 0x96, 0xeb, 0xb2, 0x50, - 0x72, 0x67, 0x92, 0x2e, 0x45, 0x6a, 0x2e, 0x5a, 0x4b, 0x28, 0x81, 0x42, - 0x8d, 0x52, 0xae, 0xe2, 0x1b, 0xdc, 0x24, 0x7d, 0x5c, 0x65, 0x30, 0x07, - 0x07, 0x3e, 0xdd, 0x39, 0xa7, 0x5d, 0x13, 0xe8, 0x8d, 0xa7, 0xc9, 0x8a, - 0x29, 0x9c, 0xd0, 0x4c, 0xa5, 0xdb, 0xaa, 0x3c, 0xd9, 0x09, 0x37, 0xae, - 0xda, 0x7d, 0x8d, 0xb6, 0x77, 0xbd, 0xa5, 0x1c, 0xc1, 0x26, 0x69, 0x20, - 0xb6, 0x78, 0x03, 0xda, 0xcc, 0xd1, 0xee, 0xb5, 0xf8, 0x75, 0x0c, 0x9b, - 0xe6, 0x14, 0x58, 0x18, 0x68, 0x65, 0x0d, 0x04, 0xb5, 0xbe, 0x4f, 0x87, - 0x96, 0x9b, 0xf3, 0x29, 0x2a, 0xda, 0xfe, 0xbe, 0x5d, 0x0c, 0xc9, 0xec, - 0x88, 0x84, 0x83, 0xb4, 0xa1, 0xbc, 0x83, 0x50, 0x3e, 0xc8, 0x6b, 0x04, - 0x30, 0x82, 0x9d, 0x3a, 0xa8, 0x31, 0x40, 0x11, 0xb7, 0x75, 0x40, 0x13, - 0x00, 0x12, 0x8c, 0x85, 0x8e, 0x97, 0xcd, 0x39, 0x7e, 0x73, 0xa9, 0x1d, - 0x31, 0x90, 0x06, 0xd1, 0xcc, 0xb8, 0x6b, 0x9d, 0xe8, 0x9a, 0x03, 0x92, - 0x39, 0x42, 0x43, 0x81, 0x34, 0x57, 0x17, 0xbf, 0xe4, 0x65, 0x7a, 0x0d, - 0x6d, 0x8c, 0x7c, 0xdc, 0xc0, 0xe7, 0x8d, 0x3e, 0xc4, 0xc2, 0x38, 0xa0, - 0x00, 0xa1, 0xa8, 0xd5, 0x38, 0x85, 0x43, 0x8c, 0x6b, 0x02, 0xe0, 0xc3, - 0x37, 0x35, 0x00, 0x5a, 0x65, 0xab, 0xa1, 0x04, 0x3e, 0x75, 0xcf, 0xa7, - 0xf0, 0x13, 0xd4, 0x0f, 0x3a, 0xc9, 0x9f, 0x7f, 0x0c, 0x92, 0x3f, 0xff, - 0x38, 0x86, 0x04, 0xd8, 0x2f, 0xab, 0x6c, 0x45, 0x13, 0x10, 0x41, 0xb0, - 0x04, 0x08, 0xf5, 0x82, 0xf5, 0x31, 0xc3, 0x71, 0xc1, 0x29, 0xd2, 0x06, - 0xae, 0xe5, 0x9a, 0x03, 0xb7, 0x4d, 0xa9, 0xb6, 0x06, 0x21, 0xcd, 0x05, - 0x54, 0x8b, 0xaf, 0x7a, 0x8d, 0x31, 0x84, 0x74, 0x72, 0x0e, 0xfd, 0x19, - 0x74, 0x45, 0x64, 0x01, 0x35, 0x06, 0xd7, 0x64, 0x04, 0x84, 0x46, 0x00, - 0x03, 0x1f, 0xc0, 0x00, 0x14, 0xc7, 0x39, 0xd0, 0xc5, 0x24, 0x0d, 0xc0, - 0x4d, 0x47, 0xc9, 0x50, 0x4a, 0x72, 0x56, 0xa4, 0x29, 0x61, 0xbd, 0x86, - 0x8b, 0xf8, 0x21, 0xac, 0xf8, 0x75, 0x99, 0xe7, 0x23, 0xd0, 0x72, 0xf8, - 0x7f, 0x36, 0x32, 0x4e, 0x00, 0x09, 0xe1, 0x3d, 0xd8, 0x38, 0x80, 0x89, - 0x00, 0x95, 0xe9, 0x3a, 0xf3, 0x4b, 0x8f, 0x18, 0x17, 0x35, 0xea, 0x48, - 0x14, 0x0e, 0x4d, 0x06, 0xba, 0x71, 0x6c, 0xee, 0xd7, 0x0d, 0x9a, 0x23, - 0x9d, 0xe6, 0xb8, 0x9e, 0x26, 0xd0, 0x92, 0x64, 0xeb, 0x69, 0x8e, 0x75, - 0x9a, 0x93, 0x7a, 0x9a, 0xbb, 0x4c, 0xf3, 0xba, 0x8e, 0xe6, 0x44, 0xa7, - 0xb9, 0xd7, 0x48, 0xb3, 0x62, 0xb5, 0x8e, 0xe6, 0x9e, 0x4e, 0x73, 0xbf, - 0xb1, 0xee, 0xbb, 0x31, 0x34, 0xf7, 0x75, 0x9a, 0x0f, 0xe2, 0xda, 0x68, - 0x97, 0xeb, 0x4e, 0x9d, 0x9e, 0x15, 0xe2, 0xa2, 0xd2, 0xc0, 0xa1, 0x2c, - 0x9b, 0xa0, 0x78, 0xf9, 0x71, 0x06, 0xc4, 0x88, 0x16, 0x39, 0x02, 0xba, - 0x80, 0x04, 0xf9, 0x39, 0xa3, 0xcf, 0x63, 0x6d, 0xd5, 0xa9, 0xec, 0x24, - 0xf2, 0xc1, 0xd9, 0x60, 0x46, 0x54, 0x95, 0x03, 0x1f, 0x10, 0xd8, 0x48, - 0x4d, 0x59, 0x30, 0x36, 0x1e, 0x9b, 0x7d, 0x1c, 0x52, 0x40, 0x87, 0xa1, - 0x2c, 0xf1, 0xe5, 0x4c, 0x7e, 0x81, 0x72, 0x9d, 0x83, 0xf1, 0x12, 0x7a, - 0x6a, 0xb1, 0x84, 0x39, 0x2e, 0x45, 0xef, 0x8d, 0xfa, 0x39, 0x16, 0x25, - 0x6c, 0xe3, 0x3f, 0x4f, 0xd5, 0x21, 0x13, 0xb5, 0x28, 0x25, 0xd3, 0x7c, - 0xb5, 0x58, 0x55, 0xfe, 0x8a, 0xb6, 0x4d, 0x07, 0xe6, 0x0c, 0x14, 0xf6, - 0x92, 0x76, 0x54, 0xc1, 0x1c, 0xb3, 0x1c, 0xc3, 0x65, 0x93, 0xd6, 0x57, - 0xc9, 0xf4, 0x2e, 0x83, 0x6c, 0x7c, 0xbe, 0x79, 0xf4, 0xf5, 0x93, 0xaf, - 0x9e, 0xf6, 0xa0, 0xf4, 0x7a, 0x6f, 0xe6, 0x84, 0x7a, 0x82, 0xa1, 0xaf, - 0xd1, 0xe2, 0xaf, 0xde, 0xaf, 0x39, 0x0b, 0xc5, 0xc2, 0x3a, 0x5a, 0x40, - 0xa3, 0x07, 0x1e, 0x27, 0xa8, 0xcb, 0x1b, 0xd7, 0xa3, 0x7d, 0xef, 0xf1, - 0x97, 0x9f, 0xd3, 0x95, 0x0c, 0xa4, 0xad, 0xa7, 0xf3, 0x6c, 0x0e, 0x3b, - 0x51, 0xd5, 0x00, 0xd5, 0x5d, 0x04, 0xb7, 0x39, 0x14, 0x84, 0x2d, 0x9b, - 0x5f, 0xae, 0x92, 0x62, 0xb1, 0x3a, 0xc9, 0x12, 0x40, 0x47, 0x87, 0x6b, - 0x4b, 0xc2, 0xa5, 0x28, 0x0a, 0x39, 0x3a, 0x97, 0x93, 0xa7, 0xa8, 0x59, - 0x49, 0x06, 0x52, 0x6a, 0xdf, 0x40, 0x79, 0x6c, 0xa0, 0x10, 0xf4, 0x90, - 0x69, 0xb8, 0x9d, 0xbb, 0x03, 0x77, 0x8e, 0xa0, 0x01, 0xdb, 0xc8, 0x21, - 0x31, 0x53, 0xed, 0x24, 0x3d, 0xe1, 0xb6, 0x81, 0xb8, 0x30, 0x99, 0x57, - 0x9c, 0x98, 0xfb, 0x0e, 0xe8, 0xe3, 0x2a, 0x08, 0x9c, 0x75, 0x0c, 0xa8, - 0x72, 0xc2, 0x41, 0xa9, 0xa1, 0x1d, 0xf4, 0xe6, 0x79, 0x77, 0xa7, 0x38, - 0xc9, 0x17, 0x9b, 0xf2, 0x3d, 0x48, 0xa2, 0x9f, 0xb3, 0xf5, 0xfc, 0x06, - 0x7e, 0xbc, 0xbb, 0x83, 0x67, 0x3d, 0xf0, 0xe5, 0x2f, 0x58, 0x97, 0xe8, - 0x36, 0x48, 0x94, 0x01, 0x00 + 0x1f, 0x8b, 0x08, 0x08, 0xb6, 0xdf, 0x88, 0x5d, 0x04, 0x00, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x00, 0xe4, 0x5d, 0x5d, 0x77, + 0x1b, 0x3d, 0x11, 0xbe, 0xe7, 0x1c, 0xfe, 0xc3, 0xd6, 0x85, 0xd6, 0x06, + 0xdb, 0xf1, 0x47, 0x12, 0x52, 0xa7, 0xce, 0x4b, 0xda, 0xa6, 0xa5, 0xd0, + 0x8f, 0x97, 0xa6, 0x50, 0xa0, 0xf4, 0x84, 0xb5, 0x2d, 0xdb, 0x4b, 0xd6, + 0xbb, 0x66, 0x77, 0xdd, 0x24, 0x0d, 0xf9, 0x27, 0x9c, 0xc3, 0x0d, 0x37, + 0xfc, 0x01, 0xae, 0xb8, 0x82, 0x3f, 0xc6, 0x33, 0x23, 0x69, 0xb5, 0x9f, + 0x8e, 0x9d, 0x26, 0xe6, 0x2b, 0xef, 0x5b, 0xdb, 0x2b, 0x8d, 0x66, 0x46, + 0xa3, 0xd1, 0x68, 0x24, 0x8d, 0xb4, 0x8f, 0xef, 0x3d, 0x7b, 0xfb, 0xf4, + 0xfd, 0xaf, 0xbf, 0x3d, 0xb2, 0xa6, 0xd1, 0xcc, 0x3d, 0xf8, 0xee, 0x77, + 0x1e, 0xab, 0x6f, 0x0b, 0x7f, 0x8f, 0xa7, 0xc2, 0x1e, 0xa9, 0xdf, 0xfc, + 0x1c, 0x39, 0x91, 0x2b, 0x0e, 0x5e, 0x0f, 0x5f, 0x39, 0x93, 0x69, 0xe4, + 0x78, 0x93, 0xc7, 0x5b, 0x9c, 0x92, 0x04, 0x99, 0x89, 0xc8, 0xb6, 0x86, + 0x53, 0x3b, 0x08, 0x45, 0xd4, 0xaf, 0xfc, 0xe2, 0xfd, 0xf3, 0xc6, 0x5e, + 0x25, 0x97, 0xef, 0xd9, 0x33, 0xd1, 0xaf, 0x7c, 0x76, 0xc4, 0xd9, 0xdc, + 0x0f, 0xa2, 0x8a, 0x35, 0xf4, 0xbd, 0x48, 0x78, 0x80, 0x3f, 0x73, 0x46, + 0xd1, 0xb4, 0x3f, 0x12, 0x9f, 0x9d, 0xa1, 0x68, 0xf0, 0x43, 0xdd, 0x72, + 0x3c, 0x27, 0x72, 0x6c, 0xb7, 0x11, 0x0e, 0x6d, 0x57, 0xf4, 0xdb, 0xcd, + 0x56, 0x19, 0xbe, 0x99, 0x3f, 0x70, 0x5c, 0x14, 0x13, 0x83, 0x86, 0x3d, + 0x9f, 0x37, 0x86, 0xf6, 0xdc, 0x1e, 0xb8, 0x22, 0x81, 0xfd, 0x42, 0x84, + 0xa9, 0xb2, 0xae, 0xe3, 0x9d, 0x5a, 0x81, 0x70, 0xfb, 0x95, 0x70, 0x0a, + 0x3e, 0x86, 0x8b, 0xc8, 0x72, 0x00, 0x5c, 0xb1, 0xa6, 0x81, 0x18, 0xf7, + 0x2b, 0xd3, 0x28, 0x9a, 0x87, 0xbd, 0xad, 0xad, 0xc0, 0x3e, 0x6b, 0x4e, + 0x9c, 0x68, 0xba, 0x18, 0x2c, 0x42, 0x11, 0x28, 0x6c, 0xcd, 0xa1, 0x3f, + 0xdb, 0x7a, 0x6e, 0x0f, 0x5e, 0xd9, 0x83, 0xc6, 0xab, 0x85, 0xf0, 0x84, + 0xb7, 0x65, 0xe4, 0xb2, 0x35, 0xb3, 0xc3, 0x48, 0x04, 0x5b, 0x87, 0xc1, + 0x68, 0xe1, 0x78, 0x7e, 0x32, 0x67, 0x64, 0x47, 0xf6, 0xd6, 0xd8, 0xfe, + 0x4c, 0x84, 0x9a, 0xf8, 0xa8, 0x58, 0xd1, 0xc5, 0x1c, 0xcc, 0x3b, 0x33, + 0x7b, 0x22, 0xb6, 0xce, 0x1b, 0x92, 0x81, 0xad, 0x62, 0x36, 0x51, 0x2d, + 0x54, 0x30, 0xf2, 0x17, 0xc3, 0x69, 0xe3, 0xce, 0x39, 0xcd, 0x12, 0x6b, + 0xce, 0xbd, 0x49, 0x99, 0xf8, 0xa2, 0x0b, 0x57, 0x84, 0x53, 0x21, 0xa2, + 0x2c, 0x47, 0x63, 0xf0, 0x10, 0x36, 0x27, 0xbe, 0x3f, 0x71, 0x85, 0x3d, + 0x77, 0x42, 0x66, 0x66, 0x18, 0x86, 0xdf, 0x8c, 0xed, 0x99, 0xe3, 0x5e, + 0xf4, 0x5f, 0xdb, 0xa0, 0x8e, 0xd6, 0xfd, 0xe1, 0x4b, 0x50, 0x48, 0xb7, + 0x0e, 0x23, 0x45, 0xc2, 0x0f, 0xac, 0x4b, 0x4a, 0x1d, 0xd8, 0xc3, 0xd3, + 0x49, 0xe0, 0x2f, 0xbc, 0x51, 0x23, 0x10, 0x73, 0x61, 0x47, 0x3d, 0xcb, + 0xf3, 0xd5, 0xcf, 0x7d, 0x02, 0x98, 0xdb, 0xa3, 0x11, 0xf8, 0xee, 0x59, + 0x2d, 0x7e, 0x9c, 0xd9, 0xc1, 0xc4, 0xf1, 0xe4, 0xd3, 0x15, 0xb0, 0xd4, + 0xad, 0x9e, 0x3d, 0x06, 0x31, 0x7c, 0x0f, 0xc4, 0xd8, 0x0f, 0x04, 0xa3, + 0xc5, 0x1f, 0x29, 0xcc, 0xa9, 0x13, 0x35, 0x06, 0xfe, 0x79, 0x23, 0x74, + 0xbe, 0x30, 0x0a, 0xc7, 0x9b, 0x82, 0x2d, 0xc6, 0x8b, 0xbf, 0x82, 0x1c, + 0x89, 0x94, 0xfa, 0x8a, 0x46, 0x43, 0x35, 0x25, 0x28, 0xd1, 0xdb, 0xed, + 0x34, 0x77, 0xbe, 0xcf, 0xf9, 0x03, 0x7f, 0x74, 0x91, 0xcf, 0x6f, 0x37, + 0x77, 0xc4, 0x4c, 0xa1, 0x86, 0x0c, 0x45, 0x63, 0x2a, 0x48, 0xe6, 0x48, + 0xdf, 0xdd, 0x4f, 0xc0, 0x9e, 0xc9, 0xd4, 0xed, 0x56, 0x2b, 0x99, 0x2a, + 0xe5, 0xd6, 0xab, 0xbc, 0x43, 0x67, 0x38, 0xb3, 0x2f, 0x2a, 0xf5, 0xca, + 0x4f, 0x84, 0xfb, 0x59, 0x44, 0xce, 0xd0, 0x7e, 0x23, 0x16, 0x22, 0xf9, + 0x6c, 0xc9, 0x84, 0xf8, 0xb9, 0x7e, 0x48, 0x92, 0xae, 0x87, 0xb6, 0x17, + 0x36, 0x42, 0x54, 0x62, 0xac, 0xf0, 0x0e, 0x7d, 0xd7, 0x0f, 0x7a, 0xf7, + 0x3b, 0x9d, 0x8e, 0x64, 0x7a, 0x11, 0x45, 0xbe, 0x57, 0xb7, 0x3e, 0x4a, + 0xc5, 0x94, 0x8f, 0x95, 0x4f, 0x71, 0x42, 0x20, 0xd0, 0xb5, 0x13, 0xcf, + 0xe1, 0x62, 0x30, 0x73, 0x64, 0x42, 0xe0, 0xbb, 0x89, 0x12, 0xb2, 0xe6, + 0xc3, 0x45, 0x10, 0x02, 0xbd, 0x35, 0xf7, 0x1d, 0x0f, 0xe2, 0xdf, 0x4f, + 0xd1, 0x70, 0xbc, 0xf9, 0x22, 0xaa, 0x5b, 0xfe, 0x3c, 0xa2, 0xa6, 0x9d, + 0xd7, 0xad, 0x50, 0xb8, 0x62, 0x88, 0x94, 0x48, 0x9c, 0x47, 0x76, 0x20, + 0x6c, 0xc2, 0x21, 0x6b, 0x6e, 0x44, 0x6f, 0x6d, 0xfd, 0xc0, 0x3a, 0x9e, + 0x8b, 0xa1, 0x33, 0xbe, 0xe0, 0x1c, 0x9d, 0x61, 0x7b, 0x43, 0x61, 0xf9, + 0x63, 0xa4, 0x05, 0x33, 0x0b, 0x78, 0x66, 0x02, 0xba, 0x67, 0xfd, 0x60, + 0x2b, 0x41, 0x51, 0xa2, 0xf3, 0x3f, 0x8b, 0x60, 0xec, 0xfa, 0x67, 0x3d, + 0xeb, 0xb3, 0x13, 0x3a, 0xb0, 0x11, 0x8c, 0xf2, 0x70, 0x34, 0x42, 0xd5, + 0x42, 0xeb, 0x77, 0x3a, 0xfb, 0x77, 0x16, 0x2a, 0x6a, 0x45, 0xbe, 0xf5, + 0xbb, 0xa9, 0x33, 0x1a, 0x09, 0xef, 0x77, 0x20, 0x64, 0xbd, 0x3c, 0xb2, + 0xf6, 0xb6, 0x1e, 0x6d, 0xb5, 0x5b, 0x5b, 0xed, 0x76, 0x1a, 0x77, 0xaf, + 0xd7, 0x98, 0xf9, 0x5f, 0x1a, 0x63, 0x7f, 0xb8, 0x08, 0x1b, 0x8e, 0xe7, + 0x89, 0x20, 0x27, 0xc3, 0x3c, 0x48, 0x56, 0xaa, 0x79, 0x88, 0x9c, 0x9c, + 0xf3, 0x20, 0xaa, 0x83, 0xf8, 0xc1, 0x48, 0x04, 0x0d, 0xee, 0x36, 0x3d, + 0x2b, 0xdf, 0x25, 0x0c, 0xa3, 0xa6, 0x7c, 0x80, 0xdc, 0xcd, 0x72, 0xe9, + 0x2f, 0x22, 0xd2, 0x79, 0x62, 0xc9, 0x30, 0x9d, 0x61, 0xb0, 0xce, 0x83, + 0xd1, 0xda, 0x0a, 0x48, 0x04, 0x4c, 0x77, 0xb6, 0xe7, 0xb0, 0x0c, 0x01, + 0x74, 0x02, 0xb4, 0x24, 0x0a, 0x6e, 0xe5, 0xa7, 0x7e, 0x10, 0x88, 0x21, + 0x9a, 0x75, 0x2a, 0xd0, 0x9c, 0x36, 0x46, 0x0c, 0x27, 0xba, 0xa0, 0x46, + 0x66, 0xb9, 0x59, 0x43, 0xd7, 0x19, 0x9e, 0xd2, 0xb0, 0xc1, 0x66, 0x39, + 0xa4, 0x16, 0x77, 0xde, 0x1e, 0xa7, 0x1b, 0x5a, 0x6b, 0x29, 0xd3, 0x63, + 0x4d, 0x6d, 0x44, 0x20, 0x14, 0x92, 0xde, 0x91, 0x51, 0xf2, 0xa4, 0x3e, + 0x3d, 0x77, 0x02, 0xd8, 0x99, 0x73, 0x6b, 0xbb, 0xf5, 0xc3, 0xba, 0xf5, + 0x92, 0x74, 0xdf, 0x83, 0x3a, 0x1d, 0x9d, 0xcf, 0xd1, 0xdb, 0x20, 0x8d, + 0x76, 0xbb, 0x01, 0xb4, 0xf9, 0xde, 0x90, 0xef, 0x03, 0x39, 0xfb, 0x27, + 0x3b, 0xac, 0xc5, 0x44, 0xe7, 0x80, 0xf0, 0xa2, 0xfd, 0xac, 0x02, 0x48, + 0x3e, 0x38, 0x99, 0xa1, 0x33, 0x86, 0xab, 0x37, 0x72, 0x42, 0xaa, 0xe5, + 0xa8, 0xfe, 0xdd, 0xef, 0x7c, 0xd4, 0xbf, 0x3f, 0xc9, 0x06, 0x9a, 0xdb, + 0x43, 0x88, 0x04, 0x4d, 0xd2, 0xdc, 0x96, 0xc0, 0xcd, 0x41, 0xe4, 0x9d, + 0x9c, 0xc8, 0xd1, 0x44, 0x55, 0xda, 0x76, 0x9d, 0x89, 0xd7, 0x70, 0x22, + 0x31, 0x0b, 0x7b, 0xd6, 0x50, 0x50, 0xe5, 0x92, 0x2c, 0x04, 0xf6, 0xc8, + 0x59, 0x84, 0x31, 0x4d, 0xc3, 0x46, 0x3a, 0x09, 0x84, 0xe7, 0xae, 0x0d, + 0x52, 0x63, 0x57, 0x9c, 0x53, 0x0a, 0xff, 0xe8, 0x59, 0x6d, 0xab, 0x65, + 0xd9, 0x8b, 0xc8, 0xe7, 0xa4, 0xdf, 0x2f, 0xc2, 0x08, 0x3d, 0xbd, 0xa1, + 0xe8, 0x1b, 0x72, 0xc6, 0xc6, 0x27, 0xc1, 0xe7, 0x7e, 0x08, 0x77, 0x01, + 0x4a, 0x4e, 0x23, 0x93, 0x1d, 0x39, 0x9f, 0x59, 0x08, 0x2c, 0x2b, 0x99, + 0x41, 0x15, 0xeb, 0x86, 0x30, 0x4b, 0x03, 0x67, 0xd8, 0x18, 0x88, 0x2f, + 0x8e, 0x08, 0xaa, 0xad, 0x66, 0x67, 0xa7, 0x8e, 0xf4, 0x3d, 0xfa, 0xc0, + 0xaf, 0x76, 0x8d, 0x0b, 0x9d, 0x4d, 0x51, 0xc3, 0x46, 0x08, 0x81, 0xb0, + 0x3c, 0xcf, 0x02, 0x7b, 0xce, 0xe9, 0xec, 0x98, 0xc4, 0x55, 0x31, 0x42, + 0x5a, 0x4b, 0x36, 0xbb, 0xf3, 0xf3, 0xa4, 0x10, 0x08, 0x1d, 0x0f, 0x06, + 0x52, 0x16, 0x86, 0x4a, 0xa7, 0xdd, 0x52, 0x90, 0x6a, 0x98, 0xb0, 0xba, + 0x54, 0xd4, 0x48, 0xab, 0x65, 0xaa, 0x9f, 0x1c, 0x65, 0xac, 0xf6, 0x36, + 0x83, 0xa5, 0x47, 0x13, 0x6b, 0xa7, 0xd5, 0x5a, 0x59, 0xac, 0xa0, 0x63, + 0xed, 0x29, 0x24, 0xc6, 0x94, 0x58, 0x6d, 0x4d, 0x7f, 0xe6, 0x78, 0x0d, + 0xc5, 0xe5, 0x1e, 0xc1, 0x65, 0xfa, 0x77, 0xdc, 0x3b, 0x46, 0x62, 0xe8, + 0x07, 0x36, 0x09, 0x9f, 0xd5, 0xf2, 0x66, 0x2d, 0x52, 0x97, 0x1a, 0x64, + 0xb5, 0x67, 0xe1, 0xb2, 0x86, 0x86, 0xed, 0xa6, 0xb1, 0xce, 0x6d, 0x50, + 0x33, 0x20, 0x73, 0x06, 0xd3, 0x0d, 0x03, 0x9f, 0xb4, 0x0c, 0xe4, 0x1b, + 0x35, 0x64, 0x27, 0x33, 0xfc, 0xd0, 0x1f, 0x59, 0xac, 0xe2, 0x5c, 0x95, + 0x1d, 0x16, 0xe7, 0xc6, 0x7f, 0xb9, 0x5c, 0xa3, 0x1b, 0x8d, 0xc6, 0xc0, + 0xf5, 0x87, 0xa7, 0x52, 0x45, 0x4c, 0xab, 0x27, 0xbd, 0x8f, 0xfd, 0x74, + 0x16, 0xd3, 0xa3, 0x26, 0xd6, 0x59, 0xd9, 0x0e, 0x93, 0x77, 0x5f, 0x54, + 0xf7, 0x91, 0x39, 0x71, 0x79, 0x93, 0x92, 0x7c, 0x8a, 0x9b, 0xd9, 0x28, + 0x4f, 0xac, 0x73, 0x7b, 0xad, 0xef, 0xa7, 0x7c, 0x03, 0xeb, 0xfe, 0xf3, + 0xe7, 0xcf, 0x55, 0x4a, 0xde, 0x0e, 0xdd, 0x73, 0x66, 0xe4, 0xc6, 0xdb, + 0xca, 0x0c, 0xc5, 0x9a, 0xae, 0xcb, 0x6e, 0x0f, 0xed, 0xf1, 0x4e, 0xcb, + 0x40, 0x19, 0xa1, 0x34, 0x17, 0x30, 0xd2, 0xc1, 0xd0, 0x0e, 0xd9, 0x19, + 0x33, 0x2a, 0xbf, 0x2b, 0x55, 0x3e, 0x6f, 0x5c, 0x35, 0x7c, 0x5a, 0xb0, + 0x3e, 0xcc, 0xe7, 0x4c, 0x4b, 0x56, 0x3e, 0x99, 0x5e, 0x82, 0xbf, 0x80, + 0x55, 0xdf, 0xe8, 0x6d, 0x52, 0x79, 0xec, 0x41, 0xe8, 0xbb, 0x8b, 0x48, + 0xa4, 0x64, 0xa2, 0xb5, 0x37, 0xa1, 0xe2, 0x26, 0x69, 0xaa, 0x7b, 0x92, + 0x41, 0x27, 0x21, 0x4c, 0x4a, 0xce, 0x19, 0xcd, 0xf5, 0xfe, 0x9d, 0x58, + 0xc2, 0x5f, 0x30, 0x3a, 0x8e, 0xa8, 0x59, 0xb6, 0x33, 0x22, 0x1f, 0x8f, + 0xc7, 0xa5, 0x22, 0xbf, 0x2f, 0x1e, 0xb5, 0xc5, 0x6e, 0x77, 0xb9, 0xe4, + 0xf3, 0x50, 0x31, 0xbb, 0xae, 0xdb, 0xc0, 0x1c, 0xcd, 0x9b, 0x88, 0x9e, + 0x74, 0x6e, 0xa7, 0xf6, 0xc8, 0x3f, 0x53, 0xb9, 0x26, 0x81, 0x3a, 0x7b, + 0x17, 0x36, 0x60, 0x07, 0xff, 0x1a, 0x6d, 0x7c, 0x04, 0x93, 0x81, 0x5d, + 0x6d, 0xd5, 0xe9, 0xbf, 0x66, 0xa7, 0x86, 0xae, 0xc9, 0x26, 0x82, 0x0c, + 0x14, 0x7e, 0x26, 0x33, 0xdb, 0xdb, 0x9c, 0xdb, 0xa6, 0xdc, 0xbd, 0x7c, + 0x6e, 0xa7, 0x26, 0xdb, 0x8f, 0x26, 0x40, 0xe5, 0x56, 0x73, 0x99, 0x79, + 0x34, 0x7a, 0x2f, 0xbd, 0x62, 0x4c, 0x02, 0x16, 0x81, 0x40, 0xdf, 0x8b, + 0x68, 0xee, 0x02, 0x14, 0x0f, 0x81, 0xcf, 0x7e, 0x98, 0xea, 0x9d, 0xd7, + 0x43, 0x26, 0xac, 0x67, 0x07, 0xd6, 0xf3, 0x5a, 0x43, 0x99, 0xf4, 0xde, + 0xad, 0xf6, 0x8d, 0xcc, 0x5a, 0x91, 0xd1, 0x62, 0xb5, 0x57, 0x6a, 0x9d, + 0x10, 0x14, 0x7f, 0x34, 0x1a, 0x34, 0xed, 0x5a, 0xe2, 0x5a, 0x37, 0x67, + 0x6a, 0x4a, 0xc5, 0x93, 0xb6, 0xb0, 0x39, 0x1b, 0xa1, 0x04, 0x18, 0xa4, + 0x22, 0x5a, 0xb9, 0x64, 0x6b, 0x74, 0x76, 0xc0, 0x81, 0xfa, 0x60, 0x5e, + 0x4a, 0x11, 0x8c, 0xec, 0xe0, 0x34, 0x5f, 0xbe, 0x55, 0xb7, 0xe8, 0x7f, + 0xae, 0x8f, 0x2a, 0x0b, 0xb7, 0xe7, 0x3d, 0x1c, 0xab, 0xd7, 0xfe, 0xc8, + 0x76, 0xad, 0xaa, 0xd1, 0xdb, 0x1a, 0xbb, 0x3a, 0xf7, 0x67, 0x9c, 0x7e, + 0x99, 0x36, 0xdf, 0x63, 0xe7, 0x5c, 0x8c, 0x50, 0x3c, 0xd1, 0x15, 0xda, + 0xc9, 0x21, 0x07, 0x53, 0xd0, 0x39, 0x92, 0x76, 0xa0, 0x65, 0xec, 0x57, + 0xbd, 0xf2, 0x87, 0x3c, 0x96, 0xc0, 0xd5, 0x27, 0x2f, 0x8e, 0xf4, 0x15, + 0xd8, 0xb9, 0x39, 0xc4, 0x38, 0xd2, 0x3d, 0x8e, 0x0b, 0xb5, 0x92, 0x03, + 0x69, 0xbb, 0xa5, 0xfa, 0x9c, 0x6c, 0xb0, 0x38, 0xc1, 0xcc, 0x07, 0x62, + 0x53, 0x98, 0xea, 0x72, 0xa6, 0xca, 0x52, 0x7f, 0x6b, 0xd2, 0xbb, 0xb3, + 0x5d, 0x97, 0x80, 0xa4, 0x44, 0x24, 0x03, 0xf9, 0x52, 0x49, 0xb5, 0x87, + 0x3f, 0x25, 0x8b, 0x3e, 0x71, 0xa9, 0xdc, 0xd9, 0x96, 0x76, 0xb5, 0xb4, + 0x1b, 0xd8, 0x64, 0xf1, 0x68, 0x45, 0x33, 0xde, 0xa5, 0xd2, 0x0a, 0xa3, + 0x78, 0x85, 0x16, 0x61, 0x2c, 0xe8, 0x3f, 0xe4, 0xe6, 0x0d, 0xbb, 0xb1, + 0x46, 0x24, 0xc4, 0xac, 0xa6, 0x6f, 0x17, 0xfa, 0x09, 0xbb, 0xad, 0x94, + 0x83, 0xce, 0x5d, 0x19, 0x96, 0xd2, 0x19, 0x59, 0xf7, 0xf7, 0xf6, 0xf6, + 0x38, 0xcb, 0x0c, 0x16, 0xb2, 0xf1, 0x51, 0x03, 0xe2, 0xdd, 0x76, 0x94, + 0xb3, 0x6f, 0xdc, 0xb9, 0x36, 0xcb, 0x7a, 0x29, 0x6f, 0xaa, 0xc7, 0x49, + 0x41, 0xa0, 0xc3, 0xfb, 0x0b, 0x48, 0x60, 0xb9, 0x93, 0xd8, 0x66, 0x24, + 0x71, 0x52, 0x83, 0xfc, 0xb3, 0x84, 0x9f, 0x96, 0x33, 0xde, 0x06, 0x73, + 0x33, 0xf0, 0xcf, 0x0c, 0x87, 0x8d, 0x91, 0x83, 0x29, 0x81, 0x54, 0x46, + 0x64, 0xe4, 0x20, 0x9b, 0x81, 0x80, 0x82, 0x84, 0xa2, 0xb4, 0x44, 0x43, + 0x01, 0xa4, 0x4b, 0xa2, 0x61, 0x16, 0x33, 0xaf, 0xb8, 0x90, 0xcc, 0x2b, + 0x82, 0xd7, 0xc4, 0x96, 0x95, 0x5b, 0x4a, 0xef, 0xc0, 0x6a, 0x52, 0x29, + 0x59, 0x7e, 0x66, 0x9f, 0x37, 0x12, 0xea, 0x9f, 0x2e, 0x40, 0x72, 0x02, + 0x58, 0x5a, 0x7c, 0xf4, 0xa9, 0xc0, 0xe0, 0xc7, 0x7c, 0xe6, 0x9e, 0xd6, + 0xe8, 0x12, 0x58, 0x66, 0x64, 0x80, 0x3e, 0x74, 0xd5, 0xbf, 0x46, 0x27, + 0x3d, 0x36, 0xb4, 0xe4, 0xe0, 0xa0, 0x72, 0xb7, 0xf1, 0xaf, 0x95, 0x05, + 0x68, 0x6f, 0x4b, 0x08, 0xd6, 0xab, 0xbd, 0x42, 0x88, 0x4e, 0x2d, 0xe1, + 0x59, 0x94, 0xe9, 0xe2, 0xee, 0xee, 0x6e, 0x8e, 0xdb, 0xdd, 0x62, 0x6e, + 0xcd, 0x48, 0x56, 0xc2, 0xad, 0x1a, 0xcc, 0xae, 0x65, 0xb7, 0xbd, 0x1a, + 0xbf, 0x69, 0xa6, 0x1e, 0x15, 0x33, 0xb5, 0xa3, 0xc8, 0x36, 0xba, 0x59, + 0x7c, 0x3f, 0x52, 0x14, 0x1f, 0x11, 0x45, 0x12, 0x70, 0x8e, 0xed, 0x9d, + 0x84, 0x90, 0xdb, 0x84, 0x24, 0xd7, 0x0c, 0xdd, 0x52, 0x11, 0x76, 0x97, + 0x8b, 0xb0, 0xdd, 0x29, 0x66, 0xf7, 0x47, 0xaa, 0xb5, 0x1a, 0xdb, 0x85, + 0x32, 0x8c, 0x59, 0x25, 0xb8, 0x4e, 0xa9, 0x10, 0x77, 0x28, 0x97, 0xb2, + 0xb7, 0xd7, 0x14, 0x62, 0x7b, 0xa7, 0x98, 0xad, 0x3d, 0x25, 0xa7, 0xc6, + 0x4e, 0x29, 0x5b, 0x92, 0xe6, 0x52, 0xb6, 0x58, 0x84, 0x84, 0x6a, 0x67, + 0x25, 0xb6, 0xa8, 0xd3, 0xd4, 0xc9, 0xe6, 0x4d, 0x1d, 0x77, 0xc4, 0x7e, + 0x09, 0xfa, 0x1e, 0x2d, 0x56, 0xe6, 0x4d, 0x54, 0x69, 0x57, 0xbc, 0x1f, + 0xf9, 0x3e, 0x86, 0x11, 0x69, 0x2e, 0x8d, 0xef, 0x60, 0xe6, 0x49, 0xf9, + 0xba, 0xb2, 0xdc, 0xca, 0xd5, 0x58, 0xe5, 0xee, 0x5c, 0xaf, 0xc5, 0xad, + 0x12, 0x2d, 0x5e, 0x36, 0xbb, 0x4a, 0x57, 0x20, 0xed, 0x49, 0xc6, 0xe3, + 0x35, 0x0d, 0xc3, 0xf5, 0xf8, 0x89, 0x9c, 0x6f, 0x2d, 0x32, 0x55, 0xdb, + 0x15, 0x17, 0x13, 0xf2, 0x96, 0xdf, 0x78, 0xd5, 0x3c, 0x5a, 0x64, 0xb1, + 0xf2, 0x66, 0x04, 0x70, 0x66, 0x3c, 0xb9, 0xd6, 0xb2, 0x79, 0xb0, 0x2b, + 0x22, 0xd0, 0xe3, 0x49, 0xbe, 0xc4, 0xdc, 0x6c, 0x75, 0xc4, 0x6c, 0xe9, + 0xf4, 0xdf, 0xb8, 0x0b, 0x72, 0x5d, 0xd0, 0xcc, 0x54, 0x4c, 0x8e, 0x70, + 0x5d, 0x67, 0x1e, 0x3a, 0x61, 0x21, 0x8b, 0x3d, 0xcf, 0x8f, 0xaa, 0xbd, + 0xb1, 0x13, 0x84, 0x51, 0x83, 0xb5, 0xa7, 0x66, 0x5d, 0x9a, 0xb1, 0x91, + 0xe5, 0x27, 0xd9, 0x56, 0x4a, 0x32, 0xf6, 0x7d, 0xf0, 0x58, 0xb0, 0x5e, + 0x9d, 0xf7, 0x0c, 0xcc, 0xb4, 0xaf, 0x28, 0xb3, 0x58, 0xd6, 0xb7, 0x3d, + 0x23, 0x8d, 0x75, 0x27, 0xa5, 0x3a, 0xa6, 0xf5, 0xd8, 0x58, 0x99, 0xee, + 0x54, 0x3a, 0x8f, 0x4d, 0x4c, 0x19, 0x4d, 0xd5, 0x74, 0x9e, 0xea, 0x5a, + 0x39, 0x90, 0xd2, 0x6c, 0x33, 0x9f, 0xcb, 0xad, 0xa3, 0x18, 0xe2, 0xc9, + 0x1e, 0xd8, 0xec, 0x64, 0x9c, 0xf7, 0xe6, 0x36, 0xcf, 0x7b, 0xea, 0xed, + 0x9a, 0x2a, 0xb5, 0x3a, 0x34, 0x7b, 0x47, 0x3f, 0x9e, 0x89, 0x91, 0x63, + 0x5b, 0xbe, 0xe7, 0x5e, 0x58, 0xe1, 0x30, 0x10, 0xc2, 0xb3, 0x6c, 0x6f, + 0x64, 0x55, 0x13, 0x6e, 0xca, 0x23, 0x9a, 0xf9, 0x2a, 0x6d, 0xc8, 0x3a, + 0x53, 0x29, 0x13, 0xf2, 0xa8, 0xa5, 0xb5, 0xfa, 0x0a, 0xd8, 0x57, 0xc2, + 0xdd, 0xee, 0xec, 0x6e, 0xaf, 0x86, 0xbc, 0xdd, 0xde, 0xdb, 0x59, 0x1b, + 0xfb, 0xa3, 0xd6, 0xaa, 0xd8, 0x7f, 0xb4, 0x2a, 0xf6, 0x44, 0x75, 0x77, + 0x1e, 0x15, 0x23, 0xcf, 0x2b, 0x56, 0x1e, 0x31, 0x3c, 0xf5, 0x1c, 0xbb, + 0x2d, 0x8d, 0x8c, 0xf4, 0xa5, 0x79, 0x1e, 0xb6, 0xe5, 0xa3, 0x72, 0x85, + 0x06, 0x36, 0xba, 0x2e, 0x3c, 0xdb, 0x66, 0x37, 0xf5, 0xd7, 0xf9, 0xfe, + 0x7e, 0x02, 0x68, 0x12, 0xb0, 0x49, 0xde, 0xcf, 0x54, 0xb0, 0xb4, 0xd8, + 0x55, 0x92, 0x5e, 0x27, 0x4f, 0x8f, 0xd8, 0x6f, 0xee, 0xa6, 0xfe, 0xb6, + 0x57, 0x23, 0x98, 0x2f, 0x57, 0x40, 0xb1, 0x5b, 0x44, 0xb1, 0xb3, 0xb3, + 0x1a, 0x05, 0xc0, 0xe5, 0x31, 0x6e, 0x17, 0x61, 0xec, 0x76, 0x33, 0xb5, + 0x5f, 0x8d, 0x40, 0xbe, 0x58, 0x9e, 0xde, 0x4e, 0x11, 0xbd, 0xed, 0x76, + 0xba, 0xee, 0x3f, 0x5a, 0x8d, 0x5e, 0xbe, 0x58, 0x9e, 0xde, 0x6e, 0x11, + 0xbd, 0x9d, 0xd6, 0x6a, 0x04, 0x00, 0x97, 0xc7, 0xf8, 0xa3, 0x42, 0x8c, + 0x59, 0x7d, 0xd9, 0x5d, 0x91, 0x42, 0xbe, 0x5c, 0x9e, 0xe2, 0x5e, 0x11, + 0xc5, 0xdd, 0x8c, 0xbe, 0xac, 0x48, 0x30, 0x5f, 0x2c, 0x4f, 0xef, 0x51, + 0x11, 0xbd, 0x1f, 0xad, 0xa8, 0x65, 0x3f, 0x2a, 0xd2, 0xb2, 0x76, 0xab, + 0xb0, 0x6b, 0x66, 0xf4, 0x65, 0xc5, 0x9e, 0x92, 0x2b, 0x56, 0x44, 0xb0, + 0xd0, 0x16, 0x3c, 0x6a, 0xdf, 0x48, 0x66, 0x8f, 0xda, 0xd7, 0xcb, 0xac, + 0x5d, 0x6c, 0x0c, 0x5a, 0x2b, 0x6a, 0x1a, 0x01, 0xae, 0x66, 0xf4, 0x76, + 0x69, 0xd0, 0x48, 0x19, 0xbe, 0x70, 0xb6, 0x59, 0xc3, 0x17, 0xce, 0x36, + 0x6d, 0xf8, 0xc2, 0xd9, 0x6d, 0x1b, 0xbe, 0x70, 0xb6, 0x59, 0xc3, 0x17, + 0xce, 0x36, 0x6b, 0xf8, 0xc2, 0xd9, 0x6d, 0x1b, 0xbe, 0x70, 0xb6, 0x69, + 0xc3, 0x17, 0xce, 0x36, 0x6b, 0xf8, 0xc2, 0xd9, 0x6d, 0x1b, 0xbe, 0x70, + 0xb6, 0x61, 0xc3, 0x17, 0xce, 0x36, 0x6c, 0xf8, 0xc2, 0xd9, 0xc6, 0x0c, + 0x9f, 0x76, 0xab, 0x0d, 0xf1, 0xd9, 0x68, 0xb3, 0x86, 0x6f, 0x36, 0xda, + 0xb4, 0xe1, 0x9b, 0x8d, 0x6e, 0xdb, 0xf0, 0xcd, 0x46, 0x9b, 0x35, 0x7c, + 0xb3, 0xd1, 0x66, 0x0d, 0xdf, 0x6c, 0x74, 0xdb, 0x86, 0x6f, 0x36, 0xda, + 0xb4, 0xe1, 0x9b, 0x8d, 0x36, 0x6b, 0xf8, 0x66, 0xa3, 0xdb, 0x36, 0x7c, + 0xb3, 0xd1, 0x86, 0x0d, 0xdf, 0x6c, 0xb4, 0x61, 0xc3, 0x37, 0x1b, 0x6d, + 0xcc, 0xf0, 0xc5, 0x73, 0x7e, 0x43, 0xdd, 0x9d, 0x6c, 0xd6, 0xf2, 0xb9, + 0x93, 0x4d, 0x5b, 0x3e, 0x77, 0x72, 0xdb, 0x96, 0xcf, 0x9d, 0x6c, 0xd6, + 0xf2, 0xb9, 0x93, 0xcd, 0x5a, 0x3e, 0x77, 0x72, 0xdb, 0x96, 0xcf, 0x9d, + 0x6c, 0xda, 0xf2, 0xb9, 0x93, 0xcd, 0x5a, 0x3e, 0x77, 0x72, 0xdb, 0x96, + 0xcf, 0x9d, 0x6c, 0xd8, 0xf2, 0xb9, 0x93, 0x0d, 0x5b, 0x3e, 0x77, 0xb2, + 0x39, 0xcb, 0x17, 0xaf, 0x47, 0x9a, 0x99, 0xb6, 0xbb, 0x59, 0xcb, 0x77, + 0xee, 0x6e, 0xda, 0xf2, 0x9d, 0xbb, 0xb7, 0x6d, 0xf9, 0xce, 0xdd, 0xcd, + 0x5a, 0xbe, 0x73, 0x77, 0xb3, 0x96, 0xef, 0xdc, 0xbd, 0x6d, 0xcb, 0x77, + 0xee, 0x6e, 0xda, 0xf2, 0x9d, 0xbb, 0x9b, 0xb5, 0x7c, 0xe7, 0xee, 0x6d, + 0x5b, 0xbe, 0x73, 0x77, 0xc3, 0x96, 0xef, 0xdc, 0xdd, 0xb0, 0xe5, 0x3b, + 0x77, 0xef, 0xc4, 0xf2, 0x2d, 0xdb, 0x33, 0xd9, 0x79, 0x94, 0xd8, 0x33, + 0x91, 0x3b, 0x95, 0x8d, 0xf3, 0xb0, 0x41, 0x45, 0x32, 0x51, 0xa8, 0x72, + 0xb7, 0x39, 0xb9, 0xc3, 0x6d, 0x08, 0x35, 0x69, 0xff, 0x53, 0x6e, 0xb5, + 0xa4, 0x58, 0x6c, 0xe7, 0x36, 0xc4, 0x15, 0x8d, 0x42, 0xdc, 0x12, 0x82, + 0x83, 0xb7, 0x6c, 0xda, 0xaa, 0xc1, 0xf9, 0x0d, 0x79, 0x26, 0xe0, 0x07, + 0x5b, 0xb4, 0x83, 0xee, 0x04, 0x43, 0x1c, 0x35, 0xa2, 0x53, 0x63, 0xd1, + 0xc9, 0x89, 0x7c, 0x52, 0x5b, 0xc3, 0x9e, 0x33, 0x53, 0x81, 0xc3, 0x49, + 0xa0, 0xc6, 0xd8, 0x81, 0xc9, 0xc7, 0x8e, 0x9b, 0x0c, 0x84, 0x91, 0xf1, + 0xf6, 0x74, 0x1c, 0xc3, 0xa2, 0x42, 0x89, 0x78, 0xd1, 0xc0, 0x8f, 0x10, + 0xcc, 0x56, 0x6d, 0x3c, 0x6a, 0x8d, 0xc4, 0x44, 0x46, 0x5f, 0x75, 0xea, + 0x56, 0x17, 0x90, 0x29, 0xc0, 0x86, 0x8f, 0x5d, 0x6a, 0x27, 0xde, 0x2b, + 0x65, 0xb8, 0x6d, 0x19, 0x96, 0x95, 0x63, 0xcf, 0xf1, 0xc6, 0xfe, 0x32, + 0xe6, 0xf4, 0xc9, 0x03, 0x62, 0x0f, 0xb8, 0xcf, 0xec, 0x60, 0x14, 0xee, + 0xa7, 0x03, 0xeb, 0xf7, 0xd3, 0x5c, 0xca, 0x9f, 0x2e, 0x18, 0xfd, 0x75, + 0x15, 0x31, 0x1b, 0x62, 0xa6, 0x76, 0x0c, 0x7f, 0x7c, 0x2a, 0x2e, 0xc6, + 0x01, 0x8e, 0xb6, 0x85, 0xf9, 0xca, 0xab, 0x80, 0x01, 0x70, 0x82, 0x83, + 0x0b, 0x81, 0x7f, 0x2a, 0x10, 0xa3, 0x17, 0x22, 0x37, 0xb0, 0x89, 0x00, + 0x69, 0xcb, 0xbe, 0x75, 0x95, 0xc3, 0x92, 0xe7, 0x52, 0xe3, 0x91, 0xdf, + 0x31, 0x93, 0x3a, 0x04, 0xaf, 0x94, 0xcd, 0x5a, 0x42, 0x45, 0xe8, 0x38, + 0x8e, 0x87, 0x80, 0x34, 0x8a, 0x63, 0xd8, 0xb2, 0xde, 0xfb, 0x38, 0x51, + 0x26, 0xc3, 0xfd, 0x42, 0x4e, 0x55, 0x44, 0xf8, 0xac, 0x8d, 0x3c, 0x6e, + 0x91, 0xda, 0x38, 0x4f, 0x8c, 0xd9, 0x1d, 0x0e, 0x4f, 0xcb, 0xed, 0x84, + 0x23, 0x1a, 0x05, 0x1b, 0x86, 0x65, 0x71, 0x6f, 0xe8, 0xdf, 0xc8, 0xca, + 0x87, 0xcd, 0x9a, 0xc8, 0xb9, 0x65, 0x51, 0xf8, 0x1d, 0x46, 0x9c, 0xdd, + 0x42, 0x5c, 0x31, 0x40, 0x91, 0xd8, 0xe3, 0x31, 0xc0, 0x44, 0x1c, 0x76, + 0x0b, 0x02, 0xec, 0xda, 0x3f, 0x52, 0x3b, 0xf9, 0x46, 0x22, 0x4d, 0x1c, + 0x38, 0x3c, 0xeb, 0xb6, 0x5a, 0xad, 0x9c, 0x68, 0xe4, 0xef, 0x4c, 0xc4, + 0x7a, 0x42, 0xd3, 0xc6, 0xf6, 0x48, 0x38, 0x1e, 0x45, 0x8f, 0x86, 0x75, + 0x7e, 0x40, 0x24, 0x17, 0x3f, 0x59, 0x1d, 0x7c, 0x70, 0xa9, 0x75, 0xa0, + 0x73, 0x4c, 0xed, 0xdc, 0x2e, 0x53, 0xdb, 0x6b, 0x31, 0xb5, 0x5d, 0xc2, + 0x54, 0xfb, 0x96, 0xb9, 0x6a, 0xaf, 0xc7, 0x16, 0x83, 0xab, 0x3e, 0xa9, + 0xe9, 0xc4, 0xbd, 0x4a, 0x95, 0x53, 0x06, 0x32, 0xa0, 0x40, 0x74, 0x15, + 0x7b, 0x9a, 0xec, 0xf1, 0x57, 0xba, 0x9b, 0x19, 0x2d, 0x49, 0xf6, 0x35, + 0xd5, 0x55, 0xef, 0x04, 0x69, 0x8e, 0x63, 0x5d, 0x39, 0x83, 0xbd, 0x04, + 0x83, 0x21, 0x90, 0x27, 0xae, 0xb1, 0xdf, 0x09, 0x56, 0x58, 0x94, 0x77, + 0xd4, 0xc9, 0xc5, 0xc8, 0x0a, 0xcf, 0x9c, 0x68, 0x38, 0xb5, 0x1a, 0x88, + 0xff, 0x0e, 0x23, 0x1c, 0x47, 0xa6, 0xa8, 0xdf, 0xe1, 0x54, 0x0c, 0x4f, + 0x75, 0xd8, 0x6f, 0x53, 0x41, 0x5c, 0x96, 0x85, 0x2d, 0xe5, 0x83, 0xc8, + 0xe5, 0x51, 0x8c, 0x74, 0xbf, 0x4f, 0x5b, 0x1e, 0xf3, 0xac, 0xbd, 0xa2, + 0xdc, 0x21, 0x1c, 0x15, 0x7f, 0x14, 0x33, 0x20, 0x4f, 0x6f, 0x59, 0x99, + 0x33, 0x54, 0x49, 0x1c, 0xad, 0x14, 0x82, 0x96, 0x2e, 0x8d, 0x20, 0x3c, + 0x39, 0xbe, 0x96, 0x1d, 0x4b, 0xc8, 0xc7, 0x79, 0x9b, 0xf8, 0xe6, 0x6c, + 0xd8, 0x73, 0x60, 0x90, 0x9b, 0xa3, 0x10, 0xad, 0x32, 0xdb, 0x39, 0x18, + 0x0c, 0x90, 0x55, 0x12, 0xfe, 0xb2, 0x2d, 0x7b, 0x48, 0x3e, 0xcd, 0x70, + 0xad, 0x4e, 0xd2, 0x2e, 0x65, 0x3e, 0x8e, 0x9b, 0xaf, 0x54, 0x52, 0xf5, + 0xef, 0xec, 0x26, 0x25, 0xac, 0x9e, 0x4d, 0x75, 0xa4, 0x78, 0x4d, 0x1d, + 0xb6, 0xcb, 0x46, 0x00, 0x19, 0xa6, 0x75, 0xb3, 0x6a, 0x70, 0x93, 0xf5, + 0x58, 0x9d, 0xa0, 0x6a, 0x3f, 0xb4, 0xe2, 0xc6, 0x28, 0xa6, 0x94, 0x2c, + 0xc4, 0x07, 0x1b, 0x4d, 0x91, 0x82, 0xb8, 0x44, 0x79, 0xfe, 0x61, 0x19, + 0x21, 0x23, 0xbf, 0x34, 0xf7, 0xf9, 0x11, 0xf7, 0x57, 0x55, 0x12, 0x4f, + 0x4d, 0xd6, 0x72, 0x16, 0x5e, 0x0b, 0xb3, 0x3c, 0xdf, 0x34, 0x60, 0x93, + 0xeb, 0x07, 0xfa, 0xd9, 0x91, 0x51, 0x29, 0x78, 0x1e, 0x36, 0xc5, 0x72, + 0xfe, 0x50, 0x8b, 0x2a, 0x01, 0xd9, 0xa0, 0xd5, 0xd4, 0x51, 0xa8, 0x25, + 0x5d, 0x33, 0x7d, 0xa8, 0xd9, 0xe2, 0x03, 0xca, 0xa9, 0x38, 0xd5, 0x8e, + 0x89, 0x53, 0xb5, 0x6d, 0x7b, 0xd9, 0x39, 0x3a, 0x13, 0xe3, 0x9e, 0x12, + 0xba, 0x3a, 0x23, 0xca, 0x2d, 0xa8, 0x8f, 0x88, 0x2e, 0x45, 0x5f, 0x4a, + 0x20, 0xf6, 0x4a, 0x8c, 0x82, 0x6a, 0x63, 0xc5, 0xd8, 0xb5, 0x95, 0x91, + 0xbe, 0x0f, 0x27, 0x35, 0x54, 0xd2, 0x65, 0x8a, 0xc1, 0x6d, 0xb6, 0x25, + 0x79, 0x75, 0xa1, 0x30, 0x56, 0xe6, 0xa3, 0xa4, 0xa6, 0x6d, 0x15, 0x11, + 0x98, 0xc5, 0xde, 0x53, 0x6d, 0x72, 0x99, 0xea, 0x6e, 0x0f, 0x5f, 0x23, + 0x1a, 0xd1, 0x92, 0x4d, 0x17, 0x92, 0xb9, 0x95, 0x61, 0x9a, 0xd6, 0x53, + 0xe6, 0x15, 0xff, 0xb3, 0x4f, 0x64, 0x79, 0x8b, 0xd9, 0x80, 0x00, 0x06, + 0x22, 0x3a, 0xa3, 0x59, 0x44, 0x0b, 0xa0, 0x74, 0x1e, 0x04, 0xe6, 0x8c, + 0x4e, 0x57, 0xa8, 0x7c, 0xf8, 0x40, 0xc2, 0x1d, 0x85, 0x0f, 0xb3, 0x9e, + 0x56, 0xd2, 0xd9, 0x4a, 0x55, 0x65, 0x9b, 0xaa, 0xd2, 0xe5, 0xbf, 0x58, + 0x4a, 0xae, 0x3d, 0x10, 0xae, 0x3c, 0x90, 0xcd, 0x3f, 0xd3, 0x52, 0xd9, + 0x4b, 0x9b, 0x83, 0xd8, 0x15, 0xcc, 0xfb, 0x71, 0x29, 0x26, 0x0e, 0x0f, + 0x0f, 0x13, 0x76, 0x9b, 0x5b, 0xb4, 0x50, 0x4b, 0xf2, 0x22, 0xa7, 0x11, + 0x45, 0x44, 0xcc, 0x6d, 0xc7, 0x70, 0x9b, 0x53, 0x1d, 0x29, 0x00, 0x9c, + 0x36, 0x96, 0x3c, 0x97, 0x0e, 0x27, 0xba, 0x9a, 0x5a, 0x62, 0x8c, 0x42, + 0x8e, 0x50, 0xba, 0x11, 0xf2, 0x58, 0x2f, 0x57, 0xa8, 0x61, 0xbb, 0xdd, + 0xce, 0x8f, 0x44, 0x46, 0x72, 0x5c, 0xb7, 0xf8, 0x24, 0x56, 0xce, 0x4a, + 0xe6, 0x8e, 0x09, 0x9b, 0x11, 0x8e, 0x43, 0x4c, 0xa9, 0xad, 0xd2, 0x47, + 0x37, 0xe5, 0x8c, 0x6d, 0x49, 0x2f, 0x2c, 0xef, 0x88, 0x59, 0x4b, 0xab, + 0x40, 0xac, 0x16, 0x45, 0x47, 0x0a, 0x3b, 0xcc, 0x45, 0x34, 0x1b, 0xe9, + 0xb7, 0xf8, 0x8f, 0x84, 0xb8, 0x54, 0x60, 0xd2, 0xee, 0x5e, 0x96, 0x30, + 0xb7, 0xd3, 0xda, 0x1b, 0x8e, 0x87, 0x99, 0x6e, 0x19, 0xb0, 0xda, 0x2b, + 0x94, 0xa5, 0x0d, 0xc2, 0x50, 0x9f, 0x2e, 0xcd, 0x08, 0x15, 0x6b, 0x64, + 0xbe, 0x1b, 0x96, 0xca, 0x2b, 0x31, 0x57, 0x2f, 0xaf, 0xe9, 0x36, 0xff, + 0xd5, 0xa5, 0xfa, 0x65, 0x93, 0x89, 0xf7, 0x65, 0x0c, 0xd6, 0xf3, 0x49, + 0xbd, 0x9e, 0x1e, 0x39, 0x64, 0xa9, 0x46, 0x34, 0x85, 0xac, 0xb8, 0x26, + 0xf1, 0x19, 0xf8, 0x24, 0x93, 0x1a, 0xba, 0x20, 0xf3, 0xca, 0x62, 0xb9, + 0xa9, 0x21, 0x8d, 0xf1, 0xa4, 0x04, 0xb6, 0x16, 0xf1, 0x78, 0xa0, 0x6f, + 0x65, 0x06, 0xfa, 0xed, 0x22, 0xb9, 0x12, 0xdc, 0xf7, 0x8b, 0xbc, 0x9d, + 0x9c, 0x3e, 0xdf, 0x1f, 0xf2, 0x5f, 0x99, 0x82, 0x0a, 0xfe, 0x2b, 0x14, + 0xff, 0xf6, 0x8a, 0xe2, 0xbf, 0x3f, 0x60, 0x37, 0x4a, 0x75, 0xf9, 0x8f, + 0xb0, 0xad, 0x7d, 0x99, 0x62, 0xc6, 0x8f, 0xbc, 0x2f, 0x15, 0x6b, 0xef, + 0xfd, 0x70, 0x2e, 0x30, 0xc8, 0x27, 0x4b, 0x73, 0xca, 0x4a, 0x85, 0xb7, + 0x7e, 0xa0, 0x0c, 0xf4, 0x07, 0xdc, 0xa6, 0xe2, 0x26, 0x86, 0x92, 0x93, + 0x33, 0x4a, 0x38, 0x19, 0xda, 0xde, 0x67, 0x3b, 0xd4, 0x98, 0xca, 0x4e, + 0x23, 0xeb, 0xe5, 0x4f, 0x0e, 0x12, 0x36, 0x4b, 0x49, 0xf9, 0x64, 0x63, + 0xca, 0x8c, 0x4b, 0x7c, 0xfd, 0x41, 0xe9, 0xd8, 0x53, 0xb1, 0xe7, 0x8d, + 0x29, 0xe4, 0xc2, 0xe7, 0x0b, 0x1b, 0xc5, 0x47, 0x03, 0xc9, 0xdf, 0x28, + 0x3f, 0x5b, 0xad, 0xd4, 0x3d, 0x59, 0x43, 0x57, 0x4c, 0x84, 0x76, 0x49, + 0x8c, 0xce, 0x74, 0xbf, 0x9f, 0x39, 0x7d, 0xbb, 0xad, 0xcd, 0x4d, 0x7e, + 0x28, 0x58, 0xe6, 0xef, 0x97, 0x44, 0xef, 0xe7, 0xb4, 0x2e, 0x35, 0xe2, + 0xab, 0x13, 0x88, 0xcd, 0x9d, 0x40, 0xcc, 0x8a, 0x5c, 0x81, 0x96, 0xc9, + 0x49, 0xce, 0x28, 0x9a, 0x7b, 0x3a, 0xb5, 0xd4, 0xc6, 0x1b, 0x0d, 0x5e, + 0xe6, 0x7b, 0x5c, 0x25, 0x6e, 0xc5, 0xd9, 0xd2, 0xd7, 0xe2, 0xc8, 0xa7, + 0xc4, 0x0d, 0x4d, 0x8f, 0xe9, 0xb6, 0x99, 0x83, 0x04, 0xe8, 0xc8, 0xf9, + 0x6c, 0x39, 0x23, 0x5c, 0xa0, 0x81, 0x05, 0x3b, 0x08, 0xfe, 0x04, 0x4b, + 0x51, 0x1e, 0x38, 0xab, 0xc8, 0xab, 0x2e, 0xfa, 0x15, 0x2d, 0x25, 0x6a, + 0x88, 0x8a, 0x2a, 0x18, 0x17, 0x9e, 0xb6, 0x0f, 0x14, 0x3c, 0x88, 0xb4, + 0xb3, 0xb9, 0xf3, 0x83, 0xd7, 0xce, 0x30, 0xf0, 0x43, 0x7f, 0x1c, 0xbd, + 0x3c, 0x7a, 0xbc, 0x35, 0x4f, 0x92, 0xdd, 0x02, 0xdd, 0x22, 0x36, 0xf8, + 0x74, 0xa3, 0xa6, 0x93, 0xca, 0x1d, 0xba, 0x76, 0x18, 0x32, 0x80, 0x39, + 0xfe, 0xa8, 0x01, 0x53, 0xc0, 0xe1, 0xe7, 0x89, 0x45, 0xb7, 0x46, 0xa1, + 0x63, 0xf7, 0x2b, 0xe8, 0xba, 0xb4, 0xa1, 0xb0, 0xd7, 0x6d, 0x3d, 0xda, + 0xdb, 0xdb, 0xed, 0x24, 0x7f, 0x57, 0xa4, 0xde, 0xf4, 0x2b, 0x9d, 0x56, + 0xab, 0xa2, 0x54, 0x46, 0x3d, 0x9c, 0xcf, 0x5c, 0x2f, 0x94, 0xf7, 0x13, + 0xe1, 0x7a, 0xa2, 0xb3, 0xb3, 0xb3, 0xe6, 0x59, 0xb7, 0xe9, 0x07, 0x93, + 0x2d, 0xe4, 0xb6, 0xb6, 0x40, 0x40, 0x13, 0xce, 0x11, 0x97, 0xab, 0x67, + 0x6a, 0xb9, 0xad, 0x5f, 0xb9, 0x2f, 0xc6, 0xf4, 0x5f, 0x45, 0xaf, 0xbf, + 0x29, 0x8a, 0xa0, 0x4d, 0xeb, 0x73, 0xfd, 0x0a, 0x4b, 0xd5, 0x1a, 0x82, + 0x51, 0x6c, 0xdc, 0x3c, 0x6a, 0xef, 0x6c, 0x3f, 0xda, 0xee, 0xb6, 0x91, + 0x70, 0x91, 0x49, 0x08, 0xf0, 0xbc, 0x93, 0x78, 0xde, 0x5a, 0x4e, 0x9f, + 0x45, 0x49, 0x87, 0xe0, 0x21, 0x23, 0x7b, 0x82, 0x65, 0x3f, 0x22, 0xa3, + 0x25, 0x58, 0xb4, 0x90, 0x5a, 0x31, 0x1c, 0xb7, 0x5a, 0xf6, 0x70, 0xd8, + 0xce, 0x73, 0x9c, 0x5d, 0x42, 0x24, 0x16, 0x5b, 0x75, 0x8c, 0x62, 0x71, + 0x0e, 0xf5, 0x22, 0xdc, 0xa7, 0xd5, 0xaf, 0xb0, 0xd9, 0xba, 0xb3, 0x2a, + 0x4e, 0x74, 0x45, 0xf2, 0x4b, 0xae, 0xba, 0x59, 0x0a, 0xcb, 0x51, 0xef, + 0x4a, 0x0b, 0x06, 0x7c, 0x65, 0xd9, 0xba, 0x60, 0x2e, 0x76, 0x2a, 0xf2, + 0x0c, 0xcc, 0x0c, 0x60, 0xb4, 0x08, 0x2f, 0xa8, 0x6a, 0x20, 0x88, 0xc7, + 0x00, 0xea, 0xa9, 0x3a, 0xaa, 0x37, 0x9c, 0xfa, 0xe0, 0x5a, 0x5e, 0x1e, + 0x51, 0x89, 0x17, 0xf3, 0x00, 0x88, 0xdb, 0xcc, 0xda, 0xad, 0xef, 0x3f, + 0xde, 0x22, 0xb8, 0x95, 0x58, 0x4a, 0x69, 0x75, 0x21, 0x57, 0x9d, 0xd6, + 0x57, 0x73, 0xd5, 0xa9, 0x1c, 0x2c, 0x65, 0xe9, 0xf1, 0xd6, 0xa4, 0xa8, + 0x3f, 0x91, 0xbe, 0x9b, 0x74, 0xd3, 0x7d, 0x57, 0xe9, 0xce, 0x7a, 0x81, + 0x0e, 0x94, 0xcb, 0x40, 0xe2, 0x83, 0x1a, 0xab, 0x99, 0x1c, 0xcf, 0x96, + 0xc5, 0xe4, 0x61, 0x29, 0x53, 0x28, 0x69, 0x84, 0x69, 0xe4, 0x4a, 0x1f, + 0x2d, 0x4b, 0xa7, 0x91, 0x45, 0x56, 0x49, 0x65, 0x4b, 0xd7, 0x34, 0x07, + 0xd6, 0xb4, 0xcb, 0x4c, 0x51, 0xf6, 0xa0, 0x5a, 0xcc, 0x8b, 0x1a, 0x7e, + 0x28, 0xaa, 0x46, 0xe3, 0x58, 0x09, 0x0f, 0x9d, 0xfb, 0x42, 0x8d, 0xe9, + 0xa2, 0x3a, 0x16, 0xd7, 0x0a, 0x65, 0x79, 0xe3, 0x25, 0x16, 0x6f, 0x51, + 0xce, 0x52, 0x4c, 0x00, 0xf2, 0x74, 0x2b, 0xa0, 0xf3, 0x46, 0x62, 0x14, + 0x9b, 0x09, 0x39, 0xf0, 0xa1, 0xbc, 0x63, 0xd9, 0x98, 0x71, 0x37, 0xe4, + 0x33, 0xb8, 0x0d, 0x16, 0xc6, 0x96, 0xa4, 0x6f, 0x01, 0xa8, 0x1c, 0x9c, + 0x39, 0x63, 0xe7, 0xf1, 0x96, 0x73, 0xf0, 0xc0, 0x1b, 0x84, 0xf3, 0x7d, + 0xf9, 0xc9, 0x44, 0x74, 0x81, 0xf4, 0x16, 0x53, 0xe5, 0x80, 0xaa, 0x8c, + 0xca, 0x12, 0xc8, 0x81, 0x64, 0xe7, 0x20, 0x66, 0x45, 0x25, 0xcb, 0xaf, + 0x6b, 0x6b, 0x00, 0xad, 0x89, 0x4b, 0xae, 0xc9, 0x75, 0x88, 0x4e, 0x65, + 0xbb, 0x27, 0xc4, 0xfc, 0x89, 0x3f, 0x1e, 0x7f, 0x6d, 0x05, 0xc0, 0xc9, + 0x0d, 0xeb, 0x00, 0xf5, 0xe4, 0x39, 0x91, 0xb4, 0x05, 0xd9, 0xa6, 0x58, + 0x15, 0x8b, 0x24, 0x4e, 0x78, 0xb0, 0x66, 0xe2, 0xb8, 0x45, 0x6d, 0xaa, + 0x2e, 0x3a, 0xf3, 0xbd, 0xa7, 0x74, 0x95, 0x15, 0xae, 0x54, 0x0c, 0x4f, + 0x02, 0xa1, 0xca, 0x55, 0x6b, 0x24, 0xbe, 0x32, 0x59, 0xd1, 0x81, 0x39, + 0xcc, 0x12, 0xc5, 0x99, 0x91, 0x92, 0xac, 0x75, 0x5c, 0x3e, 0xae, 0x32, + 0x13, 0x59, 0x52, 0x77, 0xad, 0x99, 0xe9, 0x34, 0x74, 0xf0, 0x25, 0xc3, + 0xbf, 0x3a, 0xf4, 0x0f, 0x67, 0x85, 0x0f, 0xa1, 0x5f, 0xd7, 0x45, 0xf9, + 0xc0, 0x2d, 0x1f, 0x9e, 0x40, 0x80, 0x7c, 0xdc, 0x3f, 0x93, 0x6e, 0x2e, + 0x2f, 0x21, 0xac, 0xd2, 0x4b, 0xf3, 0x76, 0xaa, 0xc0, 0x5d, 0x5b, 0x3a, + 0x00, 0x49, 0xb7, 0x9c, 0x9b, 0x28, 0xef, 0xad, 0x57, 0xd0, 0x18, 0x43, + 0xd9, 0x18, 0xbe, 0x77, 0xcc, 0xde, 0x2f, 0xfb, 0xf8, 0x55, 0xf1, 0x19, + 0xa8, 0x6b, 0x94, 0xcd, 0xb7, 0x2c, 0xce, 0xe0, 0x9a, 0x96, 0x80, 0x40, + 0xd2, 0x12, 0x97, 0x62, 0xa2, 0xac, 0x46, 0x86, 0x03, 0x20, 0x69, 0xc7, + 0xca, 0x51, 0xe0, 0x5f, 0x27, 0x4e, 0xa6, 0x13, 0x03, 0x4f, 0x73, 0xfc, + 0xbd, 0x59, 0xcc, 0xaa, 0xed, 0xda, 0x92, 0x5a, 0x1b, 0xd5, 0x3c, 0x60, + 0xfc, 0xba, 0xa7, 0xb4, 0x7b, 0x32, 0xd5, 0xf0, 0xf2, 0x13, 0x71, 0xde, + 0x2e, 0x50, 0xf1, 0x55, 0x94, 0x66, 0x69, 0x05, 0x3b, 0xab, 0x55, 0xb0, + 0x5b, 0x5e, 0xc1, 0xce, 0x4d, 0x2a, 0xd8, 0x29, 0xaa, 0x60, 0xe7, 0x2e, + 0x2a, 0xd8, 0xfd, 0xea, 0x0a, 0x76, 0x6f, 0x52, 0xc1, 0x6e, 0x51, 0x05, + 0xbb, 0x5f, 0x59, 0x41, 0xce, 0x5b, 0xd1, 0x54, 0x2c, 0xeb, 0xeb, 0x3f, + 0x5a, 0xa5, 0x47, 0xeb, 0xf5, 0x8a, 0xb8, 0x67, 0xc7, 0x85, 0xae, 0x35, + 0x05, 0xa8, 0x2d, 0x5f, 0x85, 0xb1, 0x92, 0xcf, 0xb2, 0xac, 0x05, 0xcd, + 0x02, 0x6d, 0xe5, 0xe0, 0xda, 0x96, 0xdf, 0xba, 0x5e, 0x33, 0xae, 0x23, + 0xcd, 0xcb, 0x0d, 0x14, 0x72, 0x00, 0x2f, 0x9d, 0xc6, 0xc9, 0x80, 0x86, + 0x28, 0x4e, 0xbc, 0xae, 0xa4, 0x5c, 0xaa, 0x94, 0x0b, 0xe5, 0x72, 0x9d, + 0xad, 0x82, 0x4a, 0x30, 0x1a, 0xe8, 0xd0, 0xb5, 0x75, 0x96, 0xc5, 0x3f, + 0xdb, 0xee, 0x02, 0xe5, 0xb1, 0x74, 0xac, 0xaf, 0xb4, 0xe5, 0x15, 0xa2, + 0x0a, 0x6d, 0xf0, 0x63, 0xb2, 0x86, 0x6f, 0xfb, 0x9c, 0xb3, 0x63, 0xdc, + 0x95, 0xcd, 0x09, 0x64, 0x12, 0x08, 0x1a, 0x1c, 0xf9, 0xeb, 0x2b, 0x85, + 0xc2, 0x38, 0xee, 0x4c, 0x2c, 0x8c, 0x7d, 0x83, 0x82, 0x19, 0x80, 0xbb, + 0xca, 0x01, 0x7d, 0x7e, 0xa5, 0x58, 0x08, 0xc5, 0x9d, 0x49, 0x85, 0x90, + 0x6f, 0x50, 0x28, 0xb4, 0xa3, 0x08, 0x7a, 0xf4, 0xf5, 0xb5, 0x62, 0x21, + 0x1c, 0x77, 0x27, 0x17, 0xc2, 0xbe, 0x49, 0xc1, 0xc8, 0x55, 0xd0, 0xd8, + 0x32, 0xea, 0xa5, 0xae, 0x3d, 0x75, 0x33, 0x4c, 0x57, 0x7e, 0xef, 0xaf, + 0xe5, 0xa3, 0x5b, 0xfa, 0x82, 0x32, 0x08, 0x7c, 0x80, 0xa9, 0x3e, 0xfc, + 0x9c, 0x91, 0x08, 0xc9, 0xe9, 0x22, 0x37, 0xf4, 0x2b, 0xc5, 0x2f, 0x19, + 0xbe, 0x33, 0xf9, 0x4b, 0xf4, 0x1b, 0x6c, 0x00, 0x5e, 0x48, 0xbe, 0x5d, + 0xf9, 0xd3, 0x3c, 0x67, 0x26, 0x82, 0x5b, 0x10, 0x36, 0x98, 0xbb, 0xc3, + 0x01, 0x03, 0xd8, 0xbf, 0x7e, 0xc8, 0x90, 0x2b, 0x32, 0xb8, 0xe5, 0x99, + 0x56, 0x88, 0x72, 0xee, 0xbf, 0x5a, 0x11, 0x2e, 0x9c, 0x05, 0xd0, 0xba, + 0xc2, 0xfe, 0xb5, 0x35, 0xd3, 0x24, 0xce, 0x42, 0x45, 0xe4, 0xd5, 0xc0, + 0x5d, 0x86, 0x0e, 0x0b, 0xa9, 0x67, 0xe1, 0x6b, 0x09, 0x6a, 0x96, 0x51, + 0x57, 0x10, 0x1e, 0x04, 0xa6, 0x30, 0x56, 0xd2, 0x04, 0x63, 0x6a, 0xe5, + 0x7b, 0x77, 0x45, 0x8b, 0xcc, 0x6a, 0xa1, 0x9d, 0x77, 0xae, 0xcc, 0x02, + 0xdd, 0x8d, 0x45, 0x7d, 0x4b, 0x7e, 0xa0, 0x4e, 0xfb, 0xca, 0x89, 0x5b, + 0x72, 0x09, 0x1a, 0xaf, 0x00, 0x28, 0x9d, 0x70, 0x4a, 0x72, 0x45, 0x44, + 0x63, 0x0c, 0xfa, 0xda, 0xc8, 0xf5, 0x94, 0x47, 0x72, 0x72, 0xed, 0xaa, + 0xd3, 0x0a, 0x33, 0xe0, 0x65, 0x9e, 0xf1, 0x36, 0xeb, 0x93, 0xdc, 0x5e, + 0x79, 0x85, 0xae, 0xb4, 0xb8, 0x56, 0xa9, 0x1e, 0x4b, 0x60, 0xae, 0x99, + 0xab, 0x4a, 0xc4, 0x35, 0x4b, 0xc5, 0x70, 0x90, 0x70, 0xe4, 0xaf, 0x35, + 0x9b, 0xf5, 0x7a, 0x86, 0xcd, 0x7e, 0xf1, 0xd1, 0x78, 0x0c, 0x02, 0xa1, + 0xe1, 0xb9, 0x0c, 0x59, 0xd6, 0x35, 0x4f, 0xdc, 0x0d, 0x7a, 0x7d, 0x1f, + 0x65, 0x1b, 0xa7, 0xd9, 0x91, 0xb1, 0x5b, 0x95, 0x75, 0x3b, 0x9e, 0x8e, + 0x40, 0xab, 0x68, 0xa5, 0x68, 0xe4, 0x6a, 0xb1, 0x12, 0x4e, 0x9a, 0x4f, + 0x69, 0x14, 0x39, 0x0c, 0x83, 0x89, 0x8c, 0x5a, 0x49, 0x4f, 0x6a, 0x2c, + 0x5e, 0x82, 0x5f, 0x61, 0x32, 0x46, 0x7f, 0xd7, 0x5b, 0xf4, 0x9b, 0x74, + 0xd5, 0xeb, 0xdb, 0x54, 0xaa, 0xca, 0xb7, 0x98, 0x91, 0x8a, 0xe0, 0x8e, + 0x9b, 0x33, 0x51, 0x5e, 0x45, 0x36, 0xd0, 0x3a, 0x16, 0x6f, 0xde, 0x27, + 0x5e, 0xb9, 0xb0, 0xc7, 0xc3, 0x22, 0xcf, 0x9f, 0x65, 0xad, 0xee, 0x40, + 0x0d, 0xe6, 0x5c, 0x5d, 0xe2, 0xe5, 0xda, 0x79, 0xa2, 0x69, 0x7c, 0x53, + 0xf0, 0x16, 0x9b, 0x9b, 0x85, 0xb2, 0xb2, 0x54, 0xe4, 0x66, 0xcb, 0x5d, + 0xd8, 0xf4, 0x52, 0x45, 0x59, 0x32, 0x26, 0x1a, 0xf5, 0xf9, 0x89, 0x1f, + 0x46, 0xb4, 0x60, 0x2e, 0x15, 0x68, 0xa5, 0x06, 0x31, 0x03, 0xe2, 0x54, + 0x16, 0xbe, 0xdb, 0xf1, 0x70, 0xed, 0x7a, 0x5b, 0x74, 0xad, 0xc3, 0x4a, + 0x95, 0x7f, 0xfd, 0xf3, 0xf7, 0xef, 0x49, 0x00, 0x37, 0xaa, 0xfc, 0xec, + 0x0f, 0x51, 0x74, 0x42, 0x12, 0xf8, 0x8f, 0xab, 0xfd, 0x6a, 0x2d, 0x4f, + 0x95, 0xff, 0xd6, 0x0f, 0xd6, 0xa9, 0xbc, 0x74, 0x44, 0x33, 0xce, 0xe3, + 0xee, 0xce, 0x4e, 0x77, 0x27, 0x21, 0x12, 0x9c, 0x57, 0xf9, 0xcf, 0x13, + 0xc9, 0xee, 0xca, 0x22, 0xf9, 0x45, 0x78, 0xad, 0x35, 0x5d, 0xa2, 0x0f, + 0x14, 0x7c, 0xf1, 0x5f, 0x5c, 0xf9, 0x6f, 0x51, 0x76, 0x8d, 0xca, 0xcf, + 0x01, 0x7e, 0x86, 0x9a, 0x24, 0x04, 0x40, 0x49, 0xff, 0x16, 0x01, 0xac, + 0xb2, 0xc4, 0x79, 0x8b, 0xbe, 0xdf, 0x53, 0x8c, 0x18, 0xb7, 0xd9, 0x75, + 0x24, 0xd6, 0x21, 0xb0, 0xfe, 0xe7, 0x75, 0x9e, 0x64, 0xbd, 0xdf, 0xbd, + 0x78, 0xf2, 0x76, 0x75, 0x7f, 0x57, 0xfe, 0x44, 0xb4, 0x92, 0xbf, 0x71, + 0x8f, 0x57, 0x7b, 0x47, 0xde, 0xd7, 0x36, 0x52, 0x7b, 0x37, 0xd9, 0x42, + 0x38, 0x52, 0xf7, 0x6f, 0x69, 0x9f, 0x0d, 0xa8, 0x77, 0x37, 0x21, 0xb7, + 0xb7, 0xdf, 0xbe, 0x7f, 0x77, 0xf4, 0xcb, 0x75, 0x1b, 0x1a, 0xaf, 0x98, + 0xc2, 0x61, 0xc1, 0x0d, 0x36, 0x75, 0x86, 0xe5, 0xe7, 0x87, 0xcf, 0x8e, + 0x6e, 0xc0, 0x33, 0x0e, 0xd5, 0x6c, 0x72, 0x46, 0x96, 0x61, 0xfa, 0xc5, + 0xe1, 0xeb, 0xd7, 0x87, 0x37, 0xe0, 0x7a, 0x62, 0xcf, 0x66, 0xf6, 0xbf, + 0x8f, 0xed, 0xe3, 0x97, 0xbf, 0xb9, 0x89, 0xac, 0xe1, 0x13, 0xdf, 0xb6, + 0xac, 0xef, 0xba, 0x6b, 0x94, 0x8f, 0x9e, 0x3a, 0xcc, 0x5b, 0xc6, 0x78, + 0xab, 0xc1, 0xd4, 0x6c, 0x2c, 0xab, 0xa1, 0x74, 0xe9, 0xdc, 0x44, 0xe3, + 0x2e, 0xba, 0x07, 0x99, 0xb8, 0x5c, 0x61, 0x47, 0xf1, 0xb5, 0x4d, 0x46, + 0x8e, 0x9f, 0x53, 0xd6, 0x4c, 0xcd, 0x74, 0xcc, 0x4e, 0xd9, 0x0c, 0x80, + 0x15, 0xbd, 0x24, 0xa8, 0x4e, 0x16, 0xac, 0x48, 0xe3, 0x39, 0xe6, 0x33, + 0x2b, 0xd1, 0xa0, 0x89, 0xcf, 0x0d, 0x69, 0x3c, 0x41, 0xac, 0xd3, 0x4a, + 0x34, 0x28, 0xb6, 0xf7, 0xa6, 0x34, 0xa2, 0xd5, 0x44, 0x35, 0x88, 0x6e, + 0x2a, 0x29, 0x50, 0xc0, 0xe6, 0xf0, 0xaa, 0x44, 0xa0, 0x2d, 0x6b, 0xd1, + 0x61, 0xb4, 0x6b, 0xf6, 0x8f, 0xdb, 0x52, 0x6c, 0xd7, 0xfe, 0x2c, 0xde, + 0xd0, 0xe2, 0xde, 0x1a, 0x23, 0xaa, 0x71, 0x8f, 0xb9, 0xb8, 0x87, 0xe2, + 0xb7, 0xe1, 0x1e, 0xea, 0xd0, 0x60, 0x75, 0x70, 0x8d, 0x2f, 0xc4, 0xbf, + 0xa3, 0x41, 0x35, 0x96, 0x56, 0x1c, 0xf6, 0x93, 0x5a, 0xa3, 0x6c, 0x84, + 0xa8, 0x96, 0x5e, 0x5b, 0x97, 0xf9, 0xb1, 0x79, 0x4b, 0xbe, 0x2d, 0x81, + 0xde, 0x5c, 0x96, 0x78, 0x43, 0x55, 0xf2, 0x6d, 0x6f, 0xd7, 0xec, 0x24, + 0xf0, 0xeb, 0x7b, 0xb2, 0xdb, 0x09, 0x44, 0x15, 0xbb, 0x09, 0xfc, 0x7d, + 0xac, 0x58, 0x89, 0x23, 0x86, 0x56, 0x5d, 0xe5, 0xcd, 0x40, 0xc8, 0x1b, + 0xd0, 0xb9, 0x76, 0xf2, 0x67, 0xdc, 0x50, 0xf1, 0x79, 0x4c, 0x16, 0x73, + 0x89, 0xc0, 0x0e, 0x1e, 0xdb, 0x99, 0xf7, 0x92, 0xca, 0xb7, 0xa4, 0x2e, + 0x7d, 0x35, 0x6a, 0x25, 0x41, 0x8e, 0x5f, 0xba, 0x03, 0x51, 0xa2, 0x69, + 0xe9, 0xb5, 0xb6, 0x27, 0x03, 0xd7, 0xc6, 0xf3, 0xc1, 0xb7, 0x81, 0xff, + 0x7b, 0x1a, 0x46, 0xa6, 0x3e, 0xad, 0x52, 0xd8, 0x07, 0x38, 0xa6, 0xfa, + 0x8f, 0xbf, 0xe2, 0x20, 0x43, 0xfb, 0x91, 0xac, 0x93, 0xb5, 0x4e, 0xd4, + 0x5e, 0x61, 0x13, 0xfa, 0x73, 0xe1, 0x95, 0x34, 0xa1, 0x6e, 0x36, 0xa5, + 0x69, 0x5f, 0xdf, 0x6e, 0x71, 0x5b, 0x39, 0x71, 0x84, 0x57, 0xae, 0xa5, + 0xa4, 0x38, 0x96, 0xc5, 0x87, 0xe2, 0x36, 0x0a, 0x67, 0x9e, 0x1c, 0x27, + 0x9d, 0xb1, 0x55, 0x45, 0xe4, 0x17, 0x5e, 0xb2, 0x84, 0xf0, 0xb2, 0x26, + 0xcd, 0x42, 0x0f, 0x27, 0xf4, 0x5a, 0x5a, 0x3e, 0x4a, 0xff, 0x76, 0x5c, + 0x7d, 0xf8, 0xfa, 0xf8, 0xe5, 0xd1, 0xc3, 0xda, 0xbd, 0x7e, 0xbf, 0xd1, + 0xb6, 0xfe, 0xf8, 0x47, 0xcb, 0xc0, 0xe2, 0x84, 0xca, 0x2f, 0xb1, 0xa0, + 0x06, 0x2d, 0x35, 0xc0, 0xef, 0x03, 0x67, 0x84, 0xd2, 0x5b, 0x0f, 0x6b, + 0xd6, 0x41, 0x7c, 0x8b, 0xb7, 0xf9, 0xa3, 0xaa, 0xe0, 0x25, 0xa4, 0x4d, + 0xd7, 0x9f, 0x54, 0x2b, 0x78, 0x57, 0xe7, 0x48, 0x44, 0x32, 0x6c, 0xb0, + 0xb6, 0x9f, 0x06, 0x1c, 0xe1, 0x1c, 0xd1, 0x8c, 0xd8, 0x40, 0x83, 0x1e, + 0xc9, 0x77, 0x85, 0x3e, 0xb9, 0x78, 0x39, 0xaa, 0xe6, 0xa2, 0xe5, 0x6b, + 0x4d, 0xd6, 0xb4, 0xa6, 0x3e, 0xdd, 0xd7, 0xb7, 0x1e, 0x72, 0x3f, 0x79, + 0xb8, 0x2a, 0xc2, 0x78, 0x87, 0xa0, 0x08, 0xd5, 0x14, 0xb5, 0x49, 0x62, + 0x4a, 0x85, 0xfa, 0x2b, 0x51, 0xe6, 0x85, 0xcb, 0xe7, 0x44, 0xf4, 0x12, + 0x3f, 0xea, 0x38, 0xe6, 0x77, 0x24, 0xa3, 0xea, 0x00, 0xfd, 0x01, 0x6e, + 0x60, 0xb0, 0xb0, 0x31, 0x68, 0xc1, 0xab, 0xc0, 0x39, 0xbf, 0x33, 0x4f, + 0x05, 0xbf, 0xca, 0x53, 0xee, 0x0c, 0xf0, 0xd4, 0x9f, 0x5f, 0xd0, 0x75, + 0x21, 0x71, 0x8e, 0xe0, 0xa3, 0x7e, 0x15, 0x52, 0xb5, 0xea, 0x91, 0x37, + 0x71, 0x9d, 0x70, 0x5a, 0xb3, 0x3e, 0x4b, 0xd1, 0xd7, 0x33, 0x90, 0x4e, + 0xd4, 0x64, 0x24, 0x2f, 0xc7, 0x96, 0x9d, 0x44, 0x6d, 0x39, 0x21, 0x26, + 0x27, 0x61, 0x48, 0xb7, 0x7b, 0xd0, 0xc4, 0x3b, 0xac, 0x13, 0xd2, 0x0b, + 0x7e, 0x45, 0x04, 0xb1, 0x68, 0x2f, 0x5c, 0x7e, 0x99, 0xaa, 0xc2, 0x0f, + 0x24, 0x7c, 0xba, 0xe5, 0x33, 0xae, 0x87, 0x70, 0x75, 0x4d, 0xfa, 0xba, + 0x39, 0x85, 0xd7, 0x4b, 0xb4, 0x2c, 0x03, 0x9c, 0xd0, 0x6a, 0x1e, 0x4e, + 0x11, 0xab, 0xf2, 0x95, 0xba, 0xc9, 0xa6, 0x40, 0x4d, 0xca, 0x32, 0x7d, + 0x37, 0x99, 0xab, 0xca, 0x99, 0xcc, 0x5f, 0xbc, 0xb4, 0x7e, 0xd9, 0xad, + 0x62, 0xb6, 0xf8, 0xa1, 0x96, 0x84, 0x8b, 0x03, 0x3b, 0x01, 0x1c, 0xff, + 0x4e, 0x02, 0xa0, 0xd9, 0x92, 0x30, 0xf2, 0x31, 0x0f, 0x16, 0x47, 0x4b, + 0x02, 0xe6, 0x9d, 0xfe, 0x5d, 0x40, 0xe8, 0x28, 0x08, 0xfc, 0xa0, 0x0d, + 0x20, 0xcc, 0xd7, 0xdd, 0x11, 0x1c, 0xab, 0x48, 0xe5, 0xb0, 0x98, 0x0c, + 0xbb, 0x4d, 0x0b, 0x3a, 0x8f, 0x03, 0x45, 0x65, 0x28, 0x3a, 0x40, 0x61, + 0xd1, 0x1e, 0x6e, 0xd8, 0xb4, 0xbe, 0x75, 0xe9, 0x94, 0x1d, 0xce, 0x05, + 0xc9, 0x16, 0x7d, 0x77, 0xf4, 0xf4, 0xed, 0x9b, 0x37, 0x47, 0x4f, 0xdf, + 0xab, 0x37, 0xa0, 0x12, 0xe2, 0x28, 0x40, 0xdb, 0x4f, 0xa0, 0x90, 0xcd, + 0x24, 0x42, 0x17, 0xf7, 0xb2, 0xbc, 0xa6, 0x11, 0x10, 0xc8, 0xf4, 0x1d, + 0x2d, 0x33, 0x7a, 0xb6, 0x9a, 0x4d, 0x00, 0x5a, 0x5b, 0x5b, 0x78, 0xb1, + 0x97, 0x13, 0xc6, 0x4d, 0xd5, 0xc0, 0xc1, 0x00, 0x82, 0x41, 0x12, 0x18, + 0x37, 0xea, 0x81, 0x2b, 0x68, 0x94, 0x1d, 0xe1, 0x0c, 0xc6, 0x8b, 0xc4, + 0x0b, 0x11, 0xd5, 0xd2, 0xc4, 0xd4, 0xc8, 0x90, 0xa4, 0xa7, 0x0a, 0xde, + 0x19, 0xc9, 0x0f, 0x62, 0x10, 0xa2, 0xe3, 0x92, 0xc4, 0xa5, 0xf8, 0x58, + 0x55, 0x65, 0xa2, 0x88, 0x14, 0xd9, 0x74, 0x91, 0x77, 0x38, 0x5e, 0x73, + 0x81, 0x02, 0xfc, 0x5d, 0x04, 0xc0, 0x2d, 0x00, 0x00, 0xfe, 0xe6, 0x14, + 0x20, 0x35, 0xb7, 0x4a, 0x48, 0x19, 0xe2, 0x65, 0x28, 0xdc, 0x2e, 0x46, + 0xf6, 0x77, 0x50, 0x43, 0x91, 0xe4, 0x24, 0xc9, 0xa6, 0x32, 0x64, 0xc8, + 0xfa, 0x20, 0x7f, 0x25, 0x33, 0x67, 0xe6, 0x18, 0x0f, 0x00, 0x5e, 0x8e, + 0xc9, 0x6a, 0xa0, 0x21, 0xc0, 0x2a, 0x31, 0xa6, 0xf6, 0x94, 0xf1, 0x4a, + 0x5a, 0x0c, 0x70, 0x48, 0x61, 0x79, 0x79, 0x11, 0xe6, 0x29, 0xbe, 0x37, + 0x89, 0xb5, 0xed, 0x54, 0x88, 0x39, 0x1d, 0x17, 0x9e, 0xc1, 0x48, 0xa3, + 0x9c, 0x1d, 0x59, 0xa9, 0xbe, 0x36, 0xf2, 0x45, 0xe8, 0x3d, 0x8c, 0xc8, + 0x28, 0x9c, 0x02, 0x2c, 0xff, 0x2a, 0xdc, 0x94, 0xda, 0x62, 0xda, 0xb1, + 0x98, 0x63, 0x3b, 0xcd, 0x6f, 0x8c, 0xc8, 0xda, 0x28, 0x6b, 0x8c, 0x37, + 0xed, 0x9d, 0xe2, 0xe8, 0xf2, 0x34, 0x00, 0x1f, 0xf5, 0xf8, 0xcd, 0xba, + 0x90, 0xf8, 0xd1, 0x68, 0x22, 0x52, 0x8d, 0xc2, 0xee, 0x2b, 0x35, 0x31, + 0x7d, 0xa7, 0xbb, 0xe5, 0x88, 0x1a, 0x32, 0xdd, 0x57, 0x39, 0xdc, 0x0a, + 0xc9, 0x2f, 0xe8, 0x3b, 0x99, 0x41, 0x11, 0x47, 0x48, 0x7f, 0x82, 0xaf, + 0x64, 0x32, 0x4f, 0x85, 0x48, 0x92, 0xf8, 0x4e, 0x66, 0x50, 0xb3, 0x9c, + 0x00, 0x19, 0x58, 0x26, 0xe2, 0x88, 0x61, 0x41, 0x42, 0xe6, 0x84, 0xb5, + 0xca, 0x26, 0x09, 0x79, 0x74, 0xc2, 0x3a, 0x5b, 0xdc, 0x85, 0xb0, 0xcb, + 0xca, 0x52, 0x9e, 0x2c, 0xd8, 0x4a, 0x16, 0xd3, 0xb1, 0x03, 0xcc, 0x92, + 0x56, 0x64, 0x4b, 0xa7, 0x25, 0x21, 0x13, 0xbb, 0xc2, 0x12, 0xfc, 0x98, + 0x13, 0xd4, 0x20, 0x92, 0x07, 0x36, 0xdb, 0x2f, 0x04, 0xac, 0x7e, 0xe6, + 0xa1, 0xcc, 0x3e, 0x05, 0xa0, 0xe8, 0xa7, 0x75, 0x2c, 0x02, 0x0c, 0x1c, + 0x19, 0x38, 0xb3, 0xa4, 0x4f, 0x70, 0x34, 0x9e, 0xf0, 0xcf, 0x2c, 0x94, + 0x59, 0xe5, 0xd6, 0xd8, 0xe8, 0x77, 0x8e, 0x70, 0x7a, 0x4d, 0x58, 0x83, + 0x7e, 0xab, 0x16, 0x7c, 0xd3, 0xa0, 0x66, 0x41, 0x94, 0xea, 0x8c, 0xee, + 0x35, 0xb7, 0x5e, 0x1d, 0x3d, 0xb3, 0x38, 0x25, 0x05, 0x69, 0x96, 0x10, + 0x01, 0x88, 0x2f, 0xeb, 0x2d, 0x79, 0xf9, 0x29, 0x90, 0x78, 0xd9, 0x2e, + 0x46, 0xf5, 0xe2, 0xdb, 0x97, 0x6f, 0x2d, 0x4a, 0xc8, 0x83, 0xbd, 0x9d, + 0xf3, 0x80, 0x1c, 0x83, 0xaa, 0xe7, 0x0c, 0xa4, 0x59, 0xcf, 0x22, 0xaa, + 0xf2, 0x32, 0xab, 0x2c, 0x88, 0x59, 0x3f, 0x02, 0xcc, 0x73, 0xf4, 0x7c, + 0x7a, 0xf9, 0xb9, 0xc8, 0xd7, 0xd3, 0xac, 0xd8, 0x90, 0x42, 0xd3, 0x0a, + 0x0c, 0x3a, 0x43, 0xa0, 0x5e, 0x1d, 0x97, 0x85, 0x36, 0x0b, 0x25, 0xac, + 0x0b, 0x93, 0x19, 0x75, 0xeb, 0x63, 0xe7, 0x4b, 0x96, 0xba, 0x59, 0x30, + 0x30, 0x3a, 0xc3, 0x07, 0x24, 0xc7, 0x70, 0x66, 0x65, 0x67, 0x4b, 0xd7, + 0x29, 0x9e, 0xf6, 0x03, 0x1e, 0xaf, 0x82, 0xcc, 0x34, 0x5d, 0x3c, 0x61, + 0xa7, 0x5c, 0x71, 0x9e, 0x6e, 0x82, 0x78, 0xa6, 0x4d, 0x1d, 0xcf, 0x1c, + 0xf8, 0xcd, 0x83, 0x44, 0x1e, 0x41, 0xf0, 0x88, 0x96, 0x21, 0x6e, 0x66, + 0xb9, 0x9a, 0x5d, 0xb2, 0x9e, 0x12, 0x34, 0x05, 0x99, 0xdc, 0xa0, 0x8e, + 0x41, 0xd5, 0x81, 0x71, 0xb9, 0x1d, 0x9b, 0x02, 0x97, 0x5b, 0xa4, 0x64, + 0x56, 0xe8, 0x47, 0xc6, 0x24, 0x08, 0xa6, 0xf6, 0x81, 0xbe, 0x93, 0x19, + 0xb9, 0xfd, 0x7c, 0xaa, 0x73, 0x9c, 0x66, 0xe9, 0xc4, 0x64, 0x11, 0xf5, + 0x26, 0x6e, 0x72, 0x4d, 0xa8, 0x9f, 0xa0, 0xe5, 0x3e, 0x93, 0x11, 0xa4, + 0xe7, 0x24, 0x98, 0x99, 0xee, 0x02, 0xea, 0x30, 0x3e, 0x58, 0x92, 0x30, + 0xbb, 0xd6, 0x31, 0x81, 0x58, 0x0c, 0x63, 0x55, 0x7f, 0x5b, 0xd9, 0xff, + 0x6d, 0x05, 0x55, 0xc6, 0xe9, 0x38, 0x1a, 0x4d, 0x52, 0x5e, 0x4f, 0x72, + 0x96, 0x46, 0x8e, 0xc4, 0x31, 0x95, 0xd3, 0x09, 0x19, 0x40, 0xb6, 0xa0, + 0x3a, 0x4f, 0x26, 0x64, 0x21, 0xd2, 0x03, 0x22, 0x25, 0x25, 0x46, 0xf6, + 0xb2, 0x81, 0xd0, 0xa0, 0x98, 0xcb, 0x09, 0xd5, 0x4f, 0x7c, 0x36, 0x3b, + 0xc9, 0xe9, 0x55, 0x45, 0x02, 0x5d, 0x29, 0x60, 0xcf, 0x2d, 0x75, 0x10, + 0xdf, 0x08, 0x74, 0x5c, 0x24, 0x8c, 0xc2, 0xbb, 0xf5, 0x11, 0xd1, 0x59, + 0x07, 0xbe, 0x87, 0xc9, 0xc8, 0x12, 0x1f, 0xd1, 0x73, 0x60, 0x8f, 0x63, + 0xc0, 0x32, 0x2f, 0xf1, 0x97, 0x00, 0xa0, 0xb1, 0xd3, 0x9f, 0x03, 0x7e, + 0x71, 0xb6, 0xcc, 0x57, 0xfc, 0x19, 0x34, 0x27, 0x46, 0xea, 0x10, 0x52, + 0x0c, 0xd2, 0xc9, 0x01, 0xb7, 0xb9, 0xdc, 0x4f, 0x3c, 0x15, 0x18, 0x55, + 0x26, 0x02, 0x72, 0x1e, 0xe0, 0xd7, 0xa8, 0x69, 0xbd, 0x10, 0x83, 0x60, + 0xe1, 0x9c, 0x5a, 0x30, 0x2b, 0x19, 0x36, 0xac, 0x53, 0xcf, 0x9f, 0x5b, + 0xfe, 0x2c, 0x7e, 0x86, 0x26, 0x72, 0xb9, 0x40, 0x94, 0xfb, 0x8e, 0xfc, + 0x8d, 0xe6, 0x18, 0x89, 0xbb, 0xf0, 0x71, 0x32, 0x8e, 0xe3, 0x4b, 0xba, + 0x12, 0xca, 0x75, 0xf1, 0x24, 0xbc, 0x3b, 0xa5, 0xa9, 0xc6, 0xd6, 0xe4, + 0x28, 0x1b, 0x9a, 0x16, 0x58, 0xe2, 0x37, 0xfe, 0xcc, 0xb5, 0xed, 0x60, + 0x89, 0xdb, 0xf8, 0x9c, 0x56, 0x7e, 0x07, 0xce, 0xef, 0x25, 0xf7, 0x58, + 0x6d, 0xf3, 0xb4, 0xef, 0x28, 0xb4, 0xeb, 0xa8, 0x9a, 0x4a, 0xb7, 0xc2, + 0x1d, 0xd4, 0x50, 0x24, 0x98, 0x29, 0x71, 0x1c, 0x51, 0x8b, 0x70, 0x38, + 0x5d, 0x9c, 0x2d, 0xf5, 0x1e, 0x0f, 0x71, 0xb9, 0xcb, 0x02, 0x3d, 0x00, + 0x35, 0xc2, 0xc2, 0xc2, 0x70, 0x0a, 0x72, 0x42, 0x84, 0xb8, 0x46, 0x61, + 0x42, 0xac, 0xa1, 0x0a, 0xd0, 0x5b, 0x9e, 0x23, 0x36, 0xd3, 0x0e, 0xe2, + 0x99, 0x08, 0x4e, 0x23, 0xd6, 0xea, 0x42, 0xf7, 0xd0, 0xe8, 0x28, 0xdd, + 0x4f, 0x33, 0xb6, 0xa3, 0xd0, 0x17, 0x08, 0x10, 0xfa, 0xfd, 0xa9, 0xf1, + 0x0e, 0xbf, 0xf8, 0x36, 0x68, 0x4b, 0xf7, 0x10, 0x17, 0x84, 0x69, 0x07, + 0x31, 0xef, 0x18, 0x72, 0x93, 0x88, 0x45, 0x91, 0x63, 0xe8, 0xfb, 0x25, + 0x9e, 0xa1, 0x5f, 0xe2, 0x19, 0xda, 0x8b, 0xb3, 0x42, 0xd7, 0xd0, 0x89, + 0xca, 0x1d, 0xc3, 0x17, 0x40, 0x4a, 0x4e, 0xdd, 0x8c, 0x9c, 0xba, 0xa9, + 0x3f, 0x01, 0xef, 0xa3, 0x72, 0x6f, 0x30, 0x5b, 0xc0, 0xb5, 0xb9, 0xc0, + 0x6a, 0x5e, 0xe0, 0x6c, 0x75, 0x2f, 0x90, 0xd4, 0xeb, 0xbd, 0x6d, 0xbb, + 0x9b, 0x74, 0x02, 0x85, 0xb7, 0xaa, 0x0f, 0x38, 0x91, 0xad, 0x0f, 0x01, + 0x78, 0xb6, 0x3d, 0x5b, 0xc1, 0x13, 0x3c, 0xb3, 0xa1, 0x7b, 0x67, 0xfe, + 0x72, 0x5f, 0x10, 0x5e, 0x20, 0xcb, 0xf5, 0x6b, 0x7c, 0xbc, 0x15, 0xbc, + 0xc5, 0xac, 0x1b, 0xe8, 0xe3, 0x59, 0xfc, 0x2f, 0x78, 0x81, 0xa4, 0x33, + 0x73, 0x1b, 0x3d, 0xdb, 0xb6, 0x4e, 0xa9, 0x47, 0x09, 0xaf, 0xd4, 0x0d, + 0x3c, 0x74, 0x27, 0x62, 0x06, 0x3d, 0x5e, 0xe2, 0x09, 0x9e, 0x86, 0xe5, + 0xae, 0xe0, 0x21, 0x5a, 0x53, 0x04, 0x70, 0x06, 0xcb, 0x7d, 0xc1, 0x9f, + 0x61, 0xa4, 0xc2, 0x42, 0xe9, 0x12, 0x5f, 0xf0, 0x85, 0x38, 0xc5, 0x14, + 0x12, 0x23, 0x18, 0x81, 0x5e, 0xef, 0x09, 0x52, 0xed, 0xd8, 0x50, 0x58, + 0xa7, 0x8e, 0xf8, 0xb2, 0xc4, 0x19, 0x3c, 0x15, 0x6e, 0xa1, 0x33, 0xe8, + 0x5c, 0xef, 0x0b, 0xbe, 0xfd, 0x8c, 0x5a, 0xa1, 0x2b, 0x86, 0x82, 0x93, + 0x84, 0xb7, 0xc4, 0x15, 0xa4, 0x2f, 0x8b, 0xfd, 0x41, 0x1a, 0x7d, 0xaf, + 0xf5, 0x05, 0x51, 0x87, 0x84, 0x89, 0xa5, 0x91, 0x64, 0xe1, 0x1a, 0x47, + 0x70, 0x22, 0x60, 0xcb, 0x05, 0x2d, 0xa3, 0x2e, 0xf5, 0x04, 0x53, 0xa3, + 0xab, 0x3f, 0x07, 0x21, 0xdb, 0x2b, 0x72, 0x08, 0x33, 0x70, 0xc0, 0x4e, + 0x76, 0x2a, 0x07, 0x9a, 0x1f, 0xf3, 0xa6, 0x22, 0xd2, 0x78, 0x73, 0xc3, + 0xdc, 0x4a, 0x7e, 0xa1, 0xd4, 0xbf, 0x8c, 0x67, 0x38, 0x12, 0xa5, 0x9e, + 0xe1, 0x33, 0xb1, 0x88, 0xc2, 0xe1, 0x1d, 0x2f, 0x1d, 0x92, 0x5b, 0xb0, + 0xb8, 0xc6, 0x2d, 0xc4, 0x12, 0x31, 0x9a, 0xd1, 0x8b, 0xca, 0x1c, 0xc2, + 0x0f, 0x0e, 0xf9, 0xb0, 0xc6, 0xc3, 0xb8, 0xc6, 0x23, 0xf4, 0xa0, 0xd7, + 0x1e, 0x0f, 0xb8, 0x33, 0x27, 0xe9, 0x0b, 0x26, 0x5c, 0x14, 0xeb, 0x27, + 0x08, 0x0c, 0xb5, 0x44, 0xb8, 0xdc, 0x3b, 0x9c, 0xd9, 0x2e, 0x2f, 0xfb, + 0x2e, 0x80, 0xab, 0x69, 0x3d, 0x11, 0xde, 0x22, 0xfa, 0x22, 0xac, 0x0f, + 0x2f, 0x8f, 0x9e, 0x1d, 0xbd, 0xb3, 0x7e, 0x79, 0xf4, 0xee, 0xc9, 0xcb, + 0x37, 0xcf, 0x8e, 0xde, 0xd4, 0xad, 0xc5, 0x8c, 0x50, 0x79, 0xfe, 0x70, + 0x4a, 0x25, 0xbe, 0x2c, 0xb8, 0xf5, 0x9c, 0xa5, 0x8e, 0xe1, 0x2b, 0x32, + 0x59, 0x78, 0x70, 0xee, 0x6a, 0x75, 0x4f, 0xa9, 0x6e, 0x4c, 0xeb, 0xc8, + 0x91, 0x7a, 0xb9, 0x20, 0xbd, 0xbc, 0x2b, 0xa2, 0x6a, 0xb8, 0x35, 0x3e, + 0x3c, 0xa4, 0xb5, 0xd2, 0x82, 0xe2, 0x73, 0x11, 0x44, 0xce, 0xa4, 0x74, + 0x45, 0x91, 0x21, 0xa6, 0x2e, 0x74, 0x60, 0x20, 0x9c, 0x99, 0xf5, 0x8a, + 0xbd, 0x43, 0x52, 0x89, 0x43, 0xbd, 0xb2, 0x18, 0x36, 0x48, 0x98, 0x75, + 0x74, 0x24, 0xbc, 0xbf, 0x58, 0x36, 0x85, 0x69, 0xbc, 0x3b, 0x71, 0x84, + 0x45, 0x92, 0xb1, 0x25, 0x2b, 0x8c, 0x8b, 0x65, 0x3e, 0xe2, 0x07, 0xa8, + 0x3d, 0x46, 0x18, 0x6c, 0x5a, 0x60, 0x18, 0x84, 0x42, 0xe0, 0x56, 0xc1, + 0x05, 0x4f, 0x10, 0xc1, 0x73, 0x1d, 0x7c, 0x61, 0xe1, 0x2b, 0x3a, 0xc3, + 0x49, 0x7a, 0x74, 0x53, 0x47, 0x8c, 0x61, 0xaa, 0xe0, 0x66, 0x8d, 0x49, + 0x7f, 0x9f, 0x70, 0x3d, 0x21, 0x86, 0x53, 0xa1, 0x10, 0xd0, 0xdd, 0x65, + 0x75, 0x7c, 0x85, 0x61, 0xca, 0x9d, 0x54, 0x3d, 0xc1, 0x99, 0xe5, 0x3d, + 0x49, 0x6b, 0xbc, 0xf0, 0x4e, 0x49, 0x78, 0x0e, 0xa4, 0xaf, 0x51, 0x7a, + 0x62, 0x3a, 0x53, 0x28, 0x71, 0xe3, 0x2e, 0x7e, 0xd9, 0xa7, 0xd1, 0x02, + 0x7a, 0x83, 0x5f, 0x4f, 0x94, 0x7b, 0x79, 0x86, 0xbc, 0x2f, 0xcd, 0x27, + 0xcd, 0xfc, 0x02, 0xe4, 0x48, 0x2c, 0x59, 0x82, 0x7c, 0x6e, 0x07, 0x03, + 0x51, 0xe4, 0x69, 0x46, 0xc5, 0x8e, 0xe6, 0x3f, 0xff, 0x5e, 0xe6, 0x68, + 0x16, 0xfa, 0x99, 0xc2, 0xf9, 0xe7, 0x9f, 0xcb, 0x3d, 0xcd, 0xc3, 0xd3, + 0x2f, 0x82, 0x7c, 0x8d, 0x00, 0xeb, 0xb3, 0x54, 0x2f, 0xeb, 0x0d, 0x3b, + 0x3b, 0x1e, 0xe8, 0xfd, 0xf3, 0x6f, 0xff, 0xfc, 0xb3, 0x08, 0xca, 0x9c, + 0xce, 0x65, 0x65, 0x4f, 0x5d, 0x7a, 0x0c, 0x56, 0x71, 0x3f, 0x57, 0x5b, + 0x84, 0x9c, 0x07, 0x36, 0xb4, 0x15, 0xaf, 0x6a, 0x0e, 0xcf, 0xfe, 0xf9, + 0x97, 0x29, 0x64, 0xbe, 0x49, 0x17, 0x74, 0xf1, 0xef, 0x5f, 0x87, 0x3c, + 0xf4, 0xbe, 0xd8, 0x53, 0x77, 0xb9, 0x6b, 0xf9, 0x4e, 0x38, 0xe8, 0x1c, + 0x63, 0x1f, 0x5e, 0xd4, 0xcd, 0x5d, 0xd5, 0xe2, 0xe5, 0x48, 0xe1, 0x25, + 0x44, 0x7f, 0x2b, 0x4e, 0xe9, 0x0b, 0xf2, 0x2d, 0xce, 0x9a, 0xab, 0xb8, + 0xa5, 0x3f, 0x83, 0x5b, 0xda, 0x5c, 0xc9, 0x23, 0x7d, 0xc1, 0x2a, 0xbb, + 0xd4, 0x29, 0x7d, 0x19, 0xaf, 0x49, 0x52, 0xaf, 0x4b, 0xd5, 0x6b, 0xe9, + 0xf2, 0xa4, 0x7d, 0xb3, 0xe5, 0xc9, 0x9f, 0xf0, 0x1a, 0xe8, 0x64, 0xc9, + 0xf2, 0xe4, 0x7b, 0xdc, 0x82, 0x7f, 0x8d, 0x47, 0xca, 0xfc, 0xc1, 0x02, + 0x31, 0xe8, 0x32, 0x9f, 0x94, 0xaa, 0x74, 0x66, 0x03, 0xf6, 0x62, 0x9e, + 0xa9, 0x57, 0xde, 0x27, 0xfd, 0x59, 0x20, 0x9c, 0xb0, 0xc8, 0x25, 0x7d, + 0x67, 0x8f, 0xae, 0xf3, 0x48, 0xff, 0xf9, 0xa7, 0x41, 0xc2, 0x25, 0x85, + 0xb7, 0x7c, 0xad, 0x47, 0x0a, 0x6b, 0xfa, 0xd9, 0x59, 0xea, 0x92, 0xe2, + 0x7d, 0xfb, 0x11, 0x00, 0xae, 0x59, 0x9b, 0xd4, 0x0e, 0xd1, 0x32, 0x87, + 0x34, 0x33, 0xa2, 0xe3, 0x3c, 0xa8, 0x03, 0xdb, 0x11, 0x14, 0xfa, 0xa4, + 0x29, 0x50, 0x60, 0xd7, 0xc0, 0xd1, 0xbd, 0x2c, 0x74, 0xe1, 0x78, 0x7b, + 0xac, 0xc0, 0x79, 0xcc, 0x4d, 0xd3, 0x2d, 0x1b, 0x71, 0x57, 0x58, 0xc9, + 0xc4, 0x22, 0xc7, 0x4f, 0xf4, 0x4a, 0xa6, 0x7c, 0x77, 0x02, 0x36, 0xfe, + 0xe5, 0x0e, 0xb8, 0x09, 0x46, 0x36, 0x7b, 0xe0, 0x2f, 0xde, 0x3d, 0x41, + 0x49, 0x7c, 0x6a, 0xb4, 0x2f, 0x9e, 0xbc, 0x43, 0x02, 0x3e, 0x75, 0x02, + 0xda, 0x40, 0xb6, 0x44, 0x9c, 0xf0, 0xe4, 0x05, 0x12, 0xf0, 0xa9, 0x13, + 0x9e, 0xbc, 0xa3, 0x04, 0x7c, 0xc6, 0x09, 0x2f, 0x08, 0x07, 0x3e, 0x75, + 0xc2, 0x07, 0x49, 0x86, 0xbe, 0xe2, 0x24, 0x49, 0x88, 0xbe, 0xe2, 0x24, + 0x49, 0x8a, 0xbe, 0xe2, 0x24, 0x49, 0x8c, 0xbe, 0xe2, 0x24, 0x49, 0x0e, + 0x5f, 0x26, 0x49, 0x12, 0xa4, 0xaf, 0xb8, 0x1a, 0x1f, 0x98, 0x22, 0x7d, + 0x99, 0x24, 0x59, 0xb5, 0x0f, 0x89, 0xba, 0x7d, 0x60, 0x8a, 0xf4, 0x15, + 0xf3, 0xfe, 0x81, 0xd1, 0xd3, 0x97, 0x49, 0x92, 0xf5, 0xf9, 0x90, 0x40, + 0xff, 0xee, 0x03, 0x15, 0xa4, 0x2f, 0x23, 0xb8, 0x0f, 0x04, 0x45, 0x5f, + 0x46, 0x74, 0x0c, 0x45, 0x5f, 0x46, 0x78, 0x1f, 0xa4, 0xf4, 0x3e, 0x24, + 0xc4, 0xc7, 0x49, 0xf4, 0x65, 0x04, 0xc8, 0xb8, 0xe8, 0xcb, 0x50, 0xe4, + 0x1e, 0x41, 0x5f, 0x39, 0x8a, 0xc5, 0x50, 0xa6, 0xb9, 0x28, 0x89, 0xbe, + 0x0c, 0x45, 0x4e, 0xc2, 0x57, 0x61, 0x52, 0x5a, 0x67, 0x4c, 0x5c, 0xb3, + 0xd1, 0x9a, 0x56, 0x0f, 0x1f, 0x95, 0x37, 0x6f, 0xdf, 0xbd, 0x3e, 0x7c, + 0xa5, 0x31, 0xb4, 0x3b, 0x7b, 0x44, 0xe6, 0x08, 0x1e, 0xfc, 0xf1, 0x51, + 0x16, 0x87, 0x89, 0x33, 0x56, 0x48, 0x24, 0x16, 0xc2, 0xf1, 0xe6, 0x28, + 0xc6, 0xb0, 0x8b, 0x04, 0xb2, 0xf3, 0x27, 0xbf, 0x7a, 0x7e, 0x78, 0xfc, + 0x5e, 0x27, 0x77, 0x3b, 0x3a, 0x39, 0x99, 0xba, 0xbd, 0xa7, 0x53, 0x5f, + 0x1f, 0x3d, 0x7b, 0xf9, 0x8b, 0xd7, 0x3a, 0x7d, 0x77, 0x5b, 0xa7, 0x1f, + 0xbf, 0x7a, 0x1b, 0x57, 0x6f, 0xaf, 0x15, 0xa3, 0x4e, 0x26, 0x3f, 0x32, + 0x14, 0x93, 0xe9, 0xed, 0x76, 0x4c, 0xf2, 0xc5, 0xab, 0xc3, 0xa7, 0x2f, + 0x0f, 0x5f, 0xc5, 0xf5, 0x31, 0x35, 0x32, 0x31, 0xc8, 0xb2, 0x4a, 0xa6, + 0x46, 0x16, 0x0f, 0x41, 0x31, 0x69, 0xa4, 0x71, 0x42, 0x56, 0x26, 0x26, + 0x1e, 0x38, 0x8d, 0x00, 0xe3, 0x12, 0x98, 0x87, 0x64, 0x63, 0xd1, 0x76, + 0x64, 0x6a, 0xb6, 0xaa, 0xdb, 0x3a, 0xf9, 0xd5, 0xe1, 0xbb, 0x17, 0x47, + 0xb1, 0x00, 0x74, 0xea, 0xaf, 0x64, 0xb2, 0xe1, 0x9c, 0x02, 0x7a, 0xee, + 0x51, 0x44, 0x8c, 0x99, 0x06, 0xd2, 0x65, 0x76, 0x71, 0x70, 0x42, 0xb5, + 0xe1, 0x38, 0x63, 0xd1, 0x9c, 0x61, 0xc3, 0xe4, 0xf7, 0x61, 0x8d, 0x01, + 0x0b, 0x22, 0xd9, 0xe6, 0x58, 0x45, 0xa6, 0xa0, 0xaf, 0xad, 0x62, 0x24, + 0x89, 0x88, 0x9b, 0x77, 0x09, 0x00, 0xf8, 0x6c, 0xc7, 0x9c, 0xdf, 0x87, + 0x7b, 0xcc, 0xcb, 0x44, 0xd5, 0xda, 0x65, 0x85, 0xf6, 0xe2, 0x69, 0xb6, + 0x80, 0xd0, 0x95, 0x7d, 0x2a, 0x21, 0x4c, 0x6e, 0x54, 0xf7, 0x6a, 0x97, + 0x81, 0x88, 0x16, 0x81, 0x57, 0x15, 0xfd, 0xb7, 0x03, 0xb2, 0x73, 0x4d, + 0xcc, 0x1f, 0x60, 0xe4, 0x22, 0x9f, 0x42, 0xd5, 0xde, 0x8e, 0xff, 0xf8, + 0xc7, 0xcb, 0x93, 0x93, 0x39, 0x3d, 0x9f, 0x9c, 0xf4, 0x3e, 0x7e, 0xba, + 0x22, 0x0b, 0x4a, 0x37, 0x0d, 0x63, 0x6d, 0xf6, 0x90, 0x2e, 0x98, 0x7c, + 0xf0, 0x20, 0xc6, 0x26, 0xea, 0x51, 0xed, 0x52, 0x34, 0x63, 0xf0, 0x7e, + 0x74, 0xf5, 0xc7, 0x3f, 0xa6, 0x73, 0xc7, 0xb8, 0x08, 0x8b, 0x78, 0xf0, + 0xf8, 0x52, 0xf2, 0x5a, 0xd4, 0x9c, 0xda, 0xe1, 0xdb, 0x33, 0x0f, 0xf4, + 0xe6, 0x30, 0xe9, 0x17, 0x55, 0xaf, 0xf6, 0xe0, 0x41, 0x55, 0x7c, 0xf4, + 0x3e, 0xf5, 0x23, 0x7c, 0xd4, 0xae, 0x6a, 0xcc, 0xe2, 0xd5, 0xbe, 0xc2, + 0x82, 0x32, 0x92, 0xe7, 0xf8, 0xd9, 0x47, 0x0d, 0x29, 0xc0, 0xa1, 0x09, + 0x29, 0xa0, 0x92, 0x0b, 0x34, 0x77, 0x00, 0xba, 0x82, 0xc1, 0xea, 0x51, + 0x93, 0x59, 0x51, 0xd7, 0x4e, 0xe3, 0xa2, 0xcb, 0x7e, 0xdf, 0xfb, 0x46, + 0x55, 0x73, 0xc8, 0x0e, 0x36, 0x28, 0xf6, 0xaa, 0x7e, 0x12, 0xcc, 0xfc, + 0xae, 0xe3, 0x02, 0x35, 0xcb, 0xaf, 0x5d, 0x31, 0xc3, 0x46, 0x68, 0x5a, + 0x62, 0x56, 0xb2, 0x6a, 0x8a, 0x0b, 0x15, 0x56, 0x18, 0xd5, 0xf9, 0x89, + 0x11, 0x8a, 0xab, 0xab, 0x6a, 0xad, 0xee, 0xf7, 0x0d, 0x74, 0x82, 0x7d, + 0xd5, 0x04, 0x44, 0xc1, 0xef, 0x8b, 0xe6, 0x10, 0xef, 0xbf, 0xab, 0x52, + 0xd1, 0x7a, 0x85, 0xe7, 0x68, 0x15, 0x64, 0xfe, 0xf1, 0x8f, 0x94, 0xb0, + 0xaf, 0x68, 0xfa, 0x4d, 0xb5, 0x1a, 0xdc, 0x8f, 0xf4, 0xaf, 0xba, 0xdf, + 0x64, 0x60, 0x50, 0xf5, 0xaf, 0x14, 0x58, 0x54, 0xf5, 0xea, 0xa2, 0x56, + 0xf7, 0xae, 0x50, 0xbf, 0x7a, 0xb0, 0x84, 0x76, 0xdd, 0x07, 0x75, 0x1f, + 0x41, 0xb1, 0x2d, 0xc8, 0x26, 0x82, 0xf0, 0xa3, 0x7e, 0x5b, 0x74, 0x6b, + 0xf5, 0x38, 0xcd, 0x43, 0x1a, 0x82, 0x0e, 0x2b, 0x35, 0xd6, 0x9d, 0x20, + 0xcd, 0xe4, 0xd0, 0xf5, 0x43, 0xcc, 0x8b, 0xfc, 0x0c, 0x93, 0x41, 0x13, + 0x13, 0xbf, 0xa7, 0xd8, 0x1f, 0xf4, 0xfa, 0xf7, 0x5a, 0xf5, 0x00, 0x6d, + 0x33, 0x02, 0xbf, 0xf8, 0x01, 0x91, 0x87, 0xbe, 0xd7, 0xf7, 0xea, 0x41, + 0x21, 0xa3, 0x4e, 0x52, 0xc8, 0xce, 0xb8, 0x0a, 0xbf, 0x9e, 0x23, 0xe2, + 0xb0, 0x39, 0x79, 0xaf, 0x0f, 0x61, 0x92, 0xd2, 0xc5, 0x3a, 0x5e, 0x93, + 0x18, 0x4c, 0xc2, 0x55, 0x3d, 0xec, 0x5f, 0xe2, 0x30, 0x8d, 0xea, 0x11, + 0x8c, 0xe7, 0x99, 0xa0, 0x53, 0xc8, 0x6d, 0xb1, 0x5d, 0x47, 0x87, 0x2b, + 0xca, 0xe8, 0xfe, 0x70, 0x5b, 0x74, 0x7f, 0xf0, 0xda, 0x8e, 0xa6, 0x4d, + 0xb8, 0x51, 0x23, 0x7f, 0x56, 0xad, 0x11, 0xe8, 0x2f, 0xe6, 0x14, 0x86, + 0xd5, 0xdb, 0x11, 0xdd, 0x7a, 0x90, 0x2d, 0xf5, 0x02, 0x73, 0xc9, 0xe7, + 0x36, 0x29, 0x5a, 0xaf, 0xdd, 0xec, 0xd6, 0x4d, 0xee, 0x7b, 0x14, 0xc1, + 0x8a, 0x58, 0x6f, 0x1b, 0xa5, 0x98, 0x8f, 0x28, 0xa0, 0x15, 0xe2, 0xf6, + 0x56, 0xab, 0x3e, 0x12, 0x83, 0xc5, 0xa4, 0x77, 0xaf, 0x7d, 0xb5, 0x9f, + 0xd5, 0x9d, 0x44, 0x83, 0x08, 0x28, 0x12, 0xab, 0x43, 0x46, 0xf8, 0x97, + 0x57, 0x52, 0xf8, 0x7e, 0x9f, 0x85, 0xcc, 0xaa, 0x75, 0xe2, 0x3a, 0xe4, + 0x95, 0x8a, 0x00, 0x75, 0xe6, 0xd6, 0x47, 0xdf, 0xac, 0x2b, 0x85, 0xa0, + 0x9f, 0x14, 0x6d, 0x4a, 0xdf, 0xdc, 0x42, 0xd4, 0x6f, 0xeb, 0xb2, 0x18, + 0xc8, 0x07, 0x17, 0x3c, 0x7b, 0x41, 0x8c, 0xa6, 0x4a, 0x0b, 0xa7, 0x14, + 0xb6, 0x16, 0x4b, 0x07, 0x6d, 0xa6, 0x32, 0x54, 0xc2, 0x2b, 0x88, 0xb7, + 0x7f, 0x4f, 0x43, 0x0f, 0xb0, 0x50, 0x17, 0x5c, 0xbc, 0x97, 0x71, 0xac, + 0xae, 0x3f, 0xa8, 0xa8, 0x74, 0xa6, 0xf4, 0x14, 0xba, 0x21, 0x46, 0x06, + 0x58, 0x71, 0xf4, 0xf3, 0x85, 0x40, 0xec, 0xf9, 0xc7, 0x4f, 0x32, 0xd5, + 0xf7, 0x18, 0xb6, 0x2f, 0xab, 0xa9, 0xd3, 0xb8, 0x16, 0x99, 0x34, 0x55, + 0x3c, 0x93, 0x4a, 0x75, 0x4b, 0x25, 0x9d, 0x4c, 0xd1, 0x74, 0xae, 0x78, + 0x8b, 0xf4, 0x94, 0xaa, 0xfb, 0xcd, 0x13, 0x16, 0x7c, 0xb5, 0x42, 0x45, + 0x2c, 0xbe, 0x81, 0x4f, 0x29, 0x72, 0xd4, 0x47, 0xa6, 0x2f, 0xa7, 0x52, + 0xcd, 0xb8, 0xc1, 0xeb, 0xc0, 0x1b, 0x77, 0x86, 0x6f, 0x12, 0x19, 0xbd, + 0x68, 0x7f, 0x08, 0x7d, 0x0e, 0x54, 0x13, 0x57, 0xfd, 0x58, 0x38, 0x2a, + 0xa5, 0x56, 0x47, 0xd2, 0x82, 0x61, 0x55, 0x4a, 0x1f, 0x76, 0x54, 0x83, + 0xe7, 0x6d, 0x07, 0xa0, 0x71, 0x83, 0x2f, 0xe6, 0xe6, 0x60, 0x1a, 0xc9, + 0x57, 0x75, 0x8f, 0x31, 0x9c, 0x85, 0xcd, 0x84, 0x7c, 0x91, 0x60, 0x9e, + 0x90, 0x9d, 0x12, 0x67, 0x13, 0xb6, 0xf4, 0x08, 0x73, 0x6e, 0x83, 0x5c, + 0xc4, 0xd8, 0x25, 0xa6, 0x10, 0x77, 0xcb, 0x21, 0xf1, 0x0a, 0x98, 0xf3, + 0x2d, 0xe1, 0x2b, 0x41, 0x3e, 0x78, 0xa0, 0x7e, 0x51, 0x79, 0xa4, 0x1a, + 0xc5, 0x6a, 0x52, 0x62, 0x9e, 0x4a, 0x94, 0xa4, 0x42, 0xb6, 0xe0, 0x88, + 0xc4, 0xfa, 0x4a, 0x95, 0x22, 0x15, 0x06, 0xc5, 0xab, 0x54, 0xc3, 0xa8, + 0x15, 0x84, 0x92, 0xb6, 0x51, 0x9c, 0xe9, 0xe6, 0x61, 0xce, 0x54, 0x1a, + 0x98, 0x33, 0x0f, 0x39, 0xfe, 0x54, 0xfa, 0xad, 0xb0, 0xc8, 0x73, 0x87, + 0x12, 0x06, 0x59, 0x33, 0x15, 0x7b, 0x75, 0xa1, 0xc8, 0x4a, 0x66, 0xcc, + 0x6a, 0x70, 0x55, 0x29, 0x64, 0xe5, 0xfd, 0xcb, 0xd7, 0x47, 0x6f, 0x7f, + 0xf1, 0xbe, 0x02, 0x15, 0x8a, 0x61, 0xbf, 0xa9, 0x44, 0x52, 0x13, 0x2a, + 0x3d, 0x09, 0x26, 0x6b, 0xc9, 0x88, 0x1f, 0x3c, 0x88, 0x7f, 0x72, 0x0d, + 0x0d, 0xd9, 0x73, 0x31, 0xb4, 0x24, 0xed, 0xb8, 0xce, 0x95, 0x8c, 0x08, + 0x38, 0xfb, 0x86, 0x02, 0x20, 0x4c, 0x9a, 0xf9, 0x8c, 0x34, 0x9e, 0xa2, + 0x7f, 0x96, 0x35, 0x17, 0xf5, 0xdd, 0x64, 0x63, 0x9d, 0x24, 0x3b, 0x46, + 0x48, 0x43, 0x5d, 0xce, 0xa2, 0xa0, 0x8a, 0x86, 0x94, 0xac, 0x3a, 0x63, + 0x41, 0xba, 0xfa, 0x99, 0x6f, 0x5c, 0x4a, 0xfd, 0xda, 0xa6, 0x5d, 0x04, + 0x6e, 0x5f, 0xa8, 0xdf, 0x3c, 0xaa, 0x63, 0xde, 0x1e, 0xaa, 0xc1, 0x39, + 0xee, 0xfd, 0x7d, 0x4f, 0x3d, 0x1b, 0x59, 0x28, 0x0a, 0xca, 0x51, 0x90, + 0x43, 0x90, 0x76, 0x51, 0x40, 0xa2, 0xa2, 0x42, 0x71, 0x5f, 0xbe, 0xc1, + 0x5c, 0xe2, 0x12, 0xe3, 0x7d, 0x2f, 0xdf, 0xbf, 0x5b, 0x57, 0x75, 0xac, + 0xb9, 0x63, 0xa9, 0x8d, 0x26, 0xda, 0x3d, 0x58, 0x54, 0x60, 0x1f, 0x3b, + 0x93, 0x85, 0x7e, 0x86, 0xf8, 0x4b, 0xd1, 0xbf, 0xfd, 0xf6, 0xe8, 0x4d, + 0x29, 0xe2, 0xf6, 0x57, 0x20, 0x7e, 0xfa, 0xea, 0xed, 0xf1, 0x32, 0xa6, + 0x3b, 0x5f, 0x89, 0xfb, 0xe8, 0x59, 0x29, 0xea, 0xee, 0x8d, 0x51, 0xc7, + 0xfe, 0xd8, 0x6a, 0x82, 0x17, 0x4d, 0x03, 0x74, 0x2b, 0x34, 0xa9, 0x35, + 0x96, 0x50, 0xa3, 0xec, 0x5b, 0xa1, 0xa3, 0x1a, 0x67, 0x09, 0x29, 0x82, + 0xb8, 0xad, 0x5a, 0xc9, 0xe6, 0x5a, 0x42, 0x4c, 0x02, 0xdc, 0x0a, 0x2d, + 0x33, 0x86, 0x95, 0xd2, 0x93, 0x3d, 0xf0, 0x2c, 0xfc, 0x86, 0x7e, 0x64, + 0x86, 0xc1, 0x5e, 0xd6, 0xef, 0x80, 0xa3, 0xc7, 0x48, 0x8c, 0x75, 0xca, + 0x42, 0xa0, 0xd7, 0x6b, 0x44, 0xe4, 0xd2, 0x1a, 0x9c, 0x06, 0xa0, 0x76, + 0x2b, 0x55, 0x33, 0xee, 0x54, 0x69, 0xd5, 0xd8, 0xb7, 0x84, 0x3b, 0x58, + 0xcd, 0x3a, 0x60, 0xf5, 0xd6, 0xed, 0xf0, 0x30, 0x58, 0x60, 0x89, 0x0f, + 0x1b, 0x12, 0x87, 0xb3, 0xa5, 0x7c, 0xe4, 0x1d, 0xb2, 0x26, 0x0a, 0x2d, + 0x86, 0xa2, 0x9a, 0x9c, 0xc7, 0x68, 0xf0, 0x8a, 0xdc, 0x5f, 0xaa, 0xf4, + 0xb5, 0xdf, 0x1d, 0x7d, 0x23, 0x7e, 0x88, 0x39, 0x07, 0x56, 0x2b, 0x27, + 0x38, 0x1f, 0x17, 0x59, 0x89, 0x79, 0xe0, 0x13, 0x78, 0x81, 0x32, 0x97, + 0xef, 0xa2, 0xe1, 0x5f, 0x83, 0x8b, 0x48, 0xbc, 0x62, 0xd8, 0xba, 0xb8, + 0x42, 0x4d, 0x7f, 0x58, 0xcd, 0x37, 0x71, 0x9a, 0xf1, 0xde, 0x2d, 0x89, + 0x43, 0x9c, 0x63, 0x28, 0x08, 0xc9, 0xb2, 0xaf, 0xa1, 0x6d, 0xa6, 0x50, + 0xaf, 0x52, 0xb9, 0x15, 0x36, 0xf4, 0x78, 0xb3, 0x06, 0x13, 0xba, 0xc8, + 0x6d, 0xb1, 0x10, 0xd0, 0x0e, 0xe5, 0x31, 0x5e, 0x9b, 0xbb, 0x4e, 0xbf, + 0x33, 0x85, 0x7a, 0xb7, 0x6e, 0x4a, 0x17, 0xc1, 0x3a, 0xe2, 0x58, 0x04, + 0xab, 0x49, 0x22, 0x41, 0xa2, 0x29, 0x27, 0x16, 0x29, 0x85, 0x36, 0xb3, + 0x29, 0x41, 0x6b, 0x0b, 0x3c, 0xbd, 0x2d, 0x9a, 0xb2, 0xb4, 0x8a, 0x67, + 0x43, 0x7a, 0x2e, 0x93, 0xf7, 0x73, 0x96, 0xc9, 0x0e, 0x47, 0xe0, 0x28, + 0x55, 0x59, 0x51, 0x03, 0xc1, 0x14, 0x99, 0x2d, 0xb6, 0x6a, 0x69, 0xa7, + 0xaa, 0x87, 0x37, 0x47, 0x30, 0x0a, 0x8b, 0x1f, 0x47, 0x95, 0x22, 0x20, + 0x1c, 0x27, 0xf8, 0x03, 0x75, 0xde, 0x11, 0x1d, 0xe0, 0xc6, 0x8e, 0x5d, + 0xdc, 0x11, 0x2b, 0xb5, 0xab, 0x94, 0x28, 0xe2, 0x79, 0x6b, 0x46, 0x1c, + 0xcb, 0xe7, 0x7c, 0xf9, 0x69, 0x5c, 0x7e, 0xd6, 0x68, 0x4c, 0xeb, 0xf5, + 0x35, 0x57, 0xdd, 0xde, 0xf8, 0xc9, 0xcc, 0x44, 0xd6, 0xe3, 0x92, 0x15, + 0x35, 0x09, 0xe9, 0xaa, 0xf0, 0x44, 0x26, 0xe5, 0x8d, 0x2e, 0xe5, 0xa0, + 0x2f, 0x39, 0xe0, 0x91, 0x99, 0xe9, 0x1b, 0x09, 0x12, 0x22, 0xb8, 0xf0, + 0x8a, 0xbe, 0x99, 0x23, 0x81, 0x81, 0x34, 0xa0, 0x12, 0xb2, 0x84, 0xcd, + 0x1b, 0xce, 0xf9, 0x22, 0x9c, 0xa2, 0x54, 0x86, 0x4d, 0x1c, 0xd5, 0x4b, + 0x79, 0xa3, 0x19, 0xc1, 0x67, 0xe6, 0xed, 0x1f, 0xc5, 0xa7, 0x07, 0x0f, + 0xf2, 0x69, 0x12, 0x77, 0x94, 0x6b, 0x4c, 0xba, 0x52, 0x7e, 0x5d, 0xec, + 0xd5, 0x7c, 0x62, 0xbf, 0x80, 0x22, 0x5e, 0x01, 0x83, 0x8d, 0x9d, 0xa2, + 0x79, 0x24, 0xb7, 0xe6, 0x55, 0xa6, 0x9e, 0x4a, 0x48, 0x86, 0xbe, 0x59, + 0xd6, 0x93, 0x73, 0xfc, 0x7e, 0x6b, 0x3f, 0x7a, 0x8c, 0x85, 0x30, 0x3e, + 0x44, 0x19, 0xaa, 0x21, 0x63, 0x3f, 0xfa, 0xe1, 0x0f, 0x6b, 0xe2, 0x63, + 0xf4, 0xa9, 0x1f, 0xe7, 0xe0, 0x61, 0x3f, 0xe5, 0x8a, 0x37, 0x19, 0xf1, + 0x83, 0x07, 0x89, 0xa3, 0x9f, 0x74, 0x72, 0xd4, 0xbd, 0xa8, 0xaa, 0x94, + 0xfa, 0x47, 0x6c, 0x23, 0x1c, 0x1f, 0x54, 0x3e, 0xd1, 0x72, 0xdf, 0xd0, + 0x8e, 0xf2, 0x6d, 0x70, 0x02, 0xeb, 0xf2, 0x06, 0xd6, 0x9c, 0x57, 0x6a, + 0x92, 0x2c, 0x4a, 0xf6, 0x52, 0xe4, 0xc0, 0xa9, 0x68, 0x2e, 0x59, 0xde, + 0xc9, 0xae, 0x06, 0x2c, 0x5b, 0x09, 0xc2, 0xda, 0x1b, 0x90, 0x15, 0x2d, + 0x32, 0xd5, 0x03, 0x83, 0xc5, 0x07, 0x96, 0xc2, 0x85, 0x28, 0xbf, 0xee, + 0x50, 0x71, 0xfb, 0x3c, 0x5f, 0x7c, 0x68, 0x8a, 0x3b, 0x28, 0x5e, 0xb8, + 0xc0, 0xe5, 0xd4, 0x17, 0xfd, 0x40, 0x2f, 0x2d, 0x65, 0xbb, 0xec, 0x41, + 0x0b, 0x9a, 0x80, 0x7c, 0xb9, 0xca, 0x35, 0xf7, 0xcf, 0xaa, 0x5e, 0xae, + 0x5b, 0x37, 0xda, 0xb5, 0xda, 0xc1, 0x90, 0xe1, 0x86, 0xb5, 0x7a, 0xaa, + 0x2b, 0x78, 0xf4, 0xfa, 0x9b, 0x11, 0x91, 0xa9, 0xd4, 0x17, 0xb5, 0xfa, + 0x22, 0x23, 0xef, 0x33, 0xdb, 0x89, 0x8a, 0xe5, 0xac, 0xf9, 0xa1, 0x55, + 0x54, 0x8c, 0x07, 0x88, 0x16, 0x16, 0xa9, 0x79, 0x5c, 0x62, 0x7d, 0x24, + 0xaa, 0x67, 0x5a, 0xae, 0x8a, 0x76, 0x2d, 0x69, 0xd9, 0x5f, 0x04, 0x6e, + 0x42, 0xf5, 0x79, 0x9d, 0x30, 0xe7, 0xac, 0x08, 0xb5, 0x38, 0xa8, 0xe8, + 0x52, 0x2b, 0x43, 0x7d, 0x3e, 0xd3, 0x2c, 0x73, 0x9f, 0xe0, 0x75, 0xf9, + 0x44, 0x09, 0xc9, 0x39, 0x34, 0xa2, 0xca, 0x20, 0x79, 0xff, 0xa7, 0x0c, + 0x65, 0xc4, 0xf0, 0x51, 0x33, 0xc2, 0xce, 0xa1, 0x86, 0x89, 0xae, 0xa2, + 0x29, 0xdd, 0x02, 0x72, 0xc4, 0xb3, 0x7a, 0x6c, 0x69, 0x7f, 0xb6, 0xe9, + 0xe2, 0x81, 0x5f, 0xbc, 0x7b, 0x95, 0xb1, 0xd2, 0xda, 0xe4, 0x95, 0x88, + 0x90, 0x30, 0xdf, 0xcb, 0xad, 0xc5, 0x3d, 0x78, 0x50, 0x68, 0xc3, 0x6b, + 0x97, 0x05, 0xab, 0x76, 0x2d, 0xb9, 0xda, 0x95, 0x51, 0x7c, 0x0f, 0x1e, + 0x9a, 0x59, 0xa1, 0x84, 0xea, 0x9a, 0x15, 0xc7, 0x6f, 0xc2, 0x44, 0x4e, + 0x0f, 0x2b, 0xb5, 0x00, 0xcd, 0x2d, 0x71, 0x26, 0x95, 0x32, 0x40, 0x89, + 0xfc, 0x1a, 0x68, 0x50, 0x5f, 0xa0, 0x60, 0xbc, 0x36, 0x5b, 0xb7, 0x4d, + 0x81, 0xc5, 0x37, 0x4e, 0xb5, 0xd6, 0x5b, 0x50, 0xdd, 0x72, 0xaa, 0xda, + 0xf7, 0x6b, 0x29, 0xe5, 0x03, 0x2b, 0x56, 0x20, 0x79, 0xc1, 0x37, 0x45, + 0x98, 0xc0, 0x7e, 0xe7, 0x1c, 0xe9, 0xca, 0x41, 0x9f, 0x16, 0xa1, 0xf7, + 0xf1, 0x4e, 0x52, 0x71, 0x59, 0x80, 0xf6, 0x87, 0x3f, 0x4c, 0xab, 0xb4, + 0x62, 0x37, 0x8f, 0x49, 0xab, 0xbe, 0x34, 0xb7, 0xda, 0xd2, 0xd2, 0x60, + 0x1f, 0xab, 0x4c, 0xbc, 0x12, 0x5d, 0x9d, 0xf6, 0x6d, 0xac, 0x7b, 0x77, + 0x60, 0x22, 0xa7, 0x7a, 0x6a, 0x56, 0x4b, 0x35, 0xfb, 0x1b, 0xdf, 0x92, + 0xed, 0x1e, 0x8b, 0x41, 0x9e, 0xda, 0xa7, 0x1d, 0xe5, 0xcf, 0x0e, 0xc2, + 0xb2, 0xd4, 0x5a, 0xe4, 0x94, 0xad, 0xa0, 0xec, 0x4a, 0xd5, 0x1a, 0x2b, + 0x52, 0xc1, 0x8a, 0x61, 0xaa, 0x07, 0x54, 0x05, 0xaf, 0x6e, 0xd4, 0xae, + 0xb2, 0xe0, 0xb4, 0x03, 0x93, 0x1a, 0xc4, 0xbf, 0x11, 0xd9, 0x75, 0xdc, + 0x1e, 0x0a, 0xe7, 0x24, 0x71, 0x09, 0x6c, 0x30, 0x62, 0xf1, 0x2a, 0x49, + 0x0f, 0x30, 0xf1, 0x03, 0x39, 0x59, 0x34, 0x5a, 0xf6, 0x93, 0x89, 0xdf, + 0x50, 0xbf, 0xb6, 0xb9, 0xeb, 0x9a, 0xc4, 0x5a, 0x4f, 0xa5, 0xa2, 0x44, + 0x6e, 0xca, 0x95, 0x5a, 0xcd, 0xcc, 0xb1, 0x45, 0x29, 0x18, 0x41, 0x93, + 0x42, 0x37, 0x30, 0x2b, 0xad, 0xa9, 0x0a, 0xbd, 0x7c, 0xa5, 0x41, 0xd0, + 0xd7, 0x86, 0x6c, 0x48, 0xae, 0x92, 0x9d, 0x2e, 0x03, 0x96, 0xea, 0x7a, + 0x49, 0x35, 0xd1, 0x6b, 0x76, 0x7a, 0xad, 0x2b, 0xbf, 0x5e, 0x58, 0xe5, + 0x0d, 0xa2, 0xaa, 0xfc, 0xad, 0x17, 0xfe, 0x14, 0x60, 0x7e, 0xd0, 0x74, + 0xc2, 0x42, 0x87, 0x8c, 0x14, 0xb6, 0xc0, 0x45, 0xbd, 0xc6, 0xe9, 0x54, + 0xac, 0xe6, 0x35, 0x75, 0x1f, 0xba, 0x7c, 0x59, 0xe0, 0x6f, 0xe6, 0xd7, + 0xf7, 0x98, 0x7b, 0x5e, 0x32, 0xd3, 0x0c, 0x63, 0x44, 0x1d, 0x4e, 0xc9, + 0xa6, 0xe6, 0x04, 0x66, 0xd6, 0xaa, 0x4b, 0xa5, 0x25, 0x41, 0x2c, 0xbe, + 0xe6, 0xa2, 0x96, 0xf7, 0x1b, 0x5b, 0x69, 0x8c, 0xf9, 0xb5, 0xbb, 0x8c, + 0x54, 0x2a, 0x4a, 0xce, 0x2c, 0x7b, 0xda, 0x2c, 0xfc, 0x26, 0x6a, 0x26, + 0x92, 0xc0, 0x65, 0x8f, 0x3e, 0x52, 0x58, 0x73, 0xe2, 0xc8, 0x32, 0x6b, + 0x16, 0x04, 0x0c, 0xdf, 0x99, 0x22, 0x15, 0x23, 0xe3, 0x22, 0xaf, 0x4b, + 0x6e, 0x25, 0x54, 0x72, 0xfb, 0x0e, 0xd7, 0x94, 0x52, 0x3b, 0x65, 0xf9, + 0x46, 0xb8, 0xa6, 0x5c, 0x7c, 0xc3, 0x79, 0xc1, 0x7a, 0xfa, 0xb5, 0x65, + 0xe5, 0x16, 0x62, 0x5e, 0x6d, 0xd3, 0xaa, 0x29, 0xbb, 0xdd, 0x5a, 0x22, + 0x93, 0xf0, 0x79, 0x79, 0x21, 0x7d, 0x5d, 0x61, 0xa1, 0xc8, 0xfa, 0x92, + 0x42, 0xa1, 0x9b, 0x89, 0x09, 0x05, 0x6f, 0x2a, 0xa3, 0x64, 0x47, 0x4c, + 0x09, 0x29, 0x99, 0xc1, 0x62, 0xca, 0x6f, 0x0d, 0xe5, 0x40, 0x32, 0x5b, + 0x45, 0x44, 0x0b, 0x9b, 0xc4, 0xf8, 0x3f, 0x0e, 0x5d, 0xa0, 0x2b, 0x5f, + 0x11, 0xb1, 0x80, 0x63, 0x5a, 0x78, 0xe7, 0x2d, 0x1c, 0xe1, 0x21, 0x87, + 0x0a, 0x37, 0xf5, 0x5d, 0xb8, 0x80, 0xa3, 0xcb, 0x58, 0x24, 0x54, 0xbf, + 0x6f, 0x55, 0x08, 0xc2, 0xa5, 0xc7, 0x0a, 0x5d, 0xbc, 0x62, 0xd2, 0x2b, + 0xfa, 0x5e, 0x15, 0x8d, 0xb1, 0xd2, 0x7e, 0xd4, 0x69, 0xb6, 0x77, 0xf7, + 0x9a, 0xed, 0x0e, 0xde, 0xe5, 0xdc, 0xee, 0x56, 0xe4, 0x5b, 0x49, 0x79, + 0xfb, 0x1c, 0xd3, 0x49, 0x1a, 0x55, 0x08, 0xea, 0x8c, 0x02, 0x12, 0x2a, + 0xd6, 0x0f, 0xb9, 0x18, 0xbe, 0x2a, 0xbd, 0xbd, 0x76, 0x45, 0x73, 0x17, + 0x9f, 0x02, 0x35, 0x31, 0x15, 0xae, 0xcd, 0x51, 0xc3, 0x26, 0x7c, 0x2c, + 0xa2, 0x13, 0xc3, 0x27, 0x63, 0x19, 0x81, 0x77, 0xff, 0x39, 0xff, 0xa5, + 0xf3, 0x74, 0x70, 0x2d, 0xbf, 0x30, 0x3a, 0x9b, 0x39, 0x90, 0xd1, 0x79, + 0xea, 0x55, 0xde, 0x99, 0xbc, 0xc8, 0x93, 0xc5, 0xf6, 0x5a, 0x4f, 0x5b, + 0xb9, 0x2c, 0x04, 0x7d, 0x48, 0x8a, 0xc0, 0x1a, 0xe7, 0x7e, 0x76, 0x42, + 0x67, 0xe0, 0xb8, 0x4e, 0x84, 0x88, 0xed, 0x8f, 0x9f, 0x64, 0xa2, 0x3a, + 0x1d, 0x7c, 0x42, 0xed, 0x4b, 0xe1, 0x6d, 0xfa, 0xd4, 0x6f, 0x1c, 0xf8, + 0x76, 0xe2, 0xa9, 0xc8, 0x37, 0x0e, 0xef, 0x90, 0x35, 0x97, 0xcb, 0x0f, + 0xa6, 0xde, 0x53, 0x13, 0xd2, 0xaa, 0xcb, 0xc6, 0x57, 0xf6, 0x66, 0xd3, + 0xe6, 0x1c, 0xac, 0xda, 0x52, 0x49, 0xf1, 0x4d, 0xae, 0x39, 0x30, 0xb8, + 0x08, 0x26, 0x8d, 0xda, 0x64, 0xe8, 0x51, 0x39, 0xf3, 0x4c, 0xd1, 0x65, + 0x69, 0x08, 0x5c, 0x18, 0x99, 0x82, 0x18, 0x9f, 0xfb, 0xf3, 0x44, 0x19, + 0xe1, 0xd1, 0x72, 0x09, 0x95, 0x3b, 0xeb, 0xe1, 0xdc, 0x1d, 0xdc, 0x24, + 0x64, 0x94, 0xc4, 0x0e, 0xd2, 0xf5, 0x42, 0xa6, 0xbe, 0xb8, 0xba, 0xc1, + 0x84, 0xde, 0xf0, 0x41, 0x46, 0x83, 0x55, 0x35, 0xe0, 0xe5, 0x59, 0x0f, + 0xaf, 0x07, 0x0e, 0xe8, 0x63, 0x42, 0x1f, 0x03, 0xfa, 0x98, 0x8a, 0xf3, + 0x5e, 0xa5, 0xa5, 0xfe, 0x10, 0xbf, 0x7e, 0xd6, 0x61, 0x20, 0xfe, 0x9c, + 0xf0, 0xe7, 0xa0, 0xa3, 0xe0, 0x3a, 0x69, 0xc0, 0x2e, 0x03, 0xf2, 0xe7, + 0x84, 0x3f, 0x07, 0x5d, 0x05, 0xd8, 0x4d, 0x00, 0xea, 0x33, 0x22, 0xf2, + 0xbd, 0x1d, 0x1e, 0x47, 0x3b, 0x43, 0xb3, 0x55, 0x2a, 0xbf, 0x61, 0x82, + 0x13, 0x62, 0x91, 0x74, 0xf6, 0xda, 0x9d, 0xf1, 0xf9, 0x89, 0xac, 0x01, + 0xc5, 0x82, 0x24, 0x2b, 0x71, 0x82, 0x25, 0x26, 0x80, 0xd7, 0x4d, 0x2d, + 0xc3, 0x84, 0x9e, 0x18, 0xef, 0x36, 0x55, 0xd2, 0xbc, 0x07, 0xf0, 0xc4, + 0x40, 0x24, 0xcb, 0x01, 0xe9, 0x49, 0x31, 0x90, 0x91, 0xa1, 0x13, 0xea, + 0x74, 0x31, 0x4a, 0x37, 0x0d, 0xe2, 0xd2, 0x31, 0xc5, 0x98, 0x9e, 0x70, + 0x7c, 0x2a, 0xfc, 0x48, 0x53, 0x86, 0xae, 0x08, 0x92, 0xed, 0x94, 0xaa, + 0x83, 0x8c, 0xea, 0x8c, 0xd1, 0x98, 0x36, 0xa4, 0x35, 0x8e, 0x97, 0xd1, + 0x3e, 0x9f, 0x21, 0xa0, 0x17, 0x84, 0xd0, 0xdd, 0x31, 0xf3, 0x80, 0xbc, + 0x1a, 0x3a, 0x1f, 0x10, 0x85, 0x38, 0x67, 0xc9, 0x30, 0xe8, 0xd1, 0x26, + 0x7a, 0xe9, 0x97, 0x38, 0xbd, 0xea, 0xba, 0xb6, 0xf5, 0xd3, 0x90, 0x82, + 0x13, 0xd5, 0xab, 0xac, 0x8f, 0xd5, 0xcb, 0xb8, 0x06, 0x17, 0xd6, 0x0b, + 0x24, 0x4c, 0x6c, 0xeb, 0x97, 0x0e, 0xce, 0x8b, 0xf8, 0xdf, 0xfd, 0x0e, + 0x85, 0x23, 0x01, 0xbf, 0x3c, 0x9f, 0x34, 0xb2, 0xb0, 0x7a, 0x12, 0x5c, + 0x1c, 0xcb, 0xf0, 0xab, 0xe0, 0xbb, 0xdf, 0x89, 0x43, 0x1c, 0xfe, 0x10, + 0x56, 0x43, 0x4e, 0x3d, 0x72, 0x6b, 0x4a, 0xa7, 0xa4, 0xf3, 0x66, 0x2e, + 0x5d, 0x4a, 0x15, 0x35, 0xd0, 0xd2, 0x4c, 0x31, 0x11, 0x99, 0x46, 0x6c, + 0xc9, 0xb7, 0x98, 0xe3, 0xae, 0x24, 0x17, 0xbe, 0x75, 0x00, 0xba, 0x7d, + 0xa2, 0xf0, 0xf0, 0x3e, 0x7e, 0x3e, 0xac, 0xd5, 0x65, 0x40, 0xbe, 0x4e, + 0xe3, 0x07, 0xa4, 0x72, 0x34, 0xbe, 0x4e, 0xa4, 0xdf, 0x48, 0xe3, 0x50, + 0xfc, 0x38, 0x91, 0x1e, 0x28, 0x55, 0x29, 0x97, 0x4e, 0x96, 0x4f, 0x48, + 0x97, 0xea, 0xa5, 0x93, 0xf1, 0x40, 0xd4, 0xf6, 0xad, 0x98, 0xb7, 0x88, + 0x5a, 0x3e, 0xcb, 0x1a, 0x02, 0xef, 0x7f, 0x69, 0xbb, 0xba, 0x90, 0x4c, + 0x88, 0x79, 0x4c, 0x67, 0xea, 0x24, 0xcd, 0x6c, 0x3a, 0x57, 0xa5, 0x68, + 0xae, 0x33, 0xb9, 0x3a, 0xc9, 0xb0, 0x9f, 0xce, 0x8f, 0xd3, 0xe2, 0x7a, + 0xa4, 0xf3, 0x75, 0x12, 0x2a, 0x94, 0x90, 0xb5, 0x6a, 0xfe, 0x67, 0xf2, + 0xb6, 0x2b, 0xae, 0x93, 0x54, 0x3a, 0x95, 0xa2, 0x4b, 0xa7, 0xde, 0x95, + 0x96, 0x46, 0x21, 0xdf, 0xa1, 0x6e, 0xe4, 0xf1, 0x6a, 0xa0, 0x69, 0x9a, + 0x97, 0xab, 0x23, 0xf9, 0x53, 0x2c, 0x93, 0x22, 0x00, 0xce, 0xf8, 0xa4, + 0xe5, 0x52, 0x04, 0x41, 0xe9, 0x9f, 0xb4, 0x6c, 0x0a, 0x21, 0x38, 0xe3, + 0x93, 0x91, 0x4f, 0x11, 0x8c, 0xcc, 0x01, 0xd0, 0xbe, 0x52, 0x39, 0x55, + 0x25, 0x75, 0x4d, 0x86, 0x51, 0x68, 0x9d, 0xf1, 0x94, 0xd3, 0xab, 0xb6, + 0x0b, 0x5c, 0xb2, 0xfb, 0xc5, 0xe3, 0x2e, 0x8d, 0xd3, 0xf7, 0x90, 0xc1, + 0x09, 0x2b, 0x5c, 0x31, 0x26, 0xdf, 0x17, 0x88, 0xa1, 0x97, 0x6d, 0x6f, + 0x33, 0xb6, 0x4f, 0xfa, 0xca, 0x31, 0xf3, 0xce, 0x79, 0x26, 0x0a, 0x7a, + 0xbf, 0x83, 0x5d, 0xaf, 0x7e, 0xef, 0x12, 0xd2, 0x6b, 0xf2, 0x25, 0x8f, + 0x57, 0x75, 0xeb, 0x7b, 0x97, 0x2c, 0xaa, 0xc4, 0x33, 0x09, 0x46, 0x3d, + 0xd6, 0x7e, 0xb7, 0xbf, 0x2a, 0x27, 0x78, 0x5b, 0x60, 0x11, 0x27, 0x0e, + 0x2c, 0x56, 0xf0, 0x93, 0xf7, 0xaf, 0x5f, 0x91, 0xab, 0x70, 0x9f, 0x20, + 0xc0, 0xc2, 0x7b, 0x1f, 0xd0, 0xd5, 0x8f, 0x24, 0x5f, 0x45, 0xa9, 0x6e, + 0xc5, 0x3c, 0xa9, 0x46, 0xd5, 0x0f, 0x86, 0x9b, 0x4f, 0xc9, 0xeb, 0xdc, + 0x20, 0xe9, 0x63, 0x18, 0x22, 0x29, 0x66, 0x93, 0x9c, 0xf2, 0x9f, 0xa4, + 0x35, 0x4b, 0x96, 0x92, 0x29, 0x60, 0xa5, 0x70, 0x76, 0x68, 0x5d, 0x52, + 0xba, 0xf4, 0x36, 0xaa, 0xe8, 0xa6, 0x90, 0xc6, 0x4e, 0x4b, 0x17, 0xbf, + 0xb2, 0x68, 0xcd, 0x60, 0xad, 0x96, 0x69, 0x57, 0xae, 0x6d, 0x09, 0x23, + 0xae, 0x66, 0x00, 0x72, 0xa9, 0x84, 0x49, 0x36, 0x61, 0xb0, 0x66, 0x7b, + 0x10, 0xfd, 0xbc, 0xfc, 0x13, 0x08, 0x31, 0x52, 0xae, 0x8c, 0x8f, 0x5e, + 0xbd, 0xb9, 0x5e, 0x7d, 0x3a, 0xb9, 0x0a, 0xe5, 0x52, 0x06, 0x9d, 0x35, + 0xab, 0xd4, 0x59, 0xa1, 0x4a, 0x9d, 0x95, 0x11, 0xd2, 0xdb, 0x36, 0xd7, + 0xab, 0x53, 0x37, 0x57, 0xa7, 0x5c, 0xca, 0xa0, 0xbb, 0x66, 0x9d, 0xba, + 0x2b, 0xd4, 0xa9, 0xab, 0xb5, 0xd0, 0x8c, 0x6d, 0x7c, 0xfd, 0x1f, 0xcc, + 0x31, 0xc3, 0xd0, 0xf2, 0x51, 0x7c, 0x71, 0xd4, 0xd9, 0x14, 0x63, 0xd9, + 0xb3, 0xb7, 0xaf, 0xe1, 0x32, 0xe8, 0x53, 0x7d, 0xc6, 0x0e, 0x49, 0x78, + 0xd8, 0xed, 0xe0, 0x97, 0x30, 0x3e, 0x55, 0x35, 0xb6, 0x9a, 0x71, 0x47, + 0xf6, 0x35, 0xab, 0x6f, 0x3a, 0xa4, 0x24, 0x2d, 0x7b, 0x65, 0x1a, 0x46, + 0xa6, 0x25, 0xa1, 0xb8, 0xbb, 0xa6, 0x81, 0x38, 0x29, 0x05, 0x43, 0xfd, + 0x3e, 0x03, 0xc4, 0x69, 0x69, 0x28, 0x33, 0x26, 0x19, 0x30, 0x95, 0x98, + 0x84, 0x33, 0x43, 0x93, 0x01, 0x93, 0x69, 0x0a, 0xaa, 0x58, 0x62, 0x85, + 0x62, 0x32, 0x52, 0x62, 0x58, 0xe9, 0xc3, 0xb0, 0x36, 0x18, 0x41, 0x01, + 0x8f, 0x7c, 0x8b, 0xcc, 0x60, 0xa2, 0x10, 0x71, 0xba, 0x1a, 0xa8, 0x72, + 0xba, 0x54, 0x68, 0x74, 0x5b, 0xd8, 0xe6, 0xfe, 0x5d, 0x52, 0xac, 0xcb, + 0x4a, 0xb6, 0xea, 0x69, 0x13, 0xcd, 0x65, 0x8d, 0xb0, 0x97, 0x17, 0x45, + 0xe1, 0xac, 0x3d, 0x37, 0x4d, 0xb0, 0x9c, 0x5f, 0x06, 0xd1, 0x34, 0xcb, + 0x1e, 0x0d, 0x56, 0xd3, 0x64, 0xcb, 0xd1, 0x4a, 0x18, 0x8d, 0x68, 0xf9, + 0xb3, 0xc1, 0x4c, 0xce, 0x29, 0x5f, 0x60, 0xda, 0x4f, 0x10, 0xc1, 0x71, + 0x51, 0x77, 0xc4, 0x47, 0x8a, 0x3e, 0xb6, 0x3e, 0xed, 0x9b, 0x31, 0x34, + 0x89, 0xc2, 0x3a, 0xe8, 0x5b, 0xed, 0xbd, 0xd4, 0x9d, 0xa1, 0x8c, 0xa8, + 0xc9, 0xeb, 0xab, 0x6f, 0xec, 0x19, 0xd4, 0x25, 0x9d, 0x40, 0xeb, 0xf5, + 0x18, 0xa8, 0x11, 0xed, 0xb0, 0xf5, 0xdb, 0x81, 0x7e, 0x4f, 0xe1, 0x6f, + 0x07, 0x5b, 0x93, 0xba, 0x55, 0xc1, 0x23, 0x82, 0xed, 0x4f, 0x2b, 0xe9, + 0x41, 0xe1, 0xe6, 0xb8, 0x09, 0x99, 0x42, 0xad, 0x29, 0x19, 0xdc, 0xdf, + 0xfd, 0x4e, 0xac, 0x71, 0xea, 0xb5, 0x40, 0x79, 0x95, 0xbb, 0xa1, 0xbe, + 0xdd, 0x54, 0xd9, 0x6e, 0xaa, 0x69, 0x77, 0xa1, 0x66, 0xb7, 0xaa, 0x63, + 0xda, 0x44, 0x0c, 0xa7, 0xf4, 0x3a, 0x42, 0x2b, 0xe0, 0x4f, 0xce, 0xa7, + 0x29, 0x8c, 0xb2, 0xac, 0xd2, 0x51, 0x37, 0x46, 0x42, 0x41, 0xbf, 0xc3, + 0x87, 0x32, 0x67, 0x79, 0x73, 0x9a, 0x5f, 0x48, 0x7a, 0x28, 0x4b, 0x3d, + 0xac, 0x5b, 0xd5, 0x5a, 0xff, 0xe0, 0x32, 0xe5, 0xd2, 0xcc, 0xec, 0x53, + 0x9c, 0xc0, 0xc0, 0xc5, 0x1a, 0xb1, 0x2d, 0xb7, 0xf1, 0x1b, 0xa5, 0x05, + 0x4d, 0x59, 0x06, 0x38, 0x26, 0x4d, 0xd3, 0x94, 0x16, 0xa6, 0x65, 0x74, + 0x92, 0x37, 0x75, 0xc8, 0x38, 0xb6, 0x7d, 0xfc, 0x7e, 0x2a, 0xc5, 0x4e, + 0xcc, 0x46, 0xc2, 0xbf, 0xd2, 0xfa, 0xa5, 0x7b, 0x4b, 0xda, 0x63, 0xe3, + 0xb5, 0xa0, 0x76, 0xcd, 0x4a, 0x0e, 0x7a, 0xc9, 0xc1, 0xe0, 0xfa, 0xc2, + 0x9d, 0x74, 0xe1, 0xce, 0x7a, 0xa5, 0xbb, 0xe9, 0xd2, 0xdd, 0x92, 0xd2, + 0x79, 0xf3, 0x6c, 0x32, 0x33, 0x9e, 0x76, 0xdc, 0x9f, 0x6a, 0xc9, 0x1e, + 0xb0, 0xc9, 0xd6, 0x61, 0x82, 0x85, 0xed, 0x93, 0x60, 0x45, 0xb9, 0xbd, + 0x37, 0x6c, 0xa3, 0x89, 0x1e, 0x8c, 0x57, 0x95, 0x73, 0x27, 0x5d, 0xbc, + 0xb3, 0x6e, 0xf9, 0x6e, 0xba, 0x7c, 0x57, 0x97, 0xbf, 0xd5, 0x96, 0x22, + 0x7b, 0xb2, 0xc9, 0x86, 0x22, 0x7a, 0x85, 0xed, 0x64, 0x18, 0x91, 0x13, + 0x92, 0x1b, 0xb6, 0xd2, 0x40, 0x79, 0x43, 0xab, 0x0a, 0xb9, 0x93, 0x2e, + 0xdd, 0x59, 0xb3, 0x78, 0x37, 0x5d, 0xbc, 0xab, 0x8a, 0xdf, 0x6a, 0x13, + 0x91, 0x81, 0xde, 0x68, 0x1b, 0x11, 0xc1, 0xe2, 0x46, 0x4a, 0xb0, 0x22, + 0x27, 0xf5, 0x37, 0x6d, 0xa6, 0x33, 0xe5, 0x8f, 0xae, 0x2c, 0xe8, 0x4e, + 0xba, 0x78, 0x67, 0xdd, 0xf2, 0xdd, 0x74, 0xf9, 0xae, 0x2a, 0x7f, 0xbb, + 0x2d, 0x25, 0x07, 0xbd, 0x4d, 0x36, 0x95, 0xa4, 0x58, 0xd8, 0x56, 0x49, + 0x66, 0xf4, 0xf2, 0x4a, 0xae, 0xb5, 0xa4, 0x50, 0xcc, 0xba, 0x6d, 0xec, + 0xfc, 0xad, 0x27, 0x17, 0xbd, 0x54, 0xf0, 0x24, 0x46, 0x74, 0xbb, 0xeb, + 0x05, 0x86, 0xc1, 0xfc, 0xa2, 0x41, 0xcd, 0x4c, 0x52, 0x36, 0xeb, 0x11, + 0x30, 0xc1, 0x42, 0xd1, 0x27, 0x58, 0x51, 0xeb, 0x7a, 0x25, 0x82, 0xe7, + 0xbc, 0xcc, 0x64, 0x2a, 0x2f, 0xd5, 0x63, 0xca, 0xbd, 0x5d, 0x81, 0x32, + 0xc1, 0x62, 0x59, 0x5e, 0x19, 0xef, 0x2b, 0x55, 0x29, 0x4f, 0xd5, 0x67, + 0xb8, 0x08, 0xf0, 0x9d, 0x58, 0x51, 0x53, 0x39, 0x7a, 0x32, 0x40, 0x42, + 0x4a, 0xcd, 0x05, 0x6c, 0x17, 0xc1, 0xa7, 0x55, 0x7d, 0x57, 0xce, 0x47, + 0xbd, 0x5d, 0xd5, 0xa4, 0x94, 0x4f, 0x1f, 0x2b, 0x89, 0xfb, 0x55, 0x2a, + 0xa9, 0xf5, 0xa7, 0x14, 0xda, 0xbe, 0xa2, 0x9b, 0x9a, 0x15, 0xe4, 0x88, + 0x3f, 0xb6, 0x5a, 0xeb, 0x92, 0xa6, 0xbb, 0x59, 0xd6, 0xa0, 0x9b, 0x5c, + 0x26, 0x57, 0x90, 0xd9, 0x49, 0x70, 0x66, 0x79, 0x9e, 0xde, 0x53, 0x10, + 0x20, 0x1a, 0x23, 0x33, 0xf3, 0x65, 0x43, 0xc4, 0x30, 0x3c, 0xf3, 0x35, + 0x73, 0x30, 0xb9, 0x15, 0xd0, 0xe7, 0x48, 0x2d, 0x56, 0xe2, 0x58, 0x79, + 0x35, 0x93, 0x50, 0xcb, 0x02, 0x0d, 0x67, 0xcf, 0x99, 0x15, 0xdc, 0xea, + 0x1f, 0x58, 0x97, 0xa5, 0x46, 0x6b, 0xd5, 0x3e, 0x9d, 0xf3, 0xbc, 0x93, + 0xb9, 0xd9, 0x25, 0x8e, 0xb4, 0xd6, 0xbe, 0x47, 0x77, 0x9d, 0xd0, 0xa5, + 0x63, 0xde, 0x53, 0x46, 0xa2, 0xea, 0x14, 0xf9, 0xac, 0x9c, 0xd2, 0xe9, + 0x37, 0x05, 0x8c, 0x23, 0x4f, 0x9c, 0x52, 0xd4, 0x83, 0xac, 0x36, 0x17, + 0x4a, 0xa9, 0x66, 0xc2, 0xb9, 0xfc, 0x5f, 0x12, 0x00, 0x57, 0x68, 0x2d, + 0x11, 0x90, 0x8f, 0xf1, 0xbf, 0x24, 0x01, 0xaa, 0xcf, 0x5a, 0x02, 0xa0, + 0xb1, 0xfb, 0x7f, 0x4a, 0x02, 0x54, 0xa1, 0xf5, 0x44, 0x20, 0xc7, 0xc4, + 0x75, 0x64, 0xf0, 0x9f, 0x51, 0x53, 0xc9, 0xf7, 0x5a, 0x55, 0xc5, 0x68, + 0xb5, 0x9e, 0xc9, 0xdb, 0x58, 0x65, 0xc0, 0xd9, 0xca, 0xd6, 0xeb, 0x2a, + 0x79, 0x1f, 0xc5, 0xcb, 0xd9, 0x5c, 0x2e, 0x54, 0xcb, 0xf7, 0x59, 0xd0, + 0xa1, 0x7c, 0x75, 0x8f, 0x44, 0x62, 0x9c, 0x38, 0xa7, 0xcb, 0x28, 0xaa, + 0x8b, 0x00, 0xa3, 0xee, 0xdc, 0xa7, 0x1b, 0x7f, 0x29, 0x4e, 0x8b, 0x56, + 0x63, 0x6a, 0x96, 0x19, 0x30, 0x00, 0x15, 0xa8, 0xe1, 0xe2, 0x57, 0xaf, + 0x5f, 0xfd, 0x04, 0x25, 0xde, 0x89, 0x3f, 0x60, 0x51, 0x25, 0xd2, 0x35, + 0x23, 0x00, 0x9c, 0xec, 0xe4, 0x98, 0xfc, 0x90, 0x62, 0xf2, 0xa5, 0x74, + 0x50, 0x26, 0xe9, 0x16, 0xa4, 0x3c, 0x68, 0x19, 0x17, 0x63, 0xa2, 0xf8, + 0xd9, 0x85, 0xde, 0xb6, 0x1e, 0x3c, 0xb0, 0x38, 0x83, 0xb0, 0x2c, 0x42, + 0xe9, 0x97, 0xb7, 0x0a, 0x5f, 0x16, 0x14, 0xc9, 0x31, 0x4c, 0xa1, 0x09, + 0xe7, 0xd8, 0x66, 0x17, 0x74, 0xf3, 0x93, 0xe2, 0x28, 0x49, 0x4a, 0x43, + 0xdf, 0x03, 0xb6, 0x87, 0x0f, 0x41, 0x23, 0x4e, 0xaa, 0x19, 0xcc, 0xe6, + 0x2f, 0x96, 0x41, 0x0c, 0x95, 0xc0, 0x69, 0x5c, 0x83, 0xa5, 0x25, 0x2b, + 0xc7, 0x8b, 0xe1, 0x10, 0xe3, 0xfe, 0xbd, 0x4a, 0xae, 0xb0, 0x7c, 0xcc, + 0xe3, 0xb9, 0x56, 0x38, 0xb5, 0x04, 0xfa, 0xa3, 0x77, 0xef, 0xde, 0xbe, + 0xbb, 0x67, 0xe5, 0x5e, 0x40, 0x23, 0xe9, 0x65, 0x68, 0x5d, 0x25, 0x96, + 0x55, 0xa9, 0x95, 0x6b, 0xdc, 0x5e, 0x7c, 0x06, 0xbc, 0xf2, 0xed, 0x5b, + 0xba, 0xfe, 0xc5, 0x62, 0x0d, 0x88, 0x82, 0xd8, 0x81, 0x94, 0x9c, 0x19, + 0xb0, 0x17, 0x47, 0x45, 0x50, 0x0c, 0x40, 0x4a, 0xcb, 0x68, 0xb3, 0xae, + 0x1d, 0xb6, 0x4a, 0xf8, 0x0e, 0xc9, 0xb8, 0xed, 0x95, 0xb6, 0x55, 0xe8, + 0x33, 0x13, 0x6e, 0xb4, 0x05, 0x60, 0x0e, 0xd6, 0xc0, 0x29, 0x2e, 0x15, + 0x16, 0x61, 0x74, 0x47, 0x6e, 0xae, 0x9a, 0x1e, 0x94, 0x7a, 0x55, 0xd4, + 0x0b, 0xe9, 0x71, 0xc9, 0x28, 0x0e, 0x3e, 0x39, 0x8d, 0xe8, 0x1f, 0x1b, + 0x2f, 0xd0, 0x39, 0x7e, 0xdf, 0x03, 0xae, 0xdc, 0xc4, 0x51, 0x50, 0xfb, + 0x63, 0x2d, 0x73, 0x31, 0x90, 0x21, 0xdf, 0x58, 0xf5, 0xdc, 0xad, 0xb1, + 0x6a, 0x28, 0xa1, 0x56, 0xb2, 0x3a, 0xa1, 0x50, 0xf7, 0xad, 0x9f, 0x1e, + 0xbf, 0x7d, 0xd3, 0x9c, 0xdb, 0x01, 0x1f, 0x5f, 0x2e, 0xd0, 0x33, 0x15, + 0x3a, 0x3e, 0x53, 0x8b, 0xd9, 0x8c, 0xd4, 0xdc, 0x69, 0x91, 0xc1, 0x9b, + 0x23, 0x10, 0x1f, 0x7e, 0x86, 0x99, 0x9e, 0xc5, 0xd6, 0xc6, 0xfc, 0x65, + 0xa8, 0x31, 0x58, 0x13, 0xb1, 0x48, 0x5c, 0xa1, 0xf8, 0x41, 0x1d, 0xbf, + 0x30, 0xaf, 0xd8, 0x2a, 0xfe, 0x33, 0x13, 0x04, 0xa6, 0x2d, 0x4f, 0xa1, + 0x5c, 0xaa, 0x4b, 0x55, 0x0d, 0xb6, 0x3a, 0xde, 0x69, 0x26, 0x1f, 0x19, + 0x4e, 0x4f, 0x85, 0xcc, 0x5f, 0x5e, 0xb3, 0xf3, 0xc9, 0x6b, 0xf7, 0x00, + 0xdd, 0xbe, 0xea, 0x90, 0xfc, 0xca, 0x2f, 0x00, 0xc3, 0x11, 0xb4, 0x21, + 0x1e, 0xe0, 0x87, 0x67, 0x36, 0xe3, 0x94, 0x7b, 0x0e, 0x8c, 0x9e, 0x44, + 0x9a, 0xc1, 0x88, 0xc8, 0xfa, 0xb3, 0x63, 0x0f, 0x1d, 0x6b, 0x60, 0x07, + 0xd5, 0x24, 0x70, 0x7c, 0xad, 0x67, 0xdd, 0x52, 0xa1, 0x83, 0x34, 0x99, + 0x69, 0xb5, 0x8a, 0x3a, 0x19, 0xa5, 0xe5, 0x3a, 0xc0, 0x53, 0x8e, 0x1f, + 0x5b, 0xa9, 0x07, 0xc8, 0x50, 0xb3, 0x6b, 0xd5, 0xbf, 0x50, 0xf9, 0x65, + 0xd9, 0x5b, 0x57, 0x7c, 0xbe, 0x02, 0x66, 0x25, 0xd5, 0x07, 0x54, 0x5c, + 0xba, 0xa4, 0x5b, 0x00, 0x24, 0x8e, 0x67, 0xb4, 0x72, 0x7d, 0x43, 0x55, + 0xc1, 0x40, 0xf4, 0x53, 0x05, 0xf6, 0xaf, 0x45, 0x1d, 0x87, 0xe1, 0x95, + 0xa2, 0x36, 0x10, 0xfd, 0x74, 0x89, 0x15, 0x91, 0x23, 0x9e, 0xaf, 0x1c, + 0xb9, 0x81, 0xe8, 0xa7, 0x4a, 0xac, 0x8a, 0x9c, 0x22, 0x03, 0x4b, 0x91, + 0x1b, 0x88, 0x7e, 0xba, 0xc4, 0x8a, 0xc8, 0x29, 0xc4, 0xb0, 0x14, 0xb9, + 0x81, 0xe8, 0xa7, 0x4b, 0x5c, 0x8f, 0x5c, 0xc6, 0x2a, 0x22, 0xbd, 0x0c, + 0xb9, 0x86, 0xe8, 0x1b, 0xf0, 0x15, 0x04, 0xa2, 0x42, 0x1e, 0x2d, 0x6b, + 0x75, 0x0b, 0xaa, 0xc8, 0x99, 0x92, 0xfd, 0x24, 0xa6, 0xfd, 0xe5, 0xa5, + 0x12, 0xe1, 0x92, 0x28, 0x97, 0x46, 0x05, 0x3b, 0x32, 0x74, 0x17, 0x34, + 0x8a, 0x55, 0x3e, 0xf0, 0xd8, 0xba, 0x82, 0xd5, 0xcb, 0x54, 0x47, 0xc6, + 0x6b, 0x2e, 0x91, 0x92, 0x86, 0xe8, 0x27, 0xc0, 0x57, 0x92, 0x12, 0x87, + 0x7d, 0x96, 0xa2, 0x35, 0x10, 0xfd, 0x64, 0x81, 0x15, 0x1a, 0x80, 0xc3, + 0x44, 0x39, 0x42, 0x74, 0x09, 0xf6, 0x5c, 0x2c, 0x29, 0xc8, 0x64, 0x0a, + 0xff, 0x5f, 0x18, 0x7e, 0x2d, 0xbf, 0xbc, 0x32, 0x41, 0x5d, 0x57, 0xac, + 0x00, 0xcd, 0xcd, 0xc0, 0x3b, 0x59, 0x58, 0xa4, 0xd1, 0x6e, 0x78, 0x6a, + 0xfb, 0xb9, 0x42, 0xa1, 0xd8, 0xd7, 0x7b, 0x9f, 0x37, 0x46, 0x2f, 0x5f, + 0x35, 0x9a, 0x24, 0x52, 0xbc, 0x50, 0xdf, 0xca, 0x43, 0xa4, 0xd6, 0xbc, + 0x57, 0x00, 0xe9, 0xac, 0x00, 0xd3, 0xcd, 0xc0, 0x5c, 0x15, 0xaf, 0x1d, + 0x72, 0xeb, 0x49, 0x0f, 0x73, 0x86, 0xcf, 0xba, 0xc5, 0xaf, 0x1a, 0x95, + 0x42, 0xcf, 0xfb, 0x89, 0xaf, 0x39, 0x12, 0x98, 0x46, 0x5c, 0x02, 0x6e, + 0xb2, 0xa7, 0x43, 0xe3, 0x2e, 0xde, 0xfc, 0xfa, 0xf2, 0x59, 0x22, 0xc3, + 0x19, 0xa9, 0xd4, 0x9f, 0xb0, 0x50, 0x12, 0x39, 0x52, 0x4a, 0xb5, 0x44, + 0x30, 0x03, 0xbd, 0x23, 0xb6, 0xaf, 0xc5, 0xae, 0xaf, 0x98, 0x53, 0x92, + 0xaf, 0x56, 0x9e, 0xbd, 0xfc, 0x65, 0x25, 0x09, 0x1d, 0xce, 0xbd, 0x25, + 0xd0, 0xc7, 0xdf, 0x1e, 0xbe, 0x91, 0xe0, 0x26, 0x52, 0x62, 0x09, 0xf8, + 0xcb, 0x7f, 0x95, 0x77, 0x2c, 0xca, 0x8d, 0x13, 0xb1, 0x5f, 0x31, 0xe1, + 0x51, 0x87, 0x4b, 0xda, 0x26, 0x7d, 0xdc, 0xa3, 0x14, 0x06, 0x8e, 0x83, + 0xb9, 0x19, 0x18, 0x18, 0xee, 0x78, 0x4d, 0xa7, 0x73, 0x93, 0xb4, 0x6e, + 0x1a, 0x48, 0x93, 0x60, 0xbb, 0xb4, 0x9d, 0xa3, 0x0c, 0x7f, 0xc8, 0x2f, + 0x21, 0x69, 0x77, 0xad, 0x7d, 0xda, 0x6b, 0xd3, 0xf2, 0xec, 0xc0, 0x25, + 0xb1, 0x25, 0xad, 0xa4, 0xd5, 0xbe, 0xb5, 0x92, 0x01, 0x3b, 0x2d, 0xeb, + 0x48, 0x7f, 0xf4, 0xf5, 0xcb, 0x97, 0x5f, 0x98, 0xc4, 0xa7, 0xad, 0x38, + 0x2f, 0xaf, 0x4b, 0x17, 0x1a, 0x16, 0x5b, 0x64, 0x4a, 0xa9, 0xa5, 0xcf, + 0xd4, 0x52, 0x65, 0x5f, 0x91, 0xc2, 0x42, 0xf1, 0x7e, 0x6f, 0x06, 0xce, + 0x59, 0xe8, 0xf4, 0x91, 0x02, 0x59, 0xed, 0x95, 0x69, 0x92, 0x46, 0x4e, + 0x5c, 0x09, 0x04, 0xcf, 0x0c, 0x7c, 0x40, 0xea, 0x6b, 0xaf, 0xa0, 0x03, + 0x43, 0x54, 0x95, 0x6d, 0x97, 0xdf, 0x20, 0x23, 0x87, 0x8a, 0x25, 0x7e, + 0x4c, 0xb1, 0x88, 0xe0, 0x4e, 0x00, 0xbc, 0x73, 0x76, 0xaf, 0x11, 0x38, + 0x95, 0x18, 0xb8, 0x87, 0xcd, 0x58, 0x06, 0x9b, 0x56, 0x36, 0x66, 0xbd, + 0xd0, 0xa0, 0x43, 0x5a, 0xb5, 0x45, 0x5c, 0x5d, 0x61, 0x90, 0x48, 0x50, + 0xe1, 0x26, 0x71, 0xf2, 0x95, 0xc1, 0x7f, 0x86, 0x94, 0xc5, 0xd8, 0xce, + 0xfb, 0xcb, 0x68, 0x46, 0x9f, 0x97, 0x6a, 0xc6, 0x4a, 0x0b, 0x47, 0x5a, + 0xb0, 0x25, 0x1f, 0x24, 0x3d, 0xda, 0x6b, 0x7f, 0x35, 0x5d, 0x5d, 0xbf, + 0x82, 0x1d, 0x7b, 0xa0, 0x98, 0xc9, 0x6c, 0xc8, 0xc9, 0x13, 0xed, 0x9d, + 0x46, 0x36, 0xa4, 0xa0, 0x72, 0x35, 0x9b, 0x2d, 0x32, 0xd1, 0xe8, 0x68, + 0x01, 0xce, 0x1a, 0x42, 0x23, 0x0f, 0xf6, 0x2d, 0xf4, 0xda, 0xac, 0x42, + 0x28, 0x45, 0x55, 0xe1, 0xa9, 0x65, 0x1d, 0x00, 0x1a, 0x7a, 0x35, 0x2d, + 0xf5, 0x57, 0x46, 0x79, 0x9c, 0x5a, 0x3b, 0x29, 0x2e, 0xf6, 0x93, 0x8b, + 0xd3, 0xdd, 0x64, 0x01, 0x07, 0xdb, 0xd7, 0x8b, 0x31, 0x9a, 0x65, 0x1a, + 0x56, 0x4e, 0x22, 0x1e, 0x92, 0x32, 0xc8, 0x62, 0x6b, 0x7b, 0x54, 0xb1, + 0x54, 0xed, 0x1b, 0x5c, 0x01, 0x2b, 0x76, 0x0f, 0x95, 0x67, 0x9c, 0xde, + 0x40, 0x2c, 0x02, 0xba, 0x8d, 0x63, 0xbd, 0x9d, 0x9d, 0xb7, 0x7b, 0x07, + 0xd1, 0xd8, 0xc3, 0xd3, 0xd5, 0x12, 0x49, 0x80, 0xa9, 0x7d, 0x58, 0xc2, + 0x64, 0x1f, 0x5a, 0x44, 0x46, 0x57, 0x9c, 0x57, 0x3f, 0xc2, 0xbb, 0x49, + 0x71, 0x3e, 0xc9, 0x73, 0xbc, 0xdf, 0x8d, 0x74, 0x07, 0xa3, 0xed, 0xed, + 0x28, 0x79, 0xc1, 0xee, 0x54, 0x7b, 0x0c, 0x0f, 0xb2, 0x7a, 0x3e, 0x87, + 0x83, 0xc6, 0x25, 0xcf, 0xe5, 0x9c, 0x76, 0x8b, 0x20, 0x32, 0xea, 0x6a, + 0xd9, 0xb8, 0xf0, 0xb1, 0xfa, 0x73, 0x53, 0xb5, 0xf6, 0x82, 0xa7, 0xbc, + 0x58, 0xf3, 0xa5, 0xa5, 0xb8, 0xb5, 0xcf, 0x07, 0xe6, 0x22, 0x07, 0xec, + 0xe0, 0xf5, 0xad, 0xb9, 0x71, 0xf7, 0x95, 0x70, 0xfb, 0xaa, 0x72, 0x22, + 0x57, 0x25, 0x5c, 0xcd, 0xcb, 0x73, 0x11, 0x93, 0x3a, 0x01, 0xc5, 0x17, + 0x8c, 0x74, 0x06, 0x2d, 0x3e, 0x95, 0x37, 0xa8, 0x60, 0x78, 0xaa, 0x30, + 0x0c, 0xc1, 0x2a, 0xaf, 0x71, 0xf5, 0xd6, 0x8e, 0x92, 0x0a, 0xcf, 0xfb, + 0x34, 0xed, 0x82, 0xb7, 0x97, 0x59, 0x70, 0xe3, 0x21, 0xd5, 0x84, 0xc6, + 0x83, 0xa8, 0xe3, 0xbe, 0x3b, 0x77, 0x33, 0xde, 0x83, 0x66, 0x6c, 0x14, + 0xff, 0xf4, 0x86, 0x82, 0x32, 0x54, 0xca, 0xee, 0xb2, 0xb0, 0x94, 0xdb, + 0x53, 0x9c, 0xf2, 0x10, 0x47, 0x0e, 0x93, 0x14, 0xcd, 0x6a, 0x54, 0x15, + 0x63, 0x62, 0x0a, 0xb9, 0xcb, 0x95, 0x2c, 0xac, 0x2c, 0xc3, 0x5c, 0xd7, + 0xee, 0x9c, 0xc0, 0x66, 0x95, 0x27, 0x03, 0xc9, 0xe7, 0xea, 0x10, 0x96, + 0xb3, 0x56, 0xcb, 0x04, 0xdf, 0x45, 0x82, 0x8e, 0xfc, 0xd0, 0x1d, 0x8b, + 0xf4, 0xd7, 0xc9, 0x59, 0xbe, 0xba, 0x50, 0xd9, 0xae, 0xf5, 0x44, 0xd9, + 0x9b, 0xbc, 0x8d, 0x66, 0x9c, 0xf3, 0x09, 0x59, 0xa1, 0xef, 0x80, 0xe2, + 0xdc, 0xba, 0x27, 0xa2, 0x50, 0xf9, 0x7a, 0x3b, 0xf1, 0xd7, 0xbf, 0x06, + 0x60, 0x9b, 0x00, 0xd2, 0x70, 0x6d, 0xc0, 0xdf, 0x34, 0x08, 0x36, 0x68, + 0x25, 0xc1, 0xb3, 0x4a, 0x44, 0x03, 0x93, 0x39, 0xb4, 0x4d, 0xa6, 0x16, + 0xde, 0x6c, 0xfe, 0xf4, 0xcc, 0xb6, 0x21, 0xfe, 0x50, 0xaa, 0xcc, 0xd2, + 0xaa, 0x9f, 0x99, 0xae, 0x4e, 0x6f, 0xec, 0xce, 0x47, 0xce, 0x25, 0x0e, + 0x43, 0x25, 0x8b, 0xf7, 0x80, 0x54, 0xcd, 0x1b, 0xcd, 0xfd, 0x33, 0xfc, + 0x65, 0xed, 0x9f, 0x19, 0xbd, 0x3e, 0xf5, 0x33, 0x0a, 0xdf, 0xa9, 0x50, + 0xbe, 0x3a, 0xa8, 0x52, 0xd7, 0x57, 0xf3, 0x00, 0xd8, 0x54, 0x1b, 0x8e, + 0xb8, 0xea, 0xbc, 0xb4, 0xcb, 0xdc, 0x53, 0x3b, 0xb4, 0x9d, 0xfb, 0x16, + 0x14, 0x91, 0xd2, 0x37, 0x62, 0x57, 0x4e, 0x57, 0x07, 0x84, 0xef, 0x5f, + 0x56, 0x98, 0x13, 0x5c, 0xd3, 0xe6, 0xdd, 0x6a, 0x67, 0x4d, 0x58, 0x6d, + 0x82, 0x7a, 0x26, 0xb7, 0x49, 0xa0, 0x69, 0x82, 0xca, 0x2e, 0x3e, 0x06, + 0x3c, 0xb9, 0xbb, 0xff, 0x89, 0xfc, 0x99, 0x1a, 0x53, 0xc5, 0xc5, 0x6a, + 0x2a, 0xdf, 0x7f, 0x04, 0x5f, 0xd3, 0x23, 0xea, 0x26, 0x45, 0x53, 0x9f, + 0x9f, 0xdd, 0x54, 0x9a, 0xeb, 0x1f, 0x0f, 0x92, 0xd7, 0xe2, 0x72, 0xe5, + 0x06, 0xb6, 0xc2, 0xb9, 0xb8, 0xc3, 0xba, 0x85, 0x9d, 0xfb, 0x86, 0xe2, + 0xb9, 0x2a, 0x51, 0x8e, 0x9c, 0xe9, 0x86, 0x42, 0xdf, 0x18, 0x50, 0x49, + 0x83, 0x64, 0xc3, 0x18, 0x16, 0xe8, 0x48, 0xda, 0x3b, 0xa1, 0x47, 0xc7, + 0x05, 0x91, 0xbb, 0x66, 0x50, 0x51, 0xed, 0x37, 0x8f, 0x39, 0x19, 0xf4, + 0x40, 0x1a, 0x86, 0x35, 0xdc, 0xb4, 0xef, 0xd9, 0x2c, 0x6b, 0x30, 0x59, + 0xfc, 0xfa, 0xe9, 0xd3, 0x67, 0x2f, 0x5e, 0x58, 0x15, 0x80, 0xfd, 0xd7, + 0x80, 0x87, 0x82, 0x98, 0x25, 0xa9, 0xdd, 0x02, 0x68, 0xac, 0x81, 0xe1, + 0xbb, 0x10, 0xa7, 0x0c, 0x40, 0x71, 0x47, 0x2d, 0x4e, 0xf9, 0x2f, 0xa6, + 0xd3, 0xad, 0x9a, 0x10, 0xa8, 0x45, 0xcc, 0x7a, 0x55, 0xfb, 0x68, 0x5c, + 0x71, 0x9a, 0x8b, 0x75, 0xa1, 0x10, 0x8f, 0xa4, 0xdd, 0xe5, 0x8b, 0x5c, + 0x7f, 0xdb, 0x43, 0x80, 0x39, 0x3d, 0xcd, 0x84, 0x1f, 0x89, 0xdb, 0x50, + 0xdf, 0xd0, 0x7e, 0x56, 0x67, 0x1e, 0xc1, 0x89, 0x74, 0xfb, 0xf9, 0x33, + 0x36, 0x9d, 0xf5, 0x0a, 0x67, 0x1f, 0x31, 0x5d, 0x8b, 0x76, 0x42, 0xa3, + 0x33, 0x06, 0xf6, 0x87, 0x44, 0x9c, 0x8e, 0xc7, 0x4b, 0xb3, 0xc0, 0x36, + 0x97, 0xa5, 0x00, 0x3f, 0x48, 0x46, 0xa6, 0x73, 0x3b, 0x11, 0x76, 0xe9, + 0x62, 0x67, 0x1f, 0x43, 0x19, 0x4f, 0x07, 0x6c, 0x56, 0x6f, 0xbd, 0x8d, + 0x52, 0x2c, 0x9a, 0xe9, 0xc4, 0xa0, 0xa0, 0xa5, 0xb3, 0x8f, 0x9e, 0xac, + 0x30, 0xad, 0xca, 0x56, 0xcb, 0x17, 0x2a, 0x2b, 0x0c, 0x1c, 0x75, 0xc2, + 0x56, 0xca, 0x02, 0x1c, 0x5f, 0x2a, 0xb6, 0x6c, 0x67, 0xbb, 0x44, 0xbc, + 0x97, 0x8c, 0x18, 0xe5, 0x17, 0x2a, 0x73, 0x34, 0x81, 0x3f, 0x01, 0x06, + 0x24, 0x30, 0xf7, 0x99, 0xc9, 0x0b, 0xb0, 0xc0, 0xc4, 0x04, 0x94, 0x7e, + 0x59, 0xda, 0x89, 0x27, 0x94, 0xe2, 0x99, 0x0c, 0x17, 0x1f, 0xdd, 0x3c, + 0x55, 0x8b, 0x8d, 0xb4, 0x27, 0x58, 0xa2, 0x8b, 0xe4, 0xe0, 0xe4, 0x33, + 0x83, 0xfe, 0x48, 0x4d, 0xa4, 0x79, 0xf0, 0x9f, 0xd3, 0x5e, 0x06, 0x7c, + 0xbc, 0x97, 0x5c, 0xcb, 0xb3, 0x19, 0xf8, 0x05, 0xb1, 0xb1, 0x74, 0x9d, + 0x5f, 0x1f, 0xcd, 0x8f, 0xf5, 0x55, 0x0c, 0x3d, 0xf0, 0xdf, 0x37, 0xe0, + 0x05, 0xe7, 0x63, 0x79, 0xe7, 0x80, 0x9f, 0xec, 0xf4, 0xac, 0xca, 0x01, + 0x29, 0x9a, 0x2f, 0x4f, 0xb9, 0x3a, 0xba, 0x36, 0x79, 0x69, 0x62, 0x64, + 0xc7, 0x61, 0xe4, 0x71, 0x4f, 0x57, 0x77, 0x26, 0xef, 0x93, 0x8a, 0xac, + 0x38, 0xc9, 0x64, 0x79, 0x5a, 0x79, 0x2e, 0x95, 0x2b, 0xab, 0x22, 0x00, + 0xcb, 0xf2, 0x84, 0xe7, 0xca, 0x3f, 0xea, 0xe5, 0xc8, 0xab, 0xb4, 0x0e, + 0x68, 0x13, 0x23, 0x68, 0x94, 0xf2, 0x07, 0x2d, 0xda, 0x8e, 0x75, 0xdf, + 0x70, 0x2f, 0x81, 0x59, 0x1c, 0x81, 0x29, 0x60, 0x7a, 0xf1, 0xa7, 0x71, + 0xf8, 0xb8, 0x6b, 0xe6, 0x27, 0x70, 0x15, 0x47, 0x20, 0xe8, 0x47, 0x11, + 0x76, 0x3b, 0x70, 0x5d, 0x0e, 0x6e, 0x2d, 0x7f, 0x30, 0xef, 0xac, 0x18, + 0x06, 0x87, 0x6a, 0x9e, 0x45, 0xf5, 0xa1, 0x7e, 0xc8, 0x8a, 0xe1, 0x26, + 0x81, 0x2f, 0xea, 0xec, 0x49, 0x21, 0x3a, 0x6d, 0x80, 0x5c, 0x0f, 0xf4, + 0x09, 0x30, 0x95, 0xef, 0x9d, 0xf9, 0xda, 0xd3, 0x5e, 0xc4, 0xf4, 0x4f, + 0x7b, 0x91, 0x2e, 0x85, 0xb7, 0xaa, 0xdb, 0xf8, 0x82, 0x84, 0x54, 0xcf, + 0x79, 0xe3, 0x0b, 0xff, 0x24, 0x8e, 0xb5, 0x32, 0xa6, 0x9a, 0xea, 0x0d, + 0x88, 0x51, 0x17, 0xd8, 0xbb, 0xd8, 0x3d, 0x42, 0xd8, 0xe3, 0xcd, 0x2a, + 0x49, 0x25, 0x63, 0x11, 0x88, 0xb1, 0x31, 0x20, 0xc8, 0x58, 0x6d, 0x93, + 0xa0, 0x94, 0x89, 0x18, 0xc3, 0xdf, 0x01, 0x03, 0xb4, 0x72, 0x33, 0x3d, + 0x85, 0xc6, 0xb4, 0xba, 0xc8, 0xca, 0x73, 0xa0, 0x94, 0x9c, 0x67, 0x79, + 0x66, 0x4d, 0x17, 0x69, 0x2d, 0x52, 0xc8, 0xd0, 0x29, 0x75, 0x35, 0x29, + 0x81, 0xb8, 0x2a, 0x19, 0x4d, 0x71, 0x0c, 0xc6, 0x6a, 0xbf, 0x6a, 0xc1, + 0x2b, 0x9c, 0x44, 0x90, 0xd7, 0x80, 0x45, 0x56, 0x95, 0x16, 0x2e, 0xd1, + 0x15, 0x88, 0xcf, 0x0b, 0xc3, 0xf2, 0x48, 0x18, 0x16, 0x47, 0x3d, 0x50, + 0xb4, 0xed, 0xc3, 0x47, 0x13, 0xac, 0x8d, 0x64, 0xce, 0x29, 0xa6, 0x55, + 0xd6, 0x81, 0xab, 0x84, 0xde, 0xd3, 0x73, 0xe8, 0x14, 0x6c, 0xcc, 0xbe, + 0x4f, 0x58, 0x3e, 0xc1, 0xac, 0x91, 0xb6, 0x02, 0x52, 0xe2, 0x32, 0x9a, + 0x2d, 0x6f, 0xf5, 0xc2, 0x06, 0x6c, 0x2f, 0xb1, 0xce, 0x1a, 0x93, 0x09, + 0xcb, 0x7c, 0x81, 0x42, 0x3b, 0xc8, 0x61, 0xa9, 0xe1, 0x28, 0xb5, 0x59, + 0x6a, 0x00, 0x62, 0xa9, 0xd5, 0x13, 0x57, 0x6a, 0xf5, 0xc2, 0x02, 0xec, + 0x2a, 0xb5, 0x64, 0x4d, 0x7d, 0xaf, 0x95, 0x7a, 0x0d, 0x52, 0xdb, 0xc8, + 0x61, 0xa9, 0xe9, 0x8c, 0xb7, 0x51, 0x6a, 0x04, 0x62, 0xa9, 0xd5, 0x13, + 0x47, 0x6a, 0xf5, 0xc2, 0x06, 0xec, 0x28, 0xb5, 0x60, 0x8d, 0xc9, 0xd4, + 0x49, 0x7d, 0x09, 0x52, 0x3b, 0xc8, 0x35, 0x75, 0x0d, 0xd3, 0x8d, 0x46, + 0xa9, 0x11, 0x88, 0xa5, 0x56, 0x4f, 0x1c, 0xa9, 0xd5, 0x0b, 0x1b, 0xb0, + 0xa3, 0xd4, 0x82, 0x35, 0x26, 0x53, 0x27, 0x35, 0x8e, 0xf5, 0x0e, 0xb2, + 0x4f, 0x6a, 0x00, 0xba, 0x5c, 0xd6, 0x58, 0xb7, 0x9a, 0xd6, 0x22, 0x18, + 0xdb, 0x37, 0xfd, 0xb2, 0xe4, 0x55, 0x47, 0xec, 0x0c, 0xd1, 0xc1, 0xa8, + 0xd5, 0x99, 0xbd, 0xc4, 0x0f, 0x4b, 0x58, 0x9c, 0x80, 0x84, 0x26, 0x96, + 0x57, 0x3c, 0x38, 0xce, 0x6e, 0x16, 0x0e, 0x80, 0x94, 0x68, 0x88, 0xe0, + 0x11, 0x0c, 0x9e, 0xf2, 0xfb, 0x4e, 0x62, 0x09, 0x46, 0xe0, 0xdf, 0x3a, + 0xa1, 0x54, 0x13, 0x65, 0x1c, 0xaf, 0x50, 0xe8, 0x1c, 0xd0, 0x2c, 0x15, + 0x42, 0x85, 0x27, 0x44, 0x0c, 0x03, 0x53, 0xa2, 0xbf, 0x7f, 0x6e, 0xc3, + 0xec, 0x88, 0xd9, 0x8d, 0x06, 0x8d, 0x0f, 0x9b, 0xe7, 0x34, 0x04, 0xe5, + 0x56, 0x1c, 0xb9, 0x60, 0x30, 0x44, 0xa7, 0xaa, 0x93, 0xea, 0xc6, 0x8f, + 0xba, 0xca, 0xc3, 0x15, 0x82, 0x85, 0xe5, 0xad, 0x3d, 0x91, 0x7c, 0xaf, + 0xb9, 0xfe, 0x04, 0x5c, 0x5d, 0x0d, 0x32, 0xd4, 0x3f, 0xa8, 0x0e, 0x05, + 0x43, 0x4e, 0x2d, 0x8a, 0xc7, 0xcd, 0xf5, 0x28, 0xe1, 0x54, 0x4d, 0xa6, + 0xb6, 0x3f, 0xc9, 0x3b, 0x98, 0x98, 0x10, 0x71, 0x18, 0xb8, 0x53, 0xa5, + 0x4a, 0xef, 0x14, 0xb3, 0xbc, 0x5f, 0x12, 0x99, 0xd5, 0x90, 0x7f, 0xcb, + 0x9c, 0x80, 0xfc, 0x40, 0xa4, 0xf8, 0xab, 0x33, 0x84, 0x15, 0x18, 0x82, + 0x5d, 0x52, 0xc0, 0x12, 0xa8, 0xb0, 0x28, 0x53, 0x40, 0xc0, 0x08, 0x5b, + 0x40, 0xb0, 0x7f, 0x96, 0x31, 0x20, 0x47, 0x8e, 0x35, 0xc8, 0xe7, 0x51, + 0xe6, 0x80, 0x80, 0xb5, 0xf6, 0x30, 0x1a, 0x23, 0x12, 0x43, 0x77, 0x98, + 0x34, 0xff, 0x73, 0x0c, 0x82, 0x88, 0x47, 0x59, 0x04, 0x41, 0x46, 0x98, + 0x04, 0xc1, 0xfd, 0xb3, 0x6c, 0x82, 0x58, 0x72, 0x8c, 0x42, 0xbd, 0x88, + 0xb2, 0x0a, 0x82, 0xac, 0x33, 0x0b, 0xe8, 0x24, 0x4c, 0xe0, 0x7f, 0xb3, + 0x55, 0x00, 0xad, 0xb8, 0x6e, 0x02, 0x00, 0x63, 0xba, 0x09, 0x00, 0xfb, + 0x87, 0x75, 0x13, 0xc8, 0x91, 0x6b, 0x11, 0xf4, 0x3c, 0xae, 0x9b, 0x00, + 0xc0, 0xda, 0x6e, 0x62, 0xbf, 0xaf, 0x83, 0xfe, 0x3b, 0xfb, 0x08, 0x8a, + 0x15, 0x4a, 0xa1, 0x42, 0xdd, 0xed, 0x1b, 0x2d, 0x8e, 0x68, 0xb7, 0x5d, + 0x1c, 0xf3, 0x5c, 0xf9, 0x50, 0xa0, 0x0b, 0x6d, 0x17, 0x47, 0xf4, 0x43, + 0xed, 0x97, 0x3e, 0xc7, 0x13, 0x84, 0x63, 0xc1, 0x82, 0x7f, 0xd2, 0x7d, + 0xf2, 0x63, 0xfd, 0xe2, 0x51, 0x40, 0xa0, 0x9b, 0x12, 0x5b, 0xab, 0x78, + 0xb6, 0x49, 0xa7, 0x19, 0x74, 0x6f, 0x98, 0x0f, 0x46, 0xb5, 0xf0, 0xa9, + 0xe2, 0x90, 0x58, 0x64, 0x2e, 0xef, 0x69, 0x77, 0x46, 0xf3, 0xc9, 0x95, + 0xb6, 0xd3, 0x0b, 0x9b, 0x90, 0xe4, 0x35, 0x41, 0xcf, 0xc5, 0xfe, 0xa4, + 0x64, 0xaa, 0x5c, 0x49, 0x6f, 0x09, 0x45, 0x9c, 0x0b, 0x6f, 0xb5, 0x1e, + 0xf5, 0xf2, 0x06, 0x3c, 0x9b, 0x52, 0xc0, 0xd9, 0x4d, 0xc5, 0x6c, 0x52, + 0x45, 0x7e, 0x95, 0x5c, 0x87, 0x38, 0x77, 0x35, 0x8a, 0xa5, 0x39, 0x3e, + 0xaf, 0xf5, 0xfd, 0x41, 0x39, 0x74, 0x10, 0x94, 0xba, 0xbc, 0xd4, 0x58, + 0xef, 0x41, 0x27, 0xdb, 0x30, 0x76, 0x87, 0x25, 0xad, 0x47, 0x9c, 0x5a, + 0xbe, 0x9c, 0x33, 0xf3, 0x30, 0x68, 0xbc, 0xef, 0xab, 0x8f, 0xca, 0x74, + 0x46, 0xe6, 0xd2, 0xeb, 0xb7, 0xf7, 0xa2, 0x73, 0x9b, 0x75, 0x36, 0x02, + 0xa5, 0x27, 0xf7, 0xf5, 0x67, 0x1f, 0x93, 0xde, 0xb3, 0xdc, 0xbd, 0x5e, + 0x58, 0xce, 0xed, 0xbb, 0x94, 0x53, 0x93, 0xcb, 0xbb, 0x63, 0xb1, 0xb8, + 0x98, 0xcc, 0x97, 0x8d, 0xe7, 0x4b, 0x43, 0x84, 0x52, 0x36, 0xaf, 0xb0, + 0xdc, 0x7e, 0x53, 0x8b, 0x10, 0xad, 0x83, 0xb6, 0x5a, 0xe6, 0xfb, 0x88, + 0x41, 0x19, 0x5a, 0x99, 0xce, 0x01, 0xc2, 0x79, 0x76, 0x4d, 0x60, 0x75, + 0xac, 0x30, 0xf4, 0xcd, 0xfc, 0x27, 0xec, 0x5c, 0x52, 0xf2, 0x10, 0x7b, + 0x0e, 0x63, 0xb1, 0x42, 0x97, 0x0e, 0x02, 0xe9, 0x68, 0x30, 0xee, 0x0f, + 0x46, 0xfb, 0xfd, 0x77, 0xc7, 0x8f, 0x1f, 0xf7, 0x1f, 0x84, 0xe1, 0x76, + 0x14, 0xdc, 0xde, 0xa3, 0x87, 0x75, 0x70, 0x7b, 0x0a, 0x6e, 0x34, 0xda, + 0xed, 0xf7, 0xb7, 0x46, 0x70, 0xfe, 0x1d, 0x13, 0x92, 0xb0, 0x5c, 0xad, + 0x16, 0xd3, 0x49, 0x8b, 0xc6, 0x43, 0x85, 0xc6, 0x50, 0x3e, 0x5b, 0xad, + 0xca, 0xec, 0x3e, 0x08, 0xdb, 0x2c, 0xab, 0x5a, 0x49, 0x41, 0xe7, 0x14, + 0xfc, 0x6d, 0xbc, 0x87, 0xbd, 0xf8, 0xc6, 0x9b, 0xa3, 0xd1, 0x68, 0x23, + 0x79, 0x02, 0x5f, 0x9e, 0x3d, 0x7b, 0xb6, 0x11, 0x43, 0x99, 0x58, 0xbe, + 0x3f, 0xc2, 0xe4, 0x98, 0xdb, 0x8d, 0xba, 0xdd, 0x9e, 0x30, 0x76, 0x7a, + 0x73, 0x7b, 0x42, 0x28, 0xd5, 0x9e, 0x14, 0x56, 0xa8, 0x3d, 0xe1, 0x3b, + 0x1d, 0xb2, 0xd5, 0x66, 0xa0, 0x4b, 0x0b, 0xb8, 0x33, 0x4b, 0x8c, 0x51, + 0x13, 0x39, 0x24, 0xd9, 0x0a, 0xf2, 0x11, 0x0f, 0x68, 0x05, 0x6d, 0xac, + 0x59, 0x2b, 0x08, 0xa5, 0xb4, 0xa2, 0xb0, 0x42, 0x5a, 0xc1, 0x77, 0x26, + 0x64, 0x77, 0xad, 0x08, 0xee, 0x14, 0x9d, 0x78, 0xad, 0x48, 0xc7, 0xc3, + 0x36, 0x6d, 0x09, 0x01, 0x62, 0x48, 0xab, 0x03, 0xca, 0xbb, 0xa7, 0xcc, + 0xdb, 0x83, 0xf7, 0x45, 0x5b, 0x4c, 0xe9, 0xef, 0x91, 0x3a, 0xac, 0x10, + 0xee, 0x4d, 0x31, 0x6a, 0xc1, 0x71, 0x8f, 0xf4, 0x61, 0xfd, 0xd2, 0x9d, + 0x7d, 0xe9, 0x8a, 0x51, 0x66, 0xd7, 0xe5, 0x16, 0xdd, 0x2c, 0x10, 0x8d, + 0xf1, 0x34, 0x5b, 0x0b, 0x47, 0xba, 0x04, 0x1e, 0x31, 0xcd, 0x04, 0xa3, + 0x5a, 0x62, 0x38, 0xa4, 0xd8, 0x11, 0x13, 0x51, 0xff, 0xd9, 0x03, 0xa6, + 0x0a, 0x3f, 0x5a, 0xc4, 0xf8, 0xf6, 0xf0, 0xb5, 0x0b, 0x5e, 0x6a, 0x07, + 0xfc, 0x7a, 0x88, 0x66, 0xd0, 0xb7, 0x07, 0xfe, 0x04, 0x04, 0xb8, 0xf4, + 0x34, 0x0d, 0x13, 0xe3, 0xf1, 0xd8, 0x3b, 0x08, 0xdd, 0x46, 0x18, 0x89, + 0x3a, 0x30, 0xc7, 0x80, 0xb0, 0xdd, 0x06, 0xa4, 0x5a, 0xf2, 0x22, 0x84, + 0xce, 0x3d, 0x10, 0x26, 0x67, 0x9d, 0xfb, 0x21, 0x8d, 0x6e, 0x3c, 0xf7, + 0x43, 0x19, 0x1d, 0x7c, 0xee, 0x89, 0xb4, 0x08, 0x5e, 0x72, 0x3f, 0xb4, + 0x8b, 0x75, 0x76, 0x5f, 0xd5, 0xa8, 0x7a, 0x83, 0x6e, 0xa4, 0x9d, 0x51, + 0xbf, 0x8c, 0x58, 0x5a, 0x00, 0x90, 0x31, 0xe6, 0x97, 0xc1, 0x85, 0x05, + 0xbc, 0xd2, 0xe1, 0xfe, 0xc4, 0xaa, 0x82, 0x18, 0x93, 0x54, 0xe2, 0x87, + 0x7b, 0x45, 0x64, 0x08, 0xbb, 0x1e, 0x6d, 0x3a, 0xf0, 0x72, 0x19, 0x43, + 0x5d, 0xec, 0x76, 0x34, 0x2f, 0x1d, 0x5d, 0xea, 0xad, 0xd6, 0xf3, 0x77, + 0xbc, 0x90, 0xad, 0xe5, 0x46, 0x8c, 0x78, 0xaf, 0x26, 0xe0, 0xbc, 0x06, + 0xfb, 0x69, 0xe2, 0x42, 0x5f, 0xda, 0x0f, 0x1b, 0x4b, 0x11, 0x65, 0x2d, + 0x40, 0xd5, 0x32, 0x98, 0x22, 0x68, 0x31, 0x04, 0x6d, 0xc0, 0xb6, 0xd9, + 0x5f, 0xf1, 0x52, 0x83, 0x52, 0x8c, 0x52, 0x5b, 0xcb, 0x2b, 0x47, 0x70, + 0xca, 0x10, 0x73, 0x36, 0x39, 0xc9, 0x64, 0x1c, 0xe9, 0x36, 0x81, 0xdd, + 0xd4, 0x6a, 0x38, 0x1c, 0x49, 0x48, 0x4d, 0xf1, 0x1b, 0x40, 0xb0, 0x42, + 0x9b, 0x40, 0xca, 0x65, 0x33, 0x44, 0x11, 0x00, 0x01, 0xef, 0xe0, 0xb8, + 0x26, 0x25, 0x12, 0xd0, 0x79, 0xea, 0x86, 0xae, 0x2e, 0xaa, 0xaa, 0xb9, + 0xdb, 0x59, 0x80, 0xba, 0xd1, 0x75, 0xd8, 0xcc, 0x9f, 0x83, 0x37, 0xc9, + 0xa5, 0xf5, 0xb3, 0x5b, 0x2d, 0x79, 0x6e, 0xc3, 0xd6, 0x7e, 0xd2, 0xb3, + 0xaf, 0x56, 0x01, 0x70, 0xe5, 0x2a, 0xae, 0x6e, 0x52, 0xf6, 0x5d, 0xaf, + 0x6d, 0xfa, 0x33, 0x69, 0x26, 0x0f, 0x0e, 0xf9, 0x4e, 0xa3, 0x73, 0x21, + 0x05, 0x5f, 0x64, 0x22, 0xf6, 0x22, 0xb8, 0xac, 0x67, 0x05, 0x39, 0xe5, + 0xaa, 0x84, 0x42, 0x89, 0xb0, 0xbf, 0x42, 0x43, 0x32, 0x2f, 0xda, 0x5c, + 0x4c, 0xd6, 0xce, 0x25, 0x1b, 0xfe, 0xb3, 0x7d, 0xcd, 0x1d, 0x3e, 0x1b, + 0x3a, 0x34, 0xe5, 0x68, 0xae, 0x5f, 0x57, 0x8f, 0x93, 0xcb, 0x9a, 0x2a, + 0x19, 0x6d, 0xe7, 0xcf, 0x4d, 0xe0, 0xf4, 0x49, 0x5c, 0x98, 0x2d, 0xc9, + 0x55, 0xdb, 0xa8, 0x07, 0x66, 0xbd, 0x91, 0x6d, 0xf8, 0x5d, 0xae, 0xa5, + 0xd8, 0xd2, 0xdd, 0xba, 0xd7, 0x77, 0xaa, 0x95, 0x2e, 0x57, 0xd8, 0xd5, + 0x3a, 0x59, 0x2c, 0xfe, 0xaa, 0x1a, 0x45, 0xbd, 0x0a, 0xed, 0x24, 0x87, + 0x6d, 0xaa, 0xf7, 0xc0, 0x4f, 0x8e, 0x00, 0x4c, 0xdd, 0xd0, 0xa3, 0x6e, + 0xea, 0xf9, 0x3b, 0xad, 0xe3, 0x30, 0xf4, 0xde, 0x95, 0xa2, 0x5e, 0x88, + 0x5b, 0x77, 0x5b, 0xb6, 0xf1, 0xee, 0xae, 0x31, 0xfb, 0x68, 0xd3, 0x55, + 0xfa, 0x8e, 0xb5, 0xea, 0xfa, 0x3c, 0x3e, 0x19, 0x83, 0x52, 0xac, 0x21, + 0xce, 0xba, 0x19, 0x74, 0xc7, 0xcb, 0xb2, 0x38, 0x53, 0x8e, 0x31, 0xe3, + 0x16, 0x56, 0x1b, 0xd7, 0x29, 0xe9, 0x35, 0x76, 0x87, 0x2b, 0xc9, 0x36, + 0x6c, 0x68, 0x2c, 0xf0, 0xb7, 0x88, 0x89, 0x25, 0x8f, 0x61, 0xf5, 0x65, + 0xdc, 0x3a, 0x17, 0x7a, 0xcc, 0x5b, 0x5e, 0x17, 0xc5, 0x0c, 0x63, 0x79, + 0xdf, 0x0c, 0x12, 0x4c, 0x82, 0x09, 0x32, 0x35, 0xde, 0xb3, 0x91, 0xe5, + 0x4b, 0x02, 0x55, 0x55, 0x5f, 0x1b, 0xc7, 0xd6, 0x40, 0x56, 0x3d, 0x0f, + 0xce, 0x32, 0x53, 0x28, 0x16, 0xc7, 0x4b, 0x75, 0x8b, 0x8c, 0xce, 0x02, + 0xdf, 0x9c, 0x9c, 0x8e, 0x1f, 0x8e, 0x1f, 0xd2, 0x61, 0xe0, 0x9b, 0xbb, + 0x27, 0x93, 0xb3, 0xbd, 0xed, 0x1e, 0x4f, 0xb1, 0x3e, 0x5c, 0xce, 0x2f, + 0x26, 0x24, 0xc4, 0xbc, 0x20, 0x86, 0x4f, 0xc5, 0xfd, 0x6e, 0x52, 0x01, + 0x39, 0x75, 0xa7, 0x78, 0xd9, 0x4e, 0xdc, 0x47, 0x4b, 0xa0, 0x94, 0x11, + 0x7e, 0xe9, 0xfb, 0xae, 0xce, 0xf4, 0x40, 0x0d, 0xe8, 0x05, 0x4a, 0x64, + 0x64, 0x09, 0xfe, 0x94, 0xc6, 0x11, 0x77, 0x6e, 0x0c, 0x62, 0xa2, 0x6f, + 0x48, 0x6e, 0xa5, 0x4a, 0x39, 0xf6, 0xa3, 0x9e, 0x7c, 0x1a, 0x8c, 0x83, + 0xe2, 0x3d, 0x2e, 0xe0, 0xc7, 0x55, 0xa1, 0xb2, 0x81, 0x73, 0x7a, 0x47, + 0x37, 0x8d, 0x77, 0x32, 0x42, 0xc9, 0xc4, 0x5b, 0x2d, 0x2d, 0x78, 0x32, + 0x96, 0xcf, 0x6a, 0x52, 0xe2, 0x33, 0x10, 0x65, 0x8d, 0xe5, 0xc4, 0x92, + 0x66, 0xf6, 0x34, 0x75, 0x27, 0x71, 0xb1, 0x30, 0xaf, 0x25, 0x9a, 0xb7, + 0x52, 0x28, 0x03, 0x6c, 0xb2, 0x5e, 0x95, 0x60, 0x0b, 0x73, 0x18, 0xc0, + 0x6e, 0x28, 0xcf, 0xb0, 0xc6, 0x70, 0xa1, 0xdd, 0x0c, 0xf3, 0xe6, 0x5c, + 0xe4, 0xeb, 0xc0, 0x29, 0x3e, 0x74, 0xc2, 0x77, 0xc2, 0x33, 0x99, 0x2d, + 0x99, 0x44, 0x4e, 0x7a, 0x9f, 0x4f, 0x96, 0x97, 0x54, 0x12, 0x3d, 0x3d, + 0x7d, 0xf2, 0xa4, 0x86, 0x59, 0xba, 0xd9, 0xf8, 0xfa, 0xc7, 0x2c, 0x5b, + 0x3f, 0x25, 0x60, 0x21, 0xec, 0xad, 0x36, 0x61, 0x6f, 0x64, 0x0f, 0x6a, + 0xe1, 0xe8, 0x58, 0x07, 0x0b, 0x67, 0x8f, 0xc4, 0xfe, 0xc1, 0x58, 0xf1, + 0xd4, 0xae, 0x8d, 0x99, 0xc6, 0x10, 0x20, 0xa9, 0xe9, 0x98, 0x53, 0x4f, + 0x78, 0x1a, 0x9a, 0x7a, 0xb6, 0x9e, 0x76, 0x02, 0xad, 0x86, 0xae, 0xc1, + 0xbc, 0x86, 0x24, 0xa5, 0x0a, 0x56, 0x7d, 0xbd, 0x81, 0x00, 0x4d, 0xb6, + 0x10, 0x01, 0x86, 0xae, 0x04, 0xb0, 0xc6, 0x92, 0x07, 0xda, 0x97, 0x18, + 0x4e, 0x9d, 0x06, 0x20, 0x01, 0x07, 0x86, 0x2f, 0x7e, 0x06, 0x7c, 0x34, + 0x94, 0xf4, 0x07, 0x4a, 0x7a, 0x01, 0xcd, 0xa6, 0x83, 0x77, 0x12, 0x6c, + 0xd3, 0xc1, 0x67, 0xf2, 0x5e, 0xc7, 0x26, 0x34, 0x8f, 0x0b, 0x27, 0x1e, + 0x02, 0x07, 0xa1, 0x73, 0xaf, 0x07, 0x03, 0x47, 0xa4, 0x04, 0xb9, 0x48, + 0x53, 0xc9, 0xfc, 0x91, 0xb3, 0xaa, 0xe1, 0xa6, 0xfe, 0x6c, 0xbc, 0x60, + 0xa3, 0x93, 0xfc, 0xf4, 0x72, 0xbe, 0x5c, 0xc1, 0x57, 0x6e, 0xce, 0x50, + 0x7a, 0xf8, 0x02, 0xf2, 0xd3, 0x8a, 0x3a, 0x2a, 0x8a, 0x4d, 0x83, 0xe4, + 0x04, 0x32, 0x48, 0xdf, 0x26, 0x10, 0x36, 0x5a, 0x19, 0x26, 0x12, 0x1f, + 0x08, 0x24, 0xa7, 0x64, 0x8c, 0xa9, 0x43, 0x2d, 0xf5, 0xd0, 0x8e, 0x98, + 0x5b, 0xcf, 0x60, 0x76, 0x1a, 0xcf, 0x5f, 0x44, 0x8b, 0x79, 0xf0, 0xc0, + 0xc2, 0xf9, 0x73, 0x6d, 0xc7, 0xe2, 0x5e, 0xef, 0xa9, 0x9d, 0xdf, 0xbd, + 0x9e, 0x1f, 0xc9, 0x0c, 0xe7, 0xf2, 0x00, 0x2a, 0xb7, 0x49, 0x08, 0x7b, + 0x1e, 0x71, 0xe0, 0xd5, 0x36, 0xf5, 0x56, 0xd1, 0xea, 0xfe, 0x18, 0xda, + 0xd7, 0xbd, 0x68, 0x7c, 0x38, 0xbc, 0x57, 0x8d, 0xff, 0x59, 0xe5, 0xa9, + 0xa6, 0xd9, 0xd4, 0xd3, 0xbe, 0x77, 0x98, 0x70, 0x07, 0xe7, 0x61, 0x24, + 0x36, 0x6c, 0xda, 0x6d, 0x54, 0xdd, 0xd1, 0x94, 0x24, 0xba, 0xee, 0x9e, + 0x11, 0xf4, 0x6a, 0x19, 0x59, 0x69, 0xb7, 0x11, 0x37, 0xe5, 0xa1, 0x17, + 0xa9, 0x46, 0x74, 0x7d, 0xfc, 0x25, 0x35, 0xb1, 0x5e, 0x36, 0x19, 0x48, + 0x95, 0x02, 0x98, 0xd5, 0xa3, 0xf8, 0xb1, 0x89, 0x49, 0x0e, 0xcf, 0x26, + 0xf3, 0x45, 0xc6, 0xf7, 0xa5, 0x83, 0xba, 0x25, 0x86, 0x4d, 0x96, 0x1d, + 0x86, 0x4d, 0x76, 0xeb, 0xfb, 0x56, 0x91, 0xf2, 0x3c, 0xd0, 0x97, 0x36, + 0x2e, 0xa5, 0xc2, 0x01, 0x9a, 0xf6, 0x1f, 0xde, 0x4f, 0x80, 0xa6, 0xfd, + 0x87, 0x77, 0x17, 0xa0, 0xc9, 0x8a, 0xb2, 0x40, 0xc1, 0x9a, 0x40, 0x33, + 0x05, 0x68, 0x46, 0x1f, 0x5a, 0xbf, 0x3d, 0xcf, 0x96, 0x62, 0x50, 0x65, + 0x95, 0xce, 0x0b, 0x9a, 0x81, 0x0d, 0x28, 0x44, 0x39, 0x5d, 0x33, 0x25, + 0xad, 0xcb, 0xe1, 0x17, 0x9e, 0xe6, 0x3f, 0x67, 0xb9, 0xaf, 0x36, 0x78, + 0x44, 0x70, 0x63, 0x81, 0xbb, 0x36, 0x5e, 0xd5, 0x13, 0x95, 0xe6, 0x2e, + 0xf1, 0xf4, 0xf4, 0xd9, 0x6e, 0xb0, 0x15, 0x02, 0xb1, 0xf3, 0x68, 0x8b, + 0xa1, 0xff, 0xb9, 0xfc, 0x95, 0x52, 0x5b, 0x63, 0xa7, 0xa9, 0xb7, 0x7a, + 0xfd, 0x01, 0x4d, 0x7a, 0xb7, 0xb1, 0xac, 0x16, 0x1d, 0x17, 0xcf, 0x54, + 0xa4, 0x15, 0xb7, 0xe8, 0x25, 0xe2, 0x5a, 0x89, 0xa4, 0xdb, 0x69, 0xe0, + 0x89, 0x30, 0x41, 0xdb, 0x80, 0x41, 0x09, 0x6f, 0xb7, 0x24, 0x11, 0x6f, + 0xc5, 0x40, 0x5c, 0x98, 0x71, 0x4c, 0x01, 0x5d, 0x4d, 0xf9, 0x2b, 0x8c, + 0x97, 0x6e, 0x1c, 0x78, 0x87, 0xf2, 0xd3, 0x70, 0xf5, 0xcb, 0x45, 0xd4, + 0x18, 0x0d, 0xa0, 0x1d, 0xea, 0x53, 0x89, 0xba, 0xd3, 0x1e, 0xf5, 0x57, + 0x89, 0xba, 0xab, 0xa1, 0xde, 0xde, 0x6b, 0x0b, 0xa4, 0x59, 0x42, 0xdb, + 0x26, 0x28, 0x16, 0x42, 0x8d, 0x8d, 0xd0, 0x8e, 0x16, 0x43, 0xc9, 0x83, + 0xaa, 0xf6, 0xe6, 0x6d, 0x93, 0x5e, 0xa1, 0x3f, 0x5b, 0xcd, 0x12, 0x1a, + 0x11, 0x8b, 0x90, 0x14, 0xf4, 0x56, 0x97, 0x82, 0x1e, 0x78, 0x45, 0xa1, + 0x37, 0xba, 0x30, 0x2a, 0x88, 0x0c, 0x7d, 0xb6, 0x15, 0x09, 0xa7, 0x0e, + 0xee, 0x98, 0x58, 0xe6, 0x37, 0x4f, 0xe9, 0xe2, 0xe6, 0xfb, 0x87, 0xda, + 0x18, 0xb2, 0xc9, 0xeb, 0x66, 0xe2, 0xac, 0xe5, 0x84, 0x28, 0xd8, 0xaf, + 0xc0, 0x5f, 0xf3, 0x64, 0xb3, 0x53, 0xcf, 0x12, 0xd5, 0xbb, 0xa8, 0x5e, + 0xac, 0xb5, 0x40, 0xd6, 0x98, 0xdf, 0xa5, 0xec, 0x5e, 0x97, 0x10, 0x42, + 0xb2, 0x5c, 0x9a, 0x35, 0x8d, 0x92, 0x07, 0xfe, 0x1a, 0x82, 0xe7, 0x31, + 0xf8, 0x63, 0x2d, 0x0a, 0xd1, 0xc8, 0x09, 0x43, 0x14, 0xb0, 0x65, 0xe9, + 0x8e, 0x21, 0xc2, 0xc9, 0x45, 0xb4, 0xd1, 0x2a, 0x30, 0x43, 0x54, 0xe4, + 0x77, 0xb6, 0x6c, 0x24, 0x2f, 0x49, 0x53, 0x2c, 0xac, 0x6c, 0x13, 0x69, + 0xeb, 0x1c, 0x82, 0xa1, 0xc6, 0x45, 0x76, 0xaf, 0x30, 0xb7, 0xb6, 0xa2, + 0x36, 0x45, 0x37, 0xa8, 0xab, 0xde, 0x50, 0x87, 0xbc, 0x2a, 0x6b, 0x3e, + 0x54, 0xd9, 0x12, 0x5a, 0xab, 0x7b, 0xec, 0x64, 0x8a, 0x00, 0xe5, 0x03, + 0xbb, 0xf0, 0x6f, 0x9b, 0x80, 0xf2, 0x78, 0x06, 0x2a, 0x72, 0x83, 0x14, + 0xe5, 0x24, 0x2f, 0x0b, 0x0a, 0x74, 0xd1, 0x18, 0xd0, 0x1a, 0xf8, 0xcc, + 0x9c, 0x60, 0x88, 0xbc, 0x6b, 0x9c, 0x1c, 0x2a, 0xa8, 0x88, 0x40, 0xf3, + 0x57, 0xc5, 0xf8, 0xd1, 0x68, 0x7c, 0x76, 0xfd, 0x2a, 0x4c, 0xd4, 0x82, + 0x39, 0x34, 0xf1, 0xe2, 0x8a, 0x21, 0x5f, 0x8d, 0xf8, 0x00, 0xe8, 0x7a, + 0xb2, 0x37, 0xc6, 0x0f, 0x1c, 0xac, 0xc8, 0x34, 0xda, 0x22, 0x0c, 0x0f, + 0x05, 0x8c, 0xf1, 0xc0, 0xd9, 0xf9, 0xe7, 0x98, 0x6a, 0xf3, 0x82, 0xc7, + 0x23, 0x0f, 0x27, 0xd8, 0x8b, 0x16, 0xca, 0xc9, 0x1c, 0x68, 0x11, 0x6a, + 0x90, 0x8e, 0xf6, 0x80, 0x6b, 0x45, 0xb4, 0xd2, 0x1b, 0xc6, 0x14, 0xd0, + 0x2c, 0x28, 0x1d, 0xca, 0xb7, 0x93, 0xb1, 0x0a, 0x9f, 0xcd, 0x04, 0x30, + 0x19, 0x76, 0x23, 0x46, 0x6e, 0x60, 0x8c, 0x22, 0x30, 0x66, 0x06, 0xc6, + 0x38, 0x02, 0x63, 0x6a, 0x60, 0xec, 0x44, 0x60, 0x80, 0x57, 0x9e, 0xb8, + 0xa9, 0xfd, 0x72, 0x05, 0x89, 0xf1, 0xd3, 0x23, 0x5d, 0xa6, 0x81, 0xc1, + 0xef, 0xc0, 0xe0, 0x65, 0x60, 0x94, 0x73, 0xdc, 0x6f, 0x2e, 0xe9, 0x6a, + 0x6c, 0x30, 0xb7, 0x1b, 0xc1, 0x5c, 0x6e, 0xa2, 0xec, 0x45, 0xa0, 0xcc, + 0x4c, 0x94, 0xfd, 0x08, 0x94, 0xa9, 0x89, 0xf2, 0x30, 0x02, 0x05, 0xb4, + 0x36, 0x0e, 0xa8, 0x6d, 0xd7, 0x50, 0xcd, 0x9e, 0xf1, 0x6b, 0x1f, 0x7f, + 0x71, 0x41, 0x71, 0x6a, 0xdb, 0x31, 0xb8, 0x7b, 0x14, 0xc1, 0x5d, 0x6e, + 0xa2, 0x3c, 0x8e, 0x40, 0x99, 0x99, 0x28, 0xa3, 0x18, 0x83, 0x9e, 0x5a, + 0x38, 0x31, 0x26, 0x0d, 0x8a, 0xdb, 0x09, 0x28, 0xee, 0x91, 0xa1, 0x9c, + 0xc7, 0xa6, 0xf5, 0x59, 0xc6, 0x38, 0x02, 0xd5, 0xdd, 0x45, 0x87, 0x12, + 0x4a, 0x4e, 0x1b, 0xee, 0xba, 0x83, 0x01, 0xcf, 0x36, 0xf3, 0x00, 0x43, + 0x49, 0x38, 0xc8, 0x19, 0xe8, 0x3d, 0x84, 0x14, 0x0c, 0x6c, 0x06, 0x7a, + 0x0f, 0xe1, 0x84, 0x83, 0x99, 0x81, 0x19, 0x49, 0xa4, 0x88, 0x2e, 0xb2, + 0x46, 0x31, 0xe3, 0x4e, 0x8a, 0x19, 0x77, 0xd2, 0xcc, 0xb8, 0x8b, 0x6a, + 0xc6, 0x9d, 0x74, 0x33, 0x6e, 0xa5, 0x9c, 0x80, 0x6e, 0x76, 0x3a, 0xe9, + 0x66, 0xa7, 0x93, 0x6e, 0x76, 0xba, 0xe8, 0x06, 0x91, 0x5a, 0xab, 0x66, + 0x27, 0x5e, 0x35, 0xb7, 0xde, 0x09, 0xa0, 0x48, 0xaa, 0xd4, 0x6a, 0x02, + 0x58, 0x93, 0x78, 0xe8, 0xb5, 0x13, 0xb4, 0xcb, 0xce, 0x3d, 0x14, 0x13, + 0x59, 0x2c, 0x18, 0x4a, 0x2c, 0x62, 0xc6, 0x50, 0x93, 0xba, 0xe8, 0x75, + 0x73, 0xf2, 0xa2, 0xa8, 0x48, 0x60, 0xc1, 0xc8, 0x5f, 0xd1, 0xfc, 0xad, + 0x57, 0x79, 0x23, 0x7f, 0x9e, 0xfc, 0x47, 0x8d, 0xfc, 0x01, 0x4c, 0x88, + 0x3f, 0x78, 0x15, 0xcf, 0x9f, 0x3f, 0x81, 0xd2, 0xeb, 0xe6, 0x14, 0x4a, + 0x51, 0xd1, 0xb5, 0x82, 0xd1, 0xb4, 0xa2, 0xf9, 0x5b, 0x4f, 0xbc, 0x33, + 0xdf, 0xe6, 0x2c, 0x4c, 0x49, 0x4c, 0x1c, 0xac, 0x60, 0xdc, 0xab, 0x18, + 0xfe, 0x6a, 0xd2, 0x38, 0xbd, 0xae, 0x4b, 0xe4, 0x94, 0xc4, 0xc5, 0xab, + 0xf2, 0xc6, 0xa8, 0x8a, 0xaa, 0xd8, 0xbf, 0x2c, 0x11, 0x54, 0xdc, 0x9d, + 0x27, 0x4b, 0x8e, 0xbf, 0x20, 0xb9, 0x54, 0x92, 0xc4, 0x27, 0x17, 0x8a, + 0x13, 0xe8, 0xaa, 0x45, 0xa6, 0x21, 0xfa, 0x33, 0x7d, 0x17, 0xef, 0xa7, + 0x50, 0x6d, 0x73, 0x29, 0x6e, 0xa4, 0xdd, 0xae, 0x40, 0x9b, 0x97, 0x54, + 0xd1, 0xb0, 0xe3, 0x36, 0xc0, 0x3b, 0x75, 0xc0, 0x60, 0xd9, 0x51, 0x63, + 0x59, 0x7c, 0xa2, 0xb0, 0xd7, 0x35, 0xa9, 0xc2, 0x1a, 0xdb, 0x21, 0xc0, + 0x78, 0xad, 0x17, 0x9e, 0x47, 0xb6, 0x42, 0x8a, 0x84, 0x11, 0xdf, 0x0a, + 0x5b, 0xe7, 0x1f, 0x8b, 0x68, 0x83, 0xea, 0x6e, 0x60, 0x64, 0x54, 0xaa, + 0xf6, 0xd4, 0xc5, 0xdd, 0xc0, 0xc8, 0x20, 0x47, 0xed, 0xc9, 0xcb, 0xbb, + 0x81, 0x51, 0xd1, 0x72, 0xda, 0x53, 0x17, 0x37, 0x03, 0xeb, 0x43, 0xaf, + 0x1c, 0x24, 0x51, 0x46, 0x89, 0xa9, 0x32, 0xa0, 0x85, 0xb6, 0xda, 0x60, + 0x6b, 0x95, 0xed, 0x34, 0xff, 0x1f, 0xe5, 0x3a, 0x65, 0xd8, 0xe0, 0x82, + 0x32, 0xf1, 0xaf, 0x25, 0xc3, 0x29, 0xa4, 0xe9, 0x2f, 0x18, 0x24, 0x3a, + 0x50, 0x94, 0x4c, 0x35, 0xfd, 0x15, 0xfd, 0x0b, 0x24, 0x2d, 0xc8, 0xc6, + 0x8c, 0xd6, 0x5e, 0xd6, 0x0b, 0x8a, 0xcc, 0x9c, 0xaf, 0x16, 0x45, 0x18, + 0x50, 0x6d, 0x0a, 0x13, 0x82, 0x0d, 0xe7, 0xa4, 0x4d, 0xc7, 0x13, 0x5d, + 0xbd, 0xd8, 0xa8, 0x0b, 0x32, 0x7e, 0x45, 0xf3, 0xa2, 0x8a, 0xf8, 0x50, + 0xc9, 0x9e, 0x82, 0xbb, 0xca, 0x59, 0xc9, 0xb1, 0xc8, 0xc9, 0x00, 0x44, + 0x29, 0x3e, 0xe0, 0x50, 0x7b, 0x74, 0xf7, 0x7e, 0xdb, 0xdc, 0x7f, 0x82, + 0xd2, 0x5d, 0xc9, 0xd9, 0x1b, 0xf2, 0x33, 0x99, 0x06, 0x07, 0x1a, 0xa7, + 0xaf, 0xfa, 0xf8, 0xd4, 0x51, 0x9c, 0x71, 0xb7, 0xbd, 0x75, 0xd1, 0x6e, + 0x2f, 0xbf, 0x91, 0x5a, 0x75, 0xc3, 0xdd, 0x47, 0xd1, 0xeb, 0x32, 0x43, + 0x0e, 0xb5, 0x41, 0x3b, 0x17, 0xda, 0x0a, 0x37, 0x84, 0x13, 0xde, 0x9b, + 0xf1, 0x03, 0xb1, 0x25, 0xf0, 0xf9, 0x5e, 0xf0, 0x9a, 0xc6, 0x09, 0x5e, + 0x48, 0x4a, 0xe8, 0xfc, 0x85, 0x8f, 0x77, 0x5c, 0x4f, 0x14, 0x3a, 0xce, + 0x95, 0xe7, 0x36, 0x64, 0x57, 0xee, 0x31, 0xcd, 0x8b, 0x04, 0x81, 0xe8, + 0x60, 0x46, 0x01, 0x1e, 0xf8, 0x4f, 0x80, 0x0c, 0x62, 0xec, 0x8c, 0xa9, + 0x1e, 0xbd, 0x71, 0x08, 0xa7, 0xd5, 0x54, 0x48, 0x8c, 0xa3, 0x5e, 0xad, + 0xf3, 0x6b, 0x88, 0x4b, 0xdd, 0xb3, 0xa8, 0x5c, 0x11, 0xcf, 0xe4, 0xa9, + 0x04, 0x0e, 0x33, 0x9e, 0x33, 0x3b, 0x97, 0x63, 0xee, 0x05, 0xbd, 0xde, + 0x9f, 0xf2, 0x82, 0x91, 0x0c, 0x0b, 0x02, 0xca, 0x5b, 0x08, 0x6e, 0x53, + 0x91, 0xec, 0xdd, 0x97, 0xee, 0x41, 0x60, 0xd0, 0x99, 0x86, 0x00, 0x02, + 0xc2, 0x4d, 0xd7, 0x94, 0x61, 0x18, 0xec, 0x82, 0x06, 0x7d, 0x5e, 0x47, + 0xcc, 0x2e, 0x68, 0xb4, 0x0f, 0xd3, 0x19, 0xb1, 0x23, 0xaf, 0xb8, 0x8d, + 0xd3, 0x15, 0xaf, 0x63, 0x91, 0x38, 0x6d, 0xef, 0x54, 0x26, 0x21, 0xd6, + 0x17, 0x0a, 0x8d, 0xc3, 0x36, 0x9d, 0x5b, 0xab, 0x91, 0x06, 0xc6, 0x0d, + 0x05, 0x3e, 0x2d, 0xe3, 0x6e, 0x9d, 0x00, 0x9c, 0x19, 0xcf, 0x8f, 0xef, + 0x6c, 0x00, 0x8d, 0xf0, 0x95, 0x0d, 0x78, 0x49, 0xb7, 0x35, 0x5a, 0x0c, + 0x02, 0xdc, 0x72, 0xf4, 0x21, 0x4c, 0x1d, 0x60, 0x26, 0xa3, 0xe4, 0x97, + 0x5f, 0xf4, 0x47, 0xb4, 0xb5, 0x8c, 0x93, 0x22, 0x7a, 0xe4, 0x1e, 0x4d, + 0xee, 0x3d, 0xec, 0x03, 0x43, 0x62, 0x14, 0xf9, 0xfa, 0xc5, 0xcb, 0x2f, + 0x3e, 0x4f, 0xa0, 0xad, 0x7f, 0xfe, 0xc5, 0xc7, 0xcf, 0xec, 0x48, 0xfb, + 0x75, 0x47, 0xf8, 0xb2, 0x89, 0xfb, 0xaf, 0x32, 0x4a, 0xfc, 0x3b, 0xbf, + 0xcd, 0x28, 0xc8, 0x46, 0x5f, 0x6e, 0xf1, 0x2a, 0xec, 0x7d, 0xb1, 0xef, + 0xde, 0xec, 0x73, 0x74, 0x97, 0x03, 0x37, 0xb0, 0xe0, 0xa1, 0x47, 0x62, + 0xee, 0xed, 0x03, 0x37, 0x74, 0xc7, 0xe4, 0xeb, 0x97, 0x5f, 0x7c, 0xf9, + 0xd9, 0x87, 0xdf, 0x9b, 0x22, 0x4b, 0x43, 0x27, 0x78, 0x79, 0x63, 0x2f, + 0xa5, 0xa1, 0xca, 0xea, 0x7d, 0x83, 0x1d, 0x29, 0xcc, 0x6f, 0x82, 0xb0, + 0xe2, 0x54, 0x93, 0x81, 0xeb, 0x29, 0xd3, 0x39, 0x6f, 0x80, 0x32, 0xef, + 0x06, 0xd4, 0xca, 0xfa, 0x50, 0xc8, 0x2a, 0xcc, 0xee, 0xd5, 0xb7, 0x2f, + 0x04, 0xf2, 0x9f, 0xb3, 0x3a, 0xaf, 0x61, 0x28, 0x13, 0xec, 0x74, 0x2b, + 0xf0, 0xbf, 0xa5, 0xf3, 0x47, 0x42, 0xe7, 0x2f, 0xbf, 0xf9, 0xd7, 0x08, + 0x89, 0xc0, 0x6d, 0xa5, 0x7c, 0x2c, 0xbb, 0xb4, 0x67, 0xa3, 0xcd, 0x9d, + 0xd1, 0xbf, 0x46, 0xd2, 0xf6, 0xd5, 0xb9, 0xbf, 0x2d, 0x05, 0xfd, 0x64, + 0x9e, 0x67, 0xe3, 0xed, 0xd1, 0xf8, 0x5f, 0x23, 0xab, 0x00, 0x6e, 0x4c, + 0x21, 0xf7, 0xa7, 0x25, 0x40, 0xe0, 0xbf, 0x4c, 0x04, 0x2b, 0xa1, 0x9a, + 0x3d, 0x0c, 0x6f, 0xb7, 0xba, 0x4f, 0xda, 0x5b, 0x9d, 0x9d, 0xb5, 0x8a, + 0x8e, 0xc1, 0x83, 0x4c, 0x27, 0x0d, 0xb6, 0xb5, 0x03, 0x57, 0x91, 0x2d, + 0x10, 0xc2, 0xa6, 0xef, 0x4e, 0xd1, 0x82, 0xa5, 0xc8, 0xb9, 0x5d, 0x73, + 0xd6, 0x64, 0x81, 0xd8, 0x65, 0x92, 0x29, 0x30, 0x83, 0xb3, 0x4c, 0x97, + 0x51, 0x96, 0xae, 0x03, 0x9f, 0x80, 0xd7, 0x6d, 0xb1, 0x40, 0x88, 0x6d, + 0xb9, 0xd4, 0x2c, 0x82, 0x39, 0x6c, 0x93, 0x33, 0x75, 0x6b, 0xab, 0x7b, + 0x5e, 0xd4, 0xc6, 0x5b, 0xd4, 0x8e, 0x1c, 0xc1, 0xab, 0xc4, 0x66, 0x3a, + 0xf6, 0x57, 0x58, 0xdc, 0x6b, 0x9e, 0xeb, 0x81, 0x56, 0xa6, 0x19, 0xcc, + 0x2a, 0x0b, 0x74, 0x38, 0x9e, 0x65, 0x79, 0x05, 0xa4, 0xb3, 0x63, 0x38, + 0xfa, 0x8d, 0xd8, 0x6e, 0xfd, 0xbe, 0x7a, 0x92, 0x82, 0x91, 0x3f, 0xd1, + 0xd4, 0x0b, 0xe6, 0x49, 0x4d, 0x70, 0xcb, 0xf0, 0x94, 0x80, 0x0b, 0x73, + 0xee, 0x27, 0xf1, 0x13, 0xe8, 0x12, 0x44, 0x23, 0x57, 0xc8, 0x2e, 0x2f, + 0xdb, 0xde, 0x79, 0x6c, 0xe3, 0x7e, 0x57, 0xe5, 0x48, 0x4e, 0x77, 0x04, + 0x65, 0x79, 0xa4, 0x38, 0x4b, 0x6d, 0x64, 0x38, 0xb8, 0xdc, 0xb1, 0xf0, + 0x3e, 0x00, 0x3c, 0xf6, 0x18, 0xf4, 0xa2, 0xb2, 0x13, 0x9c, 0x07, 0xff, + 0xed, 0x0a, 0x9f, 0xc1, 0x7c, 0x44, 0xa8, 0xa3, 0x11, 0xf8, 0xd1, 0xae, + 0x31, 0x55, 0x21, 0x6f, 0x62, 0x21, 0xec, 0xd5, 0xa3, 0x1f, 0xbe, 0x0c, + 0x0c, 0x7f, 0x07, 0xe3, 0xd7, 0xcc, 0xf8, 0x35, 0x3d, 0xee, 0x6b, 0xfd, + 0x4e, 0xb4, 0x17, 0x0a, 0xf3, 0x50, 0xc3, 0xc4, 0xd8, 0xe4, 0xc2, 0xfc, + 0x39, 0x33, 0x7f, 0x4e, 0xc7, 0xb1, 0x8c, 0xec, 0x04, 0x18, 0xa9, 0xe3, + 0x64, 0xc7, 0xe4, 0xc4, 0xfc, 0x39, 0x33, 0x7f, 0x4e, 0x77, 0x0c, 0x4e, + 0x6e, 0xf1, 0x53, 0xdc, 0x1c, 0x37, 0x92, 0x34, 0x3e, 0x55, 0x77, 0xc7, + 0xc9, 0xc3, 0x7b, 0xb2, 0xfc, 0x79, 0x52, 0x37, 0x57, 0xdf, 0xd0, 0x33, + 0x61, 0x0a, 0x68, 0x8a, 0x38, 0x24, 0xdd, 0xc3, 0x31, 0xe4, 0x20, 0x60, + 0x8b, 0x17, 0x88, 0xfb, 0x54, 0x3c, 0x4b, 0x37, 0xc6, 0xa7, 0x04, 0x67, + 0xdc, 0x10, 0xbe, 0x58, 0xaf, 0x96, 0x40, 0x58, 0xc8, 0x79, 0x52, 0xa9, + 0x23, 0xcf, 0xca, 0xcb, 0x7c, 0x99, 0xa4, 0xbd, 0x6d, 0x54, 0x84, 0x68, + 0xf7, 0xf0, 0x7a, 0xb3, 0x5c, 0xbd, 0x10, 0xb9, 0x79, 0x21, 0xee, 0x1f, + 0x8c, 0xa7, 0x94, 0x02, 0x75, 0x38, 0xc6, 0xe7, 0x5f, 0xaf, 0xd7, 0xb0, + 0x35, 0x3e, 0x29, 0xb2, 0xd4, 0xe9, 0x54, 0x58, 0x91, 0xf0, 0xc5, 0x29, + 0x82, 0x79, 0x50, 0x20, 0x70, 0xbe, 0xd1, 0x87, 0x52, 0x3d, 0x2f, 0x46, + 0xa1, 0x17, 0xe3, 0xd0, 0x0b, 0xa8, 0x80, 0xda, 0x04, 0xa8, 0xab, 0x5c, + 0x04, 0x41, 0x32, 0x9a, 0xcd, 0x1b, 0x9e, 0x4d, 0x31, 0x00, 0x30, 0x52, + 0xcd, 0xca, 0x5a, 0x25, 0xe4, 0xcd, 0x75, 0x4e, 0x9f, 0x1f, 0x8b, 0x54, + 0xf5, 0xa4, 0x01, 0xa6, 0x26, 0x40, 0x38, 0x92, 0x7b, 0xb9, 0xba, 0x3c, + 0x39, 0xbf, 0x58, 0xfd, 0x9c, 0x71, 0x67, 0xa5, 0xe8, 0x52, 0xd8, 0x2a, + 0x09, 0x3f, 0xc9, 0xa1, 0xee, 0xb8, 0xcb, 0x12, 0x19, 0x64, 0xed, 0x49, + 0xcf, 0xf5, 0x93, 0xe4, 0xf3, 0x49, 0x79, 0xbe, 0x49, 0xd3, 0x99, 0x54, + 0xc7, 0x7c, 0x89, 0xa5, 0xd0, 0x59, 0x11, 0x1c, 0x04, 0xcf, 0xb2, 0xef, + 0x92, 0x21, 0x50, 0xdf, 0x84, 0x2e, 0x12, 0xba, 0x8a, 0xcf, 0xb2, 0xb3, + 0xb2, 0x3f, 0x30, 0x29, 0xdd, 0xc4, 0x52, 0xfa, 0x9e, 0x29, 0xe1, 0xbb, + 0x75, 0x5f, 0xeb, 0x55, 0x95, 0xa9, 0x87, 0x85, 0xa7, 0xe0, 0x27, 0x28, + 0x78, 0x07, 0xc1, 0x44, 0x91, 0xdf, 0xc5, 0x70, 0x2e, 0x40, 0xbf, 0xf7, + 0xf3, 0xc6, 0xf5, 0xc8, 0x61, 0xab, 0xb1, 0x89, 0x50, 0x4b, 0x7b, 0x7e, + 0x01, 0x32, 0x52, 0x5a, 0x6e, 0xe0, 0x6b, 0xf3, 0x7a, 0x90, 0xe0, 0xc7, + 0x0d, 0xdc, 0x44, 0x80, 0xff, 0xfa, 0xe4, 0xb2, 0x8f, 0x84, 0x38, 0x40, + 0xe7, 0x2b, 0x49, 0x83, 0x8d, 0x9c, 0x1e, 0x58, 0x51, 0xd3, 0xa8, 0xc3, + 0x09, 0xf5, 0xc7, 0x10, 0x24, 0x03, 0xa3, 0x63, 0x98, 0x2f, 0x05, 0xbe, + 0x91, 0xce, 0x14, 0x4a, 0xe3, 0xf4, 0xb1, 0x90, 0x0c, 0x9e, 0x8b, 0xf7, + 0x00, 0xe7, 0x26, 0x28, 0xbb, 0x39, 0x3b, 0x90, 0x33, 0x1f, 0xe4, 0xc8, + 0x07, 0x39, 0xf5, 0x41, 0x8e, 0x7d, 0x90, 0x57, 0x1a, 0x24, 0x0f, 0xbd, + 0xec, 0x44, 0x67, 0x72, 0x64, 0xf9, 0xca, 0xb9, 0x4c, 0xb0, 0x4b, 0x9c, + 0x5b, 0xac, 0xeb, 0xab, 0xe0, 0x1e, 0x74, 0xf5, 0xef, 0x38, 0xd3, 0xab, + 0x3e, 0xf4, 0xba, 0xf9, 0x0c, 0x8c, 0xbe, 0x44, 0x9a, 0x96, 0x61, 0xf1, + 0xca, 0xdc, 0xe8, 0xf2, 0xd6, 0x57, 0x78, 0xbb, 0x76, 0x7b, 0x90, 0xc0, + 0x7f, 0xb2, 0xcf, 0xbe, 0x9a, 0x9f, 0x96, 0xe7, 0xd5, 0xaf, 0xf3, 0x0c, + 0x07, 0x7d, 0x6d, 0x14, 0x51, 0xb4, 0x63, 0xb2, 0x45, 0xe8, 0xa5, 0x12, + 0x9b, 0xf4, 0x3c, 0x35, 0xf3, 0x55, 0xdb, 0x40, 0xdf, 0xe2, 0xc8, 0x92, + 0x6a, 0x25, 0x56, 0x85, 0x6e, 0xbd, 0xfb, 0xae, 0x04, 0x7d, 0x37, 0xf9, + 0x18, 0x20, 0x0b, 0xd9, 0x82, 0x70, 0x48, 0x50, 0x2f, 0xb6, 0x58, 0x37, + 0x1a, 0x35, 0xa3, 0xfb, 0x3c, 0xc9, 0x40, 0xfe, 0xfc, 0xbb, 0xe4, 0xd0, + 0x90, 0x38, 0xd9, 0x4a, 0xc6, 0x07, 0x36, 0xd0, 0xf7, 0x00, 0x64, 0x28, + 0x42, 0x41, 0xb9, 0x57, 0x5c, 0x24, 0xd5, 0x81, 0xc2, 0x8c, 0xd2, 0x27, + 0x96, 0x44, 0x57, 0x1e, 0xbf, 0x82, 0xf3, 0xbe, 0xcb, 0xc2, 0x65, 0x69, + 0x77, 0x73, 0x4f, 0x03, 0x85, 0x03, 0x3f, 0x0d, 0x34, 0x35, 0x60, 0x87, + 0x70, 0xb5, 0xb5, 0x6f, 0xb2, 0x47, 0xe0, 0xc9, 0x74, 0x95, 0x83, 0xc5, + 0xe1, 0x43, 0xae, 0xfa, 0x69, 0x36, 0x9b, 0x2f, 0xbf, 0x84, 0x6e, 0x2b, + 0xed, 0xdb, 0xe0, 0xa2, 0xee, 0x4c, 0xf0, 0x49, 0x7e, 0xe2, 0xca, 0xa7, + 0x73, 0x43, 0xf6, 0x33, 0x86, 0x6a, 0xa1, 0xae, 0xf0, 0xcb, 0xe7, 0x03, + 0x71, 0xec, 0xc6, 0xc4, 0xa9, 0x2e, 0xf0, 0x62, 0x94, 0xc1, 0xd4, 0x93, + 0x24, 0x85, 0x3e, 0xaf, 0xa0, 0x97, 0xcb, 0x64, 0x42, 0x5d, 0x28, 0x02, + 0x49, 0x26, 0xde, 0xe8, 0x9b, 0x6c, 0x60, 0x1a, 0xf6, 0x6f, 0x49, 0xd8, + 0xc3, 0x64, 0xf7, 0xc0, 0x7c, 0x27, 0x6e, 0xa2, 0xbe, 0xc0, 0x25, 0x36, + 0xbc, 0xed, 0xbd, 0xb9, 0x4d, 0x7f, 0x3d, 0x2f, 0x54, 0xda, 0xb7, 0x1e, + 0xd3, 0xed, 0xc7, 0x4a, 0x1d, 0x15, 0xcf, 0x67, 0xf3, 0xc5, 0x42, 0xc4, + 0x03, 0x9a, 0x66, 0x93, 0xcb, 0x72, 0x7e, 0x76, 0xb9, 0x50, 0x61, 0x18, + 0x15, 0x48, 0x39, 0xf9, 0x31, 0x5b, 0xd2, 0xb5, 0x2c, 0xf2, 0x9d, 0x78, + 0x92, 0x9c, 0x97, 0xe5, 0xfa, 0x09, 0xdc, 0x0b, 0x2d, 0x61, 0x99, 0x0f, + 0x83, 0x6c, 0x7e, 0xb6, 0x58, 0x5d, 0x41, 0xb7, 0x74, 0xb1, 0xf5, 0xd3, + 0x65, 0x56, 0xd0, 0x79, 0xdd, 0xd6, 0xe8, 0xd1, 0x78, 0x7f, 0xef, 0xd1, + 0xf6, 0xee, 0xd6, 0xf4, 0x72, 0xbe, 0xc0, 0x63, 0xde, 0xe1, 0x64, 0x48, + 0x64, 0x87, 0x34, 0xa9, 0x1a, 0xce, 0x97, 0xc3, 0xf3, 0xf2, 0x62, 0xb1, + 0x67, 0xe5, 0x14, 0x82, 0xde, 0x61, 0x21, 0xfa, 0x18, 0xf9, 0xf5, 0x3d, + 0x98, 0x41, 0xee, 0x57, 0xbf, 0x1e, 0xd8, 0x93, 0x6b, 0xc0, 0x11, 0x6e, + 0x1d, 0x1f, 0x4a, 0xc4, 0x54, 0x00, 0x0e, 0x61, 0x02, 0xcc, 0x35, 0x05, + 0x16, 0x33, 0x7a, 0x64, 0x47, 0x4e, 0x86, 0x69, 0xa8, 0x42, 0x22, 0x9c, + 0x00, 0x78, 0xc8, 0xa2, 0xdc, 0xb7, 0x38, 0xdf, 0x78, 0xb9, 0x72, 0x6c, + 0x48, 0x81, 0xda, 0xb6, 0x66, 0x8e, 0xb0, 0x0a, 0xcb, 0x7d, 0x0a, 0x24, + 0xcc, 0xa7, 0xba, 0x4d, 0x5a, 0x6f, 0x58, 0x15, 0xd6, 0x0b, 0x10, 0xd6, + 0xf7, 0x98, 0x0c, 0x98, 0x1f, 0x29, 0x56, 0x43, 0x66, 0xe3, 0xbe, 0x45, + 0xeb, 0xa9, 0xec, 0xf1, 0xbc, 0x58, 0xa4, 0x30, 0x28, 0xa9, 0xba, 0xc2, + 0xe3, 0x56, 0xbc, 0x84, 0x8d, 0xe7, 0xe0, 0x6f, 0xf7, 0x7b, 0x01, 0xec, + 0x34, 0xae, 0xd0, 0x5b, 0x36, 0x59, 0xec, 0x4c, 0xda, 0x34, 0xf9, 0xf2, + 0x7c, 0x5e, 0x6c, 0xd6, 0xb7, 0xf2, 0x5c, 0x28, 0x53, 0xd7, 0x1f, 0xab, + 0x0c, 0xa8, 0x5f, 0x22, 0x1c, 0x78, 0x2d, 0x9c, 0xfc, 0x78, 0x35, 0xc7, + 0x16, 0x1f, 0xd3, 0x73, 0x00, 0x97, 0xf1, 0x3d, 0x07, 0x6a, 0x02, 0x3b, + 0x05, 0x89, 0xce, 0xbd, 0xe1, 0xc5, 0xcd, 0xab, 0x19, 0x72, 0x07, 0x8f, + 0x79, 0x12, 0x25, 0x53, 0x68, 0x7d, 0x06, 0x5d, 0xc5, 0x24, 0xff, 0x54, + 0xbc, 0x56, 0x03, 0xdc, 0xe8, 0x21, 0x7e, 0x4a, 0xd2, 0x3a, 0x3a, 0x9e, + 0xac, 0x8b, 0x0b, 0x1f, 0xe0, 0x5f, 0x85, 0xc0, 0x70, 0x0c, 0x8a, 0x59, + 0x06, 0x1a, 0x41, 0x61, 0x5a, 0xa6, 0x8e, 0x3d, 0xa9, 0xe3, 0x08, 0xd4, + 0xbf, 0x4e, 0xe0, 0x20, 0x08, 0xa5, 0x48, 0x01, 0x84, 0xd7, 0x12, 0x9c, + 0xbe, 0x54, 0xd6, 0x36, 0x76, 0x8b, 0xe1, 0x8e, 0x72, 0x7c, 0x7f, 0x1d, + 0x65, 0xe3, 0xc0, 0x2c, 0xba, 0x71, 0xff, 0xd0, 0xcc, 0xb3, 0x01, 0xd5, + 0x69, 0x2d, 0xb2, 0x52, 0x5a, 0x5b, 0x70, 0x68, 0x26, 0x98, 0x39, 0xce, + 0x91, 0x9d, 0x1a, 0xe7, 0x99, 0x33, 0x58, 0x53, 0x65, 0xb5, 0xfc, 0xbd, + 0xcf, 0x14, 0xc4, 0x65, 0xfa, 0x43, 0x41, 0x48, 0x4d, 0xaa, 0xb5, 0xde, + 0x16, 0x41, 0xae, 0xe1, 0xfd, 0x50, 0x60, 0x1e, 0xc0, 0x8f, 0xf7, 0x92, + 0xea, 0xbb, 0x79, 0xec, 0xcb, 0x18, 0x37, 0x3a, 0xc6, 0x8d, 0x86, 0x71, + 0x63, 0x61, 0x28, 0x2e, 0x8e, 0x72, 0x98, 0xde, 0x9f, 0xcf, 0x71, 0x86, + 0x7a, 0x7d, 0x33, 0x5e, 0xaf, 0x16, 0x93, 0x3c, 0x85, 0x19, 0xff, 0x0d, + 0x72, 0xea, 0xb9, 0x24, 0x9b, 0xbc, 0x2f, 0x29, 0x86, 0xbc, 0x9a, 0x8a, + 0x1f, 0xe7, 0x6b, 0x8a, 0x00, 0x0a, 0x54, 0x6e, 0xfa, 0xa0, 0x1e, 0xe8, + 0x05, 0xe6, 0x4b, 0x50, 0x4d, 0x01, 0xc6, 0x32, 0x29, 0x61, 0x7c, 0xa5, + 0xd1, 0xb7, 0x98, 0x9f, 0xc2, 0xe7, 0x99, 0x36, 0xce, 0x3a, 0xd4, 0xac, + 0x24, 0xfc, 0x61, 0x5f, 0x57, 0x52, 0x66, 0x06, 0x17, 0x0d, 0x91, 0xb5, + 0x31, 0x7c, 0x4b, 0x41, 0x20, 0x87, 0x7f, 0xda, 0x46, 0x9b, 0xcf, 0x2e, + 0x45, 0xf9, 0x54, 0x30, 0xf5, 0x26, 0xe8, 0xe1, 0x44, 0xfb, 0x8b, 0x82, + 0x9d, 0x79, 0x91, 0xac, 0xe7, 0xd7, 0xd9, 0x02, 0x9e, 0x11, 0x0c, 0x55, + 0x8f, 0xa8, 0x2b, 0x0a, 0x2e, 0xb1, 0xe9, 0x96, 0x9d, 0xaf, 0xae, 0x3e, + 0x13, 0x7e, 0x81, 0x87, 0x5a, 0x55, 0x1f, 0xb8, 0x80, 0x93, 0xd3, 0x1f, + 0x2e, 0x8b, 0x32, 0x3b, 0xfd, 0x0e, 0x95, 0x0d, 0xfd, 0xaf, 0x04, 0x94, + 0x93, 0x38, 0x18, 0xa7, 0xa1, 0xc6, 0xc5, 0x30, 0x7e, 0x34, 0xdc, 0xa3, + 0x78, 0x7f, 0xc7, 0x18, 0x6d, 0xe1, 0x68, 0x1b, 0xfb, 0x69, 0xf8, 0x9e, + 0x02, 0x43, 0xba, 0x46, 0x81, 0x63, 0x2f, 0x8f, 0xfd, 0x70, 0xd1, 0x38, + 0x97, 0xbc, 0xf1, 0x17, 0x7d, 0x73, 0x4f, 0x45, 0x93, 0x3a, 0x79, 0xc6, + 0x84, 0x45, 0x66, 0xb0, 0x03, 0x2c, 0xd5, 0x9c, 0x67, 0x3f, 0x5d, 0xce, + 0x73, 0x20, 0xb8, 0x9b, 0x14, 0x8b, 0x55, 0x59, 0x28, 0xbd, 0x33, 0x49, + 0x97, 0x22, 0x55, 0x17, 0xcd, 0x25, 0x94, 0x42, 0x41, 0xa2, 0x94, 0x45, + 0x7c, 0x97, 0xab, 0xa4, 0x8f, 0xb3, 0x0c, 0xe6, 0xe0, 0xc0, 0x67, 0x3b, + 0xe7, 0xb4, 0x6a, 0x02, 0xbb, 0xf1, 0x54, 0x59, 0x31, 0x81, 0x1d, 0x9a, + 0x89, 0x0c, 0xf2, 0x93, 0x27, 0x5b, 0xe1, 0xca, 0x55, 0xab, 0xaf, 0xd1, + 0xe6, 0xb6, 0xb7, 0x94, 0x23, 0x58, 0x24, 0x0d, 0xc4, 0x12, 0x6f, 0x40, + 0x8b, 0x39, 0x5a, 0xbd, 0x16, 0x3f, 0x8f, 0x61, 0xd1, 0x9c, 0x02, 0x0b, + 0x03, 0xad, 0xac, 0x81, 0xa0, 0xd6, 0xf7, 0xd9, 0xd0, 0x62, 0x7d, 0x3e, + 0x41, 0x43, 0xdb, 0xdb, 0xb3, 0x8b, 0x21, 0x9d, 0x1d, 0x91, 0x72, 0x90, + 0x36, 0x94, 0x77, 0x10, 0x7a, 0x0f, 0xfa, 0x1a, 0x01, 0x8c, 0x60, 0xa7, + 0x0e, 0x6a, 0x0c, 0x50, 0xc4, 0x6d, 0x1d, 0xd0, 0x0e, 0x00, 0x09, 0xc6, + 0x42, 0xdb, 0xcb, 0xe6, 0x18, 0xbf, 0xbe, 0xd4, 0xb6, 0x18, 0xc8, 0x82, + 0x68, 0x64, 0xdc, 0xb6, 0x76, 0x74, 0xcd, 0x0e, 0xc9, 0xec, 0xa1, 0xa1, + 0x40, 0x1a, 0xab, 0x8b, 0x9f, 0xf2, 0x32, 0xbd, 0x86, 0x3a, 0x46, 0x3e, + 0x6e, 0xe0, 0xf3, 0x46, 0xef, 0x62, 0xa1, 0x1f, 0x50, 0x80, 0x50, 0xd4, + 0x72, 0x9c, 0xc2, 0x26, 0xc6, 0x35, 0x01, 0xf0, 0xe6, 0x9b, 0xea, 0x00, + 0xad, 0xb2, 0x55, 0x57, 0x02, 0x9f, 0x7a, 0x9c, 0x48, 0xf8, 0x09, 0xe6, + 0x07, 0x8d, 0xe4, 0xf7, 0xdf, 0x06, 0xc9, 0xef, 0xbf, 0x1d, 0xc3, 0x03, + 0x58, 0x2f, 0xab, 0xd7, 0x8a, 0x26, 0x20, 0x82, 0x62, 0x09, 0x10, 0xe4, + 0x82, 0xf9, 0x31, 0xc3, 0x71, 0xc1, 0x29, 0xd2, 0x06, 0xae, 0xe5, 0x9c, + 0x03, 0x97, 0x4d, 0xa9, 0x36, 0x07, 0x21, 0xcb, 0x05, 0x54, 0x8b, 0xaf, + 0x7a, 0x8b, 0x31, 0x94, 0x74, 0x72, 0x0e, 0xed, 0x19, 0x6c, 0x45, 0xbc, + 0x02, 0x6a, 0x0c, 0xae, 0xe9, 0x08, 0x08, 0x8d, 0x00, 0x06, 0x3e, 0x80, + 0x01, 0x28, 0x8e, 0xdf, 0x40, 0x13, 0x93, 0x34, 0x00, 0x37, 0x1d, 0x25, + 0x43, 0xa9, 0xc9, 0x69, 0x91, 0xa6, 0x84, 0xf5, 0x36, 0x4e, 0xe2, 0x87, + 0x30, 0xe3, 0xd7, 0x75, 0x9e, 0x8f, 0xc0, 0xca, 0xe1, 0xff, 0xe9, 0xc8, + 0xd8, 0x01, 0x24, 0x84, 0xf7, 0x61, 0xe1, 0x00, 0xbe, 0x43, 0x54, 0xa6, + 0x1b, 0xfa, 0x2c, 0x3d, 0x62, 0x5c, 0xb4, 0xa8, 0x23, 0x51, 0x38, 0x54, + 0x19, 0xd8, 0xc6, 0xb1, 0xb9, 0x5e, 0x37, 0x68, 0x8e, 0x74, 0x9a, 0xe3, + 0x7a, 0x9a, 0x40, 0x4b, 0x92, 0xad, 0xa7, 0x39, 0xd6, 0x69, 0xee, 0xd4, + 0xd3, 0xdc, 0x66, 0x9a, 0xd7, 0x75, 0x34, 0x77, 0x74, 0x9a, 0xbb, 0x8d, + 0x34, 0x2b, 0x56, 0xeb, 0x68, 0xee, 0xea, 0x34, 0xf7, 0x1a, 0x65, 0xdf, + 0x8e, 0xa1, 0xb9, 0xa7, 0xd3, 0xdc, 0x8f, 0xab, 0xa3, 0x6d, 0x96, 0x9d, + 0x1a, 0x3d, 0x1b, 0xc4, 0x45, 0x65, 0x81, 0x43, 0x59, 0x36, 0x41, 0xf1, + 0xf4, 0x63, 0x06, 0xc4, 0x88, 0x16, 0x85, 0x4d, 0xb9, 0x80, 0x07, 0xf2, + 0x73, 0x4a, 0x9f, 0xc7, 0xda, 0xac, 0x53, 0x79, 0x95, 0xe7, 0x83, 0xd9, + 0x60, 0x4a, 0x54, 0x55, 0xb8, 0x13, 0x50, 0xd8, 0x48, 0x0d, 0x59, 0xd0, + 0x37, 0x1e, 0x9b, 0x6d, 0x1c, 0x9e, 0x80, 0x0d, 0x43, 0x59, 0xe2, 0xcb, + 0x4c, 0x7e, 0x81, 0x72, 0x9d, 0x8d, 0x71, 0xca, 0x2c, 0xb1, 0x80, 0x31, + 0x2e, 0xc5, 0x58, 0x77, 0xfa, 0x3e, 0x16, 0x3d, 0xd8, 0xc4, 0x7f, 0x5e, + 0xaa, 0x4d, 0x26, 0xaa, 0x51, 0x7a, 0x4c, 0xe3, 0xd5, 0x7c, 0x59, 0x45, + 0x77, 0xd9, 0x34, 0xc3, 0x3d, 0x33, 0x50, 0x38, 0xa6, 0xd4, 0x51, 0x05, + 0x73, 0xcc, 0x7a, 0x0c, 0x97, 0x4d, 0x56, 0x5f, 0x3d, 0x26, 0xc7, 0x24, + 0xba, 0x11, 0xf1, 0xe2, 0xe9, 0x57, 0xcf, 0xbf, 0x7c, 0xd9, 0x83, 0xd2, + 0xeb, 0x63, 0x3f, 0x13, 0xea, 0x09, 0x66, 0xd7, 0xc5, 0xfb, 0x51, 0xf5, + 0x51, 0xa0, 0x59, 0x29, 0x16, 0x16, 0xf8, 0x1a, 0xfa, 0x5c, 0x16, 0x48, + 0xa9, 0xea, 0xf0, 0xc6, 0x8d, 0xff, 0xdd, 0xfb, 0xf8, 0x8b, 0xcf, 0xe9, + 0x48, 0x06, 0x9e, 0x81, 0x93, 0x79, 0x76, 0x0a, 0x2b, 0x51, 0x55, 0x01, + 0xd5, 0x59, 0x04, 0xd7, 0x39, 0x14, 0x84, 0x35, 0x9b, 0x5f, 0x2e, 0x93, + 0x62, 0xbe, 0x3c, 0xc9, 0x12, 0x40, 0xc7, 0xf0, 0x54, 0x0b, 0xc2, 0xa5, + 0x98, 0xf3, 0x39, 0x86, 0xe2, 0x92, 0xbb, 0xa8, 0x59, 0x49, 0xd7, 0x49, + 0xd4, 0xba, 0x81, 0xde, 0xb1, 0x3b, 0x77, 0x30, 0x9e, 0xa0, 0x11, 0xa4, + 0xeb, 0x0e, 0x82, 0xdf, 0x81, 0x05, 0x6c, 0x22, 0x87, 0xc4, 0x4c, 0xb5, + 0x92, 0x34, 0xc2, 0x79, 0x55, 0x0c, 0x8b, 0x0b, 0xc6, 0x8a, 0x13, 0x73, + 0xdd, 0x01, 0x6d, 0x5c, 0x65, 0x95, 0xb2, 0xb6, 0x01, 0xd5, 0x9b, 0x70, + 0x3a, 0x5c, 0xa8, 0x07, 0xbd, 0x7a, 0xde, 0xdb, 0x2a, 0x4e, 0xf2, 0xf9, + 0xba, 0x7c, 0x1f, 0x1e, 0xd1, 0xcf, 0xe9, 0xea, 0xf4, 0x06, 0x7e, 0xbc, + 0xb7, 0x85, 0x7b, 0x3d, 0xf0, 0xe5, 0x0f, 0x9a, 0xd7, 0xed, 0xd8, 0xe4, + 0x8b, 0x01, 0x00 }; diff --git a/Arduino/McLighting/mode_custom_ws2812fx_animations.h b/Arduino/McLighting/mode_custom_ws2812fx_animations.h index e025591..8b345aa 100644 --- a/Arduino/McLighting/mode_custom_ws2812fx_animations.h +++ b/Arduino/McLighting/mode_custom_ws2812fx_animations.h @@ -7,8 +7,151 @@ More info on how to create custom aniamtions for WS2812FX: https://github.com/ki */ -#include //https://github.com/FastLED/FastLED +// *************************************************************************** +// Functions and variables for automatic cycling +// *************************************************************************** +void handleAutoPlay() { + if (autoDelay <= millis()) { + hex_colors[0] = autoParams[autoCount][0]; + hex_colors[1] = autoParams[autoCount][1]; + hex_colors[2] = autoParams[autoCount][2]; + strip->setColors(selected_segment, hex_colors); + strip->setSpeed(selected_segment, convertSpeed((uint8_t)autoParams[autoCount][3])); + strip->setMode(selected_segment, (uint8_t)autoParams[autoCount][4]); + strip->trigger(); + autoDelay = millis() + (uint32_t)autoParams[autoCount][5]; + DBG_OUTPUT_PORT.print("autoTick "); + DBG_OUTPUT_PORT.printf("autoTick[%d]: {0x%08x, 0x%08x, 0x%08x, %d, %d, %d}\r\n", autoCount, hex_colors[0], hex_colors[1], hex_colors[2], autoParams[autoCount][3], autoParams[autoCount][4], autoParams[autoCount][5]); + + autoCount++; + if (autoCount >= (sizeof(autoParams) / sizeof(autoParams[0]))) autoCount = 0; + } +} + +void handleAuto() { + // Dummy function +} + +void handleCustomWS() { + // Dummy function +} + +#if defined(CUSTOM_WS2812FX_ANIMATIONS) +// *************************************************************************** +// TV mode +// *************************************************************************** + +uint8_t dipInterval = 10; +uint16_t darkTime = 250; +unsigned long currentDipTime; +unsigned long dipStartTime; +unsigned long currentMillis; +uint8_t ledState = LOW; +long previousMillis = 0; +uint16_t led = 5; +uint16_t interv = 2000; +uint8_t twitch = 50; +uint8_t dipCount = 0; +boolean timeToDip = false; + + +void hsb2rgbAN1(uint16_t index, uint8_t sat, uint8_t bright, uint16_t led) { + // Source: https://blog.adafruit.com/2012/03/14/constant-brightness-hsb-to-rgb-algorithm/ + uint8_t temp[5], n = (index >> 8) % 3; + temp[0] = temp[3] = (uint8_t)(( (sat ^ 255) * bright) / 255); + temp[1] = temp[4] = (uint8_t)((((( (index & 255) * sat) / 255) + (sat ^ 255)) * bright) / 255); + temp[2] = (uint8_t)(((((((index & 255) ^ 255) * sat) / 255) + (sat ^ 255)) * bright) / 255); + strip->setPixelColor(led, temp[n + 2], temp[n + 1], temp[n], 0); +} + + +void updateLed (uint16_t led, uint8_t brightness) { + ledstates[led] = brightness; + for (uint16_t i=0; ishow(); +} + + +// See: http://forum.mysensors.org/topic/85/phoneytv-for-vera-is-here/13 +void handleTV() { + if (timeToDip == false) { + currentMillis = millis(); + if(currentMillis-previousMillis > interv) { + previousMillis = currentMillis; + //interv = random(750,4001);//Adjusts the interval for more/less frequent random light changes + interv = random(1000-(ws2812fx_speed*2),5001-(ws2812fx_speed*8)); + twitch = random(40,100);// Twitch provides motion effect but can be a bit much if too high + dipCount = dipCount++; + } + if(currentMillis-previousMillis dipInterval) { + DBG_OUTPUT_PORT.println("dip"); + timeToDip = true; + dipCount = 0; + dipStartTime = millis(); + darkTime = random(50,150); + dipInterval = random(5,250);// cycles of flicker + } + } + } else { + DBG_OUTPUT_PORT.println("Dip Time"); + currentDipTime = millis(); + if (currentDipTime - dipStartTime < darkTime) { + for (uint16_t i=3; iisEmpty()) + { + e131_packet_t packet; + e131->pull(&packet); // Pull packet from ring buffer + + uint16_t universe = htons(packet.universe); + uint8_t *data = packet.property_values + 1; + + if (universe < START_UNIVERSE || universe > END_UNIVERSE) return; //async will take care about filling the buffer + + // Serial.printf("Universe %u / %u Channels | Packet#: %u / Errors: %u / CH1: %u\n", + // htons(packet.universe), // The Universe for this packet + // htons(packet.property_value_count) - 1, // Start code is ignored, we're interested in dimmer data + // e131.stats.num_packets, // Packet counter + // e131.stats.packet_errors, // Packet error counter + // packet.property_values[1]); // Dimmer data for Channel 1 +/* #if defined(RGBW) + uint16_t multipacketOffset = (universe - START_UNIVERSE) * 128; //if more than 128 LEDs * 4 colors = 512 channels, client will send in next higher universe + if (NUMLEDS <= multipacketOffset) return; + uint16_t len = (128 + multipacketOffset > WS2812FXStripSettings.stripSize) ? (WS2812FXStripSettings.stripSize - multipacketOffset) : 128; + #else*/ + uint16_t multipacketOffset = (universe - START_UNIVERSE) * 170; //if more than 170 LEDs * 3 colors = 510 channels, client will send in next higher universe + if (WS2812FXStripSettings.stripSize <= multipacketOffset) return; + uint16_t len = (170 + multipacketOffset > WS2812FXStripSettings.stripSize) ? (WS2812FXStripSettings.stripSize - multipacketOffset) : 170; +/* #endif */ + for (uint16_t i = 0; i < len; i++){ + uint16_t j = i * 3; +/* #if defined(RGBW) + strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], data[j + 3]); + #else */ + strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], 0); +/* #endif */ + } + } +} + + +#include //https://github.com/FastLED/FastLED /* * paste in the Fire2012 code with a small edit at the end which uses the * setPixelColor() function to copy the color data to the ws2812fx instance. @@ -95,17 +238,39 @@ void Gradient() { } else { pixelnumber = j; } - color = fade(hex_colors_actual[1], hex_colors_actual[0], (j*255)/(WS2812FXStripSettings.stripSize - 1)); + color = trans(strip->getColors(selected_segment)[1], strip->getColors(selected_segment)[0], (j*255)/(WS2812FXStripSettings.stripSize - 1)); strip->setPixelColor(pixelnumber, ((color >> 16) & 0xFF), ((color >> 8) & 0xFF), ((color >> 0) & 0xFF), ((color >> 24) & 0xFF)); } } +#endif uint16_t myCustomEffect0() { - Fire2012(); + handleAuto(); return (strip->getSpeed() / WS2812FXStripSettings.stripSize); } uint16_t myCustomEffect1() { + handleCustomWS(); + return (strip->getSpeed() / WS2812FXStripSettings.stripSize); +} +#if defined(CUSTOM_WS2812FX_ANIMATIONS) +uint16_t myCustomEffect2() { + handleTV(); + return (strip->getSpeed() / WS2812FXStripSettings.stripSize); +} + +uint16_t myCustomEffect3() { + handleE131(); + return (strip->getSpeed() / WS2812FXStripSettings.stripSize); +} + +uint16_t myCustomEffect4() { + Fire2012(); + return (strip->getSpeed() / WS2812FXStripSettings.stripSize); +} + +uint16_t myCustomEffect5() { Gradient(); return (strip->getSpeed() / WS2812FXStripSettings.stripSize); } +#endif diff --git a/Arduino/McLighting/mode_tv.h b/Arduino/McLighting/mode_tv.h deleted file mode 100644 index 428d859..0000000 --- a/Arduino/McLighting/mode_tv.h +++ /dev/null @@ -1,77 +0,0 @@ -// *************************************************************************** -// TV mode -// *************************************************************************** - -uint8_t dipInterval = 10; -uint16_t darkTime = 250; -unsigned long currentDipTime; -unsigned long dipStartTime; -unsigned long currentMillis; -uint8_t ledState = LOW; -long previousMillis = 0; -uint16_t led = 5; -uint16_t interv = 2000; -uint8_t twitch = 50; -uint8_t dipCount = 0; -uint8_t analogLevel = 100; -boolean timeToDip = false; - - -void hsb2rgbAN1(uint16_t index, uint8_t sat, uint8_t bright, uint8_t myled) { - // Source: https://blog.adafruit.com/2012/03/14/constant-brightness-hsb-to-rgb-algorithm/ - uint8_t temp[5], n = (index >> 8) % 3; - temp[0] = temp[3] = (uint8_t)(( (sat ^ 255) * bright) / 255); - temp[1] = temp[4] = (uint8_t)((((( (index & 255) * sat) / 255) + (sat ^ 255)) * bright) / 255); - temp[2] = (uint8_t)(((((((index & 255) ^ 255) * sat) / 255) + (sat ^ 255)) * bright) / 255); - strip->setPixelColor(myled, temp[n + 2], temp[n + 1], temp[n], 0); -} - - -void updateLed (uint16_t led, uint8_t brightness) { - ledstates[led] = brightness; - for (uint16_t i=0; ishow(); -} - - -// See: http://forum.mysensors.org/topic/85/phoneytv-for-vera-is-here/13 -void handleTV() { - if (timeToDip == false) { - currentMillis = millis(); - if(currentMillis-previousMillis > interv) { - previousMillis = currentMillis; - //interv = random(750,4001);//Adjusts the interval for more/less frequent random light changes - interv = random(1000-(ws2812fx_speed*2),5001-(ws2812fx_speed*8)); - twitch = random(40,100);// Twitch provides motion effect but can be a bit much if too high - dipCount = dipCount++; - } - if(currentMillis-previousMillis dipInterval) { - DBG_OUTPUT_PORT.println("dip"); - timeToDip = true; - dipCount = 0; - dipStartTime = millis(); - darkTime = random(50,150); - dipInterval = random(5,250);// cycles of flicker - } - } - } else { - DBG_OUTPUT_PORT.println("Dip Time"); - currentDipTime = millis(); - if (currentDipTime - dipStartTime < darkTime) { - for (uint16_t i=3; ishow(); - } -} diff --git a/Arduino/McLighting/request_handlers.h b/Arduino/McLighting/request_handlers.h index 1e6f0e8..95bcc98 100644 --- a/Arduino/McLighting/request_handlers.h +++ b/Arduino/McLighting/request_handlers.h @@ -3,70 +3,52 @@ // *************************************************************************** // Prototypes -void handleAutoStart(); char * listStatusJSON(); #if defined(ENABLE_STATE_SAVE) bool writeConfigFS(bool); void tickerSaveConfig(); #endif -#if defined(ENABLE_E131) -void handleE131(){ - if (!e131->isEmpty()) - { - e131_packet_t packet; - e131->pull(&packet); // Pull packet from ring buffer - - uint16_t universe = htons(packet.universe); - uint8_t *data = packet.property_values + 1; - - if (universe < START_UNIVERSE || universe > END_UNIVERSE) return; //async will take care about filling the buffer - - // Serial.printf("Universe %u / %u Channels | Packet#: %u / Errors: %u / CH1: %u\n", - // htons(packet.universe), // The Universe for this packet - // htons(packet.property_value_count) - 1, // Start code is ignored, we're interested in dimmer data - // e131.stats.num_packets, // Packet counter - // e131.stats.packet_errors, // Packet error counter - // packet.property_values[1]); // Dimmer data for Channel 1 -/* #if defined(RGBW) - uint16_t multipacketOffset = (universe - START_UNIVERSE) * 128; //if more than 128 LEDs * 4 colors = 512 channels, client will send in next higher universe - if (NUMLEDS <= multipacketOffset) return; - uint16_t len = (128 + multipacketOffset > WS2812FXStripSettings.stripSize) ? (WS2812FXStripSettings.stripSize - multipacketOffset) : 128; - #else*/ - uint16_t multipacketOffset = (universe - START_UNIVERSE) * 170; //if more than 170 LEDs * 3 colors = 510 channels, client will send in next higher universe - if (WS2812FXStripSettings.stripSize <= multipacketOffset) return; - uint16_t len = (170 + multipacketOffset > WS2812FXStripSettings.stripSize) ? (WS2812FXStripSettings.stripSize - multipacketOffset) : 170; -/* #endif */ - for (uint16_t i = 0; i < len; i++){ - uint16_t j = i * 3; -/* #if defined(RGBW) - strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], data[j + 3]); - #else */ - strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], 0); -/* #endif */ - } - strip->show(); - } -} -#endif - // Call convertColors whenever main_color, back_color or xtra_color changes. + void convertColors() { - if ((fadeEffect) && (fade_cnt > 1) && (fade_cnt < 254)) { - memcpy(hex_colors_mem, hex_colors_actual, sizeof(hex_colors_actual)); - DBG_OUTPUT_PORT.println("Color transistion aborted. Restarting...!"); - fade_cnt = 1; - } else { - memcpy(hex_colors_mem, hex_colors, sizeof(hex_colors)); - } - hex_colors[0] = (uint32_t)(main_color.white << 24) | (main_color.red << 16) | (main_color.green << 8) | main_color.blue; - hex_colors[1] = (uint32_t)(back_color.white << 24) | (back_color.red << 16) | (back_color.green << 8) | back_color.blue; - hex_colors[2] = (uint32_t)(xtra_color.white << 24) | (xtra_color.red << 16) | (xtra_color.green << 8) | xtra_color.blue; - memcpy(hex_colors_actual, hex_colors, sizeof(hex_colors)); + hex_colors_trans[0] = (uint32_t)(main_color.white << 24) | (main_color.red << 16) | (main_color.green << 8) | main_color.blue; + hex_colors_trans[1] = (uint32_t)(back_color.white << 24) | (back_color.red << 16) | (back_color.green << 8) | back_color.blue; + hex_colors_trans[2] = (uint32_t)(xtra_color.white << 24) | (xtra_color.red << 16) | (xtra_color.green << 8) | xtra_color.blue; } +void convertColorsFade() { + if ((transEffect) && (trans_cnt > 1) && (trans_cnt < 254)) { + memcpy(hex_colors, strip->getColors(selected_segment), sizeof(strip->getColors(selected_segment))); + DBG_OUTPUT_PORT.println("Color transistion aborted. Restarting...!"); + trans_cnt = 1; + } else { + //memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); + } +} + +uint8_t calculateColorTransitionSteps () { + //compare all colors and calculate steps + int trans_cnt_max = 0; + int calculate_max[4] = {}; + for (uint8_t i=0; i<3; i++){ + DBG_OUTPUT_PORT.printf("i: %i\r\n", i); + for (uint8_t j=0; j<4; j++) { + DBG_OUTPUT_PORT.printf("j: %i\r\n", j); + calculate_max[j] = ((hex_colors[i] >> ((3-j)*8)) & 0xFF) - ((hex_colors_trans[i] >> ((3-j)*8)) & 0xFF); + calculate_max[j] = abs(calculate_max[j]); + trans_cnt_max = max(trans_cnt_max, calculate_max[j]); + DBG_OUTPUT_PORT.printf("calcmax: %i %i\r\n", j, calculate_max[j]); + } + } + DBG_OUTPUT_PORT.printf("max: %i\r\n", trans_cnt_max); + return trans_cnt_max; +} + + + void getArgs() { - if (mode == SET_ALL || mode == SET_COLOR) { + if (mode == SET) { if (server.arg("rgb") != "") { uint32_t rgb = (uint32_t) strtoul(server.arg("rgb").c_str(), NULL, 16); main_color.white = ((rgb >> 24) & 0xFF); @@ -140,17 +122,15 @@ void getArgs() { xtra_color.blue = constrain(xtra_color.blue, 0, 255); xtra_color.white = constrain(xtra_color.white, 0, 255); } - if (mode == SET_ALL || mode == SET_SPEED || mode == TV) { + if (mode == SET || mode == SET_SPEED) { if ((server.arg("s") != "") && (server.arg("s").toInt() >= 0) && (server.arg("s").toInt() <= 255)) { ws2812fx_speed = constrain(server.arg("s").toInt(), 0, 255); } } - if (mode == SET_ALL || mode == SET_MODE) { + if (mode == SET) { if ((server.arg("m") != "") && (server.arg("m").toInt() >= 0) && (server.arg("m").toInt() <= strip->getModeCount())) { ws2812fx_mode = constrain(server.arg("m").toInt(), 0, strip->getModeCount() - 1); } - } - if (mode == SET_ALL || mode == SET_BRIGHTNESS || mode == AUTO || mode == TV || mode == E131) { if ((server.arg("c") != "") && (server.arg("c").toInt() >= 0) && (server.arg("c").toInt() <= 100)) { brightness = constrain((int) server.arg("c").toInt() * 2.55, 0, 255); } else if ((server.arg("p") != "") && (server.arg("p").toInt() >= 0) && (server.arg("p").toInt() <= 255)) { @@ -162,18 +142,22 @@ void getArgs() { } uint16_t convertSpeed(uint8_t mcl_speed) { - //long ws2812_speed = mcl_speed * 256; uint16_t ws2812_speed = 61760 * (exp(0.0002336 * mcl_speed) - exp(-0.03181 * mcl_speed)); ws2812_speed = SPEED_MAX - ws2812_speed; - if (ws2812_speed < SPEED_MIN) { - ws2812_speed = SPEED_MIN; - } - if (ws2812_speed > SPEED_MAX) { - ws2812_speed = SPEED_MAX; - } + ws2812_speed = constrain(ws2812_speed, SPEED_MIN, SPEED_MAX); return ws2812_speed; } +uint8_t unconvertSpeed(uint16_t ws2812_speed) { + //log((SPEED_MAX - ws2812_speed)/61760) = (0.0002336 * mcl_speed) - (-0.03181 * mcl_speed); + //log((SPEED_MAX - ws2812_speed)/61760) = (0.0002336 + 0.03181) * mcl_speed; + uint16_t mcl_speed = (log((SPEED_MAX - ws2812_speed)/61760))/ (0.0002336 + 0.03181); + //uint16_t mcl_speed = 61760 * (exp(0.0002336 * mcl_speed) - exp(-0.03181 * mcl_speed)); + mcl_speed = 255 - mcl_speed; + mcl_speed = constrain(mcl_speed, 0, 255); + return mcl_speed; +} + // *************************************************************************** // Handler functions for WS and MQTT // *************************************************************************** @@ -184,7 +168,7 @@ void handleSetMainColor(uint8_t * mypayload) { main_color.red = ((rgb >> 16) & 0xFF); main_color.green = ((rgb >> 8) & 0xFF); main_color.blue = ((rgb >> 0) & 0xFF); - mode = SET_COLOR; + mode = SET; } void handleSetBackColor(uint8_t * mypayload) { @@ -194,7 +178,7 @@ void handleSetBackColor(uint8_t * mypayload) { back_color.red = ((rgb >> 16) & 0xFF); back_color.green = ((rgb >> 8) & 0xFF); back_color.blue = ((rgb >> 0) & 0xFF); - mode = SET_COLOR; + mode = SET; } void handleSetXtraColor(uint8_t * mypayload) { // decode rgb data @@ -203,7 +187,7 @@ void handleSetXtraColor(uint8_t * mypayload) { xtra_color.red = ((rgb >> 16) & 0xFF); xtra_color.green = ((rgb >> 8) & 0xFF); xtra_color.blue = ((rgb >> 0) & 0xFF); - mode = SET_COLOR; + mode = SET; } void handleSetAllMode(uint8_t * mypayload) { @@ -215,7 +199,7 @@ void handleSetAllMode(uint8_t * mypayload) { main_color.blue = ((rgb >> 0) & 0xFF); DBG_OUTPUT_PORT.printf("WS: Set all leds to main color: R: [%u] G: [%u] B: [%u] W: [%u]\r\n", main_color.red, main_color.green, main_color.blue, main_color.white); ws2812fx_mode = FX_MODE_STATIC; - mode = SET_ALL; + mode = SET; } void handleSetSingleLED(uint8_t * mypayload, uint8_t firstChar = 0) { @@ -260,7 +244,8 @@ void handleSetSingleLED(uint8_t * mypayload, uint8_t firstChar = 0) { strip->setPixelColor(led, color.red, color.green, color.blue, color.white); strip->show(); } - mode = CUSTOM; + mode = HOLD; + ws2812fx_mode= FX_MODE_CUSTOM_1; } void handleSetDifferentColors(uint8_t * mypayload) { @@ -422,6 +407,7 @@ bool setConfByConfString(String saved_conf_string) { getValue(saved_conf_string, '|', 8).toCharArray(tmp_rgbOrder, 4); checkRGBOrder(tmp_rgbOrder); WS2812FXStripSettings.fxoptions = constrain(((getValue(saved_conf_string, '|', 9).toInt()>>1)<<1), 0, 255); + transEffect = getValue(saved_conf_string, '|', 10).toInt(); return true; } else { DBG_OUTPUT_PORT.println("Saved conf not found!"); @@ -430,8 +416,6 @@ bool setConfByConfString(String saved_conf_string) { return false; } - - bool setModeByStateString(String saved_state_string) { if (getValue(saved_state_string, '|', 0) == "STA") { DBG_OUTPUT_PORT.printf("Parsed state: %s\r\n", saved_state_string.c_str()); @@ -470,7 +454,7 @@ bool setModeByStateString(String saved_state_string) { DBG_OUTPUT_PORT.print("Set to state: "); DBG_OUTPUT_PORT.println(listStatusJSON()); //prevmode=mode; - //mode = SET_ALL; + //mode = SET; return true; } else { DBG_OUTPUT_PORT.println("Saved state not found!"); @@ -479,91 +463,19 @@ bool setModeByStateString(String saved_state_string) { return false; } -#if defined(ENABLE_LEGACY_ANIMATIONS) -void handleSetNamedMode(uint8_t * mypayload) { - if (strcmp((char *) &mypayload[1], "off") == 0) { - mode = OFF; - } - - #if defined(ENABLE_TV) - if (strcmp((char *) &mypayload[1], "tv") == 0) { - mode = TV; - } - #endif - - #if defined(ENABLE_E131) - if (strcmp((char *) &mypayload[1], "e131") == 0) { - mode = E131; - } - #endif - - if (strcmp((char *) &mypayload[1], "auto") == 0) { - mode = AUTO; - } - if (strcmp((char *) &mypayload[1], "all") == 0) { - ws2812fx_mode = FX_MODE_STATIC; - mode = SET_ALL; - } - if (strcmp((char *) &mypayload[1], "wipe") == 0) { - ws2812fx_mode = FX_MODE_COLOR_WIPE; - mode = SET_MODE; - } - if (strcmp((char *) &mypayload[1], "rainbow") == 0) { - ws2812fx_mode = FX_MODE_RAINBOW; - mode = SET_MODE; - } - if (strcmp((char *) &mypayload[1], "rainbowCycle") == 0) { - ws2812fx_mode = FX_MODE_RAINBOW_CYCLE; - mode = SET_MODE; - } - if (strcmp((char *) &mypayload[1], "theaterchase") == 0) { - ws2812fx_mode = FX_MODE_THEATER_CHASE; - mode = SET_MODE; - } - if (strcmp((char *) &mypayload[1], "twinkleRandom") == 0) { - ws2812fx_mode = FX_MODE_TWINKLE_RANDOM; - mode = SET_MODE; - } - if (strcmp((char *) &mypayload[1], "theaterchaseRainbow") == 0) { - ws2812fx_mode = FX_MODE_THEATER_CHASE_RAINBOW; - mode = SET_MODE; - } -#endif -} - void handleSetWS2812FXMode(uint8_t * mypayload) { if (isDigit(mypayload[1])) { ws2812fx_mode = (uint8_t) strtol((const char *) &mypayload[1], NULL, 10); ws2812fx_mode = constrain(ws2812fx_mode, 0, strip->getModeCount() - 1); - mode = SET_MODE; + mode = SET; } else { if (strcmp((char *) &mypayload[1], "off") == 0) { mode = OFF; } - - if (strcmp((char *) &mypayload[1], "auto") == 0) { - mode = AUTO; - } - - #if defined(ENABLE_TV) - if (strcmp((char *) &mypayload[1], "tv") == 0) { - mode = TV; - } - #endif - - #if defined(ENABLE_E131) - if (strcmp((char *) &mypayload[1], "e131") == 0) { - mode = E131; - } - #endif - if (strcmp((char *) &mypayload[1], "custom") == 0) { - mode = CUSTOM; - } } } char * listStatusJSON() { - //uint8_t tmp_mode = (mode == SET_MODE) ? (uint8_t) ws2812fx_mode : strip->getMode(); const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(6) + 500; DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); @@ -602,7 +514,6 @@ void getStatusJSON() { } char * listConfigJSON() { - //uint8_t tmp_mode = (mode == SET_MODE) ? (uint8_t) ws2812fx_mode : strip->getMode(); #if defined(ENABLE_MQTT) const size_t bufferSize = JSON_OBJECT_SIZE(9) + 500; #else @@ -621,6 +532,7 @@ char * listConfigJSON() { root["ws_rgbo"] = WS2812FXStripSettings.RGBOrder; root["ws_pin"] = WS2812FXStripSettings.pin; root["ws_fxopt"] = WS2812FXStripSettings.fxoptions; + root["transEffect"] = transEffect; uint16_t msg_len = measureJson(root) + 1; char * buffer = (char *) malloc(msg_len); serializeJson(root, buffer, msg_len); @@ -642,19 +554,6 @@ char * listModesJSON() { JsonObject objectoff = root.createNestedObject(); objectoff["mode"] = "off"; objectoff["name"] = "OFF"; - #if defined(ENABLE_TV) - JsonObject objecttv = root.createNestedObject(); - objecttv["mode"] = "tv"; - objecttv["name"] = "TV"; - #endif - #if defined(ENABLE_E131) - JsonObject objecte131 = root.createNestedObject(); - objecte131["mode"] = "e131"; - objecte131["name"] = "E131"; - #endif - JsonObject objectcustom = root.createNestedObject(); - objectcustom["mode"] = "custom"; - objectcustom["name"] = "CUSTOM WS"; for (uint8_t i = 0; i < strip->getModeCount(); i++) { JsonObject object = root.createNestedObject(); object["mode"] = i; @@ -713,37 +612,6 @@ void handleNotFound() { server.send ( 404, "text/plain", message ); } -// *************************************************************************** -// Functions and variables for automatic cycling -// *************************************************************************** -Ticker autoTicker; -uint8_t autoCount = 0; - -void autoTick() { - uint32_t setcolors[] = {autoParams[autoCount][0],autoParams[autoCount][1],autoParams[autoCount][2]}; - strip->setColors(0, setcolors); - strip->setSpeed(convertSpeed((uint8_t)autoParams[autoCount][3])); - strip->setMode((uint8_t)autoParams[autoCount][4]); - strip->trigger(); - autoTicker.once_ms((uint32_t)autoParams[autoCount][5], autoTick); - DBG_OUTPUT_PORT.print("autoTick "); - DBG_OUTPUT_PORT.printf("autoTick[%d]: {0x%08x, 0x%08x, 0x%08x, %d, %d, %d}\r\n", autoCount, autoParams[autoCount][0], autoParams[autoCount][1], autoParams[autoCount][2], autoParams[autoCount][3], autoParams[autoCount][4], autoParams[autoCount][5]); - - autoCount++; - if (autoCount >= (sizeof(autoParams) / sizeof(autoParams[0]))) autoCount = 0; -} - -void handleAutoStart() { - DBG_OUTPUT_PORT.println("Starting AUTO mode."); - autoCount = 0; - autoTick(); -} - -void handleAutoStop() { - DBG_OUTPUT_PORT.println("Stopping AUTO mode."); - autoTicker.detach(); -} - // *************************************************************************** // Functions and variables // *************************************************************************** @@ -787,7 +655,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { if (payload[0] == '%') { uint8_t b = (uint8_t) strtol((const char *) &payload[1], NULL, 10); brightness = constrain(b, 0, 255); - mode = SET_BRIGHTNESS; + mode = SET; Dbg_Prefix(mqtt, num); DBG_OUTPUT_PORT.printf("Set brightness to: [%u]\r\n", brightness); } @@ -829,16 +697,6 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { #endif } - #if defined(ENABLE_LEGACY_ANIMATIONS) - // = ==> Activate named mode - if (payload[0] == '=') { - // we get mode data - handleSetNamedMode(payload); - Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Activated mode [%u]!\r\n", mode); - } - #endif - // $ ==> Get status Info. if (payload[0] == '$') { char * buffer = listStatusJSON(); @@ -896,7 +754,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { tmp_fxoptions[3] = 0x00; WS2812FXStripSettings.fxoptions = ((constrain(atoi(tmp_fxoptions), 0, 255)>>1)<<1); updateStrip = true; - } + } } if (updateStrip){ mode = INIT_STRIP; @@ -935,7 +793,14 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { initMqtt(); } #endif - + if (payload[1] == 'e') { + char tmp_transEffect[2]; + snprintf(tmp_transEffect, sizeof(tmp_transEffect), "%s", &payload[2]); + tmp_transEffect[sizeof(tmp_transEffect) - 1] = 0x00; + transEffect = atoi(tmp_transEffect); + updateConf = true; + } + char * buffer = listConfigJSON(); if (mqtt == true) { DBG_OUTPUT_PORT.print("MQTT: "); @@ -1020,18 +885,6 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght DBG_OUTPUT_PORT.printf("WS: [%u] get Text: %s\r\n", num, payload); checkpayload(payload, false, num); - - // start auto cycling - if (strcmp((char *)payload, "start") == 0 ) { - mode = AUTO; - webSocket.sendTXT(num, "OK"); - } - - // stop auto cycling - if (strcmp((char *)payload, "stop") == 0 ) { - mode = SET_ALL; - webSocket.sendTXT(num, "OK"); - } break; } } @@ -1133,23 +986,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght if (mode == OFF){ root["effect"] = "OFF"; } else { - if (mode == AUTO){ - root["effect"] = "AUTO"; - } else { - if (mode == TV){ - root["effect"] = "TV"; - } else { - if (mode == E131){ - root["effect"] = "E131"; - } else { - if (mode == CUSTOM){ - root["effect"] = "CUSTOM WS"; - } else { - root["effect"] = strip->getModeName(strip->getMode()); - } - } - } - } + root["effect"] = strip->getModeName(strip->getMode()); } #endif char buffer[measureJson(root) + 1]; @@ -1184,7 +1021,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght if (root.containsKey("state")) { const char* state_in = root["state"]; if (strcmp(state_in, on_cmd) == 0) { - mode = SET_ALL; + mode = SET; } else if (strcmp(state_in, off_cmd) == 0) { mode = OFF; @@ -1207,14 +1044,14 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght xtra_color.green = (uint8_t) color["g3"]; xtra_color.blue = (uint8_t) color["b3"]; xtra_color.white = (uint8_t) color["w3"]; - mode = SET_COLOR; + mode = SET; } if (root.containsKey("white_value")) { uint8_t json_white_value = constrain((uint8_t) root["white_value"], 0, 255); if (json_white_value != main_color.white) { main_color.white = json_white_value; - mode = SET_COLOR; + mode = SET; } } @@ -1231,14 +1068,14 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght color_temp = (uint16_t) root["color_temp"]; uint16_t kelvin = 1000000 / color_temp; main_color = temp2rgb(kelvin); - mode = SET_COLOR; + mode = SET; } if (root.containsKey("brightness")) { uint8_t json_brightness = constrain((uint8_t) root["brightness"], 0, 255); //fix #224 if (json_brightness != brightness) { brightness = json_brightness; - mode = SET_BRIGHTNESS; + mode = SET; } } @@ -1248,26 +1085,10 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght if(effectString == "OFF"){ mode = OFF; } - if(effectString == "AUTO"){ - mode = AUTO; - } #endif - #if defined(ENABLE_TV) and defined(ENABLE_HOMEASSISTANT) - if(effectString == "TV"){ - mode = TV; - } - #endif - #if defined(ENABLE_E131) and defined(ENABLE_HOMEASSISTANT) - if(effectString == "E131"){ - mode = E131; - } - #endif - if(effectString == "CUSTOM WS"){ - mode = CUSTOM; - } for (uint8_t i = 0; i < strip->getModeCount(); i++) { if(String(strip->getModeName(i)) == effectString) { - mode = SET_MODE; + mode = SET; ws2812fx_mode = i; break; } @@ -1356,14 +1177,6 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght root["effect"] = "true"; JsonArray effect_list = root.createNestedArray("effect_list"); effect_list.add("OFF"); - effect_list.add("AUTO"); - #if defined(ENABLE_TV) - effect_list.add("TV"); - #endif - #if defined(ENABLE_E131) - effect_list.add("E131"); - #endif - effect_list.add("CUSTOM WS"); for (uint8_t i = 0; i < strip->getModeCount(); i++) { effect_list.add(strip->getModeName(i)); } @@ -1469,14 +1282,6 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght root["effect"] = "true"; JsonArray effect_list = root.createNestedArray("effect_list"); effect_list.add("OFF"); - effect_list.add("AUTO"); - #if defined(ENABLE_TV) - effect_list.add("TV"); - #endif - #if defined(ENABLE_E131) - effect_list.add("E131"); - #endif - effect_list.add("CUSTOM WS"); for (uint8_t i = 0; i < strip->getModeCount(); i++) { effect_list.add(strip->getModeName(i)); } @@ -1522,7 +1327,8 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght DBG_OUTPUT_PORT.printf("Short button press\r\n"); if (mode == OFF) { setModeByStateString(BTN_MODE_SHORT); - mode = SET_ALL; + prevmode = mode; + mode = SET; } else { mode = OFF; } @@ -1532,14 +1338,16 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght void mediumKeyPress() { DBG_OUTPUT_PORT.printf("Medium button press\r\n"); setModeByStateString(BTN_MODE_MEDIUM); - mode = SET_ALL; + prevmode = mode; + mode = SET; } // called when button is kept pressed for 2 seconds or more void longKeyPress() { DBG_OUTPUT_PORT.printf("Long button press\r\n"); setModeByStateString(BTN_MODE_LONG); - mode = SET_ALL; + prevmode = mode; + mode = SET; } void button() { @@ -1583,7 +1391,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght tcs.getData(&r, &g, &b, &col, &conf); DBG_OUTPUT_PORT.printf("Colors: R: [%d] G: [%d] B: [%d] Color: [%d] Conf: [%d]\r\n", (int)r, (int)g, (int)b, (int)col, (int)conf); main_color.red = (pow((r/255.0), GAMMA)*255); main_color.green = (pow((g/255.0), GAMMA)*255); main_color.blue = (pow((b/255.0), GAMMA)*255);main_color.white = 0; - mode = SET_COLOR; + mode = SET; } // called when button is kept pressed for less than 2 seconds @@ -1729,6 +1537,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght uint8_t temp_pin; checkPin((uint8_t) root["ws_pin"]); WS2812FXStripSettings.fxoptions = constrain(root["ws_fxopt"].as(), 0, 255) & 0xFE; + transEffect = root["transEffect"].as(); jsonBuffer.clear(); return true; } else { @@ -1849,7 +1658,7 @@ void handleRemote() { if (results.value == rmt_commands[ON_OFF]) { // ON/OFF TOGGLE last_remote_cmd = 0; if (mode == OFF) { - mode = SET_ALL; + mode = SET; } else { mode = OFF; } @@ -1859,18 +1668,18 @@ void handleRemote() { last_remote_cmd = results.value; if (brightness + chng <= 255) { brightness = brightness + chng; - mode = SET_BRIGHTNESS; + mode = SET; } } if (results.value == rmt_commands[BRIGHTNESS_DOWN]) { //Brightness down last_remote_cmd = results.value; if (brightness - chng >= 0) { brightness = brightness - chng; - mode = SET_BRIGHTNESS; + mode = SET; } } } - if ((mode !=AUTO) && (mode != E131) && (mode != OFF)) { + if ((mode !=AUTO) && (mode != OFF)) { if (results.value == rmt_commands[SPEED_UP]) { //Speed Up last_remote_cmd = results.value; if (ws2812fx_speed + chng <= 255) { @@ -1892,19 +1701,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.red + chng <= 255) { main_color.red = main_color.red + chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 2) { if (back_color.red + chng <= 255) { back_color.red = back_color.red + chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 3) { if (xtra_color.red + chng <= 255) { xtra_color.red = xtra_color.red + chng; - mode = SET_COLOR; + mode = SET; } } } @@ -1913,19 +1722,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.red - chng >= 0) { main_color.red = main_color.red - chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 2) { if (back_color.red - chng >= 0) { back_color.red = back_color.red - chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 3) { if (xtra_color.red - chng >= 0) { xtra_color.red = xtra_color.red - chng; - mode = SET_COLOR; + mode = SET; } } } @@ -1934,19 +1743,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.green + chng <= 255) { main_color.green = main_color.green + chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 2) { if (back_color.green + chng <= 255) { back_color.green = back_color.green + chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 3) { if (xtra_color.green + chng <= 255) { xtra_color.green = xtra_color.green + chng; - mode = SET_COLOR; + mode = SET; } } } @@ -1955,19 +1764,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.green - chng >= 0) { main_color.green = main_color.green - chng;; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 2) { if (back_color.green - chng >= 0) { back_color.green = back_color.green - chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 3) { if (xtra_color.green - chng >= 0) { xtra_color.green = xtra_color.green - chng; - mode = SET_COLOR; + mode = SET; } } } @@ -1976,19 +1785,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.blue + chng <= 255) { main_color.blue = main_color.blue + chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 2) { if (back_color.blue + chng <= 255) { back_color.blue = back_color.blue + chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 3) { if (xtra_color.blue + chng <= 255) { xtra_color.blue = xtra_color.blue + chng; - mode = SET_COLOR; + mode = SET; } } } @@ -1997,19 +1806,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.blue - chng >= 0) { main_color.blue = main_color.blue - chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 2) { if (back_color.blue - chng >= 0) { back_color.blue = back_color.blue - chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 3) { if (xtra_color.blue - chng >= 0) { xtra_color.blue = xtra_color.blue - chng; - mode = SET_COLOR; + mode = SET; } } } @@ -2018,19 +1827,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.white + chng <= 255) { main_color.white = main_color.white + chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 2) { if (back_color.white + chng <= 255) { back_color.white = back_color.white + chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 3) { if (xtra_color.white + chng <= 255) { xtra_color.white = xtra_color.white + chng; - mode = SET_COLOR; + mode = SET; } } } @@ -2039,19 +1848,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.white - chng >= 0) { main_color.white = main_color.white - chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 2) { if (back_color.white - chng >= 0) { back_color.white = back_color.white - chng; - mode = SET_COLOR; + mode = SET; } } if (selected_color == 3) { if (xtra_color.white - chng >= 0) { xtra_color.white = xtra_color.white - chng; - mode = SET_COLOR; + mode = SET; } } } @@ -2073,52 +1882,46 @@ void handleRemote() { if ((ws2812fx_mode < strip->getModeCount()-1) && (mode == HOLD)) { ws2812fx_mode = ws2812fx_mode + 1; } - mode = SET_MODE; + mode = SET; } if (results.value == rmt_commands[MODE_DOWN]) { //Mode down last_remote_cmd = results.value; if ((ws2812fx_mode > 0) && (mode == HOLD)) { ws2812fx_mode = ws2812fx_mode - 1; } - mode = SET_MODE; + mode = SET; } if (results.value == rmt_commands[AUTOMODE]) { // Toggle Automode last_remote_cmd = 0; - if (mode != AUTO) { - mode = AUTO; - } else { - mode = SET_ALL; - } + ws2812fx_mode = 56; + mode = SET; } - #if defined(ENABLE_TV) + #if defined(CUSTOM_WS2812FX_ANIMATIONS) if (results.value == rmt_commands[CUST_1]) { // Select TV Mode last_remote_cmd = 0; - if (mode == TV) { - mode = SET_ALL; - } else { - mode = TV; - } + ws2812fx_mode = 57; + mode = SET; } #endif if (results.value == rmt_commands[CUST_2]) { // Select Custom Mode 2 last_remote_cmd = 0; ws2812fx_mode = 12; - mode = SET_MODE; + mode = SET; } if (results.value == rmt_commands[CUST_3]) { // Select Custom Mode 3 last_remote_cmd = 0; ws2812fx_mode = 48; - mode = SET_MODE; + mode = SET; } if (results.value == rmt_commands[CUST_4]) { // Select Custom Mode 4 last_remote_cmd = 0; ws2812fx_mode = 21; - mode = SET_MODE; + mode = SET; } if (results.value == rmt_commands[CUST_5]) { // Select Custom Mode 5 last_remote_cmd = 0; ws2812fx_mode = 46; - mode = SET_MODE; + mode = SET; } irrecv.resume(); // Receive the next value } @@ -2133,7 +1936,7 @@ uint32_t scale_wrgb(uint32_t wrgb, uint8_t level) { return (w << 24) | (r << 16) | (g << 8) | b; } -uint32_t fade(uint32_t newcolor, uint32_t oldcolor, uint8_t level) { +uint32_t trans(uint32_t newcolor, uint32_t oldcolor, uint8_t level) { newcolor = scale_wrgb(newcolor, level); oldcolor = scale_wrgb(oldcolor, 255-level); return newcolor + oldcolor; diff --git a/Arduino/McLighting/rest_api.h b/Arduino/McLighting/rest_api.h index 3d75b26..8597c0e 100644 --- a/Arduino/McLighting/rest_api.h +++ b/Arduino/McLighting/rest_api.h @@ -118,21 +118,6 @@ #else root["home_assistant"] = "OFF"; #endif - #if defined(ENABLE_LEGACY_ANIMATIONS) - root["legacy_animations"] = "ON"; - #else - root["legacy_animations"] = "OFF"; - #endif - #if defined(ENABLE_TV) - root["tv_animation"] = "ON"; - #else - root["tv_animation"] = "OFF"; - #endif - #if defined(ENABLE_E131) - root["e131_animations"] = "ON"; - #else - root["e131_animations"] = "OFF"; - #endif #if defined(ENABLE_OTA) #if ENABLE_OTA == 0 root["ota"] = "ARDUINO"; @@ -192,12 +177,6 @@ SPIFFS.format(); }); - server.on("/set_brightness", []() { - mode = SET_BRIGHTNESS; - getArgs(); - getStatusJSON(); - }); - server.on("/get_brightness", []() { char str_brightness[4]; snprintf(str_brightness, sizeof(str_brightness), "%i", (int) (brightness / 2.55)); @@ -207,12 +186,6 @@ DBG_OUTPUT_PORT.printf("/get_brightness: %i\r\n", (int) (brightness / 2.55)); }); - server.on("/set_speed", []() { - mode = SET_SPEED; - getArgs(); - getStatusJSON(); - }); - server.on("/get_speed", []() { char str_speed[4]; snprintf(str_speed, sizeof(str_speed), "%i", ws2812fx_speed); @@ -346,9 +319,14 @@ } if (updateConf) { initMqtt(); - } + } #endif + if(server.hasArg("trans_effect")){ + transEffect = server.arg("trans_effect").toInt(); + updateConf = true; + } + #if defined(ENABLE_STATE_SAVE) if (updateStrip || updateConf) { if(!settings_save_conf.active()) settings_save_conf.once(3, tickerSaveConfig); @@ -364,86 +342,14 @@ getStatusJSON(); }); - server.on("/auto", []() { - mode = AUTO; - getArgs(); - getStatusJSON(); - }); - - server.on("/all", []() { + server.on("/set", []() { prevmode = HOLD; ws2812fx_mode = FX_MODE_STATIC; - mode = SET_ALL; + mode = SET; getArgs(); getStatusJSON(); }); - #if defined(ENABLE_LEGACY_ANIMATIONS) - server.on("/wipe", []() { - ws2812fx_mode = FX_MODE_COLOR_WIPE; - mode = SET_ALL; - getArgs(); - getStatusJSON(); - }); - - server.on("/rainbow", []() { - ws2812fx_mode = FX_MODE_RAINBOW; - mode = SET_ALL; - getArgs(); - getStatusJSON(); - }); - - server.on("/rainbowcycle", []() { - ws2812fx_mode = FX_MODE_RAINBOW_CYCLE; - mode = SET_ALL; - getArgs(); - getStatusJSON(); - }); - - server.on("/theaterchase", []() { - ws2812fx_mode = FX_MODE_THEATER_CHASE; - mode = SET_ALL; - getArgs(); - getStatusJSON(); - }); - - server.on("/twinklerandom", []() { - ws2812fx_mode = FX_MODE_TWINKLE_RANDOM; - mode = SET_ALL; - getArgs(); - getStatusJSON(); - }); - - server.on("/theaterchaserainbow", []() { - ws2812fx_mode = FX_MODE_THEATER_CHASE_RAINBOW; - mode = SET_ALL; - getArgs(); - getStatusJSON(); - }); - #endif - - #if defined(ENABLE_E131) - server.on("/e131", []() { - mode = E131; - getArgs(); - getStatusJSON(); - }); - #endif - - #if defined(ENABLE_TV) - server.on("/tv", []() { - mode = TV; - getArgs(); - getStatusJSON(); - }); - #endif - server.on("/get_modes", []() { getModesJSON(); }); - - server.on("/set_mode", []() { - mode = SET_MODE; - getArgs(); - getStatusJSON(); - }); diff --git a/Arduino/McLighting/version.h b/Arduino/McLighting/version.h index abbd427..55e0789 100644 --- a/Arduino/McLighting/version.h +++ b/Arduino/McLighting/version.h @@ -1 +1 @@ -#define SKETCH_VERSION "2.2.7.BETA1.rgbw.3c" +#define SKETCH_VERSION "3.0.0.BETA1" diff --git a/Arduino/McLighting/version_info.ino b/Arduino/McLighting/version_info.ino index 6ecfc3b..1bee4b4 100644 --- a/Arduino/McLighting/version_info.ino +++ b/Arduino/McLighting/version_info.ino @@ -167,9 +167,21 @@ * * 15 September 2019 * Version Bump to 2.2.7.BETA1.rgbw.3colors - * adressed issue: #25 (added Custom Animation 'Gradient') + * adressed issue: #25 (added Custom Animation 'Gradient' with number 57) * adressed issue: #30 (Status 'AUTO' is saved now) - * adressed issue: https://github.com/toblum/McLighting/issues/403 (Experimental Support of transitions: set fadeEffect = true in definitions.h) + * adressed issue: https://github.com/toblum/McLighting/issues/403 (Experimental Support of transitions: set transEffect = true in definitions.h) * corrected use of DMA for Neopixelbus by Makuna (Tests for other strips than SK6812 GRBW were not made) * + * 27 September 2019 + * Version Bump to 3.0.0.ALPHA1 + * removed LEGACY_ANIMATIONS + * removed old Custom Animations from beginning of list. + * added Custom Animation 'AutoPlay' with number 56 + * added Custom Animation 'Custom WS' with number 57 + * added Custom Animation 'TV' with number 58 + * added Custom Animation 'E1.31' with number 59 + * moved Custom Animation 'Fire2012' to number 60 + * moved Custom Animation 'Gradients' to number 61 + * REST-API changes (will be documented soon) + * */ diff --git a/README.md b/README.md index 17d3c82..b5bd2f1 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,10 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so ## Todos +- [ ] Redesign of Code and bump to V3 +- [ ] Removal of LEGACY_ANIMATIONS +- [ ] Add TV, E1.31 and AUTO to CUSTOM_WS2812FX_ANIMATIONS +- [ ] Include ws28fx library to code due to modifications in library - [ ] Support multiple strips and control them separately or together [Issue](https://github.com/toblum/McLighting/issues/118) - [ ] Remove old / wrong EEPROM settings completely [Issue] - [ ] Customer profile to define segments of (in)active areas on the strip [Issue](https://github.com/toblum/McLighting/issues/37) @@ -69,6 +73,7 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so - [ ] Multiple buttons/GPIO Inputs. [Issue](https://github.com/toblum/McLighting/issues/119) - [ ] Music visualizer / Bring back ArtNet [Issue](https://github.com/toblum/McLighting/issues/111) - [ ] Display version and parameters (Number of LEDs, definition settings, ..) in the web UI [Issue](https://github.com/toblum/McLighting/issues/150) +- [ ] Support for up to ten segment - [x] Save status: Added saving of status 'AUTO'. [Issue] https://github.com/FabLab-Luenen/McLighting/issues/30 - [x] EXPERIMENTAL: Added transition feature on changing values of color brightness and speed. ATTENTION! Does not work proberly for all WS2812fx effects. - [x] Added Custom Animation 'Gradient': [Issue] https://github.com/FabLab-Luenen/McLighting/issues/25 From 66103c7be9df4e99c926da8c69654116e03e6ced Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Sat, 28 Sep 2019 09:20:10 +0200 Subject: [PATCH 03/28] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b5bd2f1..3d70d6b 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,6 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so ## Todos - [ ] Redesign of Code and bump to V3 - [ ] Removal of LEGACY_ANIMATIONS -- [ ] Add TV, E1.31 and AUTO to CUSTOM_WS2812FX_ANIMATIONS - [ ] Include ws28fx library to code due to modifications in library - [ ] Support multiple strips and control them separately or together [Issue](https://github.com/toblum/McLighting/issues/118) - [ ] Remove old / wrong EEPROM settings completely [Issue] @@ -73,7 +72,8 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so - [ ] Multiple buttons/GPIO Inputs. [Issue](https://github.com/toblum/McLighting/issues/119) - [ ] Music visualizer / Bring back ArtNet [Issue](https://github.com/toblum/McLighting/issues/111) - [ ] Display version and parameters (Number of LEDs, definition settings, ..) in the web UI [Issue](https://github.com/toblum/McLighting/issues/150) -- [ ] Support for up to ten segment +- [ ] Support for up to ten segments +- [x] Add TV, E1.31 and AUTO to CUSTOM_WS2812FX_ANIMATIONS - [x] Save status: Added saving of status 'AUTO'. [Issue] https://github.com/FabLab-Luenen/McLighting/issues/30 - [x] EXPERIMENTAL: Added transition feature on changing values of color brightness and speed. ATTENTION! Does not work proberly for all WS2812fx effects. - [x] Added Custom Animation 'Gradient': [Issue] https://github.com/FabLab-Luenen/McLighting/issues/25 @@ -103,4 +103,4 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so You use this project at your own risk. This is not a solution that should be used in productive environments, but this code and guide could give you a quick start for your own experiments. Please keep also in mind that there are currently some security features missing. -*More information will be added as soon as I clean up the code and complete documentation.* \ No newline at end of file +*More information will be added as soon as I clean up the code and complete documentation.* From 3f880f95c1527bcef1101932c73a020844f74f1d Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Sat, 28 Sep 2019 09:28:27 +0200 Subject: [PATCH 04/28] Update README.md --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 3d70d6b..6ae831b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # McLighting v2 - The ESP8266 based multi-client lighting gadget -[![Gitter](https://badges.gitter.im/mclighting/Lobby.svg)](https://gitter.im/mclighting/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.com/toblum/McLighting.svg?branch=master)](https://travis-ci.com/toblum/McLighting) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![version](https://img.shields.io/badge/version-v2.2.7-blue.svg)](https://github.com/toblum/McLighting/blob/master/Arduino/McLighting/version.h) +[![Gitter](https://badges.gitter.im/mclighting/Lobby.svg)](https://gitter.im/mclighting/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.com/toblum/McLighting.svg?branch=master)](https://travis-ci.com/toblum/McLighting) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![version](https://img.shields.io/badge/version-v3.0.0-blue.svg)](https://github.com/FabLab-Luenen/McLighting/blob/master/Arduino/McLighting/version.h) McLighting (the multi-client lighting gadget) is a very cheap internet-controllable lighting solution based on the famous ESP8266 microcontroller and WS2811/2812 led strips. It features among other things a web-interface, a REST-API and a websocket connector. @@ -33,15 +33,15 @@ again in out wiki: [Software installation](../../wiki/Software-installation) This project uses libraries and code by different authors: -- [WiFiManager](https://github.com/tzapu/WiFiManager) by tzapu (tested with version 0.12.0) +- [WiFiManager](https://github.com/tzapu/WiFiManager) by tzapu (tested with version 0.15.0) -- [WS2812FX](https://github.com/kitesurfer1404/WS2812FX) by kitesurfer1404 (tested with version downloaded 2017-02-05) +- [WS2812FX](https://github.com/kitesurfer1404/WS2812FX) by kitesurfer1404 (tested with version 1.2.1 -- [WebSockets](https://github.com/Links2004/arduinoWebSockets) by Links2004 (tested with version 2.0.6) +- [WebSockets](https://github.com/Links2004/arduinoWebSockets) by Links2004 (tested with version 2.1.4) -- [Adafruit NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) by adafruit (tested with 1.1.2) +- [Adafruit NeoPixel](https://github.com/adafruit/Adafruit_NeoPixel) by adafruit (tested with 1.2.5) -- Optional: [PubSubClient](https://github.com/knolleary/pubsubclient/) by knolleary (tested with 2.6.0) +- Optional: [PubSubClient](https://github.com/knolleary/pubsubclient/) by knolleary (tested with 2.7.0) _Only when you have activated MQTT in definitions.h._ The sketch also uses the following built-in library: @@ -75,7 +75,7 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so - [ ] Support for up to ten segments - [x] Add TV, E1.31 and AUTO to CUSTOM_WS2812FX_ANIMATIONS - [x] Save status: Added saving of status 'AUTO'. [Issue] https://github.com/FabLab-Luenen/McLighting/issues/30 -- [x] EXPERIMENTAL: Added transition feature on changing values of color brightness and speed. ATTENTION! Does not work proberly for all WS2812fx effects. +- [x] EXPERIMENTAL: Added transition feature on changing values of color brightness and speed. ATTENTION! Does not work proberly for all WS2812fx effects. Can be set via UI. - [x] Added Custom Animation 'Gradient': [Issue] https://github.com/FabLab-Luenen/McLighting/issues/25 - [x] Make number of pixels, MQTT and PIN configurable via front end [Issue](https://github.com/toblum/McLighting/issues/93) and [Issue](https://github.com/toblum/McLighting/issues/93) - [x] Bundle webpages instead of SPIFFS [Issue](https://github.com/toblum/McLighting/issues/93) From 7291cb2fe00e771bee5b27fa787524ede8efa5e5 Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Sat, 28 Sep 2019 09:30:42 +0200 Subject: [PATCH 05/28] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6ae831b..bd2313d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# McLighting v2 - The ESP8266 based multi-client lighting gadget +# McLighting v3 - The ESP8266 based multi-client lighting gadget [![Gitter](https://badges.gitter.im/mclighting/Lobby.svg)](https://gitter.im/mclighting/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.com/toblum/McLighting.svg?branch=master)](https://travis-ci.com/toblum/McLighting) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![version](https://img.shields.io/badge/version-v3.0.0-blue.svg)](https://github.com/FabLab-Luenen/McLighting/blob/master/Arduino/McLighting/version.h) @@ -35,7 +35,7 @@ This project uses libraries and code by different authors: - [WiFiManager](https://github.com/tzapu/WiFiManager) by tzapu (tested with version 0.15.0) -- [WS2812FX](https://github.com/kitesurfer1404/WS2812FX) by kitesurfer1404 (tested with version 1.2.1 +- [WS2812FX](https://github.com/kitesurfer1404/WS2812FX) by kitesurfer1404 (tested with version 1.2.1) - [WebSockets](https://github.com/Links2004/arduinoWebSockets) by Links2004 (tested with version 2.1.4) From 3a1f9d2f1454924406eb572becaf314c3d7d35f0 Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Sat, 28 Sep 2019 09:54:11 +0200 Subject: [PATCH 06/28] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index bd2313d..9c8f310 100644 --- a/README.md +++ b/README.md @@ -74,14 +74,14 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so - [ ] Display version and parameters (Number of LEDs, definition settings, ..) in the web UI [Issue](https://github.com/toblum/McLighting/issues/150) - [ ] Support for up to ten segments - [x] Add TV, E1.31 and AUTO to CUSTOM_WS2812FX_ANIMATIONS -- [x] Save status: Added saving of status 'AUTO'. [Issue] https://github.com/FabLab-Luenen/McLighting/issues/30 +- [x] Save status: Added saving of status 'AUTO'. [Issue] (https://github.com/FabLab-Luenen/McLighting/issues/30) - [x] EXPERIMENTAL: Added transition feature on changing values of color brightness and speed. ATTENTION! Does not work proberly for all WS2812fx effects. Can be set via UI. -- [x] Added Custom Animation 'Gradient': [Issue] https://github.com/FabLab-Luenen/McLighting/issues/25 -- [x] Make number of pixels, MQTT and PIN configurable via front end [Issue](https://github.com/toblum/McLighting/issues/93) and [Issue](https://github.com/toblum/McLighting/issues/93) +- [x] Added Custom Animation 'Gradient': [Issue] (https://github.com/FabLab-Luenen/McLighting/issues/25) +- [x] Make number of pixels, MQTT and PIN configurable via front end [Issue](https://github.com/toblum/McLighting/issues/93) and [Issue](https://github.com/toblum/McLighting/issues/101) - [x] Bundle webpages instead of SPIFFS [Issue](https://github.com/toblum/McLighting/issues/93) - [x] IR remote support [issue](https://github.com/toblum/McLightingUI/issues/3) - [x] MQTT support -- [x] Save favourite effects? [Issue](https://github.com/toblum/McLighting/issues/35)(https://github.com/toblum/McLighting/issues/101) +- [x] Save favourite effects? [Issue](https://github.com/toblum/McLighting/issues/35) - [x] OTA update [Issue](https://github.com/toblum/McLighting/issues/92) - [x] Fix issue with websockets connection problems - [x] Switch to the [NeoPixelBus library](https://github.com/Makuna/NeoPixelBus/wiki) From 2adc6707df2185905876447dab7438c10813c703 Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Sat, 28 Sep 2019 10:00:20 +0200 Subject: [PATCH 07/28] Update README.md --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9c8f310..229ca94 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,12 @@ This project uses libraries and code by different authors: - Optional: [PubSubClient](https://github.com/knolleary/pubsubclient/) by knolleary (tested with 2.7.0) _Only when you have activated MQTT in definitions.h._ +- Optional: [Brzo I2C](https://github.com/pasko-zh/brzo_i2c/) by pazko-zh (tested with 1.3.3) + _Only when you have activated GY33 in definitions.h._ + +- Optional: [FastLed](https://github.com/FastLED/FastLED/) by FastLED (tested with 1.3.3) + _Only when you have activated custom animations (Fire2012) in definitions.h._ + The sketch also uses the following built-in library: - Ticker by [@igrr](https://github.com/igrr) @@ -74,9 +80,9 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so - [ ] Display version and parameters (Number of LEDs, definition settings, ..) in the web UI [Issue](https://github.com/toblum/McLighting/issues/150) - [ ] Support for up to ten segments - [x] Add TV, E1.31 and AUTO to CUSTOM_WS2812FX_ANIMATIONS -- [x] Save status: Added saving of status 'AUTO'. [Issue] (https://github.com/FabLab-Luenen/McLighting/issues/30) +- [x] Save status: Added saving of status 'AUTO'. [Issue](https://github.com/FabLab-Luenen/McLighting/issues/30) - [x] EXPERIMENTAL: Added transition feature on changing values of color brightness and speed. ATTENTION! Does not work proberly for all WS2812fx effects. Can be set via UI. -- [x] Added Custom Animation 'Gradient': [Issue] (https://github.com/FabLab-Luenen/McLighting/issues/25) +- [x] Added Custom Animation 'Gradient': [Issue](https://github.com/FabLab-Luenen/McLighting/issues/25) - [x] Make number of pixels, MQTT and PIN configurable via front end [Issue](https://github.com/toblum/McLighting/issues/93) and [Issue](https://github.com/toblum/McLighting/issues/101) - [x] Bundle webpages instead of SPIFFS [Issue](https://github.com/toblum/McLighting/issues/93) - [x] IR remote support [issue](https://github.com/toblum/McLightingUI/issues/3) From 341c469b49f7856c3567d4c9576c9e48ab7bd4aa Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Sun, 29 Sep 2019 13:27:37 +0200 Subject: [PATCH 08/28] V3.0.0.BETA1 * Version Bump to 3.0.0.BETA1 * further code changes * bugfixes --- .gitmodules | 6 - Arduino/McLighting/McLighting.ino | 82 +-- Arduino/McLighting/definitions.h | 15 +- .../mode_custom_ws2812fx_animations.h | 1 - Arduino/McLighting/request_handlers.h | 432 ++++++++------- Arduino/McLighting/version_info.ino | 5 +- clients/HomeAssistant/light.yaml | 7 +- clients/homebridge/config.json | 4 +- clients/newWebClient/favicon.ico | Bin 1150 -> 0 bytes clients/newWebClient/index.htm.gz | Bin 19973 -> 0 bytes clients/web(RGBW)/README.md | 4 - clients/web(RGBW)/build/index.htm | 491 ------------------ clients/web(RGBW)/gulpfile.js | 55 -- clients/web(RGBW)/package.json | 18 - clients/web(RGBW)/src/index.htm | 159 ------ clients/web(RGBW)/src/js/script.js | 331 ------------ clients/web/README.md | 4 - clients/web/apple-touch-icon.png | Bin 0 -> 4500 bytes clients/web/build/index.htm | 466 ----------------- clients/{newWebClient => web}/edit.htm | 0 clients/{newWebClient => web}/edit.htm.gz | Bin clients/web/favicon.ico | Bin 0 -> 34494 bytes clients/web/graphs.js.gz | Bin 0 -> 1971 bytes clients/web/gulpfile.js | 55 -- clients/{newWebClient => web}/index.htm | 187 +++---- clients/web/index.htm.gz | Bin 0 -> 19755 bytes clients/web/package.json | 18 - clients/web/src/index.htm | 162 ------ clients/web/src/js/script.js | 305 ----------- 29 files changed, 339 insertions(+), 2468 deletions(-) delete mode 100644 .gitmodules delete mode 100644 clients/newWebClient/favicon.ico delete mode 100644 clients/newWebClient/index.htm.gz delete mode 100644 clients/web(RGBW)/README.md delete mode 100644 clients/web(RGBW)/build/index.htm delete mode 100644 clients/web(RGBW)/gulpfile.js delete mode 100644 clients/web(RGBW)/package.json delete mode 100644 clients/web(RGBW)/src/index.htm delete mode 100644 clients/web(RGBW)/src/js/script.js delete mode 100644 clients/web/README.md create mode 100644 clients/web/apple-touch-icon.png delete mode 100644 clients/web/build/index.htm rename clients/{newWebClient => web}/edit.htm (100%) rename clients/{newWebClient => web}/edit.htm.gz (100%) create mode 100644 clients/web/favicon.ico create mode 100644 clients/web/graphs.js.gz delete mode 100644 clients/web/gulpfile.js rename clients/{newWebClient => web}/index.htm (93%) create mode 100644 clients/web/index.htm.gz delete mode 100644 clients/web/package.json delete mode 100644 clients/web/src/index.htm delete mode 100644 clients/web/src/js/script.js diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e764857..0000000 --- a/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "Arduino/McLighting/data/McLightingUI"] - path = Arduino/McLighting/data/McLightingUI - url = https://github.com/toblum/McLightingUI -[submodule "clients/web/McLightingUI"] - path = clients/web/McLightingUI - url = https://github.com/toblum/McLightingUI diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino index 8a962cb..13e245e 100644 --- a/Arduino/McLighting/McLighting.ino +++ b/Arduino/McLighting/McLighting.ino @@ -671,8 +671,6 @@ void setup() { #if defined(ENABLE_REMOTE) irrecv.enableIRIn(); // Start the receiver #endif - snprintf(last_state, sizeof(last_state), "STA|%2d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d", mode, ws2812fx_mode, ws2812fx_speed, brightness, main_color.red, main_color.green, main_color.blue, main_color.white, back_color.red, back_color.green, back_color.blue, back_color.white, xtra_color.red, xtra_color.green, xtra_color.blue,xtra_color.white); - last_state[sizeof(last_state)]= 0x00; ws2812fx_speed_actual = ws2812fx_speed; brightness_trans = brightness; memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); @@ -777,48 +775,43 @@ void loop() { if (mode == SET) { mode = HOLD; + // Mode if (ws2812fx_mode != strip->getMode(selected_segment)) { // SET_MODE - #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", ws2812fx_mode); - #endif + #if defined(ENABLE_MQTT) + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", ws2812fx_mode); + #endif strip->strip_off(); autoCount = 0; autoDelay = 0; strip->setMode(selected_segment, ws2812fx_mode); } + //Color + /*if (memcmp(hex_colors_trans, strip->getColors(selected_segment), sizeof(hex_colors_trans)) != 0) { + + }*/ + // Brightness if (strip->getBrightness() != brightness) { #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %%%i", brightness); #endif brightness_trans = brightness; } + // Speed + if (ws2812fx_speed_actual != ws2812fx_speed) { + #if defined(ENABLE_MQTT) + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK ?%i", ws2812fx_speed); + #endif + } prevmode = SET; strip->trigger(); } - - /*if (mode == SET) { - mode = HOLD; - if (trans_cnt==0) { trans_cnt=1; } - if (!transEffect) { trans_cnt=255; } - convertColorsFade(); - prevmode = SET; - }*/ - - if (mode == SET_SPEED) { - #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK ?%i", ws2812fx_speed); - #endif - mode = prevmode; - prevmode = SET_SPEED; - } if (prevmode != mode) { convertColors(); if (memcmp(hex_colors_trans, strip->getColors(selected_segment), sizeof(hex_colors_trans)) != 0) { DBG_OUTPUT_PORT.println("Colors not equal!"); - if (trans_cnt==0) { trans_cnt=1; } - if (!transEffect) { trans_cnt=255; } convertColorsFade(); + trans_cnt = 1; } strip->setSpeed(selected_segment, convertSpeed(ws2812fx_speed_actual)); //strip->setBrightness(brightness_actual); @@ -873,7 +866,7 @@ void loop() { } #endif - if ((mode == HOLD) || ((mode == OFF) && ((strip->getBrightness() == 0) || !transEffect))) { + if ((mode == HOLD) || ((mode == OFF) && (strip->getBrightness() > 0) && transEffect)) { if (ws2812fx_mode == FX_MODE_CUSTOM_0) { handleAutoPlay(); } @@ -882,26 +875,33 @@ void loop() { } // Async color transition - if ((trans_cnt > 0) && (trans_cnt < 255)) { - uint32_t hex_colors_actual[3] = {}; - if ((transEffect) && (colorFadeDelay <= millis())) { - hex_colors_actual[0] = trans(hex_colors_trans[0], hex_colors[0], trans_cnt); - hex_colors_actual[1] = trans(hex_colors_trans[1], hex_colors[1], trans_cnt); - hex_colors_actual[2] = trans(hex_colors_trans[2], hex_colors[2], trans_cnt); - strip->setColors(selected_segment, hex_colors_actual); - trans_cnt++; - colorFadeDelay = millis() + TRANS_COLOR_DELAY; + if (memcmp(hex_colors_trans, strip->getColors(selected_segment), sizeof(hex_colors_trans)) != 0) { + if (transEffect) { + if ((trans_cnt > 0) && (trans_cnt < trans_cnt_max)) { + if (colorFadeDelay <= millis()) { + uint32_t hex_colors_actual[3] = {}; + hex_colors_actual[0] = trans(hex_colors_trans[0], hex_colors[0], trans_cnt); + hex_colors_actual[1] = trans(hex_colors_trans[1], hex_colors[1], trans_cnt); + hex_colors_actual[2] = trans(hex_colors_trans[2], hex_colors[2], trans_cnt); + strip->setColors(selected_segment, hex_colors_actual); + trans_cnt++; + colorFadeDelay = millis() + TRANS_COLOR_DELAY; + if (mode == HOLD) strip->trigger(); + } + } else if (trans_cnt >= trans_cnt_max) { + memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); + strip->setColors(selected_segment, hex_colors); + if (mode == HOLD) strip->trigger(); + trans_cnt = 0; + DBG_OUTPUT_PORT.println("Color transition finished!"); + } + } else { + memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); + strip->setColors(selected_segment, hex_colors); if (mode == HOLD) strip->trigger(); + trans_cnt = 0; } } - if (trans_cnt > 254) { - memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); - strip->setColors(selected_segment, hex_colors); - if (mode == HOLD) strip->trigger(); - trans_cnt = 0; - DBG_OUTPUT_PORT.println("Color transition finished!"); - } - // Async speed transition if (ws2812fx_speed_actual != ws2812fx_speed) { if (transEffect) { diff --git a/Arduino/McLighting/definitions.h b/Arduino/McLighting/definitions.h index 6ef1856..9ad718a 100644 --- a/Arduino/McLighting/definitions.h +++ b/Arduino/McLighting/definitions.h @@ -21,11 +21,11 @@ char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just #define ENABLE_HOMEASSISTANT // If defined, enable Homeassistant integration, ENABLE_MQTT must be active #define MQTT_HOME_ASSISTANT_SUPPORT // If defined, use AMQTT and select Tools -> IwIP Variant -> Higher Bandwidth #define ENABLE_BUTTON 14 // If defined, enable button handling code, see: https://github.com/toblum/McLighting/wiki/Button-control, the value defines the input pin (14 / D5) for switching the LED strip on / off, connect this PIN to ground to trigger button. -#define ENABLE_BUTTON_GY33 12 // If defined, enable button handling code for GY-33 color sensor to scan color. The value defines the input pin (12 / D6) for read color data with RGB sensor, connect this PIN to ground to trigger button. +//#define ENABLE_BUTTON_GY33 12 // If defined, enable button handling code for GY-33 color sensor to scan color. The value defines the input pin (12 / D6) for read color data with RGB sensor, connect this PIN to ground to trigger button. #if defined(ENABLE_BUTTON_GY33) #define GAMMA 2.5 // Gamma correction for GY-33 sensor #endif -//#define ENABLE_REMOTE 13 // If defined, enable Remote Control via TSOP31238. The value defines the input pin (13 / D7) for TSOP31238 Out +#define ENABLE_REMOTE 13 // If defined, enable Remote Control via TSOP31238. The value defines the input pin (13 / D7) for TSOP31238 Out #define ENABLE_STATE_SAVE 1 // If defined, load saved state on reboot and save state. If set to 0 from EEPROM, if set to 1 from SPIFFS @@ -35,12 +35,13 @@ char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just #define TRANS_COLOR_DELAY 5 // Delay for color transition #define TRANS_DELAY 10 // Delay for brightness and speed transition -bool transEffect = false; // Experimental: Enable transitions of color, brightness and speed. It does not work properly for all effects. +bool transEffect = false; // Experimental: Enable transitions of color, brightness and speed. It does not work properly for all effects. bool transEffectOverride = false; -uint8_t trans_cnt = 0; -unsigned long colorFadeDelay = 0; +uint8_t trans_cnt = 0; +int trans_cnt_max = 0; +unsigned long colorFadeDelay = 0; unsigned long brightnessFadeDelay = 0; -unsigned long speedFadeDelay = 0; +unsigned long speedFadeDelay = 0; #if defined(CUSTOM_WS2812FX_ANIMATIONS) #define MULTICAST false @@ -140,7 +141,7 @@ uint32_t autoParams[][6] = { // main_color, back_color, xtra_color, speed, mod #define DBG_OUTPUT_PORT Serial // Set debug output port // List of all color modes -enum MODE {OFF, HOLD, SET, SET_SPEED, INIT_STRIP}; +enum MODE {OFF, HOLD, SET, INIT_STRIP}; MODE mode = SET; // Standard mode that is active when software starts MODE prevmode = HOLD; // Do not change diff --git a/Arduino/McLighting/mode_custom_ws2812fx_animations.h b/Arduino/McLighting/mode_custom_ws2812fx_animations.h index 8b345aa..a851d82 100644 --- a/Arduino/McLighting/mode_custom_ws2812fx_animations.h +++ b/Arduino/McLighting/mode_custom_ws2812fx_animations.h @@ -150,7 +150,6 @@ void handleE131(){ } } - #include //https://github.com/FastLED/FastLED /* * paste in the Fire2012 code with a small edit at the end which uses the diff --git a/Arduino/McLighting/request_handlers.h b/Arduino/McLighting/request_handlers.h index 95bcc98..9e73264 100644 --- a/Arduino/McLighting/request_handlers.h +++ b/Arduino/McLighting/request_handlers.h @@ -17,38 +17,33 @@ void convertColors() { hex_colors_trans[2] = (uint32_t)(xtra_color.white << 24) | (xtra_color.red << 16) | (xtra_color.green << 8) | xtra_color.blue; } -void convertColorsFade() { - if ((transEffect) && (trans_cnt > 1) && (trans_cnt < 254)) { - memcpy(hex_colors, strip->getColors(selected_segment), sizeof(strip->getColors(selected_segment))); - DBG_OUTPUT_PORT.println("Color transistion aborted. Restarting...!"); - trans_cnt = 1; - } else { - //memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); - } -} - -uint8_t calculateColorTransitionSteps () { +void calculateColorTransitionSteps() { //compare all colors and calculate steps - int trans_cnt_max = 0; + trans_cnt_max = 0; int calculate_max[4] = {}; for (uint8_t i=0; i<3; i++){ - DBG_OUTPUT_PORT.printf("i: %i\r\n", i); for (uint8_t j=0; j<4; j++) { - DBG_OUTPUT_PORT.printf("j: %i\r\n", j); calculate_max[j] = ((hex_colors[i] >> ((3-j)*8)) & 0xFF) - ((hex_colors_trans[i] >> ((3-j)*8)) & 0xFF); calculate_max[j] = abs(calculate_max[j]); trans_cnt_max = max(trans_cnt_max, calculate_max[j]); - DBG_OUTPUT_PORT.printf("calcmax: %i %i\r\n", j, calculate_max[j]); } } - DBG_OUTPUT_PORT.printf("max: %i\r\n", trans_cnt_max); - return trans_cnt_max; } - +void convertColorsFade() { + if (transEffect) { + if (trans_cnt > 1) { + memcpy(hex_colors, strip->getColors(selected_segment), sizeof(hex_colors)); + DBG_OUTPUT_PORT.println("Color transistion aborted. Restarting...!"); + trans_cnt = 1; + } + calculateColorTransitionSteps(); + } +} void getArgs() { if (mode == SET) { + //color wrgb if (server.arg("rgb") != "") { uint32_t rgb = (uint32_t) strtoul(server.arg("rgb").c_str(), NULL, 16); main_color.white = ((rgb >> 24) & 0xFF); @@ -121,17 +116,16 @@ void getArgs() { xtra_color.green = constrain(xtra_color.green, 0, 255); xtra_color.blue = constrain(xtra_color.blue, 0, 255); xtra_color.white = constrain(xtra_color.white, 0, 255); - } - if (mode == SET || mode == SET_SPEED) { + // Speed if ((server.arg("s") != "") && (server.arg("s").toInt() >= 0) && (server.arg("s").toInt() <= 255)) { - ws2812fx_speed = constrain(server.arg("s").toInt(), 0, 255); + ws2812fx_speed = constrain(server.arg("s").toInt(), 0, 255); } - } - if (mode == SET) { + //Mode if ((server.arg("m") != "") && (server.arg("m").toInt() >= 0) && (server.arg("m").toInt() <= strip->getModeCount())) { ws2812fx_mode = constrain(server.arg("m").toInt(), 0, strip->getModeCount() - 1); } - if ((server.arg("c") != "") && (server.arg("c").toInt() >= 0) && (server.arg("c").toInt() <= 100)) { + // Brightness + if ((server.arg("c") != "") && (server.arg("c").toInt() >= 0) && (server.arg("c").toInt() <= 100)) { brightness = constrain((int) server.arg("c").toInt() * 2.55, 0, 255); } else if ((server.arg("p") != "") && (server.arg("p").toInt() >= 0) && (server.arg("p").toInt() <= 255)) { brightness = constrain(server.arg("p").toInt(), 0, 255); @@ -204,9 +198,9 @@ void handleSetAllMode(uint8_t * mypayload) { void handleSetSingleLED(uint8_t * mypayload, uint8_t firstChar = 0) { // decode led index - char templed[3]; - strncpy (templed, (const char *) &mypayload[firstChar], 2 ); - templed[2] = 0x00; + char templed[5]; + strncpy (templed, (const char *) &mypayload[firstChar], 4 ); + templed[4] = 0x00; uint8_t led = atoi(templed); DBG_OUTPUT_PORT.printf("led value: [%i]. Entry threshold: <= [%i] (=> %s)\r\n", led, WS2812FXStripSettings.stripSize, mypayload ); @@ -215,10 +209,10 @@ void handleSetSingleLED(uint8_t * mypayload, uint8_t firstChar = 0) { char greenhex[3]; char bluehex[3]; char whitehex[3]; - strncpy (whitehex, (const char *) &mypayload[2 + firstChar], 2 ); - strncpy (redhex, (const char *) &mypayload[4 + firstChar], 2 ); - strncpy (greenhex, (const char *) &mypayload[6 + firstChar], 2 ); - strncpy (bluehex, (const char *) &mypayload[8 + firstChar], 2 ); + strncpy (whitehex, (const char *) &mypayload[4 + firstChar], 2 ); + strncpy (redhex, (const char *) &mypayload[6 + firstChar], 2 ); + strncpy (greenhex, (const char *) &mypayload[8 + firstChar], 2 ); + strncpy (bluehex, (const char *) &mypayload[10 + firstChar], 2 ); whitehex[2] = 0x00; redhex[2] = 0x00; greenhex[2] = 0x00; @@ -260,26 +254,26 @@ void handleSetDifferentColors(uint8_t * mypayload) { void handleRangeDifferentColors(uint8_t * mypayload) { uint8_t* nextCommand = 0; nextCommand = (uint8_t*) strtok((char*) mypayload, "R"); - // While there is a range to process R0110<00ff00> + // While there is a range to process R00010010<0000ff00> while (nextCommand) { // Loop for each LED. - char startled[4]; - char endled[4]; + char startled[5]; + char endled[5]; char colorval[9]; - strncpy ( startled, (const char *) &nextCommand[0], 2 ); - startled[3] = 0x00; - strncpy ( endled, (const char *) &nextCommand[2], 2 ); - endled[3] = 0x00; - strncpy ( colorval, (const char *) &nextCommand[4], 8 ); + strncpy ( startled, (const char *) &nextCommand[0], 4 ); + startled[4] = 0x00; + strncpy ( endled, (const char *) &nextCommand[4], 4 ); + endled[4] = 0x00; + strncpy ( colorval, (const char *) &nextCommand[8], 8 ); colorval[8] = 0x00; uint8_t rangebegin = atoi(startled); uint8_t rangeend = atoi(endled); DBG_OUTPUT_PORT.printf("Setting RANGE from [%i] to [%i] as color [%s]\r\n", rangebegin, rangeend, colorval); while ( rangebegin <= rangeend ) { - char rangeData[11]; - snprintf(rangeData, sizeof(rangeData), "%02d%s", rangebegin, colorval); + char rangeData[18]; + snprintf(rangeData, sizeof(rangeData), "%04d%s", rangebegin, colorval); rangeData[sizeof(rangeData) - 1] = 0x00; // Set one LED handleSetSingleLED((uint8_t*) rangeData, 0); @@ -472,6 +466,9 @@ void handleSetWS2812FXMode(uint8_t * mypayload) { if (strcmp((char *) &mypayload[1], "off") == 0) { mode = OFF; } + if (strcmp((char *) &mypayload[1], "on") == 0) { + mode = HOLD; + } } } @@ -646,7 +643,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { if (payload[0] == '?') { uint8_t d = (uint8_t) strtol((const char *) &payload[1], NULL, 10); ws2812fx_speed = constrain(d, 0, 255); - mode = SET_SPEED; + mode = SET; Dbg_Prefix(mqtt, num); DBG_OUTPUT_PORT.printf("Set speed to: [%u]\r\n", ws2812fx_speed); } @@ -1059,7 +1056,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght uint8_t json_speed = constrain((uint8_t) root["speed"], 0, 255); if (json_speed != ws2812fx_speed) { ws2812fx_speed = json_speed; - mode = SET_SPEED; + mode = SET; } } @@ -1663,7 +1660,7 @@ void handleRemote() { mode = OFF; } } - if ((mode != AUTO) && (mode != OFF)) { + if (mode == HOLD) { if (results.value == rmt_commands[BRIGHTNESS_UP]) { //Brightness Up last_remote_cmd = results.value; if (brightness + chng <= 255) { @@ -1678,204 +1675,204 @@ void handleRemote() { mode = SET; } } - } - if ((mode !=AUTO) && (mode != OFF)) { - if (results.value == rmt_commands[SPEED_UP]) { //Speed Up - last_remote_cmd = results.value; - if (ws2812fx_speed + chng <= 255) { - ws2812fx_speed = ws2812fx_speed + chng; - mode = SET_SPEED; - } - } - if (results.value == rmt_commands[SPEED_DOWN]) { //Speed down - last_remote_cmd = results.value; - if (ws2812fx_speed - chng >= 0) { - ws2812fx_speed = ws2812fx_speed - chng; - mode = SET_SPEED; - } - } - } - if (mode == HOLD) { - if (results.value == rmt_commands[RED_UP]) { //Red Up - last_remote_cmd = results.value; - if (selected_color == 1) { - if (main_color.red + chng <= 255) { - main_color.red = main_color.red + chng; + if ((ws2812fx_mode < 56) || (ws2812fx_mode > 57)) { + if (results.value == rmt_commands[SPEED_UP]) { //Speed Up + last_remote_cmd = results.value; + if (ws2812fx_speed + chng <= 255) { + ws2812fx_speed = ws2812fx_speed + chng; mode = SET; } } - if (selected_color == 2) { - if (back_color.red + chng <= 255) { - back_color.red = back_color.red + chng; - mode = SET; - } - } - if (selected_color == 3) { - if (xtra_color.red + chng <= 255) { - xtra_color.red = xtra_color.red + chng; + if (results.value == rmt_commands[SPEED_DOWN]) { //Speed down + last_remote_cmd = results.value; + if (ws2812fx_speed - chng >= 0) { + ws2812fx_speed = ws2812fx_speed - chng; mode = SET; } } } - if (results.value == rmt_commands[RED_DOWN]) { //Red down - last_remote_cmd = results.value; - if (selected_color == 1) { - if (main_color.red - chng >= 0) { - main_color.red = main_color.red - chng; - mode = SET; + if ((ws2812fx_mode < 56) || (ws2812fx_mode > 60)) { + if (results.value == rmt_commands[RED_UP]) { //Red Up + last_remote_cmd = results.value; + if (selected_color == 1) { + if (main_color.red + chng <= 255) { + main_color.red = main_color.red + chng; + mode = SET; + } + } + if (selected_color == 2) { + if (back_color.red + chng <= 255) { + back_color.red = back_color.red + chng; + mode = SET; + } + } + if (selected_color == 3) { + if (xtra_color.red + chng <= 255) { + xtra_color.red = xtra_color.red + chng; + mode = SET; + } } } - if (selected_color == 2) { - if (back_color.red - chng >= 0) { - back_color.red = back_color.red - chng; - mode = SET; + if (results.value == rmt_commands[RED_DOWN]) { //Red down + last_remote_cmd = results.value; + if (selected_color == 1) { + if (main_color.red - chng >= 0) { + main_color.red = main_color.red - chng; + mode = SET; + } + } + if (selected_color == 2) { + if (back_color.red - chng >= 0) { + back_color.red = back_color.red - chng; + mode = SET; + } + } + if (selected_color == 3) { + if (xtra_color.red - chng >= 0) { + xtra_color.red = xtra_color.red - chng; + mode = SET; + } } } - if (selected_color == 3) { - if (xtra_color.red - chng >= 0) { - xtra_color.red = xtra_color.red - chng; - mode = SET; + if (results.value == rmt_commands[GREEN_UP]) { //Green Up + last_remote_cmd = results.value; + if (selected_color == 1) { + if (main_color.green + chng <= 255) { + main_color.green = main_color.green + chng; + mode = SET; + } + } + if (selected_color == 2) { + if (back_color.green + chng <= 255) { + back_color.green = back_color.green + chng; + mode = SET; + } + } + if (selected_color == 3) { + if (xtra_color.green + chng <= 255) { + xtra_color.green = xtra_color.green + chng; + mode = SET; + } } } - } - if (results.value == rmt_commands[GREEN_UP]) { //Green Up - last_remote_cmd = results.value; - if (selected_color == 1) { - if (main_color.green + chng <= 255) { - main_color.green = main_color.green + chng; - mode = SET; + if (results.value == rmt_commands[GREEN_DOWN]) { //Green down + last_remote_cmd = results.value; + if (selected_color == 1) { + if (main_color.green - chng >= 0) { + main_color.green = main_color.green - chng;; + mode = SET; + } + } + if (selected_color == 2) { + if (back_color.green - chng >= 0) { + back_color.green = back_color.green - chng; + mode = SET; + } + } + if (selected_color == 3) { + if (xtra_color.green - chng >= 0) { + xtra_color.green = xtra_color.green - chng; + mode = SET; + } } } - if (selected_color == 2) { - if (back_color.green + chng <= 255) { - back_color.green = back_color.green + chng; - mode = SET; + if (results.value == rmt_commands[BLUE_UP]) { //Blue Up + last_remote_cmd = results.value; + if (selected_color == 1) { + if (main_color.blue + chng <= 255) { + main_color.blue = main_color.blue + chng; + mode = SET; + } + } + if (selected_color == 2) { + if (back_color.blue + chng <= 255) { + back_color.blue = back_color.blue + chng; + mode = SET; + } + } + if (selected_color == 3) { + if (xtra_color.blue + chng <= 255) { + xtra_color.blue = xtra_color.blue + chng; + mode = SET; + } } } - if (selected_color == 3) { - if (xtra_color.green + chng <= 255) { - xtra_color.green = xtra_color.green + chng; - mode = SET; + if (results.value == rmt_commands[BLUE_DOWN]) { //Blue down + last_remote_cmd = results.value; + if (selected_color == 1) { + if (main_color.blue - chng >= 0) { + main_color.blue = main_color.blue - chng; + mode = SET; + } + } + if (selected_color == 2) { + if (back_color.blue - chng >= 0) { + back_color.blue = back_color.blue - chng; + mode = SET; + } + } + if (selected_color == 3) { + if (xtra_color.blue - chng >= 0) { + xtra_color.blue = xtra_color.blue - chng; + mode = SET; + } } } - } - if (results.value == rmt_commands[GREEN_DOWN]) { //green down - last_remote_cmd = results.value; - if (selected_color == 1) { - if (main_color.green - chng >= 0) { - main_color.green = main_color.green - chng;; - mode = SET; + if (results.value == rmt_commands[WHITE_UP]) { //White Up + last_remote_cmd = results.value; + if (selected_color == 1) { + if (main_color.white + chng <= 255) { + main_color.white = main_color.white + chng; + mode = SET; + } + } + if (selected_color == 2) { + if (back_color.white + chng <= 255) { + back_color.white = back_color.white + chng; + mode = SET; + } + } + if (selected_color == 3) { + if (xtra_color.white + chng <= 255) { + xtra_color.white = xtra_color.white + chng; + mode = SET; + } } } - if (selected_color == 2) { - if (back_color.green - chng >= 0) { - back_color.green = back_color.green - chng; - mode = SET; + if (results.value == rmt_commands[WHITE_DOWN]) { //White down + last_remote_cmd = results.value; + if (selected_color == 1) { + if (main_color.white - chng >= 0) { + main_color.white = main_color.white - chng; + mode = SET; + } + } + if (selected_color == 2) { + if (back_color.white - chng >= 0) { + back_color.white = back_color.white - chng; + mode = SET; + } + } + if (selected_color == 3) { + if (xtra_color.white - chng >= 0) { + xtra_color.white = xtra_color.white - chng; + mode = SET; + } } } - if (selected_color == 3) { - if (xtra_color.green - chng >= 0) { - xtra_color.green = xtra_color.green - chng; - mode = SET; - } + if (results.value == rmt_commands[COL_M]) { // Select Main Color + last_remote_cmd = 0; + selected_color = 1; + } + if (results.value == rmt_commands[COL_B]) { // Select Back Color + last_remote_cmd = 0; + selected_color = 2; + } + if (results.value == rmt_commands[COL_X]) { // Select Extra Color + last_remote_cmd = 0; + selected_color = 3; } } - if (results.value == rmt_commands[BLUE_UP]) { //Blue Up - last_remote_cmd = results.value; - if (selected_color == 1) { - if (main_color.blue + chng <= 255) { - main_color.blue = main_color.blue + chng; - mode = SET; - } - } - if (selected_color == 2) { - if (back_color.blue + chng <= 255) { - back_color.blue = back_color.blue + chng; - mode = SET; - } - } - if (selected_color == 3) { - if (xtra_color.blue + chng <= 255) { - xtra_color.blue = xtra_color.blue + chng; - mode = SET; - } - } - } - if (results.value == rmt_commands[BLUE_DOWN]) { //BLUE down - last_remote_cmd = results.value; - if (selected_color == 1) { - if (main_color.blue - chng >= 0) { - main_color.blue = main_color.blue - chng; - mode = SET; - } - } - if (selected_color == 2) { - if (back_color.blue - chng >= 0) { - back_color.blue = back_color.blue - chng; - mode = SET; - } - } - if (selected_color == 3) { - if (xtra_color.blue - chng >= 0) { - xtra_color.blue = xtra_color.blue - chng; - mode = SET; - } - } - } - if (results.value == rmt_commands[WHITE_UP]) { //White Up - last_remote_cmd = results.value; - if (selected_color == 1) { - if (main_color.white + chng <= 255) { - main_color.white = main_color.white + chng; - mode = SET; - } - } - if (selected_color == 2) { - if (back_color.white + chng <= 255) { - back_color.white = back_color.white + chng; - mode = SET; - } - } - if (selected_color == 3) { - if (xtra_color.white + chng <= 255) { - xtra_color.white = xtra_color.white + chng; - mode = SET; - } - } - } - if (results.value == rmt_commands[WHITE_DOWN]) { //White down - last_remote_cmd = results.value; - if (selected_color == 1) { - if (main_color.white - chng >= 0) { - main_color.white = main_color.white - chng; - mode = SET; - } - } - if (selected_color == 2) { - if (back_color.white - chng >= 0) { - back_color.white = back_color.white - chng; - mode = SET; - } - } - if (selected_color == 3) { - if (xtra_color.white - chng >= 0) { - xtra_color.white = xtra_color.white - chng; - mode = SET; - } - } - } - if (results.value == rmt_commands[COL_M]) { // Select Main Color - last_remote_cmd = 0; - selected_color = 1; - } - if (results.value == rmt_commands[COL_B]) { // Select Back Color - last_remote_cmd = 0; - selected_color = 2; - } - if (results.value == rmt_commands[COL_X]) { // Select Extra Color - last_remote_cmd = 0; - selected_color = 3; - } } // end of if HOLD if (results.value == rmt_commands[MODE_UP]) { //Mode Up last_remote_cmd = results.value; @@ -1937,6 +1934,7 @@ uint32_t scale_wrgb(uint32_t wrgb, uint8_t level) { } uint32_t trans(uint32_t newcolor, uint32_t oldcolor, uint8_t level) { + level = (level * (255/trans_cnt_max)); newcolor = scale_wrgb(newcolor, level); oldcolor = scale_wrgb(oldcolor, 255-level); return newcolor + oldcolor; diff --git a/Arduino/McLighting/version_info.ino b/Arduino/McLighting/version_info.ino index 1bee4b4..cd572df 100644 --- a/Arduino/McLighting/version_info.ino +++ b/Arduino/McLighting/version_info.ino @@ -172,7 +172,7 @@ * adressed issue: https://github.com/toblum/McLighting/issues/403 (Experimental Support of transitions: set transEffect = true in definitions.h) * corrected use of DMA for Neopixelbus by Makuna (Tests for other strips than SK6812 GRBW were not made) * - * 27 September 2019 + * 27 September 2019 * Version Bump to 3.0.0.ALPHA1 * removed LEGACY_ANIMATIONS * removed old Custom Animations from beginning of list. @@ -184,4 +184,7 @@ * moved Custom Animation 'Gradients' to number 61 * REST-API changes (will be documented soon) * + * 29 September 2019 + * Version Bump to 3.0.0.BETA1 + * further code changes */ diff --git a/clients/HomeAssistant/light.yaml b/clients/HomeAssistant/light.yaml index 72543f1..061f4a7 100644 --- a/clients/HomeAssistant/light.yaml +++ b/clients/HomeAssistant/light.yaml @@ -64,7 +64,12 @@ light: - "Bicolor Chase" - "Tricolor Chase" - "ICU" - - "E131" + - "AutoPlay" + - "Custom WS" + - "TV" + - "E1.31" + - "Fire(2012)" + - "Gradient" brightness: true color_temp: true rgb: true diff --git a/clients/homebridge/config.json b/clients/homebridge/config.json index 239959b..7adf230 100644 --- a/clients/homebridge/config.json +++ b/clients/homebridge/config.json @@ -22,12 +22,12 @@ "brightness": { "status": "http:///get_brightness", - "url": "http:///set_brightness?c=%s" + "url": "http:///set?c=%s" }, "color": { "status": "http:///get_color", - "url": "http:///all?rgb=%s", + "url": "http:///set?m=0?rgb=%s", "brightness": true } } diff --git a/clients/newWebClient/favicon.ico b/clients/newWebClient/favicon.ico deleted file mode 100644 index 12e9deac79f3905e145ebb882854ba06f85357d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmah|ZAep57=Cu|w(I6tx>><$HVY}7N?+ur&KZ{|tthOBW%OYzg$hZ?=ts?xK9&?2 z&Y+Bj)sL>!k3Jxx59j^_5w#x~^mU^|s2QY!LV0~VcS|zu<6NF|InQ~Y_q^wQ-vema zmzD-LJ5ZwqrU978z$nHfdG-U?o;5Xz#CqbS*Q<;Pxj7uxH5q0d17LZ zPuNUUs%s7BoaxdY+Ae7yUF*}lf2%<5Cp=_0)uUiTqz~B*5`;XLYCF+^uE17dY}+gw zKV2m~y&&!z(|sHyJYZ-ZA#5YUq5;B`4jJ%PjOh&}7U;54-04kAWb3QlWd7Vt!jlU_ zTuU&D+WHWD469nBD2xrk&in}9iRU|Ho_D&n+BK>hQ^wXb$#E~AW;`t;^TpM@yqM=_ zeEQfKEZTIWF86EncX|aup^S_HvRDpFs@9kZaqdYWo`2s;v)b&#DTNkQJL!HZ$MfZW zyFE5sR7B+QMB-MfQ?xBbprjp2>1_?o-o;0mnS~Q3%Q?=dhGX%1TceGQqZADGC>~E` zz_}jbO*cWlTcDhc2&qQ@8dX*Gp;&B?y1VDC=2YWoAP>e*A4A>>0&G>E-J zckzU}xPCe&Nb+p0)9uwK`X_POk_D(ZR}DF`8+30i=yERTv>6oCq)`hBsU3UhD%$8E z&d3YK_3yY$X|kunwS7LMqYKe@ItxmZ33NhZqDJH>`ylqMgD5%R_~ZLg{b-YIW3n3{ zx>6BXszbOGy6|F{12&ivxzd6gcO>w23ed>|4NR*-9egJsy#F04r;af@RikQu0B{>1 A)c^nh diff --git a/clients/newWebClient/index.htm.gz b/clients/newWebClient/index.htm.gz deleted file mode 100644 index 951285306aff190abefe75b74be775b34cbc417c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19973 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 - - - - - - - - - - - - - McLighting (RGBW) v2 - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Error on websocket connect.
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
pick a color
-
-
-
-
-
Auto:
- -
-
-
-
-
- -
-
-
-
-
-
-
-

-
-
-
-

-
-
-
-

-
-
- -
-
-
-

-
-
- -
-
-
-

-
-
- -
-
-
-

-
-
-
-
- -
-
-
- Loading animations... -
-
-
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/clients/web(RGBW)/gulpfile.js b/clients/web(RGBW)/gulpfile.js deleted file mode 100644 index cb2773a..0000000 --- a/clients/web(RGBW)/gulpfile.js +++ /dev/null @@ -1,55 +0,0 @@ -var gulp = require('gulp'), - request = require('request'), - fs = require('fs'), - connect = require('gulp-connect'), - fileinclude = require('gulp-file-include'); - -var src_dir = "src/"; -var build_dir = "build/"; - - -gulp.task('html', function() { - gulp.src(src_dir + '*.htm') - .pipe(fileinclude({ - prefix: '@@', - basepath: '@file' - })) - .pipe(gulp.dest('build')) - .pipe(connect.reload()); -}); - - -gulp.task('connect', function() { - connect.server({ - root: 'build', - livereload: true - }); -}); - -gulp.task('watch', function() { - gulp.watch(src_dir + '*.htm', ['html']); - gulp.watch(src_dir + 'js/*.js', ['html']); -}); - - -gulp.task('upload', ['html'], function() { - var url = 'http://192.168.0.49/edit'; - var options = { - url: url, - headers: { - 'Content-Type': 'multipart/form-data' - } - }; - - var r = request.post(options, function optionalCallback(err, httpResponse, body) { - if (err) { - return console.error('upload failed:', err); - } - console.log('Upload successful! Server responded with:', body); - }); - var form = r.form(); - form.append('data', fs.createReadStream(__dirname + "/" + build_dir + '/index.htm'), {filename: '/index.htm', contentType: "application/octet-stream"}); -}); - -gulp.task('default', ['html']); -gulp.task('serve', ['watch', 'connect']); \ No newline at end of file diff --git a/clients/web(RGBW)/package.json b/clients/web(RGBW)/package.json deleted file mode 100644 index 98632aa..0000000 --- a/clients/web(RGBW)/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "mc_lighting", - "version": "2.0.0", - "description": "Web client for Mc Lighting", - "main": "index.html", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "Tobias Blum", - "license": "MIT", - "dependencies": { - "fs": "0.0.2", - "gulp": "^3.9.1", - "gulp-connect": "^5.0.0", - "gulp-file-include": "^1.0.0", - "request": "^2.72.0" - } -} diff --git a/clients/web(RGBW)/src/index.htm b/clients/web(RGBW)/src/index.htm deleted file mode 100644 index b5e1645..0000000 --- a/clients/web(RGBW)/src/index.htm +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - McLighting (RGBW) v2 - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Error on websocket connect.
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
pick a color
-
-
-
-
-
Auto:
- -
-
-
-
-
- -
-
-
-
-
-
-
-

-
-
-
-

-
-
-
-

-
-
- -
-
-
-

-
-
- -
-
-
-

-
-
- -
-
-
-

-
-
-
-
- -
-
-
- Loading animations... -
-
-
-
-
- - - - - - - - - - - \ No newline at end of file - \ No newline at end of file diff --git a/clients/web(RGBW)/src/js/script.js b/clients/web(RGBW)/src/js/script.js deleted file mode 100644 index 4f62d27..0000000 --- a/clients/web(RGBW)/src/js/script.js +++ /dev/null @@ -1,331 +0,0 @@ -(function($){ -$(function(){ - - // Settings - var host = window.location.hostname; - //host = "esp8266_02.local"; - - var ws_url = 'ws://' + host + ':81'; - var connection; - var ws_waiting = 0; - - // ****************************************************************** - // Side navigation - // ****************************************************************** - $('.button-collapse').sideNav(); - - // Navlinks - $('#mc-nav').on('click', '.mc-navlink', function(){ - console.log("Navigate to pane: ", $(this).data("pane")); - showPane($(this).data("pane")); - }); - - function showPane(pane) { - $('.mc_pane').addClass('hide'); - $('#' + pane).removeClass('hide'); - $('.button-collapse').sideNav('hide'); - - //if (pane == "pane2") { - // setMainColor(); - //} - } - - - // ****************************************************************** - // init() - // ****************************************************************** - function init() { - console.log("Connection websockets to:", ws_url); - connection = new WebSocket(ws_url, ['arduino']); - var mode = 0; - var ws2812fx_mode = 0; - $.getJSON("http://" + host + "/status", function(data) { - console.log("status", data); - mode = data.mode; - ws2812fx_mode = data.ws2812fx_mode; - $("#rng_delay").val(data.speed); - $("#rng_brightness").val(data.brightness); - $("#rng_white").val(data.color[0]); - $("#rng_red").val(data.color[1]); - $("#rng_green").val(data.color[2]); - $("#rng_blue").val(data.color[3]); - var statusColor = "#" + componentToHex(data.color[1]) + componentToHex(data.color[2]) + componentToHex(data.color[3]); - $('#status').css("backgroundColor", statusColor); - $('#status_color').text(statusColor + "- R=" + data.color[1] + ", G=" + data.color[2] + ", B=" + data.color[3]); - }); - - // Load modes async - // List of all color modes - // enum MODE {OFF, AUTO, TV, E131, SET_MODE, HOLD, CUSTOM, SETCOLOR, SETSPEED, BRIGHTNESS, WIPE, RAINBOW, RAINBOWCYCLE, THEATERCHASE, TWINKLERANDOM, THEATERCHASERAINBOW}; - $.getJSON("http://" + host + "/get_modes", function(data) { - console.log("modes", data); - var modes_html = ""; - data.forEach(function(current_mode){ - if (current_mode.mode !== undefined) { - modes_html += '
'; - if ((mode == "5" && current_mode.mode == ws2812fx_mode) || (mode == "0" && current_mode.mode == "off") || (mode == "2" && current_mode.mode == "tv") || (mode == "3" && current_mode.mode == "e131")){ - modes_html += '(' + current_mode.mode +') '+ current_mode.name; - } else { - modes_html += '(' + current_mode.mode +') '+ current_mode.name; - } - modes_html += 'send'; - modes_html += ''; - modes_html += '
'; - } - }); - - $('#modes').html(modes_html); - }); - // When the connection is open, send some data to the server - connection.onopen = function () { - //connection.send('Ping'); // Send the message 'Ping' to the server - console.log('WebSocket Open'); - showPane('pane1'); - }; - - // Log errors - connection.onerror = function (error) { - console.log('WebSocket Error ' + error); - $('#mc-wsloader').addClass('hide'); - $('#mc-wserror').removeClass('hide'); - }; - - // Log messages from the server - connection.onmessage = function (e) { - console.log('WebSocket from server: ' + e.data); - ws_waiting = 0; - }; - } - - - // ****************************************************************** - // Modes - // ****************************************************************** - $("#pane2").on("click", ".btn_mode", function() { - var mode = $(this).attr("data-mode"); - last_mode = mode; - var btn = $(this); - setMode(mode, function() { - $(".btn_mode, .btn_mode_static").removeClass("red").addClass("blue"); - btn.removeClass("blue").addClass("red"); - }); - }); - - $("#pane2").on("click", ".btn_mode_static", function() { - var mode = $(this).attr("data-mode"); - var btn = $(this); - - wsSendCommand("=" + mode); - $(".btn_mode, .btn_mode_static").removeClass("red").addClass("blue"); - btn.removeClass("blue").addClass("red"); - }); - - $("#pane2").on("change", ".update_colors", setMainColor); - - $("#pane2").on("change", ".update_delay", function() { - var delay = $("#rng_delay").val(); - - wsSendCommand("?" + delay); - }); - - $("#pane2").on("change", ".update_brightness", function() { - var brightness = $("#rng_brightness").val(); - - wsSendCommand("%" + brightness); - }); - - $("#autoSwitch").on("change", function () { - if ($(this).prop('checked')) { - wsSendCommand("start"); - } else { - wsSendCommand("stop"); - } - }); - - function setMode(mode, finish_funtion) { - console.log("Mode: ", mode); - - wsSendCommand("/" + mode); - finish_funtion(); - } - - function setMainColor() { - var white = $("#rng_white").val(); - var red = $("#rng_red").val(); - var green = $("#rng_green").val(); - var blue = $("#rng_blue").val(); - - var hexColor = componentToHex(white) + componentToHex(red) + componentToHex(green) + componentToHex(blue); - var statusColor = "#" + componentToHex(red) + componentToHex(green) + componentToHex(blue); - wsSetMainColor(hexColor); - $('#status').css("backgroundColor", statusColor); - $('#status_color').text(statusColor + "- R=" + red + ", G=" + green + ", B=" + blue); - } - - - // ****************************************************************** - // WebSocket commands - // ****************************************************************** - function wsSendCommand(cmd) { - console.log("Send WebSocket command:", cmd); - if (ws_waiting == 0) { - connection.send(cmd); - ws_waiting++; - } else { - console.log("++++++++ WS call waiting, skip") - } - } - - - function wsSetAll(hexColor) { - console.log("wsSetAll() Set all colors to:", hexColor); - wsSendCommand("*" + hexColor); - } - - function wsSetMainColor(hexColor) { - console.log("wsSetMainColor() Set main colors to:", hexColor); - wsSendCommand("#" + hexColor); - } - - - - // ****************************************************************** - // Colorwheel - // ****************************************************************** - // this is supposed to work on mobiles (touch) as well as on a desktop (click) - // since we couldn't find a decent one .. this try of writing one by myself - // + google. swiping would be really nice - I will possibly implement it with - // jquery later - or never. - - var canvas = document.getElementById("myCanvas"); - // FIX: Cancel touch end event and handle click via touchstart - // canvas.addEventListener("touchend", function(e) { e.preventDefault(); }, false); - canvas.addEventListener("touchmove", doTouch, false); - canvas.addEventListener("click", doClick, false); - //canvas.addEventListener("mousemove", doClick, false); - - - var context = canvas.getContext('2d'); - var centerX = canvas.width / 2; - var centerY = canvas.height / 2; - var innerRadius = canvas.width / 4.5; - var outerRadius = (canvas.width - 10) / 2 - - //outer border - context.beginPath(); - //outer circle - context.arc(centerX, centerY, outerRadius, 0, 2 * Math.PI, false); - //draw the outer border: (gets drawn around the circle!) - context.lineWidth = 4; - context.strokeStyle = '#000000'; - context.stroke(); - context.closePath(); - - //fill with beautiful colors - //taken from here: http://stackoverflow.com/questions/18265804/building-a-color-wheel-in-html5 - for(var angle=0; angle<=360; angle+=1) { - var startAngle = (angle-2)*Math.PI/180; - var endAngle = angle * Math.PI/180; - context.beginPath(); - context.moveTo(centerX, centerY); - context.arc(centerX, centerY, outerRadius, startAngle, endAngle, false); - context.closePath(); - context.fillStyle = 'hsl('+angle+', 100%, 50%)'; - context.fill(); - context.closePath(); - } - - //inner border - context.beginPath(); - //context.arc(centerX, centerY, radius, startAngle, endAngle, counterClockwise); - context.arc(centerX, centerY, innerRadius, 0, 2 * Math.PI, false); - //fill the center - var my_gradient=context.createLinearGradient(0,0,170,0); - my_gradient.addColorStop(0,"black"); - my_gradient.addColorStop(1,"white"); - - context.fillStyle = my_gradient; - context.fillStyle = "white"; - context.fill(); - - //draw the inner line - context.lineWidth = 2; - context.strokeStyle = '#000000'; - context.stroke(); - context.closePath(); - - //get Mouse x/y canvas position - function getMousePos(canvas, evt) { - var rect = canvas.getBoundingClientRect(); - return { - x: evt.clientX - rect.left, - y: evt.clientY - rect.top - }; - } - - //comp to Hex - function componentToHex(c) { - //var hex = c.toString(16); - //return hex.length == 1 ? "0" + hex : hex; - return ("0"+(Number(c).toString(16))).slice(-2).toUpperCase(); - } - - //rgb/rgba to Hex - function rgbToHex(rgb) { - return componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]); - } - - //display the touch/click position and color info - function updateStatus(pos, color) { - //var hexColor = rgbToHex(color); - //wsSetAll(hexColor); - var hexColor = componentToHex(color[0]) + componentToHex(color[1]) + componentToHex(color[2]); - wsSetMainColor(hexColor); - hexColor = "#" + hexColor; - - $('#status').css("backgroundColor", hexColor); - $('#status_color').text(hexColor + " - R=" + color[0] + ", G=" + color[1] + ", B=" + color[2]); - $('#status_pos').text("x: " + pos.x + " - y: " + pos.y); - - $("#rng_white").val(0); - $("#rng_red").val(color[0]); - $("#rng_green").val(color[1]); - $("#rng_blue").val(color[2]); - } - - //handle the touch event - function doTouch(event) { - //to not also fire on click - event.preventDefault(); - var el = event.target; - - //touch position - var pos = {x: Math.round(event.targetTouches[0].pageX - el.offsetLeft), - y: Math.round(event.targetTouches[0].pageY - el.offsetTop)}; - //color - var color = context.getImageData(pos.x, pos.y, 1, 1).data; - - updateStatus(pos, color); - } - - function doClick(event) { - //click position - var pos = getMousePos(canvas, event); - //color - var color = context.getImageData(pos.x, pos.y, 1, 1).data; - - //console.log("click", pos.x, pos.y, color); - updateStatus(pos, color); - - //now do sth with the color rgbToHex(color); - //don't do stuff when #000000 (outside circle and lines - } - - - // ****************************************************************** - // main - // ****************************************************************** - init(); - -}); // end of document ready -})(jQuery); // end of jQuery name space \ No newline at end of file diff --git a/clients/web/README.md b/clients/web/README.md deleted file mode 100644 index b7e7616..0000000 --- a/clients/web/README.md +++ /dev/null @@ -1,4 +0,0 @@ -## Retired, use: -McLightingHTML from https://github.com/FabLab-Luenen/McLightingHTML - -or set #define USE_HTML_MIN_GZ in definitions.h to use the integrated! diff --git a/clients/web/apple-touch-icon.png b/clients/web/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c00fb89de57046547094f4785167e3409afdc8ac GIT binary patch literal 4500 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 m_iVO+_x78a5@6?Iw*L#`C2;+Lpe=y_0000 - - - - - - - - - - - - McLighting v2 - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Error on websocket connect.
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
pick a color
-
-
-
-
-
Auto:
- -
-
-
-
-
- -
-
-
-
-
-
-
-

-
-
-
-

-
-
-
-

-
-
- -
-
-
-

-
-
- -
-
-
-

-
-
-
-
- -
- - - - -
-
- Loading animations... -
-
-
-
-
- - - - - - - - - - - \ No newline at end of file diff --git a/clients/newWebClient/edit.htm b/clients/web/edit.htm similarity index 100% rename from clients/newWebClient/edit.htm rename to clients/web/edit.htm diff --git a/clients/newWebClient/edit.htm.gz b/clients/web/edit.htm.gz similarity index 100% rename from clients/newWebClient/edit.htm.gz rename to clients/web/edit.htm.gz diff --git a/clients/web/favicon.ico b/clients/web/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1c55beaf3d048b31b786937190d4bdc8a40610ea GIT binary patch literal 34494 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 literal 0 HcmV?d00001 diff --git a/clients/web/graphs.js.gz b/clients/web/graphs.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..72435445a7ef86e00fe6c66b3b71c47fdbd53a93 GIT binary patch literal 1971 zcmV;k2Tb@MiwFo@s$5k717~t!aAw-*8%!ep`yEM!aI@XpTRzN;M>CH`Bk93rb1y+*nfgVXr6{*O z+qWk+vpIfdbmRB&GiOD~!8-BI8jWLya*xm0`?Ns*u7@$U5b~-2FAtyY?VsHiJWiul z$g}Ci$m17Tz>sgbNBG!p6`3AIdmW5d-8e)$jYf;JJn?*ncK^L=>v4>q7o#|V#AXxo zd(ilSPVW5&A*9`%(ECk!Y+arKfe)*P?pEpRp~jzoF096?>r=Aoz97T=5)|h&-xQIu zg>l28ew8E08a6CBp`}c_5jC)_GP?DY`3f}-jd!TP&)0@aTI6>ySBJ(C^6Vjg_FCi? z4W)y8K|{N+7xu_b?5Q2tp*_aW9rTMaq?DSsrVu+rd~J}hE1ki{8Q_4DpSuf+7N=y0 z&lbmI*d0+cIw7C&8TouX>b8vuC7%rP5n-@XYJN3AXB2Qkjq~PBh|f&&!8{IOB&X(2 zH9yyb7aQ|uSdryo%OvNrl!(4VCh<(%jlKg>o+p(VLEZu+SU49}D`X?;9hV2J6#b@5xoQzr_H2o5@^1L}hMUELzT^@ZjjKOo0;;PSc-R=y16 zZ?GMY#vgK8*szEP4+cZTEn{%f2k_E z27Gde+C~f)Fg^jqZfsd{i2;6w@jVpRk!@);Z(!Q^0V_`j7DaAW9TdZ@cIt4a4szZaa^^aU29qDr;ABm46G?-=na2}Ferp=!isDL5 zZsRR-8*h`__!TcbYL6zj@e8?){|UK0{(#)d@5!y&&_(q^Zq+tjEH`wq+|b2RliLz5 zFqaQCU2wY8dG2R6eWA(3ua&TB6J>0#%pV>3Z zdyofc0!I`ut`SP$kiJ3WHi#-0<433_` z)YOv0bAAFn?dFnNRNv(ebZf$J9m~5X4;HB}|KgQLUj9wtTU0ot`o1rAx!kOPE}Fw8 zS~Q^pvJt_F1Mf4=n%)ASw`5Ik|GTcX!Dzk1YQ^WUvs*ob65M#*8Pl}n#sj~2z;Kp3 z#wt>!wBemdQe1%Fa@<6G*Tw3BO6(?)=)j$C-mo1S$t$oENe=yhLb-k<8_;yI4OzB} zRnJ39Vd(ZadQJ$E_Fo6+T+OyM?w0=_W4@|s1;9o}-pE(zujhQpQ&}rb!wtIwq}*=X z4FSKo$AySPF)Nk{6YIBX;rZfke?Eikq=c+ENp6^52>r$^5|&2ANW^K%_#LYXv7c8e z=vGa#hyxfcmO0B{UVkpiG+<$zvOo;WqJY`6)K6l6B8Kp~K2ezpCd|@8%tl_2EiSSo zFA^|v1uq>WUSe{a+%Cnisy&!<^nU5?i#QLL2@C+6O z9mvZ6hkhC(4R=nr5iF#GH6&3&)`F6DcbF}Sh6I^7IhzV|9hOnAbbP~0)_aTc?G-T zUOp0`CmZu63}>tmJ`@(Gu)SWMGnfEAsi4IU)bR<5*jr~_#!;-Z^EjQ<&VItC4B8MT z8B`^L%rDim_gH$+=1MruU~n)H8CPxfm(bCv7eR<84hDk()HUc0oPGxaFZ!1Rx^{U0 z&VK*U?e~RBheyXbhhXsb4|_d`A?>3*L0l+t&uz4z32}iM0zT**`+0@&e*in8G#?BP F000|7$0Ps% literal 0 HcmV?d00001 diff --git a/clients/web/gulpfile.js b/clients/web/gulpfile.js deleted file mode 100644 index cb2773a..0000000 --- a/clients/web/gulpfile.js +++ /dev/null @@ -1,55 +0,0 @@ -var gulp = require('gulp'), - request = require('request'), - fs = require('fs'), - connect = require('gulp-connect'), - fileinclude = require('gulp-file-include'); - -var src_dir = "src/"; -var build_dir = "build/"; - - -gulp.task('html', function() { - gulp.src(src_dir + '*.htm') - .pipe(fileinclude({ - prefix: '@@', - basepath: '@file' - })) - .pipe(gulp.dest('build')) - .pipe(connect.reload()); -}); - - -gulp.task('connect', function() { - connect.server({ - root: 'build', - livereload: true - }); -}); - -gulp.task('watch', function() { - gulp.watch(src_dir + '*.htm', ['html']); - gulp.watch(src_dir + 'js/*.js', ['html']); -}); - - -gulp.task('upload', ['html'], function() { - var url = 'http://192.168.0.49/edit'; - var options = { - url: url, - headers: { - 'Content-Type': 'multipart/form-data' - } - }; - - var r = request.post(options, function optionalCallback(err, httpResponse, body) { - if (err) { - return console.error('upload failed:', err); - } - console.log('Upload successful! Server responded with:', body); - }); - var form = r.form(); - form.append('data', fs.createReadStream(__dirname + "/" + build_dir + '/index.htm'), {filename: '/index.htm', contentType: "application/octet-stream"}); -}); - -gulp.task('default', ['html']); -gulp.task('serve', ['watch', 'connect']); \ No newline at end of file diff --git a/clients/newWebClient/index.htm b/clients/web/index.htm similarity index 93% rename from clients/newWebClient/index.htm rename to clients/web/index.htm index 7d8a7bf..647bb87 100644 --- a/clients/newWebClient/index.htm +++ b/clients/web/index.htm @@ -5,8 +5,8 @@ - - + + - - - - - - - diff --git a/clients/web/src/js/script.js b/clients/web/src/js/script.js deleted file mode 100644 index 60ef6d8..0000000 --- a/clients/web/src/js/script.js +++ /dev/null @@ -1,305 +0,0 @@ -(function($){ -$(function(){ - - // Settings - var host = window.location.hostname; - //host = "esp8266_02.local"; - - var ws_url = 'ws://' + host + ':81'; - var connection; - var ws_waiting = 0; - - // ****************************************************************** - // Side navigation - // ****************************************************************** - $('.button-collapse').sideNav(); - - // Navlinks - $('#mc-nav').on('click', '.mc-navlink', function(){ - console.log("Navigate to pane: ", $(this).data("pane")); - showPane($(this).data("pane")); - }); - - function showPane(pane) { - $('.mc_pane').addClass('hide'); - $('#' + pane).removeClass('hide'); - $('.button-collapse').sideNav('hide'); - - if (pane == "pane2") { - setMainColor(); - } - } - - - // ****************************************************************** - // init() - // ****************************************************************** - function init() { - console.log("Connection websockets to:", ws_url); - connection = new WebSocket(ws_url, ['arduino']); - - // Load modes async - $.getJSON("http://" + host + "/get_modes", function(data) { - //console.log("modes", data); - - var modes_html = ""; - data.forEach(function(current_mode){ - if (current_mode.mode !== undefined) { - modes_html += ''; - } - }); - - $('#modes').html(modes_html); - }); - - // When the connection is open, send some data to the server - connection.onopen = function () { - //connection.send('Ping'); // Send the message 'Ping' to the server - console.log('WebSocket Open'); - showPane('pane1'); - }; - - // Log errors - connection.onerror = function (error) { - console.log('WebSocket Error ' + error); - $('#mc-wsloader').addClass('hide'); - $('#mc-wserror').removeClass('hide'); - }; - - // Log messages from the server - connection.onmessage = function (e) { - console.log('WebSocket from server: ' + e.data); - ws_waiting = 0; - }; - } - - - // ****************************************************************** - // Modes - // ****************************************************************** - $("#pane2").on("click", ".btn_mode", function() { - var mode = $(this).attr("data-mode"); - last_mode = mode; - var btn = $(this); - setMode(mode, function() { - $(".btn_mode, .btn_mode_static").removeClass("red").addClass("blue"); - btn.removeClass("blue").addClass("red"); - }); - }); - - $("#pane2").on("click", ".btn_mode_static", function() { - var mode = $(this).attr("data-mode"); - var btn = $(this); - - wsSendCommand("=" + mode); - $(".btn_mode, .btn_mode_static").removeClass("red").addClass("blue"); - btn.removeClass("blue").addClass("red"); - }); - - $("#pane2").on("change", ".update_colors", setMainColor); - - $("#pane2").on("change", ".update_delay", function() { - var delay = $("#rng_delay").val(); - - wsSendCommand("?" + delay); - }); - - $("#pane2").on("change", ".update_brightness", function() { - var brightness = $("#rng_brightness").val(); - - wsSendCommand("%" + brightness); - }); - - $("#autoSwitch").on("change", function () { - if ($(this).prop('checked')) { - wsSendCommand("start"); - } else { - wsSendCommand("stop"); - } - }); - - function setMode(mode, finish_funtion) { - console.log("Mode: ", mode); - - wsSendCommand("/" + mode); - finish_funtion(); - } - - function setMainColor() { - var red = $("#rng_red").val(); - var green = $("#rng_green").val(); - var blue = $("#rng_blue").val(); - - var mainColorHex = componentToHex(red) + componentToHex(green) + componentToHex(blue); - wsSetMainColor(mainColorHex); - } - - - // ****************************************************************** - // WebSocket commands - // ****************************************************************** - function wsSendCommand(cmd) { - console.log("Send WebSocket command:", cmd); - if (ws_waiting == 0) { - connection.send(cmd); - ws_waiting++; - } else { - console.log("++++++++ WS call waiting, skip") - } - } - - - function wsSetAll(hexColor) { - console.log("wsSetAll() Set all colors to:", hexColor); - wsSendCommand("*" + hexColor); - } - - function wsSetMainColor(hexColor) { - console.log("wsSetMainColor() Set main colors to:", hexColor); - wsSendCommand("#" + hexColor); - } - - - - // ****************************************************************** - // Colorwheel - // ****************************************************************** - // this is supposed to work on mobiles (touch) as well as on a desktop (click) - // since we couldn't find a decent one .. this try of writing one by myself - // + google. swiping would be really nice - I will possibly implement it with - // jquery later - or never. - - var canvas = document.getElementById("myCanvas"); - // FIX: Cancel touch end event and handle click via touchstart - // canvas.addEventListener("touchend", function(e) { e.preventDefault(); }, false); - canvas.addEventListener("touchmove", doTouch, false); - canvas.addEventListener("click", doClick, false); - //canvas.addEventListener("mousemove", doClick, false); - - - var context = canvas.getContext('2d'); - var centerX = canvas.width / 2; - var centerY = canvas.height / 2; - var innerRadius = canvas.width / 4.5; - var outerRadius = (canvas.width - 10) / 2 - - //outer border - context.beginPath(); - //outer circle - context.arc(centerX, centerY, outerRadius, 0, 2 * Math.PI, false); - //draw the outer border: (gets drawn around the circle!) - context.lineWidth = 4; - context.strokeStyle = '#000000'; - context.stroke(); - context.closePath(); - - //fill with beautiful colors - //taken from here: http://stackoverflow.com/questions/18265804/building-a-color-wheel-in-html5 - for(var angle=0; angle<=360; angle+=1) { - var startAngle = (angle-2)*Math.PI/180; - var endAngle = angle * Math.PI/180; - context.beginPath(); - context.moveTo(centerX, centerY); - context.arc(centerX, centerY, outerRadius, startAngle, endAngle, false); - context.closePath(); - context.fillStyle = 'hsl('+angle+', 100%, 50%)'; - context.fill(); - context.closePath(); - } - - //inner border - context.beginPath(); - //context.arc(centerX, centerY, radius, startAngle, endAngle, counterClockwise); - context.arc(centerX, centerY, innerRadius, 0, 2 * Math.PI, false); - //fill the center - var my_gradient=context.createLinearGradient(0,0,170,0); - my_gradient.addColorStop(0,"black"); - my_gradient.addColorStop(1,"white"); - - context.fillStyle = my_gradient; - context.fillStyle = "white"; - context.fill(); - - //draw the inner line - context.lineWidth = 2; - context.strokeStyle = '#000000'; - context.stroke(); - context.closePath(); - - //get Mouse x/y canvas position - function getMousePos(canvas, evt) { - var rect = canvas.getBoundingClientRect(); - return { - x: evt.clientX - rect.left, - y: evt.clientY - rect.top - }; - } - - //comp to Hex - function componentToHex(c) { - //var hex = c.toString(16); - //return hex.length == 1 ? "0" + hex : hex; - return ("0"+(Number(c).toString(16))).slice(-2).toUpperCase(); - } - - //rgb/rgba to Hex - function rgbToHex(rgb) { - return componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]); - } - - //display the touch/click position and color info - function updateStatus(pos, color) { - var hexColor = rgbToHex(color); - wsSetAll(hexColor); - - hexColor = "#" + hexColor; - - $('#status').css("backgroundColor", hexColor); - $('#status_color').text(hexColor + " - R=" + color[0] + ", G=" + color[1] + ", B=" + color[2]); - $('#status_pos').text("x: " + pos.x + " - y: " + pos.y); - - $("#rng_red").val(color[0]); - $("#rng_green").val(color[1]); - $("#rng_blue").val(color[2]); - } - - //handle the touch event - function doTouch(event) { - //to not also fire on click - event.preventDefault(); - var el = event.target; - - //touch position - var pos = {x: Math.round(event.targetTouches[0].pageX - el.offsetLeft), - y: Math.round(event.targetTouches[0].pageY - el.offsetTop)}; - //color - var color = context.getImageData(pos.x, pos.y, 1, 1).data; - - updateStatus(pos, color); - } - - function doClick(event) { - //click position - var pos = getMousePos(canvas, event); - //color - var color = context.getImageData(pos.x, pos.y, 1, 1).data; - - //console.log("click", pos.x, pos.y, color); - updateStatus(pos, color); - - //now do sth with the color rgbToHex(color); - //don't do stuff when #000000 (outside circle and lines - } - - - // ****************************************************************** - // main - // ****************************************************************** - init(); - -}); // end of document ready -})(jQuery); // end of jQuery name space \ No newline at end of file From bc783f774c28548c2fdc14d521334688152cf4d0 Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Sun, 29 Sep 2019 13:40:31 +0200 Subject: [PATCH 09/28] V3.0.0.BETA1 * bugfix --- Arduino/McLighting/request_handlers.h | 2 +- Arduino/McLighting/rest_api.h | 12 ++++++++---- Arduino/McLighting/version_info.ino | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Arduino/McLighting/request_handlers.h b/Arduino/McLighting/request_handlers.h index 9e73264..75b9e83 100644 --- a/Arduino/McLighting/request_handlers.h +++ b/Arduino/McLighting/request_handlers.h @@ -467,7 +467,7 @@ void handleSetWS2812FXMode(uint8_t * mypayload) { mode = OFF; } if (strcmp((char *) &mypayload[1], "on") == 0) { - mode = HOLD; + mode = SET; } } } diff --git a/Arduino/McLighting/rest_api.h b/Arduino/McLighting/rest_api.h index 8597c0e..37e8d6b 100644 --- a/Arduino/McLighting/rest_api.h +++ b/Arduino/McLighting/rest_api.h @@ -231,6 +231,9 @@ DBG_OUTPUT_PORT.println(rgbcolor); }); + server.on("/get_modes", []() { + getModesJSON(); + }); server.on("/status", []() { getStatusJSON(); @@ -342,6 +345,11 @@ getStatusJSON(); }); + server.on("/on", []() { + mode = SET; + getStatusJSON(); + }); + server.on("/set", []() { prevmode = HOLD; ws2812fx_mode = FX_MODE_STATIC; @@ -349,7 +357,3 @@ getArgs(); getStatusJSON(); }); - - server.on("/get_modes", []() { - getModesJSON(); - }); diff --git a/Arduino/McLighting/version_info.ino b/Arduino/McLighting/version_info.ino index cd572df..873bfe9 100644 --- a/Arduino/McLighting/version_info.ino +++ b/Arduino/McLighting/version_info.ino @@ -186,5 +186,6 @@ * * 29 September 2019 * Version Bump to 3.0.0.BETA1 - * further code changes + * further code changes + * bugfixes */ From 7dd3c87b8cf9077bc764107e130b2393f54c6307 Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Sun, 29 Sep 2019 14:11:56 +0200 Subject: [PATCH 10/28] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 229ca94..22d21aa 100644 --- a/README.md +++ b/README.md @@ -67,21 +67,21 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so ## Todos - [ ] Redesign of Code and bump to V3 -- [ ] Removal of LEGACY_ANIMATIONS -- [ ] Include ws28fx library to code due to modifications in library - [ ] Support multiple strips and control them separately or together [Issue](https://github.com/toblum/McLighting/issues/118) -- [ ] Remove old / wrong EEPROM settings completely [Issue] +- [ ] Support for up to ten segments - [ ] Customer profile to define segments of (in)active areas on the strip [Issue](https://github.com/toblum/McLighting/issues/37) +- [ ] Remove old / wrong EEPROM settings completely [Issue] - [ ] Additional clients - [ ] If no wifi, at least enable button mode. - [ ] Also enable McLighting in Wifi AP mode. - [ ] Multiple buttons/GPIO Inputs. [Issue](https://github.com/toblum/McLighting/issues/119) - [ ] Music visualizer / Bring back ArtNet [Issue](https://github.com/toblum/McLighting/issues/111) - [ ] Display version and parameters (Number of LEDs, definition settings, ..) in the web UI [Issue](https://github.com/toblum/McLighting/issues/150) -- [ ] Support for up to ten segments +- [x] Removal of LEGACY_ANIMATIONS +- [x] Include ws2812fx library to code due to modifications in library - [x] Add TV, E1.31 and AUTO to CUSTOM_WS2812FX_ANIMATIONS - [x] Save status: Added saving of status 'AUTO'. [Issue](https://github.com/FabLab-Luenen/McLighting/issues/30) -- [x] EXPERIMENTAL: Added transition feature on changing values of color brightness and speed. ATTENTION! Does not work proberly for all WS2812fx effects. Can be set via UI. +- [x] EXPERIMENTAL: Added transition feature on changing values of color brightness and speed. ATTENTION! Does not work properly for all WS2812fx effects. Can be set via UI or REST-API. - [x] Added Custom Animation 'Gradient': [Issue](https://github.com/FabLab-Luenen/McLighting/issues/25) - [x] Make number of pixels, MQTT and PIN configurable via front end [Issue](https://github.com/toblum/McLighting/issues/93) and [Issue](https://github.com/toblum/McLighting/issues/101) - [x] Bundle webpages instead of SPIFFS [Issue](https://github.com/toblum/McLighting/issues/93) From 53178c5e33bed671d5df8f627552989d9aa13fec Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Mon, 30 Sep 2019 20:26:44 +0200 Subject: [PATCH 11/28] 3.1.0.ALPHA1 --- Arduino/McLighting/McLighting.ino | 108 ++-- Arduino/McLighting/definitions.h | 11 +- .../mode_custom_ws2812fx_animations.h | 20 +- Arduino/McLighting/request_handlers.h | 537 +++++++++++------- Arduino/McLighting/rest_api.h | 12 +- Arduino/McLighting/trash.ino | 33 ++ Arduino/McLighting/version_info.ino | 7 + 7 files changed, 424 insertions(+), 304 deletions(-) create mode 100644 Arduino/McLighting/trash.ino diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino index 13e245e..abf3bc7 100644 --- a/Arduino/McLighting/McLighting.ino +++ b/Arduino/McLighting/McLighting.ino @@ -14,9 +14,6 @@ #include #include #include -#if ENABLE_STATE_SAVE == 0 - #include -#endif #include //https://github.com/Links2004/arduinoWebSockets #include @@ -299,7 +296,12 @@ void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, char RGBOrd strip->setCustomShow(DMA_Show); #endif //parameters: index, start, stop, mode, color, speed, options - strip->setSegment(selected_segment, 0, stripSize - 1, ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions); + for (uint8_t seg=0; seg < num_segments; seg++) { + (readStateSegmentFS(seg)) ? DBG_OUTPUT_PORT.println("Segment state config FS read Success!") : DBG_OUTPUT_PORT.println("Segment state config FS read failure!"); + strip->setSegment(seg, seg_start, seg_stop , ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions); + } + //strip->setSegment(0, 0, (stripSize - 1)/2, ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions); + //strip->setSegment(1, ((stripSize - 1)/2) + 1, (stripSize - 1), ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions); strip->setCustomMode(0, F("Autoplay"), myCustomEffect0); strip->setCustomMode(1, F("Custom WS"), myCustomEffect1); #if defined(CUSTOM_WS2812FX_ANIMATIONS) @@ -308,6 +310,8 @@ void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, char RGBOrd strip->setCustomMode(4, F("Fire 2012"), myCustomEffect4); strip->setCustomMode(5, F("Gradient"), myCustomEffect5); gReverseDirection = (WS2812FXStripSettings.fxoptions & 128); + DBG_OUTPUT_PORT.print("Number of Segments: "); + DBG_OUTPUT_PORT.println(strip->getNumSegments()); if (e131 != NULL) { delete(e131); } e131 = new ESPAsyncE131(END_UNIVERSE - START_UNIVERSE + 1); @@ -394,9 +398,6 @@ void setup() { delay(500); DBG_OUTPUT_PORT.println(""); DBG_OUTPUT_PORT.println("Starting...Main Setup"); -#if ENABLE_STATE_SAVE == 0 - EEPROM.begin(512); -#endif // set builtin led pin as output pinMode(LED_BUILTIN, OUTPUT); // button pin setup @@ -444,16 +445,9 @@ void setup() { #if defined(ENABLE_STATE_SAVE) //Strip Config - #if ENABLE_STATE_SAVE == 1 - (readConfigFS()) ? DBG_OUTPUT_PORT.println("WiFiManager config FS read success!"): DBG_OUTPUT_PORT.println("WiFiManager config FS Read failure!"); - delay(250); - (readStateFS()) ? DBG_OUTPUT_PORT.println("Strip state config FS read Success!") : DBG_OUTPUT_PORT.println("Strip state config FS read failure!"); - #endif - #if ENABLE_STATE_SAVE == 0 - (setConfByConfString(readEEPROM(0, 222)))? DBG_OUTPUT_PORT.println("WiFiManager config EEPROM read success!"): DBG_OUTPUT_PORT.println("WiFiManager config EEPROM Read failure!"); - delay(250); - (setModeByStateString(readEEPROM(256, 66)))? DBG_OUTPUT_PORT.println("Strip state config EEPROM read Success!") : DBG_OUTPUT_PORT.println("Strip state config EEPROM read failure!"); - #endif + (readConfigFS()) ? DBG_OUTPUT_PORT.println("WiFiManager config FS read success!"): DBG_OUTPUT_PORT.println("WiFiManager config FS Read failure!"); + delay(250); + (readStateFS()) ? DBG_OUTPUT_PORT.println("Strip state config FS read Success!") : DBG_OUTPUT_PORT.println("Strip state config FS read failure!"); char tmp_strip_size[6], tmp_fxoptions[5], tmp_rgbOrder[5]; //needed tempararily for WiFiManager Settings WiFiManagerParameter custom_hostname("hostname", "Hostname", HOSTNAME, 64, " maxlength=64"); #if defined(ENABLE_MQTT) @@ -547,22 +541,7 @@ void setup() { checkRGBOrder(tmp_rgbOrder); WS2812FXStripSettings.fxoptions = atoi(custom_fxoptions.getValue()); if (updateConfig) { - #if ENABLE_STATE_SAVE == 1 - (writeConfigFS(updateConfig)) ? DBG_OUTPUT_PORT.println("WiFiManager config FS Save success!"): DBG_OUTPUT_PORT.println("WiFiManager config FS Save failure!"); - #endif - #if ENABLE_STATE_SAVE == 0 - char last_conf[225]; - DBG_OUTPUT_PORT.println("Saving WiFiManager config"); - #if defined(ENABLE_MQTT) - snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d|%1d", HOSTNAME, mqtt_host, mqtt_port, mqtt_user, mqtt_pass, WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions, transEffect); - #else - snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d|%1d", HOSTNAME, "", "", "", "", WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions, transEffect); - #endif - last_conf[sizeof(last_conf)] = 0x00; - writeEEPROM(0, 224, last_conf); - EEPROM.commit(); - updateConfig = false; - #endif + (writeConfigFS(updateConfig)) ? DBG_OUTPUT_PORT.println("WiFiManager config FS Save success!"): DBG_OUTPUT_PORT.println("WiFiManager config FS Save failure!"); } #endif @@ -775,15 +754,22 @@ void loop() { if (mode == SET) { mode = HOLD; + // Segment + if (prevsegment != segment) { + #if defined(ENABLE_MQTT) + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK S%i", segment); + #endif + prevsegment = segment; + } // Mode - if (ws2812fx_mode != strip->getMode(selected_segment)) { // SET_MODE + if (ws2812fx_mode != strip->getMode(segment)) { #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", ws2812fx_mode); #endif strip->strip_off(); autoCount = 0; autoDelay = 0; - strip->setMode(selected_segment, ws2812fx_mode); + strip->setMode(segment, ws2812fx_mode); } //Color /*if (memcmp(hex_colors_trans, strip->getColors(selected_segment), sizeof(hex_colors_trans)) != 0) { @@ -808,12 +794,11 @@ void loop() { if (prevmode != mode) { convertColors(); - if (memcmp(hex_colors_trans, strip->getColors(selected_segment), sizeof(hex_colors_trans)) != 0) { - DBG_OUTPUT_PORT.println("Colors not equal!"); + if (memcmp(hex_colors_trans, strip->getColors(segment), sizeof(hex_colors_trans)) != 0) { convertColorsFade(); trans_cnt = 1; } - strip->setSpeed(selected_segment, convertSpeed(ws2812fx_speed_actual)); + strip->setSpeed(segment, convertSpeed(ws2812fx_speed_actual)); //strip->setBrightness(brightness_actual); if (prevmode != INIT_STRIP) { // do not save if INIT_STRIP mode was set #if defined(ENABLE_STATE_SAVE) @@ -836,33 +821,10 @@ void loop() { } #if defined(ENABLE_STATE_SAVE) if (updateState){ - #if ENABLE_STATE_SAVE == 1 (writeStateFS(updateState)) ? DBG_OUTPUT_PORT.println(" State FS Save Success!") : DBG_OUTPUT_PORT.println("State FS Save failure!"); - #endif - #if ENABLE_STATE_SAVE == 0 - writeEEPROM(384, 66, last_state); // 384 --> last_state (reserved 66 bytes) - EEPROM.commit(); - updateState = false; - settings_save_state.detach(); - #endif } if (updateConfig) { - #if ENABLE_STATE_SAVE == 1 (writeConfigFS(updateConfig)) ? DBG_OUTPUT_PORT.println("Config FS Save success!"): DBG_OUTPUT_PORT.println("Config FS Save failure!"); - #endif - #if ENABLE_STATE_SAVE == 0 - char last_conf[225]; - #if defined(ENABLE_MQTT) - snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d|%1d", HOSTNAME, mqtt_host, mqtt_port, mqtt_user, mqtt_pass, WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions, transEffect); - #else - snprintf(last_conf, sizeof(last_conf), "CNF|%64s|%64s|%5d|%32s|%32s|%4d|%2d|%4s|%3d|%1d", HOSTNAME, "", "", "", "", WS2812FXStripSettings.stripSize, WS2812FXStripSettings.pin, WS2812FXStripSettings.RGBOrder, WS2812FXStripSettings.fxoptions, transEffect); - #endif - last_conf[sizeof(last_conf) - 1] = 0x00; - writeEEPROM(0, 224, last_conf); - EEPROM.commit(); - updateConfig = false; - settings_save_conf.detach(); - #endif } #endif @@ -875,7 +837,7 @@ void loop() { } // Async color transition - if (memcmp(hex_colors_trans, strip->getColors(selected_segment), sizeof(hex_colors_trans)) != 0) { + if (memcmp(hex_colors_trans, strip->getColors(segment), sizeof(hex_colors_trans)) != 0) { if (transEffect) { if ((trans_cnt > 0) && (trans_cnt < trans_cnt_max)) { if (colorFadeDelay <= millis()) { @@ -883,21 +845,21 @@ void loop() { hex_colors_actual[0] = trans(hex_colors_trans[0], hex_colors[0], trans_cnt); hex_colors_actual[1] = trans(hex_colors_trans[1], hex_colors[1], trans_cnt); hex_colors_actual[2] = trans(hex_colors_trans[2], hex_colors[2], trans_cnt); - strip->setColors(selected_segment, hex_colors_actual); + strip->setColors(prevsegment, hex_colors_actual); trans_cnt++; colorFadeDelay = millis() + TRANS_COLOR_DELAY; if (mode == HOLD) strip->trigger(); } } else if (trans_cnt >= trans_cnt_max) { memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); - strip->setColors(selected_segment, hex_colors); + strip->setColors(prevsegment, hex_colors); if (mode == HOLD) strip->trigger(); trans_cnt = 0; DBG_OUTPUT_PORT.println("Color transition finished!"); } } else { memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); - strip->setColors(selected_segment, hex_colors); + strip->setColors(prevsegment, hex_colors); if (mode == HOLD) strip->trigger(); trans_cnt = 0; } @@ -917,12 +879,12 @@ void loop() { ws2812fx_speed_actual--; } speedFadeDelay = millis() + TRANS_DELAY; - strip->setSpeed(selected_segment, convertSpeed(ws2812fx_speed_actual)); + strip->setSpeed(prevsegment, convertSpeed(ws2812fx_speed_actual)); if (mode == HOLD) strip->trigger(); } } else { ws2812fx_speed_actual = ws2812fx_speed; - strip->setSpeed(selected_segment, convertSpeed(ws2812fx_speed_actual)); + strip->setSpeed(prevsegment, convertSpeed(ws2812fx_speed_actual)); if (mode == HOLD) strip->trigger(); } } @@ -942,11 +904,19 @@ void loop() { strip->trigger(); } } else { - strip->setBrightness(brightness); + brightness_trans = brightness; + strip->setBrightness(brightness_trans); if (mode == HOLD) strip->trigger(); } } - + +/* // Segment change only if color and speed transitions are finished, because they are segment specific + if (prevsegment != segment) { + if ((memcmp(hex_colors_trans, strip->getColors(segment), sizeof(hex_colors_trans)) == 0) && (ws2812fx_speed_actual == ws2812fx_speed)) { + segment = prevsegment; + } + } +*/ prevmode = mode; #if defined(ENABLE_REMOTE) diff --git a/Arduino/McLighting/definitions.h b/Arduino/McLighting/definitions.h index 9ad718a..f74a1ab 100644 --- a/Arduino/McLighting/definitions.h +++ b/Arduino/McLighting/definitions.h @@ -27,10 +27,10 @@ char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just #endif #define ENABLE_REMOTE 13 // If defined, enable Remote Control via TSOP31238. The value defines the input pin (13 / D7) for TSOP31238 Out -#define ENABLE_STATE_SAVE 1 // If defined, load saved state on reboot and save state. If set to 0 from EEPROM, if set to 1 from SPIFFS +#define ENABLE_STATE_SAVE // If defined, load saved state on reboot and save state on SPIFFS #define CUSTOM_WS2812FX_ANIMATIONS // uncomment and put animations in "custom_ws2812fx_animations.h" -#define USE_HTML_MIN_GZ // uncomment for using index.htm & edit.htm from PROGMEM instead of SPIFFs +//#define USE_HTML_MIN_GZ // uncomment for using index.htm & edit.htm from PROGMEM instead of SPIFFS #define TRANS_COLOR_DELAY 5 // Delay for color transition #define TRANS_DELAY 10 // Delay for brightness and speed transition @@ -49,7 +49,12 @@ unsigned long speedFadeDelay = 0; uint8_t END_UNIVERSE = START_UNIVERSE; // Total number of Universes to listen for, starting at UNIVERSE #endif -uint8_t selected_segment = 0; +uint8_t num_segments = 1; +uint8_t segment = 0; +uint16_t seg_start = 0; +uint16_t seg_stop = NUMLEDS - 1; +uint8_t prevsegment = 0; + #if defined(ENABLE_REMOTE) uint8_t selected_color = 1; uint64_t last_remote_cmd; diff --git a/Arduino/McLighting/mode_custom_ws2812fx_animations.h b/Arduino/McLighting/mode_custom_ws2812fx_animations.h index a851d82..1e57ea7 100644 --- a/Arduino/McLighting/mode_custom_ws2812fx_animations.h +++ b/Arduino/McLighting/mode_custom_ws2812fx_animations.h @@ -16,9 +16,9 @@ void handleAutoPlay() { hex_colors[0] = autoParams[autoCount][0]; hex_colors[1] = autoParams[autoCount][1]; hex_colors[2] = autoParams[autoCount][2]; - strip->setColors(selected_segment, hex_colors); - strip->setSpeed(selected_segment, convertSpeed((uint8_t)autoParams[autoCount][3])); - strip->setMode(selected_segment, (uint8_t)autoParams[autoCount][4]); + strip->setColors(segment, hex_colors); + strip->setSpeed(segment, convertSpeed((uint8_t)autoParams[autoCount][3])); + strip->setMode(segment, (uint8_t)autoParams[autoCount][4]); strip->trigger(); autoDelay = millis() + (uint32_t)autoParams[autoCount][5]; DBG_OUTPUT_PORT.print("autoTick "); @@ -237,7 +237,7 @@ void Gradient() { } else { pixelnumber = j; } - color = trans(strip->getColors(selected_segment)[1], strip->getColors(selected_segment)[0], (j*255)/(WS2812FXStripSettings.stripSize - 1)); + color = trans(strip->getColors(segment)[1], strip->getColors(segment)[0], (j*255)/(WS2812FXStripSettings.stripSize - 1)); strip->setPixelColor(pixelnumber, ((color >> 16) & 0xFF), ((color >> 8) & 0xFF), ((color >> 0) & 0xFF), ((color >> 24) & 0xFF)); } } @@ -245,31 +245,31 @@ void Gradient() { uint16_t myCustomEffect0() { handleAuto(); - return (strip->getSpeed() / WS2812FXStripSettings.stripSize); + return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize); } uint16_t myCustomEffect1() { handleCustomWS(); - return (strip->getSpeed() / WS2812FXStripSettings.stripSize); + return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize); } #if defined(CUSTOM_WS2812FX_ANIMATIONS) uint16_t myCustomEffect2() { handleTV(); - return (strip->getSpeed() / WS2812FXStripSettings.stripSize); + return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize); } uint16_t myCustomEffect3() { handleE131(); - return (strip->getSpeed() / WS2812FXStripSettings.stripSize); + return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize); } uint16_t myCustomEffect4() { Fire2012(); - return (strip->getSpeed() / WS2812FXStripSettings.stripSize); + return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize); } uint16_t myCustomEffect5() { Gradient(); - return (strip->getSpeed() / WS2812FXStripSettings.stripSize); + return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize); } #endif diff --git a/Arduino/McLighting/request_handlers.h b/Arduino/McLighting/request_handlers.h index 75b9e83..fa52a32 100644 --- a/Arduino/McLighting/request_handlers.h +++ b/Arduino/McLighting/request_handlers.h @@ -17,6 +17,31 @@ void convertColors() { hex_colors_trans[2] = (uint32_t)(xtra_color.white << 24) | (xtra_color.red << 16) | (xtra_color.green << 8) | xtra_color.blue; } +uint32_t* convertColors2(uint8_t w, uint8_t r, uint8_t g, uint8_t b, uint8_t w2, uint8_t r2, uint8_t g2, uint8_t b2, uint8_t w3, uint8_t r3, uint8_t g3, uint8_t b3) { + uint32_t hexcolors[3] = {}; + hexcolors[0] = (uint32_t)(w << 24) | (r << 16) | (g << 8) | b; + hexcolors[1] = (uint32_t)(w2 << 24) | (r2 << 16) | (g2 << 8) | b2; + hexcolors[2] = (uint32_t)(w3 << 24) | (r3 << 16) | (g3 << 8) | b3; + return hexcolors; +} + + +void getSegmentParams(uint8_t seg) { + ws2812fx_mode = strip->getMode(seg); + main_color.white = ((strip->getColors(seg)[0] >> 24) & 0xFF); + main_color.red = ((strip->getColors(seg)[0] >> 16) & 0xFF); + main_color.green = ((strip->getColors(seg)[0] >> 8) & 0xFF); + main_color.blue = ((strip->getColors(seg)[0]) & 0xFF); + back_color.white = ((strip->getColors(seg)[1] >> 24) & 0xFF); + back_color.red = ((strip->getColors(seg)[1] >> 16) & 0xFF); + back_color.green = ((strip->getColors(seg)[1] >> 8) & 0xFF); + back_color.blue = ((strip->getColors(seg)[1]) & 0xFF); + xtra_color.white = ((strip->getColors(seg)[2] >> 24) & 0xFF); + xtra_color.red = ((strip->getColors(seg)[2] >> 16) & 0xFF); + xtra_color.green = ((strip->getColors(seg)[2] >> 8) & 0xFF); + xtra_color.blue = ((strip->getColors(seg)[2] >> 0) & 0xFF); +} + void calculateColorTransitionSteps() { //compare all colors and calculate steps trans_cnt_max = 0; @@ -33,7 +58,7 @@ void calculateColorTransitionSteps() { void convertColorsFade() { if (transEffect) { if (trans_cnt > 1) { - memcpy(hex_colors, strip->getColors(selected_segment), sizeof(hex_colors)); + memcpy(hex_colors, strip->getColors(segment), sizeof(hex_colors)); DBG_OUTPUT_PORT.println("Color transistion aborted. Restarting...!"); trans_cnt = 1; } @@ -43,6 +68,13 @@ void convertColorsFade() { void getArgs() { if (mode == SET) { + // Segment + if ((server.arg("seg") != "") && (server.arg("seg").toInt() >= 0) && (server.arg("seg").toInt() <= MAX_NUM_SEGMENTS)) { + prevsegment = segment; + segment = server.arg("seg").toInt(); + getSegmentParams(segment); + memcpy(hex_colors_trans, hex_colors, sizeof(hex_colors_trans)); + } //color wrgb if (server.arg("rgb") != "") { uint32_t rgb = (uint32_t) strtoul(server.arg("rgb").c_str(), NULL, 16); @@ -131,7 +163,6 @@ void getArgs() { brightness = constrain(server.arg("p").toInt(), 0, 255); } } - DBG_OUTPUT_PORT.printf("Get Args: %s\r\n", listStatusJSON()); } @@ -304,7 +335,6 @@ bool checkPin(uint8_t pin) { return false; } - neoPixelType checkRGBOrder(char rgbOrder[5]) { for( uint8_t i=0 ; i < sizeof(rgbOrder) ; ++i ) rgbOrder[i] = toupper(rgbOrder[i]) ; DBG_OUTPUT_PORT.printf("Checking RGB Order: %s ...", rgbOrder); @@ -385,31 +415,6 @@ neoPixelType checkRGBOrder(char rgbOrder[5]) { return returnOrder; } -bool setConfByConfString(String saved_conf_string) { - if (getValue(saved_conf_string, '|', 0) == "CNF") { - DBG_OUTPUT_PORT.printf("Parsed conf: %s\r\n", saved_conf_string.c_str()); - getValue(saved_conf_string, '|', 1).toCharArray(HOSTNAME, 64); - #if defined(ENABLE_MQTT) - getValue(saved_conf_string, '|', 2).toCharArray(mqtt_host, 64); - mqtt_port = getValue(saved_conf_string, '|', 3).toInt(); - getValue(saved_conf_string, '|', 4).toCharArray(mqtt_user, 32); - getValue(saved_conf_string, '|', 5).toCharArray(mqtt_pass, 32); - #endif - WS2812FXStripSettings.stripSize = constrain(getValue(saved_conf_string, '|', 6).toInt(), 1, MAXLEDS); - checkPin(getValue(saved_conf_string, '|', 7).toInt()); - char tmp_rgbOrder[5]; - getValue(saved_conf_string, '|', 8).toCharArray(tmp_rgbOrder, 4); - checkRGBOrder(tmp_rgbOrder); - WS2812FXStripSettings.fxoptions = constrain(((getValue(saved_conf_string, '|', 9).toInt()>>1)<<1), 0, 255); - transEffect = getValue(saved_conf_string, '|', 10).toInt(); - return true; - } else { - DBG_OUTPUT_PORT.println("Saved conf not found!"); - return false; - } - return false; -} - bool setModeByStateString(String saved_state_string) { if (getValue(saved_state_string, '|', 0) == "STA") { DBG_OUTPUT_PORT.printf("Parsed state: %s\r\n", saved_state_string.c_str()); @@ -472,15 +477,14 @@ void handleSetWS2812FXMode(uint8_t * mypayload) { } } -char * listStatusJSON() { - const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(6) + 500; +char * listStatusJSONorg() { + const size_t bufferSize = JSON_ARRAY_SIZE(13) + JSON_OBJECT_SIZE(6) + 500; DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); + root["segment"] = segment; root["mode"] = (uint8_t) mode; root["ws2812fx_mode"] = ws2812fx_mode; root["ws2812fx_mode_name"] = strip->getModeName(ws2812fx_mode); - //root["ws2812fx_mode"] = tmp_mode; - //root["ws2812fx_mode_name"] = strip->getModeName(tmp_mode); root["speed"] = ws2812fx_speed; root["brightness"] = brightness; JsonArray color = root.createNestedArray("color"); @@ -503,8 +507,53 @@ char * listStatusJSON() { return buffer; } +char * listStatusJSON() { + const size_t bufferSize = JSON_OBJECT_SIZE(3) + 25; + DynamicJsonDocument jsonBuffer(bufferSize); + JsonObject root = jsonBuffer.to(); + root["segment"] = segment; + root["mode"] = (uint8_t) mode; + root["brightness"] = brightness; + uint16_t msg_len = measureJson(root) + 1; + char * buffer = (char *) malloc(msg_len); + serializeJson(root, buffer, msg_len); + jsonBuffer.clear(); + return buffer; +} + +char * listSegmentStatusJSON(uint8_t seg) { + const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(7) + 100; + DynamicJsonDocument jsonBuffer(bufferSize); + JsonObject root = jsonBuffer.to(); + root["segment"] = seg; + root["start"] = strip->getSegment(seg)->start; + root["stop"] = strip->getSegment(seg)->stop; + root["ws2812fx_mode"] = strip->getMode(seg); + root["ws2812fx_mode_name"] = strip->getModeName(strip->getMode(seg)); + root["speed"] = ws2812fx_speed; + getSegmentParams(seg); + JsonArray color = root.createNestedArray("color"); + color.add((strip->getColors(seg)[0] >> 24) & 0xFF); + color.add((strip->getColors(seg)[0] >> 16) & 0xFF); + color.add((strip->getColors(seg)[0] >> 8) & 0xFF); + color.add((strip->getColors(seg)[0]) & 0xFF); + color.add((strip->getColors(seg)[1] >> 24) & 0xFF); + color.add((strip->getColors(seg)[1] >> 16) & 0xFF); + color.add((strip->getColors(seg)[1] >> 8) & 0xFF); + color.add((strip->getColors(seg)[1]) & 0xFF); + color.add((strip->getColors(seg)[2] >> 24) & 0xFF); + color.add((strip->getColors(seg)[2] >> 16) & 0xFF); + color.add((strip->getColors(seg)[2] >> 8) & 0xFF); + color.add((strip->getColors(seg)[2]) & 0xFF); + uint16_t msg_len = measureJson(root) + 1; + char * buffer = (char *) malloc(msg_len); + serializeJson(root, buffer, msg_len); + jsonBuffer.clear(); + return buffer; +} + void getStatusJSON() { - char * buffer = listStatusJSON(); + char * buffer = listStatusJSONorg(); server.sendHeader("Access-Control-Allow-Origin", "*"); server.send ( 200, "application/json", buffer); free (buffer); @@ -512,9 +561,9 @@ void getStatusJSON() { char * listConfigJSON() { #if defined(ENABLE_MQTT) - const size_t bufferSize = JSON_OBJECT_SIZE(9) + 500; + const size_t bufferSize = JSON_OBJECT_SIZE(10) + 500; #else - const size_t bufferSize = JSON_OBJECT_SIZE(5) + 150; + const size_t bufferSize = JSON_OBJECT_SIZE(6) + 150; #endif DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); @@ -525,6 +574,7 @@ char * listConfigJSON() { root["mqtt_user"] = mqtt_user; root["mqtt_pass"] = mqtt_pass; #endif + root["num_seg"] = num_segments; root["ws_cnt"] = WS2812FXStripSettings.stripSize; root["ws_rgbo"] = WS2812FXStripSettings.RGBOrder; root["ws_pin"] = WS2812FXStripSettings.pin; @@ -545,7 +595,7 @@ void getConfigJSON() { } char * listModesJSON() { - const size_t bufferSize = JSON_ARRAY_SIZE(strip->getModeCount() + 3) + (strip->getModeCount() + 3)*JSON_OBJECT_SIZE(2) + 2000; + const size_t bufferSize = JSON_ARRAY_SIZE(strip->getModeCount() + 1) + (strip->getModeCount() + 1)*JSON_OBJECT_SIZE(2) + 2000; DynamicJsonDocument jsonBuffer(bufferSize); JsonArray root = jsonBuffer.to(); JsonObject objectoff = root.createNestedObject(); @@ -622,6 +672,18 @@ void Dbg_Prefix(bool mqtt, uint8_t num) { } void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { + // Select segment + if (payload[0] == 'S') { + uint8_t seg = (uint8_t) strtol((const char *) &payload[1], NULL, 10); + prevsegment = segment; + segment = constrain(seg, 0, MAX_NUM_SEGMENTS); + getSegmentParams(segment); + memcpy(hex_colors_trans, hex_colors, sizeof(hex_colors_trans)); + mode = SET; + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set segment to: [%u]\r\n", segment); + } + // # ==> Set main color - ## ==> Set 2nd color - ### ==> Set 3rd color if (payload[0] == '#') { #if defined(ENABLE_MQTT) @@ -696,7 +758,7 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { // $ ==> Get status Info. if (payload[0] == '$') { - char * buffer = listStatusJSON(); + char * buffer = listStatusJSONorg(); if (mqtt == true) { DBG_OUTPUT_PORT.print("MQTT: "); #if defined(ENABLE_MQTT) @@ -722,6 +784,13 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { bool updateStrip = false; bool updateConf = false; if (payload[1] == 's') { + if (payload[2] == 's') { + char tmp_segments[3]; + snprintf(tmp_segments, sizeof(tmp_segments), "%s", &payload[3]); + tmp_segments[2] = 0x00; + num_segments = constrain(atoi(tmp_segments), 1, MAX_NUM_SEGMENTS - 1); + updateStrip = true; + } if (payload[2] == 'c') { char tmp_count[6]; snprintf(tmp_count, sizeof(tmp_count), "%s", &payload[3]); @@ -1441,203 +1510,239 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght updateConfig = true; } - #if ENABLE_STATE_SAVE == 0 - // *************************************************************************** - // EEPROM helper - // *************************************************************************** - String readEEPROM(uint16_t offset, uint16_t len) { - String res = ""; - for (uint16_t i = 0; i < len; ++i) - { - res += char(EEPROM.read(i + offset)); - //DBG_OUTPUT_PORT.println(char(EEPROM.read(i + offset))); - } - DBG_OUTPUT_PORT.printf("readEEPROM(): %s\r\n", res.c_str()); - return res; - } - - void writeEEPROM(uint16_t offset, uint16_t len, String value) { - DBG_OUTPUT_PORT.printf("writeEEPROM(): %s\r\n", value.c_str()); - for (uint16_t i = 0; i < len; ++i) - { - if (i < value.length()) { - EEPROM.write(i + offset, value[i]); - } else { - EEPROM.write(i + offset, 0); - } - } - } - #endif - #if ENABLE_STATE_SAVE == 1 - // Write configuration to FS JSON - bool writeConfigFS(bool saveConfig){ - if (saveConfig) { - //FS save - DBG_OUTPUT_PORT.println("Saving config: "); - File configFile = SPIFFS.open("/config.json", "w"); - if (!configFile) { - DBG_OUTPUT_PORT.println("Failed!"); - settings_save_conf.detach(); - updateConfig = false; - return false; - } - DBG_OUTPUT_PORT.println(listConfigJSON()); - configFile.print(listConfigJSON()); - configFile.close(); + // Write configuration to FS JSON + bool writeConfigFS(bool saveConfig){ + if (saveConfig) { + //FS save + DBG_OUTPUT_PORT.println("Saving config: "); + File configFile = SPIFFS.open("/config.json", "w"); + if (!configFile) { + DBG_OUTPUT_PORT.println("Failed!"); settings_save_conf.detach(); updateConfig = false; - return true; - //end save - } else { - DBG_OUTPUT_PORT.println("SaveConfig is false!"); return false; } - } - - // Read search_str to FS - bool readConfigFS() { - //read configuration from FS JSON - if (SPIFFS.exists("/config.json")) { - //file exists, reading and loading - DBG_OUTPUT_PORT.print("Reading config file... "); - File configFile = SPIFFS.open("/config.json", "r"); - if (configFile) { - DBG_OUTPUT_PORT.println("Opened!"); - size_t size = configFile.size(); - std::unique_ptr buf(new char[size]); - configFile.readBytes(buf.get(), size); - configFile.close(); - #if defined(ENABLE_MQTT) - const size_t bufferSize = JSON_OBJECT_SIZE(5) + 500; - #else - const size_t bufferSize = JSON_OBJECT_SIZE(1) + 150; - #endif - DynamicJsonDocument jsonBuffer(bufferSize); - DeserializationError error = deserializeJson(jsonBuffer, buf.get()); - DBG_OUTPUT_PORT.print("Config: "); - if (!error) { - DBG_OUTPUT_PORT.println("Parsed!"); - JsonObject root = jsonBuffer.as(); - serializeJson(root, DBG_OUTPUT_PORT); - DBG_OUTPUT_PORT.println(""); - strcpy(HOSTNAME, root["hostname"]); - #if defined(ENABLE_MQTT) - strcpy(mqtt_host, root["mqtt_host"]); - mqtt_port = root["mqtt_port"].as(); - strcpy(mqtt_user, root["mqtt_user"]); - strcpy(mqtt_pass, root["mqtt_pass"]); - #endif - WS2812FXStripSettings.stripSize = constrain(root["ws_cnt"].as(), 1, MAXLEDS); - char tmp_rgbOrder[5]; - strcpy(tmp_rgbOrder, root["ws_rgbo"]); - checkRGBOrder(tmp_rgbOrder); - uint8_t temp_pin; - checkPin((uint8_t) root["ws_pin"]); - WS2812FXStripSettings.fxoptions = constrain(root["ws_fxopt"].as(), 0, 255) & 0xFE; - transEffect = root["transEffect"].as(); - jsonBuffer.clear(); - return true; - } else { - DBG_OUTPUT_PORT.print("Failed to load json config: "); - DBG_OUTPUT_PORT.println(error.c_str()); - jsonBuffer.clear(); - } - } else { - DBG_OUTPUT_PORT.println("Failed to open /config.json"); - } - } else { - DBG_OUTPUT_PORT.println("Coudnt find config.json"); - writeConfigFS(true); - } - //end read + DBG_OUTPUT_PORT.println(listConfigJSON()); + configFile.print(listConfigJSON()); + configFile.close(); + settings_save_conf.detach(); + updateConfig = false; + return true; + //end save + } else { + DBG_OUTPUT_PORT.println("SaveConfig is false!"); return false; } + } + + // Read search_str to FS + bool readConfigFS() { + //read configuration from FS JSON + if (SPIFFS.exists("/config.json")) { + //file exists, reading and loading + DBG_OUTPUT_PORT.print("Reading config file... "); + File configFile = SPIFFS.open("/config.json", "r"); + if (configFile) { + DBG_OUTPUT_PORT.println("Opened!"); + size_t size = configFile.size(); + std::unique_ptr buf(new char[size]); + configFile.readBytes(buf.get(), size); + configFile.close(); + #if defined(ENABLE_MQTT) + const size_t bufferSize = JSON_OBJECT_SIZE(5) + 500; + #else + const size_t bufferSize = JSON_OBJECT_SIZE(1) + 150; + #endif + DynamicJsonDocument jsonBuffer(bufferSize); + DeserializationError error = deserializeJson(jsonBuffer, buf.get()); + DBG_OUTPUT_PORT.print("Config: "); + if (!error) { + DBG_OUTPUT_PORT.println("Parsed!"); + JsonObject root = jsonBuffer.as(); + serializeJson(root, DBG_OUTPUT_PORT); + DBG_OUTPUT_PORT.println(""); + strcpy(HOSTNAME, root["hostname"]); + #if defined(ENABLE_MQTT) + strcpy(mqtt_host, root["mqtt_host"]); + mqtt_port = root["mqtt_port"].as(); + strcpy(mqtt_user, root["mqtt_user"]); + strcpy(mqtt_pass, root["mqtt_pass"]); + #endif + num_segments = constrain(root["num_seg"].as(), 1, MAX_NUM_SEGMENTS - 1); + WS2812FXStripSettings.stripSize = constrain(root["ws_cnt"].as(), 1, MAXLEDS); + char tmp_rgbOrder[5]; + strcpy(tmp_rgbOrder, root["ws_rgbo"]); + checkRGBOrder(tmp_rgbOrder); + uint8_t temp_pin; + checkPin((uint8_t) root["ws_pin"]); + WS2812FXStripSettings.fxoptions = constrain(root["ws_fxopt"].as(), 0, 255) & 0xFE; + transEffect = root["transEffect"].as(); + jsonBuffer.clear(); + return true; + } else { + DBG_OUTPUT_PORT.print("Failed to load json config: "); + DBG_OUTPUT_PORT.println(error.c_str()); + jsonBuffer.clear(); + } + } else { + DBG_OUTPUT_PORT.println("Failed to open /config.json"); + } + } else { + DBG_OUTPUT_PORT.println("Coudnt find config.json"); + writeConfigFS(true); + } + //end read + return false; + } - bool writeStateFS(bool saveConfig){ - if (saveConfig) { - //save the strip state to FS JSON - DBG_OUTPUT_PORT.print("Saving state: "); - //SPIFFS.remove("/stripstate.json") ? DBG_OUTPUT_PORT.println("removed file") : DBG_OUTPUT_PORT.println("failed removing file"); - File configFile = SPIFFS.open("/stripstate.json", "w"); + bool writeStateFS(bool saveConfig){ + if (saveConfig) { + //save the strip state to FS JSON + DBG_OUTPUT_PORT.print("Saving state: "); + //SPIFFS.remove("/stripstate.json") ? DBG_OUTPUT_PORT.println("removed file") : DBG_OUTPUT_PORT.println("failed removing file"); + File configFile = SPIFFS.open("/stripstate.json", "w"); + if (!configFile) { + DBG_OUTPUT_PORT.println("Failed!"); + settings_save_state.detach(); + updateState = false; + return false; + } + DBG_OUTPUT_PORT.println(listStatusJSON()); + configFile.print(listStatusJSON()); + configFile.close(); + char filename[28]; + for (uint8_t seg=0; seg < num_segments; seg++) { + snprintf(filename, 28, "/stripstate_segment_%02i.json", seg); + filename[27] = 0x00; + File configFile = SPIFFS.open(filename, "w"); if (!configFile) { DBG_OUTPUT_PORT.println("Failed!"); settings_save_state.detach(); updateState = false; return false; } - DBG_OUTPUT_PORT.println(listStatusJSON()); - configFile.print(listStatusJSON()); + DBG_OUTPUT_PORT.println(listSegmentStatusJSON(seg)); + configFile.print(listSegmentStatusJSON(seg)); configFile.close(); - settings_save_state.detach(); - updateState = false; - return true; - //end save - } else { - DBG_OUTPUT_PORT.println("SaveStateConfig is false!"); - return false; - } - } - - bool readStateFS() { - //read strip state from FS JSON - //if (resetsettings) { SPIFFS.begin(); SPIFFS.remove("/config.json"); SPIFFS.format(); delay(1000);} - if (SPIFFS.exists("/stripstate.json")) { - //file exists, reading and loading - DBG_OUTPUT_PORT.print("Reading state file... "); - File configFile = SPIFFS.open("/stripstate.json", "r"); - if (configFile) { - DBG_OUTPUT_PORT.println("Opened!"); - size_t size = configFile.size(); - // Allocate a buffer to store contents of the file. - std::unique_ptr buf(new char[size]); - configFile.readBytes(buf.get(), size); - configFile.close(); - const size_t bufferSize = JSON_OBJECT_SIZE(5) + JSON_ARRAY_SIZE(12) + 500; - DynamicJsonDocument jsonBuffer(bufferSize); - DeserializationError error = deserializeJson(jsonBuffer, buf.get()); - DBG_OUTPUT_PORT.print("Config: "); - if (!error) { - DBG_OUTPUT_PORT.print("Parsed"); - JsonObject root = jsonBuffer.as(); - serializeJson(root, DBG_OUTPUT_PORT); - DBG_OUTPUT_PORT.println(""); - mode = static_cast(root["mode"].as()); - ws2812fx_mode = root["ws2812fx_mode"].as(); - ws2812fx_speed = root["speed"].as(); - brightness = root["brightness"]; - main_color.white = root["color"][0].as(); - main_color.red = root["color"][1].as(); - main_color.green = root["color"][2].as(); - main_color.blue = root["color"][3].as(); - back_color.white = root["color"][4].as(); - back_color.red = root["color"][5].as(); - back_color.green = root["color"][6].as(); - back_color.blue = root["color"][7].as(); - xtra_color.white = root["color"][8].as(); - xtra_color.red = root["color"][9].as(); - xtra_color.green = root["color"][10].as(); - xtra_color.blue = root["color"][11].as(); - convertColors(); - jsonBuffer.clear(); - return true; - } else { - DBG_OUTPUT_PORT.print("Failed to load json config: "); - DBG_OUTPUT_PORT.println(error.c_str()); - jsonBuffer.clear(); - } - } else { - DBG_OUTPUT_PORT.println("Failed to open \"/stripstate.json\""); - } - } else { - DBG_OUTPUT_PORT.println("Couldn't find \"/stripstate.json\""); - writeStateFS(true); - } - //end read + } + settings_save_state.detach(); + updateState = false; + return true; + //end save + } else { + DBG_OUTPUT_PORT.println("SaveStateConfig is false!"); return false; } - #endif + } + + bool readStateFS() { + //read strip state from FS JSON + if (SPIFFS.exists("/stripstate.json")) { + //file exists, reading and loading + DBG_OUTPUT_PORT.print("Reading state file... "); + File configFile = SPIFFS.open("/stripstate.json", "r"); + if (configFile) { + DBG_OUTPUT_PORT.println("Opened!"); + size_t size = configFile.size(); + // Allocate a buffer to store contents of the file. + std::unique_ptr buf(new char[size]); + configFile.readBytes(buf.get(), size); + configFile.close(); + const size_t bufferSize = JSON_OBJECT_SIZE(5) + JSON_ARRAY_SIZE(12) + 500; + DynamicJsonDocument jsonBuffer(bufferSize); + DeserializationError error = deserializeJson(jsonBuffer, buf.get()); + DBG_OUTPUT_PORT.print("Config: "); + if (!error) { + DBG_OUTPUT_PORT.print("Parsed"); + JsonObject root = jsonBuffer.as(); + serializeJson(root, DBG_OUTPUT_PORT); + DBG_OUTPUT_PORT.println(""); + segment = root["segment"]; + mode = static_cast(root["mode"].as()); + brightness = root["brightness"]; + jsonBuffer.clear(); + return true; + } else { + DBG_OUTPUT_PORT.print("Failed to load json config: "); + DBG_OUTPUT_PORT.println(error.c_str()); + jsonBuffer.clear(); + } + } else { + DBG_OUTPUT_PORT.println("Failed to open \"/stripstate.json\""); + } + } else { + DBG_OUTPUT_PORT.println("Couldn't find \"/stripstate.json\""); + writeStateFS(true); + } + //end read + return false; + } + + bool readStateSegmentFS(uint8_t seg) { + //read strip state from FS JSON + char filename[28]; + snprintf(filename, 28, "/stripstate_segment_%02i.json", seg); + filename[27] = 0x00; + if (SPIFFS.exists(filename)) { + //file exists, reading and loading + DBG_OUTPUT_PORT.printf("Reading segmentstate file: %s\r\n", filename); + File configFile = SPIFFS.open(filename, "r"); + if (configFile) { + DBG_OUTPUT_PORT.println("Opened!"); + size_t size = configFile.size(); + // Allocate a buffer to store contents of the file. + std::unique_ptr buf(new char[size]); + configFile.readBytes(buf.get(), size); + configFile.close(); + const size_t bufferSize = JSON_OBJECT_SIZE(5) + JSON_ARRAY_SIZE(12) + 500; + DynamicJsonDocument jsonBuffer(bufferSize); + DeserializationError error = deserializeJson(jsonBuffer, buf.get()); + DBG_OUTPUT_PORT.print("Config: "); + if (!error) { + DBG_OUTPUT_PORT.print("Parsed"); + JsonObject root = jsonBuffer.as(); + serializeJson(root, DBG_OUTPUT_PORT); + DBG_OUTPUT_PORT.println(""); + seg_start = root["start"].as(); + seg_stop = root["stop"].as(); + ws2812fx_mode = root["ws2812fx_mode"].as(); + ws2812fx_speed = root["speed"].as(); + main_color.white = root["color"][0].as(); + main_color.red = root["color"][1].as(); + main_color.green = root["color"][2].as(); + main_color.blue = root["color"][3].as(); + back_color.white = root["color"][4].as(); + back_color.red = root["color"][5].as(); + back_color.green = root["color"][6].as(); + back_color.blue = root["color"][7].as(); + xtra_color.white = root["color"][8].as(); + xtra_color.red = root["color"][9].as(); + xtra_color.green = root["color"][10].as(); + xtra_color.blue = root["color"][11].as(); + convertColors(); + jsonBuffer.clear(); + return true; + } else { + DBG_OUTPUT_PORT.print("Failed to load json config: "); + DBG_OUTPUT_PORT.println(error.c_str()); + jsonBuffer.clear(); + } + } else { + DBG_OUTPUT_PORT.printf("Failed to open \"/%s\"\r\n", filename); + } + } else { + DBG_OUTPUT_PORT.printf("Couldn't find \"/%s\"", filename); + writeStateFS(true); + } + //end read + return false; + } + + + #endif + #if defined(ENABLE_REMOTE) // *************************************************************************** // Request handler for IR remote support diff --git a/Arduino/McLighting/rest_api.h b/Arduino/McLighting/rest_api.h index 37e8d6b..f2d680d 100644 --- a/Arduino/McLighting/rest_api.h +++ b/Arduino/McLighting/rest_api.h @@ -129,12 +129,7 @@ root["ota"] = "OFF"; #endif #if defined(ENABLE_STATE_SAVE) - #if ENABLE_STATE_SAVE == 1 - root["state_save"] = "SPIFFS"; - #endif - #if ENABLE_STATE_SAVE == 0 - root["state_save"] = "EEPROM"; - #endif + root["state_save"] = "SPIFFS"; #else root["state_save"] = "OFF"; #endif @@ -256,6 +251,11 @@ bool updateStrip = false; bool updateConf = false; + if(server.hasArg("ws_seg")){ + uint8_t wsseg = server.arg("ws_seg").toInt(); + num_segments = constrain(wsseg, 1, MAX_NUM_SEGMENTS - 1); + updateStrip = true; + } if(server.hasArg("ws_cnt")){ uint16_t pixelCt = server.arg("ws_cnt").toInt(); if (pixelCt > 0) { diff --git a/Arduino/McLighting/trash.ino b/Arduino/McLighting/trash.ino new file mode 100644 index 0000000..10cec98 --- /dev/null +++ b/Arduino/McLighting/trash.ino @@ -0,0 +1,33 @@ +char * listStatusJSON2() { + const size_t bufferSize = 10*JSON_ARRAY_SIZE(12) + 10*JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(12) + 600; + DynamicJsonDocument jsonBuffer(bufferSize); + JsonObject root = jsonBuffer.to(); + root["mode"] = (uint8_t) mode; + root["brightness"] = brightness; + for(uint8_t i=0; i<10; i++) { + char int2char[3]; + itoa(i, int2char, 10); + JsonObject segments = root.createNestedObject(int2char); + segments["ws2812fx_mode"] = strip->getMode(i); + segments["ws2812fx_mode_name"] = strip->getModeName(strip->getMode(i)); + segments["speed"] = ws2812fx_speed; + JsonArray color = segments.createNestedArray("color"); + color.add(main_color.white); + color.add(main_color.red); + color.add(main_color.green); + color.add(main_color.blue); + color.add(back_color.white); + color.add(back_color.red); + color.add(back_color.green); + color.add(back_color.blue); + color.add(xtra_color.white); + color.add(xtra_color.red); + color.add(xtra_color.green); + color.add(xtra_color.blue); + } + uint16_t msg_len = measureJson(root) + 1; + char * buffer = (char *) malloc(msg_len); + serializeJson(root, buffer, msg_len); + jsonBuffer.clear(); + return buffer; +} diff --git a/Arduino/McLighting/version_info.ino b/Arduino/McLighting/version_info.ino index 873bfe9..9bde1ea 100644 --- a/Arduino/McLighting/version_info.ino +++ b/Arduino/McLighting/version_info.ino @@ -188,4 +188,11 @@ * Version Bump to 3.0.0.BETA1 * further code changes * bugfixes + * + * 30 September 2019 + * Version Bump to 3.1.0.ALPHA1 + * further code changes + * removal of saving to EEPROM + * first integration of multi segments + * */ From 95de53d04518b7cc7f7b5eb6c3e4e65f609bed56 Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Tue, 1 Oct 2019 07:05:57 +0200 Subject: [PATCH 12/28] Bugfix colors were not set correctly, if transition effects were off. --- Arduino/McLighting/mode_custom_ws2812fx_animations.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Arduino/McLighting/mode_custom_ws2812fx_animations.h b/Arduino/McLighting/mode_custom_ws2812fx_animations.h index a851d82..e64c92a 100644 --- a/Arduino/McLighting/mode_custom_ws2812fx_animations.h +++ b/Arduino/McLighting/mode_custom_ws2812fx_animations.h @@ -13,16 +13,16 @@ More info on how to create custom aniamtions for WS2812FX: https://github.com/ki void handleAutoPlay() { if (autoDelay <= millis()) { - hex_colors[0] = autoParams[autoCount][0]; - hex_colors[1] = autoParams[autoCount][1]; - hex_colors[2] = autoParams[autoCount][2]; - strip->setColors(selected_segment, hex_colors); + hex_colors_trans[0] = autoParams[autoCount][0]; + hex_colors_trans[1] = autoParams[autoCount][1]; + hex_colors_trans[2] = autoParams[autoCount][2]; + strip->setColors(selected_segment, hex_colors_trans); strip->setSpeed(selected_segment, convertSpeed((uint8_t)autoParams[autoCount][3])); strip->setMode(selected_segment, (uint8_t)autoParams[autoCount][4]); strip->trigger(); autoDelay = millis() + (uint32_t)autoParams[autoCount][5]; DBG_OUTPUT_PORT.print("autoTick "); - DBG_OUTPUT_PORT.printf("autoTick[%d]: {0x%08x, 0x%08x, 0x%08x, %d, %d, %d}\r\n", autoCount, hex_colors[0], hex_colors[1], hex_colors[2], autoParams[autoCount][3], autoParams[autoCount][4], autoParams[autoCount][5]); + DBG_OUTPUT_PORT.printf("autoTick[%d]: {0x%08x, 0x%08x, 0x%08x, %d, %d, %d}\r\n", autoCount, hex_colors_trans[0], hex_colors_trans[1], hex_colors_trans[2], autoParams[autoCount][3], autoParams[autoCount][4], autoParams[autoCount][5]); autoCount++; if (autoCount >= (sizeof(autoParams) / sizeof(autoParams[0]))) autoCount = 0; From a0a8fe72b544aab4ede8252b6cdf7caaa32ce10d Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Thu, 3 Oct 2019 19:28:39 +0200 Subject: [PATCH 13/28] 3.1.0.ALPHA2 * Version Bump to 3.1.0.ALPHA2 * further code changes * further integration of multi segments * integration of multi segments to GUI --- Arduino/McLighting/McLighting.ino | 178 +- Arduino/McLighting/data/edit.htm | 4 +- Arduino/McLighting/data/edit.htm.gz | Bin 5489 -> 5563 bytes Arduino/McLighting/data/index.htm | 159 +- Arduino/McLighting/data/index.htm.gz | Bin 19755 -> 20547 bytes Arduino/McLighting/definitions.h | 7 +- Arduino/McLighting/filesystem_functions.h | 262 ++ Arduino/McLighting/helper_functions.h | 283 ++ Arduino/McLighting/htm_edit_gz.h | 924 ++--- Arduino/McLighting/htm_index_gz.h | 3362 +++++++++-------- Arduino/McLighting/json_functions.h | 269 ++ .../mode_custom_ws2812fx_animations.h | 20 +- Arduino/McLighting/request_handlers.h | 1116 ++---- Arduino/McLighting/rest_api.h | 713 ++-- Arduino/McLighting/trash.ino | 33 - Arduino/McLighting/version.h | 2 +- Arduino/McLighting/version_info.ino | 6 + 17 files changed, 3828 insertions(+), 3510 deletions(-) create mode 100644 Arduino/McLighting/filesystem_functions.h create mode 100644 Arduino/McLighting/helper_functions.h create mode 100644 Arduino/McLighting/json_functions.h delete mode 100644 Arduino/McLighting/trash.ino diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino index abf3bc7..644b281 100644 --- a/Arduino/McLighting/McLighting.ino +++ b/Arduino/McLighting/McLighting.ino @@ -1,4 +1,8 @@ #include "definitions.h" +// *************************************************************************** +// Load library "ticker" for blinking status led, mqtt send and save state +// *************************************************************************** +#include #include "version.h" // *************************************************************************** @@ -10,10 +14,10 @@ #include #include #include //https://github.com/tzapu/WiFiManager - +#include + #include #include -#include #include //https://github.com/Links2004/arduinoWebSockets #include @@ -25,8 +29,6 @@ GY33_MCU tcs; #endif -#include //https://github.com/bblanchon/ArduinoJson - // MQTT #if defined(ENABLE_MQTT) #if ENABLE_MQTT == 0 @@ -47,12 +49,11 @@ AsyncMqttClient * mqtt_client; WiFiEventHandler wifiConnectHandler; WiFiEventHandler wifiDisconnectHandler; + Ticker mqttReconnectTimer; + Ticker wifiReconnectTimer; #endif -#endif - -#if defined(ARDUINOJSON_VERSION) - #if !(ARDUINOJSON_VERSION_MAJOR == 6 and ARDUINOJSON_VERSION_MINOR >= 8) - #error "Install ArduinoJson v6.8.x or higher" + #if defined(ENABLE_HOMEASSISTANT) + Ticker ha_send_data; #endif #endif @@ -166,21 +167,9 @@ WS2812FX * strip = NULL; } #endif -// *************************************************************************** -// Load library "ticker" for blinking status led, mqtt send and save state -// *************************************************************************** -#include Ticker ticker; -#if defined(ENABLE_MQTT) - #if ENABLE_MQTT == 1 - Ticker mqttReconnectTimer; - Ticker wifiReconnectTimer; - #endif - #if defined(ENABLE_HOMEASSISTANT) - Ticker ha_send_data; - #endif -#endif + void tick() { //toggle state @@ -193,9 +182,6 @@ void tick() { decode_results results; #endif -Ticker settings_save_state; -Ticker settings_save_conf; - // *************************************************************************** // Saved state handling in WifiManager // *************************************************************************** @@ -242,97 +228,22 @@ void saveConfigCallback () { // *************************************************************************** #include "spiffs_webserver.h" -// *************************************************************************** -// Include: Request handlers -// *************************************************************************** -#include "request_handlers.h" - // *************************************************************************** // Include: Custom animations // *************************************************************************** #include "mode_custom_ws2812fx_animations.h" // Add animations in this file -// function to Initialize the strip -void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, char RGBOrder[5] = WS2812FXStripSettings.RGBOrder, uint8_t pin = WS2812FXStripSettings.pin, uint8_t fxoptions = WS2812FXStripSettings.fxoptions ){ - DBG_OUTPUT_PORT.println("Initializing strip!"); -/*#if defined(USE_WS2812FX_DMA) - if (dma != NULL) { - delete(dma); - } -#endif*/ - if (strip != NULL) { - delete(strip); - WS2812FXStripSettings.stripSize = stripSize; - strcpy(WS2812FXStripSettings.RGBOrder, RGBOrder); - WS2812FXStripSettings.pin = pin; - WS2812FXStripSettings.fxoptions = fxoptions; - } - - if (ledstates != NULL) { - delete(ledstates); - } - ledstates = new uint8_t [WS2812FXStripSettings.stripSize]; +// *************************************************************************** +// Include: helper functions +// *************************************************************************** +#include "helper_functions.h" -#if !defined(LED_TYPE_WS2811) - strip = new WS2812FX(stripSize, pin, checkRGBOrder(RGBOrder) + NEO_KHZ800); -#else - strip = new WS2812FX(stripSize, pin, checkRGBOrder(RGBOrder) + NEO_KHZ400); -#endif - // Parameter 1 = number of pixels in strip - // Parameter 2 = Arduino pin number (most are valid) - // Parameter 3 = pixel type flags, add together as needed: - // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) - // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) - // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products) - // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2) - - // IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across - // pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input - // and minimize distance between Arduino and first pixel. Avoid connecting - // on a live circuit...if you must, connect GND first. - strip->init(); - #if defined(USE_WS2812FX_DMA) - initDMA(stripSize); - strip->setCustomShow(DMA_Show); - #endif -//parameters: index, start, stop, mode, color, speed, options - for (uint8_t seg=0; seg < num_segments; seg++) { - (readStateSegmentFS(seg)) ? DBG_OUTPUT_PORT.println("Segment state config FS read Success!") : DBG_OUTPUT_PORT.println("Segment state config FS read failure!"); - strip->setSegment(seg, seg_start, seg_stop , ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions); - } - //strip->setSegment(0, 0, (stripSize - 1)/2, ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions); - //strip->setSegment(1, ((stripSize - 1)/2) + 1, (stripSize - 1), ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions); - strip->setCustomMode(0, F("Autoplay"), myCustomEffect0); - strip->setCustomMode(1, F("Custom WS"), myCustomEffect1); -#if defined(CUSTOM_WS2812FX_ANIMATIONS) - strip->setCustomMode(2, F("TV"), myCustomEffect2); - strip->setCustomMode(3, F("E1.31"), myCustomEffect3); - strip->setCustomMode(4, F("Fire 2012"), myCustomEffect4); - strip->setCustomMode(5, F("Gradient"), myCustomEffect5); - gReverseDirection = (WS2812FXStripSettings.fxoptions & 128); - DBG_OUTPUT_PORT.print("Number of Segments: "); - DBG_OUTPUT_PORT.println(strip->getNumSegments()); - - if (e131 != NULL) { delete(e131); } - e131 = new ESPAsyncE131(END_UNIVERSE - START_UNIVERSE + 1); - float universe_leds = 170.0; // a universe has only 512 (0..511) channels: 3*170 or 4*128 <= 512 - if (strstr(WS2812FXStripSettings.RGBOrder, "W") != NULL) { - //universe_leds = 128.0; - } - float float_enduni = stripSize/universe_leds; - uint8_t END_UNIVERSE = stripSize/universe_leds; - if (float_enduni > END_UNIVERSE) { - END_UNIVERSE = END_UNIVERSE +1; - } - - // if (e131.begin(E131_UNICAST)) // Listen via Unicast - if (e131->begin(E131_MULTICAST, START_UNIVERSE, END_UNIVERSE)) {// Listen via Multicast - DBG_OUTPUT_PORT.println(F("Listening for data...")); - } else { - DBG_OUTPUT_PORT.println(F("*** e131.begin failed ***")); - } -#endif -} +// *************************************************************************** +// Include: other functions +// *************************************************************************** +#include "json_functions.h" +#include "filesystem_functions.h" +#include "request_handlers.h" #if defined(ENABLE_MQTT) void initMqtt() { @@ -713,6 +624,7 @@ void loop() { // *************************************************************************** // Simple statemachine that handles the different modes // *************************************************************************** + if ((mode == OFF) && ((strip->getBrightness() == 0) || !transEffect)) { if(strip->isRunning()) { strip->strip_off(); // Workaround: to be shure, @@ -742,15 +654,6 @@ void loop() { } } } - - if (mode == INIT_STRIP) { - mode = prevmode; - strip->strip_off(); - delay(10); - if(strip->isRunning()) strip->stop(); - initStrip(); - prevmode = INIT_STRIP; - } if (mode == SET) { mode = HOLD; @@ -790,8 +693,16 @@ void loop() { } prevmode = SET; strip->trigger(); - } - + } + + if ((mode == HOLD) || ((mode == OFF) && (strip->getBrightness() > 0) && transEffect)) { + if (ws2812fx_mode == FX_MODE_CUSTOM_0) { + handleAutoPlay(); + } + if(!strip->isRunning()) strip->start(); + strip->service(); + } + if (prevmode != mode) { convertColors(); if (memcmp(hex_colors_trans, strip->getColors(segment), sizeof(hex_colors_trans)) != 0) { @@ -800,13 +711,6 @@ void loop() { } strip->setSpeed(segment, convertSpeed(ws2812fx_speed_actual)); //strip->setBrightness(brightness_actual); - if (prevmode != INIT_STRIP) { // do not save if INIT_STRIP mode was set - #if defined(ENABLE_STATE_SAVE) - if(!settings_save_state.active()) settings_save_state.once(3, tickerSaveState); - #endif - snprintf(last_state, sizeof(last_state), "STA|%2d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d|%3d", prevmode, ws2812fx_mode, ws2812fx_speed, brightness, main_color.red, main_color.green, main_color.blue, main_color.white, back_color.red, back_color.green, back_color.blue, back_color.white, xtra_color.red, xtra_color.green, xtra_color.blue, xtra_color.white); - last_state[sizeof(last_state) - 1] = 0x00; - } #if defined(ENABLE_MQTT) #if ENABLE_MQTT == 0 mqtt_client->publish(mqtt_outtopic, mqtt_buf); @@ -819,22 +723,21 @@ void loop() { #endif #endif } + + prevmode = mode; + #if defined(ENABLE_STATE_SAVE) if (updateState){ - (writeStateFS(updateState)) ? DBG_OUTPUT_PORT.println(" State FS Save Success!") : DBG_OUTPUT_PORT.println("State FS Save failure!"); + (writeStateFS(updateState)) ? DBG_OUTPUT_PORT.println("State FS Save Success!") : DBG_OUTPUT_PORT.println("State FS Save failure!"); + } + if (updateSegState) { + (writeSegmentStateFS(updateSegState, segment)) ? DBG_OUTPUT_PORT.println("Segment State FS Save Success!") : DBG_OUTPUT_PORT.println("Segment State FS Save failure!"); + initStrip(); } if (updateConfig) { (writeConfigFS(updateConfig)) ? DBG_OUTPUT_PORT.println("Config FS Save success!"): DBG_OUTPUT_PORT.println("Config FS Save failure!"); } #endif - - if ((mode == HOLD) || ((mode == OFF) && (strip->getBrightness() > 0) && transEffect)) { - if (ws2812fx_mode == FX_MODE_CUSTOM_0) { - handleAutoPlay(); - } - if(!strip->isRunning()) strip->start(); - strip->service(); - } // Async color transition if (memcmp(hex_colors_trans, strip->getColors(segment), sizeof(hex_colors_trans)) != 0) { @@ -917,7 +820,6 @@ void loop() { } } */ - prevmode = mode; #if defined(ENABLE_REMOTE) handleRemote(); diff --git a/Arduino/McLighting/data/edit.htm b/Arduino/McLighting/data/edit.htm index c8e8727..728b705 100644 --- a/Arduino/McLighting/data/edit.htm +++ b/Arduino/McLighting/data/edit.htm @@ -182,7 +182,9 @@ var mkfile = document.createElement("button"); mkfile.innerHTML = 'MkFile'; document.getElementById(element).appendChild(mkfile); - + var para = document.createElement("text"); + para.innerHTML = " Press Ctrl-S for save, Ctrl-Z for undo, Ctrl-Shift-Z for redo"; + document.getElementById(element).appendChild(para); function httpPostProcessRequest(){ if (xmlHttp.readyState == 4){ if(xmlHttp.status != 200) alert("ERROR["+xmlHttp.status+"]: "+xmlHttp.responseText); diff --git a/Arduino/McLighting/data/edit.htm.gz b/Arduino/McLighting/data/edit.htm.gz index 9466db2415e67a661531a9e7f152554c10cffe2c..03cc7007caa1f26277ec996e2fdc86aea5d9c7b8 100644 GIT binary patch literal 5563 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 JpMMQv002^C#<>6h literal 5489 zcmV-%6^`m3iwFo1oP%5h0A*xpbS`LgZ2;{YXM6HC@OyuS>yAK~AtY~RTXqtlgpq`# z>oK+fC&qSc6Ci2&+k29{2RNhiDenMFcc;74>2x|tKK{JgsSIu|YRuG_N#A~UjK3I( zlP4!ElG$%RW0>P9;spEyej1`7p>O*aXZ3oYsR^Q?XvaBHXaeZQN;N0MI%KMkaoyyt4jvJMS=OESS-5gIsSg4DRWuK@QS1Wv}+)-yWN#IX-xfyBwwI2cyNlqiWhw23>z&%dFlz_?d=o`M;t zO+?vKq;i5F$`dGC#{o1790WT|LlS3*kI2=8C}$R;U`!90y}Vl^{9MzaGXPlxvfA3# zbd{4`?a^+e-5l&gQI=fL=`dN*t{^97lB6#_oUlEVNNkR_6xu9BZ&CD#we)3YyzM^x0#^m=A5n zNz67Ll2=F*IGIZ`B~9c&;(mznXJ*P%W)6i=AtB!I8!`-x(YGz0Rd0G=imwciO9|A>jD zF2Y7Stnlz~gvN@7nCCa@jqr8|%y1(K3AV^VasnE2bIAy?&+J~THux#x?~!mQD@MX@ zFd3;9;z2%AFK&M_*Q5k1a0YiM&bSH6sq*A##OY|Sm=>?fo!%nfY)q6Ae17O(PHUGF z_*KS_l}V*^gMZXJXmN>uG={zU^=WS~D%|FULVb1HEthW_2jXqNd_KCa%ePnO(#>^m zm**wv0wbu)^IolfiGI*@sl7eV=S$s516=fqlj`+OGgXn!&YIok>f!RL`#7l8cB-?| zw6!QrFZa8*%4xAw=oTjJex2h{v0X9F_xl&+`l58-n~SGSwX~=Ae#o`vpPm}K;&$<# zH@M4(USrxA%JYLx?!x%ge$w0Gz4Ta59Tp}H#b*7c{Ql4w}dgAsVU&&3+i>=F% zv76i1eo(KkBz3>n*AC8$`B8CyysUGB?m=p7?ALDh+UGZ;eCIwT$Ttmjb}<<)nrEfQ z)^h*xX2|b0gm$TWKIzu()w|wcy0bUv7cNuP>+4)~`_uLOW-{AX7w4;+ZCSn5Z=0Rv z*{pN5eU_URQ=PrX+GMv;xh<=cS!r)N++UnFFHftz^00d&^4+2)@jHWY{;I9-S5M3R z{k>wna8uXSyUFFvU2~W#J?%_%p(_*+DxWT9LgRXP%1_FT{{8K+GgPL0ZHPuarOTHl zcMlLY{cw{iU9ILjw>x^N`7mxOjkb;!WmG%sTui#l<;D5g9p5r}J$#Gkh2H~fB~eP6po_bqWTf4n+PP3GNl_o>q;4u#Ta zzt-V<{6qJ#dVf<8E3NsmRyi;3oGYXDP?;MKjY*X&3_e{xw3-X!pxIl^m(8p4>fvfQ zd^l4omCH)$VS3pSmBDr8Q=>TO);iUE>0(vLeQFej>U{gWn39<O16_qq9L(Rj!Z( zmQlW{j~4S?rQJTiEKil;YS)+vJ-)qI%`OU^R+nqtEe~>!a#`8C+G*~IPo=@EFSogT z_2JVPX=lpxe5!4$`Ryl7dMX}hxAkHNy5RhNSlD^I>OS45sm17~ag}ST!{*&14CZ}9 zKWkRB_7A0-`tq*OX!dt+ua}b|S~T_ZG1q9H-Rw4p4;N4St#bKpFSV*ZUR``TfNwQ- zP(M)4mOC9$KfPX{PaRImpDrsfh`KN$YiC^;khL=ynxtq7|DE9qT2zC_DTQ5B_iMTG z?WA;(f0#D!cC=yVQwe`+QhjjWpLb`K3Y!E^oY9bqIO8pD2Twq8UD1YUX-Wf8W_!;a zvJuGeDwy>Qk>{igCy5i7nP#FONUf3e3GJ4E`zc;#ZCan z$uQed=FJj|!;Hyc#^Nwzawy7UQ5FrvZ0kf&M^uw>i}pQQjWuqD^w^|r8g5p{nlghD zr!p9e+g!MT3?(j>BZa@?zL=|$!U<&Y5i3IXukbWFHiK)vz|b!2M~>`5(XMiY$Phwg z2^?zpp=&Z)h!;ZsCD#|&N?s+Um*J6O7|JYKQfHhO@`U9;pE%?krVvSUq?s>NjhOH| z7_@pK2FnhI4lgbi)@U1RHYnPzpW1N_)`w2shSx;Zurf2_xy)m+7#R4Rf$E}!E=?m$ znBykR;Lb`jR69wBp+`<*mNV(pFw`S=p}E{RVFZPrV+vVHyhiCISW?eAc@v6|#knNF zV#mM)>#v+a=r5`g1{iaaj{Nm9H^X%#rgo4W7AD9r+b^%q1WUGLmQz(E3zexT2?;_e z>6Jz0jOlAc!SGp8z^u^GoWUim7r+)3uMd57wj^PA<{IdVljZ~__f}CcHJ_xTIT)zC zMpg>o7M7M|MOjAL>7d;L(gxH4X09`zpJ3;eWH-2tPQ(mYP`!mE}DW?rxRb(9v(2@={ z=Yu5OjCq_7@jZYv2E6G77;S=#gGW37eCRLhCfT5?qr^Ninmj_U$l!U0?G}ErwRRMQ z%qlX`8I~0BQ^=)*<|5Qi(H--F2ya#eXJxilHy=Ii*g$5VC#X|MGio?D0Fz)ZE(ZX? z=CHqJL*aBx$|4OAL0$PQ7Ubk5k-uk7Y%L~`&x~9hlO<{W&N#tl*(8|K2?VN1NDdow zO?L5PcEp-qHRqfx_9&N{6b|*`8}_edRzmUweEcy}uz2)$74<$2ikB4BdIkQR2uxZG z07{&0oLRs*Q#<*vh8eS2jHS;%m_9UOblC=v<3ULO1nB z1@H+Ql;-8%HOxp9k!D=t{+Rzc?J|LN9 z`osojIS;~}iY6ukd77|M+&Vu~40sy&ACT5?@0crXDaSIu{pK>_2yf&Q&P9dLNLgHX zTBdSEV>%Ds&RNG!YCCB+7IO*ho8$)&Jy?NL#0th*Xq`j`UaSeidILZbn)DQ9-AYFg zA6-}$27rO6`VVHH@6MXMHJ-O9M?`{n0<9_w8GjSAAWGQO(w1PNWJqRZE1A_b-t5X0 z`<+#LVrX;sg6$=eg$t_4_#Cjb%UEa`FJZH0-V$pK?^?M>iq(-pNRr$P1N8>t$Kq_l zfPg3LR*Fct#WIA}2|MGK<}UVjKL6Db1J7o4`YNt(l^7HYz2Hc0rpq~dyG@+-&Pb!;#3_S=g1>_6hzw` zJHaQO5(4=RhjSZ$qzEe)5xu;sSpFojH^-QROr!_(2iE^p7cIc`OJ3xPvWb zCrQY=b?S%yvG8-!N0UUb4P+2dbHM+Dy4{@8V~&#A68;zdvN3|EoTLAH`2%{{=X6QZ z@?Bn+Qt-f#qENFT*+ScF0ywd(#!A!Hq%}S7&c@mTIO?bPp^gKh)eD*gra&}U4e3G? zFc?)IGuufIvK2#_7(QBL+=anAfpcVANiR*Om;WwvdkG{{kc1PS@3AnGga^nh3$w8* zM9hXgefyDOrMKuPri9Gg`9DFUk-;Pp>%S37l8_B&i$Nq)_r9*7NMSvX&n?^i9>9r{ z^9o5q{^LA2@fTE2XZSGL8x&VM{6|P$LmvNQE}QyAnN7Qu<9log3p01j7JLoifk3Z#7BZ)0X$G3 zU+?4JsrfFl=Fq9JewfWUK;bR6;BZ8+NvG<&$g0haVkm#B5^WDQh7`tgn-f+Sp5?spA zdB{m+ZAS3)plA3yXaR#Hi8$uOEsruD>&Upq6@F-%rV9f!F;P6uusdbnG6~unlaHPczL8A@3 zF08YF;#r6-ooSAs*!emcQ5NUsL9tbO(#cY$Q?JALfGuB@n~;;FK7g=^(PTJHl1Bb% z*1u^@pyOM3S>s@j)??$=&64-pIYuD~uh$$uVGY>MMgFN^8O*@?2p>FcRt5- z>|Iip`TA=|9cHuEGv?0v&8{6W1n<>@m(+)iUf6dBG)o76`sgMN#n{Ow`lP_TwL$Th zXD3O^uNmA}+?c-W^Yy~nwN8fjZ%EIQ_9NZp8lIhky$<0Y937i6H(XtKSL7xQKn*^Br5qup3Jbb58!JIN7V$u3h z{P`#ppe6-YiMZHwz$eymX1}?cxIjKMS|TK{>oI@gxGA1VT66<*l#gQ0ZWP~?az zKB}20cvX$6(W9DQ1~_&GHSw}>j?r2Orim;W9XLdVWwT`W`my*lzU7?AxQ%;?v|sV`;#LLik##bl?Wf zv;}Z=xPx7%%jrwl?aim5Iwp|ovLqHZ7K4r7Ccl6+_7t&F5W% z)eyDBL&+4`=`W8f59z0j8T@9QQ}8j0N3!Ii8P1QeqNHXf~pU>m6yxG z2#g9PKFE4D-$IIU7v@bjYOH%Q@d7qV2b4zNMv&NOxAc5K0FU)8sw@B!M)qMC(~$Ia zLx6-bQ*^1(BfW32`WSW}=yQy}KAfXWxnj6@Q5 z0aOfLF*k!>rek&pyLw{)Q-KMJX9WyPzJtJD5<}^e11}<(m(J)*dR8`Q6g!tX>MLVo z0Pj#q5EX310MI@pzY~Q}rcdFJgarSL5|7_I+Jbq>q8kM6!xqQ|EWwR7xviD3c0K%t zr_5$>l|j$KlB7a^C%i_4UCkl0rE`zS1lUS@07fw5HxayE>v-4IH=Xa2YtPF zm+?Oxq-U}<~;U&#~r@%7K& zBy$rn?exSf4R2LT(-$5v&!o8@q2y85 zE7qR9%mj;zSj*=*;9)PYV&~>BfX8S7EK_gCIl6ZCydjHT1;$;dA3{<~knePeNtC%T zmLPwFM}3aF4!}>;e9jg{8Us#ptfZIqbRPWR`Kl&W&+qpZ(Tp8na=& zfBhJr%wrUKyP9?P{}F342}ku95h^VaF)1kX)nchbYs?-At+OIc`}(tWp_#lW*oz{P no8cJCdso~<-SVJr0V+kH;$kV`Mf5rPLi#@dGyD|xp -
+
+
+
+

selectSeg

+ +
+
+
-

selectCount

- +

selectSegCnt

+
-

selectRGBO

+

selectCount

+ +
+

selectRGBO

-

selectPin

- +

selectPin

+
@@ -983,6 +993,14 @@ input[type=number], label{
+
+

segStart

+ +
+

segStop

+ +
+

selectColors

@@ -1043,6 +1061,9 @@ var language = { white: "White", not_greater: "cannot enter numbers greater than 255", not_less: "cannot enter numbers less than 0", + selectSeg: "Select segment", + segStart: "First LED of selected segment", + segStop: "Last LED of selected segment", wsMessage: "Websocket Message:", selectLanguage: "Select Language:", selectHostname: "Hostname:", @@ -1050,6 +1071,7 @@ var language = { selectMQTTPort: "and Port:", selectMQTTUser: "MQTT Username:", selectMQTTPass: "MQTT Password:", + selectSegCnt: "Number of Segments:", selectCount: "Strip LED Count:", selectRGBO: "RGB Order:", selectPin: "Strip GPIO Pin:", @@ -1099,6 +1121,9 @@ var language = { white: "Wit", not_greater: "Geen nummers hoger dan 255", not_less: "Geen nummers lager dan 0", + selectSeg: "Selecteer segment", + segStart: "Eerste LED van huidige segmenten", + segStop: "Laatste LED van huidige segmenten", wsMessage: "Websocket message:", selectLanguage: "Selecteer Taal:", selectHostname: "Hostname:", @@ -1106,6 +1131,7 @@ var language = { selectMQTTPort: "en Port:", selectMQTTUser: "MQTT gebruikersnaam:", selectMQTTPass: "MQTT wachtwoord:", + selectSegCnt: "Number of Segments:", selectCount: "LED nummer:", selectPin: "Strip GPIO Pin:", selectRGBO: "RGB Order:", @@ -1155,6 +1181,9 @@ var language = { white: "Weiß", not_greater: "Akzeptiere keine Nummern größer 255", not_less: "Akzeptiere keine Nummern kleiner 0", + selectSeg: "Segment wählen", + segStart: "Erste LED des gewählten Segments", + segStop: "Letzte LED des gewählten Segments", wsMessage: "Websocket Message:", selectLanguage: "Sprache auswählen:", selectHostname: "Hostname:", @@ -1162,6 +1191,7 @@ var language = { selectMQTTPort: "und Port:", selectMQTTUser: "MQTT Username:", selectMQTTPass: "MQTT Password:", + selectSegCnt: "Anzahl Segmente:", selectCount: "Strip LED Anzahl:", selectRGBO: "RGB Reihenfolge:", selectPin: "Strip GPIO Pin:", @@ -1281,6 +1311,7 @@ var config = { mqtt_port: 0, mqtt_user: "", mqtt_pass: "", + ws_seg: 1, ws_cnt: 0, ws_rgbo: "", ws_pin: 0, @@ -1289,6 +1320,9 @@ var config = { transitionEffects: true }; var data = { + segment: 0, + start: 0, + stop: 0, mode: 0, color: {w:0, r:0, g:0, b:0, hex:"00000000", w2:0, r2:0, g2:0, b2:0, hex2:"00000000", w3:0, r3:0, g3:0, b3:0, hex3:"00000000"}, brightness: 192, @@ -1341,7 +1375,7 @@ function displayColors(all = false) { } // initial color val numbers when DOM is loaded -function colorNumrVals(){ +function colorNumVals(){ redNumVal.value = red.value; greenNumVal.value = green.value; blueNumVal.value = blue.value; @@ -1447,7 +1481,7 @@ function initcolorSliders(){ displayColors(); initSliderColors(); changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); // Trigger onChange event to send value redNumVal.dispatchEvent(event); }); @@ -1456,7 +1490,7 @@ function initcolorSliders(){ displayColors(); initSliderColors(); changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); // Trigger onChange event to send value greenNumVal.dispatchEvent(event); }); @@ -1465,7 +1499,7 @@ function initcolorSliders(){ displayColors(); initSliderColors(); changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); // Trigger onChange event to send value blueNumVal.dispatchEvent(event); }); @@ -1474,7 +1508,7 @@ function initcolorSliders(){ displayColors(); initSliderColors(); changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); // Trigger onChange event to send value whiteNumVal.dispatchEvent(event); }); @@ -1482,14 +1516,14 @@ function initcolorSliders(){ bright.addEventListener('input', () => { initSliderColors(); changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); // Trigger onChange event to send value brightNumVal.dispatchEvent(event); }); speed.addEventListener('input', () => { changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); // Trigger onChange event to send value speedNumVal.dispatchEvent(event); }); @@ -1548,6 +1582,7 @@ function getConfig() { if (typeof res.mqtt_port !== "undefined") config.mqtt_port = res.mqtt_port; if (typeof res.mqtt_user !== "undefined") config.mqtt_user = res.mqtt_user; if (typeof res.mqtt_pass !== "undefined") config.mqtt_pass = res.mqtt_pass; + if (typeof res.ws_seg !== "undefined") config.ws_seg = res.ws_seg; if (typeof res.ws_cnt !== "undefined") config.ws_cnt = res.ws_cnt; if (typeof res.ws_rgbo !== "undefined") { config.ws_rgbo = res.ws_rgbo; @@ -1612,8 +1647,12 @@ function readSettings() { if (typeof(tmpsettings[set]) !== "undefined") settings[set] = tmpsettings[set]; } applySettings(); - if (e && e.substring(0,6) !== "ERROR!") connectAdditionalNodes(); - else console.warn("ERROR loading settings", e); + if (e && e.substring(0,6) !== "ERROR!") { + connectAdditionalNodes(); + } else { + console.warn("ERROR loading settings", e); + saveSettings(); + } }); } function applySettings() { @@ -1684,7 +1723,7 @@ function onSelectColNum(colnum) { white.value = data.color["w" + (colnum > 1 ? colnum : "")]; initSliderColors(); changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); } function initSettings() { // Add languages to language select @@ -1736,11 +1775,33 @@ function initSettings() { config.mqtt_pass = mqtt_pass.value; ws_send("Cmw" + config.mqtt_pass); }); - var count = document.getElementById("selectcount"); - count.value = config.ws_cnt; - count.addEventListener('change', ()=>{ - config.ws_cnt = count.value; - ws_send("Csc" + config.ws_cnt); + var selsegment = document.getElementById("selectseg"); + for(var i = 0; i < config.ws_seg; i++) { + var option = document.createElement("OPTION"); + option.setAttribute("value", i); + option.innerHTML = i; + selsegment.appendChild(option); + } + selsegment.value = data.segment; + selsegment.addEventListener('change', ()=>{ + data.segment = selsegment.value; + ws_send("Ss" + data.segment); + }); + var num_segments = document.getElementById("selectsegcnt"); + num_segments.value = config.ws_seg; + num_segments.addEventListener('change', ()=>{ + config.ws_seg = num_segments.value; + ws_send("Css" + config.ws_seg); + while (selsegment.firstChild) { + selsegment.removeChild(selsegment.firstChild); + } + for(var i = 0; i < config.ws_seg; i++) { + var option = document.createElement("OPTION"); + option.setAttribute("value", i); + option.innerHTML = i; + selsegment.appendChild(option); + } + selsegment.value = data.segment; }); var pin = document.getElementById("selectpin"); pin.value = config.ws_pin; @@ -1760,6 +1821,28 @@ function initSettings() { config.ws_rgbo = rgbo.value; ws_send("Csr" + config.ws_rgbo); }); + var start = document.getElementById("segstart"); + start.setAttribute("max",config.ws_cnt-1); + start.value = data.start; + start.addEventListener('change', ()=>{ + data.start = start.value; + ws_send("S[" + data.start); + }); + var stop = document.getElementById("segstop"); + stop.setAttribute("max",config.ws_cnt-1); + stop.value = data.stop; + stop.addEventListener('change', ()=>{ + data.stop = stop.value; + ws_send("S]" + data.stop); + }); + var count = document.getElementById("selectcount"); + count.value = config.ws_cnt; + count.addEventListener('change', ()=>{ + config.ws_cnt = count.value; + ws_send("Csc" + config.ws_cnt); + start.setAttribute("max",config.ws_cnt-1); + stop.setAttribute("max",config.ws_cnt-1); + }); var optrev = document.getElementById("selectoptrev"); for (var code in selectoptrev) { var option = document.createElement("OPTION"); @@ -1855,6 +1938,7 @@ function initSettings() { settings.theme_back = colback.value; document.getElementById("container").style.backgroundColor = settings.theme_back; document.getElementById("language").style.backgroundColor = settings.theme_back; + document.getElementById("selectseg").style.backgroundColor = settings.theme_back; document.getElementById("selectrgbo").style.backgroundColor = settings.theme_back; document.getElementById("selectoptrev").style.backgroundColor = settings.theme_back; document.getElementById("selectoptfade").style.backgroundColor = settings.theme_back; @@ -1867,6 +1951,7 @@ function initSettings() { for (var i = 0; i < icons.length; i++) { icons[i].style.color = (yiq >= 125) ? '#222' : '#EEE'; } + document.getElementById("selectSegLbl").style.color = (yiq >= 125) ? '#111' : '#EEE'; document.getElementById("wsmessageLbl").style.color = (yiq >= 125) ? '#111' : '#EEE'; document.getElementById("redNum").style.color = (yiq >= 125) ? '#111' : '#EEE'; document.getElementById("greenNum").style.color = (yiq >= 125) ? '#111' : '#EEE'; @@ -2069,19 +2154,22 @@ function ws_connect() { // document.getElementById('modal').style.display = "none"; // console.log("res", res); if (res) { - // Status starts here if (typeof res.mode !== "undefined") data.mode = res.mode; + if (typeof res.brightness !== "undefined") { + data.brightness = res.brightness; + // init ColorSliderVals + bright.value = res.brightness; + } + // Segment Status starts here + if (typeof res.segment !== "undefined") { data.segment= res.segment; document.getElementById("selectseg").value = data.segment; } + if (typeof res.start !== "undefined") { data.start= res.start; document.getElementById("segstart").value = data.start; } + if (typeof res.stop !== "undefined") { data.stop = res.stop; document.getElementById("segstop").value = data.stop; } if (typeof res.ws2812fx_mode !== "undefined") data.ws2812fx_mode = res.ws2812fx_mode; if (typeof res.speed !== "undefined") { data.speed = res.speed; // init SliderVals speed.value = res.speed; } - if (typeof res.brightness !== "undefined") { - data.brightness = res.brightness; - // init ColorSliderVals - bright.value = res.brightness; - } if (typeof res.color !== "undefined") { data.color.w = res.color[0]; data.color.r = res.color[1]; @@ -2115,7 +2203,7 @@ function ws_connect() { red.value = data.color.r3; green.value = data.color.g3; blue.value = data.color.b3; - white.value = data.color.w3; + white.value = data.color.w3; } } // Config starts here @@ -2124,6 +2212,7 @@ function ws_connect() { if (typeof res.mqtt_port !== "undefined") { config.mqtt_port = res.mqtt_port; document.getElementById("mqtt_port").value = config.mqtt_port; } if (typeof res.mqtt_user !== "undefined") { config.mqtt_user = res.mqtt_user; document.getElementById("mqtt_user").value = config.mqtt_user; } if (typeof res.mqtt_pass !== "undefined") { config.mqtt_pass = res.mqtt_pass; document.getElementById("mqtt_pass").value = config.mqtt_pass; } + if (typeof res.ws_seg !== "undefined") { config.ws_seg = res.ws_seg; document.getElementById("selectsegcnt").value = config.ws_seg; } if (typeof res.ws_cnt !== "undefined") { config.ws_cnt = res.ws_cnt; document.getElementById("selectcount").value = config.ws_cnt; } if (typeof res.ws_rgbo !== "undefined") { config.ws_rgbo = res.ws_rgbo; @@ -2148,6 +2237,7 @@ function ws_connect() { document.getElementById("selectoptgamma").value = (config.ws_fxopt & 8); document.getElementById("selectoptsize").value = (config.ws_fxopt & 6); } + if (typeof res.transEffect !== "undefined") { config.transitionEffects = res.transEffect; document.getElementById("set-transitionEffects").value = config.transitionEffects; } // Modes starts here if (typeof res[0] !== "undefined") { res.forEach(item => { @@ -2157,7 +2247,7 @@ function ws_connect() { }); } // init Color Vals - colorNumrVals(); + colorNumVals(); initSliderColors(); // init Change Range Val changeRangeNumVal(); @@ -2218,6 +2308,8 @@ function select_active_button() { if (arr.indexOf("hidden") === -1) { wsmess.className += " hidden"; } + segments = document.getElementById("segments"); + segments.className = segments.className.replace(/\b hidden\b/g, ""); } if (data.mode >= 1) { document.getElementById(data.ws2812fx_mode).style.backgroundColor = settings.theme_btnsel; @@ -2229,6 +2321,11 @@ function select_active_button() { } else if (data.ws2812fx_mode === 57) { //CUSTOM_WS wsmess = document.getElementById("message"); wsmess.className = wsmess.className.replace(/\b hidden\b/g, ""); + sements = document.getElementById("segments"); + var arr = segments.className.split(" "); + if (arr.indexOf("hidden") === -1) { + segments.className += " hidden"; + } disable_modebuttons(false); disable_color_selection(true); disable_bright_selection(false); @@ -2357,7 +2454,7 @@ function onSelectColor(event) { displayColors(); initSliderColors(); changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); } } function redrawColorPicker() { @@ -2525,7 +2622,7 @@ document.addEventListener("DOMContentLoaded", function(event) { getModes(); readSettings(); ws_connect(); - ws_send("$") + ws_send("$"); document.getElementById("modal-content").innerHTML = language.en.loadModes; //ws_send("C"); getConfig(); diff --git a/Arduino/McLighting/data/index.htm.gz b/Arduino/McLighting/data/index.htm.gz index 50d463761194d6ce10e47eed6ed6cdc7ed9971be..4383dadcfdf145dfb4643405bfc968aeb056074f 100644 GIT binary patch literal 20547 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 literal 19755 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∨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 hPV)J>d> IwIP Variant -> Higher Bandwidth #define ENABLE_BUTTON 14 // If defined, enable button handling code, see: https://github.com/toblum/McLighting/wiki/Button-control, the value defines the input pin (14 / D5) for switching the LED strip on / off, connect this PIN to ground to trigger button. @@ -30,7 +31,7 @@ char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just #define ENABLE_STATE_SAVE // If defined, load saved state on reboot and save state on SPIFFS #define CUSTOM_WS2812FX_ANIMATIONS // uncomment and put animations in "custom_ws2812fx_animations.h" -//#define USE_HTML_MIN_GZ // uncomment for using index.htm & edit.htm from PROGMEM instead of SPIFFS +#define USE_HTML_MIN_GZ // uncomment for using index.htm & edit.htm from PROGMEM instead of SPIFFS #define TRANS_COLOR_DELAY 5 // Delay for color transition #define TRANS_DELAY 10 // Delay for brightness and speed transition @@ -146,7 +147,7 @@ uint32_t autoParams[][6] = { // main_color, back_color, xtra_color, speed, mod #define DBG_OUTPUT_PORT Serial // Set debug output port // List of all color modes -enum MODE {OFF, HOLD, SET, INIT_STRIP}; +enum MODE {OFF, HOLD, SET}; MODE mode = SET; // Standard mode that is active when software starts MODE prevmode = HOLD; // Do not change @@ -175,8 +176,6 @@ LEDState back_color = { 0, 0, 0, 0 }; // Store the "2nd color" of the strip u LEDState xtra_color = { 0, 0, 0, 0 }; // Store the "3rd color" of the strip used in single color modes bool updateConfig = false; // For WiFiManger custom config and config -char last_state[67]; // Keeps the state representation before auto or off mode -bool updateState = false; // Button handling diff --git a/Arduino/McLighting/filesystem_functions.h b/Arduino/McLighting/filesystem_functions.h new file mode 100644 index 0000000..6128a09 --- /dev/null +++ b/Arduino/McLighting/filesystem_functions.h @@ -0,0 +1,262 @@ +#if defined(ENABLE_STATE_SAVE) + + Ticker save_state; + Ticker save_seg_state; + Ticker save_conf; + + bool updateState = false; + bool updateSegState = false; + + void tickerSaveState(){ + updateState = true; + } + + void tickerSaveConfig(){ + updateConfig = true; + } + + void tickerSaveSegmentState(){ + updateSegState = true; + } + + // Write configuration to FS JSON + bool writeConfigFS(bool save){ + if (save) { + //FS save + DBG_OUTPUT_PORT.println("Saving config: "); + File configFile = SPIFFS.open("/config.json", "w"); + if (!configFile) { + DBG_OUTPUT_PORT.println("Failed!"); + save_conf.detach(); + updateConfig = false; + return false; + } + DBG_OUTPUT_PORT.println(listConfigJSON()); + configFile.print(listConfigJSON()); + configFile.close(); + save_conf.detach(); + updateConfig = false; + return true; + //end save + } else { + DBG_OUTPUT_PORT.println("SaveConfig is false!"); + return false; + } + } + + // Read search_str to FS + bool readConfigFS() { + //read configuration from FS JSON + if (SPIFFS.exists("/config.json")) { + //file exists, reading and loading + DBG_OUTPUT_PORT.print("Reading config file... "); + File configFile = SPIFFS.open("/config.json", "r"); + if (configFile) { + DBG_OUTPUT_PORT.println("Opened!"); + size_t size = configFile.size(); + std::unique_ptr buf(new char[size]); + configFile.readBytes(buf.get(), size); + configFile.close(); + #if defined(ENABLE_MQTT) + const size_t bufferSize = JSON_OBJECT_SIZE(11) + 150; + #else + const size_t bufferSize = JSON_OBJECT_SIZE(7) + 100; + #endif + DynamicJsonDocument jsonBuffer(bufferSize); + DeserializationError error = deserializeJson(jsonBuffer, buf.get()); + DBG_OUTPUT_PORT.print("Config: "); + if (!error) { + DBG_OUTPUT_PORT.println("Parsed!"); + JsonObject root = jsonBuffer.as(); + serializeJson(root, DBG_OUTPUT_PORT); + DBG_OUTPUT_PORT.println(""); + strcpy(HOSTNAME, root["hostname"]); + #if defined(ENABLE_MQTT) + strcpy(mqtt_host, root["mqtt_host"]); + mqtt_port = root["mqtt_port"].as(); + strcpy(mqtt_user, root["mqtt_user"]); + strcpy(mqtt_pass, root["mqtt_pass"]); + #endif + num_segments = constrain(root["ws_seg"].as(), 1, MAX_NUM_SEGMENTS - 1); + WS2812FXStripSettings.stripSize = constrain(root["ws_cnt"].as(), 1, MAXLEDS); + char tmp_rgbOrder[5]; + strcpy(tmp_rgbOrder, root["ws_rgbo"]); + checkRGBOrder(tmp_rgbOrder); + uint8_t temp_pin; + checkPin((uint8_t) root["ws_pin"]); + WS2812FXStripSettings.fxoptions = constrain(root["ws_fxopt"].as(), 0, 255) & 0xFE; + transEffect = root["transEffect"].as(); + jsonBuffer.clear(); + return true; + } else { + DBG_OUTPUT_PORT.print("Failed to load json config: "); + DBG_OUTPUT_PORT.println(error.c_str()); + jsonBuffer.clear(); + } + } else { + DBG_OUTPUT_PORT.println("Failed to open /config.json"); + } + } else { + DBG_OUTPUT_PORT.println("Coudnt find config.json"); + writeConfigFS(true); + } + //end read + return false; + } + + bool writeStateFS(bool save){ + if (save) { + //save the strip state to FS JSON + DBG_OUTPUT_PORT.print("Saving state: "); + //SPIFFS.remove("/stripstate.json") ? DBG_OUTPUT_PORT.println("removed file") : DBG_OUTPUT_PORT.println("failed removing file"); + File configFile = SPIFFS.open("/stripstate.json", "w"); + if (!configFile) { + DBG_OUTPUT_PORT.println("Failed!"); + save_state.detach(); + updateState = false; + return false; + } + DBG_OUTPUT_PORT.println(listStateJSON()); + configFile.print(listStateJSON()); + configFile.close(); + char filename[28]; + save_state.detach(); + updateState = false; + return true; + //end save + } else { + DBG_OUTPUT_PORT.println("SaveState is false!"); + return false; + } + } + + bool readStateFS() { + //read strip state from FS JSON + if (SPIFFS.exists("/stripstate.json")) { + //file exists, reading and loading + DBG_OUTPUT_PORT.print("Reading state file... "); + File configFile = SPIFFS.open("/stripstate.json", "r"); + if (configFile) { + DBG_OUTPUT_PORT.println("Opened!"); + size_t size = configFile.size(); + // Allocate a buffer to store contents of the file. + std::unique_ptr buf(new char[size]); + configFile.readBytes(buf.get(), size); + configFile.close(); + const size_t bufferSize = JSON_OBJECT_SIZE(3) + 50; + DynamicJsonDocument jsonBuffer(bufferSize); + DeserializationError error = deserializeJson(jsonBuffer, buf.get()); + DBG_OUTPUT_PORT.print("Config: "); + if (!error) { + DBG_OUTPUT_PORT.print("Parsed"); + JsonObject root = jsonBuffer.as(); + serializeJson(root, DBG_OUTPUT_PORT); + DBG_OUTPUT_PORT.println(""); + segment = root["segment"]; + mode = static_cast(root["mode"].as()); + brightness = root["brightness"]; + jsonBuffer.clear(); + return true; + } else { + DBG_OUTPUT_PORT.print("Failed to load json config: "); + DBG_OUTPUT_PORT.println(error.c_str()); + jsonBuffer.clear(); + } + } else { + DBG_OUTPUT_PORT.println("Failed to open \"/stripstate.json\""); + } + } else { + DBG_OUTPUT_PORT.println("Couldn't find \"/stripstate.json\""); + writeStateFS(true); + } + //end read + return false; + } + + bool writeSegmentStateFS(bool save, uint8_t seg){ + if (save) { + //save the segment state to FS JSON + DBG_OUTPUT_PORT.print("Saving segment state: "); + char filename[28]; + snprintf(filename, 28, "/stripstate_segment_%02i.json", seg); + filename[27] = 0x00; + File configFile = SPIFFS.open(filename, "w"); + if (!configFile) { + DBG_OUTPUT_PORT.println("Failed!"); + save_seg_state.detach(); + updateSegState = false; + return false; + } + DBG_OUTPUT_PORT.println(listSegmentStateJSON(seg)); + configFile.print(listSegmentStateJSON(seg)); + configFile.close(); + save_seg_state.detach(); + updateSegState = false; + return true; + //end save + } else { + DBG_OUTPUT_PORT.println("SaveSegmentState is false!"); + return false; + } + } + + bool readSegmentStateFS(uint8_t seg) { + //read strip state from FS JSON + char filename[28]; + snprintf(filename, 28, "/stripstate_segment_%02i.json", seg); + filename[27] = 0x00; + if (SPIFFS.exists(filename)) { + //file exists, reading and loading + DBG_OUTPUT_PORT.printf("Reading segmentstate file: %s\r\n", filename); + File configFile = SPIFFS.open(filename, "r"); + if (configFile) { + DBG_OUTPUT_PORT.println("Opened!"); + size_t size = configFile.size(); + // Allocate a buffer to store contents of the file. + std::unique_ptr buf(new char[size]); + configFile.readBytes(buf.get(), size); + configFile.close(); + const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(7) + 100; + DynamicJsonDocument jsonBuffer(bufferSize); + DeserializationError error = deserializeJson(jsonBuffer, buf.get()); + DBG_OUTPUT_PORT.print("Config: "); + if (!error) { + DBG_OUTPUT_PORT.print("Parsed"); + JsonObject root = jsonBuffer.as(); + serializeJson(root, DBG_OUTPUT_PORT); + DBG_OUTPUT_PORT.println(""); + seg_start = root["start"].as(); + seg_stop = root["stop"].as(); + ws2812fx_mode = root["ws2812fx_mode"].as(); + ws2812fx_speed = root["speed"].as(); + main_color.white = root["color"][0].as(); + main_color.red = root["color"][1].as(); + main_color.green = root["color"][2].as(); + main_color.blue = root["color"][3].as(); + back_color.white = root["color"][4].as(); + back_color.red = root["color"][5].as(); + back_color.green = root["color"][6].as(); + back_color.blue = root["color"][7].as(); + xtra_color.white = root["color"][8].as(); + xtra_color.red = root["color"][9].as(); + xtra_color.green = root["color"][10].as(); + xtra_color.blue = root["color"][11].as(); + convertColors(); + jsonBuffer.clear(); + return true; + } else { + DBG_OUTPUT_PORT.print("Failed to load json config: "); + DBG_OUTPUT_PORT.println(error.c_str()); + jsonBuffer.clear(); + } + } else { + DBG_OUTPUT_PORT.printf("Failed to open \"/%s\"\r\n", filename); + } + } else { + DBG_OUTPUT_PORT.printf("Couldn't find \"/%s\"", filename); + writeSegmentStateFS(true, seg); + } + //end read + return false; + } +#endif diff --git a/Arduino/McLighting/helper_functions.h b/Arduino/McLighting/helper_functions.h new file mode 100644 index 0000000..4562368 --- /dev/null +++ b/Arduino/McLighting/helper_functions.h @@ -0,0 +1,283 @@ +// Prototypes +bool readSegmentStateFS(uint8_t seg); +// End Prototypes + +uint16_t convertSpeed(uint8_t mcl_speed) { + uint16_t ws2812_speed = 61760 * (exp(0.0002336 * mcl_speed) - exp(-0.03181 * mcl_speed)); + ws2812_speed = SPEED_MAX - ws2812_speed; + ws2812_speed = constrain(ws2812_speed, SPEED_MIN, SPEED_MAX); + return ws2812_speed; +} + +uint8_t unconvertSpeed(uint16_t ws2812_speed) { + //log((SPEED_MAX - ws2812_speed)/61760) = (0.0002336 * mcl_speed) - (-0.03181 * mcl_speed); + //log((SPEED_MAX - ws2812_speed)/61760) = (0.0002336 + 0.03181) * mcl_speed; + uint16_t mcl_speed = (log((SPEED_MAX - ws2812_speed)/61760))/ (0.0002336 + 0.03181); + //uint16_t mcl_speed = 61760 * (exp(0.0002336 * mcl_speed) - exp(-0.03181 * mcl_speed)); + mcl_speed = 255 - mcl_speed; + mcl_speed = constrain(mcl_speed, 0, 255); + return mcl_speed; +} + +bool checkPin(uint8_t pin) { + #if defined(USE_WS2812FX_DMA) + #if USE_WS2812FX_DMA == 0 + pin = 3; + #endif + #if USE_WS2812FX_DMA == 1 + pin = 1; + #endif + #if USE_WS2812FX_DMA == 2 + pin = 2; + #endif + #endif + if (((pin >= 0 && pin <= 5) || (pin >= 12 && pin <= 16)) && (pin != WS2812FXStripSettings.pin)) { + WS2812FXStripSettings.pin = pin; + return true; + } + return false; +} + +neoPixelType checkRGBOrder(char rgbOrder[5]) { + for( uint8_t i=0 ; i < sizeof(rgbOrder) ; ++i ) rgbOrder[i] = toupper(rgbOrder[i]) ; + DBG_OUTPUT_PORT.printf("Checking RGB Order: %s ...", rgbOrder); + neoPixelType returnOrder = 0; + if (strcmp(rgbOrder, "GRB") == 0) { + returnOrder = NEO_GRB; + } else if (strcmp(rgbOrder, "GBR") == 0) { + returnOrder = NEO_GBR; + } else if (strcmp(rgbOrder, "RGB") == 0) { + returnOrder = NEO_RGB; + } else if (strcmp(rgbOrder, "RBG") == 0) { + returnOrder = NEO_RBG; + } else if (strcmp(rgbOrder, "BRG") == 0) { + returnOrder = NEO_BRG; + } else if (strcmp(rgbOrder, "BGR") == 0) { + returnOrder = NEO_BGR; + } else if (strcmp(rgbOrder, "WGRB") == 0) { + returnOrder = NEO_WGRB; + } else if (strcmp(rgbOrder, "WGBR") == 0) { + returnOrder = NEO_WGBR; + } else if (strcmp(rgbOrder, "WRGB") == 0) { + returnOrder = NEO_WRGB; + } else if (strcmp(rgbOrder, "WRBG") == 0) { + returnOrder = NEO_WRBG; + } else if (strcmp(rgbOrder, "WBRG") == 0) { + returnOrder = NEO_WBRG; + } else if (strcmp(rgbOrder, "WBGR") == 0) { + returnOrder = NEO_WBGR; + } else if (strcmp(rgbOrder, "GWRB") == 0) { + returnOrder = NEO_GWRB; + } else if (strcmp(rgbOrder, "GWBR") == 0) { + returnOrder = NEO_GWBR; + } else if (strcmp(rgbOrder, "RWGB") == 0) { + returnOrder = NEO_RWGB; + } else if (strcmp(rgbOrder, "RWBG") == 0) { + returnOrder = NEO_RWBG; + } else if (strcmp(rgbOrder, "BWRG") == 0) { + returnOrder = NEO_BWRG; + } else if (strcmp(rgbOrder, "BWGR") == 0) { + returnOrder = NEO_BWGR; + } else if (strcmp(rgbOrder, "GRWB") == 0) { + returnOrder = NEO_GRWB; + } else if (strcmp(rgbOrder, "GBWR") == 0) { + returnOrder = NEO_GBWR; + } else if (strcmp(rgbOrder, "RGWB") == 0) { + returnOrder = NEO_RGWB; + } else if (strcmp(rgbOrder, "RBWG") == 0) { + returnOrder = NEO_RBWG; + } else if (strcmp(rgbOrder, "BRWG") == 0){ + returnOrder = NEO_BRWG; + } else if (strcmp(rgbOrder, "BGWR") == 0) { + returnOrder = NEO_GRBW; + } else if (strcmp(rgbOrder, "GRBW") == 0) { + returnOrder = NEO_GRBW; + } else if (strcmp(rgbOrder, "GBWR") == 0) { + returnOrder = NEO_GBRW; + } else if (strcmp(rgbOrder, "RGBW") == 0) { + returnOrder = NEO_RGBW; + } else if (strcmp(rgbOrder, "RBGW") == 0) { + returnOrder = NEO_RBGW; + } else if (strcmp(rgbOrder, "BRGW") == 0) { + returnOrder = NEO_BRGW; + } else if (strcmp(rgbOrder, "BGRW") == 0) { + returnOrder = NEO_BGRW; + } else { + DBG_OUTPUT_PORT.print("invalid input!"); + uint16_t check = checkRGBOrder(WS2812FXStripSettings.RGBOrder); + if (check != 0) { + returnOrder = static_cast(check); + strcpy(rgbOrder, WS2812FXStripSettings.RGBOrder); + } else { + returnOrder = static_cast(checkRGBOrder(RGBORDER)); + strcpy(rgbOrder, RGBORDER); + } + } + DBG_OUTPUT_PORT.println("success!"); + strcpy(WS2812FXStripSettings.RGBOrder, rgbOrder); + return returnOrder; +} + +// function to Initialize the strip +void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, char RGBOrder[5] = WS2812FXStripSettings.RGBOrder, uint8_t pin = WS2812FXStripSettings.pin, uint8_t fxoptions = WS2812FXStripSettings.fxoptions ){ + DBG_OUTPUT_PORT.println("Initializing strip!"); +/*#if defined(USE_WS2812FX_DMA) + if (dma != NULL) { + delete(dma); + } +#endif*/ + if (strip != NULL) { + strip->strip_off(); + delay(10); + if(strip->isRunning()) strip->stop(); + strip->resetSegments(); + strip->resetSegmentRuntimes(); + delete(strip); + WS2812FXStripSettings.stripSize = stripSize; + strcpy(WS2812FXStripSettings.RGBOrder, RGBOrder); + WS2812FXStripSettings.pin = pin; + WS2812FXStripSettings.fxoptions = fxoptions; + } + + if (ledstates != NULL) { + delete(ledstates); + } + ledstates = new uint8_t [WS2812FXStripSettings.stripSize]; + +#if !defined(LED_TYPE_WS2811) + strip = new WS2812FX(stripSize, pin, checkRGBOrder(RGBOrder) + NEO_KHZ800); +#else + strip = new WS2812FX(stripSize, pin, checkRGBOrder(RGBOrder) + NEO_KHZ400); +#endif + // Parameter 1 = number of pixels in strip + // Parameter 2 = Arduino pin number (most are valid) + // Parameter 3 = pixel type flags, add together as needed: + // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) + // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) + // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products) + // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2) + + // IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across + // pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input + // and minimize distance between Arduino and first pixel. Avoid connecting + // on a live circuit...if you must, connect GND first. + strip->init(); + #if defined(USE_WS2812FX_DMA) + initDMA(stripSize); + strip->setCustomShow(DMA_Show); + #endif + //parameters: index, start, stop, mode, color, speed, options + for (uint8_t seg=0; seg < num_segments; seg++) { + if (seg != segment) { // Read actual segment last + (readSegmentStateFS(seg)) ? DBG_OUTPUT_PORT.println("Segment state config FS read Success!") : DBG_OUTPUT_PORT.println("Segment state config FS read failure!"); + strip->setSegment(seg, seg_start, seg_stop , ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions); + } + } + //read actual segment last to set all vars correctly + (readSegmentStateFS(segment)) ? DBG_OUTPUT_PORT.println("Segment state config FS read Success!") : DBG_OUTPUT_PORT.println("Segment state config FS read failure!"); + strip->setSegment(segment, seg_start, seg_stop , ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions); + + strip->setCustomMode(0, F("Autoplay"), myCustomEffect0); + strip->setCustomMode(1, F("Custom WS"), myCustomEffect1); + #if defined(CUSTOM_WS2812FX_ANIMATIONS) + strip->setCustomMode(2, F("TV"), myCustomEffect2); + strip->setCustomMode(3, F("E1.31"), myCustomEffect3); + strip->setCustomMode(4, F("Fire 2012"), myCustomEffect4); + strip->setCustomMode(5, F("Gradient"), myCustomEffect5); + gReverseDirection = (WS2812FXStripSettings.fxoptions & 128); + DBG_OUTPUT_PORT.print("Number of Segments: "); + DBG_OUTPUT_PORT.println(strip->getNumSegments()); + + if (e131 != NULL) { delete(e131); } + e131 = new ESPAsyncE131(END_UNIVERSE - START_UNIVERSE + 1); + float universe_leds = 170.0; // a universe has only 512 (0..511) channels: 3*170 or 4*128 <= 512 + if (strstr(WS2812FXStripSettings.RGBOrder, "W") != NULL) { + //universe_leds = 128.0; + } + float float_enduni = stripSize/universe_leds; + uint8_t END_UNIVERSE = stripSize/universe_leds; + if (float_enduni > END_UNIVERSE) { + END_UNIVERSE = END_UNIVERSE +1; + } + + // if (e131.begin(E131_UNICAST)) // Listen via Unicast + if (e131->begin(E131_MULTICAST, START_UNIVERSE, END_UNIVERSE)) {// Listen via Multicast + DBG_OUTPUT_PORT.println(F("Listening for data...")); + } else { + DBG_OUTPUT_PORT.println(F("*** e131.begin failed ***")); + } + #endif +} + + +// Call convertColors whenever main_color, back_color or xtra_color changes. +void convertColors() { + hex_colors_trans[0] = (uint32_t)(main_color.white << 24) | (main_color.red << 16) | (main_color.green << 8) | main_color.blue; + hex_colors_trans[1] = (uint32_t)(back_color.white << 24) | (back_color.red << 16) | (back_color.green << 8) | back_color.blue; + hex_colors_trans[2] = (uint32_t)(xtra_color.white << 24) | (xtra_color.red << 16) | (xtra_color.green << 8) | xtra_color.blue; +} + +uint32_t* convertColors2(uint8_t w, uint8_t r, uint8_t g, uint8_t b, uint8_t w2, uint8_t r2, uint8_t g2, uint8_t b2, uint8_t w3, uint8_t r3, uint8_t g3, uint8_t b3) { + uint32_t hexcolors[3] = {}; + hexcolors[0] = (uint32_t)(w << 24) | (r << 16) | (g << 8) | b; + hexcolors[1] = (uint32_t)(w2 << 24) | (r2 << 16) | (g2 << 8) | b2; + hexcolors[2] = (uint32_t)(w3 << 24) | (r3 << 16) | (g3 << 8) | b3; + return hexcolors; +} + +void getSegmentParams(uint8_t seg) { + seg_start = strip->getSegment(seg)->start;; + seg_stop = strip->getSegment(seg)->stop;; + ws2812fx_mode = strip->getMode(seg); + main_color.white = ((strip->getColors(seg)[0] >> 24) & 0xFF); + main_color.red = ((strip->getColors(seg)[0] >> 16) & 0xFF); + main_color.green = ((strip->getColors(seg)[0] >> 8) & 0xFF); + main_color.blue = ((strip->getColors(seg)[0]) & 0xFF); + back_color.white = ((strip->getColors(seg)[1] >> 24) & 0xFF); + back_color.red = ((strip->getColors(seg)[1] >> 16) & 0xFF); + back_color.green = ((strip->getColors(seg)[1] >> 8) & 0xFF); + back_color.blue = ((strip->getColors(seg)[1]) & 0xFF); + xtra_color.white = ((strip->getColors(seg)[2] >> 24) & 0xFF); + xtra_color.red = ((strip->getColors(seg)[2] >> 16) & 0xFF); + xtra_color.green = ((strip->getColors(seg)[2] >> 8) & 0xFF); + xtra_color.blue = ((strip->getColors(seg)[2] >> 0) & 0xFF); +} + +void calculateColorTransitionSteps() { + //compare all colors and calculate steps + trans_cnt_max = 0; + int calculate_max[4] = {}; + for (uint8_t i=0; i<3; i++){ + for (uint8_t j=0; j<4; j++) { + calculate_max[j] = ((hex_colors[i] >> ((3-j)*8)) & 0xFF) - ((hex_colors_trans[i] >> ((3-j)*8)) & 0xFF); + calculate_max[j] = abs(calculate_max[j]); + trans_cnt_max = max(trans_cnt_max, calculate_max[j]); + } + } +} + +void convertColorsFade() { + if (transEffect) { + if (trans_cnt > 1) { + memcpy(hex_colors, strip->getColors(segment), sizeof(hex_colors)); + DBG_OUTPUT_PORT.println("Color transistion aborted. Restarting...!"); + trans_cnt = 1; + } + calculateColorTransitionSteps(); + } +} + +uint32_t scale_wrgb(uint32_t wrgb, uint8_t level) { + uint8_t w = ((wrgb >> 24) & 0xFF) * level / 255; + uint8_t r = ((wrgb >> 16) & 0xFF) * level / 255; + uint8_t g = ((wrgb >> 8) & 0xFF) * level / 255; + uint8_t b = ((wrgb) & 0xFF) * level / 255; + return (w << 24) | (r << 16) | (g << 8) | b; +} + +uint32_t trans(uint32_t newcolor, uint32_t oldcolor, uint8_t level) { + level = (level * (255/trans_cnt_max)); + newcolor = scale_wrgb(newcolor, level); + oldcolor = scale_wrgb(oldcolor, 255-level); + return newcolor + oldcolor; +} diff --git a/Arduino/McLighting/htm_edit_gz.h b/Arduino/McLighting/htm_edit_gz.h index b1fa888..883cff7 100644 --- a/Arduino/McLighting/htm_edit_gz.h +++ b/Arduino/McLighting/htm_edit_gz.h @@ -1,463 +1,469 @@ #include -#define edit_htm_gz_len 5489 +#define edit_htm_gz_len 5563 static const char edit_htm_gz[] PROGMEM ={ - 0x1f, 0x8b, 0x08, 0x08, 0x10, 0x9c, 0x83, 0x5c, 0x04, 0x00, 0x65, 0x64, - 0x69, 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x00, 0xed, 0x1c, 0x67, 0x7b, 0xf2, - 0x36, 0xf0, 0x7b, 0x7f, 0x85, 0xeb, 0x8e, 0x40, 0x99, 0x21, 0x24, 0x6f, - 0x66, 0x5b, 0x76, 0x12, 0xa0, 0x84, 0x91, 0x84, 0xa4, 0xeb, 0x31, 0xb6, - 0x00, 0x27, 0xc6, 0x76, 0x6c, 0x13, 0x20, 0x69, 0xfa, 0xdb, 0x7b, 0x92, - 0xbc, 0x07, 0x38, 0xa3, 0xf3, 0x29, 0xef, 0x00, 0x4b, 0x77, 0xa7, 0xbb, - 0xd3, 0xe9, 0x74, 0x3a, 0x49, 0x3e, 0xfe, 0xbc, 0xda, 0xa9, 0x0c, 0x6e, - 0x2e, 0x6a, 0xcc, 0xd4, 0x98, 0x49, 0xdf, 0x7e, 0x76, 0x8c, 0xbf, 0x18, - 0x89, 0x93, 0x27, 0x27, 0x2c, 0x92, 0xd9, 0x6f, 0x3f, 0x63, 0x98, 0xe3, - 0x29, 0xe2, 0x04, 0xfc, 0x03, 0x7e, 0x1a, 0xa2, 0x21, 0xa1, 0x6f, 0xfb, - 0x17, 0x67, 0xf5, 0x7a, 0x9f, 0xa9, 0x09, 0xa2, 0xa1, 0x68, 0xc7, 0x39, - 0x52, 0x68, 0x02, 0xe8, 0xc6, 0x4a, 0x42, 0x8c, 0xb1, 0x52, 0xd1, 0x09, - 0x6b, 0xa0, 0xa5, 0x91, 0xe3, 0x75, 0x9d, 0x65, 0x66, 0x48, 0x10, 0xb9, - 0x13, 0x56, 0xe7, 0x35, 0x44, 0x89, 0x92, 0x4f, 0x96, 0x57, 0x64, 0x0c, - 0xd3, 0x46, 0xf2, 0x9c, 0x79, 0x86, 0x42, 0xfa, 0x79, 0xca, 0x88, 0xb2, - 0x80, 0x96, 0x87, 0xcc, 0x4e, 0x3e, 0x7f, 0x64, 0x97, 0xaa, 0x8a, 0x2e, - 0x1a, 0xa2, 0x22, 0x1f, 0x32, 0xdc, 0x48, 0x57, 0xa4, 0xb9, 0x81, 0x9c, - 0x3a, 0x09, 0x8d, 0x8d, 0x43, 0x66, 0x57, 0x5d, 0x3a, 0x45, 0x23, 0x45, - 0x13, 0x90, 0x76, 0xc8, 0x6c, 0xab, 0x4b, 0x06, 0xc0, 0x45, 0x81, 0xf9, - 0xa2, 0x58, 0x2c, 0xba, 0xea, 0x39, 0xfe, 0x7e, 0xa2, 0x29, 0x73, 0x59, - 0xc8, 0xf0, 0x8a, 0xa4, 0x00, 0xe4, 0x17, 0xf5, 0x5d, 0xfc, 0xc7, 0x01, - 0x11, 0x44, 0x5d, 0x95, 0xb8, 0xd5, 0x21, 0x23, 0x2b, 0x32, 0x72, 0x53, - 0x5e, 0x66, 0xf4, 0x29, 0x27, 0x28, 0x8b, 0x43, 0x26, 0x0f, 0x7f, 0xb6, - 0xf3, 0xd0, 0x84, 0x36, 0x19, 0x71, 0x09, 0x26, 0x9f, 0x36, 0xff, 0x66, - 0x8b, 0x4c, 0xd2, 0xc1, 0x18, 0x83, 0x98, 0x19, 0x5d, 0x7c, 0x42, 0xc0, - 0x4e, 0xc1, 0x64, 0xd2, 0xa9, 0x18, 0x73, 0x33, 0x51, 0x82, 0x56, 0x74, - 0x4e, 0xd6, 0x33, 0x3a, 0xd2, 0xc4, 0xb1, 0x0f, 0x60, 0x81, 0xc4, 0xc9, - 0xd4, 0x38, 0x1c, 0x29, 0x92, 0x60, 0xd5, 0xbc, 0x84, 0x69, 0x70, 0x2e, - 0xb9, 0x94, 0x28, 0x89, 0x3a, 0xb4, 0x89, 0x3b, 0xc3, 0xcf, 0xbf, 0xa1, - 0xa8, 0xc0, 0xb8, 0x57, 0x79, 0x9e, 0x82, 0x19, 0xa7, 0x4d, 0x44, 0xd9, - 0x53, 0xa4, 0x72, 0x82, 0x20, 0xca, 0x13, 0x28, 0x5b, 0xc7, 0x01, 0x34, - 0x0a, 0x1c, 0x04, 0x3b, 0x4c, 0x43, 0x12, 0x67, 0x88, 0x8f, 0xc8, 0xd5, - 0x84, 0x28, 0x67, 0x16, 0xa2, 0x60, 0x4c, 0x0f, 0x99, 0xbd, 0xbc, 0x5b, - 0x23, 0xfc, 0x5c, 0xd3, 0xa1, 0x33, 0x00, 0x59, 0x04, 0xb2, 0xda, 0xda, - 0xd6, 0x74, 0x95, 0x93, 0x5d, 0xed, 0xd1, 0x6e, 0xa4, 0xdd, 0x1c, 0xec, - 0x43, 0x51, 0x96, 0x44, 0x19, 0x65, 0x46, 0x92, 0xc2, 0xdf, 0x87, 0xc8, - 0xb5, 0xa7, 0x2e, 0x37, 0x48, 0x76, 0x38, 0x55, 0x1e, 0x91, 0xc6, 0x3c, - 0xbb, 0x2c, 0xc7, 0x6c, 0x6c, 0x3d, 0x86, 0xc9, 0xa6, 0xcd, 0x5e, 0xad, - 0x56, 0xb3, 0x30, 0x6c, 0x34, 0x5d, 0xcf, 0x18, 0x30, 0x32, 0x1e, 0x45, - 0xb4, 0x80, 0x5e, 0x4c, 0xfb, 0x4a, 0x1c, 0xad, 0x3a, 0x1c, 0x47, 0x74, - 0xd8, 0xc6, 0xee, 0x7f, 0xf9, 0x2c, 0xb4, 0x51, 0x51, 0x56, 0xe7, 0x06, - 0xf3, 0x1c, 0x6b, 0xb0, 0x29, 0x2a, 0xc7, 0x8b, 0xc6, 0x0a, 0x9a, 0xdb, - 0x40, 0xf4, 0xd9, 0x63, 0xc6, 0x98, 0x0f, 0x6d, 0xc6, 0x49, 0xcc, 0x36, - 0x1e, 0x92, 0x57, 0x48, 0x13, 0x38, 0x99, 0x4b, 0x33, 0x25, 0x4d, 0xe4, - 0x40, 0xe2, 0x7e, 0x88, 0xf1, 0x67, 0x66, 0xca, 0x53, 0x66, 0x0e, 0x85, - 0x50, 0x21, 0x21, 0xde, 0xf0, 0x1b, 0x32, 0x0c, 0x8c, 0xd1, 0xbd, 0x68, - 0xac, 0x03, 0x71, 0x55, 0xc5, 0xd2, 0x43, 0x84, 0x49, 0xe5, 0xf3, 0xe3, - 0x18, 0x26, 0x1a, 0x49, 0xd1, 0x34, 0x04, 0x87, 0x2e, 0x36, 0x92, 0x8c, - 0x80, 0x78, 0x45, 0xe3, 0xa8, 0x96, 0xc1, 0x98, 0x90, 0x26, 0x89, 0x1b, - 0xf9, 0xa3, 0xfd, 0x94, 0x02, 0xff, 0x3c, 0x42, 0x12, 0x7c, 0xe3, 0x21, - 0x1f, 0x34, 0x03, 0xf2, 0xa7, 0x00, 0x9e, 0x26, 0x16, 0xb5, 0xdf, 0x09, - 0x15, 0xff, 0x88, 0x89, 0xa5, 0x2e, 0xc2, 0x46, 0x3a, 0xac, 0xf0, 0xf0, - 0x70, 0x84, 0xc6, 0x8a, 0x86, 0x98, 0xe7, 0x37, 0xea, 0x8d, 0xf0, 0x76, - 0x08, 0xcc, 0x70, 0x23, 0x09, 0x09, 0xb6, 0xc8, 0x41, 0x72, 0x02, 0x1a, - 0x73, 0x73, 0xc9, 0x08, 0xb1, 0xcf, 0xec, 0x5e, 0xac, 0x36, 0xf8, 0x29, - 0xe2, 0xef, 0x91, 0x70, 0x28, 0x2b, 0x46, 0xc2, 0x6e, 0x30, 0x19, 0xa9, - 0x16, 0xe2, 0x41, 0x3e, 0x52, 0x2f, 0x6e, 0x7f, 0x32, 0xd7, 0xa4, 0x04, - 0x2b, 0x70, 0x06, 0x77, 0x28, 0xce, 0xb8, 0x09, 0xca, 0xa9, 0xf2, 0xe4, - 0x68, 0xc4, 0xe9, 0x68, 0xaf, 0x98, 0x16, 0xaf, 0xca, 0x9d, 0xde, 0x22, - 0xdf, 0x6c, 0x4c, 0x94, 0x12, 0x7c, 0x7e, 0xe8, 0x5f, 0x4e, 0x6b, 0x97, - 0x13, 0xf8, 0x55, 0xc6, 0x8f, 0x95, 0x49, 0xa5, 0x74, 0x83, 0x7f, 0xd4, - 0x3b, 0x68, 0x71, 0x89, 0x7f, 0x34, 0x86, 0xbd, 0xfa, 0xf5, 0x69, 0x6f, - 0x30, 0x2a, 0xdc, 0xe6, 0x85, 0x42, 0x7d, 0x75, 0xdb, 0x2d, 0x97, 0x6f, - 0x1b, 0x07, 0xe2, 0x6d, 0xbf, 0x7c, 0x3e, 0xba, 0xae, 0xcb, 0xb7, 0x57, - 0xe7, 0xd2, 0xcd, 0x75, 0x6f, 0x97, 0xe7, 0x25, 0xe9, 0x02, 0x23, 0xa8, - 0xcb, 0xf3, 0x5e, 0xad, 0x7e, 0x89, 0x7e, 0xd0, 0x74, 0xa9, 0xbd, 0x3d, - 0xcf, 0xe7, 0x4b, 0xdd, 0x49, 0x03, 0x5c, 0xf4, 0x8a, 0x93, 0xea, 0xf5, - 0x4e, 0x33, 0x55, 0x91, 0xce, 0xce, 0x9a, 0xdd, 0xe6, 0xea, 0xe1, 0xf2, - 0xaa, 0xfb, 0x38, 0xa8, 0xd5, 0x76, 0xaa, 0xb3, 0xd2, 0xb4, 0xb5, 0x28, - 0x4d, 0x2f, 0xf7, 0xbb, 0xb7, 0xca, 0x69, 0xb1, 0x54, 0xe8, 0x16, 0x26, - 0xed, 0x7e, 0x9d, 0xe3, 0x51, 0xb1, 0x5d, 0x31, 0xce, 0xf7, 0xfb, 0x17, - 0xe5, 0xfa, 0xa2, 0x74, 0xdf, 0x9b, 0x8b, 0xa7, 0x4d, 0xb5, 0xb4, 0xa7, - 0xf7, 0x7e, 0xc8, 0xb5, 0xe6, 0x9f, 0x9e, 0x1a, 0xbb, 0xe2, 0x76, 0xf1, - 0x9e, 0x37, 0xb8, 0xcb, 0x87, 0x5e, 0x63, 0xda, 0x18, 0xca, 0xf3, 0x83, - 0x4e, 0xee, 0xc2, 0xf8, 0xd4, 0x7e, 0xd2, 0xdb, 0xe2, 0xbd, 0xf4, 0x58, - 0x4f, 0x1d, 0x18, 0x85, 0xfb, 0xeb, 0x41, 0xf5, 0x71, 0x75, 0xa6, 0x95, - 0xf4, 0x52, 0x9e, 0x6b, 0xf6, 0x7a, 0xe2, 0xf6, 0x20, 0x5f, 0xc9, 0x4d, - 0xcf, 0x8b, 0xad, 0xcb, 0x91, 0xb1, 0x9b, 0xdb, 0xd7, 0x7e, 0x50, 0xaf, - 0xaf, 0x24, 0x75, 0xbf, 0xd7, 0xd7, 0x0e, 0xce, 0x8b, 0xf9, 0x51, 0x71, - 0x7f, 0xbc, 0xac, 0x73, 0x83, 0xee, 0x41, 0x6a, 0x6c, 0xec, 0xd7, 0x6e, - 0xf7, 0xda, 0xe7, 0x37, 0xa3, 0x7c, 0xe7, 0x3e, 0x25, 0xc8, 0x37, 0x0d, - 0x75, 0x76, 0x31, 0x19, 0x2e, 0x9a, 0x67, 0xa5, 0xc7, 0xd6, 0x72, 0xff, - 0xf1, 0x66, 0xc8, 0xef, 0x36, 0x84, 0x76, 0xa9, 0x7b, 0x3e, 0xe9, 0xd6, - 0xee, 0xd5, 0xbb, 0xde, 0x60, 0xba, 0xb3, 0x37, 0xe8, 0x17, 0x2e, 0x53, - 0xd5, 0xeb, 0xeb, 0x5c, 0x75, 0xfb, 0xd3, 0xf5, 0xfc, 0x66, 0x32, 0xdb, - 0x57, 0x17, 0xe7, 0xab, 0x9b, 0x6d, 0x59, 0xbd, 0xd5, 0x6f, 0x9b, 0x9d, - 0xe5, 0xd9, 0xac, 0x73, 0xb5, 0x7d, 0x96, 0x9b, 0x16, 0x53, 0x9d, 0xbd, - 0xc7, 0xda, 0x64, 0xb7, 0x51, 0xb9, 0x2d, 0xab, 0x93, 0x59, 0x69, 0x6f, - 0x3a, 0xdc, 0x5f, 0x9c, 0x36, 0x2f, 0x4f, 0xab, 0xbd, 0xf2, 0xb0, 0x7b, - 0x23, 0xf2, 0xdd, 0xa2, 0x26, 0xf1, 0x3b, 0x83, 0x71, 0xfe, 0xaa, 0xad, - 0xef, 0x57, 0x4f, 0xcb, 0xfd, 0xfd, 0xbd, 0x62, 0xbd, 0x70, 0x53, 0xd7, - 0xd5, 0xbb, 0xc9, 0xe5, 0xcd, 0x5d, 0x73, 0x98, 0x2b, 0x3d, 0xed, 0x4c, - 0x74, 0xa1, 0x2b, 0x14, 0x10, 0x2a, 0x9f, 0x2e, 0x66, 0x42, 0xe3, 0x7a, - 0x78, 0xca, 0x4f, 0xca, 0x8d, 0xfe, 0xfd, 0xed, 0xb0, 0x33, 0x54, 0xa6, - 0x7c, 0x6d, 0x88, 0x46, 0x3d, 0xa5, 0xcb, 0x97, 0x26, 0x77, 0x0f, 0x10, - 0x36, 0xfd, 0x70, 0x93, 0x2a, 0x5d, 0xad, 0xe6, 0x3b, 0xb7, 0x3b, 0x7a, - 0xa9, 0xf9, 0x30, 0x6e, 0x2a, 0x8d, 0xb6, 0x8e, 0x16, 0x65, 0x54, 0x3b, - 0xeb, 0x5c, 0x4c, 0xba, 0xcb, 0xe5, 0xc5, 0xf9, 0xd9, 0x1d, 0xdf, 0x38, - 0xdd, 0x7b, 0x30, 0x5a, 0xb9, 0x7c, 0x49, 0x28, 0x55, 0x9f, 0x9a, 0x0d, - 0x79, 0x3e, 0xaf, 0xa6, 0x0a, 0x46, 0xab, 0xf9, 0xa9, 0xbb, 0x5f, 0x9d, - 0x9e, 0x9e, 0x8e, 0x3a, 0xe5, 0xeb, 0x54, 0xb3, 0xf6, 0xc4, 0x9f, 0xb6, - 0xe6, 0x37, 0xfc, 0x7e, 0xa1, 0x7d, 0x5f, 0xbb, 0x44, 0xf7, 0x2d, 0x71, - 0x31, 0x7f, 0xbc, 0x3a, 0x4d, 0x4d, 0xe6, 0xdd, 0x72, 0xf7, 0xa9, 0xd3, - 0x28, 0x0e, 0x85, 0xd2, 0x68, 0xbf, 0xd6, 0xe1, 0x7b, 0xfc, 0x43, 0xf7, - 0xb1, 0x7a, 0x7f, 0x53, 0x10, 0x2b, 0xad, 0xf9, 0xb2, 0x56, 0x39, 0x2f, - 0xee, 0x9c, 0x2b, 0xa3, 0xf6, 0x50, 0x99, 0x1b, 0x0f, 0x8d, 0x49, 0x95, - 0x2b, 0x0c, 0x3e, 0x5d, 0x3e, 0xb4, 0x9a, 0x0b, 0xe3, 0xa0, 0xd9, 0x5b, - 0xcd, 0x97, 0xcd, 0xab, 0xf2, 0xea, 0xe1, 0x6a, 0x38, 0x7c, 0x38, 0x53, - 0x2a, 0x95, 0xcb, 0x4a, 0xe9, 0x61, 0x7a, 0xd9, 0x11, 0x95, 0xc1, 0x75, - 0xe5, 0x53, 0xa3, 0x38, 0xe8, 0xd6, 0x3a, 0xd5, 0x7c, 0xe9, 0x62, 0x55, - 0xc8, 0x7d, 0x6a, 0x14, 0x86, 0xea, 0x7c, 0xfb, 0xbc, 0x98, 0x92, 0x96, - 0xa8, 0x5b, 0x1c, 0x0c, 0xcb, 0xa3, 0xb3, 0x41, 0x55, 0x55, 0xae, 0x90, - 0x04, 0x96, 0x51, 0xbe, 0xaa, 0x8f, 0x16, 0xf3, 0x5d, 0xa5, 0xdd, 0x3e, - 0xbf, 0x2c, 0x4f, 0x95, 0xe1, 0x6a, 0xd7, 0x98, 0x09, 0x3d, 0xbe, 0xbd, - 0x58, 0xcd, 0x2e, 0x0a, 0x9d, 0x56, 0x97, 0x6b, 0xdd, 0x2d, 0x0f, 0x72, - 0x8f, 0x72, 0x59, 0xd9, 0xbb, 0xda, 0x69, 0xee, 0x89, 0x4f, 0xa5, 0xc1, - 0xac, 0x2f, 0xb7, 0xb9, 0x7c, 0xf5, 0xe1, 0xd3, 0x18, 0x69, 0x67, 0xca, - 0xf4, 0x7c, 0xaa, 0x6d, 0xab, 0xf9, 0xed, 0x27, 0x4d, 0x7a, 0x2a, 0x1e, - 0x68, 0xb7, 0xf5, 0x62, 0x07, 0xba, 0xe0, 0xfc, 0x7e, 0x58, 0xd8, 0x79, - 0xbc, 0xea, 0x3e, 0xdd, 0xa8, 0xa9, 0xc5, 0xe8, 0xa6, 0x71, 0x95, 0x6b, - 0xaa, 0xc3, 0xe6, 0xdd, 0x23, 0x0c, 0xe6, 0x7d, 0x43, 0x3f, 0x6b, 0x56, - 0xb4, 0xf6, 0x0f, 0xa5, 0x9b, 0xfa, 0xf2, 0xae, 0xd0, 0x68, 0xf6, 0x77, - 0x6f, 0xaf, 0x97, 0x93, 0x22, 0x5a, 0x34, 0xf5, 0xf3, 0x31, 0xd7, 0x68, - 0x9f, 0xdd, 0xec, 0x36, 0x87, 0x0f, 0x17, 0x4f, 0xfb, 0xad, 0x72, 0xf9, - 0x6e, 0x2f, 0xb5, 0xaa, 0x3e, 0x5e, 0x5d, 0x7c, 0x3a, 0x80, 0x6f, 0x35, - 0x77, 0x50, 0x3f, 0x50, 0xce, 0x96, 0x3b, 0x1d, 0x51, 0x3f, 0xbd, 0x5e, - 0xa0, 0x4f, 0x1d, 0x4e, 0xca, 0x9f, 0x2e, 0x2b, 0x30, 0x88, 0xba, 0x30, - 0x22, 0x6b, 0x67, 0x5d, 0x18, 0x90, 0xb5, 0x33, 0x18, 0x9a, 0xa4, 0x68, - 0x0a, 0xff, 0x9d, 0xe1, 0x0a, 0x5a, 0x54, 0x83, 0xc7, 0x29, 0x85, 0x5d, - 0x54, 0xf7, 0x6b, 0xb9, 0xf2, 0xed, 0xa4, 0x74, 0x91, 0x7f, 0x98, 0x36, - 0xef, 0x76, 0xb4, 0x61, 0xe7, 0x53, 0x09, 0x7f, 0x6a, 0x52, 0x7d, 0x70, - 0xdf, 0x9f, 0x77, 0x67, 0x95, 0x0a, 0x9b, 0x04, 0x4f, 0x9c, 0xd1, 0x90, - 0x8a, 0x38, 0xe3, 0x2d, 0x6e, 0x07, 0x4f, 0x40, 0x71, 0x5d, 0xd1, 0x86, - 0x68, 0x69, 0x4a, 0x03, 0x51, 0x66, 0x7b, 0xcf, 0x1d, 0xb2, 0x11, 0xc8, - 0xf0, 0x2a, 0x98, 0xf5, 0x0c, 0x91, 0xe7, 0xa4, 0x0c, 0x27, 0x89, 0x13, - 0x98, 0x99, 0x66, 0xa2, 0x20, 0x48, 0xb1, 0x26, 0x95, 0x50, 0xff, 0x98, - 0x71, 0xc2, 0x92, 0xed, 0x7d, 0x75, 0xb9, 0x31, 0x00, 0x89, 0x12, 0x93, - 0x84, 0x69, 0x38, 0x22, 0x61, 0x59, 0x87, 0x57, 0x12, 0x8e, 0x9a, 0x02, - 0xf8, 0xa7, 0x54, 0x73, 0x3a, 0xc5, 0xf3, 0x6a, 0x5c, 0xe1, 0xc2, 0xf8, - 0x26, 0x84, 0x32, 0x3b, 0x31, 0x27, 0x66, 0x6b, 0x62, 0x62, 0x52, 0x31, - 0xa6, 0x0e, 0x6f, 0x13, 0x20, 0x44, 0xb0, 0x89, 0xdc, 0x37, 0x0c, 0x0d, - 0x98, 0x18, 0x4e, 0xb8, 0xe3, 0x78, 0x50, 0x00, 0x03, 0x81, 0xd1, 0x0c, - 0x7f, 0xd3, 0x08, 0x49, 0xd1, 0x98, 0xd1, 0x7c, 0x32, 0x16, 0x97, 0xcc, - 0x37, 0x39, 0x13, 0xe7, 0x7b, 0xb2, 0x70, 0x63, 0xe8, 0xba, 0x8d, 0xe1, - 0x64, 0x81, 0x49, 0x58, 0x51, 0x17, 0x0e, 0xe1, 0x05, 0x60, 0x97, 0x47, - 0x19, 0x55, 0x5c, 0x22, 0x29, 0x43, 0x62, 0x99, 0xc3, 0x7c, 0x92, 0xa2, - 0x52, 0x2e, 0x83, 0xb2, 0x39, 0xc5, 0x4e, 0x00, 0xc7, 0xc9, 0x30, 0xdb, - 0x51, 0xe6, 0xcd, 0x12, 0x8b, 0xc3, 0x8c, 0xc9, 0x61, 0xc6, 0xe2, 0x30, - 0x63, 0x72, 0x28, 0xca, 0x63, 0x51, 0x16, 0x0d, 0xc4, 0x6c, 0xeb, 0x44, - 0x50, 0x47, 0x54, 0x93, 0x71, 0x8b, 0xf6, 0x3d, 0x5a, 0x8d, 0x35, 0x6e, - 0x86, 0xf4, 0xd8, 0xa4, 0x6d, 0x1a, 0x6e, 0x56, 0xc7, 0x9a, 0x32, 0x83, - 0x12, 0xa7, 0x32, 0x18, 0x8b, 0xdb, 0x5c, 0xb8, 0x81, 0x0c, 0x25, 0x2e, - 0x96, 0x23, 0x85, 0xbf, 0xe3, 0xbe, 0x98, 0xab, 0x92, 0xc2, 0x09, 0x64, - 0xf1, 0x11, 0x2b, 0x42, 0xf7, 0xaf, 0xf0, 0x34, 0x3a, 0x36, 0x83, 0x6b, - 0xbe, 0xc0, 0xd0, 0x2e, 0xec, 0x47, 0x8e, 0xec, 0x42, 0xd1, 0xae, 0x72, - 0x84, 0xc8, 0x10, 0x42, 0x64, 0x09, 0x1c, 0x6a, 0xf8, 0xa1, 0x6b, 0x32, - 0x5a, 0x88, 0x17, 0x42, 0xfe, 0x25, 0xd7, 0x17, 0xd8, 0x4a, 0x5e, 0x25, - 0xa5, 0x97, 0xe1, 0x91, 0x62, 0x18, 0xca, 0x2c, 0x5a, 0x52, 0x67, 0x9c, - 0x17, 0xf2, 0x84, 0xe5, 0x40, 0x9f, 0x38, 0xe4, 0x1c, 0xa6, 0x10, 0x49, - 0x73, 0xa4, 0x99, 0x2f, 0x54, 0x8d, 0x98, 0xf0, 0x3b, 0x18, 0xb4, 0x7a, - 0x22, 0x06, 0xcb, 0x0e, 0x87, 0x0e, 0x2f, 0x2e, 0x16, 0xd6, 0x68, 0x1b, - 0x6b, 0x36, 0x28, 0xda, 0xae, 0x9f, 0xda, 0x71, 0x0e, 0xd6, 0x87, 0x4e, - 0xde, 0x86, 0xd7, 0x44, 0xd5, 0xb0, 0x32, 0x33, 0xe3, 0xb9, 0xcc, 0x63, - 0xb1, 0x18, 0x18, 0xf8, 0x9c, 0x81, 0xea, 0xa2, 0x84, 0x2e, 0x4d, 0x23, - 0x4c, 0x98, 0xe3, 0x26, 0xcd, 0xe0, 0xce, 0x4a, 0x33, 0x54, 0x3b, 0x49, - 0x87, 0xa1, 0x47, 0x4e, 0x63, 0x96, 0x33, 0xe9, 0xd4, 0x30, 0xd4, 0x23, - 0x77, 0xa1, 0xb9, 0xdc, 0x38, 0x61, 0x04, 0x85, 0x9f, 0x63, 0x0a, 0x59, - 0x4a, 0xbc, 0x46, 0xe9, 0x25, 0x58, 0x52, 0xcf, 0x3a, 0x79, 0x13, 0x8a, - 0x90, 0xc5, 0xb9, 0x24, 0xc0, 0x62, 0xc7, 0xc0, 0x04, 0xeb, 0xaf, 0x9c, - 0x41, 0xe8, 0x2f, 0xaa, 0x12, 0x06, 0x18, 0x73, 0x92, 0x8e, 0xfc, 0xf5, - 0x32, 0x37, 0xc3, 0x75, 0x24, 0xa6, 0x76, 0x90, 0x1d, 0x16, 0x26, 0xc8, - 0x30, 0xdb, 0x2f, 0xaf, 0xce, 0x04, 0x4b, 0xb6, 0x64, 0x96, 0x53, 0x55, - 0x24, 0x0b, 0x95, 0xa9, 0x28, 0x09, 0x09, 0x42, 0x29, 0xe9, 0x95, 0x45, - 0xe5, 0x8c, 0xe9, 0x6b, 0x44, 0xc1, 0xf0, 0x59, 0x51, 0xc0, 0xac, 0xd0, - 0xd1, 0x9c, 0xc1, 0x25, 0xac, 0x17, 0xc0, 0x16, 0x15, 0xaf, 0x0f, 0x7d, - 0x75, 0xb6, 0x24, 0x61, 0x78, 0xe6, 0x1a, 0xe8, 0x8a, 0x93, 0xe6, 0x04, - 0x26, 0xf7, 0x56, 0x51, 0x31, 0x35, 0x9f, 0xa4, 0xa3, 0x39, 0x18, 0xa8, - 0xbc, 0x46, 0x56, 0x0a, 0xe0, 0x16, 0x96, 0x96, 0x64, 0x45, 0x59, 0x46, - 0xda, 0xe9, 0xa0, 0xdd, 0x02, 0xe4, 0x2d, 0x6a, 0x3e, 0x5b, 0x6f, 0xe4, - 0x8b, 0x52, 0xf4, 0x71, 0x36, 0xbb, 0x17, 0x44, 0xed, 0x55, 0x8c, 0x11, - 0x0c, 0x2f, 0x5f, 0xed, 0xfb, 0xaa, 0xa8, 0xbd, 0x95, 0x2d, 0x42, 0x2f, - 0xc0, 0x15, 0x36, 0xd4, 0x57, 0xb2, 0x85, 0x51, 0xfc, 0x7c, 0xe1, 0x41, - 0xf7, 0x76, 0xc6, 0x30, 0x45, 0xd2, 0x04, 0xfc, 0xf5, 0x8d, 0xe9, 0x29, - 0x8c, 0xcc, 0x0b, 0x45, 0x37, 0x2e, 0x34, 0x85, 0x47, 0xba, 0xde, 0x43, - 0x0f, 0x73, 0xa4, 0x1b, 0x09, 0x32, 0x84, 0xed, 0xd1, 0x33, 0x66, 0x12, - 0xe6, 0x20, 0xce, 0x02, 0xfb, 0xc2, 0xaa, 0x6f, 0x70, 0x06, 0x48, 0x75, - 0xc2, 0x14, 0x4d, 0x38, 0x07, 0xd2, 0x06, 0xd4, 0x01, 0x66, 0xae, 0x33, - 0x9f, 0x9f, 0x60, 0xe7, 0x95, 0x64, 0x38, 0x09, 0x69, 0x20, 0x6f, 0xad, - 0xd7, 0xeb, 0xf4, 0x7e, 0x64, 0x53, 0x5e, 0xa8, 0x14, 0xfb, 0x33, 0xc4, - 0x5f, 0x29, 0xa7, 0x0d, 0x5d, 0x55, 0x64, 0x1d, 0x0d, 0xd0, 0x92, 0x0e, - 0x35, 0xe7, 0x83, 0x24, 0xdd, 0x8c, 0x79, 0x9c, 0x0f, 0xf1, 0x3d, 0x80, - 0x34, 0x06, 0xbc, 0xe9, 0x05, 0x18, 0x6d, 0x82, 0x8c, 0x83, 0x47, 0x3c, - 0x00, 0x7c, 0xe8, 0x2f, 0xeb, 0x26, 0xd9, 0xa0, 0xab, 0xa3, 0xc4, 0x3c, - 0x32, 0x9a, 0x3c, 0x42, 0xaf, 0xc8, 0xe0, 0x79, 0x87, 0xed, 0x16, 0x7e, - 0xb2, 0xb5, 0x76, 0x14, 0x84, 0xcc, 0x2a, 0x32, 0xd1, 0x19, 0x96, 0x14, - 0xf1, 0x53, 0xc8, 0xa5, 0x83, 0xe6, 0x22, 0xd4, 0x4e, 0xd1, 0x1d, 0xf3, - 0x81, 0x08, 0x6f, 0x56, 0x05, 0x67, 0x65, 0xb6, 0x56, 0x37, 0x1f, 0x3d, - 0xed, 0xd8, 0x40, 0x66, 0x9f, 0x27, 0xa8, 0x53, 0x48, 0x33, 0x6a, 0x38, - 0x37, 0x00, 0x93, 0x60, 0x2f, 0x2e, 0x07, 0x00, 0xc1, 0xe6, 0xb0, 0xbf, - 0x66, 0x43, 0xe1, 0x74, 0x4c, 0xca, 0x22, 0x0d, 0x10, 0x41, 0x5d, 0xf9, - 0x2c, 0x16, 0xe4, 0xe4, 0x25, 0x91, 0xbf, 0x67, 0x4e, 0x6c, 0x2d, 0x26, - 0x90, 0xcf, 0x8c, 0x5c, 0x1d, 0x93, 0x25, 0x69, 0xfd, 0xce, 0x38, 0xc1, - 0x66, 0xd9, 0x24, 0x98, 0xd2, 0x09, 0x04, 0xaa, 0x49, 0x48, 0x0e, 0x1b, - 0x73, 0x4d, 0x76, 0xf1, 0x63, 0x76, 0xc4, 0x9a, 0x5e, 0x35, 0xe7, 0x9c, - 0x2c, 0xf6, 0x28, 0x97, 0x9a, 0x14, 0x0e, 0xf5, 0xe2, 0x1b, 0xf6, 0xaf, - 0x65, 0x56, 0x42, 0xf2, 0x04, 0x7c, 0xfc, 0x31, 0x53, 0xb0, 0x78, 0xf4, - 0x77, 0x15, 0xf5, 0x3e, 0x0e, 0x8a, 0x97, 0x14, 0xd4, 0x7a, 0x05, 0xfe, - 0x9c, 0x08, 0x4c, 0x5a, 0x0c, 0x00, 0x4a, 0x9c, 0x6e, 0x9c, 0x59, 0xc0, - 0x39, 0x53, 0x3b, 0xf9, 0xb0, 0x86, 0x19, 0xb3, 0x59, 0x8c, 0xa5, 0xcf, - 0x47, 0xba, 0xa1, 0xc1, 0xe4, 0x9e, 0x80, 0x2d, 0x87, 0x30, 0x32, 0x1e, - 0xa5, 0xbd, 0x84, 0xab, 0xd8, 0xeb, 0xc1, 0x5e, 0xfc, 0x5e, 0x3c, 0x96, - 0xda, 0xe8, 0x5c, 0x8b, 0x4d, 0x42, 0x37, 0xf5, 0x46, 0x05, 0xf0, 0x09, - 0x1b, 0x94, 0xe6, 0xe5, 0xdf, 0x35, 0xcc, 0x48, 0x14, 0x91, 0x66, 0x5c, - 0xe2, 0xfe, 0x98, 0xff, 0x39, 0xed, 0x32, 0x81, 0x75, 0xe3, 0xaf, 0xd3, - 0x7f, 0xff, 0x00, 0x24, 0x2d, 0x83, 0xdc, 0x54, 0xda, 0xb7, 0xf5, 0x49, - 0x84, 0x35, 0x63, 0x48, 0x1a, 0x63, 0xf8, 0xe4, 0x23, 0x91, 0x87, 0x1f, - 0x1a, 0xdc, 0x34, 0x00, 0xe6, 0x12, 0xdf, 0x1d, 0xfe, 0x94, 0x4d, 0xfc, - 0xf8, 0x4b, 0xf6, 0xe7, 0x54, 0x32, 0xf9, 0xdd, 0x97, 0xb9, 0x2c, 0x5a, - 0x22, 0x3e, 0x61, 0x91, 0x4a, 0xfe, 0xb8, 0xfd, 0xb3, 0x1f, 0x11, 0x97, - 0x13, 0xcc, 0xec, 0x37, 0xc9, 0x9f, 0xb2, 0x04, 0x33, 0x12, 0xcd, 0x11, - 0x06, 0x07, 0x46, 0xca, 0x98, 0x20, 0xe3, 0x71, 0x44, 0xf2, 0xe5, 0x63, - 0x58, 0x9d, 0x08, 0xc1, 0xe1, 0x84, 0x61, 0x2c, 0x81, 0xbf, 0x65, 0xf6, - 0x93, 0x66, 0x8b, 0xe4, 0xcb, 0x3b, 0x62, 0xf6, 0xbd, 0x33, 0x85, 0x5b, - 0x03, 0x7e, 0x91, 0x5f, 0xc2, 0xd8, 0xc1, 0x4a, 0xd8, 0xc4, 0x0d, 0x80, - 0x10, 0xb5, 0xb3, 0x78, 0x5b, 0x95, 0x4d, 0x12, 0x14, 0xfa, 0xc4, 0x06, - 0x67, 0x39, 0x0f, 0xc2, 0x9d, 0x8a, 0x26, 0x26, 0x02, 0x79, 0x9a, 0xb0, - 0x51, 0xdc, 0x3a, 0x3f, 0x53, 0x0c, 0x78, 0x1a, 0xf8, 0x1f, 0x90, 0xd6, - 0x70, 0xef, 0x98, 0x2b, 0x6d, 0x29, 0xc7, 0x32, 0xbf, 0xfd, 0xe6, 0x32, - 0xe2, 0x08, 0x6f, 0xe4, 0x13, 0xce, 0x45, 0x85, 0xd0, 0x48, 0x59, 0x5c, - 0x78, 0x5a, 0xa6, 0x72, 0x45, 0x63, 0x3a, 0x0f, 0xde, 0xce, 0x59, 0xc7, - 0x4e, 0x6a, 0x3b, 0x69, 0x37, 0x16, 0x73, 0x09, 0xed, 0x9b, 0xe4, 0x07, - 0x10, 0x3d, 0x58, 0x81, 0x53, 0xc4, 0x0a, 0xc6, 0x5a, 0x68, 0x9d, 0x44, - 0x06, 0x5e, 0xac, 0x09, 0xc2, 0x7a, 0x03, 0x40, 0x12, 0x9a, 0xf4, 0x14, - 0x65, 0xdd, 0x4a, 0x47, 0x10, 0x1f, 0x5d, 0x58, 0x16, 0x06, 0x80, 0x81, - 0xa8, 0xfa, 0x0f, 0x66, 0xa0, 0xef, 0xce, 0x9a, 0xbc, 0x35, 0x9e, 0xb7, - 0x28, 0x47, 0x44, 0x82, 0x78, 0x02, 0xad, 0x2a, 0x0b, 0x19, 0x7f, 0x13, - 0xb3, 0x20, 0x4a, 0xd8, 0xd4, 0xd2, 0x96, 0x60, 0xa2, 0x64, 0x48, 0x66, - 0x65, 0x2b, 0x99, 0xd5, 0x35, 0xde, 0xec, 0xca, 0x14, 0xfb, 0x9d, 0x55, - 0x7b, 0x62, 0x68, 0x73, 0xf7, 0x82, 0xed, 0x25, 0x92, 0x85, 0x0b, 0xaa, - 0xc8, 0xf8, 0x1c, 0xb0, 0xb4, 0xcb, 0x58, 0x68, 0x19, 0x2f, 0x61, 0xb3, - 0x66, 0xde, 0x12, 0x6b, 0x0d, 0xef, 0x5a, 0xb9, 0x47, 0x8a, 0xd5, 0x91, - 0x41, 0x48, 0x92, 0xdc, 0x0c, 0x03, 0xf5, 0x06, 0xe2, 0xc7, 0xe2, 0x6c, - 0xc2, 0x80, 0x80, 0x27, 0xec, 0x56, 0x8a, 0x48, 0xb8, 0xc5, 0x32, 0x84, - 0xd6, 0x09, 0x3b, 0xe3, 0x96, 0xe6, 0x2e, 0xf6, 0x76, 0x3e, 0xff, 0xd5, - 0x11, 0x03, 0xcf, 0x66, 0xba, 0x84, 0x16, 0x58, 0xe9, 0x43, 0x6e, 0x6e, - 0x28, 0x47, 0x76, 0x72, 0x95, 0x26, 0x55, 0x59, 0x26, 0xf7, 0xed, 0xd6, - 0x06, 0xe5, 0xe0, 0x81, 0x2d, 0xd5, 0x15, 0x09, 0x56, 0xdd, 0x78, 0x4b, - 0x39, 0x81, 0x93, 0xbb, 0x8e, 0x8e, 0x1c, 0x93, 0xc3, 0xbb, 0xbd, 0xeb, - 0xcc, 0x6d, 0x2e, 0x79, 0xe7, 0x1b, 0x24, 0x79, 0x8c, 0x04, 0x63, 0x27, - 0xfd, 0x7e, 0x9a, 0x23, 0x1c, 0xac, 0x21, 0x2a, 0x89, 0x5e, 0xa2, 0x98, - 0x8a, 0x87, 0x2c, 0xa5, 0x10, 0x20, 0x2c, 0xea, 0x15, 0x9a, 0xd7, 0x5c, - 0x33, 0xb4, 0x88, 0x90, 0x59, 0x33, 0xff, 0x19, 0x9c, 0x7a, 0x54, 0x59, - 0x78, 0x0f, 0x63, 0x84, 0x40, 0xd2, 0x37, 0xc3, 0x98, 0x6c, 0x05, 0x7c, - 0x38, 0x01, 0xf6, 0x58, 0x04, 0x7b, 0x8c, 0x53, 0xea, 0xdf, 0x56, 0x14, - 0x49, 0xe2, 0x54, 0x1d, 0x1d, 0xe7, 0xc8, 0x23, 0x7b, 0x14, 0x44, 0xdb, - 0x1c, 0x3b, 0xc1, 0x27, 0x9e, 0x12, 0x02, 0xf9, 0x0d, 0x87, 0x73, 0x1b, - 0x7f, 0xa4, 0x08, 0x2b, 0x17, 0x11, 0xbd, 0xbc, 0xaa, 0x58, 0xfe, 0x24, - 0xb1, 0xe5, 0x3a, 0x9a, 0xb0, 0x95, 0xb4, 0xe7, 0x47, 0x1c, 0x0e, 0x78, - 0xf1, 0x35, 0x34, 0x83, 0xcd, 0x6a, 0x53, 0x51, 0x92, 0x7f, 0x2d, 0x65, - 0x3d, 0x3a, 0xbd, 0x81, 0xd7, 0x60, 0xfa, 0xf4, 0x15, 0xdd, 0x11, 0xd2, - 0x21, 0x94, 0x86, 0x0f, 0x8a, 0x16, 0x86, 0x69, 0xbe, 0x47, 0x97, 0x7d, - 0x8e, 0xe2, 0x83, 0x68, 0xf1, 0x34, 0x4f, 0x86, 0x0e, 0xe2, 0xc6, 0x1b, - 0x2d, 0x51, 0xe5, 0x34, 0x28, 0xf8, 0x41, 0x11, 0xc2, 0xf4, 0x8f, 0x29, - 0x64, 0x79, 0x2c, 0x08, 0x00, 0xb8, 0x83, 0x2d, 0x66, 0x27, 0x49, 0xc8, - 0xbb, 0x75, 0xea, 0x87, 0xfe, 0xb1, 0xf0, 0x73, 0xd2, 0x47, 0x93, 0x44, - 0xb0, 0x0d, 0x64, 0x10, 0x50, 0x73, 0xc0, 0xff, 0x83, 0xba, 0xdd, 0x9c, - 0xd2, 0x63, 0x8e, 0x92, 0xda, 0x12, 0xfe, 0x17, 0xfe, 0xb2, 0x31, 0x82, - 0xa7, 0x9c, 0xa3, 0xff, 0x7b, 0xf9, 0x03, 0x7a, 0xd9, 0xe7, 0x74, 0x49, - 0xd2, 0xf2, 0x5d, 0x5e, 0x97, 0x52, 0xf0, 0xc0, 0x90, 0xa2, 0x50, 0xb3, - 0x21, 0xd9, 0x42, 0xdb, 0x6c, 0x02, 0x38, 0xb1, 0xac, 0xc6, 0x4a, 0xd3, - 0xd6, 0xa4, 0x35, 0x3d, 0xef, 0xce, 0xc6, 0xda, 0x02, 0x38, 0xea, 0xa7, - 0xf8, 0xa1, 0x8e, 0x03, 0xa2, 0xd5, 0x0b, 0x9a, 0x04, 0xa6, 0x40, 0x34, - 0x58, 0x0d, 0xe9, 0x42, 0x13, 0x30, 0x18, 0x55, 0x1f, 0x33, 0xdb, 0x49, - 0x0f, 0xb2, 0x15, 0x43, 0x99, 0x18, 0x3e, 0x5a, 0x64, 0xdc, 0x85, 0xc1, - 0x3b, 0x81, 0x73, 0x64, 0x5b, 0x49, 0x2f, 0x4d, 0xa7, 0x97, 0xff, 0x2e, - 0x73, 0x7b, 0x09, 0x24, 0x53, 0x90, 0x84, 0x13, 0x9e, 0xef, 0xb1, 0x30, - 0x93, 0x84, 0x07, 0xc8, 0x2c, 0x0b, 0xb3, 0xb1, 0x2a, 0x44, 0xcc, 0x86, - 0x3d, 0x7d, 0xfb, 0x91, 0x62, 0xa5, 0xb7, 0xe8, 0x28, 0xa6, 0x84, 0xcc, - 0xdc, 0xf9, 0x3f, 0x41, 0xa3, 0x91, 0xc1, 0x24, 0x11, 0xeb, 0xbf, 0x11, - 0x4a, 0x92, 0x90, 0x0d, 0x67, 0x8b, 0x41, 0x24, 0x53, 0xf7, 0xbe, 0xae, - 0xa1, 0x48, 0x61, 0x3d, 0x8f, 0xcf, 0x2d, 0xdb, 0xfd, 0x1e, 0xc0, 0x89, - 0x93, 0xf3, 0x0a, 0x49, 0x42, 0xfe, 0xe3, 0x3c, 0x38, 0xf1, 0x17, 0x54, - 0x4f, 0x67, 0xf8, 0x30, 0xd9, 0x1b, 0x14, 0x65, 0x2e, 0xcc, 0xde, 0xaf, - 0x2b, 0xd7, 0x2a, 0xef, 0x9f, 0xa7, 0x28, 0x9f, 0xb9, 0xe2, 0xf5, 0xeb, - 0x7b, 0x27, 0x3b, 0x8b, 0x86, 0x07, 0xca, 0x2a, 0x0c, 0x75, 0x46, 0x66, - 0x9d, 0xa5, 0x6a, 0x3f, 0x5e, 0xdc, 0x49, 0xcf, 0xbd, 0xa2, 0xff, 0x07, - 0x79, 0xa4, 0xff, 0x7d, 0xfc, 0x47, 0x6b, 0x34, 0xdc, 0xc7, 0xeb, 0x53, - 0x65, 0x51, 0x71, 0xda, 0x49, 0x20, 0xea, 0xe5, 0xd3, 0xb0, 0xea, 0x26, - 0x1b, 0x82, 0xcf, 0x81, 0x2d, 0x8c, 0x47, 0x0a, 0xfe, 0x8a, 0x6c, 0x15, - 0xc1, 0xc4, 0x47, 0x82, 0x60, 0x01, 0x3c, 0x50, 0x20, 0x5f, 0xef, 0xe3, - 0xdf, 0xa9, 0xf9, 0x2e, 0xb2, 0xe6, 0xd0, 0xa9, 0xb1, 0x7e, 0x98, 0xcd, - 0x39, 0x40, 0xe1, 0x2d, 0xb6, 0xe0, 0x70, 0x44, 0xb0, 0x49, 0xa7, 0xea, - 0xbb, 0xc8, 0xaa, 0xcd, 0x8d, 0x62, 0x28, 0x7f, 0xab, 0x12, 0x6d, 0x0f, - 0x65, 0xc1, 0x4c, 0x00, 0x72, 0x08, 0xd9, 0xd5, 0x48, 0x60, 0x7c, 0xe2, - 0xc3, 0x05, 0x7b, 0x43, 0x60, 0x83, 0xd2, 0x38, 0x5a, 0xf7, 0x66, 0xfc, - 0x3c, 0x16, 0x12, 0x0e, 0x1f, 0xc8, 0x62, 0x6d, 0x91, 0x6c, 0xd2, 0x7a, - 0x68, 0x53, 0x04, 0xfc, 0x05, 0x1c, 0x6d, 0xa9, 0xcb, 0xf5, 0xe0, 0x54, - 0x08, 0xf8, 0xdf, 0x06, 0xf6, 0x18, 0xbb, 0x69, 0x49, 0xde, 0x70, 0xc2, - 0x21, 0x12, 0x5c, 0xca, 0xd0, 0x79, 0xc8, 0x49, 0x65, 0x6d, 0x46, 0xf0, - 0xf4, 0xa0, 0x67, 0xf8, 0x3b, 0x68, 0x01, 0x83, 0x24, 0x89, 0x38, 0xe6, - 0xc4, 0x2d, 0x8f, 0x32, 0x1e, 0xeb, 0xc8, 0xb8, 0xc6, 0x15, 0x7e, 0x68, - 0x9a, 0xa6, 0x0b, 0x03, 0x3f, 0x25, 0x35, 0x11, 0x1a, 0x52, 0xe4, 0x99, - 0x02, 0x77, 0x0a, 0xe0, 0x20, 0x6c, 0xd0, 0x61, 0x78, 0xb4, 0xe4, 0xd8, - 0xcb, 0x31, 0x51, 0x3c, 0xce, 0xb0, 0x3b, 0x65, 0xdf, 0x32, 0x09, 0xda, - 0x1b, 0x94, 0xeb, 0xa4, 0xbb, 0xf6, 0x06, 0x30, 0x40, 0xf9, 0x9e, 0x22, - 0x8c, 0x40, 0x3a, 0xc4, 0xe4, 0x1b, 0x66, 0xf0, 0xbf, 0x72, 0xfe, 0xf4, - 0x69, 0xdd, 0xf9, 0xbc, 0xbc, 0xc6, 0x37, 0x39, 0xa9, 0xf7, 0x16, 0xe2, - 0xe8, 0xd2, 0x2a, 0x4d, 0x36, 0x5a, 0xd2, 0x0c, 0xbe, 0x1b, 0x15, 0x8c, - 0x44, 0x01, 0xea, 0x35, 0x53, 0x05, 0x80, 0xd3, 0x13, 0x36, 0x89, 0x04, - 0x21, 0xce, 0xd0, 0xbd, 0x8d, 0xe4, 0x77, 0x2c, 0x7b, 0x48, 0x4c, 0x2c, - 0x05, 0x4f, 0x29, 0xb2, 0xc1, 0x04, 0x36, 0xde, 0x52, 0x16, 0x48, 0xab, - 0xc0, 0xd1, 0xfa, 0x84, 0xdf, 0x92, 0xe8, 0x69, 0xcb, 0x35, 0x2d, 0xe3, - 0xc9, 0xc4, 0xd3, 0x36, 0xc5, 0xc8, 0x62, 0x05, 0x55, 0xe8, 0xd1, 0x52, - 0x73, 0x0b, 0xc9, 0xd3, 0x4e, 0x80, 0x5b, 0x8f, 0x65, 0x13, 0x12, 0x01, - 0x90, 0x38, 0xd3, 0x93, 0x37, 0x12, 0x36, 0xd5, 0x90, 0xdc, 0x10, 0xae, - 0x5a, 0x70, 0xa4, 0xc5, 0x0d, 0x41, 0xa3, 0x0d, 0xbb, 0x2e, 0xac, 0xb3, - 0x80, 0xe2, 0x59, 0x88, 0x2d, 0x9d, 0x69, 0x8e, 0xa0, 0xd8, 0xf9, 0x3a, - 0x19, 0x51, 0x16, 0xe7, 0xe6, 0x41, 0xb1, 0x55, 0x7a, 0xd2, 0xc9, 0x52, - 0xa6, 0x53, 0xaf, 0xc3, 0xf8, 0x80, 0x2d, 0x5f, 0x95, 0x9b, 0x90, 0x93, - 0xa4, 0x3e, 0x80, 0xb0, 0x89, 0xd1, 0x64, 0x38, 0x4d, 0x92, 0x46, 0xfe, - 0x69, 0xd6, 0xbf, 0x69, 0x4d, 0xa0, 0xe3, 0x5b, 0x78, 0x59, 0xe3, 0x60, - 0x8f, 0xd6, 0x63, 0xe3, 0xd6, 0xcd, 0x92, 0xf7, 0xda, 0x39, 0x46, 0x21, - 0x09, 0xaf, 0xd7, 0x1c, 0x3f, 0x63, 0x28, 0x8a, 0x7d, 0xc0, 0x8c, 0x3c, - 0xc1, 0x45, 0x46, 0x36, 0x00, 0xf2, 0xfe, 0x21, 0xe4, 0xec, 0x8f, 0xda, - 0xb7, 0x77, 0x3e, 0xc7, 0x74, 0xec, 0x5d, 0x52, 0x96, 0xf9, 0xfa, 0x6b, - 0x47, 0x1d, 0x66, 0xb3, 0xd6, 0x33, 0xe6, 0xce, 0xfa, 0xcd, 0xae, 0x1d, - 0x31, 0x04, 0xef, 0xd5, 0x83, 0x97, 0xd4, 0x87, 0x8d, 0x5e, 0xd8, 0x77, - 0x07, 0x34, 0x4b, 0x07, 0x7f, 0xfa, 0xe8, 0x26, 0x0d, 0xc5, 0xd8, 0xc9, - 0x27, 0xfa, 0xa4, 0xc0, 0xbc, 0xb5, 0x41, 0xf1, 0x97, 0x67, 0x27, 0x49, - 0xcb, 0xaf, 0x19, 0xdc, 0x58, 0xdc, 0x98, 0xbe, 0xeb, 0xf3, 0xf5, 0xc2, - 0xd9, 0xb5, 0x4e, 0x86, 0xf7, 0x6f, 0x48, 0xcf, 0x92, 0xf6, 0x23, 0xdd, - 0xe5, 0x1a, 0x9e, 0x9d, 0x9d, 0x9b, 0xb8, 0xaa, 0xfb, 0xdb, 0xfd, 0xa2, - 0x25, 0x6b, 0x9a, 0xf0, 0xed, 0xf3, 0x8c, 0x6f, 0x73, 0x8c, 0x70, 0x04, - 0xb9, 0x05, 0x2b, 0xb9, 0x04, 0xcd, 0xb0, 0xdb, 0x6b, 0x12, 0x03, 0xcd, - 0xf4, 0xf7, 0x26, 0xa0, 0x28, 0xc9, 0xcd, 0x49, 0x28, 0x09, 0x9c, 0x02, - 0x69, 0xd1, 0xb2, 0x0d, 0xdf, 0x41, 0x9f, 0x04, 0xd9, 0x9b, 0x04, 0x98, - 0xfc, 0x11, 0x7c, 0x1d, 0x03, 0x3c, 0x7c, 0xa7, 0x52, 0xc1, 0x9c, 0x32, - 0x21, 0x62, 0xd1, 0xfa, 0x51, 0xfc, 0xf9, 0x28, 0x14, 0xa0, 0x26, 0x05, - 0x56, 0x89, 0xb8, 0xd8, 0x74, 0xc0, 0x27, 0xd6, 0x71, 0x66, 0xbf, 0xb9, - 0x9b, 0xb8, 0x40, 0x3e, 0x34, 0x5a, 0x22, 0x24, 0xb0, 0xeb, 0x31, 0x7f, - 0xe2, 0xb8, 0x29, 0x9e, 0x49, 0x5a, 0x74, 0x03, 0x73, 0x94, 0x8f, 0x72, - 0x80, 0xdc, 0xfa, 0x9d, 0x3b, 0x4a, 0x36, 0xc4, 0x44, 0x36, 0x18, 0x84, - 0x3f, 0x75, 0xf7, 0xfc, 0x9a, 0xe3, 0x45, 0x18, 0x83, 0x9c, 0x11, 0x7a, - 0xd3, 0xa1, 0x1c, 0x7d, 0x21, 0x1a, 0x20, 0x36, 0x80, 0x05, 0x7d, 0x0d, - 0x38, 0x72, 0x38, 0x7c, 0x0d, 0x67, 0xaf, 0x0f, 0x43, 0x6a, 0xc8, 0xa9, - 0x9d, 0xe8, 0x1a, 0x29, 0xa2, 0xea, 0x4e, 0x8f, 0xac, 0x50, 0xe4, 0x88, - 0x2a, 0x3e, 0xaa, 0x99, 0x28, 0x78, 0x55, 0x8d, 0xaa, 0xd1, 0xa3, 0x9a, - 0x5f, 0x06, 0x38, 0x76, 0x06, 0x35, 0xf1, 0xb2, 0x71, 0x8e, 0xd1, 0x5a, - 0x08, 0xa6, 0x8b, 0xdb, 0xd8, 0xeb, 0x24, 0xa6, 0xfc, 0x67, 0x76, 0x3b, - 0x5c, 0xb5, 0x8d, 0xea, 0x28, 0x35, 0xaa, 0x66, 0x22, 0x8e, 0x23, 0x6a, - 0x44, 0x5e, 0xf9, 0x8b, 0xb4, 0x6b, 0x4c, 0x45, 0xdd, 0x7d, 0x12, 0xda, - 0x35, 0x5d, 0x58, 0x4a, 0xf6, 0x6e, 0x69, 0xf9, 0xf7, 0x87, 0xb6, 0x72, - 0x5b, 0x64, 0x2f, 0xca, 0x7f, 0xbe, 0x8b, 0xd2, 0x82, 0x5a, 0xda, 0xb0, - 0xff, 0xb0, 0x92, 0x67, 0x42, 0xb5, 0x0a, 0xdd, 0x93, 0x6a, 0x9e, 0x4c, - 0xaa, 0xc1, 0x29, 0xd5, 0x06, 0x4e, 0x93, 0xd8, 0x72, 0xe3, 0xde, 0x32, - 0x65, 0x84, 0x7c, 0x05, 0x8e, 0x88, 0x05, 0x25, 0x01, 0x7a, 0x1f, 0xba, - 0xf9, 0xfb, 0xf1, 0xb1, 0x45, 0xd4, 0xc6, 0x6f, 0xf0, 0x14, 0x5b, 0xe8, - 0xa1, 0x2d, 0x9c, 0xb9, 0xac, 0x8c, 0xcc, 0xae, 0x0d, 0x98, 0x8a, 0xd3, - 0xf7, 0xa4, 0xf2, 0x2d, 0x07, 0xfa, 0xa3, 0x8f, 0xf4, 0x07, 0x00, 0x99, - 0x8f, 0x3a, 0xe3, 0x1f, 0xe8, 0xfa, 0x37, 0x99, 0x6c, 0x94, 0xe1, 0x7e, - 0x8c, 0xf9, 0xc6, 0x35, 0xe2, 0x50, 0x79, 0x3e, 0xcc, 0xa0, 0x3f, 0xc8, - 0xac, 0xff, 0x2c, 0xe3, 0x8e, 0x65, 0xe2, 0x96, 0xa1, 0xfb, 0x9e, 0x63, - 0x78, 0xc4, 0xf0, 0x79, 0xc5, 0x49, 0xd0, 0xdb, 0x67, 0x88, 0xff, 0x8c, - 0x0b, 0x1c, 0x64, 0xe0, 0x39, 0x2d, 0x7c, 0xcc, 0x91, 0x72, 0xf3, 0xe6, - 0x86, 0x49, 0x75, 0xdd, 0x01, 0xf2, 0x6a, 0xad, 0x55, 0x1b, 0xd4, 0xde, - 0x71, 0x84, 0x3c, 0xa8, 0x38, 0x30, 0x99, 0xca, 0xc8, 0x8e, 0xca, 0xff, - 0x4c, 0x97, 0x92, 0xcb, 0xf1, 0x60, 0x0c, 0x1a, 0xc9, 0x18, 0x81, 0xb5, - 0x6f, 0x74, 0x38, 0x27, 0xd4, 0xe1, 0x44, 0xac, 0x1c, 0xce, 0xfb, 0x9d, - 0x1f, 0xb0, 0x69, 0xc3, 0xba, 0x3b, 0xd4, 0xb9, 0xc4, 0xbe, 0x02, 0x14, - 0x50, 0x89, 0x69, 0xba, 0xde, 0x06, 0xe3, 0x1b, 0x93, 0x1b, 0x2b, 0xbe, - 0x61, 0x91, 0x6e, 0x88, 0x81, 0x4b, 0xcc, 0xa0, 0x51, 0xa3, 0xd7, 0x08, - 0x70, 0x2c, 0xfe, 0x1d, 0x5c, 0xde, 0x38, 0x61, 0xc9, 0xb1, 0x54, 0x9a, - 0xc6, 0x8a, 0xb6, 0x09, 0x79, 0x2e, 0xd1, 0x38, 0xdd, 0xe9, 0x11, 0x60, - 0x42, 0x33, 0xac, 0x1e, 0xf1, 0xaa, 0x25, 0xae, 0xb7, 0xa3, 0x16, 0x42, - 0x62, 0x90, 0xa3, 0x0d, 0x67, 0xae, 0xc9, 0xcb, 0xc2, 0xec, 0xdb, 0xa3, - 0xd4, 0xe2, 0xd3, 0xe4, 0x45, 0x63, 0x69, 0xc0, 0x87, 0x42, 0xf8, 0x5a, - 0xa9, 0x74, 0xe0, 0x06, 0xcd, 0xb4, 0x05, 0x70, 0x75, 0xb8, 0x83, 0x5d, - 0xa7, 0xe3, 0xc4, 0x3f, 0xd0, 0x9d, 0x61, 0x48, 0x28, 0x92, 0x7b, 0x92, - 0x12, 0x27, 0xca, 0xec, 0x87, 0xdc, 0x5b, 0xf8, 0xc0, 0x28, 0x93, 0x2c, - 0x2e, 0xfc, 0x3c, 0x32, 0x23, 0xd0, 0xd0, 0xfd, 0x51, 0xd4, 0xca, 0xc2, - 0x46, 0xa0, 0xeb, 0x8c, 0xf5, 0xf0, 0x77, 0xba, 0x0b, 0xfc, 0x8e, 0x7b, - 0xe4, 0xe8, 0xc5, 0xde, 0xf5, 0x48, 0xbc, 0x0b, 0x87, 0xff, 0x15, 0x56, - 0x13, 0xeb, 0xc1, 0x01, 0xe0, 0x95, 0x08, 0x91, 0xab, 0x10, 0x3d, 0xba, - 0x4a, 0x9d, 0xaa, 0x6f, 0x59, 0x6d, 0x29, 0xf2, 0xab, 0x16, 0x3c, 0x54, - 0x0a, 0xdc, 0xb1, 0x71, 0x7c, 0x86, 0x65, 0xf1, 0x04, 0xcd, 0xe7, 0x5d, - 0x83, 0xd6, 0x42, 0x2f, 0x82, 0x7a, 0x73, 0x9f, 0x49, 0xb3, 0x14, 0x06, - 0x12, 0xb9, 0x1d, 0x96, 0xb5, 0xae, 0x82, 0x04, 0xf1, 0x49, 0x23, 0x01, - 0xfc, 0xe7, 0xcf, 0xfc, 0xcc, 0x47, 0x8e, 0x8f, 0xe4, 0x46, 0x0e, 0xc9, - 0xc0, 0x0b, 0x34, 0x41, 0x8a, 0xed, 0x8b, 0xc8, 0x33, 0x18, 0xbc, 0x51, - 0x1c, 0xe2, 0xaf, 0xb5, 0x1c, 0xba, 0x6f, 0x34, 0x43, 0xea, 0xd8, 0x56, - 0x9b, 0x43, 0xc9, 0x14, 0xd2, 0x36, 0xa4, 0xa4, 0x17, 0x87, 0x0e, 0x91, - 0x80, 0x20, 0xce, 0x88, 0x76, 0xfc, 0x31, 0x76, 0x71, 0x47, 0xee, 0x3a, - 0x73, 0xcf, 0x03, 0xaa, 0xe0, 0x8d, 0x0f, 0x59, 0xfc, 0x60, 0xdf, 0x92, - 0xf0, 0xc8, 0x93, 0xcb, 0xa9, 0x70, 0x61, 0xec, 0x5f, 0x7e, 0x51, 0xd6, - 0x35, 0xb1, 0x45, 0x4b, 0x62, 0xbb, 0xb8, 0x34, 0x83, 0xef, 0xb2, 0x11, - 0x97, 0xfb, 0xa7, 0xc4, 0x4a, 0x7f, 0xc1, 0x2d, 0x3c, 0x8c, 0x51, 0x96, - 0x94, 0x51, 0xe2, 0x47, 0x5c, 0x00, 0xd7, 0xf0, 0x9e, 0x89, 0x34, 0x87, - 0xd4, 0x7e, 0x5e, 0x92, 0xb1, 0x82, 0xaa, 0x0f, 0xb9, 0x95, 0x97, 0xcb, - 0xc1, 0x08, 0x8c, 0x0a, 0x25, 0x3e, 0xc8, 0x7a, 0x36, 0xdf, 0x42, 0x8a, - 0x71, 0x17, 0xe6, 0x4d, 0x37, 0x6a, 0xac, 0x7b, 0x32, 0xf1, 0x02, 0x36, - 0x4a, 0x07, 0x94, 0x46, 0xdf, 0x46, 0x90, 0xd8, 0x68, 0xb7, 0xf4, 0x7c, - 0x40, 0x00, 0x8f, 0xf5, 0x2d, 0xaa, 0x2c, 0x00, 0x12, 0x46, 0xf6, 0x61, - 0x18, 0xd3, 0x90, 0xf4, 0x75, 0x43, 0x80, 0x84, 0x32, 0x53, 0x74, 0xa9, - 0xd1, 0x23, 0xbd, 0x6f, 0xb1, 0xfa, 0x18, 0x76, 0x1f, 0xe8, 0x73, 0x8c, - 0xbf, 0x3e, 0x9c, 0xa3, 0x4c, 0xb9, 0x62, 0xb8, 0x78, 0x51, 0x1c, 0x71, - 0x86, 0x7e, 0x5f, 0xfa, 0xf9, 0x89, 0x1d, 0x59, 0x58, 0xdd, 0x81, 0x7b, - 0xbb, 0x0f, 0xfc, 0x10, 0x8d, 0x61, 0x1d, 0xb7, 0x15, 0x01, 0x54, 0x0c, - 0x5e, 0x31, 0x37, 0x83, 0x5f, 0xa6, 0x63, 0x76, 0x08, 0xbb, 0x7a, 0x63, - 0x00, 0x53, 0x81, 0x09, 0x8a, 0x67, 0x05, 0x0c, 0x4b, 0xbe, 0x83, 0xc0, - 0x5f, 0x12, 0x43, 0xe9, 0x93, 0x03, 0x2f, 0x22, 0x99, 0x97, 0xce, 0xe8, - 0x4b, 0x7a, 0x56, 0x36, 0x68, 0x14, 0x3b, 0x97, 0x3a, 0xea, 0x2b, 0x63, - 0x63, 0x00, 0xef, 0x50, 0x49, 0x10, 0x15, 0x6c, 0xc4, 0x00, 0xd0, 0x3e, - 0x24, 0xbf, 0x13, 0x85, 0x50, 0xa6, 0x4f, 0xe1, 0x90, 0x84, 0x04, 0xff, - 0x8c, 0x12, 0x8f, 0xdf, 0x3b, 0xda, 0x82, 0x79, 0xc9, 0xa2, 0x1b, 0x04, - 0xee, 0xc3, 0x16, 0xc8, 0x05, 0x2c, 0xc1, 0x8d, 0x36, 0xb9, 0xad, 0x95, - 0xb0, 0x76, 0x3d, 0xfc, 0x86, 0xa7, 0xcc, 0x66, 0x70, 0x95, 0x41, 0xcf, - 0xc2, 0x92, 0xa4, 0x42, 0x7f, 0x27, 0xbc, 0x46, 0x84, 0x5d, 0xcd, 0x21, - 0xb3, 0xa5, 0x73, 0x8f, 0xc8, 0x04, 0xd8, 0x4a, 0x7b, 0x00, 0x46, 0x30, - 0xe3, 0x37, 0x11, 0xbc, 0x5e, 0xeb, 0x79, 0x21, 0xca, 0x00, 0x59, 0x31, - 0x34, 0x29, 0xd3, 0xdf, 0x4a, 0xe3, 0xf7, 0x4c, 0xf1, 0xf0, 0x6c, 0x62, - 0x41, 0xd1, 0x8b, 0x17, 0x11, 0x47, 0xa7, 0x87, 0xce, 0x3a, 0xcc, 0xbc, - 0xb0, 0xe8, 0x4f, 0x2e, 0x78, 0xbd, 0x7c, 0xda, 0x56, 0x9d, 0x35, 0xa4, - 0x60, 0xf7, 0x96, 0x25, 0x1e, 0xdf, 0x6f, 0x62, 0xbe, 0xd6, 0xb0, 0x59, - 0x77, 0x64, 0xfc, 0x4a, 0x5a, 0xa2, 0x0a, 0xc7, 0xda, 0xde, 0xa1, 0x14, - 0x08, 0x0f, 0x94, 0x57, 0x28, 0xe5, 0x36, 0xa8, 0x94, 0xdb, 0x37, 0x2a, - 0x25, 0xc4, 0x80, 0xf0, 0xc3, 0x25, 0x30, 0xd4, 0xe6, 0x64, 0x48, 0x47, - 0x6b, 0x50, 0x80, 0xd9, 0x23, 0x1d, 0xff, 0x37, 0xa8, 0x46, 0x43, 0xaf, - 0x52, 0x4d, 0x7f, 0x2a, 0x8e, 0x8d, 0x10, 0x05, 0xd1, 0x8a, 0x3f, 0x57, - 0x4d, 0x1a, 0xfa, 0x38, 0x35, 0x99, 0x9e, 0xd2, 0x0a, 0x54, 0xc3, 0x8f, - 0xa9, 0xb8, 0x92, 0xd9, 0xa1, 0x2b, 0x3e, 0x2b, 0x98, 0xb6, 0xea, 0x8e, - 0xde, 0x14, 0x1c, 0xc7, 0x0e, 0x53, 0x3f, 0xc2, 0xb5, 0x46, 0x4a, 0xfe, - 0xe2, 0x5b, 0x55, 0x9b, 0x0d, 0x38, 0xeb, 0x6a, 0xdf, 0x84, 0xa6, 0xc8, - 0x65, 0x38, 0xa8, 0xd5, 0xc2, 0x07, 0x7d, 0xbd, 0x77, 0x97, 0xf1, 0x3f, - 0x1d, 0xa4, 0x79, 0x7e, 0xf1, 0xbf, 0xb3, 0x48, 0x33, 0x70, 0x39, 0x18, - 0x13, 0x1c, 0x29, 0x06, 0x15, 0xf3, 0x64, 0x4b, 0x38, 0x3b, 0xd5, 0x10, - 0xce, 0xf2, 0xa9, 0x12, 0x30, 0x9d, 0xc8, 0xfd, 0xf8, 0xdd, 0xd7, 0x3f, - 0xa7, 0x60, 0x69, 0x7c, 0x02, 0x5f, 0xc9, 0x13, 0xf8, 0xf1, 0xf5, 0xcf, - 0xdf, 0x24, 0x73, 0x13, 0x31, 0xed, 0xf4, 0xc4, 0x2c, 0x0d, 0x6f, 0x55, - 0x4b, 0xd3, 0x17, 0x1e, 0x30, 0xcf, 0xa4, 0xb9, 0x1f, 0xa1, 0xe4, 0x67, - 0xa0, 0x4d, 0x0a, 0x8f, 0xcc, 0x8e, 0x0e, 0x06, 0xe2, 0x9e, 0x5c, 0x80, - 0x1d, 0x74, 0xa4, 0x09, 0x09, 0xf2, 0xc2, 0x01, 0xf3, 0x27, 0xd6, 0x99, - 0xf9, 0x93, 0xce, 0x36, 0xc1, 0x2b, 0xd6, 0x9e, 0xbd, 0xcc, 0x04, 0x8b, - 0x8b, 0x58, 0xcb, 0xe7, 0x39, 0xe0, 0x61, 0x2f, 0xb0, 0x62, 0xe7, 0xe6, - 0x2f, 0x80, 0xc7, 0x68, 0x01, 0x2c, 0x53, 0x6f, 0xc7, 0x39, 0xba, 0x76, - 0xf6, 0xbc, 0x21, 0x8b, 0x5e, 0x05, 0xc6, 0x5d, 0xa8, 0x1f, 0x42, 0x52, - 0x4b, 0x90, 0xef, 0x74, 0x88, 0x49, 0x94, 0xb9, 0x30, 0x96, 0x20, 0x7f, - 0x83, 0x47, 0x7d, 0x8e, 0xbb, 0xe3, 0x96, 0x90, 0x9e, 0x19, 0xe9, 0x39, - 0x6c, 0x05, 0xdb, 0xd9, 0xed, 0xec, 0x01, 0xfe, 0x95, 0x85, 0xa5, 0xb9, - 0xfb, 0xc5, 0xe8, 0xae, 0xc5, 0x39, 0xec, 0xb9, 0xe3, 0x64, 0x96, 0x71, - 0xc2, 0xce, 0x8d, 0x71, 0x66, 0x9f, 0xfd, 0xd6, 0x69, 0x1a, 0xb3, 0x61, - 0xbd, 0x7f, 0xfd, 0x18, 0x9f, 0xcc, 0x63, 0x14, 0x7a, 0xbb, 0x9a, 0x75, - 0xf7, 0xff, 0x11, 0x6b, 0x32, 0x09, 0x47, 0xf5, 0x18, 0x11, 0x2a, 0x2d, - 0x11, 0x31, 0x29, 0x28, 0xf3, 0xd5, 0x62, 0xa9, 0x43, 0x6b, 0xcc, 0x1e, - 0x09, 0xad, 0xb3, 0x22, 0x4d, 0xfb, 0xfa, 0xb3, 0x75, 0xa1, 0x99, 0xbc, - 0x28, 0xd8, 0x8b, 0x22, 0x92, 0x9b, 0xe1, 0x18, 0xcb, 0x7b, 0x57, 0xdc, - 0x44, 0xdd, 0xf2, 0xa0, 0x6e, 0x01, 0x2a, 0x45, 0xa0, 0xe2, 0x62, 0x29, - 0xe1, 0x45, 0xf4, 0x39, 0xfa, 0x42, 0xfa, 0x3f, 0x00, 0x33, 0xfc, 0x14, - 0xf6, 0xa1, 0x5e, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x08, 0x79, 0x1c, 0x96, 0x5d, 0x04, 0x00, 0x65, 0x64, + 0x69, 0x74, 0x2e, 0x68, 0x74, 0x6d, 0x00, 0xed, 0x1d, 0x6b, 0x57, 0xea, + 0x46, 0xf0, 0x7b, 0xcf, 0xe9, 0x7f, 0x48, 0xd3, 0x87, 0x50, 0x9e, 0xa2, + 0xd7, 0x2a, 0x6a, 0x5b, 0x40, 0x40, 0x45, 0x8a, 0x08, 0x2a, 0xda, 0xd7, + 0x09, 0xc9, 0x02, 0xd1, 0x90, 0xc4, 0x24, 0x08, 0x7a, 0x6b, 0x7f, 0x7b, + 0x67, 0x1f, 0x79, 0x27, 0x10, 0xd4, 0x3e, 0x4f, 0xb9, 0xed, 0x25, 0xec, + 0xce, 0xcc, 0xce, 0xcc, 0xce, 0xce, 0xce, 0xce, 0xee, 0xe6, 0x1e, 0x7c, + 0x76, 0xd4, 0xa9, 0xf5, 0x6f, 0xce, 0xeb, 0xdc, 0xc4, 0x9a, 0x2a, 0xdf, + 0x7e, 0xfa, 0xc9, 0x01, 0xfe, 0xe6, 0x14, 0x41, 0x1d, 0x1f, 0xf2, 0x48, + 0xe5, 0xa1, 0x84, 0xe3, 0x0e, 0x26, 0x48, 0x90, 0xc8, 0x13, 0x3c, 0x5b, + 0xb2, 0xa5, 0xa0, 0x6f, 0x7b, 0xe7, 0x27, 0x8d, 0x46, 0x8f, 0xab, 0x4b, + 0xb2, 0xa5, 0x19, 0x07, 0x05, 0x52, 0x68, 0x43, 0x98, 0xd6, 0x93, 0x82, + 0x38, 0xeb, 0x49, 0x47, 0x87, 0xbc, 0x85, 0x16, 0x56, 0x41, 0x34, 0x4d, + 0x9e, 0x9b, 0x22, 0x49, 0x16, 0x0e, 0x79, 0x53, 0x34, 0x10, 0xa3, 0x4b, + 0x3e, 0x79, 0x51, 0x53, 0x31, 0x50, 0x1b, 0xa9, 0x33, 0xee, 0x23, 0x94, + 0xb2, 0xcf, 0x73, 0x4e, 0x56, 0x25, 0xb4, 0x28, 0x73, 0x5b, 0xc5, 0xe2, + 0xbe, 0x5b, 0xac, 0x6b, 0xa6, 0x6c, 0xc9, 0x9a, 0x5a, 0xe6, 0x84, 0xa1, + 0xa9, 0x29, 0x33, 0x0b, 0x79, 0x2a, 0x15, 0x34, 0xb2, 0xca, 0xdc, 0x07, + 0x7d, 0xe1, 0x29, 0x1b, 0x6a, 0x86, 0x84, 0x8c, 0x32, 0xb7, 0xa9, 0x2f, + 0x38, 0x40, 0x90, 0x25, 0xee, 0xf3, 0xed, 0xed, 0x6d, 0x2f, 0x80, 0x20, + 0xde, 0x8f, 0x0d, 0x6d, 0xa6, 0x4a, 0x39, 0x51, 0x53, 0x34, 0x00, 0xfd, + 0xbc, 0xf1, 0x01, 0xff, 0xf1, 0xc0, 0x48, 0xb2, 0xa9, 0x2b, 0xc2, 0x53, + 0x99, 0x53, 0x35, 0x15, 0xf9, 0x88, 0x2f, 0x72, 0xe6, 0x44, 0x90, 0xb4, + 0x79, 0x99, 0x2b, 0xc2, 0x9f, 0xcd, 0x22, 0xb4, 0x62, 0x8c, 0x87, 0x42, + 0x8a, 0x2b, 0x66, 0xd9, 0x7f, 0xf9, 0x6d, 0x2e, 0xed, 0x41, 0x19, 0x81, + 0xb8, 0x39, 0x53, 0x7e, 0x46, 0xc0, 0x52, 0xc9, 0xe6, 0xd4, 0xad, 0x19, + 0x09, 0x53, 0x59, 0x81, 0x86, 0x4c, 0x41, 0x35, 0x73, 0x26, 0x32, 0xe4, + 0x51, 0x10, 0x62, 0x8e, 0xe4, 0xf1, 0xc4, 0x2a, 0x0f, 0x35, 0x45, 0x72, + 0xaa, 0x5e, 0x22, 0xb5, 0x39, 0x53, 0xbc, 0x0a, 0x55, 0x64, 0x13, 0x1a, + 0xc6, 0x5d, 0x13, 0x12, 0xc3, 0xd2, 0x74, 0xe0, 0x3f, 0xa0, 0x48, 0x7f, + 0xc9, 0x54, 0x30, 0xc6, 0xb2, 0xea, 0x2f, 0xd3, 0x05, 0x49, 0x92, 0xd5, + 0x31, 0x14, 0x2e, 0x67, 0x04, 0x9a, 0xc6, 0x8c, 0x84, 0xbb, 0xd0, 0x40, + 0x8a, 0x60, 0xc9, 0x8f, 0xc8, 0xdb, 0x8e, 0xac, 0xe6, 0xe6, 0xb2, 0x64, + 0x4d, 0xca, 0xdc, 0x4e, 0xd1, 0xa7, 0x1e, 0x71, 0x66, 0x98, 0xd0, 0x3b, + 0x80, 0x2e, 0x03, 0x65, 0x63, 0x45, 0x93, 0xa6, 0x2e, 0xa8, 0xde, 0x46, + 0x69, 0xd7, 0xb2, 0xbe, 0x0f, 0xf7, 0xab, 0xac, 0x2a, 0xb2, 0x8a, 0x72, + 0x43, 0x45, 0x13, 0xef, 0xa3, 0x24, 0xdc, 0xd1, 0x17, 0x2b, 0x65, 0x2c, + 0x4f, 0xb4, 0x47, 0x64, 0x70, 0x1f, 0x3d, 0x16, 0xc5, 0x1a, 0x5c, 0x81, + 0xc2, 0x98, 0x75, 0x78, 0xac, 0xd7, 0xeb, 0x0e, 0x8a, 0x8b, 0x68, 0x9a, + 0x39, 0x0b, 0x86, 0xce, 0xa3, 0x8c, 0xe6, 0xd0, 0xb3, 0x59, 0x7f, 0x09, + 0x51, 0x71, 0x88, 0xef, 0xd5, 0x5d, 0x18, 0x36, 0x0a, 0x57, 0xc8, 0xe8, + 0xa6, 0x65, 0x55, 0x9f, 0x59, 0xdc, 0xc7, 0x84, 0x23, 0x52, 0xd3, 0x05, + 0x51, 0xb6, 0x9e, 0xa0, 0xd1, 0xd5, 0x94, 0x3f, 0xfa, 0x0d, 0x1d, 0x33, + 0x64, 0x4c, 0x05, 0x85, 0xdb, 0xc4, 0x43, 0xf7, 0x0a, 0x19, 0x92, 0xa0, + 0x0a, 0x59, 0xae, 0x62, 0xc8, 0x02, 0x48, 0xdf, 0x8b, 0x1a, 0x1f, 0xb9, + 0xa9, 0xf6, 0x9c, 0x9b, 0x41, 0x29, 0xd4, 0x28, 0x48, 0xb4, 0x42, 0x86, + 0x0e, 0x83, 0x67, 0x78, 0x2f, 0x5b, 0x4b, 0x61, 0x3c, 0x75, 0x49, 0x75, + 0x12, 0x67, 0x6c, 0xc5, 0xe2, 0x28, 0x99, 0x01, 0xc7, 0x93, 0xb5, 0x8d, + 0xca, 0x25, 0x83, 0xcd, 0x27, 0x27, 0x21, 0x51, 0x33, 0x04, 0xaa, 0x76, + 0xb0, 0x33, 0x64, 0x28, 0x72, 0x12, 0x46, 0x69, 0xe7, 0x65, 0xc0, 0xbd, + 0x0f, 0x91, 0x02, 0xdf, 0xc4, 0x43, 0x84, 0x0d, 0x84, 0xfc, 0x29, 0x81, + 0x77, 0x4a, 0x4a, 0xf1, 0x77, 0x42, 0x29, 0x34, 0xae, 0x92, 0xea, 0x8f, + 0xb0, 0x93, 0x8d, 0x2a, 0x2c, 0x97, 0x87, 0x68, 0xa4, 0x19, 0x88, 0xfb, + 0xf8, 0x06, 0x3d, 0x12, 0x1e, 0xcb, 0xc0, 0x93, 0x30, 0x54, 0x90, 0x64, + 0x8b, 0x1f, 0x45, 0x52, 0x42, 0x23, 0x61, 0xa6, 0x58, 0x51, 0x06, 0x9c, + 0xdf, 0x49, 0xda, 0x90, 0x38, 0x41, 0xe2, 0x3d, 0x92, 0xca, 0xaa, 0x66, + 0xa5, 0x9c, 0x56, 0xd3, 0xf1, 0x3a, 0x22, 0x4e, 0x67, 0x35, 0xf1, 0xf5, + 0x94, 0xe4, 0xf5, 0x41, 0x33, 0x43, 0x49, 0xf1, 0x92, 0x60, 0x09, 0x65, + 0x79, 0x2a, 0x8c, 0x51, 0x41, 0x57, 0xc7, 0xfb, 0x43, 0xc1, 0x44, 0x3b, + 0xdb, 0x59, 0xf9, 0xaa, 0xda, 0xb9, 0x98, 0x17, 0x5b, 0xcd, 0xb1, 0x56, + 0x81, 0xcf, 0x0f, 0xbd, 0xcb, 0x49, 0xfd, 0x72, 0x0c, 0x4f, 0x55, 0xfc, + 0xb3, 0x36, 0xae, 0x55, 0x6e, 0xf0, 0x43, 0xa3, 0x83, 0xe6, 0x97, 0xf8, + 0xa1, 0x39, 0xb8, 0x68, 0x5c, 0x1f, 0x5f, 0xf4, 0x87, 0xa5, 0xdb, 0xa2, + 0x54, 0x6a, 0x3c, 0xdd, 0x76, 0xab, 0xd5, 0xdb, 0xe6, 0x9e, 0x7c, 0xdb, + 0xab, 0x9e, 0x0e, 0xaf, 0x1b, 0xea, 0xed, 0xd5, 0xa9, 0x72, 0x73, 0x7d, + 0xf1, 0x41, 0x14, 0x15, 0xe5, 0x1c, 0x23, 0xe8, 0x8b, 0xd3, 0x8b, 0x7a, + 0xe3, 0x12, 0xfd, 0x60, 0x98, 0x4a, 0x7b, 0x73, 0x56, 0x2c, 0x56, 0xba, + 0xe3, 0x26, 0xb8, 0xf7, 0x27, 0x41, 0x69, 0x34, 0x3a, 0xad, 0x4c, 0x4d, + 0x39, 0x39, 0x69, 0x75, 0x5b, 0x4f, 0x0f, 0x97, 0x57, 0xdd, 0xc7, 0x7e, + 0xbd, 0xbe, 0x75, 0x34, 0xad, 0x4c, 0xce, 0xe6, 0x95, 0xc9, 0xe5, 0x6e, + 0xf7, 0x56, 0x3b, 0xde, 0xae, 0x94, 0xba, 0xa5, 0x71, 0xbb, 0xd7, 0x10, + 0x44, 0xb4, 0xdd, 0xae, 0x59, 0xa7, 0xbb, 0xbd, 0xf3, 0x6a, 0x63, 0x5e, + 0xb9, 0xbf, 0x98, 0xc9, 0xc7, 0x2d, 0xbd, 0xb2, 0x63, 0x5e, 0xfc, 0x50, + 0x38, 0x9b, 0x7d, 0xf3, 0xdc, 0xfc, 0x20, 0x6f, 0x6e, 0xdf, 0x8b, 0x96, + 0x70, 0xf9, 0x70, 0xd1, 0x9c, 0x34, 0x07, 0xea, 0x6c, 0xaf, 0x53, 0x38, + 0xb7, 0xbe, 0x69, 0x3f, 0x9b, 0x6d, 0xf9, 0x5e, 0x79, 0x6c, 0x64, 0xf6, + 0xac, 0xd2, 0xfd, 0x75, 0xff, 0xe8, 0xf1, 0xe9, 0xc4, 0xa8, 0x98, 0x95, + 0xa2, 0xd0, 0xba, 0xb8, 0x90, 0x37, 0xfb, 0xc5, 0x5a, 0x61, 0x72, 0xba, + 0x7d, 0x76, 0x39, 0xb4, 0x3e, 0x14, 0x76, 0x8d, 0x1f, 0xf4, 0xeb, 0x2b, + 0x45, 0xdf, 0xbd, 0xe8, 0x19, 0x7b, 0xa7, 0xdb, 0xc5, 0xe1, 0xf6, 0xee, + 0x68, 0xd1, 0x10, 0xfa, 0xdd, 0xbd, 0xcc, 0xc8, 0xda, 0xad, 0xdf, 0xee, + 0xb4, 0x4f, 0x6f, 0x86, 0xc5, 0xce, 0x7d, 0x46, 0x52, 0x6f, 0x9a, 0xfa, + 0xf4, 0x7c, 0x3c, 0x98, 0xb7, 0x4e, 0x2a, 0x8f, 0x67, 0x8b, 0xdd, 0xc7, + 0x9b, 0x81, 0xf8, 0xa1, 0x29, 0xb5, 0x2b, 0xdd, 0xd3, 0x71, 0xb7, 0x7e, + 0xaf, 0xdf, 0x5d, 0xf4, 0x27, 0x5b, 0x3b, 0xfd, 0x5e, 0xe9, 0x32, 0x73, + 0x74, 0x7d, 0x5d, 0x38, 0xda, 0xfc, 0xe6, 0x7a, 0x76, 0x33, 0x9e, 0xee, + 0xea, 0xf3, 0xd3, 0xa7, 0x9b, 0x4d, 0x55, 0xbf, 0x35, 0x6f, 0x5b, 0x9d, + 0xc5, 0xc9, 0xb4, 0x73, 0xb5, 0x79, 0x52, 0x98, 0x6c, 0x67, 0x3a, 0x3b, + 0x8f, 0xf5, 0xf1, 0x87, 0x66, 0xed, 0xb6, 0xaa, 0x8f, 0xa7, 0x95, 0x9d, + 0xc9, 0x60, 0x77, 0x7e, 0xdc, 0xba, 0x3c, 0x3e, 0xba, 0xa8, 0x0e, 0xba, + 0x37, 0xb2, 0xd8, 0xdd, 0x36, 0x14, 0x71, 0xab, 0x3f, 0x2a, 0x5e, 0xb5, + 0xcd, 0xdd, 0xa3, 0xe3, 0x6a, 0x6f, 0x77, 0x67, 0xbb, 0x51, 0xba, 0x69, + 0x98, 0xfa, 0xdd, 0xf8, 0xf2, 0xe6, 0xae, 0x35, 0x28, 0x54, 0x9e, 0xb7, + 0xc6, 0xa6, 0xd4, 0x95, 0x4a, 0x08, 0x55, 0x8f, 0xe7, 0x53, 0xa9, 0x79, + 0x3d, 0x38, 0x16, 0xc7, 0xd5, 0x66, 0xef, 0xfe, 0x76, 0xd0, 0x19, 0x68, + 0x13, 0xb1, 0x3e, 0x40, 0xc3, 0x0b, 0xad, 0x2b, 0x56, 0xc6, 0x77, 0x0f, + 0x10, 0x88, 0xfd, 0x70, 0x93, 0xa9, 0x5c, 0x3d, 0xcd, 0xb6, 0x6e, 0xb7, + 0xcc, 0x4a, 0xeb, 0x61, 0xd4, 0xd2, 0x9a, 0x6d, 0x13, 0xcd, 0xab, 0xa8, + 0x7e, 0xd2, 0x39, 0x1f, 0x77, 0x17, 0x8b, 0xf3, 0xd3, 0x93, 0x3b, 0xb1, + 0x79, 0xbc, 0xf3, 0x60, 0x9d, 0x15, 0x8a, 0x15, 0xa9, 0x72, 0xf4, 0xdc, + 0x6a, 0xaa, 0xb3, 0xd9, 0x51, 0xa6, 0x64, 0x9d, 0xb5, 0xbe, 0xe9, 0xee, + 0x1e, 0x4d, 0x8e, 0x8f, 0x87, 0x9d, 0xea, 0x75, 0xa6, 0x55, 0x7f, 0x16, + 0x8f, 0xcf, 0x66, 0x37, 0xe2, 0x6e, 0xa9, 0x7d, 0x5f, 0xbf, 0x44, 0xf7, + 0x67, 0xf2, 0x7c, 0xf6, 0x78, 0x75, 0x9c, 0x19, 0xcf, 0xba, 0xd5, 0xee, + 0x73, 0xa7, 0xb9, 0x3d, 0x90, 0x2a, 0xc3, 0xdd, 0x7a, 0x47, 0xbc, 0x10, + 0x1f, 0xba, 0x8f, 0x47, 0xf7, 0x37, 0x25, 0xb9, 0x76, 0x36, 0x5b, 0xd4, + 0x6b, 0xa7, 0xdb, 0x5b, 0xa7, 0xda, 0xb0, 0x3d, 0xd0, 0x66, 0xd6, 0x43, + 0x73, 0x7c, 0x24, 0x94, 0xfa, 0xdf, 0x5c, 0x3e, 0x9c, 0xb5, 0xe6, 0xd6, + 0x5e, 0xeb, 0xe2, 0x69, 0xb6, 0x68, 0x5d, 0x55, 0x9f, 0x1e, 0xae, 0x06, + 0x83, 0x87, 0x13, 0xad, 0x56, 0xbb, 0xac, 0x55, 0x1e, 0x26, 0x97, 0x1d, + 0x59, 0xeb, 0x5f, 0xd7, 0xbe, 0x69, 0x6e, 0xf7, 0xbb, 0xf5, 0xce, 0x51, + 0xb1, 0x72, 0xfe, 0x54, 0x2a, 0x7c, 0xd3, 0x2c, 0x0d, 0xf4, 0xd9, 0xe6, + 0xe9, 0x76, 0x46, 0x59, 0xa0, 0xee, 0x76, 0x7f, 0x50, 0x1d, 0x9e, 0xf4, + 0x8f, 0x74, 0xed, 0x0a, 0x29, 0x60, 0x19, 0xd5, 0xab, 0xc6, 0x70, 0x3e, + 0xfb, 0xa0, 0xb5, 0xdb, 0xa7, 0x97, 0xd5, 0x89, 0x36, 0x78, 0xfa, 0x60, + 0x4d, 0xa5, 0x0b, 0xb1, 0x3d, 0x7f, 0x9a, 0x9e, 0x97, 0x3a, 0x67, 0x5d, + 0xe1, 0xec, 0x6e, 0xb1, 0x57, 0x78, 0x54, 0xab, 0xda, 0xce, 0xd5, 0x56, + 0x6b, 0x47, 0x7e, 0xae, 0xf4, 0xa7, 0x3d, 0xb5, 0x2d, 0x14, 0x8f, 0x1e, + 0xbe, 0x19, 0x21, 0xe3, 0x44, 0x9b, 0x9c, 0x4e, 0x8c, 0x4d, 0xbd, 0xb8, + 0xf9, 0x6c, 0x28, 0xcf, 0xdb, 0x7b, 0xc6, 0x6d, 0x63, 0xbb, 0x03, 0x5d, + 0x70, 0x7a, 0x3f, 0x28, 0x6d, 0x3d, 0x5e, 0x75, 0x9f, 0x6f, 0xf4, 0xcc, + 0x7c, 0x78, 0xd3, 0xbc, 0x2a, 0xb4, 0xf4, 0x41, 0xeb, 0xee, 0x11, 0x06, + 0xf4, 0xae, 0x65, 0x9e, 0xb4, 0x6a, 0x46, 0xfb, 0x87, 0xca, 0x4d, 0x63, + 0x71, 0x57, 0x6a, 0xb6, 0x7a, 0x1f, 0x6e, 0xaf, 0x17, 0xe3, 0x6d, 0x34, + 0x6f, 0x99, 0xa7, 0x23, 0xa1, 0xd9, 0x3e, 0xb9, 0xf9, 0xd0, 0x1a, 0x3c, + 0x9c, 0x3f, 0xef, 0x9e, 0x55, 0xab, 0x77, 0x3b, 0x99, 0xa7, 0xa3, 0xc7, + 0xab, 0xf3, 0x6f, 0xf6, 0xe0, 0x5b, 0x2f, 0xec, 0x35, 0xf6, 0xb4, 0x93, + 0xc5, 0x56, 0x47, 0x36, 0x8f, 0xaf, 0xe7, 0xe8, 0x9b, 0x8e, 0xa0, 0x14, + 0x8f, 0x17, 0x35, 0x18, 0x44, 0x5d, 0x18, 0x91, 0xf5, 0x93, 0x2e, 0x0c, + 0xc8, 0xfa, 0x09, 0x0c, 0x4d, 0x52, 0x34, 0x81, 0xbf, 0x4e, 0x70, 0x05, + 0x2d, 0xaa, 0xc3, 0xcf, 0x09, 0x85, 0x9d, 0x1f, 0xed, 0xd6, 0x0b, 0xd5, + 0xdb, 0x71, 0xe5, 0xbc, 0xf8, 0x30, 0x69, 0xdd, 0x6d, 0x19, 0x83, 0xce, + 0x37, 0x15, 0xfc, 0xa9, 0x2b, 0x8d, 0xfe, 0x7d, 0x6f, 0xd6, 0x9d, 0xd6, + 0x6a, 0x7c, 0x1a, 0x5c, 0x73, 0xce, 0x40, 0x3a, 0x12, 0xac, 0x57, 0xba, + 0x1e, 0x3c, 0x3b, 0x25, 0x76, 0x47, 0xab, 0x02, 0xad, 0x09, 0x0d, 0x6a, + 0xb9, 0xcd, 0x1d, 0x5f, 0xcc, 0x47, 0x60, 0x63, 0xea, 0x60, 0x5a, 0xb4, + 0x64, 0x51, 0x50, 0x72, 0x82, 0x22, 0x8f, 0x61, 0xd6, 0x9a, 0xca, 0x92, + 0xa4, 0x24, 0x9d, 0x6c, 0xa2, 0x5d, 0x65, 0xce, 0x8d, 0x65, 0x36, 0x77, + 0xf5, 0x45, 0x92, 0xa0, 0x25, 0x56, 0x62, 0x12, 0xe8, 0xe1, 0x28, 0x86, + 0xe7, 0x3d, 0x4c, 0x93, 0xd0, 0x96, 0x89, 0x12, 0x9a, 0x78, 0xd9, 0xa4, + 0x8b, 0x67, 0xdf, 0xe4, 0x72, 0x46, 0xf1, 0x4f, 0x48, 0xe5, 0xb6, 0x92, + 0x4f, 0xe0, 0xf6, 0x9c, 0xc5, 0x65, 0x92, 0xcc, 0x28, 0xfe, 0x66, 0xa8, + 0x2c, 0xe1, 0x66, 0x0a, 0x5f, 0x73, 0x34, 0xda, 0xe2, 0x04, 0xe9, 0x4e, + 0x10, 0x41, 0x17, 0x1c, 0x04, 0x55, 0x53, 0xfc, 0x4d, 0xa3, 0x2b, 0xcd, + 0xe0, 0x86, 0xb3, 0xf1, 0x48, 0x5e, 0x70, 0x5f, 0x17, 0x6c, 0xa4, 0xef, + 0xc9, 0x2a, 0x91, 0xa3, 0x8b, 0x44, 0x4e, 0x50, 0x25, 0x2e, 0x65, 0xc7, + 0x6c, 0x78, 0x65, 0x20, 0x01, 0xcf, 0x22, 0xca, 0xe9, 0xf2, 0x02, 0x29, + 0x39, 0x12, 0xff, 0x94, 0x8b, 0x69, 0x86, 0xcb, 0x78, 0x0d, 0x8b, 0x48, + 0xca, 0x83, 0x11, 0xa0, 0xa0, 0xc2, 0x5c, 0x48, 0x65, 0x60, 0x25, 0x36, + 0x97, 0x39, 0xc6, 0x65, 0xce, 0xe6, 0x32, 0xc7, 0xb8, 0x94, 0xd5, 0x91, + 0xac, 0xca, 0x16, 0xe2, 0x36, 0x4d, 0x5b, 0x5e, 0x57, 0x62, 0xc6, 0xbe, + 0x4d, 0xfe, 0x1e, 0x3d, 0x8d, 0x0c, 0x61, 0x8a, 0xcc, 0xc4, 0xd4, 0x5d, + 0x22, 0x3e, 0x7e, 0x47, 0x86, 0x36, 0x85, 0x22, 0x56, 0x1d, 0x13, 0xdf, + 0x3b, 0xbc, 0xf8, 0xc0, 0x2c, 0x2d, 0x39, 0xa2, 0x4f, 0x9e, 0x90, 0x60, + 0x9f, 0xcf, 0x74, 0x45, 0x13, 0x24, 0xb2, 0xb8, 0x49, 0x18, 0xf8, 0x87, + 0x96, 0x94, 0x06, 0x1e, 0xc4, 0xab, 0x56, 0x99, 0x6c, 0xa8, 0x97, 0x76, + 0xe3, 0xbd, 0x40, 0x69, 0xdb, 0xad, 0x73, 0x05, 0xca, 0x11, 0x5a, 0x64, + 0xfd, 0x1d, 0x3d, 0x32, 0xa2, 0xd7, 0x7f, 0xb4, 0x14, 0x2f, 0xb8, 0xc2, + 0xab, 0xbb, 0xcf, 0xb1, 0xfd, 0xac, 0x29, 0x70, 0x80, 0xf1, 0xa1, 0x66, + 0x59, 0xda, 0x74, 0x99, 0xd0, 0xae, 0x4f, 0x28, 0x15, 0x29, 0xef, 0xa1, + 0x9e, 0xc2, 0x24, 0xc3, 0xcc, 0x21, 0x92, 0x78, 0xc9, 0x72, 0x9f, 0xeb, + 0x06, 0x31, 0xf2, 0xb7, 0x31, 0x6a, 0x77, 0x4e, 0x22, 0xde, 0x09, 0xa7, + 0x61, 0x96, 0x5c, 0x4e, 0x96, 0x75, 0x00, 0xd1, 0x75, 0x58, 0xca, 0x0f, + 0x61, 0x8a, 0x07, 0x05, 0xbc, 0x2e, 0x75, 0x93, 0x4a, 0xa2, 0x21, 0xeb, + 0x96, 0x93, 0x36, 0x1a, 0xcd, 0x54, 0x11, 0x8b, 0xc8, 0x89, 0x06, 0x4c, + 0x61, 0xa8, 0x21, 0x2b, 0xe8, 0x92, 0x19, 0x69, 0x8a, 0x0d, 0xb1, 0x2c, + 0x87, 0x7b, 0x30, 0xcb, 0x51, 0x55, 0xa5, 0x3d, 0x6c, 0x3d, 0x0a, 0x06, + 0xb7, 0x98, 0x2a, 0xc7, 0x96, 0xa5, 0xef, 0xfb, 0x4a, 0xd9, 0x72, 0xe6, + 0x90, 0x93, 0x34, 0x71, 0x86, 0x69, 0xe4, 0x29, 0xf9, 0x3a, 0xa5, 0x98, + 0xe2, 0x49, 0x3d, 0xef, 0xcd, 0xe7, 0x90, 0x92, 0x3c, 0x4e, 0x76, 0x01, + 0x1a, 0x3f, 0x02, 0x3e, 0xf8, 0x50, 0xed, 0x14, 0xd6, 0x14, 0xb2, 0xae, + 0x60, 0x88, 0x91, 0xa0, 0x98, 0x28, 0x04, 0xa0, 0x0a, 0x53, 0x5c, 0x49, + 0x82, 0x74, 0x0f, 0xba, 0xcb, 0xc6, 0x18, 0x59, 0x8c, 0x87, 0xea, 0xd3, + 0x89, 0x64, 0x4b, 0x98, 0xce, 0x0b, 0xba, 0x8e, 0x54, 0xa9, 0x36, 0x91, + 0x15, 0x29, 0x45, 0x48, 0xa5, 0x03, 0x02, 0xe9, 0x82, 0x35, 0x59, 0x4b, + 0x1e, 0x8c, 0x90, 0x97, 0x25, 0xcc, 0x0d, 0x1d, 0xf5, 0x39, 0x5c, 0xc2, + 0x07, 0x20, 0x1c, 0x81, 0xf1, 0x6a, 0x34, 0x58, 0xe9, 0x88, 0x13, 0x89, + 0xc9, 0xd6, 0x58, 0x57, 0x82, 0x32, 0x23, 0x40, 0x85, 0x57, 0x0b, 0x8c, + 0xc9, 0x05, 0xe5, 0x1d, 0xce, 0xc0, 0x6c, 0xd5, 0x25, 0x12, 0x53, 0x00, + 0x9f, 0xc8, 0xb4, 0x28, 0x2f, 0xab, 0x2a, 0x32, 0x8e, 0xfb, 0xed, 0x33, + 0xc0, 0xde, 0xa0, 0xc6, 0xb4, 0xf1, 0x5a, 0xd6, 0x28, 0xc9, 0x20, 0x73, + 0xd3, 0x7b, 0x49, 0x36, 0xd6, 0xe3, 0x8d, 0xa0, 0xf8, 0x59, 0x6b, 0xdf, + 0x1f, 0xc9, 0xc6, 0xab, 0x39, 0x23, 0x04, 0xc3, 0x8c, 0x61, 0xc3, 0x5d, + 0x97, 0x33, 0x8c, 0x13, 0x64, 0x0d, 0x0f, 0xc4, 0x37, 0xf0, 0x86, 0x49, + 0x86, 0x4d, 0xd8, 0x10, 0xe2, 0x59, 0xa3, 0x16, 0xe8, 0xc1, 0x21, 0xf0, + 0x3e, 0xb6, 0x78, 0x8e, 0x3b, 0x37, 0x90, 0x69, 0x72, 0x35, 0xcb, 0x50, + 0x72, 0x3d, 0x0e, 0x22, 0x1b, 0xc8, 0xaf, 0x3e, 0xa2, 0x2c, 0x2d, 0xb8, + 0x25, 0x05, 0xe0, 0xa3, 0x34, 0x56, 0xd0, 0x9b, 0xc8, 0x23, 0x8b, 0x15, + 0x1b, 0x48, 0xd2, 0xde, 0x60, 0xa0, 0x86, 0x40, 0x39, 0x0b, 0x38, 0xad, + 0x09, 0x78, 0x9e, 0x73, 0xcd, 0xb4, 0xce, 0x0d, 0x4d, 0x04, 0xc6, 0x2e, + 0xd0, 0xc3, 0x0c, 0x99, 0x56, 0x2a, 0xed, 0x9b, 0xfa, 0xe5, 0x11, 0x97, + 0x62, 0x5e, 0x2a, 0x0f, 0x22, 0x4b, 0x4f, 0x3d, 0x0b, 0xe4, 0xe6, 0x0e, + 0x0f, 0xb9, 0x6d, 0x1b, 0xd0, 0x05, 0x75, 0x20, 0x4d, 0x00, 0x9a, 0x99, + 0xdc, 0x67, 0x87, 0xd8, 0x4f, 0xa7, 0x39, 0x41, 0x41, 0x06, 0x28, 0xa9, + 0x7e, 0x71, 0xd1, 0xb9, 0xf8, 0x91, 0xcf, 0xf8, 0xa1, 0x32, 0xfc, 0xcf, + 0x65, 0xce, 0x2d, 0x04, 0x1d, 0xe9, 0x9a, 0x6a, 0xa2, 0x3e, 0x68, 0x94, + 0xb2, 0xed, 0x7e, 0x90, 0x62, 0xda, 0xd1, 0xa0, 0xfb, 0x21, 0x0e, 0x16, + 0xd0, 0x46, 0x80, 0x39, 0x39, 0x87, 0xd1, 0x98, 0x22, 0x23, 0xfc, 0x11, + 0x0f, 0xed, 0x20, 0x81, 0x97, 0x15, 0xf1, 0x46, 0xd8, 0xa7, 0x53, 0x82, + 0x7e, 0x51, 0x19, 0xab, 0xd0, 0xa9, 0x2a, 0xcc, 0x34, 0x83, 0xf6, 0x19, + 0xfe, 0x65, 0xab, 0xcf, 0xdf, 0xa4, 0x2d, 0x95, 0xa6, 0x12, 0xe5, 0x61, + 0x89, 0x91, 0x38, 0x81, 0x7d, 0x0d, 0x50, 0x61, 0x4c, 0x07, 0x50, 0x7c, + 0xd7, 0xf4, 0xb0, 0x05, 0x4c, 0x8f, 0xc0, 0x27, 0xb3, 0xf6, 0x1a, 0xec, + 0xa7, 0xbf, 0x25, 0x07, 0x8a, 0xf5, 0x7d, 0x8a, 0xfa, 0xbd, 0x2c, 0xa7, + 0xc7, 0x30, 0x04, 0x40, 0x29, 0xfe, 0xfc, 0xb2, 0x0f, 0x20, 0x7c, 0x01, + 0xcf, 0x4e, 0x7c, 0x34, 0xa0, 0x89, 0x89, 0xd9, 0xc4, 0x09, 0x48, 0x58, + 0x67, 0xc1, 0xf1, 0x08, 0xe2, 0x8a, 0x8a, 0x2c, 0xde, 0x73, 0x87, 0x8e, + 0x3a, 0x53, 0x28, 0x68, 0x57, 0x9e, 0x6e, 0xca, 0x93, 0x5d, 0x96, 0xce, + 0x28, 0xc5, 0xe7, 0xf9, 0x34, 0xd8, 0xd6, 0x21, 0x04, 0xf4, 0x69, 0xb0, + 0x7a, 0x6b, 0x66, 0xa8, 0x5e, 0xa6, 0x58, 0x9f, 0x2c, 0xeb, 0x64, 0x36, + 0xd1, 0xe6, 0xb1, 0xe3, 0xbc, 0x34, 0x94, 0x18, 0xb0, 0x97, 0xa0, 0x73, + 0x5b, 0x9b, 0x63, 0x05, 0xa9, 0x63, 0x98, 0xd4, 0x0e, 0xb8, 0x92, 0xcd, + 0x68, 0xa8, 0xdf, 0xa8, 0x9b, 0x75, 0x71, 0x02, 0xc4, 0xa0, 0xda, 0x2f, + 0xf7, 0x67, 0x44, 0x6e, 0xda, 0x68, 0x08, 0x52, 0x11, 0x4c, 0xeb, 0xc4, + 0x86, 0x2e, 0x30, 0x2d, 0x15, 0x23, 0xdb, 0xe6, 0x58, 0xcb, 0x18, 0xcd, + 0x9c, 0x0d, 0x4d, 0xcb, 0x80, 0xe0, 0x26, 0x05, 0x9b, 0x40, 0x51, 0x74, + 0xfc, 0xca, 0x7b, 0x89, 0x51, 0x76, 0xc0, 0x5b, 0xbf, 0x84, 0xe6, 0xad, + 0x64, 0xfa, 0xa3, 0x71, 0x06, 0xb6, 0x10, 0x93, 0x29, 0x90, 0x8a, 0x11, + 0x90, 0x39, 0x4a, 0xa8, 0x97, 0x7f, 0xdf, 0x00, 0x24, 0x71, 0x54, 0x96, + 0xf3, 0x08, 0xfd, 0x63, 0xf1, 0xe7, 0xac, 0xc7, 0x20, 0x96, 0x8e, 0xcc, + 0x4e, 0xef, 0x5d, 0x86, 0x26, 0x69, 0x1d, 0xa4, 0xa7, 0x32, 0xbf, 0xb2, + 0x7b, 0xe2, 0x2c, 0x1c, 0x83, 0xd2, 0x30, 0x2b, 0x20, 0x25, 0x09, 0xbe, + 0x42, 0xe0, 0xe0, 0xd1, 0x01, 0xb2, 0x90, 0xfa, 0xae, 0xfc, 0x53, 0x3e, + 0xf5, 0xe3, 0x2f, 0xf9, 0x9f, 0x33, 0xe9, 0xf4, 0x77, 0x5f, 0x14, 0xf2, + 0x68, 0x81, 0xc4, 0x94, 0x4d, 0x2b, 0xfd, 0xe3, 0xe6, 0xcf, 0x21, 0x4c, + 0x5c, 0x41, 0x50, 0xf3, 0x5f, 0xa7, 0x7f, 0xca, 0x13, 0xd4, 0x95, 0x78, + 0x20, 0x10, 0x8e, 0x0f, 0xb5, 0x11, 0xc1, 0xc6, 0xa3, 0x8b, 0x6c, 0x52, + 0x8c, 0x60, 0x1d, 0x27, 0x45, 0x0c, 0x32, 0x0c, 0x64, 0x4b, 0xfd, 0x2d, + 0xb7, 0x9b, 0x66, 0x6d, 0x92, 0x2f, 0xff, 0x30, 0xda, 0x0d, 0xcc, 0x2a, + 0x5e, 0x35, 0x84, 0xe4, 0x7e, 0x89, 0x64, 0x09, 0xab, 0x62, 0x25, 0x47, + 0x00, 0x43, 0xf4, 0xcf, 0xe3, 0xcd, 0x70, 0x3e, 0x4d, 0x70, 0xe8, 0x2f, + 0x3e, 0x62, 0x5e, 0xf4, 0x61, 0xdc, 0xe9, 0x68, 0xcc, 0x30, 0xc8, 0xaf, + 0x31, 0x1f, 0xcb, 0xb2, 0xfb, 0x98, 0xe1, 0xc0, 0x0d, 0xc1, 0xdf, 0x80, + 0xb5, 0x54, 0x04, 0xd7, 0x80, 0x69, 0x63, 0x05, 0x9e, 0xfb, 0xed, 0x37, + 0x8f, 0x59, 0xc7, 0xf8, 0xaa, 0xa0, 0x84, 0x1e, 0x32, 0x84, 0x48, 0xc6, + 0x66, 0xc4, 0xdf, 0x38, 0x15, 0x6e, 0x09, 0xae, 0xfb, 0xc3, 0xdf, 0x4f, + 0xcb, 0x38, 0xca, 0x6c, 0xa6, 0x9d, 0xe6, 0xd6, 0xc9, 0x41, 0x04, 0x82, + 0x83, 0x3e, 0x44, 0x1e, 0x76, 0xd0, 0x15, 0xb7, 0xc4, 0xb3, 0x17, 0xa4, + 0x87, 0xb1, 0x51, 0x1b, 0xcf, 0x40, 0xf8, 0x40, 0xcc, 0x49, 0x02, 0x9b, + 0x0b, 0x4d, 0x5b, 0xb6, 0x14, 0x94, 0xe4, 0x47, 0x2f, 0x9a, 0x8d, 0x02, + 0x70, 0x20, 0xb2, 0xf9, 0x03, 0x5b, 0x02, 0x79, 0x13, 0x51, 0xaf, 0x8e, + 0x23, 0x6d, 0xd2, 0xb4, 0xb9, 0x88, 0x80, 0x09, 0x4f, 0xb9, 0x47, 0xda, + 0x5c, 0xc5, 0xdf, 0xc4, 0x48, 0xa8, 0x2a, 0x56, 0x35, 0xb6, 0x21, 0x31, + 0x9c, 0x1c, 0x49, 0x56, 0x6d, 0xa4, 0xf3, 0xa6, 0x21, 0xb2, 0x6e, 0xcd, + 0xf0, 0xdf, 0xd9, 0xb5, 0x87, 0x96, 0x31, 0xf3, 0xad, 0x6a, 0x5f, 0x96, + 0xb0, 0x71, 0x4e, 0x35, 0xba, 0x06, 0x17, 0x3c, 0xed, 0x3d, 0x1e, 0x5a, + 0xc7, 0x0b, 0xfe, 0x3c, 0xcb, 0x15, 0x63, 0xed, 0xe1, 0xed, 0x43, 0xdf, + 0xf8, 0xb1, 0xfb, 0x34, 0x0c, 0x4a, 0x32, 0xca, 0x91, 0xb0, 0xfe, 0x25, + 0xca, 0x81, 0x3c, 0x1d, 0x73, 0x20, 0xe6, 0x21, 0xbf, 0x91, 0x21, 0x72, + 0x6e, 0xf0, 0x1c, 0x21, 0x76, 0xc8, 0x4f, 0x85, 0x05, 0x3b, 0x7b, 0xb0, + 0x59, 0x2c, 0x7e, 0xb9, 0xcf, 0xc1, 0x6f, 0x96, 0x76, 0xa2, 0x05, 0x76, + 0x9e, 0x56, 0x98, 0x59, 0xda, 0xbe, 0x93, 0xd2, 0xa6, 0xa9, 0x6c, 0x9e, + 0x2b, 0x7c, 0xbb, 0x91, 0x40, 0x45, 0x60, 0xfa, 0x4a, 0x43, 0x53, 0x20, + 0x4d, 0x81, 0x8f, 0x00, 0xa4, 0x70, 0x5a, 0xdd, 0xd5, 0x94, 0xc7, 0x02, + 0xf1, 0xce, 0xfc, 0x32, 0xeb, 0x9b, 0x29, 0x81, 0x99, 0x09, 0x29, 0x3e, + 0x93, 0xc1, 0xe8, 0xe9, 0x90, 0x33, 0x17, 0x08, 0x13, 0x4b, 0xc8, 0x2a, + 0x72, 0x80, 0x2c, 0xa6, 0xe3, 0x23, 0x4c, 0x49, 0x84, 0x49, 0xcb, 0x66, + 0x8d, 0xe6, 0x90, 0x97, 0x0c, 0x37, 0x22, 0x69, 0x9e, 0xe5, 0x9a, 0x23, + 0xe6, 0x28, 0x5d, 0x95, 0xde, 0xc4, 0x1b, 0xa1, 0x90, 0x0e, 0x4e, 0x45, + 0x8c, 0xb3, 0xb0, 0xa3, 0x27, 0xe0, 0xfe, 0x95, 0xe2, 0x01, 0xde, 0xd5, + 0xf8, 0xb6, 0xa6, 0x29, 0x8a, 0xa0, 0x9b, 0xe8, 0xa0, 0x40, 0x7e, 0xf2, + 0xfb, 0x11, 0x78, 0x09, 0xc2, 0x2e, 0xf8, 0x24, 0x53, 0x45, 0x38, 0x2f, + 0xe4, 0x72, 0xef, 0x10, 0x18, 0x6a, 0xd2, 0x93, 0x87, 0x8a, 0x59, 0x7d, + 0xaa, 0xd9, 0x8e, 0x26, 0xb5, 0xe1, 0x39, 0x56, 0xb2, 0x91, 0x76, 0xe6, + 0x52, 0x1c, 0x3f, 0xf8, 0xf1, 0x0d, 0x34, 0x85, 0xf3, 0x04, 0x4c, 0x5b, + 0x4a, 0x68, 0x8d, 0xe6, 0xfc, 0x76, 0x7b, 0x05, 0xaf, 0xee, 0xcc, 0xc9, + 0x3a, 0xdd, 0x12, 0xd1, 0x31, 0x94, 0x48, 0x10, 0x8c, 0x96, 0x46, 0x75, + 0xc0, 0x05, 0x5d, 0x52, 0xda, 0xfa, 0x8f, 0xc4, 0x4b, 0xd8, 0x01, 0x64, + 0x2c, 0x21, 0x61, 0xb4, 0xd2, 0x2c, 0x61, 0xb1, 0x0e, 0x05, 0x3f, 0x68, + 0x52, 0x64, 0x37, 0x60, 0x12, 0x79, 0x11, 0x0b, 0x03, 0x10, 0xde, 0x20, + 0x8d, 0xdb, 0x4a, 0x13, 0xfa, 0x5e, 0xd5, 0x06, 0xa1, 0x7f, 0x2c, 0xfd, + 0x9c, 0x0e, 0x12, 0x25, 0x11, 0x70, 0x13, 0x59, 0x04, 0x96, 0x39, 0x81, + 0x7f, 0x56, 0xff, 0xb3, 0xf9, 0x3f, 0xe9, 0xa0, 0xa9, 0x2f, 0xe0, 0x6f, + 0xe9, 0x2f, 0x1c, 0x32, 0x78, 0x56, 0xda, 0xff, 0xbf, 0xbb, 0xdf, 0xad, + 0xbb, 0x83, 0xfe, 0x98, 0xa4, 0x7f, 0xdf, 0xe6, 0x90, 0x29, 0x09, 0x3f, + 0x10, 0x29, 0x8b, 0xb4, 0x20, 0x92, 0x73, 0x75, 0x2c, 0x28, 0x8c, 0x94, + 0xcc, 0x80, 0xec, 0xac, 0x77, 0x5d, 0x59, 0x62, 0x03, 0xde, 0xdc, 0xb6, + 0x2b, 0x84, 0xdb, 0x0d, 0x94, 0x40, 0xb4, 0x37, 0x81, 0x48, 0xf7, 0x9c, + 0x66, 0xd5, 0x29, 0x14, 0x0d, 0x74, 0xa3, 0x3a, 0x93, 0x41, 0x86, 0xa3, + 0xf2, 0x03, 0x6e, 0x33, 0xed, 0xc3, 0xb6, 0x83, 0x2e, 0x86, 0x11, 0x24, + 0x46, 0x46, 0x62, 0x14, 0x82, 0x1b, 0x76, 0xc7, 0x36, 0x96, 0x0e, 0x12, + 0x75, 0xfb, 0xfb, 0x6f, 0xb3, 0xbd, 0x97, 0x70, 0xc6, 0x06, 0x29, 0x38, + 0x75, 0xfc, 0x26, 0x6b, 0x63, 0x34, 0xfc, 0x50, 0xac, 0x30, 0xca, 0xde, + 0x8e, 0x20, 0xd8, 0xb6, 0x9c, 0x49, 0x3e, 0x84, 0x95, 0x2c, 0x9b, 0x46, + 0x47, 0x36, 0x25, 0xc5, 0x76, 0x24, 0xfe, 0x21, 0x8a, 0x5d, 0x12, 0x82, + 0x12, 0xe1, 0xfe, 0x43, 0x01, 0x28, 0x89, 0xf2, 0x70, 0xda, 0x1a, 0xe4, + 0x62, 0xbd, 0x10, 0xec, 0x25, 0x8a, 0x16, 0x39, 0x71, 0xc1, 0xf2, 0xc3, + 0x31, 0x82, 0x30, 0x52, 0xa2, 0x0c, 0x5b, 0x44, 0xfa, 0xf3, 0x9f, 0xe8, + 0xe2, 0x89, 0x1f, 0xa1, 0xda, 0x3a, 0xc1, 0x47, 0x01, 0x5f, 0xa3, 0x2e, + 0xb6, 0xc0, 0x7b, 0x0f, 0x8d, 0x79, 0xd6, 0x8b, 0xff, 0x48, 0x75, 0x05, + 0xad, 0x17, 0x2f, 0x88, 0xdf, 0x3c, 0x27, 0xda, 0x44, 0xfc, 0x60, 0x76, + 0x69, 0xa4, 0x9f, 0x62, 0x75, 0xb6, 0xca, 0x43, 0x88, 0x89, 0xe7, 0x46, + 0x6f, 0x9e, 0xe0, 0x9f, 0xe5, 0xac, 0xfe, 0x9f, 0x05, 0xfe, 0x24, 0xc5, + 0xc6, 0xcd, 0x02, 0xe6, 0x44, 0x9b, 0xd7, 0xdc, 0xb6, 0x52, 0x88, 0xce, + 0x03, 0x59, 0x58, 0xc8, 0x93, 0x4d, 0xd8, 0x8f, 0xe1, 0x3d, 0x95, 0x47, + 0x0a, 0xbf, 0x4e, 0x52, 0x8c, 0xa0, 0xe2, 0xe3, 0x5c, 0xb0, 0xa2, 0xee, + 0x6b, 0xb0, 0x6d, 0x10, 0x90, 0xc2, 0xad, 0xf9, 0x2e, 0xb6, 0xa6, 0xec, + 0xd6, 0xd8, 0x0f, 0xac, 0x3d, 0x17, 0x28, 0xa6, 0xc9, 0x33, 0x38, 0xb0, + 0x12, 0x6e, 0xd3, 0xad, 0xfa, 0x2e, 0xb6, 0x6a, 0x75, 0xab, 0x18, 0x2a, + 0xd4, 0xac, 0x42, 0x1b, 0x44, 0x79, 0x30, 0x18, 0x00, 0x1d, 0x40, 0x4e, + 0x37, 0x1e, 0x1a, 0x1f, 0xc5, 0xf1, 0x00, 0xdf, 0x50, 0xe0, 0xb0, 0x40, + 0xae, 0xea, 0xfd, 0xc9, 0x45, 0x9f, 0xad, 0xc4, 0x20, 0x84, 0x12, 0x65, + 0x1b, 0x24, 0x5f, 0xb5, 0x02, 0x9c, 0x89, 0x81, 0xbf, 0x80, 0xa9, 0x0d, + 0x7d, 0xb1, 0x02, 0x9e, 0x0a, 0x02, 0x7f, 0xbb, 0xd0, 0x3e, 0xd3, 0x67, + 0x36, 0xe5, 0x0f, 0x3d, 0x5c, 0x2a, 0xee, 0x7a, 0x28, 0x10, 0xf1, 0xba, + 0xd9, 0xb2, 0x04, 0x18, 0xbe, 0xae, 0xf4, 0xb9, 0x04, 0x17, 0x2f, 0x6c, + 0x9b, 0x24, 0xe1, 0xc7, 0x1d, 0x7a, 0x65, 0xd2, 0x46, 0x23, 0x13, 0x59, + 0xd7, 0xb8, 0x22, 0x04, 0x4e, 0xf3, 0x81, 0x51, 0xf0, 0xc7, 0xa4, 0x26, + 0x4e, 0x4f, 0x9a, 0x3a, 0xd5, 0xe0, 0x66, 0x09, 0x1c, 0x76, 0x8e, 0xf6, + 0x22, 0xae, 0xae, 0x5c, 0xdb, 0x39, 0x20, 0x1d, 0x80, 0x33, 0xfc, 0x6e, + 0xd9, 0xb7, 0x5c, 0x8a, 0xf6, 0x0a, 0x65, 0x3c, 0xed, 0xad, 0xbd, 0x01, + 0x0c, 0xe8, 0x03, 0x5f, 0x11, 0x46, 0x20, 0xfd, 0xc2, 0x38, 0x87, 0x89, + 0xfe, 0x2f, 0x9d, 0x63, 0x83, 0xaa, 0x77, 0x3f, 0x2f, 0xeb, 0x7a, 0x2c, + 0x37, 0xf1, 0x7f, 0x86, 0x04, 0xba, 0x44, 0xcb, 0x92, 0x5d, 0x9f, 0x2c, + 0x87, 0xef, 0xd3, 0x45, 0x44, 0xb0, 0x00, 0xb6, 0xd6, 0x54, 0x02, 0xf0, + 0xf4, 0xe8, 0x53, 0x2a, 0x45, 0xc8, 0x73, 0x74, 0x8f, 0x25, 0xfd, 0x1d, + 0xcf, 0x97, 0x89, 0xbd, 0x65, 0xe0, 0x57, 0x86, 0x6c, 0x79, 0x81, 0xc9, + 0x9f, 0x69, 0x73, 0x64, 0xd4, 0xe0, 0x1e, 0x45, 0x2a, 0x64, 0x55, 0xf4, + 0x14, 0xed, 0x92, 0xb6, 0xf1, 0x64, 0xe3, 0x6f, 0x9d, 0xa2, 0xe4, 0xb1, + 0xa6, 0x6a, 0xf4, 0xe8, 0x30, 0xdb, 0xd3, 0xf2, 0xb5, 0x14, 0x66, 0xd8, + 0x67, 0xe8, 0x84, 0x46, 0x18, 0x26, 0xd1, 0x04, 0xe6, 0x8f, 0xa1, 0x99, + 0x2e, 0xd2, 0x2b, 0xc3, 0x5c, 0x06, 0x48, 0x1b, 0x5d, 0x11, 0x6a, 0x3a, + 0xc0, 0x4b, 0x43, 0x41, 0x1b, 0x2a, 0xb1, 0xc1, 0x38, 0x42, 0x32, 0x03, + 0x05, 0x15, 0xcf, 0x96, 0x8a, 0x8a, 0xf2, 0x78, 0x6b, 0x00, 0x54, 0x7c, + 0x44, 0xcf, 0xa2, 0x39, 0x6a, 0x75, 0x01, 0x4c, 0x18, 0x34, 0xb0, 0x37, + 0xad, 0x0b, 0x63, 0x72, 0x4a, 0x38, 0x08, 0x11, 0x35, 0x7d, 0x32, 0xb6, + 0xb3, 0x24, 0x31, 0x15, 0x9e, 0x90, 0x83, 0x7b, 0xec, 0x04, 0x7e, 0x2d, + 0xb3, 0xaf, 0x1a, 0x02, 0x6c, 0x26, 0xfb, 0x0c, 0xdf, 0xbe, 0x5e, 0xf4, + 0x76, 0xe3, 0xc7, 0x38, 0x24, 0xb7, 0xb6, 0xd6, 0x69, 0x41, 0x8e, 0xe2, + 0x38, 0xc7, 0x01, 0xc9, 0x2f, 0xb8, 0x15, 0xcb, 0x87, 0x61, 0xde, 0x61, + 0x64, 0xb9, 0x9b, 0xb8, 0xce, 0x65, 0xae, 0xcf, 0x30, 0x21, 0x67, 0x2b, + 0x97, 0xe7, 0xbe, 0xfa, 0xca, 0xd5, 0x09, 0x6b, 0xd7, 0xfe, 0x8d, 0xf9, + 0xb3, 0x9f, 0xf9, 0xe5, 0xe3, 0x88, 0x20, 0xae, 0x3f, 0xaa, 0x49, 0x7d, + 0xe4, 0xb0, 0xc6, 0x47, 0xc9, 0x0e, 0x1d, 0x3d, 0xfc, 0x15, 0xe3, 0x9e, + 0xb4, 0x95, 0xe4, 0xf4, 0x01, 0x51, 0x2b, 0x85, 0x16, 0xed, 0x7d, 0x92, + 0xbf, 0x21, 0x23, 0x4a, 0xda, 0x5e, 0x73, 0xd4, 0x63, 0xa9, 0x93, 0xfa, + 0xb6, 0xcf, 0x56, 0x88, 0xe8, 0x54, 0xbb, 0xd9, 0xe5, 0xbf, 0x25, 0x33, + 0x4c, 0x38, 0x88, 0x77, 0xa8, 0x2b, 0xf9, 0x26, 0x1b, 0x49, 0x6b, 0xe8, + 0xf0, 0x9f, 0xe0, 0x39, 0x6d, 0x99, 0xb3, 0x84, 0xfb, 0xa0, 0xef, 0x7c, + 0xbd, 0xeb, 0x84, 0xc3, 0xe5, 0x67, 0xb0, 0x3c, 0x4c, 0xd1, 0x5c, 0xbf, + 0xb3, 0xc0, 0xb1, 0xd0, 0xd4, 0x7c, 0x7b, 0xbe, 0x8b, 0x12, 0x4d, 0x90, + 0xf3, 0x52, 0xc0, 0x65, 0x90, 0x46, 0x6d, 0x63, 0x09, 0x9e, 0x5d, 0x4a, + 0x91, 0xfd, 0x53, 0x00, 0x2a, 0xee, 0xc3, 0xd7, 0x01, 0x20, 0xc0, 0x77, + 0x26, 0x13, 0x91, 0xd8, 0x26, 0x64, 0x6c, 0x6a, 0x3f, 0xca, 0x3f, 0xef, + 0x47, 0x43, 0xd4, 0x95, 0xf0, 0xea, 0x13, 0x97, 0x33, 0x37, 0x7d, 0x68, + 0x1f, 0x54, 0x0f, 0x8d, 0x02, 0x86, 0x0d, 0x2d, 0x44, 0x06, 0x5b, 0x84, + 0x06, 0xf6, 0x4d, 0xec, 0x11, 0x87, 0x5d, 0x49, 0xed, 0xd4, 0xa6, 0x1c, + 0x9a, 0xcf, 0x02, 0xb4, 0xc3, 0x04, 0x57, 0xec, 0x2d, 0x52, 0xc2, 0x91, + 0x36, 0xb3, 0xda, 0x42, 0x82, 0x59, 0xc3, 0x8f, 0x6b, 0x1d, 0x9c, 0xc2, + 0x28, 0xe4, 0xf0, 0xd3, 0x2b, 0x4f, 0x1a, 0x99, 0x73, 0xd9, 0x02, 0x05, + 0x00, 0x5c, 0x84, 0x3f, 0x02, 0xb7, 0x0f, 0xc7, 0xeb, 0xe1, 0x6c, 0x73, + 0x39, 0xaa, 0x8a, 0x1c, 0x46, 0x5a, 0x52, 0xa5, 0xc4, 0xd5, 0xdd, 0x99, + 0xf1, 0x35, 0x9a, 0x1a, 0x57, 0x27, 0xc6, 0x36, 0x15, 0x8b, 0xa1, 0xeb, + 0xb1, 0x55, 0x66, 0x2c, 0x0f, 0x8b, 0x30, 0xe3, 0xee, 0xb0, 0x27, 0x3e, + 0x39, 0xe1, 0xb1, 0x62, 0x1b, 0x87, 0x7a, 0x94, 0x04, 0xbe, 0x82, 0x85, + 0xa9, 0xff, 0x5c, 0x53, 0x80, 0x5b, 0xdb, 0xb1, 0x3d, 0xa7, 0xc7, 0x56, + 0x8d, 0xe5, 0x51, 0x5c, 0x95, 0x2c, 0x6a, 0x7f, 0xad, 0xae, 0xad, 0x89, + 0x6c, 0x7a, 0x4f, 0x8b, 0x7b, 0x66, 0x1a, 0x47, 0xe5, 0xfe, 0x5d, 0xb8, + 0xe0, 0x7e, 0xd6, 0x46, 0x61, 0x83, 0x6c, 0x9e, 0x85, 0x0e, 0xb4, 0x51, + 0x6a, 0x50, 0xcd, 0x5a, 0x0f, 0x1e, 0xca, 0xf2, 0x4d, 0xca, 0x76, 0xa1, + 0x77, 0x62, 0x2e, 0xd2, 0x89, 0x39, 0x3c, 0x2d, 0x3b, 0xd0, 0x59, 0x12, + 0xb0, 0x26, 0xd8, 0x21, 0xa7, 0xcc, 0x90, 0xaf, 0xd0, 0xa9, 0xb8, 0xb0, + 0x38, 0x98, 0xe2, 0xfb, 0x6e, 0x60, 0xff, 0x09, 0x41, 0x4a, 0xfc, 0xe6, + 0x75, 0xf8, 0xec, 0x5e, 0xcc, 0x19, 0x35, 0x9c, 0x4c, 0xad, 0x0d, 0x59, + 0x3f, 0x87, 0x6d, 0xc7, 0xb5, 0x04, 0x5a, 0xfb, 0xaa, 0x6b, 0x10, 0xf1, + 0x17, 0x21, 0xc2, 0x90, 0xdc, 0xbb, 0x5d, 0x8d, 0x08, 0xdb, 0xc1, 0xeb, + 0x8c, 0x38, 0xd6, 0x94, 0xdf, 0xc9, 0xa0, 0x13, 0x9b, 0x75, 0xb4, 0x50, + 0xef, 0x67, 0xe2, 0xef, 0x65, 0xe8, 0x7f, 0x9a, 0xb9, 0x27, 0x33, 0x7a, + 0xc7, 0xf4, 0x03, 0x05, 0xc9, 0x9c, 0x66, 0xdc, 0x3c, 0xe4, 0xee, 0x23, + 0x38, 0xe7, 0xab, 0xff, 0x9c, 0x2b, 0x30, 0x64, 0x3c, 0xba, 0x6d, 0xbc, + 0xd7, 0xd1, 0x7b, 0x76, 0xf7, 0x85, 0xd1, 0x5d, 0x7a, 0xd0, 0xfe, 0xa8, + 0x7e, 0x56, 0xef, 0xd7, 0xdf, 0x76, 0xd4, 0x3e, 0x42, 0x83, 0x60, 0x44, + 0xb5, 0xa1, 0x13, 0xf3, 0xff, 0xc9, 0x0e, 0xa7, 0x50, 0x10, 0xc1, 0x3e, + 0x0c, 0x92, 0xbf, 0x82, 0x31, 0xb0, 0xda, 0x1f, 0x1d, 0x52, 0x7f, 0x14, + 0xb3, 0x36, 0x39, 0xed, 0x75, 0x7e, 0xc0, 0x06, 0x0f, 0x4b, 0xfe, 0x48, + 0xd7, 0xb3, 0xd6, 0xad, 0xaa, 0xb0, 0x6e, 0x98, 0x4d, 0xfb, 0x5b, 0x5d, + 0xc3, 0xbc, 0xbc, 0x68, 0x6b, 0x98, 0x1a, 0xe9, 0x91, 0x24, 0xc8, 0xc4, + 0x2c, 0x9a, 0x75, 0x7a, 0xfd, 0x02, 0x47, 0xfa, 0xdf, 0xc1, 0xf5, 0x97, + 0x43, 0x9e, 0x1c, 0xd4, 0xa5, 0x79, 0xb5, 0x25, 0x36, 0xa2, 0xce, 0x14, + 0xb6, 0x0c, 0x70, 0x3b, 0x07, 0xf8, 0x30, 0x2c, 0xbb, 0x73, 0x42, 0xea, + 0x49, 0xec, 0x13, 0xa9, 0xc9, 0x90, 0x00, 0x66, 0x7f, 0xf5, 0xd9, 0x74, + 0xf2, 0x52, 0x3c, 0xe7, 0x1a, 0x32, 0x1d, 0x0b, 0x59, 0xf2, 0x4a, 0xbd, + 0x2c, 0x90, 0x80, 0x42, 0xf8, 0x7a, 0xd2, 0xd9, 0xb0, 0x0e, 0x1b, 0xef, + 0x19, 0x00, 0x36, 0xe0, 0xda, 0x7f, 0x83, 0x0e, 0xa1, 0x90, 0x1f, 0x70, + 0xc7, 0x28, 0xa1, 0x49, 0x2e, 0xda, 0x2a, 0x82, 0xac, 0xf2, 0xef, 0x74, + 0xeb, 0xe3, 0x5d, 0xa3, 0x56, 0xb2, 0x80, 0x09, 0xf2, 0xc9, 0x0d, 0x41, + 0x4f, 0xf7, 0xfb, 0xb1, 0x8b, 0x17, 0x07, 0x83, 0x2e, 0x65, 0x56, 0x20, + 0xdc, 0x99, 0x1e, 0xf8, 0x3b, 0xe1, 0x51, 0xa0, 0x57, 0xc5, 0x57, 0x60, + 0x89, 0x1e, 0x24, 0xf1, 0x57, 0x58, 0xad, 0xac, 0x80, 0x07, 0x88, 0x75, + 0x31, 0xe2, 0x97, 0x39, 0xe6, 0x92, 0x3a, 0x7d, 0xa2, 0xbf, 0x6e, 0x5d, + 0xa7, 0xa9, 0x6b, 0xae, 0xaa, 0xa8, 0x30, 0xb8, 0x97, 0x13, 0x7a, 0x15, + 0x7b, 0x20, 0x10, 0xcc, 0xb0, 0x27, 0x0e, 0x1b, 0x10, 0xbd, 0x55, 0xec, + 0x4f, 0xd1, 0xa6, 0x59, 0x29, 0x8c, 0x31, 0x72, 0x07, 0x2f, 0x4f, 0x6e, + 0xd5, 0xc4, 0x50, 0x20, 0x2d, 0x05, 0x29, 0xf8, 0x6c, 0x8d, 0x41, 0xc4, + 0x0e, 0x9c, 0x74, 0x12, 0x3e, 0xc9, 0xa8, 0x0c, 0x35, 0x43, 0x8a, 0x9d, + 0x5b, 0xee, 0x53, 0x18, 0xd9, 0xf1, 0x7c, 0xe2, 0xaf, 0xe5, 0x7c, 0x7a, + 0x6f, 0xcc, 0x43, 0xae, 0xdb, 0x55, 0xa1, 0x4b, 0x8b, 0x09, 0xeb, 0xd8, + 0x57, 0xda, 0x8f, 0x64, 0x8f, 0xf2, 0xb0, 0x3c, 0xee, 0x90, 0x77, 0xdd, + 0x37, 0x76, 0x87, 0xfb, 0xbe, 0x4a, 0xb6, 0x75, 0x03, 0x75, 0xf0, 0x2a, + 0x92, 0x3c, 0xfe, 0xe1, 0x5c, 0x37, 0x09, 0xc8, 0x55, 0x28, 0xe8, 0x70, + 0x37, 0xef, 0x3f, 0x70, 0x71, 0xd9, 0x3b, 0x25, 0x2e, 0x11, 0xc7, 0x71, + 0x86, 0x59, 0x0e, 0x5f, 0x1d, 0x24, 0xfe, 0xf9, 0x4f, 0x0a, 0xbb, 0xfe, + 0x92, 0x8b, 0x8f, 0x18, 0xa5, 0xaa, 0x68, 0xc3, 0xd4, 0x8f, 0xb8, 0x00, + 0x6e, 0x3e, 0x7e, 0x24, 0x12, 0x95, 0xa9, 0x3d, 0xbd, 0xa4, 0x93, 0xc5, + 0x67, 0xef, 0x75, 0x11, 0xb2, 0x50, 0x80, 0xc1, 0x19, 0x1b, 0x8c, 0xbc, + 0x9b, 0x2d, 0xad, 0xbe, 0xe4, 0x95, 0xe4, 0x82, 0xd1, 0xab, 0xee, 0x29, + 0x39, 0x97, 0x8f, 0x92, 0xc5, 0x7e, 0x94, 0x10, 0xe8, 0x8e, 0xbe, 0x05, + 0x23, 0xb5, 0xda, 0x8e, 0xe9, 0x79, 0x88, 0x10, 0x22, 0x1f, 0x5c, 0xb9, + 0xd9, 0x10, 0x24, 0x28, 0xed, 0xc1, 0xe8, 0xa6, 0x21, 0xee, 0xda, 0x83, + 0x82, 0x44, 0x43, 0x13, 0x74, 0x69, 0xb0, 0x33, 0xd0, 0xaf, 0x1a, 0x07, + 0x09, 0x46, 0x42, 0xa8, 0xfb, 0x09, 0x81, 0xe5, 0x91, 0x21, 0xe5, 0xcb, + 0x1b, 0x0e, 0x26, 0x0c, 0x08, 0x99, 0xbb, 0x0c, 0x3a, 0xdc, 0xcf, 0x0e, + 0x9d, 0xc8, 0xc4, 0xee, 0x1a, 0xdc, 0xf5, 0x3d, 0x60, 0x8a, 0xe8, 0x0e, + 0xab, 0xbb, 0xad, 0x49, 0xa0, 0x6d, 0x70, 0x9b, 0x85, 0x29, 0x3c, 0x31, + 0xf7, 0xed, 0xa5, 0xed, 0xf6, 0x4c, 0x1f, 0x26, 0x0d, 0x06, 0x8b, 0xe7, + 0x0f, 0x0c, 0x4c, 0xbe, 0x23, 0xa0, 0xbf, 0x20, 0x76, 0xd3, 0x23, 0x67, + 0x7e, 0x64, 0x32, 0x8b, 0x9d, 0xd0, 0x77, 0x4c, 0x3d, 0xb9, 0xb0, 0x71, + 0x1c, 0x5d, 0x9a, 0xa8, 0xa7, 0x8d, 0xac, 0x3e, 0xbc, 0xe1, 0x27, 0x45, + 0x34, 0xb1, 0x1a, 0x05, 0x60, 0x7b, 0x90, 0xb1, 0x4f, 0x95, 0xa2, 0x19, + 0x3f, 0x86, 0xf3, 0x21, 0x0a, 0xfc, 0x6f, 0x55, 0x44, 0xfc, 0x52, 0xde, + 0x33, 0x98, 0xc3, 0x1c, 0xca, 0x61, 0xe8, 0x1e, 0x6c, 0xe3, 0x9c, 0xc3, + 0xb2, 0xdf, 0x6a, 0x93, 0x4b, 0x71, 0x29, 0x67, 0xe7, 0x26, 0x68, 0x89, + 0xda, 0x74, 0x0a, 0xf7, 0x42, 0xcc, 0x3c, 0x2c, 0x78, 0x6a, 0xf4, 0x39, + 0x15, 0x30, 0x29, 0xec, 0x87, 0xca, 0xdc, 0x06, 0x7e, 0x25, 0x07, 0x83, + 0xd8, 0xc8, 0xfa, 0x21, 0x86, 0x10, 0x29, 0xb4, 0x10, 0xbc, 0x3e, 0xee, + 0xe3, 0x5c, 0x56, 0x01, 0x94, 0xbe, 0xa6, 0x63, 0x23, 0x8b, 0x5f, 0x9d, + 0x26, 0xc2, 0x6f, 0x86, 0x06, 0x45, 0x2f, 0x01, 0x4c, 0x1c, 0xea, 0x96, + 0xdd, 0xb5, 0x1e, 0xbb, 0x28, 0x1a, 0xca, 0x6a, 0xf8, 0x67, 0x82, 0xac, + 0xa3, 0x41, 0x7b, 0xa0, 0xc1, 0xfe, 0x34, 0x4f, 0x66, 0x85, 0x90, 0xc5, + 0x05, 0x1b, 0xc4, 0x86, 0xde, 0x51, 0xf1, 0x2b, 0x9c, 0x89, 0x46, 0x3c, + 0xd6, 0xf7, 0x26, 0xe5, 0xe0, 0xd7, 0x93, 0xac, 0xa3, 0x9c, 0xdb, 0xb0, + 0x72, 0x6e, 0x5f, 0xad, 0x9c, 0x08, 0x7b, 0xc2, 0x3f, 0x2e, 0x81, 0xa7, + 0xb6, 0xa0, 0x42, 0xd6, 0xdc, 0x80, 0x02, 0xcc, 0x21, 0xb1, 0x82, 0xbf, + 0x4b, 0x45, 0x06, 0x5a, 0x4f, 0x45, 0xf4, 0x35, 0x2f, 0x61, 0x45, 0xd1, + 0x8a, 0x3f, 0x5b, 0x5d, 0x06, 0x7a, 0x5f, 0x75, 0x31, 0x6f, 0xea, 0xc4, + 0xbc, 0xd1, 0xc7, 0x75, 0x3c, 0x29, 0xf7, 0xe8, 0x65, 0xa5, 0x1d, 0x9c, + 0xdb, 0x95, 0xfb, 0xaf, 0x0c, 0xb5, 0x93, 0xc7, 0xbb, 0xef, 0xe2, 0x7e, + 0xe3, 0xe5, 0x7f, 0x09, 0xae, 0xe2, 0x59, 0x1b, 0xee, 0x3a, 0x3e, 0xb4, + 0x8a, 0xd7, 0xd4, 0x2a, 0x1c, 0x63, 0x3b, 0xc3, 0x67, 0xa4, 0x03, 0x57, + 0xca, 0xf1, 0xff, 0x26, 0x08, 0xf5, 0xf1, 0x25, 0xfc, 0x8e, 0x22, 0x0b, + 0x57, 0x80, 0x79, 0xc1, 0x81, 0x6c, 0xd0, 0xb6, 0x48, 0x36, 0xbf, 0xf3, + 0x13, 0x03, 0xe1, 0xe4, 0xa3, 0xae, 0x00, 0xef, 0xa9, 0xc2, 0x8f, 0xdf, + 0x7d, 0xf5, 0x73, 0x06, 0x16, 0xe2, 0x87, 0xf0, 0x95, 0x3e, 0x84, 0x87, + 0xaf, 0x7e, 0xfe, 0x3a, 0x5d, 0x18, 0xcb, 0x59, 0xb7, 0x53, 0xa6, 0x59, + 0x78, 0x75, 0x60, 0x96, 0xbe, 0xa3, 0x82, 0xfb, 0x48, 0xda, 0xfb, 0x11, + 0x4a, 0x7e, 0x06, 0xda, 0xa4, 0x70, 0xdf, 0xee, 0xf5, 0x70, 0x54, 0xef, + 0xcb, 0x3e, 0x38, 0xd1, 0x4a, 0x96, 0xd0, 0x20, 0xaf, 0x87, 0x60, 0x8f, + 0x58, 0x77, 0xec, 0x91, 0x4d, 0x4c, 0xe1, 0xbb, 0xef, 0xbe, 0x7d, 0xda, + 0x14, 0x8f, 0x8b, 0x78, 0xdb, 0x2b, 0x7a, 0xe0, 0xa3, 0xde, 0xbe, 0xc6, + 0xcf, 0xd8, 0x13, 0x20, 0x60, 0xbc, 0x30, 0x9a, 0xad, 0xbc, 0x83, 0x02, + 0x5d, 0xa9, 0xfb, 0x5f, 0xf1, 0x46, 0x2f, 0x67, 0xe3, 0xee, 0x34, 0xcb, + 0x90, 0x5d, 0x93, 0xd4, 0x3b, 0x13, 0xc2, 0x19, 0x6d, 0x26, 0x8d, 0x14, + 0x48, 0x20, 0x61, 0x7f, 0x50, 0x10, 0xee, 0x84, 0x05, 0xa4, 0x87, 0x86, + 0x66, 0x01, 0x9b, 0xc4, 0x66, 0x7e, 0x33, 0xbf, 0x87, 0x9f, 0xf2, 0x90, + 0x09, 0xf0, 0xfe, 0xb3, 0x03, 0x9e, 0x5c, 0x00, 0x1c, 0x31, 0xc0, 0x49, + 0x35, 0xeb, 0x90, 0x9f, 0x59, 0xa3, 0xdc, 0x2e, 0xff, 0xad, 0xa7, 0x6d, + 0xcc, 0x88, 0xf3, 0x0f, 0x1c, 0x1c, 0xe0, 0x13, 0x8c, 0x9c, 0x46, 0xef, + 0xbd, 0xf3, 0x5e, 0x4b, 0xd8, 0xe7, 0x6d, 0x3e, 0xe1, 0x4c, 0x23, 0x27, + 0x43, 0xad, 0x2d, 0x28, 0xa6, 0x06, 0x65, 0xc1, 0x6a, 0x2c, 0x7c, 0x74, + 0x15, 0xeb, 0x9b, 0xe8, 0x4a, 0x3b, 0x5c, 0x75, 0xae, 0xa5, 0xdb, 0x17, + 0xcd, 0xc9, 0xbb, 0xb4, 0x03, 0x38, 0x32, 0xb9, 0xb8, 0x8f, 0xd1, 0xfc, + 0x57, 0xf9, 0x19, 0xee, 0x86, 0x0f, 0x77, 0x03, 0x70, 0x29, 0x02, 0x93, + 0x1a, 0xcb, 0x0a, 0x8f, 0x07, 0x05, 0xf6, 0x6f, 0x3f, 0xfc, 0x01, 0x35, + 0x65, 0x9f, 0x7f, 0x0d, 0x62, 0x00, 0x00 }; diff --git a/Arduino/McLighting/htm_index_gz.h b/Arduino/McLighting/htm_index_gz.h index be6cd62..eb5f9fd 100644 --- a/Arduino/McLighting/htm_index_gz.h +++ b/Arduino/McLighting/htm_index_gz.h @@ -1,1652 +1,1718 @@ #include -#define index_htm_gz_len 19755 +#define index_htm_gz_len 20547 static const char index_htm_gz[] PROGMEM ={ - 0x1f, 0x8b, 0x08, 0x08, 0xb6, 0xdf, 0x88, 0x5d, 0x04, 0x00, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x00, 0xe4, 0x5d, 0x5d, 0x77, - 0x1b, 0x3d, 0x11, 0xbe, 0xe7, 0x1c, 0xfe, 0xc3, 0xd6, 0x85, 0xd6, 0x06, - 0xdb, 0xf1, 0x47, 0x12, 0x52, 0xa7, 0xce, 0x4b, 0xda, 0xa6, 0xa5, 0xd0, - 0x8f, 0x97, 0xa6, 0x50, 0xa0, 0xf4, 0x84, 0xb5, 0x2d, 0xdb, 0x4b, 0xd6, - 0xbb, 0x66, 0x77, 0xdd, 0x24, 0x0d, 0xf9, 0x27, 0x9c, 0xc3, 0x0d, 0x37, - 0xfc, 0x01, 0xae, 0xb8, 0x82, 0x3f, 0xc6, 0x33, 0x23, 0x69, 0xb5, 0x9f, - 0x8e, 0x9d, 0x26, 0xe6, 0x2b, 0xef, 0x5b, 0xdb, 0x2b, 0x8d, 0x66, 0x46, - 0xa3, 0xd1, 0x68, 0x24, 0x8d, 0xb4, 0x8f, 0xef, 0x3d, 0x7b, 0xfb, 0xf4, - 0xfd, 0xaf, 0xbf, 0x3d, 0xb2, 0xa6, 0xd1, 0xcc, 0x3d, 0xf8, 0xee, 0x77, - 0x1e, 0xab, 0x6f, 0x0b, 0x7f, 0x8f, 0xa7, 0xc2, 0x1e, 0xa9, 0xdf, 0xfc, - 0x1c, 0x39, 0x91, 0x2b, 0x0e, 0x5e, 0x0f, 0x5f, 0x39, 0x93, 0x69, 0xe4, - 0x78, 0x93, 0xc7, 0x5b, 0x9c, 0x92, 0x04, 0x99, 0x89, 0xc8, 0xb6, 0x86, - 0x53, 0x3b, 0x08, 0x45, 0xd4, 0xaf, 0xfc, 0xe2, 0xfd, 0xf3, 0xc6, 0x5e, - 0x25, 0x97, 0xef, 0xd9, 0x33, 0xd1, 0xaf, 0x7c, 0x76, 0xc4, 0xd9, 0xdc, - 0x0f, 0xa2, 0x8a, 0x35, 0xf4, 0xbd, 0x48, 0x78, 0x80, 0x3f, 0x73, 0x46, - 0xd1, 0xb4, 0x3f, 0x12, 0x9f, 0x9d, 0xa1, 0x68, 0xf0, 0x43, 0xdd, 0x72, - 0x3c, 0x27, 0x72, 0x6c, 0xb7, 0x11, 0x0e, 0x6d, 0x57, 0xf4, 0xdb, 0xcd, - 0x56, 0x19, 0xbe, 0x99, 0x3f, 0x70, 0x5c, 0x14, 0x13, 0x83, 0x86, 0x3d, - 0x9f, 0x37, 0x86, 0xf6, 0xdc, 0x1e, 0xb8, 0x22, 0x81, 0xfd, 0x42, 0x84, - 0xa9, 0xb2, 0xae, 0xe3, 0x9d, 0x5a, 0x81, 0x70, 0xfb, 0x95, 0x70, 0x0a, - 0x3e, 0x86, 0x8b, 0xc8, 0x72, 0x00, 0x5c, 0xb1, 0xa6, 0x81, 0x18, 0xf7, - 0x2b, 0xd3, 0x28, 0x9a, 0x87, 0xbd, 0xad, 0xad, 0xc0, 0x3e, 0x6b, 0x4e, - 0x9c, 0x68, 0xba, 0x18, 0x2c, 0x42, 0x11, 0x28, 0x6c, 0xcd, 0xa1, 0x3f, - 0xdb, 0x7a, 0x6e, 0x0f, 0x5e, 0xd9, 0x83, 0xc6, 0xab, 0x85, 0xf0, 0x84, - 0xb7, 0x65, 0xe4, 0xb2, 0x35, 0xb3, 0xc3, 0x48, 0x04, 0x5b, 0x87, 0xc1, - 0x68, 0xe1, 0x78, 0x7e, 0x32, 0x67, 0x64, 0x47, 0xf6, 0xd6, 0xd8, 0xfe, - 0x4c, 0x84, 0x9a, 0xf8, 0xa8, 0x58, 0xd1, 0xc5, 0x1c, 0xcc, 0x3b, 0x33, - 0x7b, 0x22, 0xb6, 0xce, 0x1b, 0x92, 0x81, 0xad, 0x62, 0x36, 0x51, 0x2d, - 0x54, 0x30, 0xf2, 0x17, 0xc3, 0x69, 0xe3, 0xce, 0x39, 0xcd, 0x12, 0x6b, - 0xce, 0xbd, 0x49, 0x99, 0xf8, 0xa2, 0x0b, 0x57, 0x84, 0x53, 0x21, 0xa2, - 0x2c, 0x47, 0x63, 0xf0, 0x10, 0x36, 0x27, 0xbe, 0x3f, 0x71, 0x85, 0x3d, - 0x77, 0x42, 0x66, 0x66, 0x18, 0x86, 0xdf, 0x8c, 0xed, 0x99, 0xe3, 0x5e, - 0xf4, 0x5f, 0xdb, 0xa0, 0x8e, 0xd6, 0xfd, 0xe1, 0x4b, 0x50, 0x48, 0xb7, - 0x0e, 0x23, 0x45, 0xc2, 0x0f, 0xac, 0x4b, 0x4a, 0x1d, 0xd8, 0xc3, 0xd3, - 0x49, 0xe0, 0x2f, 0xbc, 0x51, 0x23, 0x10, 0x73, 0x61, 0x47, 0x3d, 0xcb, - 0xf3, 0xd5, 0xcf, 0x7d, 0x02, 0x98, 0xdb, 0xa3, 0x11, 0xf8, 0xee, 0x59, - 0x2d, 0x7e, 0x9c, 0xd9, 0xc1, 0xc4, 0xf1, 0xe4, 0xd3, 0x15, 0xb0, 0xd4, - 0xad, 0x9e, 0x3d, 0x06, 0x31, 0x7c, 0x0f, 0xc4, 0xd8, 0x0f, 0x04, 0xa3, - 0xc5, 0x1f, 0x29, 0xcc, 0xa9, 0x13, 0x35, 0x06, 0xfe, 0x79, 0x23, 0x74, - 0xbe, 0x30, 0x0a, 0xc7, 0x9b, 0x82, 0x2d, 0xc6, 0x8b, 0xbf, 0x82, 0x1c, - 0x89, 0x94, 0xfa, 0x8a, 0x46, 0x43, 0x35, 0x25, 0x28, 0xd1, 0xdb, 0xed, - 0x34, 0x77, 0xbe, 0xcf, 0xf9, 0x03, 0x7f, 0x74, 0x91, 0xcf, 0x6f, 0x37, - 0x77, 0xc4, 0x4c, 0xa1, 0x86, 0x0c, 0x45, 0x63, 0x2a, 0x48, 0xe6, 0x48, - 0xdf, 0xdd, 0x4f, 0xc0, 0x9e, 0xc9, 0xd4, 0xed, 0x56, 0x2b, 0x99, 0x2a, - 0xe5, 0xd6, 0xab, 0xbc, 0x43, 0x67, 0x38, 0xb3, 0x2f, 0x2a, 0xf5, 0xca, - 0x4f, 0x84, 0xfb, 0x59, 0x44, 0xce, 0xd0, 0x7e, 0x23, 0x16, 0x22, 0xf9, - 0x6c, 0xc9, 0x84, 0xf8, 0xb9, 0x7e, 0x48, 0x92, 0xae, 0x87, 0xb6, 0x17, - 0x36, 0x42, 0x54, 0x62, 0xac, 0xf0, 0x0e, 0x7d, 0xd7, 0x0f, 0x7a, 0xf7, - 0x3b, 0x9d, 0x8e, 0x64, 0x7a, 0x11, 0x45, 0xbe, 0x57, 0xb7, 0x3e, 0x4a, - 0xc5, 0x94, 0x8f, 0x95, 0x4f, 0x71, 0x42, 0x20, 0xd0, 0xb5, 0x13, 0xcf, - 0xe1, 0x62, 0x30, 0x73, 0x64, 0x42, 0xe0, 0xbb, 0x89, 0x12, 0xb2, 0xe6, - 0xc3, 0x45, 0x10, 0x02, 0xbd, 0x35, 0xf7, 0x1d, 0x0f, 0xe2, 0xdf, 0x4f, - 0xd1, 0x70, 0xbc, 0xf9, 0x22, 0xaa, 0x5b, 0xfe, 0x3c, 0xa2, 0xa6, 0x9d, - 0xd7, 0xad, 0x50, 0xb8, 0x62, 0x88, 0x94, 0x48, 0x9c, 0x47, 0x76, 0x20, - 0x6c, 0xc2, 0x21, 0x6b, 0x6e, 0x44, 0x6f, 0x6d, 0xfd, 0xc0, 0x3a, 0x9e, - 0x8b, 0xa1, 0x33, 0xbe, 0xe0, 0x1c, 0x9d, 0x61, 0x7b, 0x43, 0x61, 0xf9, - 0x63, 0xa4, 0x05, 0x33, 0x0b, 0x78, 0x66, 0x02, 0xba, 0x67, 0xfd, 0x60, - 0x2b, 0x41, 0x51, 0xa2, 0xf3, 0x3f, 0x8b, 0x60, 0xec, 0xfa, 0x67, 0x3d, - 0xeb, 0xb3, 0x13, 0x3a, 0xb0, 0x11, 0x8c, 0xf2, 0x70, 0x34, 0x42, 0xd5, - 0x42, 0xeb, 0x77, 0x3a, 0xfb, 0x77, 0x16, 0x2a, 0x6a, 0x45, 0xbe, 0xf5, - 0xbb, 0xa9, 0x33, 0x1a, 0x09, 0xef, 0x77, 0x20, 0x64, 0xbd, 0x3c, 0xb2, - 0xf6, 0xb6, 0x1e, 0x6d, 0xb5, 0x5b, 0x5b, 0xed, 0x76, 0x1a, 0x77, 0xaf, - 0xd7, 0x98, 0xf9, 0x5f, 0x1a, 0x63, 0x7f, 0xb8, 0x08, 0x1b, 0x8e, 0xe7, - 0x89, 0x20, 0x27, 0xc3, 0x3c, 0x48, 0x56, 0xaa, 0x79, 0x88, 0x9c, 0x9c, - 0xf3, 0x20, 0xaa, 0x83, 0xf8, 0xc1, 0x48, 0x04, 0x0d, 0xee, 0x36, 0x3d, - 0x2b, 0xdf, 0x25, 0x0c, 0xa3, 0xa6, 0x7c, 0x80, 0xdc, 0xcd, 0x72, 0xe9, - 0x2f, 0x22, 0xd2, 0x79, 0x62, 0xc9, 0x30, 0x9d, 0x61, 0xb0, 0xce, 0x83, - 0xd1, 0xda, 0x0a, 0x48, 0x04, 0x4c, 0x77, 0xb6, 0xe7, 0xb0, 0x0c, 0x01, - 0x74, 0x02, 0xb4, 0x24, 0x0a, 0x6e, 0xe5, 0xa7, 0x7e, 0x10, 0x88, 0x21, - 0x9a, 0x75, 0x2a, 0xd0, 0x9c, 0x36, 0x46, 0x0c, 0x27, 0xba, 0xa0, 0x46, - 0x66, 0xb9, 0x59, 0x43, 0xd7, 0x19, 0x9e, 0xd2, 0xb0, 0xc1, 0x66, 0x39, - 0xa4, 0x16, 0x77, 0xde, 0x1e, 0xa7, 0x1b, 0x5a, 0x6b, 0x29, 0xd3, 0x63, - 0x4d, 0x6d, 0x44, 0x20, 0x14, 0x92, 0xde, 0x91, 0x51, 0xf2, 0xa4, 0x3e, - 0x3d, 0x77, 0x02, 0xd8, 0x99, 0x73, 0x6b, 0xbb, 0xf5, 0xc3, 0xba, 0xf5, - 0x92, 0x74, 0xdf, 0x83, 0x3a, 0x1d, 0x9d, 0xcf, 0xd1, 0xdb, 0x20, 0x8d, - 0x76, 0xbb, 0x01, 0xb4, 0xf9, 0xde, 0x90, 0xef, 0x03, 0x39, 0xfb, 0x27, - 0x3b, 0xac, 0xc5, 0x44, 0xe7, 0x80, 0xf0, 0xa2, 0xfd, 0xac, 0x02, 0x48, - 0x3e, 0x38, 0x99, 0xa1, 0x33, 0x86, 0xab, 0x37, 0x72, 0x42, 0xaa, 0xe5, - 0xa8, 0xfe, 0xdd, 0xef, 0x7c, 0xd4, 0xbf, 0x3f, 0xc9, 0x06, 0x9a, 0xdb, - 0x43, 0x88, 0x04, 0x4d, 0xd2, 0xdc, 0x96, 0xc0, 0xcd, 0x41, 0xe4, 0x9d, - 0x9c, 0xc8, 0xd1, 0x44, 0x55, 0xda, 0x76, 0x9d, 0x89, 0xd7, 0x70, 0x22, - 0x31, 0x0b, 0x7b, 0xd6, 0x50, 0x50, 0xe5, 0x92, 0x2c, 0x04, 0xf6, 0xc8, - 0x59, 0x84, 0x31, 0x4d, 0xc3, 0x46, 0x3a, 0x09, 0x84, 0xe7, 0xae, 0x0d, - 0x52, 0x63, 0x57, 0x9c, 0x53, 0x0a, 0xff, 0xe8, 0x59, 0x6d, 0xab, 0x65, - 0xd9, 0x8b, 0xc8, 0xe7, 0xa4, 0xdf, 0x2f, 0xc2, 0x08, 0x3d, 0xbd, 0xa1, - 0xe8, 0x1b, 0x72, 0xc6, 0xc6, 0x27, 0xc1, 0xe7, 0x7e, 0x08, 0x77, 0x01, - 0x4a, 0x4e, 0x23, 0x93, 0x1d, 0x39, 0x9f, 0x59, 0x08, 0x2c, 0x2b, 0x99, - 0x41, 0x15, 0xeb, 0x86, 0x30, 0x4b, 0x03, 0x67, 0xd8, 0x18, 0x88, 0x2f, - 0x8e, 0x08, 0xaa, 0xad, 0x66, 0x67, 0xa7, 0x8e, 0xf4, 0x3d, 0xfa, 0xc0, - 0xaf, 0x76, 0x8d, 0x0b, 0x9d, 0x4d, 0x51, 0xc3, 0x46, 0x08, 0x81, 0xb0, - 0x3c, 0xcf, 0x02, 0x7b, 0xce, 0xe9, 0xec, 0x98, 0xc4, 0x55, 0x31, 0x42, - 0x5a, 0x4b, 0x36, 0xbb, 0xf3, 0xf3, 0xa4, 0x10, 0x08, 0x1d, 0x0f, 0x06, - 0x52, 0x16, 0x86, 0x4a, 0xa7, 0xdd, 0x52, 0x90, 0x6a, 0x98, 0xb0, 0xba, - 0x54, 0xd4, 0x48, 0xab, 0x65, 0xaa, 0x9f, 0x1c, 0x65, 0xac, 0xf6, 0x36, - 0x83, 0xa5, 0x47, 0x13, 0x6b, 0xa7, 0xd5, 0x5a, 0x59, 0xac, 0xa0, 0x63, - 0xed, 0x29, 0x24, 0xc6, 0x94, 0x58, 0x6d, 0x4d, 0x7f, 0xe6, 0x78, 0x0d, - 0xc5, 0xe5, 0x1e, 0xc1, 0x65, 0xfa, 0x77, 0xdc, 0x3b, 0x46, 0x62, 0xe8, - 0x07, 0x36, 0x09, 0x9f, 0xd5, 0xf2, 0x66, 0x2d, 0x52, 0x97, 0x1a, 0x64, - 0xb5, 0x67, 0xe1, 0xb2, 0x86, 0x86, 0xed, 0xa6, 0xb1, 0xce, 0x6d, 0x50, - 0x33, 0x20, 0x73, 0x06, 0xd3, 0x0d, 0x03, 0x9f, 0xb4, 0x0c, 0xe4, 0x1b, - 0x35, 0x64, 0x27, 0x33, 0xfc, 0xd0, 0x1f, 0x59, 0xac, 0xe2, 0x5c, 0x95, - 0x1d, 0x16, 0xe7, 0xc6, 0x7f, 0xb9, 0x5c, 0xa3, 0x1b, 0x8d, 0xc6, 0xc0, - 0xf5, 0x87, 0xa7, 0x52, 0x45, 0x4c, 0xab, 0x27, 0xbd, 0x8f, 0xfd, 0x74, - 0x16, 0xd3, 0xa3, 0x26, 0xd6, 0x59, 0xd9, 0x0e, 0x93, 0x77, 0x5f, 0x54, - 0xf7, 0x91, 0x39, 0x71, 0x79, 0x93, 0x92, 0x7c, 0x8a, 0x9b, 0xd9, 0x28, - 0x4f, 0xac, 0x73, 0x7b, 0xad, 0xef, 0xa7, 0x7c, 0x03, 0xeb, 0xfe, 0xf3, - 0xe7, 0xcf, 0x55, 0x4a, 0xde, 0x0e, 0xdd, 0x73, 0x66, 0xe4, 0xc6, 0xdb, - 0xca, 0x0c, 0xc5, 0x9a, 0xae, 0xcb, 0x6e, 0x0f, 0xed, 0xf1, 0x4e, 0xcb, - 0x40, 0x19, 0xa1, 0x34, 0x17, 0x30, 0xd2, 0xc1, 0xd0, 0x0e, 0xd9, 0x19, - 0x33, 0x2a, 0xbf, 0x2b, 0x55, 0x3e, 0x6f, 0x5c, 0x35, 0x7c, 0x5a, 0xb0, - 0x3e, 0xcc, 0xe7, 0x4c, 0x4b, 0x56, 0x3e, 0x99, 0x5e, 0x82, 0xbf, 0x80, - 0x55, 0xdf, 0xe8, 0x6d, 0x52, 0x79, 0xec, 0x41, 0xe8, 0xbb, 0x8b, 0x48, - 0xa4, 0x64, 0xa2, 0xb5, 0x37, 0xa1, 0xe2, 0x26, 0x69, 0xaa, 0x7b, 0x92, - 0x41, 0x27, 0x21, 0x4c, 0x4a, 0xce, 0x19, 0xcd, 0xf5, 0xfe, 0x9d, 0x58, - 0xc2, 0x5f, 0x30, 0x3a, 0x8e, 0xa8, 0x59, 0xb6, 0x33, 0x22, 0x1f, 0x8f, - 0xc7, 0xa5, 0x22, 0xbf, 0x2f, 0x1e, 0xb5, 0xc5, 0x6e, 0x77, 0xb9, 0xe4, - 0xf3, 0x50, 0x31, 0xbb, 0xae, 0xdb, 0xc0, 0x1c, 0xcd, 0x9b, 0x88, 0x9e, - 0x74, 0x6e, 0xa7, 0xf6, 0xc8, 0x3f, 0x53, 0xb9, 0x26, 0x81, 0x3a, 0x7b, - 0x17, 0x36, 0x60, 0x07, 0xff, 0x1a, 0x6d, 0x7c, 0x04, 0x93, 0x81, 0x5d, - 0x6d, 0xd5, 0xe9, 0xbf, 0x66, 0xa7, 0x86, 0xae, 0xc9, 0x26, 0x82, 0x0c, - 0x14, 0x7e, 0x26, 0x33, 0xdb, 0xdb, 0x9c, 0xdb, 0xa6, 0xdc, 0xbd, 0x7c, - 0x6e, 0xa7, 0x26, 0xdb, 0x8f, 0x26, 0x40, 0xe5, 0x56, 0x73, 0x99, 0x79, - 0x34, 0x7a, 0x2f, 0xbd, 0x62, 0x4c, 0x02, 0x16, 0x81, 0x40, 0xdf, 0x8b, - 0x68, 0xee, 0x02, 0x14, 0x0f, 0x81, 0xcf, 0x7e, 0x98, 0xea, 0x9d, 0xd7, - 0x43, 0x26, 0xac, 0x67, 0x07, 0xd6, 0xf3, 0x5a, 0x43, 0x99, 0xf4, 0xde, - 0xad, 0xf6, 0x8d, 0xcc, 0x5a, 0x91, 0xd1, 0x62, 0xb5, 0x57, 0x6a, 0x9d, - 0x10, 0x14, 0x7f, 0x34, 0x1a, 0x34, 0xed, 0x5a, 0xe2, 0x5a, 0x37, 0x67, - 0x6a, 0x4a, 0xc5, 0x93, 0xb6, 0xb0, 0x39, 0x1b, 0xa1, 0x04, 0x18, 0xa4, - 0x22, 0x5a, 0xb9, 0x64, 0x6b, 0x74, 0x76, 0xc0, 0x81, 0xfa, 0x60, 0x5e, - 0x4a, 0x11, 0x8c, 0xec, 0xe0, 0x34, 0x5f, 0xbe, 0x55, 0xb7, 0xe8, 0x7f, - 0xae, 0x8f, 0x2a, 0x0b, 0xb7, 0xe7, 0x3d, 0x1c, 0xab, 0xd7, 0xfe, 0xc8, - 0x76, 0xad, 0xaa, 0xd1, 0xdb, 0x1a, 0xbb, 0x3a, 0xf7, 0x67, 0x9c, 0x7e, - 0x99, 0x36, 0xdf, 0x63, 0xe7, 0x5c, 0x8c, 0x50, 0x3c, 0xd1, 0x15, 0xda, - 0xc9, 0x21, 0x07, 0x53, 0xd0, 0x39, 0x92, 0x76, 0xa0, 0x65, 0xec, 0x57, - 0xbd, 0xf2, 0x87, 0x3c, 0x96, 0xc0, 0xd5, 0x27, 0x2f, 0x8e, 0xf4, 0x15, - 0xd8, 0xb9, 0x39, 0xc4, 0x38, 0xd2, 0x3d, 0x8e, 0x0b, 0xb5, 0x92, 0x03, - 0x69, 0xbb, 0xa5, 0xfa, 0x9c, 0x6c, 0xb0, 0x38, 0xc1, 0xcc, 0x07, 0x62, - 0x53, 0x98, 0xea, 0x72, 0xa6, 0xca, 0x52, 0x7f, 0x6b, 0xd2, 0xbb, 0xb3, - 0x5d, 0x97, 0x80, 0xa4, 0x44, 0x24, 0x03, 0xf9, 0x52, 0x49, 0xb5, 0x87, - 0x3f, 0x25, 0x8b, 0x3e, 0x71, 0xa9, 0xdc, 0xd9, 0x96, 0x76, 0xb5, 0xb4, - 0x1b, 0xd8, 0x64, 0xf1, 0x68, 0x45, 0x33, 0xde, 0xa5, 0xd2, 0x0a, 0xa3, - 0x78, 0x85, 0x16, 0x61, 0x2c, 0xe8, 0x3f, 0xe4, 0xe6, 0x0d, 0xbb, 0xb1, - 0x46, 0x24, 0xc4, 0xac, 0xa6, 0x6f, 0x17, 0xfa, 0x09, 0xbb, 0xad, 0x94, - 0x83, 0xce, 0x5d, 0x19, 0x96, 0xd2, 0x19, 0x59, 0xf7, 0xf7, 0xf6, 0xf6, - 0x38, 0xcb, 0x0c, 0x16, 0xb2, 0xf1, 0x51, 0x03, 0xe2, 0xdd, 0x76, 0x94, - 0xb3, 0x6f, 0xdc, 0xb9, 0x36, 0xcb, 0x7a, 0x29, 0x6f, 0xaa, 0xc7, 0x49, - 0x41, 0xa0, 0xc3, 0xfb, 0x0b, 0x48, 0x60, 0xb9, 0x93, 0xd8, 0x66, 0x24, - 0x71, 0x52, 0x83, 0xfc, 0xb3, 0x84, 0x9f, 0x96, 0x33, 0xde, 0x06, 0x73, - 0x33, 0xf0, 0xcf, 0x0c, 0x87, 0x8d, 0x91, 0x83, 0x29, 0x81, 0x54, 0x46, - 0x64, 0xe4, 0x20, 0x9b, 0x81, 0x80, 0x82, 0x84, 0xa2, 0xb4, 0x44, 0x43, - 0x01, 0xa4, 0x4b, 0xa2, 0x61, 0x16, 0x33, 0xaf, 0xb8, 0x90, 0xcc, 0x2b, - 0x82, 0xd7, 0xc4, 0x96, 0x95, 0x5b, 0x4a, 0xef, 0xc0, 0x6a, 0x52, 0x29, - 0x59, 0x7e, 0x66, 0x9f, 0x37, 0x12, 0xea, 0x9f, 0x2e, 0x40, 0x72, 0x02, - 0x58, 0x5a, 0x7c, 0xf4, 0xa9, 0xc0, 0xe0, 0xc7, 0x7c, 0xe6, 0x9e, 0xd6, - 0xe8, 0x12, 0x58, 0x66, 0x64, 0x80, 0x3e, 0x74, 0xd5, 0xbf, 0x46, 0x27, - 0x3d, 0x36, 0xb4, 0xe4, 0xe0, 0xa0, 0x72, 0xb7, 0xf1, 0xaf, 0x95, 0x05, - 0x68, 0x6f, 0x4b, 0x08, 0xd6, 0xab, 0xbd, 0x42, 0x88, 0x4e, 0x2d, 0xe1, - 0x59, 0x94, 0xe9, 0xe2, 0xee, 0xee, 0x6e, 0x8e, 0xdb, 0xdd, 0x62, 0x6e, - 0xcd, 0x48, 0x56, 0xc2, 0xad, 0x1a, 0xcc, 0xae, 0x65, 0xb7, 0xbd, 0x1a, - 0xbf, 0x69, 0xa6, 0x1e, 0x15, 0x33, 0xb5, 0xa3, 0xc8, 0x36, 0xba, 0x59, - 0x7c, 0x3f, 0x52, 0x14, 0x1f, 0x11, 0x45, 0x12, 0x70, 0x8e, 0xed, 0x9d, - 0x84, 0x90, 0xdb, 0x84, 0x24, 0xd7, 0x0c, 0xdd, 0x52, 0x11, 0x76, 0x97, - 0x8b, 0xb0, 0xdd, 0x29, 0x66, 0xf7, 0x47, 0xaa, 0xb5, 0x1a, 0xdb, 0x85, - 0x32, 0x8c, 0x59, 0x25, 0xb8, 0x4e, 0xa9, 0x10, 0x77, 0x28, 0x97, 0xb2, - 0xb7, 0xd7, 0x14, 0x62, 0x7b, 0xa7, 0x98, 0xad, 0x3d, 0x25, 0xa7, 0xc6, - 0x4e, 0x29, 0x5b, 0x92, 0xe6, 0x52, 0xb6, 0x58, 0x84, 0x84, 0x6a, 0x67, - 0x25, 0xb6, 0xa8, 0xd3, 0xd4, 0xc9, 0xe6, 0x4d, 0x1d, 0x77, 0xc4, 0x7e, - 0x09, 0xfa, 0x1e, 0x2d, 0x56, 0xe6, 0x4d, 0x54, 0x69, 0x57, 0xbc, 0x1f, - 0xf9, 0x3e, 0x86, 0x11, 0x69, 0x2e, 0x8d, 0xef, 0x60, 0xe6, 0x49, 0xf9, - 0xba, 0xb2, 0xdc, 0xca, 0xd5, 0x58, 0xe5, 0xee, 0x5c, 0xaf, 0xc5, 0xad, - 0x12, 0x2d, 0x5e, 0x36, 0xbb, 0x4a, 0x57, 0x20, 0xed, 0x49, 0xc6, 0xe3, - 0x35, 0x0d, 0xc3, 0xf5, 0xf8, 0x89, 0x9c, 0x6f, 0x2d, 0x32, 0x55, 0xdb, - 0x15, 0x17, 0x13, 0xf2, 0x96, 0xdf, 0x78, 0xd5, 0x3c, 0x5a, 0x64, 0xb1, - 0xf2, 0x66, 0x04, 0x70, 0x66, 0x3c, 0xb9, 0xd6, 0xb2, 0x79, 0xb0, 0x2b, - 0x22, 0xd0, 0xe3, 0x49, 0xbe, 0xc4, 0xdc, 0x6c, 0x75, 0xc4, 0x6c, 0xe9, - 0xf4, 0xdf, 0xb8, 0x0b, 0x72, 0x5d, 0xd0, 0xcc, 0x54, 0x4c, 0x8e, 0x70, - 0x5d, 0x67, 0x1e, 0x3a, 0x61, 0x21, 0x8b, 0x3d, 0xcf, 0x8f, 0xaa, 0xbd, - 0xb1, 0x13, 0x84, 0x51, 0x83, 0xb5, 0xa7, 0x66, 0x5d, 0x9a, 0xb1, 0x91, - 0xe5, 0x27, 0xd9, 0x56, 0x4a, 0x32, 0xf6, 0x7d, 0xf0, 0x58, 0xb0, 0x5e, - 0x9d, 0xf7, 0x0c, 0xcc, 0xb4, 0xaf, 0x28, 0xb3, 0x58, 0xd6, 0xb7, 0x3d, - 0x23, 0x8d, 0x75, 0x27, 0xa5, 0x3a, 0xa6, 0xf5, 0xd8, 0x58, 0x99, 0xee, - 0x54, 0x3a, 0x8f, 0x4d, 0x4c, 0x19, 0x4d, 0xd5, 0x74, 0x9e, 0xea, 0x5a, - 0x39, 0x90, 0xd2, 0x6c, 0x33, 0x9f, 0xcb, 0xad, 0xa3, 0x18, 0xe2, 0xc9, - 0x1e, 0xd8, 0xec, 0x64, 0x9c, 0xf7, 0xe6, 0x36, 0xcf, 0x7b, 0xea, 0xed, - 0x9a, 0x2a, 0xb5, 0x3a, 0x34, 0x7b, 0x47, 0x3f, 0x9e, 0x89, 0x91, 0x63, - 0x5b, 0xbe, 0xe7, 0x5e, 0x58, 0xe1, 0x30, 0x10, 0xc2, 0xb3, 0x6c, 0x6f, - 0x64, 0x55, 0x13, 0x6e, 0xca, 0x23, 0x9a, 0xf9, 0x2a, 0x6d, 0xc8, 0x3a, - 0x53, 0x29, 0x13, 0xf2, 0xa8, 0xa5, 0xb5, 0xfa, 0x0a, 0xd8, 0x57, 0xc2, - 0xdd, 0xee, 0xec, 0x6e, 0xaf, 0x86, 0xbc, 0xdd, 0xde, 0xdb, 0x59, 0x1b, - 0xfb, 0xa3, 0xd6, 0xaa, 0xd8, 0x7f, 0xb4, 0x2a, 0xf6, 0x44, 0x75, 0x77, - 0x1e, 0x15, 0x23, 0xcf, 0x2b, 0x56, 0x1e, 0x31, 0x3c, 0xf5, 0x1c, 0xbb, - 0x2d, 0x8d, 0x8c, 0xf4, 0xa5, 0x79, 0x1e, 0xb6, 0xe5, 0xa3, 0x72, 0x85, - 0x06, 0x36, 0xba, 0x2e, 0x3c, 0xdb, 0x66, 0x37, 0xf5, 0xd7, 0xf9, 0xfe, - 0x7e, 0x02, 0x68, 0x12, 0xb0, 0x49, 0xde, 0xcf, 0x54, 0xb0, 0xb4, 0xd8, - 0x55, 0x92, 0x5e, 0x27, 0x4f, 0x8f, 0xd8, 0x6f, 0xee, 0xa6, 0xfe, 0xb6, - 0x57, 0x23, 0x98, 0x2f, 0x57, 0x40, 0xb1, 0x5b, 0x44, 0xb1, 0xb3, 0xb3, - 0x1a, 0x05, 0xc0, 0xe5, 0x31, 0x6e, 0x17, 0x61, 0xec, 0x76, 0x33, 0xb5, - 0x5f, 0x8d, 0x40, 0xbe, 0x58, 0x9e, 0xde, 0x4e, 0x11, 0xbd, 0xed, 0x76, - 0xba, 0xee, 0x3f, 0x5a, 0x8d, 0x5e, 0xbe, 0x58, 0x9e, 0xde, 0x6e, 0x11, - 0xbd, 0x9d, 0xd6, 0x6a, 0x04, 0x00, 0x97, 0xc7, 0xf8, 0xa3, 0x42, 0x8c, - 0x59, 0x7d, 0xd9, 0x5d, 0x91, 0x42, 0xbe, 0x5c, 0x9e, 0xe2, 0x5e, 0x11, - 0xc5, 0xdd, 0x8c, 0xbe, 0xac, 0x48, 0x30, 0x5f, 0x2c, 0x4f, 0xef, 0x51, - 0x11, 0xbd, 0x1f, 0xad, 0xa8, 0x65, 0x3f, 0x2a, 0xd2, 0xb2, 0x76, 0xab, - 0xb0, 0x6b, 0x66, 0xf4, 0x65, 0xc5, 0x9e, 0x92, 0x2b, 0x56, 0x44, 0xb0, - 0xd0, 0x16, 0x3c, 0x6a, 0xdf, 0x48, 0x66, 0x8f, 0xda, 0xd7, 0xcb, 0xac, - 0x5d, 0x6c, 0x0c, 0x5a, 0x2b, 0x6a, 0x1a, 0x01, 0xae, 0x66, 0xf4, 0x76, - 0x69, 0xd0, 0x48, 0x19, 0xbe, 0x70, 0xb6, 0x59, 0xc3, 0x17, 0xce, 0x36, - 0x6d, 0xf8, 0xc2, 0xd9, 0x6d, 0x1b, 0xbe, 0x70, 0xb6, 0x59, 0xc3, 0x17, - 0xce, 0x36, 0x6b, 0xf8, 0xc2, 0xd9, 0x6d, 0x1b, 0xbe, 0x70, 0xb6, 0x69, - 0xc3, 0x17, 0xce, 0x36, 0x6b, 0xf8, 0xc2, 0xd9, 0x6d, 0x1b, 0xbe, 0x70, - 0xb6, 0x61, 0xc3, 0x17, 0xce, 0x36, 0x6c, 0xf8, 0xc2, 0xd9, 0xc6, 0x0c, - 0x9f, 0x76, 0xab, 0x0d, 0xf1, 0xd9, 0x68, 0xb3, 0x86, 0x6f, 0x36, 0xda, - 0xb4, 0xe1, 0x9b, 0x8d, 0x6e, 0xdb, 0xf0, 0xcd, 0x46, 0x9b, 0x35, 0x7c, - 0xb3, 0xd1, 0x66, 0x0d, 0xdf, 0x6c, 0x74, 0xdb, 0x86, 0x6f, 0x36, 0xda, - 0xb4, 0xe1, 0x9b, 0x8d, 0x36, 0x6b, 0xf8, 0x66, 0xa3, 0xdb, 0x36, 0x7c, - 0xb3, 0xd1, 0x86, 0x0d, 0xdf, 0x6c, 0xb4, 0x61, 0xc3, 0x37, 0x1b, 0x6d, - 0xcc, 0xf0, 0xc5, 0x73, 0x7e, 0x43, 0xdd, 0x9d, 0x6c, 0xd6, 0xf2, 0xb9, - 0x93, 0x4d, 0x5b, 0x3e, 0x77, 0x72, 0xdb, 0x96, 0xcf, 0x9d, 0x6c, 0xd6, - 0xf2, 0xb9, 0x93, 0xcd, 0x5a, 0x3e, 0x77, 0x72, 0xdb, 0x96, 0xcf, 0x9d, - 0x6c, 0xda, 0xf2, 0xb9, 0x93, 0xcd, 0x5a, 0x3e, 0x77, 0x72, 0xdb, 0x96, - 0xcf, 0x9d, 0x6c, 0xd8, 0xf2, 0xb9, 0x93, 0x0d, 0x5b, 0x3e, 0x77, 0xb2, - 0x39, 0xcb, 0x17, 0xaf, 0x47, 0x9a, 0x99, 0xb6, 0xbb, 0x59, 0xcb, 0x77, - 0xee, 0x6e, 0xda, 0xf2, 0x9d, 0xbb, 0xb7, 0x6d, 0xf9, 0xce, 0xdd, 0xcd, - 0x5a, 0xbe, 0x73, 0x77, 0xb3, 0x96, 0xef, 0xdc, 0xbd, 0x6d, 0xcb, 0x77, - 0xee, 0x6e, 0xda, 0xf2, 0x9d, 0xbb, 0x9b, 0xb5, 0x7c, 0xe7, 0xee, 0x6d, - 0x5b, 0xbe, 0x73, 0x77, 0xc3, 0x96, 0xef, 0xdc, 0xdd, 0xb0, 0xe5, 0x3b, - 0x77, 0xef, 0xc4, 0xf2, 0x2d, 0xdb, 0x33, 0xd9, 0x79, 0x94, 0xd8, 0x33, - 0x91, 0x3b, 0x95, 0x8d, 0xf3, 0xb0, 0x41, 0x45, 0x32, 0x51, 0xa8, 0x72, - 0xb7, 0x39, 0xb9, 0xc3, 0x6d, 0x08, 0x35, 0x69, 0xff, 0x53, 0x6e, 0xb5, - 0xa4, 0x58, 0x6c, 0xe7, 0x36, 0xc4, 0x15, 0x8d, 0x42, 0xdc, 0x12, 0x82, - 0x83, 0xb7, 0x6c, 0xda, 0xaa, 0xc1, 0xf9, 0x0d, 0x79, 0x26, 0xe0, 0x07, - 0x5b, 0xb4, 0x83, 0xee, 0x04, 0x43, 0x1c, 0x35, 0xa2, 0x53, 0x63, 0xd1, - 0xc9, 0x89, 0x7c, 0x52, 0x5b, 0xc3, 0x9e, 0x33, 0x53, 0x81, 0xc3, 0x49, - 0xa0, 0xc6, 0xd8, 0x81, 0xc9, 0xc7, 0x8e, 0x9b, 0x0c, 0x84, 0x91, 0xf1, - 0xf6, 0x74, 0x1c, 0xc3, 0xa2, 0x42, 0x89, 0x78, 0xd1, 0xc0, 0x8f, 0x10, - 0xcc, 0x56, 0x6d, 0x3c, 0x6a, 0x8d, 0xc4, 0x44, 0x46, 0x5f, 0x75, 0xea, - 0x56, 0x17, 0x90, 0x29, 0xc0, 0x86, 0x8f, 0x5d, 0x6a, 0x27, 0xde, 0x2b, - 0x65, 0xb8, 0x6d, 0x19, 0x96, 0x95, 0x63, 0xcf, 0xf1, 0xc6, 0xfe, 0x32, - 0xe6, 0xf4, 0xc9, 0x03, 0x62, 0x0f, 0xb8, 0xcf, 0xec, 0x60, 0x14, 0xee, - 0xa7, 0x03, 0xeb, 0xf7, 0xd3, 0x5c, 0xca, 0x9f, 0x2e, 0x18, 0xfd, 0x75, - 0x15, 0x31, 0x1b, 0x62, 0xa6, 0x76, 0x0c, 0x7f, 0x7c, 0x2a, 0x2e, 0xc6, - 0x01, 0x8e, 0xb6, 0x85, 0xf9, 0xca, 0xab, 0x80, 0x01, 0x70, 0x82, 0x83, - 0x0b, 0x81, 0x7f, 0x2a, 0x10, 0xa3, 0x17, 0x22, 0x37, 0xb0, 0x89, 0x00, - 0x69, 0xcb, 0xbe, 0x75, 0x95, 0xc3, 0x92, 0xe7, 0x52, 0xe3, 0x91, 0xdf, - 0x31, 0x93, 0x3a, 0x04, 0xaf, 0x94, 0xcd, 0x5a, 0x42, 0x45, 0xe8, 0x38, - 0x8e, 0x87, 0x80, 0x34, 0x8a, 0x63, 0xd8, 0xb2, 0xde, 0xfb, 0x38, 0x51, - 0x26, 0xc3, 0xfd, 0x42, 0x4e, 0x55, 0x44, 0xf8, 0xac, 0x8d, 0x3c, 0x6e, - 0x91, 0xda, 0x38, 0x4f, 0x8c, 0xd9, 0x1d, 0x0e, 0x4f, 0xcb, 0xed, 0x84, - 0x23, 0x1a, 0x05, 0x1b, 0x86, 0x65, 0x71, 0x6f, 0xe8, 0xdf, 0xc8, 0xca, - 0x87, 0xcd, 0x9a, 0xc8, 0xb9, 0x65, 0x51, 0xf8, 0x1d, 0x46, 0x9c, 0xdd, - 0x42, 0x5c, 0x31, 0x40, 0x91, 0xd8, 0xe3, 0x31, 0xc0, 0x44, 0x1c, 0x76, - 0x0b, 0x02, 0xec, 0xda, 0x3f, 0x52, 0x3b, 0xf9, 0x46, 0x22, 0x4d, 0x1c, - 0x38, 0x3c, 0xeb, 0xb6, 0x5a, 0xad, 0x9c, 0x68, 0xe4, 0xef, 0x4c, 0xc4, - 0x7a, 0x42, 0xd3, 0xc6, 0xf6, 0x48, 0x38, 0x1e, 0x45, 0x8f, 0x86, 0x75, - 0x7e, 0x40, 0x24, 0x17, 0x3f, 0x59, 0x1d, 0x7c, 0x70, 0xa9, 0x75, 0xa0, - 0x73, 0x4c, 0xed, 0xdc, 0x2e, 0x53, 0xdb, 0x6b, 0x31, 0xb5, 0x5d, 0xc2, - 0x54, 0xfb, 0x96, 0xb9, 0x6a, 0xaf, 0xc7, 0x16, 0x83, 0xab, 0x3e, 0xa9, - 0xe9, 0xc4, 0xbd, 0x4a, 0x95, 0x53, 0x06, 0x32, 0xa0, 0x40, 0x74, 0x15, - 0x7b, 0x9a, 0xec, 0xf1, 0x57, 0xba, 0x9b, 0x19, 0x2d, 0x49, 0xf6, 0x35, - 0xd5, 0x55, 0xef, 0x04, 0x69, 0x8e, 0x63, 0x5d, 0x39, 0x83, 0xbd, 0x04, - 0x83, 0x21, 0x90, 0x27, 0xae, 0xb1, 0xdf, 0x09, 0x56, 0x58, 0x94, 0x77, - 0xd4, 0xc9, 0xc5, 0xc8, 0x0a, 0xcf, 0x9c, 0x68, 0x38, 0xb5, 0x1a, 0x88, - 0xff, 0x0e, 0x23, 0x1c, 0x47, 0xa6, 0xa8, 0xdf, 0xe1, 0x54, 0x0c, 0x4f, - 0x75, 0xd8, 0x6f, 0x53, 0x41, 0x5c, 0x96, 0x85, 0x2d, 0xe5, 0x83, 0xc8, - 0xe5, 0x51, 0x8c, 0x74, 0xbf, 0x4f, 0x5b, 0x1e, 0xf3, 0xac, 0xbd, 0xa2, - 0xdc, 0x21, 0x1c, 0x15, 0x7f, 0x14, 0x33, 0x20, 0x4f, 0x6f, 0x59, 0x99, - 0x33, 0x54, 0x49, 0x1c, 0xad, 0x14, 0x82, 0x96, 0x2e, 0x8d, 0x20, 0x3c, - 0x39, 0xbe, 0x96, 0x1d, 0x4b, 0xc8, 0xc7, 0x79, 0x9b, 0xf8, 0xe6, 0x6c, - 0xd8, 0x73, 0x60, 0x90, 0x9b, 0xa3, 0x10, 0xad, 0x32, 0xdb, 0x39, 0x18, - 0x0c, 0x90, 0x55, 0x12, 0xfe, 0xb2, 0x2d, 0x7b, 0x48, 0x3e, 0xcd, 0x70, - 0xad, 0x4e, 0xd2, 0x2e, 0x65, 0x3e, 0x8e, 0x9b, 0xaf, 0x54, 0x52, 0xf5, - 0xef, 0xec, 0x26, 0x25, 0xac, 0x9e, 0x4d, 0x75, 0xa4, 0x78, 0x4d, 0x1d, - 0xb6, 0xcb, 0x46, 0x00, 0x19, 0xa6, 0x75, 0xb3, 0x6a, 0x70, 0x93, 0xf5, - 0x58, 0x9d, 0xa0, 0x6a, 0x3f, 0xb4, 0xe2, 0xc6, 0x28, 0xa6, 0x94, 0x2c, - 0xc4, 0x07, 0x1b, 0x4d, 0x91, 0x82, 0xb8, 0x44, 0x79, 0xfe, 0x61, 0x19, - 0x21, 0x23, 0xbf, 0x34, 0xf7, 0xf9, 0x11, 0xf7, 0x57, 0x55, 0x12, 0x4f, - 0x4d, 0xd6, 0x72, 0x16, 0x5e, 0x0b, 0xb3, 0x3c, 0xdf, 0x34, 0x60, 0x93, - 0xeb, 0x07, 0xfa, 0xd9, 0x91, 0x51, 0x29, 0x78, 0x1e, 0x36, 0xc5, 0x72, - 0xfe, 0x50, 0x8b, 0x2a, 0x01, 0xd9, 0xa0, 0xd5, 0xd4, 0x51, 0xa8, 0x25, - 0x5d, 0x33, 0x7d, 0xa8, 0xd9, 0xe2, 0x03, 0xca, 0xa9, 0x38, 0xd5, 0x8e, - 0x89, 0x53, 0xb5, 0x6d, 0x7b, 0xd9, 0x39, 0x3a, 0x13, 0xe3, 0x9e, 0x12, - 0xba, 0x3a, 0x23, 0xca, 0x2d, 0xa8, 0x8f, 0x88, 0x2e, 0x45, 0x5f, 0x4a, - 0x20, 0xf6, 0x4a, 0x8c, 0x82, 0x6a, 0x63, 0xc5, 0xd8, 0xb5, 0x95, 0x91, - 0xbe, 0x0f, 0x27, 0x35, 0x54, 0xd2, 0x65, 0x8a, 0xc1, 0x6d, 0xb6, 0x25, - 0x79, 0x75, 0xa1, 0x30, 0x56, 0xe6, 0xa3, 0xa4, 0xa6, 0x6d, 0x15, 0x11, - 0x98, 0xc5, 0xde, 0x53, 0x6d, 0x72, 0x99, 0xea, 0x6e, 0x0f, 0x5f, 0x23, - 0x1a, 0xd1, 0x92, 0x4d, 0x17, 0x92, 0xb9, 0x95, 0x61, 0x9a, 0xd6, 0x53, - 0xe6, 0x15, 0xff, 0xb3, 0x4f, 0x64, 0x79, 0x8b, 0xd9, 0x80, 0x00, 0x06, - 0x22, 0x3a, 0xa3, 0x59, 0x44, 0x0b, 0xa0, 0x74, 0x1e, 0x04, 0xe6, 0x8c, - 0x4e, 0x57, 0xa8, 0x7c, 0xf8, 0x40, 0xc2, 0x1d, 0x85, 0x0f, 0xb3, 0x9e, - 0x56, 0xd2, 0xd9, 0x4a, 0x55, 0x65, 0x9b, 0xaa, 0xd2, 0xe5, 0xbf, 0x58, - 0x4a, 0xae, 0x3d, 0x10, 0xae, 0x3c, 0x90, 0xcd, 0x3f, 0xd3, 0x52, 0xd9, - 0x4b, 0x9b, 0x83, 0xd8, 0x15, 0xcc, 0xfb, 0x71, 0x29, 0x26, 0x0e, 0x0f, - 0x0f, 0x13, 0x76, 0x9b, 0x5b, 0xb4, 0x50, 0x4b, 0xf2, 0x22, 0xa7, 0x11, - 0x45, 0x44, 0xcc, 0x6d, 0xc7, 0x70, 0x9b, 0x53, 0x1d, 0x29, 0x00, 0x9c, - 0x36, 0x96, 0x3c, 0x97, 0x0e, 0x27, 0xba, 0x9a, 0x5a, 0x62, 0x8c, 0x42, - 0x8e, 0x50, 0xba, 0x11, 0xf2, 0x58, 0x2f, 0x57, 0xa8, 0x61, 0xbb, 0xdd, - 0xce, 0x8f, 0x44, 0x46, 0x72, 0x5c, 0xb7, 0xf8, 0x24, 0x56, 0xce, 0x4a, - 0xe6, 0x8e, 0x09, 0x9b, 0x11, 0x8e, 0x43, 0x4c, 0xa9, 0xad, 0xd2, 0x47, - 0x37, 0xe5, 0x8c, 0x6d, 0x49, 0x2f, 0x2c, 0xef, 0x88, 0x59, 0x4b, 0xab, - 0x40, 0xac, 0x16, 0x45, 0x47, 0x0a, 0x3b, 0xcc, 0x45, 0x34, 0x1b, 0xe9, - 0xb7, 0xf8, 0x8f, 0x84, 0xb8, 0x54, 0x60, 0xd2, 0xee, 0x5e, 0x96, 0x30, - 0xb7, 0xd3, 0xda, 0x1b, 0x8e, 0x87, 0x99, 0x6e, 0x19, 0xb0, 0xda, 0x2b, - 0x94, 0xa5, 0x0d, 0xc2, 0x50, 0x9f, 0x2e, 0xcd, 0x08, 0x15, 0x6b, 0x64, - 0xbe, 0x1b, 0x96, 0xca, 0x2b, 0x31, 0x57, 0x2f, 0xaf, 0xe9, 0x36, 0xff, - 0xd5, 0xa5, 0xfa, 0x65, 0x93, 0x89, 0xf7, 0x65, 0x0c, 0xd6, 0xf3, 0x49, - 0xbd, 0x9e, 0x1e, 0x39, 0x64, 0xa9, 0x46, 0x34, 0x85, 0xac, 0xb8, 0x26, - 0xf1, 0x19, 0xf8, 0x24, 0x93, 0x1a, 0xba, 0x20, 0xf3, 0xca, 0x62, 0xb9, - 0xa9, 0x21, 0x8d, 0xf1, 0xa4, 0x04, 0xb6, 0x16, 0xf1, 0x78, 0xa0, 0x6f, - 0x65, 0x06, 0xfa, 0xed, 0x22, 0xb9, 0x12, 0xdc, 0xf7, 0x8b, 0xbc, 0x9d, - 0x9c, 0x3e, 0xdf, 0x1f, 0xf2, 0x5f, 0x99, 0x82, 0x0a, 0xfe, 0x2b, 0x14, - 0xff, 0xf6, 0x8a, 0xe2, 0xbf, 0x3f, 0x60, 0x37, 0x4a, 0x75, 0xf9, 0x8f, - 0xb0, 0xad, 0x7d, 0x99, 0x62, 0xc6, 0x8f, 0xbc, 0x2f, 0x15, 0x6b, 0xef, - 0xfd, 0x70, 0x2e, 0x30, 0xc8, 0x27, 0x4b, 0x73, 0xca, 0x4a, 0x85, 0xb7, - 0x7e, 0xa0, 0x0c, 0xf4, 0x07, 0xdc, 0xa6, 0xe2, 0x26, 0x86, 0x92, 0x93, - 0x33, 0x4a, 0x38, 0x19, 0xda, 0xde, 0x67, 0x3b, 0xd4, 0x98, 0xca, 0x4e, - 0x23, 0xeb, 0xe5, 0x4f, 0x0e, 0x12, 0x36, 0x4b, 0x49, 0xf9, 0x64, 0x63, - 0xca, 0x8c, 0x4b, 0x7c, 0xfd, 0x41, 0xe9, 0xd8, 0x53, 0xb1, 0xe7, 0x8d, - 0x29, 0xe4, 0xc2, 0xe7, 0x0b, 0x1b, 0xc5, 0x47, 0x03, 0xc9, 0xdf, 0x28, - 0x3f, 0x5b, 0xad, 0xd4, 0x3d, 0x59, 0x43, 0x57, 0x4c, 0x84, 0x76, 0x49, - 0x8c, 0xce, 0x74, 0xbf, 0x9f, 0x39, 0x7d, 0xbb, 0xad, 0xcd, 0x4d, 0x7e, - 0x28, 0x58, 0xe6, 0xef, 0x97, 0x44, 0xef, 0xe7, 0xb4, 0x2e, 0x35, 0xe2, - 0xab, 0x13, 0x88, 0xcd, 0x9d, 0x40, 0xcc, 0x8a, 0x5c, 0x81, 0x96, 0xc9, - 0x49, 0xce, 0x28, 0x9a, 0x7b, 0x3a, 0xb5, 0xd4, 0xc6, 0x1b, 0x0d, 0x5e, - 0xe6, 0x7b, 0x5c, 0x25, 0x6e, 0xc5, 0xd9, 0xd2, 0xd7, 0xe2, 0xc8, 0xa7, - 0xc4, 0x0d, 0x4d, 0x8f, 0xe9, 0xb6, 0x99, 0x83, 0x04, 0xe8, 0xc8, 0xf9, - 0x6c, 0x39, 0x23, 0x5c, 0xa0, 0x81, 0x05, 0x3b, 0x08, 0xfe, 0x04, 0x4b, - 0x51, 0x1e, 0x38, 0xab, 0xc8, 0xab, 0x2e, 0xfa, 0x15, 0x2d, 0x25, 0x6a, - 0x88, 0x8a, 0x2a, 0x18, 0x17, 0x9e, 0xb6, 0x0f, 0x14, 0x3c, 0x88, 0xb4, - 0xb3, 0xb9, 0xf3, 0x83, 0xd7, 0xce, 0x30, 0xf0, 0x43, 0x7f, 0x1c, 0xbd, - 0x3c, 0x7a, 0xbc, 0x35, 0x4f, 0x92, 0xdd, 0x02, 0xdd, 0x22, 0x36, 0xf8, - 0x74, 0xa3, 0xa6, 0x93, 0xca, 0x1d, 0xba, 0x76, 0x18, 0x32, 0x80, 0x39, - 0xfe, 0xa8, 0x01, 0x53, 0xc0, 0xe1, 0xe7, 0x89, 0x45, 0xb7, 0x46, 0xa1, - 0x63, 0xf7, 0x2b, 0xe8, 0xba, 0xb4, 0xa1, 0xb0, 0xd7, 0x6d, 0x3d, 0xda, - 0xdb, 0xdb, 0xed, 0x24, 0x7f, 0x57, 0xa4, 0xde, 0xf4, 0x2b, 0x9d, 0x56, - 0xab, 0xa2, 0x54, 0x46, 0x3d, 0x9c, 0xcf, 0x5c, 0x2f, 0x94, 0xf7, 0x13, - 0xe1, 0x7a, 0xa2, 0xb3, 0xb3, 0xb3, 0xe6, 0x59, 0xb7, 0xe9, 0x07, 0x93, - 0x2d, 0xe4, 0xb6, 0xb6, 0x40, 0x40, 0x13, 0xce, 0x11, 0x97, 0xab, 0x67, - 0x6a, 0xb9, 0xad, 0x5f, 0xb9, 0x2f, 0xc6, 0xf4, 0x5f, 0x45, 0xaf, 0xbf, - 0x29, 0x8a, 0xa0, 0x4d, 0xeb, 0x73, 0xfd, 0x0a, 0x4b, 0xd5, 0x1a, 0x82, - 0x51, 0x6c, 0xdc, 0x3c, 0x6a, 0xef, 0x6c, 0x3f, 0xda, 0xee, 0xb6, 0x91, - 0x70, 0x91, 0x49, 0x08, 0xf0, 0xbc, 0x93, 0x78, 0xde, 0x5a, 0x4e, 0x9f, - 0x45, 0x49, 0x87, 0xe0, 0x21, 0x23, 0x7b, 0x82, 0x65, 0x3f, 0x22, 0xa3, - 0x25, 0x58, 0xb4, 0x90, 0x5a, 0x31, 0x1c, 0xb7, 0x5a, 0xf6, 0x70, 0xd8, - 0xce, 0x73, 0x9c, 0x5d, 0x42, 0x24, 0x16, 0x5b, 0x75, 0x8c, 0x62, 0x71, - 0x0e, 0xf5, 0x22, 0xdc, 0xa7, 0xd5, 0xaf, 0xb0, 0xd9, 0xba, 0xb3, 0x2a, - 0x4e, 0x74, 0x45, 0xf2, 0x4b, 0xae, 0xba, 0x59, 0x0a, 0xcb, 0x51, 0xef, - 0x4a, 0x0b, 0x06, 0x7c, 0x65, 0xd9, 0xba, 0x60, 0x2e, 0x76, 0x2a, 0xf2, - 0x0c, 0xcc, 0x0c, 0x60, 0xb4, 0x08, 0x2f, 0xa8, 0x6a, 0x20, 0x88, 0xc7, - 0x00, 0xea, 0xa9, 0x3a, 0xaa, 0x37, 0x9c, 0xfa, 0xe0, 0x5a, 0x5e, 0x1e, - 0x51, 0x89, 0x17, 0xf3, 0x00, 0x88, 0xdb, 0xcc, 0xda, 0xad, 0xef, 0x3f, - 0xde, 0x22, 0xb8, 0x95, 0x58, 0x4a, 0x69, 0x75, 0x21, 0x57, 0x9d, 0xd6, - 0x57, 0x73, 0xd5, 0xa9, 0x1c, 0x2c, 0x65, 0xe9, 0xf1, 0xd6, 0xa4, 0xa8, - 0x3f, 0x91, 0xbe, 0x9b, 0x74, 0xd3, 0x7d, 0x57, 0xe9, 0xce, 0x7a, 0x81, - 0x0e, 0x94, 0xcb, 0x40, 0xe2, 0x83, 0x1a, 0xab, 0x99, 0x1c, 0xcf, 0x96, - 0xc5, 0xe4, 0x61, 0x29, 0x53, 0x28, 0x69, 0x84, 0x69, 0xe4, 0x4a, 0x1f, - 0x2d, 0x4b, 0xa7, 0x91, 0x45, 0x56, 0x49, 0x65, 0x4b, 0xd7, 0x34, 0x07, - 0xd6, 0xb4, 0xcb, 0x4c, 0x51, 0xf6, 0xa0, 0x5a, 0xcc, 0x8b, 0x1a, 0x7e, - 0x28, 0xaa, 0x46, 0xe3, 0x58, 0x09, 0x0f, 0x9d, 0xfb, 0x42, 0x8d, 0xe9, - 0xa2, 0x3a, 0x16, 0xd7, 0x0a, 0x65, 0x79, 0xe3, 0x25, 0x16, 0x6f, 0x51, - 0xce, 0x52, 0x4c, 0x00, 0xf2, 0x74, 0x2b, 0xa0, 0xf3, 0x46, 0x62, 0x14, - 0x9b, 0x09, 0x39, 0xf0, 0xa1, 0xbc, 0x63, 0xd9, 0x98, 0x71, 0x37, 0xe4, - 0x33, 0xb8, 0x0d, 0x16, 0xc6, 0x96, 0xa4, 0x6f, 0x01, 0xa8, 0x1c, 0x9c, - 0x39, 0x63, 0xe7, 0xf1, 0x96, 0x73, 0xf0, 0xc0, 0x1b, 0x84, 0xf3, 0x7d, - 0xf9, 0xc9, 0x44, 0x74, 0x81, 0xf4, 0x16, 0x53, 0xe5, 0x80, 0xaa, 0x8c, - 0xca, 0x12, 0xc8, 0x81, 0x64, 0xe7, 0x20, 0x66, 0x45, 0x25, 0xcb, 0xaf, - 0x6b, 0x6b, 0x00, 0xad, 0x89, 0x4b, 0xae, 0xc9, 0x75, 0x88, 0x4e, 0x65, - 0xbb, 0x27, 0xc4, 0xfc, 0x89, 0x3f, 0x1e, 0x7f, 0x6d, 0x05, 0xc0, 0xc9, - 0x0d, 0xeb, 0x00, 0xf5, 0xe4, 0x39, 0x91, 0xb4, 0x05, 0xd9, 0xa6, 0x58, - 0x15, 0x8b, 0x24, 0x4e, 0x78, 0xb0, 0x66, 0xe2, 0xb8, 0x45, 0x6d, 0xaa, - 0x2e, 0x3a, 0xf3, 0xbd, 0xa7, 0x74, 0x95, 0x15, 0xae, 0x54, 0x0c, 0x4f, - 0x02, 0xa1, 0xca, 0x55, 0x6b, 0x24, 0xbe, 0x32, 0x59, 0xd1, 0x81, 0x39, - 0xcc, 0x12, 0xc5, 0x99, 0x91, 0x92, 0xac, 0x75, 0x5c, 0x3e, 0xae, 0x32, - 0x13, 0x59, 0x52, 0x77, 0xad, 0x99, 0xe9, 0x34, 0x74, 0xf0, 0x25, 0xc3, - 0xbf, 0x3a, 0xf4, 0x0f, 0x67, 0x85, 0x0f, 0xa1, 0x5f, 0xd7, 0x45, 0xf9, - 0xc0, 0x2d, 0x1f, 0x9e, 0x40, 0x80, 0x7c, 0xdc, 0x3f, 0x93, 0x6e, 0x2e, - 0x2f, 0x21, 0xac, 0xd2, 0x4b, 0xf3, 0x76, 0xaa, 0xc0, 0x5d, 0x5b, 0x3a, - 0x00, 0x49, 0xb7, 0x9c, 0x9b, 0x28, 0xef, 0xad, 0x57, 0xd0, 0x18, 0x43, - 0xd9, 0x18, 0xbe, 0x77, 0xcc, 0xde, 0x2f, 0xfb, 0xf8, 0x55, 0xf1, 0x19, - 0xa8, 0x6b, 0x94, 0xcd, 0xb7, 0x2c, 0xce, 0xe0, 0x9a, 0x96, 0x80, 0x40, - 0xd2, 0x12, 0x97, 0x62, 0xa2, 0xac, 0x46, 0x86, 0x03, 0x20, 0x69, 0xc7, - 0xca, 0x51, 0xe0, 0x5f, 0x27, 0x4e, 0xa6, 0x13, 0x03, 0x4f, 0x73, 0xfc, - 0xbd, 0x59, 0xcc, 0xaa, 0xed, 0xda, 0x92, 0x5a, 0x1b, 0xd5, 0x3c, 0x60, - 0xfc, 0xba, 0xa7, 0xb4, 0x7b, 0x32, 0xd5, 0xf0, 0xf2, 0x13, 0x71, 0xde, - 0x2e, 0x50, 0xf1, 0x55, 0x94, 0x66, 0x69, 0x05, 0x3b, 0xab, 0x55, 0xb0, - 0x5b, 0x5e, 0xc1, 0xce, 0x4d, 0x2a, 0xd8, 0x29, 0xaa, 0x60, 0xe7, 0x2e, - 0x2a, 0xd8, 0xfd, 0xea, 0x0a, 0x76, 0x6f, 0x52, 0xc1, 0x6e, 0x51, 0x05, - 0xbb, 0x5f, 0x59, 0x41, 0xce, 0x5b, 0xd1, 0x54, 0x2c, 0xeb, 0xeb, 0x3f, - 0x5a, 0xa5, 0x47, 0xeb, 0xf5, 0x8a, 0xb8, 0x67, 0xc7, 0x85, 0xae, 0x35, - 0x05, 0xa8, 0x2d, 0x5f, 0x85, 0xb1, 0x92, 0xcf, 0xb2, 0xac, 0x05, 0xcd, - 0x02, 0x6d, 0xe5, 0xe0, 0xda, 0x96, 0xdf, 0xba, 0x5e, 0x33, 0xae, 0x23, - 0xcd, 0xcb, 0x0d, 0x14, 0x72, 0x00, 0x2f, 0x9d, 0xc6, 0xc9, 0x80, 0x86, - 0x28, 0x4e, 0xbc, 0xae, 0xa4, 0x5c, 0xaa, 0x94, 0x0b, 0xe5, 0x72, 0x9d, - 0xad, 0x82, 0x4a, 0x30, 0x1a, 0xe8, 0xd0, 0xb5, 0x75, 0x96, 0xc5, 0x3f, - 0xdb, 0xee, 0x02, 0xe5, 0xb1, 0x74, 0xac, 0xaf, 0xb4, 0xe5, 0x15, 0xa2, - 0x0a, 0x6d, 0xf0, 0x63, 0xb2, 0x86, 0x6f, 0xfb, 0x9c, 0xb3, 0x63, 0xdc, - 0x95, 0xcd, 0x09, 0x64, 0x12, 0x08, 0x1a, 0x1c, 0xf9, 0xeb, 0x2b, 0x85, - 0xc2, 0x38, 0xee, 0x4c, 0x2c, 0x8c, 0x7d, 0x83, 0x82, 0x19, 0x80, 0xbb, - 0xca, 0x01, 0x7d, 0x7e, 0xa5, 0x58, 0x08, 0xc5, 0x9d, 0x49, 0x85, 0x90, - 0x6f, 0x50, 0x28, 0xb4, 0xa3, 0x08, 0x7a, 0xf4, 0xf5, 0xb5, 0x62, 0x21, - 0x1c, 0x77, 0x27, 0x17, 0xc2, 0xbe, 0x49, 0xc1, 0xc8, 0x55, 0xd0, 0xd8, - 0x32, 0xea, 0xa5, 0xae, 0x3d, 0x75, 0x33, 0x4c, 0x57, 0x7e, 0xef, 0xaf, - 0xe5, 0xa3, 0x5b, 0xfa, 0x82, 0x32, 0x08, 0x7c, 0x80, 0xa9, 0x3e, 0xfc, - 0x9c, 0x91, 0x08, 0xc9, 0xe9, 0x22, 0x37, 0xf4, 0x2b, 0xc5, 0x2f, 0x19, - 0xbe, 0x33, 0xf9, 0x4b, 0xf4, 0x1b, 0x6c, 0x00, 0x5e, 0x48, 0xbe, 0x5d, - 0xf9, 0xd3, 0x3c, 0x67, 0x26, 0x82, 0x5b, 0x10, 0x36, 0x98, 0xbb, 0xc3, - 0x01, 0x03, 0xd8, 0xbf, 0x7e, 0xc8, 0x90, 0x2b, 0x32, 0xb8, 0xe5, 0x99, - 0x56, 0x88, 0x72, 0xee, 0xbf, 0x5a, 0x11, 0x2e, 0x9c, 0x05, 0xd0, 0xba, - 0xc2, 0xfe, 0xb5, 0x35, 0xd3, 0x24, 0xce, 0x42, 0x45, 0xe4, 0xd5, 0xc0, - 0x5d, 0x86, 0x0e, 0x0b, 0xa9, 0x67, 0xe1, 0x6b, 0x09, 0x6a, 0x96, 0x51, - 0x57, 0x10, 0x1e, 0x04, 0xa6, 0x30, 0x56, 0xd2, 0x04, 0x63, 0x6a, 0xe5, - 0x7b, 0x77, 0x45, 0x8b, 0xcc, 0x6a, 0xa1, 0x9d, 0x77, 0xae, 0xcc, 0x02, - 0xdd, 0x8d, 0x45, 0x7d, 0x4b, 0x7e, 0xa0, 0x4e, 0xfb, 0xca, 0x89, 0x5b, - 0x72, 0x09, 0x1a, 0xaf, 0x00, 0x28, 0x9d, 0x70, 0x4a, 0x72, 0x45, 0x44, - 0x63, 0x0c, 0xfa, 0xda, 0xc8, 0xf5, 0x94, 0x47, 0x72, 0x72, 0xed, 0xaa, - 0xd3, 0x0a, 0x33, 0xe0, 0x65, 0x9e, 0xf1, 0x36, 0xeb, 0x93, 0xdc, 0x5e, - 0x79, 0x85, 0xae, 0xb4, 0xb8, 0x56, 0xa9, 0x1e, 0x4b, 0x60, 0xae, 0x99, - 0xab, 0x4a, 0xc4, 0x35, 0x4b, 0xc5, 0x70, 0x90, 0x70, 0xe4, 0xaf, 0x35, - 0x9b, 0xf5, 0x7a, 0x86, 0xcd, 0x7e, 0xf1, 0xd1, 0x78, 0x0c, 0x02, 0xa1, - 0xe1, 0xb9, 0x0c, 0x59, 0xd6, 0x35, 0x4f, 0xdc, 0x0d, 0x7a, 0x7d, 0x1f, - 0x65, 0x1b, 0xa7, 0xd9, 0x91, 0xb1, 0x5b, 0x95, 0x75, 0x3b, 0x9e, 0x8e, - 0x40, 0xab, 0x68, 0xa5, 0x68, 0xe4, 0x6a, 0xb1, 0x12, 0x4e, 0x9a, 0x4f, - 0x69, 0x14, 0x39, 0x0c, 0x83, 0x89, 0x8c, 0x5a, 0x49, 0x4f, 0x6a, 0x2c, - 0x5e, 0x82, 0x5f, 0x61, 0x32, 0x46, 0x7f, 0xd7, 0x5b, 0xf4, 0x9b, 0x74, - 0xd5, 0xeb, 0xdb, 0x54, 0xaa, 0xca, 0xb7, 0x98, 0x91, 0x8a, 0xe0, 0x8e, - 0x9b, 0x33, 0x51, 0x5e, 0x45, 0x36, 0xd0, 0x3a, 0x16, 0x6f, 0xde, 0x27, - 0x5e, 0xb9, 0xb0, 0xc7, 0xc3, 0x22, 0xcf, 0x9f, 0x65, 0xad, 0xee, 0x40, - 0x0d, 0xe6, 0x5c, 0x5d, 0xe2, 0xe5, 0xda, 0x79, 0xa2, 0x69, 0x7c, 0x53, - 0xf0, 0x16, 0x9b, 0x9b, 0x85, 0xb2, 0xb2, 0x54, 0xe4, 0x66, 0xcb, 0x5d, - 0xd8, 0xf4, 0x52, 0x45, 0x59, 0x32, 0x26, 0x1a, 0xf5, 0xf9, 0x89, 0x1f, - 0x46, 0xb4, 0x60, 0x2e, 0x15, 0x68, 0xa5, 0x06, 0x31, 0x03, 0xe2, 0x54, - 0x16, 0xbe, 0xdb, 0xf1, 0x70, 0xed, 0x7a, 0x5b, 0x74, 0xad, 0xc3, 0x4a, - 0x95, 0x7f, 0xfd, 0xf3, 0xf7, 0xef, 0x49, 0x00, 0x37, 0xaa, 0xfc, 0xec, - 0x0f, 0x51, 0x74, 0x42, 0x12, 0xf8, 0x8f, 0xab, 0xfd, 0x6a, 0x2d, 0x4f, - 0x95, 0xff, 0xd6, 0x0f, 0xd6, 0xa9, 0xbc, 0x74, 0x44, 0x33, 0xce, 0xe3, - 0xee, 0xce, 0x4e, 0x77, 0x27, 0x21, 0x12, 0x9c, 0x57, 0xf9, 0xcf, 0x13, - 0xc9, 0xee, 0xca, 0x22, 0xf9, 0x45, 0x78, 0xad, 0x35, 0x5d, 0xa2, 0x0f, - 0x14, 0x7c, 0xf1, 0x5f, 0x5c, 0xf9, 0x6f, 0x51, 0x76, 0x8d, 0xca, 0xcf, - 0x01, 0x7e, 0x86, 0x9a, 0x24, 0x04, 0x40, 0x49, 0xff, 0x16, 0x01, 0xac, - 0xb2, 0xc4, 0x79, 0x8b, 0xbe, 0xdf, 0x53, 0x8c, 0x18, 0xb7, 0xd9, 0x75, - 0x24, 0xd6, 0x21, 0xb0, 0xfe, 0xe7, 0x75, 0x9e, 0x64, 0xbd, 0xdf, 0xbd, - 0x78, 0xf2, 0x76, 0x75, 0x7f, 0x57, 0xfe, 0x44, 0xb4, 0x92, 0xbf, 0x71, - 0x8f, 0x57, 0x7b, 0x47, 0xde, 0xd7, 0x36, 0x52, 0x7b, 0x37, 0xd9, 0x42, - 0x38, 0x52, 0xf7, 0x6f, 0x69, 0x9f, 0x0d, 0xa8, 0x77, 0x37, 0x21, 0xb7, - 0xb7, 0xdf, 0xbe, 0x7f, 0x77, 0xf4, 0xcb, 0x75, 0x1b, 0x1a, 0xaf, 0x98, - 0xc2, 0x61, 0xc1, 0x0d, 0x36, 0x75, 0x86, 0xe5, 0xe7, 0x87, 0xcf, 0x8e, - 0x6e, 0xc0, 0x33, 0x0e, 0xd5, 0x6c, 0x72, 0x46, 0x96, 0x61, 0xfa, 0xc5, - 0xe1, 0xeb, 0xd7, 0x87, 0x37, 0xe0, 0x7a, 0x62, 0xcf, 0x66, 0xf6, 0xbf, - 0x8f, 0xed, 0xe3, 0x97, 0xbf, 0xb9, 0x89, 0xac, 0xe1, 0x13, 0xdf, 0xb6, - 0xac, 0xef, 0xba, 0x6b, 0x94, 0x8f, 0x9e, 0x3a, 0xcc, 0x5b, 0xc6, 0x78, - 0xab, 0xc1, 0xd4, 0x6c, 0x2c, 0xab, 0xa1, 0x74, 0xe9, 0xdc, 0x44, 0xe3, - 0x2e, 0xba, 0x07, 0x99, 0xb8, 0x5c, 0x61, 0x47, 0xf1, 0xb5, 0x4d, 0x46, - 0x8e, 0x9f, 0x53, 0xd6, 0x4c, 0xcd, 0x74, 0xcc, 0x4e, 0xd9, 0x0c, 0x80, - 0x15, 0xbd, 0x24, 0xa8, 0x4e, 0x16, 0xac, 0x48, 0xe3, 0x39, 0xe6, 0x33, - 0x2b, 0xd1, 0xa0, 0x89, 0xcf, 0x0d, 0x69, 0x3c, 0x41, 0xac, 0xd3, 0x4a, - 0x34, 0x28, 0xb6, 0xf7, 0xa6, 0x34, 0xa2, 0xd5, 0x44, 0x35, 0x88, 0x6e, - 0x2a, 0x29, 0x50, 0xc0, 0xe6, 0xf0, 0xaa, 0x44, 0xa0, 0x2d, 0x6b, 0xd1, - 0x61, 0xb4, 0x6b, 0xf6, 0x8f, 0xdb, 0x52, 0x6c, 0xd7, 0xfe, 0x2c, 0xde, - 0xd0, 0xe2, 0xde, 0x1a, 0x23, 0xaa, 0x71, 0x8f, 0xb9, 0xb8, 0x87, 0xe2, - 0xb7, 0xe1, 0x1e, 0xea, 0xd0, 0x60, 0x75, 0x70, 0x8d, 0x2f, 0xc4, 0xbf, - 0xa3, 0x41, 0x35, 0x96, 0x56, 0x1c, 0xf6, 0x93, 0x5a, 0xa3, 0x6c, 0x84, - 0xa8, 0x96, 0x5e, 0x5b, 0x97, 0xf9, 0xb1, 0x79, 0x4b, 0xbe, 0x2d, 0x81, - 0xde, 0x5c, 0x96, 0x78, 0x43, 0x55, 0xf2, 0x6d, 0x6f, 0xd7, 0xec, 0x24, - 0xf0, 0xeb, 0x7b, 0xb2, 0xdb, 0x09, 0x44, 0x15, 0xbb, 0x09, 0xfc, 0x7d, - 0xac, 0x58, 0x89, 0x23, 0x86, 0x56, 0x5d, 0xe5, 0xcd, 0x40, 0xc8, 0x1b, - 0xd0, 0xb9, 0x76, 0xf2, 0x67, 0xdc, 0x50, 0xf1, 0x79, 0x4c, 0x16, 0x73, - 0x89, 0xc0, 0x0e, 0x1e, 0xdb, 0x99, 0xf7, 0x92, 0xca, 0xb7, 0xa4, 0x2e, - 0x7d, 0x35, 0x6a, 0x25, 0x41, 0x8e, 0x5f, 0xba, 0x03, 0x51, 0xa2, 0x69, - 0xe9, 0xb5, 0xb6, 0x27, 0x03, 0xd7, 0xc6, 0xf3, 0xc1, 0xb7, 0x81, 0xff, - 0x7b, 0x1a, 0x46, 0xa6, 0x3e, 0xad, 0x52, 0xd8, 0x07, 0x38, 0xa6, 0xfa, - 0x8f, 0xbf, 0xe2, 0x20, 0x43, 0xfb, 0x91, 0xac, 0x93, 0xb5, 0x4e, 0xd4, - 0x5e, 0x61, 0x13, 0xfa, 0x73, 0xe1, 0x95, 0x34, 0xa1, 0x6e, 0x36, 0xa5, - 0x69, 0x5f, 0xdf, 0x6e, 0x71, 0x5b, 0x39, 0x71, 0x84, 0x57, 0xae, 0xa5, - 0xa4, 0x38, 0x96, 0xc5, 0x87, 0xe2, 0x36, 0x0a, 0x67, 0x9e, 0x1c, 0x27, - 0x9d, 0xb1, 0x55, 0x45, 0xe4, 0x17, 0x5e, 0xb2, 0x84, 0xf0, 0xb2, 0x26, - 0xcd, 0x42, 0x0f, 0x27, 0xf4, 0x5a, 0x5a, 0x3e, 0x4a, 0xff, 0x76, 0x5c, - 0x7d, 0xf8, 0xfa, 0xf8, 0xe5, 0xd1, 0xc3, 0xda, 0xbd, 0x7e, 0xbf, 0xd1, - 0xb6, 0xfe, 0xf8, 0x47, 0xcb, 0xc0, 0xe2, 0x84, 0xca, 0x2f, 0xb1, 0xa0, - 0x06, 0x2d, 0x35, 0xc0, 0xef, 0x03, 0x67, 0x84, 0xd2, 0x5b, 0x0f, 0x6b, - 0xd6, 0x41, 0x7c, 0x8b, 0xb7, 0xf9, 0xa3, 0xaa, 0xe0, 0x25, 0xa4, 0x4d, - 0xd7, 0x9f, 0x54, 0x2b, 0x78, 0x57, 0xe7, 0x48, 0x44, 0x32, 0x6c, 0xb0, - 0xb6, 0x9f, 0x06, 0x1c, 0xe1, 0x1c, 0xd1, 0x8c, 0xd8, 0x40, 0x83, 0x1e, - 0xc9, 0x77, 0x85, 0x3e, 0xb9, 0x78, 0x39, 0xaa, 0xe6, 0xa2, 0xe5, 0x6b, - 0x4d, 0xd6, 0xb4, 0xa6, 0x3e, 0xdd, 0xd7, 0xb7, 0x1e, 0x72, 0x3f, 0x79, - 0xb8, 0x2a, 0xc2, 0x78, 0x87, 0xa0, 0x08, 0xd5, 0x14, 0xb5, 0x49, 0x62, - 0x4a, 0x85, 0xfa, 0x2b, 0x51, 0xe6, 0x85, 0xcb, 0xe7, 0x44, 0xf4, 0x12, - 0x3f, 0xea, 0x38, 0xe6, 0x77, 0x24, 0xa3, 0xea, 0x00, 0xfd, 0x01, 0x6e, - 0x60, 0xb0, 0xb0, 0x31, 0x68, 0xc1, 0xab, 0xc0, 0x39, 0xbf, 0x33, 0x4f, - 0x05, 0xbf, 0xca, 0x53, 0xee, 0x0c, 0xf0, 0xd4, 0x9f, 0x5f, 0xd0, 0x75, - 0x21, 0x71, 0x8e, 0xe0, 0xa3, 0x7e, 0x15, 0x52, 0xb5, 0xea, 0x91, 0x37, - 0x71, 0x9d, 0x70, 0x5a, 0xb3, 0x3e, 0x4b, 0xd1, 0xd7, 0x33, 0x90, 0x4e, - 0xd4, 0x64, 0x24, 0x2f, 0xc7, 0x96, 0x9d, 0x44, 0x6d, 0x39, 0x21, 0x26, - 0x27, 0x61, 0x48, 0xb7, 0x7b, 0xd0, 0xc4, 0x3b, 0xac, 0x13, 0xd2, 0x0b, - 0x7e, 0x45, 0x04, 0xb1, 0x68, 0x2f, 0x5c, 0x7e, 0x99, 0xaa, 0xc2, 0x0f, - 0x24, 0x7c, 0xba, 0xe5, 0x33, 0xae, 0x87, 0x70, 0x75, 0x4d, 0xfa, 0xba, - 0x39, 0x85, 0xd7, 0x4b, 0xb4, 0x2c, 0x03, 0x9c, 0xd0, 0x6a, 0x1e, 0x4e, - 0x11, 0xab, 0xf2, 0x95, 0xba, 0xc9, 0xa6, 0x40, 0x4d, 0xca, 0x32, 0x7d, - 0x37, 0x99, 0xab, 0xca, 0x99, 0xcc, 0x5f, 0xbc, 0xb4, 0x7e, 0xd9, 0xad, - 0x62, 0xb6, 0xf8, 0xa1, 0x96, 0x84, 0x8b, 0x03, 0x3b, 0x01, 0x1c, 0xff, - 0x4e, 0x02, 0xa0, 0xd9, 0x92, 0x30, 0xf2, 0x31, 0x0f, 0x16, 0x47, 0x4b, - 0x02, 0xe6, 0x9d, 0xfe, 0x5d, 0x40, 0xe8, 0x28, 0x08, 0xfc, 0xa0, 0x0d, - 0x20, 0xcc, 0xd7, 0xdd, 0x11, 0x1c, 0xab, 0x48, 0xe5, 0xb0, 0x98, 0x0c, - 0xbb, 0x4d, 0x0b, 0x3a, 0x8f, 0x03, 0x45, 0x65, 0x28, 0x3a, 0x40, 0x61, - 0xd1, 0x1e, 0x6e, 0xd8, 0xb4, 0xbe, 0x75, 0xe9, 0x94, 0x1d, 0xce, 0x05, - 0xc9, 0x16, 0x7d, 0x77, 0xf4, 0xf4, 0xed, 0x9b, 0x37, 0x47, 0x4f, 0xdf, - 0xab, 0x37, 0xa0, 0x12, 0xe2, 0x28, 0x40, 0xdb, 0x4f, 0xa0, 0x90, 0xcd, - 0x24, 0x42, 0x17, 0xf7, 0xb2, 0xbc, 0xa6, 0x11, 0x10, 0xc8, 0xf4, 0x1d, - 0x2d, 0x33, 0x7a, 0xb6, 0x9a, 0x4d, 0x00, 0x5a, 0x5b, 0x5b, 0x78, 0xb1, - 0x97, 0x13, 0xc6, 0x4d, 0xd5, 0xc0, 0xc1, 0x00, 0x82, 0x41, 0x12, 0x18, - 0x37, 0xea, 0x81, 0x2b, 0x68, 0x94, 0x1d, 0xe1, 0x0c, 0xc6, 0x8b, 0xc4, - 0x0b, 0x11, 0xd5, 0xd2, 0xc4, 0xd4, 0xc8, 0x90, 0xa4, 0xa7, 0x0a, 0xde, - 0x19, 0xc9, 0x0f, 0x62, 0x10, 0xa2, 0xe3, 0x92, 0xc4, 0xa5, 0xf8, 0x58, - 0x55, 0x65, 0xa2, 0x88, 0x14, 0xd9, 0x74, 0x91, 0x77, 0x38, 0x5e, 0x73, - 0x81, 0x02, 0xfc, 0x5d, 0x04, 0xc0, 0x2d, 0x00, 0x00, 0xfe, 0xe6, 0x14, - 0x20, 0x35, 0xb7, 0x4a, 0x48, 0x19, 0xe2, 0x65, 0x28, 0xdc, 0x2e, 0x46, - 0xf6, 0x77, 0x50, 0x43, 0x91, 0xe4, 0x24, 0xc9, 0xa6, 0x32, 0x64, 0xc8, - 0xfa, 0x20, 0x7f, 0x25, 0x33, 0x67, 0xe6, 0x18, 0x0f, 0x00, 0x5e, 0x8e, - 0xc9, 0x6a, 0xa0, 0x21, 0xc0, 0x2a, 0x31, 0xa6, 0xf6, 0x94, 0xf1, 0x4a, - 0x5a, 0x0c, 0x70, 0x48, 0x61, 0x79, 0x79, 0x11, 0xe6, 0x29, 0xbe, 0x37, - 0x89, 0xb5, 0xed, 0x54, 0x88, 0x39, 0x1d, 0x17, 0x9e, 0xc1, 0x48, 0xa3, - 0x9c, 0x1d, 0x59, 0xa9, 0xbe, 0x36, 0xf2, 0x45, 0xe8, 0x3d, 0x8c, 0xc8, - 0x28, 0x9c, 0x02, 0x2c, 0xff, 0x2a, 0xdc, 0x94, 0xda, 0x62, 0xda, 0xb1, - 0x98, 0x63, 0x3b, 0xcd, 0x6f, 0x8c, 0xc8, 0xda, 0x28, 0x6b, 0x8c, 0x37, - 0xed, 0x9d, 0xe2, 0xe8, 0xf2, 0x34, 0x00, 0x1f, 0xf5, 0xf8, 0xcd, 0xba, - 0x90, 0xf8, 0xd1, 0x68, 0x22, 0x52, 0x8d, 0xc2, 0xee, 0x2b, 0x35, 0x31, - 0x7d, 0xa7, 0xbb, 0xe5, 0x88, 0x1a, 0x32, 0xdd, 0x57, 0x39, 0xdc, 0x0a, - 0xc9, 0x2f, 0xe8, 0x3b, 0x99, 0x41, 0x11, 0x47, 0x48, 0x7f, 0x82, 0xaf, - 0x64, 0x32, 0x4f, 0x85, 0x48, 0x92, 0xf8, 0x4e, 0x66, 0x50, 0xb3, 0x9c, - 0x00, 0x19, 0x58, 0x26, 0xe2, 0x88, 0x61, 0x41, 0x42, 0xe6, 0x84, 0xb5, - 0xca, 0x26, 0x09, 0x79, 0x74, 0xc2, 0x3a, 0x5b, 0xdc, 0x85, 0xb0, 0xcb, - 0xca, 0x52, 0x9e, 0x2c, 0xd8, 0x4a, 0x16, 0xd3, 0xb1, 0x03, 0xcc, 0x92, - 0x56, 0x64, 0x4b, 0xa7, 0x25, 0x21, 0x13, 0xbb, 0xc2, 0x12, 0xfc, 0x98, - 0x13, 0xd4, 0x20, 0x92, 0x07, 0x36, 0xdb, 0x2f, 0x04, 0xac, 0x7e, 0xe6, - 0xa1, 0xcc, 0x3e, 0x05, 0xa0, 0xe8, 0xa7, 0x75, 0x2c, 0x02, 0x0c, 0x1c, - 0x19, 0x38, 0xb3, 0xa4, 0x4f, 0x70, 0x34, 0x9e, 0xf0, 0xcf, 0x2c, 0x94, - 0x59, 0xe5, 0xd6, 0xd8, 0xe8, 0x77, 0x8e, 0x70, 0x7a, 0x4d, 0x58, 0x83, - 0x7e, 0xab, 0x16, 0x7c, 0xd3, 0xa0, 0x66, 0x41, 0x94, 0xea, 0x8c, 0xee, - 0x35, 0xb7, 0x5e, 0x1d, 0x3d, 0xb3, 0x38, 0x25, 0x05, 0x69, 0x96, 0x10, - 0x01, 0x88, 0x2f, 0xeb, 0x2d, 0x79, 0xf9, 0x29, 0x90, 0x78, 0xd9, 0x2e, - 0x46, 0xf5, 0xe2, 0xdb, 0x97, 0x6f, 0x2d, 0x4a, 0xc8, 0x83, 0xbd, 0x9d, - 0xf3, 0x80, 0x1c, 0x83, 0xaa, 0xe7, 0x0c, 0xa4, 0x59, 0xcf, 0x22, 0xaa, - 0xf2, 0x32, 0xab, 0x2c, 0x88, 0x59, 0x3f, 0x02, 0xcc, 0x73, 0xf4, 0x7c, - 0x7a, 0xf9, 0xb9, 0xc8, 0xd7, 0xd3, 0xac, 0xd8, 0x90, 0x42, 0xd3, 0x0a, - 0x0c, 0x3a, 0x43, 0xa0, 0x5e, 0x1d, 0x97, 0x85, 0x36, 0x0b, 0x25, 0xac, - 0x0b, 0x93, 0x19, 0x75, 0xeb, 0x63, 0xe7, 0x4b, 0x96, 0xba, 0x59, 0x30, - 0x30, 0x3a, 0xc3, 0x07, 0x24, 0xc7, 0x70, 0x66, 0x65, 0x67, 0x4b, 0xd7, - 0x29, 0x9e, 0xf6, 0x03, 0x1e, 0xaf, 0x82, 0xcc, 0x34, 0x5d, 0x3c, 0x61, - 0xa7, 0x5c, 0x71, 0x9e, 0x6e, 0x82, 0x78, 0xa6, 0x4d, 0x1d, 0xcf, 0x1c, - 0xf8, 0xcd, 0x83, 0x44, 0x1e, 0x41, 0xf0, 0x88, 0x96, 0x21, 0x6e, 0x66, - 0xb9, 0x9a, 0x5d, 0xb2, 0x9e, 0x12, 0x34, 0x05, 0x99, 0xdc, 0xa0, 0x8e, - 0x41, 0xd5, 0x81, 0x71, 0xb9, 0x1d, 0x9b, 0x02, 0x97, 0x5b, 0xa4, 0x64, - 0x56, 0xe8, 0x47, 0xc6, 0x24, 0x08, 0xa6, 0xf6, 0x81, 0xbe, 0x93, 0x19, - 0xb9, 0xfd, 0x7c, 0xaa, 0x73, 0x9c, 0x66, 0xe9, 0xc4, 0x64, 0x11, 0xf5, - 0x26, 0x6e, 0x72, 0x4d, 0xa8, 0x9f, 0xa0, 0xe5, 0x3e, 0x93, 0x11, 0xa4, - 0xe7, 0x24, 0x98, 0x99, 0xee, 0x02, 0xea, 0x30, 0x3e, 0x58, 0x92, 0x30, - 0xbb, 0xd6, 0x31, 0x81, 0x58, 0x0c, 0x63, 0x55, 0x7f, 0x5b, 0xd9, 0xff, - 0x6d, 0x05, 0x55, 0xc6, 0xe9, 0x38, 0x1a, 0x4d, 0x52, 0x5e, 0x4f, 0x72, - 0x96, 0x46, 0x8e, 0xc4, 0x31, 0x95, 0xd3, 0x09, 0x19, 0x40, 0xb6, 0xa0, - 0x3a, 0x4f, 0x26, 0x64, 0x21, 0xd2, 0x03, 0x22, 0x25, 0x25, 0x46, 0xf6, - 0xb2, 0x81, 0xd0, 0xa0, 0x98, 0xcb, 0x09, 0xd5, 0x4f, 0x7c, 0x36, 0x3b, - 0xc9, 0xe9, 0x55, 0x45, 0x02, 0x5d, 0x29, 0x60, 0xcf, 0x2d, 0x75, 0x10, - 0xdf, 0x08, 0x74, 0x5c, 0x24, 0x8c, 0xc2, 0xbb, 0xf5, 0x11, 0xd1, 0x59, - 0x07, 0xbe, 0x87, 0xc9, 0xc8, 0x12, 0x1f, 0xd1, 0x73, 0x60, 0x8f, 0x63, - 0xc0, 0x32, 0x2f, 0xf1, 0x97, 0x00, 0xa0, 0xb1, 0xd3, 0x9f, 0x03, 0x7e, - 0x71, 0xb6, 0xcc, 0x57, 0xfc, 0x19, 0x34, 0x27, 0x46, 0xea, 0x10, 0x52, - 0x0c, 0xd2, 0xc9, 0x01, 0xb7, 0xb9, 0xdc, 0x4f, 0x3c, 0x15, 0x18, 0x55, - 0x26, 0x02, 0x72, 0x1e, 0xe0, 0xd7, 0xa8, 0x69, 0xbd, 0x10, 0x83, 0x60, - 0xe1, 0x9c, 0x5a, 0x30, 0x2b, 0x19, 0x36, 0xac, 0x53, 0xcf, 0x9f, 0x5b, - 0xfe, 0x2c, 0x7e, 0x86, 0x26, 0x72, 0xb9, 0x40, 0x94, 0xfb, 0x8e, 0xfc, - 0x8d, 0xe6, 0x18, 0x89, 0xbb, 0xf0, 0x71, 0x32, 0x8e, 0xe3, 0x4b, 0xba, - 0x12, 0xca, 0x75, 0xf1, 0x24, 0xbc, 0x3b, 0xa5, 0xa9, 0xc6, 0xd6, 0xe4, - 0x28, 0x1b, 0x9a, 0x16, 0x58, 0xe2, 0x37, 0xfe, 0xcc, 0xb5, 0xed, 0x60, - 0x89, 0xdb, 0xf8, 0x9c, 0x56, 0x7e, 0x07, 0xce, 0xef, 0x25, 0xf7, 0x58, - 0x6d, 0xf3, 0xb4, 0xef, 0x28, 0xb4, 0xeb, 0xa8, 0x9a, 0x4a, 0xb7, 0xc2, - 0x1d, 0xd4, 0x50, 0x24, 0x98, 0x29, 0x71, 0x1c, 0x51, 0x8b, 0x70, 0x38, - 0x5d, 0x9c, 0x2d, 0xf5, 0x1e, 0x0f, 0x71, 0xb9, 0xcb, 0x02, 0x3d, 0x00, - 0x35, 0xc2, 0xc2, 0xc2, 0x70, 0x0a, 0x72, 0x42, 0x84, 0xb8, 0x46, 0x61, - 0x42, 0xac, 0xa1, 0x0a, 0xd0, 0x5b, 0x9e, 0x23, 0x36, 0xd3, 0x0e, 0xe2, - 0x99, 0x08, 0x4e, 0x23, 0xd6, 0xea, 0x42, 0xf7, 0xd0, 0xe8, 0x28, 0xdd, - 0x4f, 0x33, 0xb6, 0xa3, 0xd0, 0x17, 0x08, 0x10, 0xfa, 0xfd, 0xa9, 0xf1, - 0x0e, 0xbf, 0xf8, 0x36, 0x68, 0x4b, 0xf7, 0x10, 0x17, 0x84, 0x69, 0x07, - 0x31, 0xef, 0x18, 0x72, 0x93, 0x88, 0x45, 0x91, 0x63, 0xe8, 0xfb, 0x25, - 0x9e, 0xa1, 0x5f, 0xe2, 0x19, 0xda, 0x8b, 0xb3, 0x42, 0xd7, 0xd0, 0x89, - 0xca, 0x1d, 0xc3, 0x17, 0x40, 0x4a, 0x4e, 0xdd, 0x8c, 0x9c, 0xba, 0xa9, - 0x3f, 0x01, 0xef, 0xa3, 0x72, 0x6f, 0x30, 0x5b, 0xc0, 0xb5, 0xb9, 0xc0, - 0x6a, 0x5e, 0xe0, 0x6c, 0x75, 0x2f, 0x90, 0xd4, 0xeb, 0xbd, 0x6d, 0xbb, - 0x9b, 0x74, 0x02, 0x85, 0xb7, 0xaa, 0x0f, 0x38, 0x91, 0xad, 0x0f, 0x01, - 0x78, 0xb6, 0x3d, 0x5b, 0xc1, 0x13, 0x3c, 0xb3, 0xa1, 0x7b, 0x67, 0xfe, - 0x72, 0x5f, 0x10, 0x5e, 0x20, 0xcb, 0xf5, 0x6b, 0x7c, 0xbc, 0x15, 0xbc, - 0xc5, 0xac, 0x1b, 0xe8, 0xe3, 0x59, 0xfc, 0x2f, 0x78, 0x81, 0xa4, 0x33, - 0x73, 0x1b, 0x3d, 0xdb, 0xb6, 0x4e, 0xa9, 0x47, 0x09, 0xaf, 0xd4, 0x0d, - 0x3c, 0x74, 0x27, 0x62, 0x06, 0x3d, 0x5e, 0xe2, 0x09, 0x9e, 0x86, 0xe5, - 0xae, 0xe0, 0x21, 0x5a, 0x53, 0x04, 0x70, 0x06, 0xcb, 0x7d, 0xc1, 0x9f, - 0x61, 0xa4, 0xc2, 0x42, 0xe9, 0x12, 0x5f, 0xf0, 0x85, 0x38, 0xc5, 0x14, - 0x12, 0x23, 0x18, 0x81, 0x5e, 0xef, 0x09, 0x52, 0xed, 0xd8, 0x50, 0x58, - 0xa7, 0x8e, 0xf8, 0xb2, 0xc4, 0x19, 0x3c, 0x15, 0x6e, 0xa1, 0x33, 0xe8, - 0x5c, 0xef, 0x0b, 0xbe, 0xfd, 0x8c, 0x5a, 0xa1, 0x2b, 0x86, 0x82, 0x93, - 0x84, 0xb7, 0xc4, 0x15, 0xa4, 0x2f, 0x8b, 0xfd, 0x41, 0x1a, 0x7d, 0xaf, - 0xf5, 0x05, 0x51, 0x87, 0x84, 0x89, 0xa5, 0x91, 0x64, 0xe1, 0x1a, 0x47, - 0x70, 0x22, 0x60, 0xcb, 0x05, 0x2d, 0xa3, 0x2e, 0xf5, 0x04, 0x53, 0xa3, - 0xab, 0x3f, 0x07, 0x21, 0xdb, 0x2b, 0x72, 0x08, 0x33, 0x70, 0xc0, 0x4e, - 0x76, 0x2a, 0x07, 0x9a, 0x1f, 0xf3, 0xa6, 0x22, 0xd2, 0x78, 0x73, 0xc3, - 0xdc, 0x4a, 0x7e, 0xa1, 0xd4, 0xbf, 0x8c, 0x67, 0x38, 0x12, 0xa5, 0x9e, - 0xe1, 0x33, 0xb1, 0x88, 0xc2, 0xe1, 0x1d, 0x2f, 0x1d, 0x92, 0x5b, 0xb0, - 0xb8, 0xc6, 0x2d, 0xc4, 0x12, 0x31, 0x9a, 0xd1, 0x8b, 0xca, 0x1c, 0xc2, - 0x0f, 0x0e, 0xf9, 0xb0, 0xc6, 0xc3, 0xb8, 0xc6, 0x23, 0xf4, 0xa0, 0xd7, - 0x1e, 0x0f, 0xb8, 0x33, 0x27, 0xe9, 0x0b, 0x26, 0x5c, 0x14, 0xeb, 0x27, - 0x08, 0x0c, 0xb5, 0x44, 0xb8, 0xdc, 0x3b, 0x9c, 0xd9, 0x2e, 0x2f, 0xfb, - 0x2e, 0x80, 0xab, 0x69, 0x3d, 0x11, 0xde, 0x22, 0xfa, 0x22, 0xac, 0x0f, - 0x2f, 0x8f, 0x9e, 0x1d, 0xbd, 0xb3, 0x7e, 0x79, 0xf4, 0xee, 0xc9, 0xcb, - 0x37, 0xcf, 0x8e, 0xde, 0xd4, 0xad, 0xc5, 0x8c, 0x50, 0x79, 0xfe, 0x70, - 0x4a, 0x25, 0xbe, 0x2c, 0xb8, 0xf5, 0x9c, 0xa5, 0x8e, 0xe1, 0x2b, 0x32, - 0x59, 0x78, 0x70, 0xee, 0x6a, 0x75, 0x4f, 0xa9, 0x6e, 0x4c, 0xeb, 0xc8, - 0x91, 0x7a, 0xb9, 0x20, 0xbd, 0xbc, 0x2b, 0xa2, 0x6a, 0xb8, 0x35, 0x3e, - 0x3c, 0xa4, 0xb5, 0xd2, 0x82, 0xe2, 0x73, 0x11, 0x44, 0xce, 0xa4, 0x74, - 0x45, 0x91, 0x21, 0xa6, 0x2e, 0x74, 0x60, 0x20, 0x9c, 0x99, 0xf5, 0x8a, - 0xbd, 0x43, 0x52, 0x89, 0x43, 0xbd, 0xb2, 0x18, 0x36, 0x48, 0x98, 0x75, - 0x74, 0x24, 0xbc, 0xbf, 0x58, 0x36, 0x85, 0x69, 0xbc, 0x3b, 0x71, 0x84, - 0x45, 0x92, 0xb1, 0x25, 0x2b, 0x8c, 0x8b, 0x65, 0x3e, 0xe2, 0x07, 0xa8, - 0x3d, 0x46, 0x18, 0x6c, 0x5a, 0x60, 0x18, 0x84, 0x42, 0xe0, 0x56, 0xc1, - 0x05, 0x4f, 0x10, 0xc1, 0x73, 0x1d, 0x7c, 0x61, 0xe1, 0x2b, 0x3a, 0xc3, - 0x49, 0x7a, 0x74, 0x53, 0x47, 0x8c, 0x61, 0xaa, 0xe0, 0x66, 0x8d, 0x49, - 0x7f, 0x9f, 0x70, 0x3d, 0x21, 0x86, 0x53, 0xa1, 0x10, 0xd0, 0xdd, 0x65, - 0x75, 0x7c, 0x85, 0x61, 0xca, 0x9d, 0x54, 0x3d, 0xc1, 0x99, 0xe5, 0x3d, - 0x49, 0x6b, 0xbc, 0xf0, 0x4e, 0x49, 0x78, 0x0e, 0xa4, 0xaf, 0x51, 0x7a, - 0x62, 0x3a, 0x53, 0x28, 0x71, 0xe3, 0x2e, 0x7e, 0xd9, 0xa7, 0xd1, 0x02, - 0x7a, 0x83, 0x5f, 0x4f, 0x94, 0x7b, 0x79, 0x86, 0xbc, 0x2f, 0xcd, 0x27, - 0xcd, 0xfc, 0x02, 0xe4, 0x48, 0x2c, 0x59, 0x82, 0x7c, 0x6e, 0x07, 0x03, - 0x51, 0xe4, 0x69, 0x46, 0xc5, 0x8e, 0xe6, 0x3f, 0xff, 0x5e, 0xe6, 0x68, - 0x16, 0xfa, 0x99, 0xc2, 0xf9, 0xe7, 0x9f, 0xcb, 0x3d, 0xcd, 0xc3, 0xd3, - 0x2f, 0x82, 0x7c, 0x8d, 0x00, 0xeb, 0xb3, 0x54, 0x2f, 0xeb, 0x0d, 0x3b, - 0x3b, 0x1e, 0xe8, 0xfd, 0xf3, 0x6f, 0xff, 0xfc, 0xb3, 0x08, 0xca, 0x9c, - 0xce, 0x65, 0x65, 0x4f, 0x5d, 0x7a, 0x0c, 0x56, 0x71, 0x3f, 0x57, 0x5b, - 0x84, 0x9c, 0x07, 0x36, 0xb4, 0x15, 0xaf, 0x6a, 0x0e, 0xcf, 0xfe, 0xf9, - 0x97, 0x29, 0x64, 0xbe, 0x49, 0x17, 0x74, 0xf1, 0xef, 0x5f, 0x87, 0x3c, - 0xf4, 0xbe, 0xd8, 0x53, 0x77, 0xb9, 0x6b, 0xf9, 0x4e, 0x38, 0xe8, 0x1c, - 0x63, 0x1f, 0x5e, 0xd4, 0xcd, 0x5d, 0xd5, 0xe2, 0xe5, 0x48, 0xe1, 0x25, - 0x44, 0x7f, 0x2b, 0x4e, 0xe9, 0x0b, 0xf2, 0x2d, 0xce, 0x9a, 0xab, 0xb8, - 0xa5, 0x3f, 0x83, 0x5b, 0xda, 0x5c, 0xc9, 0x23, 0x7d, 0xc1, 0x2a, 0xbb, - 0xd4, 0x29, 0x7d, 0x19, 0xaf, 0x49, 0x52, 0xaf, 0x4b, 0xd5, 0x6b, 0xe9, - 0xf2, 0xa4, 0x7d, 0xb3, 0xe5, 0xc9, 0x9f, 0xf0, 0x1a, 0xe8, 0x64, 0xc9, - 0xf2, 0xe4, 0x7b, 0xdc, 0x82, 0x7f, 0x8d, 0x47, 0xca, 0xfc, 0xc1, 0x02, - 0x31, 0xe8, 0x32, 0x9f, 0x94, 0xaa, 0x74, 0x66, 0x03, 0xf6, 0x62, 0x9e, - 0xa9, 0x57, 0xde, 0x27, 0xfd, 0x59, 0x20, 0x9c, 0xb0, 0xc8, 0x25, 0x7d, - 0x67, 0x8f, 0xae, 0xf3, 0x48, 0xff, 0xf9, 0xa7, 0x41, 0xc2, 0x25, 0x85, - 0xb7, 0x7c, 0xad, 0x47, 0x0a, 0x6b, 0xfa, 0xd9, 0x59, 0xea, 0x92, 0xe2, - 0x7d, 0xfb, 0x11, 0x00, 0xae, 0x59, 0x9b, 0xd4, 0x0e, 0xd1, 0x32, 0x87, - 0x34, 0x33, 0xa2, 0xe3, 0x3c, 0xa8, 0x03, 0xdb, 0x11, 0x14, 0xfa, 0xa4, - 0x29, 0x50, 0x60, 0xd7, 0xc0, 0xd1, 0xbd, 0x2c, 0x74, 0xe1, 0x78, 0x7b, - 0xac, 0xc0, 0x79, 0xcc, 0x4d, 0xd3, 0x2d, 0x1b, 0x71, 0x57, 0x58, 0xc9, - 0xc4, 0x22, 0xc7, 0x4f, 0xf4, 0x4a, 0xa6, 0x7c, 0x77, 0x02, 0x36, 0xfe, - 0xe5, 0x0e, 0xb8, 0x09, 0x46, 0x36, 0x7b, 0xe0, 0x2f, 0xde, 0x3d, 0x41, - 0x49, 0x7c, 0x6a, 0xb4, 0x2f, 0x9e, 0xbc, 0x43, 0x02, 0x3e, 0x75, 0x02, - 0xda, 0x40, 0xb6, 0x44, 0x9c, 0xf0, 0xe4, 0x05, 0x12, 0xf0, 0xa9, 0x13, - 0x9e, 0xbc, 0xa3, 0x04, 0x7c, 0xc6, 0x09, 0x2f, 0x08, 0x07, 0x3e, 0x75, - 0xc2, 0x07, 0x49, 0x86, 0xbe, 0xe2, 0x24, 0x49, 0x88, 0xbe, 0xe2, 0x24, - 0x49, 0x8a, 0xbe, 0xe2, 0x24, 0x49, 0x8c, 0xbe, 0xe2, 0x24, 0x49, 0x0e, - 0x5f, 0x26, 0x49, 0x12, 0xa4, 0xaf, 0xb8, 0x1a, 0x1f, 0x98, 0x22, 0x7d, - 0x99, 0x24, 0x59, 0xb5, 0x0f, 0x89, 0xba, 0x7d, 0x60, 0x8a, 0xf4, 0x15, - 0xf3, 0xfe, 0x81, 0xd1, 0xd3, 0x97, 0x49, 0x92, 0xf5, 0xf9, 0x90, 0x40, - 0xff, 0xee, 0x03, 0x15, 0xa4, 0x2f, 0x23, 0xb8, 0x0f, 0x04, 0x45, 0x5f, - 0x46, 0x74, 0x0c, 0x45, 0x5f, 0x46, 0x78, 0x1f, 0xa4, 0xf4, 0x3e, 0x24, - 0xc4, 0xc7, 0x49, 0xf4, 0x65, 0x04, 0xc8, 0xb8, 0xe8, 0xcb, 0x50, 0xe4, - 0x1e, 0x41, 0x5f, 0x39, 0x8a, 0xc5, 0x50, 0xa6, 0xb9, 0x28, 0x89, 0xbe, - 0x0c, 0x45, 0x4e, 0xc2, 0x57, 0x61, 0x52, 0x5a, 0x67, 0x4c, 0x5c, 0xb3, - 0xd1, 0x9a, 0x56, 0x0f, 0x1f, 0x95, 0x37, 0x6f, 0xdf, 0xbd, 0x3e, 0x7c, - 0xa5, 0x31, 0xb4, 0x3b, 0x7b, 0x44, 0xe6, 0x08, 0x1e, 0xfc, 0xf1, 0x51, - 0x16, 0x87, 0x89, 0x33, 0x56, 0x48, 0x24, 0x16, 0xc2, 0xf1, 0xe6, 0x28, - 0xc6, 0xb0, 0x8b, 0x04, 0xb2, 0xf3, 0x27, 0xbf, 0x7a, 0x7e, 0x78, 0xfc, - 0x5e, 0x27, 0x77, 0x3b, 0x3a, 0x39, 0x99, 0xba, 0xbd, 0xa7, 0x53, 0x5f, - 0x1f, 0x3d, 0x7b, 0xf9, 0x8b, 0xd7, 0x3a, 0x7d, 0x77, 0x5b, 0xa7, 0x1f, - 0xbf, 0x7a, 0x1b, 0x57, 0x6f, 0xaf, 0x15, 0xa3, 0x4e, 0x26, 0x3f, 0x32, - 0x14, 0x93, 0xe9, 0xed, 0x76, 0x4c, 0xf2, 0xc5, 0xab, 0xc3, 0xa7, 0x2f, - 0x0f, 0x5f, 0xc5, 0xf5, 0x31, 0x35, 0x32, 0x31, 0xc8, 0xb2, 0x4a, 0xa6, - 0x46, 0x16, 0x0f, 0x41, 0x31, 0x69, 0xa4, 0x71, 0x42, 0x56, 0x26, 0x26, - 0x1e, 0x38, 0x8d, 0x00, 0xe3, 0x12, 0x98, 0x87, 0x64, 0x63, 0xd1, 0x76, - 0x64, 0x6a, 0xb6, 0xaa, 0xdb, 0x3a, 0xf9, 0xd5, 0xe1, 0xbb, 0x17, 0x47, - 0xb1, 0x00, 0x74, 0xea, 0xaf, 0x64, 0xb2, 0xe1, 0x9c, 0x02, 0x7a, 0xee, - 0x51, 0x44, 0x8c, 0x99, 0x06, 0xd2, 0x65, 0x76, 0x71, 0x70, 0x42, 0xb5, - 0xe1, 0x38, 0x63, 0xd1, 0x9c, 0x61, 0xc3, 0xe4, 0xf7, 0x61, 0x8d, 0x01, - 0x0b, 0x22, 0xd9, 0xe6, 0x58, 0x45, 0xa6, 0xa0, 0xaf, 0xad, 0x62, 0x24, - 0x89, 0x88, 0x9b, 0x77, 0x09, 0x00, 0xf8, 0x6c, 0xc7, 0x9c, 0xdf, 0x87, - 0x7b, 0xcc, 0xcb, 0x44, 0xd5, 0xda, 0x65, 0x85, 0xf6, 0xe2, 0x69, 0xb6, - 0x80, 0xd0, 0x95, 0x7d, 0x2a, 0x21, 0x4c, 0x6e, 0x54, 0xf7, 0x6a, 0x97, - 0x81, 0x88, 0x16, 0x81, 0x57, 0x15, 0xfd, 0xb7, 0x03, 0xb2, 0x73, 0x4d, - 0xcc, 0x1f, 0x60, 0xe4, 0x22, 0x9f, 0x42, 0xd5, 0xde, 0x8e, 0xff, 0xf8, - 0xc7, 0xcb, 0x93, 0x93, 0x39, 0x3d, 0x9f, 0x9c, 0xf4, 0x3e, 0x7e, 0xba, - 0x22, 0x0b, 0x4a, 0x37, 0x0d, 0x63, 0x6d, 0xf6, 0x90, 0x2e, 0x98, 0x7c, - 0xf0, 0x20, 0xc6, 0x26, 0xea, 0x51, 0xed, 0x52, 0x34, 0x63, 0xf0, 0x7e, - 0x74, 0xf5, 0xc7, 0x3f, 0xa6, 0x73, 0xc7, 0xb8, 0x08, 0x8b, 0x78, 0xf0, - 0xf8, 0x52, 0xf2, 0x5a, 0xd4, 0x9c, 0xda, 0xe1, 0xdb, 0x33, 0x0f, 0xf4, - 0xe6, 0x30, 0xe9, 0x17, 0x55, 0xaf, 0xf6, 0xe0, 0x41, 0x55, 0x7c, 0xf4, - 0x3e, 0xf5, 0x23, 0x7c, 0xd4, 0xae, 0x6a, 0xcc, 0xe2, 0xd5, 0xbe, 0xc2, - 0x82, 0x32, 0x92, 0xe7, 0xf8, 0xd9, 0x47, 0x0d, 0x29, 0xc0, 0xa1, 0x09, - 0x29, 0xa0, 0x92, 0x0b, 0x34, 0x77, 0x00, 0xba, 0x82, 0xc1, 0xea, 0x51, - 0x93, 0x59, 0x51, 0xd7, 0x4e, 0xe3, 0xa2, 0xcb, 0x7e, 0xdf, 0xfb, 0x46, - 0x55, 0x73, 0xc8, 0x0e, 0x36, 0x28, 0xf6, 0xaa, 0x7e, 0x12, 0xcc, 0xfc, - 0xae, 0xe3, 0x02, 0x35, 0xcb, 0xaf, 0x5d, 0x31, 0xc3, 0x46, 0x68, 0x5a, - 0x62, 0x56, 0xb2, 0x6a, 0x8a, 0x0b, 0x15, 0x56, 0x18, 0xd5, 0xf9, 0x89, - 0x11, 0x8a, 0xab, 0xab, 0x6a, 0xad, 0xee, 0xf7, 0x0d, 0x74, 0x82, 0x7d, - 0xd5, 0x04, 0x44, 0xc1, 0xef, 0x8b, 0xe6, 0x10, 0xef, 0xbf, 0xab, 0x52, - 0xd1, 0x7a, 0x85, 0xe7, 0x68, 0x15, 0x64, 0xfe, 0xf1, 0x8f, 0x94, 0xb0, - 0xaf, 0x68, 0xfa, 0x4d, 0xb5, 0x1a, 0xdc, 0x8f, 0xf4, 0xaf, 0xba, 0xdf, - 0x64, 0x60, 0x50, 0xf5, 0xaf, 0x14, 0x58, 0x54, 0xf5, 0xea, 0xa2, 0x56, - 0xf7, 0xae, 0x50, 0xbf, 0x7a, 0xb0, 0x84, 0x76, 0xdd, 0x07, 0x75, 0x1f, - 0x41, 0xb1, 0x2d, 0xc8, 0x26, 0x82, 0xf0, 0xa3, 0x7e, 0x5b, 0x74, 0x6b, - 0xf5, 0x38, 0xcd, 0x43, 0x1a, 0x82, 0x0e, 0x2b, 0x35, 0xd6, 0x9d, 0x20, - 0xcd, 0xe4, 0xd0, 0xf5, 0x43, 0xcc, 0x8b, 0xfc, 0x0c, 0x93, 0x41, 0x13, - 0x13, 0xbf, 0xa7, 0xd8, 0x1f, 0xf4, 0xfa, 0xf7, 0x5a, 0xf5, 0x00, 0x6d, - 0x33, 0x02, 0xbf, 0xf8, 0x01, 0x91, 0x87, 0xbe, 0xd7, 0xf7, 0xea, 0x41, - 0x21, 0xa3, 0x4e, 0x52, 0xc8, 0xce, 0xb8, 0x0a, 0xbf, 0x9e, 0x23, 0xe2, - 0xb0, 0x39, 0x79, 0xaf, 0x0f, 0x61, 0x92, 0xd2, 0xc5, 0x3a, 0x5e, 0x93, - 0x18, 0x4c, 0xc2, 0x55, 0x3d, 0xec, 0x5f, 0xe2, 0x30, 0x8d, 0xea, 0x11, - 0x8c, 0xe7, 0x99, 0xa0, 0x53, 0xc8, 0x6d, 0xb1, 0x5d, 0x47, 0x87, 0x2b, - 0xca, 0xe8, 0xfe, 0x70, 0x5b, 0x74, 0x7f, 0xf0, 0xda, 0x8e, 0xa6, 0x4d, - 0xb8, 0x51, 0x23, 0x7f, 0x56, 0xad, 0x11, 0xe8, 0x2f, 0xe6, 0x14, 0x86, - 0xd5, 0xdb, 0x11, 0xdd, 0x7a, 0x90, 0x2d, 0xf5, 0x02, 0x73, 0xc9, 0xe7, - 0x36, 0x29, 0x5a, 0xaf, 0xdd, 0xec, 0xd6, 0x4d, 0xee, 0x7b, 0x14, 0xc1, - 0x8a, 0x58, 0x6f, 0x1b, 0xa5, 0x98, 0x8f, 0x28, 0xa0, 0x15, 0xe2, 0xf6, - 0x56, 0xab, 0x3e, 0x12, 0x83, 0xc5, 0xa4, 0x77, 0xaf, 0x7d, 0xb5, 0x9f, - 0xd5, 0x9d, 0x44, 0x83, 0x08, 0x28, 0x12, 0xab, 0x43, 0x46, 0xf8, 0x97, - 0x57, 0x52, 0xf8, 0x7e, 0x9f, 0x85, 0xcc, 0xaa, 0x75, 0xe2, 0x3a, 0xe4, - 0x95, 0x8a, 0x00, 0x75, 0xe6, 0xd6, 0x47, 0xdf, 0xac, 0x2b, 0x85, 0xa0, - 0x9f, 0x14, 0x6d, 0x4a, 0xdf, 0xdc, 0x42, 0xd4, 0x6f, 0xeb, 0xb2, 0x18, - 0xc8, 0x07, 0x17, 0x3c, 0x7b, 0x41, 0x8c, 0xa6, 0x4a, 0x0b, 0xa7, 0x14, - 0xb6, 0x16, 0x4b, 0x07, 0x6d, 0xa6, 0x32, 0x54, 0xc2, 0x2b, 0x88, 0xb7, - 0x7f, 0x4f, 0x43, 0x0f, 0xb0, 0x50, 0x17, 0x5c, 0xbc, 0x97, 0x71, 0xac, - 0xae, 0x3f, 0xa8, 0xa8, 0x74, 0xa6, 0xf4, 0x14, 0xba, 0x21, 0x46, 0x06, - 0x58, 0x71, 0xf4, 0xf3, 0x85, 0x40, 0xec, 0xf9, 0xc7, 0x4f, 0x32, 0xd5, - 0xf7, 0x18, 0xb6, 0x2f, 0xab, 0xa9, 0xd3, 0xb8, 0x16, 0x99, 0x34, 0x55, - 0x3c, 0x93, 0x4a, 0x75, 0x4b, 0x25, 0x9d, 0x4c, 0xd1, 0x74, 0xae, 0x78, - 0x8b, 0xf4, 0x94, 0xaa, 0xfb, 0xcd, 0x13, 0x16, 0x7c, 0xb5, 0x42, 0x45, - 0x2c, 0xbe, 0x81, 0x4f, 0x29, 0x72, 0xd4, 0x47, 0xa6, 0x2f, 0xa7, 0x52, - 0xcd, 0xb8, 0xc1, 0xeb, 0xc0, 0x1b, 0x77, 0x86, 0x6f, 0x12, 0x19, 0xbd, - 0x68, 0x7f, 0x08, 0x7d, 0x0e, 0x54, 0x13, 0x57, 0xfd, 0x58, 0x38, 0x2a, - 0xa5, 0x56, 0x47, 0xd2, 0x82, 0x61, 0x55, 0x4a, 0x1f, 0x76, 0x54, 0x83, - 0xe7, 0x6d, 0x07, 0xa0, 0x71, 0x83, 0x2f, 0xe6, 0xe6, 0x60, 0x1a, 0xc9, - 0x57, 0x75, 0x8f, 0x31, 0x9c, 0x85, 0xcd, 0x84, 0x7c, 0x91, 0x60, 0x9e, - 0x90, 0x9d, 0x12, 0x67, 0x13, 0xb6, 0xf4, 0x08, 0x73, 0x6e, 0x83, 0x5c, - 0xc4, 0xd8, 0x25, 0xa6, 0x10, 0x77, 0xcb, 0x21, 0xf1, 0x0a, 0x98, 0xf3, - 0x2d, 0xe1, 0x2b, 0x41, 0x3e, 0x78, 0xa0, 0x7e, 0x51, 0x79, 0xa4, 0x1a, - 0xc5, 0x6a, 0x52, 0x62, 0x9e, 0x4a, 0x94, 0xa4, 0x42, 0xb6, 0xe0, 0x88, - 0xc4, 0xfa, 0x4a, 0x95, 0x22, 0x15, 0x06, 0xc5, 0xab, 0x54, 0xc3, 0xa8, - 0x15, 0x84, 0x92, 0xb6, 0x51, 0x9c, 0xe9, 0xe6, 0x61, 0xce, 0x54, 0x1a, - 0x98, 0x33, 0x0f, 0x39, 0xfe, 0x54, 0xfa, 0xad, 0xb0, 0xc8, 0x73, 0x87, - 0x12, 0x06, 0x59, 0x33, 0x15, 0x7b, 0x75, 0xa1, 0xc8, 0x4a, 0x66, 0xcc, - 0x6a, 0x70, 0x55, 0x29, 0x64, 0xe5, 0xfd, 0xcb, 0xd7, 0x47, 0x6f, 0x7f, - 0xf1, 0xbe, 0x02, 0x15, 0x8a, 0x61, 0xbf, 0xa9, 0x44, 0x52, 0x13, 0x2a, - 0x3d, 0x09, 0x26, 0x6b, 0xc9, 0x88, 0x1f, 0x3c, 0x88, 0x7f, 0x72, 0x0d, - 0x0d, 0xd9, 0x73, 0x31, 0xb4, 0x24, 0xed, 0xb8, 0xce, 0x95, 0x8c, 0x08, - 0x38, 0xfb, 0x86, 0x02, 0x20, 0x4c, 0x9a, 0xf9, 0x8c, 0x34, 0x9e, 0xa2, - 0x7f, 0x96, 0x35, 0x17, 0xf5, 0xdd, 0x64, 0x63, 0x9d, 0x24, 0x3b, 0x46, - 0x48, 0x43, 0x5d, 0xce, 0xa2, 0xa0, 0x8a, 0x86, 0x94, 0xac, 0x3a, 0x63, - 0x41, 0xba, 0xfa, 0x99, 0x6f, 0x5c, 0x4a, 0xfd, 0xda, 0xa6, 0x5d, 0x04, - 0x6e, 0x5f, 0xa8, 0xdf, 0x3c, 0xaa, 0x63, 0xde, 0x1e, 0xaa, 0xc1, 0x39, - 0xee, 0xfd, 0x7d, 0x4f, 0x3d, 0x1b, 0x59, 0x28, 0x0a, 0xca, 0x51, 0x90, - 0x43, 0x90, 0x76, 0x51, 0x40, 0xa2, 0xa2, 0x42, 0x71, 0x5f, 0xbe, 0xc1, - 0x5c, 0xe2, 0x12, 0xe3, 0x7d, 0x2f, 0xdf, 0xbf, 0x5b, 0x57, 0x75, 0xac, - 0xb9, 0x63, 0xa9, 0x8d, 0x26, 0xda, 0x3d, 0x58, 0x54, 0x60, 0x1f, 0x3b, - 0x93, 0x85, 0x7e, 0x86, 0xf8, 0x4b, 0xd1, 0xbf, 0xfd, 0xf6, 0xe8, 0x4d, - 0x29, 0xe2, 0xf6, 0x57, 0x20, 0x7e, 0xfa, 0xea, 0xed, 0xf1, 0x32, 0xa6, - 0x3b, 0x5f, 0x89, 0xfb, 0xe8, 0x59, 0x29, 0xea, 0xee, 0x8d, 0x51, 0xc7, - 0xfe, 0xd8, 0x6a, 0x82, 0x17, 0x4d, 0x03, 0x74, 0x2b, 0x34, 0xa9, 0x35, - 0x96, 0x50, 0xa3, 0xec, 0x5b, 0xa1, 0xa3, 0x1a, 0x67, 0x09, 0x29, 0x82, - 0xb8, 0xad, 0x5a, 0xc9, 0xe6, 0x5a, 0x42, 0x4c, 0x02, 0xdc, 0x0a, 0x2d, - 0x33, 0x86, 0x95, 0xd2, 0x93, 0x3d, 0xf0, 0x2c, 0xfc, 0x86, 0x7e, 0x64, - 0x86, 0xc1, 0x5e, 0xd6, 0xef, 0x80, 0xa3, 0xc7, 0x48, 0x8c, 0x75, 0xca, - 0x42, 0xa0, 0xd7, 0x6b, 0x44, 0xe4, 0xd2, 0x1a, 0x9c, 0x06, 0xa0, 0x76, - 0x2b, 0x55, 0x33, 0xee, 0x54, 0x69, 0xd5, 0xd8, 0xb7, 0x84, 0x3b, 0x58, - 0xcd, 0x3a, 0x60, 0xf5, 0xd6, 0xed, 0xf0, 0x30, 0x58, 0x60, 0x89, 0x0f, - 0x1b, 0x12, 0x87, 0xb3, 0xa5, 0x7c, 0xe4, 0x1d, 0xb2, 0x26, 0x0a, 0x2d, - 0x86, 0xa2, 0x9a, 0x9c, 0xc7, 0x68, 0xf0, 0x8a, 0xdc, 0x5f, 0xaa, 0xf4, - 0xb5, 0xdf, 0x1d, 0x7d, 0x23, 0x7e, 0x88, 0x39, 0x07, 0x56, 0x2b, 0x27, - 0x38, 0x1f, 0x17, 0x59, 0x89, 0x79, 0xe0, 0x13, 0x78, 0x81, 0x32, 0x97, - 0xef, 0xa2, 0xe1, 0x5f, 0x83, 0x8b, 0x48, 0xbc, 0x62, 0xd8, 0xba, 0xb8, - 0x42, 0x4d, 0x7f, 0x58, 0xcd, 0x37, 0x71, 0x9a, 0xf1, 0xde, 0x2d, 0x89, - 0x43, 0x9c, 0x63, 0x28, 0x08, 0xc9, 0xb2, 0xaf, 0xa1, 0x6d, 0xa6, 0x50, - 0xaf, 0x52, 0xb9, 0x15, 0x36, 0xf4, 0x78, 0xb3, 0x06, 0x13, 0xba, 0xc8, - 0x6d, 0xb1, 0x10, 0xd0, 0x0e, 0xe5, 0x31, 0x5e, 0x9b, 0xbb, 0x4e, 0xbf, - 0x33, 0x85, 0x7a, 0xb7, 0x6e, 0x4a, 0x17, 0xc1, 0x3a, 0xe2, 0x58, 0x04, - 0xab, 0x49, 0x22, 0x41, 0xa2, 0x29, 0x27, 0x16, 0x29, 0x85, 0x36, 0xb3, - 0x29, 0x41, 0x6b, 0x0b, 0x3c, 0xbd, 0x2d, 0x9a, 0xb2, 0xb4, 0x8a, 0x67, - 0x43, 0x7a, 0x2e, 0x93, 0xf7, 0x73, 0x96, 0xc9, 0x0e, 0x47, 0xe0, 0x28, - 0x55, 0x59, 0x51, 0x03, 0xc1, 0x14, 0x99, 0x2d, 0xb6, 0x6a, 0x69, 0xa7, - 0xaa, 0x87, 0x37, 0x47, 0x30, 0x0a, 0x8b, 0x1f, 0x47, 0x95, 0x22, 0x20, - 0x1c, 0x27, 0xf8, 0x03, 0x75, 0xde, 0x11, 0x1d, 0xe0, 0xc6, 0x8e, 0x5d, - 0xdc, 0x11, 0x2b, 0xb5, 0xab, 0x94, 0x28, 0xe2, 0x79, 0x6b, 0x46, 0x1c, - 0xcb, 0xe7, 0x7c, 0xf9, 0x69, 0x5c, 0x7e, 0xd6, 0x68, 0x4c, 0xeb, 0xf5, - 0x35, 0x57, 0xdd, 0xde, 0xf8, 0xc9, 0xcc, 0x44, 0xd6, 0xe3, 0x92, 0x15, - 0x35, 0x09, 0xe9, 0xaa, 0xf0, 0x44, 0x26, 0xe5, 0x8d, 0x2e, 0xe5, 0xa0, - 0x2f, 0x39, 0xe0, 0x91, 0x99, 0xe9, 0x1b, 0x09, 0x12, 0x22, 0xb8, 0xf0, - 0x8a, 0xbe, 0x99, 0x23, 0x81, 0x81, 0x34, 0xa0, 0x12, 0xb2, 0x84, 0xcd, - 0x1b, 0xce, 0xf9, 0x22, 0x9c, 0xa2, 0x54, 0x86, 0x4d, 0x1c, 0xd5, 0x4b, - 0x79, 0xa3, 0x19, 0xc1, 0x67, 0xe6, 0xed, 0x1f, 0xc5, 0xa7, 0x07, 0x0f, - 0xf2, 0x69, 0x12, 0x77, 0x94, 0x6b, 0x4c, 0xba, 0x52, 0x7e, 0x5d, 0xec, - 0xd5, 0x7c, 0x62, 0xbf, 0x80, 0x22, 0x5e, 0x01, 0x83, 0x8d, 0x9d, 0xa2, - 0x79, 0x24, 0xb7, 0xe6, 0x55, 0xa6, 0x9e, 0x4a, 0x48, 0x86, 0xbe, 0x59, - 0xd6, 0x93, 0x73, 0xfc, 0x7e, 0x6b, 0x3f, 0x7a, 0x8c, 0x85, 0x30, 0x3e, - 0x44, 0x19, 0xaa, 0x21, 0x63, 0x3f, 0xfa, 0xe1, 0x0f, 0x6b, 0xe2, 0x63, - 0xf4, 0xa9, 0x1f, 0xe7, 0xe0, 0x61, 0x3f, 0xe5, 0x8a, 0x37, 0x19, 0xf1, - 0x83, 0x07, 0x89, 0xa3, 0x9f, 0x74, 0x72, 0xd4, 0xbd, 0xa8, 0xaa, 0x94, - 0xfa, 0x47, 0x6c, 0x23, 0x1c, 0x1f, 0x54, 0x3e, 0xd1, 0x72, 0xdf, 0xd0, - 0x8e, 0xf2, 0x6d, 0x70, 0x02, 0xeb, 0xf2, 0x06, 0xd6, 0x9c, 0x57, 0x6a, - 0x92, 0x2c, 0x4a, 0xf6, 0x52, 0xe4, 0xc0, 0xa9, 0x68, 0x2e, 0x59, 0xde, - 0xc9, 0xae, 0x06, 0x2c, 0x5b, 0x09, 0xc2, 0xda, 0x1b, 0x90, 0x15, 0x2d, - 0x32, 0xd5, 0x03, 0x83, 0xc5, 0x07, 0x96, 0xc2, 0x85, 0x28, 0xbf, 0xee, - 0x50, 0x71, 0xfb, 0x3c, 0x5f, 0x7c, 0x68, 0x8a, 0x3b, 0x28, 0x5e, 0xb8, - 0xc0, 0xe5, 0xd4, 0x17, 0xfd, 0x40, 0x2f, 0x2d, 0x65, 0xbb, 0xec, 0x41, - 0x0b, 0x9a, 0x80, 0x7c, 0xb9, 0xca, 0x35, 0xf7, 0xcf, 0xaa, 0x5e, 0xae, - 0x5b, 0x37, 0xda, 0xb5, 0xda, 0xc1, 0x90, 0xe1, 0x86, 0xb5, 0x7a, 0xaa, - 0x2b, 0x78, 0xf4, 0xfa, 0x9b, 0x11, 0x91, 0xa9, 0xd4, 0x17, 0xb5, 0xfa, - 0x22, 0x23, 0xef, 0x33, 0xdb, 0x89, 0x8a, 0xe5, 0xac, 0xf9, 0xa1, 0x55, - 0x54, 0x8c, 0x07, 0x88, 0x16, 0x16, 0xa9, 0x79, 0x5c, 0x62, 0x7d, 0x24, - 0xaa, 0x67, 0x5a, 0xae, 0x8a, 0x76, 0x2d, 0x69, 0xd9, 0x5f, 0x04, 0x6e, - 0x42, 0xf5, 0x79, 0x9d, 0x30, 0xe7, 0xac, 0x08, 0xb5, 0x38, 0xa8, 0xe8, - 0x52, 0x2b, 0x43, 0x7d, 0x3e, 0xd3, 0x2c, 0x73, 0x9f, 0xe0, 0x75, 0xf9, - 0x44, 0x09, 0xc9, 0x39, 0x34, 0xa2, 0xca, 0x20, 0x79, 0xff, 0xa7, 0x0c, - 0x65, 0xc4, 0xf0, 0x51, 0x33, 0xc2, 0xce, 0xa1, 0x86, 0x89, 0xae, 0xa2, - 0x29, 0xdd, 0x02, 0x72, 0xc4, 0xb3, 0x7a, 0x6c, 0x69, 0x7f, 0xb6, 0xe9, - 0xe2, 0x81, 0x5f, 0xbc, 0x7b, 0x95, 0xb1, 0xd2, 0xda, 0xe4, 0x95, 0x88, - 0x90, 0x30, 0xdf, 0xcb, 0xad, 0xc5, 0x3d, 0x78, 0x50, 0x68, 0xc3, 0x6b, - 0x97, 0x05, 0xab, 0x76, 0x2d, 0xb9, 0xda, 0x95, 0x51, 0x7c, 0x0f, 0x1e, - 0x9a, 0x59, 0xa1, 0x84, 0xea, 0x9a, 0x15, 0xc7, 0x6f, 0xc2, 0x44, 0x4e, - 0x0f, 0x2b, 0xb5, 0x00, 0xcd, 0x2d, 0x71, 0x26, 0x95, 0x32, 0x40, 0x89, - 0xfc, 0x1a, 0x68, 0x50, 0x5f, 0xa0, 0x60, 0xbc, 0x36, 0x5b, 0xb7, 0x4d, - 0x81, 0xc5, 0x37, 0x4e, 0xb5, 0xd6, 0x5b, 0x50, 0xdd, 0x72, 0xaa, 0xda, - 0xf7, 0x6b, 0x29, 0xe5, 0x03, 0x2b, 0x56, 0x20, 0x79, 0xc1, 0x37, 0x45, - 0x98, 0xc0, 0x7e, 0xe7, 0x1c, 0xe9, 0xca, 0x41, 0x9f, 0x16, 0xa1, 0xf7, - 0xf1, 0x4e, 0x52, 0x71, 0x59, 0x80, 0xf6, 0x87, 0x3f, 0x4c, 0xab, 0xb4, - 0x62, 0x37, 0x8f, 0x49, 0xab, 0xbe, 0x34, 0xb7, 0xda, 0xd2, 0xd2, 0x60, - 0x1f, 0xab, 0x4c, 0xbc, 0x12, 0x5d, 0x9d, 0xf6, 0x6d, 0xac, 0x7b, 0x77, - 0x60, 0x22, 0xa7, 0x7a, 0x6a, 0x56, 0x4b, 0x35, 0xfb, 0x1b, 0xdf, 0x92, - 0xed, 0x1e, 0x8b, 0x41, 0x9e, 0xda, 0xa7, 0x1d, 0xe5, 0xcf, 0x0e, 0xc2, - 0xb2, 0xd4, 0x5a, 0xe4, 0x94, 0xad, 0xa0, 0xec, 0x4a, 0xd5, 0x1a, 0x2b, - 0x52, 0xc1, 0x8a, 0x61, 0xaa, 0x07, 0x54, 0x05, 0xaf, 0x6e, 0xd4, 0xae, - 0xb2, 0xe0, 0xb4, 0x03, 0x93, 0x1a, 0xc4, 0xbf, 0x11, 0xd9, 0x75, 0xdc, - 0x1e, 0x0a, 0xe7, 0x24, 0x71, 0x09, 0x6c, 0x30, 0x62, 0xf1, 0x2a, 0x49, - 0x0f, 0x30, 0xf1, 0x03, 0x39, 0x59, 0x34, 0x5a, 0xf6, 0x93, 0x89, 0xdf, - 0x50, 0xbf, 0xb6, 0xb9, 0xeb, 0x9a, 0xc4, 0x5a, 0x4f, 0xa5, 0xa2, 0x44, - 0x6e, 0xca, 0x95, 0x5a, 0xcd, 0xcc, 0xb1, 0x45, 0x29, 0x18, 0x41, 0x93, - 0x42, 0x37, 0x30, 0x2b, 0xad, 0xa9, 0x0a, 0xbd, 0x7c, 0xa5, 0x41, 0xd0, - 0xd7, 0x86, 0x6c, 0x48, 0xae, 0x92, 0x9d, 0x2e, 0x03, 0x96, 0xea, 0x7a, - 0x49, 0x35, 0xd1, 0x6b, 0x76, 0x7a, 0xad, 0x2b, 0xbf, 0x5e, 0x58, 0xe5, - 0x0d, 0xa2, 0xaa, 0xfc, 0xad, 0x17, 0xfe, 0x14, 0x60, 0x7e, 0xd0, 0x74, - 0xc2, 0x42, 0x87, 0x8c, 0x14, 0xb6, 0xc0, 0x45, 0xbd, 0xc6, 0xe9, 0x54, - 0xac, 0xe6, 0x35, 0x75, 0x1f, 0xba, 0x7c, 0x59, 0xe0, 0x6f, 0xe6, 0xd7, - 0xf7, 0x98, 0x7b, 0x5e, 0x32, 0xd3, 0x0c, 0x63, 0x44, 0x1d, 0x4e, 0xc9, - 0xa6, 0xe6, 0x04, 0x66, 0xd6, 0xaa, 0x4b, 0xa5, 0x25, 0x41, 0x2c, 0xbe, - 0xe6, 0xa2, 0x96, 0xf7, 0x1b, 0x5b, 0x69, 0x8c, 0xf9, 0xb5, 0xbb, 0x8c, - 0x54, 0x2a, 0x4a, 0xce, 0x2c, 0x7b, 0xda, 0x2c, 0xfc, 0x26, 0x6a, 0x26, - 0x92, 0xc0, 0x65, 0x8f, 0x3e, 0x52, 0x58, 0x73, 0xe2, 0xc8, 0x32, 0x6b, - 0x16, 0x04, 0x0c, 0xdf, 0x99, 0x22, 0x15, 0x23, 0xe3, 0x22, 0xaf, 0x4b, - 0x6e, 0x25, 0x54, 0x72, 0xfb, 0x0e, 0xd7, 0x94, 0x52, 0x3b, 0x65, 0xf9, - 0x46, 0xb8, 0xa6, 0x5c, 0x7c, 0xc3, 0x79, 0xc1, 0x7a, 0xfa, 0xb5, 0x65, - 0xe5, 0x16, 0x62, 0x5e, 0x6d, 0xd3, 0xaa, 0x29, 0xbb, 0xdd, 0x5a, 0x22, - 0x93, 0xf0, 0x79, 0x79, 0x21, 0x7d, 0x5d, 0x61, 0xa1, 0xc8, 0xfa, 0x92, - 0x42, 0xa1, 0x9b, 0x89, 0x09, 0x05, 0x6f, 0x2a, 0xa3, 0x64, 0x47, 0x4c, - 0x09, 0x29, 0x99, 0xc1, 0x62, 0xca, 0x6f, 0x0d, 0xe5, 0x40, 0x32, 0x5b, - 0x45, 0x44, 0x0b, 0x9b, 0xc4, 0xf8, 0x3f, 0x0e, 0x5d, 0xa0, 0x2b, 0x5f, - 0x11, 0xb1, 0x80, 0x63, 0x5a, 0x78, 0xe7, 0x2d, 0x1c, 0xe1, 0x21, 0x87, - 0x0a, 0x37, 0xf5, 0x5d, 0xb8, 0x80, 0xa3, 0xcb, 0x58, 0x24, 0x54, 0xbf, - 0x6f, 0x55, 0x08, 0xc2, 0xa5, 0xc7, 0x0a, 0x5d, 0xbc, 0x62, 0xd2, 0x2b, - 0xfa, 0x5e, 0x15, 0x8d, 0xb1, 0xd2, 0x7e, 0xd4, 0x69, 0xb6, 0x77, 0xf7, - 0x9a, 0xed, 0x0e, 0xde, 0xe5, 0xdc, 0xee, 0x56, 0xe4, 0x5b, 0x49, 0x79, - 0xfb, 0x1c, 0xd3, 0x49, 0x1a, 0x55, 0x08, 0xea, 0x8c, 0x02, 0x12, 0x2a, - 0xd6, 0x0f, 0xb9, 0x18, 0xbe, 0x2a, 0xbd, 0xbd, 0x76, 0x45, 0x73, 0x17, - 0x9f, 0x02, 0x35, 0x31, 0x15, 0xae, 0xcd, 0x51, 0xc3, 0x26, 0x7c, 0x2c, - 0xa2, 0x13, 0xc3, 0x27, 0x63, 0x19, 0x81, 0x77, 0xff, 0x39, 0xff, 0xa5, - 0xf3, 0x74, 0x70, 0x2d, 0xbf, 0x30, 0x3a, 0x9b, 0x39, 0x90, 0xd1, 0x79, - 0xea, 0x55, 0xde, 0x99, 0xbc, 0xc8, 0x93, 0xc5, 0xf6, 0x5a, 0x4f, 0x5b, - 0xb9, 0x2c, 0x04, 0x7d, 0x48, 0x8a, 0xc0, 0x1a, 0xe7, 0x7e, 0x76, 0x42, - 0x67, 0xe0, 0xb8, 0x4e, 0x84, 0x88, 0xed, 0x8f, 0x9f, 0x64, 0xa2, 0x3a, - 0x1d, 0x7c, 0x42, 0xed, 0x4b, 0xe1, 0x6d, 0xfa, 0xd4, 0x6f, 0x1c, 0xf8, - 0x76, 0xe2, 0xa9, 0xc8, 0x37, 0x0e, 0xef, 0x90, 0x35, 0x97, 0xcb, 0x0f, - 0xa6, 0xde, 0x53, 0x13, 0xd2, 0xaa, 0xcb, 0xc6, 0x57, 0xf6, 0x66, 0xd3, - 0xe6, 0x1c, 0xac, 0xda, 0x52, 0x49, 0xf1, 0x4d, 0xae, 0x39, 0x30, 0xb8, - 0x08, 0x26, 0x8d, 0xda, 0x64, 0xe8, 0x51, 0x39, 0xf3, 0x4c, 0xd1, 0x65, - 0x69, 0x08, 0x5c, 0x18, 0x99, 0x82, 0x18, 0x9f, 0xfb, 0xf3, 0x44, 0x19, - 0xe1, 0xd1, 0x72, 0x09, 0x95, 0x3b, 0xeb, 0xe1, 0xdc, 0x1d, 0xdc, 0x24, - 0x64, 0x94, 0xc4, 0x0e, 0xd2, 0xf5, 0x42, 0xa6, 0xbe, 0xb8, 0xba, 0xc1, - 0x84, 0xde, 0xf0, 0x41, 0x46, 0x83, 0x55, 0x35, 0xe0, 0xe5, 0x59, 0x0f, - 0xaf, 0x07, 0x0e, 0xe8, 0x63, 0x42, 0x1f, 0x03, 0xfa, 0x98, 0x8a, 0xf3, - 0x5e, 0xa5, 0xa5, 0xfe, 0x10, 0xbf, 0x7e, 0xd6, 0x61, 0x20, 0xfe, 0x9c, - 0xf0, 0xe7, 0xa0, 0xa3, 0xe0, 0x3a, 0x69, 0xc0, 0x2e, 0x03, 0xf2, 0xe7, - 0x84, 0x3f, 0x07, 0x5d, 0x05, 0xd8, 0x4d, 0x00, 0xea, 0x33, 0x22, 0xf2, - 0xbd, 0x1d, 0x1e, 0x47, 0x3b, 0x43, 0xb3, 0x55, 0x2a, 0xbf, 0x61, 0x82, - 0x13, 0x62, 0x91, 0x74, 0xf6, 0xda, 0x9d, 0xf1, 0xf9, 0x89, 0xac, 0x01, - 0xc5, 0x82, 0x24, 0x2b, 0x71, 0x82, 0x25, 0x26, 0x80, 0xd7, 0x4d, 0x2d, - 0xc3, 0x84, 0x9e, 0x18, 0xef, 0x36, 0x55, 0xd2, 0xbc, 0x07, 0xf0, 0xc4, - 0x40, 0x24, 0xcb, 0x01, 0xe9, 0x49, 0x31, 0x90, 0x91, 0xa1, 0x13, 0xea, - 0x74, 0x31, 0x4a, 0x37, 0x0d, 0xe2, 0xd2, 0x31, 0xc5, 0x98, 0x9e, 0x70, - 0x7c, 0x2a, 0xfc, 0x48, 0x53, 0x86, 0xae, 0x08, 0x92, 0xed, 0x94, 0xaa, - 0x83, 0x8c, 0xea, 0x8c, 0xd1, 0x98, 0x36, 0xa4, 0x35, 0x8e, 0x97, 0xd1, - 0x3e, 0x9f, 0x21, 0xa0, 0x17, 0x84, 0xd0, 0xdd, 0x31, 0xf3, 0x80, 0xbc, - 0x1a, 0x3a, 0x1f, 0x10, 0x85, 0x38, 0x67, 0xc9, 0x30, 0xe8, 0xd1, 0x26, - 0x7a, 0xe9, 0x97, 0x38, 0xbd, 0xea, 0xba, 0xb6, 0xf5, 0xd3, 0x90, 0x82, - 0x13, 0xd5, 0xab, 0xac, 0x8f, 0xd5, 0xcb, 0xb8, 0x06, 0x17, 0xd6, 0x0b, - 0x24, 0x4c, 0x6c, 0xeb, 0x97, 0x0e, 0xce, 0x8b, 0xf8, 0xdf, 0xfd, 0x0e, - 0x85, 0x23, 0x01, 0xbf, 0x3c, 0x9f, 0x34, 0xb2, 0xb0, 0x7a, 0x12, 0x5c, - 0x1c, 0xcb, 0xf0, 0xab, 0xe0, 0xbb, 0xdf, 0x89, 0x43, 0x1c, 0xfe, 0x10, - 0x56, 0x43, 0x4e, 0x3d, 0x72, 0x6b, 0x4a, 0xa7, 0xa4, 0xf3, 0x66, 0x2e, - 0x5d, 0x4a, 0x15, 0x35, 0xd0, 0xd2, 0x4c, 0x31, 0x11, 0x99, 0x46, 0x6c, - 0xc9, 0xb7, 0x98, 0xe3, 0xae, 0x24, 0x17, 0xbe, 0x75, 0x00, 0xba, 0x7d, - 0xa2, 0xf0, 0xf0, 0x3e, 0x7e, 0x3e, 0xac, 0xd5, 0x65, 0x40, 0xbe, 0x4e, - 0xe3, 0x07, 0xa4, 0x72, 0x34, 0xbe, 0x4e, 0xa4, 0xdf, 0x48, 0xe3, 0x50, - 0xfc, 0x38, 0x91, 0x1e, 0x28, 0x55, 0x29, 0x97, 0x4e, 0x96, 0x4f, 0x48, - 0x97, 0xea, 0xa5, 0x93, 0xf1, 0x40, 0xd4, 0xf6, 0xad, 0x98, 0xb7, 0x88, - 0x5a, 0x3e, 0xcb, 0x1a, 0x02, 0xef, 0x7f, 0x69, 0xbb, 0xba, 0x90, 0x4c, - 0x88, 0x79, 0x4c, 0x67, 0xea, 0x24, 0xcd, 0x6c, 0x3a, 0x57, 0xa5, 0x68, - 0xae, 0x33, 0xb9, 0x3a, 0xc9, 0xb0, 0x9f, 0xce, 0x8f, 0xd3, 0xe2, 0x7a, - 0xa4, 0xf3, 0x75, 0x12, 0x2a, 0x94, 0x90, 0xb5, 0x6a, 0xfe, 0x67, 0xf2, - 0xb6, 0x2b, 0xae, 0x93, 0x54, 0x3a, 0x95, 0xa2, 0x4b, 0xa7, 0xde, 0x95, - 0x96, 0x46, 0x21, 0xdf, 0xa1, 0x6e, 0xe4, 0xf1, 0x6a, 0xa0, 0x69, 0x9a, - 0x97, 0xab, 0x23, 0xf9, 0x53, 0x2c, 0x93, 0x22, 0x00, 0xce, 0xf8, 0xa4, - 0xe5, 0x52, 0x04, 0x41, 0xe9, 0x9f, 0xb4, 0x6c, 0x0a, 0x21, 0x38, 0xe3, - 0x93, 0x91, 0x4f, 0x11, 0x8c, 0xcc, 0x01, 0xd0, 0xbe, 0x52, 0x39, 0x55, - 0x25, 0x75, 0x4d, 0x86, 0x51, 0x68, 0x9d, 0xf1, 0x94, 0xd3, 0xab, 0xb6, - 0x0b, 0x5c, 0xb2, 0xfb, 0xc5, 0xe3, 0x2e, 0x8d, 0xd3, 0xf7, 0x90, 0xc1, - 0x09, 0x2b, 0x5c, 0x31, 0x26, 0xdf, 0x17, 0x88, 0xa1, 0x97, 0x6d, 0x6f, - 0x33, 0xb6, 0x4f, 0xfa, 0xca, 0x31, 0xf3, 0xce, 0x79, 0x26, 0x0a, 0x7a, - 0xbf, 0x83, 0x5d, 0xaf, 0x7e, 0xef, 0x12, 0xd2, 0x6b, 0xf2, 0x25, 0x8f, - 0x57, 0x75, 0xeb, 0x7b, 0x97, 0x2c, 0xaa, 0xc4, 0x33, 0x09, 0x46, 0x3d, - 0xd6, 0x7e, 0xb7, 0xbf, 0x2a, 0x27, 0x78, 0x5b, 0x60, 0x11, 0x27, 0x0e, - 0x2c, 0x56, 0xf0, 0x93, 0xf7, 0xaf, 0x5f, 0x91, 0xab, 0x70, 0x9f, 0x20, - 0xc0, 0xc2, 0x7b, 0x1f, 0xd0, 0xd5, 0x8f, 0x24, 0x5f, 0x45, 0xa9, 0x6e, - 0xc5, 0x3c, 0xa9, 0x46, 0xd5, 0x0f, 0x86, 0x9b, 0x4f, 0xc9, 0xeb, 0xdc, - 0x20, 0xe9, 0x63, 0x18, 0x22, 0x29, 0x66, 0x93, 0x9c, 0xf2, 0x9f, 0xa4, - 0x35, 0x4b, 0x96, 0x92, 0x29, 0x60, 0xa5, 0x70, 0x76, 0x68, 0x5d, 0x52, - 0xba, 0xf4, 0x36, 0xaa, 0xe8, 0xa6, 0x90, 0xc6, 0x4e, 0x4b, 0x17, 0xbf, - 0xb2, 0x68, 0xcd, 0x60, 0xad, 0x96, 0x69, 0x57, 0xae, 0x6d, 0x09, 0x23, - 0xae, 0x66, 0x00, 0x72, 0xa9, 0x84, 0x49, 0x36, 0x61, 0xb0, 0x66, 0x7b, - 0x10, 0xfd, 0xbc, 0xfc, 0x13, 0x08, 0x31, 0x52, 0xae, 0x8c, 0x8f, 0x5e, - 0xbd, 0xb9, 0x5e, 0x7d, 0x3a, 0xb9, 0x0a, 0xe5, 0x52, 0x06, 0x9d, 0x35, - 0xab, 0xd4, 0x59, 0xa1, 0x4a, 0x9d, 0x95, 0x11, 0xd2, 0xdb, 0x36, 0xd7, - 0xab, 0x53, 0x37, 0x57, 0xa7, 0x5c, 0xca, 0xa0, 0xbb, 0x66, 0x9d, 0xba, - 0x2b, 0xd4, 0xa9, 0xab, 0xb5, 0xd0, 0x8c, 0x6d, 0x7c, 0xfd, 0x1f, 0xcc, - 0x31, 0xc3, 0xd0, 0xf2, 0x51, 0x7c, 0x71, 0xd4, 0xd9, 0x14, 0x63, 0xd9, - 0xb3, 0xb7, 0xaf, 0xe1, 0x32, 0xe8, 0x53, 0x7d, 0xc6, 0x0e, 0x49, 0x78, - 0xd8, 0xed, 0xe0, 0x97, 0x30, 0x3e, 0x55, 0x35, 0xb6, 0x9a, 0x71, 0x47, - 0xf6, 0x35, 0xab, 0x6f, 0x3a, 0xa4, 0x24, 0x2d, 0x7b, 0x65, 0x1a, 0x46, - 0xa6, 0x25, 0xa1, 0xb8, 0xbb, 0xa6, 0x81, 0x38, 0x29, 0x05, 0x43, 0xfd, - 0x3e, 0x03, 0xc4, 0x69, 0x69, 0x28, 0x33, 0x26, 0x19, 0x30, 0x95, 0x98, - 0x84, 0x33, 0x43, 0x93, 0x01, 0x93, 0x69, 0x0a, 0xaa, 0x58, 0x62, 0x85, - 0x62, 0x32, 0x52, 0x62, 0x58, 0xe9, 0xc3, 0xb0, 0x36, 0x18, 0x41, 0x01, - 0x8f, 0x7c, 0x8b, 0xcc, 0x60, 0xa2, 0x10, 0x71, 0xba, 0x1a, 0xa8, 0x72, - 0xba, 0x54, 0x68, 0x74, 0x5b, 0xd8, 0xe6, 0xfe, 0x5d, 0x52, 0xac, 0xcb, - 0x4a, 0xb6, 0xea, 0x69, 0x13, 0xcd, 0x65, 0x8d, 0xb0, 0x97, 0x17, 0x45, - 0xe1, 0xac, 0x3d, 0x37, 0x4d, 0xb0, 0x9c, 0x5f, 0x06, 0xd1, 0x34, 0xcb, - 0x1e, 0x0d, 0x56, 0xd3, 0x64, 0xcb, 0xd1, 0x4a, 0x18, 0x8d, 0x68, 0xf9, - 0xb3, 0xc1, 0x4c, 0xce, 0x29, 0x5f, 0x60, 0xda, 0x4f, 0x10, 0xc1, 0x71, - 0x51, 0x77, 0xc4, 0x47, 0x8a, 0x3e, 0xb6, 0x3e, 0xed, 0x9b, 0x31, 0x34, - 0x89, 0xc2, 0x3a, 0xe8, 0x5b, 0xed, 0xbd, 0xd4, 0x9d, 0xa1, 0x8c, 0xa8, - 0xc9, 0xeb, 0xab, 0x6f, 0xec, 0x19, 0xd4, 0x25, 0x9d, 0x40, 0xeb, 0xf5, - 0x18, 0xa8, 0x11, 0xed, 0xb0, 0xf5, 0xdb, 0x81, 0x7e, 0x4f, 0xe1, 0x6f, - 0x07, 0x5b, 0x93, 0xba, 0x55, 0xc1, 0x23, 0x82, 0xed, 0x4f, 0x2b, 0xe9, - 0x41, 0xe1, 0xe6, 0xb8, 0x09, 0x99, 0x42, 0xad, 0x29, 0x19, 0xdc, 0xdf, - 0xfd, 0x4e, 0xac, 0x71, 0xea, 0xb5, 0x40, 0x79, 0x95, 0xbb, 0xa1, 0xbe, - 0xdd, 0x54, 0xd9, 0x6e, 0xaa, 0x69, 0x77, 0xa1, 0x66, 0xb7, 0xaa, 0x63, - 0xda, 0x44, 0x0c, 0xa7, 0xf4, 0x3a, 0x42, 0x2b, 0xe0, 0x4f, 0xce, 0xa7, - 0x29, 0x8c, 0xb2, 0xac, 0xd2, 0x51, 0x37, 0x46, 0x42, 0x41, 0xbf, 0xc3, - 0x87, 0x32, 0x67, 0x79, 0x73, 0x9a, 0x5f, 0x48, 0x7a, 0x28, 0x4b, 0x3d, - 0xac, 0x5b, 0xd5, 0x5a, 0xff, 0xe0, 0x32, 0xe5, 0xd2, 0xcc, 0xec, 0x53, - 0x9c, 0xc0, 0xc0, 0xc5, 0x1a, 0xb1, 0x2d, 0xb7, 0xf1, 0x1b, 0xa5, 0x05, - 0x4d, 0x59, 0x06, 0x38, 0x26, 0x4d, 0xd3, 0x94, 0x16, 0xa6, 0x65, 0x74, - 0x92, 0x37, 0x75, 0xc8, 0x38, 0xb6, 0x7d, 0xfc, 0x7e, 0x2a, 0xc5, 0x4e, - 0xcc, 0x46, 0xc2, 0xbf, 0xd2, 0xfa, 0xa5, 0x7b, 0x4b, 0xda, 0x63, 0xe3, - 0xb5, 0xa0, 0x76, 0xcd, 0x4a, 0x0e, 0x7a, 0xc9, 0xc1, 0xe0, 0xfa, 0xc2, - 0x9d, 0x74, 0xe1, 0xce, 0x7a, 0xa5, 0xbb, 0xe9, 0xd2, 0xdd, 0x92, 0xd2, - 0x79, 0xf3, 0x6c, 0x32, 0x33, 0x9e, 0x76, 0xdc, 0x9f, 0x6a, 0xc9, 0x1e, - 0xb0, 0xc9, 0xd6, 0x61, 0x82, 0x85, 0xed, 0x93, 0x60, 0x45, 0xb9, 0xbd, - 0x37, 0x6c, 0xa3, 0x89, 0x1e, 0x8c, 0x57, 0x95, 0x73, 0x27, 0x5d, 0xbc, - 0xb3, 0x6e, 0xf9, 0x6e, 0xba, 0x7c, 0x57, 0x97, 0xbf, 0xd5, 0x96, 0x22, - 0x7b, 0xb2, 0xc9, 0x86, 0x22, 0x7a, 0x85, 0xed, 0x64, 0x18, 0x91, 0x13, - 0x92, 0x1b, 0xb6, 0xd2, 0x40, 0x79, 0x43, 0xab, 0x0a, 0xb9, 0x93, 0x2e, - 0xdd, 0x59, 0xb3, 0x78, 0x37, 0x5d, 0xbc, 0xab, 0x8a, 0xdf, 0x6a, 0x13, - 0x91, 0x81, 0xde, 0x68, 0x1b, 0x11, 0xc1, 0xe2, 0x46, 0x4a, 0xb0, 0x22, - 0x27, 0xf5, 0x37, 0x6d, 0xa6, 0x33, 0xe5, 0x8f, 0xae, 0x2c, 0xe8, 0x4e, - 0xba, 0x78, 0x67, 0xdd, 0xf2, 0xdd, 0x74, 0xf9, 0xae, 0x2a, 0x7f, 0xbb, - 0x2d, 0x25, 0x07, 0xbd, 0x4d, 0x36, 0x95, 0xa4, 0x58, 0xd8, 0x56, 0x49, - 0x66, 0xf4, 0xf2, 0x4a, 0xae, 0xb5, 0xa4, 0x50, 0xcc, 0xba, 0x6d, 0xec, - 0xfc, 0xad, 0x27, 0x17, 0xbd, 0x54, 0xf0, 0x24, 0x46, 0x74, 0xbb, 0xeb, - 0x05, 0x86, 0xc1, 0xfc, 0xa2, 0x41, 0xcd, 0x4c, 0x52, 0x36, 0xeb, 0x11, - 0x30, 0xc1, 0x42, 0xd1, 0x27, 0x58, 0x51, 0xeb, 0x7a, 0x25, 0x82, 0xe7, - 0xbc, 0xcc, 0x64, 0x2a, 0x2f, 0xd5, 0x63, 0xca, 0xbd, 0x5d, 0x81, 0x32, - 0xc1, 0x62, 0x59, 0x5e, 0x19, 0xef, 0x2b, 0x55, 0x29, 0x4f, 0xd5, 0x67, - 0xb8, 0x08, 0xf0, 0x9d, 0x58, 0x51, 0x53, 0x39, 0x7a, 0x32, 0x40, 0x42, - 0x4a, 0xcd, 0x05, 0x6c, 0x17, 0xc1, 0xa7, 0x55, 0x7d, 0x57, 0xce, 0x47, - 0xbd, 0x5d, 0xd5, 0xa4, 0x94, 0x4f, 0x1f, 0x2b, 0x89, 0xfb, 0x55, 0x2a, - 0xa9, 0xf5, 0xa7, 0x14, 0xda, 0xbe, 0xa2, 0x9b, 0x9a, 0x15, 0xe4, 0x88, - 0x3f, 0xb6, 0x5a, 0xeb, 0x92, 0xa6, 0xbb, 0x59, 0xd6, 0xa0, 0x9b, 0x5c, - 0x26, 0x57, 0x90, 0xd9, 0x49, 0x70, 0x66, 0x79, 0x9e, 0xde, 0x53, 0x10, - 0x20, 0x1a, 0x23, 0x33, 0xf3, 0x65, 0x43, 0xc4, 0x30, 0x3c, 0xf3, 0x35, - 0x73, 0x30, 0xb9, 0x15, 0xd0, 0xe7, 0x48, 0x2d, 0x56, 0xe2, 0x58, 0x79, - 0x35, 0x93, 0x50, 0xcb, 0x02, 0x0d, 0x67, 0xcf, 0x99, 0x15, 0xdc, 0xea, - 0x1f, 0x58, 0x97, 0xa5, 0x46, 0x6b, 0xd5, 0x3e, 0x9d, 0xf3, 0xbc, 0x93, - 0xb9, 0xd9, 0x25, 0x8e, 0xb4, 0xd6, 0xbe, 0x47, 0x77, 0x9d, 0xd0, 0xa5, - 0x63, 0xde, 0x53, 0x46, 0xa2, 0xea, 0x14, 0xf9, 0xac, 0x9c, 0xd2, 0xe9, - 0x37, 0x05, 0x8c, 0x23, 0x4f, 0x9c, 0x52, 0xd4, 0x83, 0xac, 0x36, 0x17, - 0x4a, 0xa9, 0x66, 0xc2, 0xb9, 0xfc, 0x5f, 0x12, 0x00, 0x57, 0x68, 0x2d, - 0x11, 0x90, 0x8f, 0xf1, 0xbf, 0x24, 0x01, 0xaa, 0xcf, 0x5a, 0x02, 0xa0, - 0xb1, 0xfb, 0x7f, 0x4a, 0x02, 0x54, 0xa1, 0xf5, 0x44, 0x20, 0xc7, 0xc4, - 0x75, 0x64, 0xf0, 0x9f, 0x51, 0x53, 0xc9, 0xf7, 0x5a, 0x55, 0xc5, 0x68, - 0xb5, 0x9e, 0xc9, 0xdb, 0x58, 0x65, 0xc0, 0xd9, 0xca, 0xd6, 0xeb, 0x2a, - 0x79, 0x1f, 0xc5, 0xcb, 0xd9, 0x5c, 0x2e, 0x54, 0xcb, 0xf7, 0x59, 0xd0, - 0xa1, 0x7c, 0x75, 0x8f, 0x44, 0x62, 0x9c, 0x38, 0xa7, 0xcb, 0x28, 0xaa, - 0x8b, 0x00, 0xa3, 0xee, 0xdc, 0xa7, 0x1b, 0x7f, 0x29, 0x4e, 0x8b, 0x56, - 0x63, 0x6a, 0x96, 0x19, 0x30, 0x00, 0x15, 0xa8, 0xe1, 0xe2, 0x57, 0xaf, - 0x5f, 0xfd, 0x04, 0x25, 0xde, 0x89, 0x3f, 0x60, 0x51, 0x25, 0xd2, 0x35, - 0x23, 0x00, 0x9c, 0xec, 0xe4, 0x98, 0xfc, 0x90, 0x62, 0xf2, 0xa5, 0x74, - 0x50, 0x26, 0xe9, 0x16, 0xa4, 0x3c, 0x68, 0x19, 0x17, 0x63, 0xa2, 0xf8, - 0xd9, 0x85, 0xde, 0xb6, 0x1e, 0x3c, 0xb0, 0x38, 0x83, 0xb0, 0x2c, 0x42, - 0xe9, 0x97, 0xb7, 0x0a, 0x5f, 0x16, 0x14, 0xc9, 0x31, 0x4c, 0xa1, 0x09, - 0xe7, 0xd8, 0x66, 0x17, 0x74, 0xf3, 0x93, 0xe2, 0x28, 0x49, 0x4a, 0x43, - 0xdf, 0x03, 0xb6, 0x87, 0x0f, 0x41, 0x23, 0x4e, 0xaa, 0x19, 0xcc, 0xe6, - 0x2f, 0x96, 0x41, 0x0c, 0x95, 0xc0, 0x69, 0x5c, 0x83, 0xa5, 0x25, 0x2b, - 0xc7, 0x8b, 0xe1, 0x10, 0xe3, 0xfe, 0xbd, 0x4a, 0xae, 0xb0, 0x7c, 0xcc, - 0xe3, 0xb9, 0x56, 0x38, 0xb5, 0x04, 0xfa, 0xa3, 0x77, 0xef, 0xde, 0xbe, - 0xbb, 0x67, 0xe5, 0x5e, 0x40, 0x23, 0xe9, 0x65, 0x68, 0x5d, 0x25, 0x96, - 0x55, 0xa9, 0x95, 0x6b, 0xdc, 0x5e, 0x7c, 0x06, 0xbc, 0xf2, 0xed, 0x5b, - 0xba, 0xfe, 0xc5, 0x62, 0x0d, 0x88, 0x82, 0xd8, 0x81, 0x94, 0x9c, 0x19, - 0xb0, 0x17, 0x47, 0x45, 0x50, 0x0c, 0x40, 0x4a, 0xcb, 0x68, 0xb3, 0xae, - 0x1d, 0xb6, 0x4a, 0xf8, 0x0e, 0xc9, 0xb8, 0xed, 0x95, 0xb6, 0x55, 0xe8, - 0x33, 0x13, 0x6e, 0xb4, 0x05, 0x60, 0x0e, 0xd6, 0xc0, 0x29, 0x2e, 0x15, - 0x16, 0x61, 0x74, 0x47, 0x6e, 0xae, 0x9a, 0x1e, 0x94, 0x7a, 0x55, 0xd4, - 0x0b, 0xe9, 0x71, 0xc9, 0x28, 0x0e, 0x3e, 0x39, 0x8d, 0xe8, 0x1f, 0x1b, - 0x2f, 0xd0, 0x39, 0x7e, 0xdf, 0x03, 0xae, 0xdc, 0xc4, 0x51, 0x50, 0xfb, - 0x63, 0x2d, 0x73, 0x31, 0x90, 0x21, 0xdf, 0x58, 0xf5, 0xdc, 0xad, 0xb1, - 0x6a, 0x28, 0xa1, 0x56, 0xb2, 0x3a, 0xa1, 0x50, 0xf7, 0xad, 0x9f, 0x1e, - 0xbf, 0x7d, 0xd3, 0x9c, 0xdb, 0x01, 0x1f, 0x5f, 0x2e, 0xd0, 0x33, 0x15, - 0x3a, 0x3e, 0x53, 0x8b, 0xd9, 0x8c, 0xd4, 0xdc, 0x69, 0x91, 0xc1, 0x9b, - 0x23, 0x10, 0x1f, 0x7e, 0x86, 0x99, 0x9e, 0xc5, 0xd6, 0xc6, 0xfc, 0x65, - 0xa8, 0x31, 0x58, 0x13, 0xb1, 0x48, 0x5c, 0xa1, 0xf8, 0x41, 0x1d, 0xbf, - 0x30, 0xaf, 0xd8, 0x2a, 0xfe, 0x33, 0x13, 0x04, 0xa6, 0x2d, 0x4f, 0xa1, - 0x5c, 0xaa, 0x4b, 0x55, 0x0d, 0xb6, 0x3a, 0xde, 0x69, 0x26, 0x1f, 0x19, - 0x4e, 0x4f, 0x85, 0xcc, 0x5f, 0x5e, 0xb3, 0xf3, 0xc9, 0x6b, 0xf7, 0x00, - 0xdd, 0xbe, 0xea, 0x90, 0xfc, 0xca, 0x2f, 0x00, 0xc3, 0x11, 0xb4, 0x21, - 0x1e, 0xe0, 0x87, 0x67, 0x36, 0xe3, 0x94, 0x7b, 0x0e, 0x8c, 0x9e, 0x44, - 0x9a, 0xc1, 0x88, 0xc8, 0xfa, 0xb3, 0x63, 0x0f, 0x1d, 0x6b, 0x60, 0x07, - 0xd5, 0x24, 0x70, 0x7c, 0xad, 0x67, 0xdd, 0x52, 0xa1, 0x83, 0x34, 0x99, - 0x69, 0xb5, 0x8a, 0x3a, 0x19, 0xa5, 0xe5, 0x3a, 0xc0, 0x53, 0x8e, 0x1f, - 0x5b, 0xa9, 0x07, 0xc8, 0x50, 0xb3, 0x6b, 0xd5, 0xbf, 0x50, 0xf9, 0x65, - 0xd9, 0x5b, 0x57, 0x7c, 0xbe, 0x02, 0x66, 0x25, 0xd5, 0x07, 0x54, 0x5c, - 0xba, 0xa4, 0x5b, 0x00, 0x24, 0x8e, 0x67, 0xb4, 0x72, 0x7d, 0x43, 0x55, - 0xc1, 0x40, 0xf4, 0x53, 0x05, 0xf6, 0xaf, 0x45, 0x1d, 0x87, 0xe1, 0x95, - 0xa2, 0x36, 0x10, 0xfd, 0x74, 0x89, 0x15, 0x91, 0x23, 0x9e, 0xaf, 0x1c, - 0xb9, 0x81, 0xe8, 0xa7, 0x4a, 0xac, 0x8a, 0x9c, 0x22, 0x03, 0x4b, 0x91, - 0x1b, 0x88, 0x7e, 0xba, 0xc4, 0x8a, 0xc8, 0x29, 0xc4, 0xb0, 0x14, 0xb9, - 0x81, 0xe8, 0xa7, 0x4b, 0x5c, 0x8f, 0x5c, 0xc6, 0x2a, 0x22, 0xbd, 0x0c, - 0xb9, 0x86, 0xe8, 0x1b, 0xf0, 0x15, 0x04, 0xa2, 0x42, 0x1e, 0x2d, 0x6b, - 0x75, 0x0b, 0xaa, 0xc8, 0x99, 0x92, 0xfd, 0x24, 0xa6, 0xfd, 0xe5, 0xa5, - 0x12, 0xe1, 0x92, 0x28, 0x97, 0x46, 0x05, 0x3b, 0x32, 0x74, 0x17, 0x34, - 0x8a, 0x55, 0x3e, 0xf0, 0xd8, 0xba, 0x82, 0xd5, 0xcb, 0x54, 0x47, 0xc6, - 0x6b, 0x2e, 0x91, 0x92, 0x86, 0xe8, 0x27, 0xc0, 0x57, 0x92, 0x12, 0x87, - 0x7d, 0x96, 0xa2, 0x35, 0x10, 0xfd, 0x64, 0x81, 0x15, 0x1a, 0x80, 0xc3, - 0x44, 0x39, 0x42, 0x74, 0x09, 0xf6, 0x5c, 0x2c, 0x29, 0xc8, 0x64, 0x0a, - 0xff, 0x5f, 0x18, 0x7e, 0x2d, 0xbf, 0xbc, 0x32, 0x41, 0x5d, 0x57, 0xac, - 0x00, 0xcd, 0xcd, 0xc0, 0x3b, 0x59, 0x58, 0xa4, 0xd1, 0x6e, 0x78, 0x6a, - 0xfb, 0xb9, 0x42, 0xa1, 0xd8, 0xd7, 0x7b, 0x9f, 0x37, 0x46, 0x2f, 0x5f, - 0x35, 0x9a, 0x24, 0x52, 0xbc, 0x50, 0xdf, 0xca, 0x43, 0xa4, 0xd6, 0xbc, - 0x57, 0x00, 0xe9, 0xac, 0x00, 0xd3, 0xcd, 0xc0, 0x5c, 0x15, 0xaf, 0x1d, - 0x72, 0xeb, 0x49, 0x0f, 0x73, 0x86, 0xcf, 0xba, 0xc5, 0xaf, 0x1a, 0x95, - 0x42, 0xcf, 0xfb, 0x89, 0xaf, 0x39, 0x12, 0x98, 0x46, 0x5c, 0x02, 0x6e, - 0xb2, 0xa7, 0x43, 0xe3, 0x2e, 0xde, 0xfc, 0xfa, 0xf2, 0x59, 0x22, 0xc3, - 0x19, 0xa9, 0xd4, 0x9f, 0xb0, 0x50, 0x12, 0x39, 0x52, 0x4a, 0xb5, 0x44, - 0x30, 0x03, 0xbd, 0x23, 0xb6, 0xaf, 0xc5, 0xae, 0xaf, 0x98, 0x53, 0x92, - 0xaf, 0x56, 0x9e, 0xbd, 0xfc, 0x65, 0x25, 0x09, 0x1d, 0xce, 0xbd, 0x25, - 0xd0, 0xc7, 0xdf, 0x1e, 0xbe, 0x91, 0xe0, 0x26, 0x52, 0x62, 0x09, 0xf8, - 0xcb, 0x7f, 0x95, 0x77, 0x2c, 0xca, 0x8d, 0x13, 0xb1, 0x5f, 0x31, 0xe1, - 0x51, 0x87, 0x4b, 0xda, 0x26, 0x7d, 0xdc, 0xa3, 0x14, 0x06, 0x8e, 0x83, - 0xb9, 0x19, 0x18, 0x18, 0xee, 0x78, 0x4d, 0xa7, 0x73, 0x93, 0xb4, 0x6e, - 0x1a, 0x48, 0x93, 0x60, 0xbb, 0xb4, 0x9d, 0xa3, 0x0c, 0x7f, 0xc8, 0x2f, - 0x21, 0x69, 0x77, 0xad, 0x7d, 0xda, 0x6b, 0xd3, 0xf2, 0xec, 0xc0, 0x25, - 0xb1, 0x25, 0xad, 0xa4, 0xd5, 0xbe, 0xb5, 0x92, 0x01, 0x3b, 0x2d, 0xeb, - 0x48, 0x7f, 0xf4, 0xf5, 0xcb, 0x97, 0x5f, 0x98, 0xc4, 0xa7, 0xad, 0x38, - 0x2f, 0xaf, 0x4b, 0x17, 0x1a, 0x16, 0x5b, 0x64, 0x4a, 0xa9, 0xa5, 0xcf, - 0xd4, 0x52, 0x65, 0x5f, 0x91, 0xc2, 0x42, 0xf1, 0x7e, 0x6f, 0x06, 0xce, - 0x59, 0xe8, 0xf4, 0x91, 0x02, 0x59, 0xed, 0x95, 0x69, 0x92, 0x46, 0x4e, - 0x5c, 0x09, 0x04, 0xcf, 0x0c, 0x7c, 0x40, 0xea, 0x6b, 0xaf, 0xa0, 0x03, - 0x43, 0x54, 0x95, 0x6d, 0x97, 0xdf, 0x20, 0x23, 0x87, 0x8a, 0x25, 0x7e, - 0x4c, 0xb1, 0x88, 0xe0, 0x4e, 0x00, 0xbc, 0x73, 0x76, 0xaf, 0x11, 0x38, - 0x95, 0x18, 0xb8, 0x87, 0xcd, 0x58, 0x06, 0x9b, 0x56, 0x36, 0x66, 0xbd, - 0xd0, 0xa0, 0x43, 0x5a, 0xb5, 0x45, 0x5c, 0x5d, 0x61, 0x90, 0x48, 0x50, - 0xe1, 0x26, 0x71, 0xf2, 0x95, 0xc1, 0x7f, 0x86, 0x94, 0xc5, 0xd8, 0xce, - 0xfb, 0xcb, 0x68, 0x46, 0x9f, 0x97, 0x6a, 0xc6, 0x4a, 0x0b, 0x47, 0x5a, - 0xb0, 0x25, 0x1f, 0x24, 0x3d, 0xda, 0x6b, 0x7f, 0x35, 0x5d, 0x5d, 0xbf, - 0x82, 0x1d, 0x7b, 0xa0, 0x98, 0xc9, 0x6c, 0xc8, 0xc9, 0x13, 0xed, 0x9d, - 0x46, 0x36, 0xa4, 0xa0, 0x72, 0x35, 0x9b, 0x2d, 0x32, 0xd1, 0xe8, 0x68, - 0x01, 0xce, 0x1a, 0x42, 0x23, 0x0f, 0xf6, 0x2d, 0xf4, 0xda, 0xac, 0x42, - 0x28, 0x45, 0x55, 0xe1, 0xa9, 0x65, 0x1d, 0x00, 0x1a, 0x7a, 0x35, 0x2d, - 0xf5, 0x57, 0x46, 0x79, 0x9c, 0x5a, 0x3b, 0x29, 0x2e, 0xf6, 0x93, 0x8b, - 0xd3, 0xdd, 0x64, 0x01, 0x07, 0xdb, 0xd7, 0x8b, 0x31, 0x9a, 0x65, 0x1a, - 0x56, 0x4e, 0x22, 0x1e, 0x92, 0x32, 0xc8, 0x62, 0x6b, 0x7b, 0x54, 0xb1, - 0x54, 0xed, 0x1b, 0x5c, 0x01, 0x2b, 0x76, 0x0f, 0x95, 0x67, 0x9c, 0xde, - 0x40, 0x2c, 0x02, 0xba, 0x8d, 0x63, 0xbd, 0x9d, 0x9d, 0xb7, 0x7b, 0x07, - 0xd1, 0xd8, 0xc3, 0xd3, 0xd5, 0x12, 0x49, 0x80, 0xa9, 0x7d, 0x58, 0xc2, - 0x64, 0x1f, 0x5a, 0x44, 0x46, 0x57, 0x9c, 0x57, 0x3f, 0xc2, 0xbb, 0x49, - 0x71, 0x3e, 0xc9, 0x73, 0xbc, 0xdf, 0x8d, 0x74, 0x07, 0xa3, 0xed, 0xed, - 0x28, 0x79, 0xc1, 0xee, 0x54, 0x7b, 0x0c, 0x0f, 0xb2, 0x7a, 0x3e, 0x87, - 0x83, 0xc6, 0x25, 0xcf, 0xe5, 0x9c, 0x76, 0x8b, 0x20, 0x32, 0xea, 0x6a, - 0xd9, 0xb8, 0xf0, 0xb1, 0xfa, 0x73, 0x53, 0xb5, 0xf6, 0x82, 0xa7, 0xbc, - 0x58, 0xf3, 0xa5, 0xa5, 0xb8, 0xb5, 0xcf, 0x07, 0xe6, 0x22, 0x07, 0xec, - 0xe0, 0xf5, 0xad, 0xb9, 0x71, 0xf7, 0x95, 0x70, 0xfb, 0xaa, 0x72, 0x22, - 0x57, 0x25, 0x5c, 0xcd, 0xcb, 0x73, 0x11, 0x93, 0x3a, 0x01, 0xc5, 0x17, - 0x8c, 0x74, 0x06, 0x2d, 0x3e, 0x95, 0x37, 0xa8, 0x60, 0x78, 0xaa, 0x30, - 0x0c, 0xc1, 0x2a, 0xaf, 0x71, 0xf5, 0xd6, 0x8e, 0x92, 0x0a, 0xcf, 0xfb, - 0x34, 0xed, 0x82, 0xb7, 0x97, 0x59, 0x70, 0xe3, 0x21, 0xd5, 0x84, 0xc6, - 0x83, 0xa8, 0xe3, 0xbe, 0x3b, 0x77, 0x33, 0xde, 0x83, 0x66, 0x6c, 0x14, - 0xff, 0xf4, 0x86, 0x82, 0x32, 0x54, 0xca, 0xee, 0xb2, 0xb0, 0x94, 0xdb, - 0x53, 0x9c, 0xf2, 0x10, 0x47, 0x0e, 0x93, 0x14, 0xcd, 0x6a, 0x54, 0x15, - 0x63, 0x62, 0x0a, 0xb9, 0xcb, 0x95, 0x2c, 0xac, 0x2c, 0xc3, 0x5c, 0xd7, - 0xee, 0x9c, 0xc0, 0x66, 0x95, 0x27, 0x03, 0xc9, 0xe7, 0xea, 0x10, 0x96, - 0xb3, 0x56, 0xcb, 0x04, 0xdf, 0x45, 0x82, 0x8e, 0xfc, 0xd0, 0x1d, 0x8b, - 0xf4, 0xd7, 0xc9, 0x59, 0xbe, 0xba, 0x50, 0xd9, 0xae, 0xf5, 0x44, 0xd9, - 0x9b, 0xbc, 0x8d, 0x66, 0x9c, 0xf3, 0x09, 0x59, 0xa1, 0xef, 0x80, 0xe2, - 0xdc, 0xba, 0x27, 0xa2, 0x50, 0xf9, 0x7a, 0x3b, 0xf1, 0xd7, 0xbf, 0x06, - 0x60, 0x9b, 0x00, 0xd2, 0x70, 0x6d, 0xc0, 0xdf, 0x34, 0x08, 0x36, 0x68, - 0x25, 0xc1, 0xb3, 0x4a, 0x44, 0x03, 0x93, 0x39, 0xb4, 0x4d, 0xa6, 0x16, - 0xde, 0x6c, 0xfe, 0xf4, 0xcc, 0xb6, 0x21, 0xfe, 0x50, 0xaa, 0xcc, 0xd2, - 0xaa, 0x9f, 0x99, 0xae, 0x4e, 0x6f, 0xec, 0xce, 0x47, 0xce, 0x25, 0x0e, - 0x43, 0x25, 0x8b, 0xf7, 0x80, 0x54, 0xcd, 0x1b, 0xcd, 0xfd, 0x33, 0xfc, - 0x65, 0xed, 0x9f, 0x19, 0xbd, 0x3e, 0xf5, 0x33, 0x0a, 0xdf, 0xa9, 0x50, - 0xbe, 0x3a, 0xa8, 0x52, 0xd7, 0x57, 0xf3, 0x00, 0xd8, 0x54, 0x1b, 0x8e, - 0xb8, 0xea, 0xbc, 0xb4, 0xcb, 0xdc, 0x53, 0x3b, 0xb4, 0x9d, 0xfb, 0x16, - 0x14, 0x91, 0xd2, 0x37, 0x62, 0x57, 0x4e, 0x57, 0x07, 0x84, 0xef, 0x5f, - 0x56, 0x98, 0x13, 0x5c, 0xd3, 0xe6, 0xdd, 0x6a, 0x67, 0x4d, 0x58, 0x6d, - 0x82, 0x7a, 0x26, 0xb7, 0x49, 0xa0, 0x69, 0x82, 0xca, 0x2e, 0x3e, 0x06, - 0x3c, 0xb9, 0xbb, 0xff, 0x89, 0xfc, 0x99, 0x1a, 0x53, 0xc5, 0xc5, 0x6a, - 0x2a, 0xdf, 0x7f, 0x04, 0x5f, 0xd3, 0x23, 0xea, 0x26, 0x45, 0x53, 0x9f, - 0x9f, 0xdd, 0x54, 0x9a, 0xeb, 0x1f, 0x0f, 0x92, 0xd7, 0xe2, 0x72, 0xe5, - 0x06, 0xb6, 0xc2, 0xb9, 0xb8, 0xc3, 0xba, 0x85, 0x9d, 0xfb, 0x86, 0xe2, - 0xb9, 0x2a, 0x51, 0x8e, 0x9c, 0xe9, 0x86, 0x42, 0xdf, 0x18, 0x50, 0x49, - 0x83, 0x64, 0xc3, 0x18, 0x16, 0xe8, 0x48, 0xda, 0x3b, 0xa1, 0x47, 0xc7, - 0x05, 0x91, 0xbb, 0x66, 0x50, 0x51, 0xed, 0x37, 0x8f, 0x39, 0x19, 0xf4, - 0x40, 0x1a, 0x86, 0x35, 0xdc, 0xb4, 0xef, 0xd9, 0x2c, 0x6b, 0x30, 0x59, - 0xfc, 0xfa, 0xe9, 0xd3, 0x67, 0x2f, 0x5e, 0x58, 0x15, 0x80, 0xfd, 0xd7, - 0x80, 0x87, 0x82, 0x98, 0x25, 0xa9, 0xdd, 0x02, 0x68, 0xac, 0x81, 0xe1, - 0xbb, 0x10, 0xa7, 0x0c, 0x40, 0x71, 0x47, 0x2d, 0x4e, 0xf9, 0x2f, 0xa6, - 0xd3, 0xad, 0x9a, 0x10, 0xa8, 0x45, 0xcc, 0x7a, 0x55, 0xfb, 0x68, 0x5c, - 0x71, 0x9a, 0x8b, 0x75, 0xa1, 0x10, 0x8f, 0xa4, 0xdd, 0xe5, 0x8b, 0x5c, - 0x7f, 0xdb, 0x43, 0x80, 0x39, 0x3d, 0xcd, 0x84, 0x1f, 0x89, 0xdb, 0x50, - 0xdf, 0xd0, 0x7e, 0x56, 0x67, 0x1e, 0xc1, 0x89, 0x74, 0xfb, 0xf9, 0x33, - 0x36, 0x9d, 0xf5, 0x0a, 0x67, 0x1f, 0x31, 0x5d, 0x8b, 0x76, 0x42, 0xa3, - 0x33, 0x06, 0xf6, 0x87, 0x44, 0x9c, 0x8e, 0xc7, 0x4b, 0xb3, 0xc0, 0x36, - 0x97, 0xa5, 0x00, 0x3f, 0x48, 0x46, 0xa6, 0x73, 0x3b, 0x11, 0x76, 0xe9, - 0x62, 0x67, 0x1f, 0x43, 0x19, 0x4f, 0x07, 0x6c, 0x56, 0x6f, 0xbd, 0x8d, - 0x52, 0x2c, 0x9a, 0xe9, 0xc4, 0xa0, 0xa0, 0xa5, 0xb3, 0x8f, 0x9e, 0xac, - 0x30, 0xad, 0xca, 0x56, 0xcb, 0x17, 0x2a, 0x2b, 0x0c, 0x1c, 0x75, 0xc2, - 0x56, 0xca, 0x02, 0x1c, 0x5f, 0x2a, 0xb6, 0x6c, 0x67, 0xbb, 0x44, 0xbc, - 0x97, 0x8c, 0x18, 0xe5, 0x17, 0x2a, 0x73, 0x34, 0x81, 0x3f, 0x01, 0x06, - 0x24, 0x30, 0xf7, 0x99, 0xc9, 0x0b, 0xb0, 0xc0, 0xc4, 0x04, 0x94, 0x7e, - 0x59, 0xda, 0x89, 0x27, 0x94, 0xe2, 0x99, 0x0c, 0x17, 0x1f, 0xdd, 0x3c, - 0x55, 0x8b, 0x8d, 0xb4, 0x27, 0x58, 0xa2, 0x8b, 0xe4, 0xe0, 0xe4, 0x33, - 0x83, 0xfe, 0x48, 0x4d, 0xa4, 0x79, 0xf0, 0x9f, 0xd3, 0x5e, 0x06, 0x7c, - 0xbc, 0x97, 0x5c, 0xcb, 0xb3, 0x19, 0xf8, 0x05, 0xb1, 0xb1, 0x74, 0x9d, - 0x5f, 0x1f, 0xcd, 0x8f, 0xf5, 0x55, 0x0c, 0x3d, 0xf0, 0xdf, 0x37, 0xe0, - 0x05, 0xe7, 0x63, 0x79, 0xe7, 0x80, 0x9f, 0xec, 0xf4, 0xac, 0xca, 0x01, - 0x29, 0x9a, 0x2f, 0x4f, 0xb9, 0x3a, 0xba, 0x36, 0x79, 0x69, 0x62, 0x64, - 0xc7, 0x61, 0xe4, 0x71, 0x4f, 0x57, 0x77, 0x26, 0xef, 0x93, 0x8a, 0xac, - 0x38, 0xc9, 0x64, 0x79, 0x5a, 0x79, 0x2e, 0x95, 0x2b, 0xab, 0x22, 0x00, - 0xcb, 0xf2, 0x84, 0xe7, 0xca, 0x3f, 0xea, 0xe5, 0xc8, 0xab, 0xb4, 0x0e, - 0x68, 0x13, 0x23, 0x68, 0x94, 0xf2, 0x07, 0x2d, 0xda, 0x8e, 0x75, 0xdf, - 0x70, 0x2f, 0x81, 0x59, 0x1c, 0x81, 0x29, 0x60, 0x7a, 0xf1, 0xa7, 0x71, - 0xf8, 0xb8, 0x6b, 0xe6, 0x27, 0x70, 0x15, 0x47, 0x20, 0xe8, 0x47, 0x11, - 0x76, 0x3b, 0x70, 0x5d, 0x0e, 0x6e, 0x2d, 0x7f, 0x30, 0xef, 0xac, 0x18, - 0x06, 0x87, 0x6a, 0x9e, 0x45, 0xf5, 0xa1, 0x7e, 0xc8, 0x8a, 0xe1, 0x26, - 0x81, 0x2f, 0xea, 0xec, 0x49, 0x21, 0x3a, 0x6d, 0x80, 0x5c, 0x0f, 0xf4, - 0x09, 0x30, 0x95, 0xef, 0x9d, 0xf9, 0xda, 0xd3, 0x5e, 0xc4, 0xf4, 0x4f, - 0x7b, 0x91, 0x2e, 0x85, 0xb7, 0xaa, 0xdb, 0xf8, 0x82, 0x84, 0x54, 0xcf, - 0x79, 0xe3, 0x0b, 0xff, 0x24, 0x8e, 0xb5, 0x32, 0xa6, 0x9a, 0xea, 0x0d, - 0x88, 0x51, 0x17, 0xd8, 0xbb, 0xd8, 0x3d, 0x42, 0xd8, 0xe3, 0xcd, 0x2a, - 0x49, 0x25, 0x63, 0x11, 0x88, 0xb1, 0x31, 0x20, 0xc8, 0x58, 0x6d, 0x93, - 0xa0, 0x94, 0x89, 0x18, 0xc3, 0xdf, 0x01, 0x03, 0xb4, 0x72, 0x33, 0x3d, - 0x85, 0xc6, 0xb4, 0xba, 0xc8, 0xca, 0x73, 0xa0, 0x94, 0x9c, 0x67, 0x79, - 0x66, 0x4d, 0x17, 0x69, 0x2d, 0x52, 0xc8, 0xd0, 0x29, 0x75, 0x35, 0x29, - 0x81, 0xb8, 0x2a, 0x19, 0x4d, 0x71, 0x0c, 0xc6, 0x6a, 0xbf, 0x6a, 0xc1, - 0x2b, 0x9c, 0x44, 0x90, 0xd7, 0x80, 0x45, 0x56, 0x95, 0x16, 0x2e, 0xd1, - 0x15, 0x88, 0xcf, 0x0b, 0xc3, 0xf2, 0x48, 0x18, 0x16, 0x47, 0x3d, 0x50, - 0xb4, 0xed, 0xc3, 0x47, 0x13, 0xac, 0x8d, 0x64, 0xce, 0x29, 0xa6, 0x55, - 0xd6, 0x81, 0xab, 0x84, 0xde, 0xd3, 0x73, 0xe8, 0x14, 0x6c, 0xcc, 0xbe, - 0x4f, 0x58, 0x3e, 0xc1, 0xac, 0x91, 0xb6, 0x02, 0x52, 0xe2, 0x32, 0x9a, - 0x2d, 0x6f, 0xf5, 0xc2, 0x06, 0x6c, 0x2f, 0xb1, 0xce, 0x1a, 0x93, 0x09, - 0xcb, 0x7c, 0x81, 0x42, 0x3b, 0xc8, 0x61, 0xa9, 0xe1, 0x28, 0xb5, 0x59, - 0x6a, 0x00, 0x62, 0xa9, 0xd5, 0x13, 0x57, 0x6a, 0xf5, 0xc2, 0x02, 0xec, - 0x2a, 0xb5, 0x64, 0x4d, 0x7d, 0xaf, 0x95, 0x7a, 0x0d, 0x52, 0xdb, 0xc8, - 0x61, 0xa9, 0xe9, 0x8c, 0xb7, 0x51, 0x6a, 0x04, 0x62, 0xa9, 0xd5, 0x13, - 0x47, 0x6a, 0xf5, 0xc2, 0x06, 0xec, 0x28, 0xb5, 0x60, 0x8d, 0xc9, 0xd4, - 0x49, 0x7d, 0x09, 0x52, 0x3b, 0xc8, 0x35, 0x75, 0x0d, 0xd3, 0x8d, 0x46, - 0xa9, 0x11, 0x88, 0xa5, 0x56, 0x4f, 0x1c, 0xa9, 0xd5, 0x0b, 0x1b, 0xb0, - 0xa3, 0xd4, 0x82, 0x35, 0x26, 0x53, 0x27, 0x35, 0x8e, 0xf5, 0x0e, 0xb2, - 0x4f, 0x6a, 0x00, 0xba, 0x5c, 0xd6, 0x58, 0xb7, 0x9a, 0xd6, 0x22, 0x18, - 0xdb, 0x37, 0xfd, 0xb2, 0xe4, 0x55, 0x47, 0xec, 0x0c, 0xd1, 0xc1, 0xa8, - 0xd5, 0x99, 0xbd, 0xc4, 0x0f, 0x4b, 0x58, 0x9c, 0x80, 0x84, 0x26, 0x96, - 0x57, 0x3c, 0x38, 0xce, 0x6e, 0x16, 0x0e, 0x80, 0x94, 0x68, 0x88, 0xe0, - 0x11, 0x0c, 0x9e, 0xf2, 0xfb, 0x4e, 0x62, 0x09, 0x46, 0xe0, 0xdf, 0x3a, - 0xa1, 0x54, 0x13, 0x65, 0x1c, 0xaf, 0x50, 0xe8, 0x1c, 0xd0, 0x2c, 0x15, - 0x42, 0x85, 0x27, 0x44, 0x0c, 0x03, 0x53, 0xa2, 0xbf, 0x7f, 0x6e, 0xc3, - 0xec, 0x88, 0xd9, 0x8d, 0x06, 0x8d, 0x0f, 0x9b, 0xe7, 0x34, 0x04, 0xe5, - 0x56, 0x1c, 0xb9, 0x60, 0x30, 0x44, 0xa7, 0xaa, 0x93, 0xea, 0xc6, 0x8f, - 0xba, 0xca, 0xc3, 0x15, 0x82, 0x85, 0xe5, 0xad, 0x3d, 0x91, 0x7c, 0xaf, - 0xb9, 0xfe, 0x04, 0x5c, 0x5d, 0x0d, 0x32, 0xd4, 0x3f, 0xa8, 0x0e, 0x05, - 0x43, 0x4e, 0x2d, 0x8a, 0xc7, 0xcd, 0xf5, 0x28, 0xe1, 0x54, 0x4d, 0xa6, - 0xb6, 0x3f, 0xc9, 0x3b, 0x98, 0x98, 0x10, 0x71, 0x18, 0xb8, 0x53, 0xa5, - 0x4a, 0xef, 0x14, 0xb3, 0xbc, 0x5f, 0x12, 0x99, 0xd5, 0x90, 0x7f, 0xcb, - 0x9c, 0x80, 0xfc, 0x40, 0xa4, 0xf8, 0xab, 0x33, 0x84, 0x15, 0x18, 0x82, - 0x5d, 0x52, 0xc0, 0x12, 0xa8, 0xb0, 0x28, 0x53, 0x40, 0xc0, 0x08, 0x5b, - 0x40, 0xb0, 0x7f, 0x96, 0x31, 0x20, 0x47, 0x8e, 0x35, 0xc8, 0xe7, 0x51, - 0xe6, 0x80, 0x80, 0xb5, 0xf6, 0x30, 0x1a, 0x23, 0x12, 0x43, 0x77, 0x98, - 0x34, 0xff, 0x73, 0x0c, 0x82, 0x88, 0x47, 0x59, 0x04, 0x41, 0x46, 0x98, - 0x04, 0xc1, 0xfd, 0xb3, 0x6c, 0x82, 0x58, 0x72, 0x8c, 0x42, 0xbd, 0x88, - 0xb2, 0x0a, 0x82, 0xac, 0x33, 0x0b, 0xe8, 0x24, 0x4c, 0xe0, 0x7f, 0xb3, - 0x55, 0x00, 0xad, 0xb8, 0x6e, 0x02, 0x00, 0x63, 0xba, 0x09, 0x00, 0xfb, - 0x87, 0x75, 0x13, 0xc8, 0x91, 0x6b, 0x11, 0xf4, 0x3c, 0xae, 0x9b, 0x00, - 0xc0, 0xda, 0x6e, 0x62, 0xbf, 0xaf, 0x83, 0xfe, 0x3b, 0xfb, 0x08, 0x8a, - 0x15, 0x4a, 0xa1, 0x42, 0xdd, 0xed, 0x1b, 0x2d, 0x8e, 0x68, 0xb7, 0x5d, - 0x1c, 0xf3, 0x5c, 0xf9, 0x50, 0xa0, 0x0b, 0x6d, 0x17, 0x47, 0xf4, 0x43, - 0xed, 0x97, 0x3e, 0xc7, 0x13, 0x84, 0x63, 0xc1, 0x82, 0x7f, 0xd2, 0x7d, - 0xf2, 0x63, 0xfd, 0xe2, 0x51, 0x40, 0xa0, 0x9b, 0x12, 0x5b, 0xab, 0x78, - 0xb6, 0x49, 0xa7, 0x19, 0x74, 0x6f, 0x98, 0x0f, 0x46, 0xb5, 0xf0, 0xa9, - 0xe2, 0x90, 0x58, 0x64, 0x2e, 0xef, 0x69, 0x77, 0x46, 0xf3, 0xc9, 0x95, - 0xb6, 0xd3, 0x0b, 0x9b, 0x90, 0xe4, 0x35, 0x41, 0xcf, 0xc5, 0xfe, 0xa4, - 0x64, 0xaa, 0x5c, 0x49, 0x6f, 0x09, 0x45, 0x9c, 0x0b, 0x6f, 0xb5, 0x1e, - 0xf5, 0xf2, 0x06, 0x3c, 0x9b, 0x52, 0xc0, 0xd9, 0x4d, 0xc5, 0x6c, 0x52, - 0x45, 0x7e, 0x95, 0x5c, 0x87, 0x38, 0x77, 0x35, 0x8a, 0xa5, 0x39, 0x3e, - 0xaf, 0xf5, 0xfd, 0x41, 0x39, 0x74, 0x10, 0x94, 0xba, 0xbc, 0xd4, 0x58, - 0xef, 0x41, 0x27, 0xdb, 0x30, 0x76, 0x87, 0x25, 0xad, 0x47, 0x9c, 0x5a, - 0xbe, 0x9c, 0x33, 0xf3, 0x30, 0x68, 0xbc, 0xef, 0xab, 0x8f, 0xca, 0x74, - 0x46, 0xe6, 0xd2, 0xeb, 0xb7, 0xf7, 0xa2, 0x73, 0x9b, 0x75, 0x36, 0x02, - 0xa5, 0x27, 0xf7, 0xf5, 0x67, 0x1f, 0x93, 0xde, 0xb3, 0xdc, 0xbd, 0x5e, - 0x58, 0xce, 0xed, 0xbb, 0x94, 0x53, 0x93, 0xcb, 0xbb, 0x63, 0xb1, 0xb8, - 0x98, 0xcc, 0x97, 0x8d, 0xe7, 0x4b, 0x43, 0x84, 0x52, 0x36, 0xaf, 0xb0, - 0xdc, 0x7e, 0x53, 0x8b, 0x10, 0xad, 0x83, 0xb6, 0x5a, 0xe6, 0xfb, 0x88, - 0x41, 0x19, 0x5a, 0x99, 0xce, 0x01, 0xc2, 0x79, 0x76, 0x4d, 0x60, 0x75, - 0xac, 0x30, 0xf4, 0xcd, 0xfc, 0x27, 0xec, 0x5c, 0x52, 0xf2, 0x10, 0x7b, - 0x0e, 0x63, 0xb1, 0x42, 0x97, 0x0e, 0x02, 0xe9, 0x68, 0x30, 0xee, 0x0f, - 0x46, 0xfb, 0xfd, 0x77, 0xc7, 0x8f, 0x1f, 0xf7, 0x1f, 0x84, 0xe1, 0x76, - 0x14, 0xdc, 0xde, 0xa3, 0x87, 0x75, 0x70, 0x7b, 0x0a, 0x6e, 0x34, 0xda, - 0xed, 0xf7, 0xb7, 0x46, 0x70, 0xfe, 0x1d, 0x13, 0x92, 0xb0, 0x5c, 0xad, - 0x16, 0xd3, 0x49, 0x8b, 0xc6, 0x43, 0x85, 0xc6, 0x50, 0x3e, 0x5b, 0xad, - 0xca, 0xec, 0x3e, 0x08, 0xdb, 0x2c, 0xab, 0x5a, 0x49, 0x41, 0xe7, 0x14, - 0xfc, 0x6d, 0xbc, 0x87, 0xbd, 0xf8, 0xc6, 0x9b, 0xa3, 0xd1, 0x68, 0x23, - 0x79, 0x02, 0x5f, 0x9e, 0x3d, 0x7b, 0xb6, 0x11, 0x43, 0x99, 0x58, 0xbe, - 0x3f, 0xc2, 0xe4, 0x98, 0xdb, 0x8d, 0xba, 0xdd, 0x9e, 0x30, 0x76, 0x7a, - 0x73, 0x7b, 0x42, 0x28, 0xd5, 0x9e, 0x14, 0x56, 0xa8, 0x3d, 0xe1, 0x3b, - 0x1d, 0xb2, 0xd5, 0x66, 0xa0, 0x4b, 0x0b, 0xb8, 0x33, 0x4b, 0x8c, 0x51, - 0x13, 0x39, 0x24, 0xd9, 0x0a, 0xf2, 0x11, 0x0f, 0x68, 0x05, 0x6d, 0xac, - 0x59, 0x2b, 0x08, 0xa5, 0xb4, 0xa2, 0xb0, 0x42, 0x5a, 0xc1, 0x77, 0x26, - 0x64, 0x77, 0xad, 0x08, 0xee, 0x14, 0x9d, 0x78, 0xad, 0x48, 0xc7, 0xc3, - 0x36, 0x6d, 0x09, 0x01, 0x62, 0x48, 0xab, 0x03, 0xca, 0xbb, 0xa7, 0xcc, - 0xdb, 0x83, 0xf7, 0x45, 0x5b, 0x4c, 0xe9, 0xef, 0x91, 0x3a, 0xac, 0x10, - 0xee, 0x4d, 0x31, 0x6a, 0xc1, 0x71, 0x8f, 0xf4, 0x61, 0xfd, 0xd2, 0x9d, - 0x7d, 0xe9, 0x8a, 0x51, 0x66, 0xd7, 0xe5, 0x16, 0xdd, 0x2c, 0x10, 0x8d, - 0xf1, 0x34, 0x5b, 0x0b, 0x47, 0xba, 0x04, 0x1e, 0x31, 0xcd, 0x04, 0xa3, - 0x5a, 0x62, 0x38, 0xa4, 0xd8, 0x11, 0x13, 0x51, 0xff, 0xd9, 0x03, 0xa6, - 0x0a, 0x3f, 0x5a, 0xc4, 0xf8, 0xf6, 0xf0, 0xb5, 0x0b, 0x5e, 0x6a, 0x07, - 0xfc, 0x7a, 0x88, 0x66, 0xd0, 0xb7, 0x07, 0xfe, 0x04, 0x04, 0xb8, 0xf4, - 0x34, 0x0d, 0x13, 0xe3, 0xf1, 0xd8, 0x3b, 0x08, 0xdd, 0x46, 0x18, 0x89, - 0x3a, 0x30, 0xc7, 0x80, 0xb0, 0xdd, 0x06, 0xa4, 0x5a, 0xf2, 0x22, 0x84, - 0xce, 0x3d, 0x10, 0x26, 0x67, 0x9d, 0xfb, 0x21, 0x8d, 0x6e, 0x3c, 0xf7, - 0x43, 0x19, 0x1d, 0x7c, 0xee, 0x89, 0xb4, 0x08, 0x5e, 0x72, 0x3f, 0xb4, - 0x8b, 0x75, 0x76, 0x5f, 0xd5, 0xa8, 0x7a, 0x83, 0x6e, 0xa4, 0x9d, 0x51, - 0xbf, 0x8c, 0x58, 0x5a, 0x00, 0x90, 0x31, 0xe6, 0x97, 0xc1, 0x85, 0x05, - 0xbc, 0xd2, 0xe1, 0xfe, 0xc4, 0xaa, 0x82, 0x18, 0x93, 0x54, 0xe2, 0x87, - 0x7b, 0x45, 0x64, 0x08, 0xbb, 0x1e, 0x6d, 0x3a, 0xf0, 0x72, 0x19, 0x43, - 0x5d, 0xec, 0x76, 0x34, 0x2f, 0x1d, 0x5d, 0xea, 0xad, 0xd6, 0xf3, 0x77, - 0xbc, 0x90, 0xad, 0xe5, 0x46, 0x8c, 0x78, 0xaf, 0x26, 0xe0, 0xbc, 0x06, - 0xfb, 0x69, 0xe2, 0x42, 0x5f, 0xda, 0x0f, 0x1b, 0x4b, 0x11, 0x65, 0x2d, - 0x40, 0xd5, 0x32, 0x98, 0x22, 0x68, 0x31, 0x04, 0x6d, 0xc0, 0xb6, 0xd9, - 0x5f, 0xf1, 0x52, 0x83, 0x52, 0x8c, 0x52, 0x5b, 0xcb, 0x2b, 0x47, 0x70, - 0xca, 0x10, 0x73, 0x36, 0x39, 0xc9, 0x64, 0x1c, 0xe9, 0x36, 0x81, 0xdd, - 0xd4, 0x6a, 0x38, 0x1c, 0x49, 0x48, 0x4d, 0xf1, 0x1b, 0x40, 0xb0, 0x42, - 0x9b, 0x40, 0xca, 0x65, 0x33, 0x44, 0x11, 0x00, 0x01, 0xef, 0xe0, 0xb8, - 0x26, 0x25, 0x12, 0xd0, 0x79, 0xea, 0x86, 0xae, 0x2e, 0xaa, 0xaa, 0xb9, - 0xdb, 0x59, 0x80, 0xba, 0xd1, 0x75, 0xd8, 0xcc, 0x9f, 0x83, 0x37, 0xc9, - 0xa5, 0xf5, 0xb3, 0x5b, 0x2d, 0x79, 0x6e, 0xc3, 0xd6, 0x7e, 0xd2, 0xb3, - 0xaf, 0x56, 0x01, 0x70, 0xe5, 0x2a, 0xae, 0x6e, 0x52, 0xf6, 0x5d, 0xaf, - 0x6d, 0xfa, 0x33, 0x69, 0x26, 0x0f, 0x0e, 0xf9, 0x4e, 0xa3, 0x73, 0x21, - 0x05, 0x5f, 0x64, 0x22, 0xf6, 0x22, 0xb8, 0xac, 0x67, 0x05, 0x39, 0xe5, - 0xaa, 0x84, 0x42, 0x89, 0xb0, 0xbf, 0x42, 0x43, 0x32, 0x2f, 0xda, 0x5c, - 0x4c, 0xd6, 0xce, 0x25, 0x1b, 0xfe, 0xb3, 0x7d, 0xcd, 0x1d, 0x3e, 0x1b, - 0x3a, 0x34, 0xe5, 0x68, 0xae, 0x5f, 0x57, 0x8f, 0x93, 0xcb, 0x9a, 0x2a, - 0x19, 0x6d, 0xe7, 0xcf, 0x4d, 0xe0, 0xf4, 0x49, 0x5c, 0x98, 0x2d, 0xc9, - 0x55, 0xdb, 0xa8, 0x07, 0x66, 0xbd, 0x91, 0x6d, 0xf8, 0x5d, 0xae, 0xa5, - 0xd8, 0xd2, 0xdd, 0xba, 0xd7, 0x77, 0xaa, 0x95, 0x2e, 0x57, 0xd8, 0xd5, - 0x3a, 0x59, 0x2c, 0xfe, 0xaa, 0x1a, 0x45, 0xbd, 0x0a, 0xed, 0x24, 0x87, - 0x6d, 0xaa, 0xf7, 0xc0, 0x4f, 0x8e, 0x00, 0x4c, 0xdd, 0xd0, 0xa3, 0x6e, - 0xea, 0xf9, 0x3b, 0xad, 0xe3, 0x30, 0xf4, 0xde, 0x95, 0xa2, 0x5e, 0x88, - 0x5b, 0x77, 0x5b, 0xb6, 0xf1, 0xee, 0xae, 0x31, 0xfb, 0x68, 0xd3, 0x55, - 0xfa, 0x8e, 0xb5, 0xea, 0xfa, 0x3c, 0x3e, 0x19, 0x83, 0x52, 0xac, 0x21, - 0xce, 0xba, 0x19, 0x74, 0xc7, 0xcb, 0xb2, 0x38, 0x53, 0x8e, 0x31, 0xe3, - 0x16, 0x56, 0x1b, 0xd7, 0x29, 0xe9, 0x35, 0x76, 0x87, 0x2b, 0xc9, 0x36, - 0x6c, 0x68, 0x2c, 0xf0, 0xb7, 0x88, 0x89, 0x25, 0x8f, 0x61, 0xf5, 0x65, - 0xdc, 0x3a, 0x17, 0x7a, 0xcc, 0x5b, 0x5e, 0x17, 0xc5, 0x0c, 0x63, 0x79, - 0xdf, 0x0c, 0x12, 0x4c, 0x82, 0x09, 0x32, 0x35, 0xde, 0xb3, 0x91, 0xe5, - 0x4b, 0x02, 0x55, 0x55, 0x5f, 0x1b, 0xc7, 0xd6, 0x40, 0x56, 0x3d, 0x0f, - 0xce, 0x32, 0x53, 0x28, 0x16, 0xc7, 0x4b, 0x75, 0x8b, 0x8c, 0xce, 0x02, - 0xdf, 0x9c, 0x9c, 0x8e, 0x1f, 0x8e, 0x1f, 0xd2, 0x61, 0xe0, 0x9b, 0xbb, - 0x27, 0x93, 0xb3, 0xbd, 0xed, 0x1e, 0x4f, 0xb1, 0x3e, 0x5c, 0xce, 0x2f, - 0x26, 0x24, 0xc4, 0xbc, 0x20, 0x86, 0x4f, 0xc5, 0xfd, 0x6e, 0x52, 0x01, - 0x39, 0x75, 0xa7, 0x78, 0xd9, 0x4e, 0xdc, 0x47, 0x4b, 0xa0, 0x94, 0x11, - 0x7e, 0xe9, 0xfb, 0xae, 0xce, 0xf4, 0x40, 0x0d, 0xe8, 0x05, 0x4a, 0x64, - 0x64, 0x09, 0xfe, 0x94, 0xc6, 0x11, 0x77, 0x6e, 0x0c, 0x62, 0xa2, 0x6f, - 0x48, 0x6e, 0xa5, 0x4a, 0x39, 0xf6, 0xa3, 0x9e, 0x7c, 0x1a, 0x8c, 0x83, - 0xe2, 0x3d, 0x2e, 0xe0, 0xc7, 0x55, 0xa1, 0xb2, 0x81, 0x73, 0x7a, 0x47, - 0x37, 0x8d, 0x77, 0x32, 0x42, 0xc9, 0xc4, 0x5b, 0x2d, 0x2d, 0x78, 0x32, - 0x96, 0xcf, 0x6a, 0x52, 0xe2, 0x33, 0x10, 0x65, 0x8d, 0xe5, 0xc4, 0x92, - 0x66, 0xf6, 0x34, 0x75, 0x27, 0x71, 0xb1, 0x30, 0xaf, 0x25, 0x9a, 0xb7, - 0x52, 0x28, 0x03, 0x6c, 0xb2, 0x5e, 0x95, 0x60, 0x0b, 0x73, 0x18, 0xc0, - 0x6e, 0x28, 0xcf, 0xb0, 0xc6, 0x70, 0xa1, 0xdd, 0x0c, 0xf3, 0xe6, 0x5c, - 0xe4, 0xeb, 0xc0, 0x29, 0x3e, 0x74, 0xc2, 0x77, 0xc2, 0x33, 0x99, 0x2d, - 0x99, 0x44, 0x4e, 0x7a, 0x9f, 0x4f, 0x96, 0x97, 0x54, 0x12, 0x3d, 0x3d, - 0x7d, 0xf2, 0xa4, 0x86, 0x59, 0xba, 0xd9, 0xf8, 0xfa, 0xc7, 0x2c, 0x5b, - 0x3f, 0x25, 0x60, 0x21, 0xec, 0xad, 0x36, 0x61, 0x6f, 0x64, 0x0f, 0x6a, - 0xe1, 0xe8, 0x58, 0x07, 0x0b, 0x67, 0x8f, 0xc4, 0xfe, 0xc1, 0x58, 0xf1, - 0xd4, 0xae, 0x8d, 0x99, 0xc6, 0x10, 0x20, 0xa9, 0xe9, 0x98, 0x53, 0x4f, - 0x78, 0x1a, 0x9a, 0x7a, 0xb6, 0x9e, 0x76, 0x02, 0xad, 0x86, 0xae, 0xc1, - 0xbc, 0x86, 0x24, 0xa5, 0x0a, 0x56, 0x7d, 0xbd, 0x81, 0x00, 0x4d, 0xb6, - 0x10, 0x01, 0x86, 0xae, 0x04, 0xb0, 0xc6, 0x92, 0x07, 0xda, 0x97, 0x18, - 0x4e, 0x9d, 0x06, 0x20, 0x01, 0x07, 0x86, 0x2f, 0x7e, 0x06, 0x7c, 0x34, - 0x94, 0xf4, 0x07, 0x4a, 0x7a, 0x01, 0xcd, 0xa6, 0x83, 0x77, 0x12, 0x6c, - 0xd3, 0xc1, 0x67, 0xf2, 0x5e, 0xc7, 0x26, 0x34, 0x8f, 0x0b, 0x27, 0x1e, - 0x02, 0x07, 0xa1, 0x73, 0xaf, 0x07, 0x03, 0x47, 0xa4, 0x04, 0xb9, 0x48, - 0x53, 0xc9, 0xfc, 0x91, 0xb3, 0xaa, 0xe1, 0xa6, 0xfe, 0x6c, 0xbc, 0x60, - 0xa3, 0x93, 0xfc, 0xf4, 0x72, 0xbe, 0x5c, 0xc1, 0x57, 0x6e, 0xce, 0x50, - 0x7a, 0xf8, 0x02, 0xf2, 0xd3, 0x8a, 0x3a, 0x2a, 0x8a, 0x4d, 0x83, 0xe4, - 0x04, 0x32, 0x48, 0xdf, 0x26, 0x10, 0x36, 0x5a, 0x19, 0x26, 0x12, 0x1f, - 0x08, 0x24, 0xa7, 0x64, 0x8c, 0xa9, 0x43, 0x2d, 0xf5, 0xd0, 0x8e, 0x98, - 0x5b, 0xcf, 0x60, 0x76, 0x1a, 0xcf, 0x5f, 0x44, 0x8b, 0x79, 0xf0, 0xc0, - 0xc2, 0xf9, 0x73, 0x6d, 0xc7, 0xe2, 0x5e, 0xef, 0xa9, 0x9d, 0xdf, 0xbd, - 0x9e, 0x1f, 0xc9, 0x0c, 0xe7, 0xf2, 0x00, 0x2a, 0xb7, 0x49, 0x08, 0x7b, - 0x1e, 0x71, 0xe0, 0xd5, 0x36, 0xf5, 0x56, 0xd1, 0xea, 0xfe, 0x18, 0xda, - 0xd7, 0xbd, 0x68, 0x7c, 0x38, 0xbc, 0x57, 0x8d, 0xff, 0x59, 0xe5, 0xa9, - 0xa6, 0xd9, 0xd4, 0xd3, 0xbe, 0x77, 0x98, 0x70, 0x07, 0xe7, 0x61, 0x24, - 0x36, 0x6c, 0xda, 0x6d, 0x54, 0xdd, 0xd1, 0x94, 0x24, 0xba, 0xee, 0x9e, - 0x11, 0xf4, 0x6a, 0x19, 0x59, 0x69, 0xb7, 0x11, 0x37, 0xe5, 0xa1, 0x17, - 0xa9, 0x46, 0x74, 0x7d, 0xfc, 0x25, 0x35, 0xb1, 0x5e, 0x36, 0x19, 0x48, - 0x95, 0x02, 0x98, 0xd5, 0xa3, 0xf8, 0xb1, 0x89, 0x49, 0x0e, 0xcf, 0x26, - 0xf3, 0x45, 0xc6, 0xf7, 0xa5, 0x83, 0xba, 0x25, 0x86, 0x4d, 0x96, 0x1d, - 0x86, 0x4d, 0x76, 0xeb, 0xfb, 0x56, 0x91, 0xf2, 0x3c, 0xd0, 0x97, 0x36, - 0x2e, 0xa5, 0xc2, 0x01, 0x9a, 0xf6, 0x1f, 0xde, 0x4f, 0x80, 0xa6, 0xfd, - 0x87, 0x77, 0x17, 0xa0, 0xc9, 0x8a, 0xb2, 0x40, 0xc1, 0x9a, 0x40, 0x33, - 0x05, 0x68, 0x46, 0x1f, 0x5a, 0xbf, 0x3d, 0xcf, 0x96, 0x62, 0x50, 0x65, - 0x95, 0xce, 0x0b, 0x9a, 0x81, 0x0d, 0x28, 0x44, 0x39, 0x5d, 0x33, 0x25, - 0xad, 0xcb, 0xe1, 0x17, 0x9e, 0xe6, 0x3f, 0x67, 0xb9, 0xaf, 0x36, 0x78, - 0x44, 0x70, 0x63, 0x81, 0xbb, 0x36, 0x5e, 0xd5, 0x13, 0x95, 0xe6, 0x2e, - 0xf1, 0xf4, 0xf4, 0xd9, 0x6e, 0xb0, 0x15, 0x02, 0xb1, 0xf3, 0x68, 0x8b, - 0xa1, 0xff, 0xb9, 0xfc, 0x95, 0x52, 0x5b, 0x63, 0xa7, 0xa9, 0xb7, 0x7a, - 0xfd, 0x01, 0x4d, 0x7a, 0xb7, 0xb1, 0xac, 0x16, 0x1d, 0x17, 0xcf, 0x54, - 0xa4, 0x15, 0xb7, 0xe8, 0x25, 0xe2, 0x5a, 0x89, 0xa4, 0xdb, 0x69, 0xe0, - 0x89, 0x30, 0x41, 0xdb, 0x80, 0x41, 0x09, 0x6f, 0xb7, 0x24, 0x11, 0x6f, - 0xc5, 0x40, 0x5c, 0x98, 0x71, 0x4c, 0x01, 0x5d, 0x4d, 0xf9, 0x2b, 0x8c, - 0x97, 0x6e, 0x1c, 0x78, 0x87, 0xf2, 0xd3, 0x70, 0xf5, 0xcb, 0x45, 0xd4, - 0x18, 0x0d, 0xa0, 0x1d, 0xea, 0x53, 0x89, 0xba, 0xd3, 0x1e, 0xf5, 0x57, - 0x89, 0xba, 0xab, 0xa1, 0xde, 0xde, 0x6b, 0x0b, 0xa4, 0x59, 0x42, 0xdb, - 0x26, 0x28, 0x16, 0x42, 0x8d, 0x8d, 0xd0, 0x8e, 0x16, 0x43, 0xc9, 0x83, - 0xaa, 0xf6, 0xe6, 0x6d, 0x93, 0x5e, 0xa1, 0x3f, 0x5b, 0xcd, 0x12, 0x1a, - 0x11, 0x8b, 0x90, 0x14, 0xf4, 0x56, 0x97, 0x82, 0x1e, 0x78, 0x45, 0xa1, - 0x37, 0xba, 0x30, 0x2a, 0x88, 0x0c, 0x7d, 0xb6, 0x15, 0x09, 0xa7, 0x0e, - 0xee, 0x98, 0x58, 0xe6, 0x37, 0x4f, 0xe9, 0xe2, 0xe6, 0xfb, 0x87, 0xda, - 0x18, 0xb2, 0xc9, 0xeb, 0x66, 0xe2, 0xac, 0xe5, 0x84, 0x28, 0xd8, 0xaf, - 0xc0, 0x5f, 0xf3, 0x64, 0xb3, 0x53, 0xcf, 0x12, 0xd5, 0xbb, 0xa8, 0x5e, - 0xac, 0xb5, 0x40, 0xd6, 0x98, 0xdf, 0xa5, 0xec, 0x5e, 0x97, 0x10, 0x42, - 0xb2, 0x5c, 0x9a, 0x35, 0x8d, 0x92, 0x07, 0xfe, 0x1a, 0x82, 0xe7, 0x31, - 0xf8, 0x63, 0x2d, 0x0a, 0xd1, 0xc8, 0x09, 0x43, 0x14, 0xb0, 0x65, 0xe9, - 0x8e, 0x21, 0xc2, 0xc9, 0x45, 0xb4, 0xd1, 0x2a, 0x30, 0x43, 0x54, 0xe4, - 0x77, 0xb6, 0x6c, 0x24, 0x2f, 0x49, 0x53, 0x2c, 0xac, 0x6c, 0x13, 0x69, - 0xeb, 0x1c, 0x82, 0xa1, 0xc6, 0x45, 0x76, 0xaf, 0x30, 0xb7, 0xb6, 0xa2, - 0x36, 0x45, 0x37, 0xa8, 0xab, 0xde, 0x50, 0x87, 0xbc, 0x2a, 0x6b, 0x3e, - 0x54, 0xd9, 0x12, 0x5a, 0xab, 0x7b, 0xec, 0x64, 0x8a, 0x00, 0xe5, 0x03, - 0xbb, 0xf0, 0x6f, 0x9b, 0x80, 0xf2, 0x78, 0x06, 0x2a, 0x72, 0x83, 0x14, - 0xe5, 0x24, 0x2f, 0x0b, 0x0a, 0x74, 0xd1, 0x18, 0xd0, 0x1a, 0xf8, 0xcc, - 0x9c, 0x60, 0x88, 0xbc, 0x6b, 0x9c, 0x1c, 0x2a, 0xa8, 0x88, 0x40, 0xf3, - 0x57, 0xc5, 0xf8, 0xd1, 0x68, 0x7c, 0x76, 0xfd, 0x2a, 0x4c, 0xd4, 0x82, - 0x39, 0x34, 0xf1, 0xe2, 0x8a, 0x21, 0x5f, 0x8d, 0xf8, 0x00, 0xe8, 0x7a, - 0xb2, 0x37, 0xc6, 0x0f, 0x1c, 0xac, 0xc8, 0x34, 0xda, 0x22, 0x0c, 0x0f, - 0x05, 0x8c, 0xf1, 0xc0, 0xd9, 0xf9, 0xe7, 0x98, 0x6a, 0xf3, 0x82, 0xc7, - 0x23, 0x0f, 0x27, 0xd8, 0x8b, 0x16, 0xca, 0xc9, 0x1c, 0x68, 0x11, 0x6a, - 0x90, 0x8e, 0xf6, 0x80, 0x6b, 0x45, 0xb4, 0xd2, 0x1b, 0xc6, 0x14, 0xd0, - 0x2c, 0x28, 0x1d, 0xca, 0xb7, 0x93, 0xb1, 0x0a, 0x9f, 0xcd, 0x04, 0x30, - 0x19, 0x76, 0x23, 0x46, 0x6e, 0x60, 0x8c, 0x22, 0x30, 0x66, 0x06, 0xc6, - 0x38, 0x02, 0x63, 0x6a, 0x60, 0xec, 0x44, 0x60, 0x80, 0x57, 0x9e, 0xb8, - 0xa9, 0xfd, 0x72, 0x05, 0x89, 0xf1, 0xd3, 0x23, 0x5d, 0xa6, 0x81, 0xc1, - 0xef, 0xc0, 0xe0, 0x65, 0x60, 0x94, 0x73, 0xdc, 0x6f, 0x2e, 0xe9, 0x6a, - 0x6c, 0x30, 0xb7, 0x1b, 0xc1, 0x5c, 0x6e, 0xa2, 0xec, 0x45, 0xa0, 0xcc, - 0x4c, 0x94, 0xfd, 0x08, 0x94, 0xa9, 0x89, 0xf2, 0x30, 0x02, 0x05, 0xb4, - 0x36, 0x0e, 0xa8, 0x6d, 0xd7, 0x50, 0xcd, 0x9e, 0xf1, 0x6b, 0x1f, 0x7f, - 0x71, 0x41, 0x71, 0x6a, 0xdb, 0x31, 0xb8, 0x7b, 0x14, 0xc1, 0x5d, 0x6e, - 0xa2, 0x3c, 0x8e, 0x40, 0x99, 0x99, 0x28, 0xa3, 0x18, 0x83, 0x9e, 0x5a, - 0x38, 0x31, 0x26, 0x0d, 0x8a, 0xdb, 0x09, 0x28, 0xee, 0x91, 0xa1, 0x9c, - 0xc7, 0xa6, 0xf5, 0x59, 0xc6, 0x38, 0x02, 0xd5, 0xdd, 0x45, 0x87, 0x12, - 0x4a, 0x4e, 0x1b, 0xee, 0xba, 0x83, 0x01, 0xcf, 0x36, 0xf3, 0x00, 0x43, - 0x49, 0x38, 0xc8, 0x19, 0xe8, 0x3d, 0x84, 0x14, 0x0c, 0x6c, 0x06, 0x7a, - 0x0f, 0xe1, 0x84, 0x83, 0x99, 0x81, 0x19, 0x49, 0xa4, 0x88, 0x2e, 0xb2, - 0x46, 0x31, 0xe3, 0x4e, 0x8a, 0x19, 0x77, 0xd2, 0xcc, 0xb8, 0x8b, 0x6a, - 0xc6, 0x9d, 0x74, 0x33, 0x6e, 0xa5, 0x9c, 0x80, 0x6e, 0x76, 0x3a, 0xe9, - 0x66, 0xa7, 0x93, 0x6e, 0x76, 0xba, 0xe8, 0x06, 0x91, 0x5a, 0xab, 0x66, - 0x27, 0x5e, 0x35, 0xb7, 0xde, 0x09, 0xa0, 0x48, 0xaa, 0xd4, 0x6a, 0x02, - 0x58, 0x93, 0x78, 0xe8, 0xb5, 0x13, 0xb4, 0xcb, 0xce, 0x3d, 0x14, 0x13, - 0x59, 0x2c, 0x18, 0x4a, 0x2c, 0x62, 0xc6, 0x50, 0x93, 0xba, 0xe8, 0x75, - 0x73, 0xf2, 0xa2, 0xa8, 0x48, 0x60, 0xc1, 0xc8, 0x5f, 0xd1, 0xfc, 0xad, - 0x57, 0x79, 0x23, 0x7f, 0x9e, 0xfc, 0x47, 0x8d, 0xfc, 0x01, 0x4c, 0x88, - 0x3f, 0x78, 0x15, 0xcf, 0x9f, 0x3f, 0x81, 0xd2, 0xeb, 0xe6, 0x14, 0x4a, - 0x51, 0xd1, 0xb5, 0x82, 0xd1, 0xb4, 0xa2, 0xf9, 0x5b, 0x4f, 0xbc, 0x33, - 0xdf, 0xe6, 0x2c, 0x4c, 0x49, 0x4c, 0x1c, 0xac, 0x60, 0xdc, 0xab, 0x18, - 0xfe, 0x6a, 0xd2, 0x38, 0xbd, 0xae, 0x4b, 0xe4, 0x94, 0xc4, 0xc5, 0xab, - 0xf2, 0xc6, 0xa8, 0x8a, 0xaa, 0xd8, 0xbf, 0x2c, 0x11, 0x54, 0xdc, 0x9d, - 0x27, 0x4b, 0x8e, 0xbf, 0x20, 0xb9, 0x54, 0x92, 0xc4, 0x27, 0x17, 0x8a, - 0x13, 0xe8, 0xaa, 0x45, 0xa6, 0x21, 0xfa, 0x33, 0x7d, 0x17, 0xef, 0xa7, - 0x50, 0x6d, 0x73, 0x29, 0x6e, 0xa4, 0xdd, 0xae, 0x40, 0x9b, 0x97, 0x54, - 0xd1, 0xb0, 0xe3, 0x36, 0xc0, 0x3b, 0x75, 0xc0, 0x60, 0xd9, 0x51, 0x63, - 0x59, 0x7c, 0xa2, 0xb0, 0xd7, 0x35, 0xa9, 0xc2, 0x1a, 0xdb, 0x21, 0xc0, - 0x78, 0xad, 0x17, 0x9e, 0x47, 0xb6, 0x42, 0x8a, 0x84, 0x11, 0xdf, 0x0a, - 0x5b, 0xe7, 0x1f, 0x8b, 0x68, 0x83, 0xea, 0x6e, 0x60, 0x64, 0x54, 0xaa, - 0xf6, 0xd4, 0xc5, 0xdd, 0xc0, 0xc8, 0x20, 0x47, 0xed, 0xc9, 0xcb, 0xbb, - 0x81, 0x51, 0xd1, 0x72, 0xda, 0x53, 0x17, 0x37, 0x03, 0xeb, 0x43, 0xaf, - 0x1c, 0x24, 0x51, 0x46, 0x89, 0xa9, 0x32, 0xa0, 0x85, 0xb6, 0xda, 0x60, - 0x6b, 0x95, 0xed, 0x34, 0xff, 0x1f, 0xe5, 0x3a, 0x65, 0xd8, 0xe0, 0x82, - 0x32, 0xf1, 0xaf, 0x25, 0xc3, 0x29, 0xa4, 0xe9, 0x2f, 0x18, 0x24, 0x3a, - 0x50, 0x94, 0x4c, 0x35, 0xfd, 0x15, 0xfd, 0x0b, 0x24, 0x2d, 0xc8, 0xc6, - 0x8c, 0xd6, 0x5e, 0xd6, 0x0b, 0x8a, 0xcc, 0x9c, 0xaf, 0x16, 0x45, 0x18, - 0x50, 0x6d, 0x0a, 0x13, 0x82, 0x0d, 0xe7, 0xa4, 0x4d, 0xc7, 0x13, 0x5d, - 0xbd, 0xd8, 0xa8, 0x0b, 0x32, 0x7e, 0x45, 0xf3, 0xa2, 0x8a, 0xf8, 0x50, - 0xc9, 0x9e, 0x82, 0xbb, 0xca, 0x59, 0xc9, 0xb1, 0xc8, 0xc9, 0x00, 0x44, - 0x29, 0x3e, 0xe0, 0x50, 0x7b, 0x74, 0xf7, 0x7e, 0xdb, 0xdc, 0x7f, 0x82, - 0xd2, 0x5d, 0xc9, 0xd9, 0x1b, 0xf2, 0x33, 0x99, 0x06, 0x07, 0x1a, 0xa7, - 0xaf, 0xfa, 0xf8, 0xd4, 0x51, 0x9c, 0x71, 0xb7, 0xbd, 0x75, 0xd1, 0x6e, - 0x2f, 0xbf, 0x91, 0x5a, 0x75, 0xc3, 0xdd, 0x47, 0xd1, 0xeb, 0x32, 0x43, - 0x0e, 0xb5, 0x41, 0x3b, 0x17, 0xda, 0x0a, 0x37, 0x84, 0x13, 0xde, 0x9b, - 0xf1, 0x03, 0xb1, 0x25, 0xf0, 0xf9, 0x5e, 0xf0, 0x9a, 0xc6, 0x09, 0x5e, - 0x48, 0x4a, 0xe8, 0xfc, 0x85, 0x8f, 0x77, 0x5c, 0x4f, 0x14, 0x3a, 0xce, - 0x95, 0xe7, 0x36, 0x64, 0x57, 0xee, 0x31, 0xcd, 0x8b, 0x04, 0x81, 0xe8, - 0x60, 0x46, 0x01, 0x1e, 0xf8, 0x4f, 0x80, 0x0c, 0x62, 0xec, 0x8c, 0xa9, - 0x1e, 0xbd, 0x71, 0x08, 0xa7, 0xd5, 0x54, 0x48, 0x8c, 0xa3, 0x5e, 0xad, - 0xf3, 0x6b, 0x88, 0x4b, 0xdd, 0xb3, 0xa8, 0x5c, 0x11, 0xcf, 0xe4, 0xa9, - 0x04, 0x0e, 0x33, 0x9e, 0x33, 0x3b, 0x97, 0x63, 0xee, 0x05, 0xbd, 0xde, - 0x9f, 0xf2, 0x82, 0x91, 0x0c, 0x0b, 0x02, 0xca, 0x5b, 0x08, 0x6e, 0x53, - 0x91, 0xec, 0xdd, 0x97, 0xee, 0x41, 0x60, 0xd0, 0x99, 0x86, 0x00, 0x02, - 0xc2, 0x4d, 0xd7, 0x94, 0x61, 0x18, 0xec, 0x82, 0x06, 0x7d, 0x5e, 0x47, - 0xcc, 0x2e, 0x68, 0xb4, 0x0f, 0xd3, 0x19, 0xb1, 0x23, 0xaf, 0xb8, 0x8d, - 0xd3, 0x15, 0xaf, 0x63, 0x91, 0x38, 0x6d, 0xef, 0x54, 0x26, 0x21, 0xd6, - 0x17, 0x0a, 0x8d, 0xc3, 0x36, 0x9d, 0x5b, 0xab, 0x91, 0x06, 0xc6, 0x0d, - 0x05, 0x3e, 0x2d, 0xe3, 0x6e, 0x9d, 0x00, 0x9c, 0x19, 0xcf, 0x8f, 0xef, - 0x6c, 0x00, 0x8d, 0xf0, 0x95, 0x0d, 0x78, 0x49, 0xb7, 0x35, 0x5a, 0x0c, - 0x02, 0xdc, 0x72, 0xf4, 0x21, 0x4c, 0x1d, 0x60, 0x26, 0xa3, 0xe4, 0x97, - 0x5f, 0xf4, 0x47, 0xb4, 0xb5, 0x8c, 0x93, 0x22, 0x7a, 0xe4, 0x1e, 0x4d, - 0xee, 0x3d, 0xec, 0x03, 0x43, 0x62, 0x14, 0xf9, 0xfa, 0xc5, 0xcb, 0x2f, - 0x3e, 0x4f, 0xa0, 0xad, 0x7f, 0xfe, 0xc5, 0xc7, 0xcf, 0xec, 0x48, 0xfb, - 0x75, 0x47, 0xf8, 0xb2, 0x89, 0xfb, 0xaf, 0x32, 0x4a, 0xfc, 0x3b, 0xbf, - 0xcd, 0x28, 0xc8, 0x46, 0x5f, 0x6e, 0xf1, 0x2a, 0xec, 0x7d, 0xb1, 0xef, - 0xde, 0xec, 0x73, 0x74, 0x97, 0x03, 0x37, 0xb0, 0xe0, 0xa1, 0x47, 0x62, - 0xee, 0xed, 0x03, 0x37, 0x74, 0xc7, 0xe4, 0xeb, 0x97, 0x5f, 0x7c, 0xf9, - 0xd9, 0x87, 0xdf, 0x9b, 0x22, 0x4b, 0x43, 0x27, 0x78, 0x79, 0x63, 0x2f, - 0xa5, 0xa1, 0xca, 0xea, 0x7d, 0x83, 0x1d, 0x29, 0xcc, 0x6f, 0x82, 0xb0, - 0xe2, 0x54, 0x93, 0x81, 0xeb, 0x29, 0xd3, 0x39, 0x6f, 0x80, 0x32, 0xef, - 0x06, 0xd4, 0xca, 0xfa, 0x50, 0xc8, 0x2a, 0xcc, 0xee, 0xd5, 0xb7, 0x2f, - 0x04, 0xf2, 0x9f, 0xb3, 0x3a, 0xaf, 0x61, 0x28, 0x13, 0xec, 0x74, 0x2b, - 0xf0, 0xbf, 0xa5, 0xf3, 0x47, 0x42, 0xe7, 0x2f, 0xbf, 0xf9, 0xd7, 0x08, - 0x89, 0xc0, 0x6d, 0xa5, 0x7c, 0x2c, 0xbb, 0xb4, 0x67, 0xa3, 0xcd, 0x9d, - 0xd1, 0xbf, 0x46, 0xd2, 0xf6, 0xd5, 0xb9, 0xbf, 0x2d, 0x05, 0xfd, 0x64, - 0x9e, 0x67, 0xe3, 0xed, 0xd1, 0xf8, 0x5f, 0x23, 0xab, 0x00, 0x6e, 0x4c, - 0x21, 0xf7, 0xa7, 0x25, 0x40, 0xe0, 0xbf, 0x4c, 0x04, 0x2b, 0xa1, 0x9a, - 0x3d, 0x0c, 0x6f, 0xb7, 0xba, 0x4f, 0xda, 0x5b, 0x9d, 0x9d, 0xb5, 0x8a, - 0x8e, 0xc1, 0x83, 0x4c, 0x27, 0x0d, 0xb6, 0xb5, 0x03, 0x57, 0x91, 0x2d, - 0x10, 0xc2, 0xa6, 0xef, 0x4e, 0xd1, 0x82, 0xa5, 0xc8, 0xb9, 0x5d, 0x73, - 0xd6, 0x64, 0x81, 0xd8, 0x65, 0x92, 0x29, 0x30, 0x83, 0xb3, 0x4c, 0x97, - 0x51, 0x96, 0xae, 0x03, 0x9f, 0x80, 0xd7, 0x6d, 0xb1, 0x40, 0x88, 0x6d, - 0xb9, 0xd4, 0x2c, 0x82, 0x39, 0x6c, 0x93, 0x33, 0x75, 0x6b, 0xab, 0x7b, - 0x5e, 0xd4, 0xc6, 0x5b, 0xd4, 0x8e, 0x1c, 0xc1, 0xab, 0xc4, 0x66, 0x3a, - 0xf6, 0x57, 0x58, 0xdc, 0x6b, 0x9e, 0xeb, 0x81, 0x56, 0xa6, 0x19, 0xcc, - 0x2a, 0x0b, 0x74, 0x38, 0x9e, 0x65, 0x79, 0x05, 0xa4, 0xb3, 0x63, 0x38, - 0xfa, 0x8d, 0xd8, 0x6e, 0xfd, 0xbe, 0x7a, 0x92, 0x82, 0x91, 0x3f, 0xd1, - 0xd4, 0x0b, 0xe6, 0x49, 0x4d, 0x70, 0xcb, 0xf0, 0x94, 0x80, 0x0b, 0x73, - 0xee, 0x27, 0xf1, 0x13, 0xe8, 0x12, 0x44, 0x23, 0x57, 0xc8, 0x2e, 0x2f, - 0xdb, 0xde, 0x79, 0x6c, 0xe3, 0x7e, 0x57, 0xe5, 0x48, 0x4e, 0x77, 0x04, - 0x65, 0x79, 0xa4, 0x38, 0x4b, 0x6d, 0x64, 0x38, 0xb8, 0xdc, 0xb1, 0xf0, - 0x3e, 0x00, 0x3c, 0xf6, 0x18, 0xf4, 0xa2, 0xb2, 0x13, 0x9c, 0x07, 0xff, - 0xed, 0x0a, 0x9f, 0xc1, 0x7c, 0x44, 0xa8, 0xa3, 0x11, 0xf8, 0xd1, 0xae, - 0x31, 0x55, 0x21, 0x6f, 0x62, 0x21, 0xec, 0xd5, 0xa3, 0x1f, 0xbe, 0x0c, - 0x0c, 0x7f, 0x07, 0xe3, 0xd7, 0xcc, 0xf8, 0x35, 0x3d, 0xee, 0x6b, 0xfd, - 0x4e, 0xb4, 0x17, 0x0a, 0xf3, 0x50, 0xc3, 0xc4, 0xd8, 0xe4, 0xc2, 0xfc, - 0x39, 0x33, 0x7f, 0x4e, 0xc7, 0xb1, 0x8c, 0xec, 0x04, 0x18, 0xa9, 0xe3, - 0x64, 0xc7, 0xe4, 0xc4, 0xfc, 0x39, 0x33, 0x7f, 0x4e, 0x77, 0x0c, 0x4e, - 0x6e, 0xf1, 0x53, 0xdc, 0x1c, 0x37, 0x92, 0x34, 0x3e, 0x55, 0x77, 0xc7, - 0xc9, 0xc3, 0x7b, 0xb2, 0xfc, 0x79, 0x52, 0x37, 0x57, 0xdf, 0xd0, 0x33, - 0x61, 0x0a, 0x68, 0x8a, 0x38, 0x24, 0xdd, 0xc3, 0x31, 0xe4, 0x20, 0x60, - 0x8b, 0x17, 0x88, 0xfb, 0x54, 0x3c, 0x4b, 0x37, 0xc6, 0xa7, 0x04, 0x67, - 0xdc, 0x10, 0xbe, 0x58, 0xaf, 0x96, 0x40, 0x58, 0xc8, 0x79, 0x52, 0xa9, - 0x23, 0xcf, 0xca, 0xcb, 0x7c, 0x99, 0xa4, 0xbd, 0x6d, 0x54, 0x84, 0x68, - 0xf7, 0xf0, 0x7a, 0xb3, 0x5c, 0xbd, 0x10, 0xb9, 0x79, 0x21, 0xee, 0x1f, - 0x8c, 0xa7, 0x94, 0x02, 0x75, 0x38, 0xc6, 0xe7, 0x5f, 0xaf, 0xd7, 0xb0, - 0x35, 0x3e, 0x29, 0xb2, 0xd4, 0xe9, 0x54, 0x58, 0x91, 0xf0, 0xc5, 0x29, - 0x82, 0x79, 0x50, 0x20, 0x70, 0xbe, 0xd1, 0x87, 0x52, 0x3d, 0x2f, 0x46, - 0xa1, 0x17, 0xe3, 0xd0, 0x0b, 0xa8, 0x80, 0xda, 0x04, 0xa8, 0xab, 0x5c, - 0x04, 0x41, 0x32, 0x9a, 0xcd, 0x1b, 0x9e, 0x4d, 0x31, 0x00, 0x30, 0x52, - 0xcd, 0xca, 0x5a, 0x25, 0xe4, 0xcd, 0x75, 0x4e, 0x9f, 0x1f, 0x8b, 0x54, - 0xf5, 0xa4, 0x01, 0xa6, 0x26, 0x40, 0x38, 0x92, 0x7b, 0xb9, 0xba, 0x3c, - 0x39, 0xbf, 0x58, 0xfd, 0x9c, 0x71, 0x67, 0xa5, 0xe8, 0x52, 0xd8, 0x2a, - 0x09, 0x3f, 0xc9, 0xa1, 0xee, 0xb8, 0xcb, 0x12, 0x19, 0x64, 0xed, 0x49, - 0xcf, 0xf5, 0x93, 0xe4, 0xf3, 0x49, 0x79, 0xbe, 0x49, 0xd3, 0x99, 0x54, - 0xc7, 0x7c, 0x89, 0xa5, 0xd0, 0x59, 0x11, 0x1c, 0x04, 0xcf, 0xb2, 0xef, - 0x92, 0x21, 0x50, 0xdf, 0x84, 0x2e, 0x12, 0xba, 0x8a, 0xcf, 0xb2, 0xb3, - 0xb2, 0x3f, 0x30, 0x29, 0xdd, 0xc4, 0x52, 0xfa, 0x9e, 0x29, 0xe1, 0xbb, - 0x75, 0x5f, 0xeb, 0x55, 0x95, 0xa9, 0x87, 0x85, 0xa7, 0xe0, 0x27, 0x28, - 0x78, 0x07, 0xc1, 0x44, 0x91, 0xdf, 0xc5, 0x70, 0x2e, 0x40, 0xbf, 0xf7, - 0xf3, 0xc6, 0xf5, 0xc8, 0x61, 0xab, 0xb1, 0x89, 0x50, 0x4b, 0x7b, 0x7e, - 0x01, 0x32, 0x52, 0x5a, 0x6e, 0xe0, 0x6b, 0xf3, 0x7a, 0x90, 0xe0, 0xc7, - 0x0d, 0xdc, 0x44, 0x80, 0xff, 0xfa, 0xe4, 0xb2, 0x8f, 0x84, 0x38, 0x40, - 0xe7, 0x2b, 0x49, 0x83, 0x8d, 0x9c, 0x1e, 0x58, 0x51, 0xd3, 0xa8, 0xc3, - 0x09, 0xf5, 0xc7, 0x10, 0x24, 0x03, 0xa3, 0x63, 0x98, 0x2f, 0x05, 0xbe, - 0x91, 0xce, 0x14, 0x4a, 0xe3, 0xf4, 0xb1, 0x90, 0x0c, 0x9e, 0x8b, 0xf7, - 0x00, 0xe7, 0x26, 0x28, 0xbb, 0x39, 0x3b, 0x90, 0x33, 0x1f, 0xe4, 0xc8, - 0x07, 0x39, 0xf5, 0x41, 0x8e, 0x7d, 0x90, 0x57, 0x1a, 0x24, 0x0f, 0xbd, - 0xec, 0x44, 0x67, 0x72, 0x64, 0xf9, 0xca, 0xb9, 0x4c, 0xb0, 0x4b, 0x9c, - 0x5b, 0xac, 0xeb, 0xab, 0xe0, 0x1e, 0x74, 0xf5, 0xef, 0x38, 0xd3, 0xab, - 0x3e, 0xf4, 0xba, 0xf9, 0x0c, 0x8c, 0xbe, 0x44, 0x9a, 0x96, 0x61, 0xf1, - 0xca, 0xdc, 0xe8, 0xf2, 0xd6, 0x57, 0x78, 0xbb, 0x76, 0x7b, 0x90, 0xc0, - 0x7f, 0xb2, 0xcf, 0xbe, 0x9a, 0x9f, 0x96, 0xe7, 0xd5, 0xaf, 0xf3, 0x0c, - 0x07, 0x7d, 0x6d, 0x14, 0x51, 0xb4, 0x63, 0xb2, 0x45, 0xe8, 0xa5, 0x12, - 0x9b, 0xf4, 0x3c, 0x35, 0xf3, 0x55, 0xdb, 0x40, 0xdf, 0xe2, 0xc8, 0x92, - 0x6a, 0x25, 0x56, 0x85, 0x6e, 0xbd, 0xfb, 0xae, 0x04, 0x7d, 0x37, 0xf9, - 0x18, 0x20, 0x0b, 0xd9, 0x82, 0x70, 0x48, 0x50, 0x2f, 0xb6, 0x58, 0x37, - 0x1a, 0x35, 0xa3, 0xfb, 0x3c, 0xc9, 0x40, 0xfe, 0xfc, 0xbb, 0xe4, 0xd0, - 0x90, 0x38, 0xd9, 0x4a, 0xc6, 0x07, 0x36, 0xd0, 0xf7, 0x00, 0x64, 0x28, - 0x42, 0x41, 0xb9, 0x57, 0x5c, 0x24, 0xd5, 0x81, 0xc2, 0x8c, 0xd2, 0x27, - 0x96, 0x44, 0x57, 0x1e, 0xbf, 0x82, 0xf3, 0xbe, 0xcb, 0xc2, 0x65, 0x69, - 0x77, 0x73, 0x4f, 0x03, 0x85, 0x03, 0x3f, 0x0d, 0x34, 0x35, 0x60, 0x87, - 0x70, 0xb5, 0xb5, 0x6f, 0xb2, 0x47, 0xe0, 0xc9, 0x74, 0x95, 0x83, 0xc5, - 0xe1, 0x43, 0xae, 0xfa, 0x69, 0x36, 0x9b, 0x2f, 0xbf, 0x84, 0x6e, 0x2b, - 0xed, 0xdb, 0xe0, 0xa2, 0xee, 0x4c, 0xf0, 0x49, 0x7e, 0xe2, 0xca, 0xa7, - 0x73, 0x43, 0xf6, 0x33, 0x86, 0x6a, 0xa1, 0xae, 0xf0, 0xcb, 0xe7, 0x03, - 0x71, 0xec, 0xc6, 0xc4, 0xa9, 0x2e, 0xf0, 0x62, 0x94, 0xc1, 0xd4, 0x93, - 0x24, 0x85, 0x3e, 0xaf, 0xa0, 0x97, 0xcb, 0x64, 0x42, 0x5d, 0x28, 0x02, - 0x49, 0x26, 0xde, 0xe8, 0x9b, 0x6c, 0x60, 0x1a, 0xf6, 0x6f, 0x49, 0xd8, - 0xc3, 0x64, 0xf7, 0xc0, 0x7c, 0x27, 0x6e, 0xa2, 0xbe, 0xc0, 0x25, 0x36, - 0xbc, 0xed, 0xbd, 0xb9, 0x4d, 0x7f, 0x3d, 0x2f, 0x54, 0xda, 0xb7, 0x1e, - 0xd3, 0xed, 0xc7, 0x4a, 0x1d, 0x15, 0xcf, 0x67, 0xf3, 0xc5, 0x42, 0xc4, - 0x03, 0x9a, 0x66, 0x93, 0xcb, 0x72, 0x7e, 0x76, 0xb9, 0x50, 0x61, 0x18, - 0x15, 0x48, 0x39, 0xf9, 0x31, 0x5b, 0xd2, 0xb5, 0x2c, 0xf2, 0x9d, 0x78, - 0x92, 0x9c, 0x97, 0xe5, 0xfa, 0x09, 0xdc, 0x0b, 0x2d, 0x61, 0x99, 0x0f, - 0x83, 0x6c, 0x7e, 0xb6, 0x58, 0x5d, 0x41, 0xb7, 0x74, 0xb1, 0xf5, 0xd3, - 0x65, 0x56, 0xd0, 0x79, 0xdd, 0xd6, 0xe8, 0xd1, 0x78, 0x7f, 0xef, 0xd1, - 0xf6, 0xee, 0xd6, 0xf4, 0x72, 0xbe, 0xc0, 0x63, 0xde, 0xe1, 0x64, 0x48, - 0x64, 0x87, 0x34, 0xa9, 0x1a, 0xce, 0x97, 0xc3, 0xf3, 0xf2, 0x62, 0xb1, - 0x67, 0xe5, 0x14, 0x82, 0xde, 0x61, 0x21, 0xfa, 0x18, 0xf9, 0xf5, 0x3d, - 0x98, 0x41, 0xee, 0x57, 0xbf, 0x1e, 0xd8, 0x93, 0x6b, 0xc0, 0x11, 0x6e, - 0x1d, 0x1f, 0x4a, 0xc4, 0x54, 0x00, 0x0e, 0x61, 0x02, 0xcc, 0x35, 0x05, - 0x16, 0x33, 0x7a, 0x64, 0x47, 0x4e, 0x86, 0x69, 0xa8, 0x42, 0x22, 0x9c, - 0x00, 0x78, 0xc8, 0xa2, 0xdc, 0xb7, 0x38, 0xdf, 0x78, 0xb9, 0x72, 0x6c, - 0x48, 0x81, 0xda, 0xb6, 0x66, 0x8e, 0xb0, 0x0a, 0xcb, 0x7d, 0x0a, 0x24, - 0xcc, 0xa7, 0xba, 0x4d, 0x5a, 0x6f, 0x58, 0x15, 0xd6, 0x0b, 0x10, 0xd6, - 0xf7, 0x98, 0x0c, 0x98, 0x1f, 0x29, 0x56, 0x43, 0x66, 0xe3, 0xbe, 0x45, - 0xeb, 0xa9, 0xec, 0xf1, 0xbc, 0x58, 0xa4, 0x30, 0x28, 0xa9, 0xba, 0xc2, - 0xe3, 0x56, 0xbc, 0x84, 0x8d, 0xe7, 0xe0, 0x6f, 0xf7, 0x7b, 0x01, 0xec, - 0x34, 0xae, 0xd0, 0x5b, 0x36, 0x59, 0xec, 0x4c, 0xda, 0x34, 0xf9, 0xf2, - 0x7c, 0x5e, 0x6c, 0xd6, 0xb7, 0xf2, 0x5c, 0x28, 0x53, 0xd7, 0x1f, 0xab, - 0x0c, 0xa8, 0x5f, 0x22, 0x1c, 0x78, 0x2d, 0x9c, 0xfc, 0x78, 0x35, 0xc7, - 0x16, 0x1f, 0xd3, 0x73, 0x00, 0x97, 0xf1, 0x3d, 0x07, 0x6a, 0x02, 0x3b, - 0x05, 0x89, 0xce, 0xbd, 0xe1, 0xc5, 0xcd, 0xab, 0x19, 0x72, 0x07, 0x8f, - 0x79, 0x12, 0x25, 0x53, 0x68, 0x7d, 0x06, 0x5d, 0xc5, 0x24, 0xff, 0x54, - 0xbc, 0x56, 0x03, 0xdc, 0xe8, 0x21, 0x7e, 0x4a, 0xd2, 0x3a, 0x3a, 0x9e, - 0xac, 0x8b, 0x0b, 0x1f, 0xe0, 0x5f, 0x85, 0xc0, 0x70, 0x0c, 0x8a, 0x59, - 0x06, 0x1a, 0x41, 0x61, 0x5a, 0xa6, 0x8e, 0x3d, 0xa9, 0xe3, 0x08, 0xd4, - 0xbf, 0x4e, 0xe0, 0x20, 0x08, 0xa5, 0x48, 0x01, 0x84, 0xd7, 0x12, 0x9c, - 0xbe, 0x54, 0xd6, 0x36, 0x76, 0x8b, 0xe1, 0x8e, 0x72, 0x7c, 0x7f, 0x1d, - 0x65, 0xe3, 0xc0, 0x2c, 0xba, 0x71, 0xff, 0xd0, 0xcc, 0xb3, 0x01, 0xd5, - 0x69, 0x2d, 0xb2, 0x52, 0x5a, 0x5b, 0x70, 0x68, 0x26, 0x98, 0x39, 0xce, - 0x91, 0x9d, 0x1a, 0xe7, 0x99, 0x33, 0x58, 0x53, 0x65, 0xb5, 0xfc, 0xbd, - 0xcf, 0x14, 0xc4, 0x65, 0xfa, 0x43, 0x41, 0x48, 0x4d, 0xaa, 0xb5, 0xde, - 0x16, 0x41, 0xae, 0xe1, 0xfd, 0x50, 0x60, 0x1e, 0xc0, 0x8f, 0xf7, 0x92, - 0xea, 0xbb, 0x79, 0xec, 0xcb, 0x18, 0x37, 0x3a, 0xc6, 0x8d, 0x86, 0x71, - 0x63, 0x61, 0x28, 0x2e, 0x8e, 0x72, 0x98, 0xde, 0x9f, 0xcf, 0x71, 0x86, - 0x7a, 0x7d, 0x33, 0x5e, 0xaf, 0x16, 0x93, 0x3c, 0x85, 0x19, 0xff, 0x0d, - 0x72, 0xea, 0xb9, 0x24, 0x9b, 0xbc, 0x2f, 0x29, 0x86, 0xbc, 0x9a, 0x8a, - 0x1f, 0xe7, 0x6b, 0x8a, 0x00, 0x0a, 0x54, 0x6e, 0xfa, 0xa0, 0x1e, 0xe8, - 0x05, 0xe6, 0x4b, 0x50, 0x4d, 0x01, 0xc6, 0x32, 0x29, 0x61, 0x7c, 0xa5, - 0xd1, 0xb7, 0x98, 0x9f, 0xc2, 0xe7, 0x99, 0x36, 0xce, 0x3a, 0xd4, 0xac, - 0x24, 0xfc, 0x61, 0x5f, 0x57, 0x52, 0x66, 0x06, 0x17, 0x0d, 0x91, 0xb5, - 0x31, 0x7c, 0x4b, 0x41, 0x20, 0x87, 0x7f, 0xda, 0x46, 0x9b, 0xcf, 0x2e, - 0x45, 0xf9, 0x54, 0x30, 0xf5, 0x26, 0xe8, 0xe1, 0x44, 0xfb, 0x8b, 0x82, - 0x9d, 0x79, 0x91, 0xac, 0xe7, 0xd7, 0xd9, 0x02, 0x9e, 0x11, 0x0c, 0x55, - 0x8f, 0xa8, 0x2b, 0x0a, 0x2e, 0xb1, 0xe9, 0x96, 0x9d, 0xaf, 0xae, 0x3e, - 0x13, 0x7e, 0x81, 0x87, 0x5a, 0x55, 0x1f, 0xb8, 0x80, 0x93, 0xd3, 0x1f, - 0x2e, 0x8b, 0x32, 0x3b, 0xfd, 0x0e, 0x95, 0x0d, 0xfd, 0xaf, 0x04, 0x94, - 0x93, 0x38, 0x18, 0xa7, 0xa1, 0xc6, 0xc5, 0x30, 0x7e, 0x34, 0xdc, 0xa3, - 0x78, 0x7f, 0xc7, 0x18, 0x6d, 0xe1, 0x68, 0x1b, 0xfb, 0x69, 0xf8, 0x9e, - 0x02, 0x43, 0xba, 0x46, 0x81, 0x63, 0x2f, 0x8f, 0xfd, 0x70, 0xd1, 0x38, - 0x97, 0xbc, 0xf1, 0x17, 0x7d, 0x73, 0x4f, 0x45, 0x93, 0x3a, 0x79, 0xc6, - 0x84, 0x45, 0x66, 0xb0, 0x03, 0x2c, 0xd5, 0x9c, 0x67, 0x3f, 0x5d, 0xce, - 0x73, 0x20, 0xb8, 0x9b, 0x14, 0x8b, 0x55, 0x59, 0x28, 0xbd, 0x33, 0x49, - 0x97, 0x22, 0x55, 0x17, 0xcd, 0x25, 0x94, 0x42, 0x41, 0xa2, 0x94, 0x45, - 0x7c, 0x97, 0xab, 0xa4, 0x8f, 0xb3, 0x0c, 0xe6, 0xe0, 0xc0, 0x67, 0x3b, - 0xe7, 0xb4, 0x6a, 0x02, 0xbb, 0xf1, 0x54, 0x59, 0x31, 0x81, 0x1d, 0x9a, - 0x89, 0x0c, 0xf2, 0x93, 0x27, 0x5b, 0xe1, 0xca, 0x55, 0xab, 0xaf, 0xd1, - 0xe6, 0xb6, 0xb7, 0x94, 0x23, 0x58, 0x24, 0x0d, 0xc4, 0x12, 0x6f, 0x40, - 0x8b, 0x39, 0x5a, 0xbd, 0x16, 0x3f, 0x8f, 0x61, 0xd1, 0x9c, 0x02, 0x0b, - 0x03, 0xad, 0xac, 0x81, 0xa0, 0xd6, 0xf7, 0xd9, 0xd0, 0x62, 0x7d, 0x3e, - 0x41, 0x43, 0xdb, 0xdb, 0xb3, 0x8b, 0x21, 0x9d, 0x1d, 0x91, 0x72, 0x90, - 0x36, 0x94, 0x77, 0x10, 0x7a, 0x0f, 0xfa, 0x1a, 0x01, 0x8c, 0x60, 0xa7, - 0x0e, 0x6a, 0x0c, 0x50, 0xc4, 0x6d, 0x1d, 0xd0, 0x0e, 0x00, 0x09, 0xc6, - 0x42, 0xdb, 0xcb, 0xe6, 0x18, 0xbf, 0xbe, 0xd4, 0xb6, 0x18, 0xc8, 0x82, - 0x68, 0x64, 0xdc, 0xb6, 0x76, 0x74, 0xcd, 0x0e, 0xc9, 0xec, 0xa1, 0xa1, - 0x40, 0x1a, 0xab, 0x8b, 0x9f, 0xf2, 0x32, 0xbd, 0x86, 0x3a, 0x46, 0x3e, - 0x6e, 0xe0, 0xf3, 0x46, 0xef, 0x62, 0xa1, 0x1f, 0x50, 0x80, 0x50, 0xd4, - 0x72, 0x9c, 0xc2, 0x26, 0xc6, 0x35, 0x01, 0xf0, 0xe6, 0x9b, 0xea, 0x00, - 0xad, 0xb2, 0x55, 0x57, 0x02, 0x9f, 0x7a, 0x9c, 0x48, 0xf8, 0x09, 0xe6, - 0x07, 0x8d, 0xe4, 0xf7, 0xdf, 0x06, 0xc9, 0xef, 0xbf, 0x1d, 0xc3, 0x03, - 0x58, 0x2f, 0xab, 0xd7, 0x8a, 0x26, 0x20, 0x82, 0x62, 0x09, 0x10, 0xe4, - 0x82, 0xf9, 0x31, 0xc3, 0x71, 0xc1, 0x29, 0xd2, 0x06, 0xae, 0xe5, 0x9c, - 0x03, 0x97, 0x4d, 0xa9, 0x36, 0x07, 0x21, 0xcb, 0x05, 0x54, 0x8b, 0xaf, - 0x7a, 0x8b, 0x31, 0x94, 0x74, 0x72, 0x0e, 0xed, 0x19, 0x6c, 0x45, 0xbc, - 0x02, 0x6a, 0x0c, 0xae, 0xe9, 0x08, 0x08, 0x8d, 0x00, 0x06, 0x3e, 0x80, - 0x01, 0x28, 0x8e, 0xdf, 0x40, 0x13, 0x93, 0x34, 0x00, 0x37, 0x1d, 0x25, - 0x43, 0xa9, 0xc9, 0x69, 0x91, 0xa6, 0x84, 0xf5, 0x36, 0x4e, 0xe2, 0x87, - 0x30, 0xe3, 0xd7, 0x75, 0x9e, 0x8f, 0xc0, 0xca, 0xe1, 0xff, 0xe9, 0xc8, - 0xd8, 0x01, 0x24, 0x84, 0xf7, 0x61, 0xe1, 0x00, 0xbe, 0x43, 0x54, 0xa6, - 0x1b, 0xfa, 0x2c, 0x3d, 0x62, 0x5c, 0xb4, 0xa8, 0x23, 0x51, 0x38, 0x54, - 0x19, 0xd8, 0xc6, 0xb1, 0xb9, 0x5e, 0x37, 0x68, 0x8e, 0x74, 0x9a, 0xe3, - 0x7a, 0x9a, 0x40, 0x4b, 0x92, 0xad, 0xa7, 0x39, 0xd6, 0x69, 0xee, 0xd4, - 0xd3, 0xdc, 0x66, 0x9a, 0xd7, 0x75, 0x34, 0x77, 0x74, 0x9a, 0xbb, 0x8d, - 0x34, 0x2b, 0x56, 0xeb, 0x68, 0xee, 0xea, 0x34, 0xf7, 0x1a, 0x65, 0xdf, - 0x8e, 0xa1, 0xb9, 0xa7, 0xd3, 0xdc, 0x8f, 0xab, 0xa3, 0x6d, 0x96, 0x9d, - 0x1a, 0x3d, 0x1b, 0xc4, 0x45, 0x65, 0x81, 0x43, 0x59, 0x36, 0x41, 0xf1, - 0xf4, 0x63, 0x06, 0xc4, 0x88, 0x16, 0x85, 0x4d, 0xb9, 0x80, 0x07, 0xf2, - 0x73, 0x4a, 0x9f, 0xc7, 0xda, 0xac, 0x53, 0x79, 0x95, 0xe7, 0x83, 0xd9, - 0x60, 0x4a, 0x54, 0x55, 0xb8, 0x13, 0x50, 0xd8, 0x48, 0x0d, 0x59, 0xd0, - 0x37, 0x1e, 0x9b, 0x6d, 0x1c, 0x9e, 0x80, 0x0d, 0x43, 0x59, 0xe2, 0xcb, - 0x4c, 0x7e, 0x81, 0x72, 0x9d, 0x8d, 0x71, 0xca, 0x2c, 0xb1, 0x80, 0x31, - 0x2e, 0xc5, 0x58, 0x77, 0xfa, 0x3e, 0x16, 0x3d, 0xd8, 0xc4, 0x7f, 0x5e, - 0xaa, 0x4d, 0x26, 0xaa, 0x51, 0x7a, 0x4c, 0xe3, 0xd5, 0x7c, 0x59, 0x45, - 0x77, 0xd9, 0x34, 0xc3, 0x3d, 0x33, 0x50, 0x38, 0xa6, 0xd4, 0x51, 0x05, - 0x73, 0xcc, 0x7a, 0x0c, 0x97, 0x4d, 0x56, 0x5f, 0x3d, 0x26, 0xc7, 0x24, - 0xba, 0x11, 0xf1, 0xe2, 0xe9, 0x57, 0xcf, 0xbf, 0x7c, 0xd9, 0x83, 0xd2, - 0xeb, 0x63, 0x3f, 0x13, 0xea, 0x09, 0x66, 0xd7, 0xc5, 0xfb, 0x51, 0xf5, - 0x51, 0xa0, 0x59, 0x29, 0x16, 0x16, 0xf8, 0x1a, 0xfa, 0x5c, 0x16, 0x48, - 0xa9, 0xea, 0xf0, 0xc6, 0x8d, 0xff, 0xdd, 0xfb, 0xf8, 0x8b, 0xcf, 0xe9, - 0x48, 0x06, 0x9e, 0x81, 0x93, 0x79, 0x76, 0x0a, 0x2b, 0x51, 0x55, 0x01, - 0xd5, 0x59, 0x04, 0xd7, 0x39, 0x14, 0x84, 0x35, 0x9b, 0x5f, 0x2e, 0x93, - 0x62, 0xbe, 0x3c, 0xc9, 0x12, 0x40, 0xc7, 0xf0, 0x54, 0x0b, 0xc2, 0xa5, - 0x98, 0xf3, 0x39, 0x86, 0xe2, 0x92, 0xbb, 0xa8, 0x59, 0x49, 0xd7, 0x49, - 0xd4, 0xba, 0x81, 0xde, 0xb1, 0x3b, 0x77, 0x30, 0x9e, 0xa0, 0x11, 0xa4, - 0xeb, 0x0e, 0x82, 0xdf, 0x81, 0x05, 0x6c, 0x22, 0x87, 0xc4, 0x4c, 0xb5, - 0x92, 0x34, 0xc2, 0x79, 0x55, 0x0c, 0x8b, 0x0b, 0xc6, 0x8a, 0x13, 0x73, - 0xdd, 0x01, 0x6d, 0x5c, 0x65, 0x95, 0xb2, 0xb6, 0x01, 0xd5, 0x9b, 0x70, - 0x3a, 0x5c, 0xa8, 0x07, 0xbd, 0x7a, 0xde, 0xdb, 0x2a, 0x4e, 0xf2, 0xf9, - 0xba, 0x7c, 0x1f, 0x1e, 0xd1, 0xcf, 0xe9, 0xea, 0xf4, 0x06, 0x7e, 0xbc, - 0xb7, 0x85, 0x7b, 0x3d, 0xf0, 0xe5, 0x0f, 0x9a, 0xd7, 0xed, 0xd8, 0xe4, - 0x8b, 0x01, 0x00 + 0x1f, 0x8b, 0x08, 0x08, 0xbc, 0x16, 0x96, 0x5d, 0x04, 0x00, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x00, 0xdc, 0x5d, 0x59, 0x77, + 0x1b, 0x4b, 0x11, 0x7e, 0xe7, 0x1c, 0xfe, 0xc3, 0x44, 0x81, 0x44, 0xe2, + 0x4a, 0xb2, 0x16, 0xdb, 0x38, 0x72, 0xe4, 0x8b, 0x93, 0xeb, 0x84, 0x40, + 0x36, 0xec, 0x40, 0x80, 0x90, 0x63, 0x46, 0x52, 0x4b, 0x1a, 0x3c, 0x9a, + 0x11, 0x33, 0xa3, 0xc8, 0x8e, 0xf1, 0x3f, 0xe1, 0x1c, 0x5e, 0x78, 0xe1, + 0x0f, 0xf0, 0xc4, 0x13, 0xfc, 0x31, 0xbe, 0xaa, 0xee, 0x9e, 0x9e, 0x4d, + 0xb2, 0xe4, 0x45, 0x2c, 0xbe, 0x37, 0x92, 0xa6, 0xbb, 0xba, 0xaa, 0xba, + 0xba, 0xba, 0xba, 0xba, 0x7a, 0x99, 0xa7, 0x0f, 0xbe, 0x7b, 0xf7, 0xfc, + 0xc3, 0x6f, 0xde, 0x1f, 0x59, 0xe3, 0x68, 0xe2, 0x1e, 0x7c, 0xff, 0x7b, + 0x4f, 0xd5, 0xb7, 0x85, 0xbf, 0xa7, 0x63, 0x61, 0x0f, 0xd4, 0x6f, 0x7e, + 0x8e, 0x9c, 0xc8, 0x15, 0x07, 0x6f, 0xfa, 0xaf, 0x9d, 0xd1, 0x38, 0x72, + 0xbc, 0xd1, 0xd3, 0x2d, 0x4e, 0x49, 0x82, 0x4c, 0x44, 0x64, 0x5b, 0xfd, + 0xb1, 0x1d, 0x84, 0x22, 0xea, 0x96, 0x7e, 0xf9, 0xe1, 0x45, 0x6d, 0xaf, + 0x94, 0xcb, 0xf7, 0xec, 0x89, 0xe8, 0x96, 0xbe, 0x38, 0x62, 0x3e, 0xf5, + 0x83, 0xa8, 0x64, 0xf5, 0x7d, 0x2f, 0x12, 0x1e, 0xe0, 0xe7, 0xce, 0x20, + 0x1a, 0x77, 0x07, 0xe2, 0x8b, 0xd3, 0x17, 0x35, 0x7e, 0xa8, 0x5a, 0x8e, + 0xe7, 0x44, 0x8e, 0xed, 0xd6, 0xc2, 0xbe, 0xed, 0x8a, 0x6e, 0xb3, 0xde, + 0x58, 0x84, 0x6f, 0xe2, 0xf7, 0x1c, 0x17, 0xc5, 0x44, 0xaf, 0x66, 0x4f, + 0xa7, 0xb5, 0xbe, 0x3d, 0xb5, 0x7b, 0xae, 0x48, 0x60, 0xbf, 0x10, 0x61, + 0xaa, 0xac, 0xeb, 0x78, 0x67, 0x56, 0x20, 0xdc, 0x6e, 0x29, 0x1c, 0x83, + 0x8f, 0xfe, 0x2c, 0xb2, 0x1c, 0x00, 0x97, 0xac, 0x71, 0x20, 0x86, 0xdd, + 0xd2, 0x38, 0x8a, 0xa6, 0x61, 0x67, 0x6b, 0x2b, 0xb0, 0xe7, 0xf5, 0x91, + 0x13, 0x8d, 0x67, 0xbd, 0x59, 0x28, 0x02, 0x85, 0xad, 0xde, 0xf7, 0x27, + 0x5b, 0x2f, 0xec, 0xde, 0x6b, 0xbb, 0x57, 0x7b, 0x3d, 0x13, 0x9e, 0xf0, + 0xb6, 0x8c, 0x5c, 0xb6, 0x26, 0x76, 0x18, 0x89, 0x60, 0xeb, 0x30, 0x18, + 0xcc, 0x1c, 0xcf, 0x4f, 0xe6, 0x0c, 0xec, 0xc8, 0xde, 0x1a, 0xda, 0x5f, + 0x88, 0x50, 0x1d, 0x1f, 0x25, 0x2b, 0xba, 0x98, 0x82, 0x79, 0x67, 0x62, + 0x8f, 0xc4, 0xd6, 0x79, 0x4d, 0x32, 0xb0, 0x55, 0xcc, 0x26, 0xaa, 0x85, + 0x0a, 0x46, 0xfe, 0xac, 0x3f, 0xae, 0xdd, 0x3b, 0xa7, 0x59, 0x62, 0xf5, + 0xa9, 0x37, 0x5a, 0x24, 0xbe, 0xe8, 0xc2, 0x15, 0xe1, 0x58, 0x88, 0x28, + 0xcb, 0xd1, 0x10, 0x3c, 0x84, 0xf5, 0x91, 0xef, 0x8f, 0x5c, 0x61, 0x4f, + 0x9d, 0x90, 0x99, 0xe9, 0x87, 0xe1, 0xb7, 0x43, 0x7b, 0xe2, 0xb8, 0x17, + 0xdd, 0x37, 0x36, 0xa8, 0xa3, 0x75, 0xbf, 0x79, 0x05, 0x0a, 0xe9, 0xd6, + 0x61, 0xa4, 0x48, 0xf8, 0x91, 0x75, 0x49, 0xa9, 0x3d, 0xbb, 0x7f, 0x36, + 0x0a, 0xfc, 0x99, 0x37, 0xa8, 0x05, 0x62, 0x2a, 0xec, 0xa8, 0x63, 0x79, + 0xbe, 0xfa, 0xb9, 0x4f, 0x00, 0x53, 0x7b, 0x30, 0x00, 0xdf, 0x1d, 0xab, + 0xc1, 0x8f, 0x13, 0x3b, 0x18, 0x39, 0x9e, 0x7c, 0xba, 0x02, 0x96, 0xaa, + 0xd5, 0xb1, 0x87, 0x20, 0x86, 0xef, 0x9e, 0x18, 0xfa, 0x81, 0x60, 0xb4, + 0xf8, 0x23, 0x85, 0x39, 0x73, 0xa2, 0x5a, 0xcf, 0x3f, 0xaf, 0x85, 0xce, + 0x57, 0x46, 0xe1, 0x78, 0x63, 0xb0, 0xc5, 0x78, 0xf1, 0x57, 0x90, 0x23, + 0x91, 0x52, 0x5f, 0xd1, 0x68, 0xa8, 0xa6, 0x04, 0x25, 0x3a, 0xbb, 0xad, + 0xfa, 0xce, 0x0f, 0x39, 0xbf, 0xe7, 0x0f, 0x2e, 0xf2, 0xf9, 0xcd, 0xfa, + 0x8e, 0x98, 0x28, 0xd4, 0x90, 0xa1, 0xa8, 0x8d, 0x05, 0xc9, 0x1c, 0xe9, + 0xbb, 0xfb, 0x09, 0xd8, 0xb9, 0x4c, 0xdd, 0x6e, 0x34, 0x92, 0xa9, 0x52, + 0x6e, 0x9d, 0xd2, 0x31, 0x3a, 0xc3, 0xdc, 0xbe, 0x28, 0x55, 0x4b, 0x3f, + 0x15, 0xee, 0x17, 0x11, 0x39, 0x7d, 0xfb, 0xad, 0x98, 0x89, 0xe4, 0xb3, + 0x25, 0x13, 0xe2, 0xe7, 0xea, 0x21, 0x49, 0xba, 0x1a, 0xda, 0x5e, 0x58, + 0x0b, 0x51, 0x89, 0xa1, 0xc2, 0xdb, 0xf7, 0x5d, 0x3f, 0xe8, 0x3c, 0x6c, + 0xb5, 0x5a, 0x92, 0xe9, 0x59, 0x14, 0xf9, 0x5e, 0xd5, 0xfa, 0x24, 0x15, + 0x53, 0x3e, 0x96, 0x3e, 0xc7, 0x09, 0x81, 0x40, 0xd7, 0x4e, 0x3c, 0x87, + 0xb3, 0xde, 0xc4, 0x91, 0x09, 0x81, 0xef, 0x26, 0x4a, 0xc8, 0x9a, 0xf7, + 0x67, 0x41, 0x08, 0xf4, 0xd6, 0xd4, 0x77, 0x3c, 0x88, 0x7f, 0x3f, 0x45, + 0xc3, 0xf1, 0xa6, 0xb3, 0xa8, 0x6a, 0xf9, 0xd3, 0x88, 0x9a, 0x76, 0x5a, + 0xb5, 0x42, 0xe1, 0x8a, 0x3e, 0x52, 0x22, 0x71, 0x1e, 0xd9, 0x81, 0xb0, + 0x09, 0x87, 0xac, 0xb9, 0x11, 0xbd, 0xb5, 0xf5, 0x23, 0xeb, 0x64, 0x2a, + 0xfa, 0xce, 0xf0, 0x82, 0x73, 0x74, 0x86, 0xed, 0xf5, 0x85, 0xe5, 0x0f, + 0x91, 0x16, 0x4c, 0x2c, 0xe0, 0x99, 0x08, 0xe8, 0x9e, 0xf5, 0xa3, 0xad, + 0x04, 0x45, 0x89, 0xce, 0xff, 0x22, 0x82, 0xa1, 0xeb, 0xcf, 0x3b, 0xd6, + 0x17, 0x27, 0x74, 0x60, 0x23, 0x18, 0xe5, 0xe1, 0x60, 0x80, 0xaa, 0x85, + 0xd6, 0xef, 0x75, 0xf6, 0xef, 0x2d, 0x54, 0xd4, 0x8a, 0x7c, 0xeb, 0xf7, + 0x63, 0x67, 0x30, 0x10, 0xde, 0xef, 0x41, 0xc8, 0x7a, 0x75, 0x64, 0xed, + 0x6d, 0x3d, 0xd9, 0x6a, 0x36, 0xb6, 0x9a, 0xcd, 0x34, 0xee, 0x4e, 0xa7, + 0x36, 0xf1, 0xbf, 0xd6, 0x86, 0x7e, 0x7f, 0x16, 0xd6, 0x1c, 0xcf, 0x13, + 0x41, 0x4e, 0x86, 0x79, 0x90, 0xac, 0x54, 0xf3, 0x10, 0x39, 0x39, 0xe7, + 0x41, 0x54, 0x07, 0xf1, 0x83, 0x81, 0x08, 0x6a, 0xdc, 0x6d, 0x3a, 0x56, + 0xbe, 0x4b, 0x18, 0x46, 0x4d, 0xf9, 0x00, 0xb9, 0x9b, 0xe5, 0xd2, 0x9f, + 0x45, 0xa4, 0xf3, 0xc4, 0x92, 0x61, 0x3a, 0xc3, 0x60, 0x95, 0x07, 0xa3, + 0xb5, 0x15, 0x90, 0x08, 0x98, 0xee, 0x6c, 0x4f, 0x61, 0x19, 0x02, 0xe8, + 0x04, 0x68, 0x49, 0x14, 0xdc, 0xca, 0xcf, 0xfd, 0x20, 0x10, 0x7d, 0x34, + 0xeb, 0x58, 0xa0, 0x39, 0x6d, 0x8c, 0x18, 0x4e, 0x74, 0x41, 0x8d, 0xcc, + 0x72, 0xb3, 0xfa, 0xae, 0xd3, 0x3f, 0xa3, 0x61, 0x83, 0xcd, 0x72, 0x48, + 0x2d, 0xee, 0xbc, 0x3b, 0x49, 0x37, 0xb4, 0xd6, 0x52, 0xa6, 0xc7, 0x9a, + 0x5a, 0x8b, 0x40, 0x28, 0x24, 0xbd, 0x23, 0xa3, 0xe4, 0x49, 0x7d, 0x7a, + 0xe1, 0x04, 0xb0, 0x33, 0xe7, 0xd6, 0x76, 0xe3, 0x9b, 0xaa, 0xf5, 0x8a, + 0x74, 0xdf, 0x83, 0x3a, 0x1d, 0x9d, 0x4f, 0xd1, 0xdb, 0x20, 0x8d, 0x66, + 0xb3, 0x06, 0xb4, 0xf9, 0xde, 0x90, 0xef, 0x03, 0x39, 0xfb, 0x27, 0x3b, + 0xac, 0xc5, 0x44, 0xa7, 0x80, 0xf0, 0xa2, 0xfd, 0xac, 0x02, 0x48, 0x3e, + 0x38, 0x99, 0xa1, 0x33, 0x86, 0xab, 0x33, 0x70, 0x42, 0xaa, 0xe5, 0xa0, + 0xfa, 0xfd, 0xef, 0x7d, 0xd2, 0xbf, 0x3f, 0xcb, 0x06, 0x9a, 0xda, 0x7d, + 0x88, 0x04, 0x4d, 0x52, 0xdf, 0x96, 0xc0, 0xf5, 0x5e, 0xe4, 0x9d, 0x9e, + 0xca, 0xd1, 0x44, 0x55, 0xda, 0x76, 0x9d, 0x91, 0x57, 0x73, 0x22, 0x31, + 0x09, 0x3b, 0x56, 0x5f, 0x50, 0xe5, 0x92, 0x2c, 0x04, 0xf6, 0xc0, 0x99, + 0x85, 0x31, 0x4d, 0xc3, 0x46, 0x3a, 0x09, 0x84, 0xa7, 0xae, 0x0d, 0x52, + 0x43, 0x57, 0x9c, 0x53, 0x0a, 0xff, 0xe8, 0x58, 0x4d, 0xab, 0x61, 0xd9, + 0xb3, 0xc8, 0xe7, 0xa4, 0x3f, 0xcc, 0xc2, 0x08, 0x3d, 0xbd, 0xa6, 0xe8, + 0x1b, 0x72, 0xc6, 0xc6, 0x27, 0xc1, 0xa7, 0x7e, 0x08, 0x77, 0x01, 0x4a, + 0x4e, 0x23, 0x93, 0x1d, 0x39, 0x5f, 0x58, 0x08, 0x2c, 0x2b, 0x99, 0x41, + 0x15, 0x6b, 0x87, 0x30, 0x4b, 0x3d, 0xa7, 0x5f, 0xeb, 0x89, 0xaf, 0x8e, + 0x08, 0xca, 0x8d, 0x7a, 0x6b, 0xa7, 0x8a, 0xf4, 0x3d, 0xfa, 0xc0, 0xaf, + 0x66, 0x85, 0x0b, 0xcd, 0xc7, 0xa8, 0x61, 0x2d, 0x84, 0x40, 0x58, 0x9e, + 0xf3, 0xc0, 0x9e, 0x72, 0x3a, 0x3b, 0x26, 0x71, 0x55, 0x8c, 0x90, 0xd6, + 0x92, 0xcd, 0xee, 0xf4, 0x3c, 0x29, 0x04, 0x42, 0xc7, 0x83, 0x81, 0x94, + 0x85, 0xa1, 0xd2, 0x6a, 0x36, 0x14, 0xa4, 0x1a, 0x26, 0xac, 0x36, 0x15, + 0x35, 0xd2, 0x6a, 0x98, 0xea, 0x27, 0x47, 0x19, 0xab, 0xb9, 0xcd, 0x60, + 0xe9, 0xd1, 0xc4, 0xda, 0x69, 0x34, 0x56, 0x16, 0x2b, 0xe8, 0x58, 0x7b, + 0x0a, 0x89, 0x31, 0x25, 0x56, 0x53, 0xd3, 0x9f, 0x38, 0x5e, 0x4d, 0x71, + 0xb9, 0x47, 0x70, 0x99, 0xfe, 0x1d, 0xf7, 0x8e, 0x81, 0xe8, 0xfb, 0x81, + 0x4d, 0xc2, 0x67, 0xb5, 0xbc, 0x59, 0x8b, 0x54, 0xa5, 0x06, 0x59, 0xcd, + 0x49, 0xb8, 0xac, 0xa1, 0x61, 0xbb, 0x69, 0xac, 0x73, 0x6b, 0xd4, 0x0c, + 0xc8, 0x9c, 0xc0, 0x74, 0xc3, 0xc0, 0x27, 0x2d, 0x03, 0xf9, 0x46, 0x35, + 0xd9, 0xc9, 0x0c, 0x3f, 0xf4, 0x47, 0x16, 0xab, 0x38, 0x57, 0x65, 0x87, + 0xc5, 0xb9, 0xf1, 0x5f, 0x2e, 0xd7, 0xe8, 0x46, 0xad, 0xd6, 0x73, 0xfd, + 0xfe, 0x99, 0x54, 0x11, 0xd3, 0xea, 0x49, 0xef, 0x63, 0x3f, 0x9d, 0xc5, + 0xf4, 0xa8, 0x89, 0x75, 0x56, 0xb6, 0xc3, 0xe4, 0xdd, 0x17, 0xd5, 0x7d, + 0x64, 0x4e, 0x5c, 0xde, 0xa4, 0x24, 0x9f, 0xe2, 0x66, 0x36, 0xca, 0x13, + 0xeb, 0xdc, 0x5e, 0xe3, 0x87, 0x29, 0xdf, 0xc0, 0x7a, 0xf8, 0xe2, 0xc5, + 0x0b, 0x95, 0x92, 0xb7, 0x43, 0x0f, 0x9c, 0x09, 0xb9, 0xf1, 0xb6, 0x32, + 0x43, 0xb1, 0xa6, 0xeb, 0xb2, 0xdb, 0x7d, 0x7b, 0xb8, 0xd3, 0x30, 0x50, + 0x46, 0x28, 0xf5, 0x19, 0x8c, 0x74, 0xd0, 0xb7, 0x43, 0x76, 0xc6, 0x8c, + 0xca, 0xef, 0x4a, 0x95, 0xcf, 0x1b, 0x57, 0x0d, 0x9f, 0x16, 0xac, 0x0f, + 0xf3, 0x39, 0xd1, 0x92, 0x95, 0x4f, 0xa6, 0x97, 0xe0, 0x2f, 0x60, 0xd5, + 0x37, 0x7a, 0x9b, 0x54, 0x1e, 0xbb, 0x17, 0xfa, 0xee, 0x2c, 0x12, 0x29, + 0x99, 0x68, 0xed, 0x4d, 0xa8, 0xb8, 0x49, 0x1a, 0xeb, 0x9e, 0x64, 0xd0, + 0x49, 0x08, 0x93, 0x92, 0x73, 0x46, 0x73, 0xbd, 0x7f, 0x27, 0x96, 0xf0, + 0x57, 0x8c, 0x8e, 0x03, 0x6a, 0x96, 0xed, 0x8c, 0xc8, 0x87, 0xc3, 0xe1, + 0x42, 0x91, 0x3f, 0x14, 0x4f, 0x9a, 0x62, 0xb7, 0xbd, 0x5c, 0xf2, 0x79, + 0xa8, 0x98, 0x5d, 0xd7, 0xad, 0x61, 0x8e, 0xe6, 0x8d, 0x44, 0x47, 0x3a, + 0xb7, 0x63, 0x7b, 0xe0, 0xcf, 0x55, 0xae, 0x49, 0xa0, 0xce, 0xde, 0x86, + 0x0d, 0xd8, 0xc1, 0xbf, 0x5a, 0x13, 0x1f, 0xc1, 0xa8, 0x67, 0x97, 0x1b, + 0x55, 0xfa, 0xaf, 0xde, 0xaa, 0xa0, 0x6b, 0xb2, 0x89, 0x20, 0x03, 0x85, + 0x9f, 0xc9, 0xcc, 0xe6, 0x36, 0xe7, 0x36, 0x29, 0x77, 0x2f, 0x9f, 0xdb, + 0xaa, 0xc8, 0xf6, 0xa3, 0x09, 0xd0, 0x62, 0xab, 0xb9, 0xcc, 0x3c, 0x1a, + 0xbd, 0x97, 0x5e, 0x31, 0x26, 0x01, 0xb3, 0x40, 0xa0, 0xef, 0x45, 0x34, + 0x77, 0x01, 0x8a, 0xc7, 0xc0, 0x67, 0x3f, 0x4e, 0xf5, 0xce, 0xeb, 0x21, + 0x13, 0xd6, 0xb3, 0x05, 0xeb, 0x79, 0xad, 0xa1, 0x4c, 0x7a, 0xef, 0x56, + 0xf3, 0x46, 0x66, 0xad, 0xc8, 0x68, 0xb1, 0xda, 0x2b, 0xb5, 0x4e, 0x08, + 0x8a, 0x3f, 0x6a, 0x35, 0x9a, 0x76, 0x2d, 0x71, 0xad, 0xeb, 0x13, 0x35, + 0xa5, 0xe2, 0x49, 0x5b, 0x58, 0x9f, 0x0c, 0x50, 0x02, 0x0c, 0x52, 0x11, + 0xad, 0x5c, 0xb2, 0x35, 0x5a, 0x3b, 0xe0, 0x40, 0x7d, 0x30, 0x2f, 0x0b, + 0x11, 0x0c, 0xec, 0xe0, 0x2c, 0x5f, 0xbe, 0x51, 0xb5, 0xe8, 0x7f, 0xae, + 0x8f, 0x2a, 0x0b, 0xb7, 0xe7, 0x03, 0x1c, 0xab, 0x37, 0xfe, 0xc0, 0x76, + 0xad, 0xb2, 0xd1, 0xdb, 0x0a, 0xbb, 0x3a, 0x0f, 0x27, 0x9c, 0x7e, 0x99, + 0x36, 0xdf, 0x43, 0xe7, 0x5c, 0x0c, 0x50, 0x3c, 0xd1, 0x15, 0x9a, 0xc9, + 0x21, 0x07, 0x53, 0xd0, 0x29, 0x92, 0x76, 0xa0, 0x65, 0xec, 0x57, 0xbd, + 0xf6, 0xfb, 0x3c, 0x96, 0xc0, 0xd5, 0x27, 0x2f, 0x8e, 0xf4, 0x15, 0xd8, + 0xb9, 0x39, 0xc4, 0x30, 0xd2, 0x3d, 0x8e, 0x0b, 0x35, 0x92, 0x03, 0x69, + 0xb3, 0xa1, 0xfa, 0x9c, 0x6c, 0xb0, 0x38, 0xc1, 0xcc, 0x07, 0x62, 0x53, + 0x98, 0xea, 0x72, 0xa6, 0xca, 0x52, 0x7f, 0x2b, 0xd2, 0xbb, 0xb3, 0x5d, + 0x97, 0x80, 0xa4, 0x44, 0x24, 0x03, 0xf9, 0x52, 0x49, 0xb5, 0x87, 0x3f, + 0x25, 0x8b, 0x3e, 0x73, 0xa9, 0xdc, 0x7c, 0x4b, 0xbb, 0x5a, 0xda, 0x0d, + 0xac, 0xb3, 0x78, 0xb4, 0xa2, 0x19, 0xef, 0x52, 0x69, 0x85, 0x51, 0xbc, + 0x42, 0x8b, 0x30, 0x14, 0xf4, 0x1f, 0x72, 0xf3, 0x86, 0xdd, 0x58, 0x23, + 0x12, 0x62, 0x56, 0xd3, 0xb7, 0x0b, 0xfd, 0x84, 0xdd, 0x46, 0xca, 0x41, + 0xe7, 0xae, 0x0c, 0x4b, 0xe9, 0x0c, 0xac, 0x87, 0x7b, 0x7b, 0x7b, 0x9c, + 0x65, 0x06, 0x0b, 0xd9, 0xf8, 0xa8, 0x01, 0xf1, 0x6e, 0x3b, 0xca, 0xd9, + 0x37, 0xee, 0x5c, 0x93, 0x65, 0xbd, 0x94, 0x37, 0xd5, 0xe3, 0xa4, 0x20, + 0xd0, 0xe1, 0xfd, 0x19, 0x24, 0xb0, 0xdc, 0x49, 0x6c, 0x32, 0x92, 0x38, + 0xa9, 0x46, 0xfe, 0x59, 0xc2, 0x4f, 0xcb, 0x19, 0x6f, 0x83, 0xb9, 0x1e, + 0xf8, 0x73, 0xc3, 0x61, 0x6d, 0xe0, 0x60, 0x4a, 0x20, 0x95, 0x11, 0x19, + 0x39, 0xc8, 0x7a, 0x20, 0xa0, 0x20, 0xa1, 0x58, 0x58, 0xa2, 0xa6, 0x00, + 0xd2, 0x25, 0xd1, 0x30, 0xb3, 0x89, 0x57, 0x5c, 0x48, 0xe6, 0x15, 0xc1, + 0x6b, 0x62, 0xcb, 0xca, 0x2d, 0xa5, 0x77, 0x60, 0xd5, 0xa9, 0x94, 0x2c, + 0x3f, 0xb1, 0xcf, 0x6b, 0x09, 0xf5, 0x4f, 0x17, 0x20, 0x39, 0x01, 0x2c, + 0x2d, 0x3e, 0xfa, 0x54, 0x60, 0xf0, 0x63, 0xbe, 0x70, 0x4f, 0xab, 0xb5, + 0x09, 0x2c, 0x33, 0x32, 0x40, 0x1f, 0xda, 0xea, 0x5f, 0xad, 0x95, 0x1e, + 0x1b, 0x1a, 0x72, 0x70, 0x50, 0xb9, 0xdb, 0xf8, 0xd7, 0xc8, 0x02, 0x34, + 0xb7, 0x25, 0x04, 0xeb, 0xd5, 0x5e, 0x21, 0x44, 0xab, 0x92, 0xf0, 0x2c, + 0x16, 0xe9, 0xe2, 0xee, 0xee, 0x6e, 0x8e, 0xdb, 0xdd, 0x62, 0x6e, 0xcd, + 0x48, 0xb6, 0x80, 0x5b, 0x35, 0x98, 0x5d, 0xcb, 0x6e, 0x73, 0x35, 0x7e, + 0xd3, 0x4c, 0x3d, 0x29, 0x66, 0x6a, 0x47, 0x91, 0xad, 0xb5, 0xb3, 0xf8, + 0x7e, 0xac, 0x28, 0x3e, 0x21, 0x8a, 0x24, 0xe0, 0x1c, 0xdb, 0x3b, 0x09, + 0x21, 0x37, 0x09, 0x49, 0xae, 0x19, 0xda, 0x0b, 0x45, 0xd8, 0x5e, 0x2e, + 0xc2, 0x66, 0xab, 0x98, 0xdd, 0x1f, 0xab, 0xd6, 0xaa, 0x6d, 0x17, 0xca, + 0x30, 0x66, 0x95, 0xe0, 0x5a, 0x0b, 0x85, 0xb8, 0x43, 0xb9, 0x94, 0xbd, + 0xbd, 0xa6, 0x10, 0x9b, 0x3b, 0xc5, 0x6c, 0xed, 0x29, 0x39, 0xd5, 0x76, + 0x16, 0xb2, 0x25, 0x69, 0x2e, 0x65, 0x8b, 0x45, 0x48, 0xa8, 0x76, 0x56, + 0x62, 0x8b, 0x3a, 0x4d, 0x95, 0x6c, 0xde, 0xd8, 0x71, 0x07, 0xec, 0x97, + 0xa0, 0xef, 0x51, 0xb0, 0x32, 0x6f, 0xa2, 0x16, 0x76, 0xc5, 0x87, 0x91, + 0xef, 0x63, 0x18, 0x91, 0xe6, 0xd2, 0xf8, 0x0e, 0x66, 0x9e, 0x94, 0xaf, + 0x2b, 0xcb, 0x6d, 0xb1, 0x1a, 0xab, 0xdc, 0x9d, 0xeb, 0xb5, 0xb8, 0xb1, + 0x40, 0x8b, 0x97, 0xcd, 0xae, 0xd2, 0x15, 0x48, 0x7b, 0x92, 0xf1, 0x78, + 0x4d, 0xc3, 0x70, 0x35, 0x7e, 0x22, 0xe7, 0x5b, 0x8b, 0x4c, 0xd5, 0x76, + 0xc5, 0x60, 0x42, 0xde, 0xf2, 0x1b, 0xaf, 0x9a, 0x47, 0x8b, 0x2c, 0x56, + 0x5e, 0x8c, 0x00, 0xce, 0x8c, 0x27, 0xd7, 0x58, 0x36, 0x0f, 0x76, 0x45, + 0x04, 0x7a, 0x3c, 0xc9, 0x97, 0x98, 0xeb, 0x8d, 0x96, 0x98, 0x2c, 0x9d, + 0xfe, 0x1b, 0x77, 0x41, 0xc6, 0x05, 0xcd, 0x4c, 0xc5, 0xe4, 0x08, 0xd7, + 0x75, 0xa6, 0xa1, 0x13, 0x16, 0xb2, 0xd8, 0xf1, 0xfc, 0xa8, 0xdc, 0x19, + 0x3a, 0x41, 0x18, 0xd5, 0x58, 0x7b, 0x2a, 0xd6, 0xa5, 0x19, 0x1b, 0x59, + 0x7e, 0x92, 0x6d, 0xa5, 0x24, 0x43, 0xdf, 0x07, 0x8f, 0x05, 0xf1, 0xea, + 0xbc, 0x67, 0x60, 0xa6, 0x7d, 0x45, 0x99, 0xc5, 0xb2, 0xbe, 0xeb, 0x19, + 0x69, 0xac, 0x3b, 0x29, 0xd5, 0x31, 0xad, 0xc7, 0xc6, 0xca, 0x74, 0xa7, + 0x85, 0xf3, 0xd8, 0xc4, 0x94, 0xd1, 0x54, 0x4d, 0xe7, 0xa9, 0xae, 0x95, + 0x03, 0x59, 0x98, 0x6d, 0xe6, 0x73, 0xb9, 0x38, 0x8a, 0x21, 0x9e, 0xec, + 0x81, 0xf5, 0x56, 0xc6, 0x79, 0xaf, 0x6f, 0xf3, 0xbc, 0xa7, 0xda, 0xac, + 0xa8, 0x52, 0xab, 0x43, 0xb3, 0x77, 0xf4, 0x93, 0x89, 0x18, 0x38, 0xb6, + 0xe5, 0x7b, 0xee, 0x85, 0x15, 0xf6, 0x03, 0x21, 0x3c, 0xcb, 0xf6, 0x06, + 0x56, 0x39, 0xe1, 0xa6, 0x3c, 0xa1, 0x99, 0xaf, 0xd2, 0x86, 0xac, 0x33, + 0x95, 0x32, 0x21, 0x4f, 0x1a, 0x5a, 0xab, 0xaf, 0x80, 0x7d, 0x25, 0xdc, + 0xcd, 0xd6, 0xee, 0xf6, 0x6a, 0xc8, 0x9b, 0xcd, 0xbd, 0x9d, 0xb5, 0xb1, + 0x3f, 0x69, 0xac, 0x8a, 0xfd, 0xc7, 0xab, 0x62, 0x4f, 0x54, 0x77, 0xe7, + 0x49, 0x31, 0xf2, 0xbc, 0x62, 0xe5, 0x11, 0xc3, 0x53, 0xcf, 0xb1, 0xdb, + 0xd0, 0xc8, 0x48, 0x5f, 0xea, 0xe7, 0x61, 0x53, 0x3e, 0x2a, 0x57, 0xa8, + 0x67, 0xa3, 0xeb, 0xc2, 0xb3, 0xad, 0xb7, 0x53, 0x7f, 0xad, 0x1f, 0xee, + 0x27, 0x80, 0x46, 0x01, 0x9b, 0xe4, 0xfd, 0x4c, 0x05, 0x17, 0x16, 0xbb, + 0x4a, 0xd2, 0x6b, 0xe5, 0xe9, 0x11, 0xfb, 0xf5, 0xdd, 0xd4, 0xdf, 0xf6, + 0x6a, 0x04, 0xf3, 0xe5, 0x0a, 0x28, 0xb6, 0x8b, 0x28, 0xb6, 0x76, 0x56, + 0xa3, 0x00, 0xb8, 0x3c, 0xc6, 0xed, 0x22, 0x8c, 0xed, 0x76, 0xa6, 0xf6, + 0xab, 0x11, 0xc8, 0x17, 0xcb, 0xd3, 0xdb, 0x29, 0xa2, 0xb7, 0xdd, 0x4c, + 0xd7, 0xfd, 0xc7, 0xab, 0xd1, 0xcb, 0x17, 0xcb, 0xd3, 0xdb, 0x2d, 0xa2, + 0xb7, 0xd3, 0x58, 0x8d, 0x00, 0xe0, 0xf2, 0x18, 0x7f, 0x5c, 0x88, 0x31, + 0xab, 0x2f, 0xbb, 0x2b, 0x52, 0xc8, 0x97, 0xcb, 0x53, 0xdc, 0x2b, 0xa2, + 0xb8, 0x9b, 0xd1, 0x97, 0x15, 0x09, 0xe6, 0x8b, 0xe5, 0xe9, 0x3d, 0x29, + 0xa2, 0xf7, 0xe3, 0x15, 0xb5, 0xec, 0xc7, 0x45, 0x5a, 0xd6, 0x6c, 0x14, + 0x76, 0xcd, 0x8c, 0xbe, 0xac, 0xd8, 0x53, 0x72, 0xc5, 0x8a, 0x08, 0x16, + 0xda, 0x82, 0x27, 0xcd, 0x1b, 0xc9, 0xec, 0x49, 0xf3, 0x7a, 0x99, 0x35, + 0x8b, 0x8d, 0x41, 0x63, 0x45, 0x4d, 0x23, 0xc0, 0xd5, 0x8c, 0xde, 0x2e, + 0x0d, 0x1a, 0x29, 0xc3, 0x17, 0x4e, 0x36, 0x6b, 0xf8, 0xc2, 0xc9, 0xa6, + 0x0d, 0x5f, 0x38, 0xb9, 0x6b, 0xc3, 0x17, 0x4e, 0x36, 0x6b, 0xf8, 0xc2, + 0xc9, 0x66, 0x0d, 0x5f, 0x38, 0xb9, 0x6b, 0xc3, 0x17, 0x4e, 0x36, 0x6d, + 0xf8, 0xc2, 0xc9, 0x66, 0x0d, 0x5f, 0x38, 0xb9, 0x6b, 0xc3, 0x17, 0x4e, + 0x36, 0x6c, 0xf8, 0xc2, 0xc9, 0x86, 0x0d, 0x5f, 0x38, 0xd9, 0x98, 0xe1, + 0xd3, 0x6e, 0xb5, 0x21, 0x3e, 0x19, 0x6c, 0xd6, 0xf0, 0x4d, 0x06, 0x9b, + 0x36, 0x7c, 0x93, 0xc1, 0x5d, 0x1b, 0xbe, 0xc9, 0x60, 0xb3, 0x86, 0x6f, + 0x32, 0xd8, 0xac, 0xe1, 0x9b, 0x0c, 0xee, 0xda, 0xf0, 0x4d, 0x06, 0x9b, + 0x36, 0x7c, 0x93, 0xc1, 0x66, 0x0d, 0xdf, 0x64, 0x70, 0xd7, 0x86, 0x6f, + 0x32, 0xd8, 0xb0, 0xe1, 0x9b, 0x0c, 0x36, 0x6c, 0xf8, 0x26, 0x83, 0x8d, + 0x19, 0xbe, 0x78, 0xce, 0x6f, 0xa8, 0xbb, 0xa3, 0xcd, 0x5a, 0x3e, 0x77, + 0xb4, 0x69, 0xcb, 0xe7, 0x8e, 0xee, 0xda, 0xf2, 0xb9, 0xa3, 0xcd, 0x5a, + 0x3e, 0x77, 0xb4, 0x59, 0xcb, 0xe7, 0x8e, 0xee, 0xda, 0xf2, 0xb9, 0xa3, + 0x4d, 0x5b, 0x3e, 0x77, 0xb4, 0x59, 0xcb, 0xe7, 0x8e, 0xee, 0xda, 0xf2, + 0xb9, 0xa3, 0x0d, 0x5b, 0x3e, 0x77, 0xb4, 0x61, 0xcb, 0xe7, 0x8e, 0x36, + 0x67, 0xf9, 0xe2, 0x78, 0xa4, 0x99, 0x69, 0xbb, 0x9b, 0xb5, 0x7c, 0xe7, + 0xee, 0xa6, 0x2d, 0xdf, 0xb9, 0x7b, 0xd7, 0x96, 0xef, 0xdc, 0xdd, 0xac, + 0xe5, 0x3b, 0x77, 0x37, 0x6b, 0xf9, 0xce, 0xdd, 0xbb, 0xb6, 0x7c, 0xe7, + 0xee, 0xa6, 0x2d, 0xdf, 0xb9, 0xbb, 0x59, 0xcb, 0x77, 0xee, 0xde, 0xb5, + 0xe5, 0x3b, 0x77, 0x37, 0x6c, 0xf9, 0xce, 0xdd, 0x0d, 0x5b, 0xbe, 0x73, + 0xf7, 0x5e, 0x2c, 0xdf, 0xb2, 0x35, 0x93, 0x9d, 0x27, 0x89, 0x35, 0x13, + 0xb9, 0x52, 0x59, 0x3b, 0x0f, 0x6b, 0x54, 0x24, 0xb3, 0x0b, 0x55, 0xae, + 0x36, 0x27, 0x57, 0xb8, 0x0d, 0xa1, 0x3a, 0xad, 0x7f, 0xca, 0xa5, 0x96, + 0x14, 0x8b, 0xcd, 0xdc, 0x82, 0xb8, 0xa2, 0x51, 0x88, 0x5b, 0x42, 0xf0, + 0xe6, 0x2d, 0x9b, 0x96, 0x6a, 0x70, 0x7e, 0x43, 0x9e, 0x09, 0xf8, 0xd1, + 0x16, 0xad, 0xa0, 0x3b, 0x41, 0x1f, 0x47, 0x8d, 0xe8, 0xd4, 0x58, 0x74, + 0x7a, 0x2a, 0x9f, 0xd4, 0xd2, 0xb0, 0xe7, 0x4c, 0xd4, 0xc6, 0xe1, 0x24, + 0x50, 0x6d, 0xe8, 0xc0, 0xe4, 0x63, 0xc5, 0x4d, 0x6e, 0x84, 0x91, 0xfb, + 0xed, 0xe9, 0x38, 0x86, 0x45, 0x85, 0x12, 0xfb, 0x45, 0x03, 0x3f, 0xc2, + 0x66, 0xb6, 0x72, 0xed, 0x49, 0x63, 0x20, 0x46, 0x72, 0xf7, 0x55, 0xab, + 0x6a, 0xb5, 0x01, 0x99, 0x02, 0xac, 0xf9, 0x58, 0xa5, 0x76, 0xe2, 0xb5, + 0x52, 0x86, 0xdb, 0x96, 0xdb, 0xb2, 0x72, 0xec, 0x39, 0xde, 0xd0, 0x5f, + 0xc6, 0x9c, 0x3e, 0x79, 0x40, 0xec, 0x01, 0xf7, 0xdc, 0x0e, 0x06, 0xe1, + 0x7e, 0x7a, 0x63, 0xfd, 0x7e, 0x9a, 0x4b, 0xf9, 0xd3, 0x05, 0xa3, 0xbf, + 0x29, 0x63, 0xcf, 0x86, 0x98, 0xa8, 0x15, 0xc3, 0x9f, 0x9c, 0x89, 0x8b, + 0x61, 0x80, 0xa3, 0x6d, 0x61, 0xbe, 0xf2, 0x6a, 0xc3, 0x00, 0x38, 0xc1, + 0xc1, 0x85, 0xc0, 0x3f, 0x13, 0xd8, 0xa3, 0x17, 0x22, 0x37, 0xb0, 0x89, + 0x00, 0x69, 0xcb, 0xbe, 0x75, 0x95, 0xc3, 0x92, 0xe7, 0x52, 0xe3, 0x91, + 0xdf, 0x31, 0x93, 0x7a, 0x0b, 0xde, 0x42, 0x36, 0x2b, 0x09, 0x15, 0xa1, + 0xe3, 0x38, 0x1e, 0x36, 0xa4, 0xd1, 0x3e, 0x86, 0x2d, 0xeb, 0x83, 0x8f, + 0x13, 0x65, 0x72, 0xbb, 0x5f, 0xc8, 0xa9, 0x8a, 0x08, 0x9f, 0xb5, 0x91, + 0xc7, 0x2d, 0x52, 0x0b, 0xe7, 0x89, 0x31, 0xbb, 0xc5, 0xdb, 0xd3, 0x72, + 0x2b, 0xe1, 0xd8, 0x8d, 0x82, 0x05, 0xc3, 0x45, 0xfb, 0xde, 0xd0, 0xbf, + 0x91, 0x95, 0xdf, 0x36, 0x6b, 0x76, 0xce, 0x2d, 0xdb, 0x85, 0xdf, 0x62, + 0xc4, 0xd9, 0x25, 0xc4, 0x15, 0x37, 0x28, 0x12, 0x7b, 0x3c, 0x06, 0x98, + 0x1d, 0x87, 0xed, 0x82, 0x0d, 0x76, 0xcd, 0x1f, 0xab, 0x95, 0x7c, 0x23, + 0x91, 0x3a, 0x0e, 0x1c, 0xce, 0xdb, 0x8d, 0x46, 0x23, 0x27, 0x1a, 0xf9, + 0x3b, 0xb3, 0x63, 0x3d, 0xa1, 0x69, 0x43, 0x7b, 0x20, 0x1c, 0x8f, 0x76, + 0x8f, 0x86, 0x55, 0x7e, 0xc0, 0x4e, 0x2e, 0x7e, 0xb2, 0x5a, 0xf8, 0xe0, + 0x52, 0xeb, 0x40, 0xe7, 0x98, 0xda, 0xb9, 0x5b, 0xa6, 0xb6, 0xd7, 0x62, + 0x6a, 0x7b, 0x01, 0x53, 0xcd, 0x3b, 0xe6, 0xaa, 0xb9, 0x1e, 0x5b, 0x0c, + 0xae, 0xfa, 0xa4, 0xa6, 0x13, 0xf7, 0x2a, 0x55, 0x4e, 0x19, 0xc8, 0x80, + 0x36, 0xa2, 0xab, 0xbd, 0xa7, 0xc9, 0x1e, 0x7f, 0xa5, 0xbb, 0x99, 0xd1, + 0x92, 0x64, 0x5f, 0x53, 0x5d, 0xf5, 0x5e, 0x90, 0xe6, 0x38, 0xd6, 0x95, + 0x33, 0xd8, 0x17, 0x60, 0x30, 0x04, 0xf2, 0xc4, 0x35, 0xf6, 0x7b, 0xc1, + 0x0a, 0x8b, 0x72, 0x4c, 0x9d, 0x5c, 0x0c, 0xac, 0x70, 0xee, 0x44, 0xfd, + 0xb1, 0x55, 0xc3, 0xfe, 0xef, 0x30, 0xc2, 0x71, 0x64, 0xda, 0xf5, 0xdb, + 0x1f, 0x8b, 0xfe, 0x99, 0xde, 0xf6, 0x5b, 0x57, 0x10, 0x97, 0x8b, 0xb6, + 0x2d, 0xe5, 0x37, 0x91, 0xcb, 0xa3, 0x18, 0xe9, 0x7e, 0x9f, 0xb6, 0x3c, + 0xe6, 0x59, 0x7b, 0x45, 0xb9, 0x43, 0x38, 0x6a, 0xff, 0x51, 0xcc, 0x80, + 0x3c, 0xbd, 0x65, 0x65, 0xce, 0x50, 0x25, 0x71, 0x34, 0x52, 0x08, 0x1a, + 0xba, 0x34, 0x36, 0xe1, 0xc9, 0xf1, 0x75, 0xd1, 0xb1, 0x84, 0xfc, 0x3e, + 0x6f, 0xb3, 0xbf, 0x39, 0xbb, 0xed, 0x39, 0x30, 0xc8, 0xcd, 0x51, 0x88, + 0xc6, 0x22, 0xdb, 0xd9, 0xeb, 0xf5, 0x90, 0xb5, 0x60, 0xfb, 0xcb, 0xb6, + 0xec, 0x21, 0xf9, 0x34, 0xc3, 0xb5, 0x3a, 0x49, 0xbb, 0x94, 0xf9, 0x78, + 0xdf, 0x7c, 0xa9, 0x94, 0xaa, 0x7f, 0x6b, 0x37, 0x29, 0x61, 0xf5, 0x6c, + 0xaa, 0x23, 0xc5, 0x6b, 0xea, 0xb0, 0xbd, 0x68, 0x04, 0x90, 0xdb, 0xb4, + 0x6e, 0x56, 0x0d, 0x6e, 0xb2, 0x0e, 0xab, 0x13, 0x54, 0xed, 0x1b, 0x2b, + 0x6e, 0x8c, 0x62, 0x4a, 0xc9, 0x42, 0x7c, 0xb0, 0xd1, 0x14, 0x29, 0xd8, + 0x97, 0x28, 0xcf, 0x3f, 0x2c, 0x23, 0x64, 0xe4, 0x97, 0xe6, 0x3e, 0x3f, + 0xe2, 0xfe, 0xba, 0x4c, 0xe2, 0xa9, 0xc8, 0x5a, 0x4e, 0xc2, 0x6b, 0x61, + 0x96, 0xe7, 0x9b, 0x06, 0xac, 0x73, 0xfd, 0x40, 0x3f, 0x3b, 0x32, 0x2a, + 0x05, 0xcf, 0xc3, 0xa6, 0x58, 0xce, 0x1f, 0x6a, 0x51, 0x25, 0x20, 0x1b, + 0xb4, 0x9a, 0x3a, 0x0a, 0xb5, 0xa4, 0x6b, 0xa6, 0x0f, 0x35, 0x5b, 0x7c, + 0x40, 0x39, 0xb5, 0x4f, 0xb5, 0x65, 0xf6, 0xa9, 0xda, 0xb6, 0xbd, 0xec, + 0x1c, 0x9d, 0xd9, 0xe3, 0x9e, 0x12, 0xba, 0x3a, 0x23, 0xca, 0x2d, 0xa8, + 0x8f, 0x88, 0x2e, 0x45, 0xbf, 0x90, 0x40, 0xec, 0x95, 0x18, 0x05, 0xd5, + 0xc6, 0x8a, 0xb1, 0x6b, 0x2b, 0x23, 0x7d, 0x1f, 0x4e, 0xaa, 0xa9, 0xa4, + 0xcb, 0x14, 0x83, 0xdb, 0x6c, 0x4b, 0xf2, 0xea, 0x42, 0xdb, 0x58, 0x99, + 0x8f, 0x05, 0x35, 0x6d, 0xaa, 0x1d, 0x81, 0x59, 0xec, 0x1d, 0xd5, 0x26, + 0x97, 0xa9, 0xee, 0xf6, 0xf8, 0x0d, 0x76, 0x23, 0x5a, 0xb2, 0xe9, 0x42, + 0x32, 0xb7, 0x72, 0x9b, 0xa6, 0xf5, 0x9c, 0x79, 0xc5, 0xff, 0xec, 0x13, + 0x59, 0xde, 0x6c, 0xd2, 0x23, 0x80, 0x9e, 0x88, 0xe6, 0x34, 0x8b, 0x68, + 0x00, 0x94, 0xce, 0x83, 0xc0, 0x9c, 0xd1, 0xe9, 0x0a, 0x95, 0x0f, 0x1f, + 0x48, 0xb8, 0x83, 0xf0, 0x71, 0xd6, 0xd3, 0x4a, 0x3a, 0x5b, 0xa9, 0xaa, + 0x6c, 0x53, 0x55, 0xda, 0xfc, 0x17, 0x4b, 0xc9, 0xb5, 0x7b, 0xc2, 0x95, + 0x07, 0xb2, 0xf9, 0x67, 0x5a, 0x2a, 0x7b, 0x69, 0x73, 0x10, 0xbb, 0x82, + 0x79, 0x3f, 0x2e, 0xc5, 0xc4, 0xe1, 0xe1, 0x61, 0xc2, 0x6e, 0x73, 0x8b, + 0x16, 0x6a, 0x49, 0x5e, 0xe4, 0x34, 0xa2, 0x88, 0x88, 0xb9, 0x6d, 0x19, + 0x6e, 0x73, 0xaa, 0x23, 0x05, 0x80, 0xd3, 0xc6, 0x92, 0xe7, 0x85, 0xc3, + 0x89, 0xae, 0xa6, 0x96, 0x18, 0xa3, 0x90, 0x23, 0x94, 0x6e, 0x84, 0x3c, + 0xd6, 0xcb, 0x15, 0x6a, 0xd8, 0x6c, 0x36, 0xf3, 0x23, 0x91, 0x91, 0x1c, + 0xd7, 0x2d, 0x3e, 0x89, 0x95, 0xb3, 0x92, 0xb9, 0x63, 0xc2, 0x66, 0x84, + 0xe3, 0x2d, 0xa6, 0xd4, 0x56, 0xe9, 0xa3, 0x9b, 0x72, 0xc6, 0xb6, 0xa4, + 0x17, 0x2e, 0xee, 0x88, 0x59, 0x4b, 0xab, 0x40, 0xac, 0x06, 0xed, 0x8e, + 0x14, 0x76, 0x98, 0xdb, 0xd1, 0x6c, 0xa4, 0xdf, 0xe0, 0x3f, 0x12, 0xe2, + 0x52, 0x81, 0x49, 0xbb, 0x7b, 0xb9, 0x80, 0xb9, 0x9d, 0xc6, 0x5e, 0x7f, + 0xd8, 0xcf, 0x74, 0xcb, 0x80, 0xd5, 0x5e, 0xa1, 0x5c, 0xd8, 0x20, 0x0c, + 0xf5, 0xf9, 0xd2, 0x8c, 0x50, 0xb1, 0x46, 0xe6, 0xbb, 0xe1, 0x42, 0x79, + 0x25, 0xe6, 0xea, 0x8b, 0x6b, 0xba, 0xcd, 0x7f, 0x55, 0xa9, 0x7e, 0xd9, + 0x64, 0xe2, 0x7d, 0x19, 0x83, 0xd5, 0x7c, 0x52, 0xa7, 0xa3, 0x47, 0x0e, + 0x59, 0xaa, 0x16, 0x8d, 0x21, 0x2b, 0xae, 0x49, 0x7c, 0x06, 0x3e, 0xc9, + 0xa4, 0x86, 0x2e, 0xc8, 0xbc, 0xb2, 0x58, 0x6e, 0x6a, 0x48, 0x63, 0x3c, + 0x29, 0x81, 0xad, 0x45, 0x3c, 0x1e, 0xe8, 0x1b, 0x99, 0x81, 0x7e, 0xbb, + 0x48, 0xae, 0x04, 0xf7, 0xc3, 0x22, 0x6f, 0x27, 0xa7, 0xcf, 0x0f, 0xfb, + 0xfc, 0xb7, 0x48, 0x41, 0x05, 0xff, 0x15, 0x8a, 0x7f, 0x7b, 0x45, 0xf1, + 0x3f, 0xec, 0xb1, 0x1b, 0xa5, 0xba, 0xfc, 0x27, 0xd8, 0xd6, 0xae, 0x4c, + 0x31, 0xe3, 0x47, 0xde, 0x97, 0x8a, 0xb5, 0xf7, 0x61, 0x38, 0x15, 0x18, + 0xe4, 0x93, 0xa5, 0x39, 0x65, 0xa5, 0xc2, 0x5b, 0x3f, 0x52, 0x06, 0xfa, + 0x23, 0x6e, 0x53, 0x71, 0x13, 0x43, 0xc9, 0xe9, 0x9c, 0x12, 0x4e, 0xfb, + 0xb6, 0xf7, 0xc5, 0x0e, 0x35, 0xa6, 0x45, 0xa7, 0x91, 0x75, 0xf8, 0x93, + 0x37, 0x09, 0x9b, 0x50, 0x52, 0x3e, 0xd9, 0x98, 0x32, 0xe3, 0x12, 0x5f, + 0x7f, 0x50, 0x3a, 0xf6, 0x54, 0xec, 0x69, 0x6d, 0x0c, 0xb9, 0xf0, 0xf9, + 0xc2, 0x5a, 0xf1, 0xd1, 0x40, 0xf2, 0x37, 0x16, 0x9f, 0xad, 0x56, 0xea, + 0x9e, 0xac, 0xa1, 0x2b, 0x46, 0x42, 0xbb, 0x24, 0x46, 0x67, 0xda, 0x3f, + 0xcc, 0x9c, 0xbe, 0xdd, 0xd6, 0xe6, 0x26, 0x3f, 0x14, 0x2c, 0xf3, 0xf7, + 0x17, 0xec, 0xde, 0xcf, 0x69, 0x5d, 0x6a, 0xc4, 0x57, 0x27, 0x10, 0xeb, + 0x3b, 0x81, 0x98, 0x14, 0xb9, 0x02, 0x0d, 0x93, 0x93, 0x9c, 0x51, 0xd4, + 0xf7, 0x74, 0xea, 0x42, 0x1b, 0x6f, 0x34, 0x78, 0x99, 0xef, 0x71, 0x95, + 0xb8, 0x15, 0x67, 0x4b, 0x5f, 0x8b, 0x23, 0x9f, 0x12, 0x37, 0x34, 0x3d, + 0xa5, 0xdb, 0x66, 0x0e, 0x12, 0xa0, 0x03, 0xe7, 0x8b, 0xe5, 0x0c, 0x70, + 0x81, 0x06, 0x02, 0x76, 0x10, 0xfc, 0x29, 0x42, 0x51, 0x1e, 0x38, 0x2b, + 0xc9, 0xab, 0x2e, 0xba, 0x25, 0x2d, 0x25, 0x6a, 0x88, 0x92, 0x2a, 0x18, + 0x17, 0x1e, 0x37, 0x0f, 0x14, 0x3c, 0x88, 0x34, 0xb3, 0xb9, 0xd3, 0x83, + 0x37, 0x4e, 0x3f, 0xf0, 0x43, 0x7f, 0x18, 0xbd, 0x3a, 0x7a, 0xba, 0x35, + 0x4d, 0x92, 0xdd, 0x02, 0xdd, 0x22, 0x36, 0xf8, 0x74, 0xa3, 0xa6, 0x93, + 0xca, 0xed, 0xbb, 0x76, 0x18, 0x32, 0x80, 0x39, 0xfe, 0xa8, 0x01, 0x53, + 0xc0, 0xe1, 0x97, 0x91, 0x45, 0xb7, 0x46, 0xa1, 0x63, 0x77, 0x4b, 0xe8, + 0xba, 0xb4, 0xa0, 0xb0, 0xd7, 0x6e, 0x3c, 0xd9, 0xdb, 0xdb, 0x6d, 0x25, + 0x7f, 0x97, 0xa4, 0xde, 0x74, 0x4b, 0xad, 0x46, 0xa3, 0xa4, 0x54, 0x46, + 0x3d, 0x9c, 0x4f, 0x5c, 0x2f, 0x94, 0xf7, 0x13, 0xe1, 0x7a, 0xa2, 0xf9, + 0x7c, 0x5e, 0x9f, 0xb7, 0xeb, 0x7e, 0x30, 0xda, 0x42, 0x6e, 0x63, 0x0b, + 0x04, 0x34, 0xe1, 0x1c, 0x71, 0x19, 0x3d, 0x53, 0xe1, 0xb6, 0x6e, 0xe9, + 0xa1, 0x18, 0xd2, 0x7f, 0x25, 0x1d, 0x7f, 0x53, 0x14, 0x41, 0x9b, 0xe2, + 0x73, 0xdd, 0x12, 0x4b, 0xd5, 0xea, 0x83, 0x51, 0x2c, 0xdc, 0x3c, 0x69, + 0xee, 0x6c, 0x3f, 0xd9, 0x6e, 0x37, 0x91, 0x70, 0x91, 0x49, 0x08, 0xf0, + 0xbc, 0x93, 0x78, 0xde, 0x5a, 0x4e, 0x9f, 0x45, 0x49, 0x87, 0xe0, 0x21, + 0x23, 0x7b, 0x84, 0xb0, 0x1f, 0x91, 0xd1, 0x12, 0x2c, 0x0a, 0xa4, 0x96, + 0x0c, 0xc7, 0x8d, 0x86, 0xdd, 0xef, 0x37, 0xf3, 0x1c, 0x67, 0x43, 0x88, + 0xc4, 0x62, 0xa3, 0x8a, 0x51, 0x2c, 0xce, 0xa1, 0x5e, 0x84, 0xfb, 0xb4, + 0xba, 0x25, 0x36, 0x5b, 0xf7, 0x56, 0xc5, 0x91, 0xae, 0x48, 0x3e, 0xe4, + 0xaa, 0x9b, 0xa5, 0xb0, 0x1c, 0xf5, 0xae, 0xb4, 0x60, 0xc0, 0x57, 0x96, + 0xad, 0x0b, 0xe6, 0x62, 0xa7, 0x24, 0xcf, 0xc0, 0x4c, 0x00, 0x46, 0x41, + 0x78, 0x41, 0x55, 0x03, 0x41, 0x3c, 0x06, 0x50, 0x4f, 0xd5, 0x51, 0xbd, + 0xfe, 0xd8, 0x07, 0xd7, 0xf2, 0xf2, 0x88, 0x52, 0x1c, 0xcc, 0x03, 0x20, + 0x6e, 0x33, 0x6b, 0x36, 0x7e, 0xf8, 0x74, 0x8b, 0xe0, 0x56, 0x62, 0x29, + 0xa5, 0xd5, 0x85, 0x5c, 0xb5, 0x1a, 0xb7, 0xe6, 0xaa, 0x55, 0x3a, 0x58, + 0xca, 0xd2, 0xd3, 0xad, 0x51, 0x51, 0x7f, 0x22, 0x7d, 0x37, 0xe9, 0xa6, + 0xfb, 0xae, 0xd2, 0x9d, 0x75, 0x80, 0x0e, 0x94, 0x17, 0x81, 0xc4, 0x07, + 0x35, 0x56, 0x33, 0x39, 0x9e, 0x2d, 0x8b, 0xc9, 0xc3, 0x52, 0xa6, 0x50, + 0xd2, 0x08, 0xd3, 0xc8, 0x95, 0x3e, 0x5a, 0x96, 0x4e, 0x23, 0x8b, 0xac, + 0x92, 0x16, 0x85, 0xae, 0x69, 0x0e, 0xac, 0x69, 0x2f, 0x32, 0x45, 0xd9, + 0x83, 0x6a, 0x31, 0x2f, 0x6a, 0xf8, 0xa1, 0x5d, 0x35, 0x1a, 0xc7, 0x4a, + 0x78, 0xe8, 0xdc, 0x17, 0x6a, 0x4c, 0x17, 0xd5, 0xb1, 0xb8, 0x56, 0x28, + 0xcb, 0x0b, 0x2f, 0xb1, 0x78, 0x8b, 0x72, 0x96, 0x62, 0x02, 0x90, 0xa7, + 0x5b, 0x01, 0x9d, 0x37, 0x12, 0x83, 0xd8, 0x4c, 0xc8, 0x81, 0x0f, 0xe5, + 0x1d, 0xcb, 0xc6, 0x8c, 0xbb, 0x26, 0x9f, 0xc1, 0x6d, 0x30, 0x33, 0xb6, + 0x24, 0x7d, 0x0b, 0x40, 0xe9, 0x60, 0xee, 0x0c, 0x9d, 0xa7, 0x5b, 0xce, + 0xc1, 0x23, 0xaf, 0x17, 0x4e, 0xf7, 0xe5, 0x27, 0x13, 0xd1, 0x05, 0xd2, + 0x4b, 0x4c, 0xa5, 0x03, 0xaa, 0x32, 0x2a, 0x4b, 0x20, 0x07, 0x92, 0x9d, + 0x83, 0x98, 0x15, 0x95, 0x2c, 0xbf, 0xae, 0xad, 0x01, 0xb4, 0x26, 0x2e, + 0xb9, 0x26, 0xd7, 0x21, 0x3a, 0x95, 0xed, 0x9e, 0x12, 0xf3, 0xa7, 0xfe, + 0x70, 0x78, 0xdb, 0x0a, 0x80, 0x93, 0x1b, 0xd6, 0x01, 0xea, 0xc9, 0x73, + 0x22, 0x69, 0x0b, 0xb2, 0x4d, 0xb1, 0x2a, 0x16, 0x49, 0x9c, 0xf0, 0x20, + 0x66, 0xe2, 0xb8, 0x45, 0x6d, 0xaa, 0x2e, 0x3a, 0xf3, 0xbd, 0xe7, 0x74, + 0x95, 0x15, 0xae, 0x54, 0x0c, 0x4f, 0x03, 0xa1, 0xca, 0x95, 0x2b, 0x24, + 0xbe, 0x45, 0xb2, 0xa2, 0x03, 0x73, 0x98, 0x25, 0x8a, 0xb9, 0x91, 0x92, + 0xac, 0x75, 0x5c, 0x3e, 0xae, 0x32, 0x13, 0x59, 0x52, 0x77, 0xad, 0x99, + 0xe9, 0x34, 0x74, 0xf0, 0x25, 0xc3, 0xbf, 0x3a, 0xf4, 0x0f, 0x67, 0x85, + 0x0f, 0xa1, 0x5f, 0xd7, 0x45, 0xf9, 0xc0, 0x2d, 0x1f, 0x9e, 0xc0, 0x06, + 0xf9, 0xb8, 0x7f, 0x26, 0xdd, 0x5c, 0x0e, 0x21, 0xac, 0xd2, 0x4b, 0xf3, + 0x76, 0xaa, 0xc0, 0x5d, 0x5b, 0x3a, 0x00, 0x49, 0xb7, 0x9c, 0x9b, 0x28, + 0xef, 0xad, 0x97, 0xd0, 0x18, 0x7d, 0xd9, 0x18, 0xbe, 0x77, 0xc2, 0xde, + 0x2f, 0xfb, 0xf8, 0x65, 0xf1, 0x05, 0xa8, 0x2b, 0x94, 0xcd, 0xb7, 0x2c, + 0x4e, 0xe0, 0x9a, 0x2e, 0x00, 0x81, 0xa4, 0x25, 0x2e, 0xc5, 0xc4, 0xa2, + 0x1a, 0x19, 0x0e, 0x80, 0xa4, 0x19, 0x2b, 0x47, 0x81, 0x7f, 0x9d, 0x38, + 0x99, 0x4e, 0x0c, 0x3c, 0xcf, 0xf1, 0xf7, 0x76, 0x36, 0x29, 0x37, 0x2b, + 0x4b, 0x6a, 0x6d, 0x54, 0xf3, 0x80, 0xf1, 0xeb, 0x9e, 0xd2, 0xec, 0xc8, + 0x54, 0xc3, 0xcb, 0x4f, 0xc5, 0x79, 0xb3, 0x40, 0xc5, 0x57, 0x51, 0x9a, + 0xa5, 0x15, 0x6c, 0xad, 0x56, 0xc1, 0xf6, 0xe2, 0x0a, 0xb6, 0x6e, 0x52, + 0xc1, 0x56, 0x51, 0x05, 0x5b, 0xf7, 0x51, 0xc1, 0xf6, 0xad, 0x2b, 0xd8, + 0xbe, 0x49, 0x05, 0xdb, 0x45, 0x15, 0x6c, 0xdf, 0xb2, 0x82, 0x9c, 0xb7, + 0xa2, 0xa9, 0x58, 0xd6, 0xd7, 0xf7, 0x56, 0xe9, 0xd1, 0x3a, 0x5e, 0x11, + 0xf7, 0xec, 0xb8, 0xd0, 0xb5, 0xa6, 0x00, 0xb5, 0xe5, 0xab, 0x30, 0x56, + 0xf2, 0x59, 0x96, 0xb5, 0xa0, 0x09, 0xd0, 0x96, 0x0e, 0xae, 0x6d, 0xf9, + 0xad, 0xeb, 0x35, 0xe3, 0x3a, 0xd2, 0x1c, 0x6e, 0xa0, 0x2d, 0x07, 0xf0, + 0xd2, 0x69, 0x9c, 0x0c, 0x68, 0x88, 0xe2, 0xc4, 0xeb, 0x4a, 0xca, 0x50, + 0xa5, 0x0c, 0x94, 0xcb, 0x38, 0x5b, 0x09, 0x95, 0x60, 0x34, 0xd0, 0xa1, + 0x6b, 0xeb, 0x2c, 0x8b, 0x7f, 0xb1, 0xdd, 0x19, 0xca, 0x23, 0x74, 0xac, + 0xaf, 0xb4, 0xe5, 0x08, 0x51, 0x89, 0x16, 0xf8, 0x31, 0x59, 0xc3, 0xb7, + 0x7d, 0xce, 0xd9, 0x31, 0xee, 0xd2, 0xe6, 0x04, 0x32, 0x0a, 0x04, 0x0d, + 0x8e, 0xfc, 0x75, 0x4b, 0xa1, 0x30, 0x8e, 0x7b, 0x13, 0x0b, 0x63, 0xdf, + 0xa0, 0x60, 0x7a, 0xe0, 0xae, 0x74, 0x40, 0x9f, 0xb7, 0x14, 0x0b, 0xa1, + 0xb8, 0x37, 0xa9, 0x10, 0xf2, 0x0d, 0x0a, 0x85, 0x56, 0x14, 0x41, 0x8f, + 0xbe, 0x6e, 0x2b, 0x16, 0xc2, 0x71, 0x7f, 0x72, 0x21, 0xec, 0x9b, 0x14, + 0x8c, 0x8c, 0x82, 0xc6, 0x96, 0x51, 0x87, 0xba, 0xf6, 0xd4, 0xcd, 0x30, + 0x6d, 0xf9, 0xbd, 0xbf, 0x96, 0x8f, 0x6e, 0xe9, 0x0b, 0xca, 0x20, 0xf0, + 0x1e, 0xa6, 0xfa, 0xf0, 0x73, 0x06, 0x22, 0x24, 0xa7, 0x8b, 0xdc, 0xd0, + 0x5b, 0x8a, 0x5f, 0x32, 0x7c, 0x6f, 0xf2, 0x97, 0xe8, 0x37, 0xd8, 0x00, + 0x1c, 0x48, 0xbe, 0x5b, 0xf9, 0xd3, 0x3c, 0x67, 0x22, 0x82, 0x3b, 0x10, + 0x36, 0x98, 0xbb, 0xc7, 0x01, 0x03, 0xd8, 0x6f, 0x3f, 0x64, 0x48, 0x4c, + 0x62, 0xc4, 0x57, 0x43, 0x97, 0x56, 0xf3, 0xff, 0x29, 0xa2, 0xb0, 0x7f, + 0x6d, 0x9d, 0xd6, 0x9b, 0xc8, 0xac, 0xea, 0xec, 0xb4, 0x54, 0xdd, 0xd9, + 0xa5, 0x3b, 0x11, 0xa3, 0xd7, 0x3d, 0x77, 0x19, 0x8f, 0x88, 0xcb, 0xc6, + 0xa0, 0x88, 0xca, 0xae, 0x40, 0x98, 0x89, 0xcb, 0x32, 0x09, 0x4a, 0x90, + 0x50, 0x2c, 0x9c, 0xd4, 0x52, 0x7e, 0x4c, 0x7c, 0xf1, 0xca, 0x60, 0x51, + 0x08, 0x5b, 0x85, 0xf1, 0x9f, 0x60, 0x85, 0xc7, 0x22, 0x67, 0x48, 0x22, + 0x5b, 0x81, 0xbd, 0xa7, 0x5b, 0x2b, 0xf4, 0x8f, 0xad, 0xdb, 0xfb, 0x56, + 0x32, 0x52, 0x87, 0xdb, 0xbf, 0x11, 0x39, 0xcc, 0xab, 0x85, 0x5a, 0x29, + 0xb8, 0xa5, 0x76, 0xb0, 0xc1, 0x0e, 0x15, 0x91, 0xeb, 0x1b, 0x72, 0x1e, + 0xbe, 0x91, 0xa0, 0xab, 0x35, 0xa4, 0xe9, 0x95, 0x0a, 0x63, 0x29, 0x4d, + 0xf0, 0x76, 0x2d, 0xc7, 0x2b, 0x9a, 0x14, 0xb8, 0xbd, 0xbf, 0xa6, 0x58, + 0x67, 0x7e, 0xa0, 0xd3, 0x6e, 0x39, 0xa1, 0x4f, 0x2e, 0x4d, 0xe0, 0xd5, + 0x10, 0x0b, 0xfb, 0xaf, 0x24, 0x57, 0x44, 0x34, 0xc6, 0xa0, 0xaf, 0x13, + 0x5d, 0x4f, 0x79, 0x24, 0x27, 0xd7, 0x46, 0x23, 0x57, 0x34, 0x28, 0x8b, + 0x8c, 0xc8, 0x76, 0xc2, 0x30, 0xbc, 0x86, 0x89, 0x9d, 0x5d, 0xab, 0x54, + 0x49, 0x8b, 0xe0, 0xaa, 0x12, 0xc5, 0x06, 0xe1, 0xda, 0xde, 0xbc, 0x6a, + 0xb4, 0x33, 0xcf, 0xb0, 0xd9, 0x47, 0x70, 0x34, 0x1c, 0x92, 0x51, 0x32, + 0x3c, 0x2f, 0x42, 0x96, 0x9d, 0xb2, 0x25, 0xee, 0x8c, 0xbd, 0xbe, 0x8f, + 0xf2, 0xd8, 0xa7, 0xd9, 0x91, 0x7b, 0xfa, 0x4a, 0xeb, 0x76, 0x3c, 0xbd, + 0x33, 0xb1, 0xa4, 0x95, 0xa2, 0x96, 0xab, 0xc5, 0x4a, 0x38, 0x69, 0x9e, + 0xad, 0x51, 0xe4, 0x30, 0xf4, 0x46, 0x72, 0x37, 0x53, 0x7a, 0xb2, 0x6b, + 0xf1, 0xd2, 0xcc, 0x0a, 0x93, 0x74, 0xfa, 0xbb, 0x7e, 0xa4, 0xbf, 0x49, + 0x57, 0xbd, 0xbe, 0x4d, 0xa5, 0xaa, 0xbc, 0x47, 0xa4, 0x42, 0x04, 0xf7, + 0xdc, 0x9c, 0x89, 0xf2, 0x6a, 0xc7, 0x0b, 0xc5, 0x37, 0x79, 0x53, 0x47, + 0xe2, 0x55, 0x1c, 0x78, 0x04, 0x2a, 0x8e, 0xab, 0xc8, 0x5a, 0xdd, 0x83, + 0x1a, 0x4c, 0xb9, 0xba, 0xc4, 0xcb, 0xb5, 0xf1, 0x03, 0xd3, 0xf8, 0xa6, + 0xe0, 0x1d, 0x36, 0x37, 0x0b, 0x65, 0x65, 0xa9, 0xc8, 0x45, 0xb8, 0xfb, + 0xb0, 0xe9, 0x0b, 0x15, 0x65, 0x25, 0xe7, 0xe6, 0xa7, 0x7e, 0x18, 0xd1, + 0x42, 0x8a, 0x54, 0xa0, 0x95, 0x1a, 0xc4, 0x0c, 0x88, 0x63, 0x59, 0xf8, + 0x7e, 0xc7, 0xc3, 0xb5, 0xeb, 0x6d, 0xd1, 0x75, 0x1f, 0x2b, 0x55, 0xfe, + 0xcd, 0x2f, 0x3e, 0x7c, 0x20, 0x01, 0xdc, 0xa8, 0xf2, 0x93, 0x3f, 0x46, + 0xd1, 0x29, 0x24, 0x70, 0x4b, 0x3f, 0xee, 0x1e, 0x6a, 0xbf, 0x5a, 0xcb, + 0x53, 0xe5, 0xdf, 0xfb, 0xc1, 0x3a, 0x95, 0x97, 0x13, 0x94, 0xcc, 0xa4, + 0x62, 0x77, 0x67, 0xa7, 0xbd, 0x93, 0x10, 0x09, 0xce, 0x31, 0xfd, 0xf7, + 0x89, 0x64, 0x77, 0x65, 0x91, 0xfc, 0x32, 0xbc, 0xd6, 0x9a, 0x2e, 0xd1, + 0x07, 0xda, 0x94, 0xf3, 0x3f, 0x5c, 0xf9, 0xf7, 0x28, 0xbb, 0x46, 0xe5, + 0xa7, 0x00, 0x9f, 0xa3, 0x26, 0x09, 0x01, 0x50, 0xd2, 0x7f, 0x44, 0x00, + 0xab, 0x84, 0xbe, 0x6f, 0xe9, 0xfb, 0xb5, 0xd3, 0x93, 0xc2, 0xe7, 0xde, + 0x8d, 0xfb, 0x4e, 0x53, 0xf5, 0x9d, 0x27, 0xa5, 0xf4, 0x44, 0xb1, 0xef, + 0xdd, 0xb2, 0xeb, 0xec, 0xdc, 0x48, 0x76, 0xab, 0x56, 0xfa, 0xb9, 0x3f, + 0xbb, 0x79, 0x9d, 0x33, 0xf6, 0xc2, 0xd4, 0xbb, 0xef, 0xcf, 0xfe, 0xbb, + 0xab, 0x7d, 0xfc, 0xf2, 0xd9, 0xbb, 0xd5, 0x7d, 0x7c, 0xf9, 0x13, 0x3b, + 0xf7, 0xfc, 0x0d, 0x7a, 0xf9, 0xed, 0x94, 0x47, 0xe8, 0xdd, 0xb6, 0x8d, + 0x9a, 0xbb, 0xc9, 0x06, 0xc2, 0xf1, 0xd2, 0xff, 0x44, 0xf3, 0x6c, 0xb8, + 0x47, 0xbf, 0x7b, 0xff, 0xe1, 0xf8, 0xe8, 0x57, 0xeb, 0xb6, 0x33, 0xde, + 0xb6, 0x86, 0x73, 0xb3, 0xff, 0xa1, 0x96, 0x06, 0xcb, 0x2f, 0x0e, 0xbf, + 0x3b, 0xba, 0x01, 0xcf, 0x38, 0x5f, 0xb6, 0xc9, 0x49, 0x68, 0x86, 0xe9, + 0x97, 0x87, 0x6f, 0xde, 0x1c, 0xde, 0x80, 0xeb, 0x91, 0x3d, 0x99, 0xd8, + 0xff, 0x39, 0xb6, 0x4f, 0x5e, 0xfd, 0xf6, 0x26, 0xb2, 0xc6, 0x34, 0xe0, + 0xae, 0x65, 0xbd, 0x81, 0xae, 0xb1, 0xab, 0xea, 0x3e, 0x3a, 0x89, 0xec, + 0xdb, 0x3b, 0x89, 0x3f, 0xfa, 0x43, 0xf8, 0x05, 0x41, 0x74, 0x7e, 0x87, + 0xa8, 0x8e, 0x1b, 0x87, 0x91, 0x7d, 0x5b, 0x4f, 0xf1, 0xc9, 0x8d, 0x0c, + 0xcb, 0x8a, 0xd5, 0xf6, 0xa7, 0xf7, 0x53, 0x6b, 0x7f, 0xfa, 0x9f, 0xa8, + 0xf4, 0x7d, 0xab, 0xcc, 0x62, 0x1f, 0x53, 0x1f, 0x92, 0x91, 0x27, 0x64, + 0x94, 0xcb, 0x69, 0xb6, 0xe5, 0x28, 0x87, 0x73, 0xe9, 0x0c, 0x5e, 0xe3, + 0x2e, 0xba, 0x45, 0x9e, 0xb8, 0x5c, 0x61, 0x3f, 0xc6, 0x1b, 0x9b, 0x86, + 0x45, 0x7e, 0x4e, 0x35, 0x9c, 0x8a, 0x07, 0x98, 0x7d, 0x06, 0x13, 0x00, + 0x96, 0xf4, 0x82, 0x8a, 0x3a, 0x97, 0xb5, 0x22, 0x8d, 0x17, 0x98, 0xf5, + 0xaf, 0x44, 0x83, 0xc2, 0x03, 0x37, 0xa4, 0xf1, 0x0c, 0x3b, 0x45, 0x57, + 0xa2, 0x41, 0x27, 0x23, 0x6e, 0x4a, 0x23, 0x5a, 0x4d, 0x54, 0xbd, 0xe8, + 0xa6, 0x92, 0x02, 0x05, 0x6c, 0xad, 0x59, 0x95, 0x08, 0xb4, 0x65, 0x2d, + 0x3a, 0x8c, 0x76, 0xcd, 0xfe, 0x71, 0x57, 0x8a, 0xed, 0xda, 0x5f, 0xc4, + 0x5b, 0x0a, 0x81, 0xaf, 0x61, 0x3c, 0xcc, 0x24, 0x92, 0x8b, 0x7b, 0x28, + 0x7e, 0x17, 0x93, 0x28, 0x7d, 0xb0, 0x42, 0x1d, 0xfb, 0xe5, 0xd7, 0x89, + 0xdc, 0x93, 0xe5, 0x88, 0xa5, 0x15, 0x6f, 0x9a, 0x4c, 0x45, 0xf2, 0x6b, + 0x21, 0xaa, 0xa5, 0x57, 0x26, 0x65, 0x7e, 0x3c, 0x22, 0x26, 0xdf, 0x35, + 0x43, 0xef, 0x7d, 0x4c, 0xbc, 0xdf, 0x2f, 0xf9, 0xae, 0xcc, 0x6b, 0xd6, + 0x61, 0xf9, 0xe5, 0x67, 0xd9, 0xc5, 0x58, 0xa2, 0x8a, 0xb5, 0x58, 0xfe, + 0x3e, 0x51, 0xac, 0xc4, 0xfb, 0x2d, 0x57, 0x5d, 0x0b, 0xc9, 0x40, 0xc8, + 0xf7, 0x47, 0x70, 0xed, 0xe4, 0xcf, 0xb8, 0xa1, 0xe2, 0xd3, 0xec, 0x2c, + 0xe6, 0x05, 0x02, 0x3b, 0x78, 0x6a, 0x67, 0xde, 0xea, 0x2c, 0xdf, 0x31, + 0xbd, 0xf4, 0xc5, 0xd2, 0xa5, 0x04, 0x39, 0x7e, 0x65, 0x19, 0x44, 0x89, + 0xa6, 0xa5, 0x97, 0x82, 0x9f, 0xf6, 0x5c, 0x1b, 0xcf, 0x07, 0xef, 0x03, + 0xff, 0x0f, 0xe4, 0x79, 0x8c, 0x7d, 0x8a, 0xe5, 0xd9, 0x07, 0x38, 0xe4, + 0xff, 0xcf, 0xbf, 0xe1, 0x18, 0x58, 0xf3, 0x89, 0xac, 0x93, 0xb5, 0xce, + 0x9e, 0xe7, 0xc2, 0x26, 0xf4, 0xa7, 0xc2, 0x5b, 0xd0, 0x84, 0xba, 0xd9, + 0x94, 0xa6, 0xdd, 0xbe, 0xdd, 0xe2, 0xb6, 0x72, 0xe2, 0xfd, 0xb1, 0xb9, + 0x96, 0x92, 0xe2, 0x58, 0xb6, 0xbb, 0x1e, 0x77, 0xf9, 0x38, 0xd3, 0xa4, + 0x6b, 0xe5, 0x0c, 0xad, 0x32, 0xf6, 0xcd, 0xe2, 0x15, 0x75, 0xd8, 0x9c, + 0x5b, 0xa7, 0x58, 0xcd, 0xe1, 0x88, 0x5e, 0xea, 0xcd, 0x17, 0x91, 0xbc, + 0x1b, 0x96, 0x1f, 0xbf, 0x39, 0x79, 0x75, 0xf4, 0xb8, 0xf2, 0xa0, 0xdb, + 0xad, 0x35, 0xad, 0x3f, 0xfd, 0xc9, 0x32, 0xb0, 0x38, 0xdf, 0xf7, 0x2b, + 0x84, 0x9d, 0xa1, 0xa5, 0x06, 0xf8, 0x43, 0xe0, 0x0c, 0x50, 0x7a, 0xeb, + 0x71, 0xc5, 0x3a, 0x88, 0xdf, 0x81, 0x60, 0xfe, 0xa8, 0x2a, 0x78, 0x85, + 0x73, 0xdd, 0xf5, 0x47, 0xe5, 0x12, 0xde, 0x74, 0x3c, 0x10, 0x91, 0xdc, + 0x74, 0x5d, 0xd9, 0x4f, 0x03, 0x0e, 0x70, 0x0a, 0x73, 0x42, 0x6c, 0xa0, + 0x41, 0x8f, 0xe4, 0x9b, 0x96, 0x9f, 0x5d, 0xbc, 0x1a, 0x94, 0x73, 0x67, + 0x8d, 0x2a, 0x75, 0xd6, 0xb4, 0xba, 0x3e, 0x1b, 0xdd, 0xb5, 0x1e, 0x73, + 0x3f, 0x79, 0xbc, 0x2a, 0xc2, 0x78, 0x1d, 0xad, 0x08, 0xd5, 0x18, 0xb5, + 0x49, 0x62, 0x4a, 0x1d, 0x94, 0x52, 0xa2, 0xcc, 0x0b, 0x97, 0x4f, 0xd9, + 0xe9, 0x85, 0x30, 0xd4, 0x71, 0xc8, 0x6f, 0x98, 0x47, 0xd5, 0x01, 0xfa, + 0x23, 0xdc, 0x5f, 0x63, 0x61, 0x5b, 0x85, 0x05, 0xaf, 0x02, 0xa7, 0xa4, + 0xe7, 0x9e, 0x3e, 0x3a, 0xc0, 0xe7, 0x59, 0x19, 0xe0, 0xb9, 0x3f, 0xbd, + 0xa0, 0xcb, 0x96, 0xe2, 0x1c, 0xc1, 0x07, 0xa5, 0x4b, 0xa4, 0x6a, 0xe5, + 0x23, 0x6f, 0xe4, 0x3a, 0xe1, 0xb8, 0x62, 0x7d, 0x91, 0xa2, 0xaf, 0x66, + 0x20, 0x9d, 0xa8, 0xce, 0x48, 0x5e, 0x0d, 0x2d, 0x3b, 0x89, 0xda, 0x72, + 0x42, 0xf8, 0x61, 0x61, 0x48, 0x77, 0x23, 0x51, 0x78, 0x2a, 0xac, 0x12, + 0xd2, 0x0b, 0x7e, 0xc1, 0x0e, 0xb1, 0x68, 0xcf, 0x5c, 0x7e, 0x15, 0xb5, + 0xc2, 0x0f, 0x24, 0x7c, 0x36, 0x10, 0xae, 0x9a, 0xe5, 0xea, 0x9a, 0x74, + 0x75, 0x73, 0x0a, 0xaf, 0x93, 0x68, 0x59, 0x06, 0x38, 0xa5, 0x98, 0x37, + 0xee, 0x60, 0x50, 0xe5, 0x4b, 0x55, 0x93, 0x4d, 0xdb, 0xdc, 0x29, 0xcb, + 0xf4, 0xdd, 0x64, 0xae, 0x2a, 0x67, 0x32, 0x7f, 0xf9, 0xca, 0xfa, 0x55, + 0xbb, 0x8c, 0xf8, 0xc2, 0xc7, 0x4a, 0x12, 0x2e, 0xde, 0x16, 0x0f, 0xe0, + 0xf8, 0x77, 0x12, 0x00, 0xcd, 0x96, 0x84, 0x91, 0x8f, 0x79, 0xb0, 0x78, + 0xaf, 0x39, 0x60, 0x8e, 0xf5, 0xef, 0x02, 0x42, 0x47, 0x41, 0xe0, 0x07, + 0x4d, 0x00, 0x21, 0xc0, 0xe3, 0x0e, 0xe0, 0x58, 0x45, 0x2a, 0x87, 0xc5, + 0x64, 0xd8, 0xad, 0x5b, 0xd0, 0x79, 0x1c, 0xc7, 0x5c, 0x84, 0xa2, 0x05, + 0x14, 0x10, 0x01, 0x56, 0xc9, 0xeb, 0xd6, 0x7b, 0x97, 0xce, 0x28, 0xe3, + 0x54, 0xa5, 0x6c, 0xd1, 0xe3, 0xa3, 0xe7, 0xef, 0xde, 0xbe, 0x3d, 0x7a, + 0xfe, 0x41, 0xbd, 0x3f, 0x9a, 0x10, 0x47, 0x01, 0xda, 0x7e, 0x04, 0x85, + 0xac, 0x27, 0x11, 0xba, 0xb8, 0xd5, 0xea, 0x0d, 0x8d, 0x80, 0x40, 0xa6, + 0x6f, 0xb8, 0x9a, 0xd0, 0xb3, 0x55, 0xaf, 0x03, 0xd0, 0xda, 0xda, 0xc2, + 0x6b, 0x11, 0x9d, 0x30, 0x6e, 0xaa, 0x1a, 0x8e, 0x55, 0x11, 0x0c, 0x92, + 0xc0, 0xb8, 0x51, 0x0f, 0x5c, 0xe0, 0xa5, 0xec, 0x08, 0x67, 0x30, 0x5e, + 0x24, 0x5e, 0x88, 0xa8, 0x92, 0x26, 0xa6, 0x46, 0x86, 0x24, 0x3d, 0x55, + 0xf0, 0xde, 0x48, 0x7e, 0x14, 0xbd, 0x10, 0x1d, 0x97, 0x24, 0x2e, 0xc5, + 0xc7, 0xaa, 0x2a, 0x13, 0x45, 0xa4, 0xc8, 0xa6, 0x8b, 0x1c, 0xe3, 0x70, + 0xe2, 0x05, 0x0a, 0xf0, 0x77, 0x11, 0x00, 0xb7, 0x00, 0x00, 0xf8, 0x9b, + 0x53, 0x80, 0xd4, 0xdc, 0xc9, 0x23, 0x65, 0x88, 0x57, 0x49, 0x71, 0xbb, + 0x18, 0xd9, 0xdf, 0x43, 0x0d, 0x45, 0x92, 0x93, 0x24, 0x9b, 0xca, 0x90, + 0x21, 0xeb, 0xa3, 0xfc, 0x95, 0xcc, 0x9c, 0x98, 0x43, 0x90, 0x00, 0x78, + 0x35, 0x24, 0xab, 0x81, 0x86, 0x00, 0xab, 0xc4, 0x98, 0xda, 0x79, 0x81, + 0x17, 0x7a, 0x63, 0x80, 0x43, 0x0a, 0xcb, 0xcb, 0x8b, 0x30, 0x4f, 0xf1, + 0xbd, 0x51, 0xac, 0x6d, 0x67, 0x42, 0x4c, 0xe9, 0xb2, 0x85, 0x09, 0x8c, + 0x34, 0xca, 0xd9, 0x91, 0x95, 0xea, 0x6b, 0x03, 0x5f, 0x84, 0xde, 0xe3, + 0x88, 0x8c, 0xc2, 0x19, 0xc0, 0xf2, 0x2f, 0x12, 0x4f, 0xa9, 0x2d, 0xa6, + 0x1d, 0xb3, 0x29, 0x16, 0x9d, 0xfd, 0xda, 0x80, 0xac, 0x8d, 0xb2, 0xc6, + 0x78, 0x4f, 0xe9, 0x19, 0x2e, 0x7e, 0x18, 0x07, 0xe0, 0xa3, 0x1a, 0xbf, + 0x97, 0x1c, 0x12, 0x3f, 0x1a, 0x8c, 0x44, 0xaa, 0x51, 0xd8, 0x7d, 0xa5, + 0x26, 0xa6, 0xef, 0x74, 0xb7, 0x1c, 0x50, 0x43, 0xa6, 0xfb, 0x2a, 0x6f, + 0x56, 0x45, 0xf2, 0x4b, 0xfa, 0x4e, 0x66, 0xd0, 0x7e, 0x4d, 0xa4, 0x3f, + 0xc3, 0x57, 0x32, 0x99, 0xa7, 0x42, 0x24, 0x49, 0x7c, 0x27, 0x33, 0xa8, + 0x59, 0x4e, 0x81, 0x0c, 0x2c, 0x13, 0x71, 0xec, 0x00, 0x44, 0x42, 0xe6, + 0x7e, 0x0a, 0x95, 0x4d, 0x12, 0xf2, 0xe8, 0x7e, 0x8a, 0x6c, 0x71, 0x17, + 0xc2, 0x5e, 0x54, 0x96, 0xf2, 0x64, 0xc1, 0x46, 0xb2, 0x58, 0x1c, 0x15, + 0x47, 0xb9, 0x13, 0xfe, 0x6d, 0xa9, 0xad, 0x61, 0x49, 0x28, 0x1d, 0x4e, + 0x00, 0xd0, 0x0b, 0x7a, 0x63, 0x97, 0xf5, 0xfa, 0xe8, 0x3b, 0x5c, 0x42, + 0xa4, 0x4a, 0x8b, 0xc1, 0xc2, 0x32, 0xfe, 0x94, 0x7a, 0xa7, 0xbd, 0x5a, + 0x09, 0xbd, 0xdb, 0x87, 0xc5, 0xa3, 0x3b, 0x95, 0xa5, 0xd3, 0xf2, 0x5c, + 0xeb, 0xe1, 0xcb, 0xb0, 0x2e, 0x53, 0xf2, 0xc0, 0x66, 0xc1, 0x94, 0x80, + 0xd5, 0xcf, 0x3c, 0x94, 0x59, 0x59, 0x04, 0x14, 0xfd, 0xb4, 0x4e, 0x44, + 0x80, 0x41, 0xac, 0x18, 0xee, 0xbd, 0xcf, 0x02, 0xa1, 0xb1, 0x8d, 0x7f, + 0x66, 0xa1, 0xcc, 0xba, 0x94, 0xc6, 0x46, 0xbf, 0x73, 0x84, 0xd3, 0xab, + 0x38, 0x1a, 0xf4, 0xbd, 0x5a, 0xa2, 0xc9, 0x80, 0x9a, 0x25, 0x0c, 0x00, + 0xbe, 0xe5, 0xa6, 0x25, 0xa9, 0x9e, 0xa8, 0xdd, 0x7c, 0x69, 0x68, 0x13, + 0xfb, 0x27, 0x09, 0x45, 0x18, 0xf7, 0xb9, 0x15, 0x38, 0x25, 0x05, 0x69, + 0xc2, 0xe5, 0x00, 0xc4, 0x97, 0xf5, 0x8e, 0xe6, 0x27, 0x29, 0x90, 0x38, + 0x44, 0x1d, 0xa3, 0x7a, 0xf9, 0xfe, 0xd5, 0x3b, 0x8b, 0x12, 0xf2, 0x60, + 0xef, 0xa6, 0xec, 0x4a, 0xc4, 0xa0, 0xea, 0x39, 0x03, 0x69, 0x82, 0xb7, + 0x44, 0x55, 0x5e, 0x62, 0x98, 0x05, 0x31, 0xc1, 0x52, 0x52, 0x3d, 0xd8, + 0x2c, 0xeb, 0x84, 0xb6, 0x40, 0xe6, 0xc0, 0x4c, 0x78, 0x92, 0xba, 0x22, + 0x85, 0x1b, 0xd1, 0x8d, 0x03, 0xf5, 0xca, 0xd0, 0x2c, 0xb4, 0x89, 0x0a, + 0x02, 0x58, 0x89, 0xce, 0x3a, 0x71, 0xbe, 0x66, 0xa9, 0x9b, 0x50, 0x87, + 0xd1, 0x30, 0x3e, 0x18, 0x3f, 0x84, 0x1b, 0x2e, 0xcd, 0x44, 0xba, 0x4e, + 0x71, 0xc0, 0x02, 0xf0, 0x78, 0x05, 0x70, 0xa6, 0xa1, 0xe3, 0x50, 0x03, + 0xe5, 0x8a, 0xf3, 0x74, 0x13, 0xc4, 0x31, 0x02, 0x32, 0x19, 0xe6, 0xa2, + 0x87, 0x3c, 0x48, 0xe4, 0x11, 0x04, 0x8f, 0xc5, 0x19, 0xe2, 0x66, 0x7e, + 0x4e, 0xec, 0xea, 0x7e, 0x26, 0x41, 0x53, 0x90, 0xc9, 0x0d, 0x28, 0x31, + 0xa8, 0x2c, 0x6f, 0x4d, 0x39, 0x35, 0x05, 0x2e, 0xb7, 0x40, 0x90, 0x41, + 0xa4, 0x1f, 0x19, 0x63, 0x26, 0x98, 0xda, 0x47, 0xfa, 0x4e, 0x66, 0xe4, + 0xf6, 0xeb, 0x50, 0x9d, 0xe3, 0x34, 0x4b, 0x27, 0x66, 0x7c, 0x23, 0x0a, + 0xb8, 0x91, 0x53, 0x45, 0xbd, 0x0a, 0x2d, 0xf7, 0x85, 0xcc, 0x37, 0x3d, + 0x27, 0xc1, 0xcc, 0x44, 0x1d, 0x50, 0x87, 0xf1, 0x81, 0xc2, 0xc4, 0x80, + 0x61, 0x9d, 0x10, 0x88, 0xc5, 0x30, 0x56, 0xf9, 0x77, 0xa5, 0xfd, 0xdf, + 0x95, 0x50, 0x65, 0x9c, 0x8a, 0xa6, 0x71, 0x30, 0xe5, 0xaf, 0x25, 0xe7, + 0x97, 0xe4, 0x02, 0x9d, 0x50, 0x39, 0x9d, 0x90, 0x01, 0x64, 0xdb, 0xaf, + 0xf3, 0x64, 0x42, 0x16, 0x22, 0x3d, 0x94, 0x53, 0x52, 0xc2, 0x27, 0x59, + 0x34, 0x84, 0x1b, 0x14, 0x53, 0x39, 0x15, 0xfc, 0xa9, 0xcf, 0x46, 0x2a, + 0x39, 0x31, 0x2c, 0x49, 0xa0, 0x2b, 0x05, 0xec, 0xb9, 0x0b, 0x5d, 0xdb, + 0xb7, 0x02, 0x1d, 0x17, 0x09, 0x83, 0xf0, 0x7e, 0xbd, 0x5b, 0x74, 0xd6, + 0x9e, 0xef, 0x61, 0x1a, 0xb5, 0xc4, 0xbb, 0xf5, 0x1c, 0x58, 0xef, 0x18, + 0x70, 0x91, 0x7f, 0xfb, 0x2b, 0x00, 0xd0, 0xa8, 0xef, 0x4f, 0x01, 0x3f, + 0x9b, 0x2f, 0xf3, 0x72, 0x7f, 0x0e, 0xcd, 0x89, 0x91, 0x3a, 0x84, 0xd4, + 0x82, 0x4f, 0x91, 0xf4, 0x73, 0x97, 0x7b, 0xb8, 0x67, 0x02, 0xd6, 0x72, + 0x24, 0x20, 0xe7, 0x1e, 0x7e, 0x0d, 0xea, 0xd6, 0x4b, 0xd1, 0x0b, 0x66, + 0xce, 0x99, 0x05, 0xb3, 0x92, 0x61, 0xc3, 0x3a, 0xf3, 0xfc, 0xa9, 0xe5, + 0x4f, 0xe2, 0x67, 0x68, 0x22, 0x97, 0x0b, 0xc4, 0x62, 0xaf, 0x97, 0xbf, + 0xd1, 0x1c, 0x03, 0x71, 0x1f, 0xde, 0x59, 0xc6, 0xe5, 0x7d, 0x45, 0x57, + 0x01, 0xba, 0x2e, 0x9e, 0x84, 0x77, 0xaf, 0x34, 0xd5, 0x48, 0x9c, 0x1c, + 0x93, 0x43, 0xd3, 0x02, 0x4b, 0x3c, 0xde, 0x9f, 0xbb, 0xb6, 0x1d, 0x2c, + 0x71, 0x78, 0x5f, 0x50, 0xcc, 0xba, 0xe7, 0xfc, 0x41, 0x72, 0x8f, 0x38, + 0xa1, 0xa7, 0xbd, 0x5e, 0xa1, 0x9d, 0x5e, 0xd5, 0x54, 0xba, 0x15, 0xee, + 0xa1, 0x86, 0x22, 0xc1, 0xcc, 0x02, 0x97, 0x17, 0xb5, 0x08, 0xfb, 0xe3, + 0xd9, 0x7c, 0xa9, 0xdf, 0x7b, 0x88, 0x4b, 0xbd, 0x66, 0xe8, 0x01, 0xa8, + 0x11, 0x42, 0x22, 0xfd, 0x31, 0xc8, 0x09, 0x11, 0xe2, 0xfa, 0x9c, 0x11, + 0xb1, 0x86, 0x2a, 0x40, 0x6f, 0x79, 0x76, 0x5b, 0x4f, 0xbb, 0xb6, 0x73, + 0x11, 0x9c, 0x45, 0xac, 0xd5, 0x85, 0x8e, 0xad, 0xd1, 0x51, 0xba, 0x97, + 0x6c, 0x68, 0x47, 0xa1, 0x2f, 0xb0, 0x01, 0xf0, 0x0f, 0x67, 0xc6, 0xaf, + 0xfd, 0xea, 0xdb, 0xa0, 0x2d, 0x1d, 0x5b, 0xf8, 0x02, 0xda, 0xb5, 0xcd, + 0xbb, 0xb4, 0xdc, 0x24, 0x62, 0x56, 0xe4, 0xd2, 0xfa, 0xfe, 0x02, 0x9f, + 0xd6, 0x5f, 0xe0, 0xd3, 0xda, 0xb3, 0x79, 0xa1, 0x53, 0xeb, 0x44, 0x8b, + 0x5d, 0xda, 0x97, 0x40, 0x4a, 0xee, 0xe8, 0x84, 0xdc, 0xd1, 0xb1, 0x3f, + 0x02, 0xef, 0x83, 0xc5, 0x7e, 0x6c, 0xb6, 0x80, 0x6b, 0x73, 0x81, 0xeb, + 0xfd, 0x57, 0xe8, 0xcb, 0x35, 0x2e, 0xec, 0x11, 0x6d, 0x44, 0x14, 0xe4, + 0x0b, 0xb1, 0xd2, 0x8d, 0x67, 0xce, 0xc0, 0x19, 0x09, 0x5d, 0x48, 0xd7, + 0x38, 0xef, 0xc5, 0xda, 0xd1, 0xca, 0xc5, 0x8a, 0x5d, 0xd9, 0xc9, 0xea, + 0xae, 0x2c, 0xd5, 0xe2, 0x83, 0x6d, 0xbb, 0x9b, 0xf4, 0x64, 0x85, 0xb7, + 0xaa, 0x23, 0x3b, 0x92, 0x4a, 0x09, 0x39, 0x7a, 0xb6, 0x3d, 0x59, 0xc1, + 0x9d, 0x9d, 0xdb, 0xe8, 0x12, 0x73, 0xff, 0x2e, 0x1d, 0x5a, 0xb4, 0x03, + 0x2b, 0xc7, 0x6d, 0x1c, 0xd5, 0x15, 0x5c, 0xde, 0xac, 0x2f, 0xeb, 0xe3, + 0x59, 0xfc, 0x3f, 0xb8, 0xb2, 0xa4, 0x61, 0x53, 0x1b, 0xe6, 0xc9, 0xb6, + 0xce, 0xc8, 0x2c, 0x08, 0x6f, 0xa1, 0x2f, 0x7b, 0xe8, 0x8e, 0xc4, 0x04, + 0x9d, 0x71, 0x89, 0x3b, 0x7b, 0x16, 0x2e, 0xf6, 0x67, 0x0f, 0xd1, 0xf6, + 0x22, 0x80, 0x47, 0xbb, 0xd8, 0xa1, 0xfd, 0x39, 0x86, 0x5b, 0xc4, 0xa9, + 0x97, 0x38, 0xb4, 0x2f, 0xc5, 0x19, 0x66, 0xf0, 0xe8, 0x7f, 0x04, 0x7a, + 0xbd, 0x3b, 0x4b, 0xb5, 0x63, 0x6b, 0x67, 0x9d, 0x39, 0xe2, 0xeb, 0x12, + 0x8f, 0xf6, 0x4c, 0xb8, 0x85, 0x1e, 0xad, 0x73, 0xbd, 0x43, 0xfb, 0xee, + 0x0b, 0x6a, 0x85, 0x8e, 0x1b, 0x0a, 0x4e, 0x12, 0xde, 0x12, 0x7f, 0x96, + 0xbe, 0x2c, 0x76, 0x6a, 0xc9, 0x85, 0xb8, 0xd6, 0xa1, 0x45, 0x1d, 0x12, + 0xe3, 0x04, 0x0d, 0x87, 0x33, 0xd7, 0x78, 0xb3, 0x23, 0x81, 0x01, 0x49, + 0x50, 0x14, 0x7b, 0xa9, 0x3b, 0x9b, 0x72, 0x11, 0xfc, 0x29, 0x08, 0xd9, + 0x5e, 0x91, 0x57, 0x9b, 0x81, 0x03, 0x76, 0x32, 0xb6, 0x39, 0xd0, 0xfc, + 0xc0, 0x3d, 0x16, 0x91, 0xc6, 0x9b, 0x1b, 0xab, 0x57, 0x72, 0x6e, 0xa5, + 0xfe, 0x65, 0xdc, 0xdb, 0x81, 0x58, 0xe8, 0xde, 0x7e, 0x27, 0x66, 0x51, + 0xd8, 0xbf, 0xe7, 0xc8, 0x2d, 0xf9, 0x36, 0xb3, 0x6b, 0x7c, 0x5b, 0x44, + 0xe8, 0xd1, 0x8c, 0x5e, 0xb4, 0xc8, 0xab, 0xfd, 0xe8, 0x90, 0x23, 0x6e, + 0xdc, 0xa4, 0x6b, 0xdc, 0x5a, 0x0f, 0x7a, 0xed, 0xb1, 0xd7, 0x30, 0x71, + 0x92, 0x0e, 0x6d, 0xc2, 0xcf, 0xb2, 0x7e, 0x8a, 0xdd, 0xeb, 0x96, 0x08, + 0x97, 0xbb, 0xb8, 0x13, 0xdb, 0xe5, 0xa8, 0xfb, 0x0c, 0xb8, 0xea, 0xd6, + 0x33, 0xe1, 0xcd, 0xa2, 0xaf, 0xc2, 0xfa, 0xf8, 0xea, 0xe8, 0xbb, 0xa3, + 0x63, 0xeb, 0x57, 0x47, 0xc7, 0xcf, 0x5e, 0xbd, 0xfd, 0xee, 0xe8, 0x6d, + 0xd5, 0x9a, 0x4d, 0x08, 0x95, 0xe7, 0xf7, 0xc7, 0x54, 0xe2, 0xeb, 0x8c, + 0x5b, 0xcf, 0x59, 0xea, 0xdd, 0xbe, 0x26, 0x93, 0x85, 0x07, 0xe7, 0xbe, + 0x82, 0xab, 0x4a, 0x75, 0x63, 0x5a, 0x47, 0x8e, 0xd4, 0xcb, 0x19, 0xe9, + 0xe5, 0x7d, 0x11, 0x55, 0x83, 0xb3, 0x99, 0x88, 0x40, 0x5a, 0x2b, 0xc5, + 0x73, 0x5f, 0x88, 0x20, 0x72, 0x46, 0x0b, 0x03, 0xba, 0x0c, 0x31, 0x76, + 0xa1, 0x03, 0x3d, 0xe1, 0x4c, 0xac, 0xd7, 0xec, 0xe2, 0x92, 0x4a, 0x1c, + 0xea, 0xc0, 0x6e, 0x58, 0x23, 0x61, 0x56, 0xd1, 0x91, 0xf0, 0xf2, 0x7d, + 0xd9, 0x14, 0xa6, 0xf1, 0xee, 0xc5, 0x9b, 0x17, 0x49, 0xc6, 0x96, 0x04, + 0x78, 0x67, 0xcb, 0x1c, 0xdd, 0x8f, 0x50, 0x7b, 0x8c, 0x30, 0x58, 0x33, + 0xc2, 0x30, 0x08, 0x85, 0xc0, 0x95, 0xb8, 0x33, 0x9e, 0xe5, 0x82, 0xe7, + 0x2a, 0xf8, 0x42, 0xdc, 0x31, 0x9a, 0xe3, 0x1a, 0x18, 0x74, 0x53, 0x47, + 0x0c, 0x61, 0xaa, 0xe0, 0x2b, 0x0e, 0x49, 0x7f, 0x9f, 0x71, 0x3d, 0x21, + 0x86, 0x33, 0xa1, 0x10, 0xd0, 0xc5, 0x9b, 0x55, 0x7c, 0x85, 0x61, 0xca, + 0x27, 0x56, 0x3d, 0xc1, 0x99, 0xe4, 0xdd, 0x61, 0x6b, 0x38, 0xf3, 0xce, + 0x48, 0x78, 0x0e, 0xa4, 0xaf, 0x51, 0x7a, 0x62, 0x3c, 0x51, 0x28, 0x71, + 0x5d, 0x3c, 0x7e, 0xd9, 0x67, 0xd1, 0x0c, 0x7a, 0x83, 0x5f, 0xcf, 0x94, + 0x8f, 0x3c, 0x47, 0xde, 0xd7, 0xfa, 0xb3, 0x7a, 0x3e, 0xfe, 0x3b, 0x10, + 0x4b, 0x22, 0xc0, 0x2f, 0xec, 0xa0, 0x27, 0x8a, 0xdc, 0xe5, 0xa8, 0xd8, + 0x5b, 0xfe, 0xd7, 0x3f, 0x16, 0x79, 0xcb, 0x85, 0xce, 0xb2, 0x70, 0xfe, + 0xf5, 0x97, 0xc5, 0xee, 0xf2, 0xe1, 0xd9, 0x57, 0x41, 0xbe, 0x46, 0x80, + 0xf0, 0x38, 0xd5, 0xcb, 0x7a, 0xcb, 0xce, 0x8e, 0x07, 0x7a, 0xff, 0xfa, + 0xfb, 0xbf, 0xfe, 0x22, 0x82, 0x45, 0x9e, 0xf3, 0xb2, 0xb2, 0x67, 0x2e, + 0x3d, 0x06, 0x8b, 0x7c, 0x68, 0xe3, 0x43, 0xcc, 0xff, 0xf5, 0xd7, 0x31, + 0x24, 0xb8, 0xc8, 0x83, 0x8e, 0x1d, 0x68, 0xd8, 0x06, 0xb4, 0x31, 0x43, + 0x63, 0x00, 0x8c, 0xfd, 0xb6, 0x05, 0x2e, 0xb4, 0x88, 0xbe, 0xae, 0x5e, + 0xee, 0x36, 0xe1, 0xe0, 0x69, 0x00, 0x87, 0x13, 0x4b, 0x01, 0xb3, 0x50, + 0x55, 0x64, 0x93, 0x7e, 0xf4, 0xec, 0x3f, 0x16, 0x11, 0x3e, 0xf4, 0xbe, + 0xda, 0x63, 0x57, 0x4b, 0x53, 0xac, 0x14, 0x0e, 0x96, 0x65, 0x96, 0x3b, + 0xc7, 0xc7, 0xc2, 0x41, 0xf7, 0x1e, 0xfa, 0xf0, 0x03, 0x6f, 0xee, 0x6c, + 0x17, 0x47, 0x85, 0x85, 0x97, 0x68, 0xa5, 0x3b, 0x71, 0xab, 0x5f, 0x92, + 0x77, 0x34, 0xaf, 0xaf, 0xe2, 0x58, 0xff, 0x1c, 0x8e, 0x75, 0x7d, 0x25, + 0x9f, 0xfa, 0x25, 0x77, 0xba, 0xa5, 0x6e, 0xf5, 0xab, 0x38, 0x34, 0x4c, + 0x76, 0x23, 0x55, 0xaf, 0xa5, 0x51, 0x62, 0xfb, 0x66, 0x51, 0xe2, 0x9f, + 0x72, 0x28, 0x7a, 0xb4, 0x24, 0x4a, 0xfc, 0x01, 0xeb, 0x2e, 0xcb, 0x7d, + 0x6a, 0xdd, 0x01, 0x2d, 0x06, 0x5d, 0xe6, 0x55, 0x53, 0x95, 0xe6, 0x36, + 0x60, 0x2f, 0xa6, 0x99, 0x7a, 0xe5, 0xbd, 0xea, 0x9f, 0x07, 0xc2, 0x09, + 0x8b, 0x9c, 0xea, 0x63, 0x7b, 0x70, 0x9d, 0x4f, 0xfd, 0xaf, 0x3f, 0xf7, + 0x12, 0x4e, 0x35, 0xfc, 0xfd, 0x6b, 0x7d, 0x6a, 0x8c, 0x07, 0x5f, 0x9c, + 0xa5, 0x4e, 0xf5, 0x5c, 0x38, 0x11, 0x00, 0xae, 0x09, 0x11, 0x6b, 0x97, + 0x6e, 0x99, 0x4b, 0x9d, 0xf1, 0x49, 0x70, 0x1d, 0x83, 0x03, 0x33, 0x13, + 0x14, 0x7a, 0xd5, 0x29, 0x50, 0x60, 0xd7, 0xc0, 0xd1, 0x83, 0x2c, 0x74, + 0xa1, 0xc7, 0x70, 0xa2, 0xc0, 0xd9, 0x6b, 0x48, 0xd3, 0x5d, 0xe4, 0x33, + 0xac, 0x10, 0x50, 0x46, 0xac, 0xe9, 0xa7, 0x3a, 0xa0, 0x2c, 0x5f, 0x5d, + 0x84, 0x9d, 0x23, 0x72, 0x0b, 0x85, 0x39, 0xff, 0x60, 0x36, 0x51, 0xbc, + 0x3c, 0x7e, 0x86, 0x92, 0xf8, 0xd4, 0x68, 0x5f, 0x3e, 0x3b, 0x46, 0x02, + 0x3e, 0x75, 0x02, 0xda, 0x40, 0xb6, 0x44, 0x9c, 0xf0, 0xec, 0x25, 0x12, + 0xf0, 0xa9, 0x13, 0x9e, 0x1d, 0x53, 0x02, 0x3e, 0xe3, 0x84, 0x97, 0x84, + 0x03, 0x9f, 0x3a, 0xe1, 0xa3, 0x24, 0x43, 0x5f, 0x71, 0x92, 0x24, 0x44, + 0x5f, 0x71, 0x92, 0x24, 0x45, 0x5f, 0x71, 0x92, 0x24, 0x46, 0x5f, 0x71, + 0x92, 0x24, 0x87, 0x2f, 0x93, 0x24, 0x09, 0xd2, 0x57, 0x5c, 0x8d, 0x8f, + 0x4c, 0x91, 0xbe, 0x4c, 0x92, 0xac, 0xda, 0xc7, 0x44, 0xdd, 0x3e, 0x32, + 0x45, 0xfa, 0x8a, 0x79, 0xff, 0xc8, 0xe8, 0xe9, 0xcb, 0x24, 0xc9, 0xfa, + 0x7c, 0x4c, 0xa0, 0x3f, 0xfe, 0x48, 0x05, 0xe9, 0xcb, 0x08, 0xee, 0x23, + 0x41, 0xd1, 0x97, 0x11, 0x1d, 0x43, 0xd1, 0x97, 0x11, 0xde, 0x47, 0x29, + 0xbd, 0x8f, 0x09, 0xf1, 0x71, 0x12, 0x7d, 0x19, 0x01, 0x32, 0x2e, 0xfa, + 0x32, 0x14, 0xb9, 0x47, 0xd0, 0x57, 0x8e, 0x62, 0x31, 0x94, 0x69, 0x2e, + 0x4a, 0xa2, 0x2f, 0x43, 0x91, 0x93, 0xf0, 0x55, 0x98, 0x94, 0xd6, 0x19, + 0x73, 0x96, 0xc2, 0x68, 0x4d, 0xa3, 0x83, 0x8f, 0xd2, 0xdb, 0x77, 0xc7, + 0x6f, 0x0e, 0x5f, 0x6b, 0x0c, 0xcd, 0xd6, 0x1e, 0x91, 0x39, 0xc2, 0x1c, + 0xe4, 0xe4, 0x28, 0x8b, 0xc3, 0x9c, 0x6d, 0x50, 0x48, 0x24, 0x16, 0xc2, + 0xf1, 0xf6, 0x28, 0xc6, 0xb0, 0x8b, 0x04, 0xb2, 0xf3, 0xa7, 0xbf, 0x7e, + 0x71, 0x78, 0xf2, 0x41, 0x27, 0xb7, 0x5b, 0x3a, 0x39, 0x99, 0xba, 0xbd, + 0xa7, 0x53, 0xdf, 0x1c, 0x7d, 0xf7, 0xea, 0x97, 0x6f, 0x74, 0xfa, 0xee, + 0xb6, 0x4e, 0x3f, 0x79, 0xfd, 0x2e, 0xae, 0xde, 0x5e, 0x23, 0x46, 0x9d, + 0x4c, 0x7e, 0x62, 0x28, 0x26, 0xd3, 0x9b, 0xcd, 0x98, 0xe4, 0xcb, 0xd7, + 0x87, 0xcf, 0x5f, 0x1d, 0xbe, 0x8e, 0xeb, 0x63, 0x6a, 0x64, 0xce, 0x3d, + 0xc8, 0x2a, 0x99, 0x1a, 0x59, 0x3c, 0x04, 0xc5, 0xa4, 0x91, 0xc6, 0x09, + 0x59, 0x99, 0x98, 0x33, 0x08, 0x69, 0x04, 0x18, 0x97, 0xc0, 0x3c, 0x24, + 0x1b, 0x8b, 0xb6, 0x25, 0x53, 0xb3, 0x55, 0xdd, 0xd6, 0xc9, 0xaf, 0x0f, + 0x8f, 0x5f, 0x1e, 0xc5, 0x02, 0xd0, 0xa9, 0xbf, 0x96, 0xc9, 0x86, 0x73, + 0xda, 0x11, 0xf6, 0x80, 0xb6, 0x54, 0x99, 0x89, 0x2c, 0xdd, 0x25, 0x1b, + 0xef, 0x6e, 0x29, 0xd7, 0x1c, 0x67, 0x28, 0xea, 0x13, 0xac, 0x5b, 0xfd, + 0x21, 0xac, 0x30, 0x60, 0xc1, 0x56, 0xc8, 0x29, 0x82, 0xf9, 0xb4, 0x6b, + 0x70, 0xab, 0x18, 0x49, 0x62, 0xcb, 0xd6, 0x71, 0x02, 0x00, 0xee, 0xdd, + 0x09, 0xe7, 0x77, 0xe1, 0xe0, 0x73, 0xa0, 0xab, 0x5c, 0xb9, 0x2c, 0xd1, + 0x66, 0x0e, 0x9a, 0xef, 0x60, 0xef, 0xd3, 0x3e, 0x95, 0x10, 0x26, 0x37, + 0xaa, 0x7a, 0x95, 0xcb, 0x40, 0x44, 0xb3, 0xc0, 0x2b, 0x8b, 0xee, 0xbb, + 0x1e, 0xd9, 0xb9, 0x3a, 0x66, 0x40, 0x30, 0x72, 0x91, 0x4f, 0x7b, 0x1d, + 0xdf, 0x0d, 0xff, 0xf4, 0xa7, 0xcb, 0xd3, 0xd3, 0x29, 0x3d, 0x9f, 0x9e, + 0x76, 0x3e, 0x7d, 0xbe, 0x22, 0x0b, 0x4a, 0x17, 0xfd, 0x23, 0xba, 0x78, + 0x48, 0xf7, 0x3b, 0x3f, 0x7a, 0x14, 0x63, 0x13, 0xd5, 0xa8, 0x72, 0x29, + 0xea, 0x31, 0x78, 0x37, 0xba, 0xfa, 0xd3, 0x9f, 0xd2, 0xb9, 0x43, 0xdc, + 0x43, 0x49, 0x3c, 0x78, 0xfc, 0x4e, 0x90, 0x4a, 0x54, 0x1f, 0xdb, 0xe1, + 0xbb, 0xb9, 0x07, 0x7a, 0x53, 0x98, 0xf4, 0x8b, 0xb2, 0x57, 0x79, 0xf4, + 0xa8, 0x2c, 0x3e, 0x79, 0x9f, 0xbb, 0x11, 0x3e, 0x2a, 0x57, 0x15, 0x66, + 0xf1, 0x6a, 0x5f, 0x61, 0x41, 0x19, 0xc9, 0x73, 0xfc, 0xec, 0xa3, 0x86, + 0xb4, 0x43, 0xa6, 0x0e, 0x29, 0xa0, 0x92, 0x33, 0x34, 0x77, 0x00, 0xba, + 0x82, 0xc1, 0xaa, 0x51, 0x9d, 0x59, 0x51, 0x6f, 0x7d, 0xc0, 0x3d, 0xd3, + 0xdd, 0xae, 0xf7, 0xad, 0xaa, 0x66, 0x9f, 0xa7, 0x08, 0xa0, 0xd8, 0x29, + 0xfb, 0x49, 0x30, 0xf3, 0xbb, 0x8a, 0xfb, 0x4b, 0x2d, 0xbf, 0x72, 0xc5, + 0x0c, 0x1b, 0xa1, 0x69, 0x89, 0x59, 0xc9, 0xaa, 0x29, 0x2e, 0xd4, 0xbe, + 0xd4, 0xa8, 0xca, 0x4f, 0x8c, 0x50, 0x5c, 0x5d, 0x95, 0x2b, 0x55, 0xbf, + 0x6b, 0xa0, 0x13, 0xec, 0xab, 0x26, 0x20, 0x0a, 0x7e, 0x57, 0xd4, 0xfb, + 0x78, 0xfd, 0x6c, 0x99, 0x8a, 0x56, 0x4b, 0x3c, 0xcb, 0x2c, 0x21, 0xf3, + 0x4f, 0x7f, 0xa2, 0x84, 0x7d, 0x45, 0xd3, 0xaf, 0xab, 0xe8, 0x77, 0x37, + 0xd2, 0xbf, 0xaa, 0x7e, 0x9d, 0x81, 0x41, 0xd5, 0xbf, 0x52, 0x60, 0x51, + 0xd9, 0xab, 0x8a, 0x4a, 0xd5, 0xbb, 0x42, 0xfd, 0xaa, 0xc1, 0x12, 0xda, + 0x55, 0x1f, 0xd4, 0x7d, 0xec, 0xaa, 0x6e, 0x40, 0x36, 0x11, 0x84, 0x1f, + 0x75, 0x9b, 0xa2, 0x5d, 0xa9, 0xc6, 0x69, 0x1e, 0xd2, 0xb0, 0x6b, 0xb5, + 0x54, 0x61, 0xdd, 0x09, 0xd2, 0x4c, 0xf6, 0x5d, 0x3f, 0xc4, 0xcc, 0xce, + 0xcf, 0x30, 0x19, 0xd4, 0x31, 0x75, 0x7d, 0x8e, 0x65, 0x5a, 0xaf, 0xfb, + 0xa0, 0x51, 0x0d, 0xd0, 0x36, 0x03, 0xf0, 0x8b, 0x1f, 0x10, 0x79, 0xe8, + 0x7b, 0x5d, 0xaf, 0x1a, 0x14, 0x32, 0xea, 0x24, 0x85, 0xec, 0x0c, 0xcb, + 0x98, 0x02, 0xf0, 0x96, 0x4a, 0xac, 0x11, 0x3f, 0xe8, 0x42, 0x98, 0xa4, + 0x74, 0xb1, 0x8e, 0x57, 0x24, 0x06, 0x93, 0x70, 0x55, 0x0d, 0xbb, 0x97, + 0x38, 0x78, 0xa2, 0x7a, 0x04, 0xe3, 0xf9, 0x4e, 0xd0, 0x65, 0x0f, 0x4d, + 0xb1, 0x5d, 0x45, 0x87, 0x2b, 0xca, 0x68, 0x7f, 0xb3, 0x2d, 0xda, 0x3f, + 0x7a, 0x63, 0x47, 0xe3, 0x3a, 0xdc, 0xa8, 0x81, 0x3f, 0x29, 0x57, 0x08, + 0xf4, 0x97, 0x53, 0xda, 0xc7, 0xd7, 0xd9, 0x11, 0xed, 0x6a, 0x90, 0x2d, + 0xf5, 0x12, 0xb3, 0xe1, 0x17, 0x36, 0x29, 0x5a, 0xa7, 0x59, 0x6f, 0x57, + 0x4d, 0xee, 0x07, 0x14, 0x41, 0x4c, 0xaf, 0xb3, 0x8d, 0x52, 0xcc, 0x47, + 0x14, 0x50, 0x8c, 0xbb, 0xb9, 0xd5, 0xa8, 0x0e, 0x44, 0x6f, 0x36, 0xea, + 0x3c, 0x68, 0x5e, 0xed, 0x67, 0x75, 0x27, 0xd1, 0x20, 0x02, 0x8a, 0xc4, + 0xea, 0x90, 0x11, 0xfe, 0xe5, 0x95, 0x14, 0xbe, 0xdf, 0x65, 0x21, 0xb3, + 0x6a, 0x9d, 0xba, 0x0e, 0x79, 0xa5, 0x22, 0x40, 0x9d, 0xb9, 0xf5, 0xd1, + 0x37, 0xab, 0x4a, 0x21, 0xe8, 0x27, 0x6d, 0x57, 0xa6, 0x6f, 0x6e, 0x21, + 0xea, 0xb7, 0x55, 0x59, 0x0c, 0xe4, 0x83, 0x0b, 0x9e, 0xbd, 0x60, 0x93, + 0xaf, 0x4a, 0x0b, 0xc7, 0xb4, 0xef, 0x31, 0x96, 0x0e, 0xda, 0x4c, 0x65, + 0xa8, 0x84, 0xd7, 0x10, 0x6f, 0xf7, 0x81, 0x86, 0xee, 0x21, 0xd4, 0x18, + 0x5c, 0x7c, 0x90, 0x1b, 0xa1, 0x5d, 0xbf, 0x57, 0x52, 0xe9, 0x4c, 0xe9, + 0x39, 0x74, 0x43, 0x0c, 0x0c, 0xb0, 0xe2, 0xe8, 0x17, 0x33, 0x81, 0xc3, + 0x0b, 0x9f, 0x3e, 0xcb, 0x54, 0xdf, 0x63, 0xd8, 0xae, 0xac, 0xa6, 0x4e, + 0xe3, 0x5a, 0x64, 0xd2, 0x54, 0xf1, 0x4c, 0x2a, 0xd5, 0x2d, 0x95, 0x74, + 0x3a, 0x46, 0xd3, 0xb9, 0xe2, 0x1d, 0xd2, 0x53, 0xaa, 0xee, 0xd7, 0x4f, + 0x59, 0xf0, 0xe5, 0x12, 0x15, 0xb1, 0xf8, 0x02, 0x5c, 0xa5, 0xc8, 0x51, + 0x17, 0x99, 0xbe, 0x9c, 0x4a, 0xd5, 0xe3, 0x06, 0xaf, 0x02, 0x6f, 0xdc, + 0x19, 0xbe, 0x4d, 0x64, 0x74, 0xa2, 0xfd, 0x3e, 0xf4, 0x39, 0x50, 0x4d, + 0x5c, 0xf6, 0x63, 0xe1, 0xa8, 0x94, 0x4a, 0x15, 0x49, 0x33, 0x86, 0x55, + 0x29, 0x5d, 0xd8, 0x51, 0x0d, 0x9e, 0xb7, 0x1d, 0x80, 0xc6, 0x05, 0xfa, + 0x88, 0x2e, 0x80, 0x69, 0x24, 0x5f, 0x55, 0x3d, 0xc6, 0x30, 0x0f, 0xeb, + 0x09, 0xf9, 0x22, 0xc1, 0x3c, 0x21, 0x3b, 0x25, 0xce, 0x3a, 0x6c, 0xe9, + 0x11, 0xa6, 0xe7, 0x06, 0xb9, 0x88, 0xb1, 0x4b, 0x4c, 0x21, 0xae, 0x76, + 0x45, 0xe2, 0x15, 0x30, 0xe7, 0x5b, 0xc2, 0x57, 0x82, 0x7c, 0xf4, 0x48, + 0xfd, 0xa2, 0xf2, 0x48, 0x35, 0x8a, 0x55, 0xa7, 0xc4, 0x3c, 0x95, 0x28, + 0x49, 0x85, 0x6c, 0xc1, 0x11, 0x89, 0xf5, 0xb5, 0x2a, 0x45, 0x2a, 0x0c, + 0x8a, 0x57, 0xa9, 0x86, 0x51, 0xc1, 0x86, 0x05, 0x6d, 0xa3, 0x38, 0xd3, + 0xcd, 0xc3, 0x9c, 0xa9, 0x34, 0x30, 0x67, 0x1e, 0x72, 0xfc, 0xa9, 0xf4, + 0x3b, 0x61, 0x91, 0xe7, 0x0e, 0x0b, 0x18, 0x64, 0xcd, 0x54, 0xec, 0x55, + 0x85, 0x22, 0x2b, 0x99, 0x31, 0xf1, 0xec, 0xb2, 0x52, 0xc8, 0xd2, 0x87, + 0x57, 0x6f, 0x8e, 0xde, 0xfd, 0xf2, 0x43, 0x09, 0x2a, 0x14, 0xc3, 0x7e, + 0x5b, 0x8a, 0xa4, 0x26, 0x94, 0x3a, 0x12, 0x4c, 0xd6, 0x92, 0x11, 0x3f, + 0x7a, 0x14, 0xff, 0xe4, 0x1a, 0x1a, 0xb2, 0xe7, 0xa2, 0x6f, 0x49, 0xda, + 0x71, 0x9d, 0x4b, 0x19, 0x11, 0x70, 0xf6, 0x0d, 0x05, 0x40, 0x98, 0x34, + 0xf3, 0x19, 0x69, 0x3c, 0x47, 0xff, 0x5c, 0xd4, 0x5c, 0xd4, 0x77, 0x93, + 0x8d, 0x75, 0x9a, 0xec, 0x18, 0x21, 0x0d, 0x75, 0x39, 0x8b, 0x82, 0x2a, + 0x1a, 0x52, 0xb2, 0xea, 0x8c, 0x05, 0xe9, 0xea, 0x67, 0xbe, 0x71, 0x29, + 0xf5, 0xb6, 0x4d, 0x3b, 0x0b, 0xdc, 0xae, 0x50, 0xbf, 0x79, 0x54, 0xc7, + 0xbc, 0x3d, 0x54, 0x83, 0x73, 0xdc, 0xfb, 0xbb, 0x9e, 0x7a, 0x36, 0xb2, + 0x50, 0x14, 0x94, 0xa3, 0x20, 0x87, 0x20, 0xed, 0xa2, 0x80, 0x44, 0x49, + 0xed, 0xe5, 0x7e, 0xf5, 0x16, 0x73, 0x89, 0x4b, 0x8c, 0xf7, 0x9d, 0x7c, + 0xff, 0x6e, 0x5c, 0x55, 0xb1, 0x6a, 0x80, 0x60, 0x21, 0x4d, 0xb4, 0x3b, + 0xb0, 0xa8, 0xc0, 0x3e, 0x74, 0x46, 0x33, 0xfd, 0x0c, 0xf1, 0x2f, 0x44, + 0xff, 0xee, 0xfd, 0xd1, 0xdb, 0x85, 0x88, 0x9b, 0xb7, 0x40, 0xfc, 0xfc, + 0xf5, 0xbb, 0x93, 0x65, 0x4c, 0xb7, 0x6e, 0x89, 0xfb, 0xe8, 0xbb, 0x85, + 0xa8, 0xdb, 0x37, 0x46, 0x1d, 0xfb, 0x63, 0xab, 0x09, 0x5e, 0xd4, 0x0d, + 0xd0, 0x9d, 0xd0, 0xa4, 0xd6, 0x58, 0x42, 0x8d, 0xb2, 0xef, 0x84, 0x8e, + 0x6a, 0x9c, 0x25, 0xa4, 0x08, 0xe2, 0xae, 0x6a, 0x25, 0x9b, 0x6b, 0x09, + 0x31, 0x09, 0x70, 0x27, 0xb4, 0xcc, 0x18, 0xb6, 0x90, 0x9e, 0xec, 0x81, + 0xf3, 0xf0, 0x5b, 0xfa, 0x91, 0x19, 0x06, 0x3b, 0x59, 0xbf, 0x03, 0x8e, + 0x1e, 0x23, 0x31, 0xd6, 0x29, 0x0b, 0x81, 0x5e, 0xaf, 0x11, 0x91, 0x4b, + 0x6b, 0x70, 0x1a, 0x80, 0xca, 0x9d, 0x54, 0xcd, 0xb8, 0x53, 0x0b, 0xab, + 0xc6, 0xbe, 0x25, 0xdc, 0xc1, 0x72, 0xd6, 0x01, 0xab, 0x36, 0xee, 0x86, + 0x87, 0xde, 0x0c, 0x21, 0x3e, 0x2c, 0xa9, 0x1c, 0x4e, 0x96, 0xf2, 0x91, + 0x77, 0xc8, 0xea, 0x28, 0x34, 0xeb, 0x8b, 0x72, 0x72, 0x1e, 0xa3, 0xc1, + 0x4b, 0x72, 0x85, 0xac, 0xd4, 0xd5, 0x7e, 0x77, 0xf4, 0xad, 0xf8, 0x06, + 0x73, 0x0e, 0x44, 0x2b, 0x47, 0x38, 0x60, 0x19, 0x59, 0x89, 0x79, 0xe0, + 0x33, 0x78, 0x81, 0x32, 0x97, 0xaf, 0xfc, 0xe2, 0x5f, 0xbd, 0x8b, 0x48, + 0xbc, 0x66, 0xd8, 0xaa, 0xb8, 0x42, 0x4d, 0xbf, 0x29, 0xe7, 0x9b, 0x38, + 0xcd, 0x78, 0xe7, 0x8e, 0xc4, 0x21, 0xce, 0x31, 0x14, 0x84, 0x64, 0xd9, + 0xd7, 0xd0, 0x36, 0x53, 0xa8, 0x53, 0x2a, 0xdd, 0x09, 0x1b, 0x7a, 0xbc, + 0x59, 0x83, 0x09, 0x5d, 0xe4, 0xae, 0x58, 0x08, 0x68, 0x8d, 0x15, 0x6b, + 0x4d, 0xd1, 0x3a, 0xfd, 0xce, 0x14, 0xea, 0xdc, 0xb9, 0x29, 0x9d, 0x05, + 0xeb, 0x88, 0x63, 0x16, 0xac, 0x26, 0x89, 0x04, 0x89, 0xba, 0x9c, 0x58, + 0xa4, 0x14, 0xda, 0xcc, 0xa6, 0x04, 0xc5, 0x16, 0x78, 0x7a, 0x5b, 0x34, + 0x65, 0x69, 0x14, 0xcf, 0x86, 0xf4, 0x5c, 0x26, 0xef, 0xe7, 0x2c, 0x93, + 0x1d, 0xce, 0x50, 0x52, 0xaa, 0xb2, 0xa2, 0x06, 0x82, 0x29, 0x32, 0x5b, + 0x6c, 0xd5, 0xd2, 0x4e, 0x55, 0x07, 0x2f, 0x6e, 0x62, 0x14, 0x16, 0x3f, + 0x0e, 0x4a, 0x45, 0x40, 0x38, 0x8f, 0xf2, 0x47, 0xea, 0xbc, 0x03, 0xba, + 0x01, 0x00, 0x8b, 0x7b, 0x71, 0x47, 0x2c, 0x55, 0xae, 0x52, 0xa2, 0x88, + 0xe7, 0xad, 0x19, 0x71, 0x2c, 0x9f, 0xf3, 0xe5, 0xa7, 0x71, 0xf9, 0x59, + 0xa3, 0x31, 0xad, 0xd7, 0xd7, 0x5c, 0x75, 0x7b, 0xe3, 0x27, 0x33, 0x13, + 0x59, 0x8f, 0x4b, 0x56, 0xd4, 0x24, 0xa4, 0xab, 0xc2, 0x13, 0x99, 0x94, + 0x37, 0xba, 0x94, 0x83, 0xae, 0xe4, 0x80, 0x47, 0x66, 0xa6, 0x6f, 0x24, + 0x48, 0x88, 0xe0, 0xc2, 0x2b, 0xfa, 0x66, 0x8e, 0x04, 0x06, 0xd2, 0x80, + 0x4a, 0xc8, 0x12, 0x36, 0x6f, 0x38, 0xa7, 0xb3, 0x70, 0x8c, 0x52, 0x19, + 0x36, 0x71, 0xd6, 0x33, 0xe5, 0x8d, 0x66, 0x04, 0x9f, 0x99, 0xb7, 0x7f, + 0x12, 0x9f, 0x1f, 0x3d, 0xca, 0xa7, 0x49, 0xdc, 0x51, 0xae, 0x31, 0xe9, + 0x8d, 0x2e, 0xeb, 0x62, 0x2f, 0xe7, 0x13, 0xbb, 0x05, 0x14, 0xf1, 0x06, + 0x36, 0x2c, 0xec, 0x14, 0xcd, 0x23, 0xb9, 0x35, 0xaf, 0x32, 0xf5, 0x54, + 0x42, 0x32, 0xf4, 0x4d, 0x58, 0x4f, 0xce, 0xf1, 0xbb, 0x8d, 0xfd, 0xe8, + 0xa9, 0x8d, 0x35, 0x35, 0x5e, 0x8b, 0x56, 0x43, 0xc6, 0x7e, 0xf4, 0xcd, + 0x37, 0x15, 0xf1, 0x29, 0xfa, 0xdc, 0x8d, 0x73, 0xf0, 0xb0, 0x9f, 0x72, + 0xc5, 0xeb, 0x8c, 0xf8, 0xd1, 0xa3, 0xc4, 0xd9, 0x61, 0x3a, 0x7a, 0xec, + 0x5e, 0x94, 0x55, 0x4a, 0xf5, 0x13, 0x96, 0x11, 0x4e, 0x0e, 0x4a, 0x9f, + 0x29, 0xdc, 0xd7, 0xb7, 0xa3, 0x7c, 0x1b, 0x9c, 0xc2, 0xba, 0xbc, 0x85, + 0x35, 0xe7, 0x48, 0x4d, 0x92, 0x45, 0xc9, 0x5e, 0x8a, 0x1c, 0x38, 0x15, + 0xf5, 0x25, 0xe1, 0x9d, 0x6c, 0x34, 0x60, 0x59, 0x24, 0x08, 0xb1, 0x37, + 0x20, 0x2b, 0x0a, 0x32, 0x55, 0x03, 0x83, 0xc5, 0x07, 0x96, 0xc2, 0x40, + 0x94, 0x5f, 0x75, 0xa8, 0xb8, 0x7d, 0x9e, 0x2f, 0xde, 0x37, 0xc5, 0x1d, + 0x14, 0x2f, 0x0c, 0x70, 0x39, 0xd5, 0x59, 0x37, 0xd0, 0xa1, 0xa5, 0x6c, + 0x97, 0x3d, 0x68, 0x40, 0x13, 0x90, 0x2f, 0xa3, 0x5c, 0x53, 0x7f, 0x5e, + 0xf6, 0x72, 0xdd, 0xba, 0xd6, 0xac, 0x54, 0x0e, 0xfa, 0x0c, 0xd7, 0xaf, + 0x54, 0x53, 0x5d, 0xc1, 0xa3, 0xb7, 0xcf, 0x0d, 0x88, 0x4c, 0xa9, 0x3a, + 0xab, 0x54, 0x67, 0x19, 0x79, 0xcf, 0x6d, 0x27, 0x2a, 0x96, 0xb3, 0xe6, + 0x87, 0xa2, 0xa8, 0x18, 0x0f, 0xb0, 0x69, 0x5b, 0xa4, 0xe6, 0x71, 0x89, + 0xf8, 0x48, 0x54, 0xcd, 0xb4, 0x5c, 0x19, 0xed, 0xba, 0xa0, 0x65, 0x7f, + 0x19, 0xb8, 0x09, 0xd5, 0xe7, 0x38, 0x61, 0xce, 0x59, 0x11, 0x2a, 0x38, + 0xa8, 0xe8, 0x52, 0x2b, 0x43, 0x7d, 0xbe, 0xd0, 0x2c, 0x73, 0x9f, 0xe0, + 0x75, 0xf9, 0x44, 0x09, 0xc9, 0x39, 0x34, 0xa2, 0xcc, 0x20, 0x79, 0xff, + 0x67, 0x11, 0xca, 0x88, 0xe1, 0xa3, 0x7a, 0x84, 0x95, 0x43, 0x0d, 0x13, + 0x5d, 0x45, 0x63, 0xba, 0x46, 0xe6, 0x88, 0x67, 0xf5, 0x58, 0xd2, 0xfe, + 0x62, 0xd3, 0xcd, 0x15, 0xbf, 0x3c, 0x7e, 0x9d, 0xb1, 0xd2, 0xda, 0xe4, + 0x2d, 0x10, 0x21, 0x61, 0x7e, 0x90, 0x8b, 0xc5, 0x3d, 0x7a, 0x54, 0x68, + 0xc3, 0x2b, 0x97, 0x05, 0x51, 0xbb, 0x86, 0x8c, 0x76, 0x65, 0x14, 0xdf, + 0x83, 0x87, 0x66, 0x22, 0x94, 0x50, 0x5d, 0x13, 0x71, 0xfc, 0x36, 0x4c, + 0xe4, 0x74, 0x10, 0xa9, 0x05, 0x68, 0x2e, 0xc4, 0x99, 0x54, 0xca, 0x00, + 0x25, 0xf2, 0x31, 0xd0, 0xa0, 0x3a, 0x43, 0xc1, 0x38, 0x36, 0x5b, 0xb5, + 0x4d, 0x81, 0xd9, 0xb7, 0x4e, 0xb9, 0xd2, 0x99, 0x51, 0xdd, 0x72, 0xaa, + 0xda, 0xf5, 0x2b, 0x29, 0xe5, 0x03, 0x2b, 0x56, 0x20, 0x79, 0xc1, 0x37, + 0x6d, 0x46, 0x81, 0xfd, 0xce, 0x39, 0xd2, 0xa5, 0x83, 0x2e, 0x05, 0xa1, + 0xf7, 0xf1, 0x4a, 0x70, 0x71, 0x59, 0x80, 0xf6, 0x9b, 0x6f, 0xd2, 0x2a, + 0xad, 0xd8, 0xcd, 0x63, 0xd2, 0xaa, 0x2f, 0xcd, 0xad, 0xb6, 0xb4, 0x34, + 0xd8, 0xc7, 0x2a, 0x13, 0x47, 0xa2, 0xcb, 0xe3, 0xae, 0x8d, 0xb8, 0x77, + 0x0b, 0x26, 0x72, 0xac, 0xa7, 0x66, 0x95, 0x54, 0xb3, 0xbf, 0xf5, 0x2d, + 0xd9, 0xee, 0xb1, 0x18, 0xe4, 0xb5, 0x0f, 0xb4, 0xa2, 0xfc, 0xc5, 0xc1, + 0xc6, 0x32, 0x15, 0x8b, 0x1c, 0xb3, 0x15, 0x94, 0x5d, 0xa9, 0x5c, 0x61, + 0x45, 0x2a, 0x88, 0x18, 0xa6, 0x7a, 0x40, 0x59, 0x70, 0x74, 0xa3, 0x72, + 0x95, 0x05, 0xa7, 0x15, 0x98, 0xd4, 0x20, 0xfe, 0xad, 0xc8, 0xc6, 0x71, + 0x3b, 0x28, 0x9c, 0x93, 0xc4, 0x25, 0xb0, 0xc1, 0x88, 0xc5, 0x51, 0x92, + 0x0e, 0x60, 0xe2, 0x07, 0x72, 0xb2, 0x68, 0xb4, 0xec, 0x26, 0x13, 0xbf, + 0xa5, 0x7e, 0x6d, 0x73, 0xd7, 0x35, 0x89, 0x95, 0x8e, 0x4a, 0x45, 0x89, + 0xdc, 0x94, 0x2b, 0x15, 0xcd, 0xcc, 0xb1, 0x45, 0x29, 0x18, 0x41, 0x93, + 0x42, 0x37, 0x30, 0x2b, 0xc5, 0x54, 0x85, 0x0e, 0x5f, 0x69, 0x10, 0xf4, + 0xb5, 0x3e, 0x1b, 0x92, 0xab, 0x64, 0xa7, 0xcb, 0x80, 0xa5, 0xba, 0x5e, + 0x52, 0x4d, 0x74, 0xcc, 0x4e, 0xc7, 0xba, 0xf2, 0xf1, 0xc2, 0x32, 0x2f, + 0x10, 0x95, 0xe5, 0x6f, 0x1d, 0xf8, 0x53, 0x80, 0xf9, 0x41, 0xd3, 0x09, + 0x0b, 0x1d, 0x32, 0x52, 0xd8, 0x02, 0x17, 0xf5, 0x1a, 0xa7, 0x53, 0xb1, + 0x9a, 0xd7, 0xd4, 0x7d, 0xe8, 0xf2, 0x65, 0x81, 0xbf, 0x99, 0x8f, 0xef, + 0x31, 0xf7, 0x1c, 0x32, 0xd3, 0x0c, 0x63, 0x44, 0xed, 0x8f, 0xc9, 0xa6, + 0xe6, 0x04, 0x66, 0x62, 0xd5, 0x0b, 0xa5, 0x25, 0x41, 0x2c, 0xbe, 0x27, + 0xa5, 0x92, 0xf7, 0x1b, 0x1b, 0x69, 0x8c, 0xf9, 0xd8, 0x5d, 0x46, 0x2a, + 0x25, 0x25, 0x67, 0x96, 0x3d, 0x2d, 0x16, 0x7e, 0x1b, 0xd5, 0x13, 0x49, + 0xe0, 0xb2, 0x43, 0x1f, 0x29, 0xac, 0x39, 0x71, 0x64, 0x99, 0x35, 0x01, + 0x01, 0xc3, 0x77, 0xa6, 0x48, 0xc9, 0xc8, 0xb8, 0xc8, 0xeb, 0x92, 0x4b, + 0x09, 0xa5, 0xdc, 0xba, 0xc3, 0x35, 0xa5, 0xd4, 0x4a, 0x59, 0xbe, 0x11, + 0xae, 0x29, 0x17, 0xbf, 0x48, 0xa2, 0x20, 0x9e, 0x7e, 0x6d, 0x59, 0xb9, + 0x84, 0x98, 0x57, 0xdb, 0xb4, 0x6a, 0xca, 0x6e, 0xb7, 0x96, 0xc8, 0x24, + 0x7c, 0x5e, 0x5e, 0x48, 0x5f, 0x57, 0x58, 0x28, 0xb2, 0xbe, 0xa4, 0x50, + 0xe8, 0x66, 0x62, 0x42, 0xc1, 0x9b, 0xca, 0x28, 0xd9, 0x11, 0x53, 0x42, + 0x4a, 0x66, 0xb0, 0x98, 0xf2, 0x4b, 0x43, 0x39, 0x90, 0xcc, 0x52, 0x11, + 0xd1, 0xc2, 0x22, 0x31, 0xfe, 0x8f, 0xb7, 0x2e, 0xd0, 0xcd, 0xda, 0xd8, + 0xb1, 0x80, 0xd3, 0x72, 0x78, 0xe5, 0x3c, 0x1c, 0xe1, 0x3e, 0x6f, 0x76, + 0xae, 0xeb, 0x2b, 0xc7, 0x01, 0x47, 0xb7, 0xf9, 0x48, 0xa8, 0x6e, 0xd7, + 0x2a, 0x11, 0x84, 0x4b, 0x8f, 0x25, 0xba, 0xb9, 0xc7, 0xa4, 0x97, 0xf4, + 0xc5, 0x3c, 0x1a, 0x63, 0xa9, 0xf9, 0xa4, 0x55, 0x6f, 0xee, 0xee, 0xd5, + 0x9b, 0x78, 0x57, 0x70, 0xab, 0xd9, 0x2e, 0xc9, 0x97, 0x82, 0xf3, 0xf2, + 0x39, 0xa6, 0x93, 0x34, 0xaa, 0x10, 0xd4, 0x9c, 0x36, 0x24, 0x94, 0xac, + 0x6f, 0xb8, 0x18, 0xbe, 0x4a, 0x9d, 0xbd, 0x66, 0x49, 0x73, 0x17, 0x1f, + 0xc6, 0x35, 0x7b, 0x2a, 0x5c, 0x9b, 0xf7, 0x3d, 0x9b, 0xed, 0x63, 0x11, + 0x1d, 0xdc, 0x3e, 0x1d, 0xca, 0x1d, 0x78, 0x0f, 0x5f, 0xf0, 0x5f, 0x3a, + 0x4f, 0x6f, 0x0f, 0x7e, 0xd8, 0xc0, 0x5f, 0x36, 0x93, 0xae, 0x6f, 0xa3, + 0xbc, 0x36, 0xff, 0x65, 0xf2, 0x22, 0x4f, 0x16, 0xdb, 0x6b, 0x3c, 0x6f, + 0xe4, 0xb2, 0xb0, 0xe9, 0x43, 0x52, 0x04, 0xd6, 0x38, 0xf7, 0x8b, 0x13, + 0x3a, 0x3d, 0xc7, 0x75, 0x22, 0xec, 0x39, 0xff, 0xf4, 0x59, 0x26, 0xaa, + 0x43, 0xda, 0xa7, 0xd4, 0xbe, 0xb4, 0xbd, 0x4d, 0x1f, 0xbe, 0x8e, 0x37, + 0xbe, 0x9d, 0x7a, 0x6a, 0xe7, 0x1b, 0x6f, 0xef, 0x90, 0x35, 0x97, 0xe1, + 0x07, 0x53, 0xef, 0xb1, 0xd9, 0xfd, 0xaa, 0xcb, 0xc6, 0x37, 0xa3, 0x67, + 0xd3, 0xa6, 0xbc, 0xaf, 0xb5, 0xa1, 0x92, 0xe2, 0x0b, 0xb3, 0x73, 0x60, + 0x70, 0x11, 0x4c, 0x1a, 0xb5, 0x49, 0x48, 0x7b, 0x8a, 0x9b, 0xe6, 0xb9, + 0xef, 0x11, 0x1e, 0xf3, 0x4c, 0xbb, 0xcd, 0xd2, 0x25, 0x70, 0x67, 0x6d, + 0x0a, 0x62, 0x78, 0xee, 0x4f, 0x13, 0x65, 0x84, 0x47, 0xe1, 0x13, 0x2a, + 0x37, 0xef, 0xe0, 0x38, 0x24, 0xdc, 0x26, 0x64, 0x2c, 0xd8, 0x4b, 0x48, + 0xf7, 0x55, 0x99, 0xfa, 0xe3, 0x2e, 0x10, 0xb3, 0x15, 0x47, 0x1f, 0xda, + 0x33, 0x88, 0xe9, 0x52, 0xcb, 0xd4, 0xa3, 0x3f, 0x8d, 0x9f, 0xf8, 0x34, + 0xaa, 0x79, 0x52, 0xcd, 0x7f, 0x39, 0xef, 0xe0, 0xdd, 0xfe, 0x01, 0x7d, + 0x8c, 0xe8, 0xa3, 0x47, 0x1f, 0x63, 0x71, 0xde, 0x29, 0x35, 0xd4, 0x1f, + 0xf6, 0xef, 0xcf, 0x5b, 0x0c, 0xc4, 0x9f, 0x23, 0xfe, 0xec, 0xb5, 0x14, + 0x5c, 0x2b, 0x0d, 0xd8, 0x66, 0x40, 0xfe, 0x1c, 0xf1, 0x67, 0xaf, 0xad, + 0x00, 0xdb, 0x09, 0x40, 0x7d, 0x46, 0x46, 0xbe, 0x74, 0xcb, 0xe3, 0xdd, + 0xde, 0xe8, 0x17, 0x2a, 0x95, 0x5f, 0x0f, 0xc5, 0x09, 0xb1, 0x00, 0x5b, + 0x7b, 0xcd, 0xd6, 0xf0, 0xfc, 0x54, 0xd6, 0x80, 0x76, 0x92, 0x24, 0x2b, + 0x71, 0x8a, 0x00, 0x55, 0xdc, 0x3e, 0xf2, 0xcc, 0x6d, 0x42, 0xcb, 0x8c, + 0x6f, 0x9c, 0x2a, 0x69, 0x5e, 0xe2, 0x7b, 0x6a, 0x20, 0x92, 0xe5, 0x80, + 0xf4, 0xb4, 0x18, 0xc8, 0xc8, 0xd0, 0x09, 0x75, 0xba, 0x18, 0xa4, 0x1b, + 0x12, 0xfb, 0xf2, 0x31, 0x41, 0x19, 0x9f, 0xf2, 0xee, 0x56, 0x78, 0xa1, + 0xa6, 0x0c, 0xdd, 0x50, 0x25, 0x5b, 0x35, 0x55, 0x07, 0xb9, 0x27, 0x34, + 0x46, 0x63, 0x5a, 0x9c, 0x22, 0x24, 0xaf, 0xa2, 0x7d, 0x3e, 0x43, 0x41, + 0x6f, 0xf7, 0xa2, 0xab, 0x8b, 0xa6, 0x01, 0xf9, 0x44, 0x74, 0x3e, 0x22, + 0x0a, 0xe5, 0x75, 0x24, 0x1e, 0x5d, 0xb7, 0x63, 0xf6, 0x3e, 0xfd, 0x0a, + 0x47, 0x90, 0x5d, 0xd7, 0xb6, 0x7e, 0x16, 0x5a, 0xb4, 0xf1, 0x99, 0x37, + 0xf7, 0x5a, 0x27, 0xea, 0x4d, 0x9a, 0xbd, 0x0b, 0xeb, 0x25, 0x12, 0x46, + 0xb6, 0xf5, 0x2b, 0x07, 0xe7, 0x65, 0xfc, 0xef, 0x7f, 0x8f, 0x36, 0x33, + 0x01, 0xbf, 0x3c, 0x9f, 0x35, 0xb0, 0x10, 0x7b, 0x09, 0x2e, 0x4e, 0xe4, + 0xe6, 0xad, 0xe0, 0xfb, 0xdf, 0x8b, 0x37, 0x48, 0xfc, 0x31, 0x2c, 0x87, + 0x9c, 0x7a, 0xe4, 0x56, 0x94, 0x06, 0x4a, 0xd7, 0xcf, 0xdc, 0xf9, 0x95, + 0x2a, 0x6a, 0xa0, 0xa5, 0x91, 0x63, 0x22, 0x32, 0x8d, 0xd9, 0xe2, 0x4b, + 0x08, 0x71, 0x55, 0x97, 0x0b, 0xcf, 0x3c, 0x00, 0xdd, 0x2e, 0x51, 0x78, + 0xfc, 0x10, 0x3f, 0x1f, 0x57, 0xaa, 0xf2, 0x40, 0x82, 0x4e, 0xe3, 0x07, + 0xa4, 0xf2, 0x69, 0x04, 0x9d, 0x48, 0xbf, 0x91, 0xc6, 0x47, 0x11, 0xe2, + 0x44, 0x7a, 0xa0, 0x54, 0xa5, 0x5c, 0x3a, 0x59, 0x3e, 0x21, 0x5d, 0xaa, + 0x97, 0x4e, 0xc6, 0x03, 0x51, 0xdb, 0xb7, 0x62, 0xde, 0x22, 0x6a, 0xf9, + 0x2c, 0x6b, 0x38, 0x78, 0xf0, 0x2b, 0xdb, 0xd5, 0x85, 0x64, 0x42, 0xcc, + 0x63, 0x3a, 0x53, 0x27, 0x69, 0x66, 0xd3, 0xb9, 0x2a, 0x45, 0x73, 0x9d, + 0xc9, 0xd5, 0x49, 0x86, 0xfd, 0x74, 0x7e, 0x9c, 0x16, 0xd7, 0x23, 0x9d, + 0xaf, 0x93, 0x50, 0xa1, 0x84, 0xac, 0x55, 0xf3, 0x7f, 0x27, 0x2f, 0x5b, + 0xe3, 0x3a, 0x49, 0xa5, 0x53, 0x29, 0xba, 0x74, 0xea, 0x45, 0xa7, 0x19, + 0x14, 0xfc, 0xd2, 0x11, 0x23, 0x8f, 0xd7, 0x3d, 0x4d, 0x93, 0x33, 0x3e, + 0xd1, 0x1b, 0xed, 0x90, 0xfc, 0x39, 0x96, 0x49, 0x11, 0x00, 0x67, 0x7c, + 0xd6, 0x72, 0x29, 0x82, 0xa0, 0xf4, 0xcf, 0x5a, 0x36, 0x85, 0x10, 0x9c, + 0xf1, 0xd9, 0xc8, 0xa7, 0x08, 0x46, 0xe6, 0x00, 0x68, 0x5f, 0xa9, 0x9c, + 0xaa, 0x92, 0xba, 0xeb, 0xc4, 0x28, 0xb4, 0xce, 0x78, 0xce, 0xe9, 0x65, + 0xdb, 0x05, 0x2e, 0xd9, 0xfd, 0xe2, 0x51, 0x9b, 0x46, 0xf9, 0x07, 0xc8, + 0xe0, 0x84, 0x15, 0x6e, 0xb8, 0x93, 0x2f, 0xfb, 0xc5, 0xc0, 0xcd, 0x96, + 0xba, 0x1e, 0xdb, 0x27, 0x7d, 0xe3, 0x5d, 0x2f, 0xbe, 0x14, 0x85, 0x89, + 0x82, 0xde, 0xef, 0x31, 0x0a, 0x94, 0x7f, 0x70, 0x09, 0xe9, 0xd5, 0xf9, + 0x8e, 0xd1, 0xab, 0xaa, 0xf5, 0x83, 0x4b, 0x16, 0x55, 0xe2, 0x99, 0x04, + 0xa3, 0x1e, 0x2b, 0xbf, 0xdf, 0x5f, 0x95, 0x13, 0xbc, 0xea, 0xb7, 0x88, + 0x13, 0x07, 0x16, 0x2b, 0xf8, 0xe9, 0x87, 0x37, 0xaf, 0xc9, 0xd1, 0x78, + 0x48, 0x10, 0x60, 0xe1, 0x83, 0x0f, 0xe8, 0xf2, 0x27, 0x92, 0xaf, 0xa2, + 0x54, 0xb5, 0x62, 0x9e, 0x54, 0xa3, 0xea, 0x07, 0xc3, 0xcd, 0xe7, 0xe4, + 0x6d, 0x82, 0x90, 0xf4, 0x09, 0x0c, 0x91, 0x14, 0xb3, 0x49, 0x4e, 0x79, + 0x5f, 0xd2, 0x9a, 0x25, 0x4b, 0xc9, 0x14, 0xb0, 0x52, 0x38, 0xb7, 0xb4, + 0x2e, 0x29, 0x5d, 0xfa, 0x2a, 0x65, 0x74, 0x53, 0x48, 0x63, 0xa7, 0xa1, + 0x8b, 0x5f, 0x59, 0x14, 0x71, 0x58, 0xab, 0x65, 0x9a, 0xa5, 0x6b, 0x5b, + 0xc2, 0x88, 0xab, 0x1e, 0x80, 0x5c, 0x2a, 0x61, 0x94, 0x4d, 0xe8, 0xad, + 0xd9, 0x1e, 0x44, 0x3f, 0x2f, 0xff, 0x04, 0x42, 0x8c, 0x94, 0x2b, 0xe3, + 0xa3, 0xf7, 0x66, 0xaf, 0x57, 0x9f, 0x56, 0xae, 0x42, 0xb9, 0x94, 0x5e, + 0x6b, 0xcd, 0x2a, 0xb5, 0x56, 0xa8, 0x52, 0x6b, 0x65, 0x84, 0xf4, 0xaa, + 0xec, 0xf5, 0xea, 0xd4, 0xce, 0xd5, 0x29, 0x97, 0xd2, 0x6b, 0xaf, 0x59, + 0xa7, 0xf6, 0x0a, 0x75, 0x6a, 0x6b, 0x2d, 0x34, 0x63, 0x1b, 0xdf, 0x3e, + 0x09, 0x73, 0xcc, 0x30, 0x14, 0x7c, 0x8a, 0xef, 0x2d, 0x9b, 0x8f, 0x31, + 0x96, 0x7d, 0xf7, 0xee, 0x0d, 0x5c, 0x06, 0x7d, 0xaa, 0xd1, 0xd8, 0x21, + 0x09, 0x2f, 0x4d, 0x79, 0x58, 0x56, 0x43, 0xab, 0x19, 0x76, 0x64, 0x57, + 0xb3, 0xba, 0xa6, 0x3f, 0x4a, 0xca, 0xb2, 0x53, 0xa6, 0x61, 0x64, 0x5a, + 0x12, 0x8a, 0x7b, 0x6b, 0x1a, 0x88, 0x93, 0x52, 0x30, 0xd4, 0xed, 0x33, + 0x40, 0x9c, 0x96, 0x86, 0x32, 0x43, 0x92, 0x01, 0x53, 0x89, 0x49, 0x38, + 0x33, 0x32, 0x19, 0x30, 0x99, 0xa6, 0xa0, 0x8a, 0x05, 0x56, 0x28, 0x25, + 0x23, 0x24, 0x86, 0x95, 0x2e, 0x0c, 0x2b, 0x83, 0x11, 0x14, 0xf0, 0xc8, + 0x37, 0x7d, 0xf5, 0x46, 0x0a, 0x11, 0xa7, 0xab, 0x71, 0x2a, 0xa7, 0x4a, + 0x85, 0x36, 0xb7, 0x81, 0x35, 0xf2, 0xdf, 0x27, 0xc5, 0xba, 0xac, 0x64, + 0xa3, 0x9a, 0xb6, 0xd0, 0x5c, 0xd6, 0x08, 0x7b, 0x79, 0x51, 0x14, 0xce, + 0x9a, 0x73, 0xd3, 0x04, 0xcb, 0xf9, 0x65, 0x10, 0x4d, 0x73, 0xd1, 0xa3, + 0xc1, 0x6a, 0x9a, 0x6c, 0x39, 0x5a, 0x09, 0xa3, 0x11, 0x2d, 0x7f, 0x36, + 0x98, 0xc9, 0x37, 0xe5, 0xeb, 0x73, 0xbb, 0x09, 0x22, 0x38, 0x2d, 0xeb, + 0x0e, 0xf8, 0x3c, 0xd2, 0xa7, 0xc6, 0xe7, 0x7d, 0x33, 0x84, 0x26, 0x51, + 0x58, 0x07, 0x5d, 0xab, 0xb9, 0x97, 0xba, 0xb1, 0x96, 0x11, 0xd5, 0x39, + 0x38, 0xfb, 0xd6, 0x9e, 0x40, 0x5d, 0xd2, 0x09, 0x14, 0xec, 0xc7, 0x38, + 0x8d, 0xad, 0x12, 0x5b, 0xbf, 0xeb, 0xe9, 0x77, 0x0c, 0xff, 0xae, 0xb7, + 0x35, 0xaa, 0x5a, 0x25, 0x3c, 0x62, 0xa7, 0xfe, 0x59, 0x29, 0x3d, 0x26, + 0xdc, 0x1c, 0x37, 0x21, 0x53, 0xa8, 0x35, 0x25, 0x83, 0xfb, 0xfb, 0xdf, + 0x8b, 0x35, 0x4e, 0xbd, 0xba, 0x2d, 0xaf, 0x72, 0x37, 0xd4, 0xb7, 0x9b, + 0x2a, 0xdb, 0x4d, 0x35, 0xed, 0x3e, 0xd4, 0xec, 0x4e, 0x75, 0x4c, 0x9b, + 0x88, 0xfe, 0x98, 0x5e, 0x25, 0x6c, 0x05, 0xfc, 0xc9, 0xf9, 0x34, 0x83, + 0x51, 0x86, 0x55, 0xfa, 0xe9, 0xc6, 0x48, 0x28, 0xe8, 0x63, 0x7c, 0x28, + 0x73, 0x96, 0x37, 0xa7, 0xf9, 0x28, 0xd4, 0x63, 0x59, 0xea, 0x71, 0xd5, + 0x2a, 0x57, 0xba, 0x07, 0x97, 0x29, 0x8f, 0x66, 0x62, 0x9f, 0xe1, 0xf8, + 0x06, 0xee, 0x15, 0x89, 0x4d, 0xb9, 0x8d, 0xdf, 0x74, 0x2c, 0x95, 0x66, + 0x2c, 0x3d, 0x9c, 0x12, 0xa7, 0x59, 0x4a, 0x03, 0xb3, 0x32, 0x3a, 0xc8, + 0x9c, 0x3a, 0x63, 0x1d, 0xdb, 0x3e, 0x7e, 0x87, 0xa0, 0x62, 0x27, 0x66, + 0x23, 0xe1, 0x5e, 0x69, 0xfd, 0xd2, 0xbd, 0x25, 0xed, 0xb0, 0x71, 0x20, + 0xa9, 0x59, 0xb1, 0x92, 0x63, 0x5e, 0x72, 0x30, 0xb8, 0xbe, 0x70, 0x2b, + 0x5d, 0xb8, 0xb5, 0x5e, 0xe9, 0x76, 0xba, 0x74, 0x7b, 0x41, 0xe9, 0xbc, + 0x79, 0x36, 0x99, 0x19, 0x47, 0x3b, 0xee, 0x4f, 0x95, 0x64, 0x0f, 0xd8, + 0x64, 0xeb, 0x30, 0xc1, 0xc2, 0xf6, 0x49, 0xb0, 0xa2, 0xbc, 0xde, 0x1b, + 0xb6, 0xd1, 0x48, 0x0f, 0xc6, 0xab, 0xca, 0xb9, 0x95, 0x2e, 0xde, 0x5a, + 0xb7, 0x7c, 0x3b, 0x5d, 0xbe, 0xad, 0xcb, 0xdf, 0x69, 0x4b, 0x91, 0x3d, + 0xd9, 0x64, 0x43, 0x11, 0xbd, 0xc2, 0x76, 0x32, 0x8c, 0xc8, 0xf9, 0xc8, + 0x0d, 0x5b, 0xa9, 0xa7, 0xbc, 0xa1, 0x55, 0x85, 0xdc, 0x4a, 0x97, 0x6e, + 0xad, 0x59, 0xbc, 0x9d, 0x2e, 0xde, 0x56, 0xc5, 0xef, 0xb4, 0x89, 0xc8, + 0x40, 0x6f, 0xb4, 0x8d, 0x88, 0x60, 0x71, 0x23, 0x25, 0x58, 0x91, 0x73, + 0xfa, 0x9b, 0x36, 0xd3, 0x5c, 0xf9, 0xa3, 0x2b, 0x0b, 0xba, 0x95, 0x2e, + 0xde, 0x5a, 0xb7, 0x7c, 0x3b, 0x5d, 0xbe, 0xad, 0xca, 0xdf, 0x6d, 0x4b, + 0xc9, 0x41, 0x6f, 0x93, 0x4d, 0x25, 0x29, 0x16, 0xb6, 0x55, 0x92, 0x19, + 0x1d, 0x5d, 0xc9, 0xb5, 0x96, 0x14, 0x8a, 0x09, 0xdb, 0xc6, 0xce, 0xdf, + 0x7a, 0x72, 0xd1, 0x91, 0x82, 0x67, 0x31, 0xa2, 0xbb, 0x0d, 0x17, 0x18, + 0x06, 0xf3, 0x31, 0x83, 0x8a, 0x99, 0xa4, 0x6c, 0xd6, 0x23, 0x60, 0x82, + 0x85, 0xa2, 0x4f, 0xb0, 0xa2, 0xc2, 0x7a, 0x0b, 0x04, 0xcf, 0x79, 0x99, + 0xc9, 0x54, 0x5e, 0xaa, 0x27, 0x94, 0x7b, 0xb7, 0x02, 0x65, 0x82, 0xc5, + 0xb2, 0xbc, 0x32, 0xde, 0x57, 0xaa, 0x52, 0x9e, 0xaa, 0x4f, 0x7f, 0x16, + 0xe0, 0x3b, 0x11, 0x50, 0x53, 0x39, 0x7a, 0x32, 0x40, 0x42, 0x4a, 0xcd, + 0x05, 0x6c, 0x17, 0x3b, 0x57, 0xcb, 0xfa, 0xaa, 0xa0, 0x4f, 0x7a, 0xad, + 0xab, 0x4e, 0x29, 0x9f, 0x3f, 0x95, 0x12, 0xd7, 0xcb, 0x94, 0x52, 0xe1, + 0xa7, 0x14, 0xda, 0xae, 0xa2, 0x9b, 0x9a, 0x15, 0xe4, 0x88, 0x3f, 0xb5, + 0x1a, 0xeb, 0x92, 0xa6, 0xab, 0x69, 0xd6, 0xa0, 0x9b, 0x8c, 0x92, 0x2b, + 0xc8, 0xec, 0x24, 0x38, 0x13, 0x9d, 0xa7, 0xb7, 0x64, 0x04, 0xd8, 0xca, + 0x91, 0x99, 0xf9, 0xb2, 0x21, 0x62, 0x18, 0x9e, 0xf9, 0x9a, 0x39, 0x98, + 0x5c, 0x09, 0xe8, 0xf2, 0x36, 0x2f, 0x56, 0xe2, 0x58, 0x79, 0x35, 0x93, + 0x50, 0xcb, 0x02, 0x0d, 0x67, 0xcf, 0x99, 0x15, 0xdc, 0xea, 0x1e, 0x58, + 0x97, 0x0b, 0x8d, 0xd6, 0xaa, 0x7d, 0x3a, 0xe7, 0x79, 0xa7, 0x73, 0x4d, + 0x84, 0x23, 0x67, 0x0a, 0x3e, 0xa0, 0xb7, 0x8e, 0xe8, 0xca, 0x35, 0xef, + 0x39, 0xe3, 0x50, 0x55, 0x8a, 0x7c, 0xd6, 0x4d, 0xe9, 0xf3, 0x9b, 0x02, + 0xc6, 0x8f, 0x27, 0x46, 0x69, 0xc7, 0x84, 0xac, 0x35, 0x17, 0x4a, 0x69, + 0x66, 0xc2, 0xb7, 0xfc, 0x3f, 0xaa, 0x3f, 0xd7, 0x67, 0x2d, 0x09, 0x90, + 0x87, 0xf1, 0x7f, 0x24, 0x00, 0xaa, 0xce, 0x5a, 0xf5, 0xa7, 0x81, 0xfb, + 0xff, 0x49, 0x00, 0x54, 0x9f, 0xf5, 0x24, 0x20, 0xc7, 0xc3, 0x75, 0x44, + 0xf0, 0x5f, 0x51, 0x51, 0xc9, 0xf6, 0x5a, 0x35, 0xc5, 0x40, 0xb5, 0x9e, + 0xb5, 0xdb, 0x54, 0x5d, 0xc0, 0xd8, 0xca, 0x86, 0xeb, 0x2a, 0x79, 0x8d, + 0xc5, 0xab, 0xc9, 0x54, 0x46, 0xa8, 0xe5, 0x7b, 0x54, 0xe8, 0x2c, 0xbf, + 0xba, 0x7e, 0x22, 0x31, 0x42, 0x9c, 0xd3, 0x1d, 0x16, 0xe5, 0x59, 0x80, + 0xf1, 0x76, 0xea, 0xd3, 0x7d, 0xcd, 0xb4, 0xbd, 0x8b, 0xe2, 0x30, 0x15, + 0xcb, 0x0c, 0x15, 0x80, 0x0a, 0xd4, 0x40, 0xf1, 0xeb, 0x37, 0xaf, 0x7f, + 0x8a, 0x12, 0xc7, 0xe2, 0x8f, 0x08, 0xa7, 0x44, 0xba, 0x66, 0x04, 0x80, + 0x03, 0xa1, 0xbc, 0x95, 0x3f, 0xa4, 0xad, 0xfc, 0x52, 0x38, 0x28, 0x93, + 0x74, 0x08, 0x52, 0xbe, 0xb3, 0xdc, 0x4e, 0x63, 0x36, 0xff, 0xb3, 0xf3, + 0xbc, 0x6d, 0x3d, 0x7a, 0x64, 0x71, 0x06, 0x61, 0x99, 0x85, 0xd2, 0x23, + 0x6f, 0x14, 0xbe, 0xa4, 0x2a, 0x92, 0xa3, 0x97, 0x42, 0x13, 0x4e, 0xb1, + 0xbe, 0x2e, 0xe8, 0xc2, 0x28, 0xc5, 0x51, 0x92, 0x94, 0x86, 0x7e, 0x00, + 0x6c, 0x8f, 0x1f, 0x83, 0x46, 0x9c, 0x54, 0x31, 0x98, 0xcd, 0x5f, 0x2c, + 0x83, 0x18, 0x2a, 0x81, 0xd3, 0x38, 0x05, 0x4b, 0x4b, 0x96, 0x4e, 0x66, + 0xfd, 0x3e, 0x46, 0xfc, 0x07, 0xa5, 0x5c, 0x61, 0xf9, 0x98, 0xc7, 0x73, + 0xad, 0x70, 0x2a, 0x09, 0xf4, 0x47, 0xc7, 0xc7, 0xef, 0x8e, 0x1f, 0x58, + 0xb9, 0x17, 0x1f, 0x49, 0x7a, 0x19, 0x5a, 0x57, 0x89, 0x80, 0x2a, 0xb5, + 0x72, 0x85, 0xdb, 0x8b, 0x8f, 0x8e, 0x97, 0xde, 0xbf, 0xa3, 0x5b, 0x63, + 0x2c, 0xd6, 0x80, 0x28, 0x88, 0x5d, 0x47, 0xc9, 0x99, 0x01, 0x7b, 0x79, + 0x54, 0x04, 0xc5, 0x00, 0xa4, 0xb4, 0x8c, 0x36, 0xeb, 0xd4, 0x61, 0x8d, + 0x84, 0x2f, 0xcf, 0x8c, 0xdb, 0x5e, 0x69, 0x5b, 0x89, 0x3e, 0x33, 0xbb, + 0x94, 0xb6, 0x00, 0xcc, 0xbb, 0x34, 0x70, 0xf8, 0x4b, 0xed, 0x87, 0x30, + 0xba, 0x23, 0x57, 0x55, 0x4d, 0x0f, 0x4a, 0xbd, 0xa2, 0xec, 0xa5, 0xf4, + 0xb5, 0xe4, 0xf6, 0x0d, 0x3e, 0x70, 0x8d, 0x4d, 0x43, 0x36, 0x5e, 0xdc, + 0x74, 0xf2, 0xa1, 0x03, 0x5c, 0xb9, 0x29, 0xa3, 0xa0, 0xf6, 0x47, 0x14, + 0x73, 0xd6, 0x93, 0x3b, 0xc5, 0x11, 0xef, 0xdc, 0xad, 0xb0, 0x6a, 0x28, + 0xa1, 0x96, 0xb2, 0x3a, 0xa1, 0x50, 0x77, 0xad, 0x9f, 0x9d, 0xbc, 0x7b, + 0x5b, 0x9f, 0xda, 0x01, 0x9f, 0x7a, 0x2e, 0xd0, 0x33, 0xb5, 0xe3, 0x7c, + 0xa2, 0xc2, 0xd8, 0x8c, 0xd4, 0x5c, 0x85, 0x91, 0xc1, 0x9b, 0x23, 0x10, + 0x9f, 0x99, 0x86, 0x91, 0x9e, 0xc4, 0xc6, 0xc6, 0xfc, 0x65, 0xa8, 0x31, + 0x58, 0x1d, 0x5b, 0x98, 0xb8, 0x42, 0xf1, 0x83, 0x3a, 0xb5, 0x61, 0x5e, + 0xed, 0x56, 0xfc, 0x67, 0xa6, 0x06, 0x4c, 0x5b, 0x1e, 0x5e, 0xb9, 0x54, + 0xb7, 0xc9, 0x1a, 0x6c, 0x55, 0xbc, 0x4b, 0x4f, 0x3e, 0x32, 0x9c, 0x9e, + 0x04, 0x99, 0xbf, 0xbc, 0x66, 0xe7, 0x93, 0xd7, 0xee, 0x01, 0xba, 0x7d, + 0xd5, 0xd9, 0xfa, 0x95, 0x5f, 0x3c, 0x87, 0x93, 0x6b, 0x7d, 0x3c, 0xc0, + 0x03, 0xcf, 0xac, 0xc2, 0x29, 0xc7, 0x1c, 0x18, 0x3d, 0x89, 0x34, 0x83, + 0x11, 0x1b, 0xf2, 0xe7, 0x27, 0x1e, 0x3a, 0x56, 0xcf, 0x0e, 0xca, 0x49, + 0xe0, 0xf8, 0x3e, 0xd3, 0xaa, 0xa5, 0x76, 0x1c, 0xd2, 0x34, 0xa6, 0xd1, + 0x28, 0xea, 0x64, 0x94, 0x96, 0xeb, 0x00, 0xcf, 0x79, 0xdb, 0xd9, 0x4a, + 0x3d, 0x40, 0xee, 0x50, 0xbb, 0x56, 0xfd, 0x0b, 0x95, 0x5f, 0x96, 0xbd, + 0x73, 0xc5, 0xff, 0x77, 0x79, 0x47, 0xa2, 0xdc, 0x3a, 0x11, 0xfb, 0x15, + 0x13, 0x8e, 0xe7, 0x40, 0x92, 0x36, 0xe9, 0xeb, 0x03, 0x5e, 0x08, 0x0c, + 0x94, 0x73, 0x86, 0x6b, 0xe8, 0xe3, 0x9a, 0x4e, 0xe7, 0x4d, 0x92, 0xba, + 0x6d, 0x20, 0x4d, 0x82, 0xed, 0xd0, 0x76, 0x4a, 0x19, 0xfe, 0x90, 0x5f, + 0x42, 0xd2, 0xee, 0x5a, 0x7b, 0xd9, 0x5e, 0x9b, 0x86, 0xb3, 0x03, 0x2f, + 0xc9, 0xae, 0xa4, 0xd5, 0x6a, 0xb5, 0xda, 0x5b, 0x22, 0xcf, 0x31, 0x41, + 0xaa, 0x0f, 0x50, 0x8c, 0xed, 0xef, 0x16, 0x00, 0x52, 0x5c, 0x83, 0x8c, + 0x9c, 0xbe, 0x21, 0xab, 0xc0, 0x10, 0x13, 0x03, 0x61, 0x5c, 0x4b, 0xba, + 0xb8, 0xbd, 0x57, 0x4a, 0x9a, 0x21, 0x26, 0x26, 0x46, 0x20, 0xf1, 0xcd, + 0x3a, 0x2d, 0x27, 0xce, 0x10, 0x13, 0x03, 0x23, 0x94, 0x38, 0x5e, 0x28, + 0xac, 0x26, 0x4e, 0x10, 0x13, 0x13, 0x23, 0x90, 0x38, 0xde, 0x4c, 0xac, + 0x26, 0x4e, 0x10, 0x13, 0x13, 0xa3, 0x9e, 0xb8, 0xb8, 0xe2, 0x08, 0xe9, + 0x65, 0xc4, 0x15, 0xc4, 0x44, 0x03, 0x0f, 0x22, 0x3b, 0x5f, 0xe5, 0xd5, + 0x64, 0x09, 0x62, 0xc2, 0xe0, 0x01, 0x72, 0x96, 0x17, 0x2e, 0xa3, 0x28, + 0xdc, 0x30, 0xcb, 0xe2, 0x18, 0x73, 0xa2, 0x53, 0x1a, 0x57, 0x63, 0x69, + 0x97, 0x35, 0x01, 0xcf, 0x24, 0x05, 0xe6, 0x69, 0xbe, 0xdc, 0xe2, 0xe0, + 0xd8, 0xf9, 0x96, 0x86, 0xec, 0x00, 0x63, 0xea, 0x56, 0x67, 0xb3, 0x58, + 0x55, 0x4b, 0x89, 0x20, 0x26, 0x1a, 0x78, 0x90, 0x94, 0xe8, 0xd2, 0x69, + 0x29, 0x59, 0x86, 0x98, 0xe8, 0x08, 0x01, 0x0d, 0x40, 0x97, 0x54, 0xe9, + 0x7e, 0x6a, 0x05, 0x75, 0xe7, 0x26, 0x2b, 0x14, 0x63, 0x21, 0xff, 0x2f, + 0xc6, 0x13, 0x25, 0x3f, 0x57, 0x99, 0x40, 0x5d, 0x03, 0x2b, 0x40, 0x0b, + 0x3e, 0xe0, 0x1d, 0x0c, 0x37, 0xa4, 0xe1, 0xf1, 0xba, 0x71, 0x9e, 0xdd, + 0xe9, 0x40, 0xb1, 0xf5, 0x93, 0xda, 0xd6, 0xe4, 0x45, 0xe4, 0x5c, 0xbd, + 0x10, 0xff, 0xce, 0xff, 0xbe, 0x0b, 0x61, 0x6c, 0xa2, 0x07, 0x80, 0x8c, + 0x02, 0x60, 0x0e, 0x2c, 0x98, 0x7b, 0xff, 0x66, 0x24, 0xb5, 0x9e, 0x98, + 0xb8, 0xe2, 0x9c, 0xa7, 0x17, 0x51, 0xe4, 0x5c, 0x12, 0xba, 0x67, 0xfa, + 0x89, 0x80, 0x4f, 0x23, 0x1c, 0xc8, 0x11, 0x78, 0x40, 0x13, 0x28, 0x1c, + 0xce, 0xa3, 0x7e, 0xf4, 0xc9, 0xfb, 0x5a, 0xc6, 0xe2, 0x4c, 0xa6, 0x7e, + 0x4c, 0x42, 0xd1, 0x72, 0x84, 0x94, 0xba, 0xda, 0xed, 0x08, 0x0c, 0x79, + 0x3c, 0x51, 0x62, 0x57, 0x0e, 0xef, 0xa4, 0xe4, 0xe3, 0xce, 0xfb, 0x9f, + 0x7c, 0xd3, 0xd1, 0xa1, 0xb3, 0xcd, 0xaa, 0x02, 0xfa, 0xf8, 0xcb, 0x77, + 0x3f, 0x37, 0xc0, 0x17, 0xf3, 0x75, 0x05, 0xf8, 0x27, 0x06, 0xec, 0x2c, + 0xaf, 0x22, 0xfd, 0xde, 0xd7, 0xcf, 0x9e, 0x7d, 0x61, 0x12, 0x9f, 0x35, + 0xe2, 0x3c, 0xbf, 0xc9, 0x5d, 0x68, 0x58, 0xc3, 0x91, 0x2a, 0xc5, 0x96, + 0x3c, 0x63, 0x4b, 0x94, 0x5d, 0x45, 0x0a, 0x0b, 0xc5, 0xd7, 0xc6, 0x09, + 0x5c, 0xf6, 0xc2, 0x5b, 0x24, 0x31, 0x90, 0xd5, 0xb2, 0x4c, 0x95, 0x34, + 0x42, 0x3c, 0x4b, 0x20, 0x48, 0x33, 0xf0, 0x01, 0xa9, 0xab, 0x65, 0x81, + 0x01, 0x43, 0x54, 0x15, 0x3c, 0x9a, 0x73, 0x90, 0x91, 0x89, 0x62, 0x89, + 0x93, 0xc9, 0x33, 0x12, 0xbc, 0x50, 0x80, 0x3c, 0x67, 0x3b, 0x1c, 0x81, + 0x63, 0x89, 0x81, 0x9b, 0xe2, 0x8c, 0x65, 0xb0, 0x69, 0x05, 0x17, 0xd7, + 0x0b, 0x2d, 0xbd, 0xe0, 0x56, 0xec, 0x39, 0x17, 0x0f, 0x2a, 0x24, 0x12, + 0x34, 0xb8, 0x49, 0x1c, 0x12, 0x56, 0x90, 0x0a, 0xc4, 0x29, 0x28, 0xb7, + 0x1d, 0xc6, 0x9a, 0xd1, 0x0c, 0x9b, 0x17, 0x6b, 0xca, 0x4a, 0xeb, 0x51, + 0x5a, 0x07, 0x46, 0xef, 0x44, 0x1d, 0xda, 0xbc, 0x7f, 0x3e, 0x5b, 0xdf, + 0x3c, 0x87, 0x23, 0x00, 0xa0, 0x98, 0xc8, 0xe0, 0xde, 0xd1, 0x53, 0x2d, + 0x4f, 0x23, 0x5b, 0x26, 0xa0, 0x7c, 0x7d, 0x71, 0xb1, 0x4c, 0x44, 0xa7, + 0xa3, 0x75, 0x3d, 0x4b, 0x08, 0x95, 0xbc, 0xc2, 0xb6, 0x40, 0xb6, 0xd9, + 0x84, 0x50, 0x8a, 0x6a, 0xc2, 0x33, 0x4b, 0x3b, 0x00, 0xb4, 0x2c, 0x6b, + 0x96, 0xeb, 0x59, 0x46, 0x79, 0x1c, 0x29, 0x3e, 0xca, 0xae, 0x9e, 0x44, + 0x57, 0x67, 0x8f, 0xa3, 0x25, 0x9c, 0x94, 0xdf, 0x2c, 0x47, 0xa8, 0x96, + 0x71, 0xb9, 0x70, 0x22, 0x91, 0x48, 0xc2, 0x20, 0x8d, 0xad, 0xb4, 0xa8, + 0x62, 0x05, 0xdc, 0x35, 0xb8, 0x02, 0x56, 0x6c, 0x0b, 0x95, 0x26, 0x1c, + 0x2e, 0x42, 0xac, 0x2d, 0xda, 0x8d, 0x63, 0x9d, 0x83, 0x83, 0x97, 0x3b, + 0xe3, 0x60, 0xec, 0xfe, 0xd9, 0x7a, 0x85, 0x24, 0x40, 0xd5, 0xde, 0xcd, + 0x61, 0x0d, 0x01, 0x3d, 0x22, 0xa1, 0x07, 0xd7, 0xeb, 0x1f, 0x21, 0x6f, + 0x9a, 0x5d, 0x4e, 0xd3, 0x14, 0x5f, 0x9b, 0x23, 0xdd, 0xde, 0x70, 0x7f, + 0x3f, 0xa8, 0xbe, 0xa0, 0x77, 0xb2, 0x3f, 0x56, 0x0c, 0xb2, 0x7a, 0x7c, + 0x8c, 0x71, 0xed, 0x4a, 0x6a, 0xbb, 0xa0, 0x4d, 0x28, 0xf0, 0xd3, 0xba, + 0x5e, 0xd5, 0xae, 0xa7, 0x2c, 0x7b, 0x6e, 0x8a, 0xd6, 0x5e, 0x47, 0xe5, + 0x57, 0x1b, 0x7e, 0x42, 0x15, 0xb6, 0xa4, 0x7a, 0xc7, 0x5c, 0x3b, 0x81, + 0x1e, 0xdc, 0xdd, 0x9b, 0xfb, 0x81, 0x5f, 0x89, 0x7b, 0x64, 0x45, 0x88, + 0xef, 0xa2, 0x84, 0xeb, 0x45, 0x7e, 0x29, 0x3c, 0x64, 0x47, 0x20, 0xf8, + 0x8c, 0x91, 0xce, 0xa1, 0xc7, 0xc7, 0xf2, 0x3d, 0x17, 0x0c, 0x4f, 0x05, + 0x46, 0xd7, 0xb7, 0x97, 0xf4, 0x82, 0xca, 0xb5, 0x7d, 0xb6, 0x42, 0x7a, + 0x97, 0xa6, 0x5d, 0x90, 0xbb, 0x4d, 0x4a, 0xf7, 0x33, 0x62, 0xad, 0xd2, + 0x78, 0xb2, 0x75, 0xda, 0x75, 0xe7, 0x6e, 0x46, 0x3e, 0x48, 0xc6, 0x46, + 0xf1, 0x4f, 0x6f, 0xc8, 0x45, 0x44, 0x21, 0xec, 0x07, 0x58, 0xaf, 0xca, + 0x4d, 0x30, 0x0e, 0x8b, 0xf9, 0xb9, 0xd8, 0x7f, 0xaa, 0x9d, 0xe6, 0x28, + 0x15, 0xc0, 0x40, 0x20, 0x72, 0x73, 0x2d, 0x5a, 0x5a, 0x41, 0xb5, 0x0d, + 0x5d, 0x70, 0xfd, 0xa3, 0x43, 0x31, 0x01, 0x73, 0x0b, 0xab, 0xca, 0x3c, + 0xa9, 0x88, 0x3e, 0x53, 0xa7, 0xc3, 0x1c, 0xcc, 0x5d, 0xc6, 0xbd, 0xcf, + 0x22, 0x7c, 0x60, 0x00, 0x66, 0x5d, 0x44, 0x85, 0x8f, 0xce, 0xd3, 0xf5, + 0x95, 0x0a, 0x02, 0xaf, 0xc7, 0x8f, 0x1f, 0xf0, 0x2e, 0x9f, 0x71, 0x00, + 0x29, 0x64, 0x96, 0xac, 0x50, 0x5e, 0xae, 0x0e, 0x11, 0x51, 0x50, 0x22, + 0xbd, 0xbf, 0xf9, 0xf5, 0x48, 0x03, 0xb0, 0x55, 0x09, 0x69, 0xb8, 0xba, + 0xe4, 0xef, 0x62, 0x04, 0x5b, 0xaa, 0x6d, 0xa5, 0x87, 0xa8, 0x88, 0x06, + 0xaa, 0x37, 0xb1, 0x55, 0xaf, 0x12, 0xde, 0x34, 0x23, 0x94, 0x66, 0xeb, + 0x22, 0x7f, 0x28, 0x51, 0x26, 0x71, 0x61, 0xaf, 0x66, 0xeb, 0xb3, 0x5b, + 0xdb, 0x88, 0xc9, 0x39, 0xc9, 0xa4, 0xac, 0x64, 0x91, 0x0f, 0x48, 0xc5, + 0xfc, 0xd3, 0xdc, 0xde, 0xc3, 0x5f, 0xd6, 0xf6, 0x9e, 0x31, 0x7a, 0x90, + 0xbd, 0x52, 0xf8, 0x4e, 0x83, 0xf2, 0x83, 0xc8, 0x01, 0xcd, 0x4b, 0xbf, + 0x38, 0x2f, 0xe6, 0x13, 0xb0, 0xe7, 0xd7, 0x1f, 0x72, 0xd3, 0x79, 0x69, + 0xe7, 0xa9, 0xa7, 0x75, 0x68, 0xb7, 0xf9, 0x25, 0x28, 0x82, 0xf6, 0x9d, + 0x05, 0xbb, 0x72, 0xda, 0xdb, 0x23, 0x7c, 0xff, 0xf2, 0xc4, 0x9a, 0x28, + 0x1b, 0x27, 0x11, 0x6e, 0xb3, 0xb3, 0x24, 0xac, 0x3e, 0x61, 0x76, 0x22, + 0xe3, 0xdc, 0x01, 0x44, 0x76, 0xf5, 0x3e, 0xe0, 0xc9, 0xc3, 0x87, 0x0f, + 0xe5, 0xcf, 0xd8, 0x98, 0x72, 0x2e, 0xd7, 0x33, 0x99, 0xff, 0x1e, 0x7c, + 0x8d, 0x4f, 0xc8, 0xdc, 0x0a, 0x93, 0xb1, 0x38, 0xbf, 0x2d, 0x24, 0xd7, + 0x3d, 0xed, 0x45, 0x77, 0xe2, 0xc9, 0xe8, 0x23, 0xec, 0x85, 0x0b, 0xf1, + 0x32, 0x77, 0x0f, 0x07, 0x89, 0x47, 0x8a, 0xe7, 0xa2, 0x44, 0x39, 0x02, + 0xc7, 0x8f, 0x14, 0xfa, 0xa3, 0x1e, 0x95, 0xd4, 0x8b, 0x1e, 0x19, 0xc3, + 0x0b, 0x9d, 0x95, 0x7b, 0x17, 0x06, 0xc7, 0x80, 0x2e, 0x62, 0x0a, 0xf5, + 0x0a, 0xaa, 0xdd, 0xfa, 0xb1, 0x2b, 0x01, 0xd3, 0xa5, 0x61, 0x58, 0xc3, + 0xd6, 0x43, 0x58, 0x48, 0x8d, 0xc5, 0xaf, 0x8f, 0x8e, 0x3e, 0x38, 0x3e, + 0xb6, 0x1a, 0x00, 0xed, 0x5c, 0x8f, 0x87, 0x94, 0x90, 0xa5, 0xad, 0xdd, + 0x03, 0x68, 0xcc, 0x82, 0x69, 0x40, 0x26, 0x0e, 0x41, 0x80, 0xe2, 0x01, + 0x2d, 0x72, 0x1b, 0x5b, 0xeb, 0xa2, 0x0b, 0x81, 0x58, 0xc4, 0xec, 0x59, + 0xf5, 0x8f, 0x60, 0x93, 0x2e, 0x16, 0xfd, 0x42, 0x20, 0x9e, 0x9a, 0xb6, + 0xaf, 0x5f, 0xe0, 0x3a, 0xde, 0x1e, 0x02, 0xcc, 0x69, 0x6e, 0x22, 0x2e, + 0xb8, 0xb8, 0x1d, 0xf5, 0x05, 0xed, 0x67, 0x71, 0x24, 0x53, 0x3a, 0x21, + 0x6f, 0x3e, 0x0f, 0xc7, 0xae, 0xb3, 0x59, 0xe3, 0x2c, 0x26, 0xc4, 0xb4, + 0x68, 0x07, 0x48, 0x3a, 0x63, 0xa0, 0x7f, 0x48, 0xc4, 0x31, 0x3c, 0x5e, + 0x9a, 0x19, 0xf6, 0xb9, 0x24, 0x06, 0xf8, 0x5e, 0x34, 0x34, 0x6f, 0xdd, + 0x13, 0x61, 0x97, 0x2e, 0x1a, 0xfb, 0x10, 0xca, 0x78, 0x78, 0x61, 0xb3, + 0x7a, 0xef, 0xed, 0x94, 0x62, 0xf1, 0x4d, 0x07, 0x1a, 0x19, 0x2d, 0xc1, + 0x7d, 0xf4, 0x64, 0x83, 0x69, 0x4d, 0xb6, 0x5e, 0x1d, 0xab, 0x58, 0x37, + 0x70, 0x12, 0x0b, 0x5b, 0x32, 0x4b, 0xb8, 0x91, 0x53, 0xb0, 0x65, 0xdf, + 0x02, 0x8c, 0x44, 0xbe, 0x64, 0xc4, 0x28, 0xbf, 0x08, 0xff, 0x4f, 0xe0, + 0x4f, 0x81, 0x01, 0x09, 0xcc, 0x36, 0x33, 0x3a, 0x06, 0x0d, 0x8c, 0x4c, + 0x40, 0x79, 0x61, 0x4c, 0x3b, 0x90, 0x85, 0x52, 0x3c, 0x93, 0xea, 0xec, + 0xbd, 0xdb, 0x23, 0xb5, 0x68, 0x89, 0x3b, 0x82, 0x25, 0x7a, 0x1e, 0xff, + 0x7c, 0x99, 0x5c, 0x80, 0x3d, 0x52, 0x13, 0x72, 0x1e, 0xfc, 0x17, 0xb4, + 0x27, 0x02, 0x1f, 0x6f, 0x45, 0x37, 0xf2, 0xe8, 0x08, 0x7e, 0xbd, 0xf6, + 0x9a, 0x21, 0xf3, 0x9b, 0x93, 0xc5, 0xa9, 0xbe, 0x1a, 0xa2, 0x04, 0xff, + 0x43, 0x08, 0x5e, 0xb8, 0xbe, 0x29, 0x1f, 0x43, 0x70, 0xca, 0x41, 0xc7, + 0x6a, 0x1c, 0xa8, 0x45, 0xfd, 0xa3, 0x2e, 0x57, 0x46, 0x37, 0x26, 0x2f, + 0x75, 0x8c, 0x1c, 0x38, 0x8c, 0xbc, 0xd9, 0xd1, 0xc5, 0x9d, 0xc8, 0x77, + 0xae, 0x22, 0xd6, 0x4f, 0x34, 0x5d, 0x9d, 0x15, 0x57, 0xaa, 0xf2, 0xb5, + 0xd5, 0x10, 0x80, 0x65, 0x5d, 0xd1, 0xe7, 0xc6, 0x3f, 0xe9, 0xa4, 0xc8, + 0xab, 0xd4, 0x0e, 0xe8, 0x13, 0x43, 0xe8, 0x94, 0xf2, 0x07, 0x2d, 0xfe, + 0x4e, 0xf5, 0x4b, 0xeb, 0x5e, 0x02, 0x17, 0x61, 0x04, 0x66, 0x80, 0xe9, + 0xc5, 0x9f, 0x85, 0xe1, 0xe3, 0xee, 0x9b, 0x9f, 0xc0, 0x75, 0x18, 0x01, + 0xef, 0x25, 0x8f, 0xca, 0x4b, 0x11, 0xee, 0x85, 0x88, 0x7b, 0xeb, 0x9e, + 0x9a, 0x77, 0x52, 0x0c, 0x63, 0x43, 0x31, 0xcd, 0xa2, 0xe6, 0x50, 0x3f, + 0x64, 0xbb, 0x70, 0x8f, 0xc0, 0x8c, 0x2a, 0x75, 0x52, 0x88, 0x4e, 0x17, + 0xa0, 0x8b, 0x11, 0xfa, 0xfc, 0x97, 0xca, 0xf7, 0x4e, 0x7c, 0xed, 0x59, + 0x2f, 0x62, 0xfa, 0x67, 0xbd, 0x48, 0x97, 0x7c, 0x76, 0x55, 0xed, 0x9f, + 0x41, 0x94, 0xad, 0x4f, 0x78, 0xff, 0x0c, 0xff, 0x24, 0x8e, 0xb5, 0xc0, + 0xa6, 0x86, 0xea, 0xf4, 0x88, 0x51, 0x17, 0xd8, 0xbb, 0x66, 0x3e, 0x41, + 0xd8, 0xd3, 0x41, 0x11, 0x3b, 0x94, 0xb1, 0x08, 0xc4, 0xd8, 0x5f, 0x10, + 0x64, 0xac, 0xae, 0x49, 0x50, 0x4a, 0x43, 0x8c, 0xd1, 0x6f, 0xcc, 0x00, + 0x8d, 0xae, 0xbf, 0x9e, 0x41, 0x5f, 0x5a, 0x5f, 0x25, 0xf9, 0x25, 0x50, + 0x8a, 0x2e, 0x93, 0x34, 0xb1, 0x66, 0x8b, 0xb4, 0x14, 0xc9, 0xa4, 0x3f, + 0x98, 0xaa, 0x96, 0x94, 0x40, 0xdc, 0x94, 0x8c, 0xa6, 0x38, 0x06, 0x5d, + 0xb5, 0xb3, 0x1a, 0xf0, 0x4a, 0xc7, 0x54, 0x30, 0xf7, 0xb3, 0xc8, 0xaa, + 0xd2, 0xca, 0x4b, 0x74, 0x2b, 0x24, 0x8f, 0x2f, 0x2b, 0xeb, 0x23, 0x61, + 0xb8, 0x3a, 0x2a, 0x41, 0xd1, 0xb6, 0x8f, 0x46, 0x4d, 0xb0, 0x26, 0x35, + 0x73, 0xce, 0x58, 0xad, 0xb2, 0xc6, 0xae, 0x10, 0x3a, 0x47, 0x97, 0x60, + 0x13, 0x6c, 0xcc, 0xae, 0xaf, 0xb2, 0x7c, 0xbe, 0x5a, 0x51, 0xdb, 0x02, + 0x48, 0x55, 0x97, 0xd1, 0xec, 0xfa, 0x16, 0x19, 0x36, 0x60, 0xf3, 0x1a, + 0x6b, 0xac, 0x31, 0x99, 0x8a, 0x3a, 0x5f, 0x61, 0xa5, 0x1d, 0xe4, 0xf2, + 0x5a, 0xc3, 0x41, 0x6f, 0x7d, 0xad, 0x01, 0x88, 0x6b, 0xad, 0x52, 0xdc, + 0x5a, 0xab, 0x0c, 0x0b, 0xb0, 0x6d, 0xad, 0x25, 0x6b, 0xea, 0x7b, 0x65, + 0xad, 0x37, 0x50, 0x6b, 0x07, 0xd9, 0x5f, 0x6b, 0x75, 0x02, 0x5d, 0x5b, + 0x6b, 0x04, 0xe2, 0x5a, 0xab, 0x14, 0xa7, 0xd6, 0x2a, 0xc3, 0x06, 0x6c, + 0x59, 0x6b, 0xc1, 0x1a, 0x93, 0xa9, 0xaa, 0xf5, 0x16, 0x6a, 0xed, 0x20, + 0x57, 0xb4, 0x35, 0xcc, 0x36, 0x6a, 0x6b, 0x8d, 0x40, 0x5c, 0x6b, 0x95, + 0xe2, 0xd4, 0x5a, 0x65, 0xd8, 0x80, 0x2d, 0x6b, 0x2d, 0x58, 0x63, 0x32, + 0x55, 0xb5, 0xc6, 0xa1, 0xde, 0x41, 0xf6, 0xd6, 0x1a, 0x86, 0x5a, 0xe9, + 0x2f, 0xa8, 0xbc, 0xda, 0x6a, 0x6a, 0x0b, 0x80, 0xfa, 0x08, 0x6b, 0xcd, + 0x31, 0xcd, 0x5b, 0x01, 0x6a, 0xa2, 0xb9, 0xe3, 0x61, 0x73, 0x51, 0x33, + 0x66, 0x2e, 0x38, 0x5b, 0xab, 0x6a, 0xfd, 0x10, 0xc9, 0xb0, 0xe6, 0x54, + 0x4a, 0x26, 0x8e, 0x2d, 0xa8, 0x26, 0xfd, 0x57, 0xa7, 0x03, 0x64, 0x99, + 0x46, 0x79, 0x83, 0x1e, 0x67, 0xd0, 0x9e, 0x06, 0xa2, 0xaf, 0x2d, 0xc9, + 0x39, 0x91, 0xcc, 0xcf, 0x82, 0x5a, 0x73, 0xbe, 0x62, 0x9b, 0xa5, 0x23, + 0xab, 0x3a, 0x9b, 0x4d, 0xea, 0x02, 0xb6, 0x50, 0x65, 0x75, 0x67, 0xc4, + 0x2d, 0xcf, 0xaf, 0xca, 0x19, 0x56, 0xdd, 0x44, 0x36, 0xc6, 0x6a, 0x68, + 0xc2, 0x24, 0x8a, 0x35, 0x21, 0x9e, 0x2f, 0xd2, 0x2c, 0xa7, 0x96, 0x75, + 0xf6, 0x47, 0x18, 0x4a, 0xba, 0xe6, 0x23, 0x30, 0x3f, 0xb2, 0x67, 0xb1, + 0xdf, 0x4e, 0xed, 0xff, 0x8c, 0xea, 0x37, 0x53, 0xff, 0x80, 0x2e, 0x10, + 0xdc, 0x0d, 0xb4, 0x6a, 0x87, 0x77, 0x07, 0x43, 0x19, 0x37, 0x8b, 0x55, + 0xbd, 0x0e, 0x02, 0x90, 0xaa, 0x30, 0x22, 0x78, 0xf4, 0x0e, 0x52, 0x39, + 0xbf, 0x95, 0xba, 0x09, 0x46, 0xe0, 0xdf, 0x2a, 0x2d, 0x53, 0x83, 0x23, + 0xe3, 0x78, 0x7b, 0x18, 0xde, 0xee, 0xa9, 0xaf, 0x15, 0x42, 0x95, 0x2f, + 0x45, 0x18, 0x66, 0xf7, 0xe6, 0x31, 0x60, 0x55, 0xc1, 0xec, 0x88, 0x75, + 0x85, 0x06, 0x8d, 0x89, 0xf5, 0xa6, 0x92, 0xa0, 0xdc, 0x86, 0xc3, 0xe4, + 0x31, 0x43, 0xb4, 0x6a, 0x3a, 0x29, 0x6e, 0xfc, 0xa8, 0x6a, 0x3c, 0x5c, + 0x9a, 0x5b, 0x58, 0xde, 0xd6, 0x23, 0x3f, 0x78, 0xd5, 0xcd, 0x77, 0x41, + 0x30, 0x85, 0x80, 0xe9, 0x97, 0x25, 0x5b, 0xf0, 0x7e, 0xdc, 0xe9, 0x19, + 0x57, 0xd5, 0xfa, 0x43, 0x1d, 0xde, 0xea, 0x22, 0x94, 0xc4, 0xd9, 0x8d, + 0xa6, 0x7a, 0x4c, 0x00, 0xa8, 0xe1, 0x67, 0xd5, 0x18, 0x71, 0x82, 0x52, + 0x60, 0x8c, 0x12, 0x09, 0xac, 0x37, 0xb5, 0x02, 0x58, 0x6f, 0xb8, 0xfe, + 0xf0, 0xa3, 0x51, 0xf5, 0x01, 0xdc, 0xac, 0x3d, 0xa4, 0x68, 0x99, 0xcd, + 0xeb, 0x4e, 0xfc, 0xe2, 0x47, 0x45, 0xcd, 0x4f, 0xa1, 0xe6, 0x0c, 0xef, + 0xad, 0xf8, 0x7c, 0xbd, 0x0d, 0x99, 0xe1, 0x20, 0x18, 0xb7, 0x3e, 0xfd, + 0x72, 0x54, 0x9b, 0xea, 0xcc, 0x10, 0x8d, 0xc6, 0x7e, 0xfb, 0x86, 0x23, + 0xe1, 0x57, 0xa9, 0xf6, 0xdc, 0x54, 0xed, 0x39, 0x8f, 0xfc, 0x6d, 0xd4, + 0xb3, 0x45, 0x93, 0x1a, 0x52, 0x14, 0xc1, 0x70, 0xeb, 0xc5, 0x28, 0xe0, + 0xaa, 0x4c, 0x20, 0x43, 0xfd, 0x83, 0x8c, 0xa0, 0x60, 0xc8, 0x31, 0x83, + 0x22, 0xb9, 0xde, 0x10, 0x4a, 0x38, 0xa5, 0x2f, 0xb1, 0x7d, 0xa3, 0xf2, + 0x15, 0x0c, 0x14, 0x8c, 0x38, 0x0c, 0xdc, 0x4a, 0x75, 0x04, 0xb5, 0x89, + 0x59, 0xde, 0x2f, 0x91, 0x8c, 0x32, 0xcc, 0xbf, 0x65, 0x8c, 0x5e, 0x4e, + 0x10, 0x21, 0x77, 0xab, 0xd4, 0x6d, 0x0d, 0xea, 0x66, 0x97, 0xe4, 0xd3, + 0x04, 0x55, 0x58, 0x90, 0x2a, 0x20, 0x60, 0x80, 0x2e, 0x20, 0xd8, 0x3f, + 0x4b, 0x19, 0x90, 0x23, 0x47, 0x1b, 0x64, 0x7a, 0x90, 0x3a, 0x20, 0x60, + 0xa5, 0x3e, 0x0c, 0x47, 0x88, 0xc4, 0xd0, 0x2d, 0xf6, 0x7b, 0xfe, 0x39, + 0x0a, 0x41, 0xc4, 0x83, 0x34, 0x82, 0x20, 0x03, 0x54, 0x82, 0xe0, 0xfe, + 0x59, 0x3a, 0x41, 0x2c, 0x39, 0x4a, 0xa1, 0x32, 0x82, 0xb4, 0x82, 0x20, + 0xab, 0xd4, 0x02, 0x8c, 0x84, 0x09, 0xfc, 0x6f, 0xd6, 0x0a, 0xa0, 0x15, + 0x66, 0x26, 0x00, 0x30, 0xc4, 0x4c, 0x00, 0xd8, 0x3f, 0xcc, 0x4c, 0x20, + 0x47, 0xae, 0x46, 0x50, 0x7a, 0x98, 0x99, 0x00, 0xc0, 0x4a, 0x33, 0xf1, + 0xa4, 0xab, 0x83, 0xfe, 0x3b, 0x6d, 0x04, 0xf9, 0xee, 0x26, 0xd7, 0xdd, + 0xee, 0xc9, 0x83, 0xe6, 0xd7, 0xbb, 0xdd, 0x01, 0x84, 0x79, 0x23, 0x6a, + 0x22, 0xd0, 0x85, 0xb4, 0xb3, 0x13, 0xfa, 0xa1, 0x4e, 0xfa, 0x3e, 0xc1, + 0xb3, 0xef, 0x53, 0xc1, 0x82, 0x7f, 0xd5, 0x3a, 0xff, 0xb1, 0x7a, 0xdf, + 0x53, 0x40, 0xe0, 0x45, 0x5d, 0xd6, 0x56, 0x91, 0x36, 0xa0, 0x73, 0x78, + 0x72, 0xc5, 0xc1, 0x57, 0x7a, 0x34, 0x77, 0xe6, 0xe2, 0x7a, 0xd3, 0x7c, + 0x91, 0xce, 0x19, 0x15, 0x8f, 0x1b, 0xd3, 0xe9, 0xb5, 0x76, 0x46, 0x09, + 0xe7, 0x67, 0x74, 0x6f, 0x90, 0xd2, 0xc5, 0xc9, 0x9a, 0x64, 0x2a, 0x5f, + 0xcb, 0xfb, 0x82, 0x8a, 0x38, 0x17, 0xde, 0x68, 0x2b, 0xd5, 0xcb, 0x1b, + 0xf0, 0x6c, 0xd6, 0x02, 0x6e, 0x1d, 0x14, 0xcc, 0x46, 0x85, 0x27, 0x76, + 0xc9, 0xb5, 0x9f, 0xf3, 0x92, 0x0d, 0xc6, 0xdc, 0x79, 0xf5, 0x51, 0x6d, + 0x0f, 0xf2, 0xbe, 0x83, 0xa0, 0xc4, 0xe5, 0xa5, 0xc6, 0x72, 0x2f, 0x7d, + 0x66, 0x52, 0x8a, 0xdd, 0x66, 0x0b, 0xcb, 0x53, 0x9d, 0x4a, 0xbe, 0xac, + 0xdb, 0x5e, 0x55, 0xa0, 0xe1, 0xaf, 0x3f, 0x7c, 0x54, 0x66, 0x17, 0xa4, + 0x2e, 0x9d, 0x6e, 0xf3, 0x7b, 0xe4, 0x6e, 0xb7, 0x4e, 0x86, 0x20, 0xf4, + 0x68, 0x57, 0x7f, 0xf6, 0x05, 0x9f, 0x1d, 0xd7, 0xbb, 0xd3, 0x29, 0xaf, + 0xe7, 0xfe, 0x43, 0xd6, 0x53, 0xab, 0x97, 0x77, 0x15, 0xba, 0xbc, 0x9a, + 0x2e, 0x56, 0xb5, 0x37, 0x23, 0xfa, 0x08, 0xa5, 0x74, 0x5e, 0x61, 0xb9, + 0x76, 0x53, 0x8b, 0xd8, 0xa0, 0x83, 0x36, 0xda, 0x27, 0xf3, 0x11, 0x83, + 0x32, 0xb4, 0x32, 0x9d, 0xb3, 0xef, 0xcb, 0xe4, 0x86, 0xc0, 0xaa, 0x58, + 0x61, 0xe8, 0xdb, 0xc5, 0x4f, 0x68, 0x5c, 0x62, 0xba, 0x23, 0xfd, 0x09, + 0x8c, 0xc5, 0x0a, 0x5d, 0x5e, 0x6d, 0x8b, 0x87, 0xbd, 0x51, 0xb7, 0x37, + 0x7c, 0xd2, 0x7d, 0x75, 0xf4, 0xe6, 0x9b, 0xdd, 0xd7, 0xca, 0xe1, 0x0e, + 0x14, 0xdc, 0xe1, 0x1b, 0xaf, 0x57, 0xc1, 0x1d, 0x2a, 0xb8, 0xe1, 0xf0, + 0x71, 0xb7, 0xbb, 0x37, 0x84, 0x9b, 0x5b, 0x21, 0x4e, 0x7e, 0xf3, 0xf5, + 0x7a, 0x39, 0x9b, 0x36, 0xe8, 0x3c, 0x54, 0x68, 0x08, 0xe5, 0xf3, 0xf5, + 0x3a, 0x4f, 0x76, 0x41, 0xd8, 0x66, 0x59, 0xb5, 0x4a, 0x0c, 0x32, 0x27, + 0x7f, 0xaa, 0xa3, 0x43, 0xb4, 0xe2, 0x8f, 0x5e, 0x1c, 0x0e, 0x87, 0x8f, + 0xa2, 0xa7, 0xf0, 0xe5, 0x83, 0x0f, 0x3e, 0x78, 0x14, 0x42, 0x99, 0x58, + 0xde, 0x1d, 0x61, 0x7a, 0x9a, 0xd2, 0x8e, 0xba, 0xdd, 0x9f, 0x30, 0x96, + 0x49, 0x7d, 0x7f, 0x42, 0x28, 0xd5, 0x9f, 0x14, 0x56, 0x59, 0x7f, 0xc2, + 0x3c, 0x1d, 0xb2, 0xd1, 0x06, 0x8f, 0x4b, 0x0b, 0xb8, 0x33, 0x4b, 0x0c, + 0x11, 0x13, 0x5d, 0xa5, 0xb5, 0x05, 0xe4, 0x23, 0x5e, 0x22, 0x15, 0xd4, + 0xb1, 0x7a, 0xa9, 0x20, 0x94, 0x92, 0x8a, 0xc2, 0x2a, 0x93, 0x0a, 0xe6, + 0x99, 0x90, 0xed, 0xa5, 0x22, 0xb8, 0x53, 0x74, 0xc2, 0xa5, 0x22, 0xaf, + 0xcc, 0x37, 0xe9, 0x4b, 0x08, 0x10, 0x42, 0x5a, 0xdd, 0xad, 0x79, 0x78, + 0xca, 0xc5, 0x61, 0xdb, 0xae, 0x48, 0xe3, 0x76, 0xf7, 0xae, 0x68, 0x8b, + 0xd5, 0xc2, 0x0e, 0xa9, 0xc3, 0xe2, 0x63, 0x67, 0x32, 0x57, 0x6b, 0x99, + 0x1d, 0xd2, 0x87, 0xa5, 0x51, 0x7b, 0xf6, 0xe5, 0xfd, 0xc4, 0x3c, 0xb9, + 0xc9, 0xf7, 0xe8, 0xd9, 0x9e, 0xe8, 0xe7, 0x67, 0xc9, 0x46, 0xdc, 0x2e, + 0x8f, 0x20, 0x89, 0x69, 0x46, 0xe8, 0x83, 0x1a, 0x9d, 0x17, 0x86, 0x0e, + 0xc6, 0x88, 0xfa, 0xcf, 0x1e, 0x8b, 0x95, 0xb3, 0xf0, 0x2c, 0xe4, 0xc2, + 0x2b, 0xbf, 0x69, 0xe4, 0x55, 0xbc, 0xff, 0xb2, 0xab, 0xa0, 0xe9, 0x5e, + 0x78, 0xe5, 0x3f, 0x01, 0x01, 0xf7, 0x5c, 0xeb, 0x46, 0xa0, 0xd1, 0x68, + 0xe4, 0x1d, 0xdf, 0xee, 0x83, 0x95, 0xe4, 0x38, 0xb9, 0x00, 0x17, 0xe8, + 0xed, 0xc6, 0x3a, 0xf8, 0x0b, 0xb8, 0x29, 0xb7, 0x1b, 0xf2, 0xc2, 0xa1, + 0xde, 0x0e, 0x08, 0xd3, 0x05, 0xd9, 0xdd, 0x90, 0xc6, 0xab, 0xb3, 0xbb, + 0xa1, 0x8c, 0x97, 0x6a, 0x77, 0x44, 0x5a, 0xb8, 0x33, 0xdb, 0x0d, 0xed, + 0x6c, 0x93, 0xec, 0xaa, 0x19, 0x95, 0xb1, 0x69, 0x47, 0xda, 0x99, 0xaf, + 0xe4, 0x01, 0x8b, 0x22, 0x00, 0x32, 0x66, 0x2b, 0x79, 0xe9, 0x92, 0x08, + 0xb2, 0x74, 0xb8, 0x3f, 0xb1, 0x1e, 0x22, 0xc6, 0x24, 0x95, 0xf0, 0x89, + 0x8a, 0x22, 0xd2, 0x87, 0xfd, 0x9a, 0x26, 0xe3, 0x43, 0xbe, 0x0a, 0xa1, + 0x2e, 0xf6, 0x69, 0xea, 0x17, 0xbd, 0x2e, 0xf5, 0x46, 0x3b, 0x11, 0x0f, + 0xbc, 0x04, 0xaf, 0xe4, 0x46, 0xd8, 0xca, 0xe7, 0xd3, 0x79, 0xbe, 0x80, + 0x9d, 0x40, 0xf1, 0x18, 0x3f, 0xee, 0x96, 0x2b, 0x4b, 0x16, 0xa4, 0x2d, + 0x40, 0xd5, 0x52, 0x98, 0xac, 0x42, 0x63, 0x00, 0xda, 0x80, 0x6d, 0xb2, + 0x33, 0xe4, 0xa5, 0x06, 0xa5, 0x18, 0xa5, 0x36, 0xae, 0xaf, 0x9c, 0x20, + 0x50, 0xb4, 0xb8, 0xf3, 0xe9, 0x3c, 0x91, 0x41, 0x25, 0x9a, 0x78, 0x79, + 0x95, 0xeb, 0xf8, 0x72, 0xe7, 0x82, 0xbc, 0xc8, 0xa9, 0x06, 0xc1, 0x06, + 0xad, 0x03, 0xc9, 0x57, 0xf5, 0x10, 0x99, 0x17, 0x84, 0xde, 0xd9, 0x85, + 0x75, 0x29, 0x11, 0xca, 0xd6, 0xd3, 0x36, 0xe4, 0x76, 0x40, 0x35, 0xcd, + 0xc3, 0x4e, 0x32, 0xd4, 0x6b, 0xec, 0x49, 0x3d, 0x7f, 0x0e, 0xde, 0x34, + 0x95, 0xda, 0xcf, 0x4f, 0x59, 0xe8, 0xb5, 0x14, 0x1c, 0x4a, 0x44, 0x1d, + 0xfb, 0x59, 0x34, 0x00, 0x17, 0xcf, 0xb3, 0x94, 0x17, 0x84, 0xae, 0xfb, + 0x52, 0x8a, 0xfe, 0x4c, 0x9a, 0xd1, 0x6b, 0x13, 0xf6, 0x47, 0xe0, 0x3c, + 0x02, 0xc5, 0x8c, 0x44, 0x38, 0x62, 0x86, 0x67, 0x62, 0x49, 0x46, 0x0f, + 0x61, 0x54, 0x70, 0xc1, 0x48, 0xe8, 0x5f, 0xa6, 0x21, 0x99, 0x8f, 0x5b, + 0xaf, 0xa6, 0x1b, 0xe7, 0x61, 0x2b, 0xff, 0xd9, 0xef, 0xbb, 0x1c, 0x3e, + 0x6b, 0x0c, 0x9a, 0x7a, 0xdc, 0xa5, 0xbb, 0x9a, 0x09, 0xab, 0x97, 0x35, + 0x13, 0x33, 0xfa, 0xce, 0x9f, 0x9b, 0x1f, 0xea, 0x73, 0xc4, 0x72, 0xb6, + 0x24, 0x57, 0x4d, 0x3d, 0x16, 0x99, 0xed, 0x46, 0xba, 0xe1, 0x7f, 0xe6, + 0x24, 0xab, 0x2d, 0x9f, 0x38, 0x75, 0xba, 0x4e, 0xb3, 0xd2, 0x83, 0x46, + 0xbb, 0x59, 0xa7, 0xcb, 0xe5, 0x5f, 0xd5, 0xa2, 0x28, 0x57, 0x21, 0x9d, + 0x68, 0xd2, 0xa4, 0x79, 0xc7, 0x7e, 0x72, 0x04, 0x60, 0xca, 0x86, 0x92, + 0xda, 0x89, 0xe7, 0xef, 0xd4, 0x8e, 0x89, 0x2f, 0xdf, 0x5f, 0x8b, 0xea, + 0x4a, 0xdc, 0xbb, 0x1b, 0xca, 0xb5, 0x7e, 0x37, 0x8c, 0xd9, 0x47, 0x13, + 0x53, 0xe9, 0x3b, 0x90, 0xab, 0xb2, 0x79, 0x7c, 0xa6, 0x07, 0xa5, 0x58, + 0x43, 0x9c, 0xf5, 0x1a, 0xf7, 0x81, 0x57, 0x7d, 0x61, 0xaa, 0x1c, 0xa2, + 0xc6, 0x0d, 0xb4, 0x36, 0xcc, 0x28, 0xe9, 0x2d, 0xf6, 0x80, 0x0b, 0xd5, + 0x26, 0x6c, 0x68, 0x2c, 0xf0, 0xb7, 0x80, 0x89, 0x25, 0x8f, 0x61, 0xd5, + 0x65, 0xdc, 0x3b, 0x8f, 0x68, 0xcd, 0x97, 0xd5, 0x57, 0x19, 0xe8, 0xf2, + 0xf5, 0xe5, 0x6d, 0x2f, 0xc2, 0x70, 0xda, 0x50, 0xa7, 0xda, 0xb7, 0xad, + 0xb2, 0x7c, 0x49, 0xa0, 0x68, 0xea, 0x1b, 0xe3, 0xc0, 0x1d, 0xc8, 0xaa, + 0xf4, 0xd2, 0x59, 0x66, 0x0c, 0xc5, 0xe2, 0x78, 0xa9, 0x5e, 0x6e, 0xd3, + 0x29, 0xe6, 0x8b, 0xd3, 0xb3, 0xd1, 0xeb, 0xa3, 0xd7, 0xe9, 0x18, 0xf3, + 0xc5, 0xc7, 0xf3, 0xe9, 0xf9, 0xe1, 0x7e, 0x87, 0xa7, 0x58, 0xef, 0xae, + 0x16, 0x57, 0x53, 0xaa, 0xc4, 0x22, 0x23, 0x86, 0xcf, 0x84, 0x6f, 0x16, + 0x12, 0x01, 0xbd, 0xa4, 0x8a, 0xf1, 0x81, 0xbb, 0x78, 0x03, 0x1e, 0x41, + 0x29, 0x43, 0xfc, 0xd2, 0xf5, 0x3d, 0x57, 0xed, 0xa0, 0x18, 0xe0, 0x34, + 0x9c, 0xc8, 0x88, 0x12, 0xfc, 0x01, 0x14, 0xee, 0x02, 0xde, 0xb9, 0x1a, + 0xc4, 0x84, 0x6d, 0x88, 0xee, 0xa5, 0x48, 0xd9, 0x1d, 0x74, 0xf4, 0x6d, + 0x32, 0x3b, 0x5e, 0xc3, 0x8c, 0x3d, 0xa7, 0x3b, 0x0b, 0xe4, 0x02, 0x7a, + 0x99, 0x50, 0xd0, 0x70, 0x79, 0x00, 0x0e, 0xe4, 0xef, 0xec, 0xa0, 0xc7, + 0x92, 0xa3, 0xa7, 0xd1, 0x10, 0x6b, 0x26, 0x72, 0xe1, 0x16, 0xe0, 0x57, + 0x49, 0x9e, 0x2e, 0x30, 0x4e, 0xf2, 0x48, 0xa6, 0xa5, 0x09, 0xe3, 0xbc, + 0x9f, 0x2c, 0xa7, 0xb7, 0x1f, 0xa5, 0xeb, 0xeb, 0x0f, 0xa7, 0x18, 0xc6, + 0x97, 0x81, 0x28, 0xfe, 0x3c, 0x87, 0xa4, 0x36, 0x23, 0xa9, 0x4a, 0xfc, + 0x77, 0x97, 0x4b, 0xd3, 0x15, 0x80, 0xf9, 0x14, 0x94, 0x62, 0xc9, 0x47, + 0x9b, 0x75, 0x0e, 0xba, 0xb0, 0x80, 0x01, 0xec, 0x36, 0xc2, 0x69, 0x9e, + 0xc6, 0x70, 0xa6, 0xbd, 0xc6, 0xf6, 0xc6, 0x5f, 0x66, 0x17, 0x1c, 0x31, + 0x26, 0x3a, 0x0e, 0xbd, 0x21, 0x0d, 0x64, 0x0c, 0xa5, 0xc4, 0x54, 0xe5, + 0xa8, 0xf3, 0xd9, 0x74, 0xb5, 0xa5, 0x92, 0x28, 0xf5, 0xec, 0xe9, 0xd3, + 0x0a, 0x66, 0xc9, 0x9b, 0xc0, 0xdd, 0x8f, 0x49, 0xb2, 0x39, 0x22, 0x60, + 0x51, 0xd9, 0x7b, 0x6d, 0xc2, 0x5e, 0xcb, 0x1e, 0xb4, 0xc2, 0xc9, 0xa9, + 0x0e, 0x56, 0x1e, 0x49, 0x1a, 0xed, 0x83, 0xb1, 0xe2, 0xa9, 0x5c, 0x1b, + 0x33, 0x8d, 0x3e, 0x40, 0x52, 0xd7, 0x31, 0xa7, 0x9e, 0x90, 0x5a, 0x36, + 0xf5, 0x6c, 0x3c, 0xed, 0x04, 0x5a, 0x35, 0xa6, 0xc1, 0x7c, 0xfb, 0x2b, + 0x6b, 0x55, 0xda, 0xf4, 0xd5, 0x0a, 0x02, 0x34, 0x59, 0x43, 0x08, 0x8c, + 0x1c, 0xa9, 0xc3, 0x1a, 0x4b, 0x1e, 0xc5, 0x6f, 0x53, 0xe8, 0xac, 0x34, + 0x00, 0x09, 0x38, 0x50, 0x7c, 0xf1, 0xb3, 0xe4, 0x76, 0x89, 0xaa, 0xfd, + 0x58, 0xd5, 0x5e, 0x40, 0xb3, 0xea, 0xe0, 0x43, 0x40, 0x5b, 0x75, 0x30, + 0x4d, 0x3e, 0xa6, 0x1c, 0x40, 0xf7, 0xb8, 0x72, 0x7c, 0x19, 0xb1, 0x5f, + 0x5a, 0xd7, 0x25, 0x07, 0x70, 0x44, 0x42, 0x90, 0x8b, 0xb4, 0xaf, 0x54, + 0x7f, 0x02, 0xce, 0x8a, 0x8e, 0x1b, 0xfb, 0xe3, 0xfa, 0x83, 0x8e, 0x4e, + 0xd3, 0xb3, 0xed, 0x62, 0xb5, 0x86, 0xaf, 0xdc, 0x9d, 0xa1, 0xf4, 0x72, + 0xa7, 0x1f, 0x47, 0x05, 0x75, 0x14, 0x14, 0xab, 0x06, 0xd5, 0x13, 0xc8, + 0x20, 0x7d, 0x9d, 0x40, 0xb5, 0xd2, 0x4a, 0xcf, 0xd1, 0x98, 0x20, 0x90, + 0x9c, 0x92, 0xd1, 0x1f, 0x1e, 0xf5, 0xd4, 0x89, 0xed, 0x43, 0xbf, 0x9a, + 0xc1, 0xe4, 0x2c, 0x9c, 0xbf, 0x80, 0x1e, 0xf3, 0xda, 0x6b, 0x16, 0xce, + 0x9f, 0xeb, 0x3b, 0x16, 0xf7, 0xba, 0xa5, 0x76, 0x7e, 0x77, 0x3a, 0x7e, + 0x24, 0xd3, 0x15, 0xdb, 0x6b, 0xd0, 0xb8, 0x75, 0x95, 0xb0, 0xe7, 0x11, + 0x63, 0xaf, 0xb4, 0xc9, 0x5a, 0x05, 0x8b, 0xfb, 0x7d, 0xe8, 0x5f, 0x3b, + 0x91, 0x78, 0xbf, 0xbf, 0x53, 0x89, 0xff, 0x59, 0xe1, 0xa9, 0xae, 0x59, + 0x67, 0x69, 0xdf, 0x9a, 0x44, 0x6c, 0xe0, 0x3c, 0x8c, 0x84, 0xba, 0x3c, + 0xbd, 0x0f, 0x6a, 0x3b, 0x9a, 0x92, 0x04, 0xb7, 0xdd, 0x07, 0x04, 0xbd, + 0x5e, 0x05, 0x36, 0xda, 0x7d, 0x80, 0x77, 0x1a, 0xb0, 0x22, 0xc5, 0x88, + 0xae, 0x8f, 0xbf, 0x24, 0x26, 0x96, 0xcb, 0x80, 0x81, 0x54, 0x29, 0x80, + 0x59, 0x24, 0x85, 0x8f, 0x4d, 0x4c, 0xb2, 0x7f, 0x3e, 0x5d, 0x2c, 0x13, + 0xe9, 0xa3, 0xa4, 0x5a, 0xb6, 0xc0, 0xb0, 0xc9, 0xb2, 0xc3, 0xb0, 0xc9, + 0x6e, 0xb5, 0x6d, 0x05, 0xfc, 0x6d, 0xba, 0x2c, 0xb1, 0xa5, 0xb5, 0x4b, + 0xa9, 0x72, 0xe7, 0x8a, 0x4f, 0x5e, 0xdf, 0x8d, 0x73, 0xc5, 0x27, 0xaf, + 0x3f, 0x9c, 0x73, 0x45, 0xcb, 0xb3, 0x11, 0x39, 0x5a, 0x04, 0xc9, 0x64, + 0x20, 0x19, 0x7d, 0x68, 0xfd, 0xf6, 0x32, 0x59, 0x89, 0x41, 0x95, 0x45, + 0xba, 0xc8, 0x68, 0x06, 0xd6, 0xa3, 0xa8, 0x25, 0xe4, 0xdb, 0x81, 0xa4, + 0x2e, 0x87, 0x5f, 0x48, 0x4d, 0x7f, 0x4e, 0x52, 0x5f, 0x6b, 0xf0, 0x88, + 0xe0, 0x86, 0x07, 0x71, 0x75, 0xbc, 0x68, 0x27, 0x2a, 0xcd, 0x5d, 0xe2, + 0x2d, 0x8a, 0xd6, 0x4f, 0xce, 0x5c, 0x07, 0x67, 0x04, 0x92, 0x26, 0xe7, + 0x69, 0x92, 0x5d, 0x3e, 0xa7, 0x5d, 0x52, 0x58, 0x84, 0x8a, 0xa1, 0xff, + 0x13, 0xf9, 0x2b, 0xa6, 0xbe, 0xc6, 0xd7, 0xbd, 0x5e, 0xea, 0x74, 0x7b, + 0x34, 0xe9, 0xdd, 0xc7, 0xb2, 0x1a, 0x18, 0x2e, 0x9e, 0xa9, 0x48, 0x2d, + 0x6e, 0x60, 0x25, 0xc2, 0x7a, 0x89, 0xa4, 0xdb, 0x6a, 0xe0, 0x09, 0x50, + 0x41, 0x5b, 0x81, 0x41, 0x08, 0x2f, 0x37, 0x24, 0x11, 0xae, 0xc5, 0x40, + 0x5c, 0xa8, 0x71, 0x48, 0x01, 0x6d, 0x55, 0xf9, 0x2b, 0x0c, 0xa1, 0x62, + 0x9c, 0xa7, 0x97, 0x05, 0xab, 0xe3, 0xe6, 0x97, 0x8b, 0xa8, 0x11, 0x2a, + 0x40, 0x33, 0xd4, 0x23, 0x89, 0x7a, 0xd0, 0x1c, 0xf5, 0x57, 0x89, 0xfa, + 0x58, 0x43, 0xbd, 0xdf, 0x69, 0x0f, 0xa4, 0x59, 0x42, 0xd3, 0x2e, 0x28, + 0x16, 0x42, 0xb5, 0x9d, 0xd0, 0xf6, 0xd0, 0x46, 0x91, 0x04, 0x8b, 0xfe, + 0xe6, 0xed, 0x93, 0xde, 0x4a, 0x7f, 0xba, 0xbe, 0x88, 0x68, 0x44, 0xcc, + 0xca, 0x6a, 0x41, 0xb9, 0x7a, 0x2d, 0x28, 0xc1, 0x5b, 0x15, 0xca, 0xd1, + 0x2b, 0xa3, 0x1c, 0xb7, 0xd1, 0x67, 0xd3, 0x2a, 0xe1, 0xd4, 0xc1, 0x1d, + 0x13, 0xf3, 0xf4, 0xf6, 0x88, 0x9e, 0x11, 0xbe, 0x3d, 0xd1, 0xc6, 0x90, + 0x01, 0xaf, 0x9b, 0x89, 0xb3, 0x86, 0x13, 0x22, 0xd7, 0xae, 0xf0, 0x5f, + 0xfd, 0x64, 0xb3, 0x95, 0x65, 0x09, 0xb2, 0x2e, 0xca, 0x8a, 0x35, 0xae, + 0x90, 0x35, 0xe6, 0xb7, 0x29, 0xbb, 0xd3, 0xc6, 0x6d, 0x9f, 0x2c, 0x97, + 0x66, 0x4d, 0xc3, 0xe8, 0x35, 0x7f, 0x0b, 0x41, 0x7a, 0x08, 0xfe, 0x48, + 0xf3, 0xfc, 0x37, 0x74, 0x5d, 0xff, 0xf9, 0x75, 0x59, 0x5e, 0xc7, 0x10, + 0x2e, 0x5c, 0x03, 0xfa, 0x68, 0xe1, 0x0d, 0x29, 0x28, 0x18, 0x0c, 0x6b, + 0x36, 0x92, 0x97, 0xa4, 0xc9, 0xff, 0x64, 0x32, 0x40, 0xda, 0x3a, 0x87, + 0xa0, 0xa8, 0x61, 0xc1, 0x5e, 0x0a, 0xcc, 0xbd, 0xbd, 0xa0, 0x4d, 0xd1, + 0x47, 0x64, 0xaa, 0x1f, 0xa9, 0x43, 0x5e, 0x19, 0x11, 0x0f, 0x9b, 0x6c, + 0x05, 0xbd, 0xd5, 0x3d, 0x76, 0x32, 0xab, 0x00, 0xe5, 0x03, 0xbb, 0xf0, + 0xef, 0x9f, 0x88, 0x31, 0x03, 0x0c, 0x24, 0x8e, 0x87, 0x62, 0xde, 0x0e, + 0x8e, 0x26, 0x0a, 0x2a, 0x20, 0xa8, 0x0c, 0xc7, 0x83, 0x0d, 0x8e, 0x19, + 0xe2, 0x04, 0xba, 0xb5, 0x08, 0x59, 0x85, 0xb2, 0x24, 0xc8, 0x0b, 0x5a, + 0x74, 0xc4, 0xe1, 0x3a, 0xd1, 0x55, 0x9a, 0x07, 0xd8, 0x8a, 0xc6, 0x1b, + 0x52, 0x00, 0xe8, 0xa3, 0xa7, 0xbc, 0x63, 0xe9, 0x60, 0xe4, 0x98, 0x62, + 0xad, 0x89, 0x97, 0xc2, 0x19, 0xb9, 0xe6, 0xaa, 0x95, 0x4b, 0x26, 0x51, + 0x5d, 0xa1, 0x18, 0x4e, 0x1f, 0x26, 0x3a, 0xf0, 0x38, 0x0a, 0xba, 0x00, + 0xe9, 0x75, 0x1e, 0x11, 0x10, 0x0e, 0x85, 0xd8, 0x77, 0x19, 0x8a, 0x14, + 0x4b, 0x94, 0x3f, 0x61, 0xd0, 0x71, 0xc8, 0x1b, 0x7f, 0xf7, 0x9d, 0x7e, + 0x20, 0x2f, 0xeb, 0x8d, 0xcb, 0x0a, 0xf3, 0x42, 0xf9, 0x93, 0x02, 0x74, + 0x1c, 0xf0, 0xda, 0xde, 0x7d, 0x33, 0x1f, 0xc2, 0xc8, 0x75, 0x36, 0x7a, + 0x63, 0x38, 0x3a, 0xbf, 0x79, 0x5e, 0xde, 0x29, 0x2c, 0x98, 0x89, 0x89, + 0x17, 0xd6, 0x4d, 0xe8, 0x12, 0x51, 0x70, 0x0f, 0x31, 0x42, 0x12, 0x33, + 0x7e, 0x4d, 0xc7, 0xa8, 0xec, 0x13, 0x76, 0x94, 0x64, 0xa6, 0x1a, 0xd6, + 0x1b, 0xac, 0xfa, 0xd0, 0x25, 0x8a, 0xe0, 0xfa, 0x98, 0xa1, 0x4a, 0x98, + 0x00, 0x84, 0x80, 0x1b, 0xd7, 0x62, 0xa4, 0x06, 0xc6, 0x30, 0x00, 0xe3, + 0xc2, 0xc0, 0x18, 0x05, 0x60, 0xcc, 0x0c, 0x8c, 0x83, 0x00, 0x0c, 0xb8, + 0xa4, 0x29, 0x9c, 0x6a, 0x3c, 0x5b, 0x7f, 0x9c, 0xdc, 0xc4, 0x27, 0x7a, + 0x9d, 0x7a, 0x06, 0xbf, 0x3d, 0x83, 0x97, 0x9e, 0x51, 0xce, 0x69, 0xb7, + 0xbe, 0xa4, 0xeb, 0x91, 0xc1, 0xdc, 0xe3, 0x00, 0xe6, 0x52, 0x13, 0xe5, + 0x30, 0x00, 0xe5, 0xc2, 0x44, 0x79, 0x12, 0x80, 0x32, 0x33, 0x51, 0x5e, + 0x0f, 0x40, 0x01, 0xa9, 0x8d, 0x4a, 0xc4, 0xf6, 0xd8, 0x10, 0xcd, 0xa1, + 0xf1, 0xeb, 0x09, 0xfe, 0xe2, 0x82, 0xc2, 0xc4, 0x76, 0x60, 0x70, 0xf7, + 0x46, 0x00, 0x77, 0xa9, 0x89, 0xf2, 0x66, 0x00, 0xca, 0x85, 0x89, 0x32, + 0x0c, 0x51, 0xe8, 0x99, 0x85, 0x13, 0xa2, 0xd2, 0x20, 0xb8, 0x83, 0x12, + 0xc1, 0xbd, 0x61, 0x08, 0xe7, 0x4d, 0x53, 0xfb, 0x2c, 0x65, 0x1c, 0x82, + 0xe8, 0x1e, 0x62, 0x78, 0x2d, 0x09, 0xed, 0x3f, 0x2c, 0xb7, 0x68, 0xa5, + 0x4e, 0x61, 0x07, 0x69, 0x09, 0x43, 0x51, 0xb9, 0x23, 0x58, 0x90, 0x7b, + 0x05, 0x92, 0xdf, 0xf9, 0x2b, 0xc8, 0xbd, 0x0c, 0xa7, 0xc2, 0xe1, 0xeb, + 0xe0, 0x5a, 0x22, 0x05, 0x98, 0xc8, 0x0a, 0xc1, 0x8c, 0x5a, 0x09, 0x66, + 0xd4, 0x4a, 0x32, 0xa3, 0x36, 0xa2, 0x19, 0xb5, 0x92, 0xcd, 0xa8, 0x91, + 0x70, 0x4a, 0x64, 0x73, 0xd0, 0x4a, 0x36, 0x07, 0xad, 0x64, 0x73, 0xd0, + 0x46, 0x36, 0x07, 0xad, 0x64, 0x73, 0x10, 0x2e, 0x1b, 0xff, 0xe4, 0x53, + 0x04, 0xc6, 0x6c, 0x34, 0xe9, 0xac, 0x08, 0x1e, 0x79, 0xe7, 0xb8, 0x36, + 0xb5, 0xe3, 0x47, 0x86, 0xf8, 0x5f, 0x2d, 0x73, 0xb8, 0x1a, 0x32, 0xd3, + 0xaa, 0x08, 0x3f, 0x79, 0x57, 0x1f, 0x80, 0x32, 0xc8, 0x5f, 0x6a, 0x99, + 0x7f, 0xd4, 0xa0, 0x29, 0xa9, 0x72, 0xe7, 0x59, 0xcb, 0x9f, 0x27, 0x86, + 0x65, 0x2d, 0x7f, 0x00, 0xe3, 0xe5, 0x8f, 0xb2, 0xc2, 0xa6, 0xcc, 0x15, + 0x41, 0x30, 0xef, 0xea, 0xc3, 0x60, 0x06, 0xf9, 0x20, 0x2d, 0xf5, 0x39, + 0x1a, 0xcc, 0x9f, 0x3f, 0x8e, 0xe6, 0x5d, 0x7d, 0x24, 0xcd, 0x28, 0xc4, + 0x5b, 0x68, 0xa9, 0x77, 0xd0, 0x10, 0xfe, 0x2a, 0x42, 0x71, 0xde, 0x55, + 0x04, 0xe3, 0x0c, 0x59, 0x94, 0xcd, 0x57, 0x56, 0xe3, 0x32, 0xad, 0x40, + 0xce, 0x80, 0x42, 0x2d, 0x67, 0x66, 0x3c, 0xcf, 0x80, 0xe5, 0xe2, 0x7c, + 0xbd, 0x2d, 0x61, 0x6c, 0x1e, 0xb6, 0x62, 0xfc, 0xcb, 0xe2, 0x81, 0x86, + 0xbd, 0xce, 0xb3, 0xea, 0xf1, 0x17, 0xc4, 0x18, 0x8d, 0xa2, 0xf0, 0x18, + 0x93, 0x61, 0x15, 0xba, 0x6e, 0x10, 0x70, 0x92, 0xfe, 0xcc, 0x6b, 0xb0, + 0xbb, 0x29, 0x54, 0xdb, 0xa7, 0x0c, 0x1b, 0xe8, 0xf6, 0x0b, 0xd0, 0xfa, + 0xd5, 0x5e, 0x30, 0xec, 0xa8, 0x09, 0xf0, 0x41, 0x15, 0x30, 0x68, 0x76, + 0xd0, 0x28, 0x1b, 0x1e, 0x2f, 0xf6, 0xae, 0x22, 0x62, 0x6c, 0x6d, 0x3f, + 0x04, 0x18, 0xaf, 0xf6, 0x42, 0x7a, 0x60, 0x2f, 0x24, 0x77, 0x30, 0xe1, + 0xbd, 0xb0, 0x71, 0x18, 0xda, 0x80, 0x3e, 0xa8, 0x5e, 0xb1, 0x06, 0xba, + 0x66, 0x6b, 0x4e, 0x5d, 0xbc, 0x62, 0x0d, 0xf4, 0xf4, 0xd5, 0x9c, 0xbc, + 0x7c, 0xc5, 0x1a, 0xe4, 0x32, 0xaa, 0x39, 0x75, 0xf1, 0x86, 0xb5, 0xda, + 0xff, 0xd0, 0x38, 0x6a, 0xa3, 0x94, 0xd5, 0x21, 0x81, 0xef, 0x9a, 0x04, + 0x05, 0x6e, 0xec, 0x2f, 0x46, 0xd5, 0xa7, 0xb4, 0x90, 0x71, 0xc9, 0xdc, + 0x15, 0x63, 0x5e, 0x35, 0xda, 0x2f, 0x85, 0x5d, 0x93, 0x60, 0xed, 0x06, + 0x78, 0xbe, 0x6d, 0x86, 0x81, 0x6a, 0x9c, 0x8b, 0x20, 0x6e, 0x49, 0x2a, + 0x5e, 0x3f, 0x05, 0x84, 0x2a, 0x7e, 0xc8, 0x5b, 0xc3, 0xd1, 0xdb, 0xd1, + 0xbe, 0xbf, 0x34, 0xff, 0xc5, 0x7f, 0xba, 0xd0, 0x75, 0x17, 0x51, 0x14, + 0xb3, 0xa7, 0x4c, 0xad, 0x17, 0x2d, 0xce, 0xc4, 0x4f, 0x82, 0xe3, 0x1b, + 0x8d, 0x81, 0xcb, 0x00, 0x4a, 0x0e, 0xb8, 0x80, 0x6f, 0x2f, 0xd6, 0x23, + 0xcf, 0x3a, 0xdd, 0x8d, 0x27, 0xe2, 0x02, 0xf8, 0x63, 0x94, 0x94, 0x95, + 0x44, 0x4f, 0xa2, 0xa2, 0xaf, 0xe8, 0x5f, 0x20, 0x69, 0x41, 0x96, 0x47, + 0x36, 0xa9, 0xe2, 0x3c, 0x43, 0xc5, 0xca, 0xd3, 0xf5, 0x32, 0x2b, 0x07, + 0x54, 0xe7, 0x23, 0x84, 0xe0, 0xc2, 0xa9, 0x7c, 0x59, 0x05, 0xbc, 0xdc, + 0xa0, 0x17, 0x1b, 0xf4, 0x56, 0xcc, 0x2f, 0x67, 0x5e, 0xaf, 0x12, 0x1f, + 0x1c, 0xb3, 0xf4, 0xae, 0xe4, 0xac, 0x20, 0xe7, 0x50, 0x38, 0xd4, 0xfe, + 0xa2, 0x14, 0x1f, 0x70, 0x59, 0x3f, 0x74, 0x77, 0x9b, 0x9b, 0x3c, 0x05, + 0x84, 0xd2, 0xdd, 0x9a, 0xf3, 0xc5, 0xe0, 0x4f, 0x65, 0xb4, 0x46, 0xe8, + 0x9b, 0xbe, 0xe6, 0xe3, 0x03, 0x78, 0x71, 0xdd, 0xa3, 0xe9, 0x03, 0xa4, + 0x66, 0xc7, 0x5a, 0xb5, 0xd4, 0x0a, 0x37, 0x15, 0x3e, 0x8a, 0xde, 0xdb, + 0x63, 0x74, 0xb7, 0xbc, 0x54, 0xcf, 0x85, 0xb4, 0xca, 0x3b, 0xc2, 0x9c, + 0xb7, 0xbd, 0xfc, 0x40, 0xac, 0x09, 0xf2, 0xa8, 0xbb, 0xea, 0xc5, 0xd2, + 0x1c, 0xdf, 0xe6, 0x45, 0x74, 0x14, 0xc9, 0x27, 0x9d, 0xee, 0xa5, 0x2c, + 0xba, 0xd9, 0x20, 0x8f, 0x30, 0x49, 0xaf, 0xdc, 0x13, 0xcb, 0xe3, 0x08, + 0x81, 0xe8, 0x8c, 0x52, 0x01, 0x8e, 0xfd, 0x87, 0xa1, 0x06, 0x31, 0xbe, + 0x97, 0xac, 0x92, 0x5e, 0x98, 0xc0, 0xc5, 0x0d, 0x2a, 0x24, 0xe4, 0xce, + 0x6a, 0xe5, 0x3d, 0xf0, 0x32, 0x2e, 0xf5, 0x4b, 0x76, 0xf9, 0x9a, 0x78, + 0x46, 0xf4, 0xc1, 0x36, 0x5d, 0x7a, 0x8e, 0xaf, 0x5d, 0x8e, 0xd9, 0x08, + 0x7a, 0x2f, 0x42, 0xab, 0xb7, 0x76, 0xcf, 0xc5, 0xfe, 0x11, 0x76, 0x36, + 0x4a, 0x8f, 0x33, 0x3a, 0x9e, 0xf3, 0x45, 0x1b, 0x13, 0x18, 0x74, 0x8a, + 0x22, 0x80, 0x80, 0x70, 0xdd, 0x8b, 0x7d, 0x18, 0xf6, 0xda, 0xa0, 0x81, + 0xcd, 0x6b, 0x89, 0xd9, 0x06, 0x8d, 0xb6, 0xb8, 0x5a, 0x23, 0xb6, 0xe4, + 0x15, 0x77, 0xc8, 0xda, 0xe2, 0xb5, 0x2c, 0x12, 0x97, 0x1d, 0xad, 0xca, + 0x24, 0xc4, 0xea, 0x42, 0xa1, 0x73, 0xd8, 0xaa, 0x73, 0x6f, 0x77, 0x52, + 0xff, 0xb8, 0xa1, 0xc0, 0x67, 0x79, 0xd8, 0x03, 0x2c, 0x80, 0x33, 0x9d, + 0x72, 0xf2, 0xf3, 0x25, 0xa0, 0x51, 0xfe, 0x7a, 0x09, 0x32, 0xe9, 0xe1, + 0x52, 0x83, 0x41, 0x80, 0x7b, 0x8e, 0x3e, 0x84, 0xa9, 0x23, 0xff, 0x68, + 0x18, 0xfd, 0xf2, 0x8b, 0x9e, 0x44, 0xbb, 0xf6, 0x38, 0x27, 0xa2, 0x24, + 0xf7, 0x30, 0xf4, 0xf0, 0xf5, 0x2e, 0x30, 0x24, 0x46, 0x91, 0xaf, 0x8f, + 0x9f, 0x7d, 0xf1, 0x59, 0x04, 0x7d, 0xfd, 0xb3, 0x2f, 0xde, 0xff, 0xc0, + 0x8a, 0xf4, 0x54, 0xf9, 0xc4, 0x4d, 0x76, 0x71, 0xff, 0xab, 0x5e, 0x89, + 0xff, 0xe0, 0x0f, 0x7b, 0x05, 0xd9, 0x46, 0xef, 0xbc, 0xc2, 0xc2, 0x7e, + 0x08, 0x18, 0x60, 0xce, 0x45, 0x34, 0x56, 0xd5, 0x2a, 0xb1, 0xd1, 0xbb, + 0x4b, 0x6f, 0xbb, 0xbd, 0x2d, 0x4e, 0x56, 0xea, 0x6f, 0x01, 0x3e, 0xe4, + 0xfc, 0x01, 0x58, 0xf0, 0xd0, 0x23, 0x69, 0x1f, 0x3e, 0x01, 0x6e, 0xe8, + 0xd5, 0xd7, 0xd7, 0xcf, 0xbe, 0xf8, 0xf2, 0xd3, 0x77, 0xbf, 0x37, 0x24, + 0xaf, 0xcc, 0x34, 0xc1, 0xcb, 0x37, 0xb4, 0x31, 0x8e, 0x98, 0xf6, 0xc4, + 0xac, 0xd4, 0x9e, 0xc3, 0x34, 0xab, 0x14, 0x56, 0xdc, 0xe2, 0x60, 0xe0, + 0x6a, 0xca, 0x74, 0xc0, 0x5d, 0x42, 0x99, 0x37, 0x55, 0x2a, 0xeb, 0xfa, + 0xba, 0xa8, 0xab, 0xd0, 0xfe, 0xe7, 0xdf, 0x1e, 0x0b, 0xe4, 0x3f, 0xa7, + 0xfc, 0x3e, 0xfd, 0x54, 0x3d, 0xa1, 0x99, 0xbe, 0xb0, 0x06, 0xb6, 0xd3, + 0x5c, 0xb3, 0x2b, 0x4a, 0x90, 0xda, 0xce, 0xd8, 0xaa, 0x43, 0x6a, 0x1d, + 0x25, 0xa0, 0x5b, 0x52, 0xeb, 0xfc, 0x97, 0xf5, 0xea, 0x0d, 0xa1, 0x57, + 0xcf, 0xbe, 0xf9, 0xd7, 0x54, 0x12, 0x81, 0x9b, 0xd6, 0xf2, 0x4d, 0x39, + 0x7a, 0x7c, 0x30, 0x1c, 0x1c, 0x0c, 0xff, 0x35, 0x35, 0x6d, 0xde, 0x9c, + 0x4f, 0xf6, 0x65, 0x45, 0x3f, 0x5c, 0xa4, 0xc9, 0x68, 0x7f, 0x38, 0xfa, + 0xd7, 0xd4, 0x95, 0x80, 0xeb, 0xe3, 0xff, 0xff, 0xe9, 0x1a, 0x20, 0xf0, + 0x5f, 0x56, 0x05, 0x2b, 0x74, 0xb2, 0x3d, 0xe3, 0xd9, 0x6f, 0xf4, 0x8a, + 0xbd, 0xb3, 0x3e, 0x3f, 0x6f, 0xe4, 0x93, 0x87, 0x07, 0xd2, 0x56, 0x12, + 0x6c, 0xaa, 0x07, 0xae, 0x20, 0x1b, 0x20, 0x54, 0xa8, 0xbe, 0x3b, 0x1b, + 0x76, 0x4b, 0x71, 0x57, 0x60, 0x01, 0x7e, 0xba, 0xda, 0xcc, 0xe7, 0x05, + 0x66, 0xe9, 0x84, 0xde, 0x65, 0x94, 0x6b, 0xd7, 0x82, 0x4f, 0xc0, 0x6b, + 0xb7, 0x2e, 0x23, 0xc4, 0xa6, 0x5c, 0x6a, 0x1a, 0xe1, 0x5d, 0xcb, 0x5e, + 0x19, 0xef, 0x6b, 0x5d, 0x3f, 0x0d, 0x60, 0x76, 0x50, 0xc7, 0x43, 0xc2, + 0x94, 0x63, 0x20, 0xf2, 0xb0, 0xb9, 0xa4, 0xc2, 0x70, 0xeb, 0x51, 0xe1, + 0xc0, 0x20, 0xc9, 0xa9, 0x32, 0x84, 0xfc, 0x1c, 0x8b, 0xbb, 0xe3, 0xf9, + 0x2c, 0x48, 0x65, 0x96, 0xc0, 0x7c, 0x21, 0xc3, 0x67, 0x0e, 0x17, 0x49, + 0x5a, 0x00, 0xe9, 0xec, 0x18, 0xb7, 0x90, 0x87, 0xac, 0xb7, 0xfe, 0x8b, + 0x98, 0x92, 0x02, 0x80, 0xf9, 0x0d, 0x17, 0x4c, 0x51, 0x3f, 0x84, 0x3e, + 0x0a, 0x9b, 0xb3, 0x72, 0x4f, 0x2e, 0x33, 0xe7, 0xb7, 0x12, 0x3f, 0x02, + 0x93, 0x20, 0x3a, 0xb9, 0x42, 0x76, 0x79, 0xd9, 0x77, 0xcd, 0x0b, 0x7c, + 0xd4, 0x6e, 0x2d, 0x16, 0xcf, 0x57, 0xe8, 0x65, 0xb2, 0x2c, 0x8f, 0x04, + 0x67, 0x89, 0x8d, 0x14, 0x07, 0x57, 0x96, 0x16, 0xde, 0x3b, 0x80, 0xc7, + 0xd7, 0x41, 0xbd, 0xa8, 0x7c, 0xb1, 0xd9, 0x83, 0xff, 0x72, 0x81, 0xcf, + 0x60, 0x3e, 0x22, 0x64, 0x68, 0x04, 0x7e, 0xf0, 0x05, 0xaf, 0xa2, 0x90, + 0x17, 0xb1, 0x10, 0xbe, 0x9b, 0xa6, 0x9f, 0xd3, 0xf5, 0x8c, 0x5b, 0x3b, + 0xc6, 0xaf, 0x0b, 0xe3, 0xd7, 0xec, 0xb4, 0xab, 0xd9, 0x9d, 0xe0, 0xbb, + 0x54, 0xcc, 0x43, 0x05, 0x13, 0x23, 0x93, 0x0b, 0xf3, 0xe7, 0x85, 0xf9, + 0x73, 0x36, 0x0a, 0x65, 0xe4, 0xa0, 0x84, 0x91, 0x2a, 0x4e, 0x0e, 0x4c, + 0x4e, 0xcc, 0x9f, 0x17, 0xe6, 0xcf, 0xd9, 0x81, 0xc1, 0xc9, 0x3d, 0x7e, + 0x0a, 0x7f, 0x15, 0x46, 0x38, 0xf6, 0x23, 0xe5, 0xb1, 0x82, 0xde, 0x95, + 0x4c, 0x57, 0x3f, 0x4f, 0xab, 0x96, 0x01, 0x8f, 0xf4, 0x98, 0xf7, 0x02, + 0x9a, 0xfc, 0x9c, 0xc9, 0x47, 0x29, 0xe8, 0x47, 0x15, 0xb0, 0x45, 0x06, + 0xe2, 0x1e, 0x89, 0xb4, 0xf8, 0xd1, 0xe8, 0x8c, 0xe0, 0x0c, 0xbf, 0x04, + 0x57, 0x9b, 0xf5, 0x0a, 0x08, 0x8b, 0x7a, 0xce, 0x0b, 0x71, 0xa4, 0x49, + 0xbe, 0x4d, 0x57, 0x51, 0xdc, 0xd9, 0x47, 0x41, 0x88, 0x7e, 0x0f, 0xd9, + 0x83, 0x7c, 0x7d, 0x9c, 0xa7, 0x60, 0xa1, 0x62, 0x70, 0x66, 0x0a, 0xe3, + 0xe9, 0x72, 0x01, 0x4b, 0x9b, 0xfe, 0x08, 0xd3, 0xbf, 0xde, 0x6c, 0xe0, + 0x14, 0x62, 0x9a, 0x25, 0xb1, 0x63, 0x54, 0x58, 0x90, 0xf0, 0xc5, 0x29, + 0x82, 0x79, 0x50, 0x20, 0x70, 0x92, 0xd4, 0x85, 0x52, 0x3d, 0x19, 0xc3, + 0xb2, 0x8c, 0x51, 0x59, 0x06, 0x34, 0x80, 0xcb, 0xcf, 0x7a, 0x75, 0x4c, + 0x3d, 0x9e, 0xda, 0x40, 0xb8, 0x5e, 0x33, 0xba, 0xcd, 0x0b, 0x9e, 0xfd, + 0x47, 0xc3, 0x7d, 0xcb, 0x66, 0xad, 0x4c, 0x28, 0x21, 0x0f, 0x36, 0x29, + 0x7d, 0xbe, 0x9f, 0x9c, 0x4f, 0xb7, 0xcb, 0x9c, 0x24, 0xc0, 0xd4, 0x04, + 0x08, 0x47, 0xbe, 0xc8, 0xd7, 0xdb, 0xf9, 0x25, 0x86, 0xdd, 0x64, 0x63, + 0xa5, 0xe8, 0x92, 0xb3, 0x3c, 0x09, 0x3f, 0x4d, 0xa1, 0xed, 0xd8, 0x64, + 0x61, 0x99, 0x90, 0x69, 0x4d, 0x7a, 0x6e, 0x9e, 0x46, 0x9f, 0x4d, 0xf3, + 0xcb, 0x01, 0x4d, 0x67, 0x62, 0x1d, 0xf3, 0x19, 0x96, 0x42, 0xa7, 0x72, + 0x83, 0x0d, 0x2c, 0x5e, 0xbf, 0x8b, 0xfa, 0x40, 0x7d, 0x00, 0x26, 0x12, + 0x4c, 0xc5, 0xa7, 0xc9, 0x79, 0xde, 0xed, 0x99, 0x94, 0x6e, 0x43, 0x29, + 0x7d, 0xcf, 0x94, 0x30, 0x6f, 0xd3, 0xd5, 0xac, 0xaa, 0x52, 0xf5, 0xf2, + 0xca, 0x93, 0xcb, 0x25, 0xac, 0x78, 0x8b, 0x8a, 0x89, 0x22, 0xbf, 0x0b, + 0xe1, 0x5c, 0x80, 0x7e, 0xef, 0xe7, 0x8d, 0xdb, 0x91, 0xdd, 0xfc, 0x63, + 0x17, 0xa1, 0x9e, 0xf6, 0xc9, 0x15, 0xd4, 0xf1, 0x7d, 0x68, 0xff, 0x18, + 0xf8, 0x1a, 0xdc, 0xf4, 0x22, 0xfc, 0xb8, 0x85, 0xf7, 0x4f, 0xf0, 0x5f, + 0x97, 0x1e, 0x0a, 0x21, 0x21, 0xf6, 0x3a, 0xfc, 0x5c, 0xd2, 0x60, 0x25, + 0xa7, 0x04, 0xcb, 0x57, 0x23, 0x19, 0x1c, 0xbf, 0x3d, 0x26, 0xd7, 0x3c, + 0xe8, 0x93, 0xc7, 0xcc, 0x94, 0xf8, 0x9c, 0x78, 0xd2, 0x81, 0xd2, 0xa0, + 0x37, 0x4a, 0x72, 0xa7, 0xd1, 0x84, 0x8b, 0xf7, 0x00, 0xa7, 0x26, 0x28, + 0x5f, 0xd6, 0x77, 0x20, 0x2f, 0x7c, 0x90, 0x43, 0x1f, 0xe4, 0xcc, 0x07, + 0x39, 0xf2, 0x41, 0x5e, 0x6b, 0x90, 0x3c, 0xf4, 0xf2, 0x55, 0x50, 0x93, + 0x23, 0xeb, 0xc6, 0xa7, 0xcb, 0x04, 0x5f, 0xec, 0x74, 0x8b, 0x75, 0xaf, + 0xb5, 0xb8, 0x67, 0x8a, 0xd8, 0x1a, 0x95, 0xe7, 0xa5, 0xfe, 0x93, 0x4f, + 0xef, 0x19, 0xac, 0x75, 0xa2, 0xe1, 0x86, 0x7f, 0x31, 0x4c, 0x89, 0xd4, + 0x2c, 0x43, 0xe1, 0x95, 0xb6, 0xd1, 0x8b, 0xd1, 0xaf, 0xf0, 0x49, 0xff, + 0x7e, 0x2f, 0x82, 0xff, 0xa4, 0xc9, 0xbe, 0x5e, 0x9c, 0xe5, 0x97, 0xc5, + 0xaf, 0xcb, 0x04, 0xc7, 0x7c, 0x6d, 0x10, 0x51, 0xb4, 0x43, 0x82, 0xeb, + 0xe8, 0xa5, 0x12, 0x9b, 0x94, 0x0e, 0xd5, 0x70, 0xa7, 0x5b, 0x0c, 0xf4, + 0x2d, 0x0e, 0x2c, 0xb1, 0x56, 0x62, 0x51, 0xe8, 0xde, 0xab, 0xaf, 0x4a, + 0xd0, 0x57, 0xa3, 0xf7, 0x01, 0x32, 0x93, 0x1d, 0x08, 0x47, 0x04, 0x95, + 0xb1, 0xc7, 0xb2, 0xd1, 0xa8, 0x19, 0xd6, 0x73, 0x9e, 0x40, 0xfd, 0xd3, + 0xef, 0xa2, 0x89, 0x51, 0xe3, 0x68, 0x2f, 0x1a, 0x8d, 0x6d, 0xa0, 0xef, + 0x01, 0xc8, 0x10, 0x84, 0x82, 0x72, 0xdf, 0xd5, 0x49, 0xaa, 0x3d, 0x85, + 0x19, 0x24, 0x4f, 0x2c, 0x89, 0xde, 0x59, 0x7f, 0x05, 0x27, 0xab, 0xdb, + 0xcc, 0x65, 0xe9, 0xf1, 0xe0, 0x50, 0x03, 0x85, 0xa3, 0x55, 0x0d, 0x34, + 0x36, 0x60, 0xfb, 0xf0, 0x9e, 0xbe, 0x6b, 0xb2, 0x47, 0xe0, 0xd1, 0x6c, + 0x9d, 0x82, 0xc2, 0x61, 0x22, 0x37, 0xfd, 0x2c, 0xb9, 0x58, 0xac, 0xbe, + 0x04, 0xab, 0x15, 0x77, 0x6d, 0x70, 0xd1, 0x76, 0x26, 0xf8, 0x34, 0x9d, + 0xbb, 0xf5, 0xd3, 0xb9, 0x21, 0xfd, 0x19, 0x41, 0xb3, 0x90, 0x25, 0xfc, + 0xf2, 0x93, 0x9e, 0x38, 0xe0, 0x64, 0xe2, 0xd4, 0x16, 0xf8, 0x1a, 0xd3, + 0x60, 0xea, 0x69, 0x14, 0x83, 0xc9, 0xcb, 0x28, 0x73, 0x15, 0x4d, 0xc9, + 0x82, 0x22, 0x90, 0x64, 0xe2, 0x85, 0xae, 0xc9, 0xc6, 0x72, 0xb1, 0x4a, + 0xbe, 0xa5, 0xca, 0x4e, 0xa2, 0xc7, 0x63, 0x33, 0x4f, 0x3c, 0x7f, 0x3f, + 0xc6, 0x15, 0x36, 0xe4, 0x76, 0x5e, 0xdc, 0xa7, 0xbf, 0x8e, 0x17, 0x2a, + 0xee, 0x5a, 0xc9, 0xf4, 0xe4, 0xba, 0x10, 0x47, 0xc1, 0xf3, 0xf9, 0x62, + 0xb9, 0x14, 0x4e, 0xc8, 0x66, 0xc9, 0x74, 0x9b, 0x2f, 0xce, 0xb7, 0x4b, + 0xe5, 0xfb, 0x55, 0x81, 0xe4, 0xd3, 0x1f, 0x93, 0x15, 0xbd, 0x05, 0xa5, + 0x4b, 0x2a, 0x4f, 0xa3, 0xcb, 0x3c, 0xdf, 0x3c, 0x85, 0xc7, 0xe8, 0x39, + 0xac, 0xf2, 0x61, 0x8c, 0x4d, 0xcf, 0x97, 0xeb, 0x6b, 0xb0, 0x4a, 0x57, + 0x7b, 0x3f, 0x6d, 0x93, 0x8c, 0x4e, 0x46, 0xf7, 0x86, 0x6f, 0x8c, 0x9e, + 0x1c, 0xbe, 0xb1, 0xff, 0x78, 0x6f, 0xb6, 0x5d, 0x2c, 0xf1, 0x40, 0xbd, + 0x3f, 0xed, 0x13, 0xd9, 0x3e, 0xcd, 0xa9, 0xfa, 0x8b, 0x55, 0xff, 0x32, + 0xbf, 0x5a, 0x1e, 0x5a, 0x21, 0xd8, 0xc0, 0x38, 0x2c, 0x85, 0x89, 0x91, + 0x5f, 0xdf, 0x82, 0x09, 0xe4, 0x93, 0xe2, 0xd7, 0x6b, 0xd6, 0xdc, 0x9a, + 0x43, 0xed, 0xbe, 0x2b, 0x11, 0x63, 0x01, 0xd8, 0x87, 0xf9, 0x2f, 0xb7, + 0x14, 0x68, 0xcc, 0xf0, 0x0d, 0xdb, 0x1b, 0x3c, 0xcc, 0x42, 0x15, 0x12, + 0xe1, 0x94, 0x82, 0xfb, 0x35, 0xca, 0xcd, 0xc5, 0xe9, 0xc6, 0xb3, 0xb5, + 0xa3, 0x43, 0x0a, 0xd4, 0xd6, 0x35, 0x73, 0x80, 0x55, 0x58, 0x6e, 0x2a, + 0x90, 0x30, 0x53, 0x75, 0x9d, 0xb4, 0x72, 0x58, 0x14, 0x56, 0x06, 0x54, + 0xd6, 0x97, 0x4c, 0x0a, 0xcc, 0x49, 0xcc, 0xaa, 0x5f, 0x6d, 0xdc, 0x5c, + 0xd4, 0x9e, 0x42, 0x1f, 0x2f, 0xb3, 0x65, 0x0c, 0x63, 0x92, 0x6a, 0x2b, + 0x3c, 0xd8, 0x46, 0xcf, 0x0f, 0x78, 0xe3, 0xe0, 0xe5, 0x6e, 0xa7, 0x04, + 0x3b, 0x0e, 0x2b, 0xf4, 0x9e, 0x55, 0x16, 0x8d, 0x49, 0x93, 0x2e, 0x9f, + 0x5f, 0x2e, 0xb2, 0x41, 0x75, 0x2f, 0x4f, 0x85, 0x30, 0x75, 0xf9, 0xb1, + 0xc8, 0x80, 0xfa, 0x16, 0xe1, 0x8e, 0x96, 0xf0, 0x28, 0xfa, 0x7a, 0x81, + 0x3d, 0x3e, 0xc4, 0x72, 0x00, 0x97, 0xe1, 0x96, 0x03, 0x25, 0x81, 0x46, + 0x41, 0xa2, 0xb3, 0x35, 0xbc, 0xba, 0x7d, 0x7e, 0x81, 0xdc, 0x41, 0x32, + 0xcf, 0xa1, 0x64, 0xc4, 0xc1, 0x4f, 0xc1, 0x54, 0x4c, 0xd3, 0x8f, 0x44, + 0xb6, 0x1a, 0xe0, 0x86, 0xaf, 0xe3, 0xa7, 0x22, 0xcd, 0xe8, 0x14, 0x59, + 0x46, 0xbc, 0x5a, 0xca, 0xd7, 0x1b, 0x04, 0x86, 0x03, 0x67, 0x0c, 0xca, + 0x52, 0x0b, 0x0a, 0xb3, 0x32, 0x75, 0xc0, 0x4c, 0x86, 0xa3, 0xa4, 0xfd, + 0x75, 0x02, 0xe3, 0x52, 0x28, 0x45, 0x0a, 0x20, 0xbc, 0x9a, 0xe0, 0xd8, + 0x52, 0xd9, 0xda, 0x68, 0x16, 0xcb, 0x0d, 0xe5, 0x68, 0x77, 0x86, 0xb2, + 0x76, 0x60, 0x16, 0x66, 0xdc, 0x3f, 0x34, 0xf3, 0x6c, 0x40, 0x19, 0xad, + 0x65, 0x92, 0x4b, 0x6d, 0xf3, 0x0d, 0xcd, 0x0c, 0xb3, 0xc0, 0x29, 0xb2, + 0xd3, 0xe2, 0x3c, 0x71, 0x06, 0x6d, 0x2a, 0xb4, 0x96, 0xbf, 0x77, 0x99, + 0x02, 0x4d, 0x15, 0x81, 0x00, 0x11, 0x52, 0x73, 0x6a, 0xcd, 0xda, 0x22, + 0xc8, 0x0d, 0xe4, 0xf7, 0x05, 0xe6, 0x18, 0x7e, 0xbc, 0x15, 0x15, 0xdf, + 0xcd, 0x03, 0x76, 0xc6, 0xb8, 0xd5, 0x31, 0x6e, 0x35, 0x8c, 0x5b, 0x0b, + 0x43, 0x71, 0x71, 0x92, 0xc2, 0xec, 0xfe, 0x72, 0x81, 0x13, 0xd4, 0x9b, + 0xdb, 0xd1, 0x66, 0xbd, 0x9c, 0xa6, 0x31, 0x4c, 0xf8, 0x6f, 0x91, 0x53, + 0xcf, 0xcb, 0xfc, 0xe8, 0x6d, 0x49, 0xb1, 0xec, 0xfe, 0x58, 0xf6, 0xe3, + 0x62, 0x43, 0x6e, 0x87, 0x81, 0xca, 0x6d, 0x17, 0xc4, 0x03, 0x56, 0x60, + 0xb1, 0x02, 0xd1, 0x64, 0xa0, 0x2c, 0xd3, 0x1c, 0xc6, 0x57, 0x1a, 0x7d, + 0xb3, 0xc5, 0x19, 0x7c, 0x9e, 0x6b, 0xe3, 0xac, 0xd7, 0x03, 0x16, 0x4c, + 0xed, 0xb6, 0x9e, 0x1b, 0x4a, 0x6e, 0x35, 0xce, 0xe8, 0xb9, 0x03, 0xb0, + 0x36, 0x82, 0x6f, 0x31, 0x54, 0xc8, 0xe1, 0x9f, 0x76, 0xd1, 0x16, 0x17, + 0x5b, 0x51, 0x3e, 0x15, 0x4c, 0xd6, 0x04, 0xef, 0x92, 0xd1, 0xf6, 0xa2, + 0x60, 0x67, 0x91, 0x45, 0x9b, 0xc5, 0x4d, 0xb2, 0x84, 0x34, 0x82, 0xa1, + 0xe6, 0x11, 0x6d, 0x45, 0x1e, 0x6d, 0x06, 0x6e, 0xd9, 0xe9, 0xfa, 0xfa, + 0x53, 0x71, 0x01, 0x73, 0xa2, 0x35, 0xf5, 0xd8, 0x05, 0x9c, 0x9e, 0xfd, + 0xb0, 0xcd, 0xf2, 0xe4, 0x0c, 0x66, 0x7d, 0xd0, 0x9a, 0xaf, 0x29, 0x40, + 0x39, 0x89, 0x83, 0x71, 0x1a, 0x5a, 0x5c, 0x0c, 0xe3, 0x27, 0xfd, 0x43, + 0x72, 0x32, 0x7a, 0x8a, 0x2e, 0x5e, 0x4e, 0xf6, 0xd1, 0x4e, 0xc3, 0xf7, + 0x18, 0x18, 0xd2, 0x25, 0x0a, 0x1c, 0x7b, 0x79, 0xec, 0x96, 0x17, 0x8d, + 0x73, 0xc9, 0x5b, 0x7f, 0xd1, 0xb7, 0x3b, 0x2a, 0x9a, 0xc4, 0xc9, 0x33, + 0x26, 0x2c, 0x32, 0x81, 0x0d, 0x60, 0x29, 0xe6, 0x34, 0xf9, 0x69, 0xbb, + 0x48, 0x81, 0xe0, 0xe3, 0x28, 0x5b, 0xae, 0xf3, 0x4c, 0xc9, 0x9d, 0x49, + 0xba, 0x14, 0xa9, 0xb9, 0x68, 0x2e, 0xa1, 0x04, 0x0a, 0x35, 0x8a, 0xb9, + 0x8a, 0xaf, 0x72, 0x93, 0x74, 0x71, 0x96, 0xc1, 0x1c, 0x8c, 0x7d, 0xba, + 0x73, 0x49, 0x8b, 0x26, 0xd0, 0x1b, 0x4f, 0x93, 0x65, 0x53, 0xd8, 0xa0, + 0x99, 0x4a, 0xcf, 0x62, 0x69, 0xb4, 0x57, 0xde, 0xb8, 0x6a, 0xf1, 0x35, + 0x1c, 0xec, 0x7b, 0x4b, 0x39, 0x81, 0x45, 0x52, 0x4f, 0xac, 0xf0, 0x7a, + 0xb4, 0x96, 0xa3, 0xc5, 0x6b, 0xf6, 0xf3, 0x08, 0xd6, 0xcc, 0x31, 0xb0, + 0xd0, 0xd3, 0xca, 0xea, 0x09, 0x6a, 0x5d, 0x9f, 0x0e, 0x2d, 0x37, 0x97, + 0x53, 0x54, 0xb4, 0xc3, 0x43, 0xbb, 0x18, 0x92, 0xd9, 0x09, 0x09, 0x07, + 0x69, 0x43, 0x79, 0xe3, 0xb2, 0x7c, 0x90, 0xd7, 0x10, 0x60, 0x04, 0x3b, + 0x55, 0x50, 0x23, 0x80, 0x22, 0x6e, 0xab, 0x80, 0x0e, 0x00, 0x48, 0x30, + 0x56, 0xb6, 0xbb, 0x6c, 0x8e, 0xf1, 0x9b, 0xad, 0xb6, 0xc3, 0x40, 0x1a, + 0x44, 0x23, 0xe3, 0xbe, 0xb5, 0xa1, 0x6b, 0x1a, 0x24, 0xd3, 0x42, 0x43, + 0x81, 0x34, 0x56, 0x67, 0x3f, 0xa5, 0x79, 0x7c, 0x03, 0x6d, 0x8c, 0x7c, + 0xdc, 0xc2, 0xe7, 0xad, 0x6e, 0x62, 0xc1, 0x0e, 0x28, 0x40, 0x28, 0x6a, + 0x35, 0x8a, 0x61, 0x0f, 0xe3, 0x86, 0x00, 0x78, 0xef, 0x4d, 0x19, 0x40, + 0xab, 0x6c, 0x65, 0x4a, 0xe0, 0x53, 0x77, 0x4e, 0x0b, 0x3f, 0x41, 0xfd, + 0xa0, 0x93, 0xfc, 0xfe, 0x5b, 0x2f, 0xfa, 0xfd, 0xb7, 0x53, 0x48, 0x80, + 0xe5, 0xb2, 0xca, 0x56, 0x34, 0x01, 0x11, 0x04, 0x4b, 0x80, 0x50, 0x2f, + 0x98, 0x1f, 0x33, 0x1c, 0x17, 0x1c, 0x23, 0x6d, 0xe0, 0x5a, 0xce, 0x39, + 0x70, 0xd9, 0x14, 0x6b, 0x73, 0x10, 0xd2, 0x5c, 0x40, 0xb5, 0xf8, 0xaa, + 0xd6, 0x18, 0x43, 0x48, 0xf3, 0x4b, 0xe8, 0xcf, 0xa0, 0x2b, 0x22, 0x0b, + 0xa8, 0x31, 0xb8, 0x26, 0x23, 0x20, 0x34, 0x04, 0x18, 0xf8, 0x00, 0x06, + 0xa0, 0x38, 0xce, 0x81, 0x2e, 0x26, 0x69, 0x00, 0x6e, 0x3c, 0x8c, 0xfa, + 0x52, 0x92, 0xb3, 0x2c, 0x8e, 0x09, 0xeb, 0x65, 0x9c, 0xc4, 0xf7, 0x61, + 0xc6, 0xaf, 0xcb, 0x3c, 0x1d, 0x82, 0x96, 0xc3, 0xff, 0xb3, 0xa1, 0xb1, + 0x01, 0x48, 0x08, 0x6f, 0xc3, 0xc2, 0x01, 0x6e, 0x69, 0x51, 0x99, 0xae, + 0xbf, 0xc5, 0xf8, 0x84, 0x71, 0x51, 0xa3, 0x4e, 0x44, 0xe1, 0xd0, 0x64, + 0xa0, 0x1b, 0xa7, 0xe6, 0x7a, 0xdd, 0xa0, 0x39, 0xd4, 0x69, 0x8e, 0xaa, + 0x69, 0x02, 0x2d, 0x49, 0xb6, 0x9a, 0xe6, 0x48, 0xa7, 0x79, 0x50, 0x4d, + 0x73, 0x9f, 0x69, 0xde, 0x54, 0xd1, 0x3c, 0xd0, 0x69, 0x3e, 0xae, 0xa5, + 0x59, 0xb0, 0x5a, 0x45, 0xf3, 0xb1, 0x4e, 0xf3, 0xb0, 0xb6, 0xee, 0xfb, + 0x21, 0x34, 0x0f, 0x75, 0x9a, 0x4f, 0xc2, 0xda, 0x68, 0x9f, 0xeb, 0x4e, + 0x9d, 0x9e, 0x15, 0xe2, 0xaa, 0xd0, 0xc0, 0xbe, 0x2c, 0x9b, 0xa0, 0x78, + 0xfa, 0x71, 0x01, 0xc4, 0x88, 0x16, 0xf9, 0x6a, 0xba, 0x82, 0x04, 0xf9, + 0x39, 0xa3, 0xcf, 0x53, 0x6d, 0xd6, 0xa9, 0xee, 0xef, 0xa7, 0xbd, 0x8b, + 0xde, 0x8c, 0xa8, 0x2a, 0x1f, 0x4b, 0x20, 0xb0, 0xa1, 0x1a, 0xb2, 0xc0, + 0x36, 0x9e, 0x9a, 0x7d, 0x1c, 0x52, 0x40, 0x87, 0xa1, 0x2c, 0xf1, 0xe5, + 0x42, 0x7e, 0x81, 0x72, 0x9d, 0x7d, 0x71, 0x7a, 0x1c, 0xb2, 0x84, 0x31, + 0x2e, 0x46, 0x07, 0x9b, 0xfa, 0x3e, 0x16, 0x25, 0x0c, 0xf0, 0x9f, 0x67, + 0x6a, 0x93, 0x89, 0x5a, 0x94, 0x92, 0x69, 0xbc, 0x5a, 0xac, 0x0a, 0x97, + 0x52, 0x03, 0xd3, 0xc7, 0x3c, 0x03, 0x95, 0x3b, 0xb2, 0x3b, 0x29, 0x60, + 0x4e, 0x95, 0x1c, 0xab, 0xca, 0x26, 0xad, 0x2f, 0x92, 0xe9, 0x12, 0x12, + 0x3d, 0x3d, 0x39, 0x3e, 0xfa, 0xea, 0x93, 0x2f, 0x9f, 0xe1, 0xbe, 0x57, + 0xb5, 0xc3, 0x79, 0x42, 0x9d, 0x63, 0x30, 0x72, 0x7c, 0x49, 0x57, 0xed, + 0x7a, 0x9e, 0x85, 0x62, 0x61, 0xc1, 0xad, 0x4e, 0xdf, 0x8d, 0x05, 0x12, + 0xaa, 0x3a, 0xbb, 0x71, 0x83, 0x0e, 0x74, 0xde, 0xff, 0xe2, 0x33, 0x3a, + 0x91, 0x81, 0xb4, 0xf5, 0xf4, 0x2c, 0x39, 0x83, 0x95, 0xa8, 0x6a, 0x80, + 0xe2, 0x28, 0x82, 0xdb, 0x1c, 0x0a, 0xc2, 0x96, 0x4d, 0xb7, 0xab, 0x28, + 0x5b, 0xac, 0xe6, 0x49, 0x04, 0xe8, 0xe8, 0x13, 0x6f, 0x49, 0xb8, 0x14, + 0xe8, 0x22, 0x45, 0xff, 0x7f, 0x72, 0x13, 0x35, 0xc9, 0xe9, 0xdd, 0x8e, + 0x5a, 0x37, 0x50, 0x9e, 0xba, 0x38, 0x5f, 0xe5, 0xc4, 0x94, 0x3d, 0x03, + 0x3e, 0x8c, 0xcb, 0x4d, 0x50, 0x81, 0x01, 0xb2, 0x48, 0xdc, 0x14, 0x4b, + 0x49, 0xc3, 0x89, 0x60, 0xc1, 0xb1, 0x78, 0x25, 0xaf, 0x58, 0x31, 0x17, + 0x1e, 0xd0, 0xc9, 0x55, 0xa8, 0x3c, 0x6b, 0x1f, 0x50, 0xe5, 0x94, 0x87, + 0x0f, 0x87, 0x86, 0xd0, 0xdb, 0xe7, 0xad, 0xbd, 0x6c, 0x9e, 0x2e, 0x36, + 0xf9, 0xdb, 0x90, 0x44, 0x3f, 0x67, 0xeb, 0xb3, 0x5b, 0xf8, 0xf1, 0xd6, + 0x1e, 0x6e, 0xf6, 0xc0, 0x97, 0x3f, 0x00, 0xb5, 0x95, 0x2d, 0xd2, 0x23, + 0xa0, 0x01, 0x00 }; diff --git a/Arduino/McLighting/json_functions.h b/Arduino/McLighting/json_functions.h new file mode 100644 index 0000000..cbd5a46 --- /dev/null +++ b/Arduino/McLighting/json_functions.h @@ -0,0 +1,269 @@ +#include //https://github.com/bblanchon/ArduinoJson + +#if defined(ARDUINOJSON_VERSION) + #if !(ARDUINOJSON_VERSION_MAJOR == 6 and ARDUINOJSON_VERSION_MINOR >= 8) + #error "Install ArduinoJson v6.8.x or higher" + #endif +#endif + +char * listStateJSONfull() { + const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(20) + 250; + DynamicJsonDocument jsonBuffer(bufferSize); + JsonObject root = jsonBuffer.to(); + root["segment"] = segment; + root["start"] = seg_start; + root["stop"] = seg_stop; + root["mode"] = (uint8_t) mode; + //getSegmentParams(segment); + root["ws2812fx_mode"] = ws2812fx_mode; + root["ws2812fx_mode_name"] = strip->getModeName(ws2812fx_mode); + root["speed"] = ws2812fx_speed; + root["brightness"] = brightness; + JsonArray color = root.createNestedArray("color"); + color.add(main_color.white); + color.add(main_color.red); + color.add(main_color.green); + color.add(main_color.blue); + color.add(back_color.white); + color.add(back_color.red); + color.add(back_color.green); + color.add(back_color.blue); + color.add(xtra_color.white); + color.add(xtra_color.red); + color.add(xtra_color.green); + color.add(xtra_color.blue); + root["hostname"] = HOSTNAME; + #if defined(ENABLE_MQTT) + root["mqtt_host"] = mqtt_host; + root["mqtt_port"] = mqtt_port; + root["mqtt_user"] = mqtt_user; + root["mqtt_pass"] = mqtt_pass; + #endif + root["ws_seg"] = num_segments; + root["ws_cnt"] = WS2812FXStripSettings.stripSize; + root["ws_rgbo"] = WS2812FXStripSettings.RGBOrder; + root["ws_pin"] = WS2812FXStripSettings.pin; + root["ws_fxopt"] = WS2812FXStripSettings.fxoptions; + root["transEffect"] = transEffect; + uint16_t msg_len = measureJson(root) + 1; + char * buffer = (char *) malloc(msg_len); + serializeJson(root, buffer, msg_len); + jsonBuffer.clear(); + return buffer; +} + +char * listStateJSON() { + const size_t bufferSize = JSON_OBJECT_SIZE(3) + 25; + DynamicJsonDocument jsonBuffer(bufferSize); + JsonObject root = jsonBuffer.to(); + root["segment"] = segment; + root["mode"] = (uint8_t) mode; + root["brightness"] = brightness; + uint16_t msg_len = measureJson(root) + 1; + char * buffer = (char *) malloc(msg_len); + serializeJson(root, buffer, msg_len); + jsonBuffer.clear(); + return buffer; +} + +char * listSegmentStateJSON(uint8_t seg) { + const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(7) + 100; + DynamicJsonDocument jsonBuffer(bufferSize); + JsonObject root = jsonBuffer.to(); + root["segment"] = seg; + if (seg == segment) { + root["start"] = seg_start; + root["stop"] = seg_stop; + } else { + root["start"] = strip->getSegment(seg)->start; + root["stop"] = strip->getSegment(seg)->stop; + } + //getSegmentParams(seg); + root["ws2812fx_mode"] = strip->getMode(seg); + root["ws2812fx_mode_name"] = strip->getModeName(strip->getMode(seg)); + root["speed"] = ws2812fx_speed; + JsonArray color = root.createNestedArray("color"); + color.add((strip->getColors(seg)[0] >> 24) & 0xFF); + color.add((strip->getColors(seg)[0] >> 16) & 0xFF); + color.add((strip->getColors(seg)[0] >> 8) & 0xFF); + color.add((strip->getColors(seg)[0]) & 0xFF); + color.add((strip->getColors(seg)[1] >> 24) & 0xFF); + color.add((strip->getColors(seg)[1] >> 16) & 0xFF); + color.add((strip->getColors(seg)[1] >> 8) & 0xFF); + color.add((strip->getColors(seg)[1]) & 0xFF); + color.add((strip->getColors(seg)[2] >> 24) & 0xFF); + color.add((strip->getColors(seg)[2] >> 16) & 0xFF); + color.add((strip->getColors(seg)[2] >> 8) & 0xFF); + color.add((strip->getColors(seg)[2]) & 0xFF); + uint16_t msg_len = measureJson(root) + 1; + char * buffer = (char *) malloc(msg_len); + serializeJson(root, buffer, msg_len); + jsonBuffer.clear(); + return buffer; +} + +void getStateJSON() { + char * buffer = listStateJSONfull(); + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send ( 200, "application/json", buffer); + free (buffer); +} + +char * listConfigJSON() { + #if defined(ENABLE_MQTT) + const size_t bufferSize = JSON_OBJECT_SIZE(11) + 150; + #else + const size_t bufferSize = JSON_OBJECT_SIZE(7) + 100; + #endif + DynamicJsonDocument jsonBuffer(bufferSize); + JsonObject root = jsonBuffer.to(); + root["hostname"] = HOSTNAME; + #if defined(ENABLE_MQTT) + root["mqtt_host"] = mqtt_host; + root["mqtt_port"] = mqtt_port; + root["mqtt_user"] = mqtt_user; + root["mqtt_pass"] = mqtt_pass; + #endif + root["ws_seg"] = num_segments; + root["ws_cnt"] = WS2812FXStripSettings.stripSize; + root["ws_rgbo"] = WS2812FXStripSettings.RGBOrder; + root["ws_pin"] = WS2812FXStripSettings.pin; + root["ws_fxopt"] = WS2812FXStripSettings.fxoptions; + root["transEffect"] = transEffect; + uint16_t msg_len = measureJson(root) + 1; + char * buffer = (char *) malloc(msg_len); + serializeJson(root, buffer, msg_len); + jsonBuffer.clear(); + return buffer; +} + +void getConfigJSON() { + char * buffer = listConfigJSON(); + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send ( 200, "application/json", buffer); + free (buffer); +} + +char * listModesJSON() { + const size_t bufferSize = JSON_ARRAY_SIZE(strip->getModeCount() + 1) + (strip->getModeCount() + 1)*JSON_OBJECT_SIZE(2) + 2000; + DynamicJsonDocument jsonBuffer(bufferSize); + JsonArray root = jsonBuffer.to(); + JsonObject objectoff = root.createNestedObject(); + objectoff["mode"] = "off"; + objectoff["name"] = "OFF"; + for (uint8_t i = 0; i < strip->getModeCount(); i++) { + JsonObject object = root.createNestedObject(); + object["mode"] = i; + object["name"] = strip->getModeName(i); + } + uint16_t msg_len = measureJson(root) + 1; + char * buffer = (char *) malloc(msg_len); + serializeJson(root, buffer, msg_len); + jsonBuffer.clear(); + return buffer; +} + +void getModesJSON() { + char * buffer = listModesJSON(); + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send ( 200, "application/json", buffer); + free (buffer); +} + +char * listESPStateJSON() { + const size_t bufferSize = JSON_OBJECT_SIZE(31) + 1500; + DynamicJsonDocument jsonBuffer(bufferSize); + JsonObject root = jsonBuffer.to(); + root["HOSTNAME"] = HOSTNAME; + root["version"] = SKETCH_VERSION; + root["heap"] = ESP.getFreeHeap(); + root["sketch_size"] = ESP.getSketchSize(); + root["free_sketch_space"] = ESP.getFreeSketchSpace(); + root["flash_chip_size"] = ESP.getFlashChipSize(); + root["flash_chip_real_size"] = ESP.getFlashChipRealSize(); + root["flash_chip_speed"] = ESP.getFlashChipSpeed(); + root["sdk_version"] = ESP.getSdkVersion(); + root["core_version"] = ESP.getCoreVersion(); + root["cpu_freq"] = ESP.getCpuFreqMHz(); + root["chip_id"] = ESP.getFlashChipId(); + #if defined(USE_WS2812FX_DMA) + #if USE_WS2812FX_DMA == 0 + root["animation_lib"] = "WS2812FX_DMA"; + #endif + #if USE_WS2812FX_DMA == 1 + root["animation_lib"] = "WS2812FX_UART1"; + #endif + #if USE_WS2812FX_DMA == 2 + root["animation_lib"] = "WS2812FX_UART2"; + #endif + #else + root["animation_lib"] = "WS2812FX"; + #endif + root["ws2812_pin"] = WS2812FXStripSettings.pin; + root["led_count"] = WS2812FXStripSettings.stripSize; + root["rgb_order"] = WS2812FXStripSettings.RGBOrder; + if (strstr(WS2812FXStripSettings.RGBOrder, "W") != NULL) { + root["rgbw_mode"] = "ON"; + } else { + root["rgbw_mode"] = "OFF"; + } + #if defined(ENABLE_BUTTON) + root["button_mode"] = "ON"; + root["button_pin"] = ENABLE_BUTTON; + #else + root["button_mode"] = "OFF"; + #endif + #if defined(ENABLE_BUTTON_GY33) + root["button_gy33"] = "ON"; + root["gy33_pin"] = ENABLE_BUTTON_GY33; + #else + root["button_gy33"] = "OFF"; + #endif + #if defined(ENABLE_REMOTE) + root["ir_remote"] = "ON"; + root["tsop_ir_pin"] = ENABLE_REMOTE; + #else + root["ir_remote"] = "OFF"; + #endif + #if defined(ENABLE_MQTT) + #if ENABLE_MQTT == 0 + root["mqtt"] = "MQTT"; + #endif + #if ENABLE_MQTT == 1 + root["mqtt"] = "AMQTT"; + #endif + #else + root["mqtt"] = "OFF"; + #endif + #if defined(ENABLE_HOMEASSISTANT) + root["home_assistant"] = "ON"; + #else + root["home_assistant"] = "OFF"; + #endif + #if defined(ENABLE_OTA) + #if ENABLE_OTA == 0 + root["ota"] = "ARDUINO"; + #endif + #if ENABLE_OTA == 1 + root["ota"] = "HTTP"; + #endif + #else + root["ota"] = "OFF"; + #endif + #if defined(ENABLE_STATE_SAVE) + root["state_save"] = "SPIFFS"; + #else + root["state_save"] = "OFF"; + #endif + uint16_t msg_len = measureJson(root) + 1; + char * buffer = (char *) malloc(msg_len); + serializeJson(root, buffer, msg_len); + jsonBuffer.clear(); + return buffer; +} +void getESPStateJSON() { + char * buffer = listESPStateJSON(); + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send(200, "application/json", buffer); + free (buffer); +} diff --git a/Arduino/McLighting/mode_custom_ws2812fx_animations.h b/Arduino/McLighting/mode_custom_ws2812fx_animations.h index 1e57ea7..eab6ee2 100644 --- a/Arduino/McLighting/mode_custom_ws2812fx_animations.h +++ b/Arduino/McLighting/mode_custom_ws2812fx_animations.h @@ -1,3 +1,7 @@ +// Prototypes +uint16_t convertSpeed(uint8_t mcl_speed); +uint32_t trans(uint32_t newcolor, uint32_t oldcolor, uint8_t level); +// End Prototypes /* Example of adding the example: https://github.com/kitesurfer1404/WS2812FX/blob/master/examples/ws2812fx_custom_FastLED/ws2812fx_custom_FastLED.ino @@ -68,7 +72,7 @@ void hsb2rgbAN1(uint16_t index, uint8_t sat, uint8_t bright, uint16_t led) { void updateLed (uint16_t led, uint8_t brightness) { ledstates[led] = brightness; - for (uint16_t i=0; i= 2; k--) { + for( uint16_t k= seg_stop-seg_start - 1; k >= 2; k--) { ledstates[k] = (ledstates[k - 1] + ledstates[k - 2] + ledstates[k - 2]) / 3; } @@ -216,11 +220,11 @@ void Fire2012() { } // Step 4. Map from heat cells to LED colors - for( uint16_t j = 0; j < WS2812FXStripSettings.stripSize; j++) { + for( uint16_t j = seg_start; j <= seg_stop; j++) { CRGB color = HeatColor( ledstates[j]); uint16_t pixelnumber; if( gReverseDirection ) { - pixelnumber = (WS2812FXStripSettings.stripSize - 1) - j; + pixelnumber = seg_stop - j; } else { pixelnumber = j; } @@ -229,15 +233,15 @@ void Fire2012() { } void Gradient() { - for( uint16_t j = 0; j < WS2812FXStripSettings.stripSize; j++) { + for( uint16_t j = seg_start; j <= seg_stop; j++) { uint16_t pixelnumber; uint32_t color; if( gReverseDirection ) { - pixelnumber = (WS2812FXStripSettings.stripSize - 1) - j; + pixelnumber = seg_stop - j; } else { pixelnumber = j; } - color = trans(strip->getColors(segment)[1], strip->getColors(segment)[0], (j*255)/(WS2812FXStripSettings.stripSize - 1)); + color = trans(strip->getColors(segment)[1], strip->getColors(segment)[0], (j*255)/(seg_stop - seg_start)); strip->setPixelColor(pixelnumber, ((color >> 16) & 0xFF), ((color >> 8) & 0xFF), ((color >> 0) & 0xFF), ((color >> 24) & 0xFF)); } } diff --git a/Arduino/McLighting/request_handlers.h b/Arduino/McLighting/request_handlers.h index fa52a32..f636a02 100644 --- a/Arduino/McLighting/request_handlers.h +++ b/Arduino/McLighting/request_handlers.h @@ -1,230 +1,61 @@ // *************************************************************************** // Request handlers // *************************************************************************** - -// Prototypes -char * listStatusJSON(); -#if defined(ENABLE_STATE_SAVE) - bool writeConfigFS(bool); - void tickerSaveConfig(); -#endif - -// Call convertColors whenever main_color, back_color or xtra_color changes. - -void convertColors() { - hex_colors_trans[0] = (uint32_t)(main_color.white << 24) | (main_color.red << 16) | (main_color.green << 8) | main_color.blue; - hex_colors_trans[1] = (uint32_t)(back_color.white << 24) | (back_color.red << 16) | (back_color.green << 8) | back_color.blue; - hex_colors_trans[2] = (uint32_t)(xtra_color.white << 24) | (xtra_color.red << 16) | (xtra_color.green << 8) | xtra_color.blue; -} - -uint32_t* convertColors2(uint8_t w, uint8_t r, uint8_t g, uint8_t b, uint8_t w2, uint8_t r2, uint8_t g2, uint8_t b2, uint8_t w3, uint8_t r3, uint8_t g3, uint8_t b3) { - uint32_t hexcolors[3] = {}; - hexcolors[0] = (uint32_t)(w << 24) | (r << 16) | (g << 8) | b; - hexcolors[1] = (uint32_t)(w2 << 24) | (r2 << 16) | (g2 << 8) | b2; - hexcolors[2] = (uint32_t)(w3 << 24) | (r3 << 16) | (g3 << 8) | b3; - return hexcolors; -} - - -void getSegmentParams(uint8_t seg) { - ws2812fx_mode = strip->getMode(seg); - main_color.white = ((strip->getColors(seg)[0] >> 24) & 0xFF); - main_color.red = ((strip->getColors(seg)[0] >> 16) & 0xFF); - main_color.green = ((strip->getColors(seg)[0] >> 8) & 0xFF); - main_color.blue = ((strip->getColors(seg)[0]) & 0xFF); - back_color.white = ((strip->getColors(seg)[1] >> 24) & 0xFF); - back_color.red = ((strip->getColors(seg)[1] >> 16) & 0xFF); - back_color.green = ((strip->getColors(seg)[1] >> 8) & 0xFF); - back_color.blue = ((strip->getColors(seg)[1]) & 0xFF); - xtra_color.white = ((strip->getColors(seg)[2] >> 24) & 0xFF); - xtra_color.red = ((strip->getColors(seg)[2] >> 16) & 0xFF); - xtra_color.green = ((strip->getColors(seg)[2] >> 8) & 0xFF); - xtra_color.blue = ((strip->getColors(seg)[2] >> 0) & 0xFF); -} - -void calculateColorTransitionSteps() { - //compare all colors and calculate steps - trans_cnt_max = 0; - int calculate_max[4] = {}; - for (uint8_t i=0; i<3; i++){ - for (uint8_t j=0; j<4; j++) { - calculate_max[j] = ((hex_colors[i] >> ((3-j)*8)) & 0xFF) - ((hex_colors_trans[i] >> ((3-j)*8)) & 0xFF); - calculate_max[j] = abs(calculate_max[j]); - trans_cnt_max = max(trans_cnt_max, calculate_max[j]); - } - } -} - -void convertColorsFade() { - if (transEffect) { - if (trans_cnt > 1) { - memcpy(hex_colors, strip->getColors(segment), sizeof(hex_colors)); - DBG_OUTPUT_PORT.println("Color transistion aborted. Restarting...!"); - trans_cnt = 1; - } - calculateColorTransitionSteps(); - } -} - -void getArgs() { - if (mode == SET) { - // Segment - if ((server.arg("seg") != "") && (server.arg("seg").toInt() >= 0) && (server.arg("seg").toInt() <= MAX_NUM_SEGMENTS)) { - prevsegment = segment; - segment = server.arg("seg").toInt(); - getSegmentParams(segment); - memcpy(hex_colors_trans, hex_colors, sizeof(hex_colors_trans)); - } - //color wrgb - if (server.arg("rgb") != "") { - uint32_t rgb = (uint32_t) strtoul(server.arg("rgb").c_str(), NULL, 16); - main_color.white = ((rgb >> 24) & 0xFF); - main_color.red = ((rgb >> 16) & 0xFF); - main_color.green = ((rgb >> 8) & 0xFF); - main_color.blue = ((rgb >> 0) & 0xFF); - } else { - if ((server.arg("r") != "") && (server.arg("r").toInt() >= 0) && (server.arg("r").toInt() <= 255)) { - main_color.red = server.arg("r").toInt(); - } - if ((server.arg("g") != "") && (server.arg("g").toInt() >= 0) && (server.arg("g").toInt() <= 255)) { - main_color.green = server.arg("g").toInt(); - } - if ((server.arg("b") != "") && (server.arg("b").toInt() >= 0) && (server.arg("b").toInt() <= 255)) { - main_color.blue = server.arg("b").toInt(); - } - if ((server.arg("w") != "") && (server.arg("w").toInt() >= 0) && (server.arg("w").toInt() <= 255)){ - main_color.white = server.arg("w").toInt(); - } - } - if (server.arg("rgb2") != "") { - uint32_t rgb2 = (uint32_t) strtoul(server.arg("rgb2").c_str(), NULL, 16); - back_color.white = ((rgb2 >> 24) & 0xFF); - back_color.red = ((rgb2 >> 16) & 0xFF); - back_color.green = ((rgb2 >> 8) & 0xFF); - back_color.blue = ((rgb2 >> 0) & 0xFF); - } else { - if ((server.arg("r2") != "") && (server.arg("r2").toInt() >= 0) && (server.arg("r2").toInt() <= 255)) { - back_color.red = server.arg("r2").toInt(); - } - if ((server.arg("g2") != "") && (server.arg("g2").toInt() >= 0) && (server.arg("g2").toInt() <= 255)) { - back_color.green = server.arg("g2").toInt(); - } - if ((server.arg("b2") != "") && (server.arg("b2").toInt() >= 0) && (server.arg("b2").toInt() <= 255)) { - back_color.blue = server.arg("b2").toInt(); - } - if ((server.arg("w2") != "") && (server.arg("w2").toInt() >= 0) && (server.arg("w2").toInt() <= 255)){ - back_color.white = server.arg("w2").toInt(); - } - } - if (server.arg("rgb3") != "") { - uint32_t rgb3 = (uint32_t) strtoul(server.arg("rgb3").c_str(), NULL, 16); - xtra_color.white = ((rgb3 >> 24) & 0xFF); - xtra_color.red = ((rgb3 >> 16) & 0xFF); - xtra_color.green = ((rgb3 >> 8) & 0xFF); - xtra_color.blue = ((rgb3 >> 0) & 0xFF); - } else { - if ((server.arg("r3") != "") && (server.arg("r3").toInt() >= 0) && (server.arg("r3").toInt() <= 255)) { - xtra_color.red = server.arg("r3").toInt(); - } - if ((server.arg("g3") != "") && (server.arg("g3").toInt() >= 0) && (server.arg("g3").toInt() <= 255)) { - xtra_color.green = server.arg("g3").toInt(); - } - if ((server.arg("b3") != "") && (server.arg("b3").toInt() >= 0) && (server.arg("b3").toInt() <= 255)) { - xtra_color.blue = server.arg("b3").toInt(); - } - if ((server.arg("w3") != "") && (server.arg("w3").toInt() >= 0) && (server.arg("w3").toInt() <= 255)){ - xtra_color.white = server.arg("w3").toInt(); - } - } - main_color.red = constrain(main_color.red, 0, 255); - main_color.green = constrain(main_color.green, 0, 255); - main_color.blue = constrain(main_color.blue, 0, 255); - main_color.white = constrain(main_color.white, 0, 255); - back_color.red = constrain(back_color.red, 0, 255); - back_color.green = constrain(back_color.green, 0, 255); - back_color.blue = constrain(back_color.blue, 0, 255); - back_color.white = constrain(back_color.white, 0, 255); - xtra_color.red = constrain(xtra_color.red, 0, 255); - xtra_color.green = constrain(xtra_color.green, 0, 255); - xtra_color.blue = constrain(xtra_color.blue, 0, 255); - xtra_color.white = constrain(xtra_color.white, 0, 255); - // Speed - if ((server.arg("s") != "") && (server.arg("s").toInt() >= 0) && (server.arg("s").toInt() <= 255)) { - ws2812fx_speed = constrain(server.arg("s").toInt(), 0, 255); - } - //Mode - if ((server.arg("m") != "") && (server.arg("m").toInt() >= 0) && (server.arg("m").toInt() <= strip->getModeCount())) { - ws2812fx_mode = constrain(server.arg("m").toInt(), 0, strip->getModeCount() - 1); - } - // Brightness - if ((server.arg("c") != "") && (server.arg("c").toInt() >= 0) && (server.arg("c").toInt() <= 100)) { - brightness = constrain((int) server.arg("c").toInt() * 2.55, 0, 255); - } else if ((server.arg("p") != "") && (server.arg("p").toInt() >= 0) && (server.arg("p").toInt() <= 255)) { - brightness = constrain(server.arg("p").toInt(), 0, 255); - } - } - DBG_OUTPUT_PORT.printf("Get Args: %s\r\n", listStatusJSON()); -} - -uint16_t convertSpeed(uint8_t mcl_speed) { - uint16_t ws2812_speed = 61760 * (exp(0.0002336 * mcl_speed) - exp(-0.03181 * mcl_speed)); - ws2812_speed = SPEED_MAX - ws2812_speed; - ws2812_speed = constrain(ws2812_speed, SPEED_MIN, SPEED_MAX); - return ws2812_speed; -} - -uint8_t unconvertSpeed(uint16_t ws2812_speed) { - //log((SPEED_MAX - ws2812_speed)/61760) = (0.0002336 * mcl_speed) - (-0.03181 * mcl_speed); - //log((SPEED_MAX - ws2812_speed)/61760) = (0.0002336 + 0.03181) * mcl_speed; - uint16_t mcl_speed = (log((SPEED_MAX - ws2812_speed)/61760))/ (0.0002336 + 0.03181); - //uint16_t mcl_speed = 61760 * (exp(0.0002336 * mcl_speed) - exp(-0.03181 * mcl_speed)); - mcl_speed = 255 - mcl_speed; - mcl_speed = constrain(mcl_speed, 0, 255); - return mcl_speed; -} - // *************************************************************************** // Handler functions for WS and MQTT // *************************************************************************** -void handleSetMainColor(uint8_t * mypayload) { +bool handleSetMainColor(uint8_t * mypayload) { // decode rgb data uint32_t rgb = (uint32_t) strtoul((const char *) &mypayload[1], NULL, 16); - main_color.white = ((rgb >> 24) & 0xFF); - main_color.red = ((rgb >> 16) & 0xFF); - main_color.green = ((rgb >> 8) & 0xFF); - main_color.blue = ((rgb >> 0) & 0xFF); - mode = SET; + if (rgb != strip->getColors(segment)[0]) { + main_color.white = ((rgb >> 24) & 0xFF); + main_color.red = ((rgb >> 16) & 0xFF); + main_color.green = ((rgb >> 8) & 0xFF); + main_color.blue = ((rgb >> 0) & 0xFF); + return true; + } + return false; } -void handleSetBackColor(uint8_t * mypayload) { +bool handleSetBackColor(uint8_t * mypayload) { // decode rgb data uint32_t rgb = (uint32_t) strtoul((const char *) &mypayload[2], NULL, 16); - back_color.white = ((rgb >> 24) & 0xFF); - back_color.red = ((rgb >> 16) & 0xFF); - back_color.green = ((rgb >> 8) & 0xFF); - back_color.blue = ((rgb >> 0) & 0xFF); - mode = SET; + if (rgb != strip->getColors(segment)[1]) { + back_color.white = ((rgb >> 24) & 0xFF); + back_color.red = ((rgb >> 16) & 0xFF); + back_color.green = ((rgb >> 8) & 0xFF); + back_color.blue = ((rgb >> 0) & 0xFF); + return true; + } + return false; } -void handleSetXtraColor(uint8_t * mypayload) { +bool handleSetXtraColor(uint8_t * mypayload) { // decode rgb data uint32_t rgb = (uint32_t) strtoul((const char *) &mypayload[3], NULL, 16); - xtra_color.white = ((rgb >> 24) & 0xFF); - xtra_color.red = ((rgb >> 16) & 0xFF); - xtra_color.green = ((rgb >> 8) & 0xFF); - xtra_color.blue = ((rgb >> 0) & 0xFF); - mode = SET; + if (rgb != strip->getColors(segment)[2]) { + xtra_color.white = ((rgb >> 24) & 0xFF); + xtra_color.red = ((rgb >> 16) & 0xFF); + xtra_color.green = ((rgb >> 8) & 0xFF); + xtra_color.blue = ((rgb >> 0) & 0xFF); + return true; + } + return false; } -void handleSetAllMode(uint8_t * mypayload) { +bool handleSetAllMode(uint8_t * mypayload) { // decode rgb data uint32_t rgb = (uint32_t) strtoul((const char *) &mypayload[1], NULL, 16); - main_color.white = ((rgb >> 24) & 0xFF); - main_color.red = ((rgb >> 16) & 0xFF); - main_color.green = ((rgb >> 8) & 0xFF); - main_color.blue = ((rgb >> 0) & 0xFF); - DBG_OUTPUT_PORT.printf("WS: Set all leds to main color: R: [%u] G: [%u] B: [%u] W: [%u]\r\n", main_color.red, main_color.green, main_color.blue, main_color.white); - ws2812fx_mode = FX_MODE_STATIC; - mode = SET; + if ((mode = OFF) || (ws2812fx_mode != strip->getMode(segment)) || (rgb != strip->getColors(segment)[0])) { + main_color.white = ((rgb >> 24) & 0xFF); + main_color.red = ((rgb >> 16) & 0xFF); + main_color.green = ((rgb >> 8) & 0xFF); + main_color.blue = ((rgb >> 0) & 0xFF); + DBG_OUTPUT_PORT.printf("WS: Set all leds to main color: R: [%u] G: [%u] B: [%u] W: [%u]\r\n", main_color.red, main_color.green, main_color.blue, main_color.white); + ws2812fx_mode = FX_MODE_STATIC; + mode = SET; + return true; + } + return false; } void handleSetSingleLED(uint8_t * mypayload, uint8_t firstChar = 0) { @@ -316,105 +147,6 @@ void handleRangeDifferentColors(uint8_t * mypayload) { } } -bool checkPin(uint8_t pin) { - #if defined(USE_WS2812FX_DMA) - #if USE_WS2812FX_DMA == 0 - pin = 3; - #endif - #if USE_WS2812FX_DMA == 1 - pin = 1; - #endif - #if USE_WS2812FX_DMA == 2 - pin = 2; - #endif - #endif - if (((pin >= 0 && pin <= 5) || (pin >= 12 && pin <= 16)) && (pin != WS2812FXStripSettings.pin)) { - WS2812FXStripSettings.pin = pin; - return true; - } - return false; -} - -neoPixelType checkRGBOrder(char rgbOrder[5]) { - for( uint8_t i=0 ; i < sizeof(rgbOrder) ; ++i ) rgbOrder[i] = toupper(rgbOrder[i]) ; - DBG_OUTPUT_PORT.printf("Checking RGB Order: %s ...", rgbOrder); - neoPixelType returnOrder = 0; - if (strcmp(rgbOrder, "GRB") == 0) { - returnOrder = NEO_GRB; - } else if (strcmp(rgbOrder, "GBR") == 0) { - returnOrder = NEO_GBR; - } else if (strcmp(rgbOrder, "RGB") == 0) { - returnOrder = NEO_RGB; - } else if (strcmp(rgbOrder, "RBG") == 0) { - returnOrder = NEO_RBG; - } else if (strcmp(rgbOrder, "BRG") == 0) { - returnOrder = NEO_BRG; - } else if (strcmp(rgbOrder, "BGR") == 0) { - returnOrder = NEO_BGR; - } else if (strcmp(rgbOrder, "WGRB") == 0) { - returnOrder = NEO_WGRB; - } else if (strcmp(rgbOrder, "WGBR") == 0) { - returnOrder = NEO_WGBR; - } else if (strcmp(rgbOrder, "WRGB") == 0) { - returnOrder = NEO_WRGB; - } else if (strcmp(rgbOrder, "WRBG") == 0) { - returnOrder = NEO_WRBG; - } else if (strcmp(rgbOrder, "WBRG") == 0) { - returnOrder = NEO_WBRG; - } else if (strcmp(rgbOrder, "WBGR") == 0) { - returnOrder = NEO_WBGR; - } else if (strcmp(rgbOrder, "GWRB") == 0) { - returnOrder = NEO_GWRB; - } else if (strcmp(rgbOrder, "GWBR") == 0) { - returnOrder = NEO_GWBR; - } else if (strcmp(rgbOrder, "RWGB") == 0) { - returnOrder = NEO_RWGB; - } else if (strcmp(rgbOrder, "RWBG") == 0) { - returnOrder = NEO_RWBG; - } else if (strcmp(rgbOrder, "BWRG") == 0) { - returnOrder = NEO_BWRG; - } else if (strcmp(rgbOrder, "BWGR") == 0) { - returnOrder = NEO_BWGR; - } else if (strcmp(rgbOrder, "GRWB") == 0) { - returnOrder = NEO_GRWB; - } else if (strcmp(rgbOrder, "GBWR") == 0) { - returnOrder = NEO_GBWR; - } else if (strcmp(rgbOrder, "RGWB") == 0) { - returnOrder = NEO_RGWB; - } else if (strcmp(rgbOrder, "RBWG") == 0) { - returnOrder = NEO_RBWG; - } else if (strcmp(rgbOrder, "BRWG") == 0){ - returnOrder = NEO_BRWG; - } else if (strcmp(rgbOrder, "BGWR") == 0) { - returnOrder = NEO_GRBW; - } else if (strcmp(rgbOrder, "GRBW") == 0) { - returnOrder = NEO_GRBW; - } else if (strcmp(rgbOrder, "GBWR") == 0) { - returnOrder = NEO_GBRW; - } else if (strcmp(rgbOrder, "RGBW") == 0) { - returnOrder = NEO_RGBW; - } else if (strcmp(rgbOrder, "RBGW") == 0) { - returnOrder = NEO_RBGW; - } else if (strcmp(rgbOrder, "BRGW") == 0) { - returnOrder = NEO_BRGW; - } else if (strcmp(rgbOrder, "BGRW") == 0) { - returnOrder = NEO_BGRW; - } else { - DBG_OUTPUT_PORT.print("invalid input!"); - uint16_t check = checkRGBOrder(WS2812FXStripSettings.RGBOrder); - if (check != 0) { - returnOrder = static_cast(check); - strcpy(rgbOrder, WS2812FXStripSettings.RGBOrder); - } else { - returnOrder = static_cast(checkRGBOrder(RGBORDER)); - strcpy(rgbOrder, RGBORDER); - } - } - DBG_OUTPUT_PORT.println("success!"); - strcpy(WS2812FXStripSettings.RGBOrder, rgbOrder); - return returnOrder; -} - bool setModeByStateString(String saved_state_string) { if (getValue(saved_state_string, '|', 0) == "STA") { DBG_OUTPUT_PORT.printf("Parsed state: %s\r\n", saved_state_string.c_str()); @@ -451,7 +183,7 @@ bool setModeByStateString(String saved_state_string) { str_white = getValue(saved_state_string, '|', 16); xtra_color.white = str_white.toInt(); DBG_OUTPUT_PORT.print("Set to state: "); - DBG_OUTPUT_PORT.println(listStatusJSON()); + DBG_OUTPUT_PORT.println(listStateJSON()); //prevmode=mode; //mode = SET; return true; @@ -477,149 +209,6 @@ void handleSetWS2812FXMode(uint8_t * mypayload) { } } -char * listStatusJSONorg() { - const size_t bufferSize = JSON_ARRAY_SIZE(13) + JSON_OBJECT_SIZE(6) + 500; - DynamicJsonDocument jsonBuffer(bufferSize); - JsonObject root = jsonBuffer.to(); - root["segment"] = segment; - root["mode"] = (uint8_t) mode; - root["ws2812fx_mode"] = ws2812fx_mode; - root["ws2812fx_mode_name"] = strip->getModeName(ws2812fx_mode); - root["speed"] = ws2812fx_speed; - root["brightness"] = brightness; - JsonArray color = root.createNestedArray("color"); - color.add(main_color.white); - color.add(main_color.red); - color.add(main_color.green); - color.add(main_color.blue); - color.add(back_color.white); - color.add(back_color.red); - color.add(back_color.green); - color.add(back_color.blue); - color.add(xtra_color.white); - color.add(xtra_color.red); - color.add(xtra_color.green); - color.add(xtra_color.blue); - uint16_t msg_len = measureJson(root) + 1; - char * buffer = (char *) malloc(msg_len); - serializeJson(root, buffer, msg_len); - jsonBuffer.clear(); - return buffer; -} - -char * listStatusJSON() { - const size_t bufferSize = JSON_OBJECT_SIZE(3) + 25; - DynamicJsonDocument jsonBuffer(bufferSize); - JsonObject root = jsonBuffer.to(); - root["segment"] = segment; - root["mode"] = (uint8_t) mode; - root["brightness"] = brightness; - uint16_t msg_len = measureJson(root) + 1; - char * buffer = (char *) malloc(msg_len); - serializeJson(root, buffer, msg_len); - jsonBuffer.clear(); - return buffer; -} - -char * listSegmentStatusJSON(uint8_t seg) { - const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(7) + 100; - DynamicJsonDocument jsonBuffer(bufferSize); - JsonObject root = jsonBuffer.to(); - root["segment"] = seg; - root["start"] = strip->getSegment(seg)->start; - root["stop"] = strip->getSegment(seg)->stop; - root["ws2812fx_mode"] = strip->getMode(seg); - root["ws2812fx_mode_name"] = strip->getModeName(strip->getMode(seg)); - root["speed"] = ws2812fx_speed; - getSegmentParams(seg); - JsonArray color = root.createNestedArray("color"); - color.add((strip->getColors(seg)[0] >> 24) & 0xFF); - color.add((strip->getColors(seg)[0] >> 16) & 0xFF); - color.add((strip->getColors(seg)[0] >> 8) & 0xFF); - color.add((strip->getColors(seg)[0]) & 0xFF); - color.add((strip->getColors(seg)[1] >> 24) & 0xFF); - color.add((strip->getColors(seg)[1] >> 16) & 0xFF); - color.add((strip->getColors(seg)[1] >> 8) & 0xFF); - color.add((strip->getColors(seg)[1]) & 0xFF); - color.add((strip->getColors(seg)[2] >> 24) & 0xFF); - color.add((strip->getColors(seg)[2] >> 16) & 0xFF); - color.add((strip->getColors(seg)[2] >> 8) & 0xFF); - color.add((strip->getColors(seg)[2]) & 0xFF); - uint16_t msg_len = measureJson(root) + 1; - char * buffer = (char *) malloc(msg_len); - serializeJson(root, buffer, msg_len); - jsonBuffer.clear(); - return buffer; -} - -void getStatusJSON() { - char * buffer = listStatusJSONorg(); - server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send ( 200, "application/json", buffer); - free (buffer); -} - -char * listConfigJSON() { - #if defined(ENABLE_MQTT) - const size_t bufferSize = JSON_OBJECT_SIZE(10) + 500; - #else - const size_t bufferSize = JSON_OBJECT_SIZE(6) + 150; - #endif - DynamicJsonDocument jsonBuffer(bufferSize); - JsonObject root = jsonBuffer.to(); - root["hostname"] = HOSTNAME; - #if defined(ENABLE_MQTT) - root["mqtt_host"] = mqtt_host; - root["mqtt_port"] = mqtt_port; - root["mqtt_user"] = mqtt_user; - root["mqtt_pass"] = mqtt_pass; - #endif - root["num_seg"] = num_segments; - root["ws_cnt"] = WS2812FXStripSettings.stripSize; - root["ws_rgbo"] = WS2812FXStripSettings.RGBOrder; - root["ws_pin"] = WS2812FXStripSettings.pin; - root["ws_fxopt"] = WS2812FXStripSettings.fxoptions; - root["transEffect"] = transEffect; - uint16_t msg_len = measureJson(root) + 1; - char * buffer = (char *) malloc(msg_len); - serializeJson(root, buffer, msg_len); - jsonBuffer.clear(); - return buffer; -} - -void getConfigJSON() { - char * buffer = listConfigJSON(); - server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send ( 200, "application/json", buffer); - free (buffer); -} - -char * listModesJSON() { - const size_t bufferSize = JSON_ARRAY_SIZE(strip->getModeCount() + 1) + (strip->getModeCount() + 1)*JSON_OBJECT_SIZE(2) + 2000; - DynamicJsonDocument jsonBuffer(bufferSize); - JsonArray root = jsonBuffer.to(); - JsonObject objectoff = root.createNestedObject(); - objectoff["mode"] = "off"; - objectoff["name"] = "OFF"; - for (uint8_t i = 0; i < strip->getModeCount(); i++) { - JsonObject object = root.createNestedObject(); - object["mode"] = i; - object["name"] = strip->getModeName(i); - } - uint16_t msg_len = measureJson(root) + 1; - char * buffer = (char *) malloc(msg_len); - serializeJson(root, buffer, msg_len); - jsonBuffer.clear(); - return buffer; -} - -void getModesJSON() { - char * buffer = listModesJSON(); - server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send ( 200, "application/json", buffer); - free (buffer); -} - // *************************************************************************** // HTTP request handlers // *************************************************************************** @@ -662,103 +251,53 @@ void handleNotFound() { // *************************************************************************** // Functions and variables // *************************************************************************** -void Dbg_Prefix(bool mqtt, uint8_t num) { - if (mqtt == true) { +void Dbg_Prefix(bool _mqtt, uint8_t _num) { + if (_mqtt == true) { DBG_OUTPUT_PORT.print("MQTT: "); } else { DBG_OUTPUT_PORT.print("WS: "); - webSocket.sendTXT(num, "OK"); + webSocket.sendTXT(_num, "OK"); } } -void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { +void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { // Select segment - if (payload[0] == 'S') { - uint8_t seg = (uint8_t) strtol((const char *) &payload[1], NULL, 10); - prevsegment = segment; - segment = constrain(seg, 0, MAX_NUM_SEGMENTS); - getSegmentParams(segment); - memcpy(hex_colors_trans, hex_colors, sizeof(hex_colors_trans)); - mode = SET; - Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Set segment to: [%u]\r\n", segment); - } - - // # ==> Set main color - ## ==> Set 2nd color - ### ==> Set 3rd color - if (payload[0] == '#') { - #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %s", payload); - #endif - if (payload[2] == '#') { - handleSetXtraColor(payload); - DBG_OUTPUT_PORT.printf("Set 3rd color to: R: [%u] G: [%u] B: [%u] W: [%u]\r\n", xtra_color.red, xtra_color.green, xtra_color.blue, xtra_color.white); - } else if (payload[1] == '#') { - handleSetBackColor(payload); - DBG_OUTPUT_PORT.printf("Set 2nd color to: R: [%u] G: [%u] B: [%u] W: [%u]\r\n", back_color.red, back_color.green, back_color.blue, back_color.white); - } else { - handleSetMainColor(payload); - DBG_OUTPUT_PORT.printf("Set main color to: R: [%u] G: [%u] B: [%u] W: [%u]\r\n", main_color.red, main_color.green, main_color.blue, main_color.white); + boolean _updateState = false; + boolean _updateSegState = false; + // / ==> Set active segment + if (_payload[0] == 'S') { + if (_payload[1] == 's') { + uint8_t seg = (uint8_t) strtol((const char *) &_payload[2], NULL, 10); + segment = constrain(seg, 0, MAX_NUM_SEGMENTS); + if (prevsegment != segment) { + prevsegment = segment; + getSegmentParams(segment); + memcpy(hex_colors_trans, hex_colors, sizeof(hex_colors_trans)); + mode = SET; + _updateState = true; + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set segment to: [%u]\r\n", segment); + } } - } - - // ? ==> Set speed - if (payload[0] == '?') { - uint8_t d = (uint8_t) strtol((const char *) &payload[1], NULL, 10); - ws2812fx_speed = constrain(d, 0, 255); - mode = SET; - Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Set speed to: [%u]\r\n", ws2812fx_speed); - } - - // % ==> Set brightness - if (payload[0] == '%') { - uint8_t b = (uint8_t) strtol((const char *) &payload[1], NULL, 10); - brightness = constrain(b, 0, 255); - mode = SET; - Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Set brightness to: [%u]\r\n", brightness); - } - - // * ==> Set main color and light all LEDs (Shortcut) - if (payload[0] == '*') { - handleSetAllMode(payload); - Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Set main color and light all LEDs [%s]\r\n", payload); - } - - // ! ==> Set single LED in given color - if (payload[0] == '!') { - handleSetSingleLED(payload, 1); - Dbg_Prefix(mqtt, num); - #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %s", payload); - #endif - DBG_OUTPUT_PORT.printf("Set single LED in given color [%s]\r\n", payload); - } - - // + ==> Set multiple LED in the given colors - if (payload[0] == '+') { - handleSetDifferentColors(payload); - Dbg_Prefix(mqtt, num); - #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %s", payload); - #endif - DBG_OUTPUT_PORT.printf("Set multiple LEDs in given color [%s]\r\n", payload); - } - - // + ==> Set range of LEDs in the given color - if (payload[0] == 'R') { - handleRangeDifferentColors(payload); - Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Set range of LEDs in given color [%s]\r\n", payload); - #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %s", payload); - #endif - } - - // $ ==> Get status Info. - if (payload[0] == '$') { - char * buffer = listStatusJSONorg(); + // / ==> Set segment first LED + if (_payload[1] == '[') { + uint16_t segstart = (uint8_t) strtol((const char *) &_payload[2], NULL, 10); + getSegmentParams(segment); + seg_start = constrain(segstart, 0, WS2812FXStripSettings.stripSize); + _updateSegState = true; + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set segment start to: [%u]\r\n", segstart); + } + // / ==> Set segment last LED + if (_payload[1] == ']') { + uint16_t segstop = (uint8_t) strtol((const char *) &_payload[2], NULL, 10); + getSegmentParams(segment); + seg_stop = constrain(segstop, 0, WS2812FXStripSettings.stripSize - 1); + _updateSegState = true; + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set segment stop to: [%u]\r\n", segstop); + } + char * buffer = listSegmentStateJSON(segment); if (mqtt == true) { DBG_OUTPUT_PORT.print("MQTT: "); #if defined(ENABLE_MQTT) @@ -773,98 +312,206 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { DBG_OUTPUT_PORT.print("WS: "); webSocket.sendTXT(num, "OK"); webSocket.sendTXT(num, buffer); + } + } + // / ==> Set WS2812 mode. + if (_payload[0] == '/') { + handleSetWS2812FXMode(_payload); + if (ws2812fx_mode != strip->getMode(segment)) { + _updateSegState = true; + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set WS2812 mode: [%s]\r\n", _payload); + } + } + // # ==> Set main color - ## ==> Set 2nd color - ### ==> Set 3rd color + if (_payload[0] == '#') { + if (_payload[2] == '#') { + _updateSegState = handleSetXtraColor(_payload); + if (_updateSegState) { + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set 3rd color to: R: [%u] G: [%u] B: [%u] W: [%u]\r\n", xtra_color.red, xtra_color.green, xtra_color.blue, xtra_color.white); + } + } else if (_payload[1] == '#') { + _updateSegState = handleSetBackColor(_payload); + if (_updateSegState) { + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set 2nd color to: R: [%u] G: [%u] B: [%u] W: [%u]\r\n", back_color.red, back_color.green, back_color.blue, back_color.white); + } + } else { + _updateSegState = handleSetMainColor(_payload); + if (_updateSegState) { + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set main color to: R: [%u] G: [%u] B: [%u] W: [%u]\r\n", main_color.red, main_color.green, main_color.blue, main_color.white); + } + } + if (_updateSegState) { + #if defined(ENABLE_MQTT) + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %s", _payload); + #endif + mode = SET; } - DBG_OUTPUT_PORT.printf("Get status info: %s\r\n", buffer); - free (buffer); } + // ? ==> Set speed + if (_payload[0] == '?') { + uint8_t d = (uint8_t) strtol((const char *) &_payload[1], NULL, 10); + ws2812fx_speed = constrain(d, 0, 255); + mode = SET; + _updateSegState = true; + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set speed to: [%u]\r\n", ws2812fx_speed); + } - // $ ==> Get config Info. - if (payload[0] == 'C') { - bool updateStrip = false; - bool updateConf = false; - if (payload[1] == 's') { - if (payload[2] == 's') { + // % ==> Set brightness + if (_payload[0] == '%') { + uint8_t b = (uint8_t) strtol((const char *) &_payload[1], NULL, 10); + brightness = constrain(b, 0, 255); + if (strip->getBrightness() != brightness) { + mode = SET; + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set brightness to: [%u]\r\n", brightness); + _updateState = true; + } + } + + // * ==> Set main color and light all LEDs (Shortcut) + if (_payload[0] == '*') { + _updateSegState = handleSetAllMode(_payload); + if (_updateSegState) { + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set main color and light all LEDs [%s]\r\n", _payload); + } + } + + // ! ==> Set single LED in given color + if (_payload[0] == '!') { + handleSetSingleLED(_payload, 1); + Dbg_Prefix(mqtt, num); + #if defined(ENABLE_MQTT) + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %s", _payload); + #endif + DBG_OUTPUT_PORT.printf("Set single LED in given color [%s]\r\n", _payload); + } + + // + ==> Set multiple LED in the given colors + if (_payload[0] == '+') { + handleSetDifferentColors(_payload); + Dbg_Prefix(mqtt, num); + #if defined(ENABLE_MQTT) + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %s", _payload); + #endif + DBG_OUTPUT_PORT.printf("Set multiple LEDs in given color [%s]\r\n", _payload); + } + + // + ==> Set range of LEDs in the given color + if (_payload[0] == 'R') { + handleRangeDifferentColors(_payload); + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set range of LEDs in given color [%s]\r\n", _payload); + #if defined(ENABLE_MQTT) + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %s", _payload); + #endif + } +#if defined(ENABLE_STATE_SAVE) + if (_updateState) { + DBG_OUTPUT_PORT.println("Saving stripstate.json!"); + if(!save_state.active()) save_state.once(3, tickerSaveState); + } + if (_updateSegState) { + DBG_OUTPUT_PORT.println("Saving stripstate_segment.json!"); + if(!save_seg_state.active()) save_seg_state.once(3, tickerSaveSegmentState); + + } + _updateState = false; + _updateSegState = false; +#endif + + // $ ==> Get config Info. + if (_payload[0] == 'C') { + bool _updateStrip = false; + bool _updateConfig = false; + if (_payload[1] == 's') { + if (_payload[2] == 's') { char tmp_segments[3]; - snprintf(tmp_segments, sizeof(tmp_segments), "%s", &payload[3]); + snprintf(tmp_segments, sizeof(tmp_segments), "%s", &_payload[3]); tmp_segments[2] = 0x00; num_segments = constrain(atoi(tmp_segments), 1, MAX_NUM_SEGMENTS - 1); - updateStrip = true; + _updateStrip = true; } - if (payload[2] == 'c') { + if (_payload[2] == 'c') { char tmp_count[6]; - snprintf(tmp_count, sizeof(tmp_count), "%s", &payload[3]); + snprintf(tmp_count, sizeof(tmp_count), "%s", &_payload[3]); tmp_count[5] = 0x00; WS2812FXStripSettings.stripSize = constrain(atoi(tmp_count), 1, MAXLEDS); - updateStrip = true; + _updateStrip = true; } - if (payload[2] == 'r') { + if (_payload[2] == 'r') { char tmp_rgbOrder[5]; - snprintf(tmp_rgbOrder, sizeof(tmp_rgbOrder), "%s", &payload[3]); + snprintf(tmp_rgbOrder, sizeof(tmp_rgbOrder), "%s", &_payload[3]); tmp_rgbOrder[4] = 0x00; checkRGBOrder(tmp_rgbOrder); - updateStrip=true; + _updateStrip=true; } #if !defined(USE_WS2812FX_DMA) - if (payload[2] == 'p') { + if (_payload[2] == 'p') { char tmp_pin[3]; - snprintf(tmp_pin, sizeof(tmp_pin), "%s", &payload[3]); + snprintf(tmp_pin, sizeof(tmp_pin), "%s", &_payload[3]); tmp_pin[2] = 0x00; checkPin(atoi(tmp_pin)); - updateStrip = true; + _updateStrip = true; } #endif - if (payload[2] == 'o') { + if (_payload[2] == 'o') { char tmp_fxoptions[4]; - snprintf(tmp_fxoptions, sizeof(tmp_fxoptions), "%s", &payload[3]); + snprintf(tmp_fxoptions, sizeof(tmp_fxoptions), "%s", &_payload[3]); tmp_fxoptions[3] = 0x00; WS2812FXStripSettings.fxoptions = ((constrain(atoi(tmp_fxoptions), 0, 255)>>1)<<1); - updateStrip = true; + _updateStrip = true; } } - if (updateStrip){ - mode = INIT_STRIP; + if (_updateStrip){ + initStrip(); } - if (payload[1] == 'h') { - snprintf(HOSTNAME, sizeof(HOSTNAME), "%s", &payload[2]); + if (_payload[1] == 'h') { + snprintf(HOSTNAME, sizeof(HOSTNAME), "%s", &_payload[2]); HOSTNAME[sizeof(HOSTNAME) - 1] = 0x00; - updateConf = true; + _updateConfig = true; } #if defined(ENABLE_MQTT) - if (payload[1] == 'm') { - if (payload[2] == 'h') { - snprintf(mqtt_host, sizeof(mqtt_host), "%s", &payload[3]); + if (_payload[1] == 'm') { + if (_payload[2] == 'h') { + snprintf(mqtt_host, sizeof(mqtt_host), "%s", &_payload[3]); mqtt_host[sizeof(mqtt_host) - 1] = 0x00; - updateConf = true; + _updateConfig = true; } - if (payload[2] == 'p') { + if (_payload[2] == 'p') { char tmp_port[6]; - snprintf(tmp_port, sizeof(tmp_port), "%s", &payload[3]); + snprintf(tmp_port, sizeof(tmp_port), "%s", &_payload[3]); tmp_port[sizeof(tmp_port) - 1] = 0x00; mqtt_port = constrain(atoi(tmp_port), 0, 65535); - updateConf = true; + _updateConfig = true; } - if (payload[2] == 'u') { - snprintf(mqtt_user, sizeof(mqtt_user), "%s", &payload[3]); + if (_payload[2] == 'u') { + snprintf(mqtt_user, sizeof(mqtt_user), "%s", &_payload[3]); mqtt_user[sizeof(mqtt_user) - 1] = 0x00; - updateConf = true; + _updateConfig = true; } - if (payload[2] == 'w') { - snprintf(mqtt_pass, sizeof(mqtt_pass), "%s", &payload[3]); + if (_payload[2] == 'w') { + snprintf(mqtt_pass, sizeof(mqtt_pass), "%s", &_payload[3]); mqtt_pass[sizeof(mqtt_pass) - 1] = 0x00; - updateConf = true; + _updateConfig = true; } } - if (updateConf) { + if (_updateConfig) { initMqtt(); } #endif - if (payload[1] == 'e') { + if (_payload[1] == 'e') { char tmp_transEffect[2]; - snprintf(tmp_transEffect, sizeof(tmp_transEffect), "%s", &payload[2]); + snprintf(tmp_transEffect, sizeof(tmp_transEffect), "%s", &_payload[2]); tmp_transEffect[sizeof(tmp_transEffect) - 1] = 0x00; transEffect = atoi(tmp_transEffect); - updateConf = true; + _updateConfig = true; } char * buffer = listConfigJSON(); @@ -884,19 +531,41 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { webSocket.sendTXT(num, buffer); } #if defined(ENABLE_STATE_SAVE) - if (updateStrip || updateConf) { + if (_updateStrip || _updateConfig) { DBG_OUTPUT_PORT.println("Saving config.json!"); - if(!settings_save_conf.active()) settings_save_conf.once(3, tickerSaveConfig); + if(!save_conf.active()) save_conf.once(3, tickerSaveConfig); } #endif - updateStrip = false; - updateConf = false; + _updateStrip = false; + _updateConfig = false; DBG_OUTPUT_PORT.printf("Get status info: %s\r\n", buffer); free (buffer); } - + + // $ ==> Get status Info. + if (_payload[0] == '$') { + char * buffer = listStateJSONfull(); + if (mqtt == true) { + DBG_OUTPUT_PORT.print("MQTT: "); + #if defined(ENABLE_MQTT) + #if ENABLE_MQTT == 0 + mqtt_client->publish(mqtt_outtopic, buffer); + #endif + #if ENABLE_MQTT == 1 + mqtt_client->publish(mqtt_outtopic, qospub, false, buffer); + #endif + #endif + } else { + DBG_OUTPUT_PORT.print("WS: "); + webSocket.sendTXT(num, "OK"); + webSocket.sendTXT(num, buffer); + } + DBG_OUTPUT_PORT.printf("Get status info: %s\r\n", buffer); + free (buffer); + } + // ~ ==> Get WS2812 modes. - if (payload[0] == '~') { + if (_payload[0] == '~') { char * buffer = listModesJSON(); if (mqtt == true) { DBG_OUTPUT_PORT.print("MQTT: "); @@ -920,13 +589,6 @@ void checkpayload(uint8_t * payload, bool mqtt = false, uint8_t num = 0) { DBG_OUTPUT_PORT.println(buffer); free (buffer); } - - // / ==> Set WS2812 mode. - if (payload[0] == '/') { - handleSetWS2812FXMode(payload); - Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Set WS2812 mode: [%s]\r\n", payload); - } } // *************************************************************************** @@ -1027,6 +689,9 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); root["state"] = (mode != OFF) ? on_cmd : off_cmd; + #if defined(ENABLE_MQTT_INCLUDE_IP) + root["ip"] = WiFi.localIP(); + #endif JsonObject color = root.createNestedObject("color"); color["r"] = main_color.red; color["g"] = main_color.green; @@ -1501,248 +1166,6 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght } #endif -#if defined(ENABLE_STATE_SAVE) - void tickerSaveState(){ - updateState = true; - } - - void tickerSaveConfig(){ - updateConfig = true; - } - - // Write configuration to FS JSON - bool writeConfigFS(bool saveConfig){ - if (saveConfig) { - //FS save - DBG_OUTPUT_PORT.println("Saving config: "); - File configFile = SPIFFS.open("/config.json", "w"); - if (!configFile) { - DBG_OUTPUT_PORT.println("Failed!"); - settings_save_conf.detach(); - updateConfig = false; - return false; - } - DBG_OUTPUT_PORT.println(listConfigJSON()); - configFile.print(listConfigJSON()); - configFile.close(); - settings_save_conf.detach(); - updateConfig = false; - return true; - //end save - } else { - DBG_OUTPUT_PORT.println("SaveConfig is false!"); - return false; - } - } - - // Read search_str to FS - bool readConfigFS() { - //read configuration from FS JSON - if (SPIFFS.exists("/config.json")) { - //file exists, reading and loading - DBG_OUTPUT_PORT.print("Reading config file... "); - File configFile = SPIFFS.open("/config.json", "r"); - if (configFile) { - DBG_OUTPUT_PORT.println("Opened!"); - size_t size = configFile.size(); - std::unique_ptr buf(new char[size]); - configFile.readBytes(buf.get(), size); - configFile.close(); - #if defined(ENABLE_MQTT) - const size_t bufferSize = JSON_OBJECT_SIZE(5) + 500; - #else - const size_t bufferSize = JSON_OBJECT_SIZE(1) + 150; - #endif - DynamicJsonDocument jsonBuffer(bufferSize); - DeserializationError error = deserializeJson(jsonBuffer, buf.get()); - DBG_OUTPUT_PORT.print("Config: "); - if (!error) { - DBG_OUTPUT_PORT.println("Parsed!"); - JsonObject root = jsonBuffer.as(); - serializeJson(root, DBG_OUTPUT_PORT); - DBG_OUTPUT_PORT.println(""); - strcpy(HOSTNAME, root["hostname"]); - #if defined(ENABLE_MQTT) - strcpy(mqtt_host, root["mqtt_host"]); - mqtt_port = root["mqtt_port"].as(); - strcpy(mqtt_user, root["mqtt_user"]); - strcpy(mqtt_pass, root["mqtt_pass"]); - #endif - num_segments = constrain(root["num_seg"].as(), 1, MAX_NUM_SEGMENTS - 1); - WS2812FXStripSettings.stripSize = constrain(root["ws_cnt"].as(), 1, MAXLEDS); - char tmp_rgbOrder[5]; - strcpy(tmp_rgbOrder, root["ws_rgbo"]); - checkRGBOrder(tmp_rgbOrder); - uint8_t temp_pin; - checkPin((uint8_t) root["ws_pin"]); - WS2812FXStripSettings.fxoptions = constrain(root["ws_fxopt"].as(), 0, 255) & 0xFE; - transEffect = root["transEffect"].as(); - jsonBuffer.clear(); - return true; - } else { - DBG_OUTPUT_PORT.print("Failed to load json config: "); - DBG_OUTPUT_PORT.println(error.c_str()); - jsonBuffer.clear(); - } - } else { - DBG_OUTPUT_PORT.println("Failed to open /config.json"); - } - } else { - DBG_OUTPUT_PORT.println("Coudnt find config.json"); - writeConfigFS(true); - } - //end read - return false; - } - - bool writeStateFS(bool saveConfig){ - if (saveConfig) { - //save the strip state to FS JSON - DBG_OUTPUT_PORT.print("Saving state: "); - //SPIFFS.remove("/stripstate.json") ? DBG_OUTPUT_PORT.println("removed file") : DBG_OUTPUT_PORT.println("failed removing file"); - File configFile = SPIFFS.open("/stripstate.json", "w"); - if (!configFile) { - DBG_OUTPUT_PORT.println("Failed!"); - settings_save_state.detach(); - updateState = false; - return false; - } - DBG_OUTPUT_PORT.println(listStatusJSON()); - configFile.print(listStatusJSON()); - configFile.close(); - char filename[28]; - for (uint8_t seg=0; seg < num_segments; seg++) { - snprintf(filename, 28, "/stripstate_segment_%02i.json", seg); - filename[27] = 0x00; - File configFile = SPIFFS.open(filename, "w"); - if (!configFile) { - DBG_OUTPUT_PORT.println("Failed!"); - settings_save_state.detach(); - updateState = false; - return false; - } - DBG_OUTPUT_PORT.println(listSegmentStatusJSON(seg)); - configFile.print(listSegmentStatusJSON(seg)); - configFile.close(); - } - settings_save_state.detach(); - updateState = false; - return true; - //end save - } else { - DBG_OUTPUT_PORT.println("SaveStateConfig is false!"); - return false; - } - } - - bool readStateFS() { - //read strip state from FS JSON - if (SPIFFS.exists("/stripstate.json")) { - //file exists, reading and loading - DBG_OUTPUT_PORT.print("Reading state file... "); - File configFile = SPIFFS.open("/stripstate.json", "r"); - if (configFile) { - DBG_OUTPUT_PORT.println("Opened!"); - size_t size = configFile.size(); - // Allocate a buffer to store contents of the file. - std::unique_ptr buf(new char[size]); - configFile.readBytes(buf.get(), size); - configFile.close(); - const size_t bufferSize = JSON_OBJECT_SIZE(5) + JSON_ARRAY_SIZE(12) + 500; - DynamicJsonDocument jsonBuffer(bufferSize); - DeserializationError error = deserializeJson(jsonBuffer, buf.get()); - DBG_OUTPUT_PORT.print("Config: "); - if (!error) { - DBG_OUTPUT_PORT.print("Parsed"); - JsonObject root = jsonBuffer.as(); - serializeJson(root, DBG_OUTPUT_PORT); - DBG_OUTPUT_PORT.println(""); - segment = root["segment"]; - mode = static_cast(root["mode"].as()); - brightness = root["brightness"]; - jsonBuffer.clear(); - return true; - } else { - DBG_OUTPUT_PORT.print("Failed to load json config: "); - DBG_OUTPUT_PORT.println(error.c_str()); - jsonBuffer.clear(); - } - } else { - DBG_OUTPUT_PORT.println("Failed to open \"/stripstate.json\""); - } - } else { - DBG_OUTPUT_PORT.println("Couldn't find \"/stripstate.json\""); - writeStateFS(true); - } - //end read - return false; - } - - bool readStateSegmentFS(uint8_t seg) { - //read strip state from FS JSON - char filename[28]; - snprintf(filename, 28, "/stripstate_segment_%02i.json", seg); - filename[27] = 0x00; - if (SPIFFS.exists(filename)) { - //file exists, reading and loading - DBG_OUTPUT_PORT.printf("Reading segmentstate file: %s\r\n", filename); - File configFile = SPIFFS.open(filename, "r"); - if (configFile) { - DBG_OUTPUT_PORT.println("Opened!"); - size_t size = configFile.size(); - // Allocate a buffer to store contents of the file. - std::unique_ptr buf(new char[size]); - configFile.readBytes(buf.get(), size); - configFile.close(); - const size_t bufferSize = JSON_OBJECT_SIZE(5) + JSON_ARRAY_SIZE(12) + 500; - DynamicJsonDocument jsonBuffer(bufferSize); - DeserializationError error = deserializeJson(jsonBuffer, buf.get()); - DBG_OUTPUT_PORT.print("Config: "); - if (!error) { - DBG_OUTPUT_PORT.print("Parsed"); - JsonObject root = jsonBuffer.as(); - serializeJson(root, DBG_OUTPUT_PORT); - DBG_OUTPUT_PORT.println(""); - seg_start = root["start"].as(); - seg_stop = root["stop"].as(); - ws2812fx_mode = root["ws2812fx_mode"].as(); - ws2812fx_speed = root["speed"].as(); - main_color.white = root["color"][0].as(); - main_color.red = root["color"][1].as(); - main_color.green = root["color"][2].as(); - main_color.blue = root["color"][3].as(); - back_color.white = root["color"][4].as(); - back_color.red = root["color"][5].as(); - back_color.green = root["color"][6].as(); - back_color.blue = root["color"][7].as(); - xtra_color.white = root["color"][8].as(); - xtra_color.red = root["color"][9].as(); - xtra_color.green = root["color"][10].as(); - xtra_color.blue = root["color"][11].as(); - convertColors(); - jsonBuffer.clear(); - return true; - } else { - DBG_OUTPUT_PORT.print("Failed to load json config: "); - DBG_OUTPUT_PORT.println(error.c_str()); - jsonBuffer.clear(); - } - } else { - DBG_OUTPUT_PORT.printf("Failed to open \"/%s\"\r\n", filename); - } - } else { - DBG_OUTPUT_PORT.printf("Couldn't find \"/%s\"", filename); - writeStateFS(true); - } - //end read - return false; - } - - - -#endif - - #if defined(ENABLE_REMOTE) // *************************************************************************** // Request handler for IR remote support @@ -2029,18 +1452,3 @@ void handleRemote() { } } #endif - -uint32_t scale_wrgb(uint32_t wrgb, uint8_t level) { - uint8_t w = ((wrgb >> 24) & 0xFF) * level / 255; - uint8_t r = ((wrgb >> 16) & 0xFF) * level / 255; - uint8_t g = ((wrgb >> 8) & 0xFF) * level / 255; - uint8_t b = ((wrgb) & 0xFF) * level / 255; - return (w << 24) | (r << 16) | (g << 8) | b; -} - -uint32_t trans(uint32_t newcolor, uint32_t oldcolor, uint8_t level) { - level = (level * (255/trans_cnt_max)); - newcolor = scale_wrgb(newcolor, level); - oldcolor = scale_wrgb(oldcolor, 255-level); - return newcolor + oldcolor; -} diff --git a/Arduino/McLighting/rest_api.h b/Arduino/McLighting/rest_api.h index f2d680d..6fbbc8c 100644 --- a/Arduino/McLighting/rest_api.h +++ b/Arduino/McLighting/rest_api.h @@ -1,359 +1,406 @@ - // *************************************************************************** - // Setup: Webserver handler - // *************************************************************************** - //list directory - server.on("/list", HTTP_GET, handleFileList); - //create file - server.on("/edit", HTTP_PUT, handleFileCreate); - //delete file - server.on("/edit", HTTP_DELETE, handleFileDelete); - //first callback is called after the request has ended with all parsed arguments - //second callback handles file uploads at that location - server.on("/edit", HTTP_POST, []() { - server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send(200, "text/plain", ""); - }, handleFileUpload); +// *************************************************************************** +// Setup: Webserver handler +// *************************************************************************** +//list directory +server.on("/list", HTTP_GET, handleFileList); +//create file +server.on("/edit", HTTP_PUT, handleFileCreate); +//delete file +server.on("/edit", HTTP_DELETE, handleFileDelete); +//first callback is called after the request has ended with all parsed arguments +//second callback handles file uploads at that location +server.on("/edit", HTTP_POST, []() { + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send(200, "text/plain", ""); +}, handleFileUpload); // *************************************************************************** // Setup: SPIFFS Webserver handler // *************************************************************************** - server.on("/", HTTP_GET, [&](){ - #if defined(USE_HTML_MIN_GZ) - server.sendHeader("Content-Encoding", "gzip", true); - server.send_P(200, PSTR("text/html"), index_htm_gz, index_htm_gz_len); - #else - if (!handleFileRead(server.uri())) - handleNotFound(); - #endif - }); - - server.on("/edit", HTTP_GET, [&](){ - #if defined(USE_HTML_MIN_GZ) - server.sendHeader("Content-Encoding", "gzip", true); - server.send_P(200, PSTR("text/html"), edit_htm_gz, edit_htm_gz_len); - #else - if (!handleFileRead("/edit.htm")) - handleNotFound(); - #endif - }); - - - //called when the url is not defined here - //use it to load content from SPIFFS - server.onNotFound([]() { +server.on("/", HTTP_GET, [&](){ + #if defined(USE_HTML_MIN_GZ) + server.sendHeader("Content-Encoding", "gzip", true); + server.send_P(200, PSTR("text/html"), index_htm_gz, index_htm_gz_len); + #else if (!handleFileRead(server.uri())) handleNotFound(); - }); + #endif +}); - server.on("/upload", handleMinimalUpload); +server.on("/edit", HTTP_GET, [&](){ + #if defined(USE_HTML_MIN_GZ) + server.sendHeader("Content-Encoding", "gzip", true); + server.send_P(200, PSTR("text/html"), edit_htm_gz, edit_htm_gz_len); + #else + if (!handleFileRead("/edit.htm")) + handleNotFound(); + #endif +}); - server.on("/esp_status", HTTP_GET, []() { //get heap status, analog input value and all GPIO statuses in one json call - const size_t bufferSize = JSON_OBJECT_SIZE(31) + 1500; - DynamicJsonDocument jsonBuffer(bufferSize); - JsonObject root = jsonBuffer.to(); - root["HOSTNAME"] = HOSTNAME; - root["version"] = SKETCH_VERSION; - root["heap"] = ESP.getFreeHeap(); - root["sketch_size"] = ESP.getSketchSize(); - root["free_sketch_space"] = ESP.getFreeSketchSpace(); - root["flash_chip_size"] = ESP.getFlashChipSize(); - root["flash_chip_real_size"] = ESP.getFlashChipRealSize(); - root["flash_chip_speed"] = ESP.getFlashChipSpeed(); - root["sdk_version"] = ESP.getSdkVersion(); - root["core_version"] = ESP.getCoreVersion(); - root["cpu_freq"] = ESP.getCpuFreqMHz(); - root["chip_id"] = ESP.getFlashChipId(); - #if defined(USE_WS2812FX_DMA) - #if USE_WS2812FX_DMA == 0 - root["animation_lib"] = "WS2812FX_DMA"; - #endif - #if USE_WS2812FX_DMA == 1 - root["animation_lib"] = "WS2812FX_UART1"; - #endif - #if USE_WS2812FX_DMA == 2 - root["animation_lib"] = "WS2812FX_UART2"; - #endif - #else - root["animation_lib"] = "WS2812FX"; - #endif - root["ws2812_pin"] = WS2812FXStripSettings.pin; - root["led_count"] = WS2812FXStripSettings.stripSize; - root["rgb_order"] = WS2812FXStripSettings.RGBOrder; - if (strstr(WS2812FXStripSettings.RGBOrder, "W") != NULL) { - root["rgbw_mode"] = "ON"; - } else { - root["rgbw_mode"] = "OFF"; - } - #if defined(ENABLE_BUTTON) - root["button_mode"] = "ON"; - root["button_pin"] = ENABLE_BUTTON; - #else - root["button_mode"] = "OFF"; - #endif - #if defined(ENABLE_BUTTON_GY33) - root["button_gy33"] = "ON"; - root["gy33_pin"] = ENABLE_BUTTON_GY33; - #else - root["button_gy33"] = "OFF"; - #endif - #if defined(ENABLE_REMOTE) - root["ir_remote"] = "ON"; - root["tsop_ir_pin"] = ENABLE_REMOTE; - #else - root["ir_remote"] = "OFF"; - #endif - #if defined(ENABLE_MQTT) - #if ENABLE_MQTT == 0 - root["mqtt"] = "MQTT"; - #endif - #if ENABLE_MQTT == 1 - root["mqtt"] = "AMQTT"; - #endif - #else - root["mqtt"] = "OFF"; - #endif - #if defined(ENABLE_HOMEASSISTANT) - root["home_assistant"] = "ON"; - #else - root["home_assistant"] = "OFF"; - #endif - #if defined(ENABLE_OTA) - #if ENABLE_OTA == 0 - root["ota"] = "ARDUINO"; - #endif - #if ENABLE_OTA == 1 - root["ota"] = "HTTP"; - #endif - #else - root["ota"] = "OFF"; - #endif - #if defined(ENABLE_STATE_SAVE) - root["state_save"] = "SPIFFS"; - #else - root["state_save"] = "OFF"; - #endif - uint16_t msg_len = measureJson(root) + 1; - char * buffer = (char *) malloc(msg_len); - serializeJson(root, buffer, msg_len); - jsonBuffer.clear(); + +//called when the url is not defined here +//use it to load content from SPIFFS +server.onNotFound([]() { + if (!handleFileRead(server.uri())) + handleNotFound(); +}); + +server.on("/upload", handleMinimalUpload); + +server.on("/esp_status", HTTP_GET, []() { //get heap status, analog input value and all GPIO statuses in one json call + getESPStateJSON(); +}); + +server.on("/restart", []() { + DBG_OUTPUT_PORT.printf("/restart\r\n"); + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send(200, "text/plain", "restarting..." ); + ESP.restart(); +}); + +server.on("/reset_wlan", []() { + DBG_OUTPUT_PORT.printf("/reset_wlan\r\n"); + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send(200, "text/plain", "Resetting WLAN and restarting..." ); + WiFiManager wifiManager; + wifiManager.resetSettings(); + ESP.restart(); +}); + +server.on("/start_config_ap", []() { + DBG_OUTPUT_PORT.printf("/start_config_ap\r\n"); + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send(200, "text/plain", "Starting config AP ..." ); + WiFiManager wifiManager; + wifiManager.startConfigPortal(HOSTNAME); +}); + +server.on("/format_spiffs", []() { + DBG_OUTPUT_PORT.printf("/format_spiffs\r\n"); + server.send(200, "text/plain", "Formatting SPIFFS ..." ); + SPIFFS.format(); +}); + +server.on("/get_brightness", []() { + char str_brightness[4]; + snprintf(str_brightness, sizeof(str_brightness), "%i", (int) (brightness / 2.55)); + str_brightness[sizeof(str_brightness) - 1] = 0x00; + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send(200, "text/plain", str_brightness ); + DBG_OUTPUT_PORT.printf("/get_brightness: %i\r\n", (int) (brightness / 2.55)); +}); + +server.on("/get_speed", []() { + char str_speed[4]; + snprintf(str_speed, sizeof(str_speed), "%i", ws2812fx_speed); + str_speed[sizeof(str_speed) - 1] = 0x00; + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send(200, "text/plain", str_speed ); + DBG_OUTPUT_PORT.printf("/get_speed: %i\r\n", ws2812fx_speed); +}); + +server.on("/get_switch", []() { + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send(200, "text/plain", (mode == OFF) ? "0" : "1" ); + DBG_OUTPUT_PORT.printf("/get_switch: %s\r\n", (mode == OFF) ? "0" : "1"); +}); + +server.on("/get_color", []() { + char rgbcolor[10]; + snprintf(rgbcolor, sizeof(rgbcolor), "%02X%02X%02X%02X", main_color.white, main_color.red, main_color.green, main_color.blue); + rgbcolor[sizeof(rgbcolor) - 1] = 0x00; + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send(200, "text/plain", rgbcolor ); + DBG_OUTPUT_PORT.print("/get_color: "); + DBG_OUTPUT_PORT.println(rgbcolor); +}); + +server.on("/get_color2", []() { + char rgbcolor[10]; + snprintf(rgbcolor, sizeof(rgbcolor), "%02X%02X%02X%02X", back_color.white, back_color.red, back_color.green, back_color.blue); + rgbcolor[sizeof(rgbcolor) - 1] = 0x00; + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send(200, "text/plain", rgbcolor ); + DBG_OUTPUT_PORT.print("/get_color2: "); + DBG_OUTPUT_PORT.println(rgbcolor); +}); + +server.on("/get_color3", []() { + char rgbcolor[10]; + snprintf(rgbcolor, sizeof(rgbcolor), "%02X%02X%02X%02X", xtra_color.white, xtra_color.red, xtra_color.green, xtra_color.blue); + rgbcolor[sizeof(rgbcolor) - 1] = 0x00; + server.sendHeader("Access-Control-Allow-Origin", "*"); + server.send(200, "text/plain", rgbcolor ); + DBG_OUTPUT_PORT.print("/get_color3: "); + DBG_OUTPUT_PORT.println(rgbcolor); +}); + +server.on("/get_modes", []() { + getModesJSON(); +}); + +server.on("/status", []() { + getStateJSON(); +}); + +server.on("/config", []() { + + /* + + // This will be used later when web-interface is ready and HTTP_GET will not be allowed to update the Strip Settings + + if(server.args() == 0 and server.method() != HTTP_POST) + { server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send(200, "application/json", buffer); - free (buffer); - }); + server.send(200, "text/plain", "Only HTTP POST method is allowed and check the number of arguments!"); + return; + } + + */ + // ToDo do not save if no change + bool _updateStrip = false; + bool _updateConfig = false; + if(server.hasArg("ws_seg")){ + uint8_t wsseg = server.arg("ws_seg").toInt(); + num_segments = constrain(wsseg, 1, MAX_NUM_SEGMENTS - 1); + _updateStrip = true; + } + if(server.hasArg("ws_cnt")){ + uint16_t pixelCt = server.arg("ws_cnt").toInt(); + if (pixelCt > 0) { + WS2812FXStripSettings.stripSize = constrain(pixelCt, 1, MAXLEDS); + _updateStrip = true; + } + } + if(server.hasArg("ws_rgbo")){ + char tmp_rgbOrder[5]; + snprintf(tmp_rgbOrder, sizeof(tmp_rgbOrder), "%s", server.arg("ws_rgbo").c_str()); + tmp_rgbOrder[sizeof(tmp_rgbOrder) - 1] = 0x00; + checkRGBOrder(tmp_rgbOrder); + _updateStrip = true; + } - server.on("/restart", []() { - DBG_OUTPUT_PORT.printf("/restart\r\n"); - server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send(200, "text/plain", "restarting..." ); - ESP.restart(); - }); - - server.on("/reset_wlan", []() { - DBG_OUTPUT_PORT.printf("/reset_wlan\r\n"); - server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send(200, "text/plain", "Resetting WLAN and restarting..." ); - WiFiManager wifiManager; - wifiManager.resetSettings(); - ESP.restart(); - }); - - server.on("/start_config_ap", []() { - DBG_OUTPUT_PORT.printf("/start_config_ap\r\n"); - server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send(200, "text/plain", "Starting config AP ..." ); - WiFiManager wifiManager; - wifiManager.startConfigPortal(HOSTNAME); - }); - - server.on("/format_spiffs", []() { - DBG_OUTPUT_PORT.printf("/format_spiffs\r\n"); - server.send(200, "text/plain", "Formatting SPIFFS ..." ); - SPIFFS.format(); - }); - - server.on("/get_brightness", []() { - char str_brightness[4]; - snprintf(str_brightness, sizeof(str_brightness), "%i", (int) (brightness / 2.55)); - str_brightness[sizeof(str_brightness) - 1] = 0x00; - server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send(200, "text/plain", str_brightness ); - DBG_OUTPUT_PORT.printf("/get_brightness: %i\r\n", (int) (brightness / 2.55)); - }); - - server.on("/get_speed", []() { - char str_speed[4]; - snprintf(str_speed, sizeof(str_speed), "%i", ws2812fx_speed); - str_speed[sizeof(str_speed) - 1] = 0x00; - server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send(200, "text/plain", str_speed ); - DBG_OUTPUT_PORT.printf("/get_speed: %i\r\n", ws2812fx_speed); - }); - - server.on("/get_switch", []() { - server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send(200, "text/plain", (mode == OFF) ? "0" : "1" ); - DBG_OUTPUT_PORT.printf("/get_switch: %s\r\n", (mode == OFF) ? "0" : "1"); - }); - - server.on("/get_color", []() { - char rgbcolor[10]; - snprintf(rgbcolor, sizeof(rgbcolor), "%02X%02X%02X%02X", main_color.white, main_color.red, main_color.green, main_color.blue); - rgbcolor[sizeof(rgbcolor) - 1] = 0x00; - server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send(200, "text/plain", rgbcolor ); - DBG_OUTPUT_PORT.print("/get_color: "); - DBG_OUTPUT_PORT.println(rgbcolor); - }); - - server.on("/get_color2", []() { - char rgbcolor[10]; - snprintf(rgbcolor, sizeof(rgbcolor), "%02X%02X%02X%02X", back_color.white, back_color.red, back_color.green, back_color.blue); - rgbcolor[sizeof(rgbcolor) - 1] = 0x00; - server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send(200, "text/plain", rgbcolor ); - DBG_OUTPUT_PORT.print("/get_color2: "); - DBG_OUTPUT_PORT.println(rgbcolor); - }); - - server.on("/get_color3", []() { - char rgbcolor[10]; - snprintf(rgbcolor, sizeof(rgbcolor), "%02X%02X%02X%02X", xtra_color.white, xtra_color.red, xtra_color.green, xtra_color.blue); - rgbcolor[sizeof(rgbcolor) - 1] = 0x00; - server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send(200, "text/plain", rgbcolor ); - DBG_OUTPUT_PORT.print("/get_color3: "); - DBG_OUTPUT_PORT.println(rgbcolor); - }); - - server.on("/get_modes", []() { - getModesJSON(); - }); - - server.on("/status", []() { - getStatusJSON(); - }); - - server.on("/config", []() { - - /* - - // This will be used later when web-interface is ready and HTTP_GET will not be allowed to update the Strip Settings - - if(server.args() == 0 and server.method() != HTTP_POST) - { - server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send(200, "text/plain", "Only HTTP POST method is allowed and check the number of arguments!"); - return; - } - - */ - - bool updateStrip = false; - bool updateConf = false; - if(server.hasArg("ws_seg")){ - uint8_t wsseg = server.arg("ws_seg").toInt(); - num_segments = constrain(wsseg, 1, MAX_NUM_SEGMENTS - 1); - updateStrip = true; - } - if(server.hasArg("ws_cnt")){ - uint16_t pixelCt = server.arg("ws_cnt").toInt(); - if (pixelCt > 0) { - WS2812FXStripSettings.stripSize = constrain(pixelCt, 1, MAXLEDS); - updateStrip = true; - } - } - if(server.hasArg("ws_rgbo")){ - char tmp_rgbOrder[5]; - snprintf(tmp_rgbOrder, sizeof(tmp_rgbOrder), "%s", server.arg("ws_rgbo").c_str()); - tmp_rgbOrder[sizeof(tmp_rgbOrder) - 1] = 0x00; - checkRGBOrder(tmp_rgbOrder); - updateStrip = true; - } - #if !defined(USE_WS2812FX_DMA) - if(server.hasArg("ws_pin")){ - if (checkPin(server.arg("ws_pin").toInt())) { - updateStrip = true; - DBG_OUTPUT_PORT.print("Pin was set to: "); - DBG_OUTPUT_PORT.println(WS2812FXStripSettings.pin); - } else { - DBG_OUTPUT_PORT.println("invalid input!"); - } + if(server.hasArg("ws_pin")){ + if (checkPin(server.arg("ws_pin").toInt())) { + _updateStrip = true; + DBG_OUTPUT_PORT.print("Pin was set to: "); + DBG_OUTPUT_PORT.println(WS2812FXStripSettings.pin); + } else { + DBG_OUTPUT_PORT.println("invalid input!"); } + } #endif - - if(server.hasArg("ws_fxopt")){ - WS2812FXStripSettings.fxoptions = ((constrain(server.arg("ws_fxopt").toInt(), 0, 255)>>1)<<1); - updateStrip = true; - } + + if(server.hasArg("ws_fxopt")){ + WS2812FXStripSettings.fxoptions = ((constrain(server.arg("ws_fxopt").toInt(), 0, 255)>>1)<<1); + _updateStrip = true; + } - if(updateStrip) { - mode = INIT_STRIP; - } - - if(server.hasArg("hostname")){ - snprintf(HOSTNAME, sizeof(HOSTNAME), "%s", server.arg("hostname").c_str()); - HOSTNAME[sizeof(HOSTNAME) - 1] = 0x00; - updateConf = true; - } - + if(_updateStrip) { + initStrip(); + } + + if(server.hasArg("hostname")){ + snprintf(HOSTNAME, sizeof(HOSTNAME), "%s", server.arg("hostname").c_str()); + HOSTNAME[sizeof(HOSTNAME) - 1] = 0x00; + _updateConfig = true; + } + #if defined(ENABLE_MQTT) - if(server.hasArg("mqtt_host")){ - snprintf(mqtt_host, sizeof(mqtt_host), "%s", server.arg("mqtt_host").c_str()); - mqtt_host[sizeof(mqtt_host) - 1] = 0x00; - updateConf = true; - } - if(server.hasArg("mqtt_port")){ - if ((server.arg("mqtt_port").toInt() >= 0) && (server.arg("mqtt_port").toInt() <=65535)) { - mqtt_port = server.arg("mqttport").toInt(); - updateConf = true; - } - } - if(server.hasArg("mqtt_user")){ - snprintf(mqtt_user, sizeof(mqtt_user), "%s", server.arg("mqtt_user").c_str()); - mqtt_user[sizeof(mqtt_user) - 1] = 0x00; - updateConf = true; - } - if(server.hasArg("mqtt_pass")){ - snprintf(mqtt_pass, sizeof(mqtt_pass), "%s", server.arg("mqtt_pass").c_str()); - mqtt_pass[sizeof(mqtt_pass) - 1] = 0x00; - updateConf = true; - } - if (updateConf) { - initMqtt(); - } + if(server.hasArg("mqtt_host")){ + snprintf(mqtt_host, sizeof(mqtt_host), "%s", server.arg("mqtt_host").c_str()); + mqtt_host[sizeof(mqtt_host) - 1] = 0x00; + _updateConfig = true; + } + if(server.hasArg("mqtt_port")){ + if ((server.arg("mqtt_port").toInt() >= 0) && (server.arg("mqtt_port").toInt() <=65535)) { + mqtt_port = server.arg("mqttport").toInt(); + _updateConfig = true; + } + } + if(server.hasArg("mqtt_user")){ + snprintf(mqtt_user, sizeof(mqtt_user), "%s", server.arg("mqtt_user").c_str()); + mqtt_user[sizeof(mqtt_user) - 1] = 0x00; + _updateConfig = true; + } + if(server.hasArg("mqtt_pass")){ + snprintf(mqtt_pass, sizeof(mqtt_pass), "%s", server.arg("mqtt_pass").c_str()); + mqtt_pass[sizeof(mqtt_pass) - 1] = 0x00; + _updateConfig = true; + } + if (_updateConfig) { + initMqtt(); + } #endif - if(server.hasArg("trans_effect")){ - transEffect = server.arg("trans_effect").toInt(); - updateConf = true; - } + if(server.hasArg("trans_effect")){ + transEffect = server.arg("trans_effect").toInt(); + _updateConfig = true; + } #if defined(ENABLE_STATE_SAVE) - if (updateStrip || updateConf) { - if(!settings_save_conf.active()) settings_save_conf.once(3, tickerSaveConfig); - } + if (_updateStrip || _updateConfig) { + if(!save_conf.active()) save_conf.once(3, tickerSaveConfig); + } #endif - updateStrip = false; - updateConf = false; - getConfigJSON(); - }); - - server.on("/off", []() { + _updateStrip = false; + _updateConfig = false; + getConfigJSON(); +}); + +server.on("/off", []() { + if (prevmode != OFF) { mode = OFF; - getStatusJSON(); - }); + getStateJSON(); + #if defined(ENABLE_STATE_SAVE) + if(!save_state.active()) save_state.once(3, tickerSaveState); + #endif + } +}); - server.on("/on", []() { +server.on("/on", []() { + if (prevmode == OFF) { mode = SET; - getStatusJSON(); - }); + getStateJSON(); + #if defined(ENABLE_STATE_SAVE) + if(!save_state.active()) save_state.once(3, tickerSaveState); + #endif + } +}); - server.on("/set", []() { - prevmode = HOLD; - ws2812fx_mode = FX_MODE_STATIC; +server.on("/set", []() { + prevmode = HOLD; + ws2812fx_mode = FX_MODE_STATIC; + boolean _updateState = false; + boolean _updateSegState = false; + // Segment + if ((server.arg("seg") != "") && (server.arg("seg").toInt() >= 0) && (server.arg("seg").toInt() <= MAX_NUM_SEGMENTS)) { + segment = server.arg("seg").toInt(); + if (prevsegment != segment) { + prevsegment = segment; + getSegmentParams(segment); + memcpy(hex_colors_trans, hex_colors, sizeof(hex_colors_trans)); + mode = SET; + _updateState = true; + } + } + //color wrgb + if (server.arg("rgb") != "") { + uint32_t rgb = (uint32_t) strtoul(server.arg("rgb").c_str(), NULL, 16); + main_color.white = ((rgb >> 24) & 0xFF); + main_color.red = ((rgb >> 16) & 0xFF); + main_color.green = ((rgb >> 8) & 0xFF); + main_color.blue = ((rgb >> 0) & 0xFF); + } else { + if ((server.arg("r") != "") && (server.arg("r").toInt() >= 0) && (server.arg("r").toInt() <= 255)) { + main_color.red = server.arg("r").toInt(); + } + if ((server.arg("g") != "") && (server.arg("g").toInt() >= 0) && (server.arg("g").toInt() <= 255)) { + main_color.green = server.arg("g").toInt(); + } + if ((server.arg("b") != "") && (server.arg("b").toInt() >= 0) && (server.arg("b").toInt() <= 255)) { + main_color.blue = server.arg("b").toInt(); + } + if ((server.arg("w") != "") && (server.arg("w").toInt() >= 0) && (server.arg("w").toInt() <= 255)){ + main_color.white = server.arg("w").toInt(); + } + } + if (server.arg("rgb2") != "") { + uint32_t rgb2 = (uint32_t) strtoul(server.arg("rgb2").c_str(), NULL, 16); + back_color.white = ((rgb2 >> 24) & 0xFF); + back_color.red = ((rgb2 >> 16) & 0xFF); + back_color.green = ((rgb2 >> 8) & 0xFF); + back_color.blue = ((rgb2 >> 0) & 0xFF); + } else { + if ((server.arg("r2") != "") && (server.arg("r2").toInt() >= 0) && (server.arg("r2").toInt() <= 255)) { + back_color.red = server.arg("r2").toInt(); + } + if ((server.arg("g2") != "") && (server.arg("g2").toInt() >= 0) && (server.arg("g2").toInt() <= 255)) { + back_color.green = server.arg("g2").toInt(); + } + if ((server.arg("b2") != "") && (server.arg("b2").toInt() >= 0) && (server.arg("b2").toInt() <= 255)) { + back_color.blue = server.arg("b2").toInt(); + } + if ((server.arg("w2") != "") && (server.arg("w2").toInt() >= 0) && (server.arg("w2").toInt() <= 255)){ + back_color.white = server.arg("w2").toInt(); + } + } + if (server.arg("rgb3") != "") { + uint32_t rgb3 = (uint32_t) strtoul(server.arg("rgb3").c_str(), NULL, 16); + xtra_color.white = ((rgb3 >> 24) & 0xFF); + xtra_color.red = ((rgb3 >> 16) & 0xFF); + xtra_color.green = ((rgb3 >> 8) & 0xFF); + xtra_color.blue = ((rgb3 >> 0) & 0xFF); + } else { + if ((server.arg("r3") != "") && (server.arg("r3").toInt() >= 0) && (server.arg("r3").toInt() <= 255)) { + xtra_color.red = server.arg("r3").toInt(); + } + if ((server.arg("g3") != "") && (server.arg("g3").toInt() >= 0) && (server.arg("g3").toInt() <= 255)) { + xtra_color.green = server.arg("g3").toInt(); + } + if ((server.arg("b3") != "") && (server.arg("b3").toInt() >= 0) && (server.arg("b3").toInt() <= 255)) { + xtra_color.blue = server.arg("b3").toInt(); + } + if ((server.arg("w3") != "") && (server.arg("w3").toInt() >= 0) && (server.arg("w3").toInt() <= 255)){ + xtra_color.white = server.arg("w3").toInt(); + } + } + main_color.red = constrain(main_color.red, 0, 255); + main_color.green = constrain(main_color.green, 0, 255); + main_color.blue = constrain(main_color.blue, 0, 255); + main_color.white = constrain(main_color.white, 0, 255); + back_color.red = constrain(back_color.red, 0, 255); + back_color.green = constrain(back_color.green, 0, 255); + back_color.blue = constrain(back_color.blue, 0, 255); + back_color.white = constrain(back_color.white, 0, 255); + xtra_color.red = constrain(xtra_color.red, 0, 255); + xtra_color.green = constrain(xtra_color.green, 0, 255); + xtra_color.blue = constrain(xtra_color.blue, 0, 255); + xtra_color.white = constrain(xtra_color.white, 0, 255); + + + // Speed + if ((server.arg("s") != "") && (server.arg("s").toInt() >= 0) && (server.arg("s").toInt() <= 255)) { + ws2812fx_speed = constrain(server.arg("s").toInt(), 0, 255); mode = SET; - getArgs(); - getStatusJSON(); - }); + _updateSegState = true; + } + //Mode + if ((server.arg("m") != "") && (server.arg("m").toInt() >= 0) && (server.arg("m").toInt() <= strip->getModeCount())) { + ws2812fx_mode = constrain(server.arg("m").toInt(), 0, strip->getModeCount() - 1); + if (ws2812fx_mode != strip->getMode(segment)) { + mode = SET; + _updateSegState = true; + } + } + + // Brightness + if ((server.arg("c") != "") && (server.arg("c").toInt() >= 0) && (server.arg("c").toInt() <= 100)) { + brightness = constrain((int) server.arg("c").toInt() * 2.55, 0, 255); + } else if ((server.arg("p") != "") && (server.arg("p").toInt() >= 0) && (server.arg("p").toInt() <= 255)) { + brightness = constrain(server.arg("p").toInt(), 0, 255); + } + if (strip->getBrightness() != brightness) { + mode = SET; + _updateState = true; + } + DBG_OUTPUT_PORT.printf("Get Args: %s\r\n", listStateJSONfull()); + getStateJSON(); + +#if defined(ENABLE_STATE_SAVE) + if (_updateState) { + DBG_OUTPUT_PORT.println("Saving stripstate.json!"); + if(!save_state.active()) save_state.once(3, tickerSaveState); + } + if (_updateSegState) { + DBG_OUTPUT_PORT.println("Saving stripstate_segment.json!"); + if(!save_seg_state.active()) save_seg_state.once(3, tickerSaveSegmentState); + } +#endif + _updateState = false; + _updateSegState = false; +}); + + diff --git a/Arduino/McLighting/trash.ino b/Arduino/McLighting/trash.ino deleted file mode 100644 index 10cec98..0000000 --- a/Arduino/McLighting/trash.ino +++ /dev/null @@ -1,33 +0,0 @@ -char * listStatusJSON2() { - const size_t bufferSize = 10*JSON_ARRAY_SIZE(12) + 10*JSON_OBJECT_SIZE(4) + JSON_OBJECT_SIZE(12) + 600; - DynamicJsonDocument jsonBuffer(bufferSize); - JsonObject root = jsonBuffer.to(); - root["mode"] = (uint8_t) mode; - root["brightness"] = brightness; - for(uint8_t i=0; i<10; i++) { - char int2char[3]; - itoa(i, int2char, 10); - JsonObject segments = root.createNestedObject(int2char); - segments["ws2812fx_mode"] = strip->getMode(i); - segments["ws2812fx_mode_name"] = strip->getModeName(strip->getMode(i)); - segments["speed"] = ws2812fx_speed; - JsonArray color = segments.createNestedArray("color"); - color.add(main_color.white); - color.add(main_color.red); - color.add(main_color.green); - color.add(main_color.blue); - color.add(back_color.white); - color.add(back_color.red); - color.add(back_color.green); - color.add(back_color.blue); - color.add(xtra_color.white); - color.add(xtra_color.red); - color.add(xtra_color.green); - color.add(xtra_color.blue); - } - uint16_t msg_len = measureJson(root) + 1; - char * buffer = (char *) malloc(msg_len); - serializeJson(root, buffer, msg_len); - jsonBuffer.clear(); - return buffer; -} diff --git a/Arduino/McLighting/version.h b/Arduino/McLighting/version.h index 55e0789..75c5dc1 100644 --- a/Arduino/McLighting/version.h +++ b/Arduino/McLighting/version.h @@ -1 +1 @@ -#define SKETCH_VERSION "3.0.0.BETA1" +#define SKETCH_VERSION "3.1.0.ALPHA2" diff --git a/Arduino/McLighting/version_info.ino b/Arduino/McLighting/version_info.ino index 9bde1ea..cc4eca4 100644 --- a/Arduino/McLighting/version_info.ino +++ b/Arduino/McLighting/version_info.ino @@ -195,4 +195,10 @@ * removal of saving to EEPROM * first integration of multi segments * + * * 3 October 2019 + * Version Bump to 3.1.0.ALPHA2 + * further code changes + * further integration of multi segments + * integration of multi segments to GUI + * */ From df43aba37bda2c1080c9973c6abb69f1337b91cc Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Sun, 6 Oct 2019 15:38:57 +0200 Subject: [PATCH 14/28] 3.1.0.ALPHA3 * further code changes * further integration of multi segments * known problem: as always: AUTOPLAY (as it is not multi segment capable yet) --- Arduino/McLighting/McLighting.ino | 108 +++--- Arduino/McLighting/data/index.htm | 337 ++++++++++-------- Arduino/McLighting/definitions.h | 31 +- Arduino/McLighting/filesystem_functions.h | 22 +- Arduino/McLighting/helper_functions.h | 134 +++---- Arduino/McLighting/json_functions.h | 92 ++--- .../mode_custom_ws2812fx_animations.h | 320 ++++++++--------- Arduino/McLighting/request_handlers.h | 193 +++++----- Arduino/McLighting/rest_api.h | 139 +++++--- 9 files changed, 736 insertions(+), 640 deletions(-) diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino index 644b281..7cb7dac 100644 --- a/Arduino/McLighting/McLighting.ino +++ b/Arduino/McLighting/McLighting.ino @@ -359,27 +359,27 @@ void setup() { (readConfigFS()) ? DBG_OUTPUT_PORT.println("WiFiManager config FS read success!"): DBG_OUTPUT_PORT.println("WiFiManager config FS Read failure!"); delay(250); (readStateFS()) ? DBG_OUTPUT_PORT.println("Strip state config FS read Success!") : DBG_OUTPUT_PORT.println("Strip state config FS read failure!"); - char tmp_strip_size[6], tmp_fxoptions[5], tmp_rgbOrder[5]; //needed tempararily for WiFiManager Settings + char _stripSize[6], _fx_options[5], _rgbOrder[5]; //needed tempararily for WiFiManager Settings WiFiManagerParameter custom_hostname("hostname", "Hostname", HOSTNAME, 64, " maxlength=64"); #if defined(ENABLE_MQTT) - char tmp_mqtt_port[6]; //needed tempararily for WiFiManager Settings + char _mqtt_port[6]; //needed tempararily for WiFiManager Settings WiFiManagerParameter custom_mqtt_host("host", "MQTT hostname", mqtt_host, 64, " maxlength=64"); - sprintf(tmp_mqtt_port, "%d", mqtt_port); - WiFiManagerParameter custom_mqtt_port("port", "MQTT port", tmp_mqtt_port, 5, " maxlength=5 type=\"number\""); + sprintf(_mqtt_port, "%d", mqtt_port); + WiFiManagerParameter custom_mqtt_port("port", "MQTT port", _mqtt_port, 5, " maxlength=5 type=\"number\""); WiFiManagerParameter custom_mqtt_user("user", "MQTT user", mqtt_user, 32, " maxlength=32"); WiFiManagerParameter custom_mqtt_pass("pass", "MQTT pass", mqtt_pass, 32, " maxlength=32 type=\"password\""); #endif - sprintf(tmp_strip_size, "%d", WS2812FXStripSettings.stripSize); - WiFiManagerParameter custom_strip_size("strip_size", "Number of LEDs", tmp_strip_size, 4, " maxlength=4 type=\"number\""); + sprintf(_stripSize, "%d", FXSettings.stripSize); + WiFiManagerParameter custom_strip_size("strip_size", "Number of LEDs", _stripSize, 4, " maxlength=4 type=\"number\""); #if !defined(USE_WS2812FX_DMA) char tmp_led_pin[3]; - sprintf(tmp_led_pin, "%d", WS2812FXStripSettings.pin); + sprintf(tmp_led_pin, "%d", FXSettings.pin); WiFiManagerParameter custom_led_pin("led_pin", "LED GPIO", tmp_led_pin, 2, " maxlength=2 type=\"number\""); #endif - sprintf(tmp_rgbOrder, "%s", WS2812FXStripSettings.RGBOrder); - WiFiManagerParameter custom_rgbOrder("rgbOrder", "RGBOrder", tmp_rgbOrder, 4, " maxlength=4"); - sprintf(tmp_fxoptions, "%d", WS2812FXStripSettings.fxoptions); - WiFiManagerParameter custom_fxoptions("fxoptions", "fxOptions", tmp_fxoptions, 3, " maxlength=3"); + sprintf(_rgbOrder, "%s", FXSettings.RGBOrder); + WiFiManagerParameter custom_rgbOrder("rgbOrder", "RGBOrder", _rgbOrder, 4, " maxlength=4"); + sprintf(_fx_options, "%d", fx_options); + WiFiManagerParameter custom_fxoptions("fxoptions", "fxOptions", _fx_options, 3, " maxlength=3"); #endif @@ -443,14 +443,14 @@ void setup() { strcpy(mqtt_user, custom_mqtt_user.getValue()); strcpy(mqtt_pass, custom_mqtt_pass.getValue()); #endif - strcpy(tmp_strip_size, custom_strip_size.getValue()); - WS2812FXStripSettings.stripSize = constrain(atoi(custom_strip_size.getValue()), 1, MAXLEDS); + strcpy(_stripSize, custom_strip_size.getValue()); + FXSettings.stripSize = constrain(atoi(custom_strip_size.getValue()), 1, MAXLEDS); #if !defined(USE_WS2812FX_DMA) checkPin(atoi(custom_led_pin.getValue())); #endif - strcpy(tmp_rgbOrder, custom_rgbOrder.getValue()); - checkRGBOrder(tmp_rgbOrder); - WS2812FXStripSettings.fxoptions = atoi(custom_fxoptions.getValue()); + strcpy(_rgbOrder, custom_rgbOrder.getValue()); + checkRGBOrder(_rgbOrder); + fx_options = atoi(custom_fxoptions.getValue()); if (updateConfig) { (writeConfigFS(updateConfig)) ? DBG_OUTPUT_PORT.println("WiFiManager config FS Save success!"): DBG_OUTPUT_PORT.println("WiFiManager config FS Save failure!"); } @@ -561,7 +561,7 @@ void setup() { #if defined(ENABLE_REMOTE) irrecv.enableIRIn(); // Start the receiver #endif - ws2812fx_speed_actual = ws2812fx_speed; + fx_speed_actual = fx_speed; brightness_trans = brightness; memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); initStrip(); @@ -625,7 +625,7 @@ void loop() { // Simple statemachine that handles the different modes // *************************************************************************** - if ((mode == OFF) && ((strip->getBrightness() == 0) || !transEffect)) { + if ((mode == OFF) && ((strip->getBrightness() == 0) || !FXSettings.transEffect)) { if(strip->isRunning()) { strip->strip_off(); // Workaround: to be shure, delay(10); // that strip is really off. Sometimes strip->stop isn't enought @@ -649,7 +649,7 @@ void loop() { #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =off", ""); #endif - if (transEffect) { + if (FXSettings.transEffect) { brightness_trans = 0; } } @@ -658,21 +658,21 @@ void loop() { if (mode == SET) { mode = HOLD; // Segment - if (prevsegment != segment) { + if (prevsegment != FXSettings.segment) { #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK S%i", segment); + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK Ss%i", FXSettings.segment); #endif - prevsegment = segment; + prevsegment = FXSettings.segment; } // Mode - if (ws2812fx_mode != strip->getMode(segment)) { + if (fx_mode != strip->getMode(FXSettings.segment)) { #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", ws2812fx_mode); + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", fx_mode); #endif strip->strip_off(); autoCount = 0; autoDelay = 0; - strip->setMode(segment, ws2812fx_mode); + strip->setMode(FXSettings.segment, fx_mode); } //Color /*if (memcmp(hex_colors_trans, strip->getColors(selected_segment), sizeof(hex_colors_trans)) != 0) { @@ -686,17 +686,17 @@ void loop() { brightness_trans = brightness; } // Speed - if (ws2812fx_speed_actual != ws2812fx_speed) { + if (fx_speed_actual != fx_speed) { #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK ?%i", ws2812fx_speed); + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK ?%i", fx_speed); #endif } prevmode = SET; strip->trigger(); } - if ((mode == HOLD) || ((mode == OFF) && (strip->getBrightness() > 0) && transEffect)) { - if (ws2812fx_mode == FX_MODE_CUSTOM_0) { + if ((mode == HOLD) || ((mode == OFF) && (strip->getBrightness() > 0) && FXSettings.transEffect)) { + if (fx_mode == FX_MODE_CUSTOM_0) { handleAutoPlay(); } if(!strip->isRunning()) strip->start(); @@ -705,11 +705,11 @@ void loop() { if (prevmode != mode) { convertColors(); - if (memcmp(hex_colors_trans, strip->getColors(segment), sizeof(hex_colors_trans)) != 0) { + if (memcmp(hex_colors_trans, strip->getColors(FXSettings.segment), sizeof(hex_colors_trans)) != 0) { convertColorsFade(); trans_cnt = 1; } - strip->setSpeed(segment, convertSpeed(ws2812fx_speed_actual)); + strip->setSpeed(FXSettings.segment, convertSpeed(fx_speed_actual)); //strip->setBrightness(brightness_actual); #if defined(ENABLE_MQTT) #if ENABLE_MQTT == 0 @@ -731,8 +731,7 @@ void loop() { (writeStateFS(updateState)) ? DBG_OUTPUT_PORT.println("State FS Save Success!") : DBG_OUTPUT_PORT.println("State FS Save failure!"); } if (updateSegState) { - (writeSegmentStateFS(updateSegState, segment)) ? DBG_OUTPUT_PORT.println("Segment State FS Save Success!") : DBG_OUTPUT_PORT.println("Segment State FS Save failure!"); - initStrip(); + (writeSegmentStateFS(updateSegState, FXSettings.segment)) ? DBG_OUTPUT_PORT.println("Segment State FS Save Success!") : DBG_OUTPUT_PORT.println("Segment State FS Save failure!"); } if (updateConfig) { (writeConfigFS(updateConfig)) ? DBG_OUTPUT_PORT.println("Config FS Save success!"): DBG_OUTPUT_PORT.println("Config FS Save failure!"); @@ -740,14 +739,14 @@ void loop() { #endif // Async color transition - if (memcmp(hex_colors_trans, strip->getColors(segment), sizeof(hex_colors_trans)) != 0) { - if (transEffect) { + if (memcmp(hex_colors_trans, strip->getColors(FXSettings.segment), sizeof(hex_colors_trans)) != 0) { + if (FXSettings.transEffect) { if ((trans_cnt > 0) && (trans_cnt < trans_cnt_max)) { if (colorFadeDelay <= millis()) { uint32_t hex_colors_actual[3] = {}; - hex_colors_actual[0] = trans(hex_colors_trans[0], hex_colors[0], trans_cnt); - hex_colors_actual[1] = trans(hex_colors_trans[1], hex_colors[1], trans_cnt); - hex_colors_actual[2] = trans(hex_colors_trans[2], hex_colors[2], trans_cnt); + hex_colors_actual[0] = trans(hex_colors_trans[0], hex_colors[0], trans_cnt, trans_cnt_max); + hex_colors_actual[1] = trans(hex_colors_trans[1], hex_colors[1], trans_cnt, trans_cnt_max); + hex_colors_actual[2] = trans(hex_colors_trans[2], hex_colors[2], trans_cnt, trans_cnt_max); strip->setColors(prevsegment, hex_colors_actual); trans_cnt++; colorFadeDelay = millis() + TRANS_COLOR_DELAY; @@ -768,33 +767,34 @@ void loop() { } } // Async speed transition - if (ws2812fx_speed_actual != ws2812fx_speed) { - if (transEffect) { + if (fx_speed_actual != fx_speed) { + //if (FXSettings.transEffect) { + if (true == false) { if (speedFadeDelay <= millis()) { DBG_OUTPUT_PORT.println("Speed actual: "); - DBG_OUTPUT_PORT.println(ws2812fx_speed_actual); - DBG_OUTPUT_PORT.println(convertSpeed(ws2812fx_speed_actual)); - DBG_OUTPUT_PORT.println(unconvertSpeed(convertSpeed(ws2812fx_speed_actual))); - if (ws2812fx_speed_actual < ws2812fx_speed) { - ws2812fx_speed_actual++; + DBG_OUTPUT_PORT.println(fx_speed_actual); + DBG_OUTPUT_PORT.println(convertSpeed(fx_speed_actual)); + DBG_OUTPUT_PORT.println(unconvertSpeed(convertSpeed(fx_speed_actual))); + if (fx_speed_actual < fx_speed) { + fx_speed_actual++; } - if (ws2812fx_speed_actual > ws2812fx_speed) { - ws2812fx_speed_actual--; + if (fx_speed_actual > fx_speed) { + fx_speed_actual--; } speedFadeDelay = millis() + TRANS_DELAY; - strip->setSpeed(prevsegment, convertSpeed(ws2812fx_speed_actual)); + strip->setSpeed(prevsegment, convertSpeed(fx_speed_actual)); if (mode == HOLD) strip->trigger(); } } else { - ws2812fx_speed_actual = ws2812fx_speed; - strip->setSpeed(prevsegment, convertSpeed(ws2812fx_speed_actual)); + fx_speed_actual = fx_speed; + strip->setSpeed(prevsegment, convertSpeed(fx_speed_actual)); if (mode == HOLD) strip->trigger(); } } // Async brightness transition if (strip->getBrightness() != brightness_trans) { - if (transEffect) { + if (FXSettings.transEffect) { if(brightnessFadeDelay <= millis()) { if (strip->getBrightness() < brightness_trans) { strip->increaseBrightness(1); @@ -814,9 +814,9 @@ void loop() { } /* // Segment change only if color and speed transitions are finished, because they are segment specific - if (prevsegment != segment) { - if ((memcmp(hex_colors_trans, strip->getColors(segment), sizeof(hex_colors_trans)) == 0) && (ws2812fx_speed_actual == ws2812fx_speed)) { - segment = prevsegment; + if (prevsegment != FXSettings.segment) { + if ((memcmp(hex_colors_trans, strip->getColors(FXSettings.segment), sizeof(hex_colors_trans)) == 0) && (fx_speed_actual == fx_speed)) { + FXSettings.segment = prevsegment; } } */ diff --git a/Arduino/McLighting/data/index.htm b/Arduino/McLighting/data/index.htm index 48bc40b..592899e 100644 --- a/Arduino/McLighting/data/index.htm +++ b/Arduino/McLighting/data/index.htm @@ -910,7 +910,7 @@ input[type=number], label{
- +
@@ -979,6 +979,14 @@ input[type=number], label{
+
+

segStart

+ +
+

segStop

+ +
+

selectOPTREV

@@ -993,14 +1001,6 @@ input[type=number], label{
-
-

segStart

- -
-

segStop

- -
-

selectColors

@@ -1048,6 +1048,7 @@ var language = { connectError2: " times. Please use the RECONNECT button to try again.", loadModes: "Loading modes ...", // This language-string is not translated (settings not loaded yet) loadSettings: "Loading settings ...", // This language-string is not translated (settings not loaded yet) + loadConfig: "Loading configuration ...", loadWebsock: "Connecting websockets ...", loadReady: "Ready ...", loadError: "Error loading animation modes, please try again...", // This language-string is not translated (settings not loaded yet) @@ -1108,6 +1109,7 @@ var language = { connectError2: " keer geprobeerd. Gebruik de Verbind opnieuw knop om opnieuw te proberen.", loadModes: "Modes laden...", // This language-string is not translated (settings not loaded yet) loadSettings: "Instellingen laden...", // This language-string is not translated (settings not loaded yet) + loadConfig: "Configuratie laden ...", loadWebsock: "Websockets verbinden...", loadReady: "Klaar...", loadError: "Fout bij laden van animatie modes, probeer opnieuw...", // This language-string is not translated (settings not loaded yet) @@ -1168,6 +1170,7 @@ var language = { connectError2: " mal versucht. Benutze WIEDER VERBINDEN, um es nochmal zu probieren.", loadModes: "Lade Modi ...", // This language-string is not translated (settings not loaded yet) loadSettings: "Lade Einstellungen ...", // This language-string is not translated (settings not loaded yet) + loadConfig: "Lade Konfiguration ...", loadWebsock: "Verbinde Websockets ...", loadReady: "Fertig ...", loadError: "Fehler beim Laden der Animations-Modi, bitte nochmal versuchen...", // This language-string is not translated (settings not loaded yet) @@ -1315,19 +1318,27 @@ var config = { ws_cnt: 0, ws_rgbo: "", ws_pin: 0, - ws_fxopt: 0, - enable_rgbw: false, - transitionEffects: true + ws_trans: false, + enable_rgbw: false }; -var data = { +var state = { + mode: 0, segment: 0, + brightness: 192 +} + +var segstate = { start: 0, stop: 0, - mode: 0, - color: {w:0, r:0, g:0, b:0, hex:"00000000", w2:0, r2:0, g2:0, b2:0, hex2:"00000000", w3:0, r3:0, g3:0, b3:0, hex3:"00000000"}, - brightness: 192, + mode: null, speed: 192, - ws2812fx_mode: null, + color: {w:0, r:0, g:0, b:0, hex:"00000000", w2:0, r2:0, g2:0, b2:0, hex2:"00000000", w3:0, r3:0, g3:0, b3:0, hex3:"00000000"}, + ws_fxopt: 0 +} + + +var data = { + init: true, color_num: 1, modes: [], connection: null, @@ -1335,7 +1346,6 @@ var data = { num_additional_connections: 0, is_connected: false, refresh_interval: 0, - init: true, color_disabled: false }; var sendIt; // Timer to prevent lots of sending @@ -1365,12 +1375,12 @@ function displayColors(all = false) { clearTimeout(sendIt); sendIt = setTimeout(function() { set_color(); }, 50); } else { - document.getElementById("colorSel1").style.backgroundColor = `rgb(${data.color.r}, ${data.color.g}, ${data.color.b})`; - document.getElementById("colorHex1").innerHTML = "#" + data.color.hex; - document.getElementById("colorSel2").style.backgroundColor = `rgb(${data.color.r2}, ${data.color.g2}, ${data.color.b2})`; - document.getElementById("colorHex2").innerHTML = "#" + data.color.hex2; - document.getElementById("colorSel3").style.backgroundColor = `rgb(${data.color.r3}, ${data.color.g3}, ${data.color.b3})`; - document.getElementById("colorHex3").innerHTML = "#" + data.color.hex3; + document.getElementById("colorSel1").style.backgroundColor = `rgb(${segstate.color.r}, ${segstate.color.g}, ${segstate.color.b})`; + document.getElementById("colorHex1").innerHTML = "#" + segstate.color.hex; + document.getElementById("colorSel2").style.backgroundColor = `rgb(${segstate.color.r2}, ${segstate.color.g2}, ${segstate.color.b2})`; + document.getElementById("colorHex2").innerHTML = "#" + segstate.color.hex2; + document.getElementById("colorSel3").style.backgroundColor = `rgb(${segstate.color.r3}, ${segstate.color.g3}, ${segstate.color.b3})`; + document.getElementById("colorHex3").innerHTML = "#" + segstate.color.hex3; } } @@ -1411,44 +1421,44 @@ function initSliderColors(){ function changeRangeNumVal(){ redNumVal.addEventListener('change', ()=>{ // make sure numbers are entered between 0 to 255 - red.value = checkNumVal(redNumVal, red.value); - if (data.color_num === 1) data.color.r = red.value; - if (data.color_num === 2) data.color.r2 = red.value; - if (data.color_num === 3) data.color.r3 = red.value; + red.value = checkNumVal8(redNumVal, red.value); + if (data.color_num === 1) segstate.color.r = red.value; + if (data.color_num === 2) segstate.color.r2 = red.value; + if (data.color_num === 3) segstate.color.r3 = red.value; initSliderColors(); displayColors(); }); greenNumVal.addEventListener('change', ()=>{ // make sure numbers are entered between 0 to 255 - green.value = checkNumVal(greenNumVal, green.value); - if (data.color_num === 1) data.color.g = green.value; - if (data.color_num === 2) data.color.g2 = green.value; - if (data.color_num === 3) data.color.g3 = green.value; + green.value = checkNumVal8(greenNumVal, green.value); + if (data.color_num === 1) segstate.color.g = green.value; + if (data.color_num === 2) segstate.color.g2 = green.value; + if (data.color_num === 3) segstate.color.g3 = green.value; initSliderColors(); displayColors(); }); blueNumVal.addEventListener('change', ()=>{ // make sure numbers are entered between 0 to 255 - blue.value = checkNumVal(blueNumVal, blue.value); - if (data.color_num === 1) data.color.b = blue.value; - if (data.color_num === 2) data.color.b2 = blue.value; - if (data.color_num === 3) data.color.b3 = blue.value; + blue.value = checkNumVal8(blueNumVal, blue.value); + if (data.color_num === 1) segstate.color.b = blue.value; + if (data.color_num === 2) segstate.color.b2 = blue.value; + if (data.color_num === 3) segstate.color.b3 = blue.value; initSliderColors(); displayColors(); }); whiteNumVal.addEventListener('change', ()=>{ // make sure numbers are entered between 0 to 255 - white.value = checkNumVal(whiteNumVal, white.value); - if (data.color_num === 1) data.color.w = white.value; - if (data.color_num === 2) data.color.w2 = white.value; - if (data.color_num === 3) data.color.w3 = white.value; + white.value = checkNumVal8(whiteNumVal, white.value); + if (data.color_num === 1) segstate.color.w = white.value; + if (data.color_num === 2) segstate.color.w2 = white.value; + if (data.color_num === 3) segstate.color.w3 = white.value; initSliderColors(); displayColors(); }); brightNumVal.addEventListener('change', ()=>{ // make sure numbers are entered between 0 to 255 - bright.value = checkNumVal(brightNumVal, bright.value); - data.brightness = bright.value; + bright.value = checkNumVal8(brightNumVal, bright.value); + state.brightness = bright.value; initSliderColors(); // Send Brightness clearTimeout(sendIt); @@ -1456,14 +1466,14 @@ function changeRangeNumVal(){ }); speedNumVal.addEventListener('change', ()=>{ // make sure numbers are entered between 0 to 255 - speed.value = checkNumVal(speedNumVal, speed.value); - data.speed = speed.value; + speed.value = checkNumVal16(speedNumVal, speed.value); + segstate.speed = speed.value; // Send Speed clearTimeout(sendIt); sendIt = setTimeout(function() { set_speed(); }, 50); }); } -function checkNumVal(numVal, curVal) { +function checkNumVal8(numVal, curVal) { if(numVal.value > 255) { alert(language[settings.lang]["not_greater"]); numVal.value = curVal; @@ -1474,6 +1484,17 @@ function checkNumVal(numVal, curVal) { return numVal.value; } +function checkNumVal16(numVal, curVal) { + if(numVal.value > 65535) { + alert(language[settings.lang]["not_greater"]); + numVal.value = curVal; + } else if(numVal.value < 0) { + alert(language[settings.lang]["not_less"]); + numVal.value = curVal; + } + return numVal.value; +} + // Color Sliders controls function initcolorSliders(){ var event = new Event('change'); @@ -1552,8 +1573,11 @@ function xhttp(url, post, callback) { xhr.send(post); } function getModes() { + document.getElementById("percentage").innerHTML = "0%"; + document.getElementById("percentage-done").setAttribute("stroke-dasharray", "0,100"); + document.getElementById("modal-content").innerHTML = language.en.loadModes; xhttp("http://" + host + "/get_modes", false, function(e) { - //console.log("Getting modes list via REST:", e); + console.log("Getting modes list via REST:", e); if (e && e.substring(0,6) !== "ERROR!") { modes = JSON.parse(e); if (typeof modes[0] !== "undefined") { @@ -1572,6 +1596,9 @@ function getModes() { } function getConfig() { + document.getElementById("percentage").innerHTML = "75%"; + document.getElementById("percentage-done").setAttribute("stroke-dasharray", "75,100"); + document.getElementById("modal-content").innerHTML = language.en.loadConfig; xhttp("http://" + host + "/config", false, function(e) { console.log("Getting config via REST:", e); if (e && e.substring(0,6) !== "ERROR!") { @@ -1589,8 +1616,7 @@ function getConfig() { config.enable_rgbw = config.ws_rgbo.includes("W"); } if (typeof res.ws_pin !== "undefined") config.ws_pin = res.ws_pin; - if (typeof res.ws_fxopt !== "undefined") config.ws_fxopt = res.ws_fxopt; - if (typeof res.transEffect !== "undefined") config.transitionEffects = res.transEffect; + if (typeof res.ws_trans !== "undefined") config.ws_trans = res.ws_trans; } } else { console.error(e); @@ -1602,9 +1628,9 @@ function getConfig() { } else { document.getElementById("white").parentNode.className = "hidden"; white.value = 0; - data.color.w = 0; - data.color.w2 = 0; - data.color.w3 = 0; + segstate.color.w = 0; + segstate.color.w2 = 0; + segstate.color.w3 = 0; } }); } @@ -1635,8 +1661,8 @@ function showModes(mode, index) { document.getElementById("modes").appendChild(div); } function readSettings() { - document.getElementById("percentage").innerHTML = "33%"; - document.getElementById("percentage-done").setAttribute("stroke-dasharray", "33,100"); + document.getElementById("percentage").innerHTML = "25%"; + document.getElementById("percentage-done").setAttribute("stroke-dasharray", "25,100"); document.getElementById("modal-content").innerHTML = language.en.loadSettings; xhttp("http://" + host + "/uistate.json", false, function(e) { //console.log("readSettings()", e); @@ -1717,10 +1743,10 @@ function onSelectColNum(colnum) { x = document.getElementById("colorSel" + colnum); x.className = x.className.replace(/\belevation-3\b/g, "elevation-9"); // Set ColorPicker and Sliders to selected color - red.value = data.color["r" + (colnum > 1 ? colnum : "")]; - green.value = data.color["g" + (colnum > 1 ? colnum : "")]; - blue.value = data.color["b" + (colnum > 1 ? colnum : "")]; - white.value = data.color["w" + (colnum > 1 ? colnum : "")]; + red.value = segstate.color["r" + (colnum > 1 ? colnum : "")]; + green.value = segstate.color["g" + (colnum > 1 ? colnum : "")]; + blue.value = segstate.color["b" + (colnum > 1 ? colnum : "")]; + white.value = segstate.color["w" + (colnum > 1 ? colnum : "")]; initSliderColors(); changeRangeNumVal(); colorNumVals(); @@ -1782,10 +1808,10 @@ function initSettings() { option.innerHTML = i; selsegment.appendChild(option); } - selsegment.value = data.segment; + selsegment.value = state.segment; selsegment.addEventListener('change', ()=>{ - data.segment = selsegment.value; - ws_send("Ss" + data.segment); + state.segment = selsegment.value; + ws_send("Ss" + state.segment); }); var num_segments = document.getElementById("selectsegcnt"); num_segments.value = config.ws_seg; @@ -1801,7 +1827,10 @@ function initSettings() { option.innerHTML = i; selsegment.appendChild(option); } - selsegment.value = data.segment; + if (state.segment > config.ws_seg - 1) { + state.segment = config.ws_seg - 1; + } + selsegment.value = state.segment; }); var pin = document.getElementById("selectpin"); pin.value = config.ws_pin; @@ -1823,17 +1852,17 @@ function initSettings() { }); var start = document.getElementById("segstart"); start.setAttribute("max",config.ws_cnt-1); - start.value = data.start; + start.value = segstate.start; start.addEventListener('change', ()=>{ - data.start = start.value; - ws_send("S[" + data.start); + segstate.start = start.value; + ws_send("S[" + segstate.start); }); var stop = document.getElementById("segstop"); stop.setAttribute("max",config.ws_cnt-1); - stop.value = data.stop; + stop.value = segstate.stop; stop.addEventListener('change', ()=>{ - data.stop = stop.value; - ws_send("S]" + data.stop); + segstate.stop = stop.value; + ws_send("S]" + segstate.stop); }); var count = document.getElementById("selectcount"); count.value = config.ws_cnt; @@ -1850,10 +1879,10 @@ function initSettings() { option.innerHTML = selectoptrev[code]; optrev.appendChild(option); } - optrev.value = (config.ws_fxopt & 128); + optrev.value = (segstate.ws_fxopt & 128); optrev.addEventListener('change', ()=>{ - config.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; - ws_send("Cso" + config.ws_fxopt); + segstate.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; + ws_send("So" + segstate.ws_fxopt); }); var optfade = document.getElementById("selectoptfade"); for (var code in selectoptfade) { @@ -1862,10 +1891,10 @@ function initSettings() { option.innerHTML = selectoptfade[code]; optfade.appendChild(option); } - optfade.value = (config.ws_fxopt & 112); + optfade.value = (segstate.ws_fxopt & 112); optfade.addEventListener('change', ()=>{ - config.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; - ws_send("Cso" + config.ws_fxopt); + segstate.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; + ws_send("So" + segstate.ws_fxopt); }); var optgamma = document.getElementById("selectoptgamma"); for (var code in selectoptgamma) { @@ -1874,10 +1903,10 @@ function initSettings() { option.innerHTML = selectoptgamma[code]; optgamma.appendChild(option); } - optgamma.value = (config.ws_fxopt & 8); + optgamma.value = (segstate.ws_fxopt & 8); optgamma.addEventListener('change', ()=>{ - config.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; - ws_send("Cso" + config.ws_fxopt); + segstate.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; + ws_send("So" + segstate.ws_fxopt); }); var optsize = document.getElementById("selectoptsize"); for (var code in selectoptsize) { @@ -1886,10 +1915,10 @@ function initSettings() { option.innerHTML = selectoptsize[code]; optsize.appendChild(option); } - optsize.value = (config.ws_fxopt & 6) + optsize.value = (segstate.ws_fxopt & 6) optsize.addEventListener('change', ()=>{ - config.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; - ws_send("Cso" + config.ws_fxopt); + segstate.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; + ws_send("So" + segstate.ws_fxopt); }); slavenodes.value = settings.slave_nodes; lang.addEventListener('change', ()=>{ @@ -2103,8 +2132,8 @@ function ws_reconnect() { function ws_connect() { data.connection = new ReconnectingWebSocket(ws_url, "arduino", ws_options); - document.getElementById("percentage").innerHTML = "67%"; - document.getElementById("percentage-done").setAttribute("stroke-dasharray", "67,100"); + document.getElementById("percentage").innerHTML = "75%"; + document.getElementById("percentage-done").setAttribute("stroke-dasharray", "75,100"); document.getElementById("modal-content").innerHTML = language[settings.lang].loadWebsock; // When the connection is open, send some data to the server @@ -2116,12 +2145,12 @@ function ws_connect() { con.className = "hidden"; con = document.getElementById("connected"); con.className = con.className = ""; - document.getElementById("percentage").innerHTML = "100%"; - document.getElementById("percentage-done").setAttribute("stroke-dasharray", "100,100"); - document.getElementById("modal-content").innerHTML = language[settings.lang].loadReady; //setTimeout(function() { ws_send("$"); }, 2000); //setTimeout(function() { ws_send("C"); }, 3000); //setTimeout(function() { ws_send("~"); }, 4000); + document.getElementById("percentage").innerHTML = "100%"; + document.getElementById("percentage-done").setAttribute("stroke-dasharray", "100,100"); + document.getElementById("modal-content").innerHTML = language[settings.lang].loadReady; }; // When the connection is open, send some data to the server @@ -2154,56 +2183,56 @@ function ws_connect() { // document.getElementById('modal').style.display = "none"; // console.log("res", res); if (res) { - if (typeof res.mode !== "undefined") data.mode = res.mode; + if (typeof res.segment !== "undefined") { state.segment= res.segment; document.getElementById("selectseg").value = state.segment; } + if (typeof res.mode !== "undefined") { state.mode = res.mode; } if (typeof res.brightness !== "undefined") { - data.brightness = res.brightness; + state.brightness = res.brightness; // init ColorSliderVals bright.value = res.brightness; } // Segment Status starts here - if (typeof res.segment !== "undefined") { data.segment= res.segment; document.getElementById("selectseg").value = data.segment; } - if (typeof res.start !== "undefined") { data.start= res.start; document.getElementById("segstart").value = data.start; } - if (typeof res.stop !== "undefined") { data.stop = res.stop; document.getElementById("segstop").value = data.stop; } - if (typeof res.ws2812fx_mode !== "undefined") data.ws2812fx_mode = res.ws2812fx_mode; + if (typeof res.start !== "undefined") { segstate.start= res.start; document.getElementById("segstart").value = segstate.start; } + if (typeof res.stop !== "undefined") { segstate.stop = res.stop; document.getElementById("segstop").value = segstate.stop; } + if (typeof res.fx_mode !== "undefined") { segstate.mode = res.fx_mode; } if (typeof res.speed !== "undefined") { - data.speed = res.speed; + segstate.speed = res.speed; // init SliderVals speed.value = res.speed; } if (typeof res.color !== "undefined") { - data.color.w = res.color[0]; - data.color.r = res.color[1]; - data.color.g = res.color[2]; - data.color.b = res.color[3]; - data.color.hex = rgbToHex([res.color[0], res.color[1], res.color[2], res.color[3]]); - data.color.w2 = res.color[4]; - data.color.r2 = res.color[5]; - data.color.g2 = res.color[6]; - data.color.b2 = res.color[7]; - data.color.hex2 = rgbToHex([res.color[4], res.color[5], res.color[6], res.color[7]]); - data.color.w3 = res.color[8]; - data.color.r3 = res.color[9]; - data.color.g3 = res.color[10]; - data.color.b3 = res.color[11]; - data.color.hex3 = rgbToHex([res.color[8], res.color[9], res.color[10], res.color[11]]); + segstate.color.w = res.color[0]; + segstate.color.r = res.color[1]; + segstate.color.g = res.color[2]; + segstate.color.b = res.color[3]; + segstate.color.hex = rgbToHex([res.color[0], res.color[1], res.color[2], res.color[3]]); + segstate.color.w2 = res.color[4]; + segstate.color.r2 = res.color[5]; + segstate.color.g2 = res.color[6]; + segstate.color.b2 = res.color[7]; + segstate.color.hex2 = rgbToHex([res.color[4], res.color[5], res.color[6], res.color[7]]); + segstate.color.w3 = res.color[8]; + segstate.color.r3 = res.color[9]; + segstate.color.g3 = res.color[10]; + segstate.color.b3 = res.color[11]; + segstate.color.hex3 = rgbToHex([res.color[8], res.color[9], res.color[10], res.color[11]]); // init ColorSliderVals if (data.color_num === 1) { - red.value = data.color.r; - green.value = data.color.g; - blue.value = data.color.b; - white.value = data.color.w; + red.value = segstate.color.r; + green.value = segstate.color.g; + blue.value = segstate.color.b; + white.value = segstate.color.w; } if (data.color_num === 2) { - red.value = data.color.r2; - green.value = data.color.g2; - blue.value = data.color.b2; - white.value = data.color.w2; + red.value = segstate.color.r2; + green.value = segstate.color.g2; + blue.value = segstate.color.b2; + white.value = segstate.color.w2; } if (data.color_num === 3) { - red.value = data.color.r3; - green.value = data.color.g3; - blue.value = data.color.b3; - white.value = data.color.w3; + red.value = segstate.color.r3; + green.value = segstate.color.g3; + blue.value = segstate.color.b3; + white.value = segstate.color.w3; } } // Config starts here @@ -2223,21 +2252,21 @@ function ws_connect() { } else { document.getElementById("white").parentNode.className = "hidden"; white.value = 0; - data.color.w = 0; - data.color.w2 = 0; - data.color.w3 = 0; + segstate.color.w = 0; + segstate.color.w2 = 0; + segstate.color.w3 = 0; } } if (typeof res.ws_pin !== "undefined") { config.ws_pin = res.ws_pin; document.getElementById("selectpin").value = config.ws_pin; } + if (typeof res.ws_trans !== "undefined") { config.ws_trans = res.ws_trans; document.getElementById("set-transitionEffects").value = config.ws_trans; } if (typeof res.ws_fxopt !== "undefined") { - config.ws_fxopt = res.ws_fxopt; - document.getElementById("selectoptrev").value = (config.ws_fxopt & 128); - document.getElementById("selectoptfade").value = (config.ws_fxopt & 112); - document.getElementById("selectoptgamma").value = (config.ws_fxopt & 8); - document.getElementById("selectoptsize").value = (config.ws_fxopt & 6); + segstate.ws_fxopt = res.ws_fxopt; + document.getElementById("selectoptrev").value = (segstate.ws_fxopt & 128); + document.getElementById("selectoptfade").value = (segstate.ws_fxopt & 112); + document.getElementById("selectoptgamma").value = (segstate.ws_fxopt & 8); + document.getElementById("selectoptsize").value = (segstate.ws_fxopt & 6); } - if (typeof res.transEffect !== "undefined") { config.transitionEffects = res.transEffect; document.getElementById("set-transitionEffects").value = config.transitionEffects; } // Modes starts here if (typeof res[0] !== "undefined") { res.forEach(item => { @@ -2254,11 +2283,15 @@ function ws_connect() { // init Colors controls // init display Colors displayColors(true); + console.log("displayColors finished!"); select_active_button(); + console.log("select_active_button finished!"); } - if (data.init === true) { + console.log("data.init: ", data.init); + if (data.init == true) { + console.log("Initializing..."); // Set selected mode button - //document.getElementById(data.ws2812fx_mode).style.backgroundColor = settings.theme_btnsel; + //document.getElementById(segstate.mode).style.backgroundColor = settings.theme_btnsel; // Close Loading Modal setTimeout(() => { document.getElementById('modal').style.display = "none"; @@ -2302,7 +2335,7 @@ function select_active_button() { for (i = 0; i < btns.length; i++) { btns[i].style.backgroundColor = settings.theme_btn; } - if (data.mode != 1 || (data.mode === 1 && data.ws2812fx_mode !== 57)) { // CUSTOM WS MODE + if (state.mode != 1 || (state.mode == 1 && segstate.mode != 57)) { // CUSTOM WS MODE wsmess = document.getElementById("message"); var arr = wsmess.className.split(" "); if (arr.indexOf("hidden") === -1) { @@ -2311,14 +2344,14 @@ function select_active_button() { segments = document.getElementById("segments"); segments.className = segments.className.replace(/\b hidden\b/g, ""); } - if (data.mode >= 1) { - document.getElementById(data.ws2812fx_mode).style.backgroundColor = settings.theme_btnsel; - if (data.ws2812fx_mode === 56) { // AUTOPLAY + if (state.mode >= 1) { + document.getElementById(segstate.mode).style.backgroundColor = settings.theme_btnsel; + if (segstate.mode == 56) { // AUTOPLAY disable_modebuttons(false); disable_color_selection(true); disable_bright_selection(false); disable_speed_selection(true); - } else if (data.ws2812fx_mode === 57) { //CUSTOM_WS + } else if (segstate.mode == 57) { //CUSTOM_WS wsmess = document.getElementById("message"); wsmess.className = wsmess.className.replace(/\b hidden\b/g, ""); sements = document.getElementById("segments"); @@ -2330,17 +2363,17 @@ function select_active_button() { disable_color_selection(true); disable_bright_selection(false); disable_speed_selection(true); - } else if (data.ws2812fx_mode === 58) { //TV + } else if (segstate.mode == 58) { //TV disable_modebuttons(false); disable_color_selection(true); disable_bright_selection(false); disable_speed_selection(false); - } else if (data.ws2812fx_mode === 59) { //E1.31 + } else if (segstate.mode == 59) { //E1.31 disable_modebuttons(false); disable_color_selection(true); disable_bright_selection(false); disable_speed_selection(true); - } else if (data.ws2812fx_mode === 60) { //Fire2012 + } else if (segstate.mode == 60) { //Fire2012 disable_modebuttons(false); disable_color_selection(true); disable_bright_selection(false); @@ -2351,7 +2384,7 @@ function select_active_button() { disable_bright_selection(false); disable_speed_selection(false); } - } else if (data.mode === 0) { + } else if (state.mode == 0) { document.getElementById("off").style.backgroundColor = settings.theme_btnsel; disable_modebuttons(false); disable_color_selection(true); @@ -2379,32 +2412,32 @@ function disable_modebuttons(status) { function set_mode(mode_id) { if (Number.isInteger(mode_id)) { - data.mode = 1; - data.ws2812fx_mode = mode_id; + state.mode = 1; + segstate.mode = mode_id; } else { // For named modes if (mode_id == "off") { - data.mode = 0; + state.mode = 0; } } select_active_button(); ws_send("/" + mode_id); } function set_speed() { - ws_send("?" + data.speed); + ws_send("?" + segstate.speed); } function set_brightness() { - ws_send("%" + data.brightness); + ws_send("%" + state.brightness); } function set_color() { if (data.color_num === 1) { - ws_send("#" + rgbToHex([data.color.w, data.color.r, data.color.g, data.color.b])); + ws_send("#" + rgbToHex([segstate.color.w, segstate.color.r, segstate.color.g, segstate.color.b])); } if (data.color_num === 2) { - ws_send("##" + rgbToHex([data.color.w2, data.color.r2, data.color.g2, data.color.b2])); + ws_send("##" + rgbToHex([segstate.color.w2, segstate.color.r2, segstate.color.g2, segstate.color.b2])); } if (data.color_num === 3) { - ws_send("###" + rgbToHex([data.color.w3, data.color.r3, data.color.g3, data.color.b3])); + ws_send("###" + rgbToHex([segstate.color.w3, segstate.color.r3, segstate.color.g3, segstate.color.b3])); } } @@ -2442,11 +2475,11 @@ function onSelectColor(event) { var color = context.getImageData(pos.x, pos.y, 1, 1).data; var hex_color = rgbToHex(color); var colnum = (data.color_num === 1) ? "" : data.color_num; - data.color["hex" + colnum] = hex_color; - data.color["r" + colnum] = color[0]; - data.color["g" + colnum] = color[1]; - data.color["b" + colnum] = color[2]; - data.color["w" + colnum] = 0; + segstate.color["hex" + colnum] = hex_color; + segstate.color["r" + colnum] = color[0]; + segstate.color["g" + colnum] = color[1]; + segstate.color["b" + colnum] = color[2]; + segstate.color["w" + colnum] = 0; red.value = color[0]; green.value = color[1]; blue.value = color[2]; @@ -2623,12 +2656,10 @@ document.addEventListener("DOMContentLoaded", function(event) { readSettings(); ws_connect(); ws_send("$"); - document.getElementById("modal-content").innerHTML = language.en.loadModes; //ws_send("C"); getConfig(); canvas.width = 400; canvas.height = 400; - redrawColorPicker(); }); diff --git a/Arduino/McLighting/definitions.h b/Arduino/McLighting/definitions.h index 74f66a0..6f6f463 100644 --- a/Arduino/McLighting/definitions.h +++ b/Arduino/McLighting/definitions.h @@ -31,12 +31,12 @@ char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just #define ENABLE_STATE_SAVE // If defined, load saved state on reboot and save state on SPIFFS #define CUSTOM_WS2812FX_ANIMATIONS // uncomment and put animations in "custom_ws2812fx_animations.h" -#define USE_HTML_MIN_GZ // uncomment for using index.htm & edit.htm from PROGMEM instead of SPIFFS +//#define USE_HTML_MIN_GZ // uncomment for using index.htm & edit.htm from PROGMEM instead of SPIFFS #define TRANS_COLOR_DELAY 5 // Delay for color transition #define TRANS_DELAY 10 // Delay for brightness and speed transition -bool transEffect = false; // Experimental: Enable transitions of color, brightness and speed. It does not work properly for all effects. + // Experimental: Enable transitions of color, brightness and speed. It does not work properly for all effects. bool transEffectOverride = false; uint8_t trans_cnt = 0; int trans_cnt_max = 0; @@ -51,9 +51,6 @@ unsigned long speedFadeDelay = 0; #endif uint8_t num_segments = 1; -uint8_t segment = 0; -uint16_t seg_start = 0; -uint16_t seg_stop = NUMLEDS - 1; uint8_t prevsegment = 0; #if defined(ENABLE_REMOTE) @@ -153,13 +150,18 @@ MODE prevmode = HOLD; // Do not change uint8_t autoCount = 0; // Global variable for storing the counter for automated playback long autoDelay = 0; // Global variable for storing the time to next auto effect -uint8_t ws2812fx_speed = 196; // Global variable for storing the speed for effects --> smaller == slower -uint8_t ws2812fx_speed_actual = 196; // Global variable for storing the speed for effects while fading --> smaller == slower -uint8_t brightness = 196; // Global variable for storing the brightness (255 == 100%) -uint8_t brightness_trans = 0; // Global variable for storing the brightness before change -uint8_t ws2812fx_mode = 0; // Global variable for storing the WS2812FX mode to set -uint32_t hex_colors[3] = {}; // Color array for setting colors of WS2812FX + uint16_t seg_start = 0; + uint16_t seg_stop = NUMLEDS - 1; + uint16_t fx_speed = 1000; // Global variable for storing the speed for effects --> smaller == slower + uint8_t brightness = 196; // Global variable for storing the brightness (255 == 100%) + uint8_t fx_mode = 0; // Global variable for storing the WS2812FX mode to set + uint32_t hex_colors[3] = {}; // Color array for setting colors of WS2812FX + uint8_t fx_options = FX_OPTIONS; + + +uint16_t fx_speed_actual = 1000; // Global variable for storing the speed for effects while fading --> smaller == slower +uint8_t brightness_trans = 0; // Global variable for storing the brightness before change uint32_t hex_colors_trans[3] = {}; // Color array of colors of WS2812FX before fading struct ledstate // Data structure to store a state of a single led { @@ -202,8 +204,9 @@ bool updateConfig = false; // For WiFiManger custom config and config #endif struct { + uint8_t segment = 0; uint16_t stripSize = NUMLEDS; - char RGBOrder[5] = RGBORDER; + char RGBOrder[5] = RGBORDER; #if defined(USE_WS2812FX_DMA) #if USE_WS2812FX_DMA == 0 uint8_t pin = 3; @@ -217,5 +220,5 @@ struct { #else uint8_t pin = LED_PIN; #endif - uint8_t fxoptions = FX_OPTIONS; -} WS2812FXStripSettings; + bool transEffect = false; +} FXSettings; diff --git a/Arduino/McLighting/filesystem_functions.h b/Arduino/McLighting/filesystem_functions.h index 6128a09..9cadb35 100644 --- a/Arduino/McLighting/filesystem_functions.h +++ b/Arduino/McLighting/filesystem_functions.h @@ -78,14 +78,13 @@ strcpy(mqtt_pass, root["mqtt_pass"]); #endif num_segments = constrain(root["ws_seg"].as(), 1, MAX_NUM_SEGMENTS - 1); - WS2812FXStripSettings.stripSize = constrain(root["ws_cnt"].as(), 1, MAXLEDS); - char tmp_rgbOrder[5]; - strcpy(tmp_rgbOrder, root["ws_rgbo"]); - checkRGBOrder(tmp_rgbOrder); + FXSettings.stripSize = constrain(root["ws_cnt"].as(), 1, MAXLEDS); + char _rgbOrder[5]; + strcpy(_rgbOrder, root["ws_rgbo"]); + checkRGBOrder(_rgbOrder); uint8_t temp_pin; checkPin((uint8_t) root["ws_pin"]); - WS2812FXStripSettings.fxoptions = constrain(root["ws_fxopt"].as(), 0, 255) & 0xFE; - transEffect = root["transEffect"].as(); + FXSettings.transEffect = root["ws_trans"].as(); jsonBuffer.clear(); return true; } else { @@ -152,7 +151,7 @@ JsonObject root = jsonBuffer.as(); serializeJson(root, DBG_OUTPUT_PORT); DBG_OUTPUT_PORT.println(""); - segment = root["segment"]; + FXSettings.segment = root["segment"]; mode = static_cast(root["mode"].as()); brightness = root["brightness"]; jsonBuffer.clear(); @@ -225,10 +224,10 @@ JsonObject root = jsonBuffer.as(); serializeJson(root, DBG_OUTPUT_PORT); DBG_OUTPUT_PORT.println(""); - seg_start = root["start"].as(); - seg_stop = root["stop"].as(); - ws2812fx_mode = root["ws2812fx_mode"].as(); - ws2812fx_speed = root["speed"].as(); + seg_start = constrain(root["start"].as(), 0, FXSettings.stripSize - 1) ; + seg_stop = constrain(root["stop"].as(), 0, FXSettings.stripSize - 1); + fx_mode = root["fx_mode"].as(); + fx_speed = root["speed"].as(); main_color.white = root["color"][0].as(); main_color.red = root["color"][1].as(); main_color.green = root["color"][2].as(); @@ -241,6 +240,7 @@ xtra_color.red = root["color"][9].as(); xtra_color.green = root["color"][10].as(); xtra_color.blue = root["color"][11].as(); + fx_options = constrain(root["ws_fxopt"].as(), 0, 255) & 0xFE; convertColors(); jsonBuffer.clear(); return true; diff --git a/Arduino/McLighting/helper_functions.h b/Arduino/McLighting/helper_functions.h index 4562368..2642786 100644 --- a/Arduino/McLighting/helper_functions.h +++ b/Arduino/McLighting/helper_functions.h @@ -2,11 +2,12 @@ bool readSegmentStateFS(uint8_t seg); // End Prototypes -uint16_t convertSpeed(uint8_t mcl_speed) { - uint16_t ws2812_speed = 61760 * (exp(0.0002336 * mcl_speed) - exp(-0.03181 * mcl_speed)); - ws2812_speed = SPEED_MAX - ws2812_speed; - ws2812_speed = constrain(ws2812_speed, SPEED_MIN, SPEED_MAX); - return ws2812_speed; +uint16_t convertSpeed(uint16_t _mcl_speed) { + uint16_t _fx_speed = 61760 * (exp(0.0002336 * _mcl_speed) - exp(-0.03181 * _mcl_speed)); + _fx_speed = SPEED_MAX - _fx_speed; + _fx_speed = constrain(_fx_speed, SPEED_MIN, SPEED_MAX); + //return _fx_speed; + return _mcl_speed; } uint8_t unconvertSpeed(uint16_t ws2812_speed) { @@ -31,8 +32,8 @@ bool checkPin(uint8_t pin) { pin = 2; #endif #endif - if (((pin >= 0 && pin <= 5) || (pin >= 12 && pin <= 16)) && (pin != WS2812FXStripSettings.pin)) { - WS2812FXStripSettings.pin = pin; + if (((pin >= 0 && pin <= 5) || (pin >= 12 && pin <= 16)) && (pin != FXSettings.pin)) { + FXSettings.pin = pin; return true; } return false; @@ -104,22 +105,22 @@ neoPixelType checkRGBOrder(char rgbOrder[5]) { returnOrder = NEO_BGRW; } else { DBG_OUTPUT_PORT.print("invalid input!"); - uint16_t check = checkRGBOrder(WS2812FXStripSettings.RGBOrder); + uint16_t check = checkRGBOrder(FXSettings.RGBOrder); if (check != 0) { returnOrder = static_cast(check); - strcpy(rgbOrder, WS2812FXStripSettings.RGBOrder); + strcpy(rgbOrder, FXSettings.RGBOrder); } else { returnOrder = static_cast(checkRGBOrder(RGBORDER)); strcpy(rgbOrder, RGBORDER); } } DBG_OUTPUT_PORT.println("success!"); - strcpy(WS2812FXStripSettings.RGBOrder, rgbOrder); + strcpy(FXSettings.RGBOrder, rgbOrder); return returnOrder; } // function to Initialize the strip -void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, char RGBOrder[5] = WS2812FXStripSettings.RGBOrder, uint8_t pin = WS2812FXStripSettings.pin, uint8_t fxoptions = WS2812FXStripSettings.fxoptions ){ +void initStrip(uint16_t _stripSize = FXSettings.stripSize, char _RGBOrder[5] = FXSettings.RGBOrder, uint8_t _pin = FXSettings.pin){ DBG_OUTPUT_PORT.println("Initializing strip!"); /*#if defined(USE_WS2812FX_DMA) if (dma != NULL) { @@ -133,21 +134,20 @@ void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, char RGBOrd strip->resetSegments(); strip->resetSegmentRuntimes(); delete(strip); - WS2812FXStripSettings.stripSize = stripSize; - strcpy(WS2812FXStripSettings.RGBOrder, RGBOrder); - WS2812FXStripSettings.pin = pin; - WS2812FXStripSettings.fxoptions = fxoptions; + FXSettings.stripSize = _stripSize; + strcpy(FXSettings.RGBOrder, _RGBOrder); + FXSettings.pin = _pin; } if (ledstates != NULL) { delete(ledstates); } - ledstates = new uint8_t [WS2812FXStripSettings.stripSize]; + ledstates = new uint8_t [FXSettings.stripSize]; #if !defined(LED_TYPE_WS2811) - strip = new WS2812FX(stripSize, pin, checkRGBOrder(RGBOrder) + NEO_KHZ800); + strip = new WS2812FX(_stripSize, _pin, checkRGBOrder(_RGBOrder) + NEO_KHZ800); #else - strip = new WS2812FX(stripSize, pin, checkRGBOrder(RGBOrder) + NEO_KHZ400); + strip = new WS2812FX(_stripSize, _pin, checkRGBOrder(_RGBOrder) + NEO_KHZ400); #endif // Parameter 1 = number of pixels in strip // Parameter 2 = Arduino pin number (most are valid) @@ -163,39 +163,39 @@ void initStrip(uint16_t stripSize = WS2812FXStripSettings.stripSize, char RGBOrd // on a live circuit...if you must, connect GND first. strip->init(); #if defined(USE_WS2812FX_DMA) - initDMA(stripSize); + initDMA(_stripSize); strip->setCustomShow(DMA_Show); #endif //parameters: index, start, stop, mode, color, speed, options for (uint8_t seg=0; seg < num_segments; seg++) { - if (seg != segment) { // Read actual segment last + if (seg != FXSettings.segment) { // Read actual segment last (readSegmentStateFS(seg)) ? DBG_OUTPUT_PORT.println("Segment state config FS read Success!") : DBG_OUTPUT_PORT.println("Segment state config FS read failure!"); - strip->setSegment(seg, seg_start, seg_stop , ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions); + strip->setSegment(seg, seg_start, seg_stop, fx_mode, hex_colors_trans, convertSpeed(fx_speed), fx_options); } } //read actual segment last to set all vars correctly - (readSegmentStateFS(segment)) ? DBG_OUTPUT_PORT.println("Segment state config FS read Success!") : DBG_OUTPUT_PORT.println("Segment state config FS read failure!"); - strip->setSegment(segment, seg_start, seg_stop , ws2812fx_mode, hex_colors_trans, convertSpeed(ws2812fx_speed), fxoptions); - - strip->setCustomMode(0, F("Autoplay"), myCustomEffect0); - strip->setCustomMode(1, F("Custom WS"), myCustomEffect1); + (readSegmentStateFS(FXSettings.segment)) ? DBG_OUTPUT_PORT.println("Segment state config FS read Success!") : DBG_OUTPUT_PORT.println("Segment state config FS read failure!"); + strip->setSegment(FXSettings.segment, seg_start, seg_stop , 0, hex_colors_trans, convertSpeed(fx_speed), fx_options); + strip->setMode(FXSettings.segment, fx_mode); + fx_speed_actual = fx_speed; + strip->setCustomMode(0, F("Autoplay"), handleAuto); + strip->setCustomMode(1, F("Custom WS"), handleCustomWS); #if defined(CUSTOM_WS2812FX_ANIMATIONS) - strip->setCustomMode(2, F("TV"), myCustomEffect2); - strip->setCustomMode(3, F("E1.31"), myCustomEffect3); - strip->setCustomMode(4, F("Fire 2012"), myCustomEffect4); - strip->setCustomMode(5, F("Gradient"), myCustomEffect5); - gReverseDirection = (WS2812FXStripSettings.fxoptions & 128); + strip->setCustomMode(2, F("TV"), handleTV); + strip->setCustomMode(3, F("E1.31"), handleE131); + strip->setCustomMode(4, F("Fire 2012"), handleFire2012); + strip->setCustomMode(5, F("Gradient"), handleGradient); DBG_OUTPUT_PORT.print("Number of Segments: "); DBG_OUTPUT_PORT.println(strip->getNumSegments()); if (e131 != NULL) { delete(e131); } e131 = new ESPAsyncE131(END_UNIVERSE - START_UNIVERSE + 1); float universe_leds = 170.0; // a universe has only 512 (0..511) channels: 3*170 or 4*128 <= 512 - if (strstr(WS2812FXStripSettings.RGBOrder, "W") != NULL) { + if (strstr(FXSettings.RGBOrder, "W") != NULL) { //universe_leds = 128.0; } - float float_enduni = stripSize/universe_leds; - uint8_t END_UNIVERSE = stripSize/universe_leds; + float float_enduni = _stripSize/universe_leds; + uint8_t END_UNIVERSE = _stripSize/universe_leds; if (float_enduni > END_UNIVERSE) { END_UNIVERSE = END_UNIVERSE +1; } @@ -225,22 +225,33 @@ uint32_t* convertColors2(uint8_t w, uint8_t r, uint8_t g, uint8_t b, uint8_t w2, return hexcolors; } -void getSegmentParams(uint8_t seg) { - seg_start = strip->getSegment(seg)->start;; - seg_stop = strip->getSegment(seg)->stop;; - ws2812fx_mode = strip->getMode(seg); - main_color.white = ((strip->getColors(seg)[0] >> 24) & 0xFF); - main_color.red = ((strip->getColors(seg)[0] >> 16) & 0xFF); - main_color.green = ((strip->getColors(seg)[0] >> 8) & 0xFF); - main_color.blue = ((strip->getColors(seg)[0]) & 0xFF); - back_color.white = ((strip->getColors(seg)[1] >> 24) & 0xFF); - back_color.red = ((strip->getColors(seg)[1] >> 16) & 0xFF); - back_color.green = ((strip->getColors(seg)[1] >> 8) & 0xFF); - back_color.blue = ((strip->getColors(seg)[1]) & 0xFF); - xtra_color.white = ((strip->getColors(seg)[2] >> 24) & 0xFF); - xtra_color.red = ((strip->getColors(seg)[2] >> 16) & 0xFF); - xtra_color.green = ((strip->getColors(seg)[2] >> 8) & 0xFF); - xtra_color.blue = ((strip->getColors(seg)[2] >> 0) & 0xFF); +void getSegmentParams(uint8_t _seg) { + seg_start = strip->getSegment(_seg)->start;; + seg_stop = strip->getSegment(_seg)->stop;; + fx_mode = strip->getMode(_seg); + fx_speed = strip->getSpeed(_seg); + fx_speed_actual = fx_speed; + main_color.white = ((strip->getColors(_seg)[0] >> 24) & 0xFF); + main_color.red = ((strip->getColors(_seg)[0] >> 16) & 0xFF); + main_color.green = ((strip->getColors(_seg)[0] >> 8) & 0xFF); + main_color.blue = ((strip->getColors(_seg)[0]) & 0xFF); + back_color.white = ((strip->getColors(_seg)[1] >> 24) & 0xFF); + back_color.red = ((strip->getColors(_seg)[1] >> 16) & 0xFF); + back_color.green = ((strip->getColors(_seg)[1] >> 8) & 0xFF); + back_color.blue = ((strip->getColors(_seg)[1]) & 0xFF); + xtra_color.white = ((strip->getColors(_seg)[2] >> 24) & 0xFF); + xtra_color.red = ((strip->getColors(_seg)[2] >> 16) & 0xFF); + xtra_color.green = ((strip->getColors(_seg)[2] >> 8) & 0xFF); + xtra_color.blue = ((strip->getColors(_seg)[2] >> 0) & 0xFF); + fx_options = strip->getOptions(_seg); +} + +void setSegmentSize() { + strip->strip_off(); + delay(10); + if(strip->isRunning()) strip->stop(); + strip->resetSegmentRuntimes(); + strip->setSegment(FXSettings.segment, seg_start, seg_stop , fx_mode, hex_colors_trans, convertSpeed(fx_speed), fx_options); } void calculateColorTransitionSteps() { @@ -257,9 +268,9 @@ void calculateColorTransitionSteps() { } void convertColorsFade() { - if (transEffect) { + if (FXSettings.transEffect) { if (trans_cnt > 1) { - memcpy(hex_colors, strip->getColors(segment), sizeof(hex_colors)); + memcpy(hex_colors, strip->getColors(FXSettings.segment), sizeof(hex_colors)); DBG_OUTPUT_PORT.println("Color transistion aborted. Restarting...!"); trans_cnt = 1; } @@ -268,16 +279,17 @@ void convertColorsFade() { } uint32_t scale_wrgb(uint32_t wrgb, uint8_t level) { - uint8_t w = ((wrgb >> 24) & 0xFF) * level / 255; - uint8_t r = ((wrgb >> 16) & 0xFF) * level / 255; - uint8_t g = ((wrgb >> 8) & 0xFF) * level / 255; - uint8_t b = ((wrgb) & 0xFF) * level / 255; + uint8_t w = (uint16_t)(((wrgb >> 24) & 0xFF) * level / 255); + uint8_t r = (uint16_t)(((wrgb >> 16) & 0xFF) * level / 255); + uint8_t g = (uint16_t)(((wrgb >> 8) & 0xFF) * level / 255); + uint8_t b = (uint16_t)(((wrgb) & 0xFF) * level / 255); return (w << 24) | (r << 16) | (g << 8) | b; } -uint32_t trans(uint32_t newcolor, uint32_t oldcolor, uint8_t level) { - level = (level * (255/trans_cnt_max)); - newcolor = scale_wrgb(newcolor, level); - oldcolor = scale_wrgb(oldcolor, 255-level); - return newcolor + oldcolor; +uint32_t trans(uint32_t _newcolor, uint32_t _oldcolor, uint8_t _level, uint8_t _steps) { + if (_steps == 0) { _steps = 1; }; + _level = (uint16_t)(_level * 255 / _steps); + _newcolor = scale_wrgb(_newcolor, _level); + _oldcolor = scale_wrgb(_oldcolor, 255-_level); + return _newcolor + _oldcolor; } diff --git a/Arduino/McLighting/json_functions.h b/Arduino/McLighting/json_functions.h index cbd5a46..15e7fda 100644 --- a/Arduino/McLighting/json_functions.h +++ b/Arduino/McLighting/json_functions.h @@ -7,17 +7,16 @@ #endif char * listStateJSONfull() { - const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(20) + 250; + const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(19) + 250; DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); - root["segment"] = segment; + root["segment"] = FXSettings.segment; root["start"] = seg_start; root["stop"] = seg_stop; root["mode"] = (uint8_t) mode; //getSegmentParams(segment); - root["ws2812fx_mode"] = ws2812fx_mode; - root["ws2812fx_mode_name"] = strip->getModeName(ws2812fx_mode); - root["speed"] = ws2812fx_speed; + root["fx_mode"] = fx_mode; + root["speed"] = fx_speed; root["brightness"] = brightness; JsonArray color = root.createNestedArray("color"); color.add(main_color.white); @@ -32,6 +31,7 @@ char * listStateJSONfull() { color.add(xtra_color.red); color.add(xtra_color.green); color.add(xtra_color.blue); + root["ws_fxopt"] = fx_options; root["hostname"] = HOSTNAME; #if defined(ENABLE_MQTT) root["mqtt_host"] = mqtt_host; @@ -40,11 +40,10 @@ char * listStateJSONfull() { root["mqtt_pass"] = mqtt_pass; #endif root["ws_seg"] = num_segments; - root["ws_cnt"] = WS2812FXStripSettings.stripSize; - root["ws_rgbo"] = WS2812FXStripSettings.RGBOrder; - root["ws_pin"] = WS2812FXStripSettings.pin; - root["ws_fxopt"] = WS2812FXStripSettings.fxoptions; - root["transEffect"] = transEffect; + root["ws_cnt"] = FXSettings.stripSize; + root["ws_rgbo"] = FXSettings.RGBOrder; + root["ws_pin"] = FXSettings.pin; + root["ws_trans"] = FXSettings.transEffect; uint16_t msg_len = measureJson(root) + 1; char * buffer = (char *) malloc(msg_len); serializeJson(root, buffer, msg_len); @@ -56,7 +55,7 @@ char * listStateJSON() { const size_t bufferSize = JSON_OBJECT_SIZE(3) + 25; DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); - root["segment"] = segment; + root["segment"] = FXSettings.segment; root["mode"] = (uint8_t) mode; root["brightness"] = brightness; uint16_t msg_len = measureJson(root) + 1; @@ -67,11 +66,10 @@ char * listStateJSON() { } char * listSegmentStateJSON(uint8_t seg) { - const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(7) + 100; + const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(6) + 100; DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); - root["segment"] = seg; - if (seg == segment) { + if (seg == FXSettings.segment) { root["start"] = seg_start; root["stop"] = seg_stop; } else { @@ -79,22 +77,37 @@ char * listSegmentStateJSON(uint8_t seg) { root["stop"] = strip->getSegment(seg)->stop; } //getSegmentParams(seg); - root["ws2812fx_mode"] = strip->getMode(seg); - root["ws2812fx_mode_name"] = strip->getModeName(strip->getMode(seg)); - root["speed"] = ws2812fx_speed; + root["fx_mode"] = strip->getMode(seg); + root["speed"] = fx_speed; JsonArray color = root.createNestedArray("color"); - color.add((strip->getColors(seg)[0] >> 24) & 0xFF); - color.add((strip->getColors(seg)[0] >> 16) & 0xFF); - color.add((strip->getColors(seg)[0] >> 8) & 0xFF); - color.add((strip->getColors(seg)[0]) & 0xFF); - color.add((strip->getColors(seg)[1] >> 24) & 0xFF); - color.add((strip->getColors(seg)[1] >> 16) & 0xFF); - color.add((strip->getColors(seg)[1] >> 8) & 0xFF); - color.add((strip->getColors(seg)[1]) & 0xFF); - color.add((strip->getColors(seg)[2] >> 24) & 0xFF); - color.add((strip->getColors(seg)[2] >> 16) & 0xFF); - color.add((strip->getColors(seg)[2] >> 8) & 0xFF); - color.add((strip->getColors(seg)[2]) & 0xFF); + if (seg == FXSettings.segment) { + color.add(main_color.white); + color.add(main_color.red); + color.add(main_color.green); + color.add(main_color.blue); + color.add(back_color.white); + color.add(back_color.red); + color.add(back_color.green); + color.add(back_color.blue); + color.add(xtra_color.white); + color.add(xtra_color.red); + color.add(xtra_color.green); + color.add(xtra_color.blue); + } else { + color.add((strip->getColors(seg)[0] >> 24) & 0xFF); + color.add((strip->getColors(seg)[0] >> 16) & 0xFF); + color.add((strip->getColors(seg)[0] >> 8) & 0xFF); + color.add((strip->getColors(seg)[0]) & 0xFF); + color.add((strip->getColors(seg)[1] >> 24) & 0xFF); + color.add((strip->getColors(seg)[1] >> 16) & 0xFF); + color.add((strip->getColors(seg)[1] >> 8) & 0xFF); + color.add((strip->getColors(seg)[1]) & 0xFF); + color.add((strip->getColors(seg)[2] >> 24) & 0xFF); + color.add((strip->getColors(seg)[2] >> 16) & 0xFF); + color.add((strip->getColors(seg)[2] >> 8) & 0xFF); + color.add((strip->getColors(seg)[2]) & 0xFF); + } + root["ws_fxopt"] = fx_options; uint16_t msg_len = measureJson(root) + 1; char * buffer = (char *) malloc(msg_len); serializeJson(root, buffer, msg_len); @@ -111,9 +124,9 @@ void getStateJSON() { char * listConfigJSON() { #if defined(ENABLE_MQTT) - const size_t bufferSize = JSON_OBJECT_SIZE(11) + 150; + const size_t bufferSize = JSON_OBJECT_SIZE(10) + 150; #else - const size_t bufferSize = JSON_OBJECT_SIZE(7) + 100; + const size_t bufferSize = JSON_OBJECT_SIZE(6) + 100; #endif DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); @@ -125,11 +138,10 @@ char * listConfigJSON() { root["mqtt_pass"] = mqtt_pass; #endif root["ws_seg"] = num_segments; - root["ws_cnt"] = WS2812FXStripSettings.stripSize; - root["ws_rgbo"] = WS2812FXStripSettings.RGBOrder; - root["ws_pin"] = WS2812FXStripSettings.pin; - root["ws_fxopt"] = WS2812FXStripSettings.fxoptions; - root["transEffect"] = transEffect; + root["ws_cnt"] = FXSettings.stripSize; + root["ws_rgbo"] = FXSettings.RGBOrder; + root["ws_pin"] = FXSettings.pin; + root["ws_trans"] = FXSettings.transEffect; uint16_t msg_len = measureJson(root) + 1; char * buffer = (char *) malloc(msg_len); serializeJson(root, buffer, msg_len); @@ -199,10 +211,10 @@ char * listESPStateJSON() { #else root["animation_lib"] = "WS2812FX"; #endif - root["ws2812_pin"] = WS2812FXStripSettings.pin; - root["led_count"] = WS2812FXStripSettings.stripSize; - root["rgb_order"] = WS2812FXStripSettings.RGBOrder; - if (strstr(WS2812FXStripSettings.RGBOrder, "W") != NULL) { + root["ws2812_pin"] = FXSettings.pin; + root["led_count"] = FXSettings.stripSize; + root["rgb_order"] = FXSettings.RGBOrder; + if (strstr(FXSettings.RGBOrder, "W") != NULL) { root["rgbw_mode"] = "ON"; } else { root["rgbw_mode"] = "OFF"; diff --git a/Arduino/McLighting/mode_custom_ws2812fx_animations.h b/Arduino/McLighting/mode_custom_ws2812fx_animations.h index eab6ee2..ba6c6bd 100644 --- a/Arduino/McLighting/mode_custom_ws2812fx_animations.h +++ b/Arduino/McLighting/mode_custom_ws2812fx_animations.h @@ -1,14 +1,12 @@ // Prototypes -uint16_t convertSpeed(uint8_t mcl_speed); -uint32_t trans(uint32_t newcolor, uint32_t oldcolor, uint8_t level); +uint16_t convertSpeed(uint16_t _mcl_speed); +uint32_t trans(uint32_t _newcolor, uint32_t _oldcolor, uint8_t _level, uint8_t _steps); // End Prototypes /* - Example of adding the example: https://github.com/kitesurfer1404/WS2812FX/blob/master/examples/ws2812fx_custom_FastLED/ws2812fx_custom_FastLED.ino as a custom effect More info on how to create custom aniamtions for WS2812FX: https://github.com/kitesurfer1404/WS2812FX/blob/master/extras/WS2812FX%20Users%20Guide.md#custom-effects - */ // *************************************************************************** @@ -16,85 +14,123 @@ More info on how to create custom aniamtions for WS2812FX: https://github.com/ki // *************************************************************************** void handleAutoPlay() { - if (autoDelay <= millis()) { - hex_colors[0] = autoParams[autoCount][0]; - hex_colors[1] = autoParams[autoCount][1]; - hex_colors[2] = autoParams[autoCount][2]; - strip->setColors(segment, hex_colors); - strip->setSpeed(segment, convertSpeed((uint8_t)autoParams[autoCount][3])); - strip->setMode(segment, (uint8_t)autoParams[autoCount][4]); + WS2812FX::Segment* _seg = strip->getSegment(); + if (autoDelay <= millis()) { + hex_colors_trans[0] = autoParams[autoCount][0]; + hex_colors_trans[1] = autoParams[autoCount][1]; + hex_colors_trans[2] = autoParams[autoCount][2]; + strip->setColors(FXSettings.segment, hex_colors_trans); + strip->setSpeed(FXSettings.segment, convertSpeed((uint16_t)autoParams[autoCount][3])); + strip->setMode(FXSettings.segment, (uint8_t)autoParams[autoCount][4]); strip->trigger(); autoDelay = millis() + (uint32_t)autoParams[autoCount][5]; DBG_OUTPUT_PORT.print("autoTick "); DBG_OUTPUT_PORT.printf("autoTick[%d]: {0x%08x, 0x%08x, 0x%08x, %d, %d, %d}\r\n", autoCount, hex_colors[0], hex_colors[1], hex_colors[2], autoParams[autoCount][3], autoParams[autoCount][4], autoParams[autoCount][5]); - autoCount++; if (autoCount >= (sizeof(autoParams) / sizeof(autoParams[0]))) autoCount = 0; } } -void handleAuto() { - // Dummy function -} - -void handleCustomWS() { - // Dummy function -} - #if defined(CUSTOM_WS2812FX_ANIMATIONS) -// *************************************************************************** -// TV mode -// *************************************************************************** - -uint8_t dipInterval = 10; -uint16_t darkTime = 250; -unsigned long currentDipTime; -unsigned long dipStartTime; -unsigned long currentMillis; -uint8_t ledState = LOW; -long previousMillis = 0; -uint16_t led = 5; -uint16_t interv = 2000; -uint8_t twitch = 50; -uint8_t dipCount = 0; -boolean timeToDip = false; - - -void hsb2rgbAN1(uint16_t index, uint8_t sat, uint8_t bright, uint16_t led) { - // Source: https://blog.adafruit.com/2012/03/14/constant-brightness-hsb-to-rgb-algorithm/ - uint8_t temp[5], n = (index >> 8) % 3; - temp[0] = temp[3] = (uint8_t)(( (sat ^ 255) * bright) / 255); - temp[1] = temp[4] = (uint8_t)((((( (index & 255) * sat) / 255) + (sat ^ 255)) * bright) / 255); - temp[2] = (uint8_t)(((((((index & 255) ^ 255) * sat) / 255) + (sat ^ 255)) * bright) / 255); - strip->setPixelColor(led, temp[n + 2], temp[n + 1], temp[n], 0); -} - - -void updateLed (uint16_t led, uint8_t brightness) { - ledstates[led] = brightness; - for (uint16_t i=seg_start; i<=seg_stop; i++) { - uint16_t index = (i%3 == 0) ? 400 : random(0,767); - hsb2rgbAN1(index, 200, ledstates[i], i); + // *************************************************************************** + // TV mode + // *************************************************************************** + uint8_t dipInterval = 10; + uint16_t darkTime = 250; + unsigned long currentDipTime; + unsigned long dipStartTime; + unsigned long currentMillis; + uint8_t ledState = LOW; + long previousMillis = 0; + uint16_t interv = 2000; + uint8_t twitch = 50; + uint8_t dipCount = 0; + boolean timeToDip = false; + + + void hsb2rgbAN1(uint16_t index, uint8_t sat, uint8_t bright, uint16_t led) { + // Source: https://blog.adafruit.com/2012/03/14/constant-brightness-hsb-to-rgb-algorithm/ + uint8_t temp[5], n = (index >> 8) % 3; + temp[0] = temp[3] = (uint8_t)(( (sat ^ 255) * bright) / 255); + temp[1] = temp[4] = (uint8_t)((((( (index & 255) * sat) / 255) + (sat ^ 255)) * bright) / 255); + temp[2] = (uint8_t)(((((((index & 255) ^ 255) * sat) / 255) + (sat ^ 255)) * bright) / 255); + strip->setPixelColor(led, temp[n + 2], temp[n + 1], temp[n], 0); } - //strip->show(); + + /* + * paste in the Fire2012 code with a small edit at the end which uses the + * setPixelColor() function to copy the color data to the ws2812fx instance. + */ + #include //https://github.com/FastLED/FastLED + // Fire2012 by Mark Kriegsman, July 2012 + // as part of "Five Elements" shown here: http://youtu.be/knWiGsmgycY + //// + // This basic one-dimensional 'fire' simulation works roughly as follows: + // There's a underlying array of 'heat' cells, that model the temperature + // at each point along the line. Every cycle through the simulation, + // four steps are performed: + // 1) All cells cool down a little bit, losing heat to the air + // 2) The heat from each cell drifts 'up' and diffuses a little + // 3) Sometimes randomly new 'sparks' of heat are added at the bottom + // 4) The heat from each cell is rendered as a color into the leds array + // The heat-to-color mapping uses a black-body radiation approximation. + // + // Temperature is in arbitrary units from 0 (cold black) to 255 (white hot). + // + // This simulation scales it self a bit depending on NUM_LEDS; it should look + // "OK" on anywhere from 20 to 100 LEDs without too much tweaking. + // + // I recommend running this simulation at anywhere from 30-100 frames per second, + // meaning an interframe delay of about 10-35 milliseconds. + // + // Looks best on a high-density LED setup (60+ pixels/meter). + // + // + // There are two main parameters you can play with to control the look and + // feel of your fire: COOLING (used in step 1 above), and SPARKING (used + // in step 3 above). + // + // COOLING: How much does the air cool as it rises? + // Less cooling = taller flames. More cooling = shorter flames. + // Default 50, suggested range 20-100 + #define COOLING 70 + + // SPARKING: What chance (out of 255) is there that a new spark will be lit? + // Higher chance = more roaring fire. Lower chance = more flickery fire. + // Default 120, suggested range 50-200. + #define SPARKING 120 + +#endif + +uint16_t handleAuto() { + WS2812FX::Segment* _seg = strip->getSegment(); + return _seg->speed; } - -// See: http://forum.mysensors.org/topic/85/phoneytv-for-vera-is-here/13 -void handleTV() { +uint16_t handleCustomWS(void) { + WS2812FX::Segment* _seg = strip->getSegment(); + return _seg->speed; +} +#if defined(CUSTOM_WS2812FX_ANIMATIONS) +uint16_t handleTV(void) { + WS2812FX::Segment* _seg = strip->getSegment(); if (timeToDip == false) { currentMillis = millis(); if(currentMillis-previousMillis > interv) { previousMillis = currentMillis; //interv = random(750,4001);//Adjusts the interval for more/less frequent random light changes - interv = random(1000-(ws2812fx_speed*2),5001-(ws2812fx_speed*8)); + interv = random(1000-(fx_speed*2),5001-(fx_speed*8)); twitch = random(40,100);// Twitch provides motion effect but can be a bit much if too high dipCount = dipCount++; } if(currentMillis-previousMillisstart, _seg->stop); + ledState = ledState == LOW ? HIGH : LOW; // if the LED is off turn it on and vice-versa: + ledstates[led] = ((ledState) ? 255 : 0); + for (uint16_t j=_seg->start; j<=_seg->stop; j++) { + uint16_t index = (j%3 == 0) ? 400 : random(0,767); + hsb2rgbAN1(index, 200, ledstates[j], j); + } if (dipCount > dipInterval) { DBG_OUTPUT_PORT.println("dip"); timeToDip = true; @@ -108,25 +144,30 @@ void handleTV() { DBG_OUTPUT_PORT.println("Dip Time"); currentDipTime = millis(); if (currentDipTime - dipStartTime < darkTime) { - for (uint16_t i=3; istart + 3); i<= _seg->stop; i++) { + ledstates[i] = brightness; + for (uint16_t j=_seg->start; j<=_seg->stop; j++) { + uint16_t index = (j%3 == 0) ? 400 : random(0,767); + hsb2rgbAN1(index, 200, ledstates[j], j); + } } } else { timeToDip = false; } } + return _seg->speed; } -void handleE131(){ - if (!e131->isEmpty()) - { +uint16_t handleE131(void) { + WS2812FX::Segment* _seg = strip->getSegment(); + if (!e131->isEmpty()) { e131_packet_t packet; e131->pull(&packet); // Pull packet from ring buffer uint16_t universe = htons(packet.universe); uint8_t *data = packet.property_values + 1; - if (universe < START_UNIVERSE || universe > END_UNIVERSE) return; //async will take care about filling the buffer + if (universe < START_UNIVERSE || universe > END_UNIVERSE) return _seg->speed; //async will take care about filling the buffer // Serial.printf("Universe %u / %u Channels | Packet#: %u / Errors: %u / CH1: %u\n", // htons(packet.universe), // The Universe for this packet @@ -137,143 +178,72 @@ void handleE131(){ /* #if defined(RGBW) uint16_t multipacketOffset = (universe - START_UNIVERSE) * 128; //if more than 128 LEDs * 4 colors = 512 channels, client will send in next higher universe if (NUMLEDS <= multipacketOffset) return; - uint16_t len = (128 + multipacketOffset > WS2812FXStripSettings.stripSize) ? (WS2812FXStripSettings.stripSize - multipacketOffset) : 128; + uint16_t len = (128 + multipacketOffset > FXSettings.stripSize) ? (FXSettings.stripSize - multipacketOffset) : 128; #else*/ uint16_t multipacketOffset = (universe - START_UNIVERSE) * 170; //if more than 170 LEDs * 3 colors = 510 channels, client will send in next higher universe - if (WS2812FXStripSettings.stripSize <= multipacketOffset) return; - uint16_t len = (170 + multipacketOffset > WS2812FXStripSettings.stripSize) ? (WS2812FXStripSettings.stripSize - multipacketOffset) : 170; + if (FXSettings.stripSize <= multipacketOffset) return _seg->speed; + uint16_t len = (170 + multipacketOffset > FXSettings.stripSize) ? (FXSettings.stripSize - multipacketOffset) : 170; /* #endif */ for (uint16_t i = 0; i < len; i++){ - uint16_t j = i * 3; -/* #if defined(RGBW) - strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], data[j + 3]); - #else */ - strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], 0); -/* #endif */ + if ((i >= _seg->start) && (i <= _seg->stop)) { + uint16_t j = i * 3; + /* #if defined(RGBW) + strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], data[j + 3]); + #else */ + strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], 0); + /* #endif */ + } } } + return _seg->speed; } -#include //https://github.com/FastLED/FastLED -/* - * paste in the Fire2012 code with a small edit at the end which uses the - * setPixelColor() function to copy the color data to the ws2812fx instance. -*/ - - // Fire2012 by Mark Kriegsman, July 2012 -// as part of "Five Elements" shown here: http://youtu.be/knWiGsmgycY -//// -// This basic one-dimensional 'fire' simulation works roughly as follows: -// There's a underlying array of 'heat' cells, that model the temperature -// at each point along the line. Every cycle through the simulation, -// four steps are performed: -// 1) All cells cool down a little bit, losing heat to the air -// 2) The heat from each cell drifts 'up' and diffuses a little -// 3) Sometimes randomly new 'sparks' of heat are added at the bottom -// 4) The heat from each cell is rendered as a color into the leds array -// The heat-to-color mapping uses a black-body radiation approximation. -// -// Temperature is in arbitrary units from 0 (cold black) to 255 (white hot). -// -// This simulation scales it self a bit depending on NUM_LEDS; it should look -// "OK" on anywhere from 20 to 100 LEDs without too much tweaking. -// -// I recommend running this simulation at anywhere from 30-100 frames per second, -// meaning an interframe delay of about 10-35 milliseconds. -// -// Looks best on a high-density LED setup (60+ pixels/meter). -// -// -// There are two main parameters you can play with to control the look and -// feel of your fire: COOLING (used in step 1 above), and SPARKING (used -// in step 3 above). -// -// COOLING: How much does the air cool as it rises? -// Less cooling = taller flames. More cooling = shorter flames. -// Default 50, suggested range 20-100 -#define COOLING 70 - -// SPARKING: What chance (out of 255) is there that a new spark will be lit? -// Higher chance = more roaring fire. Lower chance = more flickery fire. -// Default 120, suggested range 50-200. -#define SPARKING 120 - -bool gReverseDirection = false; - -void Fire2012() { +uint16_t handleFire2012(void) { // Array of temperature readings at each simulation cell - + WS2812FX::Segment* _seg = strip->getSegment(); + // Step 1. Cool down every cell a little - for( uint16_t i = seg_start; i <= seg_stop; i++) { - ledstates[i] = qsub8( ledstates[i], random8(0, ((COOLING * 10) / WS2812FXStripSettings.stripSize) + 2)); + for( uint16_t i = _seg->start; i <= _seg->stop; i++) { + ledstates[i] = qsub8(ledstates[i], random8(0, ((COOLING * 10) / (_seg->stop - _seg->start)+1) + 2)); } // Step 2. Heat from each cell drifts 'up' and diffuses a little - for( uint16_t k= seg_stop-seg_start - 1; k >= 2; k--) { + for( uint16_t k= _seg->stop; k >= (_seg->start + 2); k--) { ledstates[k] = (ledstates[k - 1] + ledstates[k - 2] + ledstates[k - 2]) / 3; } // Step 3. Randomly ignite new 'sparks' of heat near the bottom if( random8() < SPARKING ) { - uint8_t y = random8(7); + uint8_t y = random8(7) + _seg->start; ledstates[y] = qadd8(ledstates[y], random8(160,255) ); } // Step 4. Map from heat cells to LED colors - for( uint16_t j = seg_start; j <= seg_stop; j++) { - CRGB color = HeatColor( ledstates[j]); - uint16_t pixelnumber; - if( gReverseDirection ) { - pixelnumber = seg_stop - j; + for( uint16_t j = _seg->start; j <= _seg->stop; j++) { + CRGB color = HeatColor(ledstates[j]); + uint16_t pixel; + if ((_seg->options & 128) > 0) { + pixel = _seg->stop - j; } else { - pixelnumber = j; + pixel = j; } - strip->setPixelColor(pixelnumber, color.red, color.green, color.blue, 0); + strip->setPixelColor(pixel, color.red, color.green, color.blue, 0); } + return _seg->speed; } -void Gradient() { - for( uint16_t j = seg_start; j <= seg_stop; j++) { - uint16_t pixelnumber; - uint32_t color; - if( gReverseDirection ) { - pixelnumber = seg_stop - j; +uint16_t handleGradient() { + WS2812FX::Segment* _seg = strip->getSegment(); + for(uint16_t j = 0; j <= (_seg->stop - _seg->start); j++) { + uint16_t pixel; + if ((_seg->options & 128) > 0) { + pixel = _seg->stop - j; } else { - pixelnumber = j; + pixel = _seg->start + j; } - color = trans(strip->getColors(segment)[1], strip->getColors(segment)[0], (j*255)/(seg_stop - seg_start)); - strip->setPixelColor(pixelnumber, ((color >> 16) & 0xFF), ((color >> 8) & 0xFF), ((color >> 0) & 0xFF), ((color >> 24) & 0xFF)); + uint32_t color = trans(_seg->colors[1], _seg->colors[0], j, (_seg->stop - _seg->start)); + strip->setPixelColor(pixel, ((color >> 16) & 0xFF), ((color >> 8) & 0xFF), ((color >> 0) & 0xFF), ((color >> 24) & 0xFF)); } -} -#endif - -uint16_t myCustomEffect0() { - handleAuto(); - return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize); -} - -uint16_t myCustomEffect1() { - handleCustomWS(); - return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize); -} -#if defined(CUSTOM_WS2812FX_ANIMATIONS) -uint16_t myCustomEffect2() { - handleTV(); - return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize); -} - -uint16_t myCustomEffect3() { - handleE131(); - return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize); -} - -uint16_t myCustomEffect4() { - Fire2012(); - return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize); -} - -uint16_t myCustomEffect5() { - Gradient(); - return (strip->getSpeed(segment) / WS2812FXStripSettings.stripSize); + return _seg->speed; } #endif diff --git a/Arduino/McLighting/request_handlers.h b/Arduino/McLighting/request_handlers.h index f636a02..b719ba0 100644 --- a/Arduino/McLighting/request_handlers.h +++ b/Arduino/McLighting/request_handlers.h @@ -7,7 +7,7 @@ bool handleSetMainColor(uint8_t * mypayload) { // decode rgb data uint32_t rgb = (uint32_t) strtoul((const char *) &mypayload[1], NULL, 16); - if (rgb != strip->getColors(segment)[0]) { + if (rgb != strip->getColors(FXSettings.segment)[0]) { main_color.white = ((rgb >> 24) & 0xFF); main_color.red = ((rgb >> 16) & 0xFF); main_color.green = ((rgb >> 8) & 0xFF); @@ -20,7 +20,7 @@ bool handleSetMainColor(uint8_t * mypayload) { bool handleSetBackColor(uint8_t * mypayload) { // decode rgb data uint32_t rgb = (uint32_t) strtoul((const char *) &mypayload[2], NULL, 16); - if (rgb != strip->getColors(segment)[1]) { + if (rgb != strip->getColors(FXSettings.segment)[1]) { back_color.white = ((rgb >> 24) & 0xFF); back_color.red = ((rgb >> 16) & 0xFF); back_color.green = ((rgb >> 8) & 0xFF); @@ -32,7 +32,7 @@ bool handleSetBackColor(uint8_t * mypayload) { bool handleSetXtraColor(uint8_t * mypayload) { // decode rgb data uint32_t rgb = (uint32_t) strtoul((const char *) &mypayload[3], NULL, 16); - if (rgb != strip->getColors(segment)[2]) { + if (rgb != strip->getColors(FXSettings.segment)[2]) { xtra_color.white = ((rgb >> 24) & 0xFF); xtra_color.red = ((rgb >> 16) & 0xFF); xtra_color.green = ((rgb >> 8) & 0xFF); @@ -45,13 +45,13 @@ bool handleSetXtraColor(uint8_t * mypayload) { bool handleSetAllMode(uint8_t * mypayload) { // decode rgb data uint32_t rgb = (uint32_t) strtoul((const char *) &mypayload[1], NULL, 16); - if ((mode = OFF) || (ws2812fx_mode != strip->getMode(segment)) || (rgb != strip->getColors(segment)[0])) { + if ((mode = OFF) || (fx_mode != strip->getMode(FXSettings.segment)) || (rgb != strip->getColors(FXSettings.segment)[0])) { main_color.white = ((rgb >> 24) & 0xFF); main_color.red = ((rgb >> 16) & 0xFF); main_color.green = ((rgb >> 8) & 0xFF); main_color.blue = ((rgb >> 0) & 0xFF); DBG_OUTPUT_PORT.printf("WS: Set all leds to main color: R: [%u] G: [%u] B: [%u] W: [%u]\r\n", main_color.red, main_color.green, main_color.blue, main_color.white); - ws2812fx_mode = FX_MODE_STATIC; + fx_mode = FX_MODE_STATIC; mode = SET; return true; } @@ -65,8 +65,8 @@ void handleSetSingleLED(uint8_t * mypayload, uint8_t firstChar = 0) { templed[4] = 0x00; uint8_t led = atoi(templed); - DBG_OUTPUT_PORT.printf("led value: [%i]. Entry threshold: <= [%i] (=> %s)\r\n", led, WS2812FXStripSettings.stripSize, mypayload ); - if (led <= WS2812FXStripSettings.stripSize) { + DBG_OUTPUT_PORT.printf("led value: [%i]. Entry threshold: <= [%i] (=> %s)\r\n", led, FXSettings.stripSize, mypayload ); + if (led <= FXSettings.stripSize) { char redhex[3]; char greenhex[3]; char bluehex[3]; @@ -101,7 +101,7 @@ void handleSetSingleLED(uint8_t * mypayload, uint8_t firstChar = 0) { strip->show(); } mode = HOLD; - ws2812fx_mode= FX_MODE_CUSTOM_1; + fx_mode= FX_MODE_CUSTOM_1; } void handleSetDifferentColors(uint8_t * mypayload) { @@ -152,10 +152,10 @@ bool setModeByStateString(String saved_state_string) { DBG_OUTPUT_PORT.printf("Parsed state: %s\r\n", saved_state_string.c_str()); String str_mode = getValue(saved_state_string, '|', 1); mode = static_cast(str_mode.toInt()); - String str_ws2812fx_mode = getValue(saved_state_string, '|', 2); - ws2812fx_mode = str_ws2812fx_mode.toInt(); - String str_ws2812fx_speed = getValue(saved_state_string, '|', 3); - ws2812fx_speed = str_ws2812fx_speed.toInt(); + String str_fx_mode = getValue(saved_state_string, '|', 2); + fx_mode = str_fx_mode.toInt(); + String str_fx_speed = getValue(saved_state_string, '|', 3); + fx_speed = str_fx_speed.toInt(); String str_brightness = getValue(saved_state_string, '|', 4); brightness = str_brightness.toInt(); String str_red = getValue(saved_state_string, '|', 5); @@ -196,12 +196,12 @@ bool setModeByStateString(String saved_state_string) { void handleSetWS2812FXMode(uint8_t * mypayload) { if (isDigit(mypayload[1])) { - ws2812fx_mode = (uint8_t) strtol((const char *) &mypayload[1], NULL, 10); - ws2812fx_mode = constrain(ws2812fx_mode, 0, strip->getModeCount() - 1); + fx_mode = (uint8_t) strtol((const char *) &mypayload[1], NULL, 10); + fx_mode = constrain(fx_mode, 0, strip->getModeCount() - 1); mode = SET; } else { if (strcmp((char *) &mypayload[1], "off") == 0) { - mode = OFF; + if (mode == OFF) { mode = SET; } else { mode = OFF; }; } if (strcmp((char *) &mypayload[1], "on") == 0) { mode = SET; @@ -268,36 +268,57 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { if (_payload[0] == 'S') { if (_payload[1] == 's') { uint8_t seg = (uint8_t) strtol((const char *) &_payload[2], NULL, 10); - segment = constrain(seg, 0, MAX_NUM_SEGMENTS); - if (prevsegment != segment) { - prevsegment = segment; - getSegmentParams(segment); + FXSettings.segment = constrain(seg, 0, num_segments - 1); + if (prevsegment != FXSettings.segment) { + prevsegment = FXSettings.segment; + getSegmentParams(FXSettings.segment); + //convertColors(); + //memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); memcpy(hex_colors_trans, hex_colors, sizeof(hex_colors_trans)); - mode = SET; _updateState = true; Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Set segment to: [%u]\r\n", segment); + DBG_OUTPUT_PORT.printf("Set segment to: [%u]\r\n", FXSettings.segment); } } // / ==> Set segment first LED if (_payload[1] == '[') { - uint16_t segstart = (uint8_t) strtol((const char *) &_payload[2], NULL, 10); - getSegmentParams(segment); - seg_start = constrain(segstart, 0, WS2812FXStripSettings.stripSize); - _updateSegState = true; - Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Set segment start to: [%u]\r\n", segstart); + uint16_t _seg_start = (uint16_t) strtol((const char *) &_payload[2], NULL, 10); + //getSegmentParams(FXSettings.segment); + _seg_start = constrain(_seg_start, 0, FXSettings.stripSize - 1); + if (_seg_start != seg_start) { + seg_start = _seg_start; + _updateSegState = true; + setSegmentSize(); + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set segment start to: [%u]\r\n", _seg_start); + } } // / ==> Set segment last LED if (_payload[1] == ']') { - uint16_t segstop = (uint8_t) strtol((const char *) &_payload[2], NULL, 10); - getSegmentParams(segment); - seg_stop = constrain(segstop, 0, WS2812FXStripSettings.stripSize - 1); - _updateSegState = true; - Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Set segment stop to: [%u]\r\n", segstop); - } - char * buffer = listSegmentStateJSON(segment); + uint16_t _seg_stop = (uint16_t) strtol((const char *) &_payload[2], NULL, 10); + //getSegmentParams(FXSettings.segment); + _seg_stop = constrain(_seg_stop, seg_start, FXSettings.stripSize - 1); + if (_seg_stop != seg_stop) { + seg_stop = _seg_stop; + _updateSegState = true; + setSegmentSize(); + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set segment stop to: [%u]\r\n", _seg_stop); + } + } + if (_payload[1] == 'o') { + char _fx_options[4]; + snprintf(_fx_options, sizeof(_fx_options), "%s", &_payload[2]); + _fx_options[3] = 0x00; + if (((constrain(atoi(_fx_options), 0, 255)>>1)<<1) != fx_options) { + fx_options = ((constrain(atoi(_fx_options), 0, 255)>>1)<<1); + _updateSegState = true; + strip->setOptions(FXSettings.segment, fx_options); + Dbg_Prefix(mqtt, num); + DBG_OUTPUT_PORT.printf("Set segment options to: [%u]\r\n", fx_options); + } + } + char * buffer = listSegmentStateJSON(FXSettings.segment); if (mqtt == true) { DBG_OUTPUT_PORT.print("MQTT: "); #if defined(ENABLE_MQTT) @@ -317,7 +338,7 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { // / ==> Set WS2812 mode. if (_payload[0] == '/') { handleSetWS2812FXMode(_payload); - if (ws2812fx_mode != strip->getMode(segment)) { + if (fx_mode != strip->getMode(FXSettings.segment)) { _updateSegState = true; Dbg_Prefix(mqtt, num); DBG_OUTPUT_PORT.printf("Set WS2812 mode: [%s]\r\n", _payload); @@ -354,12 +375,12 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { // ? ==> Set speed if (_payload[0] == '?') { - uint8_t d = (uint8_t) strtol((const char *) &_payload[1], NULL, 10); - ws2812fx_speed = constrain(d, 0, 255); + uint16_t _fx_speed = (uint16_t) strtol((const char *) &_payload[1], NULL, 10); + fx_speed = constrain(_fx_speed, SPEED_MIN, SPEED_MAX ); mode = SET; _updateSegState = true; Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Set speed to: [%u]\r\n", ws2812fx_speed); + DBG_OUTPUT_PORT.printf("Set speed to: [%u]\r\n", fx_speed); } // % ==> Set brightness @@ -430,26 +451,31 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { if (_payload[0] == 'C') { bool _updateStrip = false; bool _updateConfig = false; + bool _updateSegState = false; if (_payload[1] == 's') { if (_payload[2] == 's') { - char tmp_segments[3]; - snprintf(tmp_segments, sizeof(tmp_segments), "%s", &_payload[3]); - tmp_segments[2] = 0x00; - num_segments = constrain(atoi(tmp_segments), 1, MAX_NUM_SEGMENTS - 1); + char _num_segments[3]; + snprintf(_num_segments, sizeof(_num_segments), "%s", &_payload[3]); + _num_segments[2] = 0x00; + num_segments = constrain(atoi(_num_segments), 1, MAX_NUM_SEGMENTS - 1); + if (FXSettings.segment >= num_segments) { + FXSettings.segment = num_segments - 1; + } _updateStrip = true; + _updateSegState = true; } if (_payload[2] == 'c') { char tmp_count[6]; snprintf(tmp_count, sizeof(tmp_count), "%s", &_payload[3]); tmp_count[5] = 0x00; - WS2812FXStripSettings.stripSize = constrain(atoi(tmp_count), 1, MAXLEDS); + FXSettings.stripSize = constrain(atoi(tmp_count), 1, MAXLEDS); _updateStrip = true; } if (_payload[2] == 'r') { - char tmp_rgbOrder[5]; - snprintf(tmp_rgbOrder, sizeof(tmp_rgbOrder), "%s", &_payload[3]); - tmp_rgbOrder[4] = 0x00; - checkRGBOrder(tmp_rgbOrder); + char _rgbOrder[5]; + snprintf(_rgbOrder, sizeof(_rgbOrder), "%s", &_payload[3]); + _rgbOrder[4] = 0x00; + checkRGBOrder(_rgbOrder); _updateStrip=true; } #if !defined(USE_WS2812FX_DMA) @@ -460,14 +486,7 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { checkPin(atoi(tmp_pin)); _updateStrip = true; } - #endif - if (_payload[2] == 'o') { - char tmp_fxoptions[4]; - snprintf(tmp_fxoptions, sizeof(tmp_fxoptions), "%s", &_payload[3]); - tmp_fxoptions[3] = 0x00; - WS2812FXStripSettings.fxoptions = ((constrain(atoi(tmp_fxoptions), 0, 255)>>1)<<1); - _updateStrip = true; - } + #endif } if (_updateStrip){ initStrip(); @@ -507,10 +526,10 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { } #endif if (_payload[1] == 'e') { - char tmp_transEffect[2]; - snprintf(tmp_transEffect, sizeof(tmp_transEffect), "%s", &_payload[2]); - tmp_transEffect[sizeof(tmp_transEffect) - 1] = 0x00; - transEffect = atoi(tmp_transEffect); + char _transEffect[2]; + snprintf(_transEffect, sizeof(_transEffect), "%s", &_payload[2]); + _transEffect[sizeof(_transEffect) - 1] = 0x00; + FXSettings.transEffect = atoi(_transEffect); _updateConfig = true; } @@ -535,9 +554,15 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { DBG_OUTPUT_PORT.println("Saving config.json!"); if(!save_conf.active()) save_conf.once(3, tickerSaveConfig); } + if (_updateSegState) { + DBG_OUTPUT_PORT.println("Saving stripstate_segment.json!"); + if(!save_seg_state.active()) save_seg_state.once(3, tickerSaveSegmentState); + + } #endif _updateStrip = false; _updateConfig = false; + _updateSegState = false; DBG_OUTPUT_PORT.printf("Get status info: %s\r\n", buffer); free (buffer); } @@ -705,12 +730,12 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght color["g3"] = xtra_color.green; color["b3"] = xtra_color.blue; color["w3"] = xtra_color.white; - if (strstr(WS2812FXStripSettings.RGBOrder, "W") != NULL) { + if (strstr(FXSettings.RGBOrder, "W") != NULL) { root["white_value"]= main_color.white; } root["brightness"] = brightness; root["color_temp"] = color_temp; - root["speed"] = ws2812fx_speed; + root["speed"] = fx_speed; //char modeName[30]; //strncpy_P(modeName, (PGM_P)strip->getModeName(strip->getMode()), sizeof(modeName)); // copy from progmem #if defined(ENABLE_HOMEASSISTANT) @@ -787,9 +812,9 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght } if (root.containsKey("speed")) { - uint8_t json_speed = constrain((uint8_t) root["speed"], 0, 255); - if (json_speed != ws2812fx_speed) { - ws2812fx_speed = json_speed; + uint16_t _fx_speed = constrain((uint8_t) root["speed"], SPEED_MIN, SPEED_MAX); + if (_fx_speed != fx_speed) { + fx_speed = _fx_speed; mode = SET; } } @@ -820,7 +845,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght for (uint8_t i = 0; i < strip->getModeCount(); i++) { if(String(strip->getModeName(i)) == effectString) { mode = SET; - ws2812fx_mode = i; + fx_mode = i; break; } } @@ -900,7 +925,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght #endif root["brightness"] = "true"; root["rgb"] = "true"; - if (strstr(WS2812FXStripSettings.RGBOrder, "W") != NULL) { + if (strstr(FXSettings.RGBOrder, "W") != NULL) { root["white_value"]= "true"; } root["optimistic"] = "false"; @@ -1005,7 +1030,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght #endif root["brightness"] = "true"; root["rgb"] = "true"; - if (strstr(WS2812FXStripSettings.RGBOrder, "W") != NULL) { + if (strstr(FXSettings.RGBOrder, "W") != NULL) { root["white_value"]= "true"; } root["optimistic"] = "false"; @@ -1203,23 +1228,23 @@ void handleRemote() { mode = SET; } } - if ((ws2812fx_mode < 56) || (ws2812fx_mode > 57)) { + if ((fx_mode < 56) || (fx_mode > 57)) { if (results.value == rmt_commands[SPEED_UP]) { //Speed Up last_remote_cmd = results.value; - if (ws2812fx_speed + chng <= 255) { - ws2812fx_speed = ws2812fx_speed + chng; + if (fx_speed + chng <= 65535) { + fx_speed = fx_speed + (chng * 5); mode = SET; } } if (results.value == rmt_commands[SPEED_DOWN]) { //Speed down last_remote_cmd = results.value; - if (ws2812fx_speed - chng >= 0) { - ws2812fx_speed = ws2812fx_speed - chng; + if (fx_speed - chng >= 0) { + fx_speed = fx_speed - (chng * 5); mode = SET; } } } - if ((ws2812fx_mode < 56) || (ws2812fx_mode > 60)) { + if ((fx_mode < 56) || (fx_mode > 60)) { if (results.value == rmt_commands[RED_UP]) { //Red Up last_remote_cmd = results.value; if (selected_color == 1) { @@ -1404,48 +1429,48 @@ void handleRemote() { } // end of if HOLD if (results.value == rmt_commands[MODE_UP]) { //Mode Up last_remote_cmd = results.value; - if ((ws2812fx_mode < strip->getModeCount()-1) && (mode == HOLD)) { - ws2812fx_mode = ws2812fx_mode + 1; + if ((fx_mode < strip->getModeCount()-1) && (mode == HOLD)) { + fx_mode = fx_mode + 1; } mode = SET; } if (results.value == rmt_commands[MODE_DOWN]) { //Mode down last_remote_cmd = results.value; - if ((ws2812fx_mode > 0) && (mode == HOLD)) { - ws2812fx_mode = ws2812fx_mode - 1; + if ((fx_mode > 0) && (mode == HOLD)) { + fx_mode = fx_mode - 1; } mode = SET; } if (results.value == rmt_commands[AUTOMODE]) { // Toggle Automode last_remote_cmd = 0; - ws2812fx_mode = 56; + fx_mode = 56; mode = SET; } #if defined(CUSTOM_WS2812FX_ANIMATIONS) if (results.value == rmt_commands[CUST_1]) { // Select TV Mode last_remote_cmd = 0; - ws2812fx_mode = 57; + fx_mode = 57; mode = SET; } #endif if (results.value == rmt_commands[CUST_2]) { // Select Custom Mode 2 last_remote_cmd = 0; - ws2812fx_mode = 12; + fx_mode = 12; mode = SET; } if (results.value == rmt_commands[CUST_3]) { // Select Custom Mode 3 last_remote_cmd = 0; - ws2812fx_mode = 48; + fx_mode = 48; mode = SET; } if (results.value == rmt_commands[CUST_4]) { // Select Custom Mode 4 last_remote_cmd = 0; - ws2812fx_mode = 21; + fx_mode = 21; mode = SET; } if (results.value == rmt_commands[CUST_5]) { // Select Custom Mode 5 last_remote_cmd = 0; - ws2812fx_mode = 46; + fx_mode = 46; mode = SET; } irrecv.resume(); // Receive the next value diff --git a/Arduino/McLighting/rest_api.h b/Arduino/McLighting/rest_api.h index 6fbbc8c..fd33fe4 100644 --- a/Arduino/McLighting/rest_api.h +++ b/Arduino/McLighting/rest_api.h @@ -92,12 +92,12 @@ server.on("/get_brightness", []() { }); server.on("/get_speed", []() { - char str_speed[4]; - snprintf(str_speed, sizeof(str_speed), "%i", ws2812fx_speed); + char str_speed[6]; + snprintf(str_speed, sizeof(str_speed), "%i", fx_speed); str_speed[sizeof(str_speed) - 1] = 0x00; server.sendHeader("Access-Control-Allow-Origin", "*"); server.send(200, "text/plain", str_speed ); - DBG_OUTPUT_PORT.printf("/get_speed: %i\r\n", ws2812fx_speed); + DBG_OUTPUT_PORT.printf("/get_speed: %i\r\n", fx_speed); }); server.on("/get_switch", []() { @@ -161,23 +161,29 @@ server.on("/config", []() { // ToDo do not save if no change bool _updateStrip = false; bool _updateConfig = false; - if(server.hasArg("ws_seg")){ - uint8_t wsseg = server.arg("ws_seg").toInt(); - num_segments = constrain(wsseg, 1, MAX_NUM_SEGMENTS - 1); - _updateStrip = true; + if(server.hasArg("seg")){ + uint8_t _ws_seg = server.arg("seg").toInt(); + _ws_seg = constrain(_ws_seg, 1, MAX_NUM_SEGMENTS - 1); + if (_ws_seg != num_segments){ + num_segments = _ws_seg; + _updateStrip = true; + } } if(server.hasArg("ws_cnt")){ - uint16_t pixelCt = server.arg("ws_cnt").toInt(); - if (pixelCt > 0) { - WS2812FXStripSettings.stripSize = constrain(pixelCt, 1, MAXLEDS); - _updateStrip = true; + uint16_t _stripSize = server.arg("ws_cnt").toInt(); + if (_stripSize > 0) { + _stripSize = constrain(_stripSize, 1, MAXLEDS); + if (_stripSize != FXSettings.stripSize) { + FXSettings.stripSize = _stripSize; + _updateStrip = true; + } } } if(server.hasArg("ws_rgbo")){ - char tmp_rgbOrder[5]; - snprintf(tmp_rgbOrder, sizeof(tmp_rgbOrder), "%s", server.arg("ws_rgbo").c_str()); - tmp_rgbOrder[sizeof(tmp_rgbOrder) - 1] = 0x00; - checkRGBOrder(tmp_rgbOrder); + char _ws_rgbo[5]; + snprintf(_ws_rgbo, sizeof(_ws_rgbo), "%s", server.arg("ws_rgbo").c_str()); + _ws_rgbo[sizeof(_ws_rgbo) - 1] = 0x00; + checkRGBOrder(_ws_rgbo); _updateStrip = true; } @@ -186,49 +192,61 @@ server.on("/config", []() { if (checkPin(server.arg("ws_pin").toInt())) { _updateStrip = true; DBG_OUTPUT_PORT.print("Pin was set to: "); - DBG_OUTPUT_PORT.println(WS2812FXStripSettings.pin); + DBG_OUTPUT_PORT.println(FXSettings.pin); } else { - DBG_OUTPUT_PORT.println("invalid input!"); + DBG_OUTPUT_PORT.println("invalid input or same value!"); } } #endif - if(server.hasArg("ws_fxopt")){ - WS2812FXStripSettings.fxoptions = ((constrain(server.arg("ws_fxopt").toInt(), 0, 255)>>1)<<1); - _updateStrip = true; - } - if(_updateStrip) { initStrip(); } if(server.hasArg("hostname")){ - snprintf(HOSTNAME, sizeof(HOSTNAME), "%s", server.arg("hostname").c_str()); - HOSTNAME[sizeof(HOSTNAME) - 1] = 0x00; - _updateConfig = true; + char _hostname[sizeof(HOSTNAME)]; + snprintf(_hostname, sizeof(_hostname), "%s", server.arg("hostname").c_str()); + _hostname[sizeof(_hostname) - 1] = 0x00; + if (strcmp(HOSTNAME, _hostname) != 0) { + strcpy(HOSTNAME, _hostname); + _updateConfig = true; + } } #if defined(ENABLE_MQTT) if(server.hasArg("mqtt_host")){ - snprintf(mqtt_host, sizeof(mqtt_host), "%s", server.arg("mqtt_host").c_str()); - mqtt_host[sizeof(mqtt_host) - 1] = 0x00; - _updateConfig = true; + char _mqtt_host[sizeof(mqtt_host)]; + snprintf(_mqtt_host, sizeof(_mqtt_host), "%s", server.arg("mqtt_host").c_str()); + _mqtt_host[sizeof(_mqtt_host) - 1] = 0x00; + if (strcmp(mqtt_host, _mqtt_host) != 0) { + strcpy(mqtt_host, _mqtt_host); + _updateConfig = true; + } } if(server.hasArg("mqtt_port")){ - if ((server.arg("mqtt_port").toInt() >= 0) && (server.arg("mqtt_port").toInt() <=65535)) { - mqtt_port = server.arg("mqttport").toInt(); + uint16_t _mqtt_port = constrain(server.arg("mqtt_port").toInt(), 1, 65535); + if (_mqtt_port != mqtt_port) { + mqtt_port = _mqtt_port; _updateConfig = true; } } if(server.hasArg("mqtt_user")){ - snprintf(mqtt_user, sizeof(mqtt_user), "%s", server.arg("mqtt_user").c_str()); - mqtt_user[sizeof(mqtt_user) - 1] = 0x00; - _updateConfig = true; + char _mqtt_user[sizeof(mqtt_user)]; + snprintf(_mqtt_user, sizeof(_mqtt_user), "%s", server.arg("mqtt_user").c_str()); + _mqtt_user[sizeof(mqtt_user) - 1] = 0x00; + if (strcmp(mqtt_user, _mqtt_user) != 0) { + strcpy(mqtt_user, _mqtt_user); + _updateConfig = true; + } } if(server.hasArg("mqtt_pass")){ - snprintf(mqtt_pass, sizeof(mqtt_pass), "%s", server.arg("mqtt_pass").c_str()); - mqtt_pass[sizeof(mqtt_pass) - 1] = 0x00; - _updateConfig = true; + char _mqtt_pass[sizeof(mqtt_pass)]; + snprintf(_mqtt_pass, sizeof(_mqtt_pass), "%s", server.arg("mqtt_pass").c_str()); + _mqtt_pass[sizeof(_mqtt_pass) - 1] = 0x00; + if (strcmp(mqtt_pass, _mqtt_pass) != 0) { + strcpy(mqtt_pass, _mqtt_pass); + _updateConfig = true; + } } if (_updateConfig) { initMqtt(); @@ -236,7 +254,7 @@ server.on("/config", []() { #endif if(server.hasArg("trans_effect")){ - transEffect = server.arg("trans_effect").toInt(); + FXSettings.transEffect = server.arg("trans_effect").toInt(); _updateConfig = true; } @@ -272,20 +290,47 @@ server.on("/on", []() { server.on("/set", []() { prevmode = HOLD; - ws2812fx_mode = FX_MODE_STATIC; + fx_mode = FX_MODE_STATIC; boolean _updateState = false; boolean _updateSegState = false; // Segment if ((server.arg("seg") != "") && (server.arg("seg").toInt() >= 0) && (server.arg("seg").toInt() <= MAX_NUM_SEGMENTS)) { - segment = server.arg("seg").toInt(); - if (prevsegment != segment) { - prevsegment = segment; - getSegmentParams(segment); + FXSettings.segment = server.arg("seg").toInt(); + if (prevsegment != FXSettings.segment) { + prevsegment = FXSettings.segment; + getSegmentParams(FXSettings.segment); memcpy(hex_colors_trans, hex_colors, sizeof(hex_colors_trans)); mode = SET; _updateState = true; + } + } + if ((server.arg("start") != "") && (server.arg("start").toInt() >= 0) && (server.arg("start").toInt() <= MAX_NUM_SEGMENTS)) { + uint16_t _seg_start = server.arg("start").toInt(); + _seg_start = constrain(seg_start, 0, FXSettings.stripSize -1); + if (_seg_start != seg_start) { + seg_start = _seg_start; + setSegmentSize(); + _updateSegState = true; } } + if ((server.arg("stop") != "") && (server.arg("stop").toInt() >= 0) && (server.arg("stop").toInt() <= MAX_NUM_SEGMENTS)) { + uint16_t _seg_stop = server.arg("stop").toInt(); + _seg_stop = constrain(_seg_stop, seg_start, FXSettings.stripSize - 1); + if (_seg_stop != seg_stop) { + seg_stop = _seg_stop; + setSegmentSize(); + _updateSegState = true; + } + } + + if(server.hasArg("fxopt")){ + uint8_t _ws_fxopt = ((constrain(server.arg("fxopt").toInt(), 0, 255)>>1)<<1); + if (_ws_fxopt != fx_options) { + fx_options = _ws_fxopt; + strip->setOptions(FXSettings.segment, fx_options); + _updateSegState = true; + } + } //color wrgb if (server.arg("rgb") != "") { uint32_t rgb = (uint32_t) strtoul(server.arg("rgb").c_str(), NULL, 16); @@ -362,15 +407,15 @@ server.on("/set", []() { // Speed - if ((server.arg("s") != "") && (server.arg("s").toInt() >= 0) && (server.arg("s").toInt() <= 255)) { - ws2812fx_speed = constrain(server.arg("s").toInt(), 0, 255); + if ((server.arg("s") != "") && (server.arg("s").toInt() >= 0) && (server.arg("s").toInt() <= 65535)) { + fx_speed = constrain(server.arg("s").toInt(), SPEED_MIN, SPEED_MAX); mode = SET; _updateSegState = true; } //Mode if ((server.arg("m") != "") && (server.arg("m").toInt() >= 0) && (server.arg("m").toInt() <= strip->getModeCount())) { - ws2812fx_mode = constrain(server.arg("m").toInt(), 0, strip->getModeCount() - 1); - if (ws2812fx_mode != strip->getMode(segment)) { + fx_mode = constrain(server.arg("m").toInt(), 0, strip->getModeCount() - 1); + if (fx_mode != strip->getMode(FXSettings.segment)) { mode = SET; _updateSegState = true; } @@ -402,5 +447,3 @@ server.on("/set", []() { _updateState = false; _updateSegState = false; }); - - From 0188c8e273053b8136122a0f1b489892538c1b83 Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Tue, 8 Oct 2019 17:10:14 +0200 Subject: [PATCH 15/28] 3.1.0.BETA1 Version Bump to 3.1.0.BETA1 bugfixes adressed issue: #39 uncooment //#define ENABLE_MQTT_INCLUDE_IP in defninitions.h --- Arduino/McLighting/McLighting.ino | 161 +- Arduino/McLighting/data/index.htm | 13 +- Arduino/McLighting/data/index.htm.gz | Bin 20547 -> 20709 bytes Arduino/McLighting/definitions.h | 82 +- Arduino/McLighting/filesystem_functions.h | 52 +- Arduino/McLighting/helper_functions.h | 179 +- Arduino/McLighting/htm_index_gz.h | 3215 +++++++++-------- Arduino/McLighting/json_functions.h | 111 +- .../mode_custom_ws2812fx_animations.h | 54 +- Arduino/McLighting/request_handlers.h | 279 +- Arduino/McLighting/rest_api.h | 116 +- Arduino/McLighting/version.h | 2 +- Arduino/McLighting/version_info.ino | 10 +- clients/web/edit.htm | 4 +- clients/web/edit.htm.gz | Bin 5489 -> 5563 bytes clients/web/index.htm | 443 ++- clients/web/index.htm.gz | Bin 19755 -> 20709 bytes 17 files changed, 2450 insertions(+), 2271 deletions(-) diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino index 7cb7dac..34a9089 100644 --- a/Arduino/McLighting/McLighting.ino +++ b/Arduino/McLighting/McLighting.ino @@ -369,16 +369,16 @@ void setup() { WiFiManagerParameter custom_mqtt_user("user", "MQTT user", mqtt_user, 32, " maxlength=32"); WiFiManagerParameter custom_mqtt_pass("pass", "MQTT pass", mqtt_pass, 32, " maxlength=32 type=\"password\""); #endif - sprintf(_stripSize, "%d", FXSettings.stripSize); + sprintf(_stripSize, "%d", Config.stripSize); WiFiManagerParameter custom_strip_size("strip_size", "Number of LEDs", _stripSize, 4, " maxlength=4 type=\"number\""); #if !defined(USE_WS2812FX_DMA) char tmp_led_pin[3]; - sprintf(tmp_led_pin, "%d", FXSettings.pin); + sprintf(tmp_led_pin, "%d", Config.pin); WiFiManagerParameter custom_led_pin("led_pin", "LED GPIO", tmp_led_pin, 2, " maxlength=2 type=\"number\""); #endif - sprintf(_rgbOrder, "%s", FXSettings.RGBOrder); + sprintf(_rgbOrder, "%s", Config.RGBOrder); WiFiManagerParameter custom_rgbOrder("rgbOrder", "RGBOrder", _rgbOrder, 4, " maxlength=4"); - sprintf(_fx_options, "%d", fx_options); + sprintf(_fx_options, "%d", segState.options); WiFiManagerParameter custom_fxoptions("fxoptions", "fxOptions", _fx_options, 3, " maxlength=3"); #endif @@ -444,13 +444,13 @@ void setup() { strcpy(mqtt_pass, custom_mqtt_pass.getValue()); #endif strcpy(_stripSize, custom_strip_size.getValue()); - FXSettings.stripSize = constrain(atoi(custom_strip_size.getValue()), 1, MAXLEDS); + Config.stripSize = constrain(atoi(custom_strip_size.getValue()), 1, MAXLEDS); #if !defined(USE_WS2812FX_DMA) checkPin(atoi(custom_led_pin.getValue())); #endif strcpy(_rgbOrder, custom_rgbOrder.getValue()); checkRGBOrder(_rgbOrder); - fx_options = atoi(custom_fxoptions.getValue()); + segState.options = atoi(custom_fxoptions.getValue()); if (updateConfig) { (writeConfigFS(updateConfig)) ? DBG_OUTPUT_PORT.println("WiFiManager config FS Save success!"): DBG_OUTPUT_PORT.println("WiFiManager config FS Save failure!"); } @@ -561,9 +561,8 @@ void setup() { #if defined(ENABLE_REMOTE) irrecv.enableIRIn(); // Start the receiver #endif - fx_speed_actual = fx_speed; - brightness_trans = brightness; - memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); + fx_speed_actual = segState.speed[State.segment]; + brightness_trans = State.brightness; initStrip(); strip->setBrightness(0); DBG_OUTPUT_PORT.println("finished Main Setup!"); @@ -625,91 +624,100 @@ void loop() { // Simple statemachine that handles the different modes // *************************************************************************** - if ((mode == OFF) && ((strip->getBrightness() == 0) || !FXSettings.transEffect)) { + if ((State.mode == OFF) && ((strip->getBrightness() == 0) || !Config.transEffect)) { if(strip->isRunning()) { strip->strip_off(); // Workaround: to be shure, delay(10); // that strip is really off. Sometimes strip->stop isn't enought strip->stop(); // should clear memory - autoCount = 0; - autoDelay = 0; + for (uint8_t i = 0; i < Config.segments; i++) { + autoCount[i] = 0; + autoDelay[i] = 0; + } } else { - if (prevmode != mode) { // Start temporarily to clear strip + if (prevmode != State.mode) { // Start temporarily to clear strip strip->start(); strip->strip_off(); // Workaround: to be shure, delay(10); // that strip is really off. Sometimes strip->stop isn't enought strip->stop(); // should clear memory - autoCount = 0; - autoDelay = 0; + for (uint8_t i = 0; i < Config.segments; i++) { + autoCount[i] = 0; + autoDelay[i] = 0; + } } } } - if (mode == OFF) { - if (prevmode != mode) { + if (State.mode == OFF) { + if (prevmode != State.mode) { #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =off", ""); #endif - if (FXSettings.transEffect) { + if (Config.transEffect) { brightness_trans = 0; } } } - if (mode == SET) { - mode = HOLD; + if (State.mode == SET) { + State.mode = HOLD; // Segment - if (prevsegment != FXSettings.segment) { + if (prevsegment != State.segment) { #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK Ss%i", FXSettings.segment); + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK Ss%i", State.segment); #endif - prevsegment = FXSettings.segment; + prevsegment = State.segment; } // Mode - if (fx_mode != strip->getMode(FXSettings.segment)) { + if (segState.mode[State.segment] != fx_mode) { + segState.mode[State.segment] = fx_mode; #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", fx_mode); + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK /%i", segState.mode[State.segment]); #endif strip->strip_off(); - autoCount = 0; - autoDelay = 0; - strip->setMode(FXSettings.segment, fx_mode); + autoCount[State.segment] = 0; + autoDelay[State.segment] = 0; + //strip->setSpeed(State.segment, segState.speed[State.segment]); + //strip->setColors(State.segment, segState.colors[State.segment]); + strip->setMode(State.segment, segState.mode[State.segment]); } //Color - /*if (memcmp(hex_colors_trans, strip->getColors(selected_segment), sizeof(hex_colors_trans)) != 0) { - + /*if (memcmp(segmentState.colors[State.segment)], strip->getColors(State.segment), sizeof(segmentState.colors[State.segment)])) != 0) { + convertColors(); }*/ // Brightness - if (strip->getBrightness() != brightness) { + if (strip->getBrightness() != State.brightness) { #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %%%i", brightness); + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %%%i", State.brightness); #endif - brightness_trans = brightness; + brightness_trans = State.brightness; } // Speed - if (fx_speed_actual != fx_speed) { + if (fx_speed_actual != segState.speed[State.segment]) { #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK ?%i", fx_speed); + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK ?%i", segState.speed[State.segment]); #endif } prevmode = SET; - strip->trigger(); + //strip->trigger(); } - if ((mode == HOLD) || ((mode == OFF) && (strip->getBrightness() > 0) && FXSettings.transEffect)) { - if (fx_mode == FX_MODE_CUSTOM_0) { - handleAutoPlay(); - } + if ((State.mode == HOLD) || ((State.mode == OFF) && (strip->getBrightness() > 0) && Config.transEffect)) { if(!strip->isRunning()) strip->start(); strip->service(); + for (uint8_t i = 0; i < Config.segments; i++) { + if (segState.mode[i] == FX_MODE_CUSTOM_0) { handleAutoPlay(i); }; + } } - if (prevmode != mode) { + if (prevmode != State.mode) { convertColors(); - if (memcmp(hex_colors_trans, strip->getColors(FXSettings.segment), sizeof(hex_colors_trans)) != 0) { - convertColorsFade(); + if (memcmp(hexcolors_trans, strip->getColors(prevsegment), sizeof(hexcolors_trans)) != 0) { + DBG_OUTPUT_PORT.println("Color changed!"); + trans_cnt_max = convertColorsFade(prevsegment); trans_cnt = 1; + memcpy(segState.colors[prevsegment], hexcolors_trans, sizeof(hexcolors_trans)); } - strip->setSpeed(FXSettings.segment, convertSpeed(fx_speed_actual)); + strip->setSpeed(State.segment, convertSpeed(fx_speed_actual)); //strip->setBrightness(brightness_actual); #if defined(ENABLE_MQTT) #if ENABLE_MQTT == 0 @@ -724,14 +732,14 @@ void loop() { #endif } - prevmode = mode; + prevmode = State.mode; #if defined(ENABLE_STATE_SAVE) if (updateState){ (writeStateFS(updateState)) ? DBG_OUTPUT_PORT.println("State FS Save Success!") : DBG_OUTPUT_PORT.println("State FS Save failure!"); } if (updateSegState) { - (writeSegmentStateFS(updateSegState, FXSettings.segment)) ? DBG_OUTPUT_PORT.println("Segment State FS Save Success!") : DBG_OUTPUT_PORT.println("Segment State FS Save failure!"); + (writeSegmentStateFS(updateSegState, State.segment)) ? DBG_OUTPUT_PORT.println("Segment State FS Save Success!") : DBG_OUTPUT_PORT.println("Segment State FS Save failure!"); } if (updateConfig) { (writeConfigFS(updateConfig)) ? DBG_OUTPUT_PORT.println("Config FS Save success!"): DBG_OUTPUT_PORT.println("Config FS Save failure!"); @@ -739,62 +747,57 @@ void loop() { #endif // Async color transition - if (memcmp(hex_colors_trans, strip->getColors(FXSettings.segment), sizeof(hex_colors_trans)) != 0) { - if (FXSettings.transEffect) { + if ((segState.mode[prevsegment] != FX_MODE_CUSTOM_0) && (memcmp(hexcolors_trans, strip->getColors(prevsegment), sizeof(hexcolors_trans)) != 0)) { + if (Config.transEffect) { if ((trans_cnt > 0) && (trans_cnt < trans_cnt_max)) { if (colorFadeDelay <= millis()) { - uint32_t hex_colors_actual[3] = {}; - hex_colors_actual[0] = trans(hex_colors_trans[0], hex_colors[0], trans_cnt, trans_cnt_max); - hex_colors_actual[1] = trans(hex_colors_trans[1], hex_colors[1], trans_cnt, trans_cnt_max); - hex_colors_actual[2] = trans(hex_colors_trans[2], hex_colors[2], trans_cnt, trans_cnt_max); - strip->setColors(prevsegment, hex_colors_actual); + uint32_t _hexcolors_new[3] = {}; + _hexcolors_new[0] = trans(hexcolors_trans[0], strip->getColors(prevsegment)[0], trans_cnt, trans_cnt_max); + _hexcolors_new[1] = trans(hexcolors_trans[1], strip->getColors(prevsegment)[1], trans_cnt, trans_cnt_max); + _hexcolors_new[2] = trans(hexcolors_trans[2], strip->getColors(prevsegment)[2], trans_cnt, trans_cnt_max); + strip->setColors(prevsegment, _hexcolors_new); trans_cnt++; colorFadeDelay = millis() + TRANS_COLOR_DELAY; - if (mode == HOLD) strip->trigger(); + if (State.mode == HOLD) strip->trigger(); } } else if (trans_cnt >= trans_cnt_max) { - memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); - strip->setColors(prevsegment, hex_colors); - if (mode == HOLD) strip->trigger(); - trans_cnt = 0; + strip->setColors(prevsegment, hexcolors_trans); + if (State.mode == HOLD) strip->trigger(); DBG_OUTPUT_PORT.println("Color transition finished!"); + trans_cnt = 0; } } else { - memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); - strip->setColors(prevsegment, hex_colors); - if (mode == HOLD) strip->trigger(); - trans_cnt = 0; + strip->setColors(prevsegment, hexcolors_trans); + if (State.mode == HOLD) strip->trigger(); } } // Async speed transition - if (fx_speed_actual != fx_speed) { - //if (FXSettings.transEffect) { - if (true == false) { + if ((segState.mode[prevsegment] != FX_MODE_CUSTOM_0) && (fx_speed_actual != segState.speed[prevsegment])) { + //if (Config.transEffect) { + if (true == false) { // disabled for the moment if (speedFadeDelay <= millis()) { DBG_OUTPUT_PORT.println("Speed actual: "); DBG_OUTPUT_PORT.println(fx_speed_actual); - DBG_OUTPUT_PORT.println(convertSpeed(fx_speed_actual)); - DBG_OUTPUT_PORT.println(unconvertSpeed(convertSpeed(fx_speed_actual))); - if (fx_speed_actual < fx_speed) { + if (fx_speed_actual < segState.speed[prevsegment]) { fx_speed_actual++; } - if (fx_speed_actual > fx_speed) { + if (fx_speed_actual > segState.speed[prevsegment]) { fx_speed_actual--; } speedFadeDelay = millis() + TRANS_DELAY; strip->setSpeed(prevsegment, convertSpeed(fx_speed_actual)); - if (mode == HOLD) strip->trigger(); + if (State.mode == HOLD) strip->trigger(); } } else { - fx_speed_actual = fx_speed; + fx_speed_actual = segState.speed[State.segment]; strip->setSpeed(prevsegment, convertSpeed(fx_speed_actual)); - if (mode == HOLD) strip->trigger(); + if (State.mode == HOLD) strip->trigger(); } } // Async brightness transition if (strip->getBrightness() != brightness_trans) { - if (FXSettings.transEffect) { + if (Config.transEffect) { if(brightnessFadeDelay <= millis()) { if (strip->getBrightness() < brightness_trans) { strip->increaseBrightness(1); @@ -803,20 +806,20 @@ void loop() { strip->decreaseBrightness(1); } brightnessFadeDelay = millis() + TRANS_DELAY; - //if (mode == HOLD) strip->trigger(); + //if (State.mode == HOLD) strip->trigger(); strip->trigger(); } } else { - brightness_trans = brightness; + brightness_trans = State.brightness; strip->setBrightness(brightness_trans); - if (mode == HOLD) strip->trigger(); + if (State.mode == HOLD) strip->trigger(); } } /* // Segment change only if color and speed transitions are finished, because they are segment specific - if (prevsegment != FXSettings.segment) { - if ((memcmp(hex_colors_trans, strip->getColors(FXSettings.segment), sizeof(hex_colors_trans)) == 0) && (fx_speed_actual == fx_speed)) { - FXSettings.segment = prevsegment; + if (prevsegment != State.segment) { + if ((memcmp(hexcolors_trans, strip->getColors(State.segment), sizeof(hexcolors_trans)) == 0) && (fx_speed_actual == segState.speed[State.segment])) { + State.segment = prevsegment; } } */ diff --git a/Arduino/McLighting/data/index.htm b/Arduino/McLighting/data/index.htm index 592899e..15dee02 100644 --- a/Arduino/McLighting/data/index.htm +++ b/Arduino/McLighting/data/index.htm @@ -910,7 +910,7 @@ input[type=number], label{
- +
@@ -1324,14 +1324,14 @@ var config = { var state = { mode: 0, segment: 0, - brightness: 192 + brightness: 0 } var segstate = { start: 0, stop: 0, mode: null, - speed: 192, + speed: 0, color: {w:0, r:0, g:0, b:0, hex:"00000000", w2:0, r2:0, g2:0, b2:0, hex2:"00000000", w3:0, r3:0, g3:0, b3:0, hex3:"00000000"}, ws_fxopt: 0 } @@ -1466,7 +1466,7 @@ function changeRangeNumVal(){ }); speedNumVal.addEventListener('change', ()=>{ // make sure numbers are entered between 0 to 255 - speed.value = checkNumVal16(speedNumVal, speed.value); + speed.value = checkNumVal8(speedNumVal, speed.value); segstate.speed = speed.value; // Send Speed clearTimeout(sendIt); @@ -1665,7 +1665,7 @@ function readSettings() { document.getElementById("percentage-done").setAttribute("stroke-dasharray", "25,100"); document.getElementById("modal-content").innerHTML = language.en.loadSettings; xhttp("http://" + host + "/uistate.json", false, function(e) { - //console.log("readSettings()", e); + console.log("Read Settings: ", e); tmpsettings = (e && e.substring(0,6) !== "ERROR!") ? JSON.parse(e) : {}; // Replace default settings with saved ones for (var set in settings) { @@ -1827,9 +1827,6 @@ function initSettings() { option.innerHTML = i; selsegment.appendChild(option); } - if (state.segment > config.ws_seg - 1) { - state.segment = config.ws_seg - 1; - } selsegment.value = state.segment; }); var pin = document.getElementById("selectpin"); diff --git a/Arduino/McLighting/data/index.htm.gz b/Arduino/McLighting/data/index.htm.gz index 4383dadcfdf145dfb4643405bfc968aeb056074f..e149892ae8cc7456edca8454e32d606141d08320 100644 GIT binary patch delta 19293 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 Q%)pmF0nAbThDN0U02`>NdjJ3c delta 19132 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 LwUsT>BcK5Q@ smaller == slower + uint32_t colors[10][3] = {}; // 2 dim. Color array for setting colors of WS2812FX + uint8_t options = FX_OPTIONS; +} segState; + // List of all color modes enum MODE {OFF, HOLD, SET}; -MODE mode = SET; // Standard mode that is active when software starts -MODE prevmode = HOLD; // Do not change +MODE prevmode = HOLD; // Do not change -uint8_t autoCount = 0; // Global variable for storing the counter for automated playback -long autoDelay = 0; // Global variable for storing the time to next auto effect - - uint16_t seg_start = 0; - uint16_t seg_stop = NUMLEDS - 1; - uint16_t fx_speed = 1000; // Global variable for storing the speed for effects --> smaller == slower +struct { + uint8_t segment = 0; // Actual selected segment + MODE mode = SET; // Standard mode that is active when software starts uint8_t brightness = 196; // Global variable for storing the brightness (255 == 100%) - uint8_t fx_mode = 0; // Global variable for storing the WS2812FX mode to set - uint32_t hex_colors[3] = {}; // Color array for setting colors of WS2812FX - uint8_t fx_options = FX_OPTIONS; +} State; +struct { + uint8_t segments = 1; + uint16_t stripSize = NUMLEDS; + char RGBOrder[5] = RGBORDER; + #if defined(USE_WS2812FX_DMA) + #if USE_WS2812FX_DMA == 0 + uint8_t pin = 3; + #endif + #if USE_WS2812FX_DMA == 1 + uint8_t pin = 2; + #endif + #if USE_WS2812FX_DMA == 2 + uint8_t pin = 1; + #endif + #else + uint8_t pin = LED_PIN; + #endif + bool transEffect = false; +} Config; -uint16_t fx_speed_actual = 1000; // Global variable for storing the speed for effects while fading --> smaller == slower +uint8_t fx_speed_actual = 196; // Global variable for storing the speed for effects while fading --> smaller == slower +uint8_t fx_mode = 0; uint8_t brightness_trans = 0; // Global variable for storing the brightness before change -uint32_t hex_colors_trans[3] = {}; // Color array of colors of WS2812FX before fading +uint32_t hexcolors_trans[3] = {}; // Color array of colors of WS2812FX before fading struct ledstate // Data structure to store a state of a single led { uint8_t red; @@ -202,23 +226,3 @@ bool updateConfig = false; // For WiFiManger custom config and config byte KeyPressCount_gy33 = 0; byte prevKeyState_gy33 = HIGH; // button is active low #endif - -struct { - uint8_t segment = 0; - uint16_t stripSize = NUMLEDS; - char RGBOrder[5] = RGBORDER; - #if defined(USE_WS2812FX_DMA) - #if USE_WS2812FX_DMA == 0 - uint8_t pin = 3; - #endif - #if USE_WS2812FX_DMA == 1 - uint8_t pin = 2; - #endif - #if USE_WS2812FX_DMA == 2 - uint8_t pin = 1; - #endif - #else - uint8_t pin = LED_PIN; - #endif - bool transEffect = false; -} FXSettings; diff --git a/Arduino/McLighting/filesystem_functions.h b/Arduino/McLighting/filesystem_functions.h index 9cadb35..994b583 100644 --- a/Arduino/McLighting/filesystem_functions.h +++ b/Arduino/McLighting/filesystem_functions.h @@ -77,14 +77,14 @@ strcpy(mqtt_user, root["mqtt_user"]); strcpy(mqtt_pass, root["mqtt_pass"]); #endif - num_segments = constrain(root["ws_seg"].as(), 1, MAX_NUM_SEGMENTS - 1); - FXSettings.stripSize = constrain(root["ws_cnt"].as(), 1, MAXLEDS); + Config.segments = constrain(root["ws_seg"].as(), 1, MAX_NUM_SEGMENTS - 1); + Config.stripSize = constrain(root["ws_cnt"].as(), 1, MAXLEDS); char _rgbOrder[5]; strcpy(_rgbOrder, root["ws_rgbo"]); checkRGBOrder(_rgbOrder); uint8_t temp_pin; checkPin((uint8_t) root["ws_pin"]); - FXSettings.transEffect = root["ws_trans"].as(); + Config.transEffect = root["ws_trans"].as(); jsonBuffer.clear(); return true; } else { @@ -151,9 +151,9 @@ JsonObject root = jsonBuffer.as(); serializeJson(root, DBG_OUTPUT_PORT); DBG_OUTPUT_PORT.println(""); - FXSettings.segment = root["segment"]; - mode = static_cast(root["mode"].as()); - brightness = root["brightness"]; + State.segment = root["segment"]; + State.mode = static_cast(root["mode"].as()); + State.brightness = root["brightness"]; jsonBuffer.clear(); return true; } else { @@ -199,10 +199,10 @@ } } - bool readSegmentStateFS(uint8_t seg) { + bool readSegmentStateFS(uint8_t _seg) { //read strip state from FS JSON char filename[28]; - snprintf(filename, 28, "/stripstate_segment_%02i.json", seg); + snprintf(filename, 28, "/stripstate_segment_%02i.json", _seg); filename[27] = 0x00; if (SPIFFS.exists(filename)) { //file exists, reading and loading @@ -224,23 +224,23 @@ JsonObject root = jsonBuffer.as(); serializeJson(root, DBG_OUTPUT_PORT); DBG_OUTPUT_PORT.println(""); - seg_start = constrain(root["start"].as(), 0, FXSettings.stripSize - 1) ; - seg_stop = constrain(root["stop"].as(), 0, FXSettings.stripSize - 1); - fx_mode = root["fx_mode"].as(); - fx_speed = root["speed"].as(); - main_color.white = root["color"][0].as(); - main_color.red = root["color"][1].as(); - main_color.green = root["color"][2].as(); - main_color.blue = root["color"][3].as(); - back_color.white = root["color"][4].as(); - back_color.red = root["color"][5].as(); - back_color.green = root["color"][6].as(); - back_color.blue = root["color"][7].as(); - xtra_color.white = root["color"][8].as(); - xtra_color.red = root["color"][9].as(); - xtra_color.green = root["color"][10].as(); - xtra_color.blue = root["color"][11].as(); - fx_options = constrain(root["ws_fxopt"].as(), 0, 255) & 0xFE; + segState.start = constrain(root["start"].as(), 0, Config.stripSize - 1) ; + segState.stop = constrain(root["stop"].as(), 0, Config.stripSize - 1); + segState.mode[_seg] = root["fx_mode"].as(); + segState.speed[_seg] = root["speed"].as(); + main_color.white = root["color"][0].as(); + main_color.red = root["color"][1].as(); + main_color.green = root["color"][2].as(); + main_color.blue = root["color"][3].as(); + back_color.white = root["color"][4].as(); + back_color.red = root["color"][5].as(); + back_color.green = root["color"][6].as(); + back_color.blue = root["color"][7].as(); + xtra_color.white = root["color"][8].as(); + xtra_color.red = root["color"][9].as(); + xtra_color.green = root["color"][10].as(); + xtra_color.blue = root["color"][11].as(); + segState.options = constrain(root["ws_fxopt"].as(), 0, 255) & 0xFE; convertColors(); jsonBuffer.clear(); return true; @@ -254,7 +254,7 @@ } } else { DBG_OUTPUT_PORT.printf("Couldn't find \"/%s\"", filename); - writeSegmentStateFS(true, seg); + writeSegmentStateFS(true, _seg); } //end read return false; diff --git a/Arduino/McLighting/helper_functions.h b/Arduino/McLighting/helper_functions.h index 2642786..e265b4e 100644 --- a/Arduino/McLighting/helper_functions.h +++ b/Arduino/McLighting/helper_functions.h @@ -1,25 +1,55 @@ // Prototypes -bool readSegmentStateFS(uint8_t seg); +bool readSegmentStateFS(uint8_t _seg); // End Prototypes -uint16_t convertSpeed(uint16_t _mcl_speed) { - uint16_t _fx_speed = 61760 * (exp(0.0002336 * _mcl_speed) - exp(-0.03181 * _mcl_speed)); - _fx_speed = SPEED_MAX - _fx_speed; - _fx_speed = constrain(_fx_speed, SPEED_MIN, SPEED_MAX); - //return _fx_speed; - return _mcl_speed; +// Call convertColors whenever main_color, back_color or xtra_color changes. +void convertColors() { + hexcolors_trans[0] = (uint32_t)(main_color.white << 24) | (main_color.red << 16) | (main_color.green << 8) | main_color.blue; + hexcolors_trans[1] = (uint32_t)(back_color.white << 24) | (back_color.red << 16) | (back_color.green << 8) | back_color.blue; + hexcolors_trans[2] = (uint32_t)(xtra_color.white << 24) | (xtra_color.red << 16) | (xtra_color.green << 8) | xtra_color.blue; } -uint8_t unconvertSpeed(uint16_t ws2812_speed) { - //log((SPEED_MAX - ws2812_speed)/61760) = (0.0002336 * mcl_speed) - (-0.03181 * mcl_speed); - //log((SPEED_MAX - ws2812_speed)/61760) = (0.0002336 + 0.03181) * mcl_speed; - uint16_t mcl_speed = (log((SPEED_MAX - ws2812_speed)/61760))/ (0.0002336 + 0.03181); - //uint16_t mcl_speed = 61760 * (exp(0.0002336 * mcl_speed) - exp(-0.03181 * mcl_speed)); - mcl_speed = 255 - mcl_speed; - mcl_speed = constrain(mcl_speed, 0, 255); - return mcl_speed; +/*uint32_t* convertColors2(uint8_t _w, uint8_t _r, uint8_t _g, uint8_t _b, uint8_t _w2, uint8_t _r2, uint8_t _g2, uint8_t _b2, uint8_t _w3, uint8_t _r3, uint8_t _g3, uint8_t _b3) { + uint32_t _hexcolors[3] = {}; + _hexcolors[0] = (uint32_t)(_w << 24) | (_r << 16) | (_g << 8) | _b; + _hexcolors[1] = (uint32_t)(_w2 << 24) | (_r2 << 16) | (_g2 << 8) | _b2; + _hexcolors[2] = (uint32_t)(_w3 << 24) | (_r3 << 16) | (_g3 << 8) | _b3; + return _hexcolors; +}*/ + +uint16_t convertSpeed(uint8_t _mcl_speed) { + uint16_t _fx_speed = 0; + if (_mcl_speed < 50) { + _fx_speed = 65535 - (_mcl_speed * 1000); + } else if (_mcl_speed < 100) { + _fx_speed = 16535 - ((_mcl_speed-49) * 250); + } else if (_mcl_speed < 150) { + _fx_speed = 4035 - ((_mcl_speed-99) * 50); + } else if (_mcl_speed < 200) { + _fx_speed = 1535 - ((_mcl_speed-149) * 25); + } else { + _fx_speed = 285 - ((_mcl_speed-199) * 5); + } + _fx_speed = constrain(_fx_speed, SPEED_MIN, SPEED_MAX); + return _fx_speed; } +/*uint8_t unconvertSpeed(uint16_t _fx_speed) { + uint16_t _mcl_speed = 0; + if (_fx_speed <= 285) { + _mcl_speed = ((285 - _fx_speed)/5) + 199; + } else if (_fx_speed < 1535) { + _mcl_speed = ((1535 - _fx_speed)/25) + 149; + } else if (_fx_speed < 4035) { + _mcl_speed = ((4035 - _fx_speed)/50) + 99; + } else if (_mcl_speed < 16535) { + _mcl_speed = ((16535 - _fx_speed)/250) + 49; + } else { + _mcl_speed = ((65535 - _fx_speed)/1000); + } + return _mcl_speed; +}*/ + bool checkPin(uint8_t pin) { #if defined(USE_WS2812FX_DMA) #if USE_WS2812FX_DMA == 0 @@ -32,8 +62,8 @@ bool checkPin(uint8_t pin) { pin = 2; #endif #endif - if (((pin >= 0 && pin <= 5) || (pin >= 12 && pin <= 16)) && (pin != FXSettings.pin)) { - FXSettings.pin = pin; + if (((pin >= 0 && pin <= 5) || (pin >= 12 && pin <= 16)) && (pin != Config.pin)) { + Config.pin = pin; return true; } return false; @@ -105,22 +135,22 @@ neoPixelType checkRGBOrder(char rgbOrder[5]) { returnOrder = NEO_BGRW; } else { DBG_OUTPUT_PORT.print("invalid input!"); - uint16_t check = checkRGBOrder(FXSettings.RGBOrder); + uint16_t check = checkRGBOrder(Config.RGBOrder); if (check != 0) { returnOrder = static_cast(check); - strcpy(rgbOrder, FXSettings.RGBOrder); + strcpy(rgbOrder, Config.RGBOrder); } else { returnOrder = static_cast(checkRGBOrder(RGBORDER)); strcpy(rgbOrder, RGBORDER); } } DBG_OUTPUT_PORT.println("success!"); - strcpy(FXSettings.RGBOrder, rgbOrder); + strcpy(Config.RGBOrder, rgbOrder); return returnOrder; } // function to Initialize the strip -void initStrip(uint16_t _stripSize = FXSettings.stripSize, char _RGBOrder[5] = FXSettings.RGBOrder, uint8_t _pin = FXSettings.pin){ +void initStrip(uint16_t _stripSize = Config.stripSize, uint8_t _num_segments = Config.segments, char _RGBOrder[5] = Config.RGBOrder, uint8_t _pin = Config.pin){ DBG_OUTPUT_PORT.println("Initializing strip!"); /*#if defined(USE_WS2812FX_DMA) if (dma != NULL) { @@ -134,15 +164,15 @@ void initStrip(uint16_t _stripSize = FXSettings.stripSize, char _RGBOrder[5] = F strip->resetSegments(); strip->resetSegmentRuntimes(); delete(strip); - FXSettings.stripSize = _stripSize; - strcpy(FXSettings.RGBOrder, _RGBOrder); - FXSettings.pin = _pin; + Config.stripSize = _stripSize; + strcpy(Config.RGBOrder, _RGBOrder); + Config.pin = _pin; } if (ledstates != NULL) { delete(ledstates); } - ledstates = new uint8_t [FXSettings.stripSize]; + ledstates = new uint8_t [_stripSize]; #if !defined(LED_TYPE_WS2811) strip = new WS2812FX(_stripSize, _pin, checkRGBOrder(_RGBOrder) + NEO_KHZ800); @@ -167,19 +197,23 @@ void initStrip(uint16_t _stripSize = FXSettings.stripSize, char _RGBOrder[5] = F strip->setCustomShow(DMA_Show); #endif //parameters: index, start, stop, mode, color, speed, options - for (uint8_t seg=0; seg < num_segments; seg++) { - if (seg != FXSettings.segment) { // Read actual segment last - (readSegmentStateFS(seg)) ? DBG_OUTPUT_PORT.println("Segment state config FS read Success!") : DBG_OUTPUT_PORT.println("Segment state config FS read failure!"); - strip->setSegment(seg, seg_start, seg_stop, fx_mode, hex_colors_trans, convertSpeed(fx_speed), fx_options); + for (uint8_t _seg=0; _seg < Config.segments; _seg++) { + if (_seg != State.segment) { // Read actual segment last + (readSegmentStateFS(_seg)) ? DBG_OUTPUT_PORT.println("Segment state config FS read Success!") : DBG_OUTPUT_PORT.println("Segment state config FS read failure!"); + memcpy(segState.colors[_seg], hexcolors_trans, sizeof(hexcolors_trans)); + strip->setSegment(_seg, segState.start, segState.stop, segState.mode[_seg], segState.colors[_seg], convertSpeed(segState.speed[_seg]), segState.options); } } //read actual segment last to set all vars correctly - (readSegmentStateFS(FXSettings.segment)) ? DBG_OUTPUT_PORT.println("Segment state config FS read Success!") : DBG_OUTPUT_PORT.println("Segment state config FS read failure!"); - strip->setSegment(FXSettings.segment, seg_start, seg_stop , 0, hex_colors_trans, convertSpeed(fx_speed), fx_options); - strip->setMode(FXSettings.segment, fx_mode); - fx_speed_actual = fx_speed; + (readSegmentStateFS(State.segment)) ? DBG_OUTPUT_PORT.println("Segment state config FS read Success!") : DBG_OUTPUT_PORT.println("Segment state config FS read failure!"); + memcpy(segState.colors[State.segment], hexcolors_trans, sizeof(hexcolors_trans)); + strip->setSegment(State.segment, segState.start, segState.stop , segState.mode[State.segment], hexcolors_trans, convertSpeed(segState.speed[State.segment]), segState.options); + fx_speed_actual = segState.speed[State.segment]; + fx_mode = segState.mode[State.segment]; + prevsegment = State.segment; strip->setCustomMode(0, F("Autoplay"), handleAuto); strip->setCustomMode(1, F("Custom WS"), handleCustomWS); + strip->setCustomMode(9, F("Segment OFF"), handleSegmentOFF); #if defined(CUSTOM_WS2812FX_ANIMATIONS) strip->setCustomMode(2, F("TV"), handleTV); strip->setCustomMode(3, F("E1.31"), handleE131); @@ -191,7 +225,7 @@ void initStrip(uint16_t _stripSize = FXSettings.stripSize, char _RGBOrder[5] = F if (e131 != NULL) { delete(e131); } e131 = new ESPAsyncE131(END_UNIVERSE - START_UNIVERSE + 1); float universe_leds = 170.0; // a universe has only 512 (0..511) channels: 3*170 or 4*128 <= 512 - if (strstr(FXSettings.RGBOrder, "W") != NULL) { + if (strstr(Config.RGBOrder, "W") != NULL) { //universe_leds = 128.0; } float float_enduni = _stripSize/universe_leds; @@ -209,41 +243,25 @@ void initStrip(uint16_t _stripSize = FXSettings.stripSize, char _RGBOrder[5] = F #endif } - -// Call convertColors whenever main_color, back_color or xtra_color changes. -void convertColors() { - hex_colors_trans[0] = (uint32_t)(main_color.white << 24) | (main_color.red << 16) | (main_color.green << 8) | main_color.blue; - hex_colors_trans[1] = (uint32_t)(back_color.white << 24) | (back_color.red << 16) | (back_color.green << 8) | back_color.blue; - hex_colors_trans[2] = (uint32_t)(xtra_color.white << 24) | (xtra_color.red << 16) | (xtra_color.green << 8) | xtra_color.blue; -} - -uint32_t* convertColors2(uint8_t w, uint8_t r, uint8_t g, uint8_t b, uint8_t w2, uint8_t r2, uint8_t g2, uint8_t b2, uint8_t w3, uint8_t r3, uint8_t g3, uint8_t b3) { - uint32_t hexcolors[3] = {}; - hexcolors[0] = (uint32_t)(w << 24) | (r << 16) | (g << 8) | b; - hexcolors[1] = (uint32_t)(w2 << 24) | (r2 << 16) | (g2 << 8) | b2; - hexcolors[2] = (uint32_t)(w3 << 24) | (r3 << 16) | (g3 << 8) | b3; - return hexcolors; -} - void getSegmentParams(uint8_t _seg) { - seg_start = strip->getSegment(_seg)->start;; - seg_stop = strip->getSegment(_seg)->stop;; - fx_mode = strip->getMode(_seg); - fx_speed = strip->getSpeed(_seg); - fx_speed_actual = fx_speed; - main_color.white = ((strip->getColors(_seg)[0] >> 24) & 0xFF); - main_color.red = ((strip->getColors(_seg)[0] >> 16) & 0xFF); - main_color.green = ((strip->getColors(_seg)[0] >> 8) & 0xFF); - main_color.blue = ((strip->getColors(_seg)[0]) & 0xFF); - back_color.white = ((strip->getColors(_seg)[1] >> 24) & 0xFF); - back_color.red = ((strip->getColors(_seg)[1] >> 16) & 0xFF); - back_color.green = ((strip->getColors(_seg)[1] >> 8) & 0xFF); - back_color.blue = ((strip->getColors(_seg)[1]) & 0xFF); - xtra_color.white = ((strip->getColors(_seg)[2] >> 24) & 0xFF); - xtra_color.red = ((strip->getColors(_seg)[2] >> 16) & 0xFF); - xtra_color.green = ((strip->getColors(_seg)[2] >> 8) & 0xFF); - xtra_color.blue = ((strip->getColors(_seg)[2] >> 0) & 0xFF); - fx_options = strip->getOptions(_seg); + segState.start = strip->getSegment(_seg)->start;; + segState.stop = strip->getSegment(_seg)->stop;; + //segState.mode[_seg] = strip->getMode(_seg); + //segState.speed[_seg] = unconvertSpeed(strip->getSpeed(_seg)); + fx_speed_actual = segState.speed[_seg]; + main_color.white = ((segState.colors[_seg][0] >> 24) & 0xFF); + main_color.red = ((segState.colors[_seg][0] >> 16) & 0xFF); + main_color.green = ((segState.colors[_seg][0] >> 8) & 0xFF); + main_color.blue = ((segState.colors[_seg][0]) & 0xFF); + back_color.white = ((segState.colors[_seg][1] >> 24) & 0xFF); + back_color.red = ((segState.colors[_seg][1] >> 16) & 0xFF); + back_color.green = ((segState.colors[_seg][1] >> 8) & 0xFF); + back_color.blue = ((segState.colors[_seg][1]) & 0xFF); + xtra_color.white = ((segState.colors[_seg][2] >> 24) & 0xFF); + xtra_color.red = ((segState.colors[_seg][2] >> 16) & 0xFF); + xtra_color.green = ((segState.colors[_seg][2] >> 8) & 0xFF); + xtra_color.blue = ((segState.colors[_seg][2] >> 0) & 0xFF); + segState.options = strip->getOptions(_seg); } void setSegmentSize() { @@ -251,30 +269,33 @@ void setSegmentSize() { delay(10); if(strip->isRunning()) strip->stop(); strip->resetSegmentRuntimes(); - strip->setSegment(FXSettings.segment, seg_start, seg_stop , fx_mode, hex_colors_trans, convertSpeed(fx_speed), fx_options); + strip->setSegment(State.segment, segState.start, segState.stop , segState.mode[State.segment], hexcolors_trans, convertSpeed(segState.speed[State.segment]), segState.options); } -void calculateColorTransitionSteps() { +uint8_t calculateColorTransitionSteps(uint8_t _seg) { //compare all colors and calculate steps - trans_cnt_max = 0; - int calculate_max[4] = {}; + int _trans_cnt_max = 0; + int _calculate_max[4] = {}; for (uint8_t i=0; i<3; i++){ for (uint8_t j=0; j<4; j++) { - calculate_max[j] = ((hex_colors[i] >> ((3-j)*8)) & 0xFF) - ((hex_colors_trans[i] >> ((3-j)*8)) & 0xFF); - calculate_max[j] = abs(calculate_max[j]); - trans_cnt_max = max(trans_cnt_max, calculate_max[j]); + _calculate_max[j] = ((strip->getColors(_seg)[i] >> ((3-j)*8)) & 0xFF) - ((hexcolors_trans[i] >> ((3-j)*8)) & 0xFF); + _calculate_max[j] = abs(_calculate_max[j]); + _trans_cnt_max = max(_trans_cnt_max, _calculate_max[j]); } } + return _trans_cnt_max; } -void convertColorsFade() { - if (FXSettings.transEffect) { +uint8_t convertColorsFade(uint8_t _seg) { + if (Config.transEffect) { if (trans_cnt > 1) { - memcpy(hex_colors, strip->getColors(FXSettings.segment), sizeof(hex_colors)); + //memcpy(segState.colors[_seg], strip->getColors(_seg), sizeof(segState.colors[_seg])); DBG_OUTPUT_PORT.println("Color transistion aborted. Restarting...!"); trans_cnt = 1; } - calculateColorTransitionSteps(); + return calculateColorTransitionSteps(_seg); + } else { + return 0; } } diff --git a/Arduino/McLighting/htm_index_gz.h b/Arduino/McLighting/htm_index_gz.h index eb5f9fd..3ed7ca7 100644 --- a/Arduino/McLighting/htm_index_gz.h +++ b/Arduino/McLighting/htm_index_gz.h @@ -1,162 +1,162 @@ #include -#define index_htm_gz_len 20547 +#define index_htm_gz_len 20709 static const char index_htm_gz[] PROGMEM ={ - 0x1f, 0x8b, 0x08, 0x08, 0xbc, 0x16, 0x96, 0x5d, 0x04, 0x00, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x00, 0xdc, 0x5d, 0x59, 0x77, - 0x1b, 0x4b, 0x11, 0x7e, 0xe7, 0x1c, 0xfe, 0xc3, 0x44, 0x81, 0x44, 0xe2, - 0x4a, 0xb2, 0x16, 0xdb, 0x38, 0x72, 0xe4, 0x8b, 0x93, 0xeb, 0x84, 0x40, - 0x36, 0xec, 0x40, 0x80, 0x90, 0x63, 0x46, 0x52, 0x4b, 0x1a, 0x3c, 0x9a, - 0x11, 0x33, 0xa3, 0xc8, 0x8e, 0xf1, 0x3f, 0xe1, 0x1c, 0x5e, 0x78, 0xe1, - 0x0f, 0xf0, 0xc4, 0x13, 0xfc, 0x31, 0xbe, 0xaa, 0xee, 0x9e, 0x9e, 0x4d, - 0xb2, 0xe4, 0x45, 0x2c, 0xbe, 0x37, 0x92, 0xa6, 0xbb, 0xba, 0xaa, 0xba, - 0xba, 0xba, 0xba, 0xba, 0x7a, 0x99, 0xa7, 0x0f, 0xbe, 0x7b, 0xf7, 0xfc, - 0xc3, 0x6f, 0xde, 0x1f, 0x59, 0xe3, 0x68, 0xe2, 0x1e, 0x7c, 0xff, 0x7b, - 0x4f, 0xd5, 0xb7, 0x85, 0xbf, 0xa7, 0x63, 0x61, 0x0f, 0xd4, 0x6f, 0x7e, - 0x8e, 0x9c, 0xc8, 0x15, 0x07, 0x6f, 0xfa, 0xaf, 0x9d, 0xd1, 0x38, 0x72, - 0xbc, 0xd1, 0xd3, 0x2d, 0x4e, 0x49, 0x82, 0x4c, 0x44, 0x64, 0x5b, 0xfd, - 0xb1, 0x1d, 0x84, 0x22, 0xea, 0x96, 0x7e, 0xf9, 0xe1, 0x45, 0x6d, 0xaf, - 0x94, 0xcb, 0xf7, 0xec, 0x89, 0xe8, 0x96, 0xbe, 0x38, 0x62, 0x3e, 0xf5, - 0x83, 0xa8, 0x64, 0xf5, 0x7d, 0x2f, 0x12, 0x1e, 0xe0, 0xe7, 0xce, 0x20, - 0x1a, 0x77, 0x07, 0xe2, 0x8b, 0xd3, 0x17, 0x35, 0x7e, 0xa8, 0x5a, 0x8e, - 0xe7, 0x44, 0x8e, 0xed, 0xd6, 0xc2, 0xbe, 0xed, 0x8a, 0x6e, 0xb3, 0xde, - 0x58, 0x84, 0x6f, 0xe2, 0xf7, 0x1c, 0x17, 0xc5, 0x44, 0xaf, 0x66, 0x4f, - 0xa7, 0xb5, 0xbe, 0x3d, 0xb5, 0x7b, 0xae, 0x48, 0x60, 0xbf, 0x10, 0x61, - 0xaa, 0xac, 0xeb, 0x78, 0x67, 0x56, 0x20, 0xdc, 0x6e, 0x29, 0x1c, 0x83, - 0x8f, 0xfe, 0x2c, 0xb2, 0x1c, 0x00, 0x97, 0xac, 0x71, 0x20, 0x86, 0xdd, - 0xd2, 0x38, 0x8a, 0xa6, 0x61, 0x67, 0x6b, 0x2b, 0xb0, 0xe7, 0xf5, 0x91, - 0x13, 0x8d, 0x67, 0xbd, 0x59, 0x28, 0x02, 0x85, 0xad, 0xde, 0xf7, 0x27, - 0x5b, 0x2f, 0xec, 0xde, 0x6b, 0xbb, 0x57, 0x7b, 0x3d, 0x13, 0x9e, 0xf0, - 0xb6, 0x8c, 0x5c, 0xb6, 0x26, 0x76, 0x18, 0x89, 0x60, 0xeb, 0x30, 0x18, - 0xcc, 0x1c, 0xcf, 0x4f, 0xe6, 0x0c, 0xec, 0xc8, 0xde, 0x1a, 0xda, 0x5f, - 0x88, 0x50, 0x1d, 0x1f, 0x25, 0x2b, 0xba, 0x98, 0x82, 0x79, 0x67, 0x62, - 0x8f, 0xc4, 0xd6, 0x79, 0x4d, 0x32, 0xb0, 0x55, 0xcc, 0x26, 0xaa, 0x85, - 0x0a, 0x46, 0xfe, 0xac, 0x3f, 0xae, 0xdd, 0x3b, 0xa7, 0x59, 0x62, 0xf5, - 0xa9, 0x37, 0x5a, 0x24, 0xbe, 0xe8, 0xc2, 0x15, 0xe1, 0x58, 0x88, 0x28, - 0xcb, 0xd1, 0x10, 0x3c, 0x84, 0xf5, 0x91, 0xef, 0x8f, 0x5c, 0x61, 0x4f, - 0x9d, 0x90, 0x99, 0xe9, 0x87, 0xe1, 0xb7, 0x43, 0x7b, 0xe2, 0xb8, 0x17, - 0xdd, 0x37, 0x36, 0xa8, 0xa3, 0x75, 0xbf, 0x79, 0x05, 0x0a, 0xe9, 0xd6, - 0x61, 0xa4, 0x48, 0xf8, 0x91, 0x75, 0x49, 0xa9, 0x3d, 0xbb, 0x7f, 0x36, - 0x0a, 0xfc, 0x99, 0x37, 0xa8, 0x05, 0x62, 0x2a, 0xec, 0xa8, 0x63, 0x79, - 0xbe, 0xfa, 0xb9, 0x4f, 0x00, 0x53, 0x7b, 0x30, 0x00, 0xdf, 0x1d, 0xab, - 0xc1, 0x8f, 0x13, 0x3b, 0x18, 0x39, 0x9e, 0x7c, 0xba, 0x02, 0x96, 0xaa, - 0xd5, 0xb1, 0x87, 0x20, 0x86, 0xef, 0x9e, 0x18, 0xfa, 0x81, 0x60, 0xb4, - 0xf8, 0x23, 0x85, 0x39, 0x73, 0xa2, 0x5a, 0xcf, 0x3f, 0xaf, 0x85, 0xce, - 0x57, 0x46, 0xe1, 0x78, 0x63, 0xb0, 0xc5, 0x78, 0xf1, 0x57, 0x90, 0x23, - 0x91, 0x52, 0x5f, 0xd1, 0x68, 0xa8, 0xa6, 0x04, 0x25, 0x3a, 0xbb, 0xad, - 0xfa, 0xce, 0x0f, 0x39, 0xbf, 0xe7, 0x0f, 0x2e, 0xf2, 0xf9, 0xcd, 0xfa, - 0x8e, 0x98, 0x28, 0xd4, 0x90, 0xa1, 0xa8, 0x8d, 0x05, 0xc9, 0x1c, 0xe9, - 0xbb, 0xfb, 0x09, 0xd8, 0xb9, 0x4c, 0xdd, 0x6e, 0x34, 0x92, 0xa9, 0x52, - 0x6e, 0x9d, 0xd2, 0x31, 0x3a, 0xc3, 0xdc, 0xbe, 0x28, 0x55, 0x4b, 0x3f, - 0x15, 0xee, 0x17, 0x11, 0x39, 0x7d, 0xfb, 0xad, 0x98, 0x89, 0xe4, 0xb3, - 0x25, 0x13, 0xe2, 0xe7, 0xea, 0x21, 0x49, 0xba, 0x1a, 0xda, 0x5e, 0x58, - 0x0b, 0x51, 0x89, 0xa1, 0xc2, 0xdb, 0xf7, 0x5d, 0x3f, 0xe8, 0x3c, 0x6c, - 0xb5, 0x5a, 0x92, 0xe9, 0x59, 0x14, 0xf9, 0x5e, 0xd5, 0xfa, 0x24, 0x15, - 0x53, 0x3e, 0x96, 0x3e, 0xc7, 0x09, 0x81, 0x40, 0xd7, 0x4e, 0x3c, 0x87, - 0xb3, 0xde, 0xc4, 0x91, 0x09, 0x81, 0xef, 0x26, 0x4a, 0xc8, 0x9a, 0xf7, - 0x67, 0x41, 0x08, 0xf4, 0xd6, 0xd4, 0x77, 0x3c, 0x88, 0x7f, 0x3f, 0x45, - 0xc3, 0xf1, 0xa6, 0xb3, 0xa8, 0x6a, 0xf9, 0xd3, 0x88, 0x9a, 0x76, 0x5a, - 0xb5, 0x42, 0xe1, 0x8a, 0x3e, 0x52, 0x22, 0x71, 0x1e, 0xd9, 0x81, 0xb0, - 0x09, 0x87, 0xac, 0xb9, 0x11, 0xbd, 0xb5, 0xf5, 0x23, 0xeb, 0x64, 0x2a, - 0xfa, 0xce, 0xf0, 0x82, 0x73, 0x74, 0x86, 0xed, 0xf5, 0x85, 0xe5, 0x0f, - 0x91, 0x16, 0x4c, 0x2c, 0xe0, 0x99, 0x08, 0xe8, 0x9e, 0xf5, 0xa3, 0xad, - 0x04, 0x45, 0x89, 0xce, 0xff, 0x22, 0x82, 0xa1, 0xeb, 0xcf, 0x3b, 0xd6, - 0x17, 0x27, 0x74, 0x60, 0x23, 0x18, 0xe5, 0xe1, 0x60, 0x80, 0xaa, 0x85, - 0xd6, 0xef, 0x75, 0xf6, 0xef, 0x2d, 0x54, 0xd4, 0x8a, 0x7c, 0xeb, 0xf7, - 0x63, 0x67, 0x30, 0x10, 0xde, 0xef, 0x41, 0xc8, 0x7a, 0x75, 0x64, 0xed, - 0x6d, 0x3d, 0xd9, 0x6a, 0x36, 0xb6, 0x9a, 0xcd, 0x34, 0xee, 0x4e, 0xa7, - 0x36, 0xf1, 0xbf, 0xd6, 0x86, 0x7e, 0x7f, 0x16, 0xd6, 0x1c, 0xcf, 0x13, - 0x41, 0x4e, 0x86, 0x79, 0x90, 0xac, 0x54, 0xf3, 0x10, 0x39, 0x39, 0xe7, - 0x41, 0x54, 0x07, 0xf1, 0x83, 0x81, 0x08, 0x6a, 0xdc, 0x6d, 0x3a, 0x56, - 0xbe, 0x4b, 0x18, 0x46, 0x4d, 0xf9, 0x00, 0xb9, 0x9b, 0xe5, 0xd2, 0x9f, - 0x45, 0xa4, 0xf3, 0xc4, 0x92, 0x61, 0x3a, 0xc3, 0x60, 0x95, 0x07, 0xa3, - 0xb5, 0x15, 0x90, 0x08, 0x98, 0xee, 0x6c, 0x4f, 0x61, 0x19, 0x02, 0xe8, - 0x04, 0x68, 0x49, 0x14, 0xdc, 0xca, 0xcf, 0xfd, 0x20, 0x10, 0x7d, 0x34, - 0xeb, 0x58, 0xa0, 0x39, 0x6d, 0x8c, 0x18, 0x4e, 0x74, 0x41, 0x8d, 0xcc, - 0x72, 0xb3, 0xfa, 0xae, 0xd3, 0x3f, 0xa3, 0x61, 0x83, 0xcd, 0x72, 0x48, - 0x2d, 0xee, 0xbc, 0x3b, 0x49, 0x37, 0xb4, 0xd6, 0x52, 0xa6, 0xc7, 0x9a, - 0x5a, 0x8b, 0x40, 0x28, 0x24, 0xbd, 0x23, 0xa3, 0xe4, 0x49, 0x7d, 0x7a, - 0xe1, 0x04, 0xb0, 0x33, 0xe7, 0xd6, 0x76, 0xe3, 0x9b, 0xaa, 0xf5, 0x8a, - 0x74, 0xdf, 0x83, 0x3a, 0x1d, 0x9d, 0x4f, 0xd1, 0xdb, 0x20, 0x8d, 0x66, - 0xb3, 0x06, 0xb4, 0xf9, 0xde, 0x90, 0xef, 0x03, 0x39, 0xfb, 0x27, 0x3b, - 0xac, 0xc5, 0x44, 0xa7, 0x80, 0xf0, 0xa2, 0xfd, 0xac, 0x02, 0x48, 0x3e, - 0x38, 0x99, 0xa1, 0x33, 0x86, 0xab, 0x33, 0x70, 0x42, 0xaa, 0xe5, 0xa0, - 0xfa, 0xfd, 0xef, 0x7d, 0xd2, 0xbf, 0x3f, 0xcb, 0x06, 0x9a, 0xda, 0x7d, - 0x88, 0x04, 0x4d, 0x52, 0xdf, 0x96, 0xc0, 0xf5, 0x5e, 0xe4, 0x9d, 0x9e, - 0xca, 0xd1, 0x44, 0x55, 0xda, 0x76, 0x9d, 0x91, 0x57, 0x73, 0x22, 0x31, - 0x09, 0x3b, 0x56, 0x5f, 0x50, 0xe5, 0x92, 0x2c, 0x04, 0xf6, 0xc0, 0x99, - 0x85, 0x31, 0x4d, 0xc3, 0x46, 0x3a, 0x09, 0x84, 0xa7, 0xae, 0x0d, 0x52, - 0x43, 0x57, 0x9c, 0x53, 0x0a, 0xff, 0xe8, 0x58, 0x4d, 0xab, 0x61, 0xd9, - 0xb3, 0xc8, 0xe7, 0xa4, 0x3f, 0xcc, 0xc2, 0x08, 0x3d, 0xbd, 0xa6, 0xe8, - 0x1b, 0x72, 0xc6, 0xc6, 0x27, 0xc1, 0xa7, 0x7e, 0x08, 0x77, 0x01, 0x4a, - 0x4e, 0x23, 0x93, 0x1d, 0x39, 0x5f, 0x58, 0x08, 0x2c, 0x2b, 0x99, 0x41, - 0x15, 0x6b, 0x87, 0x30, 0x4b, 0x3d, 0xa7, 0x5f, 0xeb, 0x89, 0xaf, 0x8e, - 0x08, 0xca, 0x8d, 0x7a, 0x6b, 0xa7, 0x8a, 0xf4, 0x3d, 0xfa, 0xc0, 0xaf, - 0x66, 0x85, 0x0b, 0xcd, 0xc7, 0xa8, 0x61, 0x2d, 0x84, 0x40, 0x58, 0x9e, - 0xf3, 0xc0, 0x9e, 0x72, 0x3a, 0x3b, 0x26, 0x71, 0x55, 0x8c, 0x90, 0xd6, - 0x92, 0xcd, 0xee, 0xf4, 0x3c, 0x29, 0x04, 0x42, 0xc7, 0x83, 0x81, 0x94, - 0x85, 0xa1, 0xd2, 0x6a, 0x36, 0x14, 0xa4, 0x1a, 0x26, 0xac, 0x36, 0x15, - 0x35, 0xd2, 0x6a, 0x98, 0xea, 0x27, 0x47, 0x19, 0xab, 0xb9, 0xcd, 0x60, - 0xe9, 0xd1, 0xc4, 0xda, 0x69, 0x34, 0x56, 0x16, 0x2b, 0xe8, 0x58, 0x7b, - 0x0a, 0x89, 0x31, 0x25, 0x56, 0x53, 0xd3, 0x9f, 0x38, 0x5e, 0x4d, 0x71, - 0xb9, 0x47, 0x70, 0x99, 0xfe, 0x1d, 0xf7, 0x8e, 0x81, 0xe8, 0xfb, 0x81, - 0x4d, 0xc2, 0x67, 0xb5, 0xbc, 0x59, 0x8b, 0x54, 0xa5, 0x06, 0x59, 0xcd, - 0x49, 0xb8, 0xac, 0xa1, 0x61, 0xbb, 0x69, 0xac, 0x73, 0x6b, 0xd4, 0x0c, - 0xc8, 0x9c, 0xc0, 0x74, 0xc3, 0xc0, 0x27, 0x2d, 0x03, 0xf9, 0x46, 0x35, - 0xd9, 0xc9, 0x0c, 0x3f, 0xf4, 0x47, 0x16, 0xab, 0x38, 0x57, 0x65, 0x87, - 0xc5, 0xb9, 0xf1, 0x5f, 0x2e, 0xd7, 0xe8, 0x46, 0xad, 0xd6, 0x73, 0xfd, - 0xfe, 0x99, 0x54, 0x11, 0xd3, 0xea, 0x49, 0xef, 0x63, 0x3f, 0x9d, 0xc5, - 0xf4, 0xa8, 0x89, 0x75, 0x56, 0xb6, 0xc3, 0xe4, 0xdd, 0x17, 0xd5, 0x7d, - 0x64, 0x4e, 0x5c, 0xde, 0xa4, 0x24, 0x9f, 0xe2, 0x66, 0x36, 0xca, 0x13, - 0xeb, 0xdc, 0x5e, 0xe3, 0x87, 0x29, 0xdf, 0xc0, 0x7a, 0xf8, 0xe2, 0xc5, - 0x0b, 0x95, 0x92, 0xb7, 0x43, 0x0f, 0x9c, 0x09, 0xb9, 0xf1, 0xb6, 0x32, - 0x43, 0xb1, 0xa6, 0xeb, 0xb2, 0xdb, 0x7d, 0x7b, 0xb8, 0xd3, 0x30, 0x50, - 0x46, 0x28, 0xf5, 0x19, 0x8c, 0x74, 0xd0, 0xb7, 0x43, 0x76, 0xc6, 0x8c, - 0xca, 0xef, 0x4a, 0x95, 0xcf, 0x1b, 0x57, 0x0d, 0x9f, 0x16, 0xac, 0x0f, - 0xf3, 0x39, 0xd1, 0x92, 0x95, 0x4f, 0xa6, 0x97, 0xe0, 0x2f, 0x60, 0xd5, - 0x37, 0x7a, 0x9b, 0x54, 0x1e, 0xbb, 0x17, 0xfa, 0xee, 0x2c, 0x12, 0x29, - 0x99, 0x68, 0xed, 0x4d, 0xa8, 0xb8, 0x49, 0x1a, 0xeb, 0x9e, 0x64, 0xd0, - 0x49, 0x08, 0x93, 0x92, 0x73, 0x46, 0x73, 0xbd, 0x7f, 0x27, 0x96, 0xf0, - 0x57, 0x8c, 0x8e, 0x03, 0x6a, 0x96, 0xed, 0x8c, 0xc8, 0x87, 0xc3, 0xe1, - 0x42, 0x91, 0x3f, 0x14, 0x4f, 0x9a, 0x62, 0xb7, 0xbd, 0x5c, 0xf2, 0x79, - 0xa8, 0x98, 0x5d, 0xd7, 0xad, 0x61, 0x8e, 0xe6, 0x8d, 0x44, 0x47, 0x3a, - 0xb7, 0x63, 0x7b, 0xe0, 0xcf, 0x55, 0xae, 0x49, 0xa0, 0xce, 0xde, 0x86, - 0x0d, 0xd8, 0xc1, 0xbf, 0x5a, 0x13, 0x1f, 0xc1, 0xa8, 0x67, 0x97, 0x1b, - 0x55, 0xfa, 0xaf, 0xde, 0xaa, 0xa0, 0x6b, 0xb2, 0x89, 0x20, 0x03, 0x85, - 0x9f, 0xc9, 0xcc, 0xe6, 0x36, 0xe7, 0x36, 0x29, 0x77, 0x2f, 0x9f, 0xdb, - 0xaa, 0xc8, 0xf6, 0xa3, 0x09, 0xd0, 0x62, 0xab, 0xb9, 0xcc, 0x3c, 0x1a, - 0xbd, 0x97, 0x5e, 0x31, 0x26, 0x01, 0xb3, 0x40, 0xa0, 0xef, 0x45, 0x34, - 0x77, 0x01, 0x8a, 0xc7, 0xc0, 0x67, 0x3f, 0x4e, 0xf5, 0xce, 0xeb, 0x21, - 0x13, 0xd6, 0xb3, 0x05, 0xeb, 0x79, 0xad, 0xa1, 0x4c, 0x7a, 0xef, 0x56, - 0xf3, 0x46, 0x66, 0xad, 0xc8, 0x68, 0xb1, 0xda, 0x2b, 0xb5, 0x4e, 0x08, - 0x8a, 0x3f, 0x6a, 0x35, 0x9a, 0x76, 0x2d, 0x71, 0xad, 0xeb, 0x13, 0x35, - 0xa5, 0xe2, 0x49, 0x5b, 0x58, 0x9f, 0x0c, 0x50, 0x02, 0x0c, 0x52, 0x11, - 0xad, 0x5c, 0xb2, 0x35, 0x5a, 0x3b, 0xe0, 0x40, 0x7d, 0x30, 0x2f, 0x0b, - 0x11, 0x0c, 0xec, 0xe0, 0x2c, 0x5f, 0xbe, 0x51, 0xb5, 0xe8, 0x7f, 0xae, - 0x8f, 0x2a, 0x0b, 0xb7, 0xe7, 0x03, 0x1c, 0xab, 0x37, 0xfe, 0xc0, 0x76, - 0xad, 0xb2, 0xd1, 0xdb, 0x0a, 0xbb, 0x3a, 0x0f, 0x27, 0x9c, 0x7e, 0x99, - 0x36, 0xdf, 0x43, 0xe7, 0x5c, 0x0c, 0x50, 0x3c, 0xd1, 0x15, 0x9a, 0xc9, - 0x21, 0x07, 0x53, 0xd0, 0x29, 0x92, 0x76, 0xa0, 0x65, 0xec, 0x57, 0xbd, - 0xf6, 0xfb, 0x3c, 0x96, 0xc0, 0xd5, 0x27, 0x2f, 0x8e, 0xf4, 0x15, 0xd8, - 0xb9, 0x39, 0xc4, 0x30, 0xd2, 0x3d, 0x8e, 0x0b, 0x35, 0x92, 0x03, 0x69, - 0xb3, 0xa1, 0xfa, 0x9c, 0x6c, 0xb0, 0x38, 0xc1, 0xcc, 0x07, 0x62, 0x53, - 0x98, 0xea, 0x72, 0xa6, 0xca, 0x52, 0x7f, 0x2b, 0xd2, 0xbb, 0xb3, 0x5d, - 0x97, 0x80, 0xa4, 0x44, 0x24, 0x03, 0xf9, 0x52, 0x49, 0xb5, 0x87, 0x3f, - 0x25, 0x8b, 0x3e, 0x73, 0xa9, 0xdc, 0x7c, 0x4b, 0xbb, 0x5a, 0xda, 0x0d, - 0xac, 0xb3, 0x78, 0xb4, 0xa2, 0x19, 0xef, 0x52, 0x69, 0x85, 0x51, 0xbc, - 0x42, 0x8b, 0x30, 0x14, 0xf4, 0x1f, 0x72, 0xf3, 0x86, 0xdd, 0x58, 0x23, - 0x12, 0x62, 0x56, 0xd3, 0xb7, 0x0b, 0xfd, 0x84, 0xdd, 0x46, 0xca, 0x41, - 0xe7, 0xae, 0x0c, 0x4b, 0xe9, 0x0c, 0xac, 0x87, 0x7b, 0x7b, 0x7b, 0x9c, - 0x65, 0x06, 0x0b, 0xd9, 0xf8, 0xa8, 0x01, 0xf1, 0x6e, 0x3b, 0xca, 0xd9, - 0x37, 0xee, 0x5c, 0x93, 0x65, 0xbd, 0x94, 0x37, 0xd5, 0xe3, 0xa4, 0x20, - 0xd0, 0xe1, 0xfd, 0x19, 0x24, 0xb0, 0xdc, 0x49, 0x6c, 0x32, 0x92, 0x38, - 0xa9, 0x46, 0xfe, 0x59, 0xc2, 0x4f, 0xcb, 0x19, 0x6f, 0x83, 0xb9, 0x1e, - 0xf8, 0x73, 0xc3, 0x61, 0x6d, 0xe0, 0x60, 0x4a, 0x20, 0x95, 0x11, 0x19, - 0x39, 0xc8, 0x7a, 0x20, 0xa0, 0x20, 0xa1, 0x58, 0x58, 0xa2, 0xa6, 0x00, - 0xd2, 0x25, 0xd1, 0x30, 0xb3, 0x89, 0x57, 0x5c, 0x48, 0xe6, 0x15, 0xc1, - 0x6b, 0x62, 0xcb, 0xca, 0x2d, 0xa5, 0x77, 0x60, 0xd5, 0xa9, 0x94, 0x2c, - 0x3f, 0xb1, 0xcf, 0x6b, 0x09, 0xf5, 0x4f, 0x17, 0x20, 0x39, 0x01, 0x2c, - 0x2d, 0x3e, 0xfa, 0x54, 0x60, 0xf0, 0x63, 0xbe, 0x70, 0x4f, 0xab, 0xb5, + 0x1f, 0x8b, 0x08, 0x08, 0x1e, 0x16, 0x9a, 0x5d, 0x04, 0x00, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x00, 0xe4, 0x5d, 0x5b, 0x77, + 0x1b, 0x49, 0x11, 0x7e, 0xe7, 0x1c, 0xfe, 0xc3, 0x44, 0x81, 0x44, 0x62, + 0x25, 0x59, 0x17, 0xdb, 0x38, 0x72, 0xe4, 0xc5, 0xc9, 0x3a, 0xd9, 0x40, + 0x2e, 0x4b, 0x1c, 0x08, 0x10, 0x72, 0xcc, 0x48, 0x6a, 0x49, 0x83, 0x47, + 0x33, 0x62, 0x66, 0x64, 0xd9, 0x31, 0xfe, 0x27, 0x9c, 0xc3, 0x0b, 0x2f, + 0xfc, 0x01, 0x9e, 0x78, 0x82, 0x3f, 0xc6, 0x57, 0xd5, 0xdd, 0xd3, 0x73, + 0x93, 0x2c, 0xf9, 0x22, 0x6e, 0xde, 0x8d, 0xa4, 0xe9, 0xae, 0xae, 0xaa, + 0xae, 0xae, 0xae, 0xae, 0xae, 0xbe, 0xcc, 0xd3, 0x07, 0xdf, 0xbc, 0x7b, + 0xfe, 0xe1, 0xd7, 0xdf, 0x1d, 0x59, 0xe3, 0x68, 0xe2, 0x1e, 0x7c, 0xff, + 0x7b, 0x4f, 0xd5, 0xb7, 0x85, 0xbf, 0xa7, 0x63, 0x61, 0x0f, 0xd4, 0x6f, + 0x7e, 0x8e, 0x9c, 0xc8, 0x15, 0x07, 0x6f, 0xfa, 0xaf, 0x9d, 0xd1, 0x38, + 0x72, 0xbc, 0xd1, 0xd3, 0x2d, 0x4e, 0x49, 0x82, 0x4c, 0x44, 0x64, 0x5b, + 0xfd, 0xb1, 0x1d, 0x84, 0x22, 0xea, 0x96, 0x7e, 0xf1, 0xe1, 0x45, 0x6d, + 0xaf, 0x94, 0xcb, 0xf7, 0xec, 0x89, 0xe8, 0x96, 0xce, 0x1c, 0x31, 0x9f, + 0xfa, 0x41, 0x54, 0xb2, 0xfa, 0xbe, 0x17, 0x09, 0x0f, 0xf0, 0x73, 0x67, + 0x10, 0x8d, 0xbb, 0x03, 0x71, 0xe6, 0xf4, 0x45, 0x8d, 0x1f, 0xaa, 0x96, + 0xe3, 0x39, 0x91, 0x63, 0xbb, 0xb5, 0xb0, 0x6f, 0xbb, 0xa2, 0xdb, 0xac, + 0x37, 0x16, 0xe1, 0x9b, 0xf8, 0x3d, 0xc7, 0x45, 0x31, 0xd1, 0xab, 0xd9, + 0xd3, 0x69, 0xad, 0x6f, 0x4f, 0xed, 0x9e, 0x2b, 0x12, 0xd8, 0x2f, 0x44, + 0x98, 0x2a, 0xeb, 0x3a, 0xde, 0xa9, 0x15, 0x08, 0xb7, 0x5b, 0x0a, 0xc7, + 0xe0, 0xa3, 0x3f, 0x8b, 0x2c, 0x07, 0xc0, 0x25, 0x6b, 0x1c, 0x88, 0x61, + 0xb7, 0x34, 0x8e, 0xa2, 0x69, 0xd8, 0xd9, 0xda, 0x0a, 0xec, 0x79, 0x7d, + 0xe4, 0x44, 0xe3, 0x59, 0x6f, 0x16, 0x8a, 0x40, 0x61, 0xab, 0xf7, 0xfd, + 0xc9, 0xd6, 0x0b, 0xbb, 0xf7, 0xda, 0xee, 0xd5, 0x5e, 0xcf, 0x84, 0x27, + 0xbc, 0x2d, 0x23, 0x97, 0xad, 0x89, 0x1d, 0x46, 0x22, 0xd8, 0x3a, 0x0c, + 0x06, 0x33, 0xc7, 0xf3, 0x93, 0x39, 0x03, 0x3b, 0xb2, 0xb7, 0x86, 0xf6, + 0x19, 0x11, 0xaa, 0xe3, 0xa3, 0x64, 0x45, 0x17, 0x53, 0x30, 0xef, 0x4c, + 0xec, 0x91, 0xd8, 0x3a, 0xaf, 0x49, 0x06, 0xb6, 0x8a, 0xd9, 0x44, 0xb5, + 0x50, 0xc1, 0xc8, 0x9f, 0xf5, 0xc7, 0xb5, 0x7b, 0xe7, 0x34, 0x4b, 0xac, + 0x3e, 0xf5, 0x46, 0x8b, 0xc4, 0x17, 0x5d, 0xb8, 0x22, 0x1c, 0x0b, 0x11, + 0x65, 0x39, 0x1a, 0x82, 0x87, 0xb0, 0x3e, 0xf2, 0xfd, 0x91, 0x2b, 0xec, + 0xa9, 0x13, 0x32, 0x33, 0xfd, 0x30, 0xfc, 0x7a, 0x68, 0x4f, 0x1c, 0xf7, + 0xa2, 0xfb, 0xc6, 0x06, 0x75, 0xb4, 0xee, 0x57, 0xaf, 0x40, 0x21, 0xdd, + 0x3a, 0x8c, 0x14, 0x09, 0x3f, 0xb2, 0x2e, 0x29, 0xb5, 0x67, 0xf7, 0x4f, + 0x47, 0x81, 0x3f, 0xf3, 0x06, 0xb5, 0x40, 0x4c, 0x85, 0x1d, 0x75, 0x2c, + 0xcf, 0x57, 0x3f, 0xf7, 0x09, 0x60, 0x6a, 0x0f, 0x06, 0xe0, 0xbb, 0x63, + 0x35, 0xf8, 0x71, 0x62, 0x07, 0x23, 0xc7, 0x93, 0x4f, 0x57, 0xc0, 0x52, + 0xb5, 0x3a, 0xf6, 0x10, 0xc4, 0xf0, 0xdd, 0x13, 0x43, 0x3f, 0x10, 0x8c, + 0x16, 0x7f, 0xa4, 0x30, 0xa7, 0x4e, 0x54, 0xeb, 0xf9, 0xe7, 0xb5, 0xd0, + 0xf9, 0xc2, 0x28, 0x1c, 0x6f, 0x0c, 0xb6, 0x18, 0x2f, 0xfe, 0x0a, 0x72, + 0x24, 0x52, 0xea, 0x2b, 0x1a, 0x0d, 0xd5, 0x94, 0xa0, 0x44, 0x67, 0xb7, + 0x55, 0xdf, 0xf9, 0x21, 0xe7, 0xf7, 0xfc, 0xc1, 0x45, 0x3e, 0xbf, 0x59, + 0xdf, 0x11, 0x13, 0x85, 0x1a, 0x32, 0x14, 0xb5, 0xb1, 0x20, 0x99, 0x23, + 0x7d, 0x77, 0x3f, 0x01, 0x3b, 0x97, 0xa9, 0xdb, 0x8d, 0x46, 0x32, 0x55, + 0xca, 0xad, 0x53, 0x7a, 0x8f, 0xce, 0x30, 0xb7, 0x2f, 0x4a, 0xd5, 0xd2, + 0xb7, 0xc2, 0x3d, 0x13, 0x91, 0xd3, 0xb7, 0xdf, 0x8a, 0x99, 0x48, 0x3e, + 0x5b, 0x32, 0x21, 0x7e, 0xae, 0x1e, 0x92, 0xa4, 0xab, 0xa1, 0xed, 0x85, + 0xb5, 0x10, 0x95, 0x18, 0x2a, 0xbc, 0x7d, 0xdf, 0xf5, 0x83, 0xce, 0xc3, + 0x56, 0xab, 0x25, 0x99, 0x9e, 0x45, 0x91, 0xef, 0x55, 0xad, 0x4f, 0x52, + 0x31, 0xe5, 0x63, 0xe9, 0x73, 0x9c, 0x10, 0x08, 0x74, 0xed, 0xc4, 0x73, + 0x38, 0xeb, 0x4d, 0x1c, 0x99, 0x10, 0xf8, 0x6e, 0xa2, 0x84, 0xac, 0x79, + 0x7f, 0x16, 0x84, 0x40, 0x6f, 0x4d, 0x7d, 0xc7, 0x83, 0xf8, 0xf7, 0x53, + 0x34, 0x1c, 0x6f, 0x3a, 0x8b, 0xaa, 0x96, 0x3f, 0x8d, 0xa8, 0x69, 0xa7, + 0x55, 0x2b, 0x14, 0xae, 0xe8, 0x23, 0x25, 0x12, 0xe7, 0x91, 0x1d, 0x08, + 0x9b, 0x70, 0xc8, 0x9a, 0x1b, 0xd1, 0x5b, 0x5b, 0x3f, 0xb2, 0x8e, 0xa7, + 0xa2, 0xef, 0x0c, 0x2f, 0x38, 0x47, 0x67, 0xd8, 0x5e, 0x5f, 0x58, 0xfe, + 0x10, 0x69, 0xc1, 0xc4, 0x02, 0x9e, 0x89, 0x80, 0xee, 0x59, 0x3f, 0xda, + 0x4a, 0x50, 0x94, 0xe8, 0xfc, 0x33, 0x11, 0x0c, 0x5d, 0x7f, 0xde, 0xb1, + 0xce, 0x9c, 0xd0, 0x81, 0x8d, 0x60, 0x94, 0x87, 0x83, 0x01, 0xaa, 0x16, + 0x5a, 0xbf, 0xd3, 0xd9, 0xbf, 0xb3, 0x50, 0x51, 0x2b, 0xf2, 0xad, 0xdf, + 0x8d, 0x9d, 0xc1, 0x40, 0x78, 0xbf, 0x03, 0x21, 0xeb, 0xd5, 0x91, 0xb5, + 0xb7, 0xf5, 0x64, 0xab, 0xd9, 0xd8, 0x6a, 0x36, 0xd3, 0xb8, 0x3b, 0x9d, + 0xda, 0xc4, 0xff, 0x52, 0x1b, 0xfa, 0xfd, 0x59, 0x58, 0x73, 0x3c, 0x4f, + 0x04, 0x39, 0x19, 0xe6, 0x41, 0xb2, 0x52, 0xcd, 0x43, 0xe4, 0xe4, 0x9c, + 0x07, 0x51, 0x1d, 0xc4, 0x0f, 0x06, 0x22, 0xa8, 0x71, 0xb7, 0xe9, 0x58, + 0xf9, 0x2e, 0x61, 0x18, 0x35, 0xe5, 0x03, 0xe4, 0x6e, 0x96, 0x4b, 0x7f, + 0x16, 0x91, 0xce, 0x13, 0x4b, 0x86, 0xe9, 0x0c, 0x83, 0x55, 0x1e, 0x8c, + 0xd6, 0x56, 0x40, 0x22, 0x60, 0xba, 0xb3, 0x3d, 0x85, 0x65, 0x08, 0xa0, + 0x13, 0xa0, 0x25, 0x51, 0x70, 0x2b, 0x3f, 0xf7, 0x83, 0x40, 0xf4, 0xd1, + 0xac, 0x63, 0x81, 0xe6, 0xb4, 0x31, 0x62, 0x38, 0xd1, 0x05, 0x35, 0x32, + 0xcb, 0xcd, 0xea, 0xbb, 0x4e, 0xff, 0x94, 0x86, 0x0d, 0x36, 0xcb, 0x21, + 0xb5, 0xb8, 0xf3, 0xee, 0x38, 0xdd, 0xd0, 0x5a, 0x4b, 0x99, 0x1e, 0x6b, + 0x6a, 0x2d, 0x02, 0xa1, 0x90, 0xf4, 0x8e, 0x8c, 0x92, 0x27, 0xf5, 0xe9, + 0x85, 0x13, 0xc0, 0xce, 0x9c, 0x5b, 0xdb, 0x8d, 0xaf, 0xaa, 0xd6, 0x2b, + 0xd2, 0x7d, 0x0f, 0xea, 0x74, 0x74, 0x3e, 0x45, 0x6f, 0x83, 0x34, 0x9a, + 0xcd, 0x1a, 0xd0, 0xe6, 0x7b, 0x43, 0xbe, 0x0f, 0xe4, 0xec, 0x9f, 0xec, + 0xb0, 0x16, 0x13, 0x9d, 0x02, 0xc2, 0x8b, 0xf6, 0xb3, 0x0a, 0x20, 0xf9, + 0xe0, 0x64, 0x86, 0xce, 0x18, 0xae, 0xce, 0xc0, 0x09, 0xa9, 0x96, 0x83, + 0xea, 0xf7, 0xbf, 0xf7, 0x49, 0xff, 0xfe, 0x2c, 0x1b, 0x68, 0x6a, 0xf7, + 0x21, 0x12, 0x34, 0x49, 0x7d, 0x5b, 0x02, 0xd7, 0x7b, 0x91, 0x77, 0x72, + 0x22, 0x47, 0x13, 0x55, 0x69, 0xdb, 0x75, 0x46, 0x5e, 0xcd, 0x89, 0xc4, + 0x24, 0xec, 0x58, 0x7d, 0x41, 0x95, 0x4b, 0xb2, 0x10, 0xd8, 0x03, 0x67, + 0x16, 0xc6, 0x34, 0x0d, 0x1b, 0xe9, 0x24, 0x10, 0x9e, 0xba, 0x36, 0x48, + 0x0d, 0x5d, 0x71, 0x4e, 0x29, 0xfc, 0xa3, 0x63, 0x35, 0xad, 0x86, 0x65, + 0xcf, 0x22, 0x9f, 0x93, 0x7e, 0x3f, 0x0b, 0x23, 0xf4, 0xf4, 0x9a, 0xa2, + 0x6f, 0xc8, 0x19, 0x1b, 0x9f, 0x04, 0x9f, 0xfa, 0x21, 0xdc, 0x05, 0x28, + 0x39, 0x8d, 0x4c, 0x76, 0xe4, 0x9c, 0xb1, 0x10, 0x58, 0x56, 0x32, 0x83, + 0x2a, 0xd6, 0x0e, 0x61, 0x96, 0x7a, 0x4e, 0xbf, 0xd6, 0x13, 0x5f, 0x1c, + 0x11, 0x94, 0x1b, 0xf5, 0xd6, 0x4e, 0x15, 0xe9, 0x7b, 0xf4, 0x81, 0x5f, + 0xcd, 0x0a, 0x17, 0x9a, 0x8f, 0x51, 0xc3, 0x5a, 0x08, 0x81, 0xb0, 0x3c, + 0xe7, 0x81, 0x3d, 0xe5, 0x74, 0x76, 0x4c, 0xe2, 0xaa, 0x18, 0x21, 0xad, + 0x25, 0x9b, 0xdd, 0xe9, 0x79, 0x52, 0x08, 0x84, 0x8e, 0x07, 0x03, 0x29, + 0x0b, 0x43, 0xa5, 0xd5, 0x6c, 0x28, 0x48, 0x35, 0x4c, 0x58, 0x6d, 0x2a, + 0x6a, 0xa4, 0xd5, 0x30, 0xd5, 0x4f, 0x8e, 0x32, 0x56, 0x73, 0x9b, 0xc1, + 0xd2, 0xa3, 0x89, 0xb5, 0xd3, 0x68, 0xac, 0x2c, 0x56, 0xd0, 0xb1, 0xf6, + 0x14, 0x12, 0x63, 0x4a, 0xac, 0xa6, 0xa6, 0x3f, 0x71, 0xbc, 0x9a, 0xe2, + 0x72, 0x8f, 0xe0, 0x32, 0xfd, 0x3b, 0xee, 0x1d, 0x03, 0xd1, 0xf7, 0x03, + 0x9b, 0x84, 0xcf, 0x6a, 0x79, 0xb3, 0x16, 0xa9, 0x4a, 0x0d, 0xb2, 0x9a, + 0x93, 0x70, 0x59, 0x43, 0xc3, 0x76, 0xd3, 0x58, 0xe7, 0xd6, 0xa8, 0x19, + 0x90, 0x39, 0x81, 0xe9, 0x86, 0x81, 0x4f, 0x5a, 0x06, 0xf2, 0x8d, 0x6a, + 0xb2, 0x93, 0x19, 0x7e, 0xe8, 0x8f, 0x2c, 0x56, 0x71, 0xae, 0xca, 0x0e, + 0x8b, 0x73, 0xe3, 0xbf, 0x5c, 0xae, 0xd1, 0x8d, 0x5a, 0xad, 0xe7, 0xfa, + 0xfd, 0x53, 0xa9, 0x22, 0xa6, 0xd5, 0x93, 0xde, 0xc7, 0x7e, 0x3a, 0x8b, + 0xe9, 0x51, 0x13, 0xeb, 0xac, 0x6c, 0x87, 0xc9, 0xbb, 0x2f, 0xaa, 0xfb, + 0xc8, 0x9c, 0xb8, 0xbc, 0x49, 0x49, 0x3e, 0xc5, 0xcd, 0x6c, 0x94, 0x27, + 0xd6, 0xb9, 0xbd, 0xc6, 0x0f, 0x53, 0xbe, 0x81, 0xf5, 0xf0, 0xc5, 0x8b, + 0x17, 0x2a, 0x25, 0x6f, 0x87, 0x1e, 0x38, 0x13, 0x72, 0xe3, 0x6d, 0x65, + 0x86, 0x62, 0x4d, 0xd7, 0x65, 0xb7, 0xfb, 0xf6, 0x70, 0xa7, 0x61, 0xa0, + 0x8c, 0x50, 0xea, 0x33, 0x18, 0xe9, 0xa0, 0x6f, 0x87, 0xec, 0x8c, 0x19, + 0x95, 0xdf, 0x95, 0x2a, 0x9f, 0x37, 0xae, 0x1a, 0x3e, 0x2d, 0x58, 0x1f, + 0xe6, 0x73, 0xa2, 0x25, 0x2b, 0x9f, 0x4c, 0x2f, 0xc1, 0x5f, 0xc0, 0xaa, + 0x6f, 0xf4, 0x36, 0xa9, 0x3c, 0x76, 0x2f, 0xf4, 0xdd, 0x59, 0x24, 0x52, + 0x32, 0xd1, 0xda, 0x9b, 0x50, 0x71, 0x93, 0x34, 0xd6, 0x3d, 0xc9, 0xa0, + 0x93, 0x10, 0x26, 0x25, 0xe7, 0x8c, 0xe6, 0x7a, 0xff, 0x4e, 0x2c, 0xe1, + 0x2f, 0x18, 0x1d, 0x07, 0xd4, 0x2c, 0xdb, 0x19, 0x91, 0x0f, 0x87, 0xc3, + 0x85, 0x22, 0x7f, 0x28, 0x9e, 0x34, 0xc5, 0x6e, 0x7b, 0xb9, 0xe4, 0xf3, + 0x50, 0x31, 0xbb, 0xae, 0x5b, 0xc3, 0x1c, 0xcd, 0x1b, 0x89, 0x8e, 0x74, + 0x6e, 0xc7, 0xf6, 0xc0, 0x9f, 0xab, 0x5c, 0x93, 0x40, 0x9d, 0xbd, 0x0d, + 0x1b, 0xb0, 0x83, 0x7f, 0xb5, 0x26, 0x3e, 0x82, 0x51, 0xcf, 0x2e, 0x37, + 0xaa, 0xf4, 0x5f, 0xbd, 0x55, 0x41, 0xd7, 0x64, 0x13, 0x41, 0x06, 0x0a, + 0x3f, 0x93, 0x99, 0xcd, 0x6d, 0xce, 0x6d, 0x52, 0xee, 0x5e, 0x3e, 0xb7, + 0x55, 0x91, 0xed, 0x47, 0x13, 0xa0, 0xc5, 0x56, 0x73, 0x99, 0x79, 0x34, + 0x7a, 0x2f, 0xbd, 0x62, 0x4c, 0x02, 0x66, 0x81, 0x40, 0xdf, 0x8b, 0x68, + 0xee, 0x02, 0x14, 0x8f, 0x81, 0xcf, 0x7e, 0x9c, 0xea, 0x9d, 0xd7, 0x43, + 0x26, 0xac, 0x67, 0x0b, 0xd6, 0xf3, 0x5a, 0x43, 0x99, 0xf4, 0xde, 0xad, + 0xe6, 0x8d, 0xcc, 0x5a, 0x91, 0xd1, 0x62, 0xb5, 0x57, 0x6a, 0x9d, 0x10, + 0x14, 0x7f, 0xd4, 0x6a, 0x34, 0xed, 0x5a, 0xe2, 0x5a, 0xd7, 0x27, 0x6a, + 0x4a, 0xc5, 0x93, 0xb6, 0xb0, 0x3e, 0x19, 0xa0, 0x04, 0x18, 0xa4, 0x22, + 0x5a, 0xb9, 0x64, 0x6b, 0xb4, 0x76, 0xc0, 0x81, 0xfa, 0x60, 0x5e, 0x16, + 0x22, 0x18, 0xd8, 0xc1, 0x69, 0xbe, 0x7c, 0xa3, 0x6a, 0xd1, 0xff, 0x5c, + 0x1f, 0x55, 0x16, 0x6e, 0xcf, 0x07, 0x38, 0x56, 0x6f, 0xfc, 0x81, 0xed, + 0x5a, 0x65, 0xa3, 0xb7, 0x15, 0x76, 0x75, 0x1e, 0x4e, 0x38, 0xfd, 0x32, + 0x6d, 0xbe, 0x87, 0xce, 0xb9, 0x18, 0xa0, 0x78, 0xa2, 0x2b, 0x34, 0x93, + 0x43, 0x0e, 0xa6, 0xa0, 0x53, 0x24, 0xed, 0x40, 0xcb, 0xd8, 0xaf, 0x7a, + 0xed, 0xf7, 0x79, 0x2c, 0x81, 0xab, 0x4f, 0x5e, 0x1c, 0xe9, 0x2b, 0xb0, + 0x73, 0x73, 0x88, 0x61, 0xa4, 0x7b, 0x1c, 0x17, 0x6a, 0x24, 0x07, 0xd2, + 0x66, 0x43, 0xf5, 0x39, 0xd9, 0x60, 0x71, 0x82, 0x99, 0x0f, 0xc4, 0xa6, + 0x30, 0xd5, 0xe5, 0x4c, 0x95, 0xa5, 0xfe, 0x56, 0xa4, 0x77, 0x67, 0xbb, + 0x2e, 0x01, 0x49, 0x89, 0x48, 0x06, 0xf2, 0xa5, 0x92, 0x6a, 0x0f, 0x7f, + 0x4a, 0x16, 0x7d, 0xe6, 0x52, 0xb9, 0xf9, 0x96, 0x76, 0xb5, 0xb4, 0x1b, + 0x58, 0x67, 0xf1, 0x68, 0x45, 0x33, 0xde, 0xa5, 0xd2, 0x0a, 0xa3, 0x78, + 0x85, 0x16, 0x61, 0x28, 0xe8, 0x3f, 0xe4, 0xe6, 0x0d, 0xbb, 0xb1, 0x46, + 0x24, 0xc4, 0xac, 0xa6, 0x6f, 0x17, 0xfa, 0x09, 0xbb, 0x8d, 0x94, 0x83, + 0xce, 0x5d, 0x19, 0x96, 0xd2, 0x19, 0x58, 0x0f, 0xf7, 0xf6, 0xf6, 0x38, + 0xcb, 0x0c, 0x16, 0xb2, 0xf1, 0x51, 0x03, 0xe2, 0xdd, 0x76, 0x94, 0xb3, + 0x6f, 0xdc, 0xb9, 0x26, 0xcb, 0x7a, 0x29, 0x6f, 0xaa, 0xc7, 0x49, 0x41, + 0xa0, 0xc3, 0xfb, 0x33, 0x48, 0x60, 0xb9, 0x93, 0xd8, 0x64, 0x24, 0x71, + 0x52, 0x8d, 0xfc, 0xb3, 0x84, 0x9f, 0x96, 0x33, 0xde, 0x06, 0x73, 0x3d, + 0xf0, 0xe7, 0x86, 0xc3, 0xda, 0xc0, 0xc1, 0x94, 0x40, 0x2a, 0x23, 0x32, + 0x72, 0x90, 0xf5, 0x40, 0x40, 0x41, 0x42, 0xb1, 0xb0, 0x44, 0x4d, 0x01, + 0xa4, 0x4b, 0xa2, 0x61, 0x66, 0x13, 0xaf, 0xb8, 0x90, 0xcc, 0x2b, 0x82, + 0xd7, 0xc4, 0x96, 0x95, 0x5b, 0x4a, 0xef, 0xc0, 0xaa, 0x53, 0x29, 0x59, + 0x7e, 0x62, 0x9f, 0xd7, 0x12, 0xea, 0x9f, 0x2e, 0x40, 0x72, 0x02, 0x58, + 0x5a, 0x7c, 0xf4, 0xa9, 0xc0, 0xe0, 0xc7, 0x9c, 0x71, 0x4f, 0xab, 0xb5, 0x09, 0x2c, 0x33, 0x32, 0x40, 0x1f, 0xda, 0xea, 0x5f, 0xad, 0x95, 0x1e, 0x1b, 0x1a, 0x72, 0x70, 0x50, 0xb9, 0xdb, 0xf8, 0xd7, 0xc8, 0x02, 0x34, 0xb7, 0x25, 0x04, 0xeb, 0xd5, 0x5e, 0x21, 0x44, 0xab, 0x92, 0xf0, 0x2c, @@ -235,7 +235,7 @@ static const char index_htm_gz[] PROGMEM ={ 0x14, 0x8b, 0xcd, 0xdc, 0x82, 0xb8, 0xa2, 0x51, 0x88, 0x5b, 0x42, 0xf0, 0xe6, 0x2d, 0x9b, 0x96, 0x6a, 0x70, 0x7e, 0x43, 0x9e, 0x09, 0xf8, 0xd1, 0x16, 0xad, 0xa0, 0x3b, 0x41, 0x1f, 0x47, 0x8d, 0xe8, 0xd4, 0x58, 0x74, - 0x7a, 0x2a, 0x9f, 0xd4, 0xd2, 0xb0, 0xe7, 0x4c, 0xd4, 0xc6, 0xe1, 0x24, + 0x72, 0x22, 0x9f, 0xd4, 0xd2, 0xb0, 0xe7, 0x4c, 0xd4, 0xc6, 0xe1, 0x24, 0x50, 0x6d, 0xe8, 0xc0, 0xe4, 0x63, 0xc5, 0x4d, 0x6e, 0x84, 0x91, 0xfb, 0xed, 0xe9, 0x38, 0x86, 0x45, 0x85, 0x12, 0xfb, 0x45, 0x03, 0x3f, 0xc2, 0x66, 0xb6, 0x72, 0xed, 0x49, 0x63, 0x20, 0x46, 0x72, 0xf7, 0x55, 0xab, @@ -243,9 +243,9 @@ static const char index_htm_gz[] PROGMEM ={ 0x52, 0x86, 0xdb, 0x96, 0xdb, 0xb2, 0x72, 0xec, 0x39, 0xde, 0xd0, 0x5f, 0xc6, 0x9c, 0x3e, 0x79, 0x40, 0xec, 0x01, 0xf7, 0xdc, 0x0e, 0x06, 0xe1, 0x7e, 0x7a, 0x63, 0xfd, 0x7e, 0x9a, 0x4b, 0xf9, 0xd3, 0x05, 0xa3, 0xbf, - 0x29, 0x63, 0xcf, 0x86, 0x98, 0xa8, 0x15, 0xc3, 0x9f, 0x9c, 0x89, 0x8b, + 0x2e, 0x63, 0xcf, 0x86, 0x98, 0xa8, 0x15, 0xc3, 0x9f, 0x9c, 0x8a, 0x8b, 0x61, 0x80, 0xa3, 0x6d, 0x61, 0xbe, 0xf2, 0x6a, 0xc3, 0x00, 0x38, 0xc1, - 0xc1, 0x85, 0xc0, 0x3f, 0x13, 0xd8, 0xa3, 0x17, 0x22, 0x37, 0xb0, 0x89, + 0xc1, 0x85, 0xc0, 0x3f, 0x15, 0xd8, 0xa3, 0x17, 0x22, 0x37, 0xb0, 0x89, 0x00, 0x69, 0xcb, 0xbe, 0x75, 0x95, 0xc3, 0x92, 0xe7, 0x52, 0xe3, 0x91, 0xdf, 0x31, 0x93, 0x7a, 0x0b, 0xde, 0x42, 0x36, 0x2b, 0x09, 0x15, 0xa1, 0xe3, 0x38, 0x1e, 0x36, 0xa4, 0xd1, 0x3e, 0x86, 0x2d, 0xeb, 0x83, 0x8f, @@ -264,62 +264,62 @@ static const char index_htm_gz[] PROGMEM ={ 0x36, 0xa2, 0xab, 0xbd, 0xa7, 0xc9, 0x1e, 0x7f, 0xa5, 0xbb, 0x99, 0xd1, 0x92, 0x64, 0x5f, 0x53, 0x5d, 0xf5, 0x5e, 0x90, 0xe6, 0x38, 0xd6, 0x95, 0x33, 0xd8, 0x17, 0x60, 0x30, 0x04, 0xf2, 0xc4, 0x35, 0xf6, 0x7b, 0xc1, - 0x0a, 0x8b, 0x72, 0x4c, 0x9d, 0x5c, 0x0c, 0xac, 0x70, 0xee, 0x44, 0xfd, - 0xb1, 0x55, 0xc3, 0xfe, 0xef, 0x30, 0xc2, 0x71, 0x64, 0xda, 0xf5, 0xdb, - 0x1f, 0x8b, 0xfe, 0x99, 0xde, 0xf6, 0x5b, 0x57, 0x10, 0x97, 0x8b, 0xb6, - 0x2d, 0xe5, 0x37, 0x91, 0xcb, 0xa3, 0x18, 0xe9, 0x7e, 0x9f, 0xb6, 0x3c, - 0xe6, 0x59, 0x7b, 0x45, 0xb9, 0x43, 0x38, 0x6a, 0xff, 0x51, 0xcc, 0x80, - 0x3c, 0xbd, 0x65, 0x65, 0xce, 0x50, 0x25, 0x71, 0x34, 0x52, 0x08, 0x1a, - 0xba, 0x34, 0x36, 0xe1, 0xc9, 0xf1, 0x75, 0xd1, 0xb1, 0x84, 0xfc, 0x3e, - 0x6f, 0xb3, 0xbf, 0x39, 0xbb, 0xed, 0x39, 0x30, 0xc8, 0xcd, 0x51, 0x88, - 0xc6, 0x22, 0xdb, 0xd9, 0xeb, 0xf5, 0x90, 0xb5, 0x60, 0xfb, 0xcb, 0xb6, - 0xec, 0x21, 0xf9, 0x34, 0xc3, 0xb5, 0x3a, 0x49, 0xbb, 0x94, 0xf9, 0x78, - 0xdf, 0x7c, 0xa9, 0x94, 0xaa, 0x7f, 0x6b, 0x37, 0x29, 0x61, 0xf5, 0x6c, - 0xaa, 0x23, 0xc5, 0x6b, 0xea, 0xb0, 0xbd, 0x68, 0x04, 0x90, 0xdb, 0xb4, - 0x6e, 0x56, 0x0d, 0x6e, 0xb2, 0x0e, 0xab, 0x13, 0x54, 0xed, 0x1b, 0x2b, - 0x6e, 0x8c, 0x62, 0x4a, 0xc9, 0x42, 0x7c, 0xb0, 0xd1, 0x14, 0x29, 0xd8, - 0x97, 0x28, 0xcf, 0x3f, 0x2c, 0x23, 0x64, 0xe4, 0x97, 0xe6, 0x3e, 0x3f, - 0xe2, 0xfe, 0xba, 0x4c, 0xe2, 0xa9, 0xc8, 0x5a, 0x4e, 0xc2, 0x6b, 0x61, - 0x96, 0xe7, 0x9b, 0x06, 0xac, 0x73, 0xfd, 0x40, 0x3f, 0x3b, 0x32, 0x2a, - 0x05, 0xcf, 0xc3, 0xa6, 0x58, 0xce, 0x1f, 0x6a, 0x51, 0x25, 0x20, 0x1b, - 0xb4, 0x9a, 0x3a, 0x0a, 0xb5, 0xa4, 0x6b, 0xa6, 0x0f, 0x35, 0x5b, 0x7c, - 0x40, 0x39, 0xb5, 0x4f, 0xb5, 0x65, 0xf6, 0xa9, 0xda, 0xb6, 0xbd, 0xec, - 0x1c, 0x9d, 0xd9, 0xe3, 0x9e, 0x12, 0xba, 0x3a, 0x23, 0xca, 0x2d, 0xa8, - 0x8f, 0x88, 0x2e, 0x45, 0xbf, 0x90, 0x40, 0xec, 0x95, 0x18, 0x05, 0xd5, - 0xc6, 0x8a, 0xb1, 0x6b, 0x2b, 0x23, 0x7d, 0x1f, 0x4e, 0xaa, 0xa9, 0xa4, - 0xcb, 0x14, 0x83, 0xdb, 0x6c, 0x4b, 0xf2, 0xea, 0x42, 0xdb, 0x58, 0x99, - 0x8f, 0x05, 0x35, 0x6d, 0xaa, 0x1d, 0x81, 0x59, 0xec, 0x1d, 0xd5, 0x26, - 0x97, 0xa9, 0xee, 0xf6, 0xf8, 0x0d, 0x76, 0x23, 0x5a, 0xb2, 0xe9, 0x42, - 0x32, 0xb7, 0x72, 0x9b, 0xa6, 0xf5, 0x9c, 0x79, 0xc5, 0xff, 0xec, 0x13, - 0x59, 0xde, 0x6c, 0xd2, 0x23, 0x80, 0x9e, 0x88, 0xe6, 0x34, 0x8b, 0x68, - 0x00, 0x94, 0xce, 0x83, 0xc0, 0x9c, 0xd1, 0xe9, 0x0a, 0x95, 0x0f, 0x1f, - 0x48, 0xb8, 0x83, 0xf0, 0x71, 0xd6, 0xd3, 0x4a, 0x3a, 0x5b, 0xa9, 0xaa, - 0x6c, 0x53, 0x55, 0xda, 0xfc, 0x17, 0x4b, 0xc9, 0xb5, 0x7b, 0xc2, 0x95, - 0x07, 0xb2, 0xf9, 0x67, 0x5a, 0x2a, 0x7b, 0x69, 0x73, 0x10, 0xbb, 0x82, - 0x79, 0x3f, 0x2e, 0xc5, 0xc4, 0xe1, 0xe1, 0x61, 0xc2, 0x6e, 0x73, 0x8b, - 0x16, 0x6a, 0x49, 0x5e, 0xe4, 0x34, 0xa2, 0x88, 0x88, 0xb9, 0x6d, 0x19, - 0x6e, 0x73, 0xaa, 0x23, 0x05, 0x80, 0xd3, 0xc6, 0x92, 0xe7, 0x85, 0xc3, - 0x89, 0xae, 0xa6, 0x96, 0x18, 0xa3, 0x90, 0x23, 0x94, 0x6e, 0x84, 0x3c, - 0xd6, 0xcb, 0x15, 0x6a, 0xd8, 0x6c, 0x36, 0xf3, 0x23, 0x91, 0x91, 0x1c, - 0xd7, 0x2d, 0x3e, 0x89, 0x95, 0xb3, 0x92, 0xb9, 0x63, 0xc2, 0x66, 0x84, - 0xe3, 0x2d, 0xa6, 0xd4, 0x56, 0xe9, 0xa3, 0x9b, 0x72, 0xc6, 0xb6, 0xa4, - 0x17, 0x2e, 0xee, 0x88, 0x59, 0x4b, 0xab, 0x40, 0xac, 0x06, 0xed, 0x8e, - 0x14, 0x76, 0x98, 0xdb, 0xd1, 0x6c, 0xa4, 0xdf, 0xe0, 0x3f, 0x12, 0xe2, - 0x52, 0x81, 0x49, 0xbb, 0x7b, 0xb9, 0x80, 0xb9, 0x9d, 0xc6, 0x5e, 0x7f, - 0xd8, 0xcf, 0x74, 0xcb, 0x80, 0xd5, 0x5e, 0xa1, 0x5c, 0xd8, 0x20, 0x0c, - 0xf5, 0xf9, 0xd2, 0x8c, 0x50, 0xb1, 0x46, 0xe6, 0xbb, 0xe1, 0x42, 0x79, - 0x25, 0xe6, 0xea, 0x8b, 0x6b, 0xba, 0xcd, 0x7f, 0x55, 0xa9, 0x7e, 0xd9, - 0x64, 0xe2, 0x7d, 0x19, 0x83, 0xd5, 0x7c, 0x52, 0xa7, 0xa3, 0x47, 0x0e, - 0x59, 0xaa, 0x16, 0x8d, 0x21, 0x2b, 0xae, 0x49, 0x7c, 0x06, 0x3e, 0xc9, - 0xa4, 0x86, 0x2e, 0xc8, 0xbc, 0xb2, 0x58, 0x6e, 0x6a, 0x48, 0x63, 0x3c, - 0x29, 0x81, 0xad, 0x45, 0x3c, 0x1e, 0xe8, 0x1b, 0x99, 0x81, 0x7e, 0xbb, - 0x48, 0xae, 0x04, 0xf7, 0xc3, 0x22, 0x6f, 0x27, 0xa7, 0xcf, 0x0f, 0xfb, - 0xfc, 0xb7, 0x48, 0x41, 0x05, 0xff, 0x15, 0x8a, 0x7f, 0x7b, 0x45, 0xf1, - 0x3f, 0xec, 0xb1, 0x1b, 0xa5, 0xba, 0xfc, 0x27, 0xd8, 0xd6, 0xae, 0x4c, - 0x31, 0xe3, 0x47, 0xde, 0x97, 0x8a, 0xb5, 0xf7, 0x61, 0x38, 0x15, 0x18, - 0xe4, 0x93, 0xa5, 0x39, 0x65, 0xa5, 0xc2, 0x5b, 0x3f, 0x52, 0x06, 0xfa, - 0x23, 0x6e, 0x53, 0x71, 0x13, 0x43, 0xc9, 0xe9, 0x9c, 0x12, 0x4e, 0xfb, - 0xb6, 0xf7, 0xc5, 0x0e, 0x35, 0xa6, 0x45, 0xa7, 0x91, 0x75, 0xf8, 0x93, + 0x0a, 0x8b, 0xf2, 0x9e, 0x3a, 0xb9, 0x18, 0x58, 0xe1, 0xdc, 0x89, 0xfa, + 0x63, 0xab, 0x86, 0xfd, 0xdf, 0x61, 0x84, 0xe3, 0xc8, 0xb4, 0xeb, 0xb7, + 0x3f, 0x16, 0xfd, 0x53, 0xbd, 0xed, 0xb7, 0xae, 0x20, 0x2e, 0x17, 0x6d, + 0x5b, 0xca, 0x6f, 0x22, 0x97, 0x47, 0x31, 0xd2, 0xfd, 0x3e, 0x6d, 0x79, + 0xcc, 0xb3, 0xf6, 0x8a, 0x72, 0x87, 0x70, 0xd4, 0xfe, 0xa3, 0x98, 0x01, + 0x79, 0x7a, 0xcb, 0xca, 0x9c, 0xa1, 0x4a, 0xe2, 0x68, 0xa4, 0x10, 0x34, + 0x74, 0x69, 0x6c, 0xc2, 0x93, 0xe3, 0xeb, 0xa2, 0x63, 0x09, 0xf9, 0x7d, + 0xde, 0x66, 0x7f, 0x73, 0x76, 0xdb, 0x73, 0x60, 0x90, 0x9b, 0xa3, 0x10, + 0x8d, 0x45, 0xb6, 0xb3, 0xd7, 0xeb, 0x21, 0x6b, 0xc1, 0xf6, 0x97, 0x6d, + 0xd9, 0x43, 0xf2, 0x69, 0x86, 0x6b, 0x75, 0x92, 0x76, 0x29, 0xf3, 0xf1, + 0xbe, 0xf9, 0x52, 0x29, 0x55, 0xff, 0xd6, 0x6e, 0x52, 0xc2, 0xea, 0xd9, + 0x54, 0x47, 0x8a, 0xd7, 0xd4, 0x61, 0x7b, 0xd1, 0x08, 0x20, 0xb7, 0x69, + 0xdd, 0xac, 0x1a, 0xdc, 0x64, 0x1d, 0x56, 0x27, 0xa8, 0xda, 0x57, 0x56, + 0xdc, 0x18, 0xc5, 0x94, 0x92, 0x85, 0xf8, 0x60, 0xa3, 0x29, 0x52, 0xb0, + 0x2f, 0x51, 0x9e, 0x7f, 0x58, 0x46, 0xc8, 0xc8, 0x2f, 0xcd, 0x7d, 0x7e, + 0xc4, 0xfd, 0x55, 0x99, 0xc4, 0x53, 0x91, 0xb5, 0x9c, 0x84, 0xd7, 0xc2, + 0x2c, 0xcf, 0x37, 0x0d, 0x58, 0xe7, 0xfa, 0x81, 0x7e, 0x76, 0x64, 0x54, + 0x0a, 0x9e, 0x87, 0x4d, 0xb1, 0x9c, 0x3f, 0xd4, 0xa2, 0x4a, 0x40, 0x36, + 0x68, 0x35, 0x75, 0x14, 0x6a, 0x49, 0xd7, 0x4c, 0x1f, 0x6a, 0xb6, 0xf8, + 0x80, 0x72, 0x6a, 0x9f, 0x6a, 0xcb, 0xec, 0x53, 0xb5, 0x6d, 0x7b, 0xd9, + 0x39, 0x3a, 0xb3, 0xc7, 0x3d, 0x25, 0x74, 0x75, 0x46, 0x94, 0x5b, 0x50, + 0x1f, 0x11, 0x5d, 0x8a, 0x7e, 0x21, 0x81, 0xd8, 0x2b, 0x31, 0x0a, 0xaa, + 0x8d, 0x15, 0x63, 0xd7, 0x56, 0x46, 0xfa, 0x3e, 0x9c, 0x54, 0x53, 0x49, + 0x97, 0x29, 0x06, 0xb7, 0xd9, 0x96, 0xe4, 0xd5, 0x85, 0xb6, 0xb1, 0x32, + 0x1f, 0x0b, 0x6a, 0xda, 0x54, 0x3b, 0x02, 0xb3, 0xd8, 0x3b, 0xaa, 0x4d, + 0x2e, 0x53, 0xdd, 0xed, 0xf1, 0x1b, 0xec, 0x46, 0xb4, 0x64, 0xd3, 0x85, + 0x64, 0x6e, 0xe5, 0x36, 0x4d, 0xeb, 0x39, 0xf3, 0x8a, 0xff, 0xd9, 0x27, + 0xb2, 0xbc, 0xd9, 0xa4, 0x47, 0x00, 0x3d, 0x11, 0xcd, 0x69, 0x16, 0xd1, + 0x00, 0x28, 0x9d, 0x07, 0x81, 0x39, 0xa3, 0xd3, 0x15, 0x2a, 0x1f, 0x3e, + 0x90, 0x70, 0x07, 0xe1, 0xe3, 0xac, 0xa7, 0x95, 0x74, 0xb6, 0x52, 0x55, + 0xd9, 0xa6, 0xaa, 0xb4, 0xf9, 0x2f, 0x96, 0x92, 0x6b, 0xf7, 0x84, 0x2b, + 0x0f, 0x64, 0xf3, 0xcf, 0xb4, 0x54, 0xf6, 0xd2, 0xe6, 0x20, 0x76, 0x05, + 0xf3, 0x7e, 0x5c, 0x8a, 0x89, 0xc3, 0xc3, 0xc3, 0x84, 0xdd, 0xe6, 0x16, + 0x2d, 0xd4, 0x92, 0xbc, 0xc8, 0x69, 0x44, 0x11, 0x11, 0x73, 0xdb, 0x32, + 0xdc, 0xe6, 0x54, 0x47, 0x0a, 0x00, 0xa7, 0x8d, 0x25, 0xcf, 0x0b, 0x87, + 0x13, 0x5d, 0x4d, 0x2d, 0x31, 0x46, 0x21, 0x47, 0x28, 0xdd, 0x08, 0x79, + 0xac, 0x97, 0x2b, 0xd4, 0xb0, 0xd9, 0x6c, 0xe6, 0x47, 0x22, 0x23, 0x39, + 0xae, 0x5b, 0x7c, 0x12, 0x2b, 0x67, 0x25, 0x73, 0xc7, 0x84, 0xcd, 0x08, + 0xc7, 0x5b, 0x4c, 0xa9, 0xad, 0xd2, 0x47, 0x37, 0xe5, 0x8c, 0x6d, 0x49, + 0x2f, 0x5c, 0xdc, 0x11, 0xb3, 0x96, 0x56, 0x81, 0x58, 0x0d, 0xda, 0x1d, + 0x29, 0xec, 0x30, 0xb7, 0xa3, 0xd9, 0x48, 0xbf, 0xc1, 0x7f, 0x24, 0xc4, + 0xa5, 0x02, 0x93, 0x76, 0xf7, 0x72, 0x01, 0x73, 0x3b, 0x8d, 0xbd, 0xfe, + 0xb0, 0x9f, 0xe9, 0x96, 0x01, 0xab, 0xbd, 0x42, 0xb9, 0xb0, 0x41, 0x18, + 0xea, 0xf3, 0xa5, 0x19, 0xa1, 0x62, 0x8d, 0xcc, 0x77, 0xc3, 0x85, 0xf2, + 0x4a, 0xcc, 0xd5, 0x17, 0xd7, 0x74, 0x9b, 0xff, 0xaa, 0x52, 0xfd, 0xb2, + 0xc9, 0xc4, 0xfb, 0x32, 0x06, 0xab, 0xf9, 0xa4, 0x4e, 0x47, 0x8f, 0x1c, + 0xb2, 0x54, 0x2d, 0x1a, 0x43, 0x56, 0x5c, 0x93, 0xf8, 0x0c, 0x7c, 0x92, + 0x49, 0x0d, 0x5d, 0x90, 0x79, 0x65, 0xb1, 0xdc, 0xd4, 0x90, 0xc6, 0x78, + 0x52, 0x02, 0x5b, 0x8b, 0x78, 0x3c, 0xd0, 0x37, 0x32, 0x03, 0xfd, 0x76, + 0x91, 0x5c, 0x09, 0xee, 0x87, 0x45, 0xde, 0x4e, 0x4e, 0x9f, 0x1f, 0xf6, + 0xf9, 0x6f, 0x91, 0x82, 0x0a, 0xfe, 0x2b, 0x14, 0xff, 0xf6, 0x8a, 0xe2, + 0x7f, 0xd8, 0x63, 0x37, 0x4a, 0x75, 0xf9, 0x4f, 0xb0, 0xad, 0x5d, 0x99, + 0x62, 0xc6, 0x8f, 0xbc, 0x2f, 0x15, 0x6b, 0xef, 0xc3, 0x70, 0x2a, 0x30, + 0xc8, 0x27, 0x4b, 0x73, 0xca, 0x4a, 0x85, 0xb7, 0x7e, 0xa4, 0x0c, 0xf4, + 0x47, 0xdc, 0xa6, 0xe2, 0x26, 0x86, 0x92, 0x93, 0x39, 0x25, 0x9c, 0xf4, + 0x6d, 0xef, 0xcc, 0x0e, 0x35, 0xa6, 0x45, 0xa7, 0x91, 0x75, 0xf8, 0x93, 0x37, 0x09, 0x9b, 0x50, 0x52, 0x3e, 0xd9, 0x98, 0x32, 0xe3, 0x12, 0x5f, 0x7f, 0x50, 0x3a, 0xf6, 0x54, 0xec, 0x69, 0x6d, 0x0c, 0xb9, 0xf0, 0xf9, 0xc2, 0x5a, 0xf1, 0xd1, 0x40, 0xf2, 0x37, 0x16, 0x9f, 0xad, 0x56, 0xea, @@ -329,1390 +329,1403 @@ static const char index_htm_gz[] PROGMEM ={ 0x3b, 0x81, 0x98, 0x14, 0xb9, 0x02, 0x0d, 0x93, 0x93, 0x9c, 0x51, 0xd4, 0xf7, 0x74, 0xea, 0x42, 0x1b, 0x6f, 0x34, 0x78, 0x99, 0xef, 0x71, 0x95, 0xb8, 0x15, 0x67, 0x4b, 0x5f, 0x8b, 0x23, 0x9f, 0x12, 0x37, 0x34, 0x3d, - 0xa5, 0xdb, 0x66, 0x0e, 0x12, 0xa0, 0x03, 0xe7, 0x8b, 0xe5, 0x0c, 0x70, - 0x81, 0x06, 0x02, 0x76, 0x10, 0xfc, 0x29, 0x42, 0x51, 0x1e, 0x38, 0x2b, - 0xc9, 0xab, 0x2e, 0xba, 0x25, 0x2d, 0x25, 0x6a, 0x88, 0x92, 0x2a, 0x18, - 0x17, 0x1e, 0x37, 0x0f, 0x14, 0x3c, 0x88, 0x34, 0xb3, 0xb9, 0xd3, 0x83, - 0x37, 0x4e, 0x3f, 0xf0, 0x43, 0x7f, 0x18, 0xbd, 0x3a, 0x7a, 0xba, 0x35, - 0x4d, 0x92, 0xdd, 0x02, 0xdd, 0x22, 0x36, 0xf8, 0x74, 0xa3, 0xa6, 0x93, - 0xca, 0xed, 0xbb, 0x76, 0x18, 0x32, 0x80, 0x39, 0xfe, 0xa8, 0x01, 0x53, - 0xc0, 0xe1, 0x97, 0x91, 0x45, 0xb7, 0x46, 0xa1, 0x63, 0x77, 0x4b, 0xe8, - 0xba, 0xb4, 0xa0, 0xb0, 0xd7, 0x6e, 0x3c, 0xd9, 0xdb, 0xdb, 0x6d, 0x25, - 0x7f, 0x97, 0xa4, 0xde, 0x74, 0x4b, 0xad, 0x46, 0xa3, 0xa4, 0x54, 0x46, - 0x3d, 0x9c, 0x4f, 0x5c, 0x2f, 0x94, 0xf7, 0x13, 0xe1, 0x7a, 0xa2, 0xf9, - 0x7c, 0x5e, 0x9f, 0xb7, 0xeb, 0x7e, 0x30, 0xda, 0x42, 0x6e, 0x63, 0x0b, - 0x04, 0x34, 0xe1, 0x1c, 0x71, 0x19, 0x3d, 0x53, 0xe1, 0xb6, 0x6e, 0xe9, - 0xa1, 0x18, 0xd2, 0x7f, 0x25, 0x1d, 0x7f, 0x53, 0x14, 0x41, 0x9b, 0xe2, - 0x73, 0xdd, 0x12, 0x4b, 0xd5, 0xea, 0x83, 0x51, 0x2c, 0xdc, 0x3c, 0x69, - 0xee, 0x6c, 0x3f, 0xd9, 0x6e, 0x37, 0x91, 0x70, 0x91, 0x49, 0x08, 0xf0, - 0xbc, 0x93, 0x78, 0xde, 0x5a, 0x4e, 0x9f, 0x45, 0x49, 0x87, 0xe0, 0x21, - 0x23, 0x7b, 0x84, 0xb0, 0x1f, 0x91, 0xd1, 0x12, 0x2c, 0x0a, 0xa4, 0x96, - 0x0c, 0xc7, 0x8d, 0x86, 0xdd, 0xef, 0x37, 0xf3, 0x1c, 0x67, 0x43, 0x88, - 0xc4, 0x62, 0xa3, 0x8a, 0x51, 0x2c, 0xce, 0xa1, 0x5e, 0x84, 0xfb, 0xb4, - 0xba, 0x25, 0x36, 0x5b, 0xf7, 0x56, 0xc5, 0x91, 0xae, 0x48, 0x3e, 0xe4, - 0xaa, 0x9b, 0xa5, 0xb0, 0x1c, 0xf5, 0xae, 0xb4, 0x60, 0xc0, 0x57, 0x96, - 0xad, 0x0b, 0xe6, 0x62, 0xa7, 0x24, 0xcf, 0xc0, 0x4c, 0x00, 0x46, 0x41, - 0x78, 0x41, 0x55, 0x03, 0x41, 0x3c, 0x06, 0x50, 0x4f, 0xd5, 0x51, 0xbd, - 0xfe, 0xd8, 0x07, 0xd7, 0xf2, 0xf2, 0x88, 0x52, 0x1c, 0xcc, 0x03, 0x20, - 0x6e, 0x33, 0x6b, 0x36, 0x7e, 0xf8, 0x74, 0x8b, 0xe0, 0x56, 0x62, 0x29, - 0xa5, 0xd5, 0x85, 0x5c, 0xb5, 0x1a, 0xb7, 0xe6, 0xaa, 0x55, 0x3a, 0x58, - 0xca, 0xd2, 0xd3, 0xad, 0x51, 0x51, 0x7f, 0x22, 0x7d, 0x37, 0xe9, 0xa6, - 0xfb, 0xae, 0xd2, 0x9d, 0x75, 0x80, 0x0e, 0x94, 0x17, 0x81, 0xc4, 0x07, - 0x35, 0x56, 0x33, 0x39, 0x9e, 0x2d, 0x8b, 0xc9, 0xc3, 0x52, 0xa6, 0x50, - 0xd2, 0x08, 0xd3, 0xc8, 0x95, 0x3e, 0x5a, 0x96, 0x4e, 0x23, 0x8b, 0xac, - 0x92, 0x16, 0x85, 0xae, 0x69, 0x0e, 0xac, 0x69, 0x2f, 0x32, 0x45, 0xd9, - 0x83, 0x6a, 0x31, 0x2f, 0x6a, 0xf8, 0xa1, 0x5d, 0x35, 0x1a, 0xc7, 0x4a, - 0x78, 0xe8, 0xdc, 0x17, 0x6a, 0x4c, 0x17, 0xd5, 0xb1, 0xb8, 0x56, 0x28, - 0xcb, 0x0b, 0x2f, 0xb1, 0x78, 0x8b, 0x72, 0x96, 0x62, 0x02, 0x90, 0xa7, - 0x5b, 0x01, 0x9d, 0x37, 0x12, 0x83, 0xd8, 0x4c, 0xc8, 0x81, 0x0f, 0xe5, - 0x1d, 0xcb, 0xc6, 0x8c, 0xbb, 0x26, 0x9f, 0xc1, 0x6d, 0x30, 0x33, 0xb6, - 0x24, 0x7d, 0x0b, 0x40, 0xe9, 0x60, 0xee, 0x0c, 0x9d, 0xa7, 0x5b, 0xce, - 0xc1, 0x23, 0xaf, 0x17, 0x4e, 0xf7, 0xe5, 0x27, 0x13, 0xd1, 0x05, 0xd2, - 0x4b, 0x4c, 0xa5, 0x03, 0xaa, 0x32, 0x2a, 0x4b, 0x20, 0x07, 0x92, 0x9d, - 0x83, 0x98, 0x15, 0x95, 0x2c, 0xbf, 0xae, 0xad, 0x01, 0xb4, 0x26, 0x2e, - 0xb9, 0x26, 0xd7, 0x21, 0x3a, 0x95, 0xed, 0x9e, 0x12, 0xf3, 0xa7, 0xfe, - 0x70, 0x78, 0xdb, 0x0a, 0x80, 0x93, 0x1b, 0xd6, 0x01, 0xea, 0xc9, 0x73, - 0x22, 0x69, 0x0b, 0xb2, 0x4d, 0xb1, 0x2a, 0x16, 0x49, 0x9c, 0xf0, 0x20, - 0x66, 0xe2, 0xb8, 0x45, 0x6d, 0xaa, 0x2e, 0x3a, 0xf3, 0xbd, 0xe7, 0x74, - 0x95, 0x15, 0xae, 0x54, 0x0c, 0x4f, 0x03, 0xa1, 0xca, 0x95, 0x2b, 0x24, - 0xbe, 0x45, 0xb2, 0xa2, 0x03, 0x73, 0x98, 0x25, 0x8a, 0xb9, 0x91, 0x92, - 0xac, 0x75, 0x5c, 0x3e, 0xae, 0x32, 0x13, 0x59, 0x52, 0x77, 0xad, 0x99, - 0xe9, 0x34, 0x74, 0xf0, 0x25, 0xc3, 0xbf, 0x3a, 0xf4, 0x0f, 0x67, 0x85, - 0x0f, 0xa1, 0x5f, 0xd7, 0x45, 0xf9, 0xc0, 0x2d, 0x1f, 0x9e, 0xc0, 0x06, - 0xf9, 0xb8, 0x7f, 0x26, 0xdd, 0x5c, 0x0e, 0x21, 0xac, 0xd2, 0x4b, 0xf3, - 0x76, 0xaa, 0xc0, 0x5d, 0x5b, 0x3a, 0x00, 0x49, 0xb7, 0x9c, 0x9b, 0x28, - 0xef, 0xad, 0x97, 0xd0, 0x18, 0x7d, 0xd9, 0x18, 0xbe, 0x77, 0xc2, 0xde, - 0x2f, 0xfb, 0xf8, 0x65, 0xf1, 0x05, 0xa8, 0x2b, 0x94, 0xcd, 0xb7, 0x2c, - 0x4e, 0xe0, 0x9a, 0x2e, 0x00, 0x81, 0xa4, 0x25, 0x2e, 0xc5, 0xc4, 0xa2, - 0x1a, 0x19, 0x0e, 0x80, 0xa4, 0x19, 0x2b, 0x47, 0x81, 0x7f, 0x9d, 0x38, - 0x99, 0x4e, 0x0c, 0x3c, 0xcf, 0xf1, 0xf7, 0x76, 0x36, 0x29, 0x37, 0x2b, - 0x4b, 0x6a, 0x6d, 0x54, 0xf3, 0x80, 0xf1, 0xeb, 0x9e, 0xd2, 0xec, 0xc8, - 0x54, 0xc3, 0xcb, 0x4f, 0xc5, 0x79, 0xb3, 0x40, 0xc5, 0x57, 0x51, 0x9a, - 0xa5, 0x15, 0x6c, 0xad, 0x56, 0xc1, 0xf6, 0xe2, 0x0a, 0xb6, 0x6e, 0x52, - 0xc1, 0x56, 0x51, 0x05, 0x5b, 0xf7, 0x51, 0xc1, 0xf6, 0xad, 0x2b, 0xd8, - 0xbe, 0x49, 0x05, 0xdb, 0x45, 0x15, 0x6c, 0xdf, 0xb2, 0x82, 0x9c, 0xb7, - 0xa2, 0xa9, 0x58, 0xd6, 0xd7, 0xf7, 0x56, 0xe9, 0xd1, 0x3a, 0x5e, 0x11, - 0xf7, 0xec, 0xb8, 0xd0, 0xb5, 0xa6, 0x00, 0xb5, 0xe5, 0xab, 0x30, 0x56, - 0xf2, 0x59, 0x96, 0xb5, 0xa0, 0x09, 0xd0, 0x96, 0x0e, 0xae, 0x6d, 0xf9, - 0xad, 0xeb, 0x35, 0xe3, 0x3a, 0xd2, 0x1c, 0x6e, 0xa0, 0x2d, 0x07, 0xf0, - 0xd2, 0x69, 0x9c, 0x0c, 0x68, 0x88, 0xe2, 0xc4, 0xeb, 0x4a, 0xca, 0x50, - 0xa5, 0x0c, 0x94, 0xcb, 0x38, 0x5b, 0x09, 0x95, 0x60, 0x34, 0xd0, 0xa1, - 0x6b, 0xeb, 0x2c, 0x8b, 0x7f, 0xb1, 0xdd, 0x19, 0xca, 0x23, 0x74, 0xac, - 0xaf, 0xb4, 0xe5, 0x08, 0x51, 0x89, 0x16, 0xf8, 0x31, 0x59, 0xc3, 0xb7, - 0x7d, 0xce, 0xd9, 0x31, 0xee, 0xd2, 0xe6, 0x04, 0x32, 0x0a, 0x04, 0x0d, - 0x8e, 0xfc, 0x75, 0x4b, 0xa1, 0x30, 0x8e, 0x7b, 0x13, 0x0b, 0x63, 0xdf, - 0xa0, 0x60, 0x7a, 0xe0, 0xae, 0x74, 0x40, 0x9f, 0xb7, 0x14, 0x0b, 0xa1, - 0xb8, 0x37, 0xa9, 0x10, 0xf2, 0x0d, 0x0a, 0x85, 0x56, 0x14, 0x41, 0x8f, - 0xbe, 0x6e, 0x2b, 0x16, 0xc2, 0x71, 0x7f, 0x72, 0x21, 0xec, 0x9b, 0x14, - 0x8c, 0x8c, 0x82, 0xc6, 0x96, 0x51, 0x87, 0xba, 0xf6, 0xd4, 0xcd, 0x30, - 0x6d, 0xf9, 0xbd, 0xbf, 0x96, 0x8f, 0x6e, 0xe9, 0x0b, 0xca, 0x20, 0xf0, - 0x1e, 0xa6, 0xfa, 0xf0, 0x73, 0x06, 0x22, 0x24, 0xa7, 0x8b, 0xdc, 0xd0, - 0x5b, 0x8a, 0x5f, 0x32, 0x7c, 0x6f, 0xf2, 0x97, 0xe8, 0x37, 0xd8, 0x00, - 0x1c, 0x48, 0xbe, 0x5b, 0xf9, 0xd3, 0x3c, 0x67, 0x22, 0x82, 0x3b, 0x10, - 0x36, 0x98, 0xbb, 0xc7, 0x01, 0x03, 0xd8, 0x6f, 0x3f, 0x64, 0x48, 0x4c, - 0x62, 0xc4, 0x57, 0x43, 0x97, 0x56, 0xf3, 0xff, 0x29, 0xa2, 0xb0, 0x7f, - 0x6d, 0x9d, 0xd6, 0x9b, 0xc8, 0xac, 0xea, 0xec, 0xb4, 0x54, 0xdd, 0xd9, - 0xa5, 0x3b, 0x11, 0xa3, 0xd7, 0x3d, 0x77, 0x19, 0x8f, 0x88, 0xcb, 0xc6, - 0xa0, 0x88, 0xca, 0xae, 0x40, 0x98, 0x89, 0xcb, 0x32, 0x09, 0x4a, 0x90, - 0x50, 0x2c, 0x9c, 0xd4, 0x52, 0x7e, 0x4c, 0x7c, 0xf1, 0xca, 0x60, 0x51, - 0x08, 0x5b, 0x85, 0xf1, 0x9f, 0x60, 0x85, 0xc7, 0x22, 0x67, 0x48, 0x22, - 0x5b, 0x81, 0xbd, 0xa7, 0x5b, 0x2b, 0xf4, 0x8f, 0xad, 0xdb, 0xfb, 0x56, - 0x32, 0x52, 0x87, 0xdb, 0xbf, 0x11, 0x39, 0xcc, 0xab, 0x85, 0x5a, 0x29, - 0xb8, 0xa5, 0x76, 0xb0, 0xc1, 0x0e, 0x15, 0x91, 0xeb, 0x1b, 0x72, 0x1e, - 0xbe, 0x91, 0xa0, 0xab, 0x35, 0xa4, 0xe9, 0x95, 0x0a, 0x63, 0x29, 0x4d, - 0xf0, 0x76, 0x2d, 0xc7, 0x2b, 0x9a, 0x14, 0xb8, 0xbd, 0xbf, 0xa6, 0x58, - 0x67, 0x7e, 0xa0, 0xd3, 0x6e, 0x39, 0xa1, 0x4f, 0x2e, 0x4d, 0xe0, 0xd5, - 0x10, 0x0b, 0xfb, 0xaf, 0x24, 0x57, 0x44, 0x34, 0xc6, 0xa0, 0xaf, 0x13, - 0x5d, 0x4f, 0x79, 0x24, 0x27, 0xd7, 0x46, 0x23, 0x57, 0x34, 0x28, 0x8b, - 0x8c, 0xc8, 0x76, 0xc2, 0x30, 0xbc, 0x86, 0x89, 0x9d, 0x5d, 0xab, 0x54, - 0x49, 0x8b, 0xe0, 0xaa, 0x12, 0xc5, 0x06, 0xe1, 0xda, 0xde, 0xbc, 0x6a, - 0xb4, 0x33, 0xcf, 0xb0, 0xd9, 0x47, 0x70, 0x34, 0x1c, 0x92, 0x51, 0x32, - 0x3c, 0x2f, 0x42, 0x96, 0x9d, 0xb2, 0x25, 0xee, 0x8c, 0xbd, 0xbe, 0x8f, - 0xf2, 0xd8, 0xa7, 0xd9, 0x91, 0x7b, 0xfa, 0x4a, 0xeb, 0x76, 0x3c, 0xbd, - 0x33, 0xb1, 0xa4, 0x95, 0xa2, 0x96, 0xab, 0xc5, 0x4a, 0x38, 0x69, 0x9e, - 0xad, 0x51, 0xe4, 0x30, 0xf4, 0x46, 0x72, 0x37, 0x53, 0x7a, 0xb2, 0x6b, - 0xf1, 0xd2, 0xcc, 0x0a, 0x93, 0x74, 0xfa, 0xbb, 0x7e, 0xa4, 0xbf, 0x49, - 0x57, 0xbd, 0xbe, 0x4d, 0xa5, 0xaa, 0xbc, 0x47, 0xa4, 0x42, 0x04, 0xf7, - 0xdc, 0x9c, 0x89, 0xf2, 0x6a, 0xc7, 0x0b, 0xc5, 0x37, 0x79, 0x53, 0x47, - 0xe2, 0x55, 0x1c, 0x78, 0x04, 0x2a, 0x8e, 0xab, 0xc8, 0x5a, 0xdd, 0x83, - 0x1a, 0x4c, 0xb9, 0xba, 0xc4, 0xcb, 0xb5, 0xf1, 0x03, 0xd3, 0xf8, 0xa6, - 0xe0, 0x1d, 0x36, 0x37, 0x0b, 0x65, 0x65, 0xa9, 0xc8, 0x45, 0xb8, 0xfb, - 0xb0, 0xe9, 0x0b, 0x15, 0x65, 0x25, 0xe7, 0xe6, 0xa7, 0x7e, 0x18, 0xd1, - 0x42, 0x8a, 0x54, 0xa0, 0x95, 0x1a, 0xc4, 0x0c, 0x88, 0x63, 0x59, 0xf8, - 0x7e, 0xc7, 0xc3, 0xb5, 0xeb, 0x6d, 0xd1, 0x75, 0x1f, 0x2b, 0x55, 0xfe, - 0xcd, 0x2f, 0x3e, 0x7c, 0x20, 0x01, 0xdc, 0xa8, 0xf2, 0x93, 0x3f, 0x46, - 0xd1, 0x29, 0x24, 0x70, 0x4b, 0x3f, 0xee, 0x1e, 0x6a, 0xbf, 0x5a, 0xcb, - 0x53, 0xe5, 0xdf, 0xfb, 0xc1, 0x3a, 0x95, 0x97, 0x13, 0x94, 0xcc, 0xa4, - 0x62, 0x77, 0x67, 0xa7, 0xbd, 0x93, 0x10, 0x09, 0xce, 0x31, 0xfd, 0xf7, - 0x89, 0x64, 0x77, 0x65, 0x91, 0xfc, 0x32, 0xbc, 0xd6, 0x9a, 0x2e, 0xd1, - 0x07, 0xda, 0x94, 0xf3, 0x3f, 0x5c, 0xf9, 0xf7, 0x28, 0xbb, 0x46, 0xe5, - 0xa7, 0x00, 0x9f, 0xa3, 0x26, 0x09, 0x01, 0x50, 0xd2, 0x7f, 0x44, 0x00, - 0xab, 0x84, 0xbe, 0x6f, 0xe9, 0xfb, 0xb5, 0xd3, 0x93, 0xc2, 0xe7, 0xde, - 0x8d, 0xfb, 0x4e, 0x53, 0xf5, 0x9d, 0x27, 0xa5, 0xf4, 0x44, 0xb1, 0xef, - 0xdd, 0xb2, 0xeb, 0xec, 0xdc, 0x48, 0x76, 0xab, 0x56, 0xfa, 0xb9, 0x3f, - 0xbb, 0x79, 0x9d, 0x33, 0xf6, 0xc2, 0xd4, 0xbb, 0xef, 0xcf, 0xfe, 0xbb, - 0xab, 0x7d, 0xfc, 0xf2, 0xd9, 0xbb, 0xd5, 0x7d, 0x7c, 0xf9, 0x13, 0x3b, - 0xf7, 0xfc, 0x0d, 0x7a, 0xf9, 0xed, 0x94, 0x47, 0xe8, 0xdd, 0xb6, 0x8d, - 0x9a, 0xbb, 0xc9, 0x06, 0xc2, 0xf1, 0xd2, 0xff, 0x44, 0xf3, 0x6c, 0xb8, - 0x47, 0xbf, 0x7b, 0xff, 0xe1, 0xf8, 0xe8, 0x57, 0xeb, 0xb6, 0x33, 0xde, - 0xb6, 0x86, 0x73, 0xb3, 0xff, 0xa1, 0x96, 0x06, 0xcb, 0x2f, 0x0e, 0xbf, - 0x3b, 0xba, 0x01, 0xcf, 0x38, 0x5f, 0xb6, 0xc9, 0x49, 0x68, 0x86, 0xe9, - 0x97, 0x87, 0x6f, 0xde, 0x1c, 0xde, 0x80, 0xeb, 0x91, 0x3d, 0x99, 0xd8, - 0xff, 0x39, 0xb6, 0x4f, 0x5e, 0xfd, 0xf6, 0x26, 0xb2, 0xc6, 0x34, 0xe0, - 0xae, 0x65, 0xbd, 0x81, 0xae, 0xb1, 0xab, 0xea, 0x3e, 0x3a, 0x89, 0xec, - 0xdb, 0x3b, 0x89, 0x3f, 0xfa, 0x43, 0xf8, 0x05, 0x41, 0x74, 0x7e, 0x87, - 0xa8, 0x8e, 0x1b, 0x87, 0x91, 0x7d, 0x5b, 0x4f, 0xf1, 0xc9, 0x8d, 0x0c, - 0xcb, 0x8a, 0xd5, 0xf6, 0xa7, 0xf7, 0x53, 0x6b, 0x7f, 0xfa, 0x9f, 0xa8, - 0xf4, 0x7d, 0xab, 0xcc, 0x62, 0x1f, 0x53, 0x1f, 0x92, 0x91, 0x27, 0x64, - 0x94, 0xcb, 0x69, 0xb6, 0xe5, 0x28, 0x87, 0x73, 0xe9, 0x0c, 0x5e, 0xe3, - 0x2e, 0xba, 0x45, 0x9e, 0xb8, 0x5c, 0x61, 0x3f, 0xc6, 0x1b, 0x9b, 0x86, - 0x45, 0x7e, 0x4e, 0x35, 0x9c, 0x8a, 0x07, 0x98, 0x7d, 0x06, 0x13, 0x00, - 0x96, 0xf4, 0x82, 0x8a, 0x3a, 0x97, 0xb5, 0x22, 0x8d, 0x17, 0x98, 0xf5, - 0xaf, 0x44, 0x83, 0xc2, 0x03, 0x37, 0xa4, 0xf1, 0x0c, 0x3b, 0x45, 0x57, - 0xa2, 0x41, 0x27, 0x23, 0x6e, 0x4a, 0x23, 0x5a, 0x4d, 0x54, 0xbd, 0xe8, - 0xa6, 0x92, 0x02, 0x05, 0x6c, 0xad, 0x59, 0x95, 0x08, 0xb4, 0x65, 0x2d, - 0x3a, 0x8c, 0x76, 0xcd, 0xfe, 0x71, 0x57, 0x8a, 0xed, 0xda, 0x5f, 0xc4, - 0x5b, 0x0a, 0x81, 0xaf, 0x61, 0x3c, 0xcc, 0x24, 0x92, 0x8b, 0x7b, 0x28, - 0x7e, 0x17, 0x93, 0x28, 0x7d, 0xb0, 0x42, 0x1d, 0xfb, 0xe5, 0xd7, 0x89, - 0xdc, 0x93, 0xe5, 0x88, 0xa5, 0x15, 0x6f, 0x9a, 0x4c, 0x45, 0xf2, 0x6b, - 0x21, 0xaa, 0xa5, 0x57, 0x26, 0x65, 0x7e, 0x3c, 0x22, 0x26, 0xdf, 0x35, - 0x43, 0xef, 0x7d, 0x4c, 0xbc, 0xdf, 0x2f, 0xf9, 0xae, 0xcc, 0x6b, 0xd6, - 0x61, 0xf9, 0xe5, 0x67, 0xd9, 0xc5, 0x58, 0xa2, 0x8a, 0xb5, 0x58, 0xfe, - 0x3e, 0x51, 0xac, 0xc4, 0xfb, 0x2d, 0x57, 0x5d, 0x0b, 0xc9, 0x40, 0xc8, - 0xf7, 0x47, 0x70, 0xed, 0xe4, 0xcf, 0xb8, 0xa1, 0xe2, 0xd3, 0xec, 0x2c, - 0xe6, 0x05, 0x02, 0x3b, 0x78, 0x6a, 0x67, 0xde, 0xea, 0x2c, 0xdf, 0x31, - 0xbd, 0xf4, 0xc5, 0xd2, 0xa5, 0x04, 0x39, 0x7e, 0x65, 0x19, 0x44, 0x89, - 0xa6, 0xa5, 0x97, 0x82, 0x9f, 0xf6, 0x5c, 0x1b, 0xcf, 0x07, 0xef, 0x03, - 0xff, 0x0f, 0xe4, 0x79, 0x8c, 0x7d, 0x8a, 0xe5, 0xd9, 0x07, 0x38, 0xe4, - 0xff, 0xcf, 0xbf, 0xe1, 0x18, 0x58, 0xf3, 0x89, 0xac, 0x93, 0xb5, 0xce, - 0x9e, 0xe7, 0xc2, 0x26, 0xf4, 0xa7, 0xc2, 0x5b, 0xd0, 0x84, 0xba, 0xd9, - 0x94, 0xa6, 0xdd, 0xbe, 0xdd, 0xe2, 0xb6, 0x72, 0xe2, 0xfd, 0xb1, 0xb9, - 0x96, 0x92, 0xe2, 0x58, 0xb6, 0xbb, 0x1e, 0x77, 0xf9, 0x38, 0xd3, 0xa4, - 0x6b, 0xe5, 0x0c, 0xad, 0x32, 0xf6, 0xcd, 0xe2, 0x15, 0x75, 0xd8, 0x9c, - 0x5b, 0xa7, 0x58, 0xcd, 0xe1, 0x88, 0x5e, 0xea, 0xcd, 0x17, 0x91, 0xbc, - 0x1b, 0x96, 0x1f, 0xbf, 0x39, 0x79, 0x75, 0xf4, 0xb8, 0xf2, 0xa0, 0xdb, - 0xad, 0x35, 0xad, 0x3f, 0xfd, 0xc9, 0x32, 0xb0, 0x38, 0xdf, 0xf7, 0x2b, - 0x84, 0x9d, 0xa1, 0xa5, 0x06, 0xf8, 0x43, 0xe0, 0x0c, 0x50, 0x7a, 0xeb, - 0x71, 0xc5, 0x3a, 0x88, 0xdf, 0x81, 0x60, 0xfe, 0xa8, 0x2a, 0x78, 0x85, - 0x73, 0xdd, 0xf5, 0x47, 0xe5, 0x12, 0xde, 0x74, 0x3c, 0x10, 0x91, 0xdc, - 0x74, 0x5d, 0xd9, 0x4f, 0x03, 0x0e, 0x70, 0x0a, 0x73, 0x42, 0x6c, 0xa0, - 0x41, 0x8f, 0xe4, 0x9b, 0x96, 0x9f, 0x5d, 0xbc, 0x1a, 0x94, 0x73, 0x67, - 0x8d, 0x2a, 0x75, 0xd6, 0xb4, 0xba, 0x3e, 0x1b, 0xdd, 0xb5, 0x1e, 0x73, - 0x3f, 0x79, 0xbc, 0x2a, 0xc2, 0x78, 0x1d, 0xad, 0x08, 0xd5, 0x18, 0xb5, - 0x49, 0x62, 0x4a, 0x1d, 0x94, 0x52, 0xa2, 0xcc, 0x0b, 0x97, 0x4f, 0xd9, - 0xe9, 0x85, 0x30, 0xd4, 0x71, 0xc8, 0x6f, 0x98, 0x47, 0xd5, 0x01, 0xfa, - 0x23, 0xdc, 0x5f, 0x63, 0x61, 0x5b, 0x85, 0x05, 0xaf, 0x02, 0xa7, 0xa4, - 0xe7, 0x9e, 0x3e, 0x3a, 0xc0, 0xe7, 0x59, 0x19, 0xe0, 0xb9, 0x3f, 0xbd, - 0xa0, 0xcb, 0x96, 0xe2, 0x1c, 0xc1, 0x07, 0xa5, 0x4b, 0xa4, 0x6a, 0xe5, - 0x23, 0x6f, 0xe4, 0x3a, 0xe1, 0xb8, 0x62, 0x7d, 0x91, 0xa2, 0xaf, 0x66, - 0x20, 0x9d, 0xa8, 0xce, 0x48, 0x5e, 0x0d, 0x2d, 0x3b, 0x89, 0xda, 0x72, - 0x42, 0xf8, 0x61, 0x61, 0x48, 0x77, 0x23, 0x51, 0x78, 0x2a, 0xac, 0x12, - 0xd2, 0x0b, 0x7e, 0xc1, 0x0e, 0xb1, 0x68, 0xcf, 0x5c, 0x7e, 0x15, 0xb5, - 0xc2, 0x0f, 0x24, 0x7c, 0x36, 0x10, 0xae, 0x9a, 0xe5, 0xea, 0x9a, 0x74, - 0x75, 0x73, 0x0a, 0xaf, 0x93, 0x68, 0x59, 0x06, 0x38, 0xa5, 0x98, 0x37, - 0xee, 0x60, 0x50, 0xe5, 0x4b, 0x55, 0x93, 0x4d, 0xdb, 0xdc, 0x29, 0xcb, - 0xf4, 0xdd, 0x64, 0xae, 0x2a, 0x67, 0x32, 0x7f, 0xf9, 0xca, 0xfa, 0x55, - 0xbb, 0x8c, 0xf8, 0xc2, 0xc7, 0x4a, 0x12, 0x2e, 0xde, 0x16, 0x0f, 0xe0, - 0xf8, 0x77, 0x12, 0x00, 0xcd, 0x96, 0x84, 0x91, 0x8f, 0x79, 0xb0, 0x78, - 0xaf, 0x39, 0x60, 0x8e, 0xf5, 0xef, 0x02, 0x42, 0x47, 0x41, 0xe0, 0x07, - 0x4d, 0x00, 0x21, 0xc0, 0xe3, 0x0e, 0xe0, 0x58, 0x45, 0x2a, 0x87, 0xc5, - 0x64, 0xd8, 0xad, 0x5b, 0xd0, 0x79, 0x1c, 0xc7, 0x5c, 0x84, 0xa2, 0x05, - 0x14, 0x10, 0x01, 0x56, 0xc9, 0xeb, 0xd6, 0x7b, 0x97, 0xce, 0x28, 0xe3, - 0x54, 0xa5, 0x6c, 0xd1, 0xe3, 0xa3, 0xe7, 0xef, 0xde, 0xbe, 0x3d, 0x7a, - 0xfe, 0x41, 0xbd, 0x3f, 0x9a, 0x10, 0x47, 0x01, 0xda, 0x7e, 0x04, 0x85, - 0xac, 0x27, 0x11, 0xba, 0xb8, 0xd5, 0xea, 0x0d, 0x8d, 0x80, 0x40, 0xa6, - 0x6f, 0xb8, 0x9a, 0xd0, 0xb3, 0x55, 0xaf, 0x03, 0xd0, 0xda, 0xda, 0xc2, - 0x6b, 0x11, 0x9d, 0x30, 0x6e, 0xaa, 0x1a, 0x8e, 0x55, 0x11, 0x0c, 0x92, - 0xc0, 0xb8, 0x51, 0x0f, 0x5c, 0xe0, 0xa5, 0xec, 0x08, 0x67, 0x30, 0x5e, - 0x24, 0x5e, 0x88, 0xa8, 0x92, 0x26, 0xa6, 0x46, 0x86, 0x24, 0x3d, 0x55, - 0xf0, 0xde, 0x48, 0x7e, 0x14, 0xbd, 0x10, 0x1d, 0x97, 0x24, 0x2e, 0xc5, - 0xc7, 0xaa, 0x2a, 0x13, 0x45, 0xa4, 0xc8, 0xa6, 0x8b, 0x1c, 0xe3, 0x70, - 0xe2, 0x05, 0x0a, 0xf0, 0x77, 0x11, 0x00, 0xb7, 0x00, 0x00, 0xf8, 0x9b, - 0x53, 0x80, 0xd4, 0xdc, 0xc9, 0x23, 0x65, 0x88, 0x57, 0x49, 0x71, 0xbb, - 0x18, 0xd9, 0xdf, 0x43, 0x0d, 0x45, 0x92, 0x93, 0x24, 0x9b, 0xca, 0x90, - 0x21, 0xeb, 0xa3, 0xfc, 0x95, 0xcc, 0x9c, 0x98, 0x43, 0x90, 0x00, 0x78, - 0x35, 0x24, 0xab, 0x81, 0x86, 0x00, 0xab, 0xc4, 0x98, 0xda, 0x79, 0x81, - 0x17, 0x7a, 0x63, 0x80, 0x43, 0x0a, 0xcb, 0xcb, 0x8b, 0x30, 0x4f, 0xf1, - 0xbd, 0x51, 0xac, 0x6d, 0x67, 0x42, 0x4c, 0xe9, 0xb2, 0x85, 0x09, 0x8c, - 0x34, 0xca, 0xd9, 0x91, 0x95, 0xea, 0x6b, 0x03, 0x5f, 0x84, 0xde, 0xe3, - 0x88, 0x8c, 0xc2, 0x19, 0xc0, 0xf2, 0x2f, 0x12, 0x4f, 0xa9, 0x2d, 0xa6, - 0x1d, 0xb3, 0x29, 0x16, 0x9d, 0xfd, 0xda, 0x80, 0xac, 0x8d, 0xb2, 0xc6, - 0x78, 0x4f, 0xe9, 0x19, 0x2e, 0x7e, 0x18, 0x07, 0xe0, 0xa3, 0x1a, 0xbf, - 0x97, 0x1c, 0x12, 0x3f, 0x1a, 0x8c, 0x44, 0xaa, 0x51, 0xd8, 0x7d, 0xa5, - 0x26, 0xa6, 0xef, 0x74, 0xb7, 0x1c, 0x50, 0x43, 0xa6, 0xfb, 0x2a, 0x6f, - 0x56, 0x45, 0xf2, 0x4b, 0xfa, 0x4e, 0x66, 0xd0, 0x7e, 0x4d, 0xa4, 0x3f, - 0xc3, 0x57, 0x32, 0x99, 0xa7, 0x42, 0x24, 0x49, 0x7c, 0x27, 0x33, 0xa8, - 0x59, 0x4e, 0x81, 0x0c, 0x2c, 0x13, 0x71, 0xec, 0x00, 0x44, 0x42, 0xe6, - 0x7e, 0x0a, 0x95, 0x4d, 0x12, 0xf2, 0xe8, 0x7e, 0x8a, 0x6c, 0x71, 0x17, - 0xc2, 0x5e, 0x54, 0x96, 0xf2, 0x64, 0xc1, 0x46, 0xb2, 0x58, 0x1c, 0x15, - 0x47, 0xb9, 0x13, 0xfe, 0x6d, 0xa9, 0xad, 0x61, 0x49, 0x28, 0x1d, 0x4e, - 0x00, 0xd0, 0x0b, 0x7a, 0x63, 0x97, 0xf5, 0xfa, 0xe8, 0x3b, 0x5c, 0x42, - 0xa4, 0x4a, 0x8b, 0xc1, 0xc2, 0x32, 0xfe, 0x94, 0x7a, 0xa7, 0xbd, 0x5a, - 0x09, 0xbd, 0xdb, 0x87, 0xc5, 0xa3, 0x3b, 0x95, 0xa5, 0xd3, 0xf2, 0x5c, - 0xeb, 0xe1, 0xcb, 0xb0, 0x2e, 0x53, 0xf2, 0xc0, 0x66, 0xc1, 0x94, 0x80, - 0xd5, 0xcf, 0x3c, 0x94, 0x59, 0x59, 0x04, 0x14, 0xfd, 0xb4, 0x4e, 0x44, - 0x80, 0x41, 0xac, 0x18, 0xee, 0xbd, 0xcf, 0x02, 0xa1, 0xb1, 0x8d, 0x7f, - 0x66, 0xa1, 0xcc, 0xba, 0x94, 0xc6, 0x46, 0xbf, 0x73, 0x84, 0xd3, 0xab, - 0x38, 0x1a, 0xf4, 0xbd, 0x5a, 0xa2, 0xc9, 0x80, 0x9a, 0x25, 0x0c, 0x00, - 0xbe, 0xe5, 0xa6, 0x25, 0xa9, 0x9e, 0xa8, 0xdd, 0x7c, 0x69, 0x68, 0x13, - 0xfb, 0x27, 0x09, 0x45, 0x18, 0xf7, 0xb9, 0x15, 0x38, 0x25, 0x05, 0x69, - 0xc2, 0xe5, 0x00, 0xc4, 0x97, 0xf5, 0x8e, 0xe6, 0x27, 0x29, 0x90, 0x38, - 0x44, 0x1d, 0xa3, 0x7a, 0xf9, 0xfe, 0xd5, 0x3b, 0x8b, 0x12, 0xf2, 0x60, - 0xef, 0xa6, 0xec, 0x4a, 0xc4, 0xa0, 0xea, 0x39, 0x03, 0x69, 0x82, 0xb7, - 0x44, 0x55, 0x5e, 0x62, 0x98, 0x05, 0x31, 0xc1, 0x52, 0x52, 0x3d, 0xd8, - 0x2c, 0xeb, 0x84, 0xb6, 0x40, 0xe6, 0xc0, 0x4c, 0x78, 0x92, 0xba, 0x22, - 0x85, 0x1b, 0xd1, 0x8d, 0x03, 0xf5, 0xca, 0xd0, 0x2c, 0xb4, 0x89, 0x0a, - 0x02, 0x58, 0x89, 0xce, 0x3a, 0x71, 0xbe, 0x66, 0xa9, 0x9b, 0x50, 0x87, - 0xd1, 0x30, 0x3e, 0x18, 0x3f, 0x84, 0x1b, 0x2e, 0xcd, 0x44, 0xba, 0x4e, - 0x71, 0xc0, 0x02, 0xf0, 0x78, 0x05, 0x70, 0xa6, 0xa1, 0xe3, 0x50, 0x03, - 0xe5, 0x8a, 0xf3, 0x74, 0x13, 0xc4, 0x31, 0x02, 0x32, 0x19, 0xe6, 0xa2, - 0x87, 0x3c, 0x48, 0xe4, 0x11, 0x04, 0x8f, 0xc5, 0x19, 0xe2, 0x66, 0x7e, - 0x4e, 0xec, 0xea, 0x7e, 0x26, 0x41, 0x53, 0x90, 0xc9, 0x0d, 0x28, 0x31, - 0xa8, 0x2c, 0x6f, 0x4d, 0x39, 0x35, 0x05, 0x2e, 0xb7, 0x40, 0x90, 0x41, - 0xa4, 0x1f, 0x19, 0x63, 0x26, 0x98, 0xda, 0x47, 0xfa, 0x4e, 0x66, 0xe4, - 0xf6, 0xeb, 0x50, 0x9d, 0xe3, 0x34, 0x4b, 0x27, 0x66, 0x7c, 0x23, 0x0a, - 0xb8, 0x91, 0x53, 0x45, 0xbd, 0x0a, 0x2d, 0xf7, 0x85, 0xcc, 0x37, 0x3d, - 0x27, 0xc1, 0xcc, 0x44, 0x1d, 0x50, 0x87, 0xf1, 0x81, 0xc2, 0xc4, 0x80, - 0x61, 0x9d, 0x10, 0x88, 0xc5, 0x30, 0x56, 0xf9, 0x77, 0xa5, 0xfd, 0xdf, - 0x95, 0x50, 0x65, 0x9c, 0x8a, 0xa6, 0x71, 0x30, 0xe5, 0xaf, 0x25, 0xe7, - 0x97, 0xe4, 0x02, 0x9d, 0x50, 0x39, 0x9d, 0x90, 0x01, 0x64, 0xdb, 0xaf, - 0xf3, 0x64, 0x42, 0x16, 0x22, 0x3d, 0x94, 0x53, 0x52, 0xc2, 0x27, 0x59, - 0x34, 0x84, 0x1b, 0x14, 0x53, 0x39, 0x15, 0xfc, 0xa9, 0xcf, 0x46, 0x2a, - 0x39, 0x31, 0x2c, 0x49, 0xa0, 0x2b, 0x05, 0xec, 0xb9, 0x0b, 0x5d, 0xdb, - 0xb7, 0x02, 0x1d, 0x17, 0x09, 0x83, 0xf0, 0x7e, 0xbd, 0x5b, 0x74, 0xd6, - 0x9e, 0xef, 0x61, 0x1a, 0xb5, 0xc4, 0xbb, 0xf5, 0x1c, 0x58, 0xef, 0x18, - 0x70, 0x91, 0x7f, 0xfb, 0x2b, 0x00, 0xd0, 0xa8, 0xef, 0x4f, 0x01, 0x3f, - 0x9b, 0x2f, 0xf3, 0x72, 0x7f, 0x0e, 0xcd, 0x89, 0x91, 0x3a, 0x84, 0xd4, - 0x82, 0x4f, 0x91, 0xf4, 0x73, 0x97, 0x7b, 0xb8, 0x67, 0x02, 0xd6, 0x72, - 0x24, 0x20, 0xe7, 0x1e, 0x7e, 0x0d, 0xea, 0xd6, 0x4b, 0xd1, 0x0b, 0x66, - 0xce, 0x99, 0x05, 0xb3, 0x92, 0x61, 0xc3, 0x3a, 0xf3, 0xfc, 0xa9, 0xe5, - 0x4f, 0xe2, 0x67, 0x68, 0x22, 0x97, 0x0b, 0xc4, 0x62, 0xaf, 0x97, 0xbf, - 0xd1, 0x1c, 0x03, 0x71, 0x1f, 0xde, 0x59, 0xc6, 0xe5, 0x7d, 0x45, 0x57, - 0x01, 0xba, 0x2e, 0x9e, 0x84, 0x77, 0xaf, 0x34, 0xd5, 0x48, 0x9c, 0x1c, - 0x93, 0x43, 0xd3, 0x02, 0x4b, 0x3c, 0xde, 0x9f, 0xbb, 0xb6, 0x1d, 0x2c, - 0x71, 0x78, 0x5f, 0x50, 0xcc, 0xba, 0xe7, 0xfc, 0x41, 0x72, 0x8f, 0x38, - 0xa1, 0xa7, 0xbd, 0x5e, 0xa1, 0x9d, 0x5e, 0xd5, 0x54, 0xba, 0x15, 0xee, - 0xa1, 0x86, 0x22, 0xc1, 0xcc, 0x02, 0x97, 0x17, 0xb5, 0x08, 0xfb, 0xe3, - 0xd9, 0x7c, 0xa9, 0xdf, 0x7b, 0x88, 0x4b, 0xbd, 0x66, 0xe8, 0x01, 0xa8, - 0x11, 0x42, 0x22, 0xfd, 0x31, 0xc8, 0x09, 0x11, 0xe2, 0xfa, 0x9c, 0x11, - 0xb1, 0x86, 0x2a, 0x40, 0x6f, 0x79, 0x76, 0x5b, 0x4f, 0xbb, 0xb6, 0x73, - 0x11, 0x9c, 0x45, 0xac, 0xd5, 0x85, 0x8e, 0xad, 0xd1, 0x51, 0xba, 0x97, - 0x6c, 0x68, 0x47, 0xa1, 0x2f, 0xb0, 0x01, 0xf0, 0x0f, 0x67, 0xc6, 0xaf, - 0xfd, 0xea, 0xdb, 0xa0, 0x2d, 0x1d, 0x5b, 0xf8, 0x02, 0xda, 0xb5, 0xcd, - 0xbb, 0xb4, 0xdc, 0x24, 0x62, 0x56, 0xe4, 0xd2, 0xfa, 0xfe, 0x02, 0x9f, - 0xd6, 0x5f, 0xe0, 0xd3, 0xda, 0xb3, 0x79, 0xa1, 0x53, 0xeb, 0x44, 0x8b, - 0x5d, 0xda, 0x97, 0x40, 0x4a, 0xee, 0xe8, 0x84, 0xdc, 0xd1, 0xb1, 0x3f, - 0x02, 0xef, 0x83, 0xc5, 0x7e, 0x6c, 0xb6, 0x80, 0x6b, 0x73, 0x81, 0xeb, - 0xfd, 0x57, 0xe8, 0xcb, 0x35, 0x2e, 0xec, 0x11, 0x6d, 0x44, 0x14, 0xe4, - 0x0b, 0xb1, 0xd2, 0x8d, 0x67, 0xce, 0xc0, 0x19, 0x09, 0x5d, 0x48, 0xd7, - 0x38, 0xef, 0xc5, 0xda, 0xd1, 0xca, 0xc5, 0x8a, 0x5d, 0xd9, 0xc9, 0xea, - 0xae, 0x2c, 0xd5, 0xe2, 0x83, 0x6d, 0xbb, 0x9b, 0xf4, 0x64, 0x85, 0xb7, - 0xaa, 0x23, 0x3b, 0x92, 0x4a, 0x09, 0x39, 0x7a, 0xb6, 0x3d, 0x59, 0xc1, - 0x9d, 0x9d, 0xdb, 0xe8, 0x12, 0x73, 0xff, 0x2e, 0x1d, 0x5a, 0xb4, 0x03, - 0x2b, 0xc7, 0x6d, 0x1c, 0xd5, 0x15, 0x5c, 0xde, 0xac, 0x2f, 0xeb, 0xe3, - 0x59, 0xfc, 0x3f, 0xb8, 0xb2, 0xa4, 0x61, 0x53, 0x1b, 0xe6, 0xc9, 0xb6, - 0xce, 0xc8, 0x2c, 0x08, 0x6f, 0xa1, 0x2f, 0x7b, 0xe8, 0x8e, 0xc4, 0x04, - 0x9d, 0x71, 0x89, 0x3b, 0x7b, 0x16, 0x2e, 0xf6, 0x67, 0x0f, 0xd1, 0xf6, - 0x22, 0x80, 0x47, 0xbb, 0xd8, 0xa1, 0xfd, 0x39, 0x86, 0x5b, 0xc4, 0xa9, - 0x97, 0x38, 0xb4, 0x2f, 0xc5, 0x19, 0x66, 0xf0, 0xe8, 0x7f, 0x04, 0x7a, - 0xbd, 0x3b, 0x4b, 0xb5, 0x63, 0x6b, 0x67, 0x9d, 0x39, 0xe2, 0xeb, 0x12, - 0x8f, 0xf6, 0x4c, 0xb8, 0x85, 0x1e, 0xad, 0x73, 0xbd, 0x43, 0xfb, 0xee, - 0x0b, 0x6a, 0x85, 0x8e, 0x1b, 0x0a, 0x4e, 0x12, 0xde, 0x12, 0x7f, 0x96, - 0xbe, 0x2c, 0x76, 0x6a, 0xc9, 0x85, 0xb8, 0xd6, 0xa1, 0x45, 0x1d, 0x12, - 0xe3, 0x04, 0x0d, 0x87, 0x33, 0xd7, 0x78, 0xb3, 0x23, 0x81, 0x01, 0x49, - 0x50, 0x14, 0x7b, 0xa9, 0x3b, 0x9b, 0x72, 0x11, 0xfc, 0x29, 0x08, 0xd9, - 0x5e, 0x91, 0x57, 0x9b, 0x81, 0x03, 0x76, 0x32, 0xb6, 0x39, 0xd0, 0xfc, - 0xc0, 0x3d, 0x16, 0x91, 0xc6, 0x9b, 0x1b, 0xab, 0x57, 0x72, 0x6e, 0xa5, - 0xfe, 0x65, 0xdc, 0xdb, 0x81, 0x58, 0xe8, 0xde, 0x7e, 0x27, 0x66, 0x51, - 0xd8, 0xbf, 0xe7, 0xc8, 0x2d, 0xf9, 0x36, 0xb3, 0x6b, 0x7c, 0x5b, 0x44, - 0xe8, 0xd1, 0x8c, 0x5e, 0xb4, 0xc8, 0xab, 0xfd, 0xe8, 0x90, 0x23, 0x6e, - 0xdc, 0xa4, 0x6b, 0xdc, 0x5a, 0x0f, 0x7a, 0xed, 0xb1, 0xd7, 0x30, 0x71, - 0x92, 0x0e, 0x6d, 0xc2, 0xcf, 0xb2, 0x7e, 0x8a, 0xdd, 0xeb, 0x96, 0x08, - 0x97, 0xbb, 0xb8, 0x13, 0xdb, 0xe5, 0xa8, 0xfb, 0x0c, 0xb8, 0xea, 0xd6, - 0x33, 0xe1, 0xcd, 0xa2, 0xaf, 0xc2, 0xfa, 0xf8, 0xea, 0xe8, 0xbb, 0xa3, - 0x63, 0xeb, 0x57, 0x47, 0xc7, 0xcf, 0x5e, 0xbd, 0xfd, 0xee, 0xe8, 0x6d, - 0xd5, 0x9a, 0x4d, 0x08, 0x95, 0xe7, 0xf7, 0xc7, 0x54, 0xe2, 0xeb, 0x8c, - 0x5b, 0xcf, 0x59, 0xea, 0xdd, 0xbe, 0x26, 0x93, 0x85, 0x07, 0xe7, 0xbe, - 0x82, 0xab, 0x4a, 0x75, 0x63, 0x5a, 0x47, 0x8e, 0xd4, 0xcb, 0x19, 0xe9, - 0xe5, 0x7d, 0x11, 0x55, 0x83, 0xb3, 0x99, 0x88, 0x40, 0x5a, 0x2b, 0xc5, - 0x73, 0x5f, 0x88, 0x20, 0x72, 0x46, 0x0b, 0x03, 0xba, 0x0c, 0x31, 0x76, - 0xa1, 0x03, 0x3d, 0xe1, 0x4c, 0xac, 0xd7, 0xec, 0xe2, 0x92, 0x4a, 0x1c, - 0xea, 0xc0, 0x6e, 0x58, 0x23, 0x61, 0x56, 0xd1, 0x91, 0xf0, 0xf2, 0x7d, - 0xd9, 0x14, 0xa6, 0xf1, 0xee, 0xc5, 0x9b, 0x17, 0x49, 0xc6, 0x96, 0x04, - 0x78, 0x67, 0xcb, 0x1c, 0xdd, 0x8f, 0x50, 0x7b, 0x8c, 0x30, 0x58, 0x33, - 0xc2, 0x30, 0x08, 0x85, 0xc0, 0x95, 0xb8, 0x33, 0x9e, 0xe5, 0x82, 0xe7, - 0x2a, 0xf8, 0x42, 0xdc, 0x31, 0x9a, 0xe3, 0x1a, 0x18, 0x74, 0x53, 0x47, - 0x0c, 0x61, 0xaa, 0xe0, 0x2b, 0x0e, 0x49, 0x7f, 0x9f, 0x71, 0x3d, 0x21, - 0x86, 0x33, 0xa1, 0x10, 0xd0, 0xc5, 0x9b, 0x55, 0x7c, 0x85, 0x61, 0xca, - 0x27, 0x56, 0x3d, 0xc1, 0x99, 0xe4, 0xdd, 0x61, 0x6b, 0x38, 0xf3, 0xce, - 0x48, 0x78, 0x0e, 0xa4, 0xaf, 0x51, 0x7a, 0x62, 0x3c, 0x51, 0x28, 0x71, - 0x5d, 0x3c, 0x7e, 0xd9, 0x67, 0xd1, 0x0c, 0x7a, 0x83, 0x5f, 0xcf, 0x94, - 0x8f, 0x3c, 0x47, 0xde, 0xd7, 0xfa, 0xb3, 0x7a, 0x3e, 0xfe, 0x3b, 0x10, - 0x4b, 0x22, 0xc0, 0x2f, 0xec, 0xa0, 0x27, 0x8a, 0xdc, 0xe5, 0xa8, 0xd8, - 0x5b, 0xfe, 0xd7, 0x3f, 0x16, 0x79, 0xcb, 0x85, 0xce, 0xb2, 0x70, 0xfe, - 0xf5, 0x97, 0xc5, 0xee, 0xf2, 0xe1, 0xd9, 0x57, 0x41, 0xbe, 0x46, 0x80, - 0xf0, 0x38, 0xd5, 0xcb, 0x7a, 0xcb, 0xce, 0x8e, 0x07, 0x7a, 0xff, 0xfa, - 0xfb, 0xbf, 0xfe, 0x22, 0x82, 0x45, 0x9e, 0xf3, 0xb2, 0xb2, 0x67, 0x2e, - 0x3d, 0x06, 0x8b, 0x7c, 0x68, 0xe3, 0x43, 0xcc, 0xff, 0xf5, 0xd7, 0x31, - 0x24, 0xb8, 0xc8, 0x83, 0x8e, 0x1d, 0x68, 0xd8, 0x06, 0xb4, 0x31, 0x43, - 0x63, 0x00, 0x8c, 0xfd, 0xb6, 0x05, 0x2e, 0xb4, 0x88, 0xbe, 0xae, 0x5e, - 0xee, 0x36, 0xe1, 0xe0, 0x69, 0x00, 0x87, 0x13, 0x4b, 0x01, 0xb3, 0x50, - 0x55, 0x64, 0x93, 0x7e, 0xf4, 0xec, 0x3f, 0x16, 0x11, 0x3e, 0xf4, 0xbe, - 0xda, 0x63, 0x57, 0x4b, 0x53, 0xac, 0x14, 0x0e, 0x96, 0x65, 0x96, 0x3b, - 0xc7, 0xc7, 0xc2, 0x41, 0xf7, 0x1e, 0xfa, 0xf0, 0x03, 0x6f, 0xee, 0x6c, - 0x17, 0x47, 0x85, 0x85, 0x97, 0x68, 0xa5, 0x3b, 0x71, 0xab, 0x5f, 0x92, - 0x77, 0x34, 0xaf, 0xaf, 0xe2, 0x58, 0xff, 0x1c, 0x8e, 0x75, 0x7d, 0x25, - 0x9f, 0xfa, 0x25, 0x77, 0xba, 0xa5, 0x6e, 0xf5, 0xab, 0x38, 0x34, 0x4c, - 0x76, 0x23, 0x55, 0xaf, 0xa5, 0x51, 0x62, 0xfb, 0x66, 0x51, 0xe2, 0x9f, - 0x72, 0x28, 0x7a, 0xb4, 0x24, 0x4a, 0xfc, 0x01, 0xeb, 0x2e, 0xcb, 0x7d, - 0x6a, 0xdd, 0x01, 0x2d, 0x06, 0x5d, 0xe6, 0x55, 0x53, 0x95, 0xe6, 0x36, - 0x60, 0x2f, 0xa6, 0x99, 0x7a, 0xe5, 0xbd, 0xea, 0x9f, 0x07, 0xc2, 0x09, - 0x8b, 0x9c, 0xea, 0x63, 0x7b, 0x70, 0x9d, 0x4f, 0xfd, 0xaf, 0x3f, 0xf7, - 0x12, 0x4e, 0x35, 0xfc, 0xfd, 0x6b, 0x7d, 0x6a, 0x8c, 0x07, 0x5f, 0x9c, - 0xa5, 0x4e, 0xf5, 0x5c, 0x38, 0x11, 0x00, 0xae, 0x09, 0x11, 0x6b, 0x97, - 0x6e, 0x99, 0x4b, 0x9d, 0xf1, 0x49, 0x70, 0x1d, 0x83, 0x03, 0x33, 0x13, - 0x14, 0x7a, 0xd5, 0x29, 0x50, 0x60, 0xd7, 0xc0, 0xd1, 0x83, 0x2c, 0x74, - 0xa1, 0xc7, 0x70, 0xa2, 0xc0, 0xd9, 0x6b, 0x48, 0xd3, 0x5d, 0xe4, 0x33, - 0xac, 0x10, 0x50, 0x46, 0xac, 0xe9, 0xa7, 0x3a, 0xa0, 0x2c, 0x5f, 0x5d, - 0x84, 0x9d, 0x23, 0x72, 0x0b, 0x85, 0x39, 0xff, 0x60, 0x36, 0x51, 0xbc, - 0x3c, 0x7e, 0x86, 0x92, 0xf8, 0xd4, 0x68, 0x5f, 0x3e, 0x3b, 0x46, 0x02, - 0x3e, 0x75, 0x02, 0xda, 0x40, 0xb6, 0x44, 0x9c, 0xf0, 0xec, 0x25, 0x12, - 0xf0, 0xa9, 0x13, 0x9e, 0x1d, 0x53, 0x02, 0x3e, 0xe3, 0x84, 0x97, 0x84, - 0x03, 0x9f, 0x3a, 0xe1, 0xa3, 0x24, 0x43, 0x5f, 0x71, 0x92, 0x24, 0x44, - 0x5f, 0x71, 0x92, 0x24, 0x45, 0x5f, 0x71, 0x92, 0x24, 0x46, 0x5f, 0x71, - 0x92, 0x24, 0x87, 0x2f, 0x93, 0x24, 0x09, 0xd2, 0x57, 0x5c, 0x8d, 0x8f, - 0x4c, 0x91, 0xbe, 0x4c, 0x92, 0xac, 0xda, 0xc7, 0x44, 0xdd, 0x3e, 0x32, - 0x45, 0xfa, 0x8a, 0x79, 0xff, 0xc8, 0xe8, 0xe9, 0xcb, 0x24, 0xc9, 0xfa, - 0x7c, 0x4c, 0xa0, 0x3f, 0xfe, 0x48, 0x05, 0xe9, 0xcb, 0x08, 0xee, 0x23, - 0x41, 0xd1, 0x97, 0x11, 0x1d, 0x43, 0xd1, 0x97, 0x11, 0xde, 0x47, 0x29, - 0xbd, 0x8f, 0x09, 0xf1, 0x71, 0x12, 0x7d, 0x19, 0x01, 0x32, 0x2e, 0xfa, - 0x32, 0x14, 0xb9, 0x47, 0xd0, 0x57, 0x8e, 0x62, 0x31, 0x94, 0x69, 0x2e, - 0x4a, 0xa2, 0x2f, 0x43, 0x91, 0x93, 0xf0, 0x55, 0x98, 0x94, 0xd6, 0x19, - 0x73, 0x96, 0xc2, 0x68, 0x4d, 0xa3, 0x83, 0x8f, 0xd2, 0xdb, 0x77, 0xc7, - 0x6f, 0x0e, 0x5f, 0x6b, 0x0c, 0xcd, 0xd6, 0x1e, 0x91, 0x39, 0xc2, 0x1c, - 0xe4, 0xe4, 0x28, 0x8b, 0xc3, 0x9c, 0x6d, 0x50, 0x48, 0x24, 0x16, 0xc2, - 0xf1, 0xf6, 0x28, 0xc6, 0xb0, 0x8b, 0x04, 0xb2, 0xf3, 0xa7, 0xbf, 0x7e, - 0x71, 0x78, 0xf2, 0x41, 0x27, 0xb7, 0x5b, 0x3a, 0x39, 0x99, 0xba, 0xbd, - 0xa7, 0x53, 0xdf, 0x1c, 0x7d, 0xf7, 0xea, 0x97, 0x6f, 0x74, 0xfa, 0xee, - 0xb6, 0x4e, 0x3f, 0x79, 0xfd, 0x2e, 0xae, 0xde, 0x5e, 0x23, 0x46, 0x9d, - 0x4c, 0x7e, 0x62, 0x28, 0x26, 0xd3, 0x9b, 0xcd, 0x98, 0xe4, 0xcb, 0xd7, - 0x87, 0xcf, 0x5f, 0x1d, 0xbe, 0x8e, 0xeb, 0x63, 0x6a, 0x64, 0xce, 0x3d, - 0xc8, 0x2a, 0x99, 0x1a, 0x59, 0x3c, 0x04, 0xc5, 0xa4, 0x91, 0xc6, 0x09, - 0x59, 0x99, 0x98, 0x33, 0x08, 0x69, 0x04, 0x18, 0x97, 0xc0, 0x3c, 0x24, - 0x1b, 0x8b, 0xb6, 0x25, 0x53, 0xb3, 0x55, 0xdd, 0xd6, 0xc9, 0xaf, 0x0f, - 0x8f, 0x5f, 0x1e, 0xc5, 0x02, 0xd0, 0xa9, 0xbf, 0x96, 0xc9, 0x86, 0x73, - 0xda, 0x11, 0xf6, 0x80, 0xb6, 0x54, 0x99, 0x89, 0x2c, 0xdd, 0x25, 0x1b, - 0xef, 0x6e, 0x29, 0xd7, 0x1c, 0x67, 0x28, 0xea, 0x13, 0xac, 0x5b, 0xfd, - 0x21, 0xac, 0x30, 0x60, 0xc1, 0x56, 0xc8, 0x29, 0x82, 0xf9, 0xb4, 0x6b, - 0x70, 0xab, 0x18, 0x49, 0x62, 0xcb, 0xd6, 0x71, 0x02, 0x00, 0xee, 0xdd, - 0x09, 0xe7, 0x77, 0xe1, 0xe0, 0x73, 0xa0, 0xab, 0x5c, 0xb9, 0x2c, 0xd1, - 0x66, 0x0e, 0x9a, 0xef, 0x60, 0xef, 0xd3, 0x3e, 0x95, 0x10, 0x26, 0x37, - 0xaa, 0x7a, 0x95, 0xcb, 0x40, 0x44, 0xb3, 0xc0, 0x2b, 0x8b, 0xee, 0xbb, - 0x1e, 0xd9, 0xb9, 0x3a, 0x66, 0x40, 0x30, 0x72, 0x91, 0x4f, 0x7b, 0x1d, - 0xdf, 0x0d, 0xff, 0xf4, 0xa7, 0xcb, 0xd3, 0xd3, 0x29, 0x3d, 0x9f, 0x9e, - 0x76, 0x3e, 0x7d, 0xbe, 0x22, 0x0b, 0x4a, 0x17, 0xfd, 0x23, 0xba, 0x78, - 0x48, 0xf7, 0x3b, 0x3f, 0x7a, 0x14, 0x63, 0x13, 0xd5, 0xa8, 0x72, 0x29, - 0xea, 0x31, 0x78, 0x37, 0xba, 0xfa, 0xd3, 0x9f, 0xd2, 0xb9, 0x43, 0xdc, - 0x43, 0x49, 0x3c, 0x78, 0xfc, 0x4e, 0x90, 0x4a, 0x54, 0x1f, 0xdb, 0xe1, - 0xbb, 0xb9, 0x07, 0x7a, 0x53, 0x98, 0xf4, 0x8b, 0xb2, 0x57, 0x79, 0xf4, - 0xa8, 0x2c, 0x3e, 0x79, 0x9f, 0xbb, 0x11, 0x3e, 0x2a, 0x57, 0x15, 0x66, - 0xf1, 0x6a, 0x5f, 0x61, 0x41, 0x19, 0xc9, 0x73, 0xfc, 0xec, 0xa3, 0x86, - 0xb4, 0x43, 0xa6, 0x0e, 0x29, 0xa0, 0x92, 0x33, 0x34, 0x77, 0x00, 0xba, - 0x82, 0xc1, 0xaa, 0x51, 0x9d, 0x59, 0x51, 0x6f, 0x7d, 0xc0, 0x3d, 0xd3, - 0xdd, 0xae, 0xf7, 0xad, 0xaa, 0x66, 0x9f, 0xa7, 0x08, 0xa0, 0xd8, 0x29, - 0xfb, 0x49, 0x30, 0xf3, 0xbb, 0x8a, 0xfb, 0x4b, 0x2d, 0xbf, 0x72, 0xc5, - 0x0c, 0x1b, 0xa1, 0x69, 0x89, 0x59, 0xc9, 0xaa, 0x29, 0x2e, 0xd4, 0xbe, - 0xd4, 0xa8, 0xca, 0x4f, 0x8c, 0x50, 0x5c, 0x5d, 0x95, 0x2b, 0x55, 0xbf, - 0x6b, 0xa0, 0x13, 0xec, 0xab, 0x26, 0x20, 0x0a, 0x7e, 0x57, 0xd4, 0xfb, - 0x78, 0xfd, 0x6c, 0x99, 0x8a, 0x56, 0x4b, 0x3c, 0xcb, 0x2c, 0x21, 0xf3, - 0x4f, 0x7f, 0xa2, 0x84, 0x7d, 0x45, 0xd3, 0xaf, 0xab, 0xe8, 0x77, 0x37, - 0xd2, 0xbf, 0xaa, 0x7e, 0x9d, 0x81, 0x41, 0xd5, 0xbf, 0x52, 0x60, 0x51, - 0xd9, 0xab, 0x8a, 0x4a, 0xd5, 0xbb, 0x42, 0xfd, 0xaa, 0xc1, 0x12, 0xda, - 0x55, 0x1f, 0xd4, 0x7d, 0xec, 0xaa, 0x6e, 0x40, 0x36, 0x11, 0x84, 0x1f, - 0x75, 0x9b, 0xa2, 0x5d, 0xa9, 0xc6, 0x69, 0x1e, 0xd2, 0xb0, 0x6b, 0xb5, - 0x54, 0x61, 0xdd, 0x09, 0xd2, 0x4c, 0xf6, 0x5d, 0x3f, 0xc4, 0xcc, 0xce, - 0xcf, 0x30, 0x19, 0xd4, 0x31, 0x75, 0x7d, 0x8e, 0x65, 0x5a, 0xaf, 0xfb, - 0xa0, 0x51, 0x0d, 0xd0, 0x36, 0x03, 0xf0, 0x8b, 0x1f, 0x10, 0x79, 0xe8, - 0x7b, 0x5d, 0xaf, 0x1a, 0x14, 0x32, 0xea, 0x24, 0x85, 0xec, 0x0c, 0xcb, - 0x98, 0x02, 0xf0, 0x96, 0x4a, 0xac, 0x11, 0x3f, 0xe8, 0x42, 0x98, 0xa4, - 0x74, 0xb1, 0x8e, 0x57, 0x24, 0x06, 0x93, 0x70, 0x55, 0x0d, 0xbb, 0x97, - 0x38, 0x78, 0xa2, 0x7a, 0x04, 0xe3, 0xf9, 0x4e, 0xd0, 0x65, 0x0f, 0x4d, - 0xb1, 0x5d, 0x45, 0x87, 0x2b, 0xca, 0x68, 0x7f, 0xb3, 0x2d, 0xda, 0x3f, - 0x7a, 0x63, 0x47, 0xe3, 0x3a, 0xdc, 0xa8, 0x81, 0x3f, 0x29, 0x57, 0x08, - 0xf4, 0x97, 0x53, 0xda, 0xc7, 0xd7, 0xd9, 0x11, 0xed, 0x6a, 0x90, 0x2d, - 0xf5, 0x12, 0xb3, 0xe1, 0x17, 0x36, 0x29, 0x5a, 0xa7, 0x59, 0x6f, 0x57, - 0x4d, 0xee, 0x07, 0x14, 0x41, 0x4c, 0xaf, 0xb3, 0x8d, 0x52, 0xcc, 0x47, - 0x14, 0x50, 0x8c, 0xbb, 0xb9, 0xd5, 0xa8, 0x0e, 0x44, 0x6f, 0x36, 0xea, - 0x3c, 0x68, 0x5e, 0xed, 0x67, 0x75, 0x27, 0xd1, 0x20, 0x02, 0x8a, 0xc4, - 0xea, 0x90, 0x11, 0xfe, 0xe5, 0x95, 0x14, 0xbe, 0xdf, 0x65, 0x21, 0xb3, - 0x6a, 0x9d, 0xba, 0x0e, 0x79, 0xa5, 0x22, 0x40, 0x9d, 0xb9, 0xf5, 0xd1, - 0x37, 0xab, 0x4a, 0x21, 0xe8, 0x27, 0x6d, 0x57, 0xa6, 0x6f, 0x6e, 0x21, - 0xea, 0xb7, 0x55, 0x59, 0x0c, 0xe4, 0x83, 0x0b, 0x9e, 0xbd, 0x60, 0x93, - 0xaf, 0x4a, 0x0b, 0xc7, 0xb4, 0xef, 0x31, 0x96, 0x0e, 0xda, 0x4c, 0x65, - 0xa8, 0x84, 0xd7, 0x10, 0x6f, 0xf7, 0x81, 0x86, 0xee, 0x21, 0xd4, 0x18, - 0x5c, 0x7c, 0x90, 0x1b, 0xa1, 0x5d, 0xbf, 0x57, 0x52, 0xe9, 0x4c, 0xe9, - 0x39, 0x74, 0x43, 0x0c, 0x0c, 0xb0, 0xe2, 0xe8, 0x17, 0x33, 0x81, 0xc3, - 0x0b, 0x9f, 0x3e, 0xcb, 0x54, 0xdf, 0x63, 0xd8, 0xae, 0xac, 0xa6, 0x4e, - 0xe3, 0x5a, 0x64, 0xd2, 0x54, 0xf1, 0x4c, 0x2a, 0xd5, 0x2d, 0x95, 0x74, - 0x3a, 0x46, 0xd3, 0xb9, 0xe2, 0x1d, 0xd2, 0x53, 0xaa, 0xee, 0xd7, 0x4f, - 0x59, 0xf0, 0xe5, 0x12, 0x15, 0xb1, 0xf8, 0x02, 0x5c, 0xa5, 0xc8, 0x51, - 0x17, 0x99, 0xbe, 0x9c, 0x4a, 0xd5, 0xe3, 0x06, 0xaf, 0x02, 0x6f, 0xdc, - 0x19, 0xbe, 0x4d, 0x64, 0x74, 0xa2, 0xfd, 0x3e, 0xf4, 0x39, 0x50, 0x4d, - 0x5c, 0xf6, 0x63, 0xe1, 0xa8, 0x94, 0x4a, 0x15, 0x49, 0x33, 0x86, 0x55, - 0x29, 0x5d, 0xd8, 0x51, 0x0d, 0x9e, 0xb7, 0x1d, 0x80, 0xc6, 0x05, 0xfa, - 0x88, 0x2e, 0x80, 0x69, 0x24, 0x5f, 0x55, 0x3d, 0xc6, 0x30, 0x0f, 0xeb, - 0x09, 0xf9, 0x22, 0xc1, 0x3c, 0x21, 0x3b, 0x25, 0xce, 0x3a, 0x6c, 0xe9, - 0x11, 0xa6, 0xe7, 0x06, 0xb9, 0x88, 0xb1, 0x4b, 0x4c, 0x21, 0xae, 0x76, - 0x45, 0xe2, 0x15, 0x30, 0xe7, 0x5b, 0xc2, 0x57, 0x82, 0x7c, 0xf4, 0x48, - 0xfd, 0xa2, 0xf2, 0x48, 0x35, 0x8a, 0x55, 0xa7, 0xc4, 0x3c, 0x95, 0x28, - 0x49, 0x85, 0x6c, 0xc1, 0x11, 0x89, 0xf5, 0xb5, 0x2a, 0x45, 0x2a, 0x0c, - 0x8a, 0x57, 0xa9, 0x86, 0x51, 0xc1, 0x86, 0x05, 0x6d, 0xa3, 0x38, 0xd3, - 0xcd, 0xc3, 0x9c, 0xa9, 0x34, 0x30, 0x67, 0x1e, 0x72, 0xfc, 0xa9, 0xf4, - 0x3b, 0x61, 0x91, 0xe7, 0x0e, 0x0b, 0x18, 0x64, 0xcd, 0x54, 0xec, 0x55, - 0x85, 0x22, 0x2b, 0x99, 0x31, 0xf1, 0xec, 0xb2, 0x52, 0xc8, 0xd2, 0x87, - 0x57, 0x6f, 0x8e, 0xde, 0xfd, 0xf2, 0x43, 0x09, 0x2a, 0x14, 0xc3, 0x7e, - 0x5b, 0x8a, 0xa4, 0x26, 0x94, 0x3a, 0x12, 0x4c, 0xd6, 0x92, 0x11, 0x3f, - 0x7a, 0x14, 0xff, 0xe4, 0x1a, 0x1a, 0xb2, 0xe7, 0xa2, 0x6f, 0x49, 0xda, - 0x71, 0x9d, 0x4b, 0x19, 0x11, 0x70, 0xf6, 0x0d, 0x05, 0x40, 0x98, 0x34, - 0xf3, 0x19, 0x69, 0x3c, 0x47, 0xff, 0x5c, 0xd4, 0x5c, 0xd4, 0x77, 0x93, - 0x8d, 0x75, 0x9a, 0xec, 0x18, 0x21, 0x0d, 0x75, 0x39, 0x8b, 0x82, 0x2a, - 0x1a, 0x52, 0xb2, 0xea, 0x8c, 0x05, 0xe9, 0xea, 0x67, 0xbe, 0x71, 0x29, - 0xf5, 0xb6, 0x4d, 0x3b, 0x0b, 0xdc, 0xae, 0x50, 0xbf, 0x79, 0x54, 0xc7, - 0xbc, 0x3d, 0x54, 0x83, 0x73, 0xdc, 0xfb, 0xbb, 0x9e, 0x7a, 0x36, 0xb2, - 0x50, 0x14, 0x94, 0xa3, 0x20, 0x87, 0x20, 0xed, 0xa2, 0x80, 0x44, 0x49, - 0xed, 0xe5, 0x7e, 0xf5, 0x16, 0x73, 0x89, 0x4b, 0x8c, 0xf7, 0x9d, 0x7c, - 0xff, 0x6e, 0x5c, 0x55, 0xb1, 0x6a, 0x80, 0x60, 0x21, 0x4d, 0xb4, 0x3b, - 0xb0, 0xa8, 0xc0, 0x3e, 0x74, 0x46, 0x33, 0xfd, 0x0c, 0xf1, 0x2f, 0x44, - 0xff, 0xee, 0xfd, 0xd1, 0xdb, 0x85, 0x88, 0x9b, 0xb7, 0x40, 0xfc, 0xfc, - 0xf5, 0xbb, 0x93, 0x65, 0x4c, 0xb7, 0x6e, 0x89, 0xfb, 0xe8, 0xbb, 0x85, - 0xa8, 0xdb, 0x37, 0x46, 0x1d, 0xfb, 0x63, 0xab, 0x09, 0x5e, 0xd4, 0x0d, - 0xd0, 0x9d, 0xd0, 0xa4, 0xd6, 0x58, 0x42, 0x8d, 0xb2, 0xef, 0x84, 0x8e, - 0x6a, 0x9c, 0x25, 0xa4, 0x08, 0xe2, 0xae, 0x6a, 0x25, 0x9b, 0x6b, 0x09, - 0x31, 0x09, 0x70, 0x27, 0xb4, 0xcc, 0x18, 0xb6, 0x90, 0x9e, 0xec, 0x81, - 0xf3, 0xf0, 0x5b, 0xfa, 0x91, 0x19, 0x06, 0x3b, 0x59, 0xbf, 0x03, 0x8e, - 0x1e, 0x23, 0x31, 0xd6, 0x29, 0x0b, 0x81, 0x5e, 0xaf, 0x11, 0x91, 0x4b, - 0x6b, 0x70, 0x1a, 0x80, 0xca, 0x9d, 0x54, 0xcd, 0xb8, 0x53, 0x0b, 0xab, - 0xc6, 0xbe, 0x25, 0xdc, 0xc1, 0x72, 0xd6, 0x01, 0xab, 0x36, 0xee, 0x86, - 0x87, 0xde, 0x0c, 0x21, 0x3e, 0x2c, 0xa9, 0x1c, 0x4e, 0x96, 0xf2, 0x91, - 0x77, 0xc8, 0xea, 0x28, 0x34, 0xeb, 0x8b, 0x72, 0x72, 0x1e, 0xa3, 0xc1, - 0x4b, 0x72, 0x85, 0xac, 0xd4, 0xd5, 0x7e, 0x77, 0xf4, 0xad, 0xf8, 0x06, - 0x73, 0x0e, 0x44, 0x2b, 0x47, 0x38, 0x60, 0x19, 0x59, 0x89, 0x79, 0xe0, - 0x33, 0x78, 0x81, 0x32, 0x97, 0xaf, 0xfc, 0xe2, 0x5f, 0xbd, 0x8b, 0x48, - 0xbc, 0x66, 0xd8, 0xaa, 0xb8, 0x42, 0x4d, 0xbf, 0x29, 0xe7, 0x9b, 0x38, - 0xcd, 0x78, 0xe7, 0x8e, 0xc4, 0x21, 0xce, 0x31, 0x14, 0x84, 0x64, 0xd9, - 0xd7, 0xd0, 0x36, 0x53, 0xa8, 0x53, 0x2a, 0xdd, 0x09, 0x1b, 0x7a, 0xbc, - 0x59, 0x83, 0x09, 0x5d, 0xe4, 0xae, 0x58, 0x08, 0x68, 0x8d, 0x15, 0x6b, - 0x4d, 0xd1, 0x3a, 0xfd, 0xce, 0x14, 0xea, 0xdc, 0xb9, 0x29, 0x9d, 0x05, - 0xeb, 0x88, 0x63, 0x16, 0xac, 0x26, 0x89, 0x04, 0x89, 0xba, 0x9c, 0x58, - 0xa4, 0x14, 0xda, 0xcc, 0xa6, 0x04, 0xc5, 0x16, 0x78, 0x7a, 0x5b, 0x34, - 0x65, 0x69, 0x14, 0xcf, 0x86, 0xf4, 0x5c, 0x26, 0xef, 0xe7, 0x2c, 0x93, - 0x1d, 0xce, 0x50, 0x52, 0xaa, 0xb2, 0xa2, 0x06, 0x82, 0x29, 0x32, 0x5b, - 0x6c, 0xd5, 0xd2, 0x4e, 0x55, 0x07, 0x2f, 0x6e, 0x62, 0x14, 0x16, 0x3f, - 0x0e, 0x4a, 0x45, 0x40, 0x38, 0x8f, 0xf2, 0x47, 0xea, 0xbc, 0x03, 0xba, - 0x01, 0x00, 0x8b, 0x7b, 0x71, 0x47, 0x2c, 0x55, 0xae, 0x52, 0xa2, 0x88, - 0xe7, 0xad, 0x19, 0x71, 0x2c, 0x9f, 0xf3, 0xe5, 0xa7, 0x71, 0xf9, 0x59, - 0xa3, 0x31, 0xad, 0xd7, 0xd7, 0x5c, 0x75, 0x7b, 0xe3, 0x27, 0x33, 0x13, - 0x59, 0x8f, 0x4b, 0x56, 0xd4, 0x24, 0xa4, 0xab, 0xc2, 0x13, 0x99, 0x94, - 0x37, 0xba, 0x94, 0x83, 0xae, 0xe4, 0x80, 0x47, 0x66, 0xa6, 0x6f, 0x24, - 0x48, 0x88, 0xe0, 0xc2, 0x2b, 0xfa, 0x66, 0x8e, 0x04, 0x06, 0xd2, 0x80, - 0x4a, 0xc8, 0x12, 0x36, 0x6f, 0x38, 0xa7, 0xb3, 0x70, 0x8c, 0x52, 0x19, - 0x36, 0x71, 0xd6, 0x33, 0xe5, 0x8d, 0x66, 0x04, 0x9f, 0x99, 0xb7, 0x7f, - 0x12, 0x9f, 0x1f, 0x3d, 0xca, 0xa7, 0x49, 0xdc, 0x51, 0xae, 0x31, 0xe9, - 0x8d, 0x2e, 0xeb, 0x62, 0x2f, 0xe7, 0x13, 0xbb, 0x05, 0x14, 0xf1, 0x06, - 0x36, 0x2c, 0xec, 0x14, 0xcd, 0x23, 0xb9, 0x35, 0xaf, 0x32, 0xf5, 0x54, - 0x42, 0x32, 0xf4, 0x4d, 0x58, 0x4f, 0xce, 0xf1, 0xbb, 0x8d, 0xfd, 0xe8, - 0xa9, 0x8d, 0x35, 0x35, 0x5e, 0x8b, 0x56, 0x43, 0xc6, 0x7e, 0xf4, 0xcd, - 0x37, 0x15, 0xf1, 0x29, 0xfa, 0xdc, 0x8d, 0x73, 0xf0, 0xb0, 0x9f, 0x72, - 0xc5, 0xeb, 0x8c, 0xf8, 0xd1, 0xa3, 0xc4, 0xd9, 0x61, 0x3a, 0x7a, 0xec, - 0x5e, 0x94, 0x55, 0x4a, 0xf5, 0x13, 0x96, 0x11, 0x4e, 0x0e, 0x4a, 0x9f, - 0x29, 0xdc, 0xd7, 0xb7, 0xa3, 0x7c, 0x1b, 0x9c, 0xc2, 0xba, 0xbc, 0x85, - 0x35, 0xe7, 0x48, 0x4d, 0x92, 0x45, 0xc9, 0x5e, 0x8a, 0x1c, 0x38, 0x15, - 0xf5, 0x25, 0xe1, 0x9d, 0x6c, 0x34, 0x60, 0x59, 0x24, 0x08, 0xb1, 0x37, - 0x20, 0x2b, 0x0a, 0x32, 0x55, 0x03, 0x83, 0xc5, 0x07, 0x96, 0xc2, 0x40, - 0x94, 0x5f, 0x75, 0xa8, 0xb8, 0x7d, 0x9e, 0x2f, 0xde, 0x37, 0xc5, 0x1d, - 0x14, 0x2f, 0x0c, 0x70, 0x39, 0xd5, 0x59, 0x37, 0xd0, 0xa1, 0xa5, 0x6c, - 0x97, 0x3d, 0x68, 0x40, 0x13, 0x90, 0x2f, 0xa3, 0x5c, 0x53, 0x7f, 0x5e, - 0xf6, 0x72, 0xdd, 0xba, 0xd6, 0xac, 0x54, 0x0e, 0xfa, 0x0c, 0xd7, 0xaf, - 0x54, 0x53, 0x5d, 0xc1, 0xa3, 0xb7, 0xcf, 0x0d, 0x88, 0x4c, 0xa9, 0x3a, - 0xab, 0x54, 0x67, 0x19, 0x79, 0xcf, 0x6d, 0x27, 0x2a, 0x96, 0xb3, 0xe6, - 0x87, 0xa2, 0xa8, 0x18, 0x0f, 0xb0, 0x69, 0x5b, 0xa4, 0xe6, 0x71, 0x89, - 0xf8, 0x48, 0x54, 0xcd, 0xb4, 0x5c, 0x19, 0xed, 0xba, 0xa0, 0x65, 0x7f, - 0x19, 0xb8, 0x09, 0xd5, 0xe7, 0x38, 0x61, 0xce, 0x59, 0x11, 0x2a, 0x38, - 0xa8, 0xe8, 0x52, 0x2b, 0x43, 0x7d, 0xbe, 0xd0, 0x2c, 0x73, 0x9f, 0xe0, - 0x75, 0xf9, 0x44, 0x09, 0xc9, 0x39, 0x34, 0xa2, 0xcc, 0x20, 0x79, 0xff, - 0x67, 0x11, 0xca, 0x88, 0xe1, 0xa3, 0x7a, 0x84, 0x95, 0x43, 0x0d, 0x13, - 0x5d, 0x45, 0x63, 0xba, 0x46, 0xe6, 0x88, 0x67, 0xf5, 0x58, 0xd2, 0xfe, - 0x62, 0xd3, 0xcd, 0x15, 0xbf, 0x3c, 0x7e, 0x9d, 0xb1, 0xd2, 0xda, 0xe4, - 0x2d, 0x10, 0x21, 0x61, 0x7e, 0x90, 0x8b, 0xc5, 0x3d, 0x7a, 0x54, 0x68, - 0xc3, 0x2b, 0x97, 0x05, 0x51, 0xbb, 0x86, 0x8c, 0x76, 0x65, 0x14, 0xdf, - 0x83, 0x87, 0x66, 0x22, 0x94, 0x50, 0x5d, 0x13, 0x71, 0xfc, 0x36, 0x4c, - 0xe4, 0x74, 0x10, 0xa9, 0x05, 0x68, 0x2e, 0xc4, 0x99, 0x54, 0xca, 0x00, - 0x25, 0xf2, 0x31, 0xd0, 0xa0, 0x3a, 0x43, 0xc1, 0x38, 0x36, 0x5b, 0xb5, - 0x4d, 0x81, 0xd9, 0xb7, 0x4e, 0xb9, 0xd2, 0x99, 0x51, 0xdd, 0x72, 0xaa, - 0xda, 0xf5, 0x2b, 0x29, 0xe5, 0x03, 0x2b, 0x56, 0x20, 0x79, 0xc1, 0x37, - 0x6d, 0x46, 0x81, 0xfd, 0xce, 0x39, 0xd2, 0xa5, 0x83, 0x2e, 0x05, 0xa1, - 0xf7, 0xf1, 0x4a, 0x70, 0x71, 0x59, 0x80, 0xf6, 0x9b, 0x6f, 0xd2, 0x2a, - 0xad, 0xd8, 0xcd, 0x63, 0xd2, 0xaa, 0x2f, 0xcd, 0xad, 0xb6, 0xb4, 0x34, - 0xd8, 0xc7, 0x2a, 0x13, 0x47, 0xa2, 0xcb, 0xe3, 0xae, 0x8d, 0xb8, 0x77, - 0x0b, 0x26, 0x72, 0xac, 0xa7, 0x66, 0x95, 0x54, 0xb3, 0xbf, 0xf5, 0x2d, - 0xd9, 0xee, 0xb1, 0x18, 0xe4, 0xb5, 0x0f, 0xb4, 0xa2, 0xfc, 0xc5, 0xc1, - 0xc6, 0x32, 0x15, 0x8b, 0x1c, 0xb3, 0x15, 0x94, 0x5d, 0xa9, 0x5c, 0x61, - 0x45, 0x2a, 0x88, 0x18, 0xa6, 0x7a, 0x40, 0x59, 0x70, 0x74, 0xa3, 0x72, - 0x95, 0x05, 0xa7, 0x15, 0x98, 0xd4, 0x20, 0xfe, 0xad, 0xc8, 0xc6, 0x71, - 0x3b, 0x28, 0x9c, 0x93, 0xc4, 0x25, 0xb0, 0xc1, 0x88, 0xc5, 0x51, 0x92, - 0x0e, 0x60, 0xe2, 0x07, 0x72, 0xb2, 0x68, 0xb4, 0xec, 0x26, 0x13, 0xbf, - 0xa5, 0x7e, 0x6d, 0x73, 0xd7, 0x35, 0x89, 0x95, 0x8e, 0x4a, 0x45, 0x89, - 0xdc, 0x94, 0x2b, 0x15, 0xcd, 0xcc, 0xb1, 0x45, 0x29, 0x18, 0x41, 0x93, - 0x42, 0x37, 0x30, 0x2b, 0xc5, 0x54, 0x85, 0x0e, 0x5f, 0x69, 0x10, 0xf4, - 0xb5, 0x3e, 0x1b, 0x92, 0xab, 0x64, 0xa7, 0xcb, 0x80, 0xa5, 0xba, 0x5e, - 0x52, 0x4d, 0x74, 0xcc, 0x4e, 0xc7, 0xba, 0xf2, 0xf1, 0xc2, 0x32, 0x2f, - 0x10, 0x95, 0xe5, 0x6f, 0x1d, 0xf8, 0x53, 0x80, 0xf9, 0x41, 0xd3, 0x09, - 0x0b, 0x1d, 0x32, 0x52, 0xd8, 0x02, 0x17, 0xf5, 0x1a, 0xa7, 0x53, 0xb1, - 0x9a, 0xd7, 0xd4, 0x7d, 0xe8, 0xf2, 0x65, 0x81, 0xbf, 0x99, 0x8f, 0xef, - 0x31, 0xf7, 0x1c, 0x32, 0xd3, 0x0c, 0x63, 0x44, 0xed, 0x8f, 0xc9, 0xa6, - 0xe6, 0x04, 0x66, 0x62, 0xd5, 0x0b, 0xa5, 0x25, 0x41, 0x2c, 0xbe, 0x27, - 0xa5, 0x92, 0xf7, 0x1b, 0x1b, 0x69, 0x8c, 0xf9, 0xd8, 0x5d, 0x46, 0x2a, - 0x25, 0x25, 0x67, 0x96, 0x3d, 0x2d, 0x16, 0x7e, 0x1b, 0xd5, 0x13, 0x49, - 0xe0, 0xb2, 0x43, 0x1f, 0x29, 0xac, 0x39, 0x71, 0x64, 0x99, 0x35, 0x01, - 0x01, 0xc3, 0x77, 0xa6, 0x48, 0xc9, 0xc8, 0xb8, 0xc8, 0xeb, 0x92, 0x4b, - 0x09, 0xa5, 0xdc, 0xba, 0xc3, 0x35, 0xa5, 0xd4, 0x4a, 0x59, 0xbe, 0x11, - 0xae, 0x29, 0x17, 0xbf, 0x48, 0xa2, 0x20, 0x9e, 0x7e, 0x6d, 0x59, 0xb9, - 0x84, 0x98, 0x57, 0xdb, 0xb4, 0x6a, 0xca, 0x6e, 0xb7, 0x96, 0xc8, 0x24, - 0x7c, 0x5e, 0x5e, 0x48, 0x5f, 0x57, 0x58, 0x28, 0xb2, 0xbe, 0xa4, 0x50, - 0xe8, 0x66, 0x62, 0x42, 0xc1, 0x9b, 0xca, 0x28, 0xd9, 0x11, 0x53, 0x42, - 0x4a, 0x66, 0xb0, 0x98, 0xf2, 0x4b, 0x43, 0x39, 0x90, 0xcc, 0x52, 0x11, - 0xd1, 0xc2, 0x22, 0x31, 0xfe, 0x8f, 0xb7, 0x2e, 0xd0, 0xcd, 0xda, 0xd8, - 0xb1, 0x80, 0xd3, 0x72, 0x78, 0xe5, 0x3c, 0x1c, 0xe1, 0x3e, 0x6f, 0x76, - 0xae, 0xeb, 0x2b, 0xc7, 0x01, 0x47, 0xb7, 0xf9, 0x48, 0xa8, 0x6e, 0xd7, - 0x2a, 0x11, 0x84, 0x4b, 0x8f, 0x25, 0xba, 0xb9, 0xc7, 0xa4, 0x97, 0xf4, - 0xc5, 0x3c, 0x1a, 0x63, 0xa9, 0xf9, 0xa4, 0x55, 0x6f, 0xee, 0xee, 0xd5, - 0x9b, 0x78, 0x57, 0x70, 0xab, 0xd9, 0x2e, 0xc9, 0x97, 0x82, 0xf3, 0xf2, - 0x39, 0xa6, 0x93, 0x34, 0xaa, 0x10, 0xd4, 0x9c, 0x36, 0x24, 0x94, 0xac, - 0x6f, 0xb8, 0x18, 0xbe, 0x4a, 0x9d, 0xbd, 0x66, 0x49, 0x73, 0x17, 0x1f, - 0xc6, 0x35, 0x7b, 0x2a, 0x5c, 0x9b, 0xf7, 0x3d, 0x9b, 0xed, 0x63, 0x11, - 0x1d, 0xdc, 0x3e, 0x1d, 0xca, 0x1d, 0x78, 0x0f, 0x5f, 0xf0, 0x5f, 0x3a, - 0x4f, 0x6f, 0x0f, 0x7e, 0xd8, 0xc0, 0x5f, 0x36, 0x93, 0xae, 0x6f, 0xa3, - 0xbc, 0x36, 0xff, 0x65, 0xf2, 0x22, 0x4f, 0x16, 0xdb, 0x6b, 0x3c, 0x6f, - 0xe4, 0xb2, 0xb0, 0xe9, 0x43, 0x52, 0x04, 0xd6, 0x38, 0xf7, 0x8b, 0x13, - 0x3a, 0x3d, 0xc7, 0x75, 0x22, 0xec, 0x39, 0xff, 0xf4, 0x59, 0x26, 0xaa, - 0x43, 0xda, 0xa7, 0xd4, 0xbe, 0xb4, 0xbd, 0x4d, 0x1f, 0xbe, 0x8e, 0x37, - 0xbe, 0x9d, 0x7a, 0x6a, 0xe7, 0x1b, 0x6f, 0xef, 0x90, 0x35, 0x97, 0xe1, - 0x07, 0x53, 0xef, 0xb1, 0xd9, 0xfd, 0xaa, 0xcb, 0xc6, 0x37, 0xa3, 0x67, - 0xd3, 0xa6, 0xbc, 0xaf, 0xb5, 0xa1, 0x92, 0xe2, 0x0b, 0xb3, 0x73, 0x60, - 0x70, 0x11, 0x4c, 0x1a, 0xb5, 0x49, 0x48, 0x7b, 0x8a, 0x9b, 0xe6, 0xb9, - 0xef, 0x11, 0x1e, 0xf3, 0x4c, 0xbb, 0xcd, 0xd2, 0x25, 0x70, 0x67, 0x6d, - 0x0a, 0x62, 0x78, 0xee, 0x4f, 0x13, 0x65, 0x84, 0x47, 0xe1, 0x13, 0x2a, - 0x37, 0xef, 0xe0, 0x38, 0x24, 0xdc, 0x26, 0x64, 0x2c, 0xd8, 0x4b, 0x48, - 0xf7, 0x55, 0x99, 0xfa, 0xe3, 0x2e, 0x10, 0xb3, 0x15, 0x47, 0x1f, 0xda, - 0x33, 0x88, 0xe9, 0x52, 0xcb, 0xd4, 0xa3, 0x3f, 0x8d, 0x9f, 0xf8, 0x34, - 0xaa, 0x79, 0x52, 0xcd, 0x7f, 0x39, 0xef, 0xe0, 0xdd, 0xfe, 0x01, 0x7d, - 0x8c, 0xe8, 0xa3, 0x47, 0x1f, 0x63, 0x71, 0xde, 0x29, 0x35, 0xd4, 0x1f, - 0xf6, 0xef, 0xcf, 0x5b, 0x0c, 0xc4, 0x9f, 0x23, 0xfe, 0xec, 0xb5, 0x14, - 0x5c, 0x2b, 0x0d, 0xd8, 0x66, 0x40, 0xfe, 0x1c, 0xf1, 0x67, 0xaf, 0xad, - 0x00, 0xdb, 0x09, 0x40, 0x7d, 0x46, 0x46, 0xbe, 0x74, 0xcb, 0xe3, 0xdd, - 0xde, 0xe8, 0x17, 0x2a, 0x95, 0x5f, 0x0f, 0xc5, 0x09, 0xb1, 0x00, 0x5b, - 0x7b, 0xcd, 0xd6, 0xf0, 0xfc, 0x54, 0xd6, 0x80, 0x76, 0x92, 0x24, 0x2b, - 0x71, 0x8a, 0x00, 0x55, 0xdc, 0x3e, 0xf2, 0xcc, 0x6d, 0x42, 0xcb, 0x8c, - 0x6f, 0x9c, 0x2a, 0x69, 0x5e, 0xe2, 0x7b, 0x6a, 0x20, 0x92, 0xe5, 0x80, - 0xf4, 0xb4, 0x18, 0xc8, 0xc8, 0xd0, 0x09, 0x75, 0xba, 0x18, 0xa4, 0x1b, - 0x12, 0xfb, 0xf2, 0x31, 0x41, 0x19, 0x9f, 0xf2, 0xee, 0x56, 0x78, 0xa1, - 0xa6, 0x0c, 0xdd, 0x50, 0x25, 0x5b, 0x35, 0x55, 0x07, 0xb9, 0x27, 0x34, - 0x46, 0x63, 0x5a, 0x9c, 0x22, 0x24, 0xaf, 0xa2, 0x7d, 0x3e, 0x43, 0x41, - 0x6f, 0xf7, 0xa2, 0xab, 0x8b, 0xa6, 0x01, 0xf9, 0x44, 0x74, 0x3e, 0x22, - 0x0a, 0xe5, 0x75, 0x24, 0x1e, 0x5d, 0xb7, 0x63, 0xf6, 0x3e, 0xfd, 0x0a, - 0x47, 0x90, 0x5d, 0xd7, 0xb6, 0x7e, 0x16, 0x5a, 0xb4, 0xf1, 0x99, 0x37, - 0xf7, 0x5a, 0x27, 0xea, 0x4d, 0x9a, 0xbd, 0x0b, 0xeb, 0x25, 0x12, 0x46, - 0xb6, 0xf5, 0x2b, 0x07, 0xe7, 0x65, 0xfc, 0xef, 0x7f, 0x8f, 0x36, 0x33, - 0x01, 0xbf, 0x3c, 0x9f, 0x35, 0xb0, 0x10, 0x7b, 0x09, 0x2e, 0x4e, 0xe4, - 0xe6, 0xad, 0xe0, 0xfb, 0xdf, 0x8b, 0x37, 0x48, 0xfc, 0x31, 0x2c, 0x87, - 0x9c, 0x7a, 0xe4, 0x56, 0x94, 0x06, 0x4a, 0xd7, 0xcf, 0xdc, 0xf9, 0x95, - 0x2a, 0x6a, 0xa0, 0xa5, 0x91, 0x63, 0x22, 0x32, 0x8d, 0xd9, 0xe2, 0x4b, - 0x08, 0x71, 0x55, 0x97, 0x0b, 0xcf, 0x3c, 0x00, 0xdd, 0x2e, 0x51, 0x78, - 0xfc, 0x10, 0x3f, 0x1f, 0x57, 0xaa, 0xf2, 0x40, 0x82, 0x4e, 0xe3, 0x07, - 0xa4, 0xf2, 0x69, 0x04, 0x9d, 0x48, 0xbf, 0x91, 0xc6, 0x47, 0x11, 0xe2, - 0x44, 0x7a, 0xa0, 0x54, 0xa5, 0x5c, 0x3a, 0x59, 0x3e, 0x21, 0x5d, 0xaa, - 0x97, 0x4e, 0xc6, 0x03, 0x51, 0xdb, 0xb7, 0x62, 0xde, 0x22, 0x6a, 0xf9, - 0x2c, 0x6b, 0x38, 0x78, 0xf0, 0x2b, 0xdb, 0xd5, 0x85, 0x64, 0x42, 0xcc, - 0x63, 0x3a, 0x53, 0x27, 0x69, 0x66, 0xd3, 0xb9, 0x2a, 0x45, 0x73, 0x9d, - 0xc9, 0xd5, 0x49, 0x86, 0xfd, 0x74, 0x7e, 0x9c, 0x16, 0xd7, 0x23, 0x9d, - 0xaf, 0x93, 0x50, 0xa1, 0x84, 0xac, 0x55, 0xf3, 0x7f, 0x27, 0x2f, 0x5b, - 0xe3, 0x3a, 0x49, 0xa5, 0x53, 0x29, 0xba, 0x74, 0xea, 0x45, 0xa7, 0x19, - 0x14, 0xfc, 0xd2, 0x11, 0x23, 0x8f, 0xd7, 0x3d, 0x4d, 0x93, 0x33, 0x3e, - 0xd1, 0x1b, 0xed, 0x90, 0xfc, 0x39, 0x96, 0x49, 0x11, 0x00, 0x67, 0x7c, - 0xd6, 0x72, 0x29, 0x82, 0xa0, 0xf4, 0xcf, 0x5a, 0x36, 0x85, 0x10, 0x9c, - 0xf1, 0xd9, 0xc8, 0xa7, 0x08, 0x46, 0xe6, 0x00, 0x68, 0x5f, 0xa9, 0x9c, - 0xaa, 0x92, 0xba, 0xeb, 0xc4, 0x28, 0xb4, 0xce, 0x78, 0xce, 0xe9, 0x65, - 0xdb, 0x05, 0x2e, 0xd9, 0xfd, 0xe2, 0x51, 0x9b, 0x46, 0xf9, 0x07, 0xc8, - 0xe0, 0x84, 0x15, 0x6e, 0xb8, 0x93, 0x2f, 0xfb, 0xc5, 0xc0, 0xcd, 0x96, - 0xba, 0x1e, 0xdb, 0x27, 0x7d, 0xe3, 0x5d, 0x2f, 0xbe, 0x14, 0x85, 0x89, - 0x82, 0xde, 0xef, 0x31, 0x0a, 0x94, 0x7f, 0x70, 0x09, 0xe9, 0xd5, 0xf9, - 0x8e, 0xd1, 0xab, 0xaa, 0xf5, 0x83, 0x4b, 0x16, 0x55, 0xe2, 0x99, 0x04, - 0xa3, 0x1e, 0x2b, 0xbf, 0xdf, 0x5f, 0x95, 0x13, 0xbc, 0xea, 0xb7, 0x88, - 0x13, 0x07, 0x16, 0x2b, 0xf8, 0xe9, 0x87, 0x37, 0xaf, 0xc9, 0xd1, 0x78, - 0x48, 0x10, 0x60, 0xe1, 0x83, 0x0f, 0xe8, 0xf2, 0x27, 0x92, 0xaf, 0xa2, - 0x54, 0xb5, 0x62, 0x9e, 0x54, 0xa3, 0xea, 0x07, 0xc3, 0xcd, 0xe7, 0xe4, - 0x6d, 0x82, 0x90, 0xf4, 0x09, 0x0c, 0x91, 0x14, 0xb3, 0x49, 0x4e, 0x79, - 0x5f, 0xd2, 0x9a, 0x25, 0x4b, 0xc9, 0x14, 0xb0, 0x52, 0x38, 0xb7, 0xb4, - 0x2e, 0x29, 0x5d, 0xfa, 0x2a, 0x65, 0x74, 0x53, 0x48, 0x63, 0xa7, 0xa1, - 0x8b, 0x5f, 0x59, 0x14, 0x71, 0x58, 0xab, 0x65, 0x9a, 0xa5, 0x6b, 0x5b, - 0xc2, 0x88, 0xab, 0x1e, 0x80, 0x5c, 0x2a, 0x61, 0x94, 0x4d, 0xe8, 0xad, - 0xd9, 0x1e, 0x44, 0x3f, 0x2f, 0xff, 0x04, 0x42, 0x8c, 0x94, 0x2b, 0xe3, - 0xa3, 0xf7, 0x66, 0xaf, 0x57, 0x9f, 0x56, 0xae, 0x42, 0xb9, 0x94, 0x5e, - 0x6b, 0xcd, 0x2a, 0xb5, 0x56, 0xa8, 0x52, 0x6b, 0x65, 0x84, 0xf4, 0xaa, - 0xec, 0xf5, 0xea, 0xd4, 0xce, 0xd5, 0x29, 0x97, 0xd2, 0x6b, 0xaf, 0x59, - 0xa7, 0xf6, 0x0a, 0x75, 0x6a, 0x6b, 0x2d, 0x34, 0x63, 0x1b, 0xdf, 0x3e, - 0x09, 0x73, 0xcc, 0x30, 0x14, 0x7c, 0x8a, 0xef, 0x2d, 0x9b, 0x8f, 0x31, - 0x96, 0x7d, 0xf7, 0xee, 0x0d, 0x5c, 0x06, 0x7d, 0xaa, 0xd1, 0xd8, 0x21, - 0x09, 0x2f, 0x4d, 0x79, 0x58, 0x56, 0x43, 0xab, 0x19, 0x76, 0x64, 0x57, - 0xb3, 0xba, 0xa6, 0x3f, 0x4a, 0xca, 0xb2, 0x53, 0xa6, 0x61, 0x64, 0x5a, - 0x12, 0x8a, 0x7b, 0x6b, 0x1a, 0x88, 0x93, 0x52, 0x30, 0xd4, 0xed, 0x33, - 0x40, 0x9c, 0x96, 0x86, 0x32, 0x43, 0x92, 0x01, 0x53, 0x89, 0x49, 0x38, - 0x33, 0x32, 0x19, 0x30, 0x99, 0xa6, 0xa0, 0x8a, 0x05, 0x56, 0x28, 0x25, - 0x23, 0x24, 0x86, 0x95, 0x2e, 0x0c, 0x2b, 0x83, 0x11, 0x14, 0xf0, 0xc8, - 0x37, 0x7d, 0xf5, 0x46, 0x0a, 0x11, 0xa7, 0xab, 0x71, 0x2a, 0xa7, 0x4a, - 0x85, 0x36, 0xb7, 0x81, 0x35, 0xf2, 0xdf, 0x27, 0xc5, 0xba, 0xac, 0x64, - 0xa3, 0x9a, 0xb6, 0xd0, 0x5c, 0xd6, 0x08, 0x7b, 0x79, 0x51, 0x14, 0xce, - 0x9a, 0x73, 0xd3, 0x04, 0xcb, 0xf9, 0x65, 0x10, 0x4d, 0x73, 0xd1, 0xa3, - 0xc1, 0x6a, 0x9a, 0x6c, 0x39, 0x5a, 0x09, 0xa3, 0x11, 0x2d, 0x7f, 0x36, - 0x98, 0xc9, 0x37, 0xe5, 0xeb, 0x73, 0xbb, 0x09, 0x22, 0x38, 0x2d, 0xeb, - 0x0e, 0xf8, 0x3c, 0xd2, 0xa7, 0xc6, 0xe7, 0x7d, 0x33, 0x84, 0x26, 0x51, - 0x58, 0x07, 0x5d, 0xab, 0xb9, 0x97, 0xba, 0xb1, 0x96, 0x11, 0xd5, 0x39, - 0x38, 0xfb, 0xd6, 0x9e, 0x40, 0x5d, 0xd2, 0x09, 0x14, 0xec, 0xc7, 0x38, - 0x8d, 0xad, 0x12, 0x5b, 0xbf, 0xeb, 0xe9, 0x77, 0x0c, 0xff, 0xae, 0xb7, - 0x35, 0xaa, 0x5a, 0x25, 0x3c, 0x62, 0xa7, 0xfe, 0x59, 0x29, 0x3d, 0x26, - 0xdc, 0x1c, 0x37, 0x21, 0x53, 0xa8, 0x35, 0x25, 0x83, 0xfb, 0xfb, 0xdf, - 0x8b, 0x35, 0x4e, 0xbd, 0xba, 0x2d, 0xaf, 0x72, 0x37, 0xd4, 0xb7, 0x9b, - 0x2a, 0xdb, 0x4d, 0x35, 0xed, 0x3e, 0xd4, 0xec, 0x4e, 0x75, 0x4c, 0x9b, - 0x88, 0xfe, 0x98, 0x5e, 0x25, 0x6c, 0x05, 0xfc, 0xc9, 0xf9, 0x34, 0x83, - 0x51, 0x86, 0x55, 0xfa, 0xe9, 0xc6, 0x48, 0x28, 0xe8, 0x63, 0x7c, 0x28, - 0x73, 0x96, 0x37, 0xa7, 0xf9, 0x28, 0xd4, 0x63, 0x59, 0xea, 0x71, 0xd5, - 0x2a, 0x57, 0xba, 0x07, 0x97, 0x29, 0x8f, 0x66, 0x62, 0x9f, 0xe1, 0xf8, - 0x06, 0xee, 0x15, 0x89, 0x4d, 0xb9, 0x8d, 0xdf, 0x74, 0x2c, 0x95, 0x66, - 0x2c, 0x3d, 0x9c, 0x12, 0xa7, 0x59, 0x4a, 0x03, 0xb3, 0x32, 0x3a, 0xc8, - 0x9c, 0x3a, 0x63, 0x1d, 0xdb, 0x3e, 0x7e, 0x87, 0xa0, 0x62, 0x27, 0x66, - 0x23, 0xe1, 0x5e, 0x69, 0xfd, 0xd2, 0xbd, 0x25, 0xed, 0xb0, 0x71, 0x20, - 0xa9, 0x59, 0xb1, 0x92, 0x63, 0x5e, 0x72, 0x30, 0xb8, 0xbe, 0x70, 0x2b, - 0x5d, 0xb8, 0xb5, 0x5e, 0xe9, 0x76, 0xba, 0x74, 0x7b, 0x41, 0xe9, 0xbc, - 0x79, 0x36, 0x99, 0x19, 0x47, 0x3b, 0xee, 0x4f, 0x95, 0x64, 0x0f, 0xd8, - 0x64, 0xeb, 0x30, 0xc1, 0xc2, 0xf6, 0x49, 0xb0, 0xa2, 0xbc, 0xde, 0x1b, - 0xb6, 0xd1, 0x48, 0x0f, 0xc6, 0xab, 0xca, 0xb9, 0x95, 0x2e, 0xde, 0x5a, - 0xb7, 0x7c, 0x3b, 0x5d, 0xbe, 0xad, 0xcb, 0xdf, 0x69, 0x4b, 0x91, 0x3d, - 0xd9, 0x64, 0x43, 0x11, 0xbd, 0xc2, 0x76, 0x32, 0x8c, 0xc8, 0xf9, 0xc8, - 0x0d, 0x5b, 0xa9, 0xa7, 0xbc, 0xa1, 0x55, 0x85, 0xdc, 0x4a, 0x97, 0x6e, - 0xad, 0x59, 0xbc, 0x9d, 0x2e, 0xde, 0x56, 0xc5, 0xef, 0xb4, 0x89, 0xc8, - 0x40, 0x6f, 0xb4, 0x8d, 0x88, 0x60, 0x71, 0x23, 0x25, 0x58, 0x91, 0x73, - 0xfa, 0x9b, 0x36, 0xd3, 0x5c, 0xf9, 0xa3, 0x2b, 0x0b, 0xba, 0x95, 0x2e, - 0xde, 0x5a, 0xb7, 0x7c, 0x3b, 0x5d, 0xbe, 0xad, 0xca, 0xdf, 0x6d, 0x4b, - 0xc9, 0x41, 0x6f, 0x93, 0x4d, 0x25, 0x29, 0x16, 0xb6, 0x55, 0x92, 0x19, - 0x1d, 0x5d, 0xc9, 0xb5, 0x96, 0x14, 0x8a, 0x09, 0xdb, 0xc6, 0xce, 0xdf, - 0x7a, 0x72, 0xd1, 0x91, 0x82, 0x67, 0x31, 0xa2, 0xbb, 0x0d, 0x17, 0x18, - 0x06, 0xf3, 0x31, 0x83, 0x8a, 0x99, 0xa4, 0x6c, 0xd6, 0x23, 0x60, 0x82, - 0x85, 0xa2, 0x4f, 0xb0, 0xa2, 0xc2, 0x7a, 0x0b, 0x04, 0xcf, 0x79, 0x99, - 0xc9, 0x54, 0x5e, 0xaa, 0x27, 0x94, 0x7b, 0xb7, 0x02, 0x65, 0x82, 0xc5, - 0xb2, 0xbc, 0x32, 0xde, 0x57, 0xaa, 0x52, 0x9e, 0xaa, 0x4f, 0x7f, 0x16, - 0xe0, 0x3b, 0x11, 0x50, 0x53, 0x39, 0x7a, 0x32, 0x40, 0x42, 0x4a, 0xcd, - 0x05, 0x6c, 0x17, 0x3b, 0x57, 0xcb, 0xfa, 0xaa, 0xa0, 0x4f, 0x7a, 0xad, - 0xab, 0x4e, 0x29, 0x9f, 0x3f, 0x95, 0x12, 0xd7, 0xcb, 0x94, 0x52, 0xe1, - 0xa7, 0x14, 0xda, 0xae, 0xa2, 0x9b, 0x9a, 0x15, 0xe4, 0x88, 0x3f, 0xb5, - 0x1a, 0xeb, 0x92, 0xa6, 0xab, 0x69, 0xd6, 0xa0, 0x9b, 0x8c, 0x92, 0x2b, - 0xc8, 0xec, 0x24, 0x38, 0x13, 0x9d, 0xa7, 0xb7, 0x64, 0x04, 0xd8, 0xca, - 0x91, 0x99, 0xf9, 0xb2, 0x21, 0x62, 0x18, 0x9e, 0xf9, 0x9a, 0x39, 0x98, - 0x5c, 0x09, 0xe8, 0xf2, 0x36, 0x2f, 0x56, 0xe2, 0x58, 0x79, 0x35, 0x93, - 0x50, 0xcb, 0x02, 0x0d, 0x67, 0xcf, 0x99, 0x15, 0xdc, 0xea, 0x1e, 0x58, - 0x97, 0x0b, 0x8d, 0xd6, 0xaa, 0x7d, 0x3a, 0xe7, 0x79, 0xa7, 0x73, 0x4d, - 0x84, 0x23, 0x67, 0x0a, 0x3e, 0xa0, 0xb7, 0x8e, 0xe8, 0xca, 0x35, 0xef, - 0x39, 0xe3, 0x50, 0x55, 0x8a, 0x7c, 0xd6, 0x4d, 0xe9, 0xf3, 0x9b, 0x02, - 0xc6, 0x8f, 0x27, 0x46, 0x69, 0xc7, 0x84, 0xac, 0x35, 0x17, 0x4a, 0x69, - 0x66, 0xc2, 0xb7, 0xfc, 0x3f, 0xaa, 0x3f, 0xd7, 0x67, 0x2d, 0x09, 0x90, - 0x87, 0xf1, 0x7f, 0x24, 0x00, 0xaa, 0xce, 0x5a, 0xf5, 0xa7, 0x81, 0xfb, - 0xff, 0x49, 0x00, 0x54, 0x9f, 0xf5, 0x24, 0x20, 0xc7, 0xc3, 0x75, 0x44, - 0xf0, 0x5f, 0x51, 0x51, 0xc9, 0xf6, 0x5a, 0x35, 0xc5, 0x40, 0xb5, 0x9e, - 0xb5, 0xdb, 0x54, 0x5d, 0xc0, 0xd8, 0xca, 0x86, 0xeb, 0x2a, 0x79, 0x8d, - 0xc5, 0xab, 0xc9, 0x54, 0x46, 0xa8, 0xe5, 0x7b, 0x54, 0xe8, 0x2c, 0xbf, - 0xba, 0x7e, 0x22, 0x31, 0x42, 0x9c, 0xd3, 0x1d, 0x16, 0xe5, 0x59, 0x80, - 0xf1, 0x76, 0xea, 0xd3, 0x7d, 0xcd, 0xb4, 0xbd, 0x8b, 0xe2, 0x30, 0x15, - 0xcb, 0x0c, 0x15, 0x80, 0x0a, 0xd4, 0x40, 0xf1, 0xeb, 0x37, 0xaf, 0x7f, - 0x8a, 0x12, 0xc7, 0xe2, 0x8f, 0x08, 0xa7, 0x44, 0xba, 0x66, 0x04, 0x80, - 0x03, 0xa1, 0xbc, 0x95, 0x3f, 0xa4, 0xad, 0xfc, 0x52, 0x38, 0x28, 0x93, - 0x74, 0x08, 0x52, 0xbe, 0xb3, 0xdc, 0x4e, 0x63, 0x36, 0xff, 0xb3, 0xf3, - 0xbc, 0x6d, 0x3d, 0x7a, 0x64, 0x71, 0x06, 0x61, 0x99, 0x85, 0xd2, 0x23, - 0x6f, 0x14, 0xbe, 0xa4, 0x2a, 0x92, 0xa3, 0x97, 0x42, 0x13, 0x4e, 0xb1, - 0xbe, 0x2e, 0xe8, 0xc2, 0x28, 0xc5, 0x51, 0x92, 0x94, 0x86, 0x7e, 0x00, - 0x6c, 0x8f, 0x1f, 0x83, 0x46, 0x9c, 0x54, 0x31, 0x98, 0xcd, 0x5f, 0x2c, - 0x83, 0x18, 0x2a, 0x81, 0xd3, 0x38, 0x05, 0x4b, 0x4b, 0x96, 0x4e, 0x66, - 0xfd, 0x3e, 0x46, 0xfc, 0x07, 0xa5, 0x5c, 0x61, 0xf9, 0x98, 0xc7, 0x73, - 0xad, 0x70, 0x2a, 0x09, 0xf4, 0x47, 0xc7, 0xc7, 0xef, 0x8e, 0x1f, 0x58, - 0xb9, 0x17, 0x1f, 0x49, 0x7a, 0x19, 0x5a, 0x57, 0x89, 0x80, 0x2a, 0xb5, - 0x72, 0x85, 0xdb, 0x8b, 0x8f, 0x8e, 0x97, 0xde, 0xbf, 0xa3, 0x5b, 0x63, - 0x2c, 0xd6, 0x80, 0x28, 0x88, 0x5d, 0x47, 0xc9, 0x99, 0x01, 0x7b, 0x79, - 0x54, 0x04, 0xc5, 0x00, 0xa4, 0xb4, 0x8c, 0x36, 0xeb, 0xd4, 0x61, 0x8d, - 0x84, 0x2f, 0xcf, 0x8c, 0xdb, 0x5e, 0x69, 0x5b, 0x89, 0x3e, 0x33, 0xbb, - 0x94, 0xb6, 0x00, 0xcc, 0xbb, 0x34, 0x70, 0xf8, 0x4b, 0xed, 0x87, 0x30, - 0xba, 0x23, 0x57, 0x55, 0x4d, 0x0f, 0x4a, 0xbd, 0xa2, 0xec, 0xa5, 0xf4, - 0xb5, 0xe4, 0xf6, 0x0d, 0x3e, 0x70, 0x8d, 0x4d, 0x43, 0x36, 0x5e, 0xdc, - 0x74, 0xf2, 0xa1, 0x03, 0x5c, 0xb9, 0x29, 0xa3, 0xa0, 0xf6, 0x47, 0x14, - 0x73, 0xd6, 0x93, 0x3b, 0xc5, 0x11, 0xef, 0xdc, 0xad, 0xb0, 0x6a, 0x28, - 0xa1, 0x96, 0xb2, 0x3a, 0xa1, 0x50, 0x77, 0xad, 0x9f, 0x9d, 0xbc, 0x7b, - 0x5b, 0x9f, 0xda, 0x01, 0x9f, 0x7a, 0x2e, 0xd0, 0x33, 0xb5, 0xe3, 0x7c, - 0xa2, 0xc2, 0xd8, 0x8c, 0xd4, 0x5c, 0x85, 0x91, 0xc1, 0x9b, 0x23, 0x10, - 0x9f, 0x99, 0x86, 0x91, 0x9e, 0xc4, 0xc6, 0xc6, 0xfc, 0x65, 0xa8, 0x31, - 0x58, 0x1d, 0x5b, 0x98, 0xb8, 0x42, 0xf1, 0x83, 0x3a, 0xb5, 0x61, 0x5e, - 0xed, 0x56, 0xfc, 0x67, 0xa6, 0x06, 0x4c, 0x5b, 0x1e, 0x5e, 0xb9, 0x54, - 0xb7, 0xc9, 0x1a, 0x6c, 0x55, 0xbc, 0x4b, 0x4f, 0x3e, 0x32, 0x9c, 0x9e, - 0x04, 0x99, 0xbf, 0xbc, 0x66, 0xe7, 0x93, 0xd7, 0xee, 0x01, 0xba, 0x7d, - 0xd5, 0xd9, 0xfa, 0x95, 0x5f, 0x3c, 0x87, 0x93, 0x6b, 0x7d, 0x3c, 0xc0, - 0x03, 0xcf, 0xac, 0xc2, 0x29, 0xc7, 0x1c, 0x18, 0x3d, 0x89, 0x34, 0x83, - 0x11, 0x1b, 0xf2, 0xe7, 0x27, 0x1e, 0x3a, 0x56, 0xcf, 0x0e, 0xca, 0x49, - 0xe0, 0xf8, 0x3e, 0xd3, 0xaa, 0xa5, 0x76, 0x1c, 0xd2, 0x34, 0xa6, 0xd1, - 0x28, 0xea, 0x64, 0x94, 0x96, 0xeb, 0x00, 0xcf, 0x79, 0xdb, 0xd9, 0x4a, - 0x3d, 0x40, 0xee, 0x50, 0xbb, 0x56, 0xfd, 0x0b, 0x95, 0x5f, 0x96, 0xbd, - 0x73, 0xc5, 0xff, 0x77, 0x79, 0x47, 0xa2, 0xdc, 0x3a, 0x11, 0xfb, 0x15, - 0x13, 0x8e, 0xe7, 0x40, 0x92, 0x36, 0xe9, 0xeb, 0x03, 0x5e, 0x08, 0x0c, - 0x94, 0x73, 0x86, 0x6b, 0xe8, 0xe3, 0x9a, 0x4e, 0xe7, 0x4d, 0x92, 0xba, - 0x6d, 0x20, 0x4d, 0x82, 0xed, 0xd0, 0x76, 0x4a, 0x19, 0xfe, 0x90, 0x5f, - 0x42, 0xd2, 0xee, 0x5a, 0x7b, 0xd9, 0x5e, 0x9b, 0x86, 0xb3, 0x03, 0x2f, - 0xc9, 0xae, 0xa4, 0xd5, 0x6a, 0xb5, 0xda, 0x5b, 0x22, 0xcf, 0x31, 0x41, - 0xaa, 0x0f, 0x50, 0x8c, 0xed, 0xef, 0x16, 0x00, 0x52, 0x5c, 0x83, 0x8c, - 0x9c, 0xbe, 0x21, 0xab, 0xc0, 0x10, 0x13, 0x03, 0x61, 0x5c, 0x4b, 0xba, - 0xb8, 0xbd, 0x57, 0x4a, 0x9a, 0x21, 0x26, 0x26, 0x46, 0x20, 0xf1, 0xcd, - 0x3a, 0x2d, 0x27, 0xce, 0x10, 0x13, 0x03, 0x23, 0x94, 0x38, 0x5e, 0x28, - 0xac, 0x26, 0x4e, 0x10, 0x13, 0x13, 0x23, 0x90, 0x38, 0xde, 0x4c, 0xac, - 0x26, 0x4e, 0x10, 0x13, 0x13, 0xa3, 0x9e, 0xb8, 0xb8, 0xe2, 0x08, 0xe9, - 0x65, 0xc4, 0x15, 0xc4, 0x44, 0x03, 0x0f, 0x22, 0x3b, 0x5f, 0xe5, 0xd5, - 0x64, 0x09, 0x62, 0xc2, 0xe0, 0x01, 0x72, 0x96, 0x17, 0x2e, 0xa3, 0x28, - 0xdc, 0x30, 0xcb, 0xe2, 0x18, 0x73, 0xa2, 0x53, 0x1a, 0x57, 0x63, 0x69, - 0x97, 0x35, 0x01, 0xcf, 0x24, 0x05, 0xe6, 0x69, 0xbe, 0xdc, 0xe2, 0xe0, - 0xd8, 0xf9, 0x96, 0x86, 0xec, 0x00, 0x63, 0xea, 0x56, 0x67, 0xb3, 0x58, - 0x55, 0x4b, 0x89, 0x20, 0x26, 0x1a, 0x78, 0x90, 0x94, 0xe8, 0xd2, 0x69, - 0x29, 0x59, 0x86, 0x98, 0xe8, 0x08, 0x01, 0x0d, 0x40, 0x97, 0x54, 0xe9, - 0x7e, 0x6a, 0x05, 0x75, 0xe7, 0x26, 0x2b, 0x14, 0x63, 0x21, 0xff, 0x2f, - 0xc6, 0x13, 0x25, 0x3f, 0x57, 0x99, 0x40, 0x5d, 0x03, 0x2b, 0x40, 0x0b, - 0x3e, 0xe0, 0x1d, 0x0c, 0x37, 0xa4, 0xe1, 0xf1, 0xba, 0x71, 0x9e, 0xdd, - 0xe9, 0x40, 0xb1, 0xf5, 0x93, 0xda, 0xd6, 0xe4, 0x45, 0xe4, 0x5c, 0xbd, - 0x10, 0xff, 0xce, 0xff, 0xbe, 0x0b, 0x61, 0x6c, 0xa2, 0x07, 0x80, 0x8c, - 0x02, 0x60, 0x0e, 0x2c, 0x98, 0x7b, 0xff, 0x66, 0x24, 0xb5, 0x9e, 0x98, - 0xb8, 0xe2, 0x9c, 0xa7, 0x17, 0x51, 0xe4, 0x5c, 0x12, 0xba, 0x67, 0xfa, - 0x89, 0x80, 0x4f, 0x23, 0x1c, 0xc8, 0x11, 0x78, 0x40, 0x13, 0x28, 0x1c, - 0xce, 0xa3, 0x7e, 0xf4, 0xc9, 0xfb, 0x5a, 0xc6, 0xe2, 0x4c, 0xa6, 0x7e, - 0x4c, 0x42, 0xd1, 0x72, 0x84, 0x94, 0xba, 0xda, 0xed, 0x08, 0x0c, 0x79, - 0x3c, 0x51, 0x62, 0x57, 0x0e, 0xef, 0xa4, 0xe4, 0xe3, 0xce, 0xfb, 0x9f, - 0x7c, 0xd3, 0xd1, 0xa1, 0xb3, 0xcd, 0xaa, 0x02, 0xfa, 0xf8, 0xcb, 0x77, - 0x3f, 0x37, 0xc0, 0x17, 0xf3, 0x75, 0x05, 0xf8, 0x27, 0x06, 0xec, 0x2c, - 0xaf, 0x22, 0xfd, 0xde, 0xd7, 0xcf, 0x9e, 0x7d, 0x61, 0x12, 0x9f, 0x35, - 0xe2, 0x3c, 0xbf, 0xc9, 0x5d, 0x68, 0x58, 0xc3, 0x91, 0x2a, 0xc5, 0x96, - 0x3c, 0x63, 0x4b, 0x94, 0x5d, 0x45, 0x0a, 0x0b, 0xc5, 0xd7, 0xc6, 0x09, - 0x5c, 0xf6, 0xc2, 0x5b, 0x24, 0x31, 0x90, 0xd5, 0xb2, 0x4c, 0x95, 0x34, - 0x42, 0x3c, 0x4b, 0x20, 0x48, 0x33, 0xf0, 0x01, 0xa9, 0xab, 0x65, 0x81, - 0x01, 0x43, 0x54, 0x15, 0x3c, 0x9a, 0x73, 0x90, 0x91, 0x89, 0x62, 0x89, - 0x93, 0xc9, 0x33, 0x12, 0xbc, 0x50, 0x80, 0x3c, 0x67, 0x3b, 0x1c, 0x81, - 0x63, 0x89, 0x81, 0x9b, 0xe2, 0x8c, 0x65, 0xb0, 0x69, 0x05, 0x17, 0xd7, - 0x0b, 0x2d, 0xbd, 0xe0, 0x56, 0xec, 0x39, 0x17, 0x0f, 0x2a, 0x24, 0x12, - 0x34, 0xb8, 0x49, 0x1c, 0x12, 0x56, 0x90, 0x0a, 0xc4, 0x29, 0x28, 0xb7, - 0x1d, 0xc6, 0x9a, 0xd1, 0x0c, 0x9b, 0x17, 0x6b, 0xca, 0x4a, 0xeb, 0x51, - 0x5a, 0x07, 0x46, 0xef, 0x44, 0x1d, 0xda, 0xbc, 0x7f, 0x3e, 0x5b, 0xdf, - 0x3c, 0x87, 0x23, 0x00, 0xa0, 0x98, 0xc8, 0xe0, 0xde, 0xd1, 0x53, 0x2d, - 0x4f, 0x23, 0x5b, 0x26, 0xa0, 0x7c, 0x7d, 0x71, 0xb1, 0x4c, 0x44, 0xa7, - 0xa3, 0x75, 0x3d, 0x4b, 0x08, 0x95, 0xbc, 0xc2, 0xb6, 0x40, 0xb6, 0xd9, - 0x84, 0x50, 0x8a, 0x6a, 0xc2, 0x33, 0x4b, 0x3b, 0x00, 0xb4, 0x2c, 0x6b, - 0x96, 0xeb, 0x59, 0x46, 0x79, 0x1c, 0x29, 0x3e, 0xca, 0xae, 0x9e, 0x44, - 0x57, 0x67, 0x8f, 0xa3, 0x25, 0x9c, 0x94, 0xdf, 0x2c, 0x47, 0xa8, 0x96, - 0x71, 0xb9, 0x70, 0x22, 0x91, 0x48, 0xc2, 0x20, 0x8d, 0xad, 0xb4, 0xa8, - 0x62, 0x05, 0xdc, 0x35, 0xb8, 0x02, 0x56, 0x6c, 0x0b, 0x95, 0x26, 0x1c, - 0x2e, 0x42, 0xac, 0x2d, 0xda, 0x8d, 0x63, 0x9d, 0x83, 0x83, 0x97, 0x3b, - 0xe3, 0x60, 0xec, 0xfe, 0xd9, 0x7a, 0x85, 0x24, 0x40, 0xd5, 0xde, 0xcd, - 0x61, 0x0d, 0x01, 0x3d, 0x22, 0xa1, 0x07, 0xd7, 0xeb, 0x1f, 0x21, 0x6f, - 0x9a, 0x5d, 0x4e, 0xd3, 0x14, 0x5f, 0x9b, 0x23, 0xdd, 0xde, 0x70, 0x7f, - 0x3f, 0xa8, 0xbe, 0xa0, 0x77, 0xb2, 0x3f, 0x56, 0x0c, 0xb2, 0x7a, 0x7c, - 0x8c, 0x71, 0xed, 0x4a, 0x6a, 0xbb, 0xa0, 0x4d, 0x28, 0xf0, 0xd3, 0xba, - 0x5e, 0xd5, 0xae, 0xa7, 0x2c, 0x7b, 0x6e, 0x8a, 0xd6, 0x5e, 0x47, 0xe5, - 0x57, 0x1b, 0x7e, 0x42, 0x15, 0xb6, 0xa4, 0x7a, 0xc7, 0x5c, 0x3b, 0x81, - 0x1e, 0xdc, 0xdd, 0x9b, 0xfb, 0x81, 0x5f, 0x89, 0x7b, 0x64, 0x45, 0x88, - 0xef, 0xa2, 0x84, 0xeb, 0x45, 0x7e, 0x29, 0x3c, 0x64, 0x47, 0x20, 0xf8, - 0x8c, 0x91, 0xce, 0xa1, 0xc7, 0xc7, 0xf2, 0x3d, 0x17, 0x0c, 0x4f, 0x05, - 0x46, 0xd7, 0xb7, 0x97, 0xf4, 0x82, 0xca, 0xb5, 0x7d, 0xb6, 0x42, 0x7a, - 0x97, 0xa6, 0x5d, 0x90, 0xbb, 0x4d, 0x4a, 0xf7, 0x33, 0x62, 0xad, 0xd2, - 0x78, 0xb2, 0x75, 0xda, 0x75, 0xe7, 0x6e, 0x46, 0x3e, 0x48, 0xc6, 0x46, - 0xf1, 0x4f, 0x6f, 0xc8, 0x45, 0x44, 0x21, 0xec, 0x07, 0x58, 0xaf, 0xca, - 0x4d, 0x30, 0x0e, 0x8b, 0xf9, 0xb9, 0xd8, 0x7f, 0xaa, 0x9d, 0xe6, 0x28, - 0x15, 0xc0, 0x40, 0x20, 0x72, 0x73, 0x2d, 0x5a, 0x5a, 0x41, 0xb5, 0x0d, - 0x5d, 0x70, 0xfd, 0xa3, 0x43, 0x31, 0x01, 0x73, 0x0b, 0xab, 0xca, 0x3c, - 0xa9, 0x88, 0x3e, 0x53, 0xa7, 0xc3, 0x1c, 0xcc, 0x5d, 0xc6, 0xbd, 0xcf, - 0x22, 0x7c, 0x60, 0x00, 0x66, 0x5d, 0x44, 0x85, 0x8f, 0xce, 0xd3, 0xf5, - 0x95, 0x0a, 0x02, 0xaf, 0xc7, 0x8f, 0x1f, 0xf0, 0x2e, 0x9f, 0x71, 0x00, - 0x29, 0x64, 0x96, 0xac, 0x50, 0x5e, 0xae, 0x0e, 0x11, 0x51, 0x50, 0x22, - 0xbd, 0xbf, 0xf9, 0xf5, 0x48, 0x03, 0xb0, 0x55, 0x09, 0x69, 0xb8, 0xba, - 0xe4, 0xef, 0x62, 0x04, 0x5b, 0xaa, 0x6d, 0xa5, 0x87, 0xa8, 0x88, 0x06, - 0xaa, 0x37, 0xb1, 0x55, 0xaf, 0x12, 0xde, 0x34, 0x23, 0x94, 0x66, 0xeb, - 0x22, 0x7f, 0x28, 0x51, 0x26, 0x71, 0x61, 0xaf, 0x66, 0xeb, 0xb3, 0x5b, - 0xdb, 0x88, 0xc9, 0x39, 0xc9, 0xa4, 0xac, 0x64, 0x91, 0x0f, 0x48, 0xc5, - 0xfc, 0xd3, 0xdc, 0xde, 0xc3, 0x5f, 0xd6, 0xf6, 0x9e, 0x31, 0x7a, 0x90, - 0xbd, 0x52, 0xf8, 0x4e, 0x83, 0xf2, 0x83, 0xc8, 0x01, 0xcd, 0x4b, 0xbf, - 0x38, 0x2f, 0xe6, 0x13, 0xb0, 0xe7, 0xd7, 0x1f, 0x72, 0xd3, 0x79, 0x69, - 0xe7, 0xa9, 0xa7, 0x75, 0x68, 0xb7, 0xf9, 0x25, 0x28, 0x82, 0xf6, 0x9d, - 0x05, 0xbb, 0x72, 0xda, 0xdb, 0x23, 0x7c, 0xff, 0xf2, 0xc4, 0x9a, 0x28, - 0x1b, 0x27, 0x11, 0x6e, 0xb3, 0xb3, 0x24, 0xac, 0x3e, 0x61, 0x76, 0x22, - 0xe3, 0xdc, 0x01, 0x44, 0x76, 0xf5, 0x3e, 0xe0, 0xc9, 0xc3, 0x87, 0x0f, - 0xe5, 0xcf, 0xd8, 0x98, 0x72, 0x2e, 0xd7, 0x33, 0x99, 0xff, 0x1e, 0x7c, - 0x8d, 0x4f, 0xc8, 0xdc, 0x0a, 0x93, 0xb1, 0x38, 0xbf, 0x2d, 0x24, 0xd7, - 0x3d, 0xed, 0x45, 0x77, 0xe2, 0xc9, 0xe8, 0x23, 0xec, 0x85, 0x0b, 0xf1, - 0x32, 0x77, 0x0f, 0x07, 0x89, 0x47, 0x8a, 0xe7, 0xa2, 0x44, 0x39, 0x02, - 0xc7, 0x8f, 0x14, 0xfa, 0xa3, 0x1e, 0x95, 0xd4, 0x8b, 0x1e, 0x19, 0xc3, - 0x0b, 0x9d, 0x95, 0x7b, 0x17, 0x06, 0xc7, 0x80, 0x2e, 0x62, 0x0a, 0xf5, - 0x0a, 0xaa, 0xdd, 0xfa, 0xb1, 0x2b, 0x01, 0xd3, 0xa5, 0x61, 0x58, 0xc3, - 0xd6, 0x43, 0x58, 0x48, 0x8d, 0xc5, 0xaf, 0x8f, 0x8e, 0x3e, 0x38, 0x3e, - 0xb6, 0x1a, 0x00, 0xed, 0x5c, 0x8f, 0x87, 0x94, 0x90, 0xa5, 0xad, 0xdd, - 0x03, 0x68, 0xcc, 0x82, 0x69, 0x40, 0x26, 0x0e, 0x41, 0x80, 0xe2, 0x01, - 0x2d, 0x72, 0x1b, 0x5b, 0xeb, 0xa2, 0x0b, 0x81, 0x58, 0xc4, 0xec, 0x59, - 0xf5, 0x8f, 0x60, 0x93, 0x2e, 0x16, 0xfd, 0x42, 0x20, 0x9e, 0x9a, 0xb6, - 0xaf, 0x5f, 0xe0, 0x3a, 0xde, 0x1e, 0x02, 0xcc, 0x69, 0x6e, 0x22, 0x2e, - 0xb8, 0xb8, 0x1d, 0xf5, 0x05, 0xed, 0x67, 0x71, 0x24, 0x53, 0x3a, 0x21, - 0x6f, 0x3e, 0x0f, 0xc7, 0xae, 0xb3, 0x59, 0xe3, 0x2c, 0x26, 0xc4, 0xb4, - 0x68, 0x07, 0x48, 0x3a, 0x63, 0xa0, 0x7f, 0x48, 0xc4, 0x31, 0x3c, 0x5e, - 0x9a, 0x19, 0xf6, 0xb9, 0x24, 0x06, 0xf8, 0x5e, 0x34, 0x34, 0x6f, 0xdd, - 0x13, 0x61, 0x97, 0x2e, 0x1a, 0xfb, 0x10, 0xca, 0x78, 0x78, 0x61, 0xb3, - 0x7a, 0xef, 0xed, 0x94, 0x62, 0xf1, 0x4d, 0x07, 0x1a, 0x19, 0x2d, 0xc1, - 0x7d, 0xf4, 0x64, 0x83, 0x69, 0x4d, 0xb6, 0x5e, 0x1d, 0xab, 0x58, 0x37, - 0x70, 0x12, 0x0b, 0x5b, 0x32, 0x4b, 0xb8, 0x91, 0x53, 0xb0, 0x65, 0xdf, - 0x02, 0x8c, 0x44, 0xbe, 0x64, 0xc4, 0x28, 0xbf, 0x08, 0xff, 0x4f, 0xe0, - 0x4f, 0x81, 0x01, 0x09, 0xcc, 0x36, 0x33, 0x3a, 0x06, 0x0d, 0x8c, 0x4c, - 0x40, 0x79, 0x61, 0x4c, 0x3b, 0x90, 0x85, 0x52, 0x3c, 0x93, 0xea, 0xec, - 0xbd, 0xdb, 0x23, 0xb5, 0x68, 0x89, 0x3b, 0x82, 0x25, 0x7a, 0x1e, 0xff, - 0x7c, 0x99, 0x5c, 0x80, 0x3d, 0x52, 0x13, 0x72, 0x1e, 0xfc, 0x17, 0xb4, - 0x27, 0x02, 0x1f, 0x6f, 0x45, 0x37, 0xf2, 0xe8, 0x08, 0x7e, 0xbd, 0xf6, - 0x9a, 0x21, 0xf3, 0x9b, 0x93, 0xc5, 0xa9, 0xbe, 0x1a, 0xa2, 0x04, 0xff, - 0x43, 0x08, 0x5e, 0xb8, 0xbe, 0x29, 0x1f, 0x43, 0x70, 0xca, 0x41, 0xc7, - 0x6a, 0x1c, 0xa8, 0x45, 0xfd, 0xa3, 0x2e, 0x57, 0x46, 0x37, 0x26, 0x2f, - 0x75, 0x8c, 0x1c, 0x38, 0x8c, 0xbc, 0xd9, 0xd1, 0xc5, 0x9d, 0xc8, 0x77, - 0xae, 0x22, 0xd6, 0x4f, 0x34, 0x5d, 0x9d, 0x15, 0x57, 0xaa, 0xf2, 0xb5, - 0xd5, 0x10, 0x80, 0x65, 0x5d, 0xd1, 0xe7, 0xc6, 0x3f, 0xe9, 0xa4, 0xc8, - 0xab, 0xd4, 0x0e, 0xe8, 0x13, 0x43, 0xe8, 0x94, 0xf2, 0x07, 0x2d, 0xfe, - 0x4e, 0xf5, 0x4b, 0xeb, 0x5e, 0x02, 0x17, 0x61, 0x04, 0x66, 0x80, 0xe9, - 0xc5, 0x9f, 0x85, 0xe1, 0xe3, 0xee, 0x9b, 0x9f, 0xc0, 0x75, 0x18, 0x01, - 0xef, 0x25, 0x8f, 0xca, 0x4b, 0x11, 0xee, 0x85, 0x88, 0x7b, 0xeb, 0x9e, - 0x9a, 0x77, 0x52, 0x0c, 0x63, 0x43, 0x31, 0xcd, 0xa2, 0xe6, 0x50, 0x3f, - 0x64, 0xbb, 0x70, 0x8f, 0xc0, 0x8c, 0x2a, 0x75, 0x52, 0x88, 0x4e, 0x17, - 0xa0, 0x8b, 0x11, 0xfa, 0xfc, 0x97, 0xca, 0xf7, 0x4e, 0x7c, 0xed, 0x59, - 0x2f, 0x62, 0xfa, 0x67, 0xbd, 0x48, 0x97, 0x7c, 0x76, 0x55, 0xed, 0x9f, - 0x41, 0x94, 0xad, 0x4f, 0x78, 0xff, 0x0c, 0xff, 0x24, 0x8e, 0xb5, 0xc0, - 0xa6, 0x86, 0xea, 0xf4, 0x88, 0x51, 0x17, 0xd8, 0xbb, 0x66, 0x3e, 0x41, - 0xd8, 0xd3, 0x41, 0x11, 0x3b, 0x94, 0xb1, 0x08, 0xc4, 0xd8, 0x5f, 0x10, - 0x64, 0xac, 0xae, 0x49, 0x50, 0x4a, 0x43, 0x8c, 0xd1, 0x6f, 0xcc, 0x00, - 0x8d, 0xae, 0xbf, 0x9e, 0x41, 0x5f, 0x5a, 0x5f, 0x25, 0xf9, 0x25, 0x50, - 0x8a, 0x2e, 0x93, 0x34, 0xb1, 0x66, 0x8b, 0xb4, 0x14, 0xc9, 0xa4, 0x3f, - 0x98, 0xaa, 0x96, 0x94, 0x40, 0xdc, 0x94, 0x8c, 0xa6, 0x38, 0x06, 0x5d, - 0xb5, 0xb3, 0x1a, 0xf0, 0x4a, 0xc7, 0x54, 0x30, 0xf7, 0xb3, 0xc8, 0xaa, - 0xd2, 0xca, 0x4b, 0x74, 0x2b, 0x24, 0x8f, 0x2f, 0x2b, 0xeb, 0x23, 0x61, - 0xb8, 0x3a, 0x2a, 0x41, 0xd1, 0xb6, 0x8f, 0x46, 0x4d, 0xb0, 0x26, 0x35, - 0x73, 0xce, 0x58, 0xad, 0xb2, 0xc6, 0xae, 0x10, 0x3a, 0x47, 0x97, 0x60, - 0x13, 0x6c, 0xcc, 0xae, 0xaf, 0xb2, 0x7c, 0xbe, 0x5a, 0x51, 0xdb, 0x02, - 0x48, 0x55, 0x97, 0xd1, 0xec, 0xfa, 0x16, 0x19, 0x36, 0x60, 0xf3, 0x1a, - 0x6b, 0xac, 0x31, 0x99, 0x8a, 0x3a, 0x5f, 0x61, 0xa5, 0x1d, 0xe4, 0xf2, - 0x5a, 0xc3, 0x41, 0x6f, 0x7d, 0xad, 0x01, 0x88, 0x6b, 0xad, 0x52, 0xdc, - 0x5a, 0xab, 0x0c, 0x0b, 0xb0, 0x6d, 0xad, 0x25, 0x6b, 0xea, 0x7b, 0x65, - 0xad, 0x37, 0x50, 0x6b, 0x07, 0xd9, 0x5f, 0x6b, 0x75, 0x02, 0x5d, 0x5b, - 0x6b, 0x04, 0xe2, 0x5a, 0xab, 0x14, 0xa7, 0xd6, 0x2a, 0xc3, 0x06, 0x6c, - 0x59, 0x6b, 0xc1, 0x1a, 0x93, 0xa9, 0xaa, 0xf5, 0x16, 0x6a, 0xed, 0x20, - 0x57, 0xb4, 0x35, 0xcc, 0x36, 0x6a, 0x6b, 0x8d, 0x40, 0x5c, 0x6b, 0x95, - 0xe2, 0xd4, 0x5a, 0x65, 0xd8, 0x80, 0x2d, 0x6b, 0x2d, 0x58, 0x63, 0x32, - 0x55, 0xb5, 0xc6, 0xa1, 0xde, 0x41, 0xf6, 0xd6, 0x1a, 0x86, 0x5a, 0xe9, - 0x2f, 0xa8, 0xbc, 0xda, 0x6a, 0x6a, 0x0b, 0x80, 0xfa, 0x08, 0x6b, 0xcd, - 0x31, 0xcd, 0x5b, 0x01, 0x6a, 0xa2, 0xb9, 0xe3, 0x61, 0x73, 0x51, 0x33, - 0x66, 0x2e, 0x38, 0x5b, 0xab, 0x6a, 0xfd, 0x10, 0xc9, 0xb0, 0xe6, 0x54, - 0x4a, 0x26, 0x8e, 0x2d, 0xa8, 0x26, 0xfd, 0x57, 0xa7, 0x03, 0x64, 0x99, - 0x46, 0x79, 0x83, 0x1e, 0x67, 0xd0, 0x9e, 0x06, 0xa2, 0xaf, 0x2d, 0xc9, - 0x39, 0x91, 0xcc, 0xcf, 0x82, 0x5a, 0x73, 0xbe, 0x62, 0x9b, 0xa5, 0x23, - 0xab, 0x3a, 0x9b, 0x4d, 0xea, 0x02, 0xb6, 0x50, 0x65, 0x75, 0x67, 0xc4, - 0x2d, 0xcf, 0xaf, 0xca, 0x19, 0x56, 0xdd, 0x44, 0x36, 0xc6, 0x6a, 0x68, - 0xc2, 0x24, 0x8a, 0x35, 0x21, 0x9e, 0x2f, 0xd2, 0x2c, 0xa7, 0x96, 0x75, - 0xf6, 0x47, 0x18, 0x4a, 0xba, 0xe6, 0x23, 0x30, 0x3f, 0xb2, 0x67, 0xb1, - 0xdf, 0x4e, 0xed, 0xff, 0x8c, 0xea, 0x37, 0x53, 0xff, 0x80, 0x2e, 0x10, - 0xdc, 0x0d, 0xb4, 0x6a, 0x87, 0x77, 0x07, 0x43, 0x19, 0x37, 0x8b, 0x55, - 0xbd, 0x0e, 0x02, 0x90, 0xaa, 0x30, 0x22, 0x78, 0xf4, 0x0e, 0x52, 0x39, - 0xbf, 0x95, 0xba, 0x09, 0x46, 0xe0, 0xdf, 0x2a, 0x2d, 0x53, 0x83, 0x23, - 0xe3, 0x78, 0x7b, 0x18, 0xde, 0xee, 0xa9, 0xaf, 0x15, 0x42, 0x95, 0x2f, - 0x45, 0x18, 0x66, 0xf7, 0xe6, 0x31, 0x60, 0x55, 0xc1, 0xec, 0x88, 0x75, - 0x85, 0x06, 0x8d, 0x89, 0xf5, 0xa6, 0x92, 0xa0, 0xdc, 0x86, 0xc3, 0xe4, - 0x31, 0x43, 0xb4, 0x6a, 0x3a, 0x29, 0x6e, 0xfc, 0xa8, 0x6a, 0x3c, 0x5c, - 0x9a, 0x5b, 0x58, 0xde, 0xd6, 0x23, 0x3f, 0x78, 0xd5, 0xcd, 0x77, 0x41, - 0x30, 0x85, 0x80, 0xe9, 0x97, 0x25, 0x5b, 0xf0, 0x7e, 0xdc, 0xe9, 0x19, - 0x57, 0xd5, 0xfa, 0x43, 0x1d, 0xde, 0xea, 0x22, 0x94, 0xc4, 0xd9, 0x8d, - 0xa6, 0x7a, 0x4c, 0x00, 0xa8, 0xe1, 0x67, 0xd5, 0x18, 0x71, 0x82, 0x52, - 0x60, 0x8c, 0x12, 0x09, 0xac, 0x37, 0xb5, 0x02, 0x58, 0x6f, 0xb8, 0xfe, - 0xf0, 0xa3, 0x51, 0xf5, 0x01, 0xdc, 0xac, 0x3d, 0xa4, 0x68, 0x99, 0xcd, - 0xeb, 0x4e, 0xfc, 0xe2, 0x47, 0x45, 0xcd, 0x4f, 0xa1, 0xe6, 0x0c, 0xef, - 0xad, 0xf8, 0x7c, 0xbd, 0x0d, 0x99, 0xe1, 0x20, 0x18, 0xb7, 0x3e, 0xfd, - 0x72, 0x54, 0x9b, 0xea, 0xcc, 0x10, 0x8d, 0xc6, 0x7e, 0xfb, 0x86, 0x23, - 0xe1, 0x57, 0xa9, 0xf6, 0xdc, 0x54, 0xed, 0x39, 0x8f, 0xfc, 0x6d, 0xd4, - 0xb3, 0x45, 0x93, 0x1a, 0x52, 0x14, 0xc1, 0x70, 0xeb, 0xc5, 0x28, 0xe0, - 0xaa, 0x4c, 0x20, 0x43, 0xfd, 0x83, 0x8c, 0xa0, 0x60, 0xc8, 0x31, 0x83, - 0x22, 0xb9, 0xde, 0x10, 0x4a, 0x38, 0xa5, 0x2f, 0xb1, 0x7d, 0xa3, 0xf2, - 0x15, 0x0c, 0x14, 0x8c, 0x38, 0x0c, 0xdc, 0x4a, 0x75, 0x04, 0xb5, 0x89, - 0x59, 0xde, 0x2f, 0x91, 0x8c, 0x32, 0xcc, 0xbf, 0x65, 0x8c, 0x5e, 0x4e, - 0x10, 0x21, 0x77, 0xab, 0xd4, 0x6d, 0x0d, 0xea, 0x66, 0x97, 0xe4, 0xd3, - 0x04, 0x55, 0x58, 0x90, 0x2a, 0x20, 0x60, 0x80, 0x2e, 0x20, 0xd8, 0x3f, - 0x4b, 0x19, 0x90, 0x23, 0x47, 0x1b, 0x64, 0x7a, 0x90, 0x3a, 0x20, 0x60, - 0xa5, 0x3e, 0x0c, 0x47, 0x88, 0xc4, 0xd0, 0x2d, 0xf6, 0x7b, 0xfe, 0x39, - 0x0a, 0x41, 0xc4, 0x83, 0x34, 0x82, 0x20, 0x03, 0x54, 0x82, 0xe0, 0xfe, - 0x59, 0x3a, 0x41, 0x2c, 0x39, 0x4a, 0xa1, 0x32, 0x82, 0xb4, 0x82, 0x20, - 0xab, 0xd4, 0x02, 0x8c, 0x84, 0x09, 0xfc, 0x6f, 0xd6, 0x0a, 0xa0, 0x15, - 0x66, 0x26, 0x00, 0x30, 0xc4, 0x4c, 0x00, 0xd8, 0x3f, 0xcc, 0x4c, 0x20, - 0x47, 0xae, 0x46, 0x50, 0x7a, 0x98, 0x99, 0x00, 0xc0, 0x4a, 0x33, 0xf1, - 0xa4, 0xab, 0x83, 0xfe, 0x3b, 0x6d, 0x04, 0xf9, 0xee, 0x26, 0xd7, 0xdd, - 0xee, 0xc9, 0x83, 0xe6, 0xd7, 0xbb, 0xdd, 0x01, 0x84, 0x79, 0x23, 0x6a, - 0x22, 0xd0, 0x85, 0xb4, 0xb3, 0x13, 0xfa, 0xa1, 0x4e, 0xfa, 0x3e, 0xc1, - 0xb3, 0xef, 0x53, 0xc1, 0x82, 0x7f, 0xd5, 0x3a, 0xff, 0xb1, 0x7a, 0xdf, - 0x53, 0x40, 0xe0, 0x45, 0x5d, 0xd6, 0x56, 0x91, 0x36, 0xa0, 0x73, 0x78, - 0x72, 0xc5, 0xc1, 0x57, 0x7a, 0x34, 0x77, 0xe6, 0xe2, 0x7a, 0xd3, 0x7c, - 0x91, 0xce, 0x19, 0x15, 0x8f, 0x1b, 0xd3, 0xe9, 0xb5, 0x76, 0x46, 0x09, - 0xe7, 0x67, 0x74, 0x6f, 0x90, 0xd2, 0xc5, 0xc9, 0x9a, 0x64, 0x2a, 0x5f, - 0xcb, 0xfb, 0x82, 0x8a, 0x38, 0x17, 0xde, 0x68, 0x2b, 0xd5, 0xcb, 0x1b, - 0xf0, 0x6c, 0xd6, 0x02, 0x6e, 0x1d, 0x14, 0xcc, 0x46, 0x85, 0x27, 0x76, - 0xc9, 0xb5, 0x9f, 0xf3, 0x92, 0x0d, 0xc6, 0xdc, 0x79, 0xf5, 0x51, 0x6d, - 0x0f, 0xf2, 0xbe, 0x83, 0xa0, 0xc4, 0xe5, 0xa5, 0xc6, 0x72, 0x2f, 0x7d, - 0x66, 0x52, 0x8a, 0xdd, 0x66, 0x0b, 0xcb, 0x53, 0x9d, 0x4a, 0xbe, 0xac, - 0xdb, 0x5e, 0x55, 0xa0, 0xe1, 0xaf, 0x3f, 0x7c, 0x54, 0x66, 0x17, 0xa4, - 0x2e, 0x9d, 0x6e, 0xf3, 0x7b, 0xe4, 0x6e, 0xb7, 0x4e, 0x86, 0x20, 0xf4, - 0x68, 0x57, 0x7f, 0xf6, 0x05, 0x9f, 0x1d, 0xd7, 0xbb, 0xd3, 0x29, 0xaf, - 0xe7, 0xfe, 0x43, 0xd6, 0x53, 0xab, 0x97, 0x77, 0x15, 0xba, 0xbc, 0x9a, - 0x2e, 0x56, 0xb5, 0x37, 0x23, 0xfa, 0x08, 0xa5, 0x74, 0x5e, 0x61, 0xb9, - 0x76, 0x53, 0x8b, 0xd8, 0xa0, 0x83, 0x36, 0xda, 0x27, 0xf3, 0x11, 0x83, - 0x32, 0xb4, 0x32, 0x9d, 0xb3, 0xef, 0xcb, 0xe4, 0x86, 0xc0, 0xaa, 0x58, - 0x61, 0xe8, 0xdb, 0xc5, 0x4f, 0x68, 0x5c, 0x62, 0xba, 0x23, 0xfd, 0x09, - 0x8c, 0xc5, 0x0a, 0x5d, 0x5e, 0x6d, 0x8b, 0x87, 0xbd, 0x51, 0xb7, 0x37, - 0x7c, 0xd2, 0x7d, 0x75, 0xf4, 0xe6, 0x9b, 0xdd, 0xd7, 0xca, 0xe1, 0x0e, - 0x14, 0xdc, 0xe1, 0x1b, 0xaf, 0x57, 0xc1, 0x1d, 0x2a, 0xb8, 0xe1, 0xf0, - 0x71, 0xb7, 0xbb, 0x37, 0x84, 0x9b, 0x5b, 0x21, 0x4e, 0x7e, 0xf3, 0xf5, - 0x7a, 0x39, 0x9b, 0x36, 0xe8, 0x3c, 0x54, 0x68, 0x08, 0xe5, 0xf3, 0xf5, - 0x3a, 0x4f, 0x76, 0x41, 0xd8, 0x66, 0x59, 0xb5, 0x4a, 0x0c, 0x32, 0x27, - 0x7f, 0xaa, 0xa3, 0x43, 0xb4, 0xe2, 0x8f, 0x5e, 0x1c, 0x0e, 0x87, 0x8f, - 0xa2, 0xa7, 0xf0, 0xe5, 0x83, 0x0f, 0x3e, 0x78, 0x14, 0x42, 0x99, 0x58, - 0xde, 0x1d, 0x61, 0x7a, 0x9a, 0xd2, 0x8e, 0xba, 0xdd, 0x9f, 0x30, 0x96, - 0x49, 0x7d, 0x7f, 0x42, 0x28, 0xd5, 0x9f, 0x14, 0x56, 0x59, 0x7f, 0xc2, - 0x3c, 0x1d, 0xb2, 0xd1, 0x06, 0x8f, 0x4b, 0x0b, 0xb8, 0x33, 0x4b, 0x0c, - 0x11, 0x13, 0x5d, 0xa5, 0xb5, 0x05, 0xe4, 0x23, 0x5e, 0x22, 0x15, 0xd4, - 0xb1, 0x7a, 0xa9, 0x20, 0x94, 0x92, 0x8a, 0xc2, 0x2a, 0x93, 0x0a, 0xe6, - 0x99, 0x90, 0xed, 0xa5, 0x22, 0xb8, 0x53, 0x74, 0xc2, 0xa5, 0x22, 0xaf, - 0xcc, 0x37, 0xe9, 0x4b, 0x08, 0x10, 0x42, 0x5a, 0xdd, 0xad, 0x79, 0x78, - 0xca, 0xc5, 0x61, 0xdb, 0xae, 0x48, 0xe3, 0x76, 0xf7, 0xae, 0x68, 0x8b, - 0xd5, 0xc2, 0x0e, 0xa9, 0xc3, 0xe2, 0x63, 0x67, 0x32, 0x57, 0x6b, 0x99, - 0x1d, 0xd2, 0x87, 0xa5, 0x51, 0x7b, 0xf6, 0xe5, 0xfd, 0xc4, 0x3c, 0xb9, - 0xc9, 0xf7, 0xe8, 0xd9, 0x9e, 0xe8, 0xe7, 0x67, 0xc9, 0x46, 0xdc, 0x2e, - 0x8f, 0x20, 0x89, 0x69, 0x46, 0xe8, 0x83, 0x1a, 0x9d, 0x17, 0x86, 0x0e, - 0xc6, 0x88, 0xfa, 0xcf, 0x1e, 0x8b, 0x95, 0xb3, 0xf0, 0x2c, 0xe4, 0xc2, - 0x2b, 0xbf, 0x69, 0xe4, 0x55, 0xbc, 0xff, 0xb2, 0xab, 0xa0, 0xe9, 0x5e, - 0x78, 0xe5, 0x3f, 0x01, 0x01, 0xf7, 0x5c, 0xeb, 0x46, 0xa0, 0xd1, 0x68, - 0xe4, 0x1d, 0xdf, 0xee, 0x83, 0x95, 0xe4, 0x38, 0xb9, 0x00, 0x17, 0xe8, - 0xed, 0xc6, 0x3a, 0xf8, 0x0b, 0xb8, 0x29, 0xb7, 0x1b, 0xf2, 0xc2, 0xa1, - 0xde, 0x0e, 0x08, 0xd3, 0x05, 0xd9, 0xdd, 0x90, 0xc6, 0xab, 0xb3, 0xbb, - 0xa1, 0x8c, 0x97, 0x6a, 0x77, 0x44, 0x5a, 0xb8, 0x33, 0xdb, 0x0d, 0xed, - 0x6c, 0x93, 0xec, 0xaa, 0x19, 0x95, 0xb1, 0x69, 0x47, 0xda, 0x99, 0xaf, - 0xe4, 0x01, 0x8b, 0x22, 0x00, 0x32, 0x66, 0x2b, 0x79, 0xe9, 0x92, 0x08, - 0xb2, 0x74, 0xb8, 0x3f, 0xb1, 0x1e, 0x22, 0xc6, 0x24, 0x95, 0xf0, 0x89, - 0x8a, 0x22, 0xd2, 0x87, 0xfd, 0x9a, 0x26, 0xe3, 0x43, 0xbe, 0x0a, 0xa1, - 0x2e, 0xf6, 0x69, 0xea, 0x17, 0xbd, 0x2e, 0xf5, 0x46, 0x3b, 0x11, 0x0f, - 0xbc, 0x04, 0xaf, 0xe4, 0x46, 0xd8, 0xca, 0xe7, 0xd3, 0x79, 0xbe, 0x80, - 0x9d, 0x40, 0xf1, 0x18, 0x3f, 0xee, 0x96, 0x2b, 0x4b, 0x16, 0xa4, 0x2d, - 0x40, 0xd5, 0x52, 0x98, 0xac, 0x42, 0x63, 0x00, 0xda, 0x80, 0x6d, 0xb2, - 0x33, 0xe4, 0xa5, 0x06, 0xa5, 0x18, 0xa5, 0x36, 0xae, 0xaf, 0x9c, 0x20, - 0x50, 0xb4, 0xb8, 0xf3, 0xe9, 0x3c, 0x91, 0x41, 0x25, 0x9a, 0x78, 0x79, - 0x95, 0xeb, 0xf8, 0x72, 0xe7, 0x82, 0xbc, 0xc8, 0xa9, 0x06, 0xc1, 0x06, - 0xad, 0x03, 0xc9, 0x57, 0xf5, 0x10, 0x99, 0x17, 0x84, 0xde, 0xd9, 0x85, - 0x75, 0x29, 0x11, 0xca, 0xd6, 0xd3, 0x36, 0xe4, 0x76, 0x40, 0x35, 0xcd, - 0xc3, 0x4e, 0x32, 0xd4, 0x6b, 0xec, 0x49, 0x3d, 0x7f, 0x0e, 0xde, 0x34, - 0x95, 0xda, 0xcf, 0x4f, 0x59, 0xe8, 0xb5, 0x14, 0x1c, 0x4a, 0x44, 0x1d, - 0xfb, 0x59, 0x34, 0x00, 0x17, 0xcf, 0xb3, 0x94, 0x17, 0x84, 0xae, 0xfb, - 0x52, 0x8a, 0xfe, 0x4c, 0x9a, 0xd1, 0x6b, 0x13, 0xf6, 0x47, 0xe0, 0x3c, - 0x02, 0xc5, 0x8c, 0x44, 0x38, 0x62, 0x86, 0x67, 0x62, 0x49, 0x46, 0x0f, - 0x61, 0x54, 0x70, 0xc1, 0x48, 0xe8, 0x5f, 0xa6, 0x21, 0x99, 0x8f, 0x5b, - 0xaf, 0xa6, 0x1b, 0xe7, 0x61, 0x2b, 0xff, 0xd9, 0xef, 0xbb, 0x1c, 0x3e, - 0x6b, 0x0c, 0x9a, 0x7a, 0xdc, 0xa5, 0xbb, 0x9a, 0x09, 0xab, 0x97, 0x35, - 0x13, 0x33, 0xfa, 0xce, 0x9f, 0x9b, 0x1f, 0xea, 0x73, 0xc4, 0x72, 0xb6, - 0x24, 0x57, 0x4d, 0x3d, 0x16, 0x99, 0xed, 0x46, 0xba, 0xe1, 0x7f, 0xe6, - 0x24, 0xab, 0x2d, 0x9f, 0x38, 0x75, 0xba, 0x4e, 0xb3, 0xd2, 0x83, 0x46, - 0xbb, 0x59, 0xa7, 0xcb, 0xe5, 0x5f, 0xd5, 0xa2, 0x28, 0x57, 0x21, 0x9d, - 0x68, 0xd2, 0xa4, 0x79, 0xc7, 0x7e, 0x72, 0x04, 0x60, 0xca, 0x86, 0x92, - 0xda, 0x89, 0xe7, 0xef, 0xd4, 0x8e, 0x89, 0x2f, 0xdf, 0x5f, 0x8b, 0xea, - 0x4a, 0xdc, 0xbb, 0x1b, 0xca, 0xb5, 0x7e, 0x37, 0x8c, 0xd9, 0x47, 0x13, - 0x53, 0xe9, 0x3b, 0x90, 0xab, 0xb2, 0x79, 0x7c, 0xa6, 0x07, 0xa5, 0x58, - 0x43, 0x9c, 0xf5, 0x1a, 0xf7, 0x81, 0x57, 0x7d, 0x61, 0xaa, 0x1c, 0xa2, - 0xc6, 0x0d, 0xb4, 0x36, 0xcc, 0x28, 0xe9, 0x2d, 0xf6, 0x80, 0x0b, 0xd5, - 0x26, 0x6c, 0x68, 0x2c, 0xf0, 0xb7, 0x80, 0x89, 0x25, 0x8f, 0x61, 0xd5, - 0x65, 0xdc, 0x3b, 0x8f, 0x68, 0xcd, 0x97, 0xd5, 0x57, 0x19, 0xe8, 0xf2, - 0xf5, 0xe5, 0x6d, 0x2f, 0xc2, 0x70, 0xda, 0x50, 0xa7, 0xda, 0xb7, 0xad, - 0xb2, 0x7c, 0x49, 0xa0, 0x68, 0xea, 0x1b, 0xe3, 0xc0, 0x1d, 0xc8, 0xaa, - 0xf4, 0xd2, 0x59, 0x66, 0x0c, 0xc5, 0xe2, 0x78, 0xa9, 0x5e, 0x6e, 0xd3, - 0x29, 0xe6, 0x8b, 0xd3, 0xb3, 0xd1, 0xeb, 0xa3, 0xd7, 0xe9, 0x18, 0xf3, - 0xc5, 0xc7, 0xf3, 0xe9, 0xf9, 0xe1, 0x7e, 0x87, 0xa7, 0x58, 0xef, 0xae, - 0x16, 0x57, 0x53, 0xaa, 0xc4, 0x22, 0x23, 0x86, 0xcf, 0x84, 0x6f, 0x16, - 0x12, 0x01, 0xbd, 0xa4, 0x8a, 0xf1, 0x81, 0xbb, 0x78, 0x03, 0x1e, 0x41, - 0x29, 0x43, 0xfc, 0xd2, 0xf5, 0x3d, 0x57, 0xed, 0xa0, 0x18, 0xe0, 0x34, - 0x9c, 0xc8, 0x88, 0x12, 0xfc, 0x01, 0x14, 0xee, 0x02, 0xde, 0xb9, 0x1a, - 0xc4, 0x84, 0x6d, 0x88, 0xee, 0xa5, 0x48, 0xd9, 0x1d, 0x74, 0xf4, 0x6d, - 0x32, 0x3b, 0x5e, 0xc3, 0x8c, 0x3d, 0xa7, 0x3b, 0x0b, 0xe4, 0x02, 0x7a, - 0x99, 0x50, 0xd0, 0x70, 0x79, 0x00, 0x0e, 0xe4, 0xef, 0xec, 0xa0, 0xc7, - 0x92, 0xa3, 0xa7, 0xd1, 0x10, 0x6b, 0x26, 0x72, 0xe1, 0x16, 0xe0, 0x57, - 0x49, 0x9e, 0x2e, 0x30, 0x4e, 0xf2, 0x48, 0xa6, 0xa5, 0x09, 0xe3, 0xbc, - 0x9f, 0x2c, 0xa7, 0xb7, 0x1f, 0xa5, 0xeb, 0xeb, 0x0f, 0xa7, 0x18, 0xc6, - 0x97, 0x81, 0x28, 0xfe, 0x3c, 0x87, 0xa4, 0x36, 0x23, 0xa9, 0x4a, 0xfc, - 0x77, 0x97, 0x4b, 0xd3, 0x15, 0x80, 0xf9, 0x14, 0x94, 0x62, 0xc9, 0x47, - 0x9b, 0x75, 0x0e, 0xba, 0xb0, 0x80, 0x01, 0xec, 0x36, 0xc2, 0x69, 0x9e, - 0xc6, 0x70, 0xa6, 0xbd, 0xc6, 0xf6, 0xc6, 0x5f, 0x66, 0x17, 0x1c, 0x31, - 0x26, 0x3a, 0x0e, 0xbd, 0x21, 0x0d, 0x64, 0x0c, 0xa5, 0xc4, 0x54, 0xe5, - 0xa8, 0xf3, 0xd9, 0x74, 0xb5, 0xa5, 0x92, 0x28, 0xf5, 0xec, 0xe9, 0xd3, - 0x0a, 0x66, 0xc9, 0x9b, 0xc0, 0xdd, 0x8f, 0x49, 0xb2, 0x39, 0x22, 0x60, - 0x51, 0xd9, 0x7b, 0x6d, 0xc2, 0x5e, 0xcb, 0x1e, 0xb4, 0xc2, 0xc9, 0xa9, - 0x0e, 0x56, 0x1e, 0x49, 0x1a, 0xed, 0x83, 0xb1, 0xe2, 0xa9, 0x5c, 0x1b, - 0x33, 0x8d, 0x3e, 0x40, 0x52, 0xd7, 0x31, 0xa7, 0x9e, 0x90, 0x5a, 0x36, - 0xf5, 0x6c, 0x3c, 0xed, 0x04, 0x5a, 0x35, 0xa6, 0xc1, 0x7c, 0xfb, 0x2b, - 0x6b, 0x55, 0xda, 0xf4, 0xd5, 0x0a, 0x02, 0x34, 0x59, 0x43, 0x08, 0x8c, - 0x1c, 0xa9, 0xc3, 0x1a, 0x4b, 0x1e, 0xc5, 0x6f, 0x53, 0xe8, 0xac, 0x34, - 0x00, 0x09, 0x38, 0x50, 0x7c, 0xf1, 0xb3, 0xe4, 0x76, 0x89, 0xaa, 0xfd, - 0x58, 0xd5, 0x5e, 0x40, 0xb3, 0xea, 0xe0, 0x43, 0x40, 0x5b, 0x75, 0x30, - 0x4d, 0x3e, 0xa6, 0x1c, 0x40, 0xf7, 0xb8, 0x72, 0x7c, 0x19, 0xb1, 0x5f, - 0x5a, 0xd7, 0x25, 0x07, 0x70, 0x44, 0x42, 0x90, 0x8b, 0xb4, 0xaf, 0x54, - 0x7f, 0x02, 0xce, 0x8a, 0x8e, 0x1b, 0xfb, 0xe3, 0xfa, 0x83, 0x8e, 0x4e, - 0xd3, 0xb3, 0xed, 0x62, 0xb5, 0x86, 0xaf, 0xdc, 0x9d, 0xa1, 0xf4, 0x72, - 0xa7, 0x1f, 0x47, 0x05, 0x75, 0x14, 0x14, 0xab, 0x06, 0xd5, 0x13, 0xc8, - 0x20, 0x7d, 0x9d, 0x40, 0xb5, 0xd2, 0x4a, 0xcf, 0xd1, 0x98, 0x20, 0x90, - 0x9c, 0x92, 0xd1, 0x1f, 0x1e, 0xf5, 0xd4, 0x89, 0xed, 0x43, 0xbf, 0x9a, - 0xc1, 0xe4, 0x2c, 0x9c, 0xbf, 0x80, 0x1e, 0xf3, 0xda, 0x6b, 0x16, 0xce, - 0x9f, 0xeb, 0x3b, 0x16, 0xf7, 0xba, 0xa5, 0x76, 0x7e, 0x77, 0x3a, 0x7e, - 0x24, 0xd3, 0x15, 0xdb, 0x6b, 0xd0, 0xb8, 0x75, 0x95, 0xb0, 0xe7, 0x11, - 0x63, 0xaf, 0xb4, 0xc9, 0x5a, 0x05, 0x8b, 0xfb, 0x7d, 0xe8, 0x5f, 0x3b, - 0x91, 0x78, 0xbf, 0xbf, 0x53, 0x89, 0xff, 0x59, 0xe1, 0xa9, 0xae, 0x59, - 0x67, 0x69, 0xdf, 0x9a, 0x44, 0x6c, 0xe0, 0x3c, 0x8c, 0x84, 0xba, 0x3c, - 0xbd, 0x0f, 0x6a, 0x3b, 0x9a, 0x92, 0x04, 0xb7, 0xdd, 0x07, 0x04, 0xbd, - 0x5e, 0x05, 0x36, 0xda, 0x7d, 0x80, 0x77, 0x1a, 0xb0, 0x22, 0xc5, 0x88, - 0xae, 0x8f, 0xbf, 0x24, 0x26, 0x96, 0xcb, 0x80, 0x81, 0x54, 0x29, 0x80, - 0x59, 0x24, 0x85, 0x8f, 0x4d, 0x4c, 0xb2, 0x7f, 0x3e, 0x5d, 0x2c, 0x13, - 0xe9, 0xa3, 0xa4, 0x5a, 0xb6, 0xc0, 0xb0, 0xc9, 0xb2, 0xc3, 0xb0, 0xc9, - 0x6e, 0xb5, 0x6d, 0x05, 0xfc, 0x6d, 0xba, 0x2c, 0xb1, 0xa5, 0xb5, 0x4b, - 0xa9, 0x72, 0xe7, 0x8a, 0x4f, 0x5e, 0xdf, 0x8d, 0x73, 0xc5, 0x27, 0xaf, - 0x3f, 0x9c, 0x73, 0x45, 0xcb, 0xb3, 0x11, 0x39, 0x5a, 0x04, 0xc9, 0x64, - 0x20, 0x19, 0x7d, 0x68, 0xfd, 0xf6, 0x32, 0x59, 0x89, 0x41, 0x95, 0x45, - 0xba, 0xc8, 0x68, 0x06, 0xd6, 0xa3, 0xa8, 0x25, 0xe4, 0xdb, 0x81, 0xa4, - 0x2e, 0x87, 0x5f, 0x48, 0x4d, 0x7f, 0x4e, 0x52, 0x5f, 0x6b, 0xf0, 0x88, - 0xe0, 0x86, 0x07, 0x71, 0x75, 0xbc, 0x68, 0x27, 0x2a, 0xcd, 0x5d, 0xe2, - 0x2d, 0x8a, 0xd6, 0x4f, 0xce, 0x5c, 0x07, 0x67, 0x04, 0x92, 0x26, 0xe7, - 0x69, 0x92, 0x5d, 0x3e, 0xa7, 0x5d, 0x52, 0x58, 0x84, 0x8a, 0xa1, 0xff, - 0x13, 0xf9, 0x2b, 0xa6, 0xbe, 0xc6, 0xd7, 0xbd, 0x5e, 0xea, 0x74, 0x7b, - 0x34, 0xe9, 0xdd, 0xc7, 0xb2, 0x1a, 0x18, 0x2e, 0x9e, 0xa9, 0x48, 0x2d, - 0x6e, 0x60, 0x25, 0xc2, 0x7a, 0x89, 0xa4, 0xdb, 0x6a, 0xe0, 0x09, 0x50, - 0x41, 0x5b, 0x81, 0x41, 0x08, 0x2f, 0x37, 0x24, 0x11, 0xae, 0xc5, 0x40, - 0x5c, 0xa8, 0x71, 0x48, 0x01, 0x6d, 0x55, 0xf9, 0x2b, 0x0c, 0xa1, 0x62, - 0x9c, 0xa7, 0x97, 0x05, 0xab, 0xe3, 0xe6, 0x97, 0x8b, 0xa8, 0x11, 0x2a, - 0x40, 0x33, 0xd4, 0x23, 0x89, 0x7a, 0xd0, 0x1c, 0xf5, 0x57, 0x89, 0xfa, - 0x58, 0x43, 0xbd, 0xdf, 0x69, 0x0f, 0xa4, 0x59, 0x42, 0xd3, 0x2e, 0x28, - 0x16, 0x42, 0xb5, 0x9d, 0xd0, 0xf6, 0xd0, 0x46, 0x91, 0x04, 0x8b, 0xfe, - 0xe6, 0xed, 0x93, 0xde, 0x4a, 0x7f, 0xba, 0xbe, 0x88, 0x68, 0x44, 0xcc, - 0xca, 0x6a, 0x41, 0xb9, 0x7a, 0x2d, 0x28, 0xc1, 0x5b, 0x15, 0xca, 0xd1, - 0x2b, 0xa3, 0x1c, 0xb7, 0xd1, 0x67, 0xd3, 0x2a, 0xe1, 0xd4, 0xc1, 0x1d, - 0x13, 0xf3, 0xf4, 0xf6, 0x88, 0x9e, 0x11, 0xbe, 0x3d, 0xd1, 0xc6, 0x90, - 0x01, 0xaf, 0x9b, 0x89, 0xb3, 0x86, 0x13, 0x22, 0xd7, 0xae, 0xf0, 0x5f, - 0xfd, 0x64, 0xb3, 0x95, 0x65, 0x09, 0xb2, 0x2e, 0xca, 0x8a, 0x35, 0xae, - 0x90, 0x35, 0xe6, 0xb7, 0x29, 0xbb, 0xd3, 0xc6, 0x6d, 0x9f, 0x2c, 0x97, - 0x66, 0x4d, 0xc3, 0xe8, 0x35, 0x7f, 0x0b, 0x41, 0x7a, 0x08, 0xfe, 0x48, - 0xf3, 0xfc, 0x37, 0x74, 0x5d, 0xff, 0xf9, 0x75, 0x59, 0x5e, 0xc7, 0x10, - 0x2e, 0x5c, 0x03, 0xfa, 0x68, 0xe1, 0x0d, 0x29, 0x28, 0x18, 0x0c, 0x6b, - 0x36, 0x92, 0x97, 0xa4, 0xc9, 0xff, 0x64, 0x32, 0x40, 0xda, 0x3a, 0x87, - 0xa0, 0xa8, 0x61, 0xc1, 0x5e, 0x0a, 0xcc, 0xbd, 0xbd, 0xa0, 0x4d, 0xd1, - 0x47, 0x64, 0xaa, 0x1f, 0xa9, 0x43, 0x5e, 0x19, 0x11, 0x0f, 0x9b, 0x6c, - 0x05, 0xbd, 0xd5, 0x3d, 0x76, 0x32, 0xab, 0x00, 0xe5, 0x03, 0xbb, 0xf0, - 0xef, 0x9f, 0x88, 0x31, 0x03, 0x0c, 0x24, 0x8e, 0x87, 0x62, 0xde, 0x0e, - 0x8e, 0x26, 0x0a, 0x2a, 0x20, 0xa8, 0x0c, 0xc7, 0x83, 0x0d, 0x8e, 0x19, - 0xe2, 0x04, 0xba, 0xb5, 0x08, 0x59, 0x85, 0xb2, 0x24, 0xc8, 0x0b, 0x5a, - 0x74, 0xc4, 0xe1, 0x3a, 0xd1, 0x55, 0x9a, 0x07, 0xd8, 0x8a, 0xc6, 0x1b, - 0x52, 0x00, 0xe8, 0xa3, 0xa7, 0xbc, 0x63, 0xe9, 0x60, 0xe4, 0x98, 0x62, - 0xad, 0x89, 0x97, 0xc2, 0x19, 0xb9, 0xe6, 0xaa, 0x95, 0x4b, 0x26, 0x51, - 0x5d, 0xa1, 0x18, 0x4e, 0x1f, 0x26, 0x3a, 0xf0, 0x38, 0x0a, 0xba, 0x00, - 0xe9, 0x75, 0x1e, 0x11, 0x10, 0x0e, 0x85, 0xd8, 0x77, 0x19, 0x8a, 0x14, - 0x4b, 0x94, 0x3f, 0x61, 0xd0, 0x71, 0xc8, 0x1b, 0x7f, 0xf7, 0x9d, 0x7e, - 0x20, 0x2f, 0xeb, 0x8d, 0xcb, 0x0a, 0xf3, 0x42, 0xf9, 0x93, 0x02, 0x74, - 0x1c, 0xf0, 0xda, 0xde, 0x7d, 0x33, 0x1f, 0xc2, 0xc8, 0x75, 0x36, 0x7a, - 0x63, 0x38, 0x3a, 0xbf, 0x79, 0x5e, 0xde, 0x29, 0x2c, 0x98, 0x89, 0x89, - 0x17, 0xd6, 0x4d, 0xe8, 0x12, 0x51, 0x70, 0x0f, 0x31, 0x42, 0x12, 0x33, - 0x7e, 0x4d, 0xc7, 0xa8, 0xec, 0x13, 0x76, 0x94, 0x64, 0xa6, 0x1a, 0xd6, - 0x1b, 0xac, 0xfa, 0xd0, 0x25, 0x8a, 0xe0, 0xfa, 0x98, 0xa1, 0x4a, 0x98, - 0x00, 0x84, 0x80, 0x1b, 0xd7, 0x62, 0xa4, 0x06, 0xc6, 0x30, 0x00, 0xe3, - 0xc2, 0xc0, 0x18, 0x05, 0x60, 0xcc, 0x0c, 0x8c, 0x83, 0x00, 0x0c, 0xb8, - 0xa4, 0x29, 0x9c, 0x6a, 0x3c, 0x5b, 0x7f, 0x9c, 0xdc, 0xc4, 0x27, 0x7a, - 0x9d, 0x7a, 0x06, 0xbf, 0x3d, 0x83, 0x97, 0x9e, 0x51, 0xce, 0x69, 0xb7, - 0xbe, 0xa4, 0xeb, 0x91, 0xc1, 0xdc, 0xe3, 0x00, 0xe6, 0x52, 0x13, 0xe5, - 0x30, 0x00, 0xe5, 0xc2, 0x44, 0x79, 0x12, 0x80, 0x32, 0x33, 0x51, 0x5e, - 0x0f, 0x40, 0x01, 0xa9, 0x8d, 0x4a, 0xc4, 0xf6, 0xd8, 0x10, 0xcd, 0xa1, - 0xf1, 0xeb, 0x09, 0xfe, 0xe2, 0x82, 0xc2, 0xc4, 0x76, 0x60, 0x70, 0xf7, - 0x46, 0x00, 0x77, 0xa9, 0x89, 0xf2, 0x66, 0x00, 0xca, 0x85, 0x89, 0x32, - 0x0c, 0x51, 0xe8, 0x99, 0x85, 0x13, 0xa2, 0xd2, 0x20, 0xb8, 0x83, 0x12, - 0xc1, 0xbd, 0x61, 0x08, 0xe7, 0x4d, 0x53, 0xfb, 0x2c, 0x65, 0x1c, 0x82, - 0xe8, 0x1e, 0x62, 0x78, 0x2d, 0x09, 0xed, 0x3f, 0x2c, 0xb7, 0x68, 0xa5, - 0x4e, 0x61, 0x07, 0x69, 0x09, 0x43, 0x51, 0xb9, 0x23, 0x58, 0x90, 0x7b, - 0x05, 0x92, 0xdf, 0xf9, 0x2b, 0xc8, 0xbd, 0x0c, 0xa7, 0xc2, 0xe1, 0xeb, - 0xe0, 0x5a, 0x22, 0x05, 0x98, 0xc8, 0x0a, 0xc1, 0x8c, 0x5a, 0x09, 0x66, - 0xd4, 0x4a, 0x32, 0xa3, 0x36, 0xa2, 0x19, 0xb5, 0x92, 0xcd, 0xa8, 0x91, - 0x70, 0x4a, 0x64, 0x73, 0xd0, 0x4a, 0x36, 0x07, 0xad, 0x64, 0x73, 0xd0, - 0x46, 0x36, 0x07, 0xad, 0x64, 0x73, 0x10, 0x2e, 0x1b, 0xff, 0xe4, 0x53, - 0x04, 0xc6, 0x6c, 0x34, 0xe9, 0xac, 0x08, 0x1e, 0x79, 0xe7, 0xb8, 0x36, - 0xb5, 0xe3, 0x47, 0x86, 0xf8, 0x5f, 0x2d, 0x73, 0xb8, 0x1a, 0x32, 0xd3, - 0xaa, 0x08, 0x3f, 0x79, 0x57, 0x1f, 0x80, 0x32, 0xc8, 0x5f, 0x6a, 0x99, - 0x7f, 0xd4, 0xa0, 0x29, 0xa9, 0x72, 0xe7, 0x59, 0xcb, 0x9f, 0x27, 0x86, - 0x65, 0x2d, 0x7f, 0x00, 0xe3, 0xe5, 0x8f, 0xb2, 0xc2, 0xa6, 0xcc, 0x15, - 0x41, 0x30, 0xef, 0xea, 0xc3, 0x60, 0x06, 0xf9, 0x20, 0x2d, 0xf5, 0x39, - 0x1a, 0xcc, 0x9f, 0x3f, 0x8e, 0xe6, 0x5d, 0x7d, 0x24, 0xcd, 0x28, 0xc4, - 0x5b, 0x68, 0xa9, 0x77, 0xd0, 0x10, 0xfe, 0x2a, 0x42, 0x71, 0xde, 0x55, - 0x04, 0xe3, 0x0c, 0x59, 0x94, 0xcd, 0x57, 0x56, 0xe3, 0x32, 0xad, 0x40, - 0xce, 0x80, 0x42, 0x2d, 0x67, 0x66, 0x3c, 0xcf, 0x80, 0xe5, 0xe2, 0x7c, - 0xbd, 0x2d, 0x61, 0x6c, 0x1e, 0xb6, 0x62, 0xfc, 0xcb, 0xe2, 0x81, 0x86, - 0xbd, 0xce, 0xb3, 0xea, 0xf1, 0x17, 0xc4, 0x18, 0x8d, 0xa2, 0xf0, 0x18, - 0x93, 0x61, 0x15, 0xba, 0x6e, 0x10, 0x70, 0x92, 0xfe, 0xcc, 0x6b, 0xb0, - 0xbb, 0x29, 0x54, 0xdb, 0xa7, 0x0c, 0x1b, 0xe8, 0xf6, 0x0b, 0xd0, 0xfa, - 0xd5, 0x5e, 0x30, 0xec, 0xa8, 0x09, 0xf0, 0x41, 0x15, 0x30, 0x68, 0x76, - 0xd0, 0x28, 0x1b, 0x1e, 0x2f, 0xf6, 0xae, 0x22, 0x62, 0x6c, 0x6d, 0x3f, - 0x04, 0x18, 0xaf, 0xf6, 0x42, 0x7a, 0x60, 0x2f, 0x24, 0x77, 0x30, 0xe1, - 0xbd, 0xb0, 0x71, 0x18, 0xda, 0x80, 0x3e, 0xa8, 0x5e, 0xb1, 0x06, 0xba, - 0x66, 0x6b, 0x4e, 0x5d, 0xbc, 0x62, 0x0d, 0xf4, 0xf4, 0xd5, 0x9c, 0xbc, - 0x7c, 0xc5, 0x1a, 0xe4, 0x32, 0xaa, 0x39, 0x75, 0xf1, 0x86, 0xb5, 0xda, - 0xff, 0xd0, 0x38, 0x6a, 0xa3, 0x94, 0xd5, 0x21, 0x81, 0xef, 0x9a, 0x04, - 0x05, 0x6e, 0xec, 0x2f, 0x46, 0xd5, 0xa7, 0xb4, 0x90, 0x71, 0xc9, 0xdc, - 0x15, 0x63, 0x5e, 0x35, 0xda, 0x2f, 0x85, 0x5d, 0x93, 0x60, 0xed, 0x06, - 0x78, 0xbe, 0x6d, 0x86, 0x81, 0x6a, 0x9c, 0x8b, 0x20, 0x6e, 0x49, 0x2a, - 0x5e, 0x3f, 0x05, 0x84, 0x2a, 0x7e, 0xc8, 0x5b, 0xc3, 0xd1, 0xdb, 0xd1, - 0xbe, 0xbf, 0x34, 0xff, 0xc5, 0x7f, 0xba, 0xd0, 0x75, 0x17, 0x51, 0x14, - 0xb3, 0xa7, 0x4c, 0xad, 0x17, 0x2d, 0xce, 0xc4, 0x4f, 0x82, 0xe3, 0x1b, - 0x8d, 0x81, 0xcb, 0x00, 0x4a, 0x0e, 0xb8, 0x80, 0x6f, 0x2f, 0xd6, 0x23, - 0xcf, 0x3a, 0xdd, 0x8d, 0x27, 0xe2, 0x02, 0xf8, 0x63, 0x94, 0x94, 0x95, - 0x44, 0x4f, 0xa2, 0xa2, 0xaf, 0xe8, 0x5f, 0x20, 0x69, 0x41, 0x96, 0x47, - 0x36, 0xa9, 0xe2, 0x3c, 0x43, 0xc5, 0xca, 0xd3, 0xf5, 0x32, 0x2b, 0x07, - 0x54, 0xe7, 0x23, 0x84, 0xe0, 0xc2, 0xa9, 0x7c, 0x59, 0x05, 0xbc, 0xdc, - 0xa0, 0x17, 0x1b, 0xf4, 0x56, 0xcc, 0x2f, 0x67, 0x5e, 0xaf, 0x12, 0x1f, - 0x1c, 0xb3, 0xf4, 0xae, 0xe4, 0xac, 0x20, 0xe7, 0x50, 0x38, 0xd4, 0xfe, - 0xa2, 0x14, 0x1f, 0x70, 0x59, 0x3f, 0x74, 0x77, 0x9b, 0x9b, 0x3c, 0x05, - 0x84, 0xd2, 0xdd, 0x9a, 0xf3, 0xc5, 0xe0, 0x4f, 0x65, 0xb4, 0x46, 0xe8, - 0x9b, 0xbe, 0xe6, 0xe3, 0x03, 0x78, 0x71, 0xdd, 0xa3, 0xe9, 0x03, 0xa4, - 0x66, 0xc7, 0x5a, 0xb5, 0xd4, 0x0a, 0x37, 0x15, 0x3e, 0x8a, 0xde, 0xdb, - 0x63, 0x74, 0xb7, 0xbc, 0x54, 0xcf, 0x85, 0xb4, 0xca, 0x3b, 0xc2, 0x9c, - 0xb7, 0xbd, 0xfc, 0x40, 0xac, 0x09, 0xf2, 0xa8, 0xbb, 0xea, 0xc5, 0xd2, - 0x1c, 0xdf, 0xe6, 0x45, 0x74, 0x14, 0xc9, 0x27, 0x9d, 0xee, 0xa5, 0x2c, - 0xba, 0xd9, 0x20, 0x8f, 0x30, 0x49, 0xaf, 0xdc, 0x13, 0xcb, 0xe3, 0x08, - 0x81, 0xe8, 0x8c, 0x52, 0x01, 0x8e, 0xfd, 0x87, 0xa1, 0x06, 0x31, 0xbe, - 0x97, 0xac, 0x92, 0x5e, 0x98, 0xc0, 0xc5, 0x0d, 0x2a, 0x24, 0xe4, 0xce, - 0x6a, 0xe5, 0x3d, 0xf0, 0x32, 0x2e, 0xf5, 0x4b, 0x76, 0xf9, 0x9a, 0x78, - 0x46, 0xf4, 0xc1, 0x36, 0x5d, 0x7a, 0x8e, 0xaf, 0x5d, 0x8e, 0xd9, 0x08, - 0x7a, 0x2f, 0x42, 0xab, 0xb7, 0x76, 0xcf, 0xc5, 0xfe, 0x11, 0x76, 0x36, - 0x4a, 0x8f, 0x33, 0x3a, 0x9e, 0xf3, 0x45, 0x1b, 0x13, 0x18, 0x74, 0x8a, - 0x22, 0x80, 0x80, 0x70, 0xdd, 0x8b, 0x7d, 0x18, 0xf6, 0xda, 0xa0, 0x81, - 0xcd, 0x6b, 0x89, 0xd9, 0x06, 0x8d, 0xb6, 0xb8, 0x5a, 0x23, 0xb6, 0xe4, - 0x15, 0x77, 0xc8, 0xda, 0xe2, 0xb5, 0x2c, 0x12, 0x97, 0x1d, 0xad, 0xca, - 0x24, 0xc4, 0xea, 0x42, 0xa1, 0x73, 0xd8, 0xaa, 0x73, 0x6f, 0x77, 0x52, - 0xff, 0xb8, 0xa1, 0xc0, 0x67, 0x79, 0xd8, 0x03, 0x2c, 0x80, 0x33, 0x9d, - 0x72, 0xf2, 0xf3, 0x25, 0xa0, 0x51, 0xfe, 0x7a, 0x09, 0x32, 0xe9, 0xe1, - 0x52, 0x83, 0x41, 0x80, 0x7b, 0x8e, 0x3e, 0x84, 0xa9, 0x23, 0xff, 0x68, - 0x18, 0xfd, 0xf2, 0x8b, 0x9e, 0x44, 0xbb, 0xf6, 0x38, 0x27, 0xa2, 0x24, - 0xf7, 0x30, 0xf4, 0xf0, 0xf5, 0x2e, 0x30, 0x24, 0x46, 0x91, 0xaf, 0x8f, - 0x9f, 0x7d, 0xf1, 0x59, 0x04, 0x7d, 0xfd, 0xb3, 0x2f, 0xde, 0xff, 0xc0, - 0x8a, 0xf4, 0x54, 0xf9, 0xc4, 0x4d, 0x76, 0x71, 0xff, 0xab, 0x5e, 0x89, - 0xff, 0xe0, 0x0f, 0x7b, 0x05, 0xd9, 0x46, 0xef, 0xbc, 0xc2, 0xc2, 0x7e, - 0x08, 0x18, 0x60, 0xce, 0x45, 0x34, 0x56, 0xd5, 0x2a, 0xb1, 0xd1, 0xbb, - 0x4b, 0x6f, 0xbb, 0xbd, 0x2d, 0x4e, 0x56, 0xea, 0x6f, 0x01, 0x3e, 0xe4, - 0xfc, 0x01, 0x58, 0xf0, 0xd0, 0x23, 0x69, 0x1f, 0x3e, 0x01, 0x6e, 0xe8, - 0xd5, 0xd7, 0xd7, 0xcf, 0xbe, 0xf8, 0xf2, 0xd3, 0x77, 0xbf, 0x37, 0x24, - 0xaf, 0xcc, 0x34, 0xc1, 0xcb, 0x37, 0xb4, 0x31, 0x8e, 0x98, 0xf6, 0xc4, - 0xac, 0xd4, 0x9e, 0xc3, 0x34, 0xab, 0x14, 0x56, 0xdc, 0xe2, 0x60, 0xe0, - 0x6a, 0xca, 0x74, 0xc0, 0x5d, 0x42, 0x99, 0x37, 0x55, 0x2a, 0xeb, 0xfa, - 0xba, 0xa8, 0xab, 0xd0, 0xfe, 0xe7, 0xdf, 0x1e, 0x0b, 0xe4, 0x3f, 0xa7, - 0xfc, 0x3e, 0xfd, 0x54, 0x3d, 0xa1, 0x99, 0xbe, 0xb0, 0x06, 0xb6, 0xd3, - 0x5c, 0xb3, 0x2b, 0x4a, 0x90, 0xda, 0xce, 0xd8, 0xaa, 0x43, 0x6a, 0x1d, - 0x25, 0xa0, 0x5b, 0x52, 0xeb, 0xfc, 0x97, 0xf5, 0xea, 0x0d, 0xa1, 0x57, - 0xcf, 0xbe, 0xf9, 0xd7, 0x54, 0x12, 0x81, 0x9b, 0xd6, 0xf2, 0x4d, 0x39, - 0x7a, 0x7c, 0x30, 0x1c, 0x1c, 0x0c, 0xff, 0x35, 0x35, 0x6d, 0xde, 0x9c, - 0x4f, 0xf6, 0x65, 0x45, 0x3f, 0x5c, 0xa4, 0xc9, 0x68, 0x7f, 0x38, 0xfa, - 0xd7, 0xd4, 0x95, 0x80, 0xeb, 0xe3, 0xff, 0xff, 0xe9, 0x1a, 0x20, 0xf0, - 0x5f, 0x56, 0x05, 0x2b, 0x74, 0xb2, 0x3d, 0xe3, 0xd9, 0x6f, 0xf4, 0x8a, - 0xbd, 0xb3, 0x3e, 0x3f, 0x6f, 0xe4, 0x93, 0x87, 0x07, 0xd2, 0x56, 0x12, - 0x6c, 0xaa, 0x07, 0xae, 0x20, 0x1b, 0x20, 0x54, 0xa8, 0xbe, 0x3b, 0x1b, - 0x76, 0x4b, 0x71, 0x57, 0x60, 0x01, 0x7e, 0xba, 0xda, 0xcc, 0xe7, 0x05, - 0x66, 0xe9, 0x84, 0xde, 0x65, 0x94, 0x6b, 0xd7, 0x82, 0x4f, 0xc0, 0x6b, - 0xb7, 0x2e, 0x23, 0xc4, 0xa6, 0x5c, 0x6a, 0x1a, 0xe1, 0x5d, 0xcb, 0x5e, - 0x19, 0xef, 0x6b, 0x5d, 0x3f, 0x0d, 0x60, 0x76, 0x50, 0xc7, 0x43, 0xc2, - 0x94, 0x63, 0x20, 0xf2, 0xb0, 0xb9, 0xa4, 0xc2, 0x70, 0xeb, 0x51, 0xe1, - 0xc0, 0x20, 0xc9, 0xa9, 0x32, 0x84, 0xfc, 0x1c, 0x8b, 0xbb, 0xe3, 0xf9, - 0x2c, 0x48, 0x65, 0x96, 0xc0, 0x7c, 0x21, 0xc3, 0x67, 0x0e, 0x17, 0x49, - 0x5a, 0x00, 0xe9, 0xec, 0x18, 0xb7, 0x90, 0x87, 0xac, 0xb7, 0xfe, 0x8b, - 0x98, 0x92, 0x02, 0x80, 0xf9, 0x0d, 0x17, 0x4c, 0x51, 0x3f, 0x84, 0x3e, - 0x0a, 0x9b, 0xb3, 0x72, 0x4f, 0x2e, 0x33, 0xe7, 0xb7, 0x12, 0x3f, 0x02, - 0x93, 0x20, 0x3a, 0xb9, 0x42, 0x76, 0x79, 0xd9, 0x77, 0xcd, 0x0b, 0x7c, - 0xd4, 0x6e, 0x2d, 0x16, 0xcf, 0x57, 0xe8, 0x65, 0xb2, 0x2c, 0x8f, 0x04, - 0x67, 0x89, 0x8d, 0x14, 0x07, 0x57, 0x96, 0x16, 0xde, 0x3b, 0x80, 0xc7, - 0xd7, 0x41, 0xbd, 0xa8, 0x7c, 0xb1, 0xd9, 0x83, 0xff, 0x72, 0x81, 0xcf, - 0x60, 0x3e, 0x22, 0x64, 0x68, 0x04, 0x7e, 0xf0, 0x05, 0xaf, 0xa2, 0x90, - 0x17, 0xb1, 0x10, 0xbe, 0x9b, 0xa6, 0x9f, 0xd3, 0xf5, 0x8c, 0x5b, 0x3b, - 0xc6, 0xaf, 0x0b, 0xe3, 0xd7, 0xec, 0xb4, 0xab, 0xd9, 0x9d, 0xe0, 0xbb, - 0x54, 0xcc, 0x43, 0x05, 0x13, 0x23, 0x93, 0x0b, 0xf3, 0xe7, 0x85, 0xf9, - 0x73, 0x36, 0x0a, 0x65, 0xe4, 0xa0, 0x84, 0x91, 0x2a, 0x4e, 0x0e, 0x4c, - 0x4e, 0xcc, 0x9f, 0x17, 0xe6, 0xcf, 0xd9, 0x81, 0xc1, 0xc9, 0x3d, 0x7e, - 0x0a, 0x7f, 0x15, 0x46, 0x38, 0xf6, 0x23, 0xe5, 0xb1, 0x82, 0xde, 0x95, - 0x4c, 0x57, 0x3f, 0x4f, 0xab, 0x96, 0x01, 0x8f, 0xf4, 0x98, 0xf7, 0x02, - 0x9a, 0xfc, 0x9c, 0xc9, 0x47, 0x29, 0xe8, 0x47, 0x15, 0xb0, 0x45, 0x06, - 0xe2, 0x1e, 0x89, 0xb4, 0xf8, 0xd1, 0xe8, 0x8c, 0xe0, 0x0c, 0xbf, 0x04, - 0x57, 0x9b, 0xf5, 0x0a, 0x08, 0x8b, 0x7a, 0xce, 0x0b, 0x71, 0xa4, 0x49, - 0xbe, 0x4d, 0x57, 0x51, 0xdc, 0xd9, 0x47, 0x41, 0x88, 0x7e, 0x0f, 0xd9, - 0x83, 0x7c, 0x7d, 0x9c, 0xa7, 0x60, 0xa1, 0x62, 0x70, 0x66, 0x0a, 0xe3, - 0xe9, 0x72, 0x01, 0x4b, 0x9b, 0xfe, 0x08, 0xd3, 0xbf, 0xde, 0x6c, 0xe0, - 0x14, 0x62, 0x9a, 0x25, 0xb1, 0x63, 0x54, 0x58, 0x90, 0xf0, 0xc5, 0x29, - 0x82, 0x79, 0x50, 0x20, 0x70, 0x92, 0xd4, 0x85, 0x52, 0x3d, 0x19, 0xc3, - 0xb2, 0x8c, 0x51, 0x59, 0x06, 0x34, 0x80, 0xcb, 0xcf, 0x7a, 0x75, 0x4c, - 0x3d, 0x9e, 0xda, 0x40, 0xb8, 0x5e, 0x33, 0xba, 0xcd, 0x0b, 0x9e, 0xfd, - 0x47, 0xc3, 0x7d, 0xcb, 0x66, 0xad, 0x4c, 0x28, 0x21, 0x0f, 0x36, 0x29, - 0x7d, 0xbe, 0x9f, 0x9c, 0x4f, 0xb7, 0xcb, 0x9c, 0x24, 0xc0, 0xd4, 0x04, - 0x08, 0x47, 0xbe, 0xc8, 0xd7, 0xdb, 0xf9, 0x25, 0x86, 0xdd, 0x64, 0x63, - 0xa5, 0xe8, 0x92, 0xb3, 0x3c, 0x09, 0x3f, 0x4d, 0xa1, 0xed, 0xd8, 0x64, - 0x61, 0x99, 0x90, 0x69, 0x4d, 0x7a, 0x6e, 0x9e, 0x46, 0x9f, 0x4d, 0xf3, - 0xcb, 0x01, 0x4d, 0x67, 0x62, 0x1d, 0xf3, 0x19, 0x96, 0x42, 0xa7, 0x72, - 0x83, 0x0d, 0x2c, 0x5e, 0xbf, 0x8b, 0xfa, 0x40, 0x7d, 0x00, 0x26, 0x12, - 0x4c, 0xc5, 0xa7, 0xc9, 0x79, 0xde, 0xed, 0x99, 0x94, 0x6e, 0x43, 0x29, - 0x7d, 0xcf, 0x94, 0x30, 0x6f, 0xd3, 0xd5, 0xac, 0xaa, 0x52, 0xf5, 0xf2, - 0xca, 0x93, 0xcb, 0x25, 0xac, 0x78, 0x8b, 0x8a, 0x89, 0x22, 0xbf, 0x0b, - 0xe1, 0x5c, 0x80, 0x7e, 0xef, 0xe7, 0x8d, 0xdb, 0x91, 0xdd, 0xfc, 0x63, - 0x17, 0xa1, 0x9e, 0xf6, 0xc9, 0x15, 0xd4, 0xf1, 0x7d, 0x68, 0xff, 0x18, - 0xf8, 0x1a, 0xdc, 0xf4, 0x22, 0xfc, 0xb8, 0x85, 0xf7, 0x4f, 0xf0, 0x5f, - 0x97, 0x1e, 0x0a, 0x21, 0x21, 0xf6, 0x3a, 0xfc, 0x5c, 0xd2, 0x60, 0x25, - 0xa7, 0x04, 0xcb, 0x57, 0x23, 0x19, 0x1c, 0xbf, 0x3d, 0x26, 0xd7, 0x3c, - 0xe8, 0x93, 0xc7, 0xcc, 0x94, 0xf8, 0x9c, 0x78, 0xd2, 0x81, 0xd2, 0xa0, - 0x37, 0x4a, 0x72, 0xa7, 0xd1, 0x84, 0x8b, 0xf7, 0x00, 0xa7, 0x26, 0x28, - 0x5f, 0xd6, 0x77, 0x20, 0x2f, 0x7c, 0x90, 0x43, 0x1f, 0xe4, 0xcc, 0x07, - 0x39, 0xf2, 0x41, 0x5e, 0x6b, 0x90, 0x3c, 0xf4, 0xf2, 0x55, 0x50, 0x93, - 0x23, 0xeb, 0xc6, 0xa7, 0xcb, 0x04, 0x5f, 0xec, 0x74, 0x8b, 0x75, 0xaf, - 0xb5, 0xb8, 0x67, 0x8a, 0xd8, 0x1a, 0x95, 0xe7, 0xa5, 0xfe, 0x93, 0x4f, - 0xef, 0x19, 0xac, 0x75, 0xa2, 0xe1, 0x86, 0x7f, 0x31, 0x4c, 0x89, 0xd4, - 0x2c, 0x43, 0xe1, 0x95, 0xb6, 0xd1, 0x8b, 0xd1, 0xaf, 0xf0, 0x49, 0xff, - 0x7e, 0x2f, 0x82, 0xff, 0xa4, 0xc9, 0xbe, 0x5e, 0x9c, 0xe5, 0x97, 0xc5, - 0xaf, 0xcb, 0x04, 0xc7, 0x7c, 0x6d, 0x10, 0x51, 0xb4, 0x43, 0x82, 0xeb, - 0xe8, 0xa5, 0x12, 0x9b, 0x94, 0x0e, 0xd5, 0x70, 0xa7, 0x5b, 0x0c, 0xf4, - 0x2d, 0x0e, 0x2c, 0xb1, 0x56, 0x62, 0x51, 0xe8, 0xde, 0xab, 0xaf, 0x4a, - 0xd0, 0x57, 0xa3, 0xf7, 0x01, 0x32, 0x93, 0x1d, 0x08, 0x47, 0x04, 0x95, - 0xb1, 0xc7, 0xb2, 0xd1, 0xa8, 0x19, 0xd6, 0x73, 0x9e, 0x40, 0xfd, 0xd3, - 0xef, 0xa2, 0x89, 0x51, 0xe3, 0x68, 0x2f, 0x1a, 0x8d, 0x6d, 0xa0, 0xef, - 0x01, 0xc8, 0x10, 0x84, 0x82, 0x72, 0xdf, 0xd5, 0x49, 0xaa, 0x3d, 0x85, - 0x19, 0x24, 0x4f, 0x2c, 0x89, 0xde, 0x59, 0x7f, 0x05, 0x27, 0xab, 0xdb, - 0xcc, 0x65, 0xe9, 0xf1, 0xe0, 0x50, 0x03, 0x85, 0xa3, 0x55, 0x0d, 0x34, - 0x36, 0x60, 0xfb, 0xf0, 0x9e, 0xbe, 0x6b, 0xb2, 0x47, 0xe0, 0xd1, 0x6c, - 0x9d, 0x82, 0xc2, 0x61, 0x22, 0x37, 0xfd, 0x2c, 0xb9, 0x58, 0xac, 0xbe, - 0x04, 0xab, 0x15, 0x77, 0x6d, 0x70, 0xd1, 0x76, 0x26, 0xf8, 0x34, 0x9d, - 0xbb, 0xf5, 0xd3, 0xb9, 0x21, 0xfd, 0x19, 0x41, 0xb3, 0x90, 0x25, 0xfc, - 0xf2, 0x93, 0x9e, 0x38, 0xe0, 0x64, 0xe2, 0xd4, 0x16, 0xf8, 0x1a, 0xd3, - 0x60, 0xea, 0x69, 0x14, 0x83, 0xc9, 0xcb, 0x28, 0x73, 0x15, 0x4d, 0xc9, - 0x82, 0x22, 0x90, 0x64, 0xe2, 0x85, 0xae, 0xc9, 0xc6, 0x72, 0xb1, 0x4a, - 0xbe, 0xa5, 0xca, 0x4e, 0xa2, 0xc7, 0x63, 0x33, 0x4f, 0x3c, 0x7f, 0x3f, - 0xc6, 0x15, 0x36, 0xe4, 0x76, 0x5e, 0xdc, 0xa7, 0xbf, 0x8e, 0x17, 0x2a, - 0xee, 0x5a, 0xc9, 0xf4, 0xe4, 0xba, 0x10, 0x47, 0xc1, 0xf3, 0xf9, 0x62, - 0xb9, 0x14, 0x4e, 0xc8, 0x66, 0xc9, 0x74, 0x9b, 0x2f, 0xce, 0xb7, 0x4b, - 0xe5, 0xfb, 0x55, 0x81, 0xe4, 0xd3, 0x1f, 0x93, 0x15, 0xbd, 0x05, 0xa5, - 0x4b, 0x2a, 0x4f, 0xa3, 0xcb, 0x3c, 0xdf, 0x3c, 0x85, 0xc7, 0xe8, 0x39, - 0xac, 0xf2, 0x61, 0x8c, 0x4d, 0xcf, 0x97, 0xeb, 0x6b, 0xb0, 0x4a, 0x57, - 0x7b, 0x3f, 0x6d, 0x93, 0x8c, 0x4e, 0x46, 0xf7, 0x86, 0x6f, 0x8c, 0x9e, - 0x1c, 0xbe, 0xb1, 0xff, 0x78, 0x6f, 0xb6, 0x5d, 0x2c, 0xf1, 0x40, 0xbd, - 0x3f, 0xed, 0x13, 0xd9, 0x3e, 0xcd, 0xa9, 0xfa, 0x8b, 0x55, 0xff, 0x32, - 0xbf, 0x5a, 0x1e, 0x5a, 0x21, 0xd8, 0xc0, 0x38, 0x2c, 0x85, 0x89, 0x91, - 0x5f, 0xdf, 0x82, 0x09, 0xe4, 0x93, 0xe2, 0xd7, 0x6b, 0xd6, 0xdc, 0x9a, - 0x43, 0xed, 0xbe, 0x2b, 0x11, 0x63, 0x01, 0xd8, 0x87, 0xf9, 0x2f, 0xb7, - 0x14, 0x68, 0xcc, 0xf0, 0x0d, 0xdb, 0x1b, 0x3c, 0xcc, 0x42, 0x15, 0x12, - 0xe1, 0x94, 0x82, 0xfb, 0x35, 0xca, 0xcd, 0xc5, 0xe9, 0xc6, 0xb3, 0xb5, - 0xa3, 0x43, 0x0a, 0xd4, 0xd6, 0x35, 0x73, 0x80, 0x55, 0x58, 0x6e, 0x2a, - 0x90, 0x30, 0x53, 0x75, 0x9d, 0xb4, 0x72, 0x58, 0x14, 0x56, 0x06, 0x54, - 0xd6, 0x97, 0x4c, 0x0a, 0xcc, 0x49, 0xcc, 0xaa, 0x5f, 0x6d, 0xdc, 0x5c, - 0xd4, 0x9e, 0x42, 0x1f, 0x2f, 0xb3, 0x65, 0x0c, 0x63, 0x92, 0x6a, 0x2b, - 0x3c, 0xd8, 0x46, 0xcf, 0x0f, 0x78, 0xe3, 0xe0, 0xe5, 0x6e, 0xa7, 0x04, - 0x3b, 0x0e, 0x2b, 0xf4, 0x9e, 0x55, 0x16, 0x8d, 0x49, 0x93, 0x2e, 0x9f, - 0x5f, 0x2e, 0xb2, 0x41, 0x75, 0x2f, 0x4f, 0x85, 0x30, 0x75, 0xf9, 0xb1, - 0xc8, 0x80, 0xfa, 0x16, 0xe1, 0x8e, 0x96, 0xf0, 0x28, 0xfa, 0x7a, 0x81, - 0x3d, 0x3e, 0xc4, 0x72, 0x00, 0x97, 0xe1, 0x96, 0x03, 0x25, 0x81, 0x46, - 0x41, 0xa2, 0xb3, 0x35, 0xbc, 0xba, 0x7d, 0x7e, 0x81, 0xdc, 0x41, 0x32, - 0xcf, 0xa1, 0x64, 0xc4, 0xc1, 0x4f, 0xc1, 0x54, 0x4c, 0xd3, 0x8f, 0x44, - 0xb6, 0x1a, 0xe0, 0x86, 0xaf, 0xe3, 0xa7, 0x22, 0xcd, 0xe8, 0x14, 0x59, - 0x46, 0xbc, 0x5a, 0xca, 0xd7, 0x1b, 0x04, 0x86, 0x03, 0x67, 0x0c, 0xca, - 0x52, 0x0b, 0x0a, 0xb3, 0x32, 0x75, 0xc0, 0x4c, 0x86, 0xa3, 0xa4, 0xfd, - 0x75, 0x02, 0xe3, 0x52, 0x28, 0x45, 0x0a, 0x20, 0xbc, 0x9a, 0xe0, 0xd8, - 0x52, 0xd9, 0xda, 0x68, 0x16, 0xcb, 0x0d, 0xe5, 0x68, 0x77, 0x86, 0xb2, - 0x76, 0x60, 0x16, 0x66, 0xdc, 0x3f, 0x34, 0xf3, 0x6c, 0x40, 0x19, 0xad, - 0x65, 0x92, 0x4b, 0x6d, 0xf3, 0x0d, 0xcd, 0x0c, 0xb3, 0xc0, 0x29, 0xb2, - 0xd3, 0xe2, 0x3c, 0x71, 0x06, 0x6d, 0x2a, 0xb4, 0x96, 0xbf, 0x77, 0x99, - 0x02, 0x4d, 0x15, 0x81, 0x00, 0x11, 0x52, 0x73, 0x6a, 0xcd, 0xda, 0x22, - 0xc8, 0x0d, 0xe4, 0xf7, 0x05, 0xe6, 0x18, 0x7e, 0xbc, 0x15, 0x15, 0xdf, - 0xcd, 0x03, 0x76, 0xc6, 0xb8, 0xd5, 0x31, 0x6e, 0x35, 0x8c, 0x5b, 0x0b, - 0x43, 0x71, 0x71, 0x92, 0xc2, 0xec, 0xfe, 0x72, 0x81, 0x13, 0xd4, 0x9b, - 0xdb, 0xd1, 0x66, 0xbd, 0x9c, 0xa6, 0x31, 0x4c, 0xf8, 0x6f, 0x91, 0x53, - 0xcf, 0xcb, 0xfc, 0xe8, 0x6d, 0x49, 0xb1, 0xec, 0xfe, 0x58, 0xf6, 0xe3, - 0x62, 0x43, 0x6e, 0x87, 0x81, 0xca, 0x6d, 0x17, 0xc4, 0x03, 0x56, 0x60, - 0xb1, 0x02, 0xd1, 0x64, 0xa0, 0x2c, 0xd3, 0x1c, 0xc6, 0x57, 0x1a, 0x7d, - 0xb3, 0xc5, 0x19, 0x7c, 0x9e, 0x6b, 0xe3, 0xac, 0xd7, 0x03, 0x16, 0x4c, - 0xed, 0xb6, 0x9e, 0x1b, 0x4a, 0x6e, 0x35, 0xce, 0xe8, 0xb9, 0x03, 0xb0, - 0x36, 0x82, 0x6f, 0x31, 0x54, 0xc8, 0xe1, 0x9f, 0x76, 0xd1, 0x16, 0x17, - 0x5b, 0x51, 0x3e, 0x15, 0x4c, 0xd6, 0x04, 0xef, 0x92, 0xd1, 0xf6, 0xa2, - 0x60, 0x67, 0x91, 0x45, 0x9b, 0xc5, 0x4d, 0xb2, 0x84, 0x34, 0x82, 0xa1, - 0xe6, 0x11, 0x6d, 0x45, 0x1e, 0x6d, 0x06, 0x6e, 0xd9, 0xe9, 0xfa, 0xfa, - 0x53, 0x71, 0x01, 0x73, 0xa2, 0x35, 0xf5, 0xd8, 0x05, 0x9c, 0x9e, 0xfd, - 0xb0, 0xcd, 0xf2, 0xe4, 0x0c, 0x66, 0x7d, 0xd0, 0x9a, 0xaf, 0x29, 0x40, - 0x39, 0x89, 0x83, 0x71, 0x1a, 0x5a, 0x5c, 0x0c, 0xe3, 0x27, 0xfd, 0x43, - 0x72, 0x32, 0x7a, 0x8a, 0x2e, 0x5e, 0x4e, 0xf6, 0xd1, 0x4e, 0xc3, 0xf7, - 0x18, 0x18, 0xd2, 0x25, 0x0a, 0x1c, 0x7b, 0x79, 0xec, 0x96, 0x17, 0x8d, - 0x73, 0xc9, 0x5b, 0x7f, 0xd1, 0xb7, 0x3b, 0x2a, 0x9a, 0xc4, 0xc9, 0x33, - 0x26, 0x2c, 0x32, 0x81, 0x0d, 0x60, 0x29, 0xe6, 0x34, 0xf9, 0x69, 0xbb, - 0x48, 0x81, 0xe0, 0xe3, 0x28, 0x5b, 0xae, 0xf3, 0x4c, 0xc9, 0x9d, 0x49, - 0xba, 0x14, 0xa9, 0xb9, 0x68, 0x2e, 0xa1, 0x04, 0x0a, 0x35, 0x8a, 0xb9, - 0x8a, 0xaf, 0x72, 0x93, 0x74, 0x71, 0x96, 0xc1, 0x1c, 0x8c, 0x7d, 0xba, - 0x73, 0x49, 0x8b, 0x26, 0xd0, 0x1b, 0x4f, 0x93, 0x65, 0x53, 0xd8, 0xa0, - 0x99, 0x4a, 0xcf, 0x62, 0x69, 0xb4, 0x57, 0xde, 0xb8, 0x6a, 0xf1, 0x35, - 0x1c, 0xec, 0x7b, 0x4b, 0x39, 0x81, 0x45, 0x52, 0x4f, 0xac, 0xf0, 0x7a, - 0xb4, 0x96, 0xa3, 0xc5, 0x6b, 0xf6, 0xf3, 0x08, 0xd6, 0xcc, 0x31, 0xb0, - 0xd0, 0xd3, 0xca, 0xea, 0x09, 0x6a, 0x5d, 0x9f, 0x0e, 0x2d, 0x37, 0x97, - 0x53, 0x54, 0xb4, 0xc3, 0x43, 0xbb, 0x18, 0x92, 0xd9, 0x09, 0x09, 0x07, - 0x69, 0x43, 0x79, 0xe3, 0xb2, 0x7c, 0x90, 0xd7, 0x10, 0x60, 0x04, 0x3b, - 0x55, 0x50, 0x23, 0x80, 0x22, 0x6e, 0xab, 0x80, 0x0e, 0x00, 0x48, 0x30, - 0x56, 0xb6, 0xbb, 0x6c, 0x8e, 0xf1, 0x9b, 0xad, 0xb6, 0xc3, 0x40, 0x1a, - 0x44, 0x23, 0xe3, 0xbe, 0xb5, 0xa1, 0x6b, 0x1a, 0x24, 0xd3, 0x42, 0x43, - 0x81, 0x34, 0x56, 0x67, 0x3f, 0xa5, 0x79, 0x7c, 0x03, 0x6d, 0x8c, 0x7c, - 0xdc, 0xc2, 0xe7, 0xad, 0x6e, 0x62, 0xc1, 0x0e, 0x28, 0x40, 0x28, 0x6a, - 0x35, 0x8a, 0x61, 0x0f, 0xe3, 0x86, 0x00, 0x78, 0xef, 0x4d, 0x19, 0x40, - 0xab, 0x6c, 0x65, 0x4a, 0xe0, 0x53, 0x77, 0x4e, 0x0b, 0x3f, 0x41, 0xfd, - 0xa0, 0x93, 0xfc, 0xfe, 0x5b, 0x2f, 0xfa, 0xfd, 0xb7, 0x53, 0x48, 0x80, - 0xe5, 0xb2, 0xca, 0x56, 0x34, 0x01, 0x11, 0x04, 0x4b, 0x80, 0x50, 0x2f, - 0x98, 0x1f, 0x33, 0x1c, 0x17, 0x1c, 0x23, 0x6d, 0xe0, 0x5a, 0xce, 0x39, - 0x70, 0xd9, 0x14, 0x6b, 0x73, 0x10, 0xd2, 0x5c, 0x40, 0xb5, 0xf8, 0xaa, - 0xd6, 0x18, 0x43, 0x48, 0xf3, 0x4b, 0xe8, 0xcf, 0xa0, 0x2b, 0x22, 0x0b, - 0xa8, 0x31, 0xb8, 0x26, 0x23, 0x20, 0x34, 0x04, 0x18, 0xf8, 0x00, 0x06, - 0xa0, 0x38, 0xce, 0x81, 0x2e, 0x26, 0x69, 0x00, 0x6e, 0x3c, 0x8c, 0xfa, - 0x52, 0x92, 0xb3, 0x2c, 0x8e, 0x09, 0xeb, 0x65, 0x9c, 0xc4, 0xf7, 0x61, - 0xc6, 0xaf, 0xcb, 0x3c, 0x1d, 0x82, 0x96, 0xc3, 0xff, 0xb3, 0xa1, 0xb1, - 0x01, 0x48, 0x08, 0x6f, 0xc3, 0xc2, 0x01, 0x6e, 0x69, 0x51, 0x99, 0xae, - 0xbf, 0xc5, 0xf8, 0x84, 0x71, 0x51, 0xa3, 0x4e, 0x44, 0xe1, 0xd0, 0x64, - 0xa0, 0x1b, 0xa7, 0xe6, 0x7a, 0xdd, 0xa0, 0x39, 0xd4, 0x69, 0x8e, 0xaa, - 0x69, 0x02, 0x2d, 0x49, 0xb6, 0x9a, 0xe6, 0x48, 0xa7, 0x79, 0x50, 0x4d, - 0x73, 0x9f, 0x69, 0xde, 0x54, 0xd1, 0x3c, 0xd0, 0x69, 0x3e, 0xae, 0xa5, - 0x59, 0xb0, 0x5a, 0x45, 0xf3, 0xb1, 0x4e, 0xf3, 0xb0, 0xb6, 0xee, 0xfb, - 0x21, 0x34, 0x0f, 0x75, 0x9a, 0x4f, 0xc2, 0xda, 0x68, 0x9f, 0xeb, 0x4e, - 0x9d, 0x9e, 0x15, 0xe2, 0xaa, 0xd0, 0xc0, 0xbe, 0x2c, 0x9b, 0xa0, 0x78, - 0xfa, 0x71, 0x01, 0xc4, 0x88, 0x16, 0xf9, 0x6a, 0xba, 0x82, 0x04, 0xf9, - 0x39, 0xa3, 0xcf, 0x53, 0x6d, 0xd6, 0xa9, 0xee, 0xef, 0xa7, 0xbd, 0x8b, - 0xde, 0x8c, 0xa8, 0x2a, 0x1f, 0x4b, 0x20, 0xb0, 0xa1, 0x1a, 0xb2, 0xc0, - 0x36, 0x9e, 0x9a, 0x7d, 0x1c, 0x52, 0x40, 0x87, 0xa1, 0x2c, 0xf1, 0xe5, - 0x42, 0x7e, 0x81, 0x72, 0x9d, 0x7d, 0x71, 0x7a, 0x1c, 0xb2, 0x84, 0x31, - 0x2e, 0x46, 0x07, 0x9b, 0xfa, 0x3e, 0x16, 0x25, 0x0c, 0xf0, 0x9f, 0x67, - 0x6a, 0x93, 0x89, 0x5a, 0x94, 0x92, 0x69, 0xbc, 0x5a, 0xac, 0x0a, 0x97, - 0x52, 0x03, 0xd3, 0xc7, 0x3c, 0x03, 0x95, 0x3b, 0xb2, 0x3b, 0x29, 0x60, - 0x4e, 0x95, 0x1c, 0xab, 0xca, 0x26, 0xad, 0x2f, 0x92, 0xe9, 0x12, 0x12, - 0x3d, 0x3d, 0x39, 0x3e, 0xfa, 0xea, 0x93, 0x2f, 0x9f, 0xe1, 0xbe, 0x57, - 0xb5, 0xc3, 0x79, 0x42, 0x9d, 0x63, 0x30, 0x72, 0x7c, 0x49, 0x57, 0xed, - 0x7a, 0x9e, 0x85, 0x62, 0x61, 0xc1, 0xad, 0x4e, 0xdf, 0x8d, 0x05, 0x12, - 0xaa, 0x3a, 0xbb, 0x71, 0x83, 0x0e, 0x74, 0xde, 0xff, 0xe2, 0x33, 0x3a, - 0x91, 0x81, 0xb4, 0xf5, 0xf4, 0x2c, 0x39, 0x83, 0x95, 0xa8, 0x6a, 0x80, - 0xe2, 0x28, 0x82, 0xdb, 0x1c, 0x0a, 0xc2, 0x96, 0x4d, 0xb7, 0xab, 0x28, - 0x5b, 0xac, 0xe6, 0x49, 0x04, 0xe8, 0xe8, 0x13, 0x6f, 0x49, 0xb8, 0x14, - 0xe8, 0x22, 0x45, 0xff, 0x7f, 0x72, 0x13, 0x35, 0xc9, 0xe9, 0xdd, 0x8e, - 0x5a, 0x37, 0x50, 0x9e, 0xba, 0x38, 0x5f, 0xe5, 0xc4, 0x94, 0x3d, 0x03, - 0x3e, 0x8c, 0xcb, 0x4d, 0x50, 0x81, 0x01, 0xb2, 0x48, 0xdc, 0x14, 0x4b, - 0x49, 0xc3, 0x89, 0x60, 0xc1, 0xb1, 0x78, 0x25, 0xaf, 0x58, 0x31, 0x17, - 0x1e, 0xd0, 0xc9, 0x55, 0xa8, 0x3c, 0x6b, 0x1f, 0x50, 0xe5, 0x94, 0x87, - 0x0f, 0x87, 0x86, 0xd0, 0xdb, 0xe7, 0xad, 0xbd, 0x6c, 0x9e, 0x2e, 0x36, - 0xf9, 0xdb, 0x90, 0x44, 0x3f, 0x67, 0xeb, 0xb3, 0x5b, 0xf8, 0xf1, 0xd6, - 0x1e, 0x6e, 0xf6, 0xc0, 0x97, 0x3f, 0x00, 0xb5, 0x95, 0x2d, 0xd2, 0x23, - 0xa0, 0x01, 0x00 + 0xa5, 0xdb, 0x66, 0x0e, 0x12, 0xa0, 0x03, 0xe7, 0xcc, 0x72, 0x06, 0xb8, + 0x40, 0x03, 0x01, 0x3b, 0x08, 0xfe, 0x04, 0xa1, 0x28, 0x0f, 0x9c, 0x95, + 0xe4, 0x55, 0x17, 0xdd, 0x92, 0x96, 0x12, 0x35, 0x44, 0x49, 0x15, 0x8c, + 0x0b, 0x8f, 0x9b, 0x07, 0x0a, 0x1e, 0x44, 0x9a, 0xd9, 0xdc, 0xe9, 0xc1, + 0x1b, 0xa7, 0x1f, 0xf8, 0xa1, 0x3f, 0x8c, 0x5e, 0x1d, 0x3d, 0xdd, 0x9a, + 0x26, 0xc9, 0x6e, 0x81, 0x6e, 0x11, 0x1b, 0x7c, 0xba, 0x51, 0xd3, 0x49, + 0xe5, 0xf6, 0x5d, 0x3b, 0x0c, 0x19, 0xc0, 0x1c, 0x7f, 0xd4, 0x80, 0x29, + 0xe0, 0xf0, 0x6c, 0x64, 0xd1, 0xad, 0x51, 0xe8, 0xd8, 0xdd, 0x12, 0xba, + 0x2e, 0x2d, 0x28, 0xec, 0xb5, 0x1b, 0x4f, 0xf6, 0xf6, 0x76, 0x5b, 0xc9, + 0xdf, 0x25, 0xa9, 0x37, 0xdd, 0x52, 0xab, 0xd1, 0x28, 0x29, 0x95, 0x51, + 0x0f, 0xe7, 0x13, 0xd7, 0x0b, 0xe5, 0xfd, 0x44, 0xb8, 0x9e, 0x68, 0x3e, + 0x9f, 0xd7, 0xe7, 0xed, 0xba, 0x1f, 0x8c, 0xb6, 0x90, 0xdb, 0xd8, 0x02, + 0x01, 0x4d, 0x38, 0x47, 0x5c, 0x46, 0xcf, 0x54, 0xb8, 0xad, 0x5b, 0x7a, + 0x28, 0x86, 0xf4, 0x5f, 0x49, 0xc7, 0xdf, 0x14, 0x45, 0xd0, 0xa6, 0xf8, + 0x5c, 0xb7, 0xc4, 0x52, 0xb5, 0xfa, 0x60, 0x14, 0x0b, 0x37, 0x4f, 0x9a, + 0x3b, 0xdb, 0x4f, 0xb6, 0xdb, 0x4d, 0x24, 0x5c, 0x64, 0x12, 0x02, 0x3c, + 0xef, 0x24, 0x9e, 0xb7, 0x96, 0xd3, 0x67, 0x51, 0xd2, 0x21, 0x78, 0xc8, + 0xc8, 0x1e, 0x21, 0xec, 0x47, 0x64, 0xb4, 0x04, 0x8b, 0x02, 0xa9, 0x25, + 0xc3, 0x71, 0xa3, 0x61, 0xf7, 0xfb, 0xcd, 0x3c, 0xc7, 0xd9, 0x10, 0x22, + 0xb1, 0xd8, 0xa8, 0x62, 0x14, 0x8b, 0x73, 0xa8, 0x17, 0xe1, 0x3e, 0xad, + 0x6e, 0x89, 0xcd, 0xd6, 0xbd, 0x55, 0x71, 0xa4, 0x2b, 0x92, 0x0f, 0xb9, + 0xea, 0x66, 0x29, 0x2c, 0x47, 0xbd, 0x2b, 0x2d, 0x18, 0xf0, 0x95, 0x65, + 0xeb, 0x82, 0xb9, 0xd8, 0x29, 0xc9, 0x33, 0x30, 0x13, 0x80, 0x51, 0x10, + 0x5e, 0x50, 0xd5, 0x40, 0x10, 0x8f, 0x01, 0xd4, 0x53, 0x75, 0x54, 0xaf, + 0x3f, 0xf6, 0xc1, 0xb5, 0xbc, 0x3c, 0xa2, 0x14, 0x07, 0xf3, 0x00, 0x88, + 0xdb, 0xcc, 0x9a, 0x8d, 0x1f, 0x3e, 0xdd, 0x22, 0xb8, 0x95, 0x58, 0x4a, + 0x69, 0x75, 0x21, 0x57, 0xad, 0xc6, 0xad, 0xb9, 0x6a, 0x95, 0x0e, 0x96, + 0xb2, 0xf4, 0x74, 0x6b, 0x54, 0xd4, 0x9f, 0x48, 0xdf, 0x4d, 0xba, 0xe9, + 0xbe, 0xab, 0x74, 0x67, 0x1d, 0xa0, 0x03, 0xe5, 0x45, 0x20, 0xf1, 0x41, + 0x8d, 0xd5, 0x4c, 0x8e, 0x67, 0xcb, 0x62, 0xf2, 0xb0, 0x94, 0x29, 0x94, + 0x34, 0xc2, 0x34, 0x72, 0xa5, 0x8f, 0x96, 0xa5, 0xd3, 0xc8, 0x22, 0xab, + 0xa4, 0x45, 0xa1, 0x6b, 0x9a, 0x03, 0x6b, 0xda, 0x8b, 0x4c, 0x51, 0xf6, + 0xa0, 0x5a, 0xcc, 0x8b, 0x1a, 0x7e, 0x68, 0x57, 0x8d, 0xc6, 0xb1, 0x12, + 0x1e, 0x3a, 0xf7, 0x85, 0x1a, 0xd3, 0x45, 0x75, 0x2c, 0xae, 0x15, 0xca, + 0xf2, 0xc2, 0x4b, 0x2c, 0xde, 0xa2, 0x9c, 0xa5, 0x98, 0x00, 0xe4, 0xe9, + 0x56, 0x40, 0xe7, 0x8d, 0xc4, 0x20, 0x36, 0x13, 0x72, 0xe0, 0x43, 0x79, + 0xc7, 0xb2, 0x31, 0xe3, 0xae, 0xc9, 0x67, 0x70, 0x1b, 0xcc, 0x8c, 0x2d, + 0x49, 0xdf, 0x02, 0x50, 0x3a, 0x98, 0x3b, 0x43, 0xe7, 0xe9, 0x96, 0x73, + 0xf0, 0xc8, 0xeb, 0x85, 0xd3, 0x7d, 0xf9, 0xc9, 0x44, 0x74, 0x81, 0xf4, + 0x12, 0x53, 0xe9, 0x80, 0xaa, 0x8c, 0xca, 0x12, 0xc8, 0x81, 0x64, 0xe7, + 0x20, 0x66, 0x45, 0x25, 0xcb, 0xaf, 0x6b, 0x6b, 0x00, 0xad, 0x89, 0x4b, + 0xae, 0xc9, 0x75, 0x88, 0x4e, 0x65, 0xbb, 0x27, 0xc4, 0xfc, 0x89, 0x3f, + 0x1c, 0xde, 0xb6, 0x02, 0xe0, 0xe4, 0x86, 0x75, 0x80, 0x7a, 0xf2, 0x9c, + 0x48, 0xda, 0x82, 0x6c, 0x53, 0xac, 0x8a, 0x45, 0x12, 0x27, 0x3c, 0x88, + 0x99, 0x38, 0x6e, 0x51, 0x9b, 0xaa, 0x8b, 0xce, 0x7c, 0xef, 0x39, 0x5d, + 0x65, 0x85, 0x2b, 0x15, 0xc3, 0x93, 0x40, 0xa8, 0x72, 0xe5, 0x0a, 0x89, + 0x6f, 0x91, 0xac, 0xe8, 0xc0, 0x1c, 0x66, 0x89, 0x62, 0x6e, 0xa4, 0x24, + 0x6b, 0x1d, 0x97, 0x8f, 0xab, 0xcc, 0x44, 0x96, 0xd4, 0x5d, 0x6b, 0x66, + 0x3a, 0x0d, 0x1d, 0x7c, 0xc9, 0xf0, 0xaf, 0x0e, 0xfd, 0xc3, 0x59, 0xe1, + 0x43, 0xe8, 0xd7, 0x75, 0x51, 0x3e, 0x70, 0xcb, 0x87, 0x27, 0xb0, 0x41, + 0x3e, 0xee, 0x9f, 0x49, 0x37, 0x97, 0x43, 0x08, 0xab, 0xf4, 0xd2, 0xbc, + 0x9d, 0x2a, 0x70, 0xd7, 0x96, 0x0e, 0x40, 0xd2, 0x2d, 0xe7, 0x26, 0xca, + 0x7b, 0xeb, 0x25, 0x34, 0x46, 0x5f, 0x36, 0x86, 0xef, 0x1d, 0xb3, 0xf7, + 0xcb, 0x3e, 0x7e, 0x59, 0x9c, 0x01, 0x75, 0x85, 0xb2, 0xf9, 0x96, 0xc5, + 0x09, 0x5c, 0xd3, 0x05, 0x20, 0x90, 0xb4, 0xc4, 0xa5, 0x98, 0x58, 0x54, + 0x23, 0xc3, 0x01, 0x90, 0x34, 0x63, 0xe5, 0x28, 0xf0, 0xaf, 0x13, 0x27, + 0xd3, 0x89, 0x81, 0xe7, 0x39, 0xfe, 0xde, 0xce, 0x26, 0xe5, 0x66, 0x65, + 0x49, 0xad, 0x8d, 0x6a, 0x1e, 0x30, 0x7e, 0xdd, 0x53, 0x9a, 0x1d, 0x99, + 0x6a, 0x78, 0xf9, 0x56, 0x9c, 0x37, 0x0b, 0x54, 0x7c, 0x15, 0xa5, 0x59, + 0x5a, 0xc1, 0xd6, 0x6a, 0x15, 0x6c, 0x2f, 0xae, 0x60, 0xeb, 0x26, 0x15, + 0x6c, 0x15, 0x55, 0xb0, 0x75, 0x1f, 0x15, 0x6c, 0xdf, 0xba, 0x82, 0xed, + 0x9b, 0x54, 0xb0, 0x5d, 0x54, 0xc1, 0xf6, 0x2d, 0x2b, 0xc8, 0x79, 0x2b, + 0x9a, 0x8a, 0x65, 0x7d, 0x7d, 0x6f, 0x95, 0x1e, 0xad, 0xe3, 0x15, 0x71, + 0xcf, 0x8e, 0x0b, 0x5d, 0x6b, 0x0a, 0x50, 0x5b, 0xbe, 0x0a, 0x63, 0x25, + 0x9f, 0x65, 0x59, 0x0b, 0x9a, 0x00, 0x6d, 0xe9, 0xe0, 0xda, 0x96, 0xdf, + 0xba, 0x5e, 0x33, 0xae, 0x23, 0xcd, 0xe1, 0x06, 0xda, 0x72, 0x00, 0x2f, + 0x9d, 0xc6, 0xc9, 0x80, 0x86, 0x28, 0x4e, 0xbc, 0xae, 0xa4, 0x0c, 0x55, + 0xca, 0x40, 0xb9, 0x8c, 0xb3, 0x95, 0x50, 0x09, 0x46, 0x03, 0x1d, 0xba, + 0xb6, 0xce, 0xb2, 0xf8, 0x99, 0xed, 0xce, 0x50, 0x1e, 0xa1, 0x63, 0x7d, + 0xa5, 0x2d, 0x47, 0x88, 0x4a, 0xb4, 0xc0, 0x8f, 0xc9, 0x1a, 0xbe, 0xed, + 0x73, 0xce, 0x8e, 0x71, 0x97, 0x36, 0x27, 0x90, 0x51, 0x20, 0x68, 0x70, + 0xe4, 0xaf, 0x5b, 0x0a, 0x85, 0x71, 0xdc, 0x9b, 0x58, 0x18, 0xfb, 0x06, + 0x05, 0xd3, 0x03, 0x77, 0xa5, 0x03, 0xfa, 0xbc, 0xa5, 0x58, 0x08, 0xc5, + 0xbd, 0x49, 0x85, 0x90, 0x6f, 0x50, 0x28, 0xb4, 0xa2, 0x08, 0x7a, 0xf4, + 0x75, 0x5b, 0xb1, 0x10, 0x8e, 0xfb, 0x93, 0x0b, 0x61, 0xdf, 0xa4, 0x60, + 0x64, 0x14, 0x34, 0xb6, 0x8c, 0x3a, 0xd4, 0xb5, 0xa7, 0x6e, 0x86, 0x69, + 0xcb, 0xef, 0xfd, 0xb5, 0x7c, 0x74, 0x4b, 0x5f, 0x50, 0x06, 0x81, 0xf7, + 0x30, 0xd5, 0x87, 0x9f, 0x33, 0x10, 0x21, 0x39, 0x5d, 0xe4, 0x86, 0xde, + 0x52, 0xfc, 0x92, 0xe1, 0x7b, 0x93, 0xbf, 0x44, 0xbf, 0xc1, 0x06, 0xe0, + 0x40, 0xf2, 0xdd, 0xca, 0x9f, 0xe6, 0x39, 0x13, 0x11, 0xdc, 0x81, 0xb0, + 0xc1, 0xdc, 0x3d, 0x0e, 0x18, 0xc0, 0x7e, 0xfb, 0x21, 0x43, 0x62, 0x12, + 0x23, 0xbe, 0x1a, 0xba, 0xb4, 0x9a, 0xff, 0x4f, 0x11, 0x85, 0xfd, 0x6b, + 0xeb, 0xb4, 0xde, 0x44, 0x66, 0x55, 0x67, 0xa7, 0xa5, 0xea, 0xce, 0x2e, + 0xdd, 0xb1, 0x18, 0xbd, 0xee, 0xb9, 0xcb, 0x78, 0x44, 0x5c, 0x36, 0x06, + 0x45, 0x54, 0x76, 0x05, 0xc2, 0x4c, 0x5c, 0x96, 0x49, 0x50, 0x82, 0x84, + 0x62, 0xe1, 0xa4, 0x96, 0xf2, 0x63, 0xe2, 0x8b, 0x57, 0x06, 0x8b, 0x42, + 0xd8, 0x2a, 0x8c, 0xff, 0x04, 0x2b, 0x3c, 0x16, 0x39, 0x43, 0x12, 0xd9, + 0x0a, 0xec, 0x3d, 0xdd, 0x5a, 0xa1, 0x7f, 0x6c, 0xdd, 0xde, 0xb7, 0x92, + 0x91, 0x3a, 0xdc, 0xfe, 0x8d, 0xc8, 0x61, 0x5e, 0x2d, 0xd4, 0x4a, 0xc1, + 0x2d, 0xb5, 0x83, 0x0d, 0x76, 0xa8, 0x88, 0x5c, 0xdf, 0x90, 0xf3, 0xf0, + 0x8d, 0x04, 0x5d, 0xad, 0x21, 0x4d, 0xaf, 0x54, 0x18, 0x4b, 0x69, 0x82, + 0xb7, 0x6b, 0x39, 0x5e, 0xd1, 0xa4, 0xc0, 0xed, 0xfd, 0x35, 0xc5, 0x3a, + 0xf3, 0x03, 0x9d, 0x76, 0xcb, 0x09, 0x7d, 0x72, 0x69, 0x02, 0xaf, 0x86, + 0x58, 0xd8, 0x7f, 0x25, 0xb9, 0x22, 0xa2, 0x31, 0x06, 0x7d, 0x9d, 0xe8, + 0x7a, 0xca, 0x23, 0x39, 0xb9, 0x36, 0x1a, 0xb9, 0xa2, 0x41, 0x59, 0x64, + 0x44, 0xb6, 0x13, 0x86, 0xe1, 0x35, 0x4c, 0xec, 0xec, 0x5a, 0xa5, 0x4a, + 0x5a, 0x04, 0x57, 0x95, 0x28, 0x36, 0x08, 0xd7, 0xf6, 0xe6, 0x55, 0xa3, + 0x9d, 0x79, 0x86, 0xcd, 0x3e, 0x82, 0xa3, 0xe1, 0x90, 0x8c, 0x92, 0xe1, + 0x79, 0x11, 0xb2, 0xec, 0x94, 0x2d, 0x71, 0x67, 0xec, 0xf5, 0x7d, 0x94, + 0xc7, 0x3e, 0xcd, 0x8e, 0xdc, 0xd3, 0x57, 0x5a, 0xb7, 0xe3, 0xe9, 0x9d, + 0x89, 0x25, 0xad, 0x14, 0xb5, 0x5c, 0x2d, 0x56, 0xc2, 0x49, 0xf3, 0x6c, + 0x8d, 0x22, 0x87, 0xa1, 0x37, 0x92, 0xbb, 0x99, 0xd2, 0x93, 0x5d, 0x8b, + 0x97, 0x66, 0x56, 0x98, 0xa4, 0xd3, 0xdf, 0xf5, 0x23, 0xfd, 0x4d, 0xba, + 0xea, 0xf5, 0x6d, 0x2a, 0x55, 0xe5, 0x3b, 0x44, 0x2a, 0x44, 0x70, 0xcf, + 0xcd, 0x99, 0x28, 0xaf, 0x76, 0xbc, 0x50, 0x7c, 0x93, 0x37, 0x75, 0x24, + 0x5e, 0xc5, 0x81, 0x47, 0xa0, 0xe2, 0xb8, 0x8a, 0xac, 0xd5, 0x3d, 0xa8, + 0xc1, 0x94, 0xab, 0x4b, 0xbc, 0x5c, 0x1b, 0x3f, 0x30, 0x8d, 0x6f, 0x0a, + 0xde, 0x61, 0x73, 0xb3, 0x50, 0x56, 0x96, 0x8a, 0x5c, 0x84, 0xbb, 0x0f, + 0x9b, 0xbe, 0x50, 0x51, 0x56, 0x72, 0x6e, 0xbe, 0xf5, 0xc3, 0x88, 0x16, + 0x52, 0xa4, 0x02, 0xad, 0xd4, 0x20, 0x66, 0x40, 0x1c, 0xcb, 0xc2, 0xf7, + 0x3b, 0x1e, 0xae, 0x5d, 0x6f, 0x8b, 0xae, 0xfb, 0x58, 0xa9, 0xf2, 0x6f, + 0x7e, 0xfe, 0xe1, 0x03, 0x09, 0xe0, 0x46, 0x95, 0x9f, 0xfc, 0x21, 0x8a, + 0x4e, 0x20, 0x81, 0x5b, 0xfa, 0x71, 0xf7, 0x50, 0xfb, 0xd5, 0x5a, 0x9e, + 0x2a, 0xff, 0x9d, 0x1f, 0xac, 0x53, 0x79, 0x39, 0x41, 0xc9, 0x4c, 0x2a, + 0x76, 0x77, 0x76, 0xda, 0x3b, 0x09, 0x91, 0xe0, 0x1c, 0xd3, 0x7f, 0x9e, + 0x48, 0x76, 0x57, 0x16, 0xc9, 0x2f, 0xc2, 0x6b, 0xad, 0xe9, 0x12, 0x7d, + 0xa0, 0x4d, 0x39, 0xff, 0xc5, 0x95, 0xff, 0x0e, 0x65, 0xd7, 0xa8, 0xfc, + 0x14, 0xe0, 0x73, 0xd4, 0x24, 0x21, 0x00, 0x4a, 0xfa, 0xb7, 0x08, 0x60, + 0x95, 0xd0, 0xf7, 0x2d, 0x7d, 0xbf, 0x76, 0x7a, 0x52, 0xf8, 0xdc, 0xbb, + 0x71, 0xdf, 0x69, 0xaa, 0xbe, 0xf3, 0xa4, 0x94, 0x9e, 0x28, 0xf6, 0xbd, + 0x5b, 0x76, 0x9d, 0x9d, 0x1b, 0xc9, 0x6e, 0xd5, 0x4a, 0x3f, 0xf7, 0x67, + 0x37, 0xaf, 0x73, 0xc6, 0x5e, 0x98, 0x7a, 0xf7, 0xfd, 0xd9, 0x7f, 0x76, + 0xb5, 0xdf, 0xbf, 0x7c, 0xf6, 0x6e, 0x75, 0x1f, 0x5f, 0xfe, 0xc4, 0xce, + 0x3d, 0x7f, 0x83, 0x5e, 0x7e, 0x3b, 0xe5, 0x11, 0x7a, 0xb7, 0x6d, 0xa3, + 0xe6, 0x6e, 0xb2, 0x81, 0x70, 0xbc, 0xf4, 0xdf, 0xd1, 0x3c, 0x1b, 0xe8, + 0xd1, 0xbb, 0x4a, 0x6c, 0xa3, 0xe3, 0xc8, 0xbe, 0xfd, 0x48, 0xf8, 0xa3, + 0xdf, 0x87, 0x67, 0x88, 0x14, 0xf2, 0x8b, 0x12, 0x75, 0x70, 0x2c, 0x8c, + 0xec, 0xdb, 0x0e, 0x87, 0x4f, 0x6e, 0x24, 0xbd, 0x15, 0xab, 0xed, 0x4f, + 0xef, 0xa7, 0xd6, 0xfe, 0xf4, 0xdf, 0x51, 0xe9, 0x0d, 0xa8, 0x4c, 0xb2, + 0xa7, 0xbd, 0xfb, 0xee, 0xc3, 0xfb, 0xa3, 0x5f, 0xae, 0x6b, 0x1a, 0xf0, + 0x82, 0x3e, 0x1c, 0xb5, 0xfe, 0x37, 0x19, 0x07, 0xb0, 0xfc, 0xe2, 0xf0, + 0x9b, 0xa3, 0x1b, 0xf0, 0x8c, 0x23, 0x89, 0x9b, 0x8c, 0x5b, 0x64, 0x98, + 0x7e, 0x79, 0xf8, 0xe6, 0xcd, 0xe1, 0x0d, 0xb8, 0x1e, 0xd9, 0x93, 0x89, + 0xfd, 0xef, 0x63, 0xfb, 0xf8, 0xd5, 0x6f, 0x6e, 0x22, 0x6b, 0xcc, 0x1c, + 0xef, 0x5a, 0xd6, 0xf7, 0xdd, 0x35, 0x16, 0xfb, 0x98, 0xfa, 0x90, 0x8c, + 0x3c, 0x21, 0xa3, 0x5c, 0x4e, 0xb3, 0x2d, 0x47, 0x39, 0x9c, 0x4b, 0x67, + 0xf0, 0x1a, 0x77, 0xd1, 0x2d, 0xf2, 0xc4, 0xe5, 0x0a, 0xfb, 0x31, 0xde, + 0xd8, 0x34, 0x2c, 0xf2, 0x73, 0xca, 0xa6, 0xa9, 0x78, 0x80, 0xd9, 0x67, + 0x30, 0x01, 0x60, 0x49, 0x2f, 0xa8, 0xa8, 0x73, 0x59, 0x2b, 0xd2, 0x78, + 0x81, 0x59, 0xff, 0x4a, 0x34, 0x28, 0x3c, 0x70, 0x43, 0x1a, 0xcf, 0xb0, + 0x53, 0x74, 0x25, 0x1a, 0x74, 0x32, 0xe2, 0xa6, 0x34, 0xa2, 0xd5, 0x44, + 0xd5, 0x8b, 0x6e, 0x2a, 0x29, 0x50, 0xc0, 0xd6, 0x9a, 0x55, 0x89, 0x40, + 0x5b, 0xd6, 0xa2, 0xc3, 0x68, 0xd7, 0xec, 0x1f, 0x77, 0xa5, 0xd8, 0xae, + 0x7d, 0x26, 0xde, 0x52, 0x08, 0x7c, 0x8d, 0x71, 0xd5, 0x4c, 0x22, 0xb9, + 0xb8, 0x87, 0xe2, 0x77, 0x31, 0x89, 0xd2, 0x07, 0x2b, 0xd4, 0xb1, 0x5f, + 0x7e, 0x9d, 0xc8, 0x3d, 0x0d, 0xaa, 0xb1, 0xb4, 0xe2, 0x4d, 0x93, 0xa9, + 0x48, 0x7e, 0x2d, 0x44, 0xb5, 0xf4, 0xca, 0xa4, 0xcc, 0x8f, 0xcd, 0x5b, + 0xf2, 0x5d, 0x33, 0xf4, 0xde, 0xc7, 0xc4, 0xfb, 0xfd, 0x92, 0xef, 0xca, + 0xbc, 0x66, 0x1d, 0x96, 0x5f, 0x7e, 0x96, 0x5d, 0x8c, 0x25, 0xaa, 0x58, + 0x8b, 0xe5, 0xef, 0x63, 0xc5, 0x4a, 0xbc, 0xdf, 0x72, 0xd5, 0xb5, 0x90, + 0x0c, 0x84, 0x7c, 0x7f, 0x04, 0xd7, 0x4e, 0xfe, 0x8c, 0x1b, 0x2a, 0x3e, + 0xcd, 0xce, 0x62, 0x5e, 0x20, 0xb0, 0x83, 0xa7, 0x76, 0xe6, 0xad, 0xce, + 0xf2, 0x1d, 0xd3, 0x4b, 0x5f, 0x2c, 0x5d, 0x4a, 0x90, 0xe3, 0x57, 0x96, + 0x41, 0x94, 0x68, 0x5a, 0x7a, 0x29, 0xf8, 0x49, 0xcf, 0xb5, 0xf1, 0x7c, + 0xf0, 0x5d, 0xe0, 0xff, 0x9e, 0x86, 0x91, 0xb1, 0x4f, 0xb1, 0x3c, 0xfb, + 0x00, 0x87, 0xfc, 0xff, 0xf1, 0x57, 0x1c, 0x03, 0x6b, 0x3e, 0x91, 0x75, + 0xb2, 0xd6, 0xd9, 0xf3, 0x5c, 0xd8, 0x84, 0xfe, 0x54, 0x78, 0x0b, 0x9a, + 0x50, 0x37, 0x9b, 0xd2, 0xb4, 0xdb, 0xb7, 0x5b, 0xdc, 0x56, 0x4e, 0xbc, + 0x3f, 0x36, 0xd7, 0x52, 0x52, 0x1c, 0xcb, 0x76, 0xd7, 0xe3, 0x2e, 0x1f, + 0x67, 0x9a, 0x1c, 0x27, 0x9d, 0xa1, 0x55, 0xc6, 0xbe, 0x59, 0xbc, 0xa2, + 0x0e, 0x9b, 0x73, 0xeb, 0x14, 0xab, 0x39, 0x1c, 0xd1, 0x4b, 0xbd, 0xf9, + 0x22, 0x92, 0x77, 0xc3, 0xf2, 0xe3, 0x37, 0xc7, 0xaf, 0x8e, 0x1e, 0x57, + 0x1e, 0x74, 0xbb, 0xb5, 0xa6, 0xf5, 0xc7, 0x3f, 0x5a, 0x06, 0x16, 0xe7, + 0xfb, 0x7e, 0x89, 0xb0, 0x33, 0xb4, 0xd4, 0x00, 0x7f, 0x08, 0x9c, 0x01, + 0x4a, 0x6f, 0x3d, 0xae, 0x58, 0x07, 0xf1, 0x3b, 0x10, 0xcc, 0x1f, 0x55, + 0x05, 0xaf, 0x70, 0xae, 0xbb, 0xfe, 0xa8, 0x5c, 0xc2, 0x9b, 0x8e, 0x07, + 0x22, 0x92, 0x9b, 0xae, 0x2b, 0xfb, 0x69, 0xc0, 0x01, 0x4e, 0x61, 0x4e, + 0x88, 0x0d, 0x34, 0xe8, 0x91, 0x7c, 0xd3, 0xf2, 0xb3, 0x8b, 0x57, 0x83, + 0x72, 0xee, 0xac, 0x51, 0xa5, 0xce, 0x9a, 0x56, 0xd7, 0x67, 0xa3, 0xbb, + 0xd6, 0x63, 0xee, 0x27, 0x8f, 0x57, 0x45, 0x18, 0xaf, 0xa3, 0x15, 0xa1, + 0x1a, 0xa3, 0x36, 0x49, 0x4c, 0xa9, 0x83, 0x52, 0x4a, 0x94, 0x79, 0xe1, + 0xf2, 0x29, 0x3b, 0xbd, 0x10, 0x86, 0x3a, 0x0e, 0xf9, 0x0d, 0xf3, 0xa8, + 0x3a, 0x40, 0x7f, 0x84, 0xfb, 0x6b, 0x2c, 0x6c, 0xab, 0xb0, 0xe0, 0x55, + 0xe0, 0x94, 0xf4, 0xdc, 0xd3, 0x47, 0x07, 0xf8, 0x3c, 0x2b, 0x03, 0x3c, + 0xf7, 0xa7, 0x17, 0x74, 0xd9, 0x52, 0x9c, 0x23, 0xf8, 0xa0, 0x74, 0x89, + 0x54, 0xad, 0x7c, 0xe4, 0x8d, 0x5c, 0x27, 0x1c, 0x57, 0xac, 0x33, 0x29, + 0xfa, 0x6a, 0x06, 0xd2, 0x89, 0xea, 0x8c, 0xe4, 0xd5, 0xd0, 0xb2, 0x93, + 0xa8, 0x2d, 0x27, 0xc4, 0x14, 0x25, 0x0c, 0xe9, 0x6e, 0x24, 0x0a, 0x4f, + 0x85, 0x55, 0x42, 0x7a, 0xc1, 0x2f, 0xd8, 0x21, 0x16, 0xed, 0x99, 0xcb, + 0xaf, 0xa2, 0x56, 0xf8, 0x81, 0x84, 0xcf, 0x06, 0x62, 0x16, 0x63, 0xb9, + 0xba, 0x26, 0x5d, 0xdd, 0x9c, 0xc2, 0xeb, 0x24, 0x5a, 0x96, 0x01, 0x4e, + 0x28, 0xe6, 0x8d, 0x3b, 0x18, 0x54, 0xf9, 0x52, 0xd5, 0x64, 0xd3, 0x36, + 0x77, 0xca, 0x32, 0x7d, 0x37, 0x99, 0xab, 0xca, 0x99, 0xcc, 0x5f, 0xbc, + 0xb2, 0x7e, 0xd9, 0x2e, 0x23, 0xbe, 0xf0, 0xb1, 0x92, 0x84, 0x8b, 0xb7, + 0xc5, 0x03, 0x38, 0xfe, 0x9d, 0x04, 0x40, 0xb3, 0x25, 0x61, 0xe4, 0x63, + 0x1e, 0x2c, 0xde, 0x6b, 0x0e, 0x98, 0xf7, 0xfa, 0x77, 0x01, 0xa1, 0xa3, + 0x20, 0xf0, 0x83, 0x26, 0x80, 0x10, 0xe0, 0x71, 0x07, 0x70, 0xac, 0x22, + 0x95, 0xc3, 0x62, 0x32, 0xec, 0xd6, 0x2d, 0xe8, 0x3c, 0x8e, 0x63, 0x2e, + 0x42, 0xd1, 0x02, 0x0a, 0x88, 0x00, 0xab, 0xe4, 0x75, 0xeb, 0x3b, 0x97, + 0xce, 0x28, 0xe3, 0x54, 0xa5, 0x6c, 0xd1, 0xf7, 0x47, 0xcf, 0xdf, 0xbd, + 0x7d, 0x7b, 0xf4, 0xfc, 0x83, 0x7a, 0x7f, 0x34, 0x21, 0x8e, 0x02, 0xb4, + 0xfd, 0x08, 0x0a, 0x59, 0x4f, 0x22, 0x74, 0x71, 0xab, 0xd5, 0x1b, 0x1a, + 0x01, 0x81, 0x4c, 0xdf, 0x70, 0x35, 0xa1, 0x67, 0xab, 0x5e, 0x07, 0xa0, + 0xb5, 0xb5, 0x85, 0xd7, 0x22, 0x3a, 0x61, 0xdc, 0x54, 0x35, 0x1c, 0xab, + 0x22, 0x18, 0x24, 0x81, 0x71, 0xa3, 0x1e, 0xb8, 0xc0, 0x4b, 0xd9, 0x11, + 0xce, 0x60, 0xbc, 0x48, 0xbc, 0x10, 0x51, 0x25, 0x4d, 0x4c, 0x8d, 0x0c, + 0x49, 0x7a, 0xaa, 0xe0, 0xbd, 0x91, 0x7c, 0xee, 0x7b, 0x43, 0x67, 0x94, + 0x20, 0xd8, 0xe7, 0x84, 0x99, 0x7c, 0xb1, 0xaf, 0xa4, 0x9a, 0x2e, 0xf1, + 0x51, 0xf4, 0x42, 0x74, 0x75, 0x6a, 0x23, 0x29, 0x70, 0x56, 0x6e, 0x99, + 0x28, 0xa2, 0xb0, 0xa8, 0xc8, 0x7b, 0x1c, 0x67, 0xbc, 0x40, 0x01, 0xfe, + 0x2e, 0x02, 0xe0, 0x36, 0x03, 0x00, 0x7f, 0x73, 0x0a, 0x90, 0x9a, 0x5b, + 0x7c, 0xa4, 0xd4, 0xf1, 0xf2, 0x29, 0x6e, 0x49, 0xd3, 0x5a, 0xf7, 0x20, + 0x13, 0x91, 0xe4, 0x24, 0xc9, 0xa6, 0x32, 0x7d, 0xc8, 0xfa, 0x28, 0x7f, + 0x25, 0x33, 0x27, 0xe6, 0xd8, 0x24, 0x00, 0x5e, 0x0d, 0xc9, 0xce, 0xa0, + 0xe9, 0xc0, 0x2a, 0x31, 0xa6, 0xf6, 0x6a, 0xe0, 0x15, 0xe0, 0x18, 0x12, + 0x91, 0xc2, 0xf2, 0xf2, 0x22, 0xcc, 0x6c, 0x7c, 0x6f, 0x14, 0xeb, 0xe7, + 0xa9, 0x10, 0x53, 0xba, 0x9e, 0x61, 0x02, 0xb3, 0x8e, 0x72, 0x76, 0x64, + 0xa5, 0x7a, 0xe7, 0xc0, 0x17, 0xa1, 0xf7, 0x38, 0x22, 0x33, 0x72, 0x0a, + 0xb0, 0xfc, 0xab, 0xc7, 0x53, 0x8a, 0x8e, 0x89, 0xca, 0x6c, 0x8a, 0x65, + 0x6a, 0xbf, 0x36, 0x20, 0xfb, 0xa4, 0xec, 0x37, 0xde, 0x6c, 0x7a, 0x8a, + 0xab, 0x22, 0xc6, 0x01, 0xf8, 0xa8, 0xc6, 0x6f, 0x32, 0x87, 0xc4, 0x8f, + 0x06, 0x23, 0x91, 0x6a, 0x14, 0x76, 0x78, 0xa9, 0x89, 0xe9, 0x3b, 0xdd, + 0x91, 0x07, 0xd4, 0x90, 0xe9, 0xde, 0xcd, 0xdb, 0x5b, 0x91, 0xfc, 0x92, + 0xbe, 0x93, 0x19, 0xb4, 0xc3, 0x13, 0xe9, 0xcf, 0xf0, 0x95, 0x4c, 0xe6, + 0xc9, 0x13, 0x49, 0x12, 0xdf, 0xc9, 0x0c, 0x6a, 0x96, 0x13, 0x20, 0x03, + 0xcb, 0x44, 0x1c, 0x7b, 0x06, 0x91, 0x90, 0xb9, 0xd1, 0x42, 0x65, 0x93, + 0x84, 0x3c, 0xba, 0xd1, 0x22, 0x5b, 0xdc, 0x85, 0xb0, 0x17, 0x95, 0xa5, + 0x3c, 0x59, 0xb0, 0x91, 0x2c, 0x16, 0xc7, 0xd1, 0x51, 0xee, 0x58, 0xce, + 0x81, 0xd5, 0x66, 0xb2, 0x24, 0x94, 0x8e, 0xcd, 0x01, 0xe8, 0x05, 0xbd, + 0xe3, 0xcb, 0x7a, 0x7d, 0xf4, 0x0d, 0xae, 0x2d, 0x52, 0xa5, 0xc5, 0x60, + 0x61, 0x19, 0x7f, 0x4a, 0xdd, 0xcb, 0x5e, 0xad, 0x84, 0xde, 0x1f, 0xc4, + 0xe2, 0xd1, 0x9d, 0xca, 0xd2, 0x69, 0x79, 0xae, 0xf5, 0x80, 0x67, 0x58, + 0x97, 0x29, 0x79, 0x60, 0xb3, 0xc4, 0x4a, 0xc0, 0xea, 0x67, 0x1e, 0xca, + 0xac, 0x45, 0x02, 0x8a, 0x7e, 0x5a, 0xc7, 0x22, 0xc0, 0xb0, 0x57, 0x0c, + 0xf7, 0x9d, 0xcf, 0x02, 0xa1, 0xd1, 0x90, 0x7f, 0x66, 0xa1, 0xcc, 0x4a, + 0x96, 0xc6, 0x46, 0xbf, 0x73, 0x84, 0xd3, 0xeb, 0x3e, 0x1a, 0xf4, 0x3b, + 0xb5, 0xa8, 0x93, 0x01, 0x35, 0x8b, 0x1e, 0x00, 0x7c, 0xcb, 0x4d, 0x4b, + 0x52, 0x3d, 0x56, 0xfb, 0xff, 0xd2, 0xd0, 0x66, 0xb5, 0x80, 0x24, 0x04, + 0xc3, 0x30, 0xe5, 0x56, 0xe0, 0x94, 0x14, 0xa4, 0x09, 0xb0, 0x03, 0x10, + 0x5f, 0xd6, 0x3b, 0x9a, 0xd1, 0xa4, 0x40, 0xe2, 0xa0, 0x76, 0x8c, 0xea, + 0xe5, 0x77, 0xaf, 0xde, 0x59, 0x94, 0x90, 0x07, 0x7b, 0x37, 0x65, 0xe7, + 0x23, 0x06, 0x55, 0xcf, 0x19, 0x48, 0x13, 0xbb, 0x23, 0xaa, 0xf2, 0xda, + 0xc3, 0x2c, 0x88, 0x89, 0x95, 0x91, 0xea, 0xc1, 0x66, 0x59, 0xc7, 0xb4, + 0x69, 0x32, 0x07, 0x66, 0xa2, 0x53, 0xd4, 0x15, 0x29, 0xda, 0x84, 0x6e, + 0x1c, 0xa8, 0x97, 0x8c, 0x66, 0xa1, 0x4d, 0x50, 0x08, 0xc0, 0x4a, 0x74, + 0xd6, 0xb1, 0xf3, 0x25, 0x4b, 0xdd, 0x04, 0x47, 0x8c, 0x86, 0xf1, 0x51, + 0xfa, 0x21, 0x1c, 0x77, 0x69, 0x26, 0xd2, 0x75, 0x8a, 0x43, 0x1c, 0x80, + 0xc7, 0x4b, 0x83, 0x33, 0x0d, 0x1d, 0x07, 0x27, 0x28, 0x57, 0x9c, 0xa7, + 0x9b, 0x20, 0x8e, 0x2a, 0x90, 0xc9, 0x30, 0x57, 0x43, 0xe4, 0x41, 0x22, + 0x8f, 0x20, 0x78, 0xf4, 0xce, 0x10, 0x37, 0x33, 0x7a, 0x62, 0x57, 0xf7, + 0x33, 0x09, 0x9a, 0x82, 0x4c, 0x6e, 0x59, 0x89, 0x41, 0x65, 0x79, 0x6b, + 0xca, 0xa9, 0x29, 0x70, 0xb9, 0x69, 0x82, 0x0c, 0x22, 0xfd, 0xc8, 0x18, + 0x33, 0xc1, 0xd4, 0x3e, 0xd2, 0x77, 0x32, 0x23, 0xb7, 0xc3, 0x87, 0xea, + 0x1c, 0xa7, 0x59, 0x3a, 0x31, 0xe3, 0x4d, 0x51, 0xf4, 0x9a, 0xdc, 0x30, + 0xea, 0x55, 0x68, 0xb9, 0x33, 0x32, 0xdf, 0xf4, 0x9c, 0x04, 0x33, 0x53, + 0x7b, 0x40, 0x1d, 0xc6, 0x47, 0x10, 0x13, 0x03, 0x86, 0x75, 0x4c, 0x20, + 0x16, 0xc3, 0x58, 0xe5, 0xdf, 0x96, 0xf6, 0x7f, 0x5b, 0x42, 0x95, 0x71, + 0x8e, 0x9a, 0xc6, 0xc1, 0x94, 0x87, 0x97, 0x9c, 0x91, 0x92, 0xd3, 0x74, + 0x4c, 0xe5, 0x74, 0x42, 0x06, 0x90, 0x6d, 0xbf, 0xce, 0x93, 0x09, 0x59, + 0x88, 0xf4, 0x50, 0x4e, 0x49, 0x09, 0x2f, 0x66, 0xd1, 0x10, 0x6e, 0x50, + 0x4c, 0xe5, 0xe4, 0xf1, 0x5b, 0x9f, 0x8d, 0x54, 0x72, 0x2a, 0x59, 0x92, + 0x40, 0x57, 0x0a, 0xd8, 0x73, 0x17, 0x3a, 0xc3, 0x6f, 0x05, 0x3a, 0x2e, + 0x12, 0x06, 0xe1, 0xfd, 0xfa, 0xc3, 0xe8, 0xac, 0x3d, 0xdf, 0xc3, 0xc4, + 0x6b, 0x89, 0x3f, 0xec, 0x39, 0xb0, 0xde, 0x31, 0xe0, 0x22, 0x8f, 0xf8, + 0x97, 0x00, 0xa0, 0x51, 0xdf, 0x9f, 0x02, 0x7e, 0x36, 0x5f, 0xe6, 0x17, + 0xff, 0x0c, 0x9a, 0x13, 0x23, 0x75, 0x08, 0xa9, 0x05, 0x9f, 0x22, 0xe9, + 0x19, 0x2f, 0xf7, 0x89, 0x4f, 0x05, 0xac, 0xe5, 0x48, 0x40, 0xce, 0x3d, + 0xfc, 0x1a, 0xd4, 0xad, 0x97, 0xa2, 0x17, 0xcc, 0x9c, 0x53, 0x0b, 0x66, + 0x25, 0xc3, 0x86, 0x75, 0xea, 0xf9, 0x53, 0xcb, 0x9f, 0xc4, 0xcf, 0xd0, + 0x44, 0x2e, 0x17, 0x88, 0xc5, 0x7e, 0x32, 0x7f, 0xa3, 0x39, 0x06, 0xe2, + 0x3e, 0xbc, 0xb3, 0x8c, 0x93, 0xfc, 0x8a, 0x2e, 0x0f, 0x74, 0x5d, 0x3c, + 0x09, 0xef, 0x5e, 0x69, 0xc6, 0x5e, 0xf2, 0x73, 0xe3, 0x1d, 0x0b, 0xa6, + 0xb8, 0xdc, 0x45, 0x36, 0x43, 0x78, 0x68, 0x1a, 0x6c, 0x89, 0x83, 0xfc, + 0x33, 0xd7, 0xb6, 0x83, 0x25, 0xfe, 0xf1, 0x0b, 0x0a, 0x8a, 0xf7, 0x9c, + 0xdf, 0x2b, 0xd2, 0x67, 0xb6, 0xa7, 0x9d, 0x64, 0xa1, 0x7d, 0x64, 0xd5, + 0xb2, 0xba, 0xd1, 0xee, 0x41, 0x20, 0x22, 0xc1, 0xcc, 0x02, 0x0f, 0x19, + 0xb5, 0x08, 0xfb, 0xe3, 0xd9, 0x7c, 0xa9, 0x9b, 0x7c, 0x88, 0x5b, 0xc3, + 0x66, 0xe8, 0x30, 0xa8, 0x11, 0x62, 0x2e, 0xfd, 0x31, 0xc8, 0x09, 0x11, + 0xe2, 0x7e, 0x9e, 0x11, 0xb1, 0x86, 0x2a, 0x40, 0xcd, 0x79, 0xfa, 0x5c, + 0x4f, 0x7b, 0xc2, 0x73, 0x11, 0x9c, 0x46, 0xdc, 0x09, 0x0a, 0xfd, 0x60, + 0xa3, 0xd2, 0x74, 0xf1, 0xd9, 0xd0, 0x8e, 0x42, 0x5f, 0x60, 0x87, 0xe1, + 0xef, 0x4f, 0x8d, 0x1b, 0xfc, 0xc5, 0xb7, 0x41, 0x5b, 0xfa, 0xc1, 0x70, + 0x1d, 0xb4, 0x27, 0x9c, 0xf7, 0x80, 0xb9, 0x49, 0xc4, 0xac, 0xc8, 0x03, + 0xf6, 0xfd, 0x05, 0x2e, 0xb0, 0xbf, 0xc0, 0x05, 0xb6, 0x67, 0xf3, 0x42, + 0x1f, 0xd8, 0x89, 0x16, 0x7b, 0xc0, 0x2f, 0x81, 0x94, 0xbc, 0xd7, 0x09, + 0x79, 0xaf, 0x63, 0x7f, 0x04, 0xde, 0x07, 0x8b, 0xdd, 0xde, 0x6c, 0x01, + 0xd7, 0xe6, 0x02, 0xd7, 0xbb, 0xbb, 0xd0, 0x97, 0x6b, 0x3c, 0xde, 0x23, + 0xda, 0xe9, 0x28, 0xc8, 0x75, 0x62, 0xa5, 0x1b, 0xcf, 0x9c, 0x81, 0x33, + 0x12, 0xba, 0x90, 0xae, 0x71, 0xde, 0xe9, 0xb5, 0xa3, 0x95, 0x8b, 0x15, + 0x7b, 0xbe, 0x93, 0xd5, 0x3d, 0x5f, 0xaa, 0xc5, 0x07, 0xdb, 0x76, 0x37, + 0xe9, 0xf8, 0x0a, 0x6f, 0x55, 0xbf, 0x77, 0x24, 0x95, 0x12, 0x72, 0xf4, + 0x6c, 0x7b, 0xb2, 0x82, 0xf7, 0x3b, 0xb7, 0xd1, 0x25, 0xe6, 0xfe, 0x5d, + 0xfa, 0xbf, 0x68, 0x07, 0x56, 0x8e, 0xdb, 0xf8, 0xb5, 0x2b, 0x78, 0xc8, + 0x59, 0xd7, 0xd7, 0xc7, 0xb3, 0xf8, 0x5f, 0xf0, 0x7c, 0x49, 0xc3, 0xa6, + 0x36, 0xcc, 0x93, 0x6d, 0x9d, 0x92, 0x59, 0x10, 0xde, 0x42, 0xd7, 0xf7, + 0xd0, 0x1d, 0x89, 0x09, 0x3a, 0xe3, 0x12, 0xef, 0xf7, 0x34, 0x5c, 0xec, + 0xfe, 0x1e, 0xa2, 0xed, 0x45, 0x00, 0x07, 0x78, 0xb1, 0xff, 0xfb, 0x33, + 0x8c, 0xce, 0x08, 0x84, 0x2f, 0xf1, 0x7f, 0x5f, 0x8a, 0x53, 0x4c, 0xf8, + 0xd1, 0xff, 0x08, 0xf4, 0x7a, 0xef, 0x97, 0x6a, 0xc7, 0xd6, 0xce, 0x3a, + 0x75, 0xc4, 0x97, 0x25, 0x0e, 0xf0, 0xa9, 0x70, 0x0b, 0x1d, 0x60, 0xe7, + 0x7a, 0xff, 0xf7, 0xdd, 0x19, 0x6a, 0x85, 0x8e, 0x1b, 0x0a, 0x4e, 0x12, + 0xde, 0x12, 0xf7, 0x97, 0xbe, 0x2c, 0xf6, 0x81, 0xc9, 0xe3, 0xb8, 0xd6, + 0xff, 0x45, 0x1d, 0x12, 0xe3, 0x04, 0x0d, 0x87, 0x33, 0xd7, 0x38, 0xbf, + 0x23, 0x81, 0x01, 0x49, 0x50, 0x98, 0x7c, 0xa9, 0xf7, 0x9b, 0xf2, 0x28, + 0xfc, 0x29, 0x08, 0xd9, 0x5e, 0x91, 0x13, 0x9c, 0x81, 0x03, 0x76, 0x32, + 0xb6, 0x39, 0xd0, 0xfc, 0xc0, 0x3d, 0x16, 0x91, 0xc6, 0x9b, 0x1b, 0xab, + 0x57, 0xf2, 0x85, 0xa5, 0xfe, 0x65, 0xbc, 0xe1, 0x81, 0x58, 0xe8, 0x0d, + 0x7f, 0x23, 0x66, 0x51, 0xd8, 0xbf, 0xe7, 0xd0, 0x30, 0xf9, 0x36, 0xb3, + 0x6b, 0x5c, 0x61, 0x2c, 0x01, 0xa0, 0x19, 0xbd, 0x68, 0x91, 0x13, 0xfc, + 0xd1, 0x21, 0xbf, 0xdd, 0xb8, 0x49, 0xd7, 0x78, 0xc1, 0x1e, 0xf4, 0xda, + 0x63, 0xaf, 0x61, 0xe2, 0x24, 0xfd, 0xdf, 0x84, 0x9f, 0x65, 0x7d, 0x8b, + 0xed, 0xf1, 0x96, 0x08, 0x97, 0x7b, 0xc4, 0x13, 0xdb, 0xe5, 0xb0, 0xfe, + 0x0c, 0xb8, 0xea, 0xd6, 0x33, 0xe1, 0xcd, 0xa2, 0x2f, 0xc2, 0xfa, 0xf8, + 0xea, 0xe8, 0x9b, 0xa3, 0xf7, 0xd6, 0x2f, 0x8f, 0xde, 0x3f, 0x7b, 0xf5, + 0xf6, 0x9b, 0xa3, 0xb7, 0x55, 0x6b, 0x36, 0x21, 0x54, 0x9e, 0xdf, 0x1f, + 0x53, 0x89, 0x2f, 0x33, 0x6e, 0x3d, 0x67, 0xa9, 0x33, 0xfc, 0x9a, 0x4c, + 0x16, 0x1e, 0x9c, 0xfb, 0x8a, 0xde, 0x2a, 0xd5, 0x8d, 0x69, 0x1d, 0x39, + 0x52, 0x2f, 0x67, 0xa4, 0x97, 0xf7, 0x45, 0x54, 0xfa, 0xc0, 0x9a, 0xe4, + 0xcf, 0x56, 0x8f, 0x17, 0xab, 0xf9, 0x05, 0x84, 0xbb, 0x52, 0xb4, 0xf8, + 0x85, 0x08, 0x22, 0x67, 0xb4, 0x30, 0x5c, 0xcc, 0x10, 0x63, 0x17, 0x2a, + 0xd3, 0x13, 0xce, 0xc4, 0x7a, 0xcd, 0x1e, 0x31, 0x69, 0xd0, 0xa1, 0x0e, + 0x1b, 0x87, 0x35, 0x92, 0x7d, 0x15, 0xfd, 0x2e, 0x8a, 0x84, 0x6c, 0x39, + 0xd3, 0xd6, 0xf7, 0x32, 0x57, 0x10, 0x49, 0xc6, 0x96, 0x84, 0x8f, 0x67, + 0xcb, 0xfc, 0xe2, 0x8f, 0xe8, 0x25, 0x18, 0x90, 0xb0, 0x86, 0x85, 0x51, + 0x13, 0xfa, 0x83, 0x2b, 0x7a, 0x67, 0x3c, 0x87, 0x06, 0xcf, 0x55, 0xf0, + 0x85, 0xa8, 0x66, 0x34, 0xc7, 0xb5, 0x34, 0xe8, 0xd5, 0x8e, 0x18, 0xc2, + 0xb2, 0xc1, 0xb5, 0x1c, 0x92, 0xba, 0x3f, 0xe3, 0x7a, 0x42, 0x0c, 0xa7, + 0x42, 0x21, 0xa0, 0x8b, 0x40, 0xab, 0xf8, 0x0a, 0xc3, 0x94, 0x0b, 0xad, + 0x3a, 0x8e, 0x33, 0xc9, 0x7b, 0xcf, 0xd6, 0x70, 0xe6, 0x9d, 0x92, 0xf0, + 0x1c, 0x48, 0x5f, 0xa3, 0xf4, 0xc4, 0x78, 0xa2, 0x50, 0xe2, 0xfa, 0x7a, + 0xfc, 0xb2, 0x4f, 0xa3, 0x19, 0xd4, 0x0c, 0xbf, 0x9e, 0x29, 0x97, 0x7a, + 0x8e, 0xbc, 0x2f, 0xf5, 0x67, 0xf5, 0x7c, 0x74, 0x79, 0x20, 0x96, 0xc4, + 0x97, 0x5f, 0xd8, 0x41, 0x4f, 0x14, 0x79, 0xd7, 0x51, 0xb1, 0x73, 0xfd, + 0xcf, 0xbf, 0x2f, 0x72, 0xae, 0x0b, 0x7d, 0x6b, 0xe1, 0xfc, 0xf3, 0xcf, + 0x8b, 0xbd, 0xeb, 0xc3, 0xd3, 0x2f, 0x82, 0x5c, 0x93, 0x00, 0xc1, 0x77, + 0xaa, 0x97, 0xf5, 0x96, 0x7d, 0x23, 0x0f, 0xf4, 0xfe, 0xf9, 0xb7, 0x7f, + 0xfe, 0x59, 0x04, 0x8b, 0x1c, 0xed, 0x65, 0x65, 0x4f, 0x5d, 0x7a, 0x0c, + 0x16, 0xb9, 0xdc, 0xc6, 0xe5, 0x98, 0xff, 0xf3, 0x2f, 0x63, 0x48, 0x70, + 0x91, 0xc3, 0x1d, 0xfb, 0xdb, 0x30, 0x25, 0x68, 0x63, 0x86, 0xc6, 0x78, + 0x19, 0xbb, 0x79, 0x0b, 0x3c, 0x6e, 0x11, 0x7d, 0x59, 0xbd, 0xdc, 0x6d, + 0x82, 0xcd, 0xd3, 0x00, 0xfe, 0x29, 0x16, 0x1a, 0x66, 0xa1, 0xaa, 0xc8, + 0x26, 0xdd, 0xee, 0xd9, 0xbf, 0x2d, 0xde, 0x7c, 0xe8, 0x7d, 0xb1, 0xc7, + 0xae, 0x96, 0xa6, 0x58, 0x29, 0xd8, 0x2c, 0xcb, 0x2c, 0xf7, 0xa5, 0xdf, + 0x0b, 0x07, 0xdd, 0x7b, 0xe8, 0xc3, 0x6d, 0xbc, 0xb9, 0x6f, 0x5e, 0x1c, + 0x73, 0x16, 0x5e, 0xa2, 0x95, 0xee, 0xc4, 0x0b, 0x7f, 0x49, 0xce, 0xd4, + 0xbc, 0xbe, 0x8a, 0x1f, 0xfe, 0x33, 0xf8, 0xe1, 0xf5, 0x95, 0x5c, 0xf0, + 0x97, 0xdc, 0xe9, 0x96, 0x7a, 0xe1, 0xaf, 0xe2, 0xc0, 0x33, 0xd9, 0x8d, + 0x54, 0xbd, 0x96, 0xc6, 0xa0, 0xed, 0x9b, 0xc5, 0xa0, 0xbf, 0xe5, 0x40, + 0xf7, 0x68, 0x49, 0x0c, 0xfa, 0x03, 0x56, 0x75, 0x96, 0xbb, 0xe0, 0xba, + 0x03, 0x5a, 0x0c, 0xba, 0xcc, 0x09, 0xa7, 0x2a, 0xcd, 0x6d, 0xc0, 0x5e, + 0x4c, 0x33, 0xf5, 0xca, 0x3b, 0xe1, 0x3f, 0x0b, 0x84, 0x13, 0x16, 0xf9, + 0xe0, 0xef, 0xed, 0xc1, 0x75, 0x2e, 0xf8, 0x3f, 0xff, 0xd4, 0x4b, 0xf8, + 0xe0, 0x98, 0x1e, 0x5c, 0xeb, 0x82, 0x63, 0x3c, 0x38, 0x73, 0x96, 0xfa, + 0xe0, 0x73, 0xe1, 0x44, 0x00, 0xb8, 0x26, 0x00, 0xad, 0x3d, 0xc0, 0x65, + 0x1e, 0x78, 0xc6, 0x85, 0xc1, 0xf5, 0x10, 0x0e, 0xcc, 0x4c, 0x50, 0xe8, + 0x84, 0xa7, 0x40, 0x81, 0x5d, 0x03, 0x47, 0x0f, 0xb2, 0xd0, 0x85, 0x1e, + 0xc3, 0xb1, 0x02, 0x67, 0xaf, 0x21, 0x4d, 0x77, 0x91, 0xcf, 0xb0, 0x42, + 0xb8, 0x1a, 0xa1, 0xa9, 0x6f, 0x75, 0xb8, 0x5a, 0xbe, 0x4a, 0x09, 0x3b, + 0x59, 0xe4, 0x96, 0x0e, 0x73, 0x1e, 0xc3, 0x6c, 0xea, 0x78, 0xf9, 0xfe, + 0x19, 0x4a, 0xe2, 0x53, 0xa3, 0x7d, 0xf9, 0xec, 0x3d, 0x12, 0xf0, 0xa9, + 0x13, 0xd0, 0x06, 0xb2, 0x25, 0xe2, 0x84, 0x67, 0x2f, 0x91, 0x80, 0x4f, + 0x9d, 0xf0, 0xec, 0x3d, 0x25, 0xe0, 0x33, 0x4e, 0x78, 0x49, 0x38, 0xf0, + 0xa9, 0x13, 0x3e, 0x4a, 0x32, 0xf4, 0x15, 0x27, 0x49, 0x42, 0xf4, 0x15, + 0x27, 0x49, 0x52, 0xf4, 0x15, 0x27, 0x49, 0x62, 0xf4, 0x15, 0x27, 0x49, + 0x72, 0xf8, 0x32, 0x49, 0x92, 0x20, 0x7d, 0xc5, 0xd5, 0xf8, 0xc8, 0x14, + 0xe9, 0xcb, 0x24, 0xc9, 0xaa, 0x7d, 0x4c, 0xd4, 0xed, 0x23, 0x53, 0xa4, + 0xaf, 0x98, 0xf7, 0x8f, 0x8c, 0x9e, 0xbe, 0x4c, 0x92, 0xac, 0xcf, 0xc7, + 0x04, 0xfa, 0xf7, 0x1f, 0xa9, 0x20, 0x7d, 0x19, 0xc1, 0x7d, 0x24, 0x28, + 0xfa, 0x32, 0xa2, 0x63, 0x28, 0xfa, 0x32, 0xc2, 0xfb, 0x28, 0xa5, 0xf7, + 0x31, 0x21, 0x3e, 0x4e, 0xa2, 0x2f, 0x23, 0x40, 0xc6, 0x45, 0x5f, 0x86, + 0x22, 0xf7, 0x08, 0xfa, 0xca, 0x51, 0x2c, 0x86, 0x32, 0xcd, 0x45, 0x49, + 0xf4, 0x65, 0x28, 0x72, 0x12, 0xbe, 0x0a, 0x93, 0xd2, 0x3a, 0x63, 0x36, + 0xea, 0x1b, 0xad, 0x69, 0x74, 0xf0, 0x51, 0x7a, 0xfb, 0xee, 0xfd, 0x9b, + 0xc3, 0xd7, 0x1a, 0x43, 0xb3, 0xb5, 0x47, 0x64, 0x8e, 0x30, 0x65, 0x39, + 0x3e, 0xca, 0xe2, 0x30, 0x1b, 0xe7, 0x15, 0x12, 0x89, 0x85, 0x70, 0xbc, + 0x3d, 0x8a, 0x31, 0xec, 0x22, 0x81, 0xec, 0xfc, 0xc9, 0xaf, 0x5e, 0x1c, + 0x1e, 0x7f, 0xd0, 0xc9, 0xed, 0x96, 0x4e, 0x4e, 0xa6, 0x6e, 0xef, 0xe9, + 0xd4, 0x37, 0x47, 0xdf, 0xbc, 0xfa, 0xc5, 0x1b, 0x9d, 0xbe, 0xbb, 0xad, + 0xd3, 0x8f, 0x5f, 0xbf, 0x8b, 0xab, 0xb7, 0xd7, 0x88, 0x51, 0x27, 0x93, + 0x9f, 0x18, 0x8a, 0xc9, 0xf4, 0x66, 0x33, 0x26, 0xf9, 0xf2, 0xf5, 0xe1, + 0xf3, 0x57, 0x87, 0xaf, 0xe3, 0xfa, 0x98, 0x1a, 0x99, 0x4d, 0xf5, 0xb2, + 0x4a, 0xa6, 0x46, 0x16, 0x0f, 0x41, 0x31, 0x69, 0xa4, 0x71, 0x42, 0x56, + 0x26, 0x66, 0x83, 0x7b, 0x1a, 0x01, 0xc6, 0x25, 0x30, 0x0f, 0xc9, 0xc6, + 0xa2, 0x6d, 0xc9, 0xd4, 0x6c, 0x55, 0xb7, 0x75, 0xf2, 0xeb, 0xc3, 0xf7, + 0x2f, 0x8f, 0x62, 0x01, 0xe8, 0xd4, 0x5f, 0xc9, 0x64, 0xc3, 0x39, 0xed, + 0x50, 0x7b, 0x40, 0x5b, 0xbc, 0xcc, 0xbc, 0x97, 0xee, 0xb6, 0x8d, 0xf7, + 0xce, 0x94, 0x6b, 0x8e, 0x33, 0x14, 0xf5, 0x09, 0x56, 0xc5, 0x7e, 0x1f, + 0x56, 0x18, 0xb0, 0x60, 0x6b, 0xe6, 0x14, 0xb1, 0x7f, 0xda, 0xc5, 0xb8, + 0x55, 0x8c, 0x24, 0xb1, 0x85, 0xec, 0x7d, 0x02, 0x00, 0xee, 0xdd, 0x31, + 0xe7, 0x77, 0xe1, 0xe0, 0x73, 0x5c, 0xac, 0x5c, 0xb9, 0x2c, 0xd1, 0x56, + 0x11, 0x9a, 0xef, 0x60, 0x2f, 0xd6, 0x3e, 0x95, 0x10, 0x26, 0x37, 0xaa, + 0x7a, 0x95, 0xcb, 0x40, 0x44, 0xb3, 0xc0, 0x2b, 0x8b, 0xee, 0xbb, 0x1e, + 0xd9, 0xb9, 0x3a, 0x66, 0x40, 0x30, 0x72, 0x91, 0x4f, 0x7b, 0x2f, 0xdf, + 0x0d, 0xff, 0xf8, 0xc7, 0xcb, 0x93, 0x93, 0x29, 0x3d, 0x9f, 0x9c, 0x74, + 0x3e, 0x7d, 0xbe, 0x22, 0x0b, 0x4a, 0x2f, 0x1e, 0x40, 0x30, 0xf2, 0x90, + 0xee, 0x9b, 0x7e, 0xf4, 0x28, 0xc6, 0x26, 0xaa, 0x51, 0xe5, 0x52, 0xd4, + 0x63, 0xf0, 0x6e, 0x74, 0xf5, 0xc7, 0x3f, 0xa6, 0x73, 0x87, 0xb8, 0x17, + 0x93, 0x78, 0xf0, 0xf8, 0x1d, 0x25, 0x95, 0xa8, 0x3e, 0xb6, 0xc3, 0x77, + 0x73, 0x0f, 0xf4, 0xa6, 0x30, 0xe9, 0x17, 0x65, 0xaf, 0xf2, 0xe8, 0x51, + 0x59, 0x7c, 0xf2, 0x3e, 0x77, 0x23, 0x7c, 0x54, 0xae, 0x2a, 0xcc, 0xe2, + 0xd5, 0xbe, 0xc2, 0x82, 0x32, 0x92, 0xe7, 0xf8, 0xd9, 0x47, 0x0d, 0x69, + 0xff, 0x4d, 0x1d, 0x52, 0x40, 0x25, 0x67, 0x68, 0xee, 0x00, 0x74, 0x05, + 0x83, 0x55, 0xa3, 0x3a, 0xb3, 0xa2, 0xde, 0x42, 0x81, 0x7b, 0xaf, 0xbb, + 0x5d, 0xef, 0x6b, 0x55, 0xcd, 0x3e, 0x4f, 0x11, 0x40, 0xb1, 0x53, 0xf6, + 0x93, 0x60, 0xe6, 0x77, 0x15, 0xf7, 0xa9, 0x5a, 0x7e, 0xe5, 0x8a, 0x19, + 0x36, 0x42, 0xd3, 0x12, 0xb3, 0x92, 0x55, 0x53, 0x5c, 0xa8, 0x7d, 0xb2, + 0x51, 0x95, 0x9f, 0x18, 0xa1, 0xb8, 0xba, 0x2a, 0x57, 0xaa, 0x7e, 0xd7, + 0x40, 0x27, 0xd8, 0x57, 0x4d, 0x40, 0x14, 0xfc, 0xae, 0xa8, 0xf7, 0xf1, + 0x3a, 0xdc, 0x32, 0x15, 0xad, 0x96, 0x78, 0x96, 0x59, 0x42, 0xe6, 0x1f, + 0xff, 0x48, 0x09, 0xfb, 0x8a, 0xa6, 0x5f, 0x57, 0xc1, 0xf2, 0x6e, 0xa4, + 0x7f, 0x55, 0xfd, 0x3a, 0x03, 0x83, 0xaa, 0x7f, 0xa5, 0xc0, 0xa2, 0xb2, + 0x57, 0x15, 0x95, 0xaa, 0x77, 0x85, 0xfa, 0x55, 0x83, 0x25, 0xb4, 0xab, + 0x3e, 0xa8, 0xfb, 0xd8, 0xe5, 0xdd, 0x80, 0x6c, 0x22, 0x08, 0x3f, 0xea, + 0x36, 0x45, 0xbb, 0x52, 0x8d, 0xd3, 0x3c, 0xa4, 0x61, 0x17, 0x6d, 0xa9, + 0xc2, 0xba, 0x13, 0xa4, 0x99, 0xec, 0xbb, 0x7e, 0x88, 0x99, 0x9d, 0x9f, + 0x61, 0x32, 0xa8, 0x63, 0xea, 0xfa, 0x1c, 0x8b, 0xc0, 0x5e, 0xf7, 0x41, + 0xa3, 0x1a, 0xa0, 0x6d, 0x06, 0xe0, 0x17, 0x3f, 0x20, 0xf2, 0xd0, 0xf7, + 0xba, 0x5e, 0x35, 0x28, 0x64, 0xd4, 0x49, 0x0a, 0xd9, 0x19, 0x96, 0x31, + 0x05, 0xe0, 0x2d, 0x9e, 0x58, 0x81, 0x7e, 0xd0, 0x85, 0x30, 0x49, 0xe9, + 0x62, 0x1d, 0xaf, 0x48, 0x0c, 0x26, 0xe1, 0xaa, 0x1a, 0x76, 0x2f, 0x71, + 0x46, 0x4c, 0xf5, 0x08, 0xc6, 0xf3, 0x8d, 0xa0, 0xcb, 0x27, 0x9a, 0x62, + 0xbb, 0x8a, 0x0e, 0x57, 0x94, 0xd1, 0xfe, 0x6a, 0x5b, 0xb4, 0x7f, 0xf4, + 0xc6, 0x8e, 0xc6, 0x75, 0xb8, 0x51, 0x03, 0x7f, 0x52, 0xae, 0x10, 0xe8, + 0x2f, 0xa6, 0xb4, 0xaf, 0xb0, 0xb3, 0x23, 0xda, 0xd5, 0x20, 0x5b, 0xea, + 0x25, 0x66, 0xc3, 0x2f, 0x6c, 0x52, 0xb4, 0x4e, 0xb3, 0xde, 0xae, 0x9a, + 0xdc, 0x0f, 0x28, 0x82, 0x10, 0x60, 0x67, 0x1b, 0xa5, 0x98, 0x8f, 0x28, + 0xa0, 0x90, 0x78, 0x73, 0xab, 0x51, 0x1d, 0x88, 0xde, 0x6c, 0xd4, 0x79, + 0xd0, 0xbc, 0xda, 0xcf, 0xea, 0x4e, 0xa2, 0x41, 0x04, 0x14, 0x89, 0xd5, + 0x21, 0x23, 0xfc, 0xcb, 0x2b, 0x29, 0x7c, 0xbf, 0xcb, 0x42, 0x66, 0xd5, + 0x3a, 0x71, 0x1d, 0xf2, 0x4a, 0x45, 0x80, 0x3a, 0x73, 0xeb, 0xa3, 0x6f, + 0x56, 0x95, 0x42, 0xd0, 0x4f, 0xda, 0x3e, 0x4d, 0xdf, 0xdc, 0x42, 0xd4, + 0x6f, 0xab, 0xb2, 0x18, 0xc8, 0x07, 0x17, 0x3c, 0x7b, 0xc1, 0xa6, 0x63, + 0x95, 0x16, 0x8e, 0x69, 0x1f, 0x66, 0x2c, 0x1d, 0xb4, 0x99, 0xca, 0x50, + 0x09, 0xaf, 0x21, 0xde, 0xee, 0x03, 0x0d, 0xdd, 0x43, 0x64, 0x32, 0xb8, + 0xf8, 0x20, 0x37, 0x66, 0xbb, 0x7e, 0xaf, 0xa4, 0xd2, 0x99, 0xd2, 0x73, + 0xe8, 0x86, 0x18, 0x18, 0x60, 0xc5, 0xd1, 0xcf, 0x67, 0x02, 0x87, 0x29, + 0x3e, 0x7d, 0x96, 0xa9, 0xbe, 0xc7, 0xb0, 0x5d, 0x59, 0x4d, 0x9d, 0xc6, + 0xb5, 0xc8, 0xa4, 0xa9, 0xe2, 0x99, 0x54, 0xaa, 0x5b, 0x2a, 0xe9, 0x64, + 0x8c, 0xa6, 0x73, 0xc5, 0x3b, 0xa4, 0xa7, 0x54, 0xdd, 0xaf, 0x9f, 0xb0, + 0xe0, 0xcb, 0x25, 0x2a, 0x62, 0xf1, 0x85, 0xbc, 0x4a, 0x91, 0xa3, 0x2e, + 0x32, 0x7d, 0x39, 0x95, 0xaa, 0xc7, 0x0d, 0x5e, 0x05, 0xde, 0xb8, 0x33, + 0x7c, 0x9d, 0xc8, 0xe8, 0x44, 0xfb, 0x7d, 0xe8, 0x73, 0xa0, 0x9a, 0xb8, + 0xec, 0xc7, 0xc2, 0x51, 0x29, 0x95, 0x2a, 0x92, 0x66, 0x0c, 0xab, 0x52, + 0xba, 0xb0, 0xa3, 0x1a, 0x3c, 0x6f, 0x3b, 0x00, 0x8d, 0x0b, 0xfd, 0x11, + 0x5d, 0x00, 0xd3, 0x48, 0xbe, 0xaa, 0x7a, 0x8c, 0x61, 0x1e, 0xd6, 0x13, + 0xf2, 0x45, 0x82, 0x79, 0x42, 0x76, 0x4a, 0x9c, 0x75, 0xd8, 0xd2, 0x23, + 0x4c, 0xcf, 0x0d, 0x72, 0x11, 0x63, 0x97, 0x98, 0x42, 0x5c, 0x35, 0x8b, + 0xc4, 0x2b, 0x60, 0xce, 0xb7, 0x84, 0xaf, 0x04, 0xf9, 0xe8, 0x91, 0xfa, + 0x45, 0xe5, 0x91, 0x6a, 0x14, 0xab, 0x4e, 0x89, 0x79, 0x2a, 0x51, 0x92, + 0x0a, 0xd9, 0x82, 0x23, 0x12, 0xeb, 0x6b, 0x55, 0x8a, 0x54, 0x18, 0x14, + 0xaf, 0x52, 0x0d, 0xa3, 0x82, 0x0d, 0x0b, 0xda, 0x46, 0x71, 0xa6, 0x9b, + 0x87, 0x39, 0x53, 0x69, 0x60, 0xce, 0x3c, 0xe4, 0xf8, 0x53, 0xe9, 0x77, + 0xc2, 0x22, 0xcf, 0x1d, 0x16, 0x30, 0xc8, 0x9a, 0xa9, 0xd8, 0xab, 0x0a, + 0x45, 0x56, 0x32, 0x63, 0xc2, 0xdf, 0x65, 0xa5, 0x90, 0xa5, 0x0f, 0xaf, + 0xde, 0x1c, 0xbd, 0xfb, 0xc5, 0x87, 0x12, 0x54, 0x28, 0x86, 0xfd, 0xba, + 0x14, 0x49, 0x4d, 0x28, 0x75, 0x24, 0x98, 0xac, 0x25, 0x23, 0x7e, 0xf4, + 0x28, 0xfe, 0xc9, 0x35, 0x34, 0x64, 0xcf, 0x45, 0xdf, 0x92, 0xb4, 0xe3, + 0x3a, 0x97, 0x32, 0x22, 0xe0, 0xec, 0x1b, 0x0a, 0x80, 0x30, 0x69, 0xe6, + 0x33, 0xd2, 0x78, 0x8e, 0xfe, 0xb9, 0xa8, 0xb9, 0xa8, 0xef, 0x26, 0x1b, + 0xeb, 0x24, 0xd9, 0x31, 0x42, 0x1a, 0xea, 0x72, 0x16, 0x05, 0x55, 0x34, + 0xa4, 0x64, 0xd5, 0x19, 0x0b, 0xd2, 0xd5, 0xcf, 0x7c, 0xe3, 0x52, 0xea, + 0x6d, 0x9b, 0x76, 0x16, 0xb8, 0x5d, 0xa1, 0x7e, 0xf3, 0xa8, 0x8e, 0x79, + 0x7b, 0xa8, 0x06, 0xe7, 0xb8, 0xf7, 0x77, 0x3d, 0xf5, 0x6c, 0x64, 0xa1, + 0x28, 0x28, 0x47, 0x41, 0x0e, 0x41, 0xda, 0x45, 0x01, 0x89, 0x92, 0xda, + 0x5b, 0xfe, 0xea, 0x2d, 0xe6, 0x12, 0x97, 0x18, 0xef, 0x3b, 0xf9, 0xfe, + 0xdd, 0xb8, 0xaa, 0x62, 0x91, 0x01, 0xc1, 0x42, 0x9a, 0x68, 0x77, 0x60, + 0x51, 0xd5, 0x96, 0x6b, 0xfd, 0x0c, 0xf1, 0x2f, 0x44, 0xff, 0xee, 0xbb, + 0xa3, 0xb7, 0x0b, 0x11, 0x37, 0x6f, 0x81, 0xf8, 0xf9, 0xeb, 0x77, 0xc7, + 0xcb, 0x98, 0x6e, 0xdd, 0x12, 0xf7, 0xd1, 0x37, 0x0b, 0x51, 0xb7, 0x6f, + 0x8c, 0x3a, 0xf6, 0xc7, 0x56, 0x13, 0xbc, 0xa8, 0x1b, 0xa0, 0x3b, 0xa1, + 0x49, 0xad, 0xb1, 0x84, 0x1a, 0x65, 0xdf, 0x09, 0x1d, 0xd5, 0x38, 0x4b, + 0x48, 0x11, 0xc4, 0x5d, 0xd5, 0x4a, 0x36, 0xd7, 0x12, 0x62, 0x12, 0xe0, + 0x4e, 0x68, 0x99, 0x31, 0x6c, 0x21, 0x3d, 0xd9, 0x03, 0xe7, 0xe1, 0xd7, + 0xf4, 0x23, 0x33, 0x0c, 0x76, 0xb2, 0x7e, 0x07, 0x1c, 0x3d, 0x46, 0x62, + 0xac, 0x53, 0x16, 0x02, 0xbd, 0x5e, 0x23, 0x22, 0x97, 0xd6, 0xe0, 0x34, + 0x00, 0x95, 0x3b, 0xa9, 0x9a, 0x71, 0xa7, 0x16, 0x56, 0x8d, 0x7d, 0x4b, + 0xb8, 0x83, 0xe5, 0xac, 0x03, 0x56, 0x6d, 0xdc, 0x0d, 0x0f, 0xbd, 0x19, + 0x42, 0x7c, 0x58, 0x52, 0x39, 0x9c, 0x2c, 0xe5, 0x23, 0xef, 0x90, 0xd5, + 0x51, 0x68, 0xd6, 0x17, 0xe5, 0xe4, 0x3c, 0x46, 0x83, 0x97, 0xe4, 0x0a, + 0x59, 0xa9, 0xab, 0xfd, 0xee, 0xe8, 0x6b, 0xf1, 0x15, 0xe6, 0x1c, 0x88, + 0x56, 0x8e, 0x70, 0xe0, 0x33, 0xb2, 0x12, 0xf3, 0xc0, 0x67, 0xf0, 0x02, + 0x65, 0x2e, 0x5f, 0x41, 0xc6, 0xbf, 0x7a, 0x17, 0x91, 0x78, 0xcd, 0xb0, + 0x55, 0x71, 0x85, 0x9a, 0x7e, 0x55, 0xce, 0x37, 0x71, 0x9a, 0xf1, 0xce, + 0x1d, 0x89, 0x43, 0x9c, 0x63, 0x28, 0x08, 0xc9, 0xb2, 0xaf, 0xa1, 0x6d, + 0xa6, 0x50, 0xa7, 0x54, 0xba, 0x13, 0x36, 0xf4, 0x78, 0xb3, 0x06, 0x13, + 0xba, 0xc8, 0x5d, 0xb1, 0x10, 0xd0, 0x1a, 0x2b, 0xd6, 0x9a, 0xa2, 0x75, + 0xfa, 0x9d, 0x29, 0xd4, 0xb9, 0x73, 0x53, 0x3a, 0x0b, 0xd6, 0x11, 0xc7, + 0x2c, 0x58, 0x4d, 0x12, 0x09, 0x12, 0x75, 0x39, 0xb1, 0x48, 0x29, 0xb4, + 0x99, 0x4d, 0x09, 0x8a, 0x2d, 0xf0, 0xf4, 0xb6, 0x68, 0xca, 0xd2, 0x28, + 0x9e, 0x0d, 0xe9, 0xb9, 0x4c, 0xde, 0xcf, 0x59, 0x26, 0x3b, 0x9c, 0xe9, + 0xa4, 0x54, 0x65, 0x45, 0x0d, 0x04, 0x53, 0x64, 0xb6, 0xd8, 0xaa, 0xa5, + 0x9d, 0xaa, 0x0e, 0x5e, 0x24, 0xc5, 0x28, 0x2c, 0x7e, 0x1c, 0x94, 0x8a, + 0x80, 0x70, 0xda, 0xe5, 0x0f, 0xd4, 0x79, 0x07, 0x74, 0x23, 0x01, 0x16, + 0xf7, 0xe2, 0x8e, 0x58, 0xaa, 0x5c, 0xa5, 0x44, 0x11, 0xcf, 0x5b, 0x33, + 0xe2, 0x58, 0x3e, 0xe7, 0xcb, 0x4f, 0xe3, 0xf2, 0xb3, 0x46, 0x63, 0x5a, + 0xaf, 0xaf, 0xb9, 0xea, 0xf6, 0xc6, 0x4f, 0x66, 0x26, 0xb2, 0x1e, 0x97, + 0xac, 0xa8, 0x49, 0x48, 0x57, 0x85, 0x27, 0x32, 0x29, 0x6f, 0x74, 0x29, + 0x07, 0x5d, 0xc9, 0x01, 0x8f, 0xcc, 0x4c, 0xdf, 0x48, 0x90, 0x10, 0xc1, + 0x85, 0x57, 0xf4, 0xcd, 0x1c, 0x09, 0x0c, 0xa4, 0x01, 0x95, 0x90, 0x25, + 0x6c, 0xde, 0x70, 0x4e, 0x67, 0xe1, 0x18, 0xa5, 0x32, 0x6c, 0xe2, 0xec, + 0x69, 0xca, 0x1b, 0xcd, 0x08, 0x3e, 0x33, 0x6f, 0xff, 0x24, 0x3e, 0x3f, + 0x7a, 0x94, 0x4f, 0x93, 0xb8, 0xa3, 0x5c, 0x63, 0xd2, 0x1b, 0x66, 0xd6, + 0xc5, 0x5e, 0xce, 0x27, 0x76, 0x0b, 0x28, 0xe2, 0x8d, 0x70, 0x58, 0xd8, + 0x29, 0x9a, 0x47, 0x72, 0x6b, 0x5e, 0x65, 0xea, 0xa9, 0x84, 0x64, 0xe8, + 0x9b, 0xb0, 0x9e, 0x9c, 0xe3, 0x77, 0x1b, 0xfb, 0xd1, 0x53, 0x1b, 0x6b, + 0x6a, 0xbc, 0x16, 0xad, 0x86, 0x8c, 0xfd, 0xe8, 0xab, 0xaf, 0x2a, 0xe2, + 0x53, 0xf4, 0xb9, 0x1b, 0xe7, 0xe0, 0x61, 0x3f, 0xe5, 0x8a, 0xd7, 0x19, + 0xf1, 0xa3, 0x47, 0x89, 0xb3, 0xcc, 0x74, 0x14, 0xda, 0xbd, 0x28, 0xab, + 0x94, 0xea, 0x27, 0x2c, 0x23, 0x1c, 0x1f, 0x94, 0x3e, 0x53, 0xb8, 0xaf, + 0x6f, 0x47, 0xf9, 0x36, 0x38, 0x81, 0x75, 0x79, 0x0b, 0x6b, 0xce, 0x91, + 0x9a, 0x24, 0x8b, 0x92, 0xbd, 0x14, 0x39, 0x70, 0x2a, 0xea, 0x4b, 0xc2, + 0x3b, 0xd9, 0x68, 0xc0, 0xb2, 0x48, 0x10, 0x62, 0x6f, 0x40, 0x56, 0x14, + 0x64, 0xaa, 0x06, 0x06, 0x8b, 0x0f, 0x2c, 0x85, 0x81, 0x28, 0xbf, 0xea, + 0x50, 0x71, 0xfb, 0x3c, 0x5f, 0xbc, 0x6f, 0x8a, 0x3b, 0x28, 0x5e, 0x18, + 0xe0, 0x72, 0xaa, 0xb3, 0x6e, 0xa0, 0x43, 0x4b, 0xd9, 0x2e, 0x7b, 0xd0, + 0x80, 0x26, 0x20, 0x5f, 0x46, 0xb9, 0xa6, 0xfe, 0xbc, 0xec, 0xe5, 0xba, + 0x75, 0xad, 0x59, 0xa9, 0x1c, 0xf4, 0x19, 0xae, 0x5f, 0xa9, 0xa6, 0xba, + 0x82, 0x47, 0x6f, 0xc3, 0x1b, 0x10, 0x99, 0x52, 0x75, 0x56, 0xa9, 0xce, + 0x32, 0xf2, 0x9e, 0xdb, 0x4e, 0x54, 0x2c, 0x67, 0xcd, 0x0f, 0x45, 0x51, + 0x31, 0x1e, 0x60, 0x8f, 0xb7, 0x48, 0xcd, 0xe3, 0x12, 0xf1, 0x91, 0xa8, + 0x9a, 0x69, 0xb9, 0x32, 0xda, 0x75, 0x41, 0xcb, 0xfe, 0x22, 0x70, 0x13, + 0xaa, 0xcf, 0x71, 0xc2, 0x9c, 0xb3, 0x22, 0x54, 0x70, 0x50, 0xd1, 0xa5, + 0x56, 0x86, 0xfa, 0x9c, 0xd1, 0x2c, 0x73, 0x9f, 0xe0, 0x75, 0xf9, 0x44, + 0x09, 0xc9, 0x39, 0x34, 0xa2, 0xcc, 0x20, 0x79, 0xff, 0x67, 0x11, 0xca, + 0x88, 0xe1, 0xa3, 0x7a, 0x84, 0x95, 0x43, 0x0d, 0x13, 0x5d, 0x45, 0x63, + 0xba, 0xd6, 0xe6, 0x88, 0x67, 0xf5, 0x58, 0xd2, 0x3e, 0xb3, 0xe9, 0x26, + 0x8d, 0x5f, 0xbc, 0x7f, 0x9d, 0xb1, 0xd2, 0xda, 0xe4, 0x2d, 0x10, 0x21, + 0x61, 0x7e, 0x90, 0x8b, 0xc5, 0x3d, 0x7a, 0x54, 0x68, 0xc3, 0x2b, 0x97, + 0x05, 0x51, 0xbb, 0x86, 0x8c, 0x76, 0x65, 0x14, 0xdf, 0x83, 0x87, 0x66, + 0x22, 0x94, 0x50, 0x5d, 0x13, 0x71, 0xfc, 0x3a, 0x4c, 0xe4, 0x74, 0x10, + 0xa9, 0x05, 0x68, 0x2e, 0xc4, 0x99, 0x54, 0xca, 0x00, 0x25, 0xf2, 0x31, + 0xd0, 0xa0, 0x3a, 0x43, 0xc1, 0x38, 0x36, 0x5b, 0xb5, 0x4d, 0x81, 0xd9, + 0xd7, 0x4e, 0xb9, 0xd2, 0x99, 0x51, 0xdd, 0x72, 0xaa, 0xda, 0xf5, 0x2b, + 0x29, 0xe5, 0x03, 0x2b, 0x56, 0x20, 0x79, 0xc1, 0x37, 0x6d, 0x46, 0x81, + 0xfd, 0xce, 0x39, 0xd2, 0xa5, 0x83, 0x2e, 0x05, 0xa1, 0xf7, 0xf1, 0x8a, + 0x72, 0x71, 0x59, 0x80, 0xf6, 0xab, 0xaf, 0xd2, 0x2a, 0xad, 0xd8, 0xcd, + 0x63, 0xd2, 0xaa, 0x2f, 0xcd, 0xad, 0xb6, 0xb4, 0x34, 0xd8, 0xc7, 0x2a, + 0x13, 0x47, 0xa2, 0xcb, 0xe3, 0xae, 0x8d, 0xb8, 0x77, 0x0b, 0x26, 0x72, + 0xac, 0xa7, 0x66, 0x95, 0x54, 0xb3, 0xbf, 0xf5, 0x2d, 0xd9, 0xee, 0xb1, + 0x18, 0xe4, 0x35, 0x14, 0xb4, 0xa2, 0x7c, 0xe6, 0x60, 0x63, 0x99, 0x8a, + 0x45, 0x8e, 0xd9, 0x0a, 0xca, 0xae, 0x54, 0xae, 0xb0, 0x22, 0x15, 0x44, + 0x0c, 0x53, 0x3d, 0xa0, 0x2c, 0x38, 0xba, 0x51, 0xb9, 0xca, 0x82, 0xd3, + 0x0a, 0x4c, 0x6a, 0x10, 0xff, 0x5a, 0x64, 0xe3, 0xb8, 0x1d, 0x14, 0xce, + 0x49, 0xe2, 0x12, 0xd8, 0x60, 0xc4, 0xe2, 0x28, 0x49, 0x07, 0x30, 0xf1, + 0x03, 0x39, 0x59, 0x34, 0x5a, 0x76, 0x93, 0x89, 0x5f, 0x53, 0xbf, 0xb6, + 0xb9, 0xeb, 0x9a, 0xc4, 0x4a, 0x47, 0xa5, 0xa2, 0x44, 0x6e, 0xca, 0x95, + 0x8a, 0x66, 0xe6, 0xd8, 0xa2, 0x14, 0x8c, 0xa0, 0x49, 0xa1, 0x1b, 0x98, + 0x95, 0x62, 0xaa, 0x42, 0x87, 0xaf, 0x34, 0x08, 0xfa, 0x5a, 0x9f, 0x0d, + 0xc9, 0x55, 0xb2, 0xd3, 0x65, 0xc0, 0x52, 0x5d, 0x2f, 0xa9, 0x26, 0x3a, + 0x66, 0xa7, 0x63, 0x5d, 0xf9, 0x78, 0x61, 0x99, 0x17, 0x88, 0xca, 0xf2, + 0xb7, 0x0e, 0xfc, 0x29, 0xc0, 0xfc, 0xa0, 0xe9, 0x84, 0x85, 0x0e, 0x19, + 0x29, 0x6c, 0x81, 0x8b, 0x7a, 0x8d, 0xd3, 0xa9, 0x58, 0xcd, 0x6b, 0xea, + 0x3e, 0x74, 0xf9, 0xb2, 0xc0, 0xdf, 0xcc, 0xc7, 0xf7, 0x98, 0x7b, 0x0e, + 0x99, 0x69, 0x86, 0x31, 0xa2, 0xf6, 0xc7, 0x64, 0x53, 0x73, 0x02, 0x33, + 0xb1, 0xea, 0x85, 0xd2, 0x92, 0x20, 0x16, 0xdf, 0xdb, 0x52, 0xc9, 0xfb, + 0x8d, 0x8d, 0x34, 0xc6, 0x7c, 0xec, 0x2e, 0x23, 0x95, 0x92, 0x92, 0x33, + 0xcb, 0x9e, 0x16, 0x0b, 0xbf, 0x8e, 0xea, 0x89, 0x24, 0x70, 0xd9, 0xa1, + 0x8f, 0x14, 0xd6, 0x9c, 0x38, 0xb2, 0xcc, 0x9a, 0x80, 0x80, 0xe1, 0x3b, + 0x53, 0xa4, 0x64, 0x64, 0x5c, 0xe4, 0x75, 0xc9, 0xa5, 0x84, 0x52, 0x6e, + 0xdd, 0xe1, 0x9a, 0x52, 0x6a, 0xa5, 0x2c, 0xdf, 0x08, 0xd7, 0x94, 0x8b, + 0x5f, 0x6c, 0x51, 0x10, 0x4f, 0xbf, 0xb6, 0xac, 0x5c, 0x42, 0xcc, 0xab, + 0x6d, 0x5a, 0x35, 0x65, 0xb7, 0x5b, 0x4b, 0x64, 0x12, 0x3e, 0x2f, 0x2f, + 0xa4, 0xaf, 0x2b, 0x2c, 0x14, 0x59, 0x5f, 0x52, 0x28, 0x74, 0x33, 0x31, + 0xa1, 0xe0, 0x4d, 0x65, 0x94, 0xec, 0x88, 0x29, 0x21, 0x25, 0x33, 0x58, + 0x4c, 0xf9, 0xa5, 0xa1, 0x1c, 0x48, 0x66, 0xa9, 0x88, 0x68, 0x61, 0x91, + 0x18, 0xff, 0xc7, 0x5b, 0x17, 0xe8, 0xa6, 0x6f, 0xec, 0x58, 0xc0, 0xe1, + 0x3a, 0xbc, 0x02, 0x1f, 0x8e, 0x70, 0x9f, 0x37, 0x3b, 0xd7, 0xf5, 0x15, + 0xe8, 0x80, 0xa3, 0xdb, 0x85, 0x24, 0x54, 0xb7, 0x6b, 0x95, 0x08, 0xc2, + 0xa5, 0xc7, 0x12, 0xdd, 0x24, 0x64, 0xd2, 0x4b, 0xfa, 0xa2, 0x20, 0x8d, + 0xb1, 0xd4, 0x7c, 0xd2, 0xaa, 0x37, 0x77, 0xf7, 0xea, 0x4d, 0xbc, 0xbb, + 0xb8, 0xd5, 0x6c, 0x97, 0xe4, 0x4b, 0xca, 0x79, 0xf9, 0x1c, 0xd3, 0x49, + 0x1a, 0x55, 0x08, 0x6a, 0x4e, 0x1b, 0x12, 0x4a, 0xd6, 0x57, 0x5c, 0x0c, + 0x5f, 0xa5, 0xce, 0x5e, 0xb3, 0xa4, 0xb9, 0x8b, 0x8f, 0xfa, 0x9a, 0x3d, + 0x15, 0xae, 0xcd, 0xfb, 0x9e, 0xcd, 0xf6, 0xb1, 0x88, 0x8e, 0x85, 0x9f, + 0x0c, 0xe5, 0x0e, 0xbc, 0x87, 0x2f, 0xf8, 0x2f, 0x9d, 0xa7, 0xb7, 0x07, + 0x3f, 0x6c, 0xe0, 0x2f, 0x9b, 0x49, 0xd7, 0xc9, 0x51, 0x5e, 0x9b, 0xff, + 0x32, 0x79, 0x91, 0x27, 0x8b, 0xed, 0x35, 0x9e, 0x37, 0x72, 0x59, 0xd8, + 0xf4, 0x21, 0x29, 0x02, 0x6b, 0x9c, 0x7b, 0xe6, 0x84, 0x4e, 0xcf, 0x71, + 0x9d, 0x08, 0x7b, 0xce, 0x3f, 0x7d, 0x96, 0x89, 0xea, 0x08, 0xf8, 0x09, + 0xb5, 0x2f, 0x6d, 0x6f, 0xd3, 0x47, 0xbb, 0xe3, 0x8d, 0x6f, 0x27, 0x9e, + 0xda, 0xf9, 0xc6, 0xdb, 0x3b, 0x64, 0xcd, 0x65, 0xf8, 0xc1, 0xd4, 0x7b, + 0x6c, 0x76, 0xbf, 0xea, 0xb2, 0xf1, 0x4d, 0xed, 0xd9, 0xb4, 0x29, 0xef, + 0x6b, 0x6d, 0xa8, 0xa4, 0xf8, 0x02, 0xef, 0x1c, 0x18, 0x5c, 0x04, 0x93, + 0x46, 0x6d, 0x12, 0xd2, 0x9e, 0xe2, 0xa6, 0x79, 0xee, 0x7b, 0x84, 0xc7, + 0x3c, 0xd3, 0x6e, 0xb3, 0x74, 0x09, 0xdc, 0xa1, 0x9b, 0x82, 0xe0, 0x3d, + 0x82, 0x1d, 0x1c, 0x94, 0x84, 0x87, 0xa4, 0x52, 0x85, 0x47, 0x21, 0x14, + 0x2a, 0x3b, 0x57, 0x19, 0xa6, 0x96, 0x21, 0xcd, 0xa3, 0xe3, 0x4a, 0xf2, + 0xa9, 0xd3, 0x18, 0x9d, 0x3e, 0xd8, 0x67, 0x12, 0xe4, 0xab, 0xb4, 0x3c, + 0xde, 0x33, 0xdd, 0x00, 0x12, 0xa3, 0x25, 0xa3, 0x0c, 0x22, 0x3c, 0x26, + 0x45, 0x40, 0xf7, 0xb6, 0xca, 0x27, 0x43, 0x85, 0xb6, 0x69, 0xe8, 0x6c, + 0x3a, 0x07, 0x66, 0xf2, 0x95, 0xbe, 0x5c, 0xce, 0x3b, 0x8d, 0xaa, 0x15, + 0xd0, 0xc7, 0x88, 0x3e, 0x7a, 0xf4, 0x31, 0x16, 0xe7, 0x9d, 0x52, 0x43, + 0xfd, 0x61, 0xc3, 0xff, 0xbc, 0xc5, 0x40, 0xfc, 0x39, 0xe2, 0xcf, 0x5e, + 0x4b, 0xc1, 0xb5, 0xd2, 0x80, 0x6d, 0x06, 0xe4, 0xcf, 0x11, 0x7f, 0xf6, + 0xda, 0x0a, 0xb0, 0x9d, 0x00, 0xbc, 0x32, 0xa2, 0x1c, 0x9e, 0xc3, 0x8b, + 0xd6, 0x15, 0xd5, 0x55, 0xc5, 0x05, 0x2c, 0x89, 0x1d, 0x4a, 0xb8, 0x94, + 0x0a, 0x10, 0x74, 0xf1, 0x58, 0x92, 0xf5, 0x13, 0xc4, 0xb1, 0xe2, 0x66, + 0x94, 0x27, 0x79, 0x13, 0xca, 0x68, 0x5c, 0xe8, 0x94, 0x0c, 0xcc, 0xbb, + 0x87, 0x4f, 0x0c, 0x44, 0xb2, 0x1c, 0x90, 0x9e, 0x14, 0x03, 0x19, 0xc9, + 0x39, 0xa1, 0x4e, 0x17, 0x83, 0xb4, 0x12, 0x60, 0xfb, 0x3e, 0xe6, 0x31, + 0xe3, 0x13, 0xde, 0x04, 0x0b, 0x67, 0x35, 0x23, 0xed, 0x13, 0xb5, 0x53, + 0x74, 0x90, 0xd3, 0x10, 0x8a, 0x9b, 0xbc, 0x8a, 0xf6, 0xf9, 0x64, 0x05, + 0xbd, 0x83, 0x8c, 0x2e, 0x58, 0x9a, 0x06, 0xe4, 0x29, 0xd1, 0xa9, 0x89, + 0x28, 0x94, 0x57, 0xa0, 0x78, 0x74, 0xc5, 0x8f, 0xd9, 0x11, 0xf5, 0x4b, + 0x9c, 0x63, 0x76, 0x5d, 0xdb, 0xfa, 0x69, 0x68, 0xd1, 0x76, 0x68, 0xde, + 0xf2, 0x6b, 0x1d, 0xab, 0xf7, 0x7d, 0xf6, 0x2e, 0xac, 0x97, 0x48, 0x18, + 0xd9, 0xd6, 0x2f, 0x1d, 0x1c, 0xba, 0xf1, 0xbf, 0xff, 0x3d, 0xda, 0xe2, + 0x04, 0xfc, 0xf2, 0x90, 0xd7, 0xc0, 0x42, 0x44, 0x26, 0xb8, 0x38, 0x96, + 0x5b, 0xba, 0x82, 0xef, 0x7f, 0x2f, 0xde, 0x36, 0xf1, 0x87, 0xb0, 0x1c, + 0x72, 0xea, 0x91, 0x5b, 0x51, 0x0d, 0x20, 0x1d, 0x42, 0x73, 0x33, 0x59, + 0xaa, 0xa8, 0x81, 0x96, 0xa6, 0x8f, 0x89, 0xc8, 0x34, 0x66, 0x8b, 0xaf, + 0x4a, 0xc4, 0x85, 0x62, 0x2e, 0xfc, 0xf5, 0x00, 0x74, 0xbb, 0x44, 0xe1, + 0xf1, 0x43, 0xfc, 0x7c, 0x5c, 0xa9, 0xca, 0x63, 0x0a, 0x3a, 0x8d, 0x1f, + 0x90, 0xca, 0x67, 0x14, 0x74, 0x22, 0xfd, 0x46, 0x1a, 0x1f, 0x50, 0x88, + 0x13, 0xe9, 0x81, 0x52, 0x55, 0x67, 0xd1, 0xc9, 0xf2, 0x09, 0xe9, 0x52, + 0xd9, 0x75, 0x32, 0x1e, 0x88, 0xda, 0xbe, 0x15, 0xf3, 0x16, 0x51, 0x43, + 0x67, 0x59, 0xc3, 0x71, 0x84, 0x5f, 0xda, 0xae, 0x2e, 0x24, 0x13, 0x62, + 0x1e, 0xd3, 0x99, 0x3a, 0x49, 0x33, 0x9b, 0xce, 0x55, 0x29, 0x9a, 0xeb, + 0x4c, 0xae, 0x4e, 0x32, 0xec, 0xa7, 0xf3, 0xe3, 0xb4, 0xb8, 0x1e, 0xe9, + 0x7c, 0x9d, 0x84, 0x0a, 0x25, 0x64, 0xad, 0x9a, 0xff, 0x1b, 0x79, 0x25, + 0x1c, 0xd7, 0x49, 0x2a, 0x9d, 0x4a, 0xd1, 0xa5, 0x53, 0xaf, 0x63, 0xcd, + 0xa0, 0xe0, 0x57, 0xa3, 0x18, 0x79, 0xbc, 0xee, 0x69, 0x9a, 0x9c, 0xf1, + 0x89, 0xde, 0xbb, 0x87, 0xe4, 0xcf, 0xb1, 0x4c, 0x8a, 0x00, 0x38, 0xe3, + 0xb3, 0x96, 0x4b, 0x11, 0x04, 0xa5, 0x7f, 0xd6, 0xb2, 0x29, 0x84, 0xe0, + 0x8c, 0xcf, 0x46, 0x3e, 0x45, 0x30, 0x32, 0x07, 0x40, 0xfb, 0x4a, 0xe5, + 0x54, 0x95, 0xd4, 0xfd, 0x2a, 0x46, 0xa1, 0x75, 0xc6, 0x73, 0x4e, 0x2f, + 0xdb, 0x2e, 0x70, 0xc9, 0xee, 0x17, 0x8f, 0xe5, 0x34, 0xf6, 0x3f, 0x40, + 0x06, 0x27, 0xac, 0x70, 0x0f, 0x9f, 0x7c, 0x25, 0x31, 0x86, 0x73, 0x36, + 0x54, 0xf5, 0xd8, 0x1c, 0xe9, 0x7b, 0xf9, 0x7a, 0xf1, 0x45, 0x2c, 0x4c, + 0x14, 0xf4, 0x7e, 0x87, 0x71, 0xa1, 0xfc, 0x83, 0x4b, 0x48, 0xaf, 0xce, + 0x37, 0xa1, 0x5e, 0x55, 0xad, 0x1f, 0x5c, 0xb2, 0xa8, 0x12, 0xcf, 0x24, + 0x18, 0xf5, 0x58, 0xf9, 0xdd, 0xfe, 0xaa, 0x9c, 0xe0, 0x85, 0xc4, 0x45, + 0x9c, 0x38, 0x30, 0x50, 0xc1, 0xb7, 0x1f, 0xde, 0xbc, 0x26, 0xf7, 0xe3, + 0x21, 0x41, 0x80, 0x85, 0x0f, 0x3e, 0xa0, 0xcb, 0x9f, 0x48, 0xbe, 0x8a, + 0x52, 0xd5, 0x8a, 0x79, 0x52, 0x8d, 0xaa, 0x1f, 0x0c, 0x37, 0x9f, 0x93, + 0x77, 0x1e, 0x42, 0xd2, 0xc7, 0x30, 0x44, 0x52, 0xcc, 0x26, 0x39, 0xe5, + 0x93, 0x49, 0x6b, 0x96, 0x2c, 0x25, 0x53, 0xc0, 0x4a, 0xe1, 0x8c, 0xd3, + 0xba, 0xa4, 0x74, 0xe9, 0xc1, 0x94, 0xd1, 0x4d, 0x21, 0x8d, 0x9d, 0x86, + 0x2e, 0x7e, 0x65, 0x51, 0x1c, 0x62, 0xad, 0x96, 0x69, 0x96, 0xae, 0x6d, + 0x09, 0x3d, 0x98, 0x4a, 0x91, 0xd5, 0x03, 0x90, 0xcc, 0x25, 0x8e, 0x8a, + 0x12, 0x7b, 0x6b, 0xb6, 0x0d, 0xf1, 0x92, 0x6f, 0x8b, 0x0c, 0x52, 0x0c, + 0x8f, 0x2b, 0xe3, 0xa4, 0xb7, 0x7d, 0xaf, 0x5f, 0xbf, 0x56, 0x61, 0x05, + 0x0b, 0x53, 0x7b, 0xad, 0x35, 0xab, 0xd8, 0x5a, 0xb1, 0x8a, 0xad, 0x95, + 0x91, 0xd2, 0x0b, 0xbf, 0xd7, 0xaf, 0x63, 0xbb, 0xb0, 0x8e, 0x85, 0xa9, + 0xbd, 0xf6, 0x9a, 0x75, 0x6c, 0xaf, 0x58, 0xc7, 0xb6, 0xd6, 0x5a, 0x33, + 0x16, 0xf2, 0x9d, 0x9a, 0x30, 0xdf, 0x0c, 0x43, 0x21, 0xac, 0xf8, 0x6e, + 0xb5, 0xf9, 0x18, 0x63, 0xdf, 0x37, 0xef, 0xde, 0xc0, 0xa3, 0xd0, 0x67, + 0x23, 0x8d, 0xdd, 0x92, 0xf0, 0xd2, 0xf4, 0x87, 0x65, 0x35, 0x14, 0x9b, + 0x61, 0x4a, 0x76, 0x4d, 0xab, 0x6b, 0xfa, 0xaf, 0xa4, 0x2c, 0x3b, 0x71, + 0x1a, 0x46, 0xa6, 0x25, 0xa1, 0xb8, 0x77, 0xa7, 0x81, 0x38, 0x29, 0x09, + 0x63, 0xc6, 0x2e, 0x03, 0xc4, 0x69, 0x69, 0x28, 0x33, 0x84, 0x19, 0x30, + 0x95, 0x98, 0x84, 0x33, 0x23, 0x99, 0x01, 0x93, 0x69, 0x0a, 0xaa, 0x58, + 0x60, 0x85, 0x52, 0x32, 0x42, 0x62, 0x58, 0xe9, 0xf2, 0xb0, 0x72, 0x18, + 0x41, 0x01, 0x8f, 0x7c, 0x7f, 0x59, 0x6f, 0xa4, 0x10, 0x71, 0xba, 0x1a, + 0xd7, 0x72, 0xaa, 0x55, 0x68, 0xa3, 0x1b, 0x58, 0x69, 0xff, 0x5d, 0x52, + 0xac, 0xcb, 0x4a, 0x36, 0xaa, 0x69, 0x8b, 0xce, 0x65, 0x8d, 0xb0, 0x97, + 0x17, 0x45, 0xe1, 0xac, 0xf9, 0x37, 0x4d, 0xb0, 0x9c, 0x5f, 0x06, 0xd1, + 0x34, 0x17, 0x3d, 0x1a, 0xac, 0xa6, 0xc9, 0x96, 0xa3, 0x95, 0x30, 0x1a, + 0xd1, 0xf2, 0x67, 0x83, 0x99, 0x7c, 0x59, 0xbe, 0x14, 0xb8, 0x9b, 0x20, + 0x82, 0x33, 0xb7, 0xee, 0x80, 0x4f, 0x35, 0x7d, 0x6a, 0x7c, 0xde, 0x37, + 0x43, 0x6e, 0x12, 0x85, 0x75, 0xd0, 0xb5, 0x9a, 0x7b, 0xa9, 0x7b, 0x78, + 0x19, 0x51, 0x9d, 0x43, 0xbc, 0x6f, 0xed, 0x09, 0xd4, 0x25, 0x9d, 0x40, + 0x4b, 0x06, 0x18, 0xd7, 0xb1, 0xe1, 0x62, 0xeb, 0xb7, 0x3d, 0xfd, 0xe6, + 0xe4, 0xdf, 0xf6, 0xb6, 0x46, 0x55, 0xab, 0x84, 0x47, 0xec, 0xf7, 0x3f, + 0x2d, 0xa5, 0xc7, 0x90, 0x9b, 0xe3, 0x26, 0x64, 0x0a, 0xb5, 0xa6, 0x64, + 0x70, 0x7f, 0xff, 0x7b, 0xb1, 0xc6, 0xa9, 0x17, 0xd2, 0xe5, 0x55, 0xee, + 0x86, 0xfa, 0x76, 0x53, 0x65, 0xbb, 0xa9, 0xa6, 0xdd, 0x87, 0x9a, 0xdd, + 0xa9, 0x8e, 0x69, 0x13, 0xd1, 0x1f, 0xd3, 0x0b, 0x92, 0xad, 0x80, 0x3f, + 0x39, 0x9f, 0x66, 0x3c, 0xca, 0xb0, 0x4a, 0xbf, 0xde, 0x18, 0x09, 0x05, + 0xfd, 0x1e, 0x1f, 0xca, 0x9c, 0xe5, 0xcd, 0x69, 0x3e, 0x96, 0xf5, 0x58, + 0x96, 0x7a, 0x5c, 0xb5, 0xca, 0x95, 0xee, 0xc1, 0x65, 0xca, 0x03, 0x9a, + 0xd8, 0xa7, 0x38, 0x04, 0x82, 0xcb, 0x4c, 0x62, 0x53, 0x6e, 0xe3, 0x37, + 0x1d, 0x6e, 0xa5, 0x19, 0x4e, 0x0f, 0x67, 0xcd, 0x69, 0x56, 0xd3, 0xc0, + 0x2c, 0x8e, 0x8e, 0x43, 0xa7, 0x4e, 0x6a, 0xc7, 0xb6, 0x8f, 0xdf, 0x8c, + 0x28, 0x89, 0xef, 0x95, 0x63, 0x3e, 0x12, 0xfe, 0x98, 0x56, 0x30, 0xdd, + 0x5d, 0xd2, 0x1e, 0x1e, 0xc7, 0xa3, 0x9a, 0x15, 0x2b, 0x3b, 0x08, 0x26, + 0x47, 0x84, 0xeb, 0x11, 0xb4, 0xf2, 0x08, 0x5a, 0xeb, 0x61, 0x68, 0xe7, + 0x31, 0xb4, 0x17, 0x60, 0xc8, 0xdb, 0x6a, 0x93, 0x99, 0xf1, 0xd2, 0xe3, + 0xce, 0x55, 0x49, 0x76, 0x87, 0x4d, 0x36, 0x15, 0x13, 0x2c, 0x6e, 0xac, + 0x04, 0x2f, 0xca, 0x67, 0xbe, 0x45, 0x83, 0x8d, 0xf4, 0xf0, 0xbc, 0xaa, + 0xc0, 0x5b, 0x79, 0x14, 0xad, 0x75, 0x71, 0xb4, 0xf3, 0x38, 0xda, 0x1a, + 0xc7, 0x9d, 0x36, 0x1b, 0x59, 0x9a, 0x4d, 0xb6, 0x1a, 0xd1, 0x2b, 0x6e, + 0x34, 0xc3, 0x89, 0x9c, 0xda, 0xdc, 0xa2, 0xc9, 0x7a, 0xca, 0x59, 0x5a, + 0x55, 0xda, 0xad, 0x3c, 0x86, 0xd6, 0x9a, 0x28, 0xda, 0x79, 0x14, 0x6d, + 0x85, 0xe2, 0x4e, 0xdb, 0x8b, 0xec, 0xf8, 0x46, 0x1b, 0x8c, 0x08, 0x2e, + 0x68, 0xb1, 0x04, 0x2f, 0x32, 0x56, 0x70, 0x9b, 0x36, 0x9b, 0x2b, 0xdf, + 0x75, 0x65, 0x89, 0xb7, 0xf2, 0x28, 0x5a, 0xeb, 0xe2, 0x68, 0xe7, 0x71, + 0xb4, 0x15, 0x8e, 0xbb, 0x6d, 0x36, 0x39, 0x50, 0x6e, 0xb2, 0xdd, 0x24, + 0xc5, 0xe2, 0x86, 0x4b, 0x72, 0xa3, 0x43, 0x38, 0xf9, 0xa6, 0x93, 0x62, + 0x31, 0xc1, 0xee, 0xd8, 0x65, 0x5c, 0x4f, 0x32, 0x3a, 0x1e, 0xf1, 0x2c, + 0x46, 0x74, 0xb7, 0x41, 0x09, 0xc3, 0x60, 0x3e, 0x32, 0x51, 0x31, 0x53, + 0x9b, 0xcd, 0xfa, 0x11, 0x4c, 0xb0, 0x58, 0xf8, 0x09, 0x5e, 0x54, 0xf4, + 0x30, 0x27, 0x7a, 0xa3, 0x94, 0x9c, 0x9f, 0x99, 0x87, 0xe5, 0x45, 0x7b, + 0x4c, 0xb9, 0x77, 0x2b, 0x55, 0x26, 0x58, 0x2c, 0xd0, 0x2b, 0xe3, 0xb8, + 0xa5, 0x6b, 0xe6, 0xa9, 0x4a, 0xf5, 0x67, 0x01, 0xbe, 0x13, 0xc1, 0x3b, + 0x95, 0xa3, 0x27, 0x12, 0x24, 0xaa, 0xd4, 0x3c, 0xc2, 0x76, 0xb1, 0x77, + 0xb6, 0xac, 0x2f, 0x2b, 0xfa, 0xa4, 0x57, 0xdb, 0xea, 0x94, 0xf2, 0xf9, + 0x53, 0x29, 0x71, 0xc1, 0x4d, 0x29, 0x15, 0xea, 0x4a, 0xa1, 0xed, 0x2a, + 0xba, 0xa9, 0x19, 0x45, 0x8e, 0xf8, 0x53, 0xab, 0xb1, 0x2e, 0x69, 0xba, + 0x1c, 0x67, 0x0d, 0xba, 0xc9, 0x88, 0x7c, 0x0a, 0x52, 0x8a, 0xae, 0x58, + 0x78, 0xcd, 0xdd, 0xd5, 0xa5, 0x47, 0x6f, 0xf8, 0xfc, 0x7f, 0x96, 0xdf, + 0xd6, 0x56, 0x66, 0x25, 0x85, 0xde, 0xbb, 0x12, 0x60, 0x33, 0x4e, 0x26, + 0xea, 0xc0, 0x06, 0x5d, 0xc1, 0x60, 0x3e, 0x61, 0xe6, 0xbf, 0x72, 0xd5, + 0xa6, 0xcb, 0x1b, 0xf5, 0xd8, 0x14, 0xc4, 0x26, 0x40, 0x33, 0x89, 0xce, + 0x5d, 0x60, 0x27, 0x78, 0xd6, 0xc2, 0x66, 0xc2, 0xea, 0x1e, 0x58, 0x97, + 0x0b, 0x8d, 0xff, 0xaa, 0x96, 0x31, 0x37, 0xeb, 0x49, 0xe7, 0x9a, 0xe8, + 0x52, 0xce, 0xa0, 0x7e, 0x80, 0xcd, 0x1b, 0xd1, 0x1d, 0x7b, 0xde, 0x73, + 0xc6, 0xa1, 0xaa, 0x14, 0xf9, 0xdc, 0xb9, 0xe5, 0x7c, 0xcb, 0x14, 0x30, + 0x73, 0x28, 0x62, 0x94, 0xf6, 0xbc, 0xc8, 0x5a, 0x73, 0xa1, 0x54, 0xd7, + 0x4e, 0xb8, 0xf2, 0xff, 0x43, 0xf5, 0xe7, 0xfa, 0xac, 0x25, 0x01, 0x72, + 0xdb, 0xfe, 0x87, 0x04, 0x40, 0xd5, 0x59, 0xab, 0xfe, 0xe4, 0x00, 0xfd, + 0x2f, 0x09, 0x80, 0xea, 0xb3, 0x9e, 0x04, 0xa4, 0x57, 0xb1, 0x8e, 0x08, + 0xfe, 0x23, 0x2a, 0x2a, 0xd9, 0x5e, 0xab, 0xa6, 0x18, 0xe9, 0xd7, 0xb3, + 0x76, 0x9b, 0xaa, 0x0b, 0x18, 0x5b, 0xd9, 0x70, 0x5d, 0x25, 0x2f, 0x22, + 0x79, 0x35, 0x99, 0xca, 0x15, 0x02, 0x5b, 0x85, 0xe9, 0x07, 0x82, 0xd2, + 0xb7, 0x52, 0x83, 0xef, 0x39, 0xdd, 0x42, 0x52, 0x9e, 0x05, 0x18, 0x71, + 0xa7, 0x3e, 0x5d, 0xd0, 0x4d, 0x1b, 0xf4, 0x28, 0x06, 0x56, 0xb1, 0xcc, + 0x50, 0x01, 0xa8, 0x40, 0x0d, 0x14, 0xbf, 0x7a, 0xf3, 0xfa, 0x5b, 0x94, + 0x78, 0x2f, 0xfe, 0x80, 0x50, 0x56, 0xa4, 0x6b, 0x46, 0x00, 0x38, 0xd2, + 0xcb, 0x87, 0x31, 0xd8, 0x63, 0x93, 0xc2, 0x41, 0x99, 0xa4, 0x47, 0x95, + 0x9a, 0x87, 0xc8, 0x0d, 0x51, 0xe6, 0xf8, 0x06, 0x4f, 0x44, 0xb6, 0xad, + 0x47, 0x8f, 0x2c, 0xce, 0x20, 0x2c, 0xb3, 0x50, 0xce, 0x70, 0x1a, 0x85, + 0xaf, 0x3d, 0x8b, 0xe4, 0xe8, 0xa5, 0xd0, 0x84, 0x53, 0x1f, 0x5b, 0x80, + 0xe8, 0xca, 0x2f, 0xc5, 0x51, 0x92, 0x94, 0x86, 0x7e, 0x00, 0x6c, 0x8f, + 0x1f, 0x83, 0x46, 0x9c, 0x54, 0x31, 0x98, 0xcd, 0x5f, 0x2c, 0x83, 0x18, + 0x2a, 0x81, 0xd3, 0x38, 0x05, 0x4b, 0x4b, 0x96, 0x8e, 0x67, 0xfd, 0x3e, + 0x46, 0xfc, 0x07, 0xa5, 0x5c, 0x61, 0xf9, 0x98, 0xc7, 0x73, 0xad, 0x70, + 0x2a, 0x09, 0xf4, 0x47, 0xef, 0xdf, 0xbf, 0x7b, 0xff, 0xc0, 0xca, 0xbd, + 0x4a, 0x4b, 0xd2, 0xcb, 0xd0, 0xba, 0x4a, 0x04, 0xb3, 0xa9, 0x95, 0x2b, + 0xdc, 0x5e, 0x7c, 0xf8, 0xbf, 0xf4, 0xdd, 0x3b, 0xba, 0xf7, 0xc7, 0x62, + 0x0d, 0x88, 0x82, 0xd8, 0xff, 0x96, 0x9c, 0x19, 0xb0, 0x97, 0x47, 0x45, + 0x50, 0x0c, 0x40, 0x4a, 0xcb, 0x68, 0xb3, 0x5e, 0x31, 0xd6, 0xa8, 0xf8, + 0xb6, 0x54, 0xd9, 0xf6, 0x4b, 0x97, 0xaf, 0x70, 0x6a, 0xac, 0x8f, 0x07, + 0xf8, 0x4e, 0xd9, 0xf5, 0xab, 0xc6, 0x0f, 0x4b, 0xfb, 0x2b, 0x17, 0xae, + 0x0d, 0x7c, 0x8f, 0x30, 0xc0, 0xff, 0x3a, 0x8c, 0xb0, 0x7d, 0x1c, 0x6f, + 0x01, 0x13, 0xbc, 0xa7, 0xdf, 0x3f, 0x45, 0x9e, 0x1d, 0x8e, 0xed, 0x20, + 0xa0, 0x03, 0x0d, 0x40, 0x5b, 0x6d, 0x62, 0x7f, 0x4f, 0xe5, 0x3a, 0xd4, + 0xd8, 0x84, 0x82, 0x17, 0x06, 0x2a, 0x35, 0xc8, 0xb0, 0xa6, 0xbd, 0xbd, + 0x3a, 0xbc, 0x84, 0xf8, 0x66, 0x58, 0x89, 0x50, 0x75, 0xab, 0x12, 0x7d, + 0x66, 0x36, 0xd4, 0x6d, 0x81, 0xc4, 0x09, 0xef, 0x02, 0x2a, 0x55, 0xd5, + 0x9e, 0x1c, 0xd3, 0x49, 0xe2, 0xa5, 0xfe, 0xfc, 0xbb, 0xfd, 0x5e, 0x4a, + 0x97, 0x52, 0x6e, 0x20, 0xe2, 0x9b, 0x01, 0xb0, 0xbb, 0xed, 0x5f, 0xe5, + 0x1d, 0x89, 0x72, 0xeb, 0x34, 0xf0, 0x57, 0x44, 0x38, 0x9e, 0x03, 0x49, + 0xda, 0xa4, 0xaf, 0x05, 0x5a, 0x02, 0x03, 0xe5, 0x7a, 0x0c, 0xd7, 0xd0, + 0xc7, 0x35, 0x9d, 0xce, 0x9b, 0x1c, 0x6e, 0x6b, 0x48, 0x93, 0x60, 0x3b, + 0xb4, 0xa5, 0x94, 0xe1, 0x0f, 0xf9, 0x25, 0x76, 0x57, 0x92, 0x75, 0xda, + 0x96, 0xfd, 0x1a, 0xce, 0x0e, 0xbc, 0x24, 0xd2, 0xee, 0x6a, 0xb5, 0x5a, + 0xad, 0x56, 0xd7, 0x6a, 0x02, 0x2f, 0x9e, 0x9d, 0x3c, 0x3d, 0x04, 0x4a, + 0xce, 0x6a, 0x43, 0x8c, 0x6a, 0x0e, 0x33, 0xa7, 0xcd, 0x94, 0x5f, 0x69, + 0x80, 0x25, 0xf5, 0x83, 0x2e, 0xf5, 0x00, 0xa1, 0x3b, 0x1d, 0x47, 0xf5, + 0x89, 0x34, 0x54, 0xec, 0x93, 0x93, 0x2f, 0x3e, 0x1f, 0xac, 0x27, 0x29, + 0x5d, 0xcf, 0xf7, 0x74, 0x27, 0x71, 0x35, 0xe2, 0x4a, 0xec, 0x94, 0x10, + 0x51, 0x15, 0xb3, 0xc5, 0xa2, 0xeb, 0x14, 0x50, 0x5c, 0xee, 0x87, 0xb1, + 0xe8, 0x0a, 0x6c, 0xaa, 0x17, 0x5a, 0x95, 0x46, 0x60, 0x83, 0xe5, 0xe4, + 0x8a, 0x2a, 0x54, 0xfc, 0x10, 0xd7, 0x8b, 0xd4, 0x9b, 0x88, 0x15, 0x7f, + 0xb4, 0xe2, 0x41, 0x65, 0xf3, 0x5b, 0x56, 0x77, 0x22, 0x4a, 0xb2, 0xa2, + 0xd6, 0x63, 0xc9, 0x9c, 0xff, 0x24, 0x38, 0x34, 0xa6, 0xe5, 0x24, 0x41, + 0xc5, 0xbd, 0xc9, 0x8d, 0x3b, 0xba, 0x6c, 0x5f, 0x11, 0x04, 0x22, 0xf8, + 0xc5, 0x46, 0xa5, 0xef, 0x15, 0x1a, 0x49, 0x44, 0x2d, 0x8a, 0xd9, 0xe5, + 0xea, 0xfa, 0x64, 0x09, 0xf6, 0x63, 0x3a, 0x49, 0x23, 0x1d, 0xb8, 0x08, + 0xbc, 0xdb, 0x63, 0xf2, 0x68, 0x2c, 0x4c, 0x77, 0x77, 0x77, 0x7d, 0xb6, + 0x04, 0xd3, 0x9c, 0x7e, 0xce, 0xe3, 0x06, 0x3f, 0x57, 0x47, 0x7f, 0x7d, + 0x7f, 0x3b, 0x3d, 0xfd, 0xf5, 0xfd, 0x87, 0xef, 0xea, 0xbc, 0xba, 0xf5, + 0x7d, 0x7d, 0x46, 0x70, 0xed, 0x3a, 0x3a, 0xc7, 0x7d, 0xf0, 0x4e, 0x4e, + 0xe1, 0x9c, 0x82, 0xba, 0x39, 0x40, 0x29, 0x6c, 0xbf, 0x09, 0x00, 0x90, + 0xe2, 0x6c, 0x32, 0x73, 0xec, 0x80, 0xa8, 0x82, 0x82, 0x18, 0x1b, 0x08, + 0x47, 0xb5, 0xa4, 0x8b, 0x23, 0xb5, 0xa5, 0xa4, 0x15, 0xc4, 0xd8, 0xc4, + 0x08, 0x24, 0xbe, 0x5e, 0xa5, 0xe5, 0xc4, 0x15, 0xc4, 0xd8, 0xc0, 0x08, + 0x25, 0x8e, 0xa7, 0x7c, 0xab, 0x89, 0x13, 0xc4, 0xd8, 0xc4, 0x08, 0x24, + 0x8e, 0xc7, 0x85, 0xab, 0x89, 0x13, 0xc4, 0xd8, 0xc4, 0xa8, 0x27, 0xce, + 0xcf, 0x1d, 0x43, 0x7a, 0x19, 0x71, 0x09, 0x31, 0xd6, 0xc0, 0x83, 0xc8, + 0xce, 0x96, 0x79, 0x35, 0x59, 0x82, 0x18, 0x2b, 0xf0, 0x00, 0x39, 0x8b, + 0x53, 0xd0, 0x8c, 0x85, 0x0f, 0x42, 0xa2, 0x38, 0x85, 0x39, 0xd6, 0x29, + 0x1d, 0x55, 0x63, 0x69, 0xa7, 0xa7, 0x01, 0xcf, 0x24, 0x05, 0x16, 0x63, + 0xb6, 0xd8, 0xa0, 0xbf, 0xd3, 0xf9, 0x96, 0xcc, 0x4d, 0xc0, 0xc0, 0xe1, + 0x56, 0x67, 0x9d, 0x2c, 0xab, 0xa5, 0x44, 0x10, 0x63, 0x0d, 0x3c, 0x48, + 0x4a, 0x74, 0x12, 0xbc, 0x94, 0xac, 0x82, 0x18, 0x1b, 0x08, 0xff, 0x8b, + 0x11, 0x4d, 0x0a, 0xcc, 0x6d, 0x62, 0x50, 0xa2, 0xc0, 0x0a, 0xd0, 0xcc, + 0x1a, 0x78, 0x07, 0x73, 0x0a, 0x69, 0x78, 0x86, 0xc4, 0x38, 0xb4, 0xd1, + 0xc1, 0x91, 0xad, 0x7e, 0xf6, 0xd0, 0x9a, 0x3c, 0x7f, 0xf4, 0x5a, 0x2f, + 0xc4, 0xbf, 0x6f, 0xb5, 0xeb, 0x42, 0x38, 0x3b, 0x3f, 0x81, 0x60, 0xa3, + 0x40, 0xb8, 0x3d, 0x0b, 0xee, 0xde, 0xbf, 0x84, 0x4e, 0x2d, 0xc9, 0x67, + 0x0b, 0xe8, 0x81, 0xf5, 0x18, 0x3d, 0x80, 0x5d, 0x34, 0xc0, 0xce, 0x8e, + 0x31, 0x46, 0x22, 0xe0, 0x21, 0xc3, 0xa1, 0x16, 0x81, 0x07, 0xe4, 0xce, + 0xe1, 0x80, 0xcb, 0xfa, 0xec, 0xc9, 0xfb, 0x5a, 0x46, 0x32, 0x17, 0xa9, + 0x1f, 0x93, 0x80, 0xb4, 0x1c, 0x2e, 0xb1, 0xae, 0x76, 0x1c, 0x08, 0x5f, + 0x2e, 0x1f, 0xcb, 0x26, 0x90, 0x71, 0x22, 0x45, 0x2b, 0x44, 0x9d, 0xf7, + 0x9f, 0x7c, 0xd3, 0xd1, 0xa1, 0xb3, 0xf5, 0xb2, 0x02, 0xfa, 0xe4, 0xcb, + 0x77, 0x3f, 0x37, 0xc0, 0x93, 0xd9, 0xaa, 0x02, 0xfc, 0x89, 0x01, 0x3b, + 0xcd, 0xab, 0x48, 0xbf, 0xf7, 0xf5, 0xd3, 0xa7, 0x5f, 0x98, 0xc4, 0xa7, + 0x8d, 0x38, 0xcf, 0x6f, 0x72, 0x17, 0x1a, 0x26, 0xce, 0xa4, 0x56, 0x91, + 0x25, 0xcf, 0xc8, 0x12, 0x65, 0x57, 0x92, 0xc2, 0x42, 0xf1, 0x92, 0x7e, + 0x0c, 0xa7, 0x1d, 0xf1, 0xd8, 0x54, 0x04, 0x64, 0xb5, 0x2c, 0x53, 0x3d, + 0x8d, 0x97, 0xda, 0x05, 0x10, 0xa4, 0x19, 0xf8, 0x80, 0xd4, 0xd5, 0xb2, + 0xc0, 0x7a, 0x21, 0xaa, 0x7c, 0x03, 0x5e, 0xe5, 0x20, 0x23, 0x63, 0xc9, + 0x92, 0x4a, 0xa6, 0x80, 0x62, 0x70, 0xb1, 0x07, 0xf2, 0x9c, 0x4d, 0x1c, + 0x04, 0x8e, 0x04, 0x06, 0x6e, 0xe5, 0x28, 0x2c, 0x93, 0xcd, 0x78, 0x11, + 0xff, 0x4c, 0x6b, 0x25, 0xfd, 0x03, 0xc8, 0xd4, 0x0b, 0x2d, 0x3d, 0xe1, + 0x59, 0x2c, 0xf4, 0x17, 0xf7, 0x90, 0x04, 0x12, 0x34, 0xb8, 0x49, 0x1c, + 0x12, 0x96, 0x90, 0x0a, 0xc4, 0xe9, 0x6d, 0x7d, 0xfb, 0x35, 0x7a, 0x85, + 0x66, 0xd8, 0xbf, 0x48, 0x53, 0x56, 0x5a, 0x04, 0xa0, 0xc9, 0x37, 0x7b, + 0x87, 0x75, 0x68, 0xd7, 0xe4, 0xd9, 0x74, 0x75, 0xf3, 0x0c, 0x36, 0xae, + 0x80, 0x62, 0x2c, 0xde, 0xe8, 0x67, 0x87, 0x5a, 0x9e, 0x46, 0xb6, 0x4c, + 0x40, 0xf9, 0xea, 0xe2, 0x62, 0x11, 0xf3, 0x4e, 0x47, 0x8b, 0x29, 0x4a, + 0x42, 0xa8, 0xe4, 0x15, 0x76, 0x06, 0xb2, 0xcd, 0x26, 0x84, 0x52, 0x0a, + 0x2f, 0xdb, 0xd2, 0x0e, 0x00, 0x2d, 0xcb, 0x9a, 0xe6, 0x7a, 0x96, 0x59, + 0xde, 0xf9, 0x22, 0xbe, 0x61, 0x37, 0xd9, 0x70, 0xc4, 0xb2, 0xab, 0x03, + 0x76, 0x35, 0x7f, 0xcc, 0x16, 0x70, 0x00, 0xe4, 0x66, 0x31, 0x42, 0xb5, + 0x8c, 0xca, 0x85, 0xc3, 0x78, 0x22, 0x09, 0x23, 0xc8, 0xf3, 0x8f, 0xe1, + 0x42, 0xa3, 0xc1, 0x15, 0xb0, 0x62, 0x5b, 0xa8, 0x34, 0x2e, 0x1e, 0x65, + 0x79, 0xbe, 0x25, 0x8d, 0xd1, 0x96, 0x66, 0x3a, 0xa3, 0x2d, 0xcc, 0x74, + 0x44, 0x85, 0x03, 0xd6, 0x35, 0x36, 0x09, 0xb7, 0xfb, 0x3f, 0x64, 0xab, + 0x65, 0xb3, 0x19, 0x0f, 0x3e, 0x0a, 0xc3, 0x54, 0x9c, 0x78, 0x7b, 0xa2, + 0x93, 0x5f, 0xad, 0xd5, 0xc5, 0xc3, 0xb0, 0x39, 0xcf, 0x3b, 0xe6, 0xe4, + 0x06, 0xd4, 0xe0, 0xee, 0xde, 0x5c, 0x83, 0xfd, 0x8a, 0x9f, 0x9b, 0x2c, + 0x1e, 0xea, 0x2f, 0x4a, 0xb8, 0x4e, 0xf2, 0x4b, 0x1e, 0x57, 0x9e, 0x81, + 0xdc, 0x33, 0x85, 0x74, 0x0e, 0x1d, 0x3e, 0x12, 0xb7, 0x20, 0x61, 0x74, + 0x2a, 0x30, 0xba, 0xbe, 0xf5, 0xbb, 0x17, 0x64, 0xae, 0x1d, 0xe9, 0x18, + 0xd2, 0xbb, 0xe4, 0x75, 0x41, 0xee, 0x26, 0x2e, 0x5d, 0x5c, 0x89, 0xb4, + 0x4a, 0xe3, 0x6e, 0xe2, 0x59, 0xd7, 0x75, 0xdd, 0x8c, 0x7c, 0x90, 0x8c, + 0x8d, 0xe2, 0xf7, 0x74, 0x28, 0xb0, 0x4a, 0xa1, 0xc6, 0x0f, 0x30, 0xa1, + 0x14, 0x0b, 0x8f, 0xea, 0xa9, 0xda, 0xcf, 0xf9, 0x9a, 0x5f, 0xad, 0xc7, + 0x23, 0x75, 0x00, 0x9f, 0xcf, 0x11, 0x0b, 0x9a, 0x6c, 0x61, 0x3d, 0x8d, + 0x6f, 0xe8, 0x82, 0xfb, 0xaa, 0x00, 0x14, 0x13, 0xe0, 0x5a, 0x58, 0x55, + 0x56, 0x3e, 0x05, 0xfb, 0x4c, 0x9e, 0x6b, 0x28, 0xf4, 0x9e, 0x9a, 0x66, + 0x92, 0x80, 0x27, 0x8c, 0x17, 0x70, 0xc0, 0xaa, 0x33, 0x7c, 0x35, 0x24, + 0x63, 0xe7, 0xe9, 0xea, 0x8a, 0x7d, 0xb0, 0xbc, 0x80, 0x85, 0xb7, 0x4b, + 0xf9, 0x70, 0x10, 0x12, 0x1f, 0xa8, 0x95, 0x55, 0x63, 0xd3, 0x97, 0xcb, + 0x2c, 0x5e, 0xa2, 0xbc, 0x5c, 0x1d, 0x22, 0xa2, 0xa0, 0x44, 0x7a, 0x77, + 0xf3, 0xeb, 0x91, 0x06, 0x60, 0xab, 0x12, 0xd2, 0xf0, 0xeb, 0x92, 0xeb, + 0x31, 0x11, 0x6c, 0xa9, 0xb6, 0x95, 0x6e, 0x5c, 0x23, 0x1a, 0xa8, 0xde, + 0xd8, 0x56, 0xbd, 0x4a, 0x78, 0xd3, 0x8a, 0x50, 0x9a, 0xad, 0x8b, 0xea, + 0x43, 0x8a, 0x32, 0x8e, 0x0a, 0x73, 0x35, 0x5d, 0xcd, 0x6f, 0x6d, 0x1b, + 0x26, 0x5c, 0x92, 0x71, 0x59, 0xc9, 0x3c, 0x1f, 0x90, 0xd4, 0x7a, 0x9f, + 0xb1, 0xd6, 0x88, 0xbf, 0xac, 0xb5, 0x46, 0x63, 0xf0, 0x20, 0x73, 0x25, + 0xf1, 0x9d, 0x06, 0x55, 0xd7, 0x88, 0x07, 0xe4, 0x96, 0x7e, 0x71, 0x5e, + 0xb8, 0x13, 0xb0, 0x00, 0xd9, 0x1f, 0xaa, 0xa6, 0xf3, 0xd2, 0xce, 0x53, + 0x4f, 0xeb, 0xd0, 0x0a, 0xff, 0x4b, 0x50, 0x04, 0xad, 0xf5, 0x73, 0x76, + 0x85, 0xd7, 0xdb, 0x23, 0x7c, 0xff, 0x4c, 0xc5, 0xf2, 0x93, 0x8d, 0xdd, + 0x1f, 0xb7, 0xd9, 0x95, 0x24, 0xac, 0x3e, 0x61, 0x76, 0x22, 0x63, 0xaf, + 0x07, 0x44, 0x76, 0xf5, 0x3e, 0xe0, 0x89, 0x0d, 0x9f, 0x0f, 0xc5, 0xcf, + 0xc8, 0xf0, 0x38, 0x17, 0xab, 0xa9, 0xc8, 0x7f, 0x0f, 0xbe, 0x46, 0xa7, + 0x64, 0x6e, 0xb9, 0xc9, 0x48, 0xce, 0x6f, 0x0b, 0xc9, 0x75, 0xcf, 0x7a, + 0xec, 0x8e, 0x5f, 0xb4, 0x7e, 0x84, 0xbd, 0x30, 0xe1, 0xf7, 0xd9, 0x77, + 0x70, 0x8c, 0x78, 0x24, 0x79, 0x2e, 0x4a, 0x14, 0x03, 0x70, 0xf4, 0x48, + 0xa2, 0x3f, 0xea, 0x51, 0x49, 0x3d, 0xf6, 0xc8, 0x18, 0x5d, 0xe8, 0x7c, + 0x82, 0x77, 0x5e, 0x70, 0xc2, 0xaf, 0x9e, 0xd2, 0x18, 0x22, 0xa9, 0x76, + 0xeb, 0x87, 0xae, 0x18, 0x4c, 0x97, 0x86, 0x61, 0x8d, 0x5a, 0x0f, 0x61, + 0x21, 0x35, 0x16, 0xbf, 0x3e, 0x3e, 0xfe, 0xe0, 0xe4, 0xc4, 0x6a, 0x00, + 0xb4, 0x73, 0x3d, 0x35, 0xa4, 0x84, 0xcc, 0x72, 0xed, 0x1e, 0x40, 0x63, + 0x16, 0x78, 0x01, 0x19, 0xdf, 0x78, 0x02, 0x8a, 0x7b, 0x34, 0xdf, 0x6d, + 0x6c, 0xad, 0x8b, 0x2e, 0x04, 0x62, 0xe1, 0xce, 0xb3, 0xec, 0x1f, 0xc1, + 0x26, 0x9d, 0xcf, 0xff, 0xb9, 0x40, 0x3c, 0x35, 0x6d, 0x5f, 0xbf, 0xc0, + 0x29, 0xbd, 0x3d, 0x04, 0x98, 0x5e, 0x6e, 0xcc, 0x8f, 0x15, 0xb9, 0x1d, + 0xf5, 0x05, 0xed, 0x67, 0xb1, 0x0d, 0x56, 0xea, 0x8f, 0x37, 0x77, 0xc3, + 0xb1, 0xeb, 0xac, 0x57, 0xe8, 0xc5, 0x84, 0x98, 0x16, 0x6d, 0xd3, 0x4e, + 0x67, 0x0c, 0xf4, 0x0f, 0x89, 0x38, 0x86, 0xc7, 0x4b, 0x33, 0xc3, 0x3e, + 0x17, 0x47, 0x00, 0xdf, 0x63, 0x43, 0xf3, 0x96, 0x09, 0x11, 0x76, 0xe9, + 0xa2, 0xb1, 0x0f, 0xa1, 0x8c, 0x3b, 0x29, 0x36, 0xab, 0xf7, 0xde, 0x4e, + 0xc9, 0xe7, 0xde, 0xb4, 0xbb, 0x92, 0xd1, 0x0c, 0xdc, 0x47, 0xaf, 0xeb, + 0x1c, 0x0b, 0x5b, 0x2d, 0x4f, 0xe4, 0x0b, 0x51, 0xb0, 0xfb, 0x0d, 0xab, + 0x33, 0x0b, 0x38, 0x05, 0x55, 0xb0, 0x65, 0x9f, 0x62, 0x65, 0x3c, 0x5f, + 0x30, 0x62, 0x94, 0x9f, 0x11, 0x99, 0x58, 0x5c, 0x05, 0x3d, 0x04, 0x06, + 0x04, 0xb0, 0xb2, 0x99, 0xec, 0x04, 0x34, 0x90, 0x99, 0x80, 0xe2, 0xa8, + 0xa3, 0xb6, 0x09, 0x0e, 0xa5, 0x78, 0x7c, 0xea, 0xec, 0xbd, 0xdb, 0x63, + 0x39, 0x67, 0x89, 0x3a, 0x9c, 0x25, 0x0a, 0x2a, 0xf1, 0x6c, 0x11, 0x5f, + 0x80, 0x3d, 0x92, 0xfe, 0xb8, 0x1a, 0xfc, 0x13, 0x5a, 0x12, 0x81, 0x8f, + 0xb7, 0xd8, 0x8d, 0xd8, 0xc7, 0x82, 0x5f, 0xaf, 0xbd, 0x66, 0xc8, 0xfc, + 0xe6, 0x34, 0x39, 0xd3, 0x27, 0x43, 0x94, 0xe0, 0xbf, 0xf8, 0xa3, 0xe6, + 0xad, 0x6f, 0x8a, 0xcb, 0x3f, 0x2a, 0x65, 0xaf, 0x63, 0x35, 0x0e, 0xd4, + 0xa2, 0xfe, 0x52, 0xa3, 0x2b, 0xa3, 0x1b, 0x93, 0x97, 0x3a, 0x46, 0xf6, + 0x1c, 0x46, 0xde, 0xec, 0xe8, 0xe2, 0x8e, 0xc5, 0x3d, 0x70, 0xfe, 0x42, + 0x16, 0x9b, 0x2c, 0xe7, 0xc5, 0x31, 0xb6, 0x7c, 0x65, 0x35, 0x04, 0x60, + 0x99, 0x57, 0x52, 0xac, 0x35, 0xa6, 0xd3, 0x4e, 0x8a, 0xfc, 0x0a, 0x0d, + 0x81, 0x7e, 0x31, 0x84, 0x8e, 0x29, 0x7e, 0xd0, 0xfc, 0xef, 0x4c, 0xbf, + 0x9b, 0x51, 0x4a, 0xe4, 0x22, 0x8c, 0xc8, 0x14, 0xb0, 0x4b, 0x69, 0x4c, + 0xc3, 0x68, 0xe0, 0xa2, 0x5c, 0x39, 0x91, 0xeb, 0x30, 0x22, 0xde, 0x83, + 0x36, 0x95, 0x07, 0x53, 0xdc, 0x43, 0x29, 0xf7, 0xd6, 0x59, 0x41, 0xaf, + 0x93, 0x0c, 0x63, 0x45, 0xe1, 0x76, 0x51, 0xf3, 0xc8, 0x1f, 0xa2, 0x9d, + 0x54, 0x0f, 0xc1, 0x8c, 0x2a, 0xf5, 0x92, 0x88, 0x4e, 0x97, 0xa0, 0xc3, + 0x29, 0xba, 0x3f, 0x4c, 0xe5, 0x7b, 0x1d, 0x61, 0xdb, 0x0b, 0x46, 0x4c, + 0xbf, 0x17, 0x8c, 0x74, 0x29, 0xf2, 0x5d, 0xd5, 0x72, 0x1a, 0xbc, 0x55, + 0xf7, 0x44, 0x2d, 0xa7, 0xe1, 0x9f, 0xc0, 0xb1, 0xe6, 0xdb, 0xd4, 0x58, + 0x9d, 0x1e, 0x31, 0xea, 0x02, 0x7b, 0xa7, 0xd0, 0xa7, 0x08, 0x7b, 0x36, + 0x28, 0x1e, 0xec, 0x55, 0x58, 0x04, 0x62, 0x2c, 0x37, 0x70, 0x32, 0x56, + 0x57, 0x25, 0x28, 0xa9, 0x25, 0xc6, 0x68, 0x78, 0xa4, 0x00, 0x1a, 0x1d, + 0xe4, 0x9e, 0x43, 0xdf, 0x5a, 0x5d, 0xc5, 0xf9, 0x25, 0x50, 0x62, 0x97, + 0x71, 0x1a, 0x5b, 0xde, 0x23, 0x4d, 0x4d, 0x32, 0x11, 0x55, 0xa9, 0xaa, + 0x25, 0x05, 0x90, 0x6a, 0x4a, 0x85, 0x26, 0x39, 0x06, 0x5d, 0xb5, 0xb3, + 0x1a, 0xf0, 0x4a, 0xfb, 0x4a, 0xe0, 0x0b, 0x5a, 0x64, 0x65, 0x69, 0xe5, + 0x25, 0xba, 0x15, 0x12, 0xfb, 0x8d, 0x95, 0xf5, 0x11, 0x30, 0xaa, 0x3a, + 0x32, 0x41, 0xd2, 0xb6, 0xf7, 0x32, 0x4d, 0xb0, 0x26, 0x35, 0x73, 0x36, + 0x45, 0xad, 0xb2, 0x8e, 0x5c, 0x21, 0x74, 0x8e, 0x2f, 0xc1, 0x26, 0xd8, + 0x98, 0x5d, 0x5f, 0x65, 0xd5, 0x86, 0x68, 0x45, 0x6d, 0x0b, 0x20, 0x59, + 0x5d, 0x85, 0x66, 0xd7, 0xb7, 0xc8, 0xb0, 0x01, 0x9b, 0xd7, 0x58, 0x63, + 0x4d, 0x91, 0xa9, 0xa8, 0xf3, 0x15, 0x56, 0xda, 0x41, 0x2e, 0xaf, 0x35, + 0xec, 0xcc, 0xd6, 0xd7, 0x1a, 0x80, 0x54, 0xad, 0x65, 0x8a, 0x5b, 0x6b, + 0x99, 0x61, 0x01, 0xb6, 0xad, 0xb5, 0x60, 0x4d, 0x7e, 0xaf, 0xac, 0xf5, + 0x1a, 0x6a, 0xed, 0x20, 0xfb, 0x6b, 0x2d, 0xb7, 0x8c, 0x6b, 0x6b, 0x8d, + 0x40, 0xaa, 0xd6, 0x32, 0xc5, 0xa9, 0xb5, 0xcc, 0xb0, 0x01, 0x5b, 0xd6, + 0x9a, 0xb3, 0xa6, 0xc8, 0x54, 0xd5, 0x7a, 0x03, 0xb5, 0x76, 0x90, 0x2b, + 0xda, 0x1a, 0xbc, 0x8f, 0xda, 0x5a, 0x23, 0x90, 0xaa, 0xb5, 0x4c, 0x71, + 0x6a, 0x2d, 0x33, 0x6c, 0xc0, 0x96, 0xb5, 0xe6, 0xac, 0x29, 0x32, 0x55, + 0xb5, 0xc6, 0xa1, 0xde, 0x41, 0xf6, 0xd6, 0x1a, 0x86, 0x5a, 0x11, 0x80, + 0xab, 0xbc, 0xda, 0xd2, 0xd5, 0x05, 0x40, 0x7d, 0x84, 0xb5, 0x7c, 0x4e, + 0x73, 0x1b, 0x5f, 0x3a, 0x9e, 0x5b, 0x1e, 0x36, 0x93, 0x9a, 0x31, 0x33, + 0x51, 0xd9, 0x5a, 0x55, 0xeb, 0x87, 0x48, 0x05, 0x5b, 0x34, 0x2b, 0xf7, + 0xa5, 0x44, 0xea, 0x91, 0x05, 0xd6, 0xa4, 0x03, 0x1b, 0x84, 0x80, 0xb0, + 0x22, 0x52, 0xde, 0xa4, 0x27, 0x19, 0xb4, 0xa8, 0x89, 0xe9, 0x6b, 0x4e, + 0x0a, 0xdf, 0x25, 0xf2, 0xb3, 0xa0, 0x06, 0x9d, 0x2d, 0x95, 0xd9, 0xd2, + 0x91, 0x65, 0xb5, 0xcd, 0x56, 0x75, 0x01, 0x5b, 0x68, 0xb3, 0x3c, 0xe7, + 0xe1, 0x96, 0xe7, 0xd7, 0xe6, 0x0c, 0xeb, 0x6e, 0x22, 0x1b, 0xc3, 0x35, + 0xb4, 0x62, 0xcc, 0x22, 0x4d, 0x8a, 0xe7, 0x49, 0x9a, 0xe5, 0xd4, 0xb8, + 0xce, 0x92, 0x89, 0x82, 0x12, 0x31, 0x2e, 0x09, 0xcc, 0x8f, 0xec, 0x99, + 0xff, 0xb7, 0xd3, 0xfc, 0xe7, 0xd1, 0xfe, 0x66, 0x3d, 0x20, 0xa0, 0x17, + 0x04, 0xf7, 0x04, 0xad, 0xda, 0x0d, 0x7a, 0x84, 0xa1, 0x8d, 0xeb, 0x64, + 0x59, 0xaf, 0x84, 0x00, 0x24, 0x6b, 0x8c, 0x08, 0x1e, 0xc5, 0x83, 0x54, + 0x95, 0xdf, 0x4a, 0xdf, 0x38, 0x23, 0xf0, 0x6f, 0x95, 0x9a, 0xc9, 0x01, + 0x52, 0xe1, 0x78, 0xbb, 0x18, 0x1e, 0xc9, 0xa9, 0xaf, 0x15, 0x42, 0x95, + 0x4f, 0x47, 0x14, 0xcc, 0xf6, 0x4d, 0x64, 0xc0, 0xcc, 0x42, 0xb1, 0xc3, + 0xe7, 0x16, 0x1a, 0x34, 0x26, 0xd6, 0x9b, 0x4b, 0x82, 0x72, 0x1b, 0x0e, + 0x93, 0x8f, 0x14, 0x44, 0xab, 0xa6, 0x13, 0xe2, 0xc6, 0x8f, 0xaa, 0xc6, + 0xc3, 0xa9, 0xba, 0x85, 0xe5, 0x1f, 0xef, 0xf2, 0x49, 0xb5, 0x37, 0xc7, + 0x67, 0xcd, 0xca, 0x99, 0xe3, 0x18, 0x96, 0x6c, 0x21, 0x8e, 0x78, 0xa7, + 0x67, 0x9c, 0x2f, 0xeb, 0x0f, 0x0d, 0x78, 0x77, 0x12, 0x4e, 0xc9, 0x0a, + 0xa4, 0x91, 0xcb, 0x67, 0x12, 0x01, 0xaa, 0xf8, 0x59, 0x35, 0x5a, 0x9c, + 0x82, 0x34, 0x2c, 0xac, 0x12, 0x69, 0xac, 0xd6, 0xb5, 0xc2, 0x58, 0xad, + 0x95, 0x2c, 0xe0, 0x47, 0x23, 0x51, 0x00, 0xb8, 0x2b, 0x09, 0x48, 0xd5, + 0x00, 0xda, 0xc9, 0x81, 0xf8, 0xc6, 0x8f, 0x0a, 0x29, 0x9c, 0x99, 0x52, + 0x00, 0x60, 0xaf, 0x10, 0x66, 0xab, 0x4d, 0x88, 0xf7, 0x83, 0x60, 0x4a, + 0x2b, 0xe8, 0x97, 0xa3, 0xf2, 0x54, 0x7f, 0x05, 0xd1, 0xc8, 0x2d, 0xb0, + 0x8f, 0x2b, 0x12, 0x7e, 0x95, 0xca, 0xcf, 0x4c, 0x95, 0x9f, 0x29, 0x97, + 0xa0, 0x8d, 0xda, 0xb6, 0x68, 0x5e, 0x43, 0x8a, 0xfc, 0xb9, 0xe9, 0x7a, + 0x31, 0x72, 0xb8, 0x2a, 0xd3, 0xa8, 0xa0, 0xfe, 0x41, 0xc6, 0x91, 0x33, + 0xe4, 0x98, 0x47, 0x9e, 0x5c, 0x6f, 0x20, 0x05, 0x9c, 0xd4, 0x97, 0xa8, + 0xd0, 0x4a, 0x19, 0x01, 0x96, 0xbd, 0x82, 0x8f, 0x71, 0x23, 0x96, 0x02, + 0x6f, 0xa0, 0x3c, 0x2e, 0xbd, 0xb1, 0x59, 0xe6, 0xaf, 0x4c, 0xbc, 0xe5, + 0xad, 0x7e, 0x8b, 0x97, 0xb0, 0x55, 0x02, 0x7f, 0xd8, 0xba, 0xa2, 0x43, + 0xad, 0x40, 0xe3, 0xdc, 0xa2, 0x7c, 0xea, 0x20, 0x4b, 0x0b, 0xd2, 0x07, + 0x04, 0x0c, 0x50, 0x08, 0x04, 0xfb, 0x67, 0x69, 0x04, 0x72, 0xe4, 0xa8, + 0x84, 0x48, 0x0f, 0xd2, 0x09, 0x02, 0xac, 0x56, 0x8a, 0xe1, 0x08, 0xd1, + 0x14, 0x7c, 0x93, 0x25, 0xa1, 0x7f, 0xa2, 0x56, 0x10, 0xf5, 0x20, 0xb5, + 0x20, 0xc8, 0x00, 0xbd, 0x20, 0xb8, 0x7f, 0x96, 0x62, 0x10, 0x4b, 0x8e, + 0x66, 0xc8, 0x8c, 0x20, 0xd5, 0x20, 0xc8, 0x6a, 0xdd, 0x00, 0x73, 0x61, + 0x82, 0xff, 0xcb, 0x55, 0x03, 0x88, 0x85, 0x19, 0x0c, 0x00, 0x0c, 0x31, + 0x18, 0x00, 0xf6, 0x0f, 0x33, 0x18, 0xc8, 0x91, 0xab, 0x16, 0x94, 0x1e, + 0x66, 0x30, 0x10, 0xb0, 0x5a, 0x29, 0x0e, 0xba, 0x3a, 0xf0, 0xbf, 0xd6, + 0x5a, 0x50, 0xc4, 0x7c, 0x0a, 0x98, 0xef, 0xee, 0x54, 0x68, 0xd1, 0xf4, + 0xdb, 0x6d, 0x58, 0x98, 0x27, 0xaa, 0xc6, 0x1c, 0x9d, 0x8b, 0x3c, 0x3b, + 0xa5, 0x1f, 0x72, 0xa7, 0xf0, 0x09, 0xee, 0x9d, 0x9f, 0x71, 0x16, 0xfc, + 0x33, 0xdc, 0xd9, 0x8f, 0xd5, 0xeb, 0xa4, 0x1c, 0x02, 0xcf, 0xf9, 0x2a, + 0x95, 0xe5, 0x69, 0x03, 0xda, 0xc7, 0x8f, 0xe7, 0xd4, 0x92, 0x92, 0x23, + 0xed, 0x11, 0x01, 0x7e, 0x3c, 0x6a, 0x96, 0xa4, 0x33, 0x85, 0x8a, 0xdb, + 0x95, 0xe9, 0xe4, 0x5a, 0xdb, 0xe3, 0x84, 0xfd, 0x36, 0x3a, 0x77, 0x48, + 0xe9, 0x7c, 0x27, 0x4e, 0x30, 0x95, 0xaf, 0xc4, 0x79, 0x43, 0x49, 0x5c, + 0x15, 0xde, 0x68, 0xe9, 0xd5, 0xcb, 0x1b, 0xf0, 0x6c, 0xd6, 0x02, 0x4e, + 0x2d, 0x14, 0xcc, 0xb2, 0xe2, 0xfd, 0x03, 0xc1, 0xb5, 0x9f, 0xf3, 0x92, + 0x05, 0xc9, 0x9c, 0xce, 0x6e, 0xd1, 0x31, 0x92, 0x0f, 0xce, 0xcf, 0xe3, + 0x59, 0xdd, 0x4a, 0x56, 0xde, 0x77, 0x10, 0xa4, 0xb8, 0xbc, 0xd4, 0x24, + 0xc7, 0xca, 0x6f, 0x77, 0x40, 0x4a, 0xb1, 0xdb, 0xac, 0x77, 0x79, 0xaa, + 0x53, 0xc9, 0x97, 0x75, 0x5a, 0xac, 0x0a, 0x34, 0xfc, 0x22, 0x89, 0x8f, + 0xca, 0xf4, 0x82, 0xd4, 0xa5, 0xd3, 0x6d, 0x7e, 0x0c, 0xdd, 0x9d, 0x8e, + 0xc4, 0x43, 0x10, 0x3a, 0xdb, 0xd6, 0x9f, 0x7d, 0x40, 0x68, 0xcb, 0xf5, + 0xee, 0x74, 0xca, 0xeb, 0xb9, 0xfb, 0x90, 0xf5, 0xd4, 0xea, 0xe5, 0x9d, + 0x99, 0x2e, 0xae, 0x26, 0xc9, 0xb2, 0xf6, 0x64, 0x45, 0x1f, 0xa1, 0xa4, + 0xce, 0x4b, 0x2c, 0xd7, 0x6e, 0x6a, 0xef, 0xa4, 0xe8, 0xa0, 0x8d, 0xd6, + 0xd4, 0x7c, 0xc4, 0xa0, 0x0c, 0xad, 0x4c, 0x67, 0xaf, 0xfc, 0x32, 0xbe, + 0x21, 0xb0, 0x2a, 0x56, 0x14, 0xf4, 0x6d, 0xf2, 0x13, 0x1a, 0x97, 0x88, + 0xce, 0x58, 0x3f, 0x81, 0x01, 0x59, 0xa2, 0x8b, 0xa3, 0x71, 0xd1, 0xb0, + 0x37, 0xea, 0xf6, 0x86, 0x07, 0xdd, 0x57, 0x47, 0x6f, 0xbe, 0xd9, 0x7d, + 0xad, 0x1c, 0x6e, 0x4f, 0xc2, 0xed, 0xbf, 0xf1, 0x7a, 0x15, 0xdc, 0xbe, + 0x84, 0x1b, 0x0e, 0x1f, 0x77, 0xbb, 0x3b, 0x43, 0x38, 0xf9, 0x15, 0x12, + 0x18, 0x3b, 0x5f, 0xad, 0x16, 0xd3, 0x49, 0x83, 0xce, 0x43, 0x85, 0x86, + 0x50, 0x3e, 0x5f, 0xad, 0xf2, 0x78, 0x1b, 0x84, 0x6d, 0x96, 0x65, 0xab, + 0x44, 0x20, 0x73, 0x8a, 0x3f, 0x3c, 0xda, 0x47, 0x2b, 0xfe, 0xe8, 0xc5, + 0xe1, 0x70, 0xf8, 0x88, 0x1d, 0xc2, 0x97, 0x0f, 0x3e, 0xf8, 0xe0, 0x51, + 0x08, 0x65, 0x62, 0x79, 0x7b, 0x84, 0xe9, 0x66, 0x4b, 0x3b, 0xea, 0x76, + 0x7f, 0xc2, 0x17, 0x84, 0xea, 0xfb, 0x13, 0x42, 0xc9, 0xfe, 0x24, 0xb1, + 0xca, 0xfa, 0x13, 0xe6, 0xe9, 0x90, 0x8d, 0x16, 0x7d, 0x5c, 0x5a, 0xc0, + 0x9d, 0x59, 0x62, 0x88, 0x98, 0xe8, 0x28, 0xae, 0x2d, 0x20, 0x1f, 0xf1, + 0x12, 0xa9, 0xa0, 0x8e, 0xd5, 0x4b, 0x05, 0xa1, 0xa4, 0x54, 0x24, 0x56, + 0x99, 0x54, 0x30, 0xcf, 0x84, 0x6c, 0x2f, 0x15, 0xce, 0x9d, 0xa4, 0x13, + 0x2e, 0x15, 0x71, 0xe4, 0xbe, 0x49, 0x5f, 0x42, 0x80, 0x10, 0xd2, 0xf2, + 0x2c, 0xce, 0xc3, 0x53, 0x2e, 0x76, 0xe6, 0xb6, 0x45, 0x1a, 0x97, 0xc6, + 0xb7, 0x45, 0x9b, 0x4f, 0x17, 0xb6, 0x48, 0x1d, 0x66, 0x1f, 0x5b, 0x93, + 0xb9, 0x9c, 0xcc, 0x6c, 0x91, 0x3e, 0xcc, 0x8d, 0xda, 0xb3, 0x2f, 0xce, + 0x37, 0xe6, 0xf1, 0x4d, 0xbe, 0x43, 0xb7, 0xfe, 0x78, 0x3f, 0x9f, 0xc7, + 0x6b, 0x7e, 0x3a, 0x9d, 0x41, 0x92, 0xa2, 0xc9, 0x30, 0x66, 0x3b, 0x86, + 0xed, 0x0c, 0x1d, 0x8c, 0x11, 0xf5, 0x9f, 0x3d, 0x16, 0xcb, 0xe0, 0xfa, + 0x59, 0xc8, 0x81, 0x59, 0x75, 0x25, 0x52, 0x4d, 0xe5, 0xfd, 0x87, 0x65, + 0x39, 0x4d, 0xf7, 0xc0, 0xac, 0xfa, 0xe3, 0x10, 0x70, 0x4e, 0xb6, 0x6e, + 0x04, 0x1a, 0x8d, 0x46, 0xde, 0xf1, 0xed, 0x3e, 0x58, 0x49, 0x4e, 0xe2, + 0x0b, 0x78, 0x32, 0xa0, 0xdd, 0x58, 0x07, 0x7f, 0x01, 0x27, 0xeb, 0xb6, + 0x43, 0x9e, 0x07, 0x41, 0xdc, 0x02, 0x61, 0x3a, 0x5c, 0xbb, 0x1d, 0xd2, + 0x78, 0xe4, 0x76, 0x3b, 0x94, 0xf1, 0x20, 0xee, 0x96, 0x48, 0xf3, 0x10, + 0x74, 0xdb, 0xa1, 0x9d, 0xad, 0xe3, 0x6d, 0x35, 0xa3, 0x34, 0x36, 0xed, + 0x48, 0x3b, 0xfe, 0x4a, 0x1e, 0x30, 0x29, 0x02, 0x20, 0xc3, 0x5b, 0xc9, + 0x4b, 0xa7, 0x44, 0x90, 0xa5, 0xc3, 0x3d, 0xc7, 0x7c, 0x88, 0x18, 0x13, + 0x54, 0xc2, 0x1d, 0x15, 0x49, 0xa4, 0x0f, 0xeb, 0x35, 0x4d, 0xc6, 0x87, + 0x7c, 0x19, 0x42, 0x9d, 0xaf, 0xd3, 0xd4, 0x4f, 0x7a, 0x5d, 0xea, 0x8d, + 0x56, 0x22, 0x1e, 0x78, 0x0a, 0x5e, 0xc9, 0x0d, 0xb7, 0x95, 0xcf, 0x26, + 0xb3, 0x3c, 0x81, 0x95, 0x40, 0x7e, 0x97, 0x3f, 0xea, 0x96, 0x2b, 0x4b, + 0x16, 0xa4, 0x2d, 0x40, 0xd5, 0x52, 0x98, 0xac, 0x42, 0x63, 0x00, 0xda, + 0x80, 0x6d, 0xb2, 0x32, 0xe4, 0xa5, 0x06, 0xa5, 0x18, 0xa5, 0x36, 0xae, + 0xaf, 0x70, 0x10, 0xe8, 0xf1, 0xc5, 0xf3, 0xc9, 0x2c, 0x16, 0x8f, 0xb0, + 0x34, 0x89, 0xcc, 0x2b, 0xe6, 0xf1, 0xe5, 0x01, 0x21, 0xd5, 0x24, 0xa7, + 0x1a, 0x04, 0x1b, 0xb4, 0x0e, 0x24, 0x5f, 0xd6, 0x43, 0x64, 0x5e, 0x10, + 0xba, 0xa7, 0x17, 0xd6, 0xa5, 0xf8, 0x03, 0xd2, 0x9e, 0xb6, 0xa1, 0xa8, + 0x05, 0xb2, 0x69, 0x1e, 0xd6, 0xc9, 0x90, 0xb7, 0xb9, 0xc7, 0xf5, 0xfc, + 0x39, 0x78, 0x93, 0x54, 0x68, 0xbf, 0xba, 0x0a, 0x43, 0xb7, 0xad, 0x60, + 0x67, 0x82, 0x75, 0xec, 0x6b, 0xd5, 0x00, 0x5c, 0x5c, 0xef, 0x92, 0x41, + 0x14, 0xba, 0xee, 0x4d, 0x2b, 0xfa, 0x33, 0x69, 0xb2, 0xd7, 0xc6, 0x2a, + 0x9c, 0x81, 0x73, 0x89, 0x14, 0x33, 0x62, 0x1e, 0x40, 0x1b, 0xae, 0x99, + 0xc5, 0x19, 0x5d, 0xa4, 0x91, 0x8f, 0x77, 0x32, 0xae, 0x7f, 0x99, 0x86, + 0x64, 0x5e, 0x8e, 0xbd, 0x9a, 0xac, 0x9d, 0x8b, 0xb1, 0xea, 0xcf, 0xbe, + 0x1f, 0xe6, 0xf0, 0x59, 0x63, 0xd0, 0xe4, 0xe5, 0x30, 0x3d, 0x6a, 0x4d, + 0x58, 0xbd, 0x2c, 0x4f, 0xcc, 0xe8, 0x3b, 0xcf, 0xe7, 0x1f, 0xea, 0x3e, + 0x62, 0x39, 0x5b, 0x82, 0xab, 0xa6, 0xc1, 0x8f, 0xcc, 0x76, 0x23, 0xdd, + 0xf0, 0x5f, 0x93, 0x12, 0xd5, 0x16, 0x57, 0xa4, 0x3a, 0x5d, 0xa7, 0x59, + 0xe9, 0x42, 0xa4, 0xdd, 0xac, 0x93, 0xc5, 0xe2, 0xaf, 0x6a, 0x51, 0x94, + 0x2b, 0x97, 0x0e, 0x1b, 0x37, 0x69, 0xde, 0x23, 0x3f, 0x39, 0x02, 0x30, + 0x65, 0x43, 0x49, 0xed, 0xc4, 0xf3, 0x77, 0x6a, 0xc7, 0xd8, 0x97, 0xef, + 0xaf, 0x45, 0x75, 0x25, 0xee, 0xdd, 0x05, 0xe5, 0xda, 0xb0, 0x1d, 0x86, + 0xf7, 0xd1, 0xc4, 0x54, 0xfa, 0x36, 0xe4, 0xaa, 0x6c, 0x9e, 0xda, 0xd3, + 0x83, 0x52, 0xac, 0x21, 0xce, 0xba, 0xcd, 0xfb, 0xc0, 0xb3, 0xbe, 0x30, + 0x55, 0x0e, 0x51, 0xe3, 0x06, 0x5a, 0x1b, 0x66, 0x94, 0xf4, 0x16, 0x7b, + 0xc0, 0x89, 0x6a, 0x13, 0x36, 0x34, 0x16, 0xd4, 0xb7, 0x00, 0xc7, 0x52, + 0x8d, 0x61, 0xd5, 0x65, 0xdc, 0x3b, 0x97, 0x70, 0xcd, 0x9b, 0xd9, 0x57, + 0x19, 0xe8, 0xf2, 0xf5, 0xe5, 0x6d, 0x8f, 0xe1, 0x23, 0xf6, 0x50, 0xa7, + 0xda, 0xbb, 0xb1, 0xa2, 0x7c, 0x41, 0xa0, 0x68, 0xea, 0x1b, 0x63, 0xd7, + 0x1d, 0xc8, 0xca, 0xf4, 0x52, 0x2f, 0x33, 0x82, 0x62, 0x71, 0xbc, 0x94, + 0x37, 0xbf, 0x69, 0x17, 0xf3, 0xc5, 0xc9, 0x7c, 0xf4, 0xfa, 0xe8, 0x75, + 0xda, 0xc6, 0x7c, 0xf1, 0xf1, 0x6c, 0x72, 0xbe, 0xbf, 0xdb, 0x51, 0x2e, + 0xd6, 0xbb, 0xcb, 0xe4, 0x6a, 0x42, 0x95, 0x48, 0x32, 0x62, 0x78, 0xce, + 0x63, 0xbb, 0x90, 0x08, 0xe8, 0xe6, 0x55, 0x84, 0x17, 0xe4, 0xf9, 0x1d, + 0x72, 0x06, 0xa5, 0x0c, 0xf1, 0x4b, 0xd7, 0x77, 0xdd, 0xb5, 0x83, 0x62, + 0x80, 0xfd, 0x70, 0x22, 0xc3, 0x4b, 0xf0, 0xbf, 0x1a, 0x72, 0x17, 0x70, + 0x4f, 0xd6, 0x20, 0xc6, 0x6d, 0x03, 0xbb, 0x17, 0x22, 0x55, 0x21, 0xbc, + 0xd9, 0xb7, 0xf1, 0xf4, 0x64, 0x05, 0x1e, 0x7b, 0x4e, 0x07, 0x17, 0x28, + 0x6c, 0xf7, 0x22, 0xa6, 0xa7, 0xfa, 0xc5, 0x06, 0x38, 0x90, 0xbf, 0xb3, + 0xdf, 0x10, 0x17, 0x1c, 0x1d, 0xb2, 0x21, 0xd6, 0x8c, 0xe7, 0xc2, 0xc9, + 0xc0, 0xaf, 0xe2, 0x3c, 0x4d, 0xf0, 0xd9, 0xf1, 0x91, 0x48, 0x4b, 0x63, + 0x85, 0xf3, 0x7e, 0xbc, 0x98, 0xdc, 0x7e, 0x94, 0xae, 0xae, 0x3f, 0x9c, + 0xe0, 0x33, 0xd9, 0x0a, 0x68, 0x1e, 0x4f, 0x37, 0x17, 0xfc, 0x3d, 0x73, + 0x60, 0xeb, 0xc8, 0x7c, 0xa9, 0x58, 0xe0, 0xbf, 0xbb, 0x58, 0x98, 0xa1, + 0x04, 0xcc, 0xab, 0xa3, 0xc7, 0x8b, 0x15, 0x8c, 0x93, 0xeb, 0x55, 0x0e, + 0xba, 0x90, 0xc0, 0x00, 0x76, 0xcb, 0xd0, 0xcd, 0xd3, 0x18, 0xce, 0xb4, + 0xdb, 0xdc, 0xde, 0xe7, 0xcc, 0x55, 0x08, 0x8f, 0x08, 0x13, 0x9d, 0x20, + 0xec, 0x90, 0x06, 0x32, 0x86, 0x52, 0x22, 0xaa, 0x32, 0xeb, 0x7c, 0x36, + 0x59, 0x6e, 0xa8, 0x24, 0x4a, 0x9d, 0x1f, 0x1e, 0x56, 0x30, 0x4b, 0xd1, + 0x08, 0xee, 0x7e, 0x8c, 0xe3, 0xf5, 0x31, 0x01, 0xf3, 0xca, 0xde, 0x6b, + 0x0e, 0x7b, 0x2d, 0x7b, 0xd0, 0x0a, 0xa7, 0x67, 0x3a, 0x58, 0xf9, 0xc3, + 0xec, 0x68, 0x1f, 0x8c, 0x19, 0x4f, 0xe5, 0xdc, 0x58, 0xd1, 0xe8, 0x03, + 0x24, 0x75, 0x1d, 0xd3, 0xf5, 0x84, 0xd4, 0x32, 0xd7, 0xb3, 0xb1, 0xdb, + 0x09, 0xb4, 0x6a, 0x4c, 0x83, 0x79, 0x57, 0x58, 0xd4, 0xaa, 0xb4, 0xe9, + 0xab, 0x15, 0x04, 0x68, 0x2a, 0x0d, 0x21, 0x30, 0x0a, 0x7e, 0x0f, 0x73, + 0x2c, 0xb1, 0x15, 0xbf, 0x49, 0xa1, 0xb3, 0xd2, 0x00, 0xc4, 0xe1, 0x40, + 0xf1, 0xf9, 0xcf, 0x92, 0xd3, 0x25, 0xb2, 0xf6, 0x47, 0xb2, 0xf6, 0x1c, + 0x5a, 0xa9, 0x0e, 0x5e, 0x1c, 0xb4, 0x55, 0x07, 0xd3, 0xc4, 0xe5, 0xcb, + 0x01, 0x74, 0x8f, 0x2b, 0x27, 0x16, 0x92, 0x0a, 0x3c, 0xeb, 0x86, 0xf4, + 0x00, 0x8e, 0x48, 0x08, 0x62, 0x92, 0xf6, 0x95, 0xec, 0x4f, 0xc0, 0x59, + 0xd1, 0x71, 0x71, 0x2d, 0xcf, 0x8a, 0x34, 0x72, 0xf8, 0xc6, 0x10, 0x03, + 0x75, 0x4d, 0xd2, 0xf9, 0x26, 0x59, 0xae, 0xe0, 0xab, 0xea, 0xce, 0x50, + 0x7a, 0x79, 0xd0, 0x90, 0xe3, 0x82, 0x3a, 0x0a, 0x4a, 0xa9, 0x06, 0xd5, + 0x13, 0xc8, 0x20, 0x7d, 0x9d, 0x40, 0xb5, 0xd2, 0x8a, 0x30, 0xd8, 0x98, + 0xc0, 0x91, 0x9c, 0x92, 0x31, 0x9c, 0x1e, 0xf5, 0xd4, 0xb1, 0xfd, 0xee, + 0x41, 0x35, 0x83, 0xf1, 0x3c, 0x9c, 0xbf, 0x80, 0x1e, 0xf3, 0xda, 0x6b, + 0x16, 0xce, 0xf3, 0xf5, 0x1d, 0x8b, 0x7b, 0xdd, 0x52, 0x3b, 0xbf, 0x3b, + 0x1d, 0x3f, 0x92, 0x19, 0xc9, 0xed, 0x35, 0x68, 0xdc, 0xba, 0x4a, 0xd8, + 0x7e, 0xc4, 0x91, 0x57, 0xda, 0x64, 0xad, 0x82, 0xc5, 0xfd, 0x3e, 0xf4, + 0xaf, 0xad, 0x48, 0xbc, 0xdf, 0xdf, 0xaa, 0xc4, 0x9f, 0x57, 0x78, 0xb2, + 0x6b, 0xd6, 0x59, 0xda, 0xb7, 0xc6, 0x4c, 0x19, 0x38, 0x0f, 0x23, 0xa1, + 0xd1, 0x53, 0xef, 0x83, 0xda, 0x8e, 0x5c, 0x92, 0xe0, 0xb6, 0xfb, 0x80, + 0xa0, 0x57, 0xcb, 0xc0, 0x46, 0xbb, 0x0f, 0x88, 0x6e, 0x03, 0x56, 0xa4, + 0x18, 0xd1, 0xf5, 0xf1, 0x97, 0xc4, 0xa4, 0xe4, 0x32, 0x50, 0x40, 0xb2, + 0x14, 0xc0, 0x2c, 0x92, 0xc2, 0xc7, 0x26, 0x45, 0xb2, 0x7f, 0x3e, 0x49, + 0x16, 0xb1, 0x88, 0x71, 0x52, 0x2d, 0x5b, 0x60, 0xd8, 0x64, 0xd9, 0x61, + 0xd8, 0x64, 0xb7, 0xda, 0xb6, 0x02, 0xfe, 0x26, 0x5d, 0x94, 0xd8, 0xd2, + 0xda, 0xa9, 0xd4, 0xbf, 0x3b, 0x0a, 0xbd, 0x15, 0x19, 0x89, 0xe2, 0x34, + 0x82, 0x64, 0x32, 0x90, 0x8c, 0x3e, 0xb4, 0x7e, 0x7b, 0x19, 0x2f, 0xf9, + 0xa0, 0xaa, 0x44, 0x9a, 0x64, 0xe4, 0x81, 0xf5, 0xe8, 0xa5, 0x19, 0x8a, + 0x05, 0x41, 0x52, 0x17, 0xc3, 0x2f, 0xa4, 0xa6, 0x3f, 0xc7, 0xa9, 0xaf, + 0x35, 0xd4, 0x88, 0xe0, 0x3e, 0xe9, 0xe2, 0xea, 0x78, 0xd1, 0x4e, 0x54, + 0x9a, 0x3b, 0xc5, 0x4b, 0x8a, 0xd6, 0x8f, 0xe7, 0x6e, 0x80, 0x34, 0x02, + 0x49, 0xe3, 0xf3, 0x34, 0xce, 0x2e, 0x9f, 0xd1, 0x2a, 0x29, 0x4c, 0x42, + 0xf9, 0xd0, 0xff, 0x44, 0xfc, 0x8a, 0xa8, 0xaf, 0xa9, 0xe3, 0x5e, 0x2f, + 0x75, 0xba, 0x3d, 0x72, 0x7a, 0x77, 0xb1, 0xac, 0x06, 0x86, 0x4b, 0x79, + 0x2a, 0x42, 0x8b, 0x1b, 0x58, 0x89, 0xb0, 0x5e, 0x22, 0xe8, 0xb6, 0x1a, + 0x78, 0x76, 0x76, 0xca, 0x1e, 0x27, 0x54, 0x35, 0x17, 0xf3, 0x87, 0x11, + 0xd6, 0xbd, 0x19, 0xea, 0xb1, 0x40, 0xdd, 0x6b, 0x8e, 0xfa, 0x9b, 0x40, + 0x7d, 0x8c, 0xa8, 0x41, 0x9b, 0x1b, 0xa5, 0x3d, 0x0e, 0x5a, 0xed, 0xe5, + 0x4e, 0x33, 0x12, 0xe1, 0xdd, 0x0e, 0x88, 0x53, 0xbf, 0x0b, 0xe2, 0xb1, + 0x6d, 0xdf, 0xc3, 0xf8, 0xa5, 0xb7, 0xd2, 0x51, 0xde, 0x6a, 0x0f, 0x24, + 0x2f, 0xa1, 0x69, 0x17, 0xe4, 0x13, 0xa1, 0xda, 0x4e, 0x68, 0x47, 0x78, + 0xa3, 0xe7, 0x33, 0x8b, 0xfe, 0xe6, 0xed, 0x93, 0x5d, 0x5f, 0xa5, 0x3f, + 0x5d, 0x5d, 0x30, 0x1a, 0x11, 0xb3, 0xb2, 0x5a, 0x50, 0xae, 0x5e, 0x0b, + 0x4a, 0xf0, 0x56, 0x85, 0x72, 0xf4, 0xca, 0xc8, 0xc0, 0x6f, 0xf4, 0xd9, + 0xb4, 0x4a, 0xe8, 0x3a, 0xb8, 0x63, 0x62, 0x9e, 0xde, 0x1e, 0xd3, 0xd5, + 0xc2, 0xb7, 0xc7, 0xda, 0x18, 0x32, 0x50, 0xf3, 0x66, 0xe2, 0xac, 0xa1, + 0x43, 0xe4, 0xda, 0x15, 0xf5, 0x57, 0xef, 0x6c, 0xb6, 0xb2, 0x2c, 0x41, + 0xd6, 0x45, 0x5a, 0xb1, 0xc6, 0x15, 0xb2, 0xc6, 0xfc, 0x36, 0x65, 0x77, + 0xda, 0x84, 0xfd, 0x13, 0xe5, 0x92, 0xd7, 0x34, 0x64, 0xaf, 0xf9, 0x5b, + 0x08, 0xd2, 0x43, 0xf0, 0x47, 0x5a, 0xe4, 0xc0, 0xa1, 0x1b, 0x3a, 0xd0, + 0xaf, 0xcb, 0xe2, 0x38, 0x06, 0x0f, 0x01, 0x1b, 0xd0, 0x47, 0x8b, 0xe8, + 0x49, 0x41, 0xb1, 0x8f, 0x95, 0x66, 0x23, 0x79, 0x41, 0x9a, 0xc7, 0x40, + 0x1e, 0x20, 0x6d, 0x9d, 0x43, 0x50, 0xd4, 0xb0, 0xd7, 0x5c, 0x0a, 0xcc, + 0x9d, 0x9d, 0xa0, 0x45, 0xd1, 0x47, 0x64, 0xf9, 0x1e, 0xc9, 0x4d, 0x5e, + 0xf1, 0x8a, 0x21, 0x36, 0xd9, 0x12, 0x7a, 0xab, 0xbb, 0xed, 0x64, 0x56, + 0x01, 0xca, 0x07, 0x76, 0xe1, 0xdf, 0xe7, 0x78, 0x44, 0x46, 0x46, 0xd9, + 0x70, 0x5f, 0xf1, 0x30, 0xa3, 0x17, 0x8c, 0x75, 0xe8, 0x23, 0x16, 0x74, + 0x3a, 0xcf, 0x1f, 0x06, 0x21, 0xe0, 0x35, 0x0e, 0x5c, 0x2b, 0x2e, 0xe7, + 0x88, 0x72, 0xc7, 0x05, 0x60, 0x08, 0x41, 0xf5, 0x46, 0x73, 0xf0, 0x73, + 0x25, 0xee, 0xeb, 0xd3, 0x16, 0x25, 0x4b, 0xe6, 0xaa, 0x91, 0x28, 0xa0, + 0x1b, 0x3b, 0x56, 0xaf, 0xbf, 0x62, 0xd4, 0x37, 0x0f, 0xb0, 0xf5, 0x48, + 0x76, 0x48, 0x01, 0x6e, 0x4d, 0x69, 0x4f, 0x5b, 0xb4, 0xe1, 0x09, 0x3d, + 0xdd, 0xc7, 0x2f, 0x36, 0x67, 0x14, 0x65, 0xac, 0x56, 0x30, 0x04, 0xeb, + 0xc8, 0x04, 0xe0, 0xee, 0xac, 0xdb, 0xf1, 0x63, 0x05, 0x7e, 0x14, 0x12, + 0x1b, 0xc0, 0x7f, 0xbf, 0x3f, 0xa8, 0xf5, 0xf1, 0x92, 0xb5, 0xcb, 0x92, + 0xcd, 0x13, 0xc0, 0x8c, 0x0b, 0xf0, 0xa3, 0x80, 0x1b, 0xfa, 0xfe, 0x7b, + 0xf6, 0x21, 0x0c, 0x9d, 0xdf, 0x3c, 0x2b, 0xd3, 0x48, 0xa0, 0xe5, 0x28, + 0x25, 0x80, 0x87, 0xea, 0x25, 0x9d, 0x27, 0x0a, 0x56, 0x49, 0xe7, 0x59, + 0x6e, 0x45, 0xa3, 0x46, 0x19, 0x2b, 0xf5, 0xd0, 0x7e, 0x2e, 0x5c, 0x51, + 0x0d, 0xd3, 0x40, 0xab, 0x4e, 0x74, 0xa6, 0x22, 0xb8, 0x4e, 0xee, 0x23, + 0x28, 0x8a, 0x08, 0x3c, 0x71, 0x77, 0x14, 0x84, 0x95, 0x1a, 0x58, 0xc3, + 0x40, 0xac, 0x0b, 0x03, 0x6b, 0x14, 0x88, 0x35, 0x35, 0xb0, 0xf6, 0x02, + 0xb1, 0xe0, 0x1c, 0x27, 0x8f, 0xd1, 0xf1, 0x74, 0xf5, 0x71, 0x7c, 0x13, + 0x9d, 0xea, 0x75, 0xec, 0x19, 0xbc, 0xf7, 0x0c, 0x9e, 0x7a, 0x46, 0x59, + 0x67, 0xdd, 0xb0, 0xd2, 0xae, 0x47, 0x06, 0x93, 0x8f, 0x03, 0x99, 0x4c, + 0x4d, 0xb4, 0xfd, 0x40, 0xb4, 0x0b, 0x13, 0xed, 0x20, 0x10, 0x6d, 0x6a, + 0xa2, 0xbd, 0x1e, 0x88, 0x06, 0x92, 0x1c, 0x95, 0x88, 0xf2, 0xb1, 0x21, + 0xae, 0x7d, 0xe3, 0xd7, 0x01, 0xfe, 0x52, 0x85, 0x85, 0x8b, 0x72, 0xcf, + 0xe0, 0xf2, 0x8d, 0x40, 0x2e, 0x53, 0x13, 0xed, 0xcd, 0x40, 0xb4, 0x0b, + 0x13, 0x6d, 0x18, 0xda, 0x01, 0xa6, 0x16, 0x5e, 0x68, 0x17, 0x00, 0x61, + 0xee, 0x95, 0x08, 0xf3, 0x0d, 0x43, 0x60, 0x6f, 0x9a, 0x5a, 0x6a, 0x29, + 0xed, 0x10, 0xc4, 0xf9, 0x10, 0xc3, 0x21, 0x5a, 0x12, 0x3b, 0xbe, 0xf0, + 0xb8, 0x6a, 0x45, 0x91, 0x55, 0xc6, 0xa7, 0x1d, 0xa4, 0x25, 0x4c, 0xb1, + 0xea, 0x98, 0xb4, 0xd0, 0x0e, 0x65, 0x88, 0xd5, 0x71, 0x68, 0x07, 0xd3, + 0x52, 0xbc, 0xea, 0xd8, 0xb3, 0x83, 0x6b, 0x81, 0x18, 0x60, 0x6e, 0x2b, + 0x04, 0x35, 0x6a, 0x2d, 0xa8, 0x51, 0x6b, 0x49, 0x8d, 0xda, 0x8a, 0x6a, + 0xd4, 0x5a, 0x56, 0xa3, 0x46, 0xc2, 0x2a, 0x91, 0xd5, 0x5e, 0x6b, 0x59, + 0xed, 0xb5, 0x96, 0xd5, 0x5e, 0x5b, 0x59, 0xed, 0xb5, 0x96, 0xd5, 0x5e, + 0xb8, 0xac, 0xfc, 0xce, 0x25, 0x7f, 0x71, 0xb3, 0x91, 0x53, 0x59, 0xf1, + 0x30, 0xe5, 0x9d, 0x13, 0x85, 0xd5, 0x7e, 0x9b, 0x32, 0x24, 0x54, 0x6c, + 0x49, 0x6c, 0xd8, 0x20, 0x97, 0xab, 0xe2, 0x69, 0xcb, 0xbb, 0xfa, 0xc7, + 0x2d, 0x83, 0x42, 0xbb, 0x96, 0x85, 0x72, 0x0d, 0xf2, 0x7e, 0x65, 0xe4, + 0xd1, 0x5a, 0xfe, 0x3c, 0xef, 0x63, 0xd6, 0xf2, 0x07, 0x30, 0x5e, 0xfe, + 0x28, 0x2b, 0xcc, 0x3b, 0xaf, 0x78, 0x60, 0xf3, 0xae, 0xfe, 0x89, 0xcd, + 0xa0, 0x70, 0xa9, 0xa5, 0xe1, 0x51, 0x83, 0xf9, 0xf3, 0xbf, 0xd1, 0x79, + 0x57, 0xff, 0x4a, 0x27, 0x0b, 0x09, 0x6c, 0x5a, 0x1a, 0xc8, 0x34, 0x84, + 0xbf, 0x8a, 0x67, 0x3e, 0xef, 0x2a, 0x1e, 0xfa, 0x0c, 0x99, 0x72, 0xcf, + 0x96, 0x56, 0xe3, 0x2a, 0x5a, 0x81, 0x9c, 0x01, 0x85, 0x5a, 0xce, 0xcc, + 0xb7, 0x42, 0x03, 0x16, 0x03, 0x66, 0xab, 0x4d, 0x09, 0x63, 0xb3, 0xb0, + 0xe5, 0x80, 0xbf, 0xec, 0xad, 0xd1, 0xb0, 0x8b, 0x81, 0x56, 0x3d, 0xfe, + 0x82, 0xf7, 0x4b, 0x19, 0x0b, 0x7f, 0x29, 0x33, 0xac, 0x42, 0xd7, 0x0d, + 0x9e, 0xcd, 0xa4, 0x3f, 0xf3, 0x04, 0xee, 0x76, 0x0a, 0xd5, 0x96, 0x48, + 0xc3, 0x06, 0xbb, 0x5d, 0x09, 0x1a, 0xe0, 0xea, 0x5e, 0x37, 0x85, 0x1f, + 0x35, 0x45, 0xd8, 0xab, 0x42, 0x00, 0x2d, 0x0f, 0x1a, 0x71, 0xc3, 0xdf, + 0xa5, 0xbd, 0xab, 0x78, 0x99, 0xb6, 0xb6, 0x4f, 0x02, 0x8c, 0x57, 0x93, + 0x21, 0x3d, 0xb0, 0x47, 0x96, 0xbd, 0x6b, 0x7b, 0x57, 0xf7, 0xb2, 0x6d, + 0xe3, 0x48, 0x25, 0x2e, 0x9b, 0x44, 0x29, 0xd4, 0xda, 0x52, 0xf8, 0x9c, + 0x70, 0xd3, 0xe1, 0x09, 0xf2, 0x63, 0x50, 0x3a, 0x6a, 0x76, 0x16, 0xdf, + 0xba, 0xf7, 0x1b, 0x1c, 0xe0, 0xae, 0x39, 0x7d, 0xbc, 0xf9, 0x5b, 0x5b, + 0xc0, 0x70, 0xd4, 0xbe, 0x00, 0x71, 0xf7, 0x37, 0x30, 0xe4, 0x56, 0x73, + 0xfa, 0x70, 0xf7, 0xb7, 0xb6, 0x02, 0x07, 0xb0, 0xfb, 0x19, 0xd4, 0x8f, + 0xf0, 0x8d, 0x39, 0x30, 0x30, 0x8d, 0x56, 0x43, 0x61, 0x2d, 0x26, 0x58, + 0x4d, 0x00, 0x5e, 0x1d, 0x73, 0xc3, 0x17, 0x76, 0xec, 0x13, 0x28, 0x6e, + 0x49, 0x04, 0x36, 0x00, 0x3f, 0x95, 0x5e, 0xb2, 0x2a, 0x7e, 0x88, 0xe3, + 0xca, 0xec, 0x6d, 0xb6, 0xeb, 0x2f, 0xcd, 0x7f, 0xe3, 0x80, 0x4e, 0x92, + 0xdd, 0x31, 0x7a, 0x7e, 0xed, 0x50, 0x51, 0xeb, 0xb1, 0x64, 0xce, 0x7f, + 0x12, 0x9c, 0x3a, 0x4a, 0x19, 0x38, 0x09, 0xa0, 0xe4, 0x80, 0x93, 0xff, + 0xf6, 0xd4, 0x9e, 0x79, 0x66, 0xf5, 0xee, 0xc3, 0x27, 0x2e, 0x80, 0xff, + 0x31, 0x95, 0xb2, 0x92, 0xe8, 0x2e, 0x16, 0xfb, 0x8a, 0xfe, 0x05, 0x92, + 0x16, 0x64, 0xf9, 0x13, 0x2c, 0x55, 0x9c, 0x67, 0xf4, 0x84, 0x49, 0xba, + 0x5a, 0x64, 0xe5, 0x80, 0x72, 0x63, 0x86, 0x10, 0x5c, 0x38, 0x99, 0x2f, + 0xaa, 0x40, 0xaf, 0xa1, 0x1e, 0xd5, 0x9c, 0x46, 0x32, 0x50, 0xd8, 0x39, + 0x14, 0x93, 0x5d, 0xc6, 0xf3, 0x17, 0x8c, 0xf1, 0x3f, 0xe8, 0x76, 0x5b, + 0x69, 0x09, 0x3e, 0xac, 0x8a, 0x82, 0xa0, 0x81, 0x4b, 0x49, 0x91, 0xde, + 0xa1, 0x24, 0x68, 0x83, 0xac, 0xf8, 0xe5, 0xdb, 0x77, 0x2a, 0x32, 0x99, + 0x7c, 0x17, 0xb6, 0xf6, 0x60, 0xd6, 0x13, 0x80, 0x4e, 0x26, 0x8b, 0xe4, + 0x17, 0xd8, 0x3d, 0x1c, 0x0c, 0x06, 0x0e, 0x67, 0xea, 0xea, 0x9e, 0x7a, + 0xa0, 0x88, 0x94, 0x9b, 0xd7, 0xc9, 0x07, 0x5c, 0x66, 0x6d, 0x8c, 0xf5, + 0xfa, 0x26, 0x77, 0x2b, 0xa1, 0x60, 0x97, 0x2b, 0x75, 0xd2, 0xfa, 0x53, + 0xf1, 0x7c, 0x26, 0xd8, 0x1c, 0x9f, 0x5a, 0xaa, 0x63, 0x1d, 0xfc, 0xfc, + 0x4c, 0xd3, 0x1b, 0x5d, 0xcd, 0xf6, 0x09, 0x6b, 0xa9, 0x15, 0x71, 0x3f, + 0x7c, 0x14, 0xbd, 0xc7, 0xf1, 0xe8, 0xb0, 0x7e, 0x69, 0xff, 0xe5, 0xd2, + 0x2a, 0xef, 0xe0, 0x33, 0xb5, 0xf8, 0xe7, 0x05, 0x52, 0x1a, 0x25, 0xcf, + 0x0e, 0x54, 0x5d, 0x01, 0x9b, 0xe1, 0x65, 0x47, 0x46, 0x7b, 0xbb, 0x6a, + 0xeb, 0xd8, 0x3d, 0xe5, 0x46, 0xe7, 0x65, 0xc4, 0x9e, 0x30, 0xe9, 0xa0, + 0xbb, 0x05, 0x7c, 0xc2, 0x10, 0x88, 0x74, 0x5a, 0x02, 0x1e, 0xf9, 0x77, + 0x97, 0x0d, 0x62, 0xea, 0xa0, 0xb7, 0x4c, 0x7a, 0x61, 0x0c, 0xc7, 0x81, + 0xa8, 0x90, 0x90, 0x43, 0xc0, 0x95, 0x07, 0xeb, 0xcb, 0xb8, 0xd4, 0x4f, + 0x2d, 0xe6, 0x2b, 0xe2, 0x19, 0xd1, 0x07, 0x9b, 0x74, 0xe1, 0x39, 0x0f, + 0xe0, 0x72, 0xac, 0x8c, 0xbb, 0xf7, 0x64, 0xb9, 0xbc, 0xbc, 0xf8, 0x8c, + 0xaf, 0x92, 0x61, 0x3f, 0xa3, 0xf4, 0x28, 0xa3, 0x4d, 0x45, 0xdf, 0xf3, + 0x6f, 0x1c, 0x83, 0xf6, 0xa1, 0x38, 0x10, 0x10, 0xae, 0x0b, 0x81, 0x00, + 0xe3, 0x7b, 0x1b, 0x34, 0xb0, 0xe5, 0x2d, 0x31, 0xdb, 0xa0, 0xd1, 0x22, + 0x5e, 0x6b, 0xc4, 0x96, 0xbc, 0xe2, 0xfa, 0x5f, 0x5b, 0xbc, 0x96, 0x45, + 0xe2, 0x64, 0xaa, 0x55, 0x99, 0x84, 0x58, 0x5d, 0x28, 0x74, 0x0e, 0x5b, + 0x75, 0xee, 0xed, 0x4e, 0xea, 0x1f, 0xd6, 0x24, 0xf8, 0x34, 0x0f, 0xbb, + 0xd1, 0x06, 0x70, 0x66, 0xa8, 0x53, 0x75, 0x1f, 0x0c, 0x68, 0x94, 0x5f, + 0x07, 0x83, 0x4c, 0xba, 0x09, 0xd6, 0x60, 0x10, 0x90, 0x3d, 0xc7, 0xac, + 0x62, 0x2c, 0xcf, 0x2b, 0xb0, 0x21, 0xfb, 0xf5, 0x57, 0x23, 0x6d, 0x0c, + 0x69, 0xe8, 0xec, 0xc1, 0xb0, 0x63, 0x42, 0xee, 0xbf, 0xde, 0x05, 0x5e, + 0xf8, 0x00, 0xf2, 0xf5, 0xc9, 0xd3, 0x2f, 0x3e, 0x63, 0xd0, 0xcd, 0x3f, + 0xfb, 0xe2, 0xfd, 0x0f, 0xac, 0x57, 0xb6, 0x2a, 0xaf, 0x0b, 0x8a, 0xde, + 0xed, 0xbf, 0x21, 0x2d, 0xf0, 0x1f, 0xfc, 0x92, 0x34, 0x27, 0xdb, 0xe8, + 0xce, 0x5c, 0xd8, 0x7b, 0x2b, 0x1c, 0x06, 0x98, 0x73, 0x11, 0x8d, 0x65, + 0x02, 0x99, 0xd8, 0xe8, 0x0e, 0xab, 0xbf, 0xc9, 0xde, 0xe6, 0x7b, 0x4b, + 0xf5, 0x27, 0x14, 0x1f, 0xc8, 0x6d, 0x80, 0xe2, 0x25, 0x29, 0xa5, 0x20, + 0xfb, 0x07, 0xc0, 0x02, 0xdd, 0x9b, 0xfb, 0xfa, 0xe9, 0x17, 0x5f, 0x7e, + 0xfa, 0xee, 0xf7, 0xa6, 0xbc, 0xa5, 0x5d, 0x46, 0x70, 0x71, 0x0b, 0x39, + 0xa2, 0x21, 0xd2, 0xb2, 0xfa, 0xa5, 0x06, 0x1c, 0x7c, 0xb0, 0x52, 0x58, + 0x7e, 0xd8, 0x44, 0x01, 0x57, 0x53, 0xa6, 0x33, 0x01, 0x65, 0x94, 0xd5, + 0xda, 0x90, 0xbf, 0x96, 0xaf, 0xf3, 0x5a, 0x72, 0x6d, 0x7f, 0xf6, 0xed, + 0x09, 0x47, 0x7b, 0x3e, 0x65, 0xf7, 0xe9, 0xa3, 0xd4, 0xfc, 0x66, 0xfa, + 0xa1, 0x34, 0xae, 0x9d, 0xa6, 0x9a, 0x5d, 0x4f, 0x80, 0xd4, 0x76, 0xbe, + 0x56, 0x1d, 0x50, 0xeb, 0x18, 0x01, 0xdd, 0x90, 0xda, 0xe5, 0xbf, 0xa9, + 0x51, 0x6f, 0x70, 0x8d, 0x7a, 0xfa, 0xcd, 0xbf, 0xa6, 0x7a, 0x08, 0x1c, + 0x5e, 0xbf, 0x37, 0xc5, 0x08, 0xf1, 0xc1, 0x70, 0xb0, 0x37, 0xfc, 0xd7, + 0xd4, 0xb1, 0x49, 0x13, 0x1e, 0xec, 0x8a, 0x2a, 0x7e, 0x98, 0xa4, 0xf1, + 0x68, 0x77, 0x38, 0xfa, 0xd7, 0xd4, 0x92, 0x03, 0xd7, 0x3e, 0xcb, 0xfd, + 0xdc, 0x35, 0x40, 0xe0, 0xbf, 0xac, 0x0a, 0xce, 0x23, 0xd5, 0x66, 0x6b, + 0xed, 0x36, 0xba, 0xef, 0xdf, 0x59, 0x9d, 0x9f, 0x37, 0x8a, 0x5e, 0xa4, + 0x86, 0xca, 0x56, 0x12, 0x6c, 0xaa, 0x07, 0xae, 0x20, 0x1b, 0x20, 0x54, + 0x28, 0xbd, 0xeb, 0xe6, 0xba, 0xa5, 0xb8, 0x53, 0xab, 0x80, 0x88, 0x66, + 0x6d, 0x1c, 0x75, 0x8e, 0x59, 0xea, 0xa9, 0xbb, 0x8c, 0xaa, 0xda, 0xb5, + 0xe0, 0x13, 0xf0, 0xda, 0x4d, 0xb8, 0x08, 0xb1, 0x29, 0x97, 0x9a, 0x46, + 0x78, 0x27, 0xa9, 0x57, 0xc6, 0x4d, 0x64, 0x37, 0xa2, 0x05, 0x98, 0x1d, + 0xd4, 0xf1, 0x90, 0x07, 0xe1, 0xf1, 0xc9, 0xf7, 0x30, 0x47, 0x51, 0x62, + 0xb8, 0xf5, 0xa8, 0x08, 0xf5, 0x10, 0xe7, 0x54, 0x19, 0x42, 0x7e, 0x86, + 0xc5, 0xdd, 0x29, 0x6f, 0x15, 0xa4, 0x32, 0x8d, 0xc1, 0x3b, 0xc8, 0xf0, + 0x42, 0xc8, 0x45, 0x9c, 0x16, 0x40, 0x3a, 0x3b, 0xe6, 0xc1, 0xe8, 0xa1, + 0xe9, 0x41, 0x1b, 0x79, 0x02, 0x1b, 0x20, 0xfc, 0x46, 0x0b, 0xdc, 0xd0, + 0x0f, 0xa1, 0x7f, 0xc2, 0x4a, 0xb2, 0x58, 0x63, 0xcb, 0x0c, 0xef, 0x55, + 0x96, 0x8e, 0xe6, 0x80, 0x3a, 0xb8, 0xe2, 0xc2, 0xe5, 0x63, 0xd7, 0xb5, + 0x2d, 0xf0, 0x51, 0xbb, 0x9e, 0x59, 0x5c, 0x75, 0xa2, 0x0b, 0xdc, 0xa2, + 0x40, 0x92, 0x9a, 0x25, 0x33, 0xd2, 0x1a, 0x9c, 0x2f, 0x5a, 0x78, 0xef, + 0x00, 0x9e, 0x79, 0x54, 0xd6, 0x8b, 0xae, 0x0e, 0x5a, 0x7b, 0x68, 0xbc, + 0x0c, 0x34, 0x9c, 0x23, 0xe0, 0x3e, 0x2a, 0x64, 0x6a, 0x38, 0x81, 0xe0, + 0x13, 0x6c, 0x45, 0x29, 0x2f, 0x62, 0x29, 0xea, 0xf0, 0x9d, 0xbd, 0xa1, + 0xd8, 0x73, 0x8e, 0x1e, 0x39, 0x29, 0x17, 0x4e, 0xca, 0xf4, 0xac, 0xab, + 0x59, 0xa2, 0xe0, 0xc3, 0x62, 0x8a, 0xa7, 0x1a, 0xa6, 0x46, 0x2e, 0x57, + 0x6e, 0xd2, 0x85, 0x9b, 0x34, 0x1d, 0x85, 0x32, 0xb6, 0x57, 0xc2, 0x58, + 0x1d, 0x67, 0x7b, 0x2e, 0x67, 0x6e, 0xd2, 0x85, 0x9b, 0x34, 0xdd, 0x33, + 0x38, 0xbb, 0xc7, 0x4f, 0x1e, 0x0b, 0xc4, 0x78, 0x2a, 0xff, 0x58, 0x46, + 0x03, 0xa1, 0x3b, 0x3b, 0x93, 0xe5, 0xcf, 0x93, 0xaa, 0x69, 0xc2, 0x23, + 0x5e, 0x27, 0x7a, 0xe4, 0xe1, 0x19, 0x87, 0xa6, 0x18, 0x72, 0xe2, 0xc2, + 0x0f, 0xc6, 0xa8, 0x05, 0x6c, 0x9e, 0x81, 0xb8, 0xc7, 0x3c, 0x2d, 0x7a, + 0x34, 0x9a, 0x13, 0x9c, 0x11, 0xf3, 0xe1, 0x6a, 0xbd, 0x5a, 0x02, 0x61, + 0x5e, 0xef, 0x59, 0x21, 0x9e, 0x34, 0xce, 0x37, 0xe9, 0x92, 0x45, 0x9d, + 0x5d, 0x14, 0x0c, 0xb7, 0x14, 0x90, 0x3d, 0xc8, 0x57, 0x27, 0x79, 0x0a, + 0x36, 0x2d, 0x82, 0x40, 0xb1, 0x30, 0x02, 0x2f, 0x12, 0x98, 0xfa, 0xf4, + 0x47, 0x98, 0xfe, 0xf5, 0x7a, 0x0d, 0x1b, 0x2d, 0x93, 0x2c, 0x8e, 0x1c, + 0x33, 0xa4, 0x04, 0x0b, 0x5f, 0x9c, 0x22, 0x14, 0x0f, 0x12, 0x04, 0x36, + 0xcb, 0xba, 0x50, 0xaa, 0x27, 0x63, 0x58, 0x96, 0x31, 0x2a, 0xcb, 0x80, + 0x06, 0x70, 0xf9, 0x59, 0x2d, 0x4f, 0xc8, 0x4c, 0x50, 0x1b, 0xf0, 0xb0, + 0x76, 0x46, 0x37, 0x7b, 0xc1, 0xb3, 0x14, 0x69, 0x84, 0xc6, 0x59, 0xaf, + 0xa4, 0xd1, 0x25, 0xe4, 0xc1, 0x3a, 0xa5, 0xcf, 0xf7, 0xe3, 0xf3, 0xc9, + 0x66, 0x91, 0x93, 0x04, 0x14, 0x35, 0x0e, 0xa2, 0x5e, 0x15, 0xc9, 0x57, + 0x9b, 0xd9, 0x25, 0xbe, 0x7f, 0xaa, 0x4c, 0x9c, 0xa4, 0x4b, 0x81, 0x08, + 0x05, 0xfc, 0x24, 0x85, 0xb6, 0x53, 0x76, 0x0e, 0xcb, 0x84, 0x4c, 0xcb, + 0x4d, 0xba, 0x39, 0x64, 0x9f, 0x4d, 0xf2, 0xcb, 0x01, 0x39, 0x40, 0x91, + 0x8e, 0xf9, 0x14, 0x4b, 0xa1, 0x8d, 0xc7, 0xc1, 0x1a, 0x26, 0xb7, 0xdf, + 0xb1, 0x3e, 0x50, 0x1f, 0x80, 0x61, 0x05, 0xd3, 0xf2, 0x69, 0x7c, 0x9e, + 0x77, 0x7b, 0x26, 0xa5, 0xdb, 0x50, 0x4a, 0xdf, 0x2b, 0x4a, 0x98, 0xb7, + 0xee, 0x6a, 0xa6, 0x58, 0xaa, 0x7a, 0x79, 0xe5, 0x29, 0x9c, 0x15, 0x56, + 0xbc, 0x45, 0xc5, 0x78, 0x91, 0xdf, 0x85, 0x70, 0xce, 0x41, 0xbf, 0xf7, + 0xf3, 0xa6, 0xda, 0x51, 0x04, 0x42, 0x15, 0xdd, 0x86, 0x7a, 0xda, 0x93, + 0x2b, 0xa8, 0xe3, 0xfb, 0xd0, 0xfe, 0x11, 0xf0, 0x35, 0xb8, 0xe9, 0x31, + 0xfc, 0xb8, 0x85, 0xbb, 0x65, 0xf0, 0x5f, 0x97, 0x2e, 0x61, 0x21, 0x21, + 0x15, 0xd1, 0xf9, 0x99, 0xa0, 0xa1, 0x94, 0x9c, 0x12, 0xac, 0x38, 0x98, + 0x64, 0x80, 0xfc, 0xf6, 0x9b, 0xc2, 0x1e, 0x61, 0xbc, 0x23, 0x33, 0x93, + 0xe3, 0x5b, 0x06, 0xe5, 0xb4, 0x03, 0x25, 0x42, 0x8f, 0x14, 0x24, 0xcf, + 0xd8, 0x58, 0xb1, 0x50, 0x82, 0x90, 0x9a, 0xe0, 0xea, 0xf6, 0x83, 0x17, + 0xfa, 0xc2, 0x07, 0x3d, 0x2c, 0x83, 0x9e, 0xfa, 0xa0, 0x47, 0x65, 0xd0, + 0xd7, 0x1a, 0xb4, 0x1a, 0xc3, 0xd5, 0x79, 0x58, 0x93, 0x3b, 0xeb, 0xc8, + 0xab, 0xcb, 0x8c, 0x3a, 0xd5, 0xea, 0x16, 0xed, 0x9e, 0xe5, 0x71, 0xb7, + 0x52, 0xb1, 0x85, 0x2a, 0xb7, 0x89, 0xfd, 0x1b, 0xbe, 0xde, 0xad, 0x67, + 0x6b, 0xc3, 0xc3, 0x7d, 0x6e, 0xc7, 0x30, 0x2f, 0x42, 0xdb, 0x8c, 0x4e, + 0x20, 0x35, 0x90, 0x6e, 0xe8, 0x7e, 0x85, 0x21, 0x14, 0x76, 0x7b, 0x0c, + 0xfe, 0x13, 0x66, 0xfc, 0x3a, 0x99, 0xe7, 0x97, 0xc5, 0xaf, 0xcb, 0x18, + 0xfd, 0x06, 0x6d, 0x60, 0x91, 0xb4, 0x43, 0x1e, 0x33, 0xd2, 0x4b, 0x25, + 0x36, 0x29, 0x1d, 0xaa, 0xe1, 0x3a, 0x6e, 0x0a, 0xe8, 0x5b, 0x1c, 0x6c, + 0x22, 0xad, 0xc4, 0xa2, 0xd0, 0x9d, 0x57, 0x5f, 0x15, 0xa0, 0xaf, 0xb2, + 0xf7, 0x01, 0x32, 0x13, 0x9d, 0x0a, 0x47, 0x09, 0x99, 0xb1, 0xa3, 0x64, + 0xa3, 0x51, 0x33, 0x2c, 0xea, 0x2c, 0x86, 0xfa, 0xa7, 0xdf, 0xb1, 0xb1, + 0x51, 0x63, 0xb6, 0xc3, 0x46, 0x47, 0x36, 0xd0, 0xf7, 0x00, 0x64, 0x08, + 0x42, 0x42, 0xb9, 0xf7, 0x18, 0x05, 0xd5, 0x9e, 0xc4, 0x0c, 0x92, 0x27, + 0x96, 0x44, 0xd7, 0xc4, 0xbf, 0x82, 0x8d, 0xd7, 0x4d, 0xe6, 0xb2, 0xf4, + 0x78, 0xb0, 0xaf, 0x81, 0xc2, 0xce, 0xab, 0x06, 0x1a, 0x19, 0xb0, 0x7d, + 0x36, 0xdc, 0xed, 0x9a, 0xec, 0x11, 0x38, 0x9b, 0xae, 0x52, 0x50, 0x38, + 0x4c, 0x54, 0x4d, 0x3f, 0x8d, 0x2f, 0x92, 0xe5, 0x97, 0x60, 0xc9, 0xa2, + 0xae, 0x0d, 0xce, 0xdb, 0xce, 0x04, 0x9f, 0xa4, 0x33, 0xb7, 0x7e, 0x3a, + 0x37, 0xa4, 0x3f, 0x23, 0x68, 0x16, 0xb2, 0x8e, 0x5f, 0x3e, 0xe9, 0xf1, + 0xfd, 0x4f, 0x45, 0x9c, 0xda, 0x02, 0x6f, 0xbf, 0x1a, 0x4c, 0x1d, 0xb2, + 0x08, 0xcc, 0x60, 0x46, 0x99, 0x4b, 0x36, 0x21, 0xab, 0x8a, 0x40, 0x82, + 0x89, 0x17, 0xba, 0x26, 0x1b, 0x8b, 0x64, 0x19, 0x7f, 0x4b, 0x95, 0x1d, + 0xb3, 0xc7, 0x47, 0x66, 0x1e, 0xbf, 0xbd, 0x7f, 0x82, 0xf3, 0x74, 0xc8, + 0xed, 0xbc, 0xb8, 0x4b, 0x7f, 0x1d, 0x2f, 0x54, 0xd4, 0xb5, 0x92, 0xe9, + 0x8a, 0x7b, 0x21, 0x8e, 0x82, 0xe7, 0xf3, 0x64, 0xb1, 0xe0, 0x41, 0xdf, + 0xa6, 0xf1, 0x64, 0x93, 0x27, 0xe7, 0x9b, 0x85, 0x8c, 0xb5, 0x2b, 0x41, + 0xf2, 0xc9, 0x8f, 0xf1, 0x92, 0xee, 0xde, 0xd2, 0xd9, 0x9c, 0x43, 0x76, + 0x99, 0xe7, 0x6b, 0x88, 0xda, 0x94, 0xe5, 0xb0, 0x56, 0x00, 0xe3, 0x6e, + 0x7a, 0xbe, 0x58, 0x5d, 0x83, 0x55, 0xba, 0xda, 0xf9, 0x69, 0x13, 0x67, + 0xb4, 0x71, 0xba, 0x33, 0x7c, 0x63, 0x74, 0xb0, 0xff, 0xc6, 0xee, 0xe3, + 0x9d, 0xe9, 0x26, 0x59, 0xe0, 0x7e, 0x7b, 0x7f, 0xd2, 0x27, 0xb2, 0x7d, + 0xf2, 0xb3, 0xfa, 0xc9, 0xb2, 0x7f, 0x99, 0x5f, 0x2d, 0xf6, 0xad, 0x77, + 0xef, 0xc0, 0x38, 0x2c, 0xb8, 0x89, 0x11, 0x5f, 0xdf, 0x02, 0x27, 0xf3, + 0xa0, 0xf8, 0xf5, 0x9a, 0xe5, 0x9f, 0xab, 0x67, 0x90, 0xdf, 0x15, 0x88, + 0x11, 0x07, 0xec, 0x83, 0xcf, 0xac, 0x5a, 0x0a, 0x34, 0x66, 0xf8, 0x86, + 0x1d, 0x7d, 0x1f, 0x3c, 0x55, 0x89, 0x44, 0x38, 0xa5, 0xe0, 0x7e, 0x8d, + 0x72, 0x73, 0xd1, 0x05, 0x79, 0xba, 0x72, 0x74, 0x48, 0x82, 0xda, 0xba, + 0x66, 0x0e, 0xba, 0x12, 0xcb, 0x4d, 0x05, 0x12, 0x66, 0xaa, 0xae, 0x93, + 0x56, 0x8e, 0x12, 0x85, 0x95, 0x01, 0x95, 0xf5, 0x25, 0x93, 0x02, 0xab, + 0x24, 0xc5, 0xaa, 0x5f, 0x6d, 0xdc, 0x5c, 0xd4, 0x9e, 0x42, 0x1f, 0x2f, + 0xb3, 0x45, 0x04, 0x63, 0x92, 0x6c, 0x2b, 0xdc, 0xf7, 0xc6, 0xc0, 0x15, + 0x78, 0x20, 0xe1, 0xe5, 0x6e, 0xa7, 0x04, 0x3b, 0x0a, 0x2b, 0xf4, 0x5e, + 0xa9, 0x2c, 0x1a, 0x93, 0x26, 0x5d, 0x3e, 0xbf, 0x4c, 0xb2, 0x41, 0x75, + 0x2f, 0x4f, 0xb9, 0x30, 0x75, 0xf9, 0x29, 0x91, 0x01, 0xf5, 0x0d, 0xc2, + 0x1d, 0x2f, 0xe0, 0x12, 0xfa, 0x75, 0x82, 0x3d, 0x3e, 0xc4, 0x72, 0x00, + 0x97, 0xe1, 0x96, 0x03, 0x25, 0x81, 0x46, 0x41, 0xa0, 0x2b, 0x6b, 0x78, + 0x75, 0xfb, 0xec, 0x02, 0xb9, 0x83, 0x64, 0xe5, 0x57, 0x89, 0x67, 0x1e, + 0x3f, 0x05, 0x53, 0x31, 0x49, 0x3f, 0xe2, 0xd9, 0x72, 0x80, 0x1b, 0xbe, + 0x8e, 0x9f, 0x92, 0xb4, 0x42, 0xa7, 0x97, 0x7c, 0xf8, 0xd5, 0xae, 0x7c, + 0xb5, 0x46, 0x60, 0xd8, 0x8f, 0xc6, 0x47, 0x70, 0x6a, 0x41, 0xc1, 0x53, + 0x93, 0xfb, 0xcf, 0x64, 0x38, 0x4a, 0xda, 0x5f, 0x27, 0x70, 0x54, 0x0a, + 0x25, 0x49, 0x01, 0x84, 0x57, 0x13, 0x1c, 0x5b, 0x2a, 0x5a, 0x1b, 0xcd, + 0x62, 0xb9, 0xa1, 0x1c, 0x6d, 0xcf, 0x50, 0xd6, 0x0e, 0xcc, 0xdc, 0x8c, + 0xfb, 0x87, 0x66, 0xe5, 0x0d, 0x48, 0xa3, 0xb5, 0x88, 0x73, 0xa1, 0x6d, + 0xbe, 0xa1, 0x59, 0xc1, 0x24, 0xe8, 0x36, 0x3b, 0x2d, 0xae, 0x9c, 0x69, + 0xd0, 0xa6, 0x42, 0x6b, 0xd5, 0xf7, 0xae, 0xa2, 0x40, 0xee, 0x2f, 0x10, + 0x20, 0x42, 0xd2, 0xcf, 0xd6, 0xac, 0x2d, 0x82, 0xdc, 0x40, 0x7e, 0x9f, + 0x63, 0x1e, 0xc1, 0x8f, 0xb7, 0x58, 0xf1, 0xdd, 0xdc, 0x7f, 0x57, 0x18, + 0xb7, 0x3a, 0xc6, 0xad, 0x86, 0x71, 0x6b, 0x61, 0x48, 0x2e, 0x4e, 0x53, + 0xf0, 0xf8, 0x2f, 0x13, 0x74, 0x50, 0x6f, 0x6e, 0x47, 0xeb, 0xd5, 0x62, + 0x92, 0x46, 0x30, 0x09, 0xb8, 0x45, 0x4e, 0x3d, 0x91, 0x10, 0xd8, 0xdb, + 0x82, 0xa2, 0x22, 0x66, 0x45, 0x7d, 0xfe, 0x31, 0x59, 0x53, 0x98, 0x67, + 0xa0, 0x72, 0xdb, 0x05, 0xf1, 0x80, 0x15, 0x48, 0x96, 0x20, 0x9a, 0x0c, + 0x94, 0x65, 0x92, 0xc3, 0xf8, 0x4a, 0xa3, 0x6f, 0x96, 0xcc, 0xe1, 0xf3, + 0x5c, 0x1b, 0x67, 0xbd, 0x07, 0xdb, 0xc0, 0xb5, 0xdb, 0x78, 0x0e, 0x30, + 0xb9, 0xd5, 0x98, 0xd3, 0x1d, 0x0f, 0x60, 0x6d, 0x04, 0xdf, 0x22, 0xa8, + 0x90, 0xc3, 0x3f, 0xad, 0xc7, 0x25, 0x17, 0x1b, 0x5e, 0x3e, 0x15, 0x4c, + 0xd6, 0x04, 0x8f, 0x9a, 0xd1, 0x22, 0x25, 0x67, 0x27, 0xc9, 0xd8, 0x3a, + 0xb9, 0x89, 0x17, 0x90, 0x46, 0x30, 0xd4, 0x3c, 0xbc, 0xad, 0x28, 0x20, + 0xcf, 0xc0, 0x2d, 0x3b, 0x5d, 0x5d, 0x7f, 0xca, 0xcf, 0x9d, 0x8e, 0xb5, + 0xa6, 0x3e, 0x72, 0x01, 0x27, 0xf3, 0x1f, 0x36, 0x59, 0x1e, 0xcf, 0xc1, + 0xeb, 0x83, 0xd6, 0x7c, 0x4d, 0x02, 0x0a, 0x27, 0x0e, 0xc6, 0x69, 0x68, + 0x71, 0x3e, 0x8c, 0x9f, 0xf6, 0xf7, 0x29, 0xa8, 0xeb, 0x19, 0x86, 0xd4, + 0x39, 0xdd, 0x45, 0x3b, 0x0d, 0xdf, 0x23, 0x60, 0x48, 0x97, 0x28, 0x70, + 0xec, 0xe5, 0xb1, 0x5b, 0x5e, 0x34, 0xfa, 0x92, 0xb7, 0xfe, 0xa2, 0x6f, + 0xb7, 0x54, 0x34, 0x89, 0x53, 0x79, 0x4c, 0x58, 0x64, 0x0c, 0xcb, 0xc8, + 0x42, 0xcc, 0x69, 0xfc, 0xd3, 0x26, 0x49, 0x81, 0xe0, 0x63, 0x96, 0x2d, + 0x56, 0x79, 0x26, 0xe5, 0xae, 0x48, 0xba, 0x14, 0xa9, 0xb9, 0xc8, 0x97, + 0x90, 0x02, 0x85, 0x1a, 0x45, 0xaa, 0x8a, 0xaf, 0xaa, 0x26, 0xe9, 0xa2, + 0x97, 0xa1, 0x38, 0x38, 0xf2, 0xe9, 0xce, 0x25, 0x4d, 0x9a, 0x40, 0x6f, + 0x3c, 0x4d, 0x96, 0x4d, 0x60, 0xd1, 0x66, 0x22, 0x22, 0xb9, 0xa5, 0x6c, + 0xa7, 0xbc, 0x71, 0xe5, 0xe4, 0x6b, 0x38, 0xd8, 0xf5, 0x96, 0x72, 0x0a, + 0x93, 0xa4, 0x1e, 0x9f, 0xe1, 0xf5, 0x68, 0x2e, 0x47, 0x93, 0xd9, 0xec, + 0xe7, 0x11, 0xcc, 0xa3, 0x23, 0x60, 0xa1, 0xa7, 0x95, 0xd5, 0xe3, 0xd4, + 0xba, 0x3e, 0x1d, 0x5a, 0xac, 0x2f, 0x27, 0xa8, 0x68, 0xfb, 0xfb, 0x76, + 0x31, 0x24, 0xb3, 0x53, 0x12, 0x0e, 0xd2, 0x86, 0xf2, 0x8e, 0xca, 0xf2, + 0x41, 0x5e, 0x43, 0x80, 0xe1, 0xec, 0x54, 0x41, 0x8d, 0x00, 0x8a, 0xb8, + 0xad, 0x02, 0xda, 0x03, 0x20, 0xce, 0x58, 0xd9, 0x32, 0xb5, 0x39, 0xc6, + 0xaf, 0x37, 0xda, 0xaa, 0x03, 0x69, 0x10, 0x8d, 0x8c, 0xbb, 0xd6, 0xa2, + 0xb0, 0x69, 0x90, 0x4c, 0x0b, 0x0d, 0x05, 0xd2, 0x58, 0x9d, 0xfd, 0x94, + 0xe6, 0xd1, 0x0d, 0xb4, 0x31, 0xf2, 0x71, 0x0b, 0x9f, 0xb7, 0xba, 0x89, + 0x05, 0x3b, 0x20, 0x01, 0xa1, 0xa8, 0xe5, 0x28, 0x82, 0x75, 0x8d, 0x1b, + 0x02, 0x50, 0xeb, 0x71, 0xd2, 0x00, 0x5a, 0x65, 0x4b, 0x53, 0x02, 0x9f, + 0x7a, 0x30, 0x60, 0xf8, 0x09, 0xea, 0x07, 0x9d, 0xe4, 0x8f, 0xdf, 0x7b, + 0xec, 0x8f, 0xdf, 0xcf, 0x20, 0x01, 0xa6, 0xcb, 0x32, 0x5b, 0xd2, 0x04, + 0x44, 0x10, 0x2c, 0x01, 0x42, 0xbd, 0xc0, 0x3f, 0x56, 0x70, 0xaa, 0xe0, + 0x08, 0x69, 0x03, 0xd7, 0xc2, 0xe7, 0xc0, 0x69, 0x53, 0xa4, 0xf9, 0x20, + 0xa4, 0xb9, 0x80, 0x6a, 0xf1, 0x55, 0xad, 0x31, 0x86, 0x90, 0x66, 0x97, + 0xd0, 0x9f, 0x41, 0x57, 0x78, 0x16, 0x50, 0x53, 0xe0, 0x9a, 0x8c, 0x80, + 0xd0, 0x10, 0x60, 0xe0, 0x03, 0x18, 0x80, 0xe2, 0x54, 0x0e, 0x74, 0x31, + 0x41, 0x03, 0x70, 0xa3, 0x21, 0xeb, 0x0b, 0x49, 0x4e, 0xb3, 0x28, 0x22, + 0xac, 0x97, 0xd1, 0x89, 0xef, 0x83, 0xc7, 0xaf, 0xcb, 0x3c, 0x1d, 0x82, + 0x96, 0xc3, 0xff, 0xd3, 0xa1, 0xb1, 0x28, 0x48, 0x08, 0x6f, 0xc3, 0xc4, + 0x01, 0xce, 0x70, 0x51, 0x99, 0x6e, 0x7c, 0xcb, 0xe8, 0x54, 0xe1, 0xa2, + 0x46, 0x9d, 0xf2, 0xc2, 0xa1, 0xc9, 0x40, 0x37, 0xce, 0xcc, 0xf9, 0xba, + 0x41, 0x73, 0xa8, 0xd3, 0x1c, 0x55, 0xd3, 0x04, 0x5a, 0x82, 0x6c, 0x35, + 0xcd, 0x91, 0x4e, 0x73, 0xaf, 0x9a, 0xe6, 0xae, 0xa2, 0x79, 0x53, 0x45, + 0x73, 0x4f, 0xa7, 0xf9, 0xb8, 0x96, 0x66, 0xc1, 0x6a, 0x15, 0xcd, 0xc7, + 0x3a, 0xcd, 0xfd, 0xda, 0xba, 0xef, 0x86, 0xd0, 0xdc, 0xd7, 0x69, 0x1e, + 0x84, 0xb5, 0xd1, 0xae, 0xaa, 0x3b, 0x75, 0x7a, 0xa5, 0x10, 0x57, 0x85, + 0x06, 0xf6, 0x45, 0xd9, 0x04, 0xa5, 0xdc, 0x8f, 0x0b, 0x20, 0x46, 0xb4, + 0x28, 0x36, 0xd6, 0x15, 0x24, 0x88, 0xcf, 0x29, 0x7d, 0x9e, 0x69, 0x5e, + 0xa7, 0xbc, 0xb6, 0x90, 0xf6, 0x2e, 0x7a, 0x53, 0xa2, 0x2a, 0x63, 0x5a, + 0x81, 0xc0, 0x86, 0x72, 0xc8, 0x02, 0xdb, 0x78, 0x66, 0xf6, 0x71, 0x48, + 0x01, 0x1d, 0x86, 0xb2, 0xf8, 0x97, 0x0b, 0xf1, 0x05, 0xca, 0x75, 0xd6, + 0xca, 0xe9, 0x3e, 0xd4, 0x02, 0xc6, 0xb8, 0x08, 0x03, 0x9a, 0xea, 0xeb, + 0x58, 0x94, 0x30, 0xc0, 0x7f, 0x9e, 0xca, 0x45, 0x26, 0x6a, 0x51, 0x4a, + 0xa6, 0xf1, 0x2a, 0x59, 0x16, 0x21, 0xbc, 0x06, 0x66, 0x4c, 0x7f, 0x05, + 0x54, 0x1e, 0x87, 0xef, 0xb4, 0x80, 0x39, 0x93, 0x72, 0xac, 0x2a, 0x9b, + 0xb4, 0xbe, 0x48, 0xa6, 0x83, 0x4b, 0x74, 0xe3, 0xe6, 0xe4, 0xf8, 0xab, + 0x27, 0x5f, 0x3e, 0xc5, 0x75, 0xaf, 0xea, 0x00, 0xff, 0x84, 0x3a, 0xc3, + 0x17, 0xe0, 0xf1, 0xfa, 0x60, 0x75, 0xa8, 0x7f, 0x25, 0x14, 0x0b, 0x0b, + 0x0e, 0x7d, 0xfa, 0xce, 0x3d, 0x90, 0x50, 0xe5, 0x7e, 0x8e, 0xfb, 0xc8, + 0x43, 0xe7, 0xfd, 0x2f, 0x3e, 0xa3, 0x5d, 0x1a, 0x48, 0x5b, 0x4d, 0xe6, + 0xf1, 0x1c, 0x66, 0xa2, 0xb2, 0x01, 0x8a, 0xed, 0x09, 0xd5, 0xe6, 0x50, + 0x10, 0xb6, 0x6c, 0xba, 0x59, 0xb2, 0x2c, 0x59, 0xce, 0x62, 0x06, 0xe8, + 0x18, 0x83, 0x70, 0x41, 0xb8, 0xf4, 0xb0, 0x48, 0x8a, 0xe1, 0x0b, 0xc5, + 0x22, 0x6a, 0x9c, 0xd3, 0x75, 0x25, 0x39, 0x6f, 0xa0, 0x3c, 0x79, 0xae, + 0xbe, 0x22, 0x68, 0xac, 0x19, 0x8e, 0x52, 0x96, 0x6e, 0x04, 0x9a, 0x2c, + 0x0a, 0xe0, 0x37, 0xf9, 0x25, 0xa6, 0x39, 0x4f, 0x80, 0x3e, 0x29, 0x5f, + 0x12, 0x34, 0xd7, 0xdb, 0x54, 0x4e, 0xe9, 0x0b, 0xe5, 0xc6, 0x75, 0xa1, + 0xb7, 0x76, 0xb2, 0x59, 0x9a, 0xac, 0xf3, 0xb7, 0x21, 0x89, 0x7e, 0x4e, + 0x57, 0xf3, 0x5b, 0xf8, 0xf1, 0xd6, 0x0e, 0xae, 0xcc, 0xc0, 0x97, 0x3f, + 0x01, 0xcc, 0x51, 0xfd, 0x86, 0x46, 0xa5, 0x01, 0x00 }; diff --git a/Arduino/McLighting/json_functions.h b/Arduino/McLighting/json_functions.h index 15e7fda..632717f 100644 --- a/Arduino/McLighting/json_functions.h +++ b/Arduino/McLighting/json_functions.h @@ -10,14 +10,14 @@ char * listStateJSONfull() { const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(19) + 250; DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); - root["segment"] = FXSettings.segment; - root["start"] = seg_start; - root["stop"] = seg_stop; - root["mode"] = (uint8_t) mode; + root["segment"] = State.segment; + root["start"] = segState.start; + root["stop"] = segState.stop; + root["mode"] = (uint8_t) State.mode; //getSegmentParams(segment); - root["fx_mode"] = fx_mode; - root["speed"] = fx_speed; - root["brightness"] = brightness; + root["fx_mode"] = segState.mode[State.segment]; + root["speed"] = segState.speed[State.segment]; + root["brightness"] = State.brightness; JsonArray color = root.createNestedArray("color"); color.add(main_color.white); color.add(main_color.red); @@ -31,7 +31,7 @@ char * listStateJSONfull() { color.add(xtra_color.red); color.add(xtra_color.green); color.add(xtra_color.blue); - root["ws_fxopt"] = fx_options; + root["ws_fxopt"] = segState.options; root["hostname"] = HOSTNAME; #if defined(ENABLE_MQTT) root["mqtt_host"] = mqtt_host; @@ -39,11 +39,11 @@ char * listStateJSONfull() { root["mqtt_user"] = mqtt_user; root["mqtt_pass"] = mqtt_pass; #endif - root["ws_seg"] = num_segments; - root["ws_cnt"] = FXSettings.stripSize; - root["ws_rgbo"] = FXSettings.RGBOrder; - root["ws_pin"] = FXSettings.pin; - root["ws_trans"] = FXSettings.transEffect; + root["ws_seg"] = Config.segments; + root["ws_cnt"] = Config.stripSize; + root["ws_rgbo"] = Config.RGBOrder; + root["ws_pin"] = Config.pin; + root["ws_trans"] = Config.transEffect; uint16_t msg_len = measureJson(root) + 1; char * buffer = (char *) malloc(msg_len); serializeJson(root, buffer, msg_len); @@ -55,9 +55,9 @@ char * listStateJSON() { const size_t bufferSize = JSON_OBJECT_SIZE(3) + 25; DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); - root["segment"] = FXSettings.segment; - root["mode"] = (uint8_t) mode; - root["brightness"] = brightness; + root["segment"] = State.segment; + root["mode"] = (uint8_t) State.mode; + root["brightness"] = State.brightness; uint16_t msg_len = measureJson(root) + 1; char * buffer = (char *) malloc(msg_len); serializeJson(root, buffer, msg_len); @@ -65,49 +65,36 @@ char * listStateJSON() { return buffer; } -char * listSegmentStateJSON(uint8_t seg) { +char * listSegmentStateJSON(uint8_t _seg) { const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(6) + 100; DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); - if (seg == FXSettings.segment) { - root["start"] = seg_start; - root["stop"] = seg_stop; + if (_seg == State.segment) { + root["start"] = segState.start; + root["stop"] = segState.stop; } else { - root["start"] = strip->getSegment(seg)->start; - root["stop"] = strip->getSegment(seg)->stop; + root["start"] = strip->getSegment(_seg)->start; + root["stop"] = strip->getSegment(_seg)->stop; } //getSegmentParams(seg); - root["fx_mode"] = strip->getMode(seg); - root["speed"] = fx_speed; - JsonArray color = root.createNestedArray("color"); - if (seg == FXSettings.segment) { - color.add(main_color.white); - color.add(main_color.red); - color.add(main_color.green); - color.add(main_color.blue); - color.add(back_color.white); - color.add(back_color.red); - color.add(back_color.green); - color.add(back_color.blue); - color.add(xtra_color.white); - color.add(xtra_color.red); - color.add(xtra_color.green); - color.add(xtra_color.blue); - } else { - color.add((strip->getColors(seg)[0] >> 24) & 0xFF); - color.add((strip->getColors(seg)[0] >> 16) & 0xFF); - color.add((strip->getColors(seg)[0] >> 8) & 0xFF); - color.add((strip->getColors(seg)[0]) & 0xFF); - color.add((strip->getColors(seg)[1] >> 24) & 0xFF); - color.add((strip->getColors(seg)[1] >> 16) & 0xFF); - color.add((strip->getColors(seg)[1] >> 8) & 0xFF); - color.add((strip->getColors(seg)[1]) & 0xFF); - color.add((strip->getColors(seg)[2] >> 24) & 0xFF); - color.add((strip->getColors(seg)[2] >> 16) & 0xFF); - color.add((strip->getColors(seg)[2] >> 8) & 0xFF); - color.add((strip->getColors(seg)[2]) & 0xFF); - } - root["ws_fxopt"] = fx_options; + //root["fx_mode"] = strip->getMode(_seg); + root["fx_mode"] = segState.mode[_seg]; + root["speed"] = segState.speed[_seg]; + JsonArray color = root.createNestedArray("color"); + //color.add((strip->getColors(_seg)[0] >> 24) & 0xFF); + color.add((segState.colors[_seg][0] >> 24) & 0xFF); + color.add((segState.colors[_seg][0] >> 16) & 0xFF); + color.add((segState.colors[_seg][0] >> 8) & 0xFF); + color.add((segState.colors[_seg][0]) & 0xFF); + color.add((segState.colors[_seg][1] >> 24) & 0xFF); + color.add((segState.colors[_seg][1] >> 16) & 0xFF); + color.add((segState.colors[_seg][1] >> 8) & 0xFF); + color.add((segState.colors[_seg][1]) & 0xFF); + color.add((segState.colors[_seg][2] >> 24) & 0xFF); + color.add((segState.colors[_seg][2] >> 16) & 0xFF); + color.add((segState.colors[_seg][2] >> 8) & 0xFF); + color.add((segState.colors[_seg][2]) & 0xFF); + root["ws_fxopt"] = segState.options; uint16_t msg_len = measureJson(root) + 1; char * buffer = (char *) malloc(msg_len); serializeJson(root, buffer, msg_len); @@ -137,11 +124,11 @@ char * listConfigJSON() { root["mqtt_user"] = mqtt_user; root["mqtt_pass"] = mqtt_pass; #endif - root["ws_seg"] = num_segments; - root["ws_cnt"] = FXSettings.stripSize; - root["ws_rgbo"] = FXSettings.RGBOrder; - root["ws_pin"] = FXSettings.pin; - root["ws_trans"] = FXSettings.transEffect; + root["ws_seg"] = Config.segments; + root["ws_cnt"] = Config.stripSize; + root["ws_rgbo"] = Config.RGBOrder; + root["ws_pin"] = Config.pin; + root["ws_trans"] = Config.transEffect; uint16_t msg_len = measureJson(root) + 1; char * buffer = (char *) malloc(msg_len); serializeJson(root, buffer, msg_len); @@ -211,10 +198,10 @@ char * listESPStateJSON() { #else root["animation_lib"] = "WS2812FX"; #endif - root["ws2812_pin"] = FXSettings.pin; - root["led_count"] = FXSettings.stripSize; - root["rgb_order"] = FXSettings.RGBOrder; - if (strstr(FXSettings.RGBOrder, "W") != NULL) { + root["ws2812_pin"] = Config.pin; + root["led_count"] = Config.stripSize; + root["rgb_order"] = Config.RGBOrder; + if (strstr(Config.RGBOrder, "W") != NULL) { root["rgbw_mode"] = "ON"; } else { root["rgbw_mode"] = "OFF"; diff --git a/Arduino/McLighting/mode_custom_ws2812fx_animations.h b/Arduino/McLighting/mode_custom_ws2812fx_animations.h index ba6c6bd..07f0d38 100644 --- a/Arduino/McLighting/mode_custom_ws2812fx_animations.h +++ b/Arduino/McLighting/mode_custom_ws2812fx_animations.h @@ -1,5 +1,5 @@ // Prototypes -uint16_t convertSpeed(uint16_t _mcl_speed); +uint16_t convertSpeed(uint8_t _mcl_speed); uint32_t trans(uint32_t _newcolor, uint32_t _oldcolor, uint8_t _level, uint8_t _steps); // End Prototypes /* @@ -12,22 +12,28 @@ More info on how to create custom aniamtions for WS2812FX: https://github.com/ki // *************************************************************************** // Functions and variables for automatic cycling // *************************************************************************** - -void handleAutoPlay() { +uint16_t handleSegmentOFF(void) { WS2812FX::Segment* _seg = strip->getSegment(); - if (autoDelay <= millis()) { - hex_colors_trans[0] = autoParams[autoCount][0]; - hex_colors_trans[1] = autoParams[autoCount][1]; - hex_colors_trans[2] = autoParams[autoCount][2]; - strip->setColors(FXSettings.segment, hex_colors_trans); - strip->setSpeed(FXSettings.segment, convertSpeed((uint16_t)autoParams[autoCount][3])); - strip->setMode(FXSettings.segment, (uint8_t)autoParams[autoCount][4]); - strip->trigger(); - autoDelay = millis() + (uint32_t)autoParams[autoCount][5]; - DBG_OUTPUT_PORT.print("autoTick "); - DBG_OUTPUT_PORT.printf("autoTick[%d]: {0x%08x, 0x%08x, 0x%08x, %d, %d, %d}\r\n", autoCount, hex_colors[0], hex_colors[1], hex_colors[2], autoParams[autoCount][3], autoParams[autoCount][4], autoParams[autoCount][5]); - autoCount++; - if (autoCount >= (sizeof(autoParams) / sizeof(autoParams[0]))) autoCount = 0; + return _seg->speed; +} + +void handleAutoPlay(uint8_t _seg) { + //WS2812FX::Segment* _seg = strip->getSegment(); + if (autoDelay[_seg] <= millis()) { + uint32_t _hex_colors[3] = {}; + //if (_seg == + _hex_colors[0] = autoParams[autoCount[_seg]][0]; + _hex_colors[1] = autoParams[autoCount[_seg]][1]; + _hex_colors[2] = autoParams[autoCount[_seg]][2]; + //} + strip->setColors(_seg, _hex_colors); + strip->setSpeed(_seg, convertSpeed((uint16_t)autoParams[autoCount[_seg]][3])); + strip->setMode(_seg, (uint8_t)autoParams[autoCount[_seg]][4]); + //strip->trigger(); + autoDelay[_seg] = millis() + (unsigned long)autoParams[autoCount[_seg]][5]; + DBG_OUTPUT_PORT.printf("autoTick[%d][%d]: {0x%08x, 0x%08x, 0x%08x, %d, %d, %d}\r\n", _seg, autoCount[_seg], autoParams[autoCount[_seg]][0], autoParams[autoCount[_seg]][1], autoParams[autoCount[_seg]][2], autoParams[autoCount[_seg]][3], autoParams[autoCount[_seg]][4], autoParams[autoCount[_seg]][5]); + autoCount[_seg]++; + if (autoCount[_seg] >= (sizeof(autoParams) / sizeof(autoParams[0]))) autoCount[_seg] = 0; } } @@ -41,7 +47,7 @@ void handleAutoPlay() { unsigned long dipStartTime; unsigned long currentMillis; uint8_t ledState = LOW; - long previousMillis = 0; + unsigned long previousMillis = 0; uint16_t interv = 2000; uint8_t twitch = 50; uint8_t dipCount = 0; @@ -119,7 +125,7 @@ uint16_t handleTV(void) { if(currentMillis-previousMillis > interv) { previousMillis = currentMillis; //interv = random(750,4001);//Adjusts the interval for more/less frequent random light changes - interv = random(1000-(fx_speed*2),5001-(fx_speed*8)); + interv = random(1000-(_seg->speed/128),5001-(_seg->speed/32)); twitch = random(40,100);// Twitch provides motion effect but can be a bit much if too high dipCount = dipCount++; } @@ -145,7 +151,7 @@ uint16_t handleTV(void) { currentDipTime = millis(); if (currentDipTime - dipStartTime < darkTime) { for (uint16_t i=(_seg->start + 3); i<= _seg->stop; i++) { - ledstates[i] = brightness; + ledstates[i] = State.brightness; for (uint16_t j=_seg->start; j<=_seg->stop; j++) { uint16_t index = (j%3 == 0) ? 400 : random(0,767); hsb2rgbAN1(index, 200, ledstates[j], j); @@ -178,11 +184,11 @@ uint16_t handleE131(void) { /* #if defined(RGBW) uint16_t multipacketOffset = (universe - START_UNIVERSE) * 128; //if more than 128 LEDs * 4 colors = 512 channels, client will send in next higher universe if (NUMLEDS <= multipacketOffset) return; - uint16_t len = (128 + multipacketOffset > FXSettings.stripSize) ? (FXSettings.stripSize - multipacketOffset) : 128; + uint16_t len = (128 + multipacketOffset > Config.stripSize) ? (Config.stripSize - multipacketOffset) : 128; #else*/ uint16_t multipacketOffset = (universe - START_UNIVERSE) * 170; //if more than 170 LEDs * 3 colors = 510 channels, client will send in next higher universe - if (FXSettings.stripSize <= multipacketOffset) return _seg->speed; - uint16_t len = (170 + multipacketOffset > FXSettings.stripSize) ? (FXSettings.stripSize - multipacketOffset) : 170; + if (Config.stripSize <= multipacketOffset) return _seg->speed; + uint16_t len = (170 + multipacketOffset > Config.stripSize) ? (Config.stripSize - multipacketOffset) : 170; /* #endif */ for (uint16_t i = 0; i < len; i++){ if ((i >= _seg->start) && (i <= _seg->stop)) { @@ -219,11 +225,13 @@ uint16_t handleFire2012(void) { } // Step 4. Map from heat cells to LED colors + + // 98 143 for( uint16_t j = _seg->start; j <= _seg->stop; j++) { CRGB color = HeatColor(ledstates[j]); uint16_t pixel; if ((_seg->options & 128) > 0) { - pixel = _seg->stop - j; + pixel = _seg->stop + (_seg->start - j); } else { pixel = j; } diff --git a/Arduino/McLighting/request_handlers.h b/Arduino/McLighting/request_handlers.h index b719ba0..8d2f7f5 100644 --- a/Arduino/McLighting/request_handlers.h +++ b/Arduino/McLighting/request_handlers.h @@ -7,7 +7,7 @@ bool handleSetMainColor(uint8_t * mypayload) { // decode rgb data uint32_t rgb = (uint32_t) strtoul((const char *) &mypayload[1], NULL, 16); - if (rgb != strip->getColors(FXSettings.segment)[0]) { + if (rgb != segState.colors[State.segment][0]) { main_color.white = ((rgb >> 24) & 0xFF); main_color.red = ((rgb >> 16) & 0xFF); main_color.green = ((rgb >> 8) & 0xFF); @@ -20,7 +20,7 @@ bool handleSetMainColor(uint8_t * mypayload) { bool handleSetBackColor(uint8_t * mypayload) { // decode rgb data uint32_t rgb = (uint32_t) strtoul((const char *) &mypayload[2], NULL, 16); - if (rgb != strip->getColors(FXSettings.segment)[1]) { + if (rgb != segState.colors[State.segment][1]) { back_color.white = ((rgb >> 24) & 0xFF); back_color.red = ((rgb >> 16) & 0xFF); back_color.green = ((rgb >> 8) & 0xFF); @@ -32,7 +32,7 @@ bool handleSetBackColor(uint8_t * mypayload) { bool handleSetXtraColor(uint8_t * mypayload) { // decode rgb data uint32_t rgb = (uint32_t) strtoul((const char *) &mypayload[3], NULL, 16); - if (rgb != strip->getColors(FXSettings.segment)[2]) { + if (rgb != segState.colors[State.segment][2]) { xtra_color.white = ((rgb >> 24) & 0xFF); xtra_color.red = ((rgb >> 16) & 0xFF); xtra_color.green = ((rgb >> 8) & 0xFF); @@ -45,14 +45,14 @@ bool handleSetXtraColor(uint8_t * mypayload) { bool handleSetAllMode(uint8_t * mypayload) { // decode rgb data uint32_t rgb = (uint32_t) strtoul((const char *) &mypayload[1], NULL, 16); - if ((mode = OFF) || (fx_mode != strip->getMode(FXSettings.segment)) || (rgb != strip->getColors(FXSettings.segment)[0])) { + if ((State.mode = OFF) || (segState.mode[State.segment] != strip->getMode(State.segment)) || (rgb != segState.colors[State.segment][0])) { main_color.white = ((rgb >> 24) & 0xFF); main_color.red = ((rgb >> 16) & 0xFF); main_color.green = ((rgb >> 8) & 0xFF); main_color.blue = ((rgb >> 0) & 0xFF); DBG_OUTPUT_PORT.printf("WS: Set all leds to main color: R: [%u] G: [%u] B: [%u] W: [%u]\r\n", main_color.red, main_color.green, main_color.blue, main_color.white); fx_mode = FX_MODE_STATIC; - mode = SET; + State.mode = SET; return true; } return false; @@ -65,8 +65,8 @@ void handleSetSingleLED(uint8_t * mypayload, uint8_t firstChar = 0) { templed[4] = 0x00; uint8_t led = atoi(templed); - DBG_OUTPUT_PORT.printf("led value: [%i]. Entry threshold: <= [%i] (=> %s)\r\n", led, FXSettings.stripSize, mypayload ); - if (led <= FXSettings.stripSize) { + DBG_OUTPUT_PORT.printf("led value: [%i]. Entry threshold: <= [%i] (=> %s)\r\n", led, Config.stripSize, mypayload ); + if (led <= Config.stripSize) { char redhex[3]; char greenhex[3]; char bluehex[3]; @@ -100,7 +100,7 @@ void handleSetSingleLED(uint8_t * mypayload, uint8_t firstChar = 0) { strip->setPixelColor(led, color.red, color.green, color.blue, color.white); strip->show(); } - mode = HOLD; + State.mode = HOLD; fx_mode= FX_MODE_CUSTOM_1; } @@ -151,13 +151,13 @@ bool setModeByStateString(String saved_state_string) { if (getValue(saved_state_string, '|', 0) == "STA") { DBG_OUTPUT_PORT.printf("Parsed state: %s\r\n", saved_state_string.c_str()); String str_mode = getValue(saved_state_string, '|', 1); - mode = static_cast(str_mode.toInt()); + State.mode = static_cast(str_mode.toInt()); String str_fx_mode = getValue(saved_state_string, '|', 2); fx_mode = str_fx_mode.toInt(); String str_fx_speed = getValue(saved_state_string, '|', 3); - fx_speed = str_fx_speed.toInt(); + segState.speed[State.segment] = str_fx_speed.toInt(); String str_brightness = getValue(saved_state_string, '|', 4); - brightness = str_brightness.toInt(); + State.brightness = str_brightness.toInt(); String str_red = getValue(saved_state_string, '|', 5); main_color.red = str_red.toInt(); String str_green = getValue(saved_state_string, '|', 6); @@ -185,7 +185,7 @@ bool setModeByStateString(String saved_state_string) { DBG_OUTPUT_PORT.print("Set to state: "); DBG_OUTPUT_PORT.println(listStateJSON()); //prevmode=mode; - //mode = SET; + //State.mode = SET; return true; } else { DBG_OUTPUT_PORT.println("Saved state not found!"); @@ -198,13 +198,13 @@ void handleSetWS2812FXMode(uint8_t * mypayload) { if (isDigit(mypayload[1])) { fx_mode = (uint8_t) strtol((const char *) &mypayload[1], NULL, 10); fx_mode = constrain(fx_mode, 0, strip->getModeCount() - 1); - mode = SET; + State.mode = SET; } else { if (strcmp((char *) &mypayload[1], "off") == 0) { - if (mode == OFF) { mode = SET; } else { mode = OFF; }; + if (State.mode == OFF) { State.mode = SET; } else { State.mode = OFF; }; } if (strcmp((char *) &mypayload[1], "on") == 0) { - mode = SET; + State.mode = SET; } } } @@ -268,25 +268,25 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { if (_payload[0] == 'S') { if (_payload[1] == 's') { uint8_t seg = (uint8_t) strtol((const char *) &_payload[2], NULL, 10); - FXSettings.segment = constrain(seg, 0, num_segments - 1); - if (prevsegment != FXSettings.segment) { - prevsegment = FXSettings.segment; - getSegmentParams(FXSettings.segment); + State.segment = constrain(seg, 0, Config.segments - 1); + if (prevsegment != State.segment) { + prevsegment = State.segment; + getSegmentParams(State.segment); //convertColors(); - //memcpy(hex_colors, hex_colors_trans, sizeof(hex_colors_trans)); - memcpy(hex_colors_trans, hex_colors, sizeof(hex_colors_trans)); + //memcpy(segState.colors[State.segment], hexcolors_trans, sizeof(hexcolors_trans)); + memcpy(hexcolors_trans, segState.colors[State.segment], sizeof(hexcolors_trans)); _updateState = true; Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Set segment to: [%u]\r\n", FXSettings.segment); + DBG_OUTPUT_PORT.printf("Set segment to: [%u]\r\n", State.segment); } } // / ==> Set segment first LED if (_payload[1] == '[') { uint16_t _seg_start = (uint16_t) strtol((const char *) &_payload[2], NULL, 10); - //getSegmentParams(FXSettings.segment); - _seg_start = constrain(_seg_start, 0, FXSettings.stripSize - 1); - if (_seg_start != seg_start) { - seg_start = _seg_start; + //getSegmentParams(State.segment); + _seg_start = constrain(_seg_start, 0, Config.stripSize - 1); + if (_seg_start != segState.start) { + segState.start = _seg_start; _updateSegState = true; setSegmentSize(); Dbg_Prefix(mqtt, num); @@ -296,10 +296,10 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { // / ==> Set segment last LED if (_payload[1] == ']') { uint16_t _seg_stop = (uint16_t) strtol((const char *) &_payload[2], NULL, 10); - //getSegmentParams(FXSettings.segment); - _seg_stop = constrain(_seg_stop, seg_start, FXSettings.stripSize - 1); - if (_seg_stop != seg_stop) { - seg_stop = _seg_stop; + //getSegmentParams(State.segment); + _seg_stop = constrain(_seg_stop, segState.start, Config.stripSize - 1); + if (_seg_stop != segState.stop) { + segState.stop = _seg_stop; _updateSegState = true; setSegmentSize(); Dbg_Prefix(mqtt, num); @@ -310,15 +310,15 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { char _fx_options[4]; snprintf(_fx_options, sizeof(_fx_options), "%s", &_payload[2]); _fx_options[3] = 0x00; - if (((constrain(atoi(_fx_options), 0, 255)>>1)<<1) != fx_options) { - fx_options = ((constrain(atoi(_fx_options), 0, 255)>>1)<<1); + if (((constrain(atoi(_fx_options), 0, 255)>>1)<<1) != segState.options) { + segState.options= ((constrain(atoi(_fx_options), 0, 255)>>1)<<1); _updateSegState = true; - strip->setOptions(FXSettings.segment, fx_options); + strip->setOptions(State.segment, segState.options); Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Set segment options to: [%u]\r\n", fx_options); + DBG_OUTPUT_PORT.printf("Set segment options to: [%u]\r\n", segState.options); } } - char * buffer = listSegmentStateJSON(FXSettings.segment); + char * buffer = listSegmentStateJSON(State.segment); if (mqtt == true) { DBG_OUTPUT_PORT.print("MQTT: "); #if defined(ENABLE_MQTT) @@ -338,7 +338,7 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { // / ==> Set WS2812 mode. if (_payload[0] == '/') { handleSetWS2812FXMode(_payload); - if (fx_mode != strip->getMode(FXSettings.segment)) { + if (fx_mode != strip->getMode(State.segment)) { _updateSegState = true; Dbg_Prefix(mqtt, num); DBG_OUTPUT_PORT.printf("Set WS2812 mode: [%s]\r\n", _payload); @@ -369,28 +369,28 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK %s", _payload); #endif - mode = SET; + State.mode = SET; } } // ? ==> Set speed if (_payload[0] == '?') { uint16_t _fx_speed = (uint16_t) strtol((const char *) &_payload[1], NULL, 10); - fx_speed = constrain(_fx_speed, SPEED_MIN, SPEED_MAX ); - mode = SET; + segState.speed[State.segment] = constrain(_fx_speed, SPEED_MIN, SPEED_MAX ); + State.mode = SET; _updateSegState = true; Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Set speed to: [%u]\r\n", fx_speed); + DBG_OUTPUT_PORT.printf("Set speed to: [%u]\r\n", segState.speed[State.segment]); } // % ==> Set brightness if (_payload[0] == '%') { uint8_t b = (uint8_t) strtol((const char *) &_payload[1], NULL, 10); - brightness = constrain(b, 0, 255); - if (strip->getBrightness() != brightness) { - mode = SET; + State.brightness = constrain(b, 0, 255); + if (strip->getBrightness() != State.brightness) { + State.mode = SET; Dbg_Prefix(mqtt, num); - DBG_OUTPUT_PORT.printf("Set brightness to: [%u]\r\n", brightness); + DBG_OUTPUT_PORT.printf("Set brightness to: [%u]\r\n", State.brightness); _updateState = true; } } @@ -451,24 +451,24 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { if (_payload[0] == 'C') { bool _updateStrip = false; bool _updateConfig = false; - bool _updateSegState = false; + bool _updateState = false; if (_payload[1] == 's') { if (_payload[2] == 's') { char _num_segments[3]; snprintf(_num_segments, sizeof(_num_segments), "%s", &_payload[3]); _num_segments[2] = 0x00; - num_segments = constrain(atoi(_num_segments), 1, MAX_NUM_SEGMENTS - 1); - if (FXSettings.segment >= num_segments) { - FXSettings.segment = num_segments - 1; + Config.segments = constrain(atoi(_num_segments), 1, MAX_NUM_SEGMENTS - 1); + if (State.segment >= Config.segments) { + State.segment = Config.segments - 1; + _updateState = true; } _updateStrip = true; - _updateSegState = true; } if (_payload[2] == 'c') { char tmp_count[6]; snprintf(tmp_count, sizeof(tmp_count), "%s", &_payload[3]); tmp_count[5] = 0x00; - FXSettings.stripSize = constrain(atoi(tmp_count), 1, MAXLEDS); + Config.stripSize = constrain(atoi(tmp_count), 1, MAXLEDS); _updateStrip = true; } if (_payload[2] == 'r') { @@ -529,7 +529,7 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { char _transEffect[2]; snprintf(_transEffect, sizeof(_transEffect), "%s", &_payload[2]); _transEffect[sizeof(_transEffect) - 1] = 0x00; - FXSettings.transEffect = atoi(_transEffect); + Config.transEffect = atoi(_transEffect); _updateConfig = true; } @@ -554,15 +554,14 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { DBG_OUTPUT_PORT.println("Saving config.json!"); if(!save_conf.active()) save_conf.once(3, tickerSaveConfig); } - if (_updateSegState) { - DBG_OUTPUT_PORT.println("Saving stripstate_segment.json!"); - if(!save_seg_state.active()) save_seg_state.once(3, tickerSaveSegmentState); - + if (_updateState) { + DBG_OUTPUT_PORT.println("Saving stripstate.json!"); + if(!save_state.active()) save_state.once(3, tickerSaveState); } #endif _updateStrip = false; _updateConfig = false; - _updateSegState = false; + _updateState = false; DBG_OUTPUT_PORT.printf("Get status info: %s\r\n", buffer); free (buffer); } @@ -713,7 +712,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght const size_t bufferSize = JSON_OBJECT_SIZE(6) + JSON_OBJECT_SIZE(12) + 1000; DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); - root["state"] = (mode != OFF) ? on_cmd : off_cmd; + root["state"] = (State.mode != OFF) ? on_cmd : off_cmd; #if defined(ENABLE_MQTT_INCLUDE_IP) root["ip"] = WiFi.localIP(); #endif @@ -730,16 +729,16 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght color["g3"] = xtra_color.green; color["b3"] = xtra_color.blue; color["w3"] = xtra_color.white; - if (strstr(FXSettings.RGBOrder, "W") != NULL) { + if (strstr(Config.RGBOrder, "W") != NULL) { root["white_value"]= main_color.white; } - root["brightness"] = brightness; + root["brightness"] = State.brightness; root["color_temp"] = color_temp; - root["speed"] = fx_speed; + root["speed"] = segState.speed[State.segment]; //char modeName[30]; //strncpy_P(modeName, (PGM_P)strip->getModeName(strip->getMode()), sizeof(modeName)); // copy from progmem #if defined(ENABLE_HOMEASSISTANT) - if (mode == OFF){ + if (State.mode == OFF){ root["effect"] = "OFF"; } else { root["effect"] = strip->getModeName(strip->getMode()); @@ -777,10 +776,10 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght if (root.containsKey("state")) { const char* state_in = root["state"]; if (strcmp(state_in, on_cmd) == 0) { - mode = SET; + State.mode = SET; } else if (strcmp(state_in, off_cmd) == 0) { - mode = OFF; + State.mode = OFF; jsonBuffer.clear(); return true; } @@ -800,22 +799,22 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght xtra_color.green = (uint8_t) color["g3"]; xtra_color.blue = (uint8_t) color["b3"]; xtra_color.white = (uint8_t) color["w3"]; - mode = SET; + State.mode = SET; } if (root.containsKey("white_value")) { uint8_t json_white_value = constrain((uint8_t) root["white_value"], 0, 255); if (json_white_value != main_color.white) { main_color.white = json_white_value; - mode = SET; + State.mode = SET; } } if (root.containsKey("speed")) { - uint16_t _fx_speed = constrain((uint8_t) root["speed"], SPEED_MIN, SPEED_MAX); - if (_fx_speed != fx_speed) { - fx_speed = _fx_speed; - mode = SET; + uint8_t _fx_speed = constrain((uint8_t) root["speed"], 0, 255); + if (_fx_speed != segState.speed[State.segment]) { + segState.speed[State.segment] = _fx_speed; + State.mode = SET; } } @@ -824,14 +823,14 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght color_temp = (uint16_t) root["color_temp"]; uint16_t kelvin = 1000000 / color_temp; main_color = temp2rgb(kelvin); - mode = SET; + State.mode = SET; } if (root.containsKey("brightness")) { uint8_t json_brightness = constrain((uint8_t) root["brightness"], 0, 255); //fix #224 - if (json_brightness != brightness) { - brightness = json_brightness; - mode = SET; + if (json_brightness != State.brightness) { + State.brightness = json_brightness; + State.mode = SET; } } @@ -839,12 +838,12 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght String effectString = root["effect"].as(); #if defined(ENABLE_HOMEASSISTANT) if(effectString == "OFF"){ - mode = OFF; + State.mode = OFF; } #endif for (uint8_t i = 0; i < strip->getModeCount(); i++) { if(String(strip->getModeName(i)) == effectString) { - mode = SET; + State.mode = SET; fx_mode = i; break; } @@ -925,7 +924,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght #endif root["brightness"] = "true"; root["rgb"] = "true"; - if (strstr(FXSettings.RGBOrder, "W") != NULL) { + if (strstr(Config.RGBOrder, "W") != NULL) { root["white_value"]= "true"; } root["optimistic"] = "false"; @@ -1030,7 +1029,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght #endif root["brightness"] = "true"; root["rgb"] = "true"; - if (strstr(FXSettings.RGBOrder, "W") != NULL) { + if (strstr(Config.RGBOrder, "W") != NULL) { root["white_value"]= "true"; } root["optimistic"] = "false"; @@ -1081,12 +1080,12 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght #if defined(ENABLE_BUTTON) void shortKeyPress() { DBG_OUTPUT_PORT.printf("Short button press\r\n"); - if (mode == OFF) { + if (State.mode == OFF) { setModeByStateString(BTN_MODE_SHORT); - prevmode = mode; - mode = SET; + prevmode = State.mode; + State.mode = SET; } else { - mode = OFF; + State.mode = OFF; } } @@ -1094,16 +1093,16 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght void mediumKeyPress() { DBG_OUTPUT_PORT.printf("Medium button press\r\n"); setModeByStateString(BTN_MODE_MEDIUM); - prevmode = mode; - mode = SET; + prevmode = State.mode; + State.mode = SET; } // called when button is kept pressed for 2 seconds or more void longKeyPress() { DBG_OUTPUT_PORT.printf("Long button press\r\n"); setModeByStateString(BTN_MODE_LONG); - prevmode = mode; - mode = SET; + prevmode = State.mode; + State.mode = SET; } void button() { @@ -1147,7 +1146,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght tcs.getData(&r, &g, &b, &col, &conf); DBG_OUTPUT_PORT.printf("Colors: R: [%d] G: [%d] B: [%d] Color: [%d] Conf: [%d]\r\n", (int)r, (int)g, (int)b, (int)col, (int)conf); main_color.red = (pow((r/255.0), GAMMA)*255); main_color.green = (pow((g/255.0), GAMMA)*255); main_color.blue = (pow((b/255.0), GAMMA)*255);main_color.white = 0; - mode = SET; + State.mode = SET; } // called when button is kept pressed for less than 2 seconds @@ -1207,62 +1206,62 @@ void handleRemote() { } if (results.value == rmt_commands[ON_OFF]) { // ON/OFF TOGGLE last_remote_cmd = 0; - if (mode == OFF) { - mode = SET; + if (State.mode == OFF) { + State.mode = SET; } else { - mode = OFF; + State.mode = OFF; } } - if (mode == HOLD) { + if (State.mode == HOLD) { if (results.value == rmt_commands[BRIGHTNESS_UP]) { //Brightness Up last_remote_cmd = results.value; - if (brightness + chng <= 255) { - brightness = brightness + chng; - mode = SET; + if (State.brightness + chng <= 255) { + State.brightness = State.brightness + chng; + State.mode = SET; } } if (results.value == rmt_commands[BRIGHTNESS_DOWN]) { //Brightness down last_remote_cmd = results.value; - if (brightness - chng >= 0) { - brightness = brightness - chng; - mode = SET; + if (State.brightness - chng >= 0) { + State.brightness = State.brightness - chng; + State.mode = SET; } } - if ((fx_mode < 56) || (fx_mode > 57)) { + if ((segState.mode[State.segment] < FX_MODE_CUSTOM_0) || (segState.mode[State.segment] > FX_MODE_CUSTOM_1)) { if (results.value == rmt_commands[SPEED_UP]) { //Speed Up last_remote_cmd = results.value; - if (fx_speed + chng <= 65535) { - fx_speed = fx_speed + (chng * 5); - mode = SET; + if (segState.speed[State.segment] + chng <= 65535) { + segState.speed[State.segment] = segState.speed[State.segment] + chng; + State.mode = SET; } } if (results.value == rmt_commands[SPEED_DOWN]) { //Speed down last_remote_cmd = results.value; - if (fx_speed - chng >= 0) { - fx_speed = fx_speed - (chng * 5); - mode = SET; + if (segState.speed[State.segment] - chng >= 0) { + segState.speed[State.segment] = segState.speed[State.segment] - chng; + State.mode = SET; } } } - if ((fx_mode < 56) || (fx_mode > 60)) { + if ((segState.mode[State.segment] < FX_MODE_CUSTOM_0) || (segState.mode[State.segment] > FX_MODE_CUSTOM_4)) { if (results.value == rmt_commands[RED_UP]) { //Red Up last_remote_cmd = results.value; if (selected_color == 1) { if (main_color.red + chng <= 255) { main_color.red = main_color.red + chng; - mode = SET; + State.mode = SET; } } if (selected_color == 2) { if (back_color.red + chng <= 255) { back_color.red = back_color.red + chng; - mode = SET; + State.mode = SET; } } if (selected_color == 3) { if (xtra_color.red + chng <= 255) { xtra_color.red = xtra_color.red + chng; - mode = SET; + State.mode = SET; } } } @@ -1271,19 +1270,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.red - chng >= 0) { main_color.red = main_color.red - chng; - mode = SET; + State.mode = SET; } } if (selected_color == 2) { if (back_color.red - chng >= 0) { back_color.red = back_color.red - chng; - mode = SET; + State.mode = SET; } } if (selected_color == 3) { if (xtra_color.red - chng >= 0) { xtra_color.red = xtra_color.red - chng; - mode = SET; + State.mode = SET; } } } @@ -1292,19 +1291,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.green + chng <= 255) { main_color.green = main_color.green + chng; - mode = SET; + State.mode = SET; } } if (selected_color == 2) { if (back_color.green + chng <= 255) { back_color.green = back_color.green + chng; - mode = SET; + State.mode = SET; } } if (selected_color == 3) { if (xtra_color.green + chng <= 255) { xtra_color.green = xtra_color.green + chng; - mode = SET; + State.mode = SET; } } } @@ -1313,19 +1312,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.green - chng >= 0) { main_color.green = main_color.green - chng;; - mode = SET; + State.mode = SET; } } if (selected_color == 2) { if (back_color.green - chng >= 0) { back_color.green = back_color.green - chng; - mode = SET; + State.mode = SET; } } if (selected_color == 3) { if (xtra_color.green - chng >= 0) { xtra_color.green = xtra_color.green - chng; - mode = SET; + State.mode = SET; } } } @@ -1334,19 +1333,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.blue + chng <= 255) { main_color.blue = main_color.blue + chng; - mode = SET; + State.mode = SET; } } if (selected_color == 2) { if (back_color.blue + chng <= 255) { back_color.blue = back_color.blue + chng; - mode = SET; + State.mode = SET; } } if (selected_color == 3) { if (xtra_color.blue + chng <= 255) { xtra_color.blue = xtra_color.blue + chng; - mode = SET; + State.mode = SET; } } } @@ -1355,19 +1354,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.blue - chng >= 0) { main_color.blue = main_color.blue - chng; - mode = SET; + State.mode = SET; } } if (selected_color == 2) { if (back_color.blue - chng >= 0) { back_color.blue = back_color.blue - chng; - mode = SET; + State.mode = SET; } } if (selected_color == 3) { if (xtra_color.blue - chng >= 0) { xtra_color.blue = xtra_color.blue - chng; - mode = SET; + State.mode = SET; } } } @@ -1376,19 +1375,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.white + chng <= 255) { main_color.white = main_color.white + chng; - mode = SET; + State.mode = SET; } } if (selected_color == 2) { if (back_color.white + chng <= 255) { back_color.white = back_color.white + chng; - mode = SET; + State.mode = SET; } } if (selected_color == 3) { if (xtra_color.white + chng <= 255) { xtra_color.white = xtra_color.white + chng; - mode = SET; + State.mode = SET; } } } @@ -1397,19 +1396,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.white - chng >= 0) { main_color.white = main_color.white - chng; - mode = SET; + State.mode = SET; } } if (selected_color == 2) { if (back_color.white - chng >= 0) { back_color.white = back_color.white - chng; - mode = SET; + State.mode = SET; } } if (selected_color == 3) { if (xtra_color.white - chng >= 0) { xtra_color.white = xtra_color.white - chng; - mode = SET; + State.mode = SET; } } } @@ -1429,49 +1428,49 @@ void handleRemote() { } // end of if HOLD if (results.value == rmt_commands[MODE_UP]) { //Mode Up last_remote_cmd = results.value; - if ((fx_mode < strip->getModeCount()-1) && (mode == HOLD)) { - fx_mode = fx_mode + 1; + if ((segState.mode[State.segment] < strip->getModeCount()-1) && (State.mode == HOLD)) { + fx_mode = segState.mode[State.segment] + 1; } - mode = SET; + State.mode = SET; } if (results.value == rmt_commands[MODE_DOWN]) { //Mode down last_remote_cmd = results.value; - if ((fx_mode > 0) && (mode == HOLD)) { - fx_mode = fx_mode - 1; + if ((segState.mode[State.segment] > 0) && (State.mode == HOLD)) { + fx_mode = segState.mode[State.segment] - 1; } - mode = SET; + State.mode = SET; } if (results.value == rmt_commands[AUTOMODE]) { // Toggle Automode last_remote_cmd = 0; fx_mode = 56; - mode = SET; + State.mode = SET; } #if defined(CUSTOM_WS2812FX_ANIMATIONS) if (results.value == rmt_commands[CUST_1]) { // Select TV Mode last_remote_cmd = 0; fx_mode = 57; - mode = SET; + State.mode = SET; } #endif if (results.value == rmt_commands[CUST_2]) { // Select Custom Mode 2 last_remote_cmd = 0; fx_mode = 12; - mode = SET; + State.mode = SET; } if (results.value == rmt_commands[CUST_3]) { // Select Custom Mode 3 last_remote_cmd = 0; fx_mode = 48; - mode = SET; + State.mode = SET; } if (results.value == rmt_commands[CUST_4]) { // Select Custom Mode 4 last_remote_cmd = 0; fx_mode = 21; - mode = SET; + State.mode = SET; } if (results.value == rmt_commands[CUST_5]) { // Select Custom Mode 5 last_remote_cmd = 0; fx_mode = 46; - mode = SET; + State.mode = SET; } irrecv.resume(); // Receive the next value } diff --git a/Arduino/McLighting/rest_api.h b/Arduino/McLighting/rest_api.h index fd33fe4..db1352a 100644 --- a/Arduino/McLighting/rest_api.h +++ b/Arduino/McLighting/rest_api.h @@ -84,26 +84,26 @@ server.on("/format_spiffs", []() { server.on("/get_brightness", []() { char str_brightness[4]; - snprintf(str_brightness, sizeof(str_brightness), "%i", (int) (brightness / 2.55)); + snprintf(str_brightness, sizeof(str_brightness), "%i", (int) (State.brightness / 2.55)); str_brightness[sizeof(str_brightness) - 1] = 0x00; server.sendHeader("Access-Control-Allow-Origin", "*"); server.send(200, "text/plain", str_brightness ); - DBG_OUTPUT_PORT.printf("/get_brightness: %i\r\n", (int) (brightness / 2.55)); + DBG_OUTPUT_PORT.printf("/get_brightness: %i\r\n", (int) (State.brightness / 2.55)); }); server.on("/get_speed", []() { - char str_speed[6]; - snprintf(str_speed, sizeof(str_speed), "%i", fx_speed); + char str_speed[4]; + snprintf(str_speed, sizeof(str_speed), "%i", segState.speed[State.segment]); str_speed[sizeof(str_speed) - 1] = 0x00; server.sendHeader("Access-Control-Allow-Origin", "*"); server.send(200, "text/plain", str_speed ); - DBG_OUTPUT_PORT.printf("/get_speed: %i\r\n", fx_speed); + DBG_OUTPUT_PORT.printf("/get_speed: %i\r\n", segState.speed[State.segment]); }); server.on("/get_switch", []() { server.sendHeader("Access-Control-Allow-Origin", "*"); - server.send(200, "text/plain", (mode == OFF) ? "0" : "1" ); - DBG_OUTPUT_PORT.printf("/get_switch: %s\r\n", (mode == OFF) ? "0" : "1"); + server.send(200, "text/plain", (State.mode == OFF) ? "0" : "1" ); + DBG_OUTPUT_PORT.printf("/get_switch: %s\r\n", (State.mode == OFF) ? "0" : "1"); }); server.on("/get_color", []() { @@ -161,20 +161,25 @@ server.on("/config", []() { // ToDo do not save if no change bool _updateStrip = false; bool _updateConfig = false; - if(server.hasArg("seg")){ - uint8_t _ws_seg = server.arg("seg").toInt(); + bool _updateState = false; + if(server.hasArg("ws_seg")){ + uint8_t _ws_seg = server.arg("ws_seg").toInt(); _ws_seg = constrain(_ws_seg, 1, MAX_NUM_SEGMENTS - 1); - if (_ws_seg != num_segments){ - num_segments = _ws_seg; - _updateStrip = true; + if (_ws_seg != Config.segments){ + Config.segments = _ws_seg; + _updateStrip = true; + if (State.segment >= Config.segments) { + State.segment = Config.segments - 1; + _updateState = true; + } } } if(server.hasArg("ws_cnt")){ uint16_t _stripSize = server.arg("ws_cnt").toInt(); if (_stripSize > 0) { _stripSize = constrain(_stripSize, 1, MAXLEDS); - if (_stripSize != FXSettings.stripSize) { - FXSettings.stripSize = _stripSize; + if (_stripSize != Config.stripSize) { + Config.stripSize = _stripSize; _updateStrip = true; } } @@ -192,7 +197,7 @@ server.on("/config", []() { if (checkPin(server.arg("ws_pin").toInt())) { _updateStrip = true; DBG_OUTPUT_PORT.print("Pin was set to: "); - DBG_OUTPUT_PORT.println(FXSettings.pin); + DBG_OUTPUT_PORT.println(Config.pin); } else { DBG_OUTPUT_PORT.println("invalid input or same value!"); } @@ -254,80 +259,87 @@ server.on("/config", []() { #endif if(server.hasArg("trans_effect")){ - FXSettings.transEffect = server.arg("trans_effect").toInt(); + Config.transEffect = server.arg("trans_effect").toInt(); _updateConfig = true; } #if defined(ENABLE_STATE_SAVE) if (_updateStrip || _updateConfig) { + DBG_OUTPUT_PORT.println("Saving config.json!"); if(!save_conf.active()) save_conf.once(3, tickerSaveConfig); } + if (_updateState) { + DBG_OUTPUT_PORT.println("Saving stripstate.json!"); + if(!save_state.active()) save_state.once(3, tickerSaveState); + } #endif _updateStrip = false; _updateConfig = false; + _updateState = false; getConfigJSON(); }); server.on("/off", []() { - if (prevmode != OFF) { - mode = OFF; - getStateJSON(); - #if defined(ENABLE_STATE_SAVE) - if(!save_state.active()) save_state.once(3, tickerSaveState); - #endif - } + if (State.mode == OFF) { State.mode = SET; } else { State.mode = OFF; }; + getStateJSON(); + #if defined(ENABLE_STATE_SAVE) + DBG_OUTPUT_PORT.println("Saving stripstate.json!"); + if(!save_state.active()) save_state.once(3, tickerSaveState); + #endif }); server.on("/on", []() { if (prevmode == OFF) { - mode = SET; + State.mode = SET; getStateJSON(); #if defined(ENABLE_STATE_SAVE) + DBG_OUTPUT_PORT.println("Saving stripstate.json!"); if(!save_state.active()) save_state.once(3, tickerSaveState); #endif + } else { + getStateJSON(); } }); server.on("/set", []() { prevmode = HOLD; - fx_mode = FX_MODE_STATIC; boolean _updateState = false; boolean _updateSegState = false; // Segment if ((server.arg("seg") != "") && (server.arg("seg").toInt() >= 0) && (server.arg("seg").toInt() <= MAX_NUM_SEGMENTS)) { - FXSettings.segment = server.arg("seg").toInt(); - if (prevsegment != FXSettings.segment) { - prevsegment = FXSettings.segment; - getSegmentParams(FXSettings.segment); - memcpy(hex_colors_trans, hex_colors, sizeof(hex_colors_trans)); - mode = SET; + State.segment = server.arg("seg").toInt(); + if (prevsegment != State.segment) { + prevsegment = State.segment; + getSegmentParams(State.segment); + memcpy(hexcolors_trans, segState.colors[State.segment], sizeof(hexcolors_trans)); + State.mode = SET; _updateState = true; } } - if ((server.arg("start") != "") && (server.arg("start").toInt() >= 0) && (server.arg("start").toInt() <= MAX_NUM_SEGMENTS)) { + if ((server.arg("start") != "") && (server.arg("start").toInt() >= 0) && (server.arg("start").toInt() <= segState.stop)) { uint16_t _seg_start = server.arg("start").toInt(); - _seg_start = constrain(seg_start, 0, FXSettings.stripSize -1); - if (_seg_start != seg_start) { - seg_start = _seg_start; + _seg_start = constrain(segState.start, 0, Config.stripSize -1); + if (_seg_start != segState.start) { + segState.start = _seg_start; setSegmentSize(); _updateSegState = true; } } - if ((server.arg("stop") != "") && (server.arg("stop").toInt() >= 0) && (server.arg("stop").toInt() <= MAX_NUM_SEGMENTS)) { + if ((server.arg("stop") != "") && (server.arg("stop").toInt() >= segState.start) && (server.arg("stop").toInt() <= Config.stripSize)) { uint16_t _seg_stop = server.arg("stop").toInt(); - _seg_stop = constrain(_seg_stop, seg_start, FXSettings.stripSize - 1); - if (_seg_stop != seg_stop) { - seg_stop = _seg_stop; + _seg_stop = constrain(_seg_stop, segState.start, Config.stripSize - 1); + if (_seg_stop != segState.stop) { + segState.stop = _seg_stop; setSegmentSize(); _updateSegState = true; } } if(server.hasArg("fxopt")){ - uint8_t _ws_fxopt = ((constrain(server.arg("fxopt").toInt(), 0, 255)>>1)<<1); - if (_ws_fxopt != fx_options) { - fx_options = _ws_fxopt; - strip->setOptions(FXSettings.segment, fx_options); + uint8_t _fx_options = ((constrain(server.arg("fxopt").toInt(), 0, 255)>>1)<<1); + if (_fx_options != segState.options) { + segState.options = _fx_options; + strip->setOptions(State.segment, segState.options); _updateSegState = true; } } @@ -407,28 +419,28 @@ server.on("/set", []() { // Speed - if ((server.arg("s") != "") && (server.arg("s").toInt() >= 0) && (server.arg("s").toInt() <= 65535)) { - fx_speed = constrain(server.arg("s").toInt(), SPEED_MIN, SPEED_MAX); - mode = SET; + if ((server.arg("s") != "") && (server.arg("s").toInt() >= 0) && (server.arg("s").toInt() <= 255)) { + segState.speed[State.segment] = constrain(server.arg("s").toInt(), 0, 255); + State.mode = SET; _updateSegState = true; } //Mode if ((server.arg("m") != "") && (server.arg("m").toInt() >= 0) && (server.arg("m").toInt() <= strip->getModeCount())) { fx_mode = constrain(server.arg("m").toInt(), 0, strip->getModeCount() - 1); - if (fx_mode != strip->getMode(FXSettings.segment)) { - mode = SET; + if (fx_mode != segState.mode[State.segment]) { + State.mode = SET; _updateSegState = true; } } // Brightness if ((server.arg("c") != "") && (server.arg("c").toInt() >= 0) && (server.arg("c").toInt() <= 100)) { - brightness = constrain((int) server.arg("c").toInt() * 2.55, 0, 255); + State.brightness = constrain((int) server.arg("c").toInt() * 2.55, 0, 255); } else if ((server.arg("p") != "") && (server.arg("p").toInt() >= 0) && (server.arg("p").toInt() <= 255)) { - brightness = constrain(server.arg("p").toInt(), 0, 255); + State.brightness = constrain(server.arg("p").toInt(), 0, 255); } - if (strip->getBrightness() != brightness) { - mode = SET; + if (strip->getBrightness() != State.brightness) { + State.mode = SET; _updateState = true; } DBG_OUTPUT_PORT.printf("Get Args: %s\r\n", listStateJSONfull()); diff --git a/Arduino/McLighting/version.h b/Arduino/McLighting/version.h index 75c5dc1..ed730ee 100644 --- a/Arduino/McLighting/version.h +++ b/Arduino/McLighting/version.h @@ -1 +1 @@ -#define SKETCH_VERSION "3.1.0.ALPHA2" +#define SKETCH_VERSION "3.1.0.BETA1" diff --git a/Arduino/McLighting/version_info.ino b/Arduino/McLighting/version_info.ino index cc4eca4..30905f8 100644 --- a/Arduino/McLighting/version_info.ino +++ b/Arduino/McLighting/version_info.ino @@ -195,10 +195,18 @@ * removal of saving to EEPROM * first integration of multi segments * - * * 3 October 2019 + * 3 October 2019 * Version Bump to 3.1.0.ALPHA2 * further code changes * further integration of multi segments * integration of multi segments to GUI * + * 5 October 2019 + * Version Bump to 3.1.0.ALPHA2 + * further code changes + * further integration of multi segments + * known problem: as always: AUTOPLAY (as it is not multi segment capable yet) + * + * Version Bump to 3.1.0.BETA1 + * bugfixes */ diff --git a/clients/web/edit.htm b/clients/web/edit.htm index c8e8727..728b705 100644 --- a/clients/web/edit.htm +++ b/clients/web/edit.htm @@ -182,7 +182,9 @@ var mkfile = document.createElement("button"); mkfile.innerHTML = 'MkFile'; document.getElementById(element).appendChild(mkfile); - + var para = document.createElement("text"); + para.innerHTML = " Press Ctrl-S for save, Ctrl-Z for undo, Ctrl-Shift-Z for redo"; + document.getElementById(element).appendChild(para); function httpPostProcessRequest(){ if (xmlHttp.readyState == 4){ if(xmlHttp.status != 200) alert("ERROR["+xmlHttp.status+"]: "+xmlHttp.responseText); diff --git a/clients/web/edit.htm.gz b/clients/web/edit.htm.gz index 9466db2415e67a661531a9e7f152554c10cffe2c..03cc7007caa1f26277ec996e2fdc86aea5d9c7b8 100644 GIT binary patch literal 5563 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 JpMMQv002^C#<>6h literal 5489 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
-
+
+
+
+

selectSeg

+ +
+
+
-

selectCount

- +

selectSegCnt

+
-

selectRGBO

+

selectCount

+ +
+

selectRGBO

-

selectPin

- +

selectPin

+ +
+
+
+

segStart

+ +
+

segStop

+
@@ -1030,6 +1048,7 @@ var language = { connectError2: " times. Please use the RECONNECT button to try again.", loadModes: "Loading modes ...", // This language-string is not translated (settings not loaded yet) loadSettings: "Loading settings ...", // This language-string is not translated (settings not loaded yet) + loadConfig: "Loading configuration ...", loadWebsock: "Connecting websockets ...", loadReady: "Ready ...", loadError: "Error loading animation modes, please try again...", // This language-string is not translated (settings not loaded yet) @@ -1043,6 +1062,9 @@ var language = { white: "White", not_greater: "cannot enter numbers greater than 255", not_less: "cannot enter numbers less than 0", + selectSeg: "Select segment", + segStart: "First LED of selected segment", + segStop: "Last LED of selected segment", wsMessage: "Websocket Message:", selectLanguage: "Select Language:", selectHostname: "Hostname:", @@ -1050,6 +1072,7 @@ var language = { selectMQTTPort: "and Port:", selectMQTTUser: "MQTT Username:", selectMQTTPass: "MQTT Password:", + selectSegCnt: "Number of Segments:", selectCount: "Strip LED Count:", selectRGBO: "RGB Order:", selectPin: "Strip GPIO Pin:", @@ -1086,6 +1109,7 @@ var language = { connectError2: " keer geprobeerd. Gebruik de Verbind opnieuw knop om opnieuw te proberen.", loadModes: "Modes laden...", // This language-string is not translated (settings not loaded yet) loadSettings: "Instellingen laden...", // This language-string is not translated (settings not loaded yet) + loadConfig: "Configuratie laden ...", loadWebsock: "Websockets verbinden...", loadReady: "Klaar...", loadError: "Fout bij laden van animatie modes, probeer opnieuw...", // This language-string is not translated (settings not loaded yet) @@ -1099,6 +1123,9 @@ var language = { white: "Wit", not_greater: "Geen nummers hoger dan 255", not_less: "Geen nummers lager dan 0", + selectSeg: "Selecteer segment", + segStart: "Eerste LED van huidige segmenten", + segStop: "Laatste LED van huidige segmenten", wsMessage: "Websocket message:", selectLanguage: "Selecteer Taal:", selectHostname: "Hostname:", @@ -1106,6 +1133,7 @@ var language = { selectMQTTPort: "en Port:", selectMQTTUser: "MQTT gebruikersnaam:", selectMQTTPass: "MQTT wachtwoord:", + selectSegCnt: "Number of Segments:", selectCount: "LED nummer:", selectPin: "Strip GPIO Pin:", selectRGBO: "RGB Order:", @@ -1142,6 +1170,7 @@ var language = { connectError2: " mal versucht. Benutze WIEDER VERBINDEN, um es nochmal zu probieren.", loadModes: "Lade Modi ...", // This language-string is not translated (settings not loaded yet) loadSettings: "Lade Einstellungen ...", // This language-string is not translated (settings not loaded yet) + loadConfig: "Lade Konfiguration ...", loadWebsock: "Verbinde Websockets ...", loadReady: "Fertig ...", loadError: "Fehler beim Laden der Animations-Modi, bitte nochmal versuchen...", // This language-string is not translated (settings not loaded yet) @@ -1155,6 +1184,9 @@ var language = { white: "Weiß", not_greater: "Akzeptiere keine Nummern größer 255", not_less: "Akzeptiere keine Nummern kleiner 0", + selectSeg: "Segment wählen", + segStart: "Erste LED des gewählten Segments", + segStop: "Letzte LED des gewählten Segments", wsMessage: "Websocket Message:", selectLanguage: "Sprache auswählen:", selectHostname: "Hostname:", @@ -1162,6 +1194,7 @@ var language = { selectMQTTPort: "und Port:", selectMQTTUser: "MQTT Username:", selectMQTTPass: "MQTT Password:", + selectSegCnt: "Anzahl Segmente:", selectCount: "Strip LED Anzahl:", selectRGBO: "RGB Reihenfolge:", selectPin: "Strip GPIO Pin:", @@ -1281,19 +1314,31 @@ var config = { mqtt_port: 0, mqtt_user: "", mqtt_pass: "", + ws_seg: 1, ws_cnt: 0, ws_rgbo: "", ws_pin: 0, - ws_fxopt: 0, - enable_rgbw: false, - transitionEffects: true + ws_trans: false, + enable_rgbw: false }; -var data = { +var state = { mode: 0, + segment: 0, + brightness: 0 +} + +var segstate = { + start: 0, + stop: 0, + mode: null, + speed: 0, color: {w:0, r:0, g:0, b:0, hex:"00000000", w2:0, r2:0, g2:0, b2:0, hex2:"00000000", w3:0, r3:0, g3:0, b3:0, hex3:"00000000"}, - brightness: 192, - speed: 192, - ws2812fx_mode: null, + ws_fxopt: 0 +} + + +var data = { + init: true, color_num: 1, modes: [], connection: null, @@ -1301,7 +1346,6 @@ var data = { num_additional_connections: 0, is_connected: false, refresh_interval: 0, - init: true, color_disabled: false }; var sendIt; // Timer to prevent lots of sending @@ -1331,17 +1375,17 @@ function displayColors(all = false) { clearTimeout(sendIt); sendIt = setTimeout(function() { set_color(); }, 50); } else { - document.getElementById("colorSel1").style.backgroundColor = `rgb(${data.color.r}, ${data.color.g}, ${data.color.b})`; - document.getElementById("colorHex1").innerHTML = "#" + data.color.hex; - document.getElementById("colorSel2").style.backgroundColor = `rgb(${data.color.r2}, ${data.color.g2}, ${data.color.b2})`; - document.getElementById("colorHex2").innerHTML = "#" + data.color.hex2; - document.getElementById("colorSel3").style.backgroundColor = `rgb(${data.color.r3}, ${data.color.g3}, ${data.color.b3})`; - document.getElementById("colorHex3").innerHTML = "#" + data.color.hex3; + document.getElementById("colorSel1").style.backgroundColor = `rgb(${segstate.color.r}, ${segstate.color.g}, ${segstate.color.b})`; + document.getElementById("colorHex1").innerHTML = "#" + segstate.color.hex; + document.getElementById("colorSel2").style.backgroundColor = `rgb(${segstate.color.r2}, ${segstate.color.g2}, ${segstate.color.b2})`; + document.getElementById("colorHex2").innerHTML = "#" + segstate.color.hex2; + document.getElementById("colorSel3").style.backgroundColor = `rgb(${segstate.color.r3}, ${segstate.color.g3}, ${segstate.color.b3})`; + document.getElementById("colorHex3").innerHTML = "#" + segstate.color.hex3; } } // initial color val numbers when DOM is loaded -function colorNumrVals(){ +function colorNumVals(){ redNumVal.value = red.value; greenNumVal.value = green.value; blueNumVal.value = blue.value; @@ -1377,44 +1421,44 @@ function initSliderColors(){ function changeRangeNumVal(){ redNumVal.addEventListener('change', ()=>{ // make sure numbers are entered between 0 to 255 - red.value = checkNumVal(redNumVal, red.value); - if (data.color_num === 1) data.color.r = red.value; - if (data.color_num === 2) data.color.r2 = red.value; - if (data.color_num === 3) data.color.r3 = red.value; + red.value = checkNumVal8(redNumVal, red.value); + if (data.color_num === 1) segstate.color.r = red.value; + if (data.color_num === 2) segstate.color.r2 = red.value; + if (data.color_num === 3) segstate.color.r3 = red.value; initSliderColors(); displayColors(); }); greenNumVal.addEventListener('change', ()=>{ // make sure numbers are entered between 0 to 255 - green.value = checkNumVal(greenNumVal, green.value); - if (data.color_num === 1) data.color.g = green.value; - if (data.color_num === 2) data.color.g2 = green.value; - if (data.color_num === 3) data.color.g3 = green.value; + green.value = checkNumVal8(greenNumVal, green.value); + if (data.color_num === 1) segstate.color.g = green.value; + if (data.color_num === 2) segstate.color.g2 = green.value; + if (data.color_num === 3) segstate.color.g3 = green.value; initSliderColors(); displayColors(); }); blueNumVal.addEventListener('change', ()=>{ // make sure numbers are entered between 0 to 255 - blue.value = checkNumVal(blueNumVal, blue.value); - if (data.color_num === 1) data.color.b = blue.value; - if (data.color_num === 2) data.color.b2 = blue.value; - if (data.color_num === 3) data.color.b3 = blue.value; + blue.value = checkNumVal8(blueNumVal, blue.value); + if (data.color_num === 1) segstate.color.b = blue.value; + if (data.color_num === 2) segstate.color.b2 = blue.value; + if (data.color_num === 3) segstate.color.b3 = blue.value; initSliderColors(); displayColors(); }); whiteNumVal.addEventListener('change', ()=>{ // make sure numbers are entered between 0 to 255 - white.value = checkNumVal(whiteNumVal, white.value); - if (data.color_num === 1) data.color.w = white.value; - if (data.color_num === 2) data.color.w2 = white.value; - if (data.color_num === 3) data.color.w3 = white.value; + white.value = checkNumVal8(whiteNumVal, white.value); + if (data.color_num === 1) segstate.color.w = white.value; + if (data.color_num === 2) segstate.color.w2 = white.value; + if (data.color_num === 3) segstate.color.w3 = white.value; initSliderColors(); displayColors(); }); brightNumVal.addEventListener('change', ()=>{ // make sure numbers are entered between 0 to 255 - bright.value = checkNumVal(brightNumVal, bright.value); - data.brightness = bright.value; + bright.value = checkNumVal8(brightNumVal, bright.value); + state.brightness = bright.value; initSliderColors(); // Send Brightness clearTimeout(sendIt); @@ -1422,14 +1466,14 @@ function changeRangeNumVal(){ }); speedNumVal.addEventListener('change', ()=>{ // make sure numbers are entered between 0 to 255 - speed.value = checkNumVal(speedNumVal, speed.value); - data.speed = speed.value; + speed.value = checkNumVal8(speedNumVal, speed.value); + segstate.speed = speed.value; // Send Speed clearTimeout(sendIt); sendIt = setTimeout(function() { set_speed(); }, 50); }); } -function checkNumVal(numVal, curVal) { +function checkNumVal8(numVal, curVal) { if(numVal.value > 255) { alert(language[settings.lang]["not_greater"]); numVal.value = curVal; @@ -1440,6 +1484,17 @@ function checkNumVal(numVal, curVal) { return numVal.value; } +function checkNumVal16(numVal, curVal) { + if(numVal.value > 65535) { + alert(language[settings.lang]["not_greater"]); + numVal.value = curVal; + } else if(numVal.value < 0) { + alert(language[settings.lang]["not_less"]); + numVal.value = curVal; + } + return numVal.value; +} + // Color Sliders controls function initcolorSliders(){ var event = new Event('change'); @@ -1447,7 +1502,7 @@ function initcolorSliders(){ displayColors(); initSliderColors(); changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); // Trigger onChange event to send value redNumVal.dispatchEvent(event); }); @@ -1456,7 +1511,7 @@ function initcolorSliders(){ displayColors(); initSliderColors(); changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); // Trigger onChange event to send value greenNumVal.dispatchEvent(event); }); @@ -1465,7 +1520,7 @@ function initcolorSliders(){ displayColors(); initSliderColors(); changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); // Trigger onChange event to send value blueNumVal.dispatchEvent(event); }); @@ -1474,7 +1529,7 @@ function initcolorSliders(){ displayColors(); initSliderColors(); changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); // Trigger onChange event to send value whiteNumVal.dispatchEvent(event); }); @@ -1482,14 +1537,14 @@ function initcolorSliders(){ bright.addEventListener('input', () => { initSliderColors(); changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); // Trigger onChange event to send value brightNumVal.dispatchEvent(event); }); speed.addEventListener('input', () => { changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); // Trigger onChange event to send value speedNumVal.dispatchEvent(event); }); @@ -1518,8 +1573,11 @@ function xhttp(url, post, callback) { xhr.send(post); } function getModes() { + document.getElementById("percentage").innerHTML = "0%"; + document.getElementById("percentage-done").setAttribute("stroke-dasharray", "0,100"); + document.getElementById("modal-content").innerHTML = language.en.loadModes; xhttp("http://" + host + "/get_modes", false, function(e) { - //console.log("Getting modes list via REST:", e); + console.log("Getting modes list via REST:", e); if (e && e.substring(0,6) !== "ERROR!") { modes = JSON.parse(e); if (typeof modes[0] !== "undefined") { @@ -1538,6 +1596,9 @@ function getModes() { } function getConfig() { + document.getElementById("percentage").innerHTML = "75%"; + document.getElementById("percentage-done").setAttribute("stroke-dasharray", "75,100"); + document.getElementById("modal-content").innerHTML = language.en.loadConfig; xhttp("http://" + host + "/config", false, function(e) { console.log("Getting config via REST:", e); if (e && e.substring(0,6) !== "ERROR!") { @@ -1548,14 +1609,14 @@ function getConfig() { if (typeof res.mqtt_port !== "undefined") config.mqtt_port = res.mqtt_port; if (typeof res.mqtt_user !== "undefined") config.mqtt_user = res.mqtt_user; if (typeof res.mqtt_pass !== "undefined") config.mqtt_pass = res.mqtt_pass; + if (typeof res.ws_seg !== "undefined") config.ws_seg = res.ws_seg; if (typeof res.ws_cnt !== "undefined") config.ws_cnt = res.ws_cnt; if (typeof res.ws_rgbo !== "undefined") { config.ws_rgbo = res.ws_rgbo; config.enable_rgbw = config.ws_rgbo.includes("W"); } if (typeof res.ws_pin !== "undefined") config.ws_pin = res.ws_pin; - if (typeof res.ws_fxopt !== "undefined") config.ws_fxopt = res.ws_fxopt; - if (typeof res.transEffect !== "undefined") config.transitionEffects = res.transEffect; + if (typeof res.ws_trans !== "undefined") config.ws_trans = res.ws_trans; } } else { console.error(e); @@ -1567,9 +1628,9 @@ function getConfig() { } else { document.getElementById("white").parentNode.className = "hidden"; white.value = 0; - data.color.w = 0; - data.color.w2 = 0; - data.color.w3 = 0; + segstate.color.w = 0; + segstate.color.w2 = 0; + segstate.color.w3 = 0; } }); } @@ -1600,11 +1661,11 @@ function showModes(mode, index) { document.getElementById("modes").appendChild(div); } function readSettings() { - document.getElementById("percentage").innerHTML = "33%"; - document.getElementById("percentage-done").setAttribute("stroke-dasharray", "33,100"); + document.getElementById("percentage").innerHTML = "25%"; + document.getElementById("percentage-done").setAttribute("stroke-dasharray", "25,100"); document.getElementById("modal-content").innerHTML = language.en.loadSettings; xhttp("http://" + host + "/uistate.json", false, function(e) { - //console.log("readSettings()", e); + console.log("Read Settings: ", e); tmpsettings = (e && e.substring(0,6) !== "ERROR!") ? JSON.parse(e) : {}; // Replace default settings with saved ones for (var set in settings) { @@ -1612,8 +1673,12 @@ function readSettings() { if (typeof(tmpsettings[set]) !== "undefined") settings[set] = tmpsettings[set]; } applySettings(); - if (e && e.substring(0,6) !== "ERROR!") connectAdditionalNodes(); - else console.warn("ERROR loading settings", e); + if (e && e.substring(0,6) !== "ERROR!") { + connectAdditionalNodes(); + } else { + console.warn("ERROR loading settings", e); + saveSettings(); + } }); } function applySettings() { @@ -1678,13 +1743,13 @@ function onSelectColNum(colnum) { x = document.getElementById("colorSel" + colnum); x.className = x.className.replace(/\belevation-3\b/g, "elevation-9"); // Set ColorPicker and Sliders to selected color - red.value = data.color["r" + (colnum > 1 ? colnum : "")]; - green.value = data.color["g" + (colnum > 1 ? colnum : "")]; - blue.value = data.color["b" + (colnum > 1 ? colnum : "")]; - white.value = data.color["w" + (colnum > 1 ? colnum : "")]; + red.value = segstate.color["r" + (colnum > 1 ? colnum : "")]; + green.value = segstate.color["g" + (colnum > 1 ? colnum : "")]; + blue.value = segstate.color["b" + (colnum > 1 ? colnum : "")]; + white.value = segstate.color["w" + (colnum > 1 ? colnum : "")]; initSliderColors(); changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); } function initSettings() { // Add languages to language select @@ -1736,11 +1801,33 @@ function initSettings() { config.mqtt_pass = mqtt_pass.value; ws_send("Cmw" + config.mqtt_pass); }); - var count = document.getElementById("selectcount"); - count.value = config.ws_cnt; - count.addEventListener('change', ()=>{ - config.ws_cnt = count.value; - ws_send("Csc" + config.ws_cnt); + var selsegment = document.getElementById("selectseg"); + for(var i = 0; i < config.ws_seg; i++) { + var option = document.createElement("OPTION"); + option.setAttribute("value", i); + option.innerHTML = i; + selsegment.appendChild(option); + } + selsegment.value = state.segment; + selsegment.addEventListener('change', ()=>{ + state.segment = selsegment.value; + ws_send("Ss" + state.segment); + }); + var num_segments = document.getElementById("selectsegcnt"); + num_segments.value = config.ws_seg; + num_segments.addEventListener('change', ()=>{ + config.ws_seg = num_segments.value; + ws_send("Css" + config.ws_seg); + while (selsegment.firstChild) { + selsegment.removeChild(selsegment.firstChild); + } + for(var i = 0; i < config.ws_seg; i++) { + var option = document.createElement("OPTION"); + option.setAttribute("value", i); + option.innerHTML = i; + selsegment.appendChild(option); + } + selsegment.value = state.segment; }); var pin = document.getElementById("selectpin"); pin.value = config.ws_pin; @@ -1760,6 +1847,28 @@ function initSettings() { config.ws_rgbo = rgbo.value; ws_send("Csr" + config.ws_rgbo); }); + var start = document.getElementById("segstart"); + start.setAttribute("max",config.ws_cnt-1); + start.value = segstate.start; + start.addEventListener('change', ()=>{ + segstate.start = start.value; + ws_send("S[" + segstate.start); + }); + var stop = document.getElementById("segstop"); + stop.setAttribute("max",config.ws_cnt-1); + stop.value = segstate.stop; + stop.addEventListener('change', ()=>{ + segstate.stop = stop.value; + ws_send("S]" + segstate.stop); + }); + var count = document.getElementById("selectcount"); + count.value = config.ws_cnt; + count.addEventListener('change', ()=>{ + config.ws_cnt = count.value; + ws_send("Csc" + config.ws_cnt); + start.setAttribute("max",config.ws_cnt-1); + stop.setAttribute("max",config.ws_cnt-1); + }); var optrev = document.getElementById("selectoptrev"); for (var code in selectoptrev) { var option = document.createElement("OPTION"); @@ -1767,10 +1876,10 @@ function initSettings() { option.innerHTML = selectoptrev[code]; optrev.appendChild(option); } - optrev.value = (config.ws_fxopt & 128); + optrev.value = (segstate.ws_fxopt & 128); optrev.addEventListener('change', ()=>{ - config.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; - ws_send("Cso" + config.ws_fxopt); + segstate.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; + ws_send("So" + segstate.ws_fxopt); }); var optfade = document.getElementById("selectoptfade"); for (var code in selectoptfade) { @@ -1779,10 +1888,10 @@ function initSettings() { option.innerHTML = selectoptfade[code]; optfade.appendChild(option); } - optfade.value = (config.ws_fxopt & 112); + optfade.value = (segstate.ws_fxopt & 112); optfade.addEventListener('change', ()=>{ - config.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; - ws_send("Cso" + config.ws_fxopt); + segstate.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; + ws_send("So" + segstate.ws_fxopt); }); var optgamma = document.getElementById("selectoptgamma"); for (var code in selectoptgamma) { @@ -1791,10 +1900,10 @@ function initSettings() { option.innerHTML = selectoptgamma[code]; optgamma.appendChild(option); } - optgamma.value = (config.ws_fxopt & 8); + optgamma.value = (segstate.ws_fxopt & 8); optgamma.addEventListener('change', ()=>{ - config.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; - ws_send("Cso" + config.ws_fxopt); + segstate.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; + ws_send("So" + segstate.ws_fxopt); }); var optsize = document.getElementById("selectoptsize"); for (var code in selectoptsize) { @@ -1803,10 +1912,10 @@ function initSettings() { option.innerHTML = selectoptsize[code]; optsize.appendChild(option); } - optsize.value = (config.ws_fxopt & 6) + optsize.value = (segstate.ws_fxopt & 6) optsize.addEventListener('change', ()=>{ - config.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; - ws_send("Cso" + config.ws_fxopt); + segstate.ws_fxopt = optrev.value | optfade.value | optgamma.value | optsize.value; + ws_send("So" + segstate.ws_fxopt); }); slavenodes.value = settings.slave_nodes; lang.addEventListener('change', ()=>{ @@ -1855,6 +1964,7 @@ function initSettings() { settings.theme_back = colback.value; document.getElementById("container").style.backgroundColor = settings.theme_back; document.getElementById("language").style.backgroundColor = settings.theme_back; + document.getElementById("selectseg").style.backgroundColor = settings.theme_back; document.getElementById("selectrgbo").style.backgroundColor = settings.theme_back; document.getElementById("selectoptrev").style.backgroundColor = settings.theme_back; document.getElementById("selectoptfade").style.backgroundColor = settings.theme_back; @@ -1867,6 +1977,7 @@ function initSettings() { for (var i = 0; i < icons.length; i++) { icons[i].style.color = (yiq >= 125) ? '#222' : '#EEE'; } + document.getElementById("selectSegLbl").style.color = (yiq >= 125) ? '#111' : '#EEE'; document.getElementById("wsmessageLbl").style.color = (yiq >= 125) ? '#111' : '#EEE'; document.getElementById("redNum").style.color = (yiq >= 125) ? '#111' : '#EEE'; document.getElementById("greenNum").style.color = (yiq >= 125) ? '#111' : '#EEE'; @@ -2018,8 +2129,8 @@ function ws_reconnect() { function ws_connect() { data.connection = new ReconnectingWebSocket(ws_url, "arduino", ws_options); - document.getElementById("percentage").innerHTML = "67%"; - document.getElementById("percentage-done").setAttribute("stroke-dasharray", "67,100"); + document.getElementById("percentage").innerHTML = "75%"; + document.getElementById("percentage-done").setAttribute("stroke-dasharray", "75,100"); document.getElementById("modal-content").innerHTML = language[settings.lang].loadWebsock; // When the connection is open, send some data to the server @@ -2031,12 +2142,12 @@ function ws_connect() { con.className = "hidden"; con = document.getElementById("connected"); con.className = con.className = ""; - document.getElementById("percentage").innerHTML = "100%"; - document.getElementById("percentage-done").setAttribute("stroke-dasharray", "100,100"); - document.getElementById("modal-content").innerHTML = language[settings.lang].loadReady; //setTimeout(function() { ws_send("$"); }, 2000); //setTimeout(function() { ws_send("C"); }, 3000); //setTimeout(function() { ws_send("~"); }, 4000); + document.getElementById("percentage").innerHTML = "100%"; + document.getElementById("percentage-done").setAttribute("stroke-dasharray", "100,100"); + document.getElementById("modal-content").innerHTML = language[settings.lang].loadReady; }; // When the connection is open, send some data to the server @@ -2069,53 +2180,56 @@ function ws_connect() { // document.getElementById('modal').style.display = "none"; // console.log("res", res); if (res) { - // Status starts here - if (typeof res.mode !== "undefined") data.mode = res.mode; - if (typeof res.ws2812fx_mode !== "undefined") data.ws2812fx_mode = res.ws2812fx_mode; - if (typeof res.speed !== "undefined") { - data.speed = res.speed; - // init SliderVals - speed.value = res.speed; - } + if (typeof res.segment !== "undefined") { state.segment= res.segment; document.getElementById("selectseg").value = state.segment; } + if (typeof res.mode !== "undefined") { state.mode = res.mode; } if (typeof res.brightness !== "undefined") { - data.brightness = res.brightness; + state.brightness = res.brightness; // init ColorSliderVals bright.value = res.brightness; } + // Segment Status starts here + if (typeof res.start !== "undefined") { segstate.start= res.start; document.getElementById("segstart").value = segstate.start; } + if (typeof res.stop !== "undefined") { segstate.stop = res.stop; document.getElementById("segstop").value = segstate.stop; } + if (typeof res.fx_mode !== "undefined") { segstate.mode = res.fx_mode; } + if (typeof res.speed !== "undefined") { + segstate.speed = res.speed; + // init SliderVals + speed.value = res.speed; + } if (typeof res.color !== "undefined") { - data.color.w = res.color[0]; - data.color.r = res.color[1]; - data.color.g = res.color[2]; - data.color.b = res.color[3]; - data.color.hex = rgbToHex([res.color[0], res.color[1], res.color[2], res.color[3]]); - data.color.w2 = res.color[4]; - data.color.r2 = res.color[5]; - data.color.g2 = res.color[6]; - data.color.b2 = res.color[7]; - data.color.hex2 = rgbToHex([res.color[4], res.color[5], res.color[6], res.color[7]]); - data.color.w3 = res.color[8]; - data.color.r3 = res.color[9]; - data.color.g3 = res.color[10]; - data.color.b3 = res.color[11]; - data.color.hex3 = rgbToHex([res.color[8], res.color[9], res.color[10], res.color[11]]); + segstate.color.w = res.color[0]; + segstate.color.r = res.color[1]; + segstate.color.g = res.color[2]; + segstate.color.b = res.color[3]; + segstate.color.hex = rgbToHex([res.color[0], res.color[1], res.color[2], res.color[3]]); + segstate.color.w2 = res.color[4]; + segstate.color.r2 = res.color[5]; + segstate.color.g2 = res.color[6]; + segstate.color.b2 = res.color[7]; + segstate.color.hex2 = rgbToHex([res.color[4], res.color[5], res.color[6], res.color[7]]); + segstate.color.w3 = res.color[8]; + segstate.color.r3 = res.color[9]; + segstate.color.g3 = res.color[10]; + segstate.color.b3 = res.color[11]; + segstate.color.hex3 = rgbToHex([res.color[8], res.color[9], res.color[10], res.color[11]]); // init ColorSliderVals if (data.color_num === 1) { - red.value = data.color.r; - green.value = data.color.g; - blue.value = data.color.b; - white.value = data.color.w; + red.value = segstate.color.r; + green.value = segstate.color.g; + blue.value = segstate.color.b; + white.value = segstate.color.w; } if (data.color_num === 2) { - red.value = data.color.r2; - green.value = data.color.g2; - blue.value = data.color.b2; - white.value = data.color.w2; + red.value = segstate.color.r2; + green.value = segstate.color.g2; + blue.value = segstate.color.b2; + white.value = segstate.color.w2; } if (data.color_num === 3) { - red.value = data.color.r3; - green.value = data.color.g3; - blue.value = data.color.b3; - white.value = data.color.w3; + red.value = segstate.color.r3; + green.value = segstate.color.g3; + blue.value = segstate.color.b3; + white.value = segstate.color.w3; } } // Config starts here @@ -2124,6 +2238,7 @@ function ws_connect() { if (typeof res.mqtt_port !== "undefined") { config.mqtt_port = res.mqtt_port; document.getElementById("mqtt_port").value = config.mqtt_port; } if (typeof res.mqtt_user !== "undefined") { config.mqtt_user = res.mqtt_user; document.getElementById("mqtt_user").value = config.mqtt_user; } if (typeof res.mqtt_pass !== "undefined") { config.mqtt_pass = res.mqtt_pass; document.getElementById("mqtt_pass").value = config.mqtt_pass; } + if (typeof res.ws_seg !== "undefined") { config.ws_seg = res.ws_seg; document.getElementById("selectsegcnt").value = config.ws_seg; } if (typeof res.ws_cnt !== "undefined") { config.ws_cnt = res.ws_cnt; document.getElementById("selectcount").value = config.ws_cnt; } if (typeof res.ws_rgbo !== "undefined") { config.ws_rgbo = res.ws_rgbo; @@ -2134,19 +2249,20 @@ function ws_connect() { } else { document.getElementById("white").parentNode.className = "hidden"; white.value = 0; - data.color.w = 0; - data.color.w2 = 0; - data.color.w3 = 0; + segstate.color.w = 0; + segstate.color.w2 = 0; + segstate.color.w3 = 0; } } if (typeof res.ws_pin !== "undefined") { config.ws_pin = res.ws_pin; document.getElementById("selectpin").value = config.ws_pin; } + if (typeof res.ws_trans !== "undefined") { config.ws_trans = res.ws_trans; document.getElementById("set-transitionEffects").value = config.ws_trans; } if (typeof res.ws_fxopt !== "undefined") { - config.ws_fxopt = res.ws_fxopt; - document.getElementById("selectoptrev").value = (config.ws_fxopt & 128); - document.getElementById("selectoptfade").value = (config.ws_fxopt & 112); - document.getElementById("selectoptgamma").value = (config.ws_fxopt & 8); - document.getElementById("selectoptsize").value = (config.ws_fxopt & 6); + segstate.ws_fxopt = res.ws_fxopt; + document.getElementById("selectoptrev").value = (segstate.ws_fxopt & 128); + document.getElementById("selectoptfade").value = (segstate.ws_fxopt & 112); + document.getElementById("selectoptgamma").value = (segstate.ws_fxopt & 8); + document.getElementById("selectoptsize").value = (segstate.ws_fxopt & 6); } // Modes starts here if (typeof res[0] !== "undefined") { @@ -2157,18 +2273,22 @@ function ws_connect() { }); } // init Color Vals - colorNumrVals(); + colorNumVals(); initSliderColors(); // init Change Range Val changeRangeNumVal(); // init Colors controls // init display Colors displayColors(true); + console.log("displayColors finished!"); select_active_button(); + console.log("select_active_button finished!"); } - if (data.init === true) { + console.log("data.init: ", data.init); + if (data.init == true) { + console.log("Initializing..."); // Set selected mode button - //document.getElementById(data.ws2812fx_mode).style.backgroundColor = settings.theme_btnsel; + //document.getElementById(segstate.mode).style.backgroundColor = settings.theme_btnsel; // Close Loading Modal setTimeout(() => { document.getElementById('modal').style.display = "none"; @@ -2212,38 +2332,45 @@ function select_active_button() { for (i = 0; i < btns.length; i++) { btns[i].style.backgroundColor = settings.theme_btn; } - if (data.mode != 1 || (data.mode === 1 && data.ws2812fx_mode !== 57)) { // CUSTOM WS MODE + if (state.mode != 1 || (state.mode == 1 && segstate.mode != 57)) { // CUSTOM WS MODE wsmess = document.getElementById("message"); var arr = wsmess.className.split(" "); if (arr.indexOf("hidden") === -1) { wsmess.className += " hidden"; } + segments = document.getElementById("segments"); + segments.className = segments.className.replace(/\b hidden\b/g, ""); } - if (data.mode >= 1) { - document.getElementById(data.ws2812fx_mode).style.backgroundColor = settings.theme_btnsel; - if (data.ws2812fx_mode === 56) { // AUTOPLAY + if (state.mode >= 1) { + document.getElementById(segstate.mode).style.backgroundColor = settings.theme_btnsel; + if (segstate.mode == 56) { // AUTOPLAY disable_modebuttons(false); disable_color_selection(true); disable_bright_selection(false); disable_speed_selection(true); - } else if (data.ws2812fx_mode === 57) { //CUSTOM_WS + } else if (segstate.mode == 57) { //CUSTOM_WS wsmess = document.getElementById("message"); wsmess.className = wsmess.className.replace(/\b hidden\b/g, ""); + sements = document.getElementById("segments"); + var arr = segments.className.split(" "); + if (arr.indexOf("hidden") === -1) { + segments.className += " hidden"; + } disable_modebuttons(false); disable_color_selection(true); disable_bright_selection(false); disable_speed_selection(true); - } else if (data.ws2812fx_mode === 58) { //TV + } else if (segstate.mode == 58) { //TV disable_modebuttons(false); disable_color_selection(true); disable_bright_selection(false); disable_speed_selection(false); - } else if (data.ws2812fx_mode === 59) { //E1.31 + } else if (segstate.mode == 59) { //E1.31 disable_modebuttons(false); disable_color_selection(true); disable_bright_selection(false); disable_speed_selection(true); - } else if (data.ws2812fx_mode === 60) { //Fire2012 + } else if (segstate.mode == 60) { //Fire2012 disable_modebuttons(false); disable_color_selection(true); disable_bright_selection(false); @@ -2254,7 +2381,7 @@ function select_active_button() { disable_bright_selection(false); disable_speed_selection(false); } - } else if (data.mode === 0) { + } else if (state.mode == 0) { document.getElementById("off").style.backgroundColor = settings.theme_btnsel; disable_modebuttons(false); disable_color_selection(true); @@ -2282,32 +2409,32 @@ function disable_modebuttons(status) { function set_mode(mode_id) { if (Number.isInteger(mode_id)) { - data.mode = 1; - data.ws2812fx_mode = mode_id; + state.mode = 1; + segstate.mode = mode_id; } else { // For named modes if (mode_id == "off") { - data.mode = 0; + state.mode = 0; } } select_active_button(); ws_send("/" + mode_id); } function set_speed() { - ws_send("?" + data.speed); + ws_send("?" + segstate.speed); } function set_brightness() { - ws_send("%" + data.brightness); + ws_send("%" + state.brightness); } function set_color() { if (data.color_num === 1) { - ws_send("#" + rgbToHex([data.color.w, data.color.r, data.color.g, data.color.b])); + ws_send("#" + rgbToHex([segstate.color.w, segstate.color.r, segstate.color.g, segstate.color.b])); } if (data.color_num === 2) { - ws_send("##" + rgbToHex([data.color.w2, data.color.r2, data.color.g2, data.color.b2])); + ws_send("##" + rgbToHex([segstate.color.w2, segstate.color.r2, segstate.color.g2, segstate.color.b2])); } if (data.color_num === 3) { - ws_send("###" + rgbToHex([data.color.w3, data.color.r3, data.color.g3, data.color.b3])); + ws_send("###" + rgbToHex([segstate.color.w3, segstate.color.r3, segstate.color.g3, segstate.color.b3])); } } @@ -2345,11 +2472,11 @@ function onSelectColor(event) { var color = context.getImageData(pos.x, pos.y, 1, 1).data; var hex_color = rgbToHex(color); var colnum = (data.color_num === 1) ? "" : data.color_num; - data.color["hex" + colnum] = hex_color; - data.color["r" + colnum] = color[0]; - data.color["g" + colnum] = color[1]; - data.color["b" + colnum] = color[2]; - data.color["w" + colnum] = 0; + segstate.color["hex" + colnum] = hex_color; + segstate.color["r" + colnum] = color[0]; + segstate.color["g" + colnum] = color[1]; + segstate.color["b" + colnum] = color[2]; + segstate.color["w" + colnum] = 0; red.value = color[0]; green.value = color[1]; blue.value = color[2]; @@ -2357,7 +2484,7 @@ function onSelectColor(event) { displayColors(); initSliderColors(); changeRangeNumVal(); - colorNumrVals(); + colorNumVals(); } } function redrawColorPicker() { @@ -2525,13 +2652,11 @@ document.addEventListener("DOMContentLoaded", function(event) { getModes(); readSettings(); ws_connect(); - ws_send("$") - document.getElementById("modal-content").innerHTML = language.en.loadModes; + ws_send("$"); //ws_send("C"); getConfig(); canvas.width = 400; canvas.height = 400; - redrawColorPicker(); }); diff --git a/clients/web/index.htm.gz b/clients/web/index.htm.gz index 50d463761194d6ce10e47eed6ed6cdc7ed9971be..e149892ae8cc7456edca8454e32d606141d08320 100644 GIT binary patch literal 20709 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 literal 19755 zcmYJaQ;;q^+lAS-ZQHhO+qP}n=F_%q+qSXWz1!xV_p7OY=44e}Yb9q%D#@J?#zH~0 zA4KVc0a-hknR_uIbRLsk6mzOOjW|k`zK8Ll@ z@5rwASa|M{!GBN!M&LQWf$KX%1jkuPt=kF`@+i(|?{s%)<1HjgmaNF)TNCg2eZQW6 z8V2~A%a>;P-)}t$Y8+t$6Dx)Zst&&KxRYrS3=j>uQ>{POAUS=qg%U(#WC#9eNtXQg02!vt%4{8c|}(DqI)iUlrDB1$O!hD z&pUG(*!|gpPI_plp%MHAoDr|P1f3+oKO$jO&Gmosbb_6}(w$%gB4Q_9fb^QmgR$Od zSEzC#`|9cj1#A@nR^3>1BFI#Bb47wXJ`RWmTcP7M;rC%3<|obUEhAE3x{*UxM_vIe zmS&Q#>zluFVL9)WT1#Viv%IXnB<=IKDZzCn9Ln@+Opll&)_>-?=TL0t`=qnqi(xgx zREdk}Bu(#;I4JuCox}M(MJz0^A`aqivi}%78}1Y)tp6OzDoJ%9kctl@*2>D@Z;q@; zA2RkTlOnkqOY+Y=tu6S2WbKq7zu#)p2LQH)MjuXA&>L6l^7$c{{SZet5y48v2&reQ zP}w1Vy-D5rnP4VzL+Hn22SV_o(>`M)MA^xymUeE~Jo^_uKm*;97aTb~N9Bql;KWU7 zq|T%c_7n&6r&ez?XtQZf*K2x3ExB44XXbT7qSB-Qk{(2M!^E}@VvhDdgFN}MMXddYczMRY zqQ)PlrQocvUKSwTmOnehn*hJPuu046aJTYi&#QR@* zs#tNL?>vdj`uLh(+X?L3baih$a6B6}vOWxPOanWia1+j>i6}?-q%^9%qX2*>qUzB1 zAt^BUTMmBO19G^Ma=)P6IhRXDl4Wm`DW*K*#`(~tZ5SyqInVaE4{+kk(0%bwEr^r=S9TF= zL=C5lNcCyu@7|r?>VV)BM9z+A6qx+-ZpPr8@JSwEa!E{m+aoV}!-<3$)^}Y==`@87 z>~&H*j9Gp}f(JV6ydGY~R1=^I^Y232zQ%kjcJjRRfN>a#zpv;5*JXU1a_Bq&$`e>d zfixALyFeR?jy78u{W^k47SwVRD~d4zs=Cg?vLfM`|8uaxBOW$SUU@_UD!7qv0mOIy z@^99tI?iQ6|t*dX{U4b>sfTJF}pH8E|?75t*hCsGK$Uu<#!G*nw_g~?Qo>-|; zv*I?+qGJl{YTp!LN@6*gdF;8D-#o2hLnfYtO6_)562ioZGLivCg0?XS&#sdvCFY*` zok6_0+^Bpvhl;vg4kO5aIQD*Eslod8YnKBS6%qAQ6d`bE0Tiq|JAj?? z-9A5u3W}XX3ZYXC*KBV#AI3ftIS`Csp@UefTM#tF;Dvy!tGo?Sidsv^^(P(C?C1Tu z*Z5hT9$Bg@>l`qs@<&&kG59aO|u6pan}8^WtbALa13L*3&E2!_?{*SveDXd zN6b&?p1QQqd424RWo+%Yx7Sy$890pQ2W8OXJ&&{&$K5WD86RrL>IrG#!jUgnDWk5` zO$#z-mC)~&u!0QMeF#_9`vthj_~cOPU^NM|6QbPUppdZQRxwfFQrTi-4AzFuq*>aK zjnRyBU75Q<8x?Bp0E+@nl&b;;Ar}xW9lz(Q!NUo^v;6f76fFz0AOW|v0SQWej@FaI zLYIz*hIDW%M_H)#nm&;z1^OfHw9Dh$TZe?5JrjpHDUIPeoY{Kwjy{|L>v95g*0z#K zj&5x~K@~JYWN{Rygqysuq@6Ib4Y)lOWRJ|)#yx6_H_7TYoSkr%IBoJyg(@UZs?6q& z4Kx$qimW<*@``ZG418@FOqp(Evw!7WEx;Ow`AW1Ftnc z9kZrK3os`OzOMCV??zgZ#Xr*hqq}zQqjs0i2c57k`irw_atTiQmIOS;#IgJfiPe2g zsA0;XZ50;!IZer@lv^4yEU*6eT8##IZ*a4%4OA^!>mB^0@$QsmJmoK&TG_X1Jc;sh z*z#*``BysJNy~Pu1v7OeSjSTYn}5v!Z)Y3}zE?LnG;KU=zLJ9Z(aEN|{pSW+M@&e= zEq0D(>ZlIWq&Xin_LDrS)Tob@Wo@4@o0`LWw|^ZPB6|1sceHW8O4h4416yfc#oRp! z&`B3)H3*pbUhsP8m>K&((2rS})q8e2EjQw%5- z6E_`i%YWN7NwXL=g_?B5np#?Lzz0v69Wagmda$+`#tZdpnhC!X_lKkY8q`V zp3TSdQ)o5B8W%D6Y!0L>61O*IYW3~lbZBjGfa@)uJ**d{u=}0bwMQ`LIqctux9oBM zk8J;stpAt&e`NeWvimO^hb!=?fq&StYKd^<*ls<_jd$3&pOeUC_iI_QfIqNv+xb8L zzs?pVI~@P{5&!wE#v`1#_Oth6t^uNZd3NiMU8(ZA0-i2A84Ld}&FTCfZU2}3|FroZ z!T;B?nR^DaK{6-1y+?b-^VVVeF|Vh?{$qY`PN(11vnAthx6l6n{Mwl^aZKYav=NzNx@gln@ zA)y_1+touK@ZJ=Mkh-m*w_u`p?8U04OH2tg68y(uL!j!BZ0nxo~0053g=` zBgG=oUQ2_CNV6LDd^Yi;ViJb#R~nc})PoU;`ZkpNwC0`m*cs`j3lHPJEN9PCpeBf& z3xAE!ZYw~q-&XXd3mC9|+|ikFP0Bss0{v(h#(@*s!#}2Lf`FYuLScggX^=`VNjMv$ zfvjix-P1=>&Q<;-A26r#fHkDe>4=D5a3w?rvBj8fHt&CNDN~I6h$yIwz1PO`IV5j$ zDaLK#BPh+ozvD{)_C)lUg_1Y_Fb|61dBB4F-4;~g z{g5D$$K&F=Zr7;;Se@L-jrxeJjK4~85r`*7xCaQ4VG3&F`#Dv)7rM&b>@ukC*fO{2 z537A;blEgaV1(8PR9%kt$)u}7uoMcpq5J0iebDUA#io~jWnWXj1G7#r)#ncF0}CZi zqO5N^fY#7T^IV-8n}k^aSaG%CMEye`#gi{ojg^Ja~n|9 zC3vdsE8Zo>Lk~n_B~o$Zb$ldAa*bL0+3L?_TO9kKaBc0fb%d-eTjF`l6Lr zXd~EqJWf@fMmGwHE1w+FDdzoaj7>~B!1nfm{HCdnqA0)af?)vL!gs)ClzI*Mxs|L; z?M1*b=JKl)O9Q-BxVEZXNv_Z8U%7P*I$g!JmJqGlX79Vj&4cKT8#f^`+X1_An>MWsepso1 zVGau2)~p{lW15y(ld<8FpP2lXPD`0k>I|1Y3A*C&dHyJ6S4DH__9y zNmmtd{6i^NJH~@op`$s(=M700%I;fiZyrG4fbh{UI|SyJ7VY0_%<+Jr5vPp%M`B~0 zf40eZVlN}Q?cI+P1Jfj>tn0K)ct=1X+%x2E`7uRAN-C=i7xwnPCGTq1v;yh%sUiXj zhphC6ndx+#tly9D<)&)Wc|7&W@Hs5*m?Y@b0hOR`-73GfsHR+)hjiS$+du)ge^1?< zd;pc!*Y>ZxT#+39tRgN!D+v+$jyuq2T9=XHV*7C;jWW^}F zeBxz$b|~1z^XE$GcledFnKNw+9wW5ch8-uHafqo<>cvngl;!L60%*4fV*UxTU4#OuOR}GL`;Bcpf5s(q3a%J;*9V@vRkp%(74szLZjd&{wQ1Dtqn7y zd?y17;b*?pZN%U~^9VN!XVePCSZPBPH34*0#Z%1*_&n4xAW)9Rd;*Hvncc3t6Wk~1 zOxKdJb|==%Ti0}5tHPr*zkFCPtrSe|&vjez*Swtf2}Vep5jqaVsmaD$$QU~@rdFl0 z4zoUyA*7eBNEX+SHkaLCgIsT&kyCyx)R~RN381Q$_@f1lnD-?Te_70fu>oW5{f8XG zQF&fP4(QR1w(v>91T7bu`@X2xbSul5^Mth%9%DSC)DgH655R4D{*d8%KZqOlnp?Vrr9XE|K8Eke=WFbyI(_m{0R2MB#iqI z&w{G0;#rq{$>w%XJ~F`bjA$8-SY)^%{xL{Tm@gFMw=065Yb;_nh5l{CZb^z^=4So9m#PKg`Jp5?V&dG%2o?hyW$Bo|slXG^A80 zM+H@M{qEDAt-je#(ZOBgGy3kXX!T`TyMIJ=-e*vHP*1b42Is9&Z`3synwO{9q^>qP zXQ0{qxq|U1SX=r&-jC!L#tM{@yU%p0Eyil9>HtuNK9PJ=yl$*T*IVZymsY;(^T6WqB4Ic;*Q zZD>73FNU$dH*Jn^`~tL??xxQ{o1sAA;C)=vh7WVy%F)I7hlXGW^-Kf%2b5_+jpa#) zCpjunwU$8nJioM=5aW4LVh;C94^65sZn9jJ)$_Zv%4r7NHJp~{eul6>`2|%8d;^l9 zrY=c1pJ~S!vHMv+WS?>EfDEMi^*>hlEGa^CkvOt?Mu0LdLOXjwW>vo)ezZU=Ob z835pm-NV0a>?>sRBH|}&gZdE&uvL~vw$L^i%9=<7VC762%V4H9r@o%zv9mTsd7kyN zAbauR{;~mu3SZOFx-QT-4M0?RPBJdyVy1AP+mkP8k}fVc)hjTphvxYY9M`G42HxTI zt(_WG1hPi;*)=kw?6PA{NlqsX?71&K5pw|#OI~mwMMqt5+Ux9!yYN2#gyy&vTggqj z>F&Jw2|_hiWmYFPO(+UEiq>e{aG}w0I?{?ZbOs@Y#w-$n8@kWAZfn;&YSq&nS;;Yn z3AwDw2I3rxJQ$Aqlm=am6C)%G1?F|PLhxsL`p2i+-o@5_s`nVVx#7*tY9|&m`kT)x z;@T_}I4>X3gc7Yr4Cq#65X_**Y8d@H4^B5ex^8tNGUCiya8A_p zmE7OpQ1Rv565&#LbF?miuk_?3?&vt^5A=MVamU4J$Qm{tg6D9LI6aSCNN^ZrMOd?Q zk;pLq96P$+h~zx1;&~9A(yq2M*4< z+|FT|^<|}88Do*h959yoc$9ff>f$Gu2F+pj%@lJYh?LJdIs!8PJoNnEKi^N6Mz;F` z2A0}?-z8@TkHe-Jn+hT5*$3}HEyI>|5pCCn{bD;lN~#aZOXW8T)M&jl&!xmz>>Aq( zAn=axmf|*rLJ6ik!v(s$xU0{KPi^JbTgwIZHaZAg1id?HhP@&Sq1Mpaq)lYPKWUZE z!e`FKo>2s^xXwJuO0Ix@fE|n)8=0+!Y6iInSQWtsrd4m@?pF&87u|`S6AnuP&{f*5 zk~y98oOD_QWS2HrlN46X$QUOw^2F@9i76emth0M!J4cX^#Zc1hY`vA zx=&f_Bc0skKfAfZH)LDsKmm(31PaJCkLlf0feY3b#_29+?p_BxOO)@_zM&E~ucs3*m`oH};V6YNSpZv*3EieV@F|;*Oo_DCzDDmVD_=65KWMZ z|D=qTy=$qP7e}FOxg~pY8Mp?6eCvY^(gOkgo}m%3cgRR#ADdI{GDy67Dv2hakWH1d zm`#2X1(LH`o?#&Z86-^E6cP{8FqglkJ;><5IY}9Ndn2Dw_j5+K-Ka%z<74IzNtFQb zwX6C$9>p*C<0h#9Aaws|cGI>^wwtm{dFLGCCby|<<2Y~fjxQeBfCyjS=em>Lm#j!s z;)ic(*_r(-dQPKoSoSozcVVU&FL<+sktL-9LmJFj6vL%b-W4pAS^z-US`^1o#=;_J zVQteC(B5vtJi5E#jWg3K`E;8y7%NSnvnd*8vK8dSs6E3d-&v@uL@AIQJB(np0cSzfyz2~IxpTA=|o7=9~-7Q$&)akuOp2Kf9f zT;$-^8A!lUjMwzuAJj=+TMQB}$2*yh^fHs7eR)qoc%jwjaHZM{B-M{BHFQzhf*`Z5 z&wf51U6UItwVO#ID==_8qJ;+dnc*C;1CA+v1ye8v@e&iM`@Ugh%m3wZByp<)EW_fZ+d4i;TG`px+$Y~b0ug$crI!OmUy zxgeRkrDhrzlH+7h<*&j0sn}gVe$}o3i_1|nf@JOIPxk6iY^%v38T#EE6~_N?S(vw6lTQBpd{qv60gm{ zi-lP;&})i*9K2JP>f#{!)J6;R?nnnvZhB;K!#yv^OWKhAkyDc>giEeQiKc@rj1QSW zg-t63paIV9vzp)7Y?KmLNGfp4Q@|ZvyNZ11Sn3oYE(C`gmDYVop+-jl9VS|Aj#|}) z0^MJ_fCvhgE}^uqgzxw>tmvM5XO@INvfU`t?hjnBvWIT%{UoWHYeH%8Gr z?*NSe$oV_+H!b_8);p@!>&hINj$!;&C9*7PXFTOtCoX*e{R;u2bJq+AKM?!y@URn% zi%3|fgt16%5zL})J}Jiv!f`f~0_pmd$lKxt)t(}2d&wdu6w>EU)dRx7JBO9*8xm%i zH6-&LmP=}sc(Uom7kPe>;W74hY>UXoV)Qir2&RyX!d@JpyGjuFuEfQWNq4ZVYtY8v z(9WGPY4y6#z9-iWB)p>^4G->$$)6)#n!JEy?3k@_u`NC zH=|c@DXS|k|4zF?l_Ye-DmxJGOZ2wQ3P7!THNNQNeD0(Sl?2j;xf5Qv7 za%5O^S+dy?j-(Tb(F{0!3BwDRYDtYCB=HWd3lyu&UK5K+)CoAP8EQKE0 zH6;{Wn^@;AFJOy-@rxm-#+n~_pX8II7LhSAAHT09!29`jYKC(mVSlx5EKbS$*GY!F zpRV%-P?m5+%cAY&bZg_TSmhvhJ(=v&Mby_zTWr(GF2GmXwj6ToiYzu?>L#8{T+ZNT zLnm5U^FT1mY8FsF>#K9ns4;M>+Qmaw0{i9pdKz395WzEismG zCiu_b%nIW(d-&tLV1|EgWQ8%rFCOT+MUC+qo|l*4;^)cn-**etG+^G`Tv6W#PQzJH zQ#T9%$Me099)3ZwLkKG`x(jdELd-+)E-*P%taF26gHuZSoyBiW1 zFFE}^1j2m5Qjk{dW&!$Yl3%5{Px+%w1ZbQj_qR-}f0Fw5Q6W4`9^T1T7W$*&TusLY^b!RMK^C;s%Nq~5 z$FZ7`3Pwc3u@`1`7Us!jnQ{pXL}6y@QfCnj3JL`{JpA?8x;0pM96pqm6%h7;b@{xyjq%kQ3OoZ?FPMupAvKEUl|La^L*q7y3C z>;7HkQD+sfeYC@h_!_bl*2>bF{NGkd(&KODl6a{j(02~Ry(1WjF- z0?XzJ)EzQ(rJSm*yrJ-?cqZWBOG4ds5`ly2wK@Q0_PhQM2>VQfKJ$o#m5zxKLwO^r?6?HjyXi2oXx*w9_<8PeTAjmnZw__-Cj+3!PQT4RINr+gdEZsK!8 z_ko#_(n|xHmfFizvBq1y(tuB6n8zNZJE3qB{Uk-meMx|>o9zqNoG4BR0xkP`9?{&% z;*02P>^EGhFe>Um#U|nN=bO$8kUcBNz&mhqWdFw7l`wIMg39E4C(J-T>2V{scLSnv z%JLYGK`NHqusZ)=!(*oSE9AKI>_XK^`zC$KNZRR(UngC+!29ila`{eW(m;(m+-k0XhShtj<{u6iByH?$FCYS0w|$lrJfD`Z3Sz2 zVxdq}C^e!I@0pq^?*Rqjv(@g$JSXWfK<;Pjk_WZ4;e`cg_A&>%BCC$q%~+F=n0&s% zapf|w6=>}kvXJ)WENa8FQ5}JbqKJ)3n0mdL&b9S|m6dMg&uHDm5)fL>&rjh(e?KM^ zS=QdL+8JxARyr}V+0^+`W!z=S^W>J?>b+v0)2hGbP%-@4M8xU(gB7V=Rwc_BD^%t> zhpq>4JtG`Zu=}h6q5KilP&I$FxM<2WB$q>s)ny1h)I!hgAq$;D8PCp)aHcff6PW?w zb76kTM)^s3D3+-0&rq%op?ag6jg#pUmr8r|YDkk|dX{93V zhf$-SGU+7f5MwoJBbDf3DecOD%QNG7HJmI~MDAa;&$`A**GLoyZB}$&_o7J|i&+~d zb!xNIpP3Cw$H0ev5cC-1fhsW-R2qJ03frkDLcXX#7kKzBSLRl-o6h<4I4G{K2oNH< zoR2uR{Nlh2cFdPOGt)dWUI{5t{rTd;n25Am9#i4&&um9MnV;=)eJ}^Z$^*V?(|v;K zA@18Be?@*=Z7P^)?O zg&wr(thZ{`YnvTmyjpWSMlb6(_e@$w(TKPxku7C@C-}`2F!T|{Ie-bP`gTot ze1Fn_C~im%T1qZLOzmjzLsYL|mdv~2Bg4>Gsa})K?oJW;K&?4W=bVRq`e;#rDHYUI zb3>7Rxl)5l7dpqYR|^Dc_kXhhX%XR+*&w$^VSqK+(M7Wrm5`#LN zqlH@77M8D%KBu`g#!}RWA@$8QV+uj?kV;)!8FUCOo4(z~x}rLgQ<4cLmQXUCgb0uF z9n^gv8UJuRL4OySwyh?O>e$;>0&nKr@55RzVBJdY`h{I{Z~uL2R&4!G3OYOVW%a!n z#c4dlX(1!`VRH5*E;I^B=Y33nHfeA$TOmqw*c|Ts2MM59EkYh|P1d^vd&u(ahH$I` z67kU*#WT%Tu3IHQ|L>Zg$v_Z^0dQ!1Ua>b>$C-M0zKm2vzxH~n>vw>ypif*llYkg@ zHLp~@;8w}`i_g%{Du$QJ zpmXqa74t`kk>0%LuP|&*kYCp{``bdbLA@^LcH8z)(osa4Pc^OA^Jgw{a@8tk+b0R> z9qUeX%xUdMk-AzOWE2KQmA9UWKUuYg_jM>Qhi!4I=L$PVub4fOEXdY2gBlqPGVH6=&_B z*GNIRnpP9eMCqD-wvO%PWh25Gxn30gyjS~LUr!^F3LhH{S@tj7gOnSBSmFHb3jEUr zgyH5@os+b>!oM%c1$J@G}4Gn z51`!IY&x&0(FaNc?OoS7qdJOZ#bOTA={j?>P2$v8!l@#hOtf`XFnxYy!iyUbc2e~z zc?_T#S3c70OST?9b+iKpTBq>E)!%iPzi37Qi*Cark#T74gW`STmuj_V?Cyl!e%gnQ zXB%%>z6LBSaHeAT3RC50U>57uvSsALbp2<=8E?3{)^Q(gJ#lI@GV^r4+jQR)HWVp? z=7|C-TCT^FEVdY6a0l5W=%jy08e|>F)m*+1Hqumh%|9eM%k}(5yoY=~+sscfObqN- zs;PVSbVyR~y}gP3^^J=rKT|}Ca-*Ta9cfC;B;}x~vxiKk9pO)fSaik3U~@;`1rhWM zX$_H^f=qS1>=vh$CS*U-UbJN@ldk)CL^Yp@z#QVDx)UmT5l?(Bqqy16HluJ>PO} z5cW@ZZ#7PIrMyRiCc`uaS?T`>zl*qPDm=afe%{OF2NM<`9P zgFXLo|0{cPbD|$$;>qPsTJpY9-_P!yOdWgGQPl0C1M`=P8N@jc@DQ;)>{JMgx=AcB zE9SxX6S>di+zZaGW zRcAju)kbW9M7S^&Aq4%*ig_|9EBi$n2v|2J`UTvd7nU6ISPwFQKAwjOLh6HW$^%`o zl05d|6G-xkwy4t#7>A&mB)h$C=RJHx*8-1)kkLAakW&P0$kUI6Z9YGbbe%pTZ8oNeV$-tEo*~o9TqWT!$r-v%Ahjn2&uw z_(2FK1s>olU~6vlLD9pTxvx3wIfxd;`$f_aRp58Am8mFwvS84cL1$lFmSaZFmav=Z z$of-HhS~29)a_q)UWUdvebpGU!n9s>W|VlS26*WI(4Q(hN4vFRaxqT z(CTYlR!5YMzzhz^U7&SOcamI`x18k_*_<7ZW|>tzYZuQ{W5Iml%CS%BlRFAcT2hVNf6>fEMcliiqtGtJ_m6~=~z2>j6KMe6JZ%ISYw0g`G2bfVsnf8vX?TVk% z%un;)6fiymq52I0cPPuYkK~D(?$^GVbk(D*&=UOX0UZN0lwP_<$dm|l8uzJh4Ti}z zP6b4R!@h)zYl∨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 hPV)J>d> Date: Wed, 9 Oct 2019 17:21:24 +0200 Subject: [PATCH 16/28] Version Bump to 3.1.0.BETA2 Version Bump to 3.1.0.BETA2 bugfixes implemented https://github.com/FabLab-Luenen/McLighting/commit/589806d0fda737011426754a6d84c88535ded688 --- Arduino/McLighting/McLighting.ino | 88 +- Arduino/McLighting/WS2812FX.cpp | 4 + Arduino/McLighting/WS2812FX.h | 3 +- Arduino/McLighting/data/index.htm | 4 +- Arduino/McLighting/data/index.htm.gz | Bin 20709 -> 20708 bytes Arduino/McLighting/definitions.h | 4 +- Arduino/McLighting/helper_functions.h | 10 +- Arduino/McLighting/htm_index_gz.h | 907 +++++++++--------- Arduino/McLighting/json_functions.h | 60 +- .../mode_custom_ws2812fx_animations.h | 312 +++--- Arduino/McLighting/request_handlers.h | 143 ++- Arduino/McLighting/rest_api.h | 27 +- Arduino/McLighting/version.h | 2 +- Arduino/McLighting/version_info.ino | 7 + clients/web/index.htm | 4 +- clients/web/index.htm.gz | Bin 20709 -> 20708 bytes 16 files changed, 829 insertions(+), 746 deletions(-) diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino index 34a9089..4f8a302 100644 --- a/Arduino/McLighting/McLighting.ino +++ b/Arduino/McLighting/McLighting.ino @@ -327,6 +327,10 @@ void setup() { } #endif +#if defined(POWER_SUPPLY) + pinMode(POWER_SUPPLY, OUTPUT); // output to control external power supply +#endif + // start ticker with 0.5 because we start in AP mode and try to connect ticker.attach(0.5, tick); @@ -561,7 +565,7 @@ void setup() { #if defined(ENABLE_REMOTE) irrecv.enableIRIn(); // Start the receiver #endif - fx_speed_actual = segState.speed[State.segment]; + fx_speed = segState.speed[State.segment]; brightness_trans = State.brightness; initStrip(); strip->setBrightness(0); @@ -652,11 +656,19 @@ void loop() { #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK =off", ""); #endif + #if defined(POWER_SUPPLY) + digitalWrite(POWER_SUPPLY, LOW); // power off -> external power supply + #endif if (Config.transEffect) { brightness_trans = 0; } } } +#if defined(POWER_SUPPLY) + if (State.mode != OFF) { + if (prevmode != State.mode) {digitalWrite(POWER_SUPPLY, HIGH); } // power on -> external power supply + } +#endif if (State.mode == SET) { State.mode = HOLD; @@ -665,7 +677,7 @@ void loop() { #if defined(ENABLE_MQTT) snprintf(mqtt_buf, sizeof(mqtt_buf), "OK Ss%i", State.segment); #endif - prevsegment = State.segment; + //prevsegment = State.segment; } // Mode if (segState.mode[State.segment] != fx_mode) { @@ -679,9 +691,10 @@ void loop() { //strip->setSpeed(State.segment, segState.speed[State.segment]); //strip->setColors(State.segment, segState.colors[State.segment]); strip->setMode(State.segment, segState.mode[State.segment]); + //strip->trigger; } //Color - /*if (memcmp(segmentState.colors[State.segment)], strip->getColors(State.segment), sizeof(segmentState.colors[State.segment)])) != 0) { + /*if (memcmp(segmentState.colors[prevsegment)], strip->getColors(prevsegment), sizeof(segmentState.colors[prevsegment)])) != 0) { convertColors(); }*/ // Brightness @@ -692,13 +705,12 @@ void loop() { brightness_trans = State.brightness; } // Speed - if (fx_speed_actual != segState.speed[State.segment]) { + if (fx_speed != segState.speed[State.segment]) { #if defined(ENABLE_MQTT) - snprintf(mqtt_buf, sizeof(mqtt_buf), "OK ?%i", segState.speed[State.segment]); + snprintf(mqtt_buf, sizeof(mqtt_buf), "OK ?%i", segState.speed[prevsegment]); #endif } prevmode = SET; - //strip->trigger(); } if ((State.mode == HOLD) || ((State.mode == OFF) && (strip->getBrightness() > 0) && Config.transEffect)) { @@ -710,14 +722,16 @@ void loop() { } if (prevmode != State.mode) { - convertColors(); - if (memcmp(hexcolors_trans, strip->getColors(prevsegment), sizeof(hexcolors_trans)) != 0) { - DBG_OUTPUT_PORT.println("Color changed!"); - trans_cnt_max = convertColorsFade(prevsegment); - trans_cnt = 1; - memcpy(segState.colors[prevsegment], hexcolors_trans, sizeof(hexcolors_trans)); + if (segState.mode[prevsegment] != FX_MODE_CUSTOM_0) { + convertColors(); + if (memcmp(hexcolors_trans, strip->getColors(prevsegment), sizeof(hexcolors_trans)) != 0) { + DBG_OUTPUT_PORT.println("Color changed!"); + trans_cnt_max = convertColorsFade(prevsegment); + trans_cnt = 1; + memcpy(segState.colors[prevsegment], hexcolors_trans, sizeof(hexcolors_trans)); + } + strip->setSpeed(prevsegment, convertSpeed(fx_speed)); } - strip->setSpeed(State.segment, convertSpeed(fx_speed_actual)); //strip->setBrightness(brightness_actual); #if defined(ENABLE_MQTT) #if ENABLE_MQTT == 0 @@ -739,7 +753,7 @@ void loop() { (writeStateFS(updateState)) ? DBG_OUTPUT_PORT.println("State FS Save Success!") : DBG_OUTPUT_PORT.println("State FS Save failure!"); } if (updateSegState) { - (writeSegmentStateFS(updateSegState, State.segment)) ? DBG_OUTPUT_PORT.println("Segment State FS Save Success!") : DBG_OUTPUT_PORT.println("Segment State FS Save failure!"); + (writeSegmentStateFS(updateSegState, prevsegment)) ? DBG_OUTPUT_PORT.println("Segment State FS Save Success!") : DBG_OUTPUT_PORT.println("Segment State FS Save failure!"); } if (updateConfig) { (writeConfigFS(updateConfig)) ? DBG_OUTPUT_PORT.println("Config FS Save success!"): DBG_OUTPUT_PORT.println("Config FS Save failure!"); @@ -772,25 +786,27 @@ void loop() { } } // Async speed transition - if ((segState.mode[prevsegment] != FX_MODE_CUSTOM_0) && (fx_speed_actual != segState.speed[prevsegment])) { - //if (Config.transEffect) { - if (true == false) { // disabled for the moment + if ((segState.mode[prevsegment] != FX_MODE_CUSTOM_0) && (fx_speed != segState.speed[prevsegment])) { + if (Config.transEffect) { + //if (true == false) { // disabled for the moment if (speedFadeDelay <= millis()) { - DBG_OUTPUT_PORT.println("Speed actual: "); - DBG_OUTPUT_PORT.println(fx_speed_actual); - if (fx_speed_actual < segState.speed[prevsegment]) { - fx_speed_actual++; + //DBG_OUTPUT_PORT.print("Speed trans actual: "); + if (fx_speed < segState.speed[prevsegment]) { + fx_speed++; } - if (fx_speed_actual > segState.speed[prevsegment]) { - fx_speed_actual--; + if (fx_speed > segState.speed[prevsegment]) { + fx_speed--; } + //DBG_OUTPUT_PORT.println(fx_speed); speedFadeDelay = millis() + TRANS_DELAY; - strip->setSpeed(prevsegment, convertSpeed(fx_speed_actual)); + strip->setSpeed(prevsegment, convertSpeed(fx_speed)); if (State.mode == HOLD) strip->trigger(); } } else { - fx_speed_actual = segState.speed[State.segment]; - strip->setSpeed(prevsegment, convertSpeed(fx_speed_actual)); + fx_speed = segState.speed[prevsegment]; + //DBG_OUTPUT_PORT.print("Speed actual: "); + strip->setSpeed(prevsegment, convertSpeed(fx_speed)); + //DBG_OUTPUT_PORT.println(fx_speed); if (State.mode == HOLD) strip->trigger(); } } @@ -806,23 +822,29 @@ void loop() { strip->decreaseBrightness(1); } brightnessFadeDelay = millis() + TRANS_DELAY; - //if (State.mode == HOLD) strip->trigger(); - strip->trigger(); + if (State.mode == HOLD) strip->trigger(); } } else { brightness_trans = State.brightness; strip->setBrightness(brightness_trans); - if (State.mode == HOLD) strip->trigger(); } } -/* // Segment change only if color and speed transitions are finished, because they are segment specific + // Segment change only if color and speed transitions are finished, because they are segment specific if (prevsegment != State.segment) { - if ((memcmp(hexcolors_trans, strip->getColors(State.segment), sizeof(hexcolors_trans)) == 0) && (fx_speed_actual == segState.speed[State.segment])) { - State.segment = prevsegment; + DBG_OUTPUT_PORT.println("Segment not equal"); + if ((segState.mode[State.segment] == FX_MODE_CUSTOM_0) || (segState.mode[State.segment] == FX_MODE_CUSTOM_2) || (segState.mode[prevsegment] == FX_MODE_CUSTOM_0)) { + fx_speed = segState.speed[State.segment]; + DBG_OUTPUT_PORT.printf("Switched segment from: %i to %i", prevsegment, State.segment); + prevsegment = State.segment; + } else if ((memcmp(hexcolors_trans, strip->getColors(prevsegment), sizeof(hexcolors_trans)) == 0) && (fx_speed == segState.speed[prevsegment])) { + memcpy(hexcolors_trans, segState.colors[State.segment], sizeof(hexcolors_trans)); + fx_speed = segState.speed[State.segment]; + DBG_OUTPUT_PORT.printf("Switched segment from: %i to %i\r\n", prevsegment, State.segment); + prevsegment = State.segment; } } -*/ + #if defined(ENABLE_REMOTE) handleRemote(); diff --git a/Arduino/McLighting/WS2812FX.cpp b/Arduino/McLighting/WS2812FX.cpp index 2a665c1..b9a4631 100644 --- a/Arduino/McLighting/WS2812FX.cpp +++ b/Arduino/McLighting/WS2812FX.cpp @@ -340,6 +340,10 @@ uint32_t* WS2812FX::getColors(uint8_t seg) { return _segments[seg].colors; } +uint8_t WS2812FX::getSegmentIndex(void) { + return _segment_index; +} + WS2812FX::Segment* WS2812FX::getSegment(void) { return &_segments[_segment_index]; } diff --git a/Arduino/McLighting/WS2812FX.h b/Arduino/McLighting/WS2812FX.h index e4d4932..115fee9 100644 --- a/Arduino/McLighting/WS2812FX.h +++ b/Arduino/McLighting/WS2812FX.h @@ -500,7 +500,8 @@ class WS2812FX : public Adafruit_NeoPixel { getNumSegments(void), get_random_wheel_index(uint8_t), getOptions(uint8_t), - getNumBytesPerPixel(void); + getNumBytesPerPixel(void), + getSegmentIndex(void); uint16_t random16(void), diff --git a/Arduino/McLighting/data/index.htm b/Arduino/McLighting/data/index.htm index 15dee02..23b9d91 100644 --- a/Arduino/McLighting/data/index.htm +++ b/Arduino/McLighting/data/index.htm @@ -1929,9 +1929,9 @@ function initSettings() { redrawColorPicker(); }); var settransitionEffects = document.getElementById("set-transitionEffects"); - settransitionEffects.checked = config.transitionEffects; + settransitionEffects.checked = config.ws_trans; settransitionEffects.addEventListener('change', ()=>{ - config.transitionEffects = settransitionEffects.checked; + config.ws_trans = settransitionEffects.checked; if (settransitionEffects.checked) { document.getElementById("settransitionEffectsbgcolor").style.backgroundColor = settings.theme_btn; ws_send("Ce1"); diff --git a/Arduino/McLighting/data/index.htm.gz b/Arduino/McLighting/data/index.htm.gz index e149892ae8cc7456edca8454e32d606141d08320..7a3f8fff5c9cfa886e74e8f988795f5a9df81944 100644 GIT binary patch delta 5458 zcmV-Y6|L&!p#kKf0S6z82na~HoUsSUJAahi?OQ6PNG+GS#MPHdF08X*RiNS5MtoGJ z7o;4WZu3Lu?&KpLf{59+{_NvGTdsGfQ(n*AhpeYoFYi2baWzSnwdW}M2qiUKV!2jQ zdlf|oZM1^sBL-z?WjZ_Km+=jORk5O=ZLcKzJEG; z^UdyS<#2lvZvTzftKjw}+;I4~+ua$$Ij@i~*!gO;m`)mW9x611^7(3&$J-!mvn*RB z0+~~^;n6_;yShr>tg5Waly!3U2*C=<)uBTV;L+EKUr6TTNz-=7dl_9ux|)}Js> zhitUO%E&q9vJstb^6;_g2h%W1mDW7QvrfPYi5btBMd zH1dvb_rXeX5?{ar0qw>*_zO5kw;l34K5daz9N?tl8f-D{GIp#yen4l8ws7NAxSe~>U>qEe$wkw zZ?qEez*F!_Zn&*{HksuKtbhCQoBL6>Tv@UpZ2_v5!ekX11JDL+lLa9!H7La>wQ+rg zgFsI$o=;}6cygsl99}VxFAx8yCOOq0*r0VF`LZ4&^McT=ys$3CpNsai4aF#sP4lo$ zhP=ByuIJCeo1{Yf)x{UOTLt?NtYcrI2H@f{mkgQEb?;TtpGlLwHh)&Z3!E#Xm=W`E z*>I^W&gj~Ve5#Xi{mV2Y^D6AsWbIsoRe$zvFo(|?gC?(n=`m`;>ScLiM&Efp|4{c4 z%h?iKH4SxSwj1e&|5B8wwzv@0={n6y*B|X>oh%lARg0orxpdgLN%J20$q|4l8%k;? zp1)H&#=d-iEvhSV?|&{R*9Pe@ypJZP(zpFqW%JYy9+YAYan{}42cGqXsd9)KH_+NJ zqolXk15Q+%u%WS_z6CgzY7DC`}Y%0QQ|FK>GcpR9*E)!u{^_AqgmwK5I6pQ1fyys1OmM>1`qt{2T)28K%k7twf{oRgov47rOCRY=xM3NE1a~{cs zL_qhfBD@aIZ;Uf2Wr$z8zRRs06a(yj6B%BD|BaBlfLpN!F>V{!y%4Di*v-C;rzb1$ z*mF9jKtZ|}F+I#Lw!4A+o&93C;OLMIv1U9M&H;WE=V^kEjE_WG8Y`UlUKBlEtYDm6uX50Z1O~8MhHjq5aHiee z_C8*&0(L~0=!9H{G>|cr5>b^|=d;OjLnTq_{P3`XS&BVy_hTHdj|rGp_Fi+?YuSTV zI6c$B%Aa9J`(Vs?D(A+EMjs%l>zJ-5q?Wm!jonV5Rexg|%$vcYR;5i}tsp>CX$XN) zsC$@Wi5>V&3Z0b(APxtL&wrMjC6Tp1lC|g1N_Fs>pshNXCazizpnF_7k&jfESvPRdG+Y%xNWaN z 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 delta 5459 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 J{f0)R0RS|(sgwW! diff --git a/Arduino/McLighting/definitions.h b/Arduino/McLighting/definitions.h index baaa99a..b6f474e 100644 --- a/Arduino/McLighting/definitions.h +++ b/Arduino/McLighting/definitions.h @@ -12,7 +12,7 @@ #define FX_OPTIONS 48 // ws2812fx Options 48 = SIZE_SMALL + FADE_MEDIUM is configurable just for the start; for WS2812FX setSegment OPTIONS, see: https://github.com/kitesurfer1404/WS2812FX/blob/master/extras/WS2812FX%20Users%20Guide.md //#define LED_TYPE_WS2811 // Uncomment, if LED type uses 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) #define LED_BUILTIN 2 // ESP-12F has the built in LED on GPIO2, see https://github.com/esp8266/Arduino/issues/2192 - +//#define POWER_SUPPLY 12 // PIN (12 / D6) If defined, enable output to control external power supply char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just for the start. Hostname should not contain spaces as this can break Home Assistant discovery if used. #define ENABLE_OTA 1 // If defined, enable Arduino OTA code. If set to 0 enable Arduino OTA code, if set to 1 enable ESP8266HTTPUpdateServer OTA code. @@ -183,7 +183,7 @@ struct { bool transEffect = false; } Config; -uint8_t fx_speed_actual = 196; // Global variable for storing the speed for effects while fading --> smaller == slower +uint8_t fx_speed = 196; // Global variable for storing the speed for effects while fading --> smaller == slower uint8_t fx_mode = 0; uint8_t brightness_trans = 0; // Global variable for storing the brightness before change uint32_t hexcolors_trans[3] = {}; // Color array of colors of WS2812FX before fading diff --git a/Arduino/McLighting/helper_functions.h b/Arduino/McLighting/helper_functions.h index e265b4e..9b60bc2 100644 --- a/Arduino/McLighting/helper_functions.h +++ b/Arduino/McLighting/helper_functions.h @@ -208,8 +208,9 @@ void initStrip(uint16_t _stripSize = Config.stripSize, uint8_t _num_segments = C (readSegmentStateFS(State.segment)) ? DBG_OUTPUT_PORT.println("Segment state config FS read Success!") : DBG_OUTPUT_PORT.println("Segment state config FS read failure!"); memcpy(segState.colors[State.segment], hexcolors_trans, sizeof(hexcolors_trans)); strip->setSegment(State.segment, segState.start, segState.stop , segState.mode[State.segment], hexcolors_trans, convertSpeed(segState.speed[State.segment]), segState.options); - fx_speed_actual = segState.speed[State.segment]; + fx_speed = segState.speed[State.segment]; fx_mode = segState.mode[State.segment]; + brightness_trans = State.brightness; prevsegment = State.segment; strip->setCustomMode(0, F("Autoplay"), handleAuto); strip->setCustomMode(1, F("Custom WS"), handleCustomWS); @@ -244,11 +245,12 @@ void initStrip(uint16_t _stripSize = Config.stripSize, uint8_t _num_segments = C } void getSegmentParams(uint8_t _seg) { - segState.start = strip->getSegment(_seg)->start;; - segState.stop = strip->getSegment(_seg)->stop;; + segState.start = strip->getSegment(_seg)->start;; + segState.stop = strip->getSegment(_seg)->stop;; //segState.mode[_seg] = strip->getMode(_seg); //segState.speed[_seg] = unconvertSpeed(strip->getSpeed(_seg)); - fx_speed_actual = segState.speed[_seg]; + //fx_mode = segState.mode[_seg]; + //fx_speed = segState.speed[_seg]; main_color.white = ((segState.colors[_seg][0] >> 24) & 0xFF); main_color.red = ((segState.colors[_seg][0] >> 16) & 0xFF); main_color.green = ((segState.colors[_seg][0] >> 8) & 0xFF); diff --git a/Arduino/McLighting/htm_index_gz.h b/Arduino/McLighting/htm_index_gz.h index 3ed7ca7..a69ce8f 100644 --- a/Arduino/McLighting/htm_index_gz.h +++ b/Arduino/McLighting/htm_index_gz.h @@ -1,8 +1,7 @@ #include - -#define index_htm_gz_len 20709 +#define index_htm_gz_len 20708 static const char index_htm_gz[] PROGMEM ={ - 0x1f, 0x8b, 0x08, 0x08, 0x1e, 0x16, 0x9a, 0x5d, 0x04, 0x00, 0x69, 0x6e, + 0x1f, 0x8b, 0x08, 0x08, 0x48, 0xb8, 0x9c, 0x5d, 0x04, 0x00, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x00, 0xe4, 0x5d, 0x5b, 0x77, 0x1b, 0x49, 0x11, 0x7e, 0xe7, 0x1c, 0xfe, 0xc3, 0x44, 0x81, 0x44, 0x62, 0x25, 0x59, 0x17, 0xdb, 0x38, 0x72, 0xe4, 0xc5, 0xc9, 0x3a, 0xd9, 0x40, @@ -1277,455 +1276,455 @@ static const char index_htm_gz[] PROGMEM ={ 0x15, 0xde, 0x68, 0xe9, 0xd5, 0xcb, 0x1b, 0xf0, 0x6c, 0xd6, 0x02, 0x4e, 0x2d, 0x14, 0xcc, 0xb2, 0xe2, 0xfd, 0x03, 0xc1, 0xb5, 0x9f, 0xf3, 0x92, 0x05, 0xc9, 0x9c, 0xce, 0x6e, 0xd1, 0x31, 0x92, 0x0f, 0xce, 0xcf, 0xe3, - 0x59, 0xdd, 0x4a, 0x56, 0xde, 0x77, 0x10, 0xa4, 0xb8, 0xbc, 0xd4, 0x24, - 0xc7, 0xca, 0x6f, 0x77, 0x40, 0x4a, 0xb1, 0xdb, 0xac, 0x77, 0x79, 0xaa, - 0x53, 0xc9, 0x97, 0x75, 0x5a, 0xac, 0x0a, 0x34, 0xfc, 0x22, 0x89, 0x8f, - 0xca, 0xf4, 0x82, 0xd4, 0xa5, 0xd3, 0x6d, 0x7e, 0x0c, 0xdd, 0x9d, 0x8e, - 0xc4, 0x43, 0x10, 0x3a, 0xdb, 0xd6, 0x9f, 0x7d, 0x40, 0x68, 0xcb, 0xf5, - 0xee, 0x74, 0xca, 0xeb, 0xb9, 0xfb, 0x90, 0xf5, 0xd4, 0xea, 0xe5, 0x9d, - 0x99, 0x2e, 0xae, 0x26, 0xc9, 0xb2, 0xf6, 0x64, 0x45, 0x1f, 0xa1, 0xa4, - 0xce, 0x4b, 0x2c, 0xd7, 0x6e, 0x6a, 0xef, 0xa4, 0xe8, 0xa0, 0x8d, 0xd6, - 0xd4, 0x7c, 0xc4, 0xa0, 0x0c, 0xad, 0x4c, 0x67, 0xaf, 0xfc, 0x32, 0xbe, - 0x21, 0xb0, 0x2a, 0x56, 0x14, 0xf4, 0x6d, 0xf2, 0x13, 0x1a, 0x97, 0x88, - 0xce, 0x58, 0x3f, 0x81, 0x01, 0x59, 0xa2, 0x8b, 0xa3, 0x71, 0xd1, 0xb0, - 0x37, 0xea, 0xf6, 0x86, 0x07, 0xdd, 0x57, 0x47, 0x6f, 0xbe, 0xd9, 0x7d, - 0xad, 0x1c, 0x6e, 0x4f, 0xc2, 0xed, 0xbf, 0xf1, 0x7a, 0x15, 0xdc, 0xbe, - 0x84, 0x1b, 0x0e, 0x1f, 0x77, 0xbb, 0x3b, 0x43, 0x38, 0xf9, 0x15, 0x12, - 0x18, 0x3b, 0x5f, 0xad, 0x16, 0xd3, 0x49, 0x83, 0xce, 0x43, 0x85, 0x86, - 0x50, 0x3e, 0x5f, 0xad, 0xf2, 0x78, 0x1b, 0x84, 0x6d, 0x96, 0x65, 0xab, - 0x44, 0x20, 0x73, 0x8a, 0x3f, 0x3c, 0xda, 0x47, 0x2b, 0xfe, 0xe8, 0xc5, - 0xe1, 0x70, 0xf8, 0x88, 0x1d, 0xc2, 0x97, 0x0f, 0x3e, 0xf8, 0xe0, 0x51, - 0x08, 0x65, 0x62, 0x79, 0x7b, 0x84, 0xe9, 0x66, 0x4b, 0x3b, 0xea, 0x76, - 0x7f, 0xc2, 0x17, 0x84, 0xea, 0xfb, 0x13, 0x42, 0xc9, 0xfe, 0x24, 0xb1, - 0xca, 0xfa, 0x13, 0xe6, 0xe9, 0x90, 0x8d, 0x16, 0x7d, 0x5c, 0x5a, 0xc0, - 0x9d, 0x59, 0x62, 0x88, 0x98, 0xe8, 0x28, 0xae, 0x2d, 0x20, 0x1f, 0xf1, - 0x12, 0xa9, 0xa0, 0x8e, 0xd5, 0x4b, 0x05, 0xa1, 0xa4, 0x54, 0x24, 0x56, - 0x99, 0x54, 0x30, 0xcf, 0x84, 0x6c, 0x2f, 0x15, 0xce, 0x9d, 0xa4, 0x13, - 0x2e, 0x15, 0x71, 0xe4, 0xbe, 0x49, 0x5f, 0x42, 0x80, 0x10, 0xd2, 0xf2, - 0x2c, 0xce, 0xc3, 0x53, 0x2e, 0x76, 0xe6, 0xb6, 0x45, 0x1a, 0x97, 0xc6, - 0xb7, 0x45, 0x9b, 0x4f, 0x17, 0xb6, 0x48, 0x1d, 0x66, 0x1f, 0x5b, 0x93, - 0xb9, 0x9c, 0xcc, 0x6c, 0x91, 0x3e, 0xcc, 0x8d, 0xda, 0xb3, 0x2f, 0xce, - 0x37, 0xe6, 0xf1, 0x4d, 0xbe, 0x43, 0xb7, 0xfe, 0x78, 0x3f, 0x9f, 0xc7, - 0x6b, 0x7e, 0x3a, 0x9d, 0x41, 0x92, 0xa2, 0xc9, 0x30, 0x66, 0x3b, 0x86, - 0xed, 0x0c, 0x1d, 0x8c, 0x11, 0xf5, 0x9f, 0x3d, 0x16, 0xcb, 0xe0, 0xfa, - 0x59, 0xc8, 0x81, 0x59, 0x75, 0x25, 0x52, 0x4d, 0xe5, 0xfd, 0x87, 0x65, - 0x39, 0x4d, 0xf7, 0xc0, 0xac, 0xfa, 0xe3, 0x10, 0x70, 0x4e, 0xb6, 0x6e, - 0x04, 0x1a, 0x8d, 0x46, 0xde, 0xf1, 0xed, 0x3e, 0x58, 0x49, 0x4e, 0xe2, - 0x0b, 0x78, 0x32, 0xa0, 0xdd, 0x58, 0x07, 0x7f, 0x01, 0x27, 0xeb, 0xb6, - 0x43, 0x9e, 0x07, 0x41, 0xdc, 0x02, 0x61, 0x3a, 0x5c, 0xbb, 0x1d, 0xd2, - 0x78, 0xe4, 0x76, 0x3b, 0x94, 0xf1, 0x20, 0xee, 0x96, 0x48, 0xf3, 0x10, - 0x74, 0xdb, 0xa1, 0x9d, 0xad, 0xe3, 0x6d, 0x35, 0xa3, 0x34, 0x36, 0xed, - 0x48, 0x3b, 0xfe, 0x4a, 0x1e, 0x30, 0x29, 0x02, 0x20, 0xc3, 0x5b, 0xc9, - 0x4b, 0xa7, 0x44, 0x90, 0xa5, 0xc3, 0x3d, 0xc7, 0x7c, 0x88, 0x18, 0x13, - 0x54, 0xc2, 0x1d, 0x15, 0x49, 0xa4, 0x0f, 0xeb, 0x35, 0x4d, 0xc6, 0x87, - 0x7c, 0x19, 0x42, 0x9d, 0xaf, 0xd3, 0xd4, 0x4f, 0x7a, 0x5d, 0xea, 0x8d, - 0x56, 0x22, 0x1e, 0x78, 0x0a, 0x5e, 0xc9, 0x0d, 0xb7, 0x95, 0xcf, 0x26, - 0xb3, 0x3c, 0x81, 0x95, 0x40, 0x7e, 0x97, 0x3f, 0xea, 0x96, 0x2b, 0x4b, - 0x16, 0xa4, 0x2d, 0x40, 0xd5, 0x52, 0x98, 0xac, 0x42, 0x63, 0x00, 0xda, - 0x80, 0x6d, 0xb2, 0x32, 0xe4, 0xa5, 0x06, 0xa5, 0x18, 0xa5, 0x36, 0xae, - 0xaf, 0x70, 0x10, 0xe8, 0xf1, 0xc5, 0xf3, 0xc9, 0x2c, 0x16, 0x8f, 0xb0, - 0x34, 0x89, 0xcc, 0x2b, 0xe6, 0xf1, 0xe5, 0x01, 0x21, 0xd5, 0x24, 0xa7, - 0x1a, 0x04, 0x1b, 0xb4, 0x0e, 0x24, 0x5f, 0xd6, 0x43, 0x64, 0x5e, 0x10, - 0xba, 0xa7, 0x17, 0xd6, 0xa5, 0xf8, 0x03, 0xd2, 0x9e, 0xb6, 0xa1, 0xa8, - 0x05, 0xb2, 0x69, 0x1e, 0xd6, 0xc9, 0x90, 0xb7, 0xb9, 0xc7, 0xf5, 0xfc, - 0x39, 0x78, 0x93, 0x54, 0x68, 0xbf, 0xba, 0x0a, 0x43, 0xb7, 0xad, 0x60, - 0x67, 0x82, 0x75, 0xec, 0x6b, 0xd5, 0x00, 0x5c, 0x5c, 0xef, 0x92, 0x41, - 0x14, 0xba, 0xee, 0x4d, 0x2b, 0xfa, 0x33, 0x69, 0xb2, 0xd7, 0xc6, 0x2a, - 0x9c, 0x81, 0x73, 0x89, 0x14, 0x33, 0x62, 0x1e, 0x40, 0x1b, 0xae, 0x99, - 0xc5, 0x19, 0x5d, 0xa4, 0x91, 0x8f, 0x77, 0x32, 0xae, 0x7f, 0x99, 0x86, - 0x64, 0x5e, 0x8e, 0xbd, 0x9a, 0xac, 0x9d, 0x8b, 0xb1, 0xea, 0xcf, 0xbe, - 0x1f, 0xe6, 0xf0, 0x59, 0x63, 0xd0, 0xe4, 0xe5, 0x30, 0x3d, 0x6a, 0x4d, - 0x58, 0xbd, 0x2c, 0x4f, 0xcc, 0xe8, 0x3b, 0xcf, 0xe7, 0x1f, 0xea, 0x3e, - 0x62, 0x39, 0x5b, 0x82, 0xab, 0xa6, 0xc1, 0x8f, 0xcc, 0x76, 0x23, 0xdd, - 0xf0, 0x5f, 0x93, 0x12, 0xd5, 0x16, 0x57, 0xa4, 0x3a, 0x5d, 0xa7, 0x59, - 0xe9, 0x42, 0xa4, 0xdd, 0xac, 0x93, 0xc5, 0xe2, 0xaf, 0x6a, 0x51, 0x94, - 0x2b, 0x97, 0x0e, 0x1b, 0x37, 0x69, 0xde, 0x23, 0x3f, 0x39, 0x02, 0x30, - 0x65, 0x43, 0x49, 0xed, 0xc4, 0xf3, 0x77, 0x6a, 0xc7, 0xd8, 0x97, 0xef, - 0xaf, 0x45, 0x75, 0x25, 0xee, 0xdd, 0x05, 0xe5, 0xda, 0xb0, 0x1d, 0x86, - 0xf7, 0xd1, 0xc4, 0x54, 0xfa, 0x36, 0xe4, 0xaa, 0x6c, 0x9e, 0xda, 0xd3, - 0x83, 0x52, 0xac, 0x21, 0xce, 0xba, 0xcd, 0xfb, 0xc0, 0xb3, 0xbe, 0x30, - 0x55, 0x0e, 0x51, 0xe3, 0x06, 0x5a, 0x1b, 0x66, 0x94, 0xf4, 0x16, 0x7b, - 0xc0, 0x89, 0x6a, 0x13, 0x36, 0x34, 0x16, 0xd4, 0xb7, 0x00, 0xc7, 0x52, - 0x8d, 0x61, 0xd5, 0x65, 0xdc, 0x3b, 0x97, 0x70, 0xcd, 0x9b, 0xd9, 0x57, - 0x19, 0xe8, 0xf2, 0xf5, 0xe5, 0x6d, 0x8f, 0xe1, 0x23, 0xf6, 0x50, 0xa7, - 0xda, 0xbb, 0xb1, 0xa2, 0x7c, 0x41, 0xa0, 0x68, 0xea, 0x1b, 0x63, 0xd7, - 0x1d, 0xc8, 0xca, 0xf4, 0x52, 0x2f, 0x33, 0x82, 0x62, 0x71, 0xbc, 0x94, - 0x37, 0xbf, 0x69, 0x17, 0xf3, 0xc5, 0xc9, 0x7c, 0xf4, 0xfa, 0xe8, 0x75, - 0xda, 0xc6, 0x7c, 0xf1, 0xf1, 0x6c, 0x72, 0xbe, 0xbf, 0xdb, 0x51, 0x2e, - 0xd6, 0xbb, 0xcb, 0xe4, 0x6a, 0x42, 0x95, 0x48, 0x32, 0x62, 0x78, 0xce, - 0x63, 0xbb, 0x90, 0x08, 0xe8, 0xe6, 0x55, 0x84, 0x17, 0xe4, 0xf9, 0x1d, - 0x72, 0x06, 0xa5, 0x0c, 0xf1, 0x4b, 0xd7, 0x77, 0xdd, 0xb5, 0x83, 0x62, - 0x80, 0xfd, 0x70, 0x22, 0xc3, 0x4b, 0xf0, 0xbf, 0x1a, 0x72, 0x17, 0x70, - 0x4f, 0xd6, 0x20, 0xc6, 0x6d, 0x03, 0xbb, 0x17, 0x22, 0x55, 0x21, 0xbc, - 0xd9, 0xb7, 0xf1, 0xf4, 0x64, 0x05, 0x1e, 0x7b, 0x4e, 0x07, 0x17, 0x28, - 0x6c, 0xf7, 0x22, 0xa6, 0xa7, 0xfa, 0xc5, 0x06, 0x38, 0x90, 0xbf, 0xb3, - 0xdf, 0x10, 0x17, 0x1c, 0x1d, 0xb2, 0x21, 0xd6, 0x8c, 0xe7, 0xc2, 0xc9, - 0xc0, 0xaf, 0xe2, 0x3c, 0x4d, 0xf0, 0xd9, 0xf1, 0x91, 0x48, 0x4b, 0x63, - 0x85, 0xf3, 0x7e, 0xbc, 0x98, 0xdc, 0x7e, 0x94, 0xae, 0xae, 0x3f, 0x9c, - 0xe0, 0x33, 0xd9, 0x0a, 0x68, 0x1e, 0x4f, 0x37, 0x17, 0xfc, 0x3d, 0x73, - 0x60, 0xeb, 0xc8, 0x7c, 0xa9, 0x58, 0xe0, 0xbf, 0xbb, 0x58, 0x98, 0xa1, - 0x04, 0xcc, 0xab, 0xa3, 0xc7, 0x8b, 0x15, 0x8c, 0x93, 0xeb, 0x55, 0x0e, - 0xba, 0x90, 0xc0, 0x00, 0x76, 0xcb, 0xd0, 0xcd, 0xd3, 0x18, 0xce, 0xb4, - 0xdb, 0xdc, 0xde, 0xe7, 0xcc, 0x55, 0x08, 0x8f, 0x08, 0x13, 0x9d, 0x20, - 0xec, 0x90, 0x06, 0x32, 0x86, 0x52, 0x22, 0xaa, 0x32, 0xeb, 0x7c, 0x36, - 0x59, 0x6e, 0xa8, 0x24, 0x4a, 0x9d, 0x1f, 0x1e, 0x56, 0x30, 0x4b, 0xd1, - 0x08, 0xee, 0x7e, 0x8c, 0xe3, 0xf5, 0x31, 0x01, 0xf3, 0xca, 0xde, 0x6b, - 0x0e, 0x7b, 0x2d, 0x7b, 0xd0, 0x0a, 0xa7, 0x67, 0x3a, 0x58, 0xf9, 0xc3, - 0xec, 0x68, 0x1f, 0x8c, 0x19, 0x4f, 0xe5, 0xdc, 0x58, 0xd1, 0xe8, 0x03, - 0x24, 0x75, 0x1d, 0xd3, 0xf5, 0x84, 0xd4, 0x32, 0xd7, 0xb3, 0xb1, 0xdb, - 0x09, 0xb4, 0x6a, 0x4c, 0x83, 0x79, 0x57, 0x58, 0xd4, 0xaa, 0xb4, 0xe9, - 0xab, 0x15, 0x04, 0x68, 0x2a, 0x0d, 0x21, 0x30, 0x0a, 0x7e, 0x0f, 0x73, - 0x2c, 0xb1, 0x15, 0xbf, 0x49, 0xa1, 0xb3, 0xd2, 0x00, 0xc4, 0xe1, 0x40, - 0xf1, 0xf9, 0xcf, 0x92, 0xd3, 0x25, 0xb2, 0xf6, 0x47, 0xb2, 0xf6, 0x1c, - 0x5a, 0xa9, 0x0e, 0x5e, 0x1c, 0xb4, 0x55, 0x07, 0xd3, 0xc4, 0xe5, 0xcb, - 0x01, 0x74, 0x8f, 0x2b, 0x27, 0x16, 0x92, 0x0a, 0x3c, 0xeb, 0x86, 0xf4, - 0x00, 0x8e, 0x48, 0x08, 0x62, 0x92, 0xf6, 0x95, 0xec, 0x4f, 0xc0, 0x59, - 0xd1, 0x71, 0x71, 0x2d, 0xcf, 0x8a, 0x34, 0x72, 0xf8, 0xc6, 0x10, 0x03, - 0x75, 0x4d, 0xd2, 0xf9, 0x26, 0x59, 0xae, 0xe0, 0xab, 0xea, 0xce, 0x50, - 0x7a, 0x79, 0xd0, 0x90, 0xe3, 0x82, 0x3a, 0x0a, 0x4a, 0xa9, 0x06, 0xd5, - 0x13, 0xc8, 0x20, 0x7d, 0x9d, 0x40, 0xb5, 0xd2, 0x8a, 0x30, 0xd8, 0x98, - 0xc0, 0x91, 0x9c, 0x92, 0x31, 0x9c, 0x1e, 0xf5, 0xd4, 0xb1, 0xfd, 0xee, - 0x41, 0x35, 0x83, 0xf1, 0x3c, 0x9c, 0xbf, 0x80, 0x1e, 0xf3, 0xda, 0x6b, - 0x16, 0xce, 0xf3, 0xf5, 0x1d, 0x8b, 0x7b, 0xdd, 0x52, 0x3b, 0xbf, 0x3b, - 0x1d, 0x3f, 0x92, 0x19, 0xc9, 0xed, 0x35, 0x68, 0xdc, 0xba, 0x4a, 0xd8, - 0x7e, 0xc4, 0x91, 0x57, 0xda, 0x64, 0xad, 0x82, 0xc5, 0xfd, 0x3e, 0xf4, - 0xaf, 0xad, 0x48, 0xbc, 0xdf, 0xdf, 0xaa, 0xc4, 0x9f, 0x57, 0x78, 0xb2, - 0x6b, 0xd6, 0x59, 0xda, 0xb7, 0xc6, 0x4c, 0x19, 0x38, 0x0f, 0x23, 0xa1, - 0xd1, 0x53, 0xef, 0x83, 0xda, 0x8e, 0x5c, 0x92, 0xe0, 0xb6, 0xfb, 0x80, - 0xa0, 0x57, 0xcb, 0xc0, 0x46, 0xbb, 0x0f, 0x88, 0x6e, 0x03, 0x56, 0xa4, - 0x18, 0xd1, 0xf5, 0xf1, 0x97, 0xc4, 0xa4, 0xe4, 0x32, 0x50, 0x40, 0xb2, - 0x14, 0xc0, 0x2c, 0x92, 0xc2, 0xc7, 0x26, 0x45, 0xb2, 0x7f, 0x3e, 0x49, - 0x16, 0xb1, 0x88, 0x71, 0x52, 0x2d, 0x5b, 0x60, 0xd8, 0x64, 0xd9, 0x61, - 0xd8, 0x64, 0xb7, 0xda, 0xb6, 0x02, 0xfe, 0x26, 0x5d, 0x94, 0xd8, 0xd2, - 0xda, 0xa9, 0xd4, 0xbf, 0x3b, 0x0a, 0xbd, 0x15, 0x19, 0x89, 0xe2, 0x34, - 0x82, 0x64, 0x32, 0x90, 0x8c, 0x3e, 0xb4, 0x7e, 0x7b, 0x19, 0x2f, 0xf9, - 0xa0, 0xaa, 0x44, 0x9a, 0x64, 0xe4, 0x81, 0xf5, 0xe8, 0xa5, 0x19, 0x8a, - 0x05, 0x41, 0x52, 0x17, 0xc3, 0x2f, 0xa4, 0xa6, 0x3f, 0xc7, 0xa9, 0xaf, - 0x35, 0xd4, 0x88, 0xe0, 0x3e, 0xe9, 0xe2, 0xea, 0x78, 0xd1, 0x4e, 0x54, - 0x9a, 0x3b, 0xc5, 0x4b, 0x8a, 0xd6, 0x8f, 0xe7, 0x6e, 0x80, 0x34, 0x02, - 0x49, 0xe3, 0xf3, 0x34, 0xce, 0x2e, 0x9f, 0xd1, 0x2a, 0x29, 0x4c, 0x42, - 0xf9, 0xd0, 0xff, 0x44, 0xfc, 0x8a, 0xa8, 0xaf, 0xa9, 0xe3, 0x5e, 0x2f, - 0x75, 0xba, 0x3d, 0x72, 0x7a, 0x77, 0xb1, 0xac, 0x06, 0x86, 0x4b, 0x79, - 0x2a, 0x42, 0x8b, 0x1b, 0x58, 0x89, 0xb0, 0x5e, 0x22, 0xe8, 0xb6, 0x1a, - 0x78, 0x76, 0x76, 0xca, 0x1e, 0x27, 0x54, 0x35, 0x17, 0xf3, 0x87, 0x11, - 0xd6, 0xbd, 0x19, 0xea, 0xb1, 0x40, 0xdd, 0x6b, 0x8e, 0xfa, 0x9b, 0x40, - 0x7d, 0x8c, 0xa8, 0x41, 0x9b, 0x1b, 0xa5, 0x3d, 0x0e, 0x5a, 0xed, 0xe5, - 0x4e, 0x33, 0x12, 0xe1, 0xdd, 0x0e, 0x88, 0x53, 0xbf, 0x0b, 0xe2, 0xb1, - 0x6d, 0xdf, 0xc3, 0xf8, 0xa5, 0xb7, 0xd2, 0x51, 0xde, 0x6a, 0x0f, 0x24, - 0x2f, 0xa1, 0x69, 0x17, 0xe4, 0x13, 0xa1, 0xda, 0x4e, 0x68, 0x47, 0x78, - 0xa3, 0xe7, 0x33, 0x8b, 0xfe, 0xe6, 0xed, 0x93, 0x5d, 0x5f, 0xa5, 0x3f, - 0x5d, 0x5d, 0x30, 0x1a, 0x11, 0xb3, 0xb2, 0x5a, 0x50, 0xae, 0x5e, 0x0b, - 0x4a, 0xf0, 0x56, 0x85, 0x72, 0xf4, 0xca, 0xc8, 0xc0, 0x6f, 0xf4, 0xd9, - 0xb4, 0x4a, 0xe8, 0x3a, 0xb8, 0x63, 0x62, 0x9e, 0xde, 0x1e, 0xd3, 0xd5, - 0xc2, 0xb7, 0xc7, 0xda, 0x18, 0x32, 0x50, 0xf3, 0x66, 0xe2, 0xac, 0xa1, - 0x43, 0xe4, 0xda, 0x15, 0xf5, 0x57, 0xef, 0x6c, 0xb6, 0xb2, 0x2c, 0x41, - 0xd6, 0x45, 0x5a, 0xb1, 0xc6, 0x15, 0xb2, 0xc6, 0xfc, 0x36, 0x65, 0x77, - 0xda, 0x84, 0xfd, 0x13, 0xe5, 0x92, 0xd7, 0x34, 0x64, 0xaf, 0xf9, 0x5b, - 0x08, 0xd2, 0x43, 0xf0, 0x47, 0x5a, 0xe4, 0xc0, 0xa1, 0x1b, 0x3a, 0xd0, - 0xaf, 0xcb, 0xe2, 0x38, 0x06, 0x0f, 0x01, 0x1b, 0xd0, 0x47, 0x8b, 0xe8, - 0x49, 0x41, 0xb1, 0x8f, 0x95, 0x66, 0x23, 0x79, 0x41, 0x9a, 0xc7, 0x40, - 0x1e, 0x20, 0x6d, 0x9d, 0x43, 0x50, 0xd4, 0xb0, 0xd7, 0x5c, 0x0a, 0xcc, - 0x9d, 0x9d, 0xa0, 0x45, 0xd1, 0x47, 0x64, 0xf9, 0x1e, 0xc9, 0x4d, 0x5e, - 0xf1, 0x8a, 0x21, 0x36, 0xd9, 0x12, 0x7a, 0xab, 0xbb, 0xed, 0x64, 0x56, - 0x01, 0xca, 0x07, 0x76, 0xe1, 0xdf, 0xe7, 0x78, 0x44, 0x46, 0x46, 0xd9, - 0x70, 0x5f, 0xf1, 0x30, 0xa3, 0x17, 0x8c, 0x75, 0xe8, 0x23, 0x16, 0x74, - 0x3a, 0xcf, 0x1f, 0x06, 0x21, 0xe0, 0x35, 0x0e, 0x5c, 0x2b, 0x2e, 0xe7, - 0x88, 0x72, 0xc7, 0x05, 0x60, 0x08, 0x41, 0xf5, 0x46, 0x73, 0xf0, 0x73, - 0x25, 0xee, 0xeb, 0xd3, 0x16, 0x25, 0x4b, 0xe6, 0xaa, 0x91, 0x28, 0xa0, - 0x1b, 0x3b, 0x56, 0xaf, 0xbf, 0x62, 0xd4, 0x37, 0x0f, 0xb0, 0xf5, 0x48, - 0x76, 0x48, 0x01, 0x6e, 0x4d, 0x69, 0x4f, 0x5b, 0xb4, 0xe1, 0x09, 0x3d, - 0xdd, 0xc7, 0x2f, 0x36, 0x67, 0x14, 0x65, 0xac, 0x56, 0x30, 0x04, 0xeb, - 0xc8, 0x04, 0xe0, 0xee, 0xac, 0xdb, 0xf1, 0x63, 0x05, 0x7e, 0x14, 0x12, - 0x1b, 0xc0, 0x7f, 0xbf, 0x3f, 0xa8, 0xf5, 0xf1, 0x92, 0xb5, 0xcb, 0x92, - 0xcd, 0x13, 0xc0, 0x8c, 0x0b, 0xf0, 0xa3, 0x80, 0x1b, 0xfa, 0xfe, 0x7b, - 0xf6, 0x21, 0x0c, 0x9d, 0xdf, 0x3c, 0x2b, 0xd3, 0x48, 0xa0, 0xe5, 0x28, - 0x25, 0x80, 0x87, 0xea, 0x25, 0x9d, 0x27, 0x0a, 0x56, 0x49, 0xe7, 0x59, - 0x6e, 0x45, 0xa3, 0x46, 0x19, 0x2b, 0xf5, 0xd0, 0x7e, 0x2e, 0x5c, 0x51, - 0x0d, 0xd3, 0x40, 0xab, 0x4e, 0x74, 0xa6, 0x22, 0xb8, 0x4e, 0xee, 0x23, - 0x28, 0x8a, 0x08, 0x3c, 0x71, 0x77, 0x14, 0x84, 0x95, 0x1a, 0x58, 0xc3, - 0x40, 0xac, 0x0b, 0x03, 0x6b, 0x14, 0x88, 0x35, 0x35, 0xb0, 0xf6, 0x02, - 0xb1, 0xe0, 0x1c, 0x27, 0x8f, 0xd1, 0xf1, 0x74, 0xf5, 0x71, 0x7c, 0x13, - 0x9d, 0xea, 0x75, 0xec, 0x19, 0xbc, 0xf7, 0x0c, 0x9e, 0x7a, 0x46, 0x59, - 0x67, 0xdd, 0xb0, 0xd2, 0xae, 0x47, 0x06, 0x93, 0x8f, 0x03, 0x99, 0x4c, - 0x4d, 0xb4, 0xfd, 0x40, 0xb4, 0x0b, 0x13, 0xed, 0x20, 0x10, 0x6d, 0x6a, - 0xa2, 0xbd, 0x1e, 0x88, 0x06, 0x92, 0x1c, 0x95, 0x88, 0xf2, 0xb1, 0x21, - 0xae, 0x7d, 0xe3, 0xd7, 0x01, 0xfe, 0x52, 0x85, 0x85, 0x8b, 0x72, 0xcf, - 0xe0, 0xf2, 0x8d, 0x40, 0x2e, 0x53, 0x13, 0xed, 0xcd, 0x40, 0xb4, 0x0b, - 0x13, 0x6d, 0x18, 0xda, 0x01, 0xa6, 0x16, 0x5e, 0x68, 0x17, 0x00, 0x61, - 0xee, 0x95, 0x08, 0xf3, 0x0d, 0x43, 0x60, 0x6f, 0x9a, 0x5a, 0x6a, 0x29, - 0xed, 0x10, 0xc4, 0xf9, 0x10, 0xc3, 0x21, 0x5a, 0x12, 0x3b, 0xbe, 0xf0, - 0xb8, 0x6a, 0x45, 0x91, 0x55, 0xc6, 0xa7, 0x1d, 0xa4, 0x25, 0x4c, 0xb1, - 0xea, 0x98, 0xb4, 0xd0, 0x0e, 0x65, 0x88, 0xd5, 0x71, 0x68, 0x07, 0xd3, - 0x52, 0xbc, 0xea, 0xd8, 0xb3, 0x83, 0x6b, 0x81, 0x18, 0x60, 0x6e, 0x2b, - 0x04, 0x35, 0x6a, 0x2d, 0xa8, 0x51, 0x6b, 0x49, 0x8d, 0xda, 0x8a, 0x6a, - 0xd4, 0x5a, 0x56, 0xa3, 0x46, 0xc2, 0x2a, 0x91, 0xd5, 0x5e, 0x6b, 0x59, - 0xed, 0xb5, 0x96, 0xd5, 0x5e, 0x5b, 0x59, 0xed, 0xb5, 0x96, 0xd5, 0x5e, - 0xb8, 0xac, 0xfc, 0xce, 0x25, 0x7f, 0x71, 0xb3, 0x91, 0x53, 0x59, 0xf1, - 0x30, 0xe5, 0x9d, 0x13, 0x85, 0xd5, 0x7e, 0x9b, 0x32, 0x24, 0x54, 0x6c, - 0x49, 0x6c, 0xd8, 0x20, 0x97, 0xab, 0xe2, 0x69, 0xcb, 0xbb, 0xfa, 0xc7, - 0x2d, 0x83, 0x42, 0xbb, 0x96, 0x85, 0x72, 0x0d, 0xf2, 0x7e, 0x65, 0xe4, - 0xd1, 0x5a, 0xfe, 0x3c, 0xef, 0x63, 0xd6, 0xf2, 0x07, 0x30, 0x5e, 0xfe, - 0x28, 0x2b, 0xcc, 0x3b, 0xaf, 0x78, 0x60, 0xf3, 0xae, 0xfe, 0x89, 0xcd, - 0xa0, 0x70, 0xa9, 0xa5, 0xe1, 0x51, 0x83, 0xf9, 0xf3, 0xbf, 0xd1, 0x79, - 0x57, 0xff, 0x4a, 0x27, 0x0b, 0x09, 0x6c, 0x5a, 0x1a, 0xc8, 0x34, 0x84, - 0xbf, 0x8a, 0x67, 0x3e, 0xef, 0x2a, 0x1e, 0xfa, 0x0c, 0x99, 0x72, 0xcf, - 0x96, 0x56, 0xe3, 0x2a, 0x5a, 0x81, 0x9c, 0x01, 0x85, 0x5a, 0xce, 0xcc, - 0xb7, 0x42, 0x03, 0x16, 0x03, 0x66, 0xab, 0x4d, 0x09, 0x63, 0xb3, 0xb0, - 0xe5, 0x80, 0xbf, 0xec, 0xad, 0xd1, 0xb0, 0x8b, 0x81, 0x56, 0x3d, 0xfe, - 0x82, 0xf7, 0x4b, 0x19, 0x0b, 0x7f, 0x29, 0x33, 0xac, 0x42, 0xd7, 0x0d, - 0x9e, 0xcd, 0xa4, 0x3f, 0xf3, 0x04, 0xee, 0x76, 0x0a, 0xd5, 0x96, 0x48, - 0xc3, 0x06, 0xbb, 0x5d, 0x09, 0x1a, 0xe0, 0xea, 0x5e, 0x37, 0x85, 0x1f, - 0x35, 0x45, 0xd8, 0xab, 0x42, 0x00, 0x2d, 0x0f, 0x1a, 0x71, 0xc3, 0xdf, - 0xa5, 0xbd, 0xab, 0x78, 0x99, 0xb6, 0xb6, 0x4f, 0x02, 0x8c, 0x57, 0x93, - 0x21, 0x3d, 0xb0, 0x47, 0x96, 0xbd, 0x6b, 0x7b, 0x57, 0xf7, 0xb2, 0x6d, - 0xe3, 0x48, 0x25, 0x2e, 0x9b, 0x44, 0x29, 0xd4, 0xda, 0x52, 0xf8, 0x9c, - 0x70, 0xd3, 0xe1, 0x09, 0xf2, 0x63, 0x50, 0x3a, 0x6a, 0x76, 0x16, 0xdf, - 0xba, 0xf7, 0x1b, 0x1c, 0xe0, 0xae, 0x39, 0x7d, 0xbc, 0xf9, 0x5b, 0x5b, - 0xc0, 0x70, 0xd4, 0xbe, 0x00, 0x71, 0xf7, 0x37, 0x30, 0xe4, 0x56, 0x73, - 0xfa, 0x70, 0xf7, 0xb7, 0xb6, 0x02, 0x07, 0xb0, 0xfb, 0x19, 0xd4, 0x8f, - 0xf0, 0x8d, 0x39, 0x30, 0x30, 0x8d, 0x56, 0x43, 0x61, 0x2d, 0x26, 0x58, - 0x4d, 0x00, 0x5e, 0x1d, 0x73, 0xc3, 0x17, 0x76, 0xec, 0x13, 0x28, 0x6e, - 0x49, 0x04, 0x36, 0x00, 0x3f, 0x95, 0x5e, 0xb2, 0x2a, 0x7e, 0x88, 0xe3, - 0xca, 0xec, 0x6d, 0xb6, 0xeb, 0x2f, 0xcd, 0x7f, 0xe3, 0x80, 0x4e, 0x92, - 0xdd, 0x31, 0x7a, 0x7e, 0xed, 0x50, 0x51, 0xeb, 0xb1, 0x64, 0xce, 0x7f, - 0x12, 0x9c, 0x3a, 0x4a, 0x19, 0x38, 0x09, 0xa0, 0xe4, 0x80, 0x93, 0xff, - 0xf6, 0xd4, 0x9e, 0x79, 0x66, 0xf5, 0xee, 0xc3, 0x27, 0x2e, 0x80, 0xff, - 0x31, 0x95, 0xb2, 0x92, 0xe8, 0x2e, 0x16, 0xfb, 0x8a, 0xfe, 0x05, 0x92, - 0x16, 0x64, 0xf9, 0x13, 0x2c, 0x55, 0x9c, 0x67, 0xf4, 0x84, 0x49, 0xba, - 0x5a, 0x64, 0xe5, 0x80, 0x72, 0x63, 0x86, 0x10, 0x5c, 0x38, 0x99, 0x2f, - 0xaa, 0x40, 0xaf, 0xa1, 0x1e, 0xd5, 0x9c, 0x46, 0x32, 0x50, 0xd8, 0x39, - 0x14, 0x93, 0x5d, 0xc6, 0xf3, 0x17, 0x8c, 0xf1, 0x3f, 0xe8, 0x76, 0x5b, - 0x69, 0x09, 0x3e, 0xac, 0x8a, 0x82, 0xa0, 0x81, 0x4b, 0x49, 0x91, 0xde, - 0xa1, 0x24, 0x68, 0x83, 0xac, 0xf8, 0xe5, 0xdb, 0x77, 0x2a, 0x32, 0x99, - 0x7c, 0x17, 0xb6, 0xf6, 0x60, 0xd6, 0x13, 0x80, 0x4e, 0x26, 0x8b, 0xe4, - 0x17, 0xd8, 0x3d, 0x1c, 0x0c, 0x06, 0x0e, 0x67, 0xea, 0xea, 0x9e, 0x7a, - 0xa0, 0x88, 0x94, 0x9b, 0xd7, 0xc9, 0x07, 0x5c, 0x66, 0x6d, 0x8c, 0xf5, - 0xfa, 0x26, 0x77, 0x2b, 0xa1, 0x60, 0x97, 0x2b, 0x75, 0xd2, 0xfa, 0x53, - 0xf1, 0x7c, 0x26, 0xd8, 0x1c, 0x9f, 0x5a, 0xaa, 0x63, 0x1d, 0xfc, 0xfc, - 0x4c, 0xd3, 0x1b, 0x5d, 0xcd, 0xf6, 0x09, 0x6b, 0xa9, 0x15, 0x71, 0x3f, - 0x7c, 0x14, 0xbd, 0xc7, 0xf1, 0xe8, 0xb0, 0x7e, 0x69, 0xff, 0xe5, 0xd2, - 0x2a, 0xef, 0xe0, 0x33, 0xb5, 0xf8, 0xe7, 0x05, 0x52, 0x1a, 0x25, 0xcf, - 0x0e, 0x54, 0x5d, 0x01, 0x9b, 0xe1, 0x65, 0x47, 0x46, 0x7b, 0xbb, 0x6a, - 0xeb, 0xd8, 0x3d, 0xe5, 0x46, 0xe7, 0x65, 0xc4, 0x9e, 0x30, 0xe9, 0xa0, - 0xbb, 0x05, 0x7c, 0xc2, 0x10, 0x88, 0x74, 0x5a, 0x02, 0x1e, 0xf9, 0x77, - 0x97, 0x0d, 0x62, 0xea, 0xa0, 0xb7, 0x4c, 0x7a, 0x61, 0x0c, 0xc7, 0x81, - 0xa8, 0x90, 0x90, 0x43, 0xc0, 0x95, 0x07, 0xeb, 0xcb, 0xb8, 0xd4, 0x4f, - 0x2d, 0xe6, 0x2b, 0xe2, 0x19, 0xd1, 0x07, 0x9b, 0x74, 0xe1, 0x39, 0x0f, - 0xe0, 0x72, 0xac, 0x8c, 0xbb, 0xf7, 0x64, 0xb9, 0xbc, 0xbc, 0xf8, 0x8c, - 0xaf, 0x92, 0x61, 0x3f, 0xa3, 0xf4, 0x28, 0xa3, 0x4d, 0x45, 0xdf, 0xf3, - 0x6f, 0x1c, 0x83, 0xf6, 0xa1, 0x38, 0x10, 0x10, 0xae, 0x0b, 0x81, 0x00, - 0xe3, 0x7b, 0x1b, 0x34, 0xb0, 0xe5, 0x2d, 0x31, 0xdb, 0xa0, 0xd1, 0x22, - 0x5e, 0x6b, 0xc4, 0x96, 0xbc, 0xe2, 0xfa, 0x5f, 0x5b, 0xbc, 0x96, 0x45, - 0xe2, 0x64, 0xaa, 0x55, 0x99, 0x84, 0x58, 0x5d, 0x28, 0x74, 0x0e, 0x5b, - 0x75, 0xee, 0xed, 0x4e, 0xea, 0x1f, 0xd6, 0x24, 0xf8, 0x34, 0x0f, 0xbb, - 0xd1, 0x06, 0x70, 0x66, 0xa8, 0x53, 0x75, 0x1f, 0x0c, 0x68, 0x94, 0x5f, - 0x07, 0x83, 0x4c, 0xba, 0x09, 0xd6, 0x60, 0x10, 0x90, 0x3d, 0xc7, 0xac, - 0x62, 0x2c, 0xcf, 0x2b, 0xb0, 0x21, 0xfb, 0xf5, 0x57, 0x23, 0x6d, 0x0c, - 0x69, 0xe8, 0xec, 0xc1, 0xb0, 0x63, 0x42, 0xee, 0xbf, 0xde, 0x05, 0x5e, - 0xf8, 0x00, 0xf2, 0xf5, 0xc9, 0xd3, 0x2f, 0x3e, 0x63, 0xd0, 0xcd, 0x3f, - 0xfb, 0xe2, 0xfd, 0x0f, 0xac, 0x57, 0xb6, 0x2a, 0xaf, 0x0b, 0x8a, 0xde, - 0xed, 0xbf, 0x21, 0x2d, 0xf0, 0x1f, 0xfc, 0x92, 0x34, 0x27, 0xdb, 0xe8, - 0xce, 0x5c, 0xd8, 0x7b, 0x2b, 0x1c, 0x06, 0x98, 0x73, 0x11, 0x8d, 0x65, - 0x02, 0x99, 0xd8, 0xe8, 0x0e, 0xab, 0xbf, 0xc9, 0xde, 0xe6, 0x7b, 0x4b, - 0xf5, 0x27, 0x14, 0x1f, 0xc8, 0x6d, 0x80, 0xe2, 0x25, 0x29, 0xa5, 0x20, - 0xfb, 0x07, 0xc0, 0x02, 0xdd, 0x9b, 0xfb, 0xfa, 0xe9, 0x17, 0x5f, 0x7e, - 0xfa, 0xee, 0xf7, 0xa6, 0xbc, 0xa5, 0x5d, 0x46, 0x70, 0x71, 0x0b, 0x39, - 0xa2, 0x21, 0xd2, 0xb2, 0xfa, 0xa5, 0x06, 0x1c, 0x7c, 0xb0, 0x52, 0x58, - 0x7e, 0xd8, 0x44, 0x01, 0x57, 0x53, 0xa6, 0x33, 0x01, 0x65, 0x94, 0xd5, - 0xda, 0x90, 0xbf, 0x96, 0xaf, 0xf3, 0x5a, 0x72, 0x6d, 0x7f, 0xf6, 0xed, - 0x09, 0x47, 0x7b, 0x3e, 0x65, 0xf7, 0xe9, 0xa3, 0xd4, 0xfc, 0x66, 0xfa, - 0xa1, 0x34, 0xae, 0x9d, 0xa6, 0x9a, 0x5d, 0x4f, 0x80, 0xd4, 0x76, 0xbe, - 0x56, 0x1d, 0x50, 0xeb, 0x18, 0x01, 0xdd, 0x90, 0xda, 0xe5, 0xbf, 0xa9, - 0x51, 0x6f, 0x70, 0x8d, 0x7a, 0xfa, 0xcd, 0xbf, 0xa6, 0x7a, 0x08, 0x1c, - 0x5e, 0xbf, 0x37, 0xc5, 0x08, 0xf1, 0xc1, 0x70, 0xb0, 0x37, 0xfc, 0xd7, - 0xd4, 0xb1, 0x49, 0x13, 0x1e, 0xec, 0x8a, 0x2a, 0x7e, 0x98, 0xa4, 0xf1, - 0x68, 0x77, 0x38, 0xfa, 0xd7, 0xd4, 0x92, 0x03, 0xd7, 0x3e, 0xcb, 0xfd, - 0xdc, 0x35, 0x40, 0xe0, 0xbf, 0xac, 0x0a, 0xce, 0x23, 0xd5, 0x66, 0x6b, - 0xed, 0x36, 0xba, 0xef, 0xdf, 0x59, 0x9d, 0x9f, 0x37, 0x8a, 0x5e, 0xa4, - 0x86, 0xca, 0x56, 0x12, 0x6c, 0xaa, 0x07, 0xae, 0x20, 0x1b, 0x20, 0x54, - 0x28, 0xbd, 0xeb, 0xe6, 0xba, 0xa5, 0xb8, 0x53, 0xab, 0x80, 0x88, 0x66, - 0x6d, 0x1c, 0x75, 0x8e, 0x59, 0xea, 0xa9, 0xbb, 0x8c, 0xaa, 0xda, 0xb5, - 0xe0, 0x13, 0xf0, 0xda, 0x4d, 0xb8, 0x08, 0xb1, 0x29, 0x97, 0x9a, 0x46, - 0x78, 0x27, 0xa9, 0x57, 0xc6, 0x4d, 0x64, 0x37, 0xa2, 0x05, 0x98, 0x1d, - 0xd4, 0xf1, 0x90, 0x07, 0xe1, 0xf1, 0xc9, 0xf7, 0x30, 0x47, 0x51, 0x62, - 0xb8, 0xf5, 0xa8, 0x08, 0xf5, 0x10, 0xe7, 0x54, 0x19, 0x42, 0x7e, 0x86, - 0xc5, 0xdd, 0x29, 0x6f, 0x15, 0xa4, 0x32, 0x8d, 0xc1, 0x3b, 0xc8, 0xf0, - 0x42, 0xc8, 0x45, 0x9c, 0x16, 0x40, 0x3a, 0x3b, 0xe6, 0xc1, 0xe8, 0xa1, - 0xe9, 0x41, 0x1b, 0x79, 0x02, 0x1b, 0x20, 0xfc, 0x46, 0x0b, 0xdc, 0xd0, - 0x0f, 0xa1, 0x7f, 0xc2, 0x4a, 0xb2, 0x58, 0x63, 0xcb, 0x0c, 0xef, 0x55, - 0x96, 0x8e, 0xe6, 0x80, 0x3a, 0xb8, 0xe2, 0xc2, 0xe5, 0x63, 0xd7, 0xb5, - 0x2d, 0xf0, 0x51, 0xbb, 0x9e, 0x59, 0x5c, 0x75, 0xa2, 0x0b, 0xdc, 0xa2, - 0x40, 0x92, 0x9a, 0x25, 0x33, 0xd2, 0x1a, 0x9c, 0x2f, 0x5a, 0x78, 0xef, - 0x00, 0x9e, 0x79, 0x54, 0xd6, 0x8b, 0xae, 0x0e, 0x5a, 0x7b, 0x68, 0xbc, - 0x0c, 0x34, 0x9c, 0x23, 0xe0, 0x3e, 0x2a, 0x64, 0x6a, 0x38, 0x81, 0xe0, - 0x13, 0x6c, 0x45, 0x29, 0x2f, 0x62, 0x29, 0xea, 0xf0, 0x9d, 0xbd, 0xa1, - 0xd8, 0x73, 0x8e, 0x1e, 0x39, 0x29, 0x17, 0x4e, 0xca, 0xf4, 0xac, 0xab, - 0x59, 0xa2, 0xe0, 0xc3, 0x62, 0x8a, 0xa7, 0x1a, 0xa6, 0x46, 0x2e, 0x57, - 0x6e, 0xd2, 0x85, 0x9b, 0x34, 0x1d, 0x85, 0x32, 0xb6, 0x57, 0xc2, 0x58, - 0x1d, 0x67, 0x7b, 0x2e, 0x67, 0x6e, 0xd2, 0x85, 0x9b, 0x34, 0xdd, 0x33, - 0x38, 0xbb, 0xc7, 0x4f, 0x1e, 0x0b, 0xc4, 0x78, 0x2a, 0xff, 0x58, 0x46, - 0x03, 0xa1, 0x3b, 0x3b, 0x93, 0xe5, 0xcf, 0x93, 0xaa, 0x69, 0xc2, 0x23, - 0x5e, 0x27, 0x7a, 0xe4, 0xe1, 0x19, 0x87, 0xa6, 0x18, 0x72, 0xe2, 0xc2, - 0x0f, 0xc6, 0xa8, 0x05, 0x6c, 0x9e, 0x81, 0xb8, 0xc7, 0x3c, 0x2d, 0x7a, - 0x34, 0x9a, 0x13, 0x9c, 0x11, 0xf3, 0xe1, 0x6a, 0xbd, 0x5a, 0x02, 0x61, - 0x5e, 0xef, 0x59, 0x21, 0x9e, 0x34, 0xce, 0x37, 0xe9, 0x92, 0x45, 0x9d, - 0x5d, 0x14, 0x0c, 0xb7, 0x14, 0x90, 0x3d, 0xc8, 0x57, 0x27, 0x79, 0x0a, - 0x36, 0x2d, 0x82, 0x40, 0xb1, 0x30, 0x02, 0x2f, 0x12, 0x98, 0xfa, 0xf4, - 0x47, 0x98, 0xfe, 0xf5, 0x7a, 0x0d, 0x1b, 0x2d, 0x93, 0x2c, 0x8e, 0x1c, - 0x33, 0xa4, 0x04, 0x0b, 0x5f, 0x9c, 0x22, 0x14, 0x0f, 0x12, 0x04, 0x36, - 0xcb, 0xba, 0x50, 0xaa, 0x27, 0x63, 0x58, 0x96, 0x31, 0x2a, 0xcb, 0x80, - 0x06, 0x70, 0xf9, 0x59, 0x2d, 0x4f, 0xc8, 0x4c, 0x50, 0x1b, 0xf0, 0xb0, - 0x76, 0x46, 0x37, 0x7b, 0xc1, 0xb3, 0x14, 0x69, 0x84, 0xc6, 0x59, 0xaf, - 0xa4, 0xd1, 0x25, 0xe4, 0xc1, 0x3a, 0xa5, 0xcf, 0xf7, 0xe3, 0xf3, 0xc9, - 0x66, 0x91, 0x93, 0x04, 0x14, 0x35, 0x0e, 0xa2, 0x5e, 0x15, 0xc9, 0x57, - 0x9b, 0xd9, 0x25, 0xbe, 0x7f, 0xaa, 0x4c, 0x9c, 0xa4, 0x4b, 0x81, 0x08, - 0x05, 0xfc, 0x24, 0x85, 0xb6, 0x53, 0x76, 0x0e, 0xcb, 0x84, 0x4c, 0xcb, - 0x4d, 0xba, 0x39, 0x64, 0x9f, 0x4d, 0xf2, 0xcb, 0x01, 0x39, 0x40, 0x91, - 0x8e, 0xf9, 0x14, 0x4b, 0xa1, 0x8d, 0xc7, 0xc1, 0x1a, 0x26, 0xb7, 0xdf, - 0xb1, 0x3e, 0x50, 0x1f, 0x80, 0x61, 0x05, 0xd3, 0xf2, 0x69, 0x7c, 0x9e, - 0x77, 0x7b, 0x26, 0xa5, 0xdb, 0x50, 0x4a, 0xdf, 0x2b, 0x4a, 0x98, 0xb7, - 0xee, 0x6a, 0xa6, 0x58, 0xaa, 0x7a, 0x79, 0xe5, 0x29, 0x9c, 0x15, 0x56, - 0xbc, 0x45, 0xc5, 0x78, 0x91, 0xdf, 0x85, 0x70, 0xce, 0x41, 0xbf, 0xf7, - 0xf3, 0xa6, 0xda, 0x51, 0x04, 0x42, 0x15, 0xdd, 0x86, 0x7a, 0xda, 0x93, - 0x2b, 0xa8, 0xe3, 0xfb, 0xd0, 0xfe, 0x11, 0xf0, 0x35, 0xb8, 0xe9, 0x31, - 0xfc, 0xb8, 0x85, 0xbb, 0x65, 0xf0, 0x5f, 0x97, 0x2e, 0x61, 0x21, 0x21, - 0x15, 0xd1, 0xf9, 0x99, 0xa0, 0xa1, 0x94, 0x9c, 0x12, 0xac, 0x38, 0x98, - 0x64, 0x80, 0xfc, 0xf6, 0x9b, 0xc2, 0x1e, 0x61, 0xbc, 0x23, 0x33, 0x93, - 0xe3, 0x5b, 0x06, 0xe5, 0xb4, 0x03, 0x25, 0x42, 0x8f, 0x14, 0x24, 0xcf, - 0xd8, 0x58, 0xb1, 0x50, 0x82, 0x90, 0x9a, 0xe0, 0xea, 0xf6, 0x83, 0x17, - 0xfa, 0xc2, 0x07, 0x3d, 0x2c, 0x83, 0x9e, 0xfa, 0xa0, 0x47, 0x65, 0xd0, - 0xd7, 0x1a, 0xb4, 0x1a, 0xc3, 0xd5, 0x79, 0x58, 0x93, 0x3b, 0xeb, 0xc8, - 0xab, 0xcb, 0x8c, 0x3a, 0xd5, 0xea, 0x16, 0xed, 0x9e, 0xe5, 0x71, 0xb7, - 0x52, 0xb1, 0x85, 0x2a, 0xb7, 0x89, 0xfd, 0x1b, 0xbe, 0xde, 0xad, 0x67, - 0x6b, 0xc3, 0xc3, 0x7d, 0x6e, 0xc7, 0x30, 0x2f, 0x42, 0xdb, 0x8c, 0x4e, - 0x20, 0x35, 0x90, 0x6e, 0xe8, 0x7e, 0x85, 0x21, 0x14, 0x76, 0x7b, 0x0c, - 0xfe, 0x13, 0x66, 0xfc, 0x3a, 0x99, 0xe7, 0x97, 0xc5, 0xaf, 0xcb, 0x18, - 0xfd, 0x06, 0x6d, 0x60, 0x91, 0xb4, 0x43, 0x1e, 0x33, 0xd2, 0x4b, 0x25, - 0x36, 0x29, 0x1d, 0xaa, 0xe1, 0x3a, 0x6e, 0x0a, 0xe8, 0x5b, 0x1c, 0x6c, - 0x22, 0xad, 0xc4, 0xa2, 0xd0, 0x9d, 0x57, 0x5f, 0x15, 0xa0, 0xaf, 0xb2, - 0xf7, 0x01, 0x32, 0x13, 0x9d, 0x0a, 0x47, 0x09, 0x99, 0xb1, 0xa3, 0x64, - 0xa3, 0x51, 0x33, 0x2c, 0xea, 0x2c, 0x86, 0xfa, 0xa7, 0xdf, 0xb1, 0xb1, - 0x51, 0x63, 0xb6, 0xc3, 0x46, 0x47, 0x36, 0xd0, 0xf7, 0x00, 0x64, 0x08, - 0x42, 0x42, 0xb9, 0xf7, 0x18, 0x05, 0xd5, 0x9e, 0xc4, 0x0c, 0x92, 0x27, - 0x96, 0x44, 0xd7, 0xc4, 0xbf, 0x82, 0x8d, 0xd7, 0x4d, 0xe6, 0xb2, 0xf4, - 0x78, 0xb0, 0xaf, 0x81, 0xc2, 0xce, 0xab, 0x06, 0x1a, 0x19, 0xb0, 0x7d, - 0x36, 0xdc, 0xed, 0x9a, 0xec, 0x11, 0x38, 0x9b, 0xae, 0x52, 0x50, 0x38, - 0x4c, 0x54, 0x4d, 0x3f, 0x8d, 0x2f, 0x92, 0xe5, 0x97, 0x60, 0xc9, 0xa2, - 0xae, 0x0d, 0xce, 0xdb, 0xce, 0x04, 0x9f, 0xa4, 0x33, 0xb7, 0x7e, 0x3a, - 0x37, 0xa4, 0x3f, 0x23, 0x68, 0x16, 0xb2, 0x8e, 0x5f, 0x3e, 0xe9, 0xf1, - 0xfd, 0x4f, 0x45, 0x9c, 0xda, 0x02, 0x6f, 0xbf, 0x1a, 0x4c, 0x1d, 0xb2, - 0x08, 0xcc, 0x60, 0x46, 0x99, 0x4b, 0x36, 0x21, 0xab, 0x8a, 0x40, 0x82, - 0x89, 0x17, 0xba, 0x26, 0x1b, 0x8b, 0x64, 0x19, 0x7f, 0x4b, 0x95, 0x1d, - 0xb3, 0xc7, 0x47, 0x66, 0x1e, 0xbf, 0xbd, 0x7f, 0x82, 0xf3, 0x74, 0xc8, - 0xed, 0xbc, 0xb8, 0x4b, 0x7f, 0x1d, 0x2f, 0x54, 0xd4, 0xb5, 0x92, 0xe9, - 0x8a, 0x7b, 0x21, 0x8e, 0x82, 0xe7, 0xf3, 0x64, 0xb1, 0xe0, 0x41, 0xdf, - 0xa6, 0xf1, 0x64, 0x93, 0x27, 0xe7, 0x9b, 0x85, 0x8c, 0xb5, 0x2b, 0x41, - 0xf2, 0xc9, 0x8f, 0xf1, 0x92, 0xee, 0xde, 0xd2, 0xd9, 0x9c, 0x43, 0x76, - 0x99, 0xe7, 0x6b, 0x88, 0xda, 0x94, 0xe5, 0xb0, 0x56, 0x00, 0xe3, 0x6e, - 0x7a, 0xbe, 0x58, 0x5d, 0x83, 0x55, 0xba, 0xda, 0xf9, 0x69, 0x13, 0x67, - 0xb4, 0x71, 0xba, 0x33, 0x7c, 0x63, 0x74, 0xb0, 0xff, 0xc6, 0xee, 0xe3, - 0x9d, 0xe9, 0x26, 0x59, 0xe0, 0x7e, 0x7b, 0x7f, 0xd2, 0x27, 0xb2, 0x7d, - 0xf2, 0xb3, 0xfa, 0xc9, 0xb2, 0x7f, 0x99, 0x5f, 0x2d, 0xf6, 0xad, 0x77, - 0xef, 0xc0, 0x38, 0x2c, 0xb8, 0x89, 0x11, 0x5f, 0xdf, 0x02, 0x27, 0xf3, - 0xa0, 0xf8, 0xf5, 0x9a, 0xe5, 0x9f, 0xab, 0x67, 0x90, 0xdf, 0x15, 0x88, - 0x11, 0x07, 0xec, 0x83, 0xcf, 0xac, 0x5a, 0x0a, 0x34, 0x66, 0xf8, 0x86, - 0x1d, 0x7d, 0x1f, 0x3c, 0x55, 0x89, 0x44, 0x38, 0xa5, 0xe0, 0x7e, 0x8d, - 0x72, 0x73, 0xd1, 0x05, 0x79, 0xba, 0x72, 0x74, 0x48, 0x82, 0xda, 0xba, - 0x66, 0x0e, 0xba, 0x12, 0xcb, 0x4d, 0x05, 0x12, 0x66, 0xaa, 0xae, 0x93, - 0x56, 0x8e, 0x12, 0x85, 0x95, 0x01, 0x95, 0xf5, 0x25, 0x93, 0x02, 0xab, - 0x24, 0xc5, 0xaa, 0x5f, 0x6d, 0xdc, 0x5c, 0xd4, 0x9e, 0x42, 0x1f, 0x2f, - 0xb3, 0x45, 0x04, 0x63, 0x92, 0x6c, 0x2b, 0xdc, 0xf7, 0xc6, 0xc0, 0x15, - 0x78, 0x20, 0xe1, 0xe5, 0x6e, 0xa7, 0x04, 0x3b, 0x0a, 0x2b, 0xf4, 0x5e, - 0xa9, 0x2c, 0x1a, 0x93, 0x26, 0x5d, 0x3e, 0xbf, 0x4c, 0xb2, 0x41, 0x75, - 0x2f, 0x4f, 0xb9, 0x30, 0x75, 0xf9, 0x29, 0x91, 0x01, 0xf5, 0x0d, 0xc2, - 0x1d, 0x2f, 0xe0, 0x12, 0xfa, 0x75, 0x82, 0x3d, 0x3e, 0xc4, 0x72, 0x00, - 0x97, 0xe1, 0x96, 0x03, 0x25, 0x81, 0x46, 0x41, 0xa0, 0x2b, 0x6b, 0x78, - 0x75, 0xfb, 0xec, 0x02, 0xb9, 0x83, 0x64, 0xe5, 0x57, 0x89, 0x67, 0x1e, - 0x3f, 0x05, 0x53, 0x31, 0x49, 0x3f, 0xe2, 0xd9, 0x72, 0x80, 0x1b, 0xbe, - 0x8e, 0x9f, 0x92, 0xb4, 0x42, 0xa7, 0x97, 0x7c, 0xf8, 0xd5, 0xae, 0x7c, - 0xb5, 0x46, 0x60, 0xd8, 0x8f, 0xc6, 0x47, 0x70, 0x6a, 0x41, 0xc1, 0x53, - 0x93, 0xfb, 0xcf, 0x64, 0x38, 0x4a, 0xda, 0x5f, 0x27, 0x70, 0x54, 0x0a, - 0x25, 0x49, 0x01, 0x84, 0x57, 0x13, 0x1c, 0x5b, 0x2a, 0x5a, 0x1b, 0xcd, - 0x62, 0xb9, 0xa1, 0x1c, 0x6d, 0xcf, 0x50, 0xd6, 0x0e, 0xcc, 0xdc, 0x8c, - 0xfb, 0x87, 0x66, 0xe5, 0x0d, 0x48, 0xa3, 0xb5, 0x88, 0x73, 0xa1, 0x6d, - 0xbe, 0xa1, 0x59, 0xc1, 0x24, 0xe8, 0x36, 0x3b, 0x2d, 0xae, 0x9c, 0x69, - 0xd0, 0xa6, 0x42, 0x6b, 0xd5, 0xf7, 0xae, 0xa2, 0x40, 0xee, 0x2f, 0x10, - 0x20, 0x42, 0xd2, 0xcf, 0xd6, 0xac, 0x2d, 0x82, 0xdc, 0x40, 0x7e, 0x9f, - 0x63, 0x1e, 0xc1, 0x8f, 0xb7, 0x58, 0xf1, 0xdd, 0xdc, 0x7f, 0x57, 0x18, - 0xb7, 0x3a, 0xc6, 0xad, 0x86, 0x71, 0x6b, 0x61, 0x48, 0x2e, 0x4e, 0x53, - 0xf0, 0xf8, 0x2f, 0x13, 0x74, 0x50, 0x6f, 0x6e, 0x47, 0xeb, 0xd5, 0x62, - 0x92, 0x46, 0x30, 0x09, 0xb8, 0x45, 0x4e, 0x3d, 0x91, 0x10, 0xd8, 0xdb, - 0x82, 0xa2, 0x22, 0x66, 0x45, 0x7d, 0xfe, 0x31, 0x59, 0x53, 0x98, 0x67, - 0xa0, 0x72, 0xdb, 0x05, 0xf1, 0x80, 0x15, 0x48, 0x96, 0x20, 0x9a, 0x0c, - 0x94, 0x65, 0x92, 0xc3, 0xf8, 0x4a, 0xa3, 0x6f, 0x96, 0xcc, 0xe1, 0xf3, - 0x5c, 0x1b, 0x67, 0xbd, 0x07, 0xdb, 0xc0, 0xb5, 0xdb, 0x78, 0x0e, 0x30, - 0xb9, 0xd5, 0x98, 0xd3, 0x1d, 0x0f, 0x60, 0x6d, 0x04, 0xdf, 0x22, 0xa8, - 0x90, 0xc3, 0x3f, 0xad, 0xc7, 0x25, 0x17, 0x1b, 0x5e, 0x3e, 0x15, 0x4c, - 0xd6, 0x04, 0x8f, 0x9a, 0xd1, 0x22, 0x25, 0x67, 0x27, 0xc9, 0xd8, 0x3a, - 0xb9, 0x89, 0x17, 0x90, 0x46, 0x30, 0xd4, 0x3c, 0xbc, 0xad, 0x28, 0x20, - 0xcf, 0xc0, 0x2d, 0x3b, 0x5d, 0x5d, 0x7f, 0xca, 0xcf, 0x9d, 0x8e, 0xb5, - 0xa6, 0x3e, 0x72, 0x01, 0x27, 0xf3, 0x1f, 0x36, 0x59, 0x1e, 0xcf, 0xc1, - 0xeb, 0x83, 0xd6, 0x7c, 0x4d, 0x02, 0x0a, 0x27, 0x0e, 0xc6, 0x69, 0x68, - 0x71, 0x3e, 0x8c, 0x9f, 0xf6, 0xf7, 0x29, 0xa8, 0xeb, 0x19, 0x86, 0xd4, - 0x39, 0xdd, 0x45, 0x3b, 0x0d, 0xdf, 0x23, 0x60, 0x48, 0x97, 0x28, 0x70, - 0xec, 0xe5, 0xb1, 0x5b, 0x5e, 0x34, 0xfa, 0x92, 0xb7, 0xfe, 0xa2, 0x6f, - 0xb7, 0x54, 0x34, 0x89, 0x53, 0x79, 0x4c, 0x58, 0x64, 0x0c, 0xcb, 0xc8, - 0x42, 0xcc, 0x69, 0xfc, 0xd3, 0x26, 0x49, 0x81, 0xe0, 0x63, 0x96, 0x2d, - 0x56, 0x79, 0x26, 0xe5, 0xae, 0x48, 0xba, 0x14, 0xa9, 0xb9, 0xc8, 0x97, - 0x90, 0x02, 0x85, 0x1a, 0x45, 0xaa, 0x8a, 0xaf, 0xaa, 0x26, 0xe9, 0xa2, - 0x97, 0xa1, 0x38, 0x38, 0xf2, 0xe9, 0xce, 0x25, 0x4d, 0x9a, 0x40, 0x6f, - 0x3c, 0x4d, 0x96, 0x4d, 0x60, 0xd1, 0x66, 0x22, 0x22, 0xb9, 0xa5, 0x6c, - 0xa7, 0xbc, 0x71, 0xe5, 0xe4, 0x6b, 0x38, 0xd8, 0xf5, 0x96, 0x72, 0x0a, - 0x93, 0xa4, 0x1e, 0x9f, 0xe1, 0xf5, 0x68, 0x2e, 0x47, 0x93, 0xd9, 0xec, - 0xe7, 0x11, 0xcc, 0xa3, 0x23, 0x60, 0xa1, 0xa7, 0x95, 0xd5, 0xe3, 0xd4, - 0xba, 0x3e, 0x1d, 0x5a, 0xac, 0x2f, 0x27, 0xa8, 0x68, 0xfb, 0xfb, 0x76, - 0x31, 0x24, 0xb3, 0x53, 0x12, 0x0e, 0xd2, 0x86, 0xf2, 0x8e, 0xca, 0xf2, - 0x41, 0x5e, 0x43, 0x80, 0xe1, 0xec, 0x54, 0x41, 0x8d, 0x00, 0x8a, 0xb8, - 0xad, 0x02, 0xda, 0x03, 0x20, 0xce, 0x58, 0xd9, 0x32, 0xb5, 0x39, 0xc6, - 0xaf, 0x37, 0xda, 0xaa, 0x03, 0x69, 0x10, 0x8d, 0x8c, 0xbb, 0xd6, 0xa2, - 0xb0, 0x69, 0x90, 0x4c, 0x0b, 0x0d, 0x05, 0xd2, 0x58, 0x9d, 0xfd, 0x94, - 0xe6, 0xd1, 0x0d, 0xb4, 0x31, 0xf2, 0x71, 0x0b, 0x9f, 0xb7, 0xba, 0x89, - 0x05, 0x3b, 0x20, 0x01, 0xa1, 0xa8, 0xe5, 0x28, 0x82, 0x75, 0x8d, 0x1b, - 0x02, 0x50, 0xeb, 0x71, 0xd2, 0x00, 0x5a, 0x65, 0x4b, 0x53, 0x02, 0x9f, - 0x7a, 0x30, 0x60, 0xf8, 0x09, 0xea, 0x07, 0x9d, 0xe4, 0x8f, 0xdf, 0x7b, - 0xec, 0x8f, 0xdf, 0xcf, 0x20, 0x01, 0xa6, 0xcb, 0x32, 0x5b, 0xd2, 0x04, - 0x44, 0x10, 0x2c, 0x01, 0x42, 0xbd, 0xc0, 0x3f, 0x56, 0x70, 0xaa, 0xe0, - 0x08, 0x69, 0x03, 0xd7, 0xc2, 0xe7, 0xc0, 0x69, 0x53, 0xa4, 0xf9, 0x20, - 0xa4, 0xb9, 0x80, 0x6a, 0xf1, 0x55, 0xad, 0x31, 0x86, 0x90, 0x66, 0x97, - 0xd0, 0x9f, 0x41, 0x57, 0x78, 0x16, 0x50, 0x53, 0xe0, 0x9a, 0x8c, 0x80, - 0xd0, 0x10, 0x60, 0xe0, 0x03, 0x18, 0x80, 0xe2, 0x54, 0x0e, 0x74, 0x31, - 0x41, 0x03, 0x70, 0xa3, 0x21, 0xeb, 0x0b, 0x49, 0x4e, 0xb3, 0x28, 0x22, - 0xac, 0x97, 0xd1, 0x89, 0xef, 0x83, 0xc7, 0xaf, 0xcb, 0x3c, 0x1d, 0x82, - 0x96, 0xc3, 0xff, 0xd3, 0xa1, 0xb1, 0x28, 0x48, 0x08, 0x6f, 0xc3, 0xc4, - 0x01, 0xce, 0x70, 0x51, 0x99, 0x6e, 0x7c, 0xcb, 0xe8, 0x54, 0xe1, 0xa2, - 0x46, 0x9d, 0xf2, 0xc2, 0xa1, 0xc9, 0x40, 0x37, 0xce, 0xcc, 0xf9, 0xba, - 0x41, 0x73, 0xa8, 0xd3, 0x1c, 0x55, 0xd3, 0x04, 0x5a, 0x82, 0x6c, 0x35, - 0xcd, 0x91, 0x4e, 0x73, 0xaf, 0x9a, 0xe6, 0xae, 0xa2, 0x79, 0x53, 0x45, - 0x73, 0x4f, 0xa7, 0xf9, 0xb8, 0x96, 0x66, 0xc1, 0x6a, 0x15, 0xcd, 0xc7, - 0x3a, 0xcd, 0xfd, 0xda, 0xba, 0xef, 0x86, 0xd0, 0xdc, 0xd7, 0x69, 0x1e, - 0x84, 0xb5, 0xd1, 0xae, 0xaa, 0x3b, 0x75, 0x7a, 0xa5, 0x10, 0x57, 0x85, - 0x06, 0xf6, 0x45, 0xd9, 0x04, 0xa5, 0xdc, 0x8f, 0x0b, 0x20, 0x46, 0xb4, - 0x28, 0x36, 0xd6, 0x15, 0x24, 0x88, 0xcf, 0x29, 0x7d, 0x9e, 0x69, 0x5e, - 0xa7, 0xbc, 0xb6, 0x90, 0xf6, 0x2e, 0x7a, 0x53, 0xa2, 0x2a, 0x63, 0x5a, - 0x81, 0xc0, 0x86, 0x72, 0xc8, 0x02, 0xdb, 0x78, 0x66, 0xf6, 0x71, 0x48, - 0x01, 0x1d, 0x86, 0xb2, 0xf8, 0x97, 0x0b, 0xf1, 0x05, 0xca, 0x75, 0xd6, - 0xca, 0xe9, 0x3e, 0xd4, 0x02, 0xc6, 0xb8, 0x08, 0x03, 0x9a, 0xea, 0xeb, - 0x58, 0x94, 0x30, 0xc0, 0x7f, 0x9e, 0xca, 0x45, 0x26, 0x6a, 0x51, 0x4a, - 0xa6, 0xf1, 0x2a, 0x59, 0x16, 0x21, 0xbc, 0x06, 0x66, 0x4c, 0x7f, 0x05, - 0x54, 0x1e, 0x87, 0xef, 0xb4, 0x80, 0x39, 0x93, 0x72, 0xac, 0x2a, 0x9b, - 0xb4, 0xbe, 0x48, 0xa6, 0x83, 0x4b, 0x74, 0xe3, 0xe6, 0xe4, 0xf8, 0xab, - 0x27, 0x5f, 0x3e, 0xc5, 0x75, 0xaf, 0xea, 0x00, 0xff, 0x84, 0x3a, 0xc3, - 0x17, 0xe0, 0xf1, 0xfa, 0x60, 0x75, 0xa8, 0x7f, 0x25, 0x14, 0x0b, 0x0b, - 0x0e, 0x7d, 0xfa, 0xce, 0x3d, 0x90, 0x50, 0xe5, 0x7e, 0x8e, 0xfb, 0xc8, - 0x43, 0xe7, 0xfd, 0x2f, 0x3e, 0xa3, 0x5d, 0x1a, 0x48, 0x5b, 0x4d, 0xe6, - 0xf1, 0x1c, 0x66, 0xa2, 0xb2, 0x01, 0x8a, 0xed, 0x09, 0xd5, 0xe6, 0x50, - 0x10, 0xb6, 0x6c, 0xba, 0x59, 0xb2, 0x2c, 0x59, 0xce, 0x62, 0x06, 0xe8, - 0x18, 0x83, 0x70, 0x41, 0xb8, 0xf4, 0xb0, 0x48, 0x8a, 0xe1, 0x0b, 0xc5, - 0x22, 0x6a, 0x9c, 0xd3, 0x75, 0x25, 0x39, 0x6f, 0xa0, 0x3c, 0x79, 0xae, - 0xbe, 0x22, 0x68, 0xac, 0x19, 0x8e, 0x52, 0x96, 0x6e, 0x04, 0x9a, 0x2c, - 0x0a, 0xe0, 0x37, 0xf9, 0x25, 0xa6, 0x39, 0x4f, 0x80, 0x3e, 0x29, 0x5f, - 0x12, 0x34, 0xd7, 0xdb, 0x54, 0x4e, 0xe9, 0x0b, 0xe5, 0xc6, 0x75, 0xa1, - 0xb7, 0x76, 0xb2, 0x59, 0x9a, 0xac, 0xf3, 0xb7, 0x21, 0x89, 0x7e, 0x4e, - 0x57, 0xf3, 0x5b, 0xf8, 0xf1, 0xd6, 0x0e, 0xae, 0xcc, 0xc0, 0x97, 0x3f, - 0x01, 0xcc, 0x51, 0xfd, 0x86, 0x46, 0xa5, 0x01, 0x00 + 0x59, 0xdd, 0x4a, 0x56, 0xde, 0x77, 0x10, 0xa4, 0xb8, 0xbc, 0xd4, 0x94, + 0xdc, 0xed, 0x5b, 0x2a, 0xa5, 0x48, 0x2d, 0x97, 0xb9, 0xc4, 0xd5, 0x97, + 0x4a, 0x2e, 0xac, 0xb3, 0x61, 0x55, 0xa0, 0xe1, 0xd7, 0x46, 0x7c, 0x54, + 0xa6, 0x17, 0xa4, 0x1c, 0x9d, 0x6e, 0xf3, 0x43, 0xe7, 0xee, 0xe4, 0x23, + 0x1e, 0x82, 0x88, 0xd9, 0xb6, 0xfe, 0xec, 0xe3, 0x40, 0x5b, 0xae, 0x77, + 0xa7, 0x53, 0x5e, 0xcf, 0xdd, 0x87, 0xac, 0xa7, 0x56, 0x2f, 0xef, 0x3c, + 0x74, 0x71, 0x35, 0x49, 0x96, 0xb5, 0xe7, 0x28, 0xfa, 0x08, 0x25, 0x35, + 0x5c, 0x62, 0xb9, 0x56, 0x52, 0x7b, 0x15, 0x45, 0x07, 0x6d, 0xb4, 0x82, + 0xe6, 0x23, 0x06, 0x65, 0x68, 0x65, 0x3a, 0x3b, 0xe3, 0x97, 0xf1, 0x0d, + 0x81, 0x55, 0xb1, 0xa2, 0xa0, 0x6f, 0x93, 0x9f, 0xd0, 0x94, 0x44, 0x74, + 0xa2, 0xfa, 0x09, 0x0c, 0xbf, 0x12, 0x5d, 0x1c, 0x84, 0x8b, 0x86, 0xbd, + 0x51, 0xb7, 0x37, 0x3c, 0xe8, 0xbe, 0x3a, 0x7a, 0xf3, 0xcd, 0xee, 0x6b, + 0xe5, 0x70, 0x7b, 0x12, 0x6e, 0xff, 0x8d, 0xd7, 0xab, 0xe0, 0xf6, 0x25, + 0xdc, 0x70, 0xf8, 0xb8, 0xdb, 0xdd, 0x19, 0xc2, 0x39, 0xaf, 0x90, 0x30, + 0xd8, 0xf9, 0x6a, 0xb5, 0x98, 0x4e, 0x1a, 0x74, 0x1e, 0x2a, 0x34, 0x84, + 0xf2, 0xf9, 0x6a, 0x95, 0xc7, 0xdb, 0x20, 0x6c, 0xb3, 0x2c, 0x5b, 0x25, + 0x02, 0x99, 0x53, 0xb4, 0xe1, 0xd1, 0x3e, 0xda, 0xec, 0x47, 0x2f, 0x0e, + 0x87, 0xc3, 0x47, 0xec, 0x10, 0xbe, 0x7c, 0xf0, 0xc1, 0x07, 0x8f, 0x42, + 0x28, 0x13, 0xcb, 0xdb, 0x23, 0x4c, 0xf7, 0x58, 0xda, 0x51, 0xb7, 0xfb, + 0x13, 0xbe, 0x17, 0x54, 0xdf, 0x9f, 0x10, 0x4a, 0xf6, 0x27, 0x89, 0x55, + 0xd6, 0x9f, 0x30, 0x4f, 0x87, 0x6c, 0xb4, 0xc4, 0xe3, 0xd2, 0x02, 0xee, + 0xcc, 0x12, 0x43, 0xc4, 0x44, 0x07, 0x6f, 0x6d, 0x01, 0xf9, 0x88, 0x97, + 0x48, 0x05, 0x75, 0xac, 0x5e, 0x2a, 0x08, 0x25, 0xa5, 0x22, 0xb1, 0xca, + 0xa4, 0x82, 0x79, 0x26, 0x64, 0x7b, 0xa9, 0x70, 0xee, 0x24, 0x9d, 0x70, + 0xa9, 0x88, 0x03, 0xf6, 0x4d, 0xfa, 0x12, 0x02, 0x84, 0x90, 0x96, 0x27, + 0x6f, 0x1e, 0x9e, 0x72, 0xb1, 0x0f, 0xb7, 0x2d, 0xd2, 0xb8, 0x10, 0xbe, + 0x2d, 0xda, 0x7c, 0x72, 0xb0, 0x45, 0xea, 0x30, 0xd7, 0xd8, 0x9a, 0xcc, + 0xe5, 0xd4, 0x65, 0x8b, 0xf4, 0x61, 0x26, 0xd4, 0x9e, 0x7d, 0x71, 0x9a, + 0x31, 0x8f, 0x6f, 0xf2, 0x1d, 0xba, 0xe3, 0xc7, 0xfb, 0xf9, 0x3c, 0x5e, + 0xf3, 0xb3, 0xe8, 0x0c, 0x92, 0x14, 0x4d, 0x86, 0x11, 0xda, 0x31, 0x48, + 0x67, 0xe8, 0x60, 0x8c, 0xa8, 0xff, 0xec, 0xb1, 0x58, 0x86, 0xd2, 0xcf, + 0x42, 0x8e, 0xc7, 0xaa, 0x0b, 0x90, 0x6a, 0xe2, 0xee, 0x3f, 0x1a, 0xcb, + 0x69, 0xba, 0xc7, 0x63, 0xd5, 0x1f, 0x87, 0x80, 0x53, 0xb1, 0x75, 0x23, + 0xd0, 0x68, 0x34, 0xf2, 0x8e, 0x6f, 0xf7, 0xc1, 0x4a, 0x72, 0x12, 0x5f, + 0xc0, 0x03, 0x01, 0xed, 0xc6, 0x3a, 0xf8, 0x0b, 0x38, 0x47, 0xb7, 0x1d, + 0xf2, 0x3c, 0xe4, 0xe1, 0x16, 0x08, 0xd3, 0x51, 0xda, 0xed, 0x90, 0xc6, + 0x03, 0xb6, 0xdb, 0xa1, 0x8c, 0xc7, 0x6e, 0xb7, 0x44, 0x9a, 0x07, 0x9c, + 0xdb, 0x0e, 0xed, 0x6c, 0x1d, 0x6f, 0xab, 0x19, 0xa5, 0xb1, 0x69, 0x47, + 0xda, 0xf1, 0x57, 0xf2, 0x80, 0x49, 0x11, 0x00, 0x19, 0xde, 0x4a, 0x5e, + 0x3a, 0x25, 0x82, 0x2c, 0x1d, 0xee, 0x39, 0xe6, 0x43, 0xc4, 0x98, 0xa0, + 0x12, 0xee, 0xa8, 0x48, 0x22, 0x7d, 0x58, 0x9d, 0x69, 0x32, 0x3e, 0xe4, + 0xcb, 0x10, 0xea, 0x7c, 0x55, 0xa6, 0x7e, 0xd2, 0xeb, 0x52, 0x6f, 0xb4, + 0x12, 0xf1, 0xc0, 0x53, 0xf0, 0x4a, 0x6e, 0xb8, 0xad, 0x7c, 0x36, 0x99, + 0xe5, 0x09, 0xac, 0xfb, 0xf1, 0x9b, 0xfb, 0x51, 0xb7, 0x5c, 0x59, 0xb2, + 0x20, 0x6d, 0x01, 0xaa, 0x96, 0xc2, 0x64, 0x15, 0x1a, 0x03, 0xd0, 0x06, + 0x6c, 0x93, 0x05, 0x21, 0x2f, 0x35, 0x28, 0xc5, 0x28, 0xb5, 0x71, 0x7d, + 0x85, 0x83, 0x40, 0x4f, 0x2d, 0x9e, 0x4f, 0x66, 0xb1, 0x78, 0x72, 0xa5, + 0x49, 0x1c, 0x5e, 0x31, 0x8f, 0x2f, 0x0f, 0xff, 0xa8, 0x26, 0x39, 0xd5, + 0x20, 0xd8, 0xa0, 0x75, 0x20, 0xf9, 0xb2, 0x1e, 0x22, 0xf3, 0x82, 0xd0, + 0xad, 0xbc, 0xb0, 0x2e, 0xc5, 0x9f, 0x8b, 0xf6, 0xb4, 0x0d, 0xc5, 0x28, + 0x90, 0x4d, 0xf3, 0xb0, 0x4e, 0x86, 0xbc, 0xbb, 0x3d, 0xae, 0xe7, 0xcf, + 0xc1, 0x9b, 0xa4, 0x42, 0xfb, 0xd5, 0xc5, 0x17, 0xba, 0x5b, 0x05, 0xfb, + 0x10, 0xac, 0x63, 0x5f, 0xa2, 0x06, 0xe0, 0xe2, 0x32, 0x97, 0x0c, 0x99, + 0xd0, 0x75, 0xef, 0x55, 0xd1, 0x9f, 0x49, 0x93, 0xbd, 0x36, 0x56, 0xc1, + 0x0b, 0x9c, 0x2b, 0xa3, 0x98, 0x11, 0xf3, 0x70, 0xd9, 0x70, 0xa9, 0x2c, + 0xce, 0xe8, 0xda, 0x8c, 0x7c, 0xaa, 0x93, 0x71, 0xfd, 0xcb, 0x34, 0x24, + 0xf3, 0x2a, 0xec, 0xd5, 0x64, 0xed, 0x5c, 0x83, 0x55, 0x7f, 0xf6, 0x6d, + 0x30, 0x87, 0xcf, 0x1a, 0x83, 0x26, 0xaf, 0x82, 0xe9, 0x31, 0x6a, 0xc2, + 0xea, 0x65, 0x79, 0x62, 0x46, 0xdf, 0x79, 0x3e, 0xff, 0x50, 0xf7, 0x11, + 0xcb, 0xd9, 0x12, 0x5c, 0x35, 0x0d, 0x75, 0x64, 0xb6, 0x1b, 0xe9, 0x86, + 0xff, 0x52, 0x94, 0xa8, 0xb6, 0xb8, 0x10, 0xd5, 0xe9, 0x3a, 0xcd, 0x4a, + 0xd7, 0x1f, 0xed, 0x66, 0x9d, 0x2c, 0x16, 0x7f, 0x55, 0x8b, 0xa2, 0x5c, + 0xb9, 0x74, 0xd8, 0xb8, 0x49, 0xf3, 0x1e, 0xf9, 0xc9, 0x11, 0x80, 0x29, + 0x1b, 0x4a, 0x6a, 0x27, 0x9e, 0xbf, 0x53, 0x3b, 0xc6, 0xbe, 0x7c, 0x7f, + 0x2d, 0xaa, 0x2b, 0x71, 0xef, 0x2e, 0x28, 0xd7, 0x06, 0xe9, 0x30, 0xbc, + 0x8f, 0x26, 0xa6, 0xd2, 0xb7, 0xfd, 0x56, 0x65, 0xf3, 0xd4, 0x0e, 0x1e, + 0x94, 0x62, 0x0d, 0x71, 0xd6, 0xdd, 0xdd, 0x07, 0x9e, 0xf5, 0x85, 0xa9, + 0x72, 0x88, 0x1a, 0x37, 0xd0, 0xda, 0x30, 0xa3, 0xa4, 0xb7, 0xd8, 0x03, + 0x4e, 0x54, 0x9b, 0xb0, 0xa1, 0xb1, 0xa0, 0xbe, 0x05, 0x38, 0x96, 0x6a, + 0x0c, 0xab, 0x2e, 0xe3, 0xde, 0xb9, 0x72, 0x6b, 0xde, 0xc3, 0xbe, 0xca, + 0x40, 0x97, 0xaf, 0x2f, 0x6f, 0x7b, 0x0c, 0x9f, 0xac, 0x87, 0x3a, 0xd5, + 0xde, 0x84, 0x15, 0xe5, 0x0b, 0x02, 0x45, 0x53, 0xdf, 0x18, 0x7b, 0xec, + 0x40, 0x56, 0xa6, 0x97, 0x7a, 0x99, 0x11, 0x14, 0x8b, 0xe3, 0xa5, 0xbc, + 0xe7, 0x4d, 0x7b, 0x96, 0x2f, 0x4e, 0xe6, 0xa3, 0xd7, 0x47, 0xaf, 0xd3, + 0xa6, 0xe5, 0x8b, 0x8f, 0x67, 0x93, 0xf3, 0xfd, 0xdd, 0x8e, 0x72, 0xb1, + 0xde, 0x5d, 0x26, 0x57, 0x13, 0xaa, 0x44, 0x92, 0x11, 0xc3, 0x73, 0x1e, + 0xc9, 0x85, 0x44, 0x40, 0xf7, 0xac, 0x22, 0xbc, 0x0e, 0xcf, 0x6f, 0x8c, + 0x33, 0x28, 0x65, 0x88, 0x5f, 0xba, 0xbe, 0xcb, 0xad, 0x1d, 0x14, 0x03, + 0xec, 0x7e, 0x13, 0x19, 0x5e, 0x82, 0xff, 0x8d, 0x90, 0xbb, 0x80, 0x5b, + 0xb1, 0x06, 0x31, 0x6e, 0x1b, 0xd8, 0xbd, 0x10, 0xa9, 0x0a, 0xd8, 0xcd, + 0xbe, 0x8d, 0xa7, 0x27, 0x2b, 0xf0, 0xd8, 0x73, 0x3a, 0xa6, 0x40, 0x41, + 0xba, 0x17, 0x31, 0x3d, 0xcc, 0x2f, 0xb6, 0xbb, 0x81, 0xfc, 0x9d, 0xfd, + 0x62, 0xb8, 0xe0, 0xe8, 0x90, 0x0d, 0xb1, 0x66, 0x3c, 0x17, 0xce, 0x01, + 0x7e, 0x15, 0xe7, 0x69, 0x82, 0x8f, 0x8c, 0x8f, 0x44, 0x5a, 0x1a, 0x2b, + 0x9c, 0xf7, 0xe3, 0xc5, 0xe4, 0xf6, 0xa3, 0x74, 0x75, 0xfd, 0xe1, 0x04, + 0x1f, 0xc5, 0x56, 0x40, 0xf3, 0x78, 0xba, 0xb9, 0xe0, 0xaf, 0x97, 0x03, + 0x5b, 0x47, 0xe6, 0xbb, 0xc4, 0x02, 0xff, 0xdd, 0xc5, 0xc2, 0x0c, 0x1c, + 0x60, 0x5e, 0x14, 0x3d, 0x5e, 0xac, 0x60, 0x9c, 0x5c, 0xaf, 0x72, 0xd0, + 0x85, 0x04, 0x06, 0xb0, 0x5b, 0x86, 0x6e, 0x9e, 0xc6, 0x70, 0xa6, 0xdd, + 0xdd, 0xf6, 0x3e, 0x5e, 0xae, 0x02, 0x76, 0x44, 0x98, 0xe8, 0x84, 0x5c, + 0x87, 0x34, 0x90, 0x31, 0x94, 0x12, 0x51, 0x95, 0x59, 0xe7, 0xb3, 0xc9, + 0x72, 0x43, 0x25, 0x51, 0xea, 0xfc, 0xf0, 0xb0, 0x82, 0x59, 0x8a, 0x3d, + 0x70, 0xf7, 0x63, 0x1c, 0xaf, 0x8f, 0x09, 0x98, 0x57, 0xf6, 0x5e, 0x73, + 0xd8, 0x6b, 0xd9, 0x83, 0x56, 0x38, 0x3d, 0xd3, 0xc1, 0xca, 0x9f, 0x61, + 0x47, 0xfb, 0x60, 0xcc, 0x78, 0x2a, 0xe7, 0xc6, 0x8a, 0x46, 0x1f, 0x20, + 0xa9, 0xeb, 0x98, 0xae, 0x27, 0xa4, 0x96, 0xb9, 0x9e, 0x8d, 0xdd, 0x4e, + 0xa0, 0x55, 0x63, 0x1a, 0xcc, 0x9b, 0xc1, 0xa2, 0x56, 0xa5, 0x4d, 0x5f, + 0xad, 0x20, 0x40, 0x53, 0x69, 0x08, 0x81, 0x51, 0xa8, 0x7b, 0x98, 0x63, + 0x89, 0x1d, 0xf8, 0x4d, 0x0a, 0x9d, 0x95, 0x06, 0x20, 0x0e, 0x07, 0x8a, + 0xcf, 0x7f, 0x96, 0x9c, 0x25, 0x91, 0xb5, 0x3f, 0x92, 0xb5, 0xe7, 0xd0, + 0x4a, 0x75, 0xf0, 0x9a, 0xa0, 0xad, 0x3a, 0x98, 0x26, 0xae, 0x5a, 0x0e, + 0xa0, 0x7b, 0x5c, 0x39, 0x91, 0x8f, 0x54, 0x98, 0x59, 0x37, 0x80, 0x07, + 0x70, 0x44, 0x42, 0x10, 0x93, 0xb4, 0xaf, 0x64, 0x7f, 0x02, 0xce, 0x8a, + 0x8e, 0x8b, 0x6b, 0x79, 0x56, 0x5c, 0x91, 0xc3, 0x37, 0x86, 0x18, 0x96, + 0x6b, 0x92, 0xce, 0x37, 0xc9, 0x72, 0x05, 0x5f, 0x55, 0x77, 0x86, 0xd2, + 0xcb, 0x43, 0x84, 0x1c, 0x17, 0xd4, 0x51, 0x50, 0x4a, 0x35, 0xa8, 0x9e, + 0x40, 0x06, 0xe9, 0xeb, 0x04, 0xaa, 0x95, 0x56, 0x04, 0xbd, 0xc6, 0x04, + 0x8e, 0xe4, 0x94, 0x8c, 0xc1, 0xf3, 0xa8, 0xa7, 0x8e, 0xed, 0x57, 0x0e, + 0xaa, 0x19, 0x8c, 0xe7, 0xe1, 0xfc, 0x05, 0xf4, 0x98, 0xd7, 0x5e, 0xb3, + 0x70, 0x9e, 0xaf, 0xef, 0x58, 0xdc, 0xeb, 0x96, 0xda, 0xf9, 0xdd, 0xe9, + 0xf8, 0x91, 0xcc, 0xb8, 0x6d, 0xaf, 0x41, 0xe3, 0xd6, 0x55, 0xc2, 0xf6, + 0x23, 0x8e, 0xbc, 0xd2, 0x26, 0x6b, 0x15, 0x2c, 0xee, 0xf7, 0xa1, 0x7f, + 0x6d, 0x45, 0xe2, 0xfd, 0xfe, 0x56, 0x25, 0xfe, 0xbc, 0xc2, 0x93, 0x5d, + 0xb3, 0xce, 0xd2, 0xbe, 0x35, 0x66, 0xca, 0xc0, 0x79, 0x18, 0x09, 0x8d, + 0x95, 0x7a, 0x1f, 0xd4, 0x76, 0xe4, 0x92, 0x04, 0xb7, 0xdd, 0x07, 0x04, + 0xbd, 0x5a, 0x06, 0x36, 0xda, 0x7d, 0x40, 0x2c, 0x1b, 0xb0, 0x22, 0xc5, + 0x88, 0xae, 0x8f, 0xbf, 0x24, 0x26, 0x25, 0x97, 0x81, 0x02, 0x92, 0xa5, + 0x00, 0x66, 0x91, 0x14, 0x3e, 0x36, 0x29, 0x92, 0xfd, 0xf3, 0x49, 0xb2, + 0x88, 0x45, 0x44, 0x93, 0x6a, 0xd9, 0x02, 0xc3, 0x26, 0xcb, 0x0e, 0xc3, + 0x26, 0xbb, 0xd5, 0xb6, 0x15, 0xf0, 0x37, 0xe9, 0xa2, 0xc4, 0x96, 0xd6, + 0x4e, 0xa5, 0xfe, 0xdd, 0x31, 0xe7, 0xad, 0x38, 0x48, 0x14, 0x95, 0x11, + 0x24, 0x93, 0x81, 0x64, 0xf4, 0xa1, 0xf5, 0xdb, 0xcb, 0x78, 0xc9, 0x07, + 0x55, 0x25, 0xd2, 0x24, 0x23, 0x0f, 0xac, 0x47, 0xef, 0xca, 0x50, 0xe4, + 0x07, 0x92, 0xba, 0x18, 0x7e, 0x21, 0x35, 0xfd, 0x39, 0x4e, 0x7d, 0xad, + 0xa1, 0x46, 0x04, 0xf7, 0x01, 0x17, 0x57, 0xc7, 0x8b, 0x76, 0xa2, 0xd2, + 0xdc, 0x29, 0x5e, 0x52, 0xb4, 0x7e, 0x3c, 0x77, 0xc3, 0xa1, 0x11, 0x48, + 0x1a, 0x9f, 0xa7, 0x71, 0x76, 0xf9, 0x8c, 0x56, 0x49, 0x61, 0x12, 0xca, + 0x87, 0xfe, 0x27, 0xe2, 0x57, 0x44, 0x7d, 0x4d, 0x1d, 0xf7, 0x7a, 0xa9, + 0xd3, 0xed, 0x91, 0xd3, 0xbb, 0x8b, 0x65, 0x35, 0x30, 0x5c, 0xca, 0x53, + 0x11, 0x5a, 0xdc, 0xc0, 0x4a, 0x84, 0xf5, 0x12, 0x41, 0xb7, 0xd5, 0xc0, + 0xb3, 0xb3, 0x53, 0xf6, 0x14, 0xa1, 0xaa, 0xb9, 0x98, 0x3f, 0x8c, 0xb0, + 0xee, 0xcd, 0x50, 0x8f, 0x05, 0xea, 0x5e, 0x73, 0xd4, 0xdf, 0x04, 0xea, + 0x63, 0x44, 0x0d, 0xda, 0xdc, 0x28, 0xed, 0x71, 0xd0, 0x6a, 0x2f, 0x77, + 0x9a, 0x91, 0x08, 0xef, 0x76, 0x40, 0x9c, 0xfa, 0x5d, 0x10, 0x8f, 0x6d, + 0xfb, 0x1e, 0x46, 0x2b, 0xbd, 0x95, 0x8e, 0xf2, 0x56, 0x7b, 0x20, 0x79, + 0x09, 0x4d, 0xbb, 0x20, 0x9f, 0x08, 0xd5, 0x76, 0x42, 0x3b, 0x9e, 0x1b, + 0x3d, 0x96, 0x59, 0xf4, 0x37, 0x6f, 0x9f, 0xec, 0xfa, 0x2a, 0xfd, 0xe9, + 0xea, 0x82, 0xd1, 0x88, 0x98, 0x95, 0xd5, 0x82, 0x72, 0xf5, 0x5a, 0x50, + 0x82, 0xb7, 0x2a, 0x94, 0xa3, 0x57, 0x46, 0x86, 0x79, 0xa3, 0xcf, 0xa6, + 0x55, 0x42, 0xd7, 0xc1, 0x1d, 0x13, 0xf3, 0xf4, 0xf6, 0x98, 0x2e, 0x12, + 0xbe, 0x3d, 0xd6, 0xc6, 0x90, 0x81, 0x9a, 0x37, 0x13, 0x67, 0x0d, 0x1d, + 0x22, 0xd7, 0xae, 0xa8, 0xbf, 0x7a, 0x67, 0xb3, 0x95, 0x65, 0x09, 0xb2, + 0x2e, 0xd2, 0x8a, 0x35, 0xae, 0x90, 0x35, 0xe6, 0xb7, 0x29, 0xbb, 0xd3, + 0x26, 0xc8, 0x9f, 0x28, 0x97, 0xbc, 0xa6, 0x21, 0x7b, 0xcd, 0xdf, 0x42, + 0x90, 0x1e, 0x82, 0x3f, 0xd2, 0xe2, 0x04, 0x0e, 0xdd, 0x40, 0x81, 0x7e, + 0x5d, 0x16, 0xc7, 0x31, 0x78, 0xc0, 0xd7, 0x80, 0x3e, 0x5a, 0xc4, 0x4a, + 0x0a, 0x8a, 0x74, 0xac, 0x34, 0x1b, 0xc9, 0x0b, 0xd2, 0x3c, 0xe2, 0xf1, + 0x00, 0x69, 0xeb, 0x1c, 0x82, 0xa2, 0x86, 0xbd, 0xdd, 0x52, 0x60, 0xee, + 0xec, 0x04, 0x2d, 0x8a, 0x3e, 0x22, 0xcb, 0xf7, 0x48, 0x6e, 0xf2, 0x8a, + 0x37, 0x0b, 0xb1, 0xc9, 0x96, 0xd0, 0x5b, 0xdd, 0x6d, 0x27, 0xb3, 0x0a, + 0x50, 0x3e, 0xb0, 0x0b, 0xff, 0x3e, 0xc7, 0x93, 0x31, 0x32, 0xa6, 0x86, + 0xfb, 0x66, 0x87, 0x19, 0xab, 0x60, 0xac, 0x43, 0x1f, 0xb1, 0xa0, 0xd3, + 0x79, 0xfe, 0xa0, 0x07, 0x01, 0x6f, 0x6f, 0xe0, 0x5a, 0x71, 0x39, 0x47, + 0x94, 0x3b, 0x2e, 0x00, 0x43, 0x08, 0xaa, 0x17, 0x99, 0x83, 0x1f, 0x27, + 0x71, 0xdf, 0x9a, 0xb6, 0x28, 0x59, 0x32, 0x57, 0x8d, 0x44, 0xe1, 0xdb, + 0xd8, 0xb1, 0x7a, 0xeb, 0x15, 0x63, 0xbc, 0x79, 0x80, 0xad, 0x27, 0xb1, + 0x43, 0x0a, 0x70, 0x6b, 0x4a, 0x7b, 0xda, 0xa2, 0x0d, 0x4f, 0xe8, 0xa1, + 0x3e, 0x7e, 0x8d, 0x39, 0xa3, 0x98, 0x62, 0xb5, 0x82, 0x21, 0x58, 0x47, + 0x26, 0x00, 0x77, 0x67, 0xdd, 0x85, 0x1f, 0x2b, 0xf0, 0xa3, 0x90, 0x48, + 0x00, 0xfe, 0xdb, 0xfc, 0x41, 0xad, 0x8f, 0x57, 0xaa, 0x5d, 0x96, 0x6c, + 0x9e, 0x00, 0x66, 0x5c, 0x80, 0x1f, 0x05, 0xdc, 0xc7, 0xf7, 0xdf, 0xaa, + 0x0f, 0x61, 0xe8, 0xfc, 0xe6, 0x59, 0x99, 0x46, 0x02, 0x2d, 0x47, 0x29, + 0x01, 0x3c, 0x54, 0x2f, 0xe9, 0x3c, 0x51, 0xb0, 0x4a, 0x3a, 0x8f, 0x70, + 0x2b, 0x1a, 0x35, 0xca, 0x58, 0xa9, 0x87, 0xf6, 0xe3, 0xe0, 0x8a, 0x6a, + 0x98, 0x06, 0x5a, 0x75, 0xa2, 0x33, 0x15, 0xc1, 0x75, 0x72, 0x9f, 0x3c, + 0x51, 0x44, 0xe0, 0x41, 0xbb, 0xa3, 0x20, 0xac, 0xd4, 0xc0, 0x1a, 0x06, + 0x62, 0x5d, 0x18, 0x58, 0xa3, 0x40, 0xac, 0xa9, 0x81, 0xb5, 0x17, 0x88, + 0x05, 0xe7, 0x38, 0x79, 0x44, 0x8e, 0xa7, 0xab, 0x8f, 0xe3, 0x9b, 0xe8, + 0x54, 0xaf, 0x63, 0xcf, 0xe0, 0xbd, 0x67, 0xf0, 0xd4, 0x33, 0xca, 0x3a, + 0xeb, 0x86, 0x95, 0x76, 0x3d, 0x32, 0x98, 0x7c, 0x1c, 0xc8, 0x64, 0x6a, + 0xa2, 0xed, 0x07, 0xa2, 0x5d, 0x98, 0x68, 0x07, 0x81, 0x68, 0x53, 0x13, + 0xed, 0xf5, 0x40, 0x34, 0x90, 0xe4, 0xa8, 0x44, 0x94, 0x8f, 0x0d, 0x71, + 0xed, 0x1b, 0xbf, 0x0e, 0xf0, 0x97, 0x2a, 0x2c, 0x5c, 0x94, 0x7b, 0x06, + 0x97, 0x6f, 0x04, 0x72, 0x99, 0x9a, 0x68, 0x6f, 0x06, 0xa2, 0x5d, 0x98, + 0x68, 0xc3, 0xd0, 0x0e, 0x30, 0xb5, 0xf0, 0x42, 0xbb, 0x00, 0x08, 0x73, + 0xaf, 0x44, 0x98, 0x6f, 0x18, 0x02, 0x7b, 0xd3, 0xd4, 0x52, 0x4b, 0x69, + 0x87, 0x20, 0xce, 0x87, 0x18, 0x0e, 0xd1, 0x92, 0xd8, 0xd1, 0x84, 0xc7, + 0x55, 0x2b, 0x8a, 0xac, 0x32, 0x1a, 0xed, 0x20, 0x2d, 0x61, 0x8a, 0x55, + 0x47, 0xa0, 0x85, 0x76, 0x28, 0x43, 0xac, 0x8e, 0x3a, 0x3b, 0x98, 0x96, + 0xe2, 0x55, 0x47, 0x9a, 0x1d, 0x5c, 0x0b, 0xc4, 0x00, 0x73, 0x5b, 0x21, + 0xa8, 0x51, 0x6b, 0x41, 0x8d, 0x5a, 0x4b, 0x6a, 0xd4, 0x56, 0x54, 0xa3, + 0xd6, 0xb2, 0x1a, 0x35, 0x12, 0x56, 0x89, 0xac, 0xf6, 0x5a, 0xcb, 0x6a, + 0xaf, 0xb5, 0xac, 0xf6, 0xda, 0xca, 0x6a, 0xaf, 0xb5, 0xac, 0xf6, 0xc2, + 0x65, 0xe5, 0x77, 0x2e, 0xf9, 0xfb, 0x9a, 0x8d, 0x9c, 0xca, 0x8a, 0x67, + 0x28, 0xef, 0x9c, 0x98, 0xab, 0xf6, 0x4b, 0x94, 0x21, 0x81, 0x61, 0x4b, + 0x22, 0xc1, 0x06, 0xb9, 0x5c, 0x15, 0x0f, 0x59, 0xde, 0xd5, 0x3f, 0x65, + 0x19, 0x14, 0xc8, 0xb5, 0x2c, 0x70, 0x6b, 0x90, 0xf7, 0x2b, 0xe3, 0x8c, + 0xd6, 0xf2, 0xe7, 0x79, 0x0d, 0xb3, 0x96, 0x3f, 0x80, 0xf1, 0xf2, 0x47, + 0x59, 0x61, 0xde, 0x79, 0xc5, 0x73, 0x9a, 0x77, 0xf5, 0x0f, 0x6a, 0x06, + 0x05, 0x47, 0x2d, 0x0d, 0x86, 0x1a, 0xcc, 0x9f, 0xff, 0x45, 0xce, 0xbb, + 0xfa, 0x37, 0x39, 0x59, 0x48, 0x18, 0xd3, 0xd2, 0xb0, 0xa5, 0x21, 0xfc, + 0x55, 0x3c, 0xea, 0x79, 0x57, 0xf1, 0xac, 0x67, 0xc8, 0x94, 0x7b, 0xb6, + 0xb4, 0x1a, 0x57, 0xd1, 0x0a, 0xe4, 0x0c, 0x28, 0xd4, 0x72, 0x66, 0xbe, + 0x0c, 0x1a, 0xb0, 0x18, 0x30, 0x5b, 0x6d, 0x4a, 0x18, 0x9b, 0x85, 0x2d, + 0x07, 0xfc, 0x65, 0x2f, 0x8b, 0x86, 0x5d, 0x0c, 0xb4, 0xea, 0xf1, 0x17, + 0xbc, 0x56, 0xca, 0x58, 0xf8, 0xbb, 0x98, 0x61, 0x15, 0xba, 0x6e, 0xf0, + 0x48, 0x26, 0xfd, 0x99, 0x27, 0x70, 0xb7, 0x53, 0xa8, 0xb6, 0x44, 0x1a, + 0x36, 0xd8, 0xed, 0x4a, 0xd0, 0x00, 0x57, 0xf7, 0xba, 0x29, 0xfc, 0xa8, + 0x29, 0xc2, 0x5e, 0x15, 0x02, 0x68, 0x79, 0xd0, 0x88, 0x1b, 0xfe, 0x0a, + 0xed, 0x5d, 0xc5, 0x3b, 0xb4, 0xb5, 0x7d, 0x12, 0x60, 0xbc, 0x9a, 0x0c, + 0xe9, 0x81, 0x3d, 0xb2, 0xec, 0x15, 0xdb, 0xbb, 0xba, 0x77, 0x6c, 0x1b, + 0xc7, 0x25, 0x71, 0xd9, 0x24, 0x4a, 0xa1, 0xd6, 0x96, 0x82, 0xe5, 0x84, + 0x9b, 0x0e, 0x4f, 0x48, 0x1f, 0x83, 0xd2, 0x51, 0xb3, 0xb3, 0xf8, 0xd6, + 0xbd, 0xdf, 0xe0, 0x70, 0x76, 0xcd, 0xe9, 0xe3, 0xcd, 0xdf, 0xda, 0x02, + 0x86, 0xa3, 0xf6, 0x05, 0x88, 0xbb, 0xbf, 0x81, 0x01, 0xb6, 0x9a, 0xd3, + 0x87, 0xbb, 0xbf, 0xb5, 0x15, 0x38, 0x80, 0xdd, 0xcf, 0xa0, 0x7e, 0x84, + 0x2f, 0xca, 0x81, 0x81, 0x69, 0xb4, 0x1a, 0x0a, 0x6b, 0x31, 0xc1, 0x6a, + 0x02, 0xf0, 0xea, 0x98, 0x1b, 0xbe, 0xa7, 0x63, 0x9f, 0x40, 0x71, 0x4b, + 0x22, 0xb0, 0x01, 0xf8, 0xa9, 0xf4, 0x6e, 0x55, 0xf1, 0x43, 0x1c, 0x57, + 0x66, 0x6f, 0xb3, 0x5d, 0x7f, 0x69, 0xfe, 0x1b, 0x07, 0x74, 0x92, 0xec, + 0x8e, 0xd1, 0x63, 0x6b, 0x87, 0x8a, 0x5a, 0x8f, 0x25, 0x73, 0xfe, 0x93, + 0xe0, 0xd4, 0x51, 0xca, 0xc0, 0x49, 0x00, 0x25, 0x07, 0x9c, 0xfc, 0xb7, + 0xa7, 0xf6, 0xcc, 0x33, 0xab, 0x77, 0x9f, 0x39, 0x71, 0x01, 0xfc, 0x4f, + 0xa7, 0x94, 0x95, 0x44, 0x77, 0xb1, 0xd8, 0x57, 0xf4, 0x2f, 0x90, 0xb4, + 0x20, 0xcb, 0x1f, 0x5c, 0xa9, 0xe2, 0x3c, 0xa3, 0x07, 0x4b, 0xd2, 0xd5, + 0x22, 0x2b, 0x07, 0x94, 0x1b, 0x33, 0x84, 0xe0, 0xc2, 0xc9, 0x7c, 0x51, + 0x05, 0x7a, 0xfb, 0xf4, 0xa8, 0xe6, 0x34, 0x92, 0x81, 0xc2, 0xce, 0xa1, + 0x98, 0xec, 0x32, 0x9e, 0xbf, 0x60, 0x8c, 0xff, 0x41, 0xb7, 0xdb, 0x4a, + 0x4b, 0xf0, 0x61, 0x55, 0x14, 0x04, 0x0d, 0x5c, 0x4a, 0x8a, 0xf4, 0x0e, + 0x25, 0x41, 0x1b, 0x64, 0xc5, 0x2f, 0xdf, 0xbe, 0x53, 0x91, 0xc9, 0xe4, + 0x2b, 0xb0, 0xb5, 0x07, 0xb3, 0x9e, 0x00, 0x74, 0x32, 0x59, 0x24, 0xbf, + 0xc0, 0xee, 0xe1, 0x60, 0x30, 0x70, 0x38, 0x53, 0x57, 0xf7, 0xd4, 0x73, + 0x44, 0xa4, 0xdc, 0xbc, 0x4e, 0x3e, 0xe0, 0x32, 0x6b, 0x63, 0xac, 0xd7, + 0x37, 0xb9, 0x5b, 0x09, 0x05, 0xbb, 0x5c, 0xa9, 0x93, 0xd6, 0x9f, 0x8a, + 0xc7, 0x32, 0xc1, 0xe6, 0xf8, 0xd4, 0x52, 0x1d, 0xeb, 0xe0, 0xe7, 0x67, + 0x9a, 0xde, 0xe8, 0x6a, 0xb6, 0x4f, 0x58, 0x4b, 0xad, 0x88, 0xfb, 0xe1, + 0xa3, 0xe8, 0x3d, 0x8e, 0x47, 0x87, 0xf5, 0x4b, 0xfb, 0x2f, 0x97, 0x56, + 0x79, 0x07, 0x9f, 0xa9, 0xc5, 0x3f, 0x2f, 0x90, 0xd2, 0x28, 0x79, 0x76, + 0xa0, 0xea, 0x0a, 0xd8, 0x0c, 0x2f, 0x3b, 0x32, 0xda, 0xdb, 0x55, 0x5b, + 0xc7, 0xee, 0x29, 0x37, 0x3a, 0x2f, 0x23, 0xf6, 0x84, 0x49, 0x07, 0xdd, + 0x2d, 0xe0, 0x13, 0x86, 0x40, 0xa4, 0xd3, 0x12, 0xf0, 0xc8, 0xbf, 0xbb, + 0x6c, 0x10, 0x53, 0x07, 0xbd, 0x65, 0xd2, 0x0b, 0x63, 0x38, 0x0e, 0x44, + 0x85, 0x84, 0x1c, 0x02, 0xae, 0x3c, 0x58, 0x5f, 0xc6, 0xa5, 0x7e, 0x6a, + 0x31, 0x5f, 0x11, 0xcf, 0x88, 0x3e, 0xd8, 0xa4, 0x0b, 0xcf, 0x79, 0x00, + 0x97, 0x63, 0x65, 0xdc, 0xbd, 0x27, 0xcb, 0xe5, 0xe5, 0xc5, 0x67, 0x7c, + 0x95, 0x0c, 0xfb, 0x19, 0xa5, 0x47, 0x19, 0x6d, 0x2a, 0xfa, 0x1e, 0x7b, + 0xe3, 0x18, 0xb4, 0x0f, 0xc5, 0x81, 0x80, 0x70, 0x5d, 0x08, 0x04, 0x18, + 0xdf, 0xdb, 0xa0, 0x81, 0x2d, 0x6f, 0x89, 0xd9, 0x06, 0x8d, 0x16, 0xf1, + 0x5a, 0x23, 0xb6, 0xe4, 0x15, 0xd7, 0xff, 0xda, 0xe2, 0xb5, 0x2c, 0x12, + 0x27, 0x53, 0xad, 0xca, 0x24, 0xc4, 0xea, 0x42, 0xa1, 0x73, 0xd8, 0xaa, + 0x73, 0x6f, 0x77, 0x52, 0xff, 0xb0, 0x26, 0xc1, 0xa7, 0x79, 0xd8, 0x8d, + 0x36, 0x80, 0x33, 0x03, 0x9b, 0xaa, 0xfb, 0x60, 0x40, 0xa3, 0xfc, 0x3a, + 0x18, 0x64, 0xd2, 0x4d, 0xb0, 0x06, 0x83, 0x80, 0xec, 0x39, 0x66, 0x15, + 0x63, 0x79, 0x5e, 0x81, 0x0d, 0xd9, 0xaf, 0xbf, 0x1a, 0x69, 0x63, 0x48, + 0x43, 0x67, 0x0f, 0x86, 0x1d, 0x13, 0x72, 0xff, 0xf5, 0x2e, 0xf0, 0xc2, + 0x07, 0x90, 0xaf, 0x4f, 0x9e, 0x7e, 0xf1, 0x19, 0x83, 0x6e, 0xfe, 0xd9, + 0x17, 0xef, 0x7f, 0x60, 0xbd, 0xa9, 0x55, 0x79, 0x5d, 0x50, 0xf4, 0x6e, + 0xff, 0x0d, 0x69, 0x81, 0xff, 0xe0, 0x97, 0xa4, 0x39, 0xd9, 0x46, 0x77, + 0xe6, 0xc2, 0x5e, 0x57, 0xe1, 0x30, 0xc0, 0x9c, 0x8b, 0x68, 0x2c, 0x13, + 0xc8, 0xc4, 0x46, 0x77, 0x58, 0xfd, 0x4d, 0xf6, 0x36, 0xdf, 0x5b, 0xaa, + 0x3f, 0xa1, 0xf8, 0x40, 0x6e, 0x03, 0x14, 0x2f, 0x49, 0x29, 0x05, 0xd9, + 0x3f, 0x00, 0x16, 0xe8, 0xde, 0xdc, 0xd7, 0x4f, 0xbf, 0xf8, 0xf2, 0xd3, + 0x77, 0xbf, 0x37, 0xe5, 0x2d, 0xed, 0x32, 0x82, 0x8b, 0x5b, 0xc8, 0x11, + 0x0d, 0x91, 0x96, 0xd5, 0x2f, 0x35, 0xe0, 0xe0, 0x83, 0x95, 0xc2, 0xf2, + 0xc3, 0x26, 0x0a, 0xb8, 0x9a, 0x32, 0x9d, 0x09, 0x28, 0xa3, 0xac, 0xd6, + 0x86, 0xfc, 0xb5, 0x7c, 0x9d, 0xd7, 0x92, 0x6b, 0xfb, 0xb3, 0x6f, 0x4f, + 0x38, 0xda, 0xf3, 0x29, 0xbb, 0x4f, 0x1f, 0xa5, 0xe6, 0x37, 0xd3, 0x0f, + 0xa5, 0x71, 0xed, 0x34, 0xd5, 0xec, 0x7a, 0x02, 0xa4, 0xb6, 0xf3, 0xb5, + 0xea, 0x80, 0x5a, 0xc7, 0x08, 0xe8, 0x86, 0xd4, 0x2e, 0xff, 0x4d, 0x8d, + 0x7a, 0x83, 0x6b, 0xd4, 0xd3, 0x6f, 0xfe, 0x35, 0xd5, 0x43, 0xe0, 0xf0, + 0xfa, 0xbd, 0x29, 0x46, 0x88, 0x0f, 0x86, 0x83, 0xbd, 0xe1, 0xbf, 0xa6, + 0x8e, 0x4d, 0x9a, 0xf0, 0x60, 0x57, 0x54, 0xf1, 0xc3, 0x24, 0x8d, 0x47, + 0xbb, 0xc3, 0xd1, 0xbf, 0xa6, 0x96, 0x1c, 0xb8, 0xf6, 0x11, 0xee, 0xe7, + 0xae, 0x01, 0x02, 0xff, 0x65, 0x55, 0x70, 0x9e, 0xa4, 0x36, 0x5b, 0x6b, + 0xb7, 0xd1, 0x7d, 0xff, 0xce, 0xea, 0xfc, 0xbc, 0x51, 0xf4, 0x22, 0x35, + 0x54, 0xb6, 0x92, 0x60, 0x53, 0x3d, 0x70, 0x05, 0xd9, 0x00, 0xa1, 0x42, + 0xe9, 0x5d, 0x37, 0xd7, 0x2d, 0xc5, 0x9d, 0x5a, 0x05, 0x44, 0x34, 0x6b, + 0xe3, 0xa8, 0x73, 0xcc, 0x52, 0x4f, 0xdd, 0x65, 0x54, 0xd5, 0xae, 0x05, + 0x9f, 0x80, 0xd7, 0x6e, 0xc2, 0x45, 0x88, 0x4d, 0xb9, 0xd4, 0x34, 0xc2, + 0x3b, 0x49, 0xbd, 0x32, 0x6e, 0x22, 0xbb, 0x11, 0x2d, 0xc0, 0xec, 0xa0, + 0x8e, 0x87, 0x3c, 0xff, 0x8e, 0x0f, 0xbc, 0x87, 0x39, 0x8a, 0x12, 0xc3, + 0xad, 0x47, 0x45, 0xa8, 0x87, 0x38, 0xa7, 0xca, 0x10, 0xf2, 0x33, 0x2c, + 0xee, 0x4e, 0x79, 0xab, 0x20, 0x95, 0x69, 0x0c, 0xde, 0x41, 0x86, 0x17, + 0x42, 0x2e, 0xe2, 0xb4, 0x00, 0xd2, 0xd9, 0x31, 0x0f, 0x46, 0x0f, 0x4d, + 0x0f, 0xda, 0xc8, 0x13, 0xd8, 0x00, 0xe1, 0x37, 0x5a, 0xe0, 0x86, 0x7e, + 0x08, 0xfd, 0x13, 0x56, 0x92, 0xc5, 0x1a, 0x5b, 0x66, 0x78, 0xaf, 0xb2, + 0x74, 0x34, 0x07, 0xd4, 0xc1, 0x15, 0x17, 0x2e, 0x1f, 0xbb, 0xae, 0x6d, + 0x81, 0x8f, 0xda, 0xf5, 0xcc, 0xe2, 0xaa, 0x13, 0x5d, 0xe0, 0x16, 0x05, + 0x92, 0xd4, 0x2c, 0x99, 0x91, 0xd6, 0xe0, 0x7c, 0xd1, 0xc2, 0x7b, 0x07, + 0xf0, 0xcc, 0xa3, 0xb2, 0x5e, 0x74, 0x75, 0xd0, 0xda, 0x43, 0xe3, 0x65, + 0xa0, 0xe1, 0x1c, 0x01, 0xf7, 0x51, 0x21, 0x53, 0xc3, 0x09, 0x04, 0x9f, + 0x60, 0x2b, 0x4a, 0x79, 0x11, 0x4b, 0x51, 0x87, 0xef, 0xec, 0x0d, 0xc5, + 0x9e, 0x73, 0xf4, 0xc8, 0x49, 0xb9, 0x70, 0x52, 0xa6, 0x67, 0x5d, 0xcd, + 0x12, 0x05, 0x1f, 0x16, 0x53, 0x3c, 0xd5, 0x30, 0x35, 0x72, 0xb9, 0x72, + 0x93, 0x2e, 0xdc, 0xa4, 0xe9, 0x28, 0x94, 0xb1, 0xbd, 0x12, 0xc6, 0xea, + 0x38, 0xdb, 0x73, 0x39, 0x73, 0x93, 0x2e, 0xdc, 0xa4, 0xe9, 0x9e, 0xc1, + 0xd9, 0x3d, 0x7e, 0xf2, 0x58, 0x20, 0xc6, 0xc3, 0xf8, 0xc7, 0x32, 0x1a, + 0x08, 0xdd, 0xd9, 0x99, 0x2c, 0x7f, 0x9e, 0x54, 0x4d, 0x13, 0x1e, 0xf1, + 0x3a, 0xd1, 0x93, 0x0e, 0xcf, 0x38, 0x34, 0xc5, 0x90, 0x13, 0x17, 0x7e, + 0x30, 0x46, 0x2d, 0x60, 0xf3, 0x0c, 0xc4, 0x3d, 0xe6, 0x69, 0xd1, 0xa3, + 0xd1, 0x9c, 0xe0, 0x8c, 0x98, 0x0f, 0x57, 0xeb, 0xd5, 0x12, 0x08, 0xf3, + 0x7a, 0xcf, 0x0a, 0xf1, 0xa4, 0x71, 0xbe, 0x49, 0x97, 0x2c, 0xea, 0xec, + 0xa2, 0x60, 0xb8, 0xa5, 0x80, 0xec, 0x41, 0xbe, 0x3a, 0xc9, 0x53, 0xb0, + 0x69, 0x11, 0x04, 0x8a, 0x85, 0x11, 0x78, 0x91, 0xc0, 0xd4, 0xa7, 0x3f, + 0xc2, 0xf4, 0xaf, 0xd7, 0x6b, 0xd8, 0x68, 0x99, 0x64, 0x71, 0xe4, 0x98, + 0x21, 0x25, 0x58, 0xf8, 0xe2, 0x14, 0xa1, 0x78, 0x90, 0x20, 0xb0, 0x59, + 0xd6, 0x85, 0x52, 0x3d, 0x19, 0xc3, 0xb2, 0x8c, 0x51, 0x59, 0x06, 0x34, + 0x80, 0xcb, 0xcf, 0x6a, 0x79, 0x42, 0x66, 0x82, 0xda, 0x80, 0x87, 0xb5, + 0x33, 0xba, 0xd9, 0x0b, 0x9e, 0xa5, 0x48, 0x23, 0x34, 0xce, 0x7a, 0x25, + 0x8d, 0x2e, 0x21, 0x0f, 0xd6, 0x29, 0x7d, 0xbe, 0x1f, 0x9f, 0x4f, 0x36, + 0x8b, 0x9c, 0x24, 0xa0, 0xa8, 0x71, 0x10, 0xf5, 0x86, 0x48, 0xbe, 0xda, + 0xcc, 0x2e, 0xf1, 0xb5, 0x53, 0x65, 0xe2, 0x24, 0x5d, 0x0a, 0x44, 0x28, + 0xe0, 0x27, 0x29, 0xb4, 0x9d, 0xb2, 0x73, 0x58, 0x26, 0x64, 0x5a, 0x6e, + 0xd2, 0xcd, 0x21, 0xfb, 0x6c, 0x92, 0x5f, 0x0e, 0xc8, 0x01, 0x8a, 0x74, + 0xcc, 0xa7, 0x58, 0x0a, 0x6d, 0x3c, 0x0e, 0xd6, 0x30, 0xb9, 0xfd, 0x8e, + 0xf5, 0x81, 0xfa, 0x00, 0x0c, 0x2b, 0x98, 0x96, 0x4f, 0xe3, 0xf3, 0xbc, + 0xdb, 0x33, 0x29, 0xdd, 0x86, 0x52, 0xfa, 0x5e, 0x51, 0xc2, 0xbc, 0x75, + 0x57, 0x33, 0xc5, 0x52, 0xd5, 0xcb, 0x2b, 0x4f, 0xe1, 0xac, 0xb0, 0xe2, + 0x2d, 0x2a, 0xc6, 0x8b, 0xfc, 0x2e, 0x84, 0x73, 0x0e, 0xfa, 0xbd, 0x9f, + 0x37, 0xd5, 0x8e, 0x22, 0x10, 0xaa, 0xe8, 0x36, 0xd4, 0xd3, 0x9e, 0x5c, + 0x41, 0x1d, 0xdf, 0x87, 0xf6, 0x8f, 0x80, 0xaf, 0xc1, 0x4d, 0x8f, 0xe1, + 0xc7, 0x2d, 0xdc, 0x2d, 0x83, 0xff, 0xba, 0x74, 0x09, 0x0b, 0x09, 0xa9, + 0x88, 0xce, 0xcf, 0x04, 0x0d, 0xa5, 0xe4, 0x94, 0x60, 0xc5, 0xc1, 0x24, + 0x03, 0xe4, 0xb7, 0xdf, 0x14, 0xf6, 0x08, 0xe3, 0x1d, 0x99, 0x99, 0x1c, + 0xdf, 0x32, 0x28, 0xa7, 0x1d, 0x28, 0x11, 0x7a, 0xa4, 0x20, 0x79, 0xc6, + 0xc6, 0x8a, 0x85, 0x12, 0x84, 0xd4, 0x04, 0x57, 0xb7, 0x1f, 0xbc, 0xd0, + 0x17, 0x3e, 0xe8, 0x61, 0x19, 0xf4, 0xd4, 0x07, 0x3d, 0x2a, 0x83, 0xbe, + 0xd6, 0xa0, 0xd5, 0x18, 0xae, 0xce, 0xc3, 0x9a, 0xdc, 0x59, 0x47, 0x5e, + 0x5d, 0x66, 0xd4, 0xa9, 0x56, 0xb7, 0x68, 0xf7, 0x2c, 0x8f, 0xbb, 0x95, + 0x8a, 0x2d, 0x54, 0xb9, 0x4d, 0xec, 0xdf, 0xf0, 0xf5, 0x6e, 0x3d, 0x5b, + 0x1b, 0x1e, 0xee, 0xe3, 0x3a, 0x86, 0x79, 0x11, 0xda, 0x66, 0x74, 0x02, + 0xa9, 0x81, 0x74, 0x43, 0xf7, 0x2b, 0x0c, 0xa1, 0xb0, 0xdb, 0x63, 0xf0, + 0x9f, 0x30, 0xe3, 0xd7, 0xc9, 0x3c, 0xbf, 0x2c, 0x7e, 0x5d, 0xc6, 0xe8, + 0x37, 0x68, 0x03, 0x8b, 0xa4, 0x1d, 0xf2, 0x74, 0x91, 0x5e, 0x2a, 0xb1, + 0x49, 0xe9, 0x50, 0x0d, 0xd7, 0x71, 0x53, 0x40, 0xdf, 0xe2, 0x60, 0x13, + 0x69, 0x25, 0x16, 0x85, 0xee, 0xbc, 0xfa, 0xaa, 0x00, 0x7d, 0x95, 0xbd, + 0x0f, 0x90, 0x99, 0xe8, 0x54, 0x38, 0x4a, 0xc8, 0x8c, 0x1d, 0x25, 0x1b, + 0x8d, 0x9a, 0x61, 0x51, 0x67, 0x31, 0xd4, 0x3f, 0xfd, 0x8e, 0x8d, 0x8d, + 0x1a, 0xb3, 0x1d, 0x36, 0x3a, 0xb2, 0x81, 0xbe, 0x07, 0x20, 0x43, 0x10, + 0x12, 0xca, 0xbd, 0xc7, 0x28, 0xa8, 0xf6, 0x24, 0x66, 0x90, 0x3c, 0xb1, + 0x24, 0xba, 0x26, 0xfe, 0x15, 0x6c, 0xbc, 0x6e, 0x32, 0x97, 0xa5, 0xc7, + 0x83, 0x7d, 0x0d, 0x14, 0x76, 0x5e, 0x35, 0xd0, 0xc8, 0x80, 0xed, 0xb3, + 0xe1, 0x6e, 0xd7, 0x64, 0x8f, 0xc0, 0xd9, 0x74, 0x95, 0x82, 0xc2, 0x61, + 0xa2, 0x6a, 0xfa, 0x69, 0x7c, 0x91, 0x2c, 0xbf, 0x04, 0x4b, 0x16, 0x75, + 0x6d, 0x70, 0xde, 0x76, 0x26, 0xf8, 0x24, 0x9d, 0xb9, 0xf5, 0xd3, 0xb9, + 0x21, 0xfd, 0x19, 0x41, 0xb3, 0x90, 0x75, 0xfc, 0xf2, 0x49, 0x8f, 0xef, + 0x7f, 0x2a, 0xe2, 0xd4, 0x16, 0x78, 0xfb, 0xd5, 0x60, 0xea, 0x90, 0x45, + 0x60, 0x06, 0x33, 0xca, 0x5c, 0xb2, 0x09, 0x59, 0x55, 0x04, 0x12, 0x4c, + 0xbc, 0xd0, 0x35, 0xd9, 0x58, 0x24, 0xcb, 0xf8, 0x5b, 0xaa, 0xec, 0x98, + 0x3d, 0x3e, 0x32, 0xf3, 0xf8, 0xed, 0xfd, 0x13, 0x9c, 0xa7, 0x43, 0x6e, + 0xe7, 0xc5, 0x5d, 0xfa, 0xeb, 0x78, 0xa1, 0xa2, 0xae, 0x95, 0x4c, 0x57, + 0xdc, 0x0b, 0x71, 0x14, 0x3c, 0x9f, 0x27, 0x8b, 0x05, 0x0f, 0xfa, 0x36, + 0x8d, 0x27, 0x9b, 0x3c, 0x39, 0xdf, 0x2c, 0x64, 0xac, 0x5d, 0x09, 0x92, + 0x4f, 0x7e, 0x8c, 0x97, 0x74, 0xf7, 0x96, 0xce, 0xe6, 0x1c, 0xb2, 0xcb, + 0x3c, 0x5f, 0x43, 0xd4, 0xa6, 0x2c, 0x87, 0xb5, 0x02, 0x18, 0x77, 0xd3, + 0xf3, 0xc5, 0xea, 0x1a, 0xac, 0xd2, 0xd5, 0xce, 0x4f, 0x9b, 0x38, 0xa3, + 0x8d, 0xd3, 0x9d, 0xe1, 0x1b, 0xa3, 0x83, 0xfd, 0x37, 0x76, 0x1f, 0xef, + 0x4c, 0x37, 0xc9, 0x02, 0xf7, 0xdb, 0xfb, 0x93, 0x3e, 0x91, 0xed, 0x93, + 0x9f, 0xd5, 0x4f, 0x96, 0xfd, 0xcb, 0xfc, 0x6a, 0xb1, 0x6f, 0xbd, 0x72, + 0x07, 0xc6, 0x61, 0xc1, 0x4d, 0x8c, 0xf8, 0xfa, 0x16, 0x38, 0x99, 0x07, + 0xc5, 0xaf, 0xd7, 0x2c, 0xff, 0x5c, 0x3d, 0x7a, 0xfc, 0xae, 0x40, 0x8c, + 0x38, 0x60, 0x1f, 0x7c, 0x66, 0xd5, 0x52, 0xa0, 0x31, 0xc3, 0x37, 0xec, + 0xe8, 0xfb, 0xe0, 0xa9, 0x4a, 0x24, 0xc2, 0x29, 0x05, 0xf7, 0x6b, 0x94, + 0x9b, 0x8b, 0x2e, 0xc8, 0xd3, 0x95, 0xa3, 0x43, 0x12, 0xd4, 0xd6, 0x35, + 0x73, 0xd0, 0x95, 0x58, 0x6e, 0x2a, 0x90, 0x30, 0x53, 0x75, 0x9d, 0xb4, + 0x72, 0x94, 0x28, 0xac, 0x0c, 0xa8, 0xac, 0x2f, 0x99, 0x14, 0x58, 0x25, + 0x29, 0x56, 0xfd, 0x6a, 0xe3, 0xe6, 0xa2, 0xf6, 0x14, 0xfa, 0x78, 0x99, + 0x2d, 0x22, 0x18, 0x93, 0x64, 0x5b, 0xe1, 0xbe, 0x37, 0x06, 0xae, 0xc0, + 0x03, 0x09, 0x2f, 0x77, 0x3b, 0x25, 0xd8, 0x51, 0x58, 0xa1, 0xf7, 0x4a, + 0x65, 0xd1, 0x98, 0x34, 0xe9, 0xf2, 0xf9, 0x65, 0x92, 0x0d, 0xaa, 0x7b, + 0x79, 0xca, 0x85, 0xa9, 0xcb, 0x4f, 0x89, 0x0c, 0xa8, 0x6f, 0x10, 0xee, + 0x78, 0x01, 0x97, 0xd0, 0xaf, 0x13, 0xec, 0xf1, 0x21, 0x96, 0x03, 0xb8, + 0x0c, 0xb7, 0x1c, 0x28, 0x09, 0x34, 0x0a, 0x02, 0x5d, 0x59, 0xc3, 0xab, + 0xdb, 0x67, 0x17, 0xc8, 0x1d, 0x24, 0x2b, 0xbf, 0x4a, 0x3c, 0xea, 0xf8, + 0x29, 0x98, 0x8a, 0x49, 0xfa, 0x11, 0xcf, 0x96, 0x03, 0xdc, 0xf0, 0x75, + 0xfc, 0x94, 0xa4, 0x15, 0x3a, 0xbd, 0xe4, 0xc3, 0xaf, 0x76, 0xe5, 0xab, + 0x35, 0x02, 0xc3, 0x7e, 0x34, 0x3e, 0x82, 0x53, 0x0b, 0x0a, 0x9e, 0x9a, + 0xdc, 0x7f, 0x26, 0xc3, 0x51, 0xd2, 0xfe, 0x3a, 0x81, 0xa3, 0x52, 0x28, + 0x49, 0x0a, 0x20, 0xbc, 0x9a, 0xe0, 0xd8, 0x52, 0xd1, 0xda, 0x68, 0x16, + 0xcb, 0x0d, 0xe5, 0x68, 0x7b, 0x86, 0xb2, 0x76, 0x60, 0xe6, 0x66, 0xdc, + 0x3f, 0x34, 0x2b, 0x6f, 0x40, 0x1a, 0xad, 0x45, 0x9c, 0x0b, 0x6d, 0xf3, + 0x0d, 0xcd, 0x0a, 0x26, 0x41, 0xb7, 0xd9, 0x69, 0x71, 0xe5, 0x4c, 0x83, + 0x36, 0x15, 0x5a, 0xab, 0xbe, 0x77, 0x15, 0x05, 0x72, 0x7f, 0x81, 0x00, + 0x11, 0x92, 0x7e, 0xb6, 0x66, 0x6d, 0x11, 0xe4, 0x06, 0xf2, 0xfb, 0x1c, + 0xf3, 0x08, 0x7e, 0xbc, 0xc5, 0x8a, 0xef, 0xe6, 0xfe, 0xbb, 0xc2, 0xb8, + 0xd5, 0x31, 0x6e, 0x35, 0x8c, 0x5b, 0x0b, 0x43, 0x72, 0x71, 0x9a, 0x82, + 0xc7, 0x7f, 0x99, 0xa0, 0x83, 0x7a, 0x73, 0x3b, 0x5a, 0xaf, 0x16, 0x93, + 0x34, 0x82, 0x49, 0xc0, 0x2d, 0x72, 0xea, 0x89, 0x84, 0xc0, 0xde, 0x16, + 0x14, 0x15, 0x31, 0x2b, 0xea, 0xf3, 0x8f, 0xc9, 0x9a, 0xc2, 0x3c, 0x03, + 0x95, 0xdb, 0x2e, 0x88, 0x07, 0xac, 0x40, 0xb2, 0x04, 0xd1, 0x64, 0xa0, + 0x2c, 0x93, 0x1c, 0xc6, 0x57, 0x1a, 0x7d, 0xb3, 0x64, 0x0e, 0x9f, 0xe7, + 0xda, 0x38, 0xeb, 0x3d, 0xd8, 0x06, 0xae, 0xdd, 0xc6, 0x73, 0x80, 0xc9, + 0xad, 0xc6, 0x9c, 0xee, 0x78, 0x00, 0x6b, 0x23, 0xf8, 0x16, 0x41, 0x85, + 0x1c, 0xfe, 0x69, 0x3d, 0x2e, 0xb9, 0xd8, 0xf0, 0xf2, 0xa9, 0x60, 0xb2, + 0x26, 0x78, 0xd4, 0x8c, 0x16, 0x29, 0x39, 0x3b, 0x49, 0xc6, 0xd6, 0xc9, + 0x4d, 0xbc, 0x80, 0x34, 0x82, 0xa1, 0xe6, 0xe1, 0x6d, 0x45, 0x01, 0x79, + 0x06, 0x6e, 0xd9, 0xe9, 0xea, 0xfa, 0x53, 0x7e, 0xee, 0x74, 0xac, 0x35, + 0xf5, 0x91, 0x0b, 0x38, 0x99, 0xff, 0xb0, 0xc9, 0xf2, 0x78, 0x0e, 0x5e, + 0x1f, 0xb4, 0xe6, 0x6b, 0x12, 0x50, 0x38, 0x71, 0x30, 0x4e, 0x43, 0x8b, + 0xf3, 0x61, 0xfc, 0xb4, 0xbf, 0x4f, 0x41, 0x5d, 0xcf, 0x30, 0xa4, 0xce, + 0xe9, 0x2e, 0xda, 0x69, 0xf8, 0x1e, 0x01, 0x43, 0xba, 0x44, 0x81, 0x63, + 0x2f, 0x8f, 0xdd, 0xf2, 0xa2, 0xd1, 0x97, 0xbc, 0xf5, 0x17, 0x7d, 0xbb, + 0xa5, 0xa2, 0x49, 0x9c, 0xca, 0x63, 0xc2, 0x22, 0x63, 0x58, 0x46, 0x16, + 0x62, 0x4e, 0xe3, 0x9f, 0x36, 0x49, 0x0a, 0x04, 0x1f, 0xb3, 0x6c, 0xb1, + 0xca, 0x33, 0x29, 0x77, 0x45, 0xd2, 0xa5, 0x48, 0xcd, 0x45, 0xbe, 0x84, + 0x14, 0x28, 0xd4, 0x28, 0x52, 0x55, 0x7c, 0x55, 0x35, 0x49, 0x17, 0xbd, + 0x0c, 0xc5, 0xc1, 0x91, 0x4f, 0x77, 0x2e, 0x69, 0xd2, 0x04, 0x7a, 0xe3, + 0x69, 0xb2, 0x6c, 0x02, 0x8b, 0x36, 0x13, 0x11, 0xc9, 0x2d, 0x65, 0x3b, + 0xe5, 0x8d, 0x2b, 0x27, 0x5f, 0xc3, 0xc1, 0xae, 0xb7, 0x94, 0x53, 0x98, + 0x24, 0xf5, 0xf8, 0x0c, 0xaf, 0x47, 0x73, 0x39, 0x9a, 0xcc, 0x66, 0x3f, + 0x8f, 0x60, 0x1e, 0x1d, 0x01, 0x0b, 0x3d, 0xad, 0xac, 0x1e, 0xa7, 0xd6, + 0xf5, 0xe9, 0xd0, 0x62, 0x7d, 0x39, 0x41, 0x45, 0xdb, 0xdf, 0xb7, 0x8b, + 0x21, 0x99, 0x9d, 0x92, 0x70, 0x90, 0x36, 0x94, 0x77, 0x54, 0x96, 0x0f, + 0xf2, 0x1a, 0x02, 0x0c, 0x67, 0xa7, 0x0a, 0x6a, 0x04, 0x50, 0xc4, 0x6d, + 0x15, 0xd0, 0x1e, 0x00, 0x71, 0xc6, 0xca, 0x96, 0xa9, 0xcd, 0x31, 0x7e, + 0xbd, 0xd1, 0x56, 0x1d, 0x48, 0x83, 0x68, 0x64, 0xdc, 0xb5, 0x16, 0x85, + 0x4d, 0x83, 0x64, 0x5a, 0x68, 0x28, 0x90, 0xc6, 0xea, 0xec, 0xa7, 0x34, + 0x8f, 0x6e, 0xa0, 0x8d, 0x91, 0x8f, 0x5b, 0xf8, 0xbc, 0xd5, 0x4d, 0x2c, + 0xd8, 0x01, 0x09, 0x08, 0x45, 0x2d, 0x47, 0x11, 0xac, 0x6b, 0xdc, 0x10, + 0x80, 0x5a, 0x8f, 0x93, 0x06, 0xd0, 0x2a, 0x5b, 0x9a, 0x12, 0xf8, 0xd4, + 0x83, 0x01, 0xc3, 0x4f, 0x50, 0x3f, 0xe8, 0x24, 0x7f, 0xfc, 0xde, 0x63, + 0x7f, 0xfc, 0x7e, 0x06, 0x09, 0x30, 0x5d, 0x96, 0xd9, 0x92, 0x26, 0x20, + 0x82, 0x60, 0x09, 0x10, 0xea, 0x05, 0xfe, 0xb1, 0x82, 0x53, 0x05, 0x47, + 0x48, 0x1b, 0xb8, 0x16, 0x3e, 0x07, 0x4e, 0x9b, 0x22, 0xcd, 0x07, 0x21, + 0xcd, 0x05, 0x54, 0x8b, 0xaf, 0x6a, 0x8d, 0x31, 0x84, 0x34, 0xbb, 0x84, + 0xfe, 0x0c, 0xba, 0xc2, 0xb3, 0x80, 0x9a, 0x02, 0xd7, 0x64, 0x04, 0x84, + 0x86, 0x00, 0x03, 0x1f, 0xc0, 0x00, 0x14, 0xa7, 0x72, 0xa0, 0x8b, 0x09, + 0x1a, 0x80, 0x1b, 0x0d, 0x59, 0x5f, 0x48, 0x72, 0x9a, 0x45, 0x11, 0x61, + 0xbd, 0x8c, 0x4e, 0x7c, 0x1f, 0x3c, 0x7e, 0x5d, 0xe6, 0xe9, 0x10, 0xb4, + 0x1c, 0xfe, 0x9f, 0x0e, 0x8d, 0x45, 0x41, 0x42, 0x78, 0x1b, 0x26, 0x0e, + 0x70, 0x86, 0x8b, 0xca, 0x74, 0xe3, 0x5b, 0x46, 0xa7, 0x0a, 0x17, 0x35, + 0xea, 0x94, 0x17, 0x0e, 0x4d, 0x06, 0xba, 0x71, 0x66, 0xce, 0xd7, 0x0d, + 0x9a, 0x43, 0x9d, 0xe6, 0xa8, 0x9a, 0x26, 0xd0, 0x12, 0x64, 0xab, 0x69, + 0x8e, 0x74, 0x9a, 0x7b, 0xd5, 0x34, 0x77, 0x15, 0xcd, 0x9b, 0x2a, 0x9a, + 0x7b, 0x3a, 0xcd, 0xc7, 0xb5, 0x34, 0x0b, 0x56, 0xab, 0x68, 0x3e, 0xd6, + 0x69, 0xee, 0xd7, 0xd6, 0x7d, 0x37, 0x84, 0xe6, 0xbe, 0x4e, 0xf3, 0x20, + 0xac, 0x8d, 0x76, 0x55, 0xdd, 0xa9, 0xd3, 0x2b, 0x85, 0xb8, 0x2a, 0x34, + 0xb0, 0x2f, 0xca, 0x26, 0x28, 0xe5, 0x7e, 0x5c, 0x00, 0x31, 0xa2, 0x45, + 0xb1, 0xb1, 0xae, 0x20, 0x41, 0x7c, 0x4e, 0xe9, 0xf3, 0x4c, 0xf3, 0x3a, + 0xe5, 0xb5, 0x85, 0xb4, 0x77, 0xd1, 0x9b, 0x12, 0x55, 0x19, 0xd3, 0x0a, + 0x04, 0x36, 0x94, 0x43, 0x16, 0xd8, 0xc6, 0x33, 0xb3, 0x8f, 0x43, 0x0a, + 0xe8, 0x30, 0x94, 0xc5, 0xbf, 0x5c, 0x88, 0x2f, 0x50, 0xae, 0xb3, 0x56, + 0x4e, 0xf7, 0xa1, 0x16, 0x30, 0xc6, 0x45, 0x18, 0xd0, 0x54, 0x5f, 0xc7, + 0xa2, 0x84, 0x01, 0xfe, 0xf3, 0x54, 0x2e, 0x32, 0x51, 0x8b, 0x52, 0x32, + 0x8d, 0x57, 0xc9, 0xb2, 0x08, 0xe1, 0x35, 0x30, 0x63, 0xfa, 0x2b, 0xa0, + 0xf2, 0x38, 0x7c, 0xa7, 0x05, 0xcc, 0x99, 0x94, 0x63, 0x55, 0xd9, 0xa4, + 0xf5, 0x45, 0x32, 0x1d, 0x5c, 0xa2, 0x1b, 0x37, 0x27, 0xc7, 0x5f, 0x3d, + 0xf9, 0xf2, 0x29, 0xae, 0x7b, 0x55, 0x07, 0xf8, 0x27, 0xd4, 0x19, 0xbe, + 0xf7, 0x8e, 0xd7, 0x07, 0xab, 0x43, 0xfd, 0x2b, 0xa1, 0x58, 0x58, 0x70, + 0xe8, 0xd3, 0x77, 0xee, 0x81, 0x84, 0x2a, 0xf7, 0x73, 0xdc, 0x47, 0x1e, + 0x3a, 0xef, 0x7f, 0xf1, 0x19, 0xed, 0xd2, 0x40, 0xda, 0x6a, 0x32, 0x8f, + 0xe7, 0x30, 0x13, 0x95, 0x0d, 0x50, 0x6c, 0x4f, 0xa8, 0x36, 0x87, 0x82, + 0xb0, 0x65, 0xd3, 0xcd, 0x92, 0x65, 0xc9, 0x72, 0x16, 0x33, 0x40, 0xc7, + 0x18, 0x84, 0x0b, 0xc2, 0xa5, 0x87, 0x45, 0x52, 0x0c, 0x5f, 0x28, 0x16, + 0x51, 0xe3, 0x9c, 0xae, 0x2b, 0xc9, 0x79, 0x03, 0xe5, 0xc9, 0x73, 0xf5, + 0x15, 0x41, 0x63, 0xcd, 0x70, 0x94, 0xb2, 0x74, 0x23, 0xd0, 0x64, 0x51, + 0x00, 0xbf, 0xc9, 0x2f, 0x31, 0xcd, 0x79, 0x02, 0xf4, 0x49, 0xf9, 0x92, + 0xa0, 0xb9, 0xde, 0xa6, 0x72, 0x4a, 0xdf, 0x23, 0x37, 0xae, 0x0b, 0xbd, + 0xb5, 0x93, 0xcd, 0xd2, 0x64, 0x9d, 0xbf, 0x0d, 0x49, 0xf4, 0x73, 0xba, + 0x9a, 0xdf, 0xc2, 0x8f, 0xb7, 0x76, 0x70, 0x65, 0x06, 0xbe, 0xfc, 0x09, + 0x2a, 0x25, 0x72, 0xf5, 0x34, 0xa5, 0x01, 0x00 }; diff --git a/Arduino/McLighting/json_functions.h b/Arduino/McLighting/json_functions.h index 632717f..9967a02 100644 --- a/Arduino/McLighting/json_functions.h +++ b/Arduino/McLighting/json_functions.h @@ -10,13 +10,12 @@ char * listStateJSONfull() { const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(19) + 250; DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); - root["segment"] = State.segment; - root["start"] = segState.start; - root["stop"] = segState.stop; - root["mode"] = (uint8_t) State.mode; - //getSegmentParams(segment); - root["fx_mode"] = segState.mode[State.segment]; - root["speed"] = segState.speed[State.segment]; + root["segment"] = State.segment; + root["start"] = segState.start; + root["stop"] = segState.stop; + root["mode"] = (uint8_t) State.mode; + root["fx_mode"] = segState.mode[State.segment]; + root["speed"] = segState.speed[State.segment]; root["brightness"] = State.brightness; JsonArray color = root.createNestedArray("color"); color.add(main_color.white); @@ -43,7 +42,7 @@ char * listStateJSONfull() { root["ws_cnt"] = Config.stripSize; root["ws_rgbo"] = Config.RGBOrder; root["ws_pin"] = Config.pin; - root["ws_trans"] = Config.transEffect; + root["ws_trans"] = Config.transEffect; uint16_t msg_len = measureJson(root) + 1; char * buffer = (char *) malloc(msg_len); serializeJson(root, buffer, msg_len); @@ -69,32 +68,25 @@ char * listSegmentStateJSON(uint8_t _seg) { const size_t bufferSize = JSON_ARRAY_SIZE(12) + JSON_OBJECT_SIZE(6) + 100; DynamicJsonDocument jsonBuffer(bufferSize); JsonObject root = jsonBuffer.to(); - if (_seg == State.segment) { - root["start"] = segState.start; - root["stop"] = segState.stop; - } else { - root["start"] = strip->getSegment(_seg)->start; - root["stop"] = strip->getSegment(_seg)->stop; - } - //getSegmentParams(seg); - //root["fx_mode"] = strip->getMode(_seg); - root["fx_mode"] = segState.mode[_seg]; - root["speed"] = segState.speed[_seg]; - JsonArray color = root.createNestedArray("color"); - //color.add((strip->getColors(_seg)[0] >> 24) & 0xFF); - color.add((segState.colors[_seg][0] >> 24) & 0xFF); - color.add((segState.colors[_seg][0] >> 16) & 0xFF); - color.add((segState.colors[_seg][0] >> 8) & 0xFF); - color.add((segState.colors[_seg][0]) & 0xFF); - color.add((segState.colors[_seg][1] >> 24) & 0xFF); - color.add((segState.colors[_seg][1] >> 16) & 0xFF); - color.add((segState.colors[_seg][1] >> 8) & 0xFF); - color.add((segState.colors[_seg][1]) & 0xFF); - color.add((segState.colors[_seg][2] >> 24) & 0xFF); - color.add((segState.colors[_seg][2] >> 16) & 0xFF); - color.add((segState.colors[_seg][2] >> 8) & 0xFF); - color.add((segState.colors[_seg][2]) & 0xFF); - root["ws_fxopt"] = segState.options; + root["start"] = strip->getSegment(_seg)->start; + root["stop"] = strip->getSegment(_seg)->stop; + root["fx_mode"] = segState.mode[_seg]; + root["speed"] = segState.speed[_seg]; + JsonArray color = root.createNestedArray("color"); + //color.add((strip->getColors(_seg)[0] >> 24) & 0xFF); + color.add((segState.colors[_seg][0] >> 24) & 0xFF); + color.add((segState.colors[_seg][0] >> 16) & 0xFF); + color.add((segState.colors[_seg][0] >> 8) & 0xFF); + color.add((segState.colors[_seg][0]) & 0xFF); + color.add((segState.colors[_seg][1] >> 24) & 0xFF); + color.add((segState.colors[_seg][1] >> 16) & 0xFF); + color.add((segState.colors[_seg][1] >> 8) & 0xFF); + color.add((segState.colors[_seg][1]) & 0xFF); + color.add((segState.colors[_seg][2] >> 24) & 0xFF); + color.add((segState.colors[_seg][2] >> 16) & 0xFF); + color.add((segState.colors[_seg][2] >> 8) & 0xFF); + color.add((segState.colors[_seg][2]) & 0xFF); + root["ws_fxopt"] = strip->getOptions(_seg); uint16_t msg_len = measureJson(root) + 1; char * buffer = (char *) malloc(msg_len); serializeJson(root, buffer, msg_len); diff --git a/Arduino/McLighting/mode_custom_ws2812fx_animations.h b/Arduino/McLighting/mode_custom_ws2812fx_animations.h index 07f0d38..50350aa 100644 --- a/Arduino/McLighting/mode_custom_ws2812fx_animations.h +++ b/Arduino/McLighting/mode_custom_ws2812fx_animations.h @@ -9,14 +9,14 @@ as a custom effect More info on how to create custom aniamtions for WS2812FX: https://github.com/kitesurfer1404/WS2812FX/blob/master/extras/WS2812FX%20Users%20Guide.md#custom-effects */ -// *************************************************************************** -// Functions and variables for automatic cycling -// *************************************************************************** uint16_t handleSegmentOFF(void) { WS2812FX::Segment* _seg = strip->getSegment(); return _seg->speed; } +// *************************************************************************** +// Function for automatic cycling +// *************************************************************************** void handleAutoPlay(uint8_t _seg) { //WS2812FX::Segment* _seg = strip->getSegment(); if (autoDelay[_seg] <= millis()) { @@ -37,21 +37,28 @@ void handleAutoPlay(uint8_t _seg) { } } +uint16_t handleAuto() { + WS2812FX::Segment* _seg = strip->getSegment(); + return _seg->speed; +} + +uint16_t handleCustomWS(void) { + WS2812FX::Segment* _seg = strip->getSegment(); + return _seg->speed; +} #if defined(CUSTOM_WS2812FX_ANIMATIONS) // *************************************************************************** - // TV mode + // TV mode to be reviewed // *************************************************************************** - uint8_t dipInterval = 10; - uint16_t darkTime = 250; - unsigned long currentDipTime; - unsigned long dipStartTime; - unsigned long currentMillis; - uint8_t ledState = LOW; - unsigned long previousMillis = 0; - uint16_t interv = 2000; - uint8_t twitch = 50; - uint8_t dipCount = 0; - boolean timeToDip = false; + uint16_t darkTime[10] = {250,250,250,250,250,250,250,250,250,250}; + uint8_t dipInterval[10] = {10,10,10,10,10,10,10,10,10,10}; + unsigned long dipStartTime[10] = {}; + uint8_t ledState[10] = {LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW}; + unsigned long previousMillis[10]= {0,0,0,0,0,0,0,0,0,0}; + uint16_t interv[10] = {2000,2000,2000,2000,2000,2000,2000,2000,2000,2000}; + uint8_t twitch[10]= {50,50,50,50,50,50,50,50,50,50}; + uint8_t dipCount[10] = {0,0,0,0,0,0,0,0,0,0}; + bool timeToDip[10] = {false,false,false,false,false,false,false,false,false,false}; void hsb2rgbAN1(uint16_t index, uint8_t sat, uint8_t bright, uint16_t led) { @@ -63,6 +70,95 @@ void handleAutoPlay(uint8_t _seg) { strip->setPixelColor(led, temp[n + 2], temp[n + 1], temp[n], 0); } + + uint16_t handleTV(void) { + WS2812FX::Segment* _seg = strip->getSegment(); + uint8_t _seg_num = strip->getSegmentIndex(); + if (timeToDip[_seg_num] == false) { + if((millis() - previousMillis[_seg_num]) > interv[_seg_num]) { + DBG_OUTPUT_PORT.println("Segment:"); + DBG_OUTPUT_PORT.println(_seg_num); + previousMillis[_seg_num] = millis(); + //interv = random(750,4001);//Adjusts the interval for more/less frequent random light changes + interv[_seg_num] = random(800-(512 - (_seg->speed/64)),6001-(2731 - (_seg->speed/24))); + twitch[_seg_num] = random(40,100);// Twitch provides motion effect but can be a bit much if too high + dipCount[_seg_num]++; + } + if((millis() - previousMillis[_seg_num]) < twitch[_seg_num]) { + uint16_t led=random(_seg->start, _seg->stop); + ledState[_seg_num] = ledState[_seg_num] == LOW ? HIGH : LOW; // if the LED is off turn it on and vice-versa: + ledstates[led] = ((ledState[_seg_num]) ? 255 : 0); + for (uint16_t j=_seg->start; j<=_seg->stop; j++) { + uint16_t index = (j%3 == 0) ? 400 : random(0,767); + hsb2rgbAN1(index, 200, ledstates[j], j); + } + if (dipCount[_seg_num] > dipInterval[_seg_num]) { + timeToDip[_seg_num] = true; + dipCount[_seg_num] = 0; + dipStartTime[_seg_num] = millis(); + darkTime[_seg_num] = random(50,150); + dipInterval[_seg_num] = random(5,250);// cycles of flicker + } + } + } else { + DBG_OUTPUT_PORT.println("Dip Time"); + if (millis() - dipStartTime[_seg_num] < darkTime[_seg_num]) { + for (uint16_t i=(_seg->start + 3); i<= _seg->stop; i++) { + ledstates[i] = 0; + for (uint16_t j=_seg->start; j<=_seg->stop; j++) { + uint16_t index = (j%3 == 0) ? 400 : random(0,767); + hsb2rgbAN1(index, 200, ledstates[j], j); + } + } + } else { + timeToDip[_seg_num] = false; + } + } + return _seg->speed; + } + // *************************************************************************** + // TV mode + // *************************************************************************** + uint16_t handleE131(void) { + WS2812FX::Segment* _seg = strip->getSegment(); + if (!e131->isEmpty()) { + e131_packet_t packet; + e131->pull(&packet); // Pull packet from ring buffer + + uint16_t universe = htons(packet.universe); + uint8_t *data = packet.property_values + 1; + + if (universe < START_UNIVERSE || universe > END_UNIVERSE) return _seg->speed; //async will take care about filling the buffer + + // Serial.printf("Universe %u / %u Channels | Packet#: %u / Errors: %u / CH1: %u\n", + // htons(packet.universe), // The Universe for this packet + // htons(packet.property_value_count) - 1, // Start code is ignored, we're interested in dimmer data + // e131.stats.num_packets, // Packet counter + // e131.stats.packet_errors, // Packet error counter + // packet.property_values[1]); // Dimmer data for Channel 1 + /* #if defined(RGBW) + uint16_t multipacketOffset = (universe - START_UNIVERSE) * 128; //if more than 128 LEDs * 4 colors = 512 channels, client will send in next higher universe + if (NUMLEDS <= multipacketOffset) return; + uint16_t len = (128 + multipacketOffset > Config.stripSize) ? (Config.stripSize - multipacketOffset) : 128; + #else*/ + uint16_t multipacketOffset = (universe - START_UNIVERSE) * 170; //if more than 170 LEDs * 3 colors = 510 channels, client will send in next higher universe + if (Config.stripSize <= multipacketOffset) return _seg->speed; + uint16_t len = (170 + multipacketOffset > Config.stripSize) ? (Config.stripSize - multipacketOffset) : 170; + /* #endif */ + for (uint16_t i = 0; i < len; i++){ + if ((i >= _seg->start) && (i <= _seg->stop)) { + uint16_t j = i * 3; + /* #if defined(RGBW) + strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], data[j + 3]); + #else */ + strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], 0); + /* #endif */ + } + } + } + return _seg->speed; + } + /* * paste in the Fire2012 code with a small edit at the end which uses the * setPixelColor() function to copy the color data to the ws2812fx instance. @@ -106,152 +202,52 @@ void handleAutoPlay(uint8_t _seg) { // Default 120, suggested range 50-200. #define SPARKING 120 -#endif - -uint16_t handleAuto() { - WS2812FX::Segment* _seg = strip->getSegment(); - return _seg->speed; -} - -uint16_t handleCustomWS(void) { - WS2812FX::Segment* _seg = strip->getSegment(); - return _seg->speed; -} -#if defined(CUSTOM_WS2812FX_ANIMATIONS) -uint16_t handleTV(void) { - WS2812FX::Segment* _seg = strip->getSegment(); - if (timeToDip == false) { - currentMillis = millis(); - if(currentMillis-previousMillis > interv) { - previousMillis = currentMillis; - //interv = random(750,4001);//Adjusts the interval for more/less frequent random light changes - interv = random(1000-(_seg->speed/128),5001-(_seg->speed/32)); - twitch = random(40,100);// Twitch provides motion effect but can be a bit much if too high - dipCount = dipCount++; + uint16_t handleFire2012(void) { + // Array of temperature readings at each simulation cell + WS2812FX::Segment* _seg = strip->getSegment(); + + // Step 1. Cool down every cell a little + for( uint16_t i = _seg->start; i <= _seg->stop; i++) { + ledstates[i] = qsub8(ledstates[i], random8(0, ((COOLING * 10) / (_seg->stop - _seg->start)+1) + 2)); } - if(currentMillis-previousMillisstart, _seg->stop); - ledState = ledState == LOW ? HIGH : LOW; // if the LED is off turn it on and vice-versa: - ledstates[led] = ((ledState) ? 255 : 0); - for (uint16_t j=_seg->start; j<=_seg->stop; j++) { - uint16_t index = (j%3 == 0) ? 400 : random(0,767); - hsb2rgbAN1(index, 200, ledstates[j], j); - } - if (dipCount > dipInterval) { - DBG_OUTPUT_PORT.println("dip"); - timeToDip = true; - dipCount = 0; - dipStartTime = millis(); - darkTime = random(50,150); - dipInterval = random(5,250);// cycles of flicker - } - } - } else { - DBG_OUTPUT_PORT.println("Dip Time"); - currentDipTime = millis(); - if (currentDipTime - dipStartTime < darkTime) { - for (uint16_t i=(_seg->start + 3); i<= _seg->stop; i++) { - ledstates[i] = State.brightness; - for (uint16_t j=_seg->start; j<=_seg->stop; j++) { - uint16_t index = (j%3 == 0) ? 400 : random(0,767); - hsb2rgbAN1(index, 200, ledstates[j], j); - } - } - } else { - timeToDip = false; - } - } - return _seg->speed; -} - -uint16_t handleE131(void) { - WS2812FX::Segment* _seg = strip->getSegment(); - if (!e131->isEmpty()) { - e131_packet_t packet; - e131->pull(&packet); // Pull packet from ring buffer - - uint16_t universe = htons(packet.universe); - uint8_t *data = packet.property_values + 1; - - if (universe < START_UNIVERSE || universe > END_UNIVERSE) return _seg->speed; //async will take care about filling the buffer - - // Serial.printf("Universe %u / %u Channels | Packet#: %u / Errors: %u / CH1: %u\n", - // htons(packet.universe), // The Universe for this packet - // htons(packet.property_value_count) - 1, // Start code is ignored, we're interested in dimmer data - // e131.stats.num_packets, // Packet counter - // e131.stats.packet_errors, // Packet error counter - // packet.property_values[1]); // Dimmer data for Channel 1 -/* #if defined(RGBW) - uint16_t multipacketOffset = (universe - START_UNIVERSE) * 128; //if more than 128 LEDs * 4 colors = 512 channels, client will send in next higher universe - if (NUMLEDS <= multipacketOffset) return; - uint16_t len = (128 + multipacketOffset > Config.stripSize) ? (Config.stripSize - multipacketOffset) : 128; - #else*/ - uint16_t multipacketOffset = (universe - START_UNIVERSE) * 170; //if more than 170 LEDs * 3 colors = 510 channels, client will send in next higher universe - if (Config.stripSize <= multipacketOffset) return _seg->speed; - uint16_t len = (170 + multipacketOffset > Config.stripSize) ? (Config.stripSize - multipacketOffset) : 170; -/* #endif */ - for (uint16_t i = 0; i < len; i++){ - if ((i >= _seg->start) && (i <= _seg->stop)) { - uint16_t j = i * 3; - /* #if defined(RGBW) - strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], data[j + 3]); - #else */ - strip->setPixelColor(i + multipacketOffset, data[j], data[j + 1], data[j + 2], 0); - /* #endif */ - } - } - } - return _seg->speed; -} - -uint16_t handleFire2012(void) { -// Array of temperature readings at each simulation cell - WS2812FX::Segment* _seg = strip->getSegment(); - - // Step 1. Cool down every cell a little - for( uint16_t i = _seg->start; i <= _seg->stop; i++) { - ledstates[i] = qsub8(ledstates[i], random8(0, ((COOLING * 10) / (_seg->stop - _seg->start)+1) + 2)); - } - - // Step 2. Heat from each cell drifts 'up' and diffuses a little - for( uint16_t k= _seg->stop; k >= (_seg->start + 2); k--) { - ledstates[k] = (ledstates[k - 1] + ledstates[k - 2] + ledstates[k - 2]) / 3; - } - - // Step 3. Randomly ignite new 'sparks' of heat near the bottom - if( random8() < SPARKING ) { - uint8_t y = random8(7) + _seg->start; - ledstates[y] = qadd8(ledstates[y], random8(160,255) ); - } - - // Step 4. Map from heat cells to LED colors - // 98 143 - for( uint16_t j = _seg->start; j <= _seg->stop; j++) { - CRGB color = HeatColor(ledstates[j]); - uint16_t pixel; - if ((_seg->options & 128) > 0) { - pixel = _seg->stop + (_seg->start - j); - } else { - pixel = j; + // Step 2. Heat from each cell drifts 'up' and diffuses a little + for( uint16_t k= _seg->stop; k >= (_seg->start + 2); k--) { + ledstates[k] = (ledstates[k - 1] + ledstates[k - 2] + ledstates[k - 2]) / 3; } - strip->setPixelColor(pixel, color.red, color.green, color.blue, 0); - } - return _seg->speed; -} - -uint16_t handleGradient() { - WS2812FX::Segment* _seg = strip->getSegment(); - for(uint16_t j = 0; j <= (_seg->stop - _seg->start); j++) { - uint16_t pixel; - if ((_seg->options & 128) > 0) { - pixel = _seg->stop - j; - } else { - pixel = _seg->start + j; + + // Step 3. Randomly ignite new 'sparks' of heat near the bottom + if( random8() < SPARKING ) { + uint8_t y = random8(7) + _seg->start; + ledstates[y] = qadd8(ledstates[y], random8(160,255) ); } - uint32_t color = trans(_seg->colors[1], _seg->colors[0], j, (_seg->stop - _seg->start)); - strip->setPixelColor(pixel, ((color >> 16) & 0xFF), ((color >> 8) & 0xFF), ((color >> 0) & 0xFF), ((color >> 24) & 0xFF)); + + // Step 4. Map from heat cells to LED colors + for( uint16_t j = _seg->start; j <= _seg->stop; j++) { + CRGB color = HeatColor(ledstates[j]); + uint16_t pixel; + if ((_seg->options & 128) > 0) { + pixel = _seg->stop + (_seg->start - j); + } else { + pixel = j; + } + strip->setPixelColor(pixel, color.red, color.green, color.blue, 0); + } + return _seg->speed; + } + + uint16_t handleGradient() { + WS2812FX::Segment* _seg = strip->getSegment(); + for(uint16_t j = 0; j <= (_seg->stop - _seg->start); j++) { + uint16_t pixel; + if ((_seg->options & 128) > 0) { + pixel = _seg->stop - j; + } else { + pixel = _seg->start + j; + } + uint32_t color = trans(_seg->colors[1], _seg->colors[0], j, (_seg->stop - _seg->start)); + strip->setPixelColor(pixel, ((color >> 16) & 0xFF), ((color >> 8) & 0xFF), ((color >> 0) & 0xFF), ((color >> 24) & 0xFF)); + } + return _seg->speed; } - return _seg->speed; -} #endif diff --git a/Arduino/McLighting/request_handlers.h b/Arduino/McLighting/request_handlers.h index 8d2f7f5..49339a7 100644 --- a/Arduino/McLighting/request_handlers.h +++ b/Arduino/McLighting/request_handlers.h @@ -267,14 +267,13 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { // / ==> Set active segment if (_payload[0] == 'S') { if (_payload[1] == 's') { - uint8_t seg = (uint8_t) strtol((const char *) &_payload[2], NULL, 10); - State.segment = constrain(seg, 0, Config.segments - 1); - if (prevsegment != State.segment) { + uint8_t _seg = (uint8_t) strtol((const char *) &_payload[2], NULL, 10); + _seg = constrain(_seg, 0, Config.segments - 1); + if (prevsegment != _seg) { prevsegment = State.segment; + State.segment = _seg; getSegmentParams(State.segment); - //convertColors(); - //memcpy(segState.colors[State.segment], hexcolors_trans, sizeof(hexcolors_trans)); - memcpy(hexcolors_trans, segState.colors[State.segment], sizeof(hexcolors_trans)); + //memcpy(hexcolors_trans, segState.colors[State.segment], sizeof(hexcolors_trans)); _updateState = true; Dbg_Prefix(mqtt, num); DBG_OUTPUT_PORT.printf("Set segment to: [%u]\r\n", State.segment); @@ -283,7 +282,6 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { // / ==> Set segment first LED if (_payload[1] == '[') { uint16_t _seg_start = (uint16_t) strtol((const char *) &_payload[2], NULL, 10); - //getSegmentParams(State.segment); _seg_start = constrain(_seg_start, 0, Config.stripSize - 1); if (_seg_start != segState.start) { segState.start = _seg_start; @@ -296,7 +294,6 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { // / ==> Set segment last LED if (_payload[1] == ']') { uint16_t _seg_stop = (uint16_t) strtol((const char *) &_payload[2], NULL, 10); - //getSegmentParams(State.segment); _seg_stop = constrain(_seg_stop, segState.start, Config.stripSize - 1); if (_seg_stop != segState.stop) { segState.stop = _seg_stop; @@ -439,6 +436,7 @@ void checkpayload(uint8_t * _payload, bool mqtt = false, uint8_t num = 0) { if(!save_state.active()) save_state.once(3, tickerSaveState); } if (_updateSegState) { + State.mode = SET; DBG_OUTPUT_PORT.println("Saving stripstate_segment.json!"); if(!save_seg_state.active()) save_seg_state.once(3, tickerSaveSegmentState); @@ -761,6 +759,8 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght } bool processJson(char* message) { + bool _updateState = false; + bool _updateSegState = false; const size_t bufferSize = JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(12) + 500; DynamicJsonDocument jsonBuffer(bufferSize); DeserializationError error = deserializeJson(jsonBuffer, message); @@ -777,14 +777,25 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght const char* state_in = root["state"]; if (strcmp(state_in, on_cmd) == 0) { State.mode = SET; + _updateState = true; } else if (strcmp(state_in, off_cmd) == 0) { State.mode = OFF; + _updateState = true; jsonBuffer.clear(); return true; } } - + if (root.containsKey("segment")) { + uint8_t json_segment = constrain((uint8_t) root["segment"], 0, Config.segments - 1); + if (prevsegment != json_segment) { + prevsegment = State.segment; + State.segment = json_segment; + getSegmentParams(State.segment); + State.mode = SET; + _updateState = true; + } + } if (root.containsKey("color")) { JsonObject color = root["color"]; main_color.red = (uint8_t) color["r"]; @@ -799,14 +810,14 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght xtra_color.green = (uint8_t) color["g3"]; xtra_color.blue = (uint8_t) color["b3"]; xtra_color.white = (uint8_t) color["w3"]; - State.mode = SET; + _updateSegState = true; } if (root.containsKey("white_value")) { uint8_t json_white_value = constrain((uint8_t) root["white_value"], 0, 255); if (json_white_value != main_color.white) { main_color.white = json_white_value; - State.mode = SET; + _updateSegState = true; } } @@ -814,7 +825,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght uint8_t _fx_speed = constrain((uint8_t) root["speed"], 0, 255); if (_fx_speed != segState.speed[State.segment]) { segState.speed[State.segment] = _fx_speed; - State.mode = SET; + _updateSegState = true; } } @@ -823,7 +834,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght color_temp = (uint16_t) root["color_temp"]; uint16_t kelvin = 1000000 / color_temp; main_color = temp2rgb(kelvin); - State.mode = SET; + _updateSegState = true; } if (root.containsKey("brightness")) { @@ -831,6 +842,7 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght if (json_brightness != State.brightness) { State.brightness = json_brightness; State.mode = SET; + _updateState = true; } } @@ -839,16 +851,32 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght #if defined(ENABLE_HOMEASSISTANT) if(effectString == "OFF"){ State.mode = OFF; + _updateState = true; } #endif for (uint8_t i = 0; i < strip->getModeCount(); i++) { if(String(strip->getModeName(i)) == effectString) { State.mode = SET; fx_mode = i; + _updateState = true; + _updateSegState = true; break; } } } + #if defined(ENABLE_STATE_SAVE) + if (_updateState) { + DBG_OUTPUT_PORT.println("Saving stripstate.json!"); + if(!save_state.active()) save_state.once(3, tickerSaveState); + } + if (_updateSegState) { + State.mode = SET; + DBG_OUTPUT_PORT.println("Saving stripstate_segment.json!"); + if(!save_seg_state.active()) save_seg_state.once(3, tickerSaveSegmentState); + } + #endif + _updateState = false; + _updateSegState = false; jsonBuffer.clear(); return true; } @@ -1196,6 +1224,8 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght // *************************************************************************** void handleRemote() { uint8_t chng = 1; + bool _updateState = false; + bool _updateSegState = false; if (irrecv.decode(&results)) { DBG_OUTPUT_PORT.print("IR Code: 0x"); DBG_OUTPUT_PORT.print(uint64ToString(results.value, HEX)); @@ -1208,8 +1238,10 @@ void handleRemote() { last_remote_cmd = 0; if (State.mode == OFF) { State.mode = SET; + _updateState = true; } else { State.mode = OFF; + _updateState = true;; } } if (State.mode == HOLD) { @@ -1217,14 +1249,14 @@ void handleRemote() { last_remote_cmd = results.value; if (State.brightness + chng <= 255) { State.brightness = State.brightness + chng; - State.mode = SET; + _updateState = true; } } if (results.value == rmt_commands[BRIGHTNESS_DOWN]) { //Brightness down last_remote_cmd = results.value; if (State.brightness - chng >= 0) { State.brightness = State.brightness - chng; - State.mode = SET; + _updateState = true; } } if ((segState.mode[State.segment] < FX_MODE_CUSTOM_0) || (segState.mode[State.segment] > FX_MODE_CUSTOM_1)) { @@ -1232,14 +1264,14 @@ void handleRemote() { last_remote_cmd = results.value; if (segState.speed[State.segment] + chng <= 65535) { segState.speed[State.segment] = segState.speed[State.segment] + chng; - State.mode = SET; + _updateSegState = true; } } if (results.value == rmt_commands[SPEED_DOWN]) { //Speed down last_remote_cmd = results.value; if (segState.speed[State.segment] - chng >= 0) { segState.speed[State.segment] = segState.speed[State.segment] - chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1249,19 +1281,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.red + chng <= 255) { main_color.red = main_color.red + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.red + chng <= 255) { back_color.red = back_color.red + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.red + chng <= 255) { xtra_color.red = xtra_color.red + chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1270,19 +1302,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.red - chng >= 0) { main_color.red = main_color.red - chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.red - chng >= 0) { back_color.red = back_color.red - chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.red - chng >= 0) { xtra_color.red = xtra_color.red - chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1291,19 +1323,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.green + chng <= 255) { main_color.green = main_color.green + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.green + chng <= 255) { back_color.green = back_color.green + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.green + chng <= 255) { xtra_color.green = xtra_color.green + chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1312,19 +1344,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.green - chng >= 0) { main_color.green = main_color.green - chng;; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.green - chng >= 0) { back_color.green = back_color.green - chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.green - chng >= 0) { xtra_color.green = xtra_color.green - chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1333,19 +1365,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.blue + chng <= 255) { main_color.blue = main_color.blue + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.blue + chng <= 255) { back_color.blue = back_color.blue + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.blue + chng <= 255) { xtra_color.blue = xtra_color.blue + chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1354,19 +1386,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.blue - chng >= 0) { main_color.blue = main_color.blue - chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.blue - chng >= 0) { back_color.blue = back_color.blue - chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.blue - chng >= 0) { xtra_color.blue = xtra_color.blue - chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1375,19 +1407,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.white + chng <= 255) { main_color.white = main_color.white + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.white + chng <= 255) { back_color.white = back_color.white + chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.white + chng <= 255) { xtra_color.white = xtra_color.white + chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1396,19 +1428,19 @@ void handleRemote() { if (selected_color == 1) { if (main_color.white - chng >= 0) { main_color.white = main_color.white - chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 2) { if (back_color.white - chng >= 0) { back_color.white = back_color.white - chng; - State.mode = SET; + _updateSegState = true; } } if (selected_color == 3) { if (xtra_color.white - chng >= 0) { xtra_color.white = xtra_color.white - chng; - State.mode = SET; + _updateSegState = true; } } } @@ -1431,48 +1463,61 @@ void handleRemote() { if ((segState.mode[State.segment] < strip->getModeCount()-1) && (State.mode == HOLD)) { fx_mode = segState.mode[State.segment] + 1; } - State.mode = SET; + _updateSegState = true; } if (results.value == rmt_commands[MODE_DOWN]) { //Mode down last_remote_cmd = results.value; if ((segState.mode[State.segment] > 0) && (State.mode == HOLD)) { fx_mode = segState.mode[State.segment] - 1; } - State.mode = SET; + _updateSegState = true; } if (results.value == rmt_commands[AUTOMODE]) { // Toggle Automode last_remote_cmd = 0; fx_mode = 56; - State.mode = SET; + _updateSegState = true; } #if defined(CUSTOM_WS2812FX_ANIMATIONS) if (results.value == rmt_commands[CUST_1]) { // Select TV Mode last_remote_cmd = 0; fx_mode = 57; - State.mode = SET; + _updateSegState = true; } #endif if (results.value == rmt_commands[CUST_2]) { // Select Custom Mode 2 last_remote_cmd = 0; fx_mode = 12; - State.mode = SET; + _updateSegState = true; } if (results.value == rmt_commands[CUST_3]) { // Select Custom Mode 3 last_remote_cmd = 0; fx_mode = 48; - State.mode = SET; + _updateSegState = true; } if (results.value == rmt_commands[CUST_4]) { // Select Custom Mode 4 last_remote_cmd = 0; fx_mode = 21; - State.mode = SET; + _updateSegState = true; } if (results.value == rmt_commands[CUST_5]) { // Select Custom Mode 5 last_remote_cmd = 0; fx_mode = 46; - State.mode = SET; + _updateSegState = true; } irrecv.resume(); // Receive the next value } + #if defined(ENABLE_STATE_SAVE) + if (_updateState) { + DBG_OUTPUT_PORT.println("Saving stripstate.json!"); + if(!save_state.active()) save_state.once(3, tickerSaveState); + } + if (_updateSegState) { + State.mode = SET; + DBG_OUTPUT_PORT.println("Saving stripstate_segment.json!"); + if(!save_seg_state.active()) save_seg_state.once(3, tickerSaveSegmentState); + } + #endif + _updateState = false; + _updateSegState = false; } #endif diff --git a/Arduino/McLighting/rest_api.h b/Arduino/McLighting/rest_api.h index db1352a..a6703cd 100644 --- a/Arduino/McLighting/rest_api.h +++ b/Arduino/McLighting/rest_api.h @@ -306,12 +306,13 @@ server.on("/set", []() { boolean _updateState = false; boolean _updateSegState = false; // Segment - if ((server.arg("seg") != "") && (server.arg("seg").toInt() >= 0) && (server.arg("seg").toInt() <= MAX_NUM_SEGMENTS)) { - State.segment = server.arg("seg").toInt(); - if (prevsegment != State.segment) { + if ((server.arg("seg") != "") && (server.arg("seg").toInt() >= 0) && (server.arg("seg").toInt() < Config.segments)) { + uint8_t _seg = server.arg("seg").toInt(); + if (prevsegment != _seg) { prevsegment = State.segment; + State.segment = _seg; getSegmentParams(State.segment); - memcpy(hexcolors_trans, segState.colors[State.segment], sizeof(hexcolors_trans)); + //memcpy(hexcolors_trans, segState.colors[State.segment], sizeof(hexcolors_trans)); State.mode = SET; _updateState = true; } @@ -350,18 +351,23 @@ server.on("/set", []() { main_color.red = ((rgb >> 16) & 0xFF); main_color.green = ((rgb >> 8) & 0xFF); main_color.blue = ((rgb >> 0) & 0xFF); + _updateSegState = true; } else { if ((server.arg("r") != "") && (server.arg("r").toInt() >= 0) && (server.arg("r").toInt() <= 255)) { main_color.red = server.arg("r").toInt(); + _updateSegState = true; } if ((server.arg("g") != "") && (server.arg("g").toInt() >= 0) && (server.arg("g").toInt() <= 255)) { main_color.green = server.arg("g").toInt(); + _updateSegState = true; } if ((server.arg("b") != "") && (server.arg("b").toInt() >= 0) && (server.arg("b").toInt() <= 255)) { main_color.blue = server.arg("b").toInt(); + _updateSegState = true; } if ((server.arg("w") != "") && (server.arg("w").toInt() >= 0) && (server.arg("w").toInt() <= 255)){ main_color.white = server.arg("w").toInt(); + _updateSegState = true; } } if (server.arg("rgb2") != "") { @@ -370,18 +376,23 @@ server.on("/set", []() { back_color.red = ((rgb2 >> 16) & 0xFF); back_color.green = ((rgb2 >> 8) & 0xFF); back_color.blue = ((rgb2 >> 0) & 0xFF); + _updateSegState = true; } else { if ((server.arg("r2") != "") && (server.arg("r2").toInt() >= 0) && (server.arg("r2").toInt() <= 255)) { back_color.red = server.arg("r2").toInt(); + _updateSegState = true; } if ((server.arg("g2") != "") && (server.arg("g2").toInt() >= 0) && (server.arg("g2").toInt() <= 255)) { back_color.green = server.arg("g2").toInt(); + _updateSegState = true; } if ((server.arg("b2") != "") && (server.arg("b2").toInt() >= 0) && (server.arg("b2").toInt() <= 255)) { back_color.blue = server.arg("b2").toInt(); + _updateSegState = true; } if ((server.arg("w2") != "") && (server.arg("w2").toInt() >= 0) && (server.arg("w2").toInt() <= 255)){ back_color.white = server.arg("w2").toInt(); + _updateSegState = true; } } if (server.arg("rgb3") != "") { @@ -390,18 +401,23 @@ server.on("/set", []() { xtra_color.red = ((rgb3 >> 16) & 0xFF); xtra_color.green = ((rgb3 >> 8) & 0xFF); xtra_color.blue = ((rgb3 >> 0) & 0xFF); + _updateSegState = true; } else { if ((server.arg("r3") != "") && (server.arg("r3").toInt() >= 0) && (server.arg("r3").toInt() <= 255)) { xtra_color.red = server.arg("r3").toInt(); + _updateSegState = true; } if ((server.arg("g3") != "") && (server.arg("g3").toInt() >= 0) && (server.arg("g3").toInt() <= 255)) { xtra_color.green = server.arg("g3").toInt(); + _updateSegState = true; } if ((server.arg("b3") != "") && (server.arg("b3").toInt() >= 0) && (server.arg("b3").toInt() <= 255)) { xtra_color.blue = server.arg("b3").toInt(); + _updateSegState = true; } if ((server.arg("w3") != "") && (server.arg("w3").toInt() >= 0) && (server.arg("w3").toInt() <= 255)){ xtra_color.white = server.arg("w3").toInt(); + _updateSegState = true; } } main_color.red = constrain(main_color.red, 0, 255); @@ -421,14 +437,12 @@ server.on("/set", []() { // Speed if ((server.arg("s") != "") && (server.arg("s").toInt() >= 0) && (server.arg("s").toInt() <= 255)) { segState.speed[State.segment] = constrain(server.arg("s").toInt(), 0, 255); - State.mode = SET; _updateSegState = true; } //Mode if ((server.arg("m") != "") && (server.arg("m").toInt() >= 0) && (server.arg("m").toInt() <= strip->getModeCount())) { fx_mode = constrain(server.arg("m").toInt(), 0, strip->getModeCount() - 1); if (fx_mode != segState.mode[State.segment]) { - State.mode = SET; _updateSegState = true; } } @@ -453,6 +467,7 @@ server.on("/set", []() { } if (_updateSegState) { DBG_OUTPUT_PORT.println("Saving stripstate_segment.json!"); + State.mode = SET; if(!save_seg_state.active()) save_seg_state.once(3, tickerSaveSegmentState); } #endif diff --git a/Arduino/McLighting/version.h b/Arduino/McLighting/version.h index ed730ee..5ae212f 100644 --- a/Arduino/McLighting/version.h +++ b/Arduino/McLighting/version.h @@ -1 +1 @@ -#define SKETCH_VERSION "3.1.0.BETA1" +#define SKETCH_VERSION "3.1.0.BETA2" diff --git a/Arduino/McLighting/version_info.ino b/Arduino/McLighting/version_info.ino index 30905f8..17782ae 100644 --- a/Arduino/McLighting/version_info.ino +++ b/Arduino/McLighting/version_info.ino @@ -207,6 +207,13 @@ * further integration of multi segments * known problem: as always: AUTOPLAY (as it is not multi segment capable yet) * + * 07 October * Version Bump to 3.1.0.BETA1 * bugfixes + * adressed issue: #39 uncooment //#define ENABLE_MQTT_INCLUDE_IP in defninitions.h + * + * 09 October + * Version Bump to 3.1.0.BETA2 + * bugfixes + * implemented https://github.com/FabLab-Luenen/McLighting/commit/589806d0fda737011426754a6d84c88535ded688 */ diff --git a/clients/web/index.htm b/clients/web/index.htm index 15dee02..23b9d91 100644 --- a/clients/web/index.htm +++ b/clients/web/index.htm @@ -1929,9 +1929,9 @@ function initSettings() { redrawColorPicker(); }); var settransitionEffects = document.getElementById("set-transitionEffects"); - settransitionEffects.checked = config.transitionEffects; + settransitionEffects.checked = config.ws_trans; settransitionEffects.addEventListener('change', ()=>{ - config.transitionEffects = settransitionEffects.checked; + config.ws_trans = settransitionEffects.checked; if (settransitionEffects.checked) { document.getElementById("settransitionEffectsbgcolor").style.backgroundColor = settings.theme_btn; ws_send("Ce1"); diff --git a/clients/web/index.htm.gz b/clients/web/index.htm.gz index e149892ae8cc7456edca8454e32d606141d08320..7a3f8fff5c9cfa886e74e8f988795f5a9df81944 100644 GIT binary patch delta 5458 zcmV-Y6|L&!p#kKf0S6z82na~HoUsSUJAahi?OQ6PNG+GS#MPHdF08X*RiNS5MtoGJ z7o;4WZu3Lu?&KpLf{59+{_NvGTdsGfQ(n*AhpeYoFYi2baWzSnwdW}M2qiUKV!2jQ zdlf|oZM1^sBL-z?WjZ_Km+=jORk5O=ZLcKzJEG; z^UdyS<#2lvZvTzftKjw}+;I4~+ua$$Ij@i~*!gO;m`)mW9x611^7(3&$J-!mvn*RB z0+~~^;n6_;yShr>tg5Waly!3U2*C=<)uBTV;L+EKUr6TTNz-=7dl_9ux|)}Js> zhitUO%E&q9vJstb^6;_g2h%W1mDW7QvrfPYi5btBMd zH1dvb_rXeX5?{ar0qw>*_zO5kw;l34K5daz9N?tl8f-D{GIp#yen4l8ws7NAxSe~>U>qEe$wkw zZ?qEez*F!_Zn&*{HksuKtbhCQoBL6>Tv@UpZ2_v5!ekX11JDL+lLa9!H7La>wQ+rg zgFsI$o=;}6cygsl99}VxFAx8yCOOq0*r0VF`LZ4&^McT=ys$3CpNsai4aF#sP4lo$ zhP=ByuIJCeo1{Yf)x{UOTLt?NtYcrI2H@f{mkgQEb?;TtpGlLwHh)&Z3!E#Xm=W`E z*>I^W&gj~Ve5#Xi{mV2Y^D6AsWbIsoRe$zvFo(|?gC?(n=`m`;>ScLiM&Efp|4{c4 z%h?iKH4SxSwj1e&|5B8wwzv@0={n6y*B|X>oh%lARg0orxpdgLN%J20$q|4l8%k;? zp1)H&#=d-iEvhSV?|&{R*9Pe@ypJZP(zpFqW%JYy9+YAYan{}42cGqXsd9)KH_+NJ zqolXk15Q+%u%WS_z6CgzY7DC`}Y%0QQ|FK>GcpR9*E)!u{^_AqgmwK5I6pQ1fyys1OmM>1`qt{2T)28K%k7twf{oRgov47rOCRY=xM3NE1a~{cs zL_qhfBD@aIZ;Uf2Wr$z8zRRs06a(yj6B%BD|BaBlfLpN!F>V{!y%4Di*v-C;rzb1$ z*mF9jKtZ|}F+I#Lw!4A+o&93C;OLMIv1U9M&H;WE=V^kEjE_WG8Y`UlUKBlEtYDm6uX50Z1O~8MhHjq5aHiee z_C8*&0(L~0=!9H{G>|cr5>b^|=d;OjLnTq_{P3`XS&BVy_hTHdj|rGp_Fi+?YuSTV zI6c$B%Aa9J`(Vs?D(A+EMjs%l>zJ-5q?Wm!jonV5Rexg|%$vcYR;5i}tsp>CX$XN) zsC$@Wi5>V&3Z0b(APxtL&wrMjC6Tp1lC|g1N_Fs>pshNXCazizpnF_7k&jfESvPRdG+Y%xNWaN z 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 delta 5459 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 J{f0)R0RS|(sgwW! From 06244d2717306dbcc2db38a296a0b4b6d56eec30 Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Sun, 20 Oct 2019 09:36:25 +0200 Subject: [PATCH 17/28] 3.1.0.BETA3 * Version Bump to 3.1.0.BETA3 * Bugfixes * adresse issue: #39 --- Arduino/McLighting/McLighting.ino | 4 ++-- Arduino/McLighting/definitions.h | 8 +++++--- Arduino/McLighting/request_handlers.h | 3 ++- Arduino/McLighting/version.h | 2 +- Arduino/McLighting/version_info.ino | 6 ++++++ 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino index 4f8a302..453d336 100644 --- a/Arduino/McLighting/McLighting.ino +++ b/Arduino/McLighting/McLighting.ino @@ -535,11 +535,11 @@ void setup() { DBG_OUTPUT_PORT.print("Use http://"); DBG_OUTPUT_PORT.print(HOSTNAME); DBG_OUTPUT_PORT.println(".local/ when you have Bonjour installed."); - +#if !defined(USE_HTML_MIN_GZ) DBG_OUTPUT_PORT.print("New users: Open http://"); DBG_OUTPUT_PORT.print(WiFi.localIP()); DBG_OUTPUT_PORT.println("/upload to upload the webpages first."); - +#endif DBG_OUTPUT_PORT.println(""); // *************************************************************************** diff --git a/Arduino/McLighting/definitions.h b/Arduino/McLighting/definitions.h index b6f474e..0c4c147 100644 --- a/Arduino/McLighting/definitions.h +++ b/Arduino/McLighting/definitions.h @@ -11,8 +11,7 @@ #define RGBORDER "GRBW" // RGBOrder; is configurable just for the start #define FX_OPTIONS 48 // ws2812fx Options 48 = SIZE_SMALL + FADE_MEDIUM is configurable just for the start; for WS2812FX setSegment OPTIONS, see: https://github.com/kitesurfer1404/WS2812FX/blob/master/extras/WS2812FX%20Users%20Guide.md //#define LED_TYPE_WS2811 // Uncomment, if LED type uses 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) -#define LED_BUILTIN 2 // ESP-12F has the built in LED on GPIO2, see https://github.com/esp8266/Arduino/issues/2192 -//#define POWER_SUPPLY 12 // PIN (12 / D6) If defined, enable output to control external power supply +#define LED_BUILTIN 2 // ESP-12F has the built in LED on GPIO2, see https://github.com/esp8266/Arduino/issues/2192 char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just for the start. Hostname should not contain spaces as this can break Home Assistant discovery if used. #define ENABLE_OTA 1 // If defined, enable Arduino OTA code. If set to 0 enable Arduino OTA code, if set to 1 enable ESP8266HTTPUpdateServer OTA code. @@ -21,12 +20,15 @@ char HOSTNAME[65] = "McLightingRGBW"; // Friedly hostname is configurable just //#define ENABLE_MQTT_INCLUDE_IP // uncomment/comment to add the IP-adress to the MQTT message #define ENABLE_HOMEASSISTANT // If defined, enable Homeassistant integration, ENABLE_MQTT must be active #define MQTT_HOME_ASSISTANT_SUPPORT // If defined, use AMQTT and select Tools -> IwIP Variant -> Higher Bandwidth + #define ENABLE_BUTTON 14 // If defined, enable button handling code, see: https://github.com/toblum/McLighting/wiki/Button-control, the value defines the input pin (14 / D5) for switching the LED strip on / off, connect this PIN to ground to trigger button. //#define ENABLE_BUTTON_GY33 12 // If defined, enable button handling code for GY-33 color sensor to scan color. The value defines the input pin (12 / D6) for read color data with RGB sensor, connect this PIN to ground to trigger button. +//#define POWER_SUPPLY 12 // PIN (12 / D6) If defined, enable output to control external power supply +//#define ENABLE_REMOTE 13 // If defined, enable Remote Control via TSOP31238. The value defines the input pin (13 / D7) for TSOP31238 Out + #if defined(ENABLE_BUTTON_GY33) #define GAMMA 2.5 // Gamma correction for GY-33 sensor #endif -//#define ENABLE_REMOTE 13 // If defined, enable Remote Control via TSOP31238. The value defines the input pin (13 / D7) for TSOP31238 Out #define ENABLE_STATE_SAVE // If defined, load saved state on reboot and save state on SPIFFS diff --git a/Arduino/McLighting/request_handlers.h b/Arduino/McLighting/request_handlers.h index 49339a7..d5ee605 100644 --- a/Arduino/McLighting/request_handlers.h +++ b/Arduino/McLighting/request_handlers.h @@ -712,8 +712,9 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght JsonObject root = jsonBuffer.to(); root["state"] = (State.mode != OFF) ? on_cmd : off_cmd; #if defined(ENABLE_MQTT_INCLUDE_IP) - root["ip"] = WiFi.localIP(); + root["ip"] = WiFi.localIP().toString(); #endif + root["segment"] = State.segment; JsonObject color = root.createNestedObject("color"); color["r"] = main_color.red; color["g"] = main_color.green; diff --git a/Arduino/McLighting/version.h b/Arduino/McLighting/version.h index 5ae212f..a56fcc2 100644 --- a/Arduino/McLighting/version.h +++ b/Arduino/McLighting/version.h @@ -1 +1 @@ -#define SKETCH_VERSION "3.1.0.BETA2" +#define SKETCH_VERSION "3.1.0.BETA3" diff --git a/Arduino/McLighting/version_info.ino b/Arduino/McLighting/version_info.ino index 17782ae..c7975ff 100644 --- a/Arduino/McLighting/version_info.ino +++ b/Arduino/McLighting/version_info.ino @@ -216,4 +216,10 @@ * Version Bump to 3.1.0.BETA2 * bugfixes * implemented https://github.com/FabLab-Luenen/McLighting/commit/589806d0fda737011426754a6d84c88535ded688 + * + * 20 October + * Version Bump to 3.1.0.BETA3 + * Bugfixes + * adresse issue: #39 + * */ From 07da1bdcf3d3d3c68b9d7ff6fa7dfdc05463450b Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Sun, 20 Oct 2019 09:39:06 +0200 Subject: [PATCH 18/28] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 22d21aa..26e4cd7 100644 --- a/README.md +++ b/README.md @@ -67,8 +67,6 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so ## Todos - [ ] Redesign of Code and bump to V3 -- [ ] Support multiple strips and control them separately or together [Issue](https://github.com/toblum/McLighting/issues/118) -- [ ] Support for up to ten segments - [ ] Customer profile to define segments of (in)active areas on the strip [Issue](https://github.com/toblum/McLighting/issues/37) - [ ] Remove old / wrong EEPROM settings completely [Issue] - [ ] Additional clients @@ -77,6 +75,8 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so - [ ] Multiple buttons/GPIO Inputs. [Issue](https://github.com/toblum/McLighting/issues/119) - [ ] Music visualizer / Bring back ArtNet [Issue](https://github.com/toblum/McLighting/issues/111) - [ ] Display version and parameters (Number of LEDs, definition settings, ..) in the web UI [Issue](https://github.com/toblum/McLighting/issues/150) +- [x] Support multiple strips and control them separately or together [Issue](https://github.com/toblum/McLighting/issues/118) +- [x] Support for up to ten segments - [x] Removal of LEGACY_ANIMATIONS - [x] Include ws2812fx library to code due to modifications in library - [x] Add TV, E1.31 and AUTO to CUSTOM_WS2812FX_ANIMATIONS From 02ff21e5321646bb97f28fc977809fc6ea4f1ea1 Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Sun, 20 Oct 2019 19:39:43 +0200 Subject: [PATCH 19/28] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 26e4cd7..289bb94 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # McLighting v3 - The ESP8266 based multi-client lighting gadget -[![Gitter](https://badges.gitter.im/mclighting/Lobby.svg)](https://gitter.im/mclighting/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.com/toblum/McLighting.svg?branch=master)](https://travis-ci.com/toblum/McLighting) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![version](https://img.shields.io/badge/version-v3.0.0-blue.svg)](https://github.com/FabLab-Luenen/McLighting/blob/master/Arduino/McLighting/version.h) +[![Gitter](https://badges.gitter.im/mclighting/Lobby.svg)](https://gitter.im/mclighting/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Build Status](https://travis-ci.com/toblum/McLighting.svg?branch=master)](https://travis-ci.com/toblum/McLighting) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![version](https://img.shields.io/badge/version-v3.1.0-blue.svg)](https://github.com/FabLab-Luenen/McLighting/blob/master/Arduino/McLighting/version.h) McLighting (the multi-client lighting gadget) is a very cheap internet-controllable lighting solution based on the famous ESP8266 microcontroller and WS2811/2812 led strips. It features among other things a web-interface, a REST-API and a websocket connector. @@ -68,13 +68,13 @@ I hope I didn't miss any sources and mentioned every author. In case I forgot so ## Todos - [ ] Redesign of Code and bump to V3 - [ ] Customer profile to define segments of (in)active areas on the strip [Issue](https://github.com/toblum/McLighting/issues/37) -- [ ] Remove old / wrong EEPROM settings completely [Issue] - [ ] Additional clients - [ ] If no wifi, at least enable button mode. - [ ] Also enable McLighting in Wifi AP mode. - [ ] Multiple buttons/GPIO Inputs. [Issue](https://github.com/toblum/McLighting/issues/119) - [ ] Music visualizer / Bring back ArtNet [Issue](https://github.com/toblum/McLighting/issues/111) - [ ] Display version and parameters (Number of LEDs, definition settings, ..) in the web UI [Issue](https://github.com/toblum/McLighting/issues/150) +- [x] Remove old / wrong EEPROM settings completely [Issue] EEPROM saving discarded - [x] Support multiple strips and control them separately or together [Issue](https://github.com/toblum/McLighting/issues/118) - [x] Support for up to ten segments - [x] Removal of LEGACY_ANIMATIONS From bb0bb175fadd0d8dfb96aeb2587cc5c377855bee Mon Sep 17 00:00:00 2001 From: bpohvoodoo Date: Fri, 25 Oct 2019 18:49:00 +0200 Subject: [PATCH 20/28] Version Bump to 3.1.0.BETA4 * Bugfixes * Made GUI fully offline compatible (included material icons, etc.) * After Timeout (#define WIFIMGR_PORTAL_TIMEOUT 180) in definitions.h Config Portal is closed and MCL is usable over own AP @192.168.4.1 * adressed issue: #48 * known problems: E1.31 is only working for one segment at the moment --- Arduino/McLighting/McLighting.ino | 22 +- Arduino/McLighting/data/favicon.ico.gz | Bin 0 -> 12171 bytes Arduino/McLighting/data/index.htm | 35 +- Arduino/McLighting/data/index.htm.gz | Bin 20708 -> 20783 bytes Arduino/McLighting/data/material.woff2 | Bin 0 -> 60832 bytes Arduino/McLighting/definitions.h | 2 +- Arduino/McLighting/htm_edit_gz.h | 1 - Arduino/McLighting/htm_index_gz.h | 3456 ++++----- Arduino/McLighting/html_material_icons.h | 6472 +++++++++++++++++ .../mode_custom_ws2812fx_animations.h | 28 +- Arduino/McLighting/rest_api.h | 29 + Arduino/McLighting/version.h | 2 +- Arduino/McLighting/version_info.ino | 10 +- clients/web/favicon.ico.gz | Bin 0 -> 12171 bytes clients/web/index.htm | 35 +- clients/web/index.htm.gz | Bin 20708 -> 20783 bytes clients/web/material.woff2 | Bin 0 -> 60832 bytes 17 files changed, 8333 insertions(+), 1759 deletions(-) create mode 100644 Arduino/McLighting/data/favicon.ico.gz create mode 100644 Arduino/McLighting/data/material.woff2 create mode 100644 Arduino/McLighting/html_material_icons.h create mode 100644 clients/web/favicon.ico.gz create mode 100644 clients/web/material.woff2 diff --git a/Arduino/McLighting/McLighting.ino b/Arduino/McLighting/McLighting.ino index 453d336..bfeb2c0 100644 --- a/Arduino/McLighting/McLighting.ino +++ b/Arduino/McLighting/McLighting.ino @@ -16,7 +16,6 @@ #include //https://github.com/tzapu/WiFiManager #include -#include #include #include //https://github.com/Links2004/arduinoWebSockets #include @@ -35,6 +34,7 @@ // *************************************************************************** // Load libraries for PubSubClient // *************************************************************************** + #include #include WiFiClient espClient; PubSubClient * mqtt_client; @@ -77,7 +77,8 @@ #if defined(USE_HTML_MIN_GZ) #include "htm_index_gz.h" -#include "htm_edit_gz.h" +#include "htm_edit_gz.h" +#include "html_material_icons.h" #endif @@ -433,8 +434,8 @@ void setup() { if (!wifiManager.autoConnect(HOSTNAME)) { DBG_OUTPUT_PORT.println("failed to connect and hit timeout"); //reset and try again, or maybe put it to deep sleep - ESP.reset(); //Will be removed when upgrading to standalone offline McLightingUI version - delay(1000); //Will be removed when upgrading to standalone offline McLightingUI version + //ESP.reset(); //Will be removed when upgrading to standalone offline McLightingUI version + //delay(1000); //Will be removed when upgrading to standalone offline McLightingUI version } //save the custom parameters to FS/EEPROM @@ -717,7 +718,12 @@ void loop() { if(!strip->isRunning()) strip->start(); strip->service(); for (uint8_t i = 0; i < Config.segments; i++) { - if (segState.mode[i] == FX_MODE_CUSTOM_0) { handleAutoPlay(i); }; + if (segState.mode[i] == FX_MODE_CUSTOM_0) { handleAutoPlay(i); } + if (segState.mode[i] == FX_MODE_CUSTOM_3) { + if (strip->getSpeed(i) > SPEED_MIN) { + strip->setSpeed(i, SPEED_MIN); + } + } } } @@ -786,7 +792,7 @@ void loop() { } } // Async speed transition - if ((segState.mode[prevsegment] != FX_MODE_CUSTOM_0) && (fx_speed != segState.speed[prevsegment])) { + if ((segState.mode[prevsegment] != FX_MODE_CUSTOM_0) && (segState.mode[prevsegment] != FX_MODE_CUSTOM_3) && (fx_speed != segState.speed[prevsegment])) { if (Config.transEffect) { //if (true == false) { // disabled for the moment if (speedFadeDelay <= millis()) { @@ -833,7 +839,9 @@ void loop() { // Segment change only if color and speed transitions are finished, because they are segment specific if (prevsegment != State.segment) { DBG_OUTPUT_PORT.println("Segment not equal"); - if ((segState.mode[State.segment] == FX_MODE_CUSTOM_0) || (segState.mode[State.segment] == FX_MODE_CUSTOM_2) || (segState.mode[prevsegment] == FX_MODE_CUSTOM_0)) { + //if ((segState.mode[State.segment] == FX_MODE_CUSTOM_0) || (segState.mode[State.segment] == FX_MODE_CUSTOM_2) || (segState.mode[prevsegment] == FX_MODE_CUSTOM_0)) { + if ((segState.mode[State.segment] == FX_MODE_CUSTOM_0) || (segState.mode[prevsegment] == FX_MODE_CUSTOM_0)) { + } fx_speed = segState.speed[State.segment]; DBG_OUTPUT_PORT.printf("Switched segment from: %i to %i", prevsegment, State.segment); prevsegment = State.segment; diff --git a/Arduino/McLighting/data/favicon.ico.gz b/Arduino/McLighting/data/favicon.ico.gz new file mode 100644 index 0000000000000000000000000000000000000000..9e0ba66b97836e527dd9bb05fd28bce58665573d GIT binary patch literal 12171 zcmV;6FLcl!iwFoM+51`q0A^u!X=870E@@+L0PURxT-C`I$1iCs)|$`GwbymkT|3v- z)wR1@QFradPV553qC-?b1tnDs1OyZnm9S8;5j*aAznTBJK?%mb_`Emo^L_K*>%H@z zGjpcT8B{6*m5IvCOvL3>V~tg+-YS){=@<9qG$t5kLC@_$!W zsh*Tksamv9{<~T$m1=7nm8u%jz*q5!@_A-~G6?sRACS|7W3>3bJ2*zp527jQ`7_EY z+)uejL+=eG<5v|)MXkUXUoP+I`OGWWDGmsZ7UyR>hvm*+^ ze|Q5I6?v`dMwXVAbmYhpZT`KyyyWkv_wbO8(RzF^Pemys z^V5;NJ7~?CHL1#QiTP?;U*I{-z}JR>-;7_^g|- z7Oy9}CD!EC-IcBsNFg8m^LDTp>==AkD__ckM0z&xJNa8G2@LY0fEs~`z!qGh*Q$4P z8UG~G*j@Z7J-(NcN(Y}rhtsnkkcO!tzF&qbX)3S*XGpDjLXTBy3c+vhMm))|4WuL{ z(!Kt}>6K9({H7b20jz;Py)urWI|J{~^SgL&7U5YU>c!5Nk`{P?07|mIOv!hjX82vz zSB7e!IH;RNKciNw<@-dO+4H-1?O@PYQn zc~RH+(Uk8_8&ZAjLn`%TuoQj54$6Pqp1Q{ekw;t%ef;<_({wTlVTtFcL0mngl^-p) zBKQUL1e3rrum|{n2z)1zevG|J;fZ(klgLyK=j+?4+H+GXgf?v;`ZIM&@FUXdhIj(v z6^QK-2Z9(pKSTehrW{w3Y4?R#kw&KFa}a5_ePcjBBJFY@H&CeyfEu797!OtfS8x{G zL0P>g)dMxDF008f@HOoYjm@xpF5NjpBcGd4AMQ)*ffB$-_Q~ZyYaSQY01t2x>7!qK zhP1De(#Luc<=B->Vb`@~rLD`=@pWi6@+(T9KjOBa7M{&Mq6W^_r7?$Q(GZJ?G}K}m zO+M;KW7zA2BH=srSGbtb- zfHrN~L{q0umF(KJiw++?Oj|EpC1Zb#FZ+C;QcPdT@CDjn5+Y5Q` zgt!e+{#LhT8%(%yk!~Tq1aKW(0_TCF&ls|?u@UKu^wPE)`Pt5$J8ARg%`{sK+ z?FOJOs0pflpsUwzQhdBGy+wMj!7K0rJO>sF2hy}@)3oWQ3EK20PDGuLu#n@L>N`*b z6b1!}0*_y(_*h>|6jY>s2$ED7G!SFlTQoma`f1xts`Q5sv5@0lZuH|h5$6D=cn%D_ zP6_cBNPP((Tma$VtV)iHM{P%I%14%YQc@B_MkavB*-W0SIQc{?^jaWB3&!Icnx9;FbTbj;~HAHa3QT-yEa1|9W-bV*_eCN zBGpGS$4^Hf-M)ysfj_&(Y3nNPtP80v@!>)+1B?XSRrIoF++`;v19 zuRs0ifGU~x;OpY&^TAXwN|gQnSZ!UsfB&8m7Sts5MC5xg=nNVu1*tYMqR6rh=FggT0X!YYywNc;(D>7&q>wC-H8gOl)lD99hJ1zqN4I5 zR^)^ul=l;DqOmCdm{Nawo&F<(l&rdfUi=s0zMZ7#NuF zq^%L?1O5ctz!7i>?|DWkNHY#!4FQJ?-q5M-*VB$KskpXh3#F7YM!DbzDl?=}6|}_j zK*Y1a7T^KGKq7sB3=i>+^Cr(J9BF4VMy4*S)2ArDRz3W_B&ZA8BmJR>=OEsMcpu_Z zAQsQhDW*;w-8y?G-T3~AAnQEN#e?F09Y=R_cR@O$W1I^%;@O!Jb046%j;APgUyS^2 zhC!F_Pst_QV8VqMiuVf#5tMN8I{Mu=;@`4F^*4uVyw+>+1?#=+1R=w#SFZ$F*2%XB zFJHc-0~e3bxacMH)1|RgIC>zN#EbyucwS5mFYTlW(MQPhVyLW_ZxtRsen_*U=27A6 z)s*=VH340CEjbk|2Ag>l_rZ70P|<6CG%qrQo;-a@Um8T2Iz;WIQa6eqT@xVU%Ag_W z00!y3e=BeWe&9Ta2T$m`xL9(Gy7<}kBXoF1$S^AZRz-!8lCfNa=L2QI4?L6W52k=6 zz#8la$3Zl>i*k4^=bx(EZ)mJvh#XV06U4ixhIXOGykh?c$P1J*D8`?*1bx6{uoTz; zPjD8*f~TZT= zj|7R3{Vl1I@!p%@0(WUXY8vZ$_LFsSC~_x_eWz$vPcG%3xYi2-16dQL0MGkrB3J<& zc;0^%?@m_AJrVDW=J~TXa051P$RX%rCVKvW=H4hov$#};vxIH=ZRJ32VED+4N;v#L z(|lJ@pTEY^@D(#@yvKGb?1=Dwn;_1ng^zC9_)E~5- zrTGg?1EYXu-B1^G(j}rfUA}dhx_9qR(b3UzuC!{^Dmr!Ql>F@KojcU}H1z+n zWzR#SC0GnF)XcMuOuf!dNg=EFg0dE^z&h5d*l9-=no{{&aL6dVqJ`S6VOK z0tw)ns1NV46c!dn=H}+&{h|)!+&OIs4h|N&DBnM7)F}CzDSx3P>*9SiKs8VqR0QRr z12v+>yXClcJ=T!kW8L>oElIWRS+cC3T#t3^*fHDhhhECx3?8;vS@#qI1%VkTpkPw) ziqJv%{};0bsP9)X7-3BB8*FMt1#!AtbkMR+GL21epD<16CbvJ9eqbCaB` zUI#HiZ{6hWFy^z%f8@xK@;9?59nr0uKnd_2C<4kCj@I_Y(T6cl55|MzB&!0b^VlUsK!G@2t z>#p{oC1?T~0*i6F_g_5iq`cD(>;zkYW?eQNquL*hWgBbPt{ojcdQ`kWQyd)~Y4+^d zw6=MKZe0cjfL@@B$ctE8?Z2RX|MTb1DPawiaufb>HCO~@feB!cvTh5R)}QX6e_yt2 zS!VsO=$qxbbZTWwh@zIsEdjH^WH1^G27L-&le(uLq8!bYjo>-DOv}RSpj4o`BFdpf zW4aL;mFf6%Gx{bSZyEtrQY-5^QH3nh0`Mp2!)8`Q`tdjE9^IO1rpP=D{4NSgzB|>r z@2Np)axK<~d?zlag+0g8>Or%}bEFNqm)b&43~r@b_xZ3Y*?{$68JJllfgU}4Oc{lU z{Z{mTpx8_Y?ZmrTVT;Sg%NMb4H6Zy&c zSI9gJP;L0#-*dywBi@|@lmhj@ugYMitQ&!Qs&(UQm0BKQM1xbDhkf|WcIcTb=fa{- z3?GH`YvM;`_;AC}kUP*yyyor-wChUX0s?u`lSChJHt-BTy8)s=Fy8Il^_-mBW+#X| zgpBJ??~8E9smcXPf|{T?_zjHV!F>ZCLLCF=dD59eZ}Cp09^TU7p=YxFZvDE5*ltC) z%nGyY<-rd;nDz$azWZ@G zy6*=j@cY++y*$|q#(SeFw%}Qc_#=!SJ$OXlDu_Pnf|Dmj4_iXfwZ_xM+`}l=a59)j z7xS#7i?#RC#SuPq!8H`~$*j+0zBYWT^|$KZ9IEkI(a>z{Q>57k`mA%HfA{mZ3P?-t z6`wqNiuMNXqt*UH+)|LI@>o>wE@2JDpm5cM$-OomTRP%S@a+Tnjp z>`i4`XTDT_M0wjEx1(|=%3(d82YD&VEBG3`qtFU;1q1l(Z8{M7x8xPD1E0nD^Pb8D zWl!mSB2@}HO0K~tKRZwAY}Aq9_MKbw+u;tB|Ahe=$#X~(U7+x&!Eg=TV&hh02OwZ3A5J>@9Q$L@Ik)>U$ssd?3{;HTJgDRQkvn z3XZ(+)%qj;ecwq3oL%RjT6}U{5|}BwZoKA=aX=VhO$8~ompTHP_FrYQ3tK@CtI6a#tGnmWh} zO0W(!0Bt}|FdR$+i@*l37aRluARJudvVQ?vfsdG4A^%Ar0bBy%IQu(zgASZH^F{h| zBHR!5205{#tejmpMO+_L$8%ZMqZ~ligt{;&kLS9GTPS@H4MS|M;Tv7ef9@48CC;TJwje{S4NpdsPKXfWQ;n|qYDLc4jF zxGL{f<_Cskfd9|SpQPPKH|KrqExeEJ&AJlJ;@m$ok|3aWrcpd*iAQ^6AM`(1$_ zI1duQQ|Jxa>~pav3$B6lAQ<=pFW?I7fQ_2Etv-}3{W%!8o94VSpqXmr6kr?}j^}=e zyRj~bk*cLyD z?_Vo=b01s>5v1h(m|9u(IV0W+ti@6cwjj%s$<60v+I*+mZ=DnT4_eN>##}Iice6+G z$wGHUmr|bt;5_1czgjeM(P--2xwA~GMT-{XGkNIS(C0GV5fT)Wp zU^EyAday1v1l8h9XwA`;@(jY=-CgXbiL}z@Uw$@x_;A{~b*nsUUVqe=avr~ma|G5I zAK=dVvK?#!tHBar0cL~g?`gY>e@6Nv(_9r;iT0|MQ*Q`1Ea`TIs!a11mhw52z;2BGTpm_U+qpAAiS=9T_3__pe`9YzhJc1F1-nBCrRF zm%3YLI_4GAkiYS2WeaAoCeL{8j<_@Efai80!Qm1zwb zKL>e!t88KPVzbVUY#!Pgv;a-P&)6gXF;cAKv}J$%#8HZUZ$Pmq+iM_(?XE6>2oMI& zfD^zvGzazR(?{5miM~ct{_>2bK!E~T>Q2?FRYjj9o@M@9wQ42OlCtG#gA!}6Mt(ta z@C#_fc3kz@ma7iNf?6->)aejy`TGTKr6grUr@P4G9mKZ~-%wT;Qmz=DF}egb*T}7} zKXM=1%*-sybyM2>`}yhmla8Z;L|&EctU7FW_C21fA+Dn4a~i}IuxIEPp#5Dy-~xJq zyrqEWAQ?OZPr+mG2x!ichK(yq_3PJ{)T&iWqd(gGXAv~{*XWNpQ_!YYyy7tAjTGDM zvfv+V4pfS_35$bb3YP2rwdE4vKNa&HRXRTCP|l%%o&6}WuPqRLd)o5$@d`#XnbuQ~kl* zLYrRM;v=-@V1+SHTr<8C(QW;5-NgXV9PS zZ6bb?W&6#p{&4%14E{BUs-tYHfQq0TC<97?lAt*F4ip7;d;N85tsrmu5Mh9W4&+f7 z-8`AhE8 zIEPcqbGZ75>wubg7BW=@mGE2vae2d66s)&4zIpQ|#kw0SXOuy}U*wm4Exf>fmG&I( z!w$?JCjL%)_wE&T2{Qj2q#Z-~^5v;)*|Hf@u3R}`Z>f2&%>S%evt(Lh2F{_Ls&~pc z9%v1ku@A>jLLTrMA8e&Qu2c@E)fUQG zw|W{7Wj-8nKhRB7BHI*yk9sI&MBWzjMSIBh`cceP4=wQ_U*mW>#rDkmknCQ>+rU~; z7l3RsCR!@=kY-%4fOmz>d{dG&xa}i&>{;3VkXYl=gf-U7z6Z zVnuHz8^|(Ok6?Z21v-INT<*0%c~BUb097t&yZiy?u;Hc+De#xkG_^z%+BJASxr|#& zqs@M$z-BusG=~$ulYs9k=dcezEQkOnxgPcd2Vlecv<8T}m}ihe9`-?5?*9nea;Jpd+3&c^4gUMa0E`7|2yd$WK8aCXPQKZUcJbc|79zU_GAg5qpCWJYPrr z2)w5hF(T+X)7T?) zsMtBWb?bJv_763L9P^@EtxZVXg3G-Qs0>Pjg1}VhjR`0O%7NOT8R!BAfl1&munz12 z2SE^s078cz%d_-XtVanT8k_^ixgHLJEji-ov|rd~?>~z;(7}f8H-zoKa5kxm{FVV? za+pix-2mhjWskTD_z};o5cdE>@jL~w1z3ycU5MR*AD%-IUj_GM9eh9@lL4l_vMpQy zAz~VX*va%Z9dkJORp%Fhb~bdYnki8^BwCCovPK%akwWZ)S%Y<_E$9h`v-6Y%5c%H; z+<1fV4C~M>@I=+>*mHs&c}jEbyWnAB#hH?qy<1I0ll z_L*o3I*7IlMuKTz0ayce02gosoCJ{|4kUpW^bvk7FIbOm2)!v5N+EvPJ6rvP{-lyG z0d4w7tETiu+RWs{dm)cppjMZRfj4W!WVe;g_0E5_u=MS)e4WzArJ#UWtg3}<1QVcJWf29L-Y`u@PgZa{s9sSARS=L9ek1zR; znTPp9ce-xei9Q$%L79#h`A57Etj6;;#CG)Fz>Q*zcT+%R8}ggrj(#y%%>AzHLapY!}B`tzR@RR0hE)=-Uo z$rfb8PV4{SUl({^MfA&JZ(sNmi}O|S`F~v-&rT3BdLHqDU&uP@?KYk2yA7cdE`kVg1E`?KD10`a8o17-er{`Mi5vX#eY~ZA^?zd!dx|TZ*H9zpu9P#VJ{i3b zcP4aXFR_7OB%gNv!QNBL*o$c!pT;?pQL+o=^0%a>&TDCnv#s=3F6yBGG#Yso&4zkvZP|3p3cm$UpLx z;>b8Lk{a9XB;Vu5|Lx@<&V0M=?o2su8w-me_BbrWHbWIa4faNC3fi)zOJDX@oWSy1 zuovM5zE#5>xU)@BAfNa~f~#zomLyN{jB($~@4I%%J@$Wf5aqsOzcrN$EJy{Ao1DNv zYj>9)6l34pYJ7vr&!7$H!XA>t(#XFOYy>uJPjwI+6}r!--WSa#J zmk-%_dHu_DL5y3YtOrtsBqLeNML<6GIo9bwVNhDH4K!jK)=q4BHWZ9cBmXA03~|zH z`=|Ki{|dMP?(-=w&f`Dgyzv$0nNP885P6$MZ`mPj>;KLm=J=g=Hl*4()33r7x+OqC zkSmoA6kspp^4ta*a39cty>y4L1=tKd`L}T2@4{_AfOS6#TnD$g?q8zrKN5}=6rbe> zijAGYl{eJV()w>3GsXDR(W!>ir-uv%tC~f09u>{SzMb~40`wDvPAO}!dLRvfahM;vC zJN6lRcI?(^?bx~Bi|4w3E^J~Iy?+MogB#$gzU&}C@!fA}VfEGhf#_4st^3j-wD&$d zd+DrK1`T2!d#qbj$W7MwyqFj~)!e+`d)PTcl`SodSVEw1}F@C{(S zf56+E*T99evI9@_2QF`D^vWGyH7?k=ZlDnljpS@?Fz33bUKupw*-dTk3;x0FAXh3K zD8{X%F82W)c?=xI@-GDIxbJu6wja!6ejL|*iqhx3;x>N=Tn86Hn4aw3?Aqw2*oqo$ zyiI%edD54JD_5@2uoL-cDvwm7c+~2jwhWZsJrg^86K)k{vtft78@TJ+;d9+TQS9*F zqVAvS?C@35db0bo><57>Z~(jI_AC|o)9172NJ3|(?P@D+OJ{N}CvuA&&aJl>=%QB! zKeB}7xyJKK4KU!R5=t9Lszl>49spVbb$eB5c?JtJx1{uh|d zJ=GK*wMK9c{=2RWbbbI_+l4iK;Rh4=OcbL+y-QQCzQ4;p$<@_W?2l>BJiq(yJ8?g# z^!c1LbqeL_*pl)cvc)*}i2VSF{Q$sa5YDpufy3-h>%?xAJJ`i{18)(pfDiv4v9RSk zPT2`!?{>OlEqRy4DpFRai-1NK%)tb14};SB5%8E$g;xM(Atq#QXHE|uJP_yi@|+kU zQ~43ZJp{sDQ`+s!vA3fffhRH6sg?fjicWT&AAz2}TXUVSWqaQxV1eRx+jxR)wshd& zAs5`CVI*fG8~IL;m0&6N)N@!DCUFlw1oY7>gI_?M4;bz3s#8Ri)^Gf?<=2GEm#(|f;tJd-?Lq9ZY*6fSq*W4x5Wz{y+d5YpT?ZJ1{ z?A5FDHDEbdq$l?bzDs42a&*#Ziv1_$kBW+-jnO7@2JXnSvEAv*LGgoNU6`)#2Z4GY zWYt32YURzFS08E5o+C#N`J5|PE;2SY*8H1%&Y3f(c$Tq=iHUqJRH%@!XVJFHE=#O1 zw!Ka72eASyP9yhJK58EeMk+_AIl7*fcG;PQT`u$KFyCvlpJ(FEydvMjGn8#y4wl>| zELaz&2>I=+2zx1MbJVqKS8*reS0U`EiWe^~&R?{8P;eC@zMc0up`ku0}3XR7%#`_BbR{DVa618 zUfMqi`Q^PAUmJw|T*ZnNsb0N$(zjKFOP4QGj;ZJqm&v|O=g%;ij|WGAVPG(uTl8VO z^&X1t`Y!{WGJ2KNi#_K|DVSGYfoxxYjLX7HxnoG{$6+hVf%ReiNA!`l6Gbwa$uIOm z*bE6f%q$V(1qWeEDD2;b{l2#Up0my#dj38`KMvJ^G%|Muo!R`PJxnBi_LJqBHn<;f zpzwEwa@Kv0XJDtmNuG`Sb6I$ES?m`&!EIxvvz4xjWz6)KSRGrW36|3*}BFqbA98=&*M>`R!b%(G{L` zUgTYe2;O-N)hmw^yffj;W#I{04ag_%+tDEUw^Z`CY12mZ|DtY%4rGb2yRBTgviA25 z4h}+o;p3xyhgr3*ip)KQUUMD)nnvEHpb6h2)etlQFo#)c>6%XdJ+AF3LF3oJv(Kv_ zCRLfF_d_}S4C{j71H>J)8ic;4lK-clexmW?$5VC#?x+!CVp{pdol4qwj2MX-SnEWX z2e7=&S=OKRWUbFvfYb%GK`rG%Z2oC(jS)of~OnO(SOwP@T=ss`6c4m6ZFu8nks0GNm$bPzeRrB)tl-)W$SNZKNwI&cVC&#*MupP z+UKNXbr&IXD*w(y-lk%QLGqe;#k>SsKNZv8|O|8o5oVcaCl zO!7gdyn5uxfZVAu%6(ACoN9kF=%@j~*bK^$hUaNWW}YdyIrjbc$v@6rn3_rq(xCbT zhK3sXb$gsXZl=l|dJmW+=Dv!3fYSH@-BSF3#tkwNb9R0HR{ht1PrjUkGW7$>rJ&sB z$CxsO%?=8gQ}utY);TmX>HM1#^n9FR!8JCdyux?>UBs^Kg2Ml{{;y`~&C*o8G@Bk5 zXH(Lm>?>7R&tJ+66ky7iOx6D>e!f-}bn?aM$rueTut9qSU_T@}qZqjRt}_(#v46S# zi@l=ixx5rVB*hGv{g4!s+OpsudSz2WuY8*Qs2Trs!F78ZMb1c;GaQ7ntY^V#Rfc{{ zDQ*}8hV=X7{O9MNf2P5M2UB)~xDT;p$&#O({|p;C5N} z8QR+=-8<5VZDKnb?YTr@0Ku_wd=hM}K?}}{9aw8`cEoCb~W5^!l&d!Qkdb78Vxt*I$2S$?n~|h2KzS z`Y+dqopbw8Kfa@~8|cJk(FU|+AGcr9l*bQ3M~qU))8kNvwhZU3Org_U$DZtLu#aVS z1h#xJqBYnI)+x>`>c!X>SU5tHl-R!#{yuWg=39ic@-Lsd7cM*>GW5ghnx-sTf##s8 z=I=J;3=lSF8Sa0$EXG86e;S$X+1bK|FUQ;j)~0dd`4elSfrfPU)Jc()_}fupzf1Vm zOS_=24f^s&oR6e&CTFE9({w$5wBcY7=*w4e_F%WBj$9UPxh#JB$syDCxLD6poJ;Jb ze(QYhwt|g%axVdY@tvpUV4RWxm+oaXdl%x~Suqa~YgzI4U%m?5Un}I7XS&m>+be!x zz=E?dO|KkA@SUmsL2uTH?%J|Y)4Ju3naUp)7D`uFo9OC#3(LJmBe#5Mrha5?|}s z-2Zl*(@1IC8}#H}$```U6}ry%&5q}n4CGFzlcHen8e+e=)6YT=zS;h_*gIR+#tPl= zYuP*KX;xsS8K-{PN6b;;0GKCwEu!&*4cQr5~NL9E(>e zQ}J`!GDv;(_73i@)@IOTCmP?RBVN9g-5|!SJ>#&MHkteOQLOL%HJ4(ik)8eUQV&8-_y`huP; zdpkYZ>&Z!FHvRb8@h0_fV4lX0Zy%-i<9jOoS>GVJw0?YNKp>Za2j5w3&)1<_=?zp-IoN1P0Q(7KSO08?ZJI~ThLrj_UfQKFR;us_dgqfe7qr5i8m&j@F7GWK9HNn z2RLi^0M`|GgJ2K|;=lu;1JVyLh1?K?|ETW3KY`ly#e2UU6?l=tMdkJ3qF|W$A@#%_2l2K7%;FOp>oK772IJR zcqja_<)1vb$9=&i5Ux^|Y5`mZo?Hfwq6`e)lSTh+pRM;9ox$04tEEh)n`!{SEKhPAV1fA1>THq%=d72R}QGy4^bz-HD7M$3H(6_hz2(l9Z-BhWncIR+ySxN zABKTbY06-qxF4Xw_OJ5&OM5oBzg;Dr>@|3tE5m=Fp@2s3McwDttNSW^|9cZ|`@f~} zV_f)2KSpssykhY5Oz4303xCe-;3l{RE`U(|GQf8h)pU@yy5BNf#oaLbn^#gc7pm|^ zLUA7Ja%p_tP5BRY6yy8XYq0J&=eFOA4=KlIAio`O2R`5=I1ggDAABhL0X1|0<`vp@ zkN{%1KRl;W?yX;5%R$aJ{*EB@z_vwg`dFUlIE7j7jWvB<9B!i`~6mYK-ZfO zEGL3LS^m{*$Y9H3z!B~PLU|mB2ls^zfVXlye8KG?5yYvKxluUU`|^f6t^xxp2Phsf*2PZSFNP81#`3B8|&45DIW7`vhFtn?fEdiKaYKr z)5yPt4Y*vm5A*}4Km@qL{a_ME*6P4ZmGb9rJn{vR(u~r9e8YPldI~!@I`tJ-v z7d-79$f-(QN;WLbV_pr`{a^T!#7^Az4dStXY8v@BgPlAE9^gLkI5@{`;2QUX59pE6 zO|q-GmyWm}`M1>hr`C-g_KxJx=vTU8qUraWa@+61ecuos`^~{@mVXr+u-UL7qdWJ3 zfjk$EkasFXn!?Yg`3~}O_4;P}ihoByoyfoC - - - + +