Merge branch '0_15' of https://github.com/Aircoookie/WLED into ledmaps-realtime

This commit is contained in:
ezcGman 2023-12-22 13:19:44 +01:00
commit b76a90304d
28 changed files with 3396 additions and 7075 deletions

View File

@ -219,36 +219,10 @@ function writeChunks(srcDir, specs, resultFile) {
}
writeHtmlGzipped("wled00/data/index.htm", "wled00/html_ui.h", 'index');
writeHtmlGzipped("wled00/data/simple.htm", "wled00/html_simple.h", 'simple');
writeHtmlGzipped("wled00/data/pixart/pixart.htm", "wled00/html_pixart.h", 'pixart');
writeHtmlGzipped("wled00/data/cpal/cpal.htm", "wled00/html_cpal.h", 'cpal');
writeHtmlGzipped("wled00/data/pxmagic/pxmagic.htm", "wled00/html_pxmagic.h", 'pxmagic');
/*
writeChunks(
"wled00/data",
[
{
file: "simple.css",
name: "PAGE_simpleCss",
method: "gzip",
filter: "css-minify",
},
{
file: "simple.js",
name: "PAGE_simpleJs",
method: "gzip",
filter: "js-minify",
},
{
file: "simple.htm",
name: "PAGE_simple",
method: "gzip",
filter: "html-minify-ui",
}
],
"wled00/html_simplex.h"
);
*/
writeChunks(
"wled00/data",
[
@ -406,16 +380,6 @@ const char PAGE_dmxmap[] PROGMEM = R"=====()=====";
file: "favicon.ico",
name: "favicon",
method: "binary",
},
{
file: "iro.js",
name: "iroJs",
method: "gzip"
},
{
file: "rangetouch.js",
name: "rangetouchJs",
method: "gzip"
}
],
"wled00/html_other.h"

View File

@ -50,8 +50,7 @@ private:
volatile unsigned long offTimerStart = 0; // off timer start time
volatile bool PIRtriggered = false; // did PIR trigger?
byte NotifyUpdateMode = CALL_MODE_NO_NOTIFY; // notification mode for stateUpdated(): CALL_MODE_NO_NOTIFY or CALL_MODE_DIRECT_CHANGE
byte sensorPinState = LOW; // current PIR sensor pin state
bool sensorPinState = LOW; // current PIR sensor pin state
bool initDone = false; // status of initialization
unsigned long lastLoop = 0;
@ -70,6 +69,7 @@ private:
// Home Assistant
bool HomeAssistantDiscovery = false; // is HA discovery turned on
int16_t idx = -1; // Domoticz virtual switch idx
// strings to reduce flash memory usage (used more than twice)
static const char _name[];
@ -81,8 +81,8 @@ private:
static const char _mqttOnly[];
static const char _offOnly[];
static const char _haDiscovery[];
static const char _notify[];
static const char _override[];
static const char _domoticzIDX[];
/**
* check if it is daytime
@ -94,7 +94,7 @@ private:
* switch strip on/off
*/
void switchStrip(bool switchOn);
void publishMqtt(const char* state);
void publishMqtt(bool switchOn);
// Create an MQTT Binary Sensor for Home Assistant Discovery purposes, this includes a pointer to the topic that is published to in the Loop.
void publishHomeAssistantAutodiscovery();
@ -194,8 +194,8 @@ const char PIRsensorSwitch::_nightTime[] PROGMEM = "nighttime-only";
const char PIRsensorSwitch::_mqttOnly[] PROGMEM = "mqtt-only";
const char PIRsensorSwitch::_offOnly[] PROGMEM = "off-only";
const char PIRsensorSwitch::_haDiscovery[] PROGMEM = "HA-discovery";
const char PIRsensorSwitch::_notify[] PROGMEM = "notifications";
const char PIRsensorSwitch::_override[] PROGMEM = "override";
const char PIRsensorSwitch::_domoticzIDX[] PROGMEM = "domoticz-idx";
bool PIRsensorSwitch::isDayTime() {
updateLocalTime();
@ -235,24 +235,24 @@ void PIRsensorSwitch::switchStrip(bool switchOn)
prevPlaylist = 0;
prevPreset = 255;
}
applyPreset(m_onPreset, NotifyUpdateMode);
applyPreset(m_onPreset, CALL_MODE_BUTTON_PRESET);
return;
}
// preset not assigned
if (bri == 0) {
bri = briLast;
stateUpdated(NotifyUpdateMode);
stateUpdated(CALL_MODE_BUTTON);
}
} else {
if (m_offPreset) {
applyPreset(m_offPreset, NotifyUpdateMode);
applyPreset(m_offPreset, CALL_MODE_BUTTON_PRESET);
return;
} else if (prevPlaylist) {
if (currentPreset==m_onPreset || currentPlaylist==m_onPreset) applyPreset(prevPlaylist, NotifyUpdateMode);
if (currentPreset==m_onPreset || currentPlaylist==m_onPreset) applyPreset(prevPlaylist, CALL_MODE_BUTTON_PRESET);
prevPlaylist = 0;
return;
} else if (prevPreset) {
if (prevPreset<255) { if (currentPreset==m_onPreset || currentPlaylist==m_onPreset) applyPreset(prevPreset, NotifyUpdateMode); }
if (prevPreset<255) { if (currentPreset==m_onPreset || currentPlaylist==m_onPreset) applyPreset(prevPreset, CALL_MODE_BUTTON_PRESET); }
else { if (currentPreset==m_onPreset || currentPlaylist==m_onPreset) applyTemporaryPreset(); }
prevPreset = 0;
return;
@ -261,19 +261,29 @@ void PIRsensorSwitch::switchStrip(bool switchOn)
if (bri != 0) {
briLast = bri;
bri = 0;
stateUpdated(NotifyUpdateMode);
stateUpdated(CALL_MODE_BUTTON);
}
}
}
void PIRsensorSwitch::publishMqtt(const char* state)
void PIRsensorSwitch::publishMqtt(bool switchOn)
{
#ifndef WLED_DISABLE_MQTT
//Check if MQTT Connected, otherwise it will crash the 8266
if (WLED_MQTT_CONNECTED) {
char buf[64];
char buf[128];
sprintf_P(buf, PSTR("%s/motion"), mqttDeviceTopic); //max length: 33 + 7 = 40
mqtt->publish(buf, 0, false, state);
mqtt->publish(buf, 0, false, switchOn?"on":"off");
// Domoticz formatted message
if (idx > 0) {
StaticJsonDocument <128> msg;
msg[F("idx")] = idx;
msg[F("RSSI")] = WiFi.RSSI();
msg[F("command")] = F("switchlight");
msg[F("switchcmd")] = switchOn ? F("On") : F("Off");
serializeJson(msg, buf, 128);
mqtt->publish("domoticz/in", 0, false, buf);
}
}
#endif
}
@ -322,13 +332,11 @@ bool PIRsensorSwitch::updatePIRsensorState()
if (sensorPinState == HIGH) {
offTimerStart = 0;
if (!m_mqttOnly && (!m_nightTimeOnly || (m_nightTimeOnly && !isDayTime()))) switchStrip(true);
else if (NotifyUpdateMode != CALL_MODE_NO_NOTIFY) updateInterfaces(CALL_MODE_WS_SEND);
publishMqtt("on");
} else {
// start switch off timer
offTimerStart = millis();
if (NotifyUpdateMode != CALL_MODE_NO_NOTIFY) updateInterfaces(CALL_MODE_WS_SEND);
}
publishMqtt(sensorPinState == HIGH);
return true;
}
return false;
@ -338,11 +346,7 @@ bool PIRsensorSwitch::handleOffTimer()
{
if (offTimerStart > 0 && millis() - offTimerStart > m_switchOffDelay) {
offTimerStart = 0;
if (enabled == true) {
if (!m_mqttOnly && (!m_nightTimeOnly || (m_nightTimeOnly && !isDayTime()) || PIRtriggered)) switchStrip(false);
else if (NotifyUpdateMode != CALL_MODE_NO_NOTIFY) updateInterfaces(CALL_MODE_WS_SEND);
publishMqtt("off");
}
if (!m_mqttOnly && (!m_nightTimeOnly || (m_nightTimeOnly && !isDayTime()) || PIRtriggered)) switchStrip(false);
return true;
}
return false;
@ -482,14 +486,13 @@ void PIRsensorSwitch::addToConfig(JsonObject &root)
top[FPSTR(_offOnly)] = m_offOnly;
top[FPSTR(_override)] = m_override;
top[FPSTR(_haDiscovery)] = HomeAssistantDiscovery;
top[FPSTR(_notify)] = (NotifyUpdateMode != CALL_MODE_NO_NOTIFY);
top[FPSTR(_domoticzIDX)] = idx;
DEBUG_PRINTLN(F("PIR config saved."));
}
void PIRsensorSwitch::appendConfigData()
{
oappend(SET_F("addInfo('PIRsensorSwitch:HA-discovery',1,'HA=Home Assistant');")); // 0 is field type, 1 is actual field
oappend(SET_F("addInfo('PIRsensorSwitch:notifications',1,'Periodic WS updates');")); // 0 is field type, 1 is actual field
oappend(SET_F("addInfo('PIRsensorSwitch:override',1,'Cancel timer on change');")); // 0 is field type, 1 is actual field
}
@ -521,8 +524,7 @@ bool PIRsensorSwitch::readFromConfig(JsonObject &root)
m_offOnly = top[FPSTR(_offOnly)] | m_offOnly;
m_override = top[FPSTR(_override)] | m_override;
HomeAssistantDiscovery = top[FPSTR(_haDiscovery)] | HomeAssistantDiscovery;
NotifyUpdateMode = top[FPSTR(_notify)] ? CALL_MODE_DIRECT_CHANGE : CALL_MODE_NO_NOTIFY;
idx = top[FPSTR(_domoticzIDX)] | idx;
if (!initDone) {
// reading config prior to setup()
@ -549,5 +551,5 @@ bool PIRsensorSwitch::readFromConfig(JsonObject &root)
DEBUG_PRINTLN(F(" config (re)loaded."));
}
// use "return !top["newestParameter"].isNull();" when updating Usermod with new features
return !top[FPSTR(_override)].isNull();
return !top[FPSTR(_domoticzIDX)].isNull();
}

View File

@ -48,6 +48,7 @@ class UsermodTemperature : public Usermod {
bool enabled = true;
bool HApublished = false;
int16_t idx = -1; // Domoticz virtual sensor idx
// strings to reduce flash memory usage (used more than twice)
static const char _name[];
@ -55,6 +56,7 @@ class UsermodTemperature : public Usermod {
static const char _readInterval[];
static const char _parasite[];
static const char _parasitePin[];
static const char _domoticzIDX[];
//Dallas sensor quick (& dirty) reading. Credit to - Author: Peter Scargill, August 17th, 2013
float readDallas();
@ -264,7 +266,7 @@ void UsermodTemperature::loop() {
#ifndef WLED_DISABLE_MQTT
if (WLED_MQTT_CONNECTED) {
char subuf[64];
char subuf[128];
strcpy(subuf, mqttDeviceTopic);
if (temperature > -100.0f) {
// dont publish super low temperature as the graph will get messed up
@ -274,6 +276,15 @@ void UsermodTemperature::loop() {
mqtt->publish(subuf, 0, false, String(getTemperatureC()).c_str());
strcat_P(subuf, PSTR("_f"));
mqtt->publish(subuf, 0, false, String(getTemperatureF()).c_str());
if (idx > 0) {
StaticJsonDocument <128> msg;
msg[F("idx")] = idx;
msg[F("RSSI")] = WiFi.RSSI();
msg[F("nvalue")] = 0;
msg[F("svalue")] = String(getTemperatureC());
serializeJson(msg, subuf, 127);
mqtt->publish("domoticz/in", 0, false, subuf);
}
} else {
// publish something else to indicate status?
}
@ -360,6 +371,7 @@ void UsermodTemperature::addToConfig(JsonObject &root) {
top[FPSTR(_readInterval)] = readingInterval / 1000;
top[FPSTR(_parasite)] = parasite;
top[FPSTR(_parasitePin)] = parasitePin;
top[FPSTR(_domoticzIDX)] = idx;
DEBUG_PRINTLN(F("Temperature config saved."));
}
@ -386,6 +398,7 @@ bool UsermodTemperature::readFromConfig(JsonObject &root) {
readingInterval = min(120,max(10,(int)readingInterval)) * 1000; // convert to ms
parasite = top[FPSTR(_parasite)] | parasite;
parasitePin = top[FPSTR(_parasitePin)] | parasitePin;
idx = top[FPSTR(_domoticzIDX)] | idx;
if (!initDone) {
// first run: reading from cfg.json
@ -406,7 +419,7 @@ bool UsermodTemperature::readFromConfig(JsonObject &root) {
}
}
// use "return !top["newestParameter"].isNull();" when updating Usermod with new features
return !top[FPSTR(_parasitePin)].isNull();
return !top[FPSTR(_domoticzIDX)].isNull();
}
void UsermodTemperature::appendConfigData() {
@ -430,3 +443,4 @@ const char UsermodTemperature::_enabled[] PROGMEM = "enabled";
const char UsermodTemperature::_readInterval[] PROGMEM = "read-interval-s";
const char UsermodTemperature::_parasite[] PROGMEM = "parasite-pwr";
const char UsermodTemperature::_parasitePin[] PROGMEM = "parasite-pwr-pin";
const char UsermodTemperature::_domoticzIDX[] PROGMEM = "domoticz-idx";

View File

@ -534,10 +534,10 @@ void MultiRelay::setup() {
* loop() is called continuously. Here you can check for events, read sensors, etc.
*/
void MultiRelay::loop() {
yield();
if (!enabled || strip.isUpdating()) return;
static unsigned long lastUpdate = 0;
yield();
if (!enabled || (strip.isUpdating() && millis() - lastUpdate < 100)) return;
if (millis() - lastUpdate < 100) return; // update only 10 times/s
lastUpdate = millis();
@ -803,13 +803,6 @@ bool MultiRelay::readFromConfig(JsonObject &root) {
_relay[i].external = top[parName][FPSTR(_external)] | _relay[i].external;
_relay[i].delay = top[parName][FPSTR(_delay_str)] | _relay[i].delay;
_relay[i].button = top[parName][FPSTR(_button)] | _relay[i].button;
// begin backwards compatibility (beta) remove when 0.13 is released
parName += '-';
_relay[i].pin = top[parName+"pin"] | _relay[i].pin;
_relay[i].invert = top[parName+FPSTR(_activeHigh)] | _relay[i].invert;
_relay[i].external = top[parName+FPSTR(_external)] | _relay[i].external;
_relay[i].delay = top[parName+FPSTR(_delay_str)] | _relay[i].delay;
// end compatibility
_relay[i].delay = min(600,max(0,abs((int)_relay[i].delay))); // bounds checking max 10min
}

View File

@ -144,10 +144,13 @@ Segment& Segment::operator= (Segment &&orig) noexcept {
}
bool IRAM_ATTR Segment::allocateData(size_t len) {
if (data && _dataLen == len) return true; //already allocated
if (data && _dataLen >= len) { // already allocated enough (reduce fragmentation)
if (call == 0) memset(data, 0, len); // erase buffer if called during effect initialisation
return true;
}
//DEBUG_PRINTF("-- Allocating data (%d): %p\n", len, this);
deallocateData();
if (len == 0) return(false); // nothing to do
if (len == 0) return false; // nothing to do
if (Segment::getUsedSegmentData() + len > MAX_SEGMENT_DATA) {
// not enough memory
DEBUG_PRINT(F("!!! Effect RAM depleted: "));
@ -156,7 +159,7 @@ bool IRAM_ATTR Segment::allocateData(size_t len) {
}
// do not use SPI RAM on ESP32 since it is slow
data = (byte*) malloc(len);
if (!data) { DEBUG_PRINTLN(F("!!! Allocation failed. !!!")); return false; } //allocation failed
if (!data) { DEBUG_PRINTLN(F("!!! Allocation failed. !!!")); return false; } // allocation failed
Segment::addUsedSegmentData(len);
//DEBUG_PRINTF("--- Allocated data (%p): %d/%d -> %p\n", this, len, Segment::getUsedSegmentData(), data);
_dataLen = len;
@ -1021,15 +1024,16 @@ void Segment::blur(uint8_t blur_amount) {
*/
uint32_t Segment::color_wheel(uint8_t pos) {
if (palette) return color_from_palette(pos, false, true, 0);
uint8_t w = W(currentColor(0));
pos = 255 - pos;
if (pos < 85) {
return ((uint32_t)(255 - pos * 3) << 16) | ((uint32_t)(0) << 8) | (pos * 3);
return RGBW32((255 - pos * 3), 0, (pos * 3), w);
} else if(pos < 170) {
pos -= 85;
return ((uint32_t)(0) << 16) | ((uint32_t)(pos * 3) << 8) | (255 - pos * 3);
return RGBW32(0, (pos * 3), (255 - pos * 3), w);
} else {
pos -= 170;
return ((uint32_t)(pos * 3) << 16) | ((uint32_t)(255 - pos * 3) << 8) | (0);
return RGBW32((pos * 3), (255 - pos * 3), 0, w);
}
}
@ -1043,13 +1047,10 @@ uint32_t Segment::color_wheel(uint8_t pos) {
* @returns Single color from palette
*/
uint32_t Segment::color_from_palette(uint16_t i, bool mapping, bool wrap, uint8_t mcol, uint8_t pbri) {
uint32_t color = gamma32(currentColor(mcol));
// default palette or no RGB support on segment
if ((palette == 0 && mcol < NUM_COLORS) || !_isRGB) {
uint32_t color = currentColor(mcol);
color = gamma32(color);
if (pbri == 255) return color;
return color_fade(color, pbri, true);
}
if ((palette == 0 && mcol < NUM_COLORS) || !_isRGB) return (pbri == 255) ? color : color_fade(color, pbri, true);
uint8_t paletteIndex = i;
if (mapping && virtualLength() > 1) paletteIndex = (i*255)/(virtualLength() -1);
@ -1058,7 +1059,7 @@ uint32_t Segment::color_from_palette(uint16_t i, bool mapping, bool wrap, uint8_
curPal = currentPalette(curPal, palette);
CRGB fastled_col = ColorFromPalette(curPal, paletteIndex, pbri, (strip.paletteBlend == 3)? NOBLEND:LINEARBLEND); // NOTE: paletteBlend should be global
return RGBW32(fastled_col.r, fastled_col.g, fastled_col.b, 0);
return RGBW32(fastled_col.r, fastled_col.g, fastled_col.b, W(color));
}

View File

@ -77,7 +77,7 @@ uint8_t IRAM_ATTR ColorOrderMap::getPixelColorOrder(uint16_t pix, uint8_t defaul
uint32_t Bus::autoWhiteCalc(uint32_t c) {
uint8_t aWM = _autoWhiteMode;
if (_gAWM < 255) aWM = _gAWM;
if (_gAWM < AW_GLOBAL_DISABLED) aWM = _gAWM;
if (aWM == RGBW_MODE_MANUAL_ONLY) return c;
uint8_t w = W(c);
//ignore auto-white calculation if w>0 and mode DUAL (DUAL behaves as BRIGHTER if w==0)

View File

@ -118,7 +118,7 @@ class Bus {
, _needsRefresh(refresh)
, _data(nullptr) // keep data access consistent across all types of buses
{
_autoWhiteMode = Bus::hasWhite(_type) ? aw : RGBW_MODE_MANUAL_ONLY;
_autoWhiteMode = Bus::hasWhite(type) ? aw : RGBW_MODE_MANUAL_ONLY;
};
virtual ~Bus() {} //throw the bus under the bus
@ -154,7 +154,7 @@ class Bus {
}
virtual bool hasWhite(void) { return Bus::hasWhite(_type); }
static bool hasWhite(uint8_t type) {
if ((type >= TYPE_WS2812_1CH && type <= TYPE_WS2812_WWA) || type == TYPE_SK6812_RGBW || type == TYPE_TM1814) return true; // digital types with white channel
if ((type >= TYPE_WS2812_1CH && type <= TYPE_WS2812_WWA) || type == TYPE_SK6812_RGBW || type == TYPE_TM1814 || type == TYPE_UCS8904) return true; // digital types with white channel
if (type > TYPE_ONOFF && type <= TYPE_ANALOG_5CH && type != TYPE_ANALOG_3CH) return true; // analog types with white channel
if (type == TYPE_NET_DDP_RGBW) return true; // network types with white channel
return false;

View File

@ -99,7 +99,7 @@ bool isButtonPressed(uint8_t i)
case BTN_TYPE_TOUCH:
case BTN_TYPE_TOUCH_SWITCH:
#if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3)
if (touchRead(pin) <= touchThreshold) return true;
if (digitalPinToTouchChannel(btnPin[i]) >= 0 && touchRead(pin) <= touchThreshold) return true;
#endif
break;
}
@ -110,6 +110,7 @@ void handleSwitch(uint8_t b)
{
// isButtonPressed() handles inverted/noninverted logic
if (buttonPressedBefore[b] != isButtonPressed(b)) {
DEBUG_PRINT(F("Switch: State changed ")); DEBUG_PRINTLN(b);
buttonPressedTime[b] = millis();
buttonPressedBefore[b] = !buttonPressedBefore[b];
}
@ -117,12 +118,15 @@ void handleSwitch(uint8_t b)
if (buttonLongPressed[b] == buttonPressedBefore[b]) return;
if (millis() - buttonPressedTime[b] > WLED_DEBOUNCE_THRESHOLD) { //fire edge event only after 50ms without change (debounce)
DEBUG_PRINT(F("Switch: Activating ")); DEBUG_PRINTLN(b);
if (!buttonPressedBefore[b]) { // on -> off
DEBUG_PRINT(F("Switch: On -> Off ")); DEBUG_PRINTLN(b);
if (macroButton[b]) applyPreset(macroButton[b], CALL_MODE_BUTTON_PRESET);
else { //turn on
if (!bri) {toggleOnOff(); stateUpdated(CALL_MODE_BUTTON);}
}
} else { // off -> on
DEBUG_PRINT(F("Switch: Off -> On ")); DEBUG_PRINTLN(b);
if (macroLongPress[b]) applyPreset(macroLongPress[b], CALL_MODE_BUTTON_PRESET);
else { //turn off
if (bri) {toggleOnOff(); stateUpdated(CALL_MODE_BUTTON);}
@ -154,6 +158,8 @@ void handleAnalog(uint8_t b)
static float filteredReading[WLED_MAX_BUTTONS] = {0.0f};
uint16_t rawReading; // raw value from analogRead, scaled to 12bit
DEBUG_PRINT(F("Analog: Reading button ")); DEBUG_PRINTLN(b);
#ifdef ESP8266
rawReading = analogRead(A0) << 2; // convert 10bit read to 12bit
#else
@ -162,6 +168,8 @@ void handleAnalog(uint8_t b)
#endif
yield(); // keep WiFi task running - analog read may take several millis on ESP8266
DEBUG_PRINT(F("Analog: Raw read = ")); DEBUG_PRINTLN(rawReading);
filteredReading[b] += POT_SMOOTHING * ((float(rawReading) / 16.0f) - filteredReading[b]); // filter raw input, and scale to [0..255]
uint16_t aRead = max(min(int(filteredReading[b]), 255), 0); // squash into 8bit
if(aRead <= POT_SENSITIVITY) aRead = 0; // make sure that 0 and 255 are used
@ -172,6 +180,8 @@ void handleAnalog(uint8_t b)
// remove noise & reduce frequency of UI updates
if (abs(int(aRead) - int(oldRead[b])) <= POT_SENSITIVITY) return; // no significant change in reading
DEBUG_PRINT(F("Analog: Filtered read = ")); DEBUG_PRINTLN(aRead);
// Unomment the next lines if you still see flickering related to potentiometer
// This waits until strip finishes updating (why: strip was not updating at the start of handleButton() but may have started during analogRead()?)
//unsigned long wait_started = millis();
@ -184,6 +194,7 @@ void handleAnalog(uint8_t b)
// if no macro for "short press" and "long press" is defined use brightness control
if (!macroButton[b] && !macroLongPress[b]) {
DEBUG_PRINT(F("Analog: Action = ")); DEBUG_PRINTLN(macroDoublePress[b]);
// if "double press" macro defines which option to change
if (macroDoublePress[b] >= 250) {
// global brightness
@ -219,6 +230,7 @@ void handleAnalog(uint8_t b)
updateInterfaces(CALL_MODE_BUTTON);
}
} else {
DEBUG_PRINTLN(F("Analog: No action"));
//TODO:
// we can either trigger a preset depending on the level (between short and long entries)
// or use it for RGBW direct control

View File

@ -31,9 +31,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
getStringFromJson(cmDNS, id[F("mdns")], 33);
getStringFromJson(serverDescription, id[F("name")], 33);
getStringFromJson(alexaInvocationName, id[F("inv")], 33);
#ifdef WLED_ENABLE_SIMPLE_UI
CJSON(simplifiedUI, id[F("sui")]);
#endif
JsonObject nw = doc["nw"];
#ifndef WLED_DISABLE_ESPNOW
@ -88,11 +86,10 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
// initialize LED pins and lengths prior to other HW (except for ethernet)
JsonObject hw_led = hw["led"];
uint8_t autoWhiteMode = RGBW_MODE_MANUAL_ONLY;
uint16_t total = hw_led[F("total")] | strip.getLengthTotal();
CJSON(strip.ablMilliampsMax, hw_led[F("maxpwr")]);
CJSON(strip.milliampsPerLed, hw_led[F("ledma")]); // no longer used
Bus::setGlobalAWMode(hw_led[F("rgbwm")] | 255);
Bus::setGlobalAWMode(hw_led[F("rgbwm")] | AW_GLOBAL_DISABLED);
CJSON(correctWB, hw_led["cct"]);
CJSON(cctFromRgb, hw_led[F("cr")]);
CJSON(strip.cctBlending, hw_led[F("cb")]);
@ -158,7 +155,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
}
uint16_t length = elm["len"] | 1;
uint8_t colorOrder = (int)elm[F("order")];
uint8_t colorOrder = (int)elm[F("order")]; // contains white channel swap option in upper nibble
uint8_t skipFirst = elm[F("skip")];
uint16_t start = elm["start"] | 0;
if (length==0 || start + length > MAX_LEDS) continue; // zero length or we reached max. number of LEDs, just stop
@ -166,7 +163,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
bool reversed = elm["rev"];
bool refresh = elm["ref"] | false;
uint16_t freqkHz = elm[F("freq")] | 0; // will be in kHz for DotStar and Hz for PWM (not yet implemented fully)
uint8_t AWmode = elm[F("rgbwm")] | autoWhiteMode;
uint8_t AWmode = elm[F("rgbwm")] | RGBW_MODE_MANUAL_ONLY;
uint8_t maPerLed = elm[F("ledma")] | strip.milliampsPerLed; // replace with 55 when removing strip.milliampsPerLed
uint16_t maMax = elm[F("maxpwr")] | (strip.ablMilliampsMax * length) / total; // rough (incorrect?) per strip ABL calculation when no config exists
// To disable brightness limiter we either set output max current to 0 or single LED current to 0 (we choose output max current)
@ -657,9 +654,7 @@ void serializeConfig() {
id[F("mdns")] = cmDNS;
id[F("name")] = serverDescription;
id[F("inv")] = alexaInvocationName;
#ifdef WLED_ENABLE_SIMPLE_UI
id[F("sui")] = simplifiedUI;
#endif
JsonObject nw = doc.createNestedObject("nw");
#ifndef WLED_DISABLE_ESPNOW

View File

@ -342,8 +342,9 @@
// WLED Error modes
#define ERR_NONE 0 // All good :)
#define ERR_DENIED 1 // Permission denied
#define ERR_EEP_COMMIT 2 // Could not commit to EEPROM (wrong flash layout?) OBSOLETE
#define ERR_CONCURRENCY 2 // Conurrency (client active)
#define ERR_NOBUF 3 // JSON buffer was not released in time, request cannot be handled at this time
#define ERR_NOT_IMPL 4 // Not implemented
#define ERR_JSON 9 // JSON parsing failed (input too large?)
#define ERR_FS_BEGIN 10 // Could not init filesystem (no partition?)
#define ERR_FS_QUOTA 11 // The FS is full or the maximum file size is reached

View File

@ -370,6 +370,16 @@ button {
padding: 5px 0 0;
}
/* Quick load magin for simplified UI */
.simplified #pql {
margin-bottom: 8px;
}
/* Button margin for simplified UI */
.simplified #fx .btn, .simplified #palw .btn {
margin-top: 0;
}
.smooth { transition: transform calc(var(--f, 1)*.5s) ease-out }
.tab-label {
@ -413,6 +423,7 @@ button {
position: sticky;
bottom: 0;
max-width: 300px;
z-index: 2;
}
#sliders .labels {
@ -754,13 +765,17 @@ input[type=range]::-moz-range-thumb {
}
#Colors .sliderwrap {
margin: 4px 0 0;
margin: 2px 0 0;
}
/* Dynamically hide brightness slider label */
/* Dynamically hide labels */
.hd {
display: var(--bhd);
}
/* Do not hide quick load label in simplified mode on small screen widths */
.simplified #pql .hd {
display: var(--bhd) !important;
}
#briwrap {
min-width: 300px;
@ -1284,6 +1299,12 @@ TD .checkmark, TD .radiomark {
margin-top: 0;
}
/* Simplify segments */
.simplified #segcont .lstI {
margin-top: 4px;
min-height: unset;
}
/* selected item/element */
.selected { /* has to be after .lstI since !important is not ok */
background: var(--c-4);
@ -1324,6 +1345,19 @@ TD .checkmark, TD .radiomark {
top: calc(var(--sti) + 42px);
}
dialog::backdrop {
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
dialog {
max-height: 70%;
border: 0;
border-radius: 10px;
background: linear-gradient(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.1)), var(--c-3);
box-shadow: 4px 4px 10px 4px var(--c-1);
color: var(--c-f);
}
#fxlist .lstI.sticky,
#pallist .lstI.sticky {
top: var(--sti);

View File

@ -7,52 +7,9 @@
<meta content="yes" name="apple-mobile-web-app-capable">
<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAGACGAAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAE1JREFUOI1j/P//PwOxgNGeAUMxE9G6cQCKDWAhpADZ2f8PMjBS3QW08QK20KaZC2gfC9hCnqouoNgARgY7zMxAyNlUdQHlXiAlO2MDAD63EVqNHAe0AAAAAElFTkSuQmCC"/>
<title>WLED</title>
<script>
function feedback(){}
// instead of including [script src="iro.js"][/script] and [script src="rangetouch.js"][/script]
// (which would be inlined by nodeJS inliner during minimization and compression) we need to load them dynamically
// the following is needed to load iro.js and rangetouch.js as consecutive requests to allow ESP8266
// to keep up with requests (if requests happent too fast some may not get processed)
// it will also call onLoad() after last is loaded (it was removed from [body onload="onLoad()"]).
var h = document.getElementsByTagName('head')[0];
var l = document.createElement('script');
l.type = 'application/javascript';
l.src = 'iro.js';
l.addEventListener('load', (e) => {
// after iro is loaded initialize global variable
cpick = new iro.ColorPicker("#picker", {
width: 260,
wheelLightness: false,
wheelAngle: 270,
wheelDirection: "clockwise",
layout: [{
component: iro.ui.Wheel,
options: {}
}]
});
cpick.on("input:end", () => {setColor(1);});
cpick.on("color:change", () => {updatePSliders()});
var l = document.createElement('script');
l.type = 'application/javascript';
l.src = 'rangetouch.js';
l.addEventListener('load', (e) => {
// after rangetouch is loaded initialize global variable
ranges = RangeTouch.setup('input[type="range"]', {});
let stateCheck = setInterval(() => {
if (document.readyState === 'complete') {
clearInterval(stateCheck);
// document ready, start processing UI
onLoad();
}
}, 100);
});
setTimeout(()=>{h.appendChild(l)},100);
});
setTimeout(()=>{h.appendChild(l)},200);
</script>
<link rel="stylesheet" href="index.css">
</head>
<body>
<body onload="onLoad()">
<div id="cv" class="overlay">Loading WLED UI...</div>
<noscript><div class="overlay" style="opacity:1;">Sorry, WLED UI needs JavaScript!</div></noscript>
@ -168,7 +125,7 @@
<input id="hexc" tooltip="Hex RGB" type="text" class="noslide" onkeydown="hexEnter()" autocomplete="off" maxlength="8" />
<button id="hexcnf" class="btn btn-xs" onclick="fromHex();"><i class="icons btn-icon">&#xe390;</i></button>
</div>
<div style="padding: 8px 0;">
<div style="padding: 8px 0;" id="btns">
<button class="btn btn-xs" tooltip="Pixel Magic Tool" type="button" id="pxmb" onclick="window.location.href=getURL('/pxmagic.htm')"><i class="icons btn-icon">&#xe410;</i></button>
<button class="btn btn-xs" tooltip="Add custom palette" type="button" onclick="window.location.href=getURL('/cpal.htm')"><i class="icons btn-icon">&#xe18a;</i></button>
<button class="btn btn-xs" tooltip="Remove custom palette" type="button" id="rmPal" onclick="palettesData=null;localStorage.removeItem('wledPalx');requestJson({rmcpal:true});setTimeout(loadPalettes,250,loadPalettesData);"><i class="icons btn-icon">&#xe037;</i></button>
@ -351,7 +308,7 @@
<button class="btn infobtn" id="resetbtn" onclick="cnfReset()">Reboot WLED</button>
</div>
<br>
<span class="h">Made with <span id="heart">&#10084;&#xFE0E;</span> by Aircoookie and the <a href="https://wled.discourse.group/" target="_blank">WLED community</a></span>
<span class="h">Made with <span id="heart">&#10084;&#xFE0E;</span> by <a href="https://github.com/Aircoookie/" target="_blank">Aircoookie</a> and the <a href="https://wled.discourse.group/" target="_blank">WLED community</a></span>
</div>
<div id="nodes" class="modal">
@ -378,6 +335,13 @@
</div>
<i id="roverstar" class="icons huge" onclick="setLor(0)">&#xe410;</i><br>
<!--
If you want to load iro.js and rangetouch.js as consecutive requests, you can do it like it was done in 0.14.0:
https://github.com/Aircoookie/WLED/blob/v0.14.0/wled00/data/index.htm
-->
<script src="iro.js"></script>
<script src="rangetouch.js"></script>
<script src="index.js"></script>
</body>
</html>

View File

@ -12,8 +12,11 @@ var currentPreset = -1;
var lastUpdate = 0;
var segCount = 0, ledCount = 0, lowestUnused = 0, maxSeg = 0, lSeg = 0;
var pcMode = false, pcModeA = false, lastw = 0, wW;
var simplifiedUI = false;
var tr = 7;
var d = document;
const ranges = RangeTouch.setup('input[type="range"]', {});
var retry = false;
var palettesData;
var fxdata = [];
var pJson = {}, eJson = {}, lJson = {};
@ -22,7 +25,7 @@ var pN = "", pI = 0, pNum = 0;
var pmt = 1, pmtLS = 0, pmtLast = 0;
var lastinfo = {};
var isM = false, mw = 0, mh=0;
var ws, cpick, ranges, wsRpt=0;
var ws, wsRpt=0;
var cfg = {
theme:{base:"dark", bg:{url:"", rnd: false, rndGrayscale: false, rndBlur: false}, alpha:{bg:0.6,tab:0.8}, color:{bg:""}},
comp :{colors:{picker: true, rgb: false, quick: true, hex: false},
@ -38,6 +41,17 @@ var hol = [
[0,0,1,1,"https://images.alphacoders.com/119/1198800.jpg"] // new year
];
var cpick = new iro.ColorPicker("#picker", {
width: 260,
wheelLightness: false,
wheelAngle: 270,
wheelDirection: "clockwise",
layout: [{
component: iro.ui.Wheel,
options: {}
}]
});
function handleVisibilityChange() {if (!d.hidden && new Date () - lastUpdate > 3000) requestJson();}
function sCol(na, col) {d.documentElement.style.setProperty(na, col);}
function gId(c) {return d.getElementById(c);}
@ -259,24 +273,30 @@ function onLoad()
selectSlot(0);
updateTablinks(0);
cpick.on("input:end", () => {setColor(1);});
cpick.on("color:change", () => {updatePSliders()});
pmtLS = localStorage.getItem('wledPmt');
// Load initial data
// Once we figure out why ESP8266 sometimes corrupts JSON responses if they are made in quick succession
// we can remove all setTimeout() throttling
loadPalettes(()=>{
// fill effect extra data array
loadFXData(()=>{
setTimeout(()=>{ // ESP8266 can't handle quick requests
// load and populate effects
loadFX(()=>{
setTimeout(()=>{ // ESP8266 can't handle quick requests
loadPalettesData(()=>{
requestJson();// will load presets and create WS
if (cfg.comp.css) setTimeout(()=>{loadSkinCSS('skinCss')},100);
});
},100);
});
},100);
});
setTimeout(()=>{ // ESP8266 can't handle quick requests
// fill effect extra data array
loadFXData(()=>{
setTimeout(()=>{ // ESP8266 can't handle quick requests
// load and populate effects
loadFX(()=>{
setTimeout(()=>{ // ESP8266 can't handle quick requests
loadPalettesData(()=>{
requestJson();// will load presets and create WS
if (cfg.comp.css) setTimeout(()=>{loadSkinCSS('skinCss')},100);
});
},50);
});
},50);
});
},50);
});
resetUtil();
@ -500,8 +520,13 @@ function loadPalettes(callback = null)
.then((json)=>{
lJson = Object.entries(json);
populatePalettes();
retry = false;
})
.catch((e)=>{
if (!retry) {
retry = true;
setTimeout(loadPalettes, 500); // retry
}
showToast(e, true);
})
.finally(()=>{
@ -522,9 +547,13 @@ function loadFX(callback = null)
.then((json)=>{
eJson = Object.entries(json);
populateEffects();
retry = false;
})
.catch((e)=>{
//setTimeout(loadFX, 250); // retry
if (!retry) {
retry = true;
setTimeout(loadFX, 500); // retry
}
showToast(e, true);
})
.finally(()=>{
@ -547,10 +576,14 @@ function loadFXData(callback = null)
// add default value for Solid
fxdata.shift()
fxdata.unshift(";!;");
retry = false;
})
.catch((e)=>{
fxdata = [];
//setTimeout(loadFXData, 250); // retry
if (!retry) {
retry = true;
setTimeout(loadFXData, 500); // retry
}
showToast(e, true);
})
.finally(()=>{
@ -624,11 +657,12 @@ function parseInfo(i) {
if (name === "Dinnerbone") d.documentElement.style.transform = "rotate(180deg)"; // Minecraft easter egg
if (i.live) name = "(Live) " + name;
if (loc) name = "(L) " + name;
d.title = name;
ledCount = i.leds.count;
//syncTglRecv = i.str;
maxSeg = i.leds.maxseg;
pmt = i.fs.pmt;
d.title = name;
simplifiedUI = i.simplifiedui;
ledCount = i.leds.count;
//syncTglRecv = i.str;
maxSeg = i.leds.maxseg;
pmt = i.fs.pmt;
gId('buttonNodes').style.display = lastinfo.ndc > 0 ? null:"none";
// do we have a matrix set-up
mw = i.leds.matrix ? i.leds.matrix.w : 0;
@ -750,6 +784,7 @@ function populateSegments(s)
let rvXck = `<label class="check revchkl">Reverse ${isM?'':'direction'}<input type="checkbox" id="seg${i}rev" onchange="setRev(${i})" ${inst.rev?"checked":""}><span class="checkmark"></span></label>`;
let miXck = `<label class="check revchkl">Mirror<input type="checkbox" id="seg${i}mi" onchange="setMi(${i})" ${inst.mi?"checked":""}><span class="checkmark"></span></label>`;
let rvYck = "", miYck ="";
let smpl = simplifiedUI ? 'hide' : '';
if (isMSeg) {
rvYck = `<label class="check revchkl">Reverse<input type="checkbox" id="seg${i}rY" onchange="setRevY(${i})" ${inst.rY?"checked":""}><span class="checkmark"></span></label>`;
miYck = `<label class="check revchkl">Mirror<input type="checkbox" id="seg${i}mY" onchange="setMiY(${i})" ${inst.mY?"checked":""}><span class="checkmark"></span></label>`;
@ -768,23 +803,23 @@ function populateSegments(s)
`<option value="1" ${inst.si==1?' selected':''}>WeWillRockYou</option>`+
`</select></div>`+
`</div>`;
cn += `<div class="seg lstI ${i==s.mainseg ? 'selected' : ''} ${exp ? "expanded":""}" id="seg${i}" data-set="${inst.set}">`+
`<label class="check schkl">`+
cn += `<div class="seg lstI ${i==s.mainseg && !simplifiedUI ? 'selected' : ''} ${exp ? "expanded":""}" id="seg${i}" data-set="${inst.set}">`+
`<label class="check schkl ${smpl}">`+
`<input type="checkbox" id="seg${i}sel" onchange="selSeg(${i})" ${inst.sel ? "checked":""}>`+
`<span class="checkmark"></span>`+
`</label>`+
`<div class="segname" onclick="selSegEx(${i})">`+
`<div class="segname ${smpl}" onclick="selSegEx(${i})">`+
`<i class="icons e-icon frz" id="seg${i}frz" onclick="event.preventDefault();tglFreeze(${i});">&#x${inst.frz ? (li.live && li.liveseg==i?'e410':'e0e8') : 'e325'};</i>`+
(inst.n ? inst.n : "Segment "+i) +
`<div class="pop hide" onclick="event.preventDefault();event.stopPropagation();">`+
`<i class="icons g-icon" style="color:${cG};" onclick="this.nextElementSibling.classList.toggle('hide');">&#x278${String.fromCharCode(inst.set+"A".charCodeAt(0))};</i>`+
`<div class="pop-c hide"><span style="color:var(--c-f);" onclick="setGrp(${i},0);">&#x278A;</span><span style="color:var(--c-r);" onclick="setGrp(${i},1);">&#x278B;</span><span style="color:var(--c-g);" onclick="setGrp(${i},2);">&#x278C;</span><span style="color:var(--c-l);" onclick="setGrp(${i},3);">&#x278D;</span></div>`+
`</div> `+
`<i class="icons edit-icon flr" id="seg${i}nedit" onclick="tglSegn(${i})">&#xe2c6;</i>`+
`<i class="icons edit-icon flr ${smpl}" id="seg${i}nedit" onclick="tglSegn(${i})">&#xe2c6;</i>`+
`</div>`+
`<i class="icons e-icon flr" id="sege${i}" onclick="expand(${i})">&#xe395;</i>`+
`<i class="icons e-icon flr ${smpl}" id="sege${i}" onclick="expand(${i})">&#xe395;</i>`+
(cfg.comp.segpwr ? segp : '') +
`<div class="segin" id="seg${i}in">`+
`<div class="segin ${smpl}" id="seg${i}in">`+
`<input type="text" class="ptxt" id="seg${i}t" autocomplete="off" maxlength=${li.arch=="esp8266"?32:64} value="${inst.n?inst.n:""}" placeholder="Enter name..."/>`+
`<table class="infot segt">`+
`<tr>`+
@ -834,6 +869,7 @@ function populateSegments(s)
}
gId('segcont').innerHTML = cn;
gId("segcont").classList.remove("hide");
let noNewSegs = (lowestUnused >= maxSeg);
resetUtil(noNewSegs);
if (gId('selall')) gId('selall').checked = true;
@ -847,6 +883,8 @@ function populateSegments(s)
if (segCount < 2) {
gId(`segd${lSeg}`).classList.add("hide");
if (parseInt(gId("seg0bri").value)==255) gId(`segp0`).classList.add("hide");
// hide segment controls if there is only one segment in simplified UI
if (simplifiedUI) gId("segcont").classList.add("hide");
}
if (!isM && !noNewSegs && (cfg.comp.seglen?parseInt(gId(`seg${lSeg}s`).value):0)+parseInt(gId(`seg${lSeg}e`).value)<ledCount) gId(`segr${lSeg}`).classList.remove("hide");
gId('segutil2').style.display = (segCount > 1) ? "block":"none"; // rsbtn parent
@ -1258,6 +1296,12 @@ function updateSelectedPalette(s)
var selectedPalette = parent.querySelector(`.lstI[data-id="${s}"]`);
if (selectedPalette) parent.querySelector(`.lstI[data-id="${s}"]`).classList.add('selected');
// Display selected palette name on button in simplified UI
let selectedName = selectedPalette.querySelector(".lstIname").innerText;
if (simplifiedUI) {
gId("palwbtn").innerText = "Palette: " + selectedName;
}
// in case of special palettes (* Colors...), force show color selectors (if hidden by effect data)
let cd = gId('csl').children; // color selectors
if (s > 1 && s < 6) {
@ -1299,8 +1343,15 @@ function updateSelectedFx()
}
}
});
// hide 2D mapping and/or sound simulation options
var selectedName = selectedEffect.querySelector(".lstIname").innerText;
// Display selected effect name on button in simplified UI
let selectedNameOnlyAscii = selectedName.replace(/[^\x00-\x7F]/g, "");
if (simplifiedUI) {
gId("fxbtn").innerText = "Effect: " + selectedNameOnlyAscii;
}
// hide 2D mapping and/or sound simulation options
var segs = gId("segcont").querySelectorAll(`div[data-map="map2D"]`);
for (const seg of segs) if (selectedName.indexOf("\u25A6")<0) seg.classList.remove('hide'); else seg.classList.add('hide');
var segs = gId("segcont").querySelectorAll(`div[data-snd="si"]`);
@ -1530,6 +1581,7 @@ function setEffectParameters(idx)
// set the bottom position of selected effect (sticky) as the top of sliders div
function setSelectedEffectPosition() {
if (simplifiedUI) return;
let top = parseInt(getComputedStyle(gId("sliders")).height);
top += 5;
let sel = d.querySelector('#fxlist .selected');
@ -1596,6 +1648,10 @@ function setEffectParameters(idx)
// disable palette list
text += ' not used';
palw.style.display = "none";
// Close palette dialog if not available
if (gId("palw").lastElementChild.tagName == "DIALOG") {
gId("palw").lastElementChild.close();
}
}
pall.innerHTML = icon + text;
// not all color selectors shown, hide palettes created from color selectors
@ -1661,6 +1717,7 @@ function requestJson(command=null)
parseInfo(i);
populatePalettes(i);
if (isInfo) populateInfo(i);
if (simplifiedUI) simplifyUI();
}
var s = json.state ? json.state : json;
readState(s);
@ -1673,8 +1730,13 @@ function requestJson(command=null)
});
},25);
reqsLegal = true;
retry = false;
})
.catch((e)=>{
if (!retry) {
retry = true;
setTimeout(requestJson,500);
}
showToast(e, true);
});
}
@ -2259,6 +2321,12 @@ function setFX(ind = null)
} else {
d.querySelector(`#fxlist input[name="fx"][value="${ind}"]`).checked = true;
}
// Close effect dialog in simplified UI
if (simplifiedUI) {
gId("fx").lastElementChild.close();
}
var obj = {"seg": {"fx": parseInt(ind), "fxdef": cfg.comp.fxdef}}; // fxdef sets effect parameters to default values
requestJson(obj);
}
@ -2271,6 +2339,11 @@ function setPalette(paletteId = null)
d.querySelector(`#pallist input[name="palette"][value="${paletteId}"]`).checked = true;
}
// Close palette dialog in simplified UI
if (simplifiedUI) {
gId("palw").lastElementChild.close();
}
var obj = {"seg": {"pal": paletteId}};
requestJson(obj);
}
@ -2722,8 +2795,10 @@ function search(field, listId = null) {
field.nextElementSibling.style.display = (field.value !== '') ? 'block' : 'none';
if (!listId) return;
const search = field.value !== '';
// clear filter if searching in fxlist
if (listId === 'fxlist' && field.value !== '') {
if (listId === 'fxlist' && search) {
gId("filters").querySelectorAll("input[type=checkbox]").forEach((e) => { e.checked = false; });
}
@ -2757,6 +2832,12 @@ function search(field, listId = null) {
sortedListItems.forEach(item => {
gId(listId).append(item);
});
// scroll to first search result
const firstVisibleItem = sortedListItems.find(item => item.style.display !== 'none' && !item.classList.contains('sticky') && !item.classList.contains('selected'));
if (firstVisibleItem && search) {
firstVisibleItem.scrollIntoView({ behavior: "instant", block: "center" });
}
}
function clean(clearButton) {
@ -2903,7 +2984,7 @@ function hasIroClass(classList)
//required by rangetouch.js
function lock(e)
{
if (pcMode) return;
if (pcMode || simplifiedUI) return;
var l = e.target.classList;
var pl = e.target.parentElement.classList;
@ -2917,7 +2998,7 @@ function lock(e)
//required by rangetouch.js
function move(e)
{
if(!locked || pcMode) return;
if(!locked || pcMode || simplifiedUI) return;
var clientX = unify(e).clientX;
var dx = clientX - x0;
var s = Math.sign(dx);
@ -2963,7 +3044,7 @@ function togglePcMode(fromB = false)
gId('buttonPcm').className = (pcMode) ? "active":"";
gId('bot').style.height = (pcMode && !cfg.comp.pcmbot) ? "0":"auto";
sCol('--bh', gId('bot').clientHeight + "px");
_C.style.width = (pcMode)?'100%':'400%';
_C.style.width = (pcMode || simplifiedUI)?'100%':'400%';
}
function mergeDeep(target, ...sources)
@ -3018,6 +3099,98 @@ function tooltip()
});
};
// Transforms the default UI into the simple UI
function simplifyUI() {
// Create dropdown dialog
function createDropdown(id, buttonText, dialogElements = null) {
// Create dropdown dialog
const dialog = document.createElement("dialog");
// Move every dialogElement to the dropdown dialog or if none are given, move all children of the element with the given id
if (dialogElements) {
dialogElements.forEach((e) => {
dialog.appendChild(e);
});
} else {
while (gId(id).firstChild) {
dialog.appendChild(gId(id).firstChild);
}
}
// Create button for the dropdown
const btn = document.createElement("button");
btn.id = id + "btn";
btn.classList.add("btn");
btn.innerText = buttonText;
function toggleDialog(e) {
if (e.target != btn && e.target != dialog) return;
if (dialog.open) {
dialog.close();
return;
}
// Prevent autofocus on dialog open
dialog.inert = true;
dialog.showModal();
dialog.inert = false;
clean(dialog.firstElementChild.children[1]);
dialog.scrollTop = 0;
};
btn.addEventListener("click", toggleDialog);
dialog.addEventListener("click", toggleDialog);
// Add the dialog and button to the element with the given id
gId(id).append(btn);
gId(id).append(dialog);
}
// Check if the UI was already simplified
if (gId("Colors").classList.contains("simplified")) return;
// Disable PC Mode as it does not exist in simple UI
if (pcMode) togglePcMode(true);
_C.style.width = '100%'
_C.style.setProperty('--n', 1);
gId("Colors").classList.add("simplified");
// Put effects below palett list
gId("Colors").append(gId("fx"));
gId("Colors").append(gId("sliders"));
// Put segments before palette list
gId("Colors").insertBefore(gId("segcont"), gId("pall"));
// Put preset quick load before palette list and segemts
gId("Colors").insertBefore(gId("pql"), gId("pall"));
// Create dropdown for palette list
createDropdown("palw", "Change palette");
createDropdown("fx", "Change effect", [gId("fxFind"), gId("fxlist")]);
// Hide pallete label
gId("pall").style.display = "none";
gId("Colors").insertBefore(document.createElement("br"), gId("pall"));
// Hide effect label
gId("modeLabel").style.display = "none";
// Hide buttons in top bar
gId("buttonNl").style.display = "none";
gId("buttonSync").style.display = "none";
gId("buttonSr").style.display = "none";
gId("buttonPcm").style.display = "none";
// Hide bottom bar
gId("bot").style.display = "none";
document.documentElement.style.setProperty('--bh', '0px');
// Hide other tabs
gId("Effects").style.display = "none";
gId("Segments").style.display = "none";
gId("Presets").style.display = "none";
// Hide filter options
gId("filters").style.display = "none";
// Hide buttons for pixel art and custom palettes (add / delete)
gId("btns").style.display = "none";
}
size();
_C.style.setProperty('--n', N);

View File

@ -267,10 +267,7 @@
<h2>Web Setup</h2>
Server description: <input type="text" name="DS" maxlength="32"><br>
<!-- Sync button toggles both send and receive: <input type="checkbox" name="ST"><br> -->
<div id="NoSimple" class="hide">
<i class="warn">This firmware build does not include simplified UI support.<br></i>
</div>
<div id="Simple">Enable simplified UI: <input type="checkbox" name="SU"><br></div>
Enable simplified UI: <input type="checkbox" name="SU"><br>
<i>The following UI customization settings are unique both to the WLED device and this browser.<br>
You will need to set them again if using a different browser, device or WLED IP address.<br>
Refresh the main UI to apply changes.</i><br>

View File

@ -1,933 +0,0 @@
@font-face {
font-family: "WIcons";
src: url(data:font/woff2;charset=utf-8;base64,d09GMgABAAAAAAnUAAsAAAAAE1AAAAmFAAGZmgAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgXwRCAqcYJZIATYCJANwCzoABCAFgwYHIBs7D8iOwzgm3MXMnzZCktnjcbN+QlJLaJ3ulULplpW6UqWioeS91Jye0jUlJwZr5nTdE3LntdPvAg+ft/fbsLsGlNLuhlmQjKi7NPDEIgwTmP//a6mdl+SHUBhEIdHFxak7s4E/yzhJSjC7BQQLfDwopF/i6aqSElEFDXx8ZVWjy3rym4N6FlZQ4hu+nXsGIDMQF3gAxa14AgArtVMhfkgjfEAbiChwuSIwEUCmudPhiQdT6rvIjLSRZEwDhF9BIsooI53TIRIoIUD8kyNZI7UjAyMrR/aM/DwaOpozah9LGCsY2zN2YOzs2L3xqeNp4zXjq8bXT/hMBLj/53YDAIS+7u668n3H+HRPdZd1u3TzdRZdVMTfIl5HfKgd1b7Svqd9W9uprdP8QTOmeaz5TPORJlDDjHVjG0ANMQYsmRrKlmpyqV7kubIQC2GSIkFS+MneCJ48JJFVChQfuwKMp2yU9pmq1VKUR6ret0Gp0SjVYRRF+Xj7+OiUSk/GIzu1miHZWx+g8Y1RUktPmqIitRTXVNzzCtuFPKcH0zRBG+Y9/CnhBa20v5oHfsEUMgXMPEfO5ZcJx0FIPiVywgjb6MIuV+oZ4v2kk6/znIxDKrguM22y+bW8wUGqi7aL8fQJzwnCj8tIppdI9bYDSVJVCQInipW0HbtclcT7vCyLmXaSVrQSNMybaJJBh2PiXrXbgd6AbqecdDTO9EQEIeW0VPWQcdQ8ltPOEu+76q2IxUToJeWpfjQiHHH5AsADLj1bHgQxXsUoHfKYbg+CxCxC69eHcOvWheJ1l6b0nD7jG+bSA1dCZVxmw8ZJ/IYtxPtbJxlpQ/LGjSq00TmdNIZxrGel+y+rZJro+nUh3PrNIGwK6WrXNMV2xTeRWHSjScktLJfe1rc7spyvk3b6V4k48Sr3Am1Pv/QifhsI2uMvc863OiQQRNoedpPfHnSwcete+aDEE67cKzTgBlQgjpjgTDnJtGnX2qbmXJ6FOBLZ7wsr+JZzYnbjdbkCuEfU0HvlwqbtUgJ7zRXFNJsvSxlwz2WYta4xjri/fsulnnFVPyonpP0RL5oVNKkkfElG4csTDNAsgzC38G7gSKVgSZ7m/cEvKALmxKz//u7h6egHF7MrH4jJp/Zx4q32a8T71xnHVRCGlfFZNttd2FcUaay6e9PkhucyR0oPu1z1z/DB+8wixAFdMU1gnmB4xAw68pwHcWjlFrBnXxLjj63UGgvNGVGAJFzxFw+Womn7MAibVbu6leHRB5sc10fLtbrdr/JqV6Yr+ovwFtRHE7M4zG90qNB6YREoo51kFJabq3NeHVKdef/hsMFFSpt5m8XmJqDDAnR0c418mxmxrQzQuyPnspRwfAYkpthzr7gST1xNSf4WtBMM9DQT19uL+gb47gFLP3cT08F8I4dZxJl41Gsx9WHzLBOHzWjRS9NLCOUBCFQ+uGhB/V7ZzUwKESTmDriJ+UecdD/bFXFMLLsjgiAt4pp7ulpxb2tzE8I8xhyHODBK3SGg6QP12BiP3YMw2rDFtWUDXL+esnv3H9QxqfmbDnbMLjGUFpqqZbnWSg0lhWv9wU35qTHqP9zqUrL7kqKj8YjZzg01pb9+yQ8sXZpYxKGiFJTNsIwwpyR44gEOnV/+ennFdHD/2lQ3uS5y1qzIztXUNPE6odYJ0PqUiWJtgKGKMILY60dxeYynbb+sFKKqNn0Wz2rLtMbBQWPnYtmJa4WqFRob/9mmuycQVv7ifCNvXrlhzgDLDvAGA+8H5xjK948cDet+FaXfS+Lko/Wt+vScqarq6kZTbk4NaKqpObkEEpsac9L1rRNXJgPbrWyDdYje6tBQAztkbYC0wDe4UnNipmnZtInu/ujf6Kf7ve112Huf92Ev/7enB/+nP7pbrPiQJZbi0jCSpoN9UNPTkj7JMwpbWgopAbhtbOWkytAF3K+/qo0SASNW2G2bLfnshpB4a9dmz7/Hx//dc3OXNZ46YRyXUV2dYRsD97qKL79qazu+vSI1vPXT7375bWSGocBofD2eIRzJ0cMC0tenwQ0gfvuSdvd14f1uEooLPE3JJHL6uCd/n5n8d35UOKPn6nhr8kyrV3ad3nz2iTiNL414EnefL/JGLlWZtZWaqoEh4xSjvsGb/6m9raFlsLm4uHkQWlv7T/weZzjHHe7xZiUzpJ5WAWBLDNwRKxwRYnFoXGxcaKxN6DR8BNn2o9Nqmmutvra5TnIjXMBlmIFZ3yPYX3Mt9v5mmHuwYvvxPverL9eSvszXNjUXrkbqcGOVW2bEbDGKi3MLVTWzzWHF54Bu/2rA1qko6l9fFgVbBurfVBWFFlVW1ugxOwcs+8W//FcUZJieLl9WXA8eGL5crB7fhOMyxl8bjQWGjB1bW/ok6Ucqensr7F8H7utsmdqoHmz99rvyeE/Pz7u64mvVXLjyY8v8j5XhZeH3aPX75dpiO5eN/OzwcG7zkflt/sd5e7YcqbOowfRg22R5585at2vXX87W1Y0gQ079497eYT1EkyoEqMYABmHd8QvKGrRG6bJYTDCCZYGEWcm5G1jXM2i54Y9WtiBuklP57YtBZMAWlu2fYzDM7Q+5FmxKS3Oz5jwK6IactbWPowuQgNyHluKlaw9wnbOmtuajo/VSw9FrBSRwMcuUV2ZwFhh6s7hsqriWCsgA2s3nFcri4I7O+asxwxZbtLL03E9bhcR6Yz9mIbF0U96K0xGA7bx9y+l2//73j+H2i0EGd27uAVNI/WhCYuWqIDaYxads0lcVFV+dOlHmBx/qO7c6/uZX0tReUtJQv64y3adAvX6xDezAX/8Wm8Cgh/95O9OxsNCYnsXWQ+7pCz8/NMZ57ZAIGEdTw+ap8V+I3NUVe375wiv+lccqj172X7Yw5gJAUQGYPQ6QyxRfgeC+Qc5WnAMCAHFv6TJtet3pn/83b4YCAIBv35ofpTRyt5PjZEwT8KYAEQK8nFgBcE/yUwn2oqHSBKoEG7KZQLMpjo5uha/PI2yuBWOCTSDZajpqQ68+Za18jgGgYMT8nBhjKcFrKCYF6yKSZRLF5tR5YKhUzzNWM52mBvuPMiL7xPx4UaRgFiJZAVFscZ2HUIhUPcEaH5WWDvvmvdPfl5KaCvO8o1+fFCBb6hvuLz8lMROwfjPN8iar90RCCiRCJr3ugqHf6LqgUYYs5hzvu9tMIOUr/xpvRsNVvdZ/p+mB8n7V2Spo0T+aRhPpNhsNFOqxoE2u0suqTipgx58IJA0AAAA=) format('woff');
}
:root {
--c-1: #111;
--c-f: #fff;
--c-2: #222;
--c-3: #333;
--c-4: #444;
--c-5: #555;
--c-6: #666;
--c-8: #888;
--c-b: #bbb;
--c-c: #ccc;
--c-e: #eee;
--c-d: #ddd;
--c-r: #e42;
--c-g: #4e2;
--c-l: #48a;
--t-b: .5;
--c-o: rgba(34, 34, 34, .9);
--c-tb : rgba(34, 34, 34, var(--t-b));
--c-tba: rgba(102, 102, 102, var(--t-b));
--c-tbh: rgba(51, 51, 51, var(--t-b));
/*following are internal*/
--th: 70px;
--tp: 70px;
--bh: 63px;
--tbp: 14px 8px 10px;
--bbp: 9px 0 7px 0;
--bhd: none;
--bmt: 0;
}
html {
touch-action: manipulation;
}
body {
margin: 0;
background-color: var(--c-1);
font-family: Helvetica, Verdana, sans-serif;
font-size: 17px;
color: var(--c-f);
text-align: center;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-tap-highlight-color: transparent;
scrollbar-width: 6px;
scrollbar-color: var(--c-sb) transparent;
}
html,
body {
height: 100%;
width: 100%;
position: fixed;
overscroll-behavior: none;
}
#bg {
height: 100vh;
width: 100vw;
position: fixed;
z-index: -10;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
opacity: 0;
transition: opacity 2s;
}
p {
margin: 10px 0 2px 0;
}
a, p, a:visited {
color: var(--c-d);
}
a, a:visited {
text-decoration: none;
}
button {
outline: 0;
cursor: pointer;
background-color: transparent;
border: 0;
transition: color .3s, background-color .3s;
font-size: 19px;
color: var(--c-c);
min-width: 40px;
min-height: 40px;
}
button:hover {
background: var(--c-4);
}
.label {
margin: 0;
padding: 6px 0 0;
}
#namelabel {
position: fixed;
bottom: calc(var(--bh) + 6px);
right: 4px;
color: var(--c-6);
cursor: pointer;
writing-mode: vertical-rl;
}
.wrapper {
position: fixed;
top: 0;
left: 0;
right: 0;
background: var(--c-tb);
z-index: 1;
}
.center {
margin: 0 auto;
width: 320px;
}
.icons {
font-family: 'WIcons';
font-style: normal;
font-size: 24px;
line-height: 1;
display: inline-block;
margin: -2px 0 4px 0;
text-shadow: -1px -1px 0 var(--c-3), 1px -1px 0 var(--c-3), -1px 1px 0 var(--c-3), 1px 1px 0 var(--c-3);
}
.huge {
font-size: 42px;
}
.infot {
table-layout: fixed;
width: 100%;
}
.keytd {
text-align: left;
padding-bottom: 8px;
}
.valtd {
text-align: right;
padding-bottom: 8px;
}
.valtd i {
font-size: small;
}
.slider-icon
{
transform: translate(4px,3px);
color: var(--c-d);
}
.il {
display: inline-block;
vertical-align: middle;
}
.tab {
background-color: transparent;
color: var(--c-d);
}
.tab button {
background-color: transparent;
float: left;
border: 0;
transition: color .3s, background-color .3s;
font-size: 17px;
color: var(--c-c);
min-width: 44px;
}
.top button {
padding: var(--tbp);
margin: 0;
}
.tab button:hover {
background-color: var(--c-tbh);
color: var(--c-e);
}
.tab button.active {
background-color: var(--c-tba) !important;
color: var(--c-f);
}
.active {
background-color: var(--c-6) !important;
color: var(--c-f);
}
.container {
width: 100%;
height: calc(100% - var(--tp) - var(--bh));
margin-top: var(--tp);
overscroll-behavior: none;
}
.tabcontent {
position: relative;
width: 100%;
box-sizing: border-box;
border: 0;
overflow: auto;
height: 100%;
overscroll-behavior: none;
}
.smooth { transition: transform calc(var(--f, 1)*.5s) ease-out }
.tab-label {
margin: 0 0 -5px 0;
padding-bottom: 4px;
}
.overlay {
position: fixed;
height: 100%;
width: 100%;
top: 0;
left: 0;
background-color: var(--c-3);
font-size: 24px;
display: flex;
align-items: center;
justify-content: center;
z-index: 11;
opacity: .95;
transition: .7s;
pointer-events: none;
}
#toast {
opacity: 0;
background-color: var(--c-5);
max-width: 90%;
color: var(--c-f);
text-align: center;
border-radius: 5px;
padding: 16px;
position: fixed;
z-index: 5;
left: 50%;
transform: translateX(-50%);
bottom: calc(var(--bh) + 22px);
font-size: 17px;
pointer-events: none;
}
#toast.show {
opacity: 1;
animation: fadein .5s, fadein .5s 2.5s reverse;
}
#toast.error {
opacity: 1;
background-color: #b21;
animation: fadein .5s;
}
.modal {
position: fixed;
left: 0;
bottom: 0;
right: 0;
top: calc(var(--th) - 1px);
background-color: var(--c-o);
transform: translateY(100%);
transition: transform .4s;
padding: 8px;
font-size: 20px;
overflow: auto;
}
#info, #nodes {
z-index: 3;
}
#rover {
z-index: 2;
}
#ndlt {
margin: 12px 0;
}
#roverstar {
position: fixed;
top: calc(var(--th) + 5px);
left: 1px;
display: none;
cursor: pointer;
}
#connind {
position: fixed;
bottom: calc(var(--bh) + 5px);
left: 4px;
padding: 5px;
border-radius: 5px;
background-color: #a90;
z-index: -2;
}
#imgw {
display: inline-block;
margin: 8px;
}
#kv, #kn {
/*max-width: 490px;*/
display: inline-block;
}
#info table, #nodes table {
table-layout: fixed;
width: 100%;
}
#info td, #nodes td {
padding-bottom: 8px;
}
#info .btn {
margin: 5px;
}
#info table .btn, #nodes table .btn {
margin: 0;
width: 180px;
}
#info div, #nodes div {
width: 490px;
margin: 0 auto;
}
#kn td {
padding-bottom: 12px;
}
#heart {
transition: color .9s;
font-size: 16px;
color: #f00;
}
img {
max-width: 100%;
max-height: 100%;
}
.wi {
image-rendering: pixelated;
image-rendering: crisp-edges;
width: 210px;
}
@keyframes fadein {
from {bottom: 0; opacity: 0;}
to {bottom: calc(var(--bh) + 22px); opacity: 1;}
}
.sliderwrap {
height: 30px;
width: 250px;
position: relative;
margin: 4px 0;
}
#Colors .sliderwrap {
width: 260px;
margin: 10px 0 0;
}
.sliderdisplay {
content:'';
position: absolute;
top: 10px; left: 8px; right: 8px;
height: 8px;
background: var(--c-4);
border-radius: 16px;
pointer-events: none;
z-index: -1;
}
#Colors .sliderdisplay {
height: 28px;
top: 0; bottom: 0;
left: 0; right: 0;
/*border: 1px solid var(--c-b);*/
}
#rwrap .sliderdisplay { background: linear-gradient(90deg, #000 0%, #f00); }
#gwrap .sliderdisplay { background: linear-gradient(90deg, #000 0%, #0f0); }
#bwrap .sliderdisplay { background: linear-gradient(90deg, #000 0%, #00f); }
#wwrap .sliderdisplay { background: linear-gradient(90deg, #000 0%, #fff); }
#kwrap .sliderdisplay { background: linear-gradient(90deg, #ff8f1f 0%, #fff 50%, #cbdbff); }
#wbal .sliderdisplay { background: linear-gradient(90deg, #ff8f1f 0%, #fff 50%, #d4e0ff); }
.sliderbubble {
width: 24px;
position: relative;
display: inline-block;
border-radius: 10px;
background: var(--c-3);
color: var(--c-f);
padding: 4px 4px 2px;
font-size: 14px;
right: 3px;
transition: visibility .25s ease, opacity .25s ease;
opacity: 0;
visibility: hidden;
}
output.sliderbubbleshow {
visibility: visible;
opacity: 1;
}
.hidden {
display: none;
}
input[type=range] {
-webkit-appearance: none;
width: 100%;
padding: 0;
margin: 0;
background-color: transparent;
cursor: pointer;
}
#Colors input[type=range] {
width: 252px;
margin: 0;
}
input[type=range]::-webkit-slider-runnable-track {
width: 100%;
height: 30px;
cursor: pointer;
background: transparent;
}
input[type=range]::-webkit-slider-thumb {
border: 2px solid #000;
height: 20px;
width: 20px;
border-radius: 50%;
background: var(--c-f);
cursor: pointer;
-webkit-appearance: none;
margin-top: 4px;
}
input[type=range]::-moz-range-track {
width: 100%;
height: 30px;
background-color: var(--c-0);
}
input[type=range]::-moz-range-thumb {
border: 2px solid var(--c-3);
height: 20px;
width: 20px;
border-radius: 50%;
background: var(--c-f);
transform: translateY(5px);
}
#Colors input[type=range]::-webkit-slider-thumb {
border: 2px solid #000;
}
#Colors input[type=range]::-moz-range-thumb {
border: 2px solid var(--c-1);
}
#Presets .list {
max-height: 215px;
overflow-y: scroll;
overflow-x: hidden;
width: 280px;
margin: 0 0 0 20px;
-ms-overflow-style: none;
scrollbar-width: none; /* Firefox */
}
/* Hide scrollbar for Chrome, Safari and Opera */
#Presets .list::-webkit-scrollbar {
display: none;
}
#Segments .sliderwrap{
width: 225px;
}
#picker, #rgbwrap, #kwrap, #vwrap, #wwrap, #wbal {
display: none;
}
.hd {
display: var(--bhd);
}
#briwrap {
float: right;
margin-top: var(--bmt);
}
#picker {
width: 260px;
}
#picker, #csl, #segcont {
margin: 10px auto 0;
}
.btn {
margin: 10px auto 0;
width: 280px;
font-size: 19px;
background-color: var(--c-3);
color: var(--c-d);
cursor: pointer;
border: 1px solid var(--c-3);
border-radius: 25px;
transition-duration: .3s;
-webkit-backface-visibility: hidden;
-webkit-transform: translate3d(0,0,0);
overflow: clip;
text-overflow: clip;
min-height: 40px;
line-height: 40px;
}
.btn:hover {
background-color: var(--c-4);
border: 1px solid var(--c-4);
}
.btn-xs {
width: 42px;
height: 42px;
margin: 4px;
padding: 0;
}
#fxBtn, #palBtn {
background-color: var(--c-2);
border: 1px solid var(--c-2);
}
#fxBtn:hover, #palBtn:hover {
background-color: var(--c-3);
border: 1px solid var(--c-3);
}
.btn-icon {
margin-right: 8px;
vertical-align: middle;
display: inline-block;
}
.qcs {
margin: 2px;
border-radius: 14px;
display: inline-block;
width: 28px;
height: 28px;
line-height: 28px;}
.qcsb {
width: 26px;
height: 26px;
line-height: 26px;
border: 1px solid var(--c-f);
}
option {
background-color: var(--c-3);
color: var(--c-f);
}
input[type=number], input[type=text] {
background: var(--c-3);
color: var(--c-f);
border: 0 solid var(--c-f);
border-radius: 5px;
padding: 8px;
margin: 6px 6px 6px 0;
font-size: 19px;
transition: background-color .2s;
outline: 0;
width: 50px;
-webkit-appearance: textfield;
-moz-appearance: textfield;
appearance: textfield;
}
::selection {
background: var(--c-b);
}
input[type=number]:focus, input[type=text]:focus {
background: var(--c-6);
}
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button {
-webkit-appearance: none;
}
.pid {
position: absolute;
top: 0;
left: 0;
padding: 12px 0 0 12px;
font-size: 16px;
width: 20px;
text-align: center;
color: var(--c-b);
}
.xxs {
border: 2px solid var(--c-e) !important;
width: 44px;
height: 44px;
margin: 5px;
padding: 0;
}
.xxs-w {
border-width: 4px !important;
margin: 2px;
width: 50px;
height: 50px;
padding: 0;
}
.qcs, .xxs {
text-shadow: -1px -1px 0 var(--c-6), 1px -1px 0 var(--c-6), -1px 1px 0 var(--c-6), 1px 1px 0 var(--c-6);
}
.psts {
color: var(--c-f);
margin: 6px;
}
.pwr {
color: var(--c-6);
cursor: pointer;
}
.act {
color: var(--c-f);
}
.check, .radio {
display: inline-block;
position: relative;
cursor: pointer;
text-align: center;
}
.schkl {
width: 24px;
top: -2px;
}
.check input, .radio input {
position: absolute;
opacity: 0;
cursor: pointer;
height: 0;
width: 0;
}
.checkmark, .radiomark {
position: absolute;
top: 0;
bottom: 0;
left: 0;
background-color: var(--c-3);
border: 1px solid var(--c-2);
}
.radiomark {
height: 24px;
width: 24px;
border-radius: 50%;
}
.checkmark {
height: 25px;
width: 25px;
border-radius: 10px;
}
.check:hover input ~ .checkmark {
background-color: var(--c-4);
}
.check input:checked ~ .checkmark {
background-color: var(--c-6);
}
.checkmark:after, .radiomark:after {
content: "";
position: absolute;
display: none;
}
.check input:checked ~ .checkmark:after, .radio input:checked ~ .radiomark:after {
display: block;
}
.check .checkmark:after {
left: 9px;
top: 5px;
width: 5px;
height: 10px;
border: solid var(--c-f);
border-width: 0 3px 3px 0;
-webkit-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
}
.radio .radiomark:after {
width: 12px;
height: 12px;
top: 50%;
left: 50%;
margin: -6px;
border-radius: 50%;
background: var(--c-f);
}
.h {
font-size: 13px;
color: var(--c-b);
}
.list {
position: relative;
width: 280px;
transition: background-color .5s;
margin: auto auto 20px;
font-size: 19px;
line-height: 24px;
}
.lstI {
cursor: pointer;
background-color: var(--c-2);
overflow: hidden;
border-radius: 20px;
display: block;
position: relative;
border: 1px solid var(--c-2);
padding: 8px 10px;
margin: 10px 0;
min-height: 24px;
}
.selected { /* has to be after .lstI */
background: var(--c-5);
}
.lstI:hover {
background: var(--c-4);
}
/*
.lstI:last-child {
border: 0;
border-radius: 0 0 20px 20px;
padding-bottom: 10px;
}
*/
.lstIcontent {
width: 100%;
vertical-align: middle;
padding: 0 20px 0 5px;
text-align: left;
}
.lstIname {
white-space: nowrap;
cursor: pointer;
}
.lstIprev {
width: 100%;
height: 8px;
position: absolute;
bottom: 0;
left: 0;
}
/* Dropdown Content (Hidden by Default) */
.dd-content {
display: none;
position: absolute;
width: 284px;
z-index: 1;
height: 260px;
overflow-y: scroll;
overflow-x: hidden;
padding: 0 18px;
margin-top: 10px;
-ms-overflow-style: none;
scrollbar-width: none; /* Firefox */
}
/* Hide scrollbar for Chrome, Safari and Opera */
.dd-content::-webkit-scrollbar {
display: none;
}
.fnd {
position: sticky;
top: 0;
z-index: 1;
width: 280px;
margin: 0 auto;
}
.search-icon {
position: absolute;
top: 10px;
left: 13px;
pointer-events: none;
width: 24px;
height: 24px;
margin-top: -1px;
z-index: 1;
}
.clear-icon {
position: absolute;
display: none;
top: 10px;
right: 13px;
cursor: pointer;
margin-top: -1px;
z-index: 1;
}
input[type=text].fnd {
display: block;
width: 100%;
box-sizing: border-box;
padding: 8px 48px 8px 48px;
margin: 5px auto 0;
text-align: left;
border-radius: 25px;
background-color: var(--c-2);
border: 1px solid var(--c-4);
}
input[type=text].fnd:focus {
background-color: var(--c-4);
}
input[type=text].fnd:not(:placeholder-shown), input[type=text].fnd:hover {
background-color: var(--c-3);
}
.h, .c {
text-align: center;
}
::-webkit-scrollbar {
width: 6px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: var(--c-sb);
opacity: .2;
border-radius: 5px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--c-sbh);
}
@media not all and (hover: none) {
.sliderwrap:hover + output.sliderbubble {
visibility: visible;
opacity: 1;
}
}
@media all and (max-width: 335px) {
.sliderbubble {
display: none;
}
}
@media all and (max-width: 550px) and (min-width: 374px) {
#info .btn, #nodes .btn {
width: 150px;
}
#info div, #nodes div {
width: 320px;
}
}
@media all and (max-width: 540px) {
.top button {
width: 16.6%;
padding: 8px 0 4px 0;
}
}
@media all and (min-width: 541px) and (max-width: 719px) {
.top button {
width: 14.2%;
padding: 8px 0 4px 0;
}
}
@media all and (max-width: 719px) {
.hd {
display: none !important;
}
#briwrap {
margin-top: 0 !important;
float: none;
}
}

View File

@ -1,263 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<meta charset="utf-8">
<meta name="theme-color" content="#222222">
<meta content="yes" name="apple-mobile-web-app-capable">
<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAGACGAAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAE1JREFUOI1j/P//PwOxgNGeAUMxE9G6cQCKDWAhpADZ2f8PMjBS3QW08QK20KaZC2gfC9hCnqouoNgARgY7zMxAyNlUdQHlXiAlO2MDAD63EVqNHAe0AAAAAElFTkSuQmCC"/>
<title>WLED</title>
<script>
function feedback(){}
// instead of including [script src="iro.js"][/script] and [script src="rangetouch.js"][/script]
// (which would be inlined by nodeJS inliner during minimization and compression) we need to load them dynamically
// the following is needed to load iro.js and rangetouch.js as consecutive requests to allow ESP8266
// to keep up with requests (if requests happent too fast some may not get processed)
// it will also call onLoad() after last is loaded (it was removed from [body onload="onLoad()"]).
var h = document.getElementsByTagName('head')[0];
var l = document.createElement('script');
l.type = 'application/javascript';
l.src = 'iro.js';
l.addEventListener('load', (e) => {
// after iro is loaded initialize global variable
cpick = new iro.ColorPicker("#picker", {
width: 260,
wheelLightness: false,
wheelAngle: 270,
wheelDirection: "clockwise",
layout: [{
component: iro.ui.Wheel,
options: {}
}]
});
cpick.on("input:end", () => {setColor(1);});
cpick.on("color:change", () => {updatePSliders()});
var l = document.createElement('script');
l.type = 'application/javascript';
l.src = 'rangetouch.js';
l.addEventListener('load', (e) => {
// after rangetouch is loaded initialize global variable
ranges = RangeTouch.setup('input[type="range"]', {});
let stateCheck = setInterval(() => {
if (document.readyState === 'complete') {
clearInterval(stateCheck);
// document ready, start processing UI
onLoad();
}
}, 100);
});
setTimeout(function(){h.appendChild(l)},50);
});
setTimeout(function(){h.appendChild(l)},50);
</script>
<link rel="stylesheet" href="simple.css">
</head>
<body>
<div id="cv" class="overlay">Loading WLED UI...</div>
<noscript><div class="overlay" style="opacity:1;">Sorry, WLED UI needs JavaScript!</div></noscript>
<div id="bg"></div>
<div class="wrapper" id="top">
<div class="tab top">
<div class="btnwrap">
<button id="buttonPower" onclick="togglePower()"><i class="icons">&#xe08f;</i><p class="tab-label">Power</p></button>
<button id="buttonI" onclick="toggleInfo()"><i class="icons">&#xe066;</i><p class="tab-label">Info</p></button>
<button id="buttonNodes" onclick="toggleNodes()"><i class="icons">&#xe22d;</i><p class="tab-label">Nodes</p></button></div>
<button onclick="window.location.href='/settings';"><i class="icons">&#xe0a2;</i><p class="tab-label">Config</p></button>
<button id="buttonCP" onclick="tglCP()"><i class="icons">&#xe2b3;</i><p class="tab-label">Expand</p></button>
<!--button id="buttonBri" onclick="tglBri()"><i class="icons">&#xe2a6;</i><p class="tab-label">Brightness</p></button-->
</div>
<div id="briwrap">
<p class="label hd">Global brightness</p>
<div class="il">
<i class="icons slider-icon" onclick="tglTheme()">&#xe2a6;</i>
<div class="sliderwrap il">
<input id="sliderBri" onchange="setBri()" oninput="updateTrail(this)" max="255" min="1" type="range" value="128" />
<div class="sliderdisplay"></div>
</div>
<output class="sliderbubble"></output>
</div>
</div>
</div>
</div>
<div class ="container">
<div class="tabcontent">
<div id="QuickLoad" class="center">
<p class="label h">Quick Load</p>
<div id="pql"></div>
</div>
<div id="QCS" class="center">
<p class="label h">Solid color</p>
<div id="qcs-w" class="center">
<div class="qcs" onclick="pC('#ff0000');" title="Red" style="background-color:#ff0000;"></div>
<div class="qcs" onclick="pC('#ffa000');" title="Orange" style="background-color:#ffa000;"></div>
<div class="qcs" onclick="pC('#ffc800');" title="Yellow" style="background-color:#ffc800;"></div>
<div class="qcs" onclick="pC('#ffe0a0');" title="Warm White" style="background-color:#ffe0a0;"></div>
<div class="qcs" onclick="pC('#ffffff');" title="White" style="background-color:#ffffff;"></div>
<div class="qcs qcsb" onclick="pC('#000000');" title="Black" style="background-color:#000000;"></div><br>
<div class="qcs" onclick="pC('#ff00ff');" title="Pink" style="background-color:#ff00ff;"></div>
<div class="qcs" onclick="pC('#0000ff');" title="Blue" style="background-color:#0000ff;"></div>
<div class="qcs" onclick="pC('#00ffc8');" title="Cyan" style="background-color:#00ffc8;"></div>
<div class="qcs" onclick="pC('#08ff00');" title="Green" style="background-color:#08ff00;"></div>
<div class="qcs" onclick="pC('rnd');" title="Random" style="background:linear-gradient(to right, red, orange, yellow, green, blue, purple);transform: translateY(-11px);">R</div>
</div>
</div>
<div id="picker" class="center"></div>
<div id="Colors" class="center">
<div id="vwrap">
<!--p class="label h">Value</p-->
<div class="sliderwrap il">
<input id="sliderV" class="noslide" oninput="fromV()" onchange="setColor(0)" max="100" min="0" type="range" value="100" step="any" />
<div class="sliderdisplay"></div>
</div><br>
</div>
<div id="kwrap">
<!--p class="label h">Temperature</p-->
<div class="sliderwrap il">
<input id="sliderK" class="noslide" oninput="fromK()" onchange="setColor(0)" max="10091" min="1900" type="range" value="6550" />
<div class="sliderdisplay"></div>
</div>
</div>
<div id="rgbwrap" class="center">
<p class="label h">RGB channels</p>
<div id="rwrap" class="il">
<div class="sliderwrap il">
<input id="sliderR" class="noslide" onchange="fromRgb()" max="255" min="0" type="range" value="128" />
<div class="sliderdisplay"></div>
</div>
</div><br>
<div id="gwrap" class="il">
<div class="sliderwrap il">
<input id="sliderG" class="noslide" onchange="fromRgb()" max="255" min="0" type="range" value="128" />
<div class="sliderdisplay"></div>
</div>
</div><br>
<div id="bwrap" class="il">
<div class="sliderwrap il">
<input id="sliderB" class="noslide" onchange="fromRgb()" max="255" min="0" type="range" value="128" />
<div class="sliderdisplay"></div>
</div>
</div><br>
</div>
<div id="wwrap" class="center">
<p class="label h">White channel</p>
<div class="sliderwrap il">
<input id="sliderW" class="noslide" onchange="setColor(0)" max="255" min="0" type="range" value="128" />
<div class="sliderdisplay"></div>
</div>
</div>
<div id="wbal">
<p class="label h">White balance</p>
<div class="sliderwrap il">
<input id="sliderA" class="noslide" onchange="setBalance(this.value)" max="255" min="0" type="range" value="128" />
<div class="sliderdisplay"></div>
</div>
</div>
</div>
<div id="Slots" class="center">
<p class="label h">Color slots</p>
<div id="csl" class="center" style="display: none;">
<button class="xxs btn" onclick="selectSlot(0);">1</button>
<button class="xxs btn" onclick="selectSlot(1);">2</button>
<button class="xxs btn" onclick="selectSlot(2);">3</button>
</div>
</div>
<div id="Segments" class="center">
<div id="segcont"></div>
</div>
<div id="Presets" class="center">
<p class="label h">Presets</p>
<div class="fnd">
<input type="text" class="fnd" placeholder="Search" oninput="search(this,'pcont')" onfocus="search(this)" />
<i class="icons clear-icon" onclick="clean(this);">&#xe38f;</i>
<i class="icons search-icon">&#xe0a1;</i>
</div>
<div id="pcont" class="list"></div>
</div>
<div id="Effects" class="center">
<p class="label h">Effect</p>
<div title="Effect speed">
<i class="icons slider-icon">&#xe325;</i>
<div class="sliderwrap il">
<input id="sliderSpeed" onchange="setSpeed()" oninput="updateTrail(this)" max="255" min="0" type="range" value="128" />
<div class="sliderdisplay"></div>
</div>
<output class="sliderbubble"></output>
</div>
<div title="Effect intensity">
<i class="icons slider-icon" onclick="tglLabels()">&#xe409;</i>
<div class="sliderwrap il">
<input id="sliderIntensity" onchange="setIntensity()" oninput="updateTrail(this)" max="255" min="0" type="range" value="128" />
<div class="sliderdisplay"></div>
</div>
<output class="sliderbubble"></output>
</div>
<div style="padding-bottom:20px;">
<div onclick="tglFxDropdown()" class="c btn" id="fxBtn"><i class="icons">&#xe0e8;</i> Solid</div>
<div onclick="tglPalDropdown()" class="c btn" id="palBtn"><i class="icons">&#xe2b3;</i>Default</div>
<div id="fxDropdown" class="dd-content">
<div class="fnd">
<input type="text" class="fnd" placeholder="Search" oninput="search(this,'fxlist')" onfocus="search(this)" />
<i class="icons clear-icon" onclick="clean(this);">&#xe38f;</i>
<i class="icons search-icon">&#xe0a1;</i>
</div>
<div id="fxlist" class="list">
<div class="lstI" data-id="0" onClick="setEffect(0)"><a href="#0" onClick="setEffect(0)">Solid</a></div>
</div>
</div>
<div id="palDropdown" class="dd-content">
<div class="fnd">
<input type="text" class="fnd" placeholder="Search" oninput="search(this,'pallist')" onfocus="search(this)" />
<i class="icons clear-icon" onclick="clean(this);">&#xe38f;</i>
<i class="icons search-icon">&#xe0a1;</i>
</div>
<div id="pallist" class="list">
<div class="lstI" data-id="0" onClick="setPalette(0)"><a href="#0" onClick="setPalette(0)">Default</a><div class="lstIprev"></div></div>
</div>
</div>
<br>
</div>
</div>
</div>
</div>
<div id="connind"></div>
<div id="toast"></div>
<div id="namelabel" onclick="toggleNodes()"></div>
<div id="info" class="modal">
<div id="imgw">
<img class="wi" alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAFCAYAAAC5Fuf5AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABbSURBVChTlY9bDoAwDMNW7n9nwCipytQN4Z8tbrTHmDmF4oPzyldwRqp1SSdnV/NuZuzqerAByxXznBw3igkeFEfXyUuhK/yFM0CxJfyqXZEOc6/Sr9/bf7uIC5Nwd7orMvAPAAAAAElFTkSuQmCC" />
</div><br>
<div id="kv">Loading...</div><br>
<div>
<button class="btn" onclick="requestJson()">Refresh</button>
<button class="btn" onclick="toggleInfo()">Close Info</button>
<button class="btn" onclick="toggleNodes()">Instance List</button>
<button class="btn" id="resetbtn" onclick="cnfReset()">Reboot WLED</button>
</div>
<span class="h">Made with <span id="heart">&#10084;&#xFE0E;</span> by Aircoookie and the <a href="https://wled.discourse.group/" target="_blank">WLED community</a></span>
</div>
<div id="nodes" class="modal">
<div id="ndlt">WLED instances</div>
<div id="kn">Loading...</div><br>
<div>
<button class="btn" onclick="loadNodes()">Refresh</button>
<button class="btn" onclick="toggleNodes()">Close list</button>
</div>
</div>
<i id="roverstar" class="icons huge" onclick="setLor(0)">&#xe410;</i><br>
<script src="simple.js"></script>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -399,10 +399,10 @@ bool isIp(String str);
void createEditHandler(bool enable);
bool captivePortal(AsyncWebServerRequest *request);
void initServer();
void serveIndexOrWelcome(AsyncWebServerRequest *request);
void serveIndex(AsyncWebServerRequest* request);
String msgProcessor(const String& var);
void serveMessage(AsyncWebServerRequest* request, uint16_t code, const String& headl, const String& subl="", byte optionT=255);
void serveJsonError(AsyncWebServerRequest* request, uint16_t code, uint16_t error);
String dmxProcessor(const String& var);
void serveSettings(AsyncWebServerRequest* request, bool post = false);
void serveSettingsJS(AsyncWebServerRequest* request);

View File

@ -391,755 +391,3 @@ const uint8_t favicon[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
};
// Autogenerated from wled00/data/iro.js, do not edit!!
const uint16_t iroJs_length = 9986;
const uint8_t iroJs[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xc5, 0x7d, 0x69, 0x77, 0xe3, 0x36,
0x96, 0xf6, 0xf7, 0xf9, 0x15, 0x32, 0x93, 0xf8, 0x90, 0x16, 0x44, 0x4b, 0xf2, 0x52, 0x65, 0xaa,
0xf8, 0xea, 0x24, 0x95, 0xad, 0xba, 0x53, 0xa9, 0x4c, 0xaa, 0x3a, 0x99, 0x8e, 0xa2, 0xe4, 0x50,
0x14, 0x24, 0xb1, 0x4c, 0x93, 0x0a, 0x17, 0xd9, 0x8e, 0xa5, 0xff, 0x3e, 0xcf, 0xc5, 0x42, 0x82,
0x5a, 0x6c, 0xa7, 0x67, 0x7a, 0xde, 0x93, 0x94, 0x08, 0x62, 0xb9, 0x00, 0x2e, 0xee, 0x0e, 0x80,
0x3e, 0x3d, 0x39, 0xfa, 0x8f, 0xd6, 0x49, 0x2b, 0xca, 0x52, 0xf7, 0x63, 0xde, 0x5a, 0x5d, 0xb8,
0x17, 0x6e, 0x9f, 0x32, 0xfa, 0xdd, 0xde, 0x65, 0xa7, 0xdf, 0xed, 0xf7, 0x5a, 0x7f, 0x0b, 0x6e,
0x78, 0xde, 0xfa, 0x32, 0x48, 0x22, 0x1e, 0x53, 0xc9, 0x77, 0x51, 0xc8, 0x93, 0x9c, 0x4f, 0x5b,
0x65, 0x32, 0xe5, 0x59, 0xeb, 0xed, 0x0f, 0xdf, 0xb5, 0xfa, 0x6e, 0x97, 0x4a, 0xe6, 0x51, 0xb1,
0x28, 0x27, 0x6e, 0x98, 0xde, 0x9c, 0x7e, 0x0c, 0xa8, 0xd5, 0xa9, 0x04, 0x8b, 0xb2, 0xd3, 0xff,
0x38, 0x9a, 0x95, 0x49, 0x58, 0x44, 0x69, 0x62, 0x17, 0x2c, 0x71, 0x1e, 0xac, 0x74, 0xf2, 0x91,
0x87, 0x85, 0xe5, 0xfb, 0xc5, 0xfd, 0x92, 0xa7, 0xb3, 0x16, 0xbf, 0x5b, 0xa6, 0x59, 0x91, 0x1f,
0x1f, 0x5b, 0x04, 0x77, 0x16, 0x25, 0x7c, 0x6a, 0x1d, 0xe9, 0xc2, 0x9b, 0x74, 0x5a, 0xc6, 0x7c,
0x28, 0x1f, 0xae, 0xaa, 0xea, 0x27, 0xb6, 0xe3, 0x59, 0x1a, 0x6c, 0x0d, 0x49, 0xb6, 0x3e, 0x3e,
0x96, 0x4f, 0x37, 0xb8, 0x99, 0x0e, 0x65, 0xd2, 0x4e, 0x1c, 0xcf, 0x2e, 0xfc, 0x62, 0xbd, 0xce,
0x79, 0x3c, 0x73, 0x5c, 0x8c, 0x8e, 0x60, 0x6c, 0xec, 0x62, 0x11, 0xe5, 0xac, 0x1a, 0x1f, 0x06,
0x57, 0xe6, 0xbc, 0x95, 0x17, 0x59, 0x84, 0x01, 0x0e, 0x56, 0x41, 0xd6, 0xba, 0x61, 0x39, 0x4b,
0x58, 0xc4, 0x52, 0x76, 0xe7, 0x3f, 0x6c, 0xd8, 0x47, 0x7f, 0x34, 0x66, 0x99, 0x7f, 0x1a, 0x84,
0x51, 0xb1, 0xe6, 0x77, 0xf6, 0xd0, 0xcb, 0xd7, 0xf3, 0x75, 0xb2, 0x5e, 0xae, 0x3f, 0x75, 0xd6,
0xd9, 0x72, 0xb1, 0x9e, 0x67, 0xd1, 0x74, 0x9d, 0xde, 0xe6, 0xeb, 0x9b, 0x24, 0x5c, 0x27, 0xc5,
0xed, 0x1a, 0xbd, 0x8f, 0xc2, 0xc5, 0x78, 0xfd, 0x67, 0x9a, 0xae, 0x7f, 0x4b, 0xb3, 0xe9, 0xfa,
0xb7, 0x4e, 0xe7, 0x34, 0x1a, 0xe8, 0x3e, 0x5b, 0x6f, 0x25, 0x56, 0x66, 0x69, 0x66, 0x53, 0x7f,
0x51, 0x2b, 0x4a, 0x5a, 0x89, 0x53, 0x8c, 0xa2, 0xb1, 0x9f, 0xe0, 0x67, 0x90, 0xf1, 0xa2, 0xcc,
0x92, 0x56, 0xb1, 0xa9, 0x5a, 0xdc, 0xdb, 0x85, 0xf3, 0x40, 0x75, 0x13, 0xbf, 0x70, 0x97, 0x41,
0xc6, 0x93, 0xe2, 0xfb, 0x74, 0xca, 0x07, 0xc9, 0xf1, 0x71, 0xe2, 0x66, 0xfc, 0x26, 0x5d, 0xf1,
0xd7, 0x8b, 0x28, 0x9e, 0xa2, 0x5a, 0xdd, 0x68, 0x41, 0xdd, 0xb0, 0x48, 0x36, 0xcc, 0x18, 0x67,
0x25, 0xa6, 0x14, 0xfb, 0x41, 0x36, 0x2f, 0x6f, 0x00, 0x20, 0x1f, 0x44, 0x33, 0x3b, 0xf1, 0xdf,
0xda, 0x98, 0x63, 0xe2, 0xb0, 0xb3, 0x57, 0x55, 0x81, 0x1b, 0xf3, 0x64, 0x5e, 0x2c, 0x1c, 0x1a,
0x60, 0xe4, 0x63, 0x44, 0x98, 0xfe, 0xd9, 0x20, 0xdb, 0xa9, 0x30, 0xc8, 0xda, 0x6d, 0x27, 0x72,
0x97, 0x65, 0xbe, 0xb0, 0xe3, 0x51, 0x36, 0x76, 0x04, 0xc4, 0x32, 0x8e, 0x8f, 0xfc, 0xe8, 0xf8,
0xd8, 0x4e, 0xdc, 0x90, 0xc6, 0x84, 0xc1, 0xfa, 0x91, 0xc3, 0x64, 0x7e, 0x81, 0x01, 0xcb, 0x84,
0x8b, 0x65, 0x0a, 0xca, 0xb8, 0xf8, 0x21, 0x4b, 0x97, 0xb9, 0xe8, 0x8a, 0x13, 0x1e, 0xb6, 0xf2,
0x57, 0x69, 0x34, 0x6d, 0x75, 0x7d, 0x1f, 0x88, 0xe1, 0x63, 0x82, 0x89, 0xc7, 0x56, 0x5b, 0xe4,
0x38, 0x1a, 0x65, 0x58, 0x62, 0xf7, 0x9a, 0xdf, 0xab, 0xce, 0xec, 0xd2, 0x27, 0xec, 0xcc, 0x1c,
0x22, 0x8f, 0x98, 0x17, 0xbc, 0x25, 0x5e, 0x55, 0x69, 0x6a, 0xe4, 0x52, 0x9b, 0x50, 0xa0, 0x2b,
0x65, 0xa5, 0x81, 0x42, 0x99, 0x17, 0xb1, 0x4c, 0x22, 0x91, 0xfb, 0x0f, 0x44, 0x76, 0x5e, 0xc1,
0x96, 0xd4, 0xb3, 0x97, 0x30, 0x34, 0xf4, 0x50, 0xcc, 0x67, 0x5e, 0xc6, 0x12, 0x8f, 0x00, 0xb3,
0x48, 0x3e, 0xb8, 0xd7, 0x65, 0xa9, 0x4c, 0xc6, 0xf2, 0x11, 0xaa, 0x47, 0x9a, 0x80, 0xda, 0xca,
0xb0, 0x48, 0x33, 0x4f, 0x4e, 0x6f, 0xa3, 0x87, 0x7f, 0xe3, 0xae, 0x12, 0x2c, 0xeb, 0xf1, 0xb1,
0x4a, 0xd8, 0xdc, 0x61, 0xbc, 0x1e, 0xcd, 0x3b, 0xa2, 0x02, 0x4d, 0x1c, 0x15, 0x72, 0xeb, 0xf2,
0x37, 0x92, 0xae, 0x88, 0xc0, 0x5d, 0x31, 0x40, 0xbf, 0x60, 0xe2, 0x05, 0x5d, 0x16, 0xfc, 0xae,
0xf0, 0x8d, 0xba, 0xb7, 0xb2, 0xae, 0x5a, 0x30, 0xe0, 0xd7, 0xa9, 0x00, 0x47, 0x43, 0x14, 0xba,
0x11, 0xc3, 0x3f, 0x37, 0x71, 0x23, 0x30, 0xe8, 0xdd, 0xbb, 0x19, 0xba, 0x6e, 0xf7, 0x1c, 0x31,
0x83, 0x41, 0x45, 0xb8, 0x83, 0xe4, 0x55, 0x81, 0x2a, 0x8a, 0x1a, 0x12, 0xa2, 0x06, 0x4d, 0x00,
0x20, 0x1c, 0x14, 0x8d, 0x92, 0xb1, 0xa3, 0x57, 0x3c, 0x72, 0x53, 0xdd, 0x07, 0x92, 0x6a, 0xca,
0x7b, 0x38, 0xba, 0x70, 0x29, 0x41, 0x63, 0x90, 0xdd, 0xd5, 0x63, 0x0e, 0x2a, 0x2e, 0x60, 0x51,
0x4d, 0x6a, 0xc4, 0xe4, 0x6e, 0xe4, 0xd4, 0x84, 0x15, 0x4a, 0xd6, 0x2a, 0xdc, 0x94, 0x5e, 0xdc,
0x49, 0x90, 0x73, 0x5f, 0x60, 0x3e, 0xf1, 0xbb, 0x7f, 0x79, 0xc4, 0x0f, 0x0d, 0x30, 0x34, 0xf0,
0x49, 0xc6, 0x83, 0xeb, 0x8d, 0x9a, 0x09, 0x0d, 0x69, 0x53, 0x8f, 0x90, 0xd3, 0x08, 0xed, 0xa3,
0xc2, 0x9d, 0x81, 0x56, 0xf1, 0xeb, 0x1f, 0x75, 0x01, 0xad, 0x07, 0xfa, 0xcd, 0x25, 0x9b, 0x14,
0xce, 0x7a, 0x1d, 0x1d, 0xf9, 0xfe, 0x0d, 0x48, 0x78, 0x92, 0xa2, 0x19, 0xff, 0x91, 0x93, 0x64,
0x8d, 0x92, 0x39, 0x2a, 0x62, 0x08, 0x7b, 0x0a, 0x98, 0xbd, 0x27, 0x73, 0xbd, 0x4e, 0x1c, 0xbb,
0x74, 0x0c, 0x5a, 0x2d, 0x6d, 0x89, 0x1c, 0x45, 0xb1, 0x9a, 0xdf, 0xc5, 0x6a, 0xe5, 0x6e, 0x0e,
0x21, 0x6a, 0x37, 0xa5, 0xb2, 0x9a, 0x42, 0xe2, 0x4e, 0x5d, 0xde, 0x29, 0xe8, 0x77, 0xe3, 0x0c,
0x0a, 0x1a, 0x69, 0xba, 0xb4, 0x9d, 0x81, 0x23, 0x67, 0x91, 0xf9, 0x91, 0x2f, 0xc9, 0x94, 0x95,
0xbe, 0xcd, 0x7d, 0x88, 0x8c, 0xc2, 0x71, 0xa7, 0x8e, 0x9b, 0x32, 0xe2, 0xb6, 0x25, 0x24, 0x4a,
0xe2, 0x96, 0x0c, 0xff, 0xfc, 0xa3, 0x1e, 0x4b, 0xc5, 0x24, 0x84, 0xc0, 0xbc, 0xb6, 0x53, 0x8c,
0x41, 0x88, 0x17, 0x90, 0x71, 0xe2, 0xde, 0x32, 0x09, 0x06, 0xb3, 0x4f, 0xdd, 0xf4, 0x36, 0xe1,
0xd9, 0xfb, 0x9f, 0xbe, 0xf9, 0x2a, 0xe6, 0x24, 0x51, 0x98, 0xe4, 0x1c, 0x16, 0x33, 0x49, 0x8d,
0x25, 0x96, 0x9f, 0x3b, 0x5e, 0xe9, 0xb0, 0xa9, 0x1d, 0x51, 0xf3, 0xec, 0xc8, 0x2f, 0x8f, 0x8f,
0x03, 0x64, 0x9a, 0x53, 0x7e, 0x6f, 0xd3, 0x54, 0x8b, 0x7a, 0xb2, 0x2c, 0x97, 0x38, 0x08, 0x59,
0xc0, 0x66, 0x6c, 0xc1, 0x56, 0x6c, 0xca, 0xe6, 0x6c, 0x42, 0x62, 0x07, 0x6b, 0xbb, 0x5e, 0x7f,
0x64, 0x4b, 0x7f, 0xa2, 0x57, 0x1f, 0x2b, 0x8f, 0xae, 0xee, 0x30, 0xe2, 0xd8, 0x97, 0x0b, 0x5e,
0x0e, 0xcb, 0x51, 0x77, 0xec, 0x2d, 0x89, 0xf8, 0x58, 0x57, 0x92, 0x9f, 0xc3, 0x42, 0xbf, 0xcb,
0xc0, 0x09, 0xfe, 0xe7, 0x36, 0x7e, 0x6b, 0xcd, 0x51, 0x54, 0xdc, 0x03, 0xa2, 0x13, 0x69, 0x90,
0xa1, 0x4f, 0x6c, 0x43, 0x74, 0xc2, 0xdb, 0x3d, 0x35, 0x17, 0xdf, 0x9e, 0xf9, 0x93, 0x51, 0x38,
0xc6, 0xca, 0xcf, 0x68, 0x18, 0x10, 0x19, 0xbe, 0x3f, 0xa3, 0x07, 0xbd, 0x11, 0xad, 0xfb, 0xf4,
0x4e, 0x09, 0x87, 0xea, 0x29, 0x6c, 0x0f, 0x78, 0x0c, 0xbd, 0x44, 0x8b, 0x17, 0x80, 0x6c, 0x83,
0x57, 0xcb, 0x41, 0x00, 0x6a, 0xa5, 0x6e, 0x04, 0xbc, 0x80, 0xc8, 0xf4, 0x71, 0x60, 0x0f, 0x54,
0x4b, 0x43, 0x93, 0x54, 0x3b, 0x13, 0x13, 0xdd, 0x00, 0xc8, 0x02, 0xeb, 0x93, 0x00, 0x75, 0x33,
0x7f, 0xb6, 0x5e, 0xdf, 0x55, 0x18, 0x94, 0xf2, 0x0a, 0x68, 0x64, 0xe8, 0xb6, 0x50, 0xc2, 0x73,
0x46, 0xcf, 0x23, 0x3f, 0x00, 0xa6, 0xe6, 0x3e, 0x28, 0x6f, 0x34, 0x76, 0x24, 0x35, 0x07, 0x98,
0x6c, 0xb8, 0x5e, 0x2f, 0x58, 0xa1, 0xe5, 0xfb, 0xc2, 0x10, 0x29, 0x53, 0xd4, 0x9f, 0x22, 0x47,
0x8b, 0x7e, 0x37, 0x76, 0x16, 0xf4, 0x8b, 0x46, 0x12, 0xe1, 0x72, 0x8a, 0xa8, 0x5f, 0xfa, 0x34,
0x8a, 0xc5, 0x91, 0x1f, 0x83, 0xac, 0x45, 0xdb, 0x85, 0xa1, 0xe5, 0xc0, 0x83, 0x5e, 0x05, 0x14,
0x35, 0x62, 0xa3, 0xec, 0x88, 0x24, 0x57, 0xe2, 0x06, 0xcb, 0x25, 0x18, 0x43, 0xaa, 0xc0, 0x85,
0x23, 0xe0, 0x4a, 0xf5, 0xea, 0xc7, 0x8c, 0xd0, 0x87, 0xc4, 0xca, 0x4d, 0x20, 0x02, 0xdf, 0x47,
0x93, 0x58, 0xf2, 0x9a, 0xc4, 0xa8, 0xdf, 0x27, 0x01, 0xb0, 0x42, 0x87, 0x8e, 0xc0, 0x50, 0xab,
0x18, 0x90, 0xc8, 0xcb, 0x79, 0x56, 0x7c, 0xc1, 0x01, 0x81, 0xdb, 0x0b, 0x16, 0x3b, 0x1b, 0x2b,
0x5d, 0x2a, 0x21, 0x15, 0x09, 0xdc, 0x0a, 0xed, 0xb6, 0x0a, 0xe2, 0x92, 0xfb, 0x96, 0xe5, 0x6c,
0x62, 0x8c, 0xd7, 0x80, 0xce, 0xf6, 0x48, 0xb5, 0xaa, 0x5d, 0x84, 0xc9, 0x2f, 0x20, 0x33, 0x14,
0xf7, 0x85, 0xed, 0x36, 0x2b, 0x36, 0x0e, 0x08, 0x2c, 0xf5, 0xa7, 0x0a, 0x53, 0xa0, 0xf4, 0x1a,
0xc2, 0x51, 0x13, 0x82, 0xd0, 0x94, 0xa1, 0x5f, 0x6a, 0x22, 0x0e, 0x3b, 0x9d, 0x81, 0xa3, 0x9a,
0x81, 0x78, 0x8e, 0x8f, 0xef, 0x6d, 0x7a, 0x3a, 0x03, 0x59, 0x6f, 0x69, 0x56, 0x98, 0x88, 0x0a,
0xdf, 0xdb, 0xf4, 0x64, 0x82, 0x24, 0x89, 0x07, 0xe6, 0x0a, 0x64, 0x77, 0x10, 0xbe, 0x9a, 0x57,
0x60, 0x41, 0x6b, 0x5f, 0xd9, 0x73, 0xaa, 0x38, 0x1f, 0xb5, 0xdb, 0xd5, 0xc3, 0x60, 0xbe, 0xcf,
0xb5, 0x79, 0x51, 0xad, 0x4d, 0xa4, 0x98, 0xdf, 0x51, 0x94, 0x0f, 0xdb, 0xcb, 0x9a, 0xa4, 0x69,
0xcc, 0x03, 0x53, 0xbc, 0x3b, 0x30, 0x5a, 0x94, 0xd1, 0x90, 0x88, 0x86, 0x8e, 0x53, 0x11, 0xc2,
0xe7, 0x59, 0x16, 0xdc, 0xbb, 0x51, 0x2e, 0x9e, 0xe0, 0x30, 0x47, 0xab, 0x9a, 0x0c, 0xc3, 0xcb,
0x20, 0xba, 0x0d, 0xc3, 0x03, 0xfd, 0xc3, 0xe6, 0x10, 0x43, 0x50, 0xed, 0x15, 0xd0, 0x61, 0x62,
0xef, 0x61, 0xd2, 0x83, 0xc3, 0xd1, 0x62, 0x90, 0x08, 0x12, 0x75, 0x2d, 0x32, 0x05, 0x93, 0xb9,
0x51, 0x03, 0xcd, 0x92, 0xf2, 0x66, 0xc2, 0xb3, 0x3d, 0xad, 0x42, 0x01, 0x9b, 0x29, 0x01, 0x26,
0x66, 0x33, 0xa8, 0x3b, 0x74, 0x53, 0xa9, 0x4a, 0x7c, 0xa1, 0x95, 0xb4, 0x82, 0x1d, 0x48, 0x43,
0x0e, 0xb6, 0x85, 0x58, 0x51, 0xb0, 0x83, 0x50, 0xd6, 0xac, 0xa8, 0x4c, 0x97, 0xca, 0x9e, 0x49,
0x84, 0xf2, 0x01, 0x5b, 0x6e, 0x08, 0x19, 0x5e, 0x51, 0x15, 0x44, 0xf5, 0x3a, 0xcc, 0xf4, 0x3a,
0x58, 0x1d, 0x4b, 0x18, 0x4a, 0xdd, 0xf1, 0xb0, 0x70, 0x73, 0x2e, 0xac, 0x23, 0xd0, 0xf1, 0x3d,
0x09, 0x49, 0xb4, 0x85, 0x66, 0xf3, 0x77, 0x26, 0x82, 0x25, 0x3b, 0x22, 0xf5, 0x94, 0xb9, 0x05,
0xcf, 0x0b, 0xd8, 0xcc, 0xc3, 0xa8, 0x6d, 0x2d, 0xef, 0x2c, 0x4f, 0xad, 0xe8, 0xd0, 0xb2, 0x3c,
0xa3, 0xaf, 0x1f, 0xed, 0x4a, 0xbb, 0x48, 0x41, 0xab, 0xa4, 0x2e, 0x0b, 0x05, 0xea, 0x30, 0x7e,
0x1a, 0x02, 0x54, 0x04, 0x1f, 0x5a, 0x61, 0x1c, 0xe4, 0xf9, 0xf7, 0xf0, 0x0c, 0xc4, 0xa8, 0xd4,
0x3b, 0x00, 0x7b, 0x2a, 0x65, 0xe4, 0x8a, 0x5a, 0x5e, 0x02, 0x09, 0x69, 0x69, 0xab, 0x46, 0x14,
0xd7, 0x84, 0x81, 0x55, 0xb9, 0x8f, 0x25, 0x24, 0x47, 0x08, 0x0c, 0xcc, 0x90, 0x72, 0xd8, 0xce,
0x72, 0x45, 0x4e, 0xe9, 0x86, 0x79, 0xfe, 0x81, 0xec, 0x9d, 0x48, 0x4a, 0x82, 0x7d, 0xab, 0x9a,
0x81, 0x56, 0xeb, 0x8a, 0x96, 0x05, 0x85, 0x25, 0xa5, 0x7d, 0x26, 0x68, 0x2e, 0x25, 0x5b, 0x34,
0x73, 0x80, 0x1e, 0x91, 0x8a, 0x20, 0xbb, 0x6d, 0x9a, 0x2b, 0xb8, 0x9d, 0x66, 0x1a, 0x89, 0x4a,
0xb1, 0x28, 0x72, 0x00, 0x2a, 0x1a, 0xc5, 0x63, 0xc2, 0x22, 0x1e, 0xb2, 0x26, 0x94, 0x19, 0xd2,
0xce, 0x86, 0xfa, 0xb7, 0x52, 0xbd, 0x2e, 0xe0, 0x6b, 0x39, 0xb1, 0x51, 0x6f, 0x3c, 0xb4, 0xe1,
0xd3, 0x1c, 0x09, 0x64, 0x91, 0x55, 0xba, 0x8c, 0x83, 0x90, 0xdb, 0xa7, 0xaf, 0x83, 0x25, 0xd6,
0x97, 0x7f, 0x7a, 0x4a, 0x3d, 0x81, 0x8f, 0x7c, 0x1b, 0x9c, 0x99, 0xb8, 0x45, 0xfa, 0x5d, 0x7a,
0xcb, 0xb3, 0xd7, 0xb0, 0x41, 0x6c, 0xc7, 0x21, 0x33, 0x79, 0x08, 0x6b, 0xd2, 0x71, 0xf3, 0x18,
0xfe, 0x99, 0xdd, 0x87, 0xf8, 0x18, 0xda, 0xd9, 0x7a, 0x5d, 0xb8, 0xc1, 0x74, 0xfa, 0xd5, 0x0a,
0xb2, 0xf1, 0xbb, 0x28, 0x2f, 0x38, 0x54, 0x2c, 0xd6, 0x7e, 0x25, 0xa4, 0x39, 0x68, 0x6d, 0xbd,
0xa6, 0x5f, 0xb8, 0x34, 0x8e, 0x43, 0xb4, 0x40, 0x34, 0xa1, 0x7c, 0x87, 0x7d, 0x4d, 0xe0, 0x6d,
0xc5, 0xc8, 0xb1, 0x48, 0xc2, 0x62, 0xdc, 0x45, 0x30, 0x17, 0xab, 0xa4, 0x5e, 0x31, 0xfd, 0x1b,
0x95, 0x3e, 0x82, 0x54, 0x4b, 0x84, 0xe9, 0x3e, 0x14, 0x34, 0x66, 0x52, 0x8e, 0xb7, 0x4f, 0x8e,
0xa1, 0xf9, 0x34, 0x48, 0xe6, 0x3c, 0x4b, 0xcb, 0x3c, 0xbe, 0x7f, 0xcf, 0x8b, 0x37, 0x09, 0xba,
0xfd, 0xf6, 0xc3, 0xdb, 0xef, 0x14, 0x44, 0x7b, 0x17, 0x2f, 0xbf, 0xdd, 0x41, 0xb0, 0x5e, 0x7b,
0x43, 0x89, 0x97, 0xa1, 0xea, 0x63, 0xbd, 0x16, 0xc4, 0x1b, 0x0d, 0xf5, 0x44, 0x3e, 0x2f, 0xb0,
0xcc, 0x93, 0xb2, 0xe0, 0xdf, 0xbf, 0xb7, 0xad, 0x45, 0x51, 0x2c, 0xbd, 0xd3, 0xd3, 0xdb, 0xdb,
0x5b, 0xf7, 0xf6, 0xcc, 0x4d, 0xb3, 0xf9, 0x69, 0xef, 0xea, 0xea, 0xea, 0x54, 0x40, 0xb2, 0xd8,
0x36, 0x52, 0x3d, 0xc1, 0x33, 0xff, 0x3a, 0x00, 0xe2, 0xb1, 0x27, 0x87, 0x45, 0x4e, 0x69, 0xb3,
0x1f, 0xc1, 0x9c, 0x86, 0x54, 0x5d, 0x99, 0x36, 0x3e, 0xd9, 0xee, 0xc5, 0x48, 0x8a, 0x89, 0x31,
0xac, 0x40, 0x4e, 0xeb, 0x34, 0x54, 0x4f, 0xb2, 0x8f, 0x4d, 0x77, 0xef, 0xda, 0xde, 0xb2, 0xfc,
0x88, 0x2d, 0x25, 0x97, 0x36, 0x8c, 0x21, 0xb6, 0x64, 0xf7, 0xec, 0x96, 0x5d, 0x13, 0x59, 0x01,
0x2e, 0x91, 0x73, 0x65, 0x98, 0x25, 0xae, 0xe1, 0x9d, 0x34, 0x24, 0x23, 0xcc, 0x01, 0xf4, 0x4b,
0x7a, 0x13, 0x73, 0x18, 0x14, 0xd9, 0xbd, 0x54, 0xca, 0x7b, 0x34, 0xdd, 0xb5, 0x10, 0xb9, 0x4b,
0xb2, 0x0d, 0x85, 0x58, 0xbb, 0xf7, 0xd1, 0xf6, 0x5a, 0xfb, 0x20, 0x1f, 0x48, 0x87, 0x1d, 0x1f,
0x67, 0xa3, 0xc0, 0x85, 0x52, 0xb9, 0xf5, 0x83, 0xe1, 0xfd, 0xf0, 0x5e, 0xd6, 0x94, 0x0a, 0xd5,
0x0b, 0xdc, 0x08, 0xce, 0x54, 0xe4, 0x86, 0xc3, 0x09, 0x99, 0x4e, 0x18, 0x12, 0x94, 0x6e, 0x08,
0x07, 0x9e, 0xec, 0x1c, 0xcf, 0xb6, 0x50, 0xb7, 0x48, 0xa9, 0x2f, 0x0b, 0x34, 0x77, 0x7d, 0x7c,
0x7c, 0xed, 0x56, 0x39, 0x40, 0x37, 0x99, 0xc7, 0x43, 0x6a, 0x83, 0x96, 0xfc, 0x16, 0x48, 0x59,
0xb2, 0x5b, 0xc7, 0xb3, 0xeb, 0x9c, 0x37, 0x22, 0x87, 0xcd, 0xcc, 0x99, 0xfa, 0xd7, 0x6c, 0xa6,
0xda, 0xfa, 0x7f, 0x3a, 0x0c, 0xb6, 0xd4, 0xbd, 0x9b, 0x97, 0x13, 0x7b, 0x46, 0xf5, 0xa4, 0x27,
0xb5, 0x44, 0x2a, 0x2f, 0x82, 0x82, 0x83, 0x8b, 0x54, 0x8a, 0x38, 0x49, 0xc2, 0x11, 0xce, 0xd5,
0x2d, 0xd2, 0xb7, 0x7e, 0xc6, 0x16, 0x18, 0x27, 0x19, 0xfe, 0x78, 0xbd, 0x31, 0x94, 0xe1, 0xcc,
0xfd, 0x08, 0xca, 0xc6, 0xaf, 0xaf, 0x9a, 0x6b, 0xbb, 0xe8, 0xda, 0x9d, 0xf3, 0xe2, 0x4b, 0x18,
0xf5, 0x2b, 0x3e, 0x7d, 0x4f, 0x05, 0x5f, 0x67, 0xe9, 0x8d, 0xf0, 0x6c, 0x8f, 0x8f, 0xdf, 0x8a,
0x06, 0xba, 0xc5, 0x90, 0x5e, 0x84, 0x41, 0x8d, 0x84, 0xe3, 0xe1, 0x87, 0x1d, 0x6e, 0x6c, 0x2f,
0x45, 0x2d, 0x87, 0x2d, 0x1c, 0x39, 0x80, 0xc7, 0xfa, 0x91, 0x23, 0xa1, 0xb9, 0xdc, 0x2c, 0xd3,
0x04, 0xc4, 0xf5, 0x73, 0x14, 0xc7, 0x6f, 0xe1, 0x71, 0x14, 0x64, 0xfd, 0xed, 0xe6, 0xda, 0x7a,
0xf0, 0x46, 0xe1, 0x97, 0xd1, 0x54, 0xb5, 0x48, 0xa5, 0x22, 0x9e, 0x39, 0x95, 0xf8, 0x7d, 0xde,
0x08, 0x60, 0xdd, 0x1d, 0x18, 0xca, 0x8f, 0x3c, 0xe4, 0x68, 0xa5, 0xea, 0x3e, 0x52, 0x28, 0x17,
0xf7, 0xc8, 0x80, 0x93, 0x2f, 0xd2, 0x32, 0x9e, 0xbe, 0xd6, 0x0d, 0xfe, 0xb1, 0x9c, 0xa2, 0x63,
0xa5, 0xf5, 0x0e, 0x94, 0x4a, 0xd4, 0x01, 0x90, 0x74, 0x24, 0x77, 0x48, 0x80, 0xd6, 0x92, 0x89,
0x45, 0xee, 0x31, 0x94, 0x4e, 0xa1, 0x93, 0xa0, 0xa7, 0x65, 0x87, 0xf9, 0x30, 0x3f, 0x22, 0x2b,
0x31, 0x1d, 0xe6, 0x1e, 0x7e, 0xa5, 0xcb, 0x9f, 0xc0, 0x7b, 0x20, 0xdf, 0x41, 0x5a, 0xf2, 0x49,
0xed, 0x80, 0x92, 0x49, 0x8f, 0x57, 0xd8, 0xe9, 0xc2, 0xa2, 0xa4, 0x04, 0xe8, 0x1c, 0x0c, 0xa6,
0x8c, 0xd1, 0xcd, 0x5e, 0x6c, 0xe8, 0x39, 0xec, 0xcd, 0xae, 0x06, 0xbf, 0x91, 0x06, 0xb0, 0x1a,
0x3d, 0x9b, 0x6a, 0x2a, 0xda, 0x22, 0xd9, 0x7d, 0x73, 0x13, 0xcc, 0xfe, 0x56, 0x31, 0xbb, 0x9e,
0xa9, 0x98, 0x28, 0x35, 0xf0, 0x0b, 0x4c, 0x44, 0xf3, 0x8b, 0xc6, 0x0e, 0xdb, 0x81, 0xee, 0x88,
0x69, 0x7f, 0xae, 0x3c, 0x24, 0x38, 0x0f, 0x81, 0xf2, 0x4f, 0xde, 0xe9, 0xd5, 0x0e, 0xc8, 0xe0,
0x19, 0x06, 0x8a, 0xfb, 0xb5, 0xe6, 0xf7, 0x82, 0x9a, 0xb8, 0x40, 0x2f, 0xc2, 0xa8, 0x7f, 0x2d,
0x41, 0x0a, 0x77, 0xf4, 0xad, 0x2d, 0x58, 0x20, 0xa3, 0x81, 0x6d, 0x95, 0x43, 0x8c, 0x83, 0xde,
0xb5, 0x0f, 0x21, 0x8a, 0xdf, 0x27, 0xc1, 0x12, 0x8b, 0xac, 0xac, 0x79, 0x89, 0x22, 0xb0, 0xf0,
0xfc, 0x70, 0xa9, 0x0d, 0x39, 0x09, 0x30, 0xef, 0xb7, 0xc4, 0x29, 0x09, 0x53, 0xf4, 0x28, 0xa3,
0x09, 0x6e, 0x3a, 0x20, 0x14, 0xdc, 0x68, 0x57, 0x59, 0x33, 0x77, 0x85, 0x42, 0x87, 0x41, 0xbe,
0x05, 0x71, 0x4c, 0x4c, 0x50, 0x0d, 0x68, 0x55, 0x8f, 0xcc, 0xe4, 0x1a, 0x3d, 0xa8, 0x7d, 0xb9,
0xb6, 0x10, 0xda, 0x0e, 0x9b, 0x08, 0xf0, 0xd7, 0x68, 0x19, 0x49, 0x3b, 0x45, 0x58, 0x16, 0xc2,
0x3e, 0x34, 0x9d, 0x7a, 0x53, 0xfc, 0x4b, 0xd1, 0x8f, 0x61, 0x4b, 0x5f, 0x18, 0x04, 0x28, 0x17,
0x6a, 0xa5, 0x25, 0x33, 0x49, 0x7e, 0xf8, 0x2f, 0xf9, 0x6a, 0x2e, 0x6c, 0x12, 0xb1, 0x3a, 0xeb,
0x35, 0xd7, 0xc6, 0xbb, 0x66, 0xa1, 0x52, 0xd8, 0x3a, 0x39, 0x48, 0x37, 0x7f, 0x55, 0xb9, 0x1d,
0x79, 0x23, 0x72, 0x02, 0x7f, 0x64, 0x94, 0x93, 0x43, 0xaa, 0x18, 0x5d, 0x01, 0x1b, 0x9e, 0x21,
0x19, 0xba, 0x14, 0xc9, 0x22, 0xb1, 0xef, 0x85, 0x6e, 0x9c, 0x02, 0x29, 0x64, 0x47, 0x54, 0x75,
0xc0, 0x63, 0x85, 0x1f, 0x32, 0x6a, 0x2f, 0x7d, 0x42, 0xe9, 0xa8, 0xd6, 0x36, 0xb4, 0x61, 0xc0,
0xeb, 0x26, 0x4a, 0x2f, 0x4d, 0xd3, 0x50, 0x84, 0x23, 0xdd, 0x10, 0x4d, 0x0a, 0x4e, 0x86, 0x1c,
0xb9, 0x84, 0xf6, 0x8a, 0xa2, 0x18, 0x7c, 0xb8, 0x55, 0xac, 0x22, 0x0d, 0xfb, 0xf5, 0x7a, 0xbf,
0xdb, 0xed, 0x9e, 0x12, 0x22, 0x98, 0xea, 0xc2, 0xdb, 0xdf, 0xda, 0x56, 0xc5, 0xac, 0x94, 0x8e,
0xb4, 0xa1, 0x21, 0xeb, 0x59, 0xc3, 0x8f, 0xf5, 0x57, 0x0a, 0x17, 0xc2, 0x99, 0x83, 0x47, 0x56,
0x1a, 0x71, 0xb4, 0xb1, 0xb2, 0x34, 0x0b, 0x17, 0x2b, 0x1c, 0xf8, 0x2b, 0xd8, 0x0d, 0x47, 0xd2,
0x79, 0x32, 0x5a, 0xf8, 0x1f, 0xa5, 0x71, 0x27, 0xa9, 0x48, 0x45, 0xfb, 0x68, 0x7a, 0xb0, 0xcc,
0xc0, 0x7e, 0x76, 0xb5, 0x9e, 0xf0, 0xde, 0x1d, 0xf7, 0x80, 0x3d, 0x05, 0xef, 0x7e, 0x75, 0xb0,
0x2c, 0x26, 0x4d, 0xb6, 0x5e, 0x07, 0xb4, 0x6c, 0x33, 0x70, 0x27, 0xc9, 0x93, 0x77, 0xc4, 0x94,
0xef, 0x84, 0xa1, 0x18, 0xe9, 0x8a, 0xfe, 0x4c, 0x94, 0xc0, 0x36, 0x27, 0x8b, 0x74, 0x97, 0xda,
0x94, 0x23, 0x20, 0x1c, 0xce, 0x52, 0x5a, 0xc4, 0xe2, 0x91, 0xac, 0xd7, 0xe4, 0x2e, 0x94, 0x2a,
0xb6, 0x33, 0x2a, 0xc7, 0xe0, 0xd9, 0xba, 0x56, 0xe2, 0xf0, 0xbd, 0x6e, 0x6e, 0x82, 0x8a, 0xe8,
0x4b, 0xd8, 0x02, 0x44, 0x97, 0xa5, 0x70, 0x0a, 0x78, 0x78, 0xcd, 0xa7, 0xea, 0x95, 0x40, 0x09,
0x23, 0x9a, 0x2a, 0xaa, 0x2e, 0x08, 0xba, 0xea, 0x02, 0xae, 0x12, 0x4c, 0x9d, 0x05, 0xd8, 0x20,
0x96, 0x22, 0x28, 0xd9, 0x12, 0x30, 0x0c, 0xb3, 0xae, 0xb9, 0x9b, 0x4c, 0x59, 0x1e, 0xcd, 0x93,
0x77, 0x72, 0x8b, 0xe2, 0x48, 0x2f, 0xe3, 0xf1, 0xb1, 0xe4, 0xa3, 0x3b, 0x02, 0x43, 0xb8, 0x52,
0x43, 0xc2, 0xd0, 0xb1, 0xb8, 0x95, 0xc5, 0xb4, 0x92, 0x56, 0x0b, 0x72, 0x64, 0xe2, 0x88, 0x7c,
0x3d, 0x95, 0x65, 0xab, 0x94, 0x32, 0x89, 0x55, 0x0d, 0x32, 0x8c, 0x55, 0xd2, 0x61, 0xd5, 0xd4,
0x76, 0xc0, 0xaa, 0x02, 0x02, 0xac, 0x92, 0x02, 0x74, 0x95, 0x6d, 0x57, 0xe9, 0xba, 0x32, 0x89,
0xbf, 0x62, 0x63, 0x47, 0xe4, 0x31, 0x1a, 0xa2, 0x20, 0x74, 0xa4, 0xf9, 0x36, 0x8d, 0x66, 0x33,
0x54, 0x92, 0x62, 0x7d, 0x13, 0x06, 0x45, 0x48, 0x01, 0xc9, 0x87, 0x1b, 0x37, 0x55, 0x2e, 0xe4,
0xa6, 0x76, 0x3b, 0x6b, 0xbb, 0x72, 0xba, 0xb5, 0x5b, 0x31, 0xa0, 0x38, 0xa9, 0x0e, 0x11, 0xc2,
0x0e, 0x8c, 0x76, 0x4d, 0x00, 0x7b, 0x07, 0x7a, 0xe4, 0x4e, 0x9d, 0xcd, 0x8d, 0x1b, 0x52, 0x68,
0x3b, 0xa4, 0xde, 0x2b, 0xf0, 0x5f, 0x69, 0xf7, 0x95, 0x60, 0xed, 0x0b, 0x07, 0x0f, 0x0b, 0x69,
0x35, 0x87, 0x65, 0x46, 0x51, 0x1f, 0x3f, 0xd9, 0x81, 0x6d, 0x46, 0x60, 0xbf, 0xdf, 0xd9, 0xf4,
0x20, 0x31, 0x77, 0xe3, 0x96, 0xc9, 0x8d, 0x34, 0x4e, 0xaa, 0x24, 0x00, 0x30, 0xa8, 0x13, 0x1d,
0xe4, 0xfa, 0xca, 0xce, 0x94, 0x13, 0x0f, 0x53, 0x1e, 0x34, 0x77, 0x28, 0x30, 0x0d, 0x4a, 0x88,
0x94, 0xae, 0x87, 0xf4, 0x84, 0x73, 0x4e, 0x38, 0x17, 0x6e, 0x7a, 0xec, 0x57, 0x41, 0x00, 0x94,
0x65, 0xc2, 0xe7, 0x17, 0xd2, 0x2b, 0xdb, 0xd2, 0xd3, 0xb2, 0x7f, 0x81, 0xbc, 0xfd, 0x45, 0xbb,
0xf8, 0x03, 0xc6, 0x32, 0xa9, 0x7b, 0x32, 0x28, 0x60, 0x1d, 0xc4, 0xa3, 0x3e, 0x12, 0x21, 0x9e,
0x4b, 0x88, 0xe7, 0xf2, 0x55, 0xa6, 0xc5, 0x73, 0x09, 0xf1, 0x9c, 0x81, 0x1d, 0x28, 0xda, 0x43,
0x4f, 0x19, 0x25, 0x91, 0x23, 0xe3, 0x14, 0x23, 0xe2, 0xc6, 0x0a, 0xfc, 0xa9, 0x51, 0x66, 0xba,
0x1d, 0x86, 0x75, 0x2c, 0x51, 0x5c, 0x55, 0x9f, 0x6f, 0xd1, 0x03, 0x7a, 0x8e, 0x5e, 0x55, 0x16,
0x4d, 0x44, 0x41, 0x4a, 0x19, 0xb1, 0x91, 0x7b, 0x59, 0x2e, 0x4f, 0x20, 0x48, 0xb3, 0x60, 0x12,
0xd3, 0xd8, 0xeb, 0x17, 0x72, 0x92, 0x18, 0x4d, 0x3f, 0x99, 0x45, 0xf3, 0x52, 0x96, 0xc3, 0x68,
0xae, 0xb9, 0x8c, 0x3c, 0xf4, 0xcc, 0xbd, 0xcd, 0xa2, 0x42, 0x95, 0x39, 0x4c, 0xf2, 0xa8, 0x2b,
0x37, 0xf8, 0xaa, 0xf0, 0x46, 0x01, 0x30, 0x14, 0x39, 0xc9, 0x4c, 0x3a, 0x98, 0xd8, 0x7a, 0x3e,
0xf6, 0xc4, 0x57, 0xed, 0x82, 0x3c, 0x07, 0xa3, 0x43, 0xd1, 0x1a, 0xd1, 0x21, 0x3d, 0x8d, 0xa4,
0xde, 0x17, 0x63, 0x91, 0xdf, 0xc3, 0x94, 0x76, 0x76, 0xbb, 0xb6, 0xa7, 0xa6, 0x9b, 0x72, 0x19,
0x2b, 0x50, 0x9d, 0xd4, 0xce, 0xc8, 0x22, 0xc8, 0xdf, 0xdd, 0x26, 0x7a, 0x98, 0x52, 0x90, 0x93,
0xbc, 0x24, 0xde, 0xa5, 0x6d, 0xac, 0x8c, 0x76, 0xae, 0x36, 0xd5, 0x66, 0x9f, 0x43, 0x51, 0xcc,
0xf8, 0x5e, 0xee, 0x4f, 0x56, 0x9d, 0x83, 0x6b, 0x68, 0x13, 0xf2, 0x8d, 0x01, 0x17, 0xee, 0xe3,
0x7b, 0x69, 0x67, 0x34, 0xc2, 0xf9, 0x72, 0x31, 0xc4, 0xe2, 0x7d, 0x24, 0x51, 0x41, 0x09, 0x61,
0x8f, 0x1c, 0x1f, 0xcb, 0x4c, 0x12, 0xeb, 0x22, 0x21, 0x7d, 0x88, 0xba, 0x82, 0xe3, 0x0c, 0xf6,
0x91, 0x3b, 0x8c, 0x64, 0xda, 0x5b, 0xb1, 0x23, 0x56, 0xef, 0x28, 0x39, 0xce, 0x7a, 0xfd, 0x96,
0x72, 0x8c, 0x0d, 0x3d, 0x51, 0x2a, 0x24, 0x12, 0x25, 0xc4, 0x36, 0x40, 0xa2, 0x72, 0x6f, 0x54,
0x48, 0xce, 0x61, 0x5c, 0x94, 0xc2, 0xd3, 0x6d, 0x4c, 0x05, 0x28, 0x0c, 0x95, 0xd9, 0xe5, 0x9b,
0xab, 0x52, 0x83, 0x6c, 0x02, 0x42, 0xb7, 0xba, 0x93, 0xee, 0x01, 0x90, 0xca, 0x8d, 0x7b, 0xc7,
0x72, 0xda, 0x86, 0x48, 0xfc, 0x3d, 0x33, 0xc3, 0x92, 0xdc, 0x44, 0x39, 0x1f, 0xaa, 0xa7, 0xd1,
0xb8, 0x58, 0xf0, 0xc4, 0x9d, 0x40, 0x55, 0xdb, 0xba, 0x2c, 0xe3, 0x79, 0x1a, 0xaf, 0x44, 0x80,
0x00, 0x78, 0xff, 0x10, 0xdd, 0xf0, 0xb4, 0x04, 0x3f, 0xec, 0xdd, 0xa7, 0xb9, 0xd9, 0xb1, 0xc6,
0x6a, 0xfa, 0xca, 0x06, 0xa4, 0x88, 0xa2, 0x01, 0x59, 0x4d, 0xe0, 0x5b, 0xf8, 0xa3, 0xa0, 0x83,
0xa3, 0xcc, 0x8d, 0xa4, 0x0c, 0x95, 0x42, 0xa2, 0x62, 0x39, 0x6d, 0x7b, 0x35, 0x32, 0xf7, 0x79,
0x4f, 0x5f, 0x65, 0x19, 0x39, 0xea, 0x15, 0x4d, 0xd8, 0xcf, 0x6b, 0x41, 0xd1, 0xc4, 0x2d, 0xe7,
0x2c, 0x6b, 0x88, 0xf1, 0xd7, 0x24, 0x7e, 0x1c, 0xb2, 0xe4, 0xa3, 0xa4, 0xe4, 0x83, 0x3d, 0x85,
0xb4, 0xf1, 0xa5, 0x68, 0x97, 0x7a, 0xbd, 0xf6, 0x33, 0x2d, 0xb4, 0x68, 0x0b, 0x12, 0x52, 0xba,
0x58, 0x64, 0xe9, 0x2d, 0xe8, 0x9a, 0xa5, 0xfe, 0x9d, 0x08, 0x79, 0x16, 0xbe, 0x65, 0x0f, 0xbd,
0x51, 0xe7, 0xd7, 0x5f, 0xdb, 0xe3, 0xe1, 0xaf, 0xbf, 0x4e, 0x4f, 0x7e, 0xfd, 0xd5, 0xc5, 0xa3,
0xfd, 0xd9, 0xd0, 0x59, 0x37, 0x0a, 0x28, 0xc7, 0x62, 0xb1, 0x6f, 0x8d, 0x7e, 0xfd, 0x35, 0x5f,
0xff, 0xfa, 0xab, 0x3d, 0x6e, 0xdb, 0x56, 0xbb, 0x68, 0x5b, 0xce, 0x88, 0xe1, 0x35, 0x3f, 0xf4,
0x8a, 0x34, 0x60, 0x3a, 0x43, 0x8b, 0x2d, 0xff, 0x72, 0xdb, 0x83, 0xa0, 0x7e, 0x17, 0x51, 0x83,
0x1f, 0xf9, 0xfc, 0xab, 0xbb, 0xa5, 0x6d, 0x65, 0xf3, 0x89, 0xd5, 0x86, 0x41, 0xf0, 0xed, 0x76,
0x6e, 0x60, 0xb5, 0x97, 0x0e, 0xfb, 0xa1, 0x91, 0xbd, 0xc8, 0x63, 0x51, 0xf9, 0xd3, 0xed, 0x5c,
0x59, 0xf9, 0x83, 0x6f, 0xfd, 0x86, 0x79, 0x7f, 0x32, 0x5c, 0x77, 0xef, 0x68, 0xc2, 0x3f, 0x03,
0x3f, 0xa3, 0x6e, 0xe7, 0x2a, 0xe8, 0xcc, 0x3e, 0xef, 0x7c, 0x3d, 0x7e, 0xe8, 0x6d, 0x90, 0xf9,
0x7a, 0x2b, 0xb3, 0x4f, 0x99, 0x5f, 0x9a, 0x00, 0x3f, 0xb4, 0x7f, 0x16, 0xff, 0x59, 0x9f, 0x5a,
0x0e, 0xfb, 0x7a, 0x5f, 0x89, 0x2a, 0xfb, 0xae, 0x59, 0xf6, 0x5a, 0xfc, 0x27, 0x4a, 0xbe, 0xd8,
0x57, 0xa2, 0xca, 0xfe, 0xf0, 0xdf, 0x06, 0xc5, 0x02, 0x96, 0xfb, 0x9c, 0x7d, 0x23, 0x93, 0xb0,
0x25, 0x93, 0x29, 0xfb, 0x45, 0xbe, 0xcc, 0xe2, 0x34, 0xcd, 0xea, 0xa3, 0x0d, 0x7f, 0xdb, 0xd2,
0x25, 0xa2, 0xce, 0x4d, 0x94, 0xd8, 0x32, 0x11, 0xdc, 0x09, 0x59, 0xd5, 0xd0, 0x27, 0x7f, 0x37,
0xc5, 0x57, 0xa7, 0xf7, 0xaa, 0xa8, 0x4c, 0x65, 0xeb, 0x33, 0xf4, 0x9f, 0xf9, 0xcb, 0x20, 0xcb,
0xf9, 0xd7, 0x71, 0x1a, 0x90, 0xca, 0xae, 0x02, 0xe0, 0xc3, 0xe4, 0xb4, 0xd7, 0xed, 0x9e, 0x64,
0x5e, 0x56, 0x83, 0xfa, 0x4f, 0x23, 0x78, 0x26, 0x5a, 0xbd, 0x21, 0x35, 0xcf, 0x7a, 0x97, 0x46,
0x77, 0xff, 0x68, 0x6c, 0xa2, 0x17, 0xe9, 0x7b, 0x11, 0x18, 0xb6, 0x51, 0xc7, 0x5d, 0x06, 0xc4,
0x26, 0x59, 0x61, 0xf7, 0x99, 0xd5, 0xb5, 0x9c, 0x0d, 0x0d, 0xe9, 0x27, 0xdf, 0x38, 0x2a, 0x52,
0x01, 0x89, 0x8d, 0x9d, 0xf6, 0x4f, 0xfd, 0x87, 0x85, 0xd7, 0x65, 0x39, 0xfe, 0xad, 0xf0, 0x2f,
0xf0, 0x7a, 0x90, 0xad, 0x4a, 0x6c, 0x81, 0x2d, 0x2b, 0x99, 0x95, 0x26, 0xaf, 0x17, 0x64, 0x8a,
0xc3, 0x89, 0x16, 0xef, 0x51, 0x12, 0x15, 0x51, 0x10, 0xff, 0x24, 0x2c, 0xc4, 0x49, 0x25, 0x91,
0x3f, 0x95, 0xfd, 0x16, 0x7e, 0x5c, 0xcb, 0xa5, 0xea, 0x44, 0x08, 0x01, 0xf4, 0xb7, 0x36, 0x37,
0x76, 0x37, 0x2c, 0x9c, 0x53, 0x83, 0xae, 0x4c, 0xe2, 0x39, 0x63, 0x2f, 0x37, 0x9f, 0x9e, 0xca,
0x50, 0x7f, 0xe1, 0x0c, 0x45, 0x7f, 0x0b, 0x7e, 0x27, 0x51, 0xe0, 0x17, 0xde, 0xe9, 0x6f, 0x44,
0xc9, 0xc3, 0xad, 0x1a, 0xc8, 0x33, 0x6a, 0x10, 0xf9, 0xd6, 0x35, 0xb4, 0xd4, 0x47, 0xae, 0xae,
0x53, 0x0b, 0x16, 0x7d, 0xec, 0xe7, 0xa8, 0x1e, 0x99, 0x14, 0x0a, 0x44, 0x6d, 0x52, 0x0e, 0x59,
0x6f, 0x12, 0x28, 0x7c, 0x18, 0xbd, 0x61, 0x1a, 0xa7, 0x59, 0x4b, 0x2a, 0x7f, 0xf8, 0x6f, 0x50,
0xa9, 0x50, 0x4d, 0x90, 0xae, 0x68, 0x15, 0xab, 0x81, 0xe6, 0x2b, 0xda, 0x92, 0xa4, 0x87, 0x67,
0x65, 0x64, 0x21, 0x00, 0xcb, 0xd6, 0x5c, 0x27, 0x26, 0x96, 0x0c, 0x41, 0xab, 0x11, 0x63, 0xac,
0xd6, 0x42, 0x97, 0xe5, 0x3a, 0xb1, 0x32, 0x2a, 0x01, 0xd0, 0xfe, 0x4a, 0x71, 0xa3, 0x52, 0x4c,
0x95, 0xae, 0x79, 0xbc, 0x8a, 0x12, 0x55, 0x41, 0xce, 0x58, 0x66, 0xf9, 0x85, 0x4a, 0xc0, 0xf6,
0x60, 0x62, 0x79, 0x68, 0x91, 0x13, 0x1e, 0xef, 0x28, 0x02, 0xa9, 0x04, 0xa8, 0xe9, 0xa8, 0x18,
0xd7, 0xeb, 0x8d, 0x17, 0x46, 0x0a, 0xe1, 0x61, 0x23, 0x83, 0xf2, 0xb0, 0x62, 0x1c, 0x82, 0x04,
0xbd, 0x63, 0x2e, 0xb5, 0xa2, 0x35, 0x89, 0x83, 0x6d, 0xea, 0xa1, 0xfa, 0x61, 0x0c, 0xe9, 0x6c,
0xd6, 0xd7, 0xa6, 0x3c, 0x50, 0x1d, 0x4b, 0x45, 0x49, 0xd5, 0xca, 0x84, 0xb4, 0xdb, 0x0e, 0xdc,
0x8a, 0x36, 0xd5, 0x81, 0x14, 0x16, 0x53, 0x57, 0x1f, 0xd2, 0x1f, 0x81, 0x48, 0x93, 0xdc, 0xf4,
0x11, 0xa4, 0xc5, 0xe9, 0x65, 0x97, 0x91, 0x1f, 0x90, 0x13, 0x13, 0x32, 0xb2, 0x43, 0x57, 0x22,
0xc5, 0xfd, 0x5f, 0x48, 0xdb, 0xc3, 0x3d, 0xee, 0x70, 0x08, 0xfe, 0xec, 0xc4, 0xee, 0x75, 0x22,
0xf8, 0x4f, 0x32, 0x55, 0x9e, 0x20, 0x9d, 0xcb, 0x34, 0xbd, 0x3a, 0xf4, 0x1e, 0xfa, 0xfc, 0xb3,
0x4b, 0xb8, 0xb4, 0xa3, 0x1c, 0x0e, 0x4b, 0xc6, 0x62, 0x38, 0x2c, 0xe9, 0x98, 0x36, 0x1e, 0x67,
0xfe, 0x28, 0x15, 0x81, 0x17, 0x91, 0x4d, 0x59, 0x8a, 0x0f, 0x1e, 0x32, 0xef, 0x6f, 0x76, 0xff,
0xe2, 0xe2, 0x64, 0xa4, 0xaa, 0x53, 0x1d, 0xd1, 0xa4, 0xcb, 0x90, 0xed, 0xb0, 0xb9, 0x2a, 0x0f,
0x74, 0xc6, 0x44, 0x65, 0xcc, 0x54, 0xc6, 0x86, 0x66, 0x08, 0x2a, 0xf9, 0x90, 0x7e, 0x0b, 0x2a,
0xd8, 0x37, 0xc3, 0xec, 0x14, 0xf5, 0xc4, 0x14, 0xe7, 0x22, 0x45, 0x53, 0x9c, 0x88, 0x14, 0xf7,
0x2b, 0x59, 0x26, 0x8f, 0x06, 0x61, 0xb6, 0x95, 0x98, 0x53, 0x39, 0xa9, 0xcf, 0x3b, 0x25, 0x66,
0x0d, 0xb1, 0xe0, 0x73, 0x3a, 0x40, 0x00, 0x7f, 0x95, 0x0f, 0xbb, 0x5e, 0x7a, 0xca, 0x07, 0xf9,
0x6d, 0x44, 0x5a, 0x12, 0x7e, 0x73, 0x08, 0x7b, 0xbe, 0x55, 0x7a, 0xa8, 0x26, 0xa3, 0x1e, 0x03,
0x91, 0x91, 0x20, 0xc3, 0x8e, 0x3a, 0x99, 0x73, 0x9a, 0xb6, 0xed, 0xe8, 0x55, 0x36, 0xbc, 0xf4,
0xba, 0x8e, 0x59, 0x21, 0xa2, 0x0a, 0x59, 0x27, 0xa1, 0x0a, 0x7d, 0xb3, 0x20, 0xa3, 0x82, 0x04,
0xf8, 0x46, 0xc1, 0xb9, 0x52, 0xce, 0x90, 0x4d, 0x97, 0xdd, 0x93, 0xf8, 0xb3, 0xb3, 0x4b, 0x12,
0x51, 0x7f, 0xb3, 0x49, 0x66, 0x86, 0xc0, 0x02, 0x9e, 0x0e, 0xe4, 0x95, 0xcc, 0xc8, 0x55, 0xc6,
0xa6, 0x5a, 0xf8, 0x6f, 0xf3, 0x78, 0x2f, 0x5a, 0xe4, 0x7a, 0x47, 0xd5, 0x7a, 0x67, 0xbe, 0xdd,
0xc7, 0x48, 0x4e, 0x22, 0xa0, 0x25, 0x7b, 0xe5, 0xf7, 0x86, 0x99, 0xd7, 0xef, 0x64, 0xc0, 0x08,
0x7f, 0xd5, 0xe3, 0x9d, 0x2b, 0x4c, 0x39, 0x39, 0x89, 0x4e, 0xb5, 0x00, 0xc3, 0x60, 0x40, 0x3b,
0xd5, 0x38, 0x4a, 0x3d, 0x8e, 0x18, 0x19, 0x17, 0x90, 0xe5, 0xcd, 0x61, 0xc4, 0x87, 0x56, 0xa7,
0x7f, 0x42, 0xa7, 0x08, 0x04, 0xf9, 0x9d, 0xd8, 0x09, 0x7a, 0xed, 0x76, 0x87, 0x89, 0xd7, 0xef,
0x76, 0x09, 0x27, 0x72, 0x54, 0x49, 0x3b, 0xd2, 0x03, 0xe8, 0x63, 0x00, 0x36, 0xde, 0x9d, 0xfd,
0x83, 0xc8, 0x4c, 0x64, 0x88, 0x7a, 0xa7, 0x7d, 0x73, 0x1c, 0x92, 0xbd, 0x0f, 0xb0, 0x82, 0x74,
0xb2, 0xfd, 0x82, 0x7a, 0xd5, 0x42, 0x3a, 0xc3, 0xdc, 0x2f, 0x2f, 0x87, 0x36, 0xc6, 0x29, 0x28,
0xa8, 0xd3, 0xbb, 0xb8, 0x70, 0xfb, 0x17, 0xe7, 0x2f, 0x2f, 0x2e, 0x2e, 0xfb, 0x2f, 0xba, 0x57,
0xbd, 0x17, 0x57, 0x1d, 0xf7, 0xfc, 0xfc, 0xe2, 0xea, 0xf2, 0xea, 0xa2, 0x7b, 0x8e, 0x9f, 0x17,
0x57, 0xbd, 0xb3, 0xb3, 0x13, 0x78, 0x95, 0xbc, 0xd3, 0x77, 0xda, 0xbd, 0xee, 0xb9, 0x7b, 0x7e,
0xd5, 0xef, 0x5d, 0xf6, 0xae, 0xae, 0xce, 0xae, 0xce, 0x5e, 0xbe, 0x7c, 0x79, 0xf2, 0x87, 0x0d,
0x36, 0xe1, 0xaf, 0xfa, 0x5d, 0xcc, 0xc6, 0x7d, 0xd9, 0x7f, 0x71, 0xde, 0xbd, 0xba, 0xec, 0x5e,
0x9e, 0x77, 0xbb, 0x2f, 0xce, 0xae, 0x2e, 0x4e, 0x20, 0x3c, 0x78, 0xa7, 0xd7, 0x75, 0x3a, 0xe8,
0xc3, 0x7d, 0x71, 0x79, 0x75, 0x76, 0xd1, 0x7b, 0x79, 0xde, 0xeb, 0x77, 0xaf, 0xba, 0xfd, 0x76,
0xaf, 0x77, 0xe1, 0x5e, 0xbe, 0xb8, 0xba, 0x3a, 0x3f, 0xef, 0xf6, 0xba, 0x97, 0x97, 0xbd, 0xf3,
0x17, 0x00, 0x06, 0x09, 0xe3, 0x61, 0x74, 0xa8, 0xe7, 0x5e, 0xa1, 0x7e, 0xf7, 0xe2, 0xf2, 0xf2,
0x25, 0x7e, 0xae, 0xce, 0xda, 0x6e, 0xaf, 0x77, 0xde, 0x07, 0xe4, 0x8b, 0xb3, 0x17, 0x00, 0x71,
0x09, 0xd8, 0x09, 0x60, 0x83, 0x5f, 0x3a, 0xe7, 0x5d, 0x4c, 0xe1, 0xec, 0xf2, 0xf2, 0xac, 0x7b,
0x75, 0x76, 0xd6, 0xef, 0xf5, 0x09, 0x0e, 0xe9, 0x71, 0xff, 0xac, 0x7f, 0x81, 0xc9, 0x5c, 0xa1,
0xc3, 0x8b, 0x17, 0xbd, 0xde, 0xd5, 0x8b, 0xf3, 0xb6, 0xdb, 0x7d, 0x71, 0x75, 0x7e, 0x76, 0x7e,
0x71, 0x49, 0xf5, 0x2f, 0xfb, 0x67, 0xe7, 0x7d, 0x39, 0xb7, 0x0b, 0x1a, 0xe2, 0x4b, 0xb7, 0xfb,
0xf2, 0xa2, 0x7f, 0x75, 0x79, 0x76, 0x81, 0x5a, 0x17, 0x2f, 0xe4, 0xd4, 0x04, 0x8b, 0x0a, 0xa6,
0x16, 0xc2, 0xc3, 0x60, 0xe2, 0x5f, 0xa8, 0xd8, 0xe0, 0xe1, 0x5f, 0x30, 0xf8, 0x1d, 0x16, 0xfe,
0xbb, 0x94, 0xc4, 0x7b, 0xbd, 0x3a, 0x41, 0x25, 0x99, 0xe4, 0x5e, 0x2c, 0x54, 0x9f, 0x9f, 0x81,
0x36, 0xcf, 0xf9, 0xf9, 0xc0, 0x3d, 0x7f, 0x55, 0x76, 0xf8, 0x40, 0xae, 0x63, 0xea, 0x37, 0xd6,
0x19, 0xb3, 0x76, 0x31, 0xf7, 0xb2, 0x4d, 0x9e, 0x51, 0x0a, 0xb6, 0x4f, 0xdd, 0xec, 0xff, 0xf9,
0xd9, 0x69, 0x34, 0x84, 0x5c, 0xf3, 0xa0, 0xc0, 0xab, 0x38, 0xc9, 0x86, 0x6d, 0x8b, 0x79, 0x78,
0x3e, 0x70, 0x90, 0x6b, 0xd5, 0x2d, 0xac, 0x1d, 0x91, 0x47, 0x46, 0x8f, 0x1d, 0xb3, 0xd1, 0x03,
0x9d, 0x19, 0x84, 0x15, 0xb8, 0xb2, 0x18, 0xcc, 0x73, 0xcf, 0x10, 0xc5, 0x52, 0xef, 0x4b, 0x2b,
0x60, 0x9b, 0x58, 0x41, 0xeb, 0xa0, 0x50, 0xb0, 0x1d, 0xe6, 0x9d, 0x9b, 0xcd, 0x6a, 0xe6, 0x94,
0xed, 0xe8, 0x1c, 0x92, 0x54, 0x2f, 0x09, 0xdb, 0x36, 0x3d, 0xb4, 0x95, 0x05, 0xa8, 0x70, 0xd2,
0x56, 0xf4, 0x93, 0xd3, 0x4f, 0x80, 0x9f, 0x4d, 0xe5, 0xcf, 0x66, 0x32, 0x3c, 0x17, 0x8d, 0xb2,
0xb1, 0x4f, 0x47, 0x2c, 0x8e, 0xe0, 0xee, 0x66, 0xe3, 0x81, 0x32, 0x76, 0x0a, 0x66, 0x47, 0xee,
0x62, 0xbd, 0x8e, 0xdc, 0x9c, 0x7e, 0x56, 0xf4, 0x43, 0x31, 0xc4, 0x46, 0x47, 0xd2, 0x89, 0x8d,
0x54, 0x94, 0x5a, 0xb7, 0xc4, 0xd0, 0xab, 0xc9, 0x07, 0x3b, 0xb3, 0x57, 0x38, 0x6d, 0x58, 0x42,
0x3b, 0x53, 0xad, 0x35, 0x77, 0x0d, 0x0c, 0x16, 0xc3, 0x01, 0x58, 0x12, 0x8c, 0xbb, 0x78, 0x04,
0x0e, 0x21, 0x78, 0x53, 0xc1, 0xca, 0x03, 0xb4, 0x0b, 0x84, 0xb7, 0xf8, 0x38, 0xc8, 0xfc, 0x31,
0x90, 0xb9, 0x09, 0x52, 0x9a, 0x34, 0x8f, 0x43, 0x5b, 0x3d, 0x06, 0x6d, 0x65, 0x42, 0x0b, 0xe2,
0xe5, 0x22, 0x78, 0x02, 0x5a, 0xf0, 0x08, 0xb4, 0x1a, 0xbb, 0x78, 0x63, 0x0f, 0x01, 0x60, 0x3b,
0x15, 0x70, 0x65, 0xe5, 0x1c, 0x80, 0xde, 0xe0, 0x36, 0x5b, 0xdb, 0x59, 0x87, 0xd6, 0x88, 0x4c,
0xb0, 0x26, 0x53, 0x15, 0x75, 0x47, 0x19, 0x9f, 0x3e, 0x3a, 0x07, 0x34, 0x76, 0xb3, 0x47, 0x00,
0xd7, 0xb3, 0xc0, 0x1b, 0x49, 0x0e, 0x73, 0x16, 0xf3, 0x8c, 0xf3, 0xe4, 0x49, 0xf0, 0xf3, 0xe7,
0x83, 0x9f, 0x37, 0xc0, 0x4f, 0x9e, 0x5a, 0x4e, 0x82, 0x3e, 0x79, 0x3e, 0xf4, 0x49, 0x03, 0x3a,
0xf9, 0x97, 0xfb, 0xc5, 0x42, 0x6d, 0x91, 0xd9, 0x8a, 0x3b, 0x98, 0xb0, 0x53, 0xa4, 0x8d, 0x22,
0x25, 0x5c, 0x6d, 0x1f, 0x7d, 0x43, 0x82, 0x74, 0x8e, 0x47, 0x44, 0x82, 0xf3, 0x1b, 0x9b, 0x62,
0x63, 0x4f, 0x50, 0x45, 0x6d, 0x10, 0x91, 0xcb, 0x02, 0xd2, 0xa8, 0xce, 0x5e, 0x17, 0x6e, 0x30,
0xec, 0x41, 0xf6, 0x04, 0xcd, 0x81, 0x3e, 0x83, 0x85, 0xc5, 0x0c, 0x41, 0x64, 0x94, 0x16, 0xa4,
0xbb, 0x79, 0x8c, 0x5e, 0x4c, 0x01, 0x11, 0x3f, 0x8e, 0x06, 0xd8, 0x27, 0x0d, 0x34, 0x2c, 0xa4,
0x39, 0x20, 0xd0, 0x10, 0xd7, 0xb2, 0x53, 0xa0, 0x21, 0x97, 0x68, 0x88, 0x9f, 0x8b, 0x06, 0x6d,
0x79, 0x3c, 0x07, 0x0d, 0xc2, 0x99, 0x7f, 0x12, 0x0d, 0xa8, 0xf5, 0x4c, 0x34, 0x08, 0x7f, 0xc3,
0x44, 0xb2, 0xf4, 0xaa, 0x1e, 0x53, 0x15, 0xa8, 0xa4, 0x0f, 0x53, 0x23, 0x49, 0xf1, 0x0b, 0x37,
0x6b, 0x5b, 0xac, 0x45, 0x89, 0xb9, 0x4e, 0x4c, 0xda, 0x96, 0x63, 0x1d, 0xd0, 0x1c, 0x7a, 0xa7,
0x80, 0xa2, 0x9e, 0x33, 0x98, 0x40, 0xfe, 0xef, 0x2e, 0xbf, 0xe3, 0x21, 0xc5, 0x88, 0x86, 0xd0,
0xdc, 0x7f, 0xb7, 0xe9, 0xb8, 0x92, 0xd4, 0xc1, 0x99, 0x78, 0xeb, 0xab, 0x37, 0x2e, 0xde, 0xce,
0xe4, 0x9b, 0xb0, 0x29, 0xbe, 0xad, 0x5a, 0x8a, 0xa3, 0x80, 0xcf, 0x6c, 0x8a, 0xae, 0xe9, 0xed,
0x7c, 0xcc, 0x7a, 0x8e, 0xc3, 0x8e, 0x92, 0xc3, 0x5e, 0x22, 0x26, 0xd8, 0x52, 0xee, 0xae, 0x33,
0xa8, 0xe8, 0x06, 0xf4, 0x1e, 0x81, 0xd8, 0x33, 0x50, 0x3a, 0x87, 0x2e, 0x2b, 0x37, 0x0d, 0x2a,
0x7d, 0x16, 0x06, 0x03, 0x03, 0x85, 0xc1, 0x61, 0x1c, 0xca, 0x44, 0xb0, 0x1f, 0x99, 0xdb, 0xce,
0x72, 0x4d, 0x24, 0xda, 0xc5, 0x7e, 0xe6, 0x32, 0x7e, 0x62, 0xb5, 0xff, 0x01, 0x1b, 0x22, 0x73,
0xc4, 0x63, 0x2e, 0x1f, 0xfb, 0x24, 0x6d, 0x73, 0xf9, 0x80, 0x4a, 0xb5, 0x80, 0x5f, 0x36, 0x16,
0xb0, 0xf7, 0xe2, 0xe4, 0x3f, 0xc5, 0x42, 0xd0, 0x22, 0xa8, 0x97, 0xfe, 0x98, 0xd6, 0x40, 0xbd,
0x9c, 0x8d, 0xe5, 0xea, 0x7d, 0xfd, 0x97, 0x9b, 0x11, 0xd1, 0xc8, 0x97, 0x73, 0x05, 0xe3, 0xbb,
0x06, 0x8c, 0x1a, 0x40, 0xdd, 0xda, 0xec, 0xf1, 0x8b, 0x26, 0xbd, 0x3c, 0x52, 0x1d, 0x3d, 0xe9,
0x6e, 0x1e, 0xa5, 0x10, 0xe0, 0xfa, 0x19, 0x14, 0x42, 0x8e, 0xdc, 0xc6, 0x5c, 0x9f, 0x97, 0x7f,
0x8d, 0x4a, 0x0e, 0xac, 0x10, 0x1e, 0xbf, 0x08, 0x3f, 0x13, 0x34, 0xe2, 0x1c, 0x64, 0xf1, 0x3a,
0xe0, 0x62, 0x8a, 0x91, 0xa7, 0x07, 0x80, 0x4a, 0xba, 0x7f, 0x24, 0x05, 0x91, 0x2e, 0x34, 0x49,
0xe6, 0x6d, 0xeb, 0x33, 0x99, 0x8a, 0x91, 0x7a, 0x3e, 0xab, 0xff, 0xb0, 0x8f, 0xd5, 0xe1, 0x2b,
0x1a, 0xfc, 0x2a, 0x9c, 0xa3, 0x8a, 0x5f, 0xe9, 0x4d, 0x2c, 0xdd, 0xa7, 0x7b, 0x59, 0xfd, 0xa9,
0xa6, 0xcf, 0x67, 0x75, 0x4c, 0x71, 0x6b, 0x21, 0x49, 0x36, 0x42, 0xa6, 0x47, 0x10, 0xe8, 0xf0,
0xfb, 0xb7, 0x59, 0x9d, 0x24, 0xf1, 0xb3, 0x70, 0x18, 0x18, 0x48, 0x0c, 0x1e, 0xc3, 0xe2, 0xd3,
0xcc, 0x6e, 0x44, 0xbd, 0x36, 0x1b, 0xd0, 0x68, 0xbc, 0xb1, 0x9d, 0x3a, 0x16, 0xfa, 0x5f, 0x06,
0xda, 0xa1, 0x3c, 0x6e, 0xa3, 0x69, 0xb1, 0x10, 0x0a, 0x2a, 0xc7, 0xfc, 0x78, 0xf6, 0x3e, 0xfa,
0x93, 0x93, 0xef, 0xe8, 0x4e, 0xd2, 0x0c, 0xaf, 0x3f, 0x8b, 0x62, 0x3a, 0xd8, 0x0a, 0x0b, 0x7a,
0x1a, 0xf3, 0x1f, 0x83, 0x69, 0x54, 0xe6, 0x2c, 0x15, 0x17, 0xbe, 0xa6, 0x53, 0xda, 0x5f, 0x88,
0xeb, 0xb6, 0x8b, 0x00, 0xae, 0x45, 0xee, 0x5b, 0x8b, 0x34, 0x8b, 0xfe, 0x4c, 0x93, 0x22, 0x88,
0x2d, 0xa1, 0xa1, 0xe2, 0xe0, 0x3e, 0x2d, 0x8b, 0x2f, 0xa3, 0x8c, 0x8b, 0x31, 0xd4, 0x3e, 0xa9,
0xda, 0x95, 0x4c, 0xfc, 0xcc, 0x21, 0x5f, 0xf9, 0x24, 0x6d, 0xf7, 0xe1, 0x7f, 0x5b, 0x61, 0x94,
0x85, 0xf2, 0x5c, 0x6d, 0x3c, 0x7c, 0x90, 0x1d, 0x8b, 0x10, 0xa8, 0x57, 0xf5, 0xda, 0xde, 0x1a,
0x90, 0x7e, 0x81, 0x95, 0xef, 0x45, 0x1d, 0x00, 0xea, 0x10, 0x20, 0x31, 0x39, 0x2c, 0xcd, 0x82,
0x47, 0xf3, 0x45, 0x81, 0x44, 0x78, 0xe7, 0x45, 0x70, 0xa4, 0xc3, 0x7b, 0xf1, 0xc8, 0x44, 0x5b,
0x4a, 0x76, 0xf8, 0x69, 0x7f, 0xe3, 0x35, 0xba, 0xca, 0x50, 0xa1, 0x09, 0x35, 0xd3, 0x0d, 0xa8,
0xe8, 0xce, 0xeb, 0xb2, 0x7b, 0xfc, 0x93, 0x5d, 0xe4, 0xc3, 0xac, 0xee, 0x26, 0x1f, 0x46, 0x5e,
0x66, 0x6c, 0xfa, 0xfd, 0xd3, 0x0c, 0x25, 0x13, 0xfa, 0x81, 0xee, 0x48, 0x21, 0x9e, 0x2e, 0x65,
0xc8, 0x66, 0x40, 0x72, 0xe4, 0x1a, 0x1d, 0x02, 0xc7, 0xfa, 0x5d, 0x0c, 0x88, 0x76, 0x1e, 0x9e,
0xc0, 0x2b, 0x50, 0x1f, 0x0f, 0x31, 0x38, 0x8f, 0xd3, 0x1c, 0xfd, 0xb4, 0xbd, 0x6f, 0x2b, 0x2e,
0x11, 0xe1, 0x3a, 0x0a, 0x46, 0x08, 0xe1, 0xae, 0xe2, 0x3e, 0x7a, 0x09, 0xc5, 0x41, 0x48, 0x11,
0x02, 0x12, 0xe6, 0xb0, 0xa7, 0x57, 0x8a, 0x22, 0x4f, 0x2e, 0x24, 0xb9, 0x28, 0x91, 0xb6, 0x6c,
0x5d, 0x36, 0x37, 0xca, 0x84, 0x21, 0x5a, 0x17, 0x4d, 0x8c, 0x22, 0xe9, 0x25, 0xe8, 0x32, 0x8a,
0x72, 0xc0, 0x47, 0x93, 0x45, 0xca, 0xc6, 0xf7, 0xe4, 0x75, 0xb6, 0x82, 0x82, 0x56, 0x1f, 0xf8,
0xcd, 0x92, 0x67, 0xe4, 0xf9, 0x70, 0x41, 0x7f, 0x37, 0xc1, 0x9d, 0x91, 0x25, 0xe2, 0x78, 0x76,
0xa2, 0x4c, 0xf9, 0x0e, 0x77, 0x4e, 0xcb, 0x13, 0x23, 0xda, 0x51, 0xc5, 0xc2, 0xba, 0xac, 0x0a,
0x82, 0xa5, 0x52, 0x4a, 0xc8, 0x0e, 0x17, 0xc6, 0x28, 0x81, 0xe6, 0x53, 0xff, 0xcc, 0xbd, 0x94,
0x25, 0x86, 0xb3, 0x55, 0x57, 0xc8, 0x65, 0x99, 0xf4, 0x9a, 0x3c, 0x75, 0xcf, 0xaf, 0x2e, 0x86,
0xfb, 0x2b, 0x50, 0x2c, 0x62, 0xff, 0xa5, 0x1e, 0x44, 0x0c, 0x11, 0x14, 0xfa, 0x9d, 0xde, 0x49,
0xd8, 0x2e, 0x41, 0xd7, 0x29, 0xec, 0xb6, 0x3b, 0x2f, 0x1e, 0xe6, 0x5e, 0x08, 0xca, 0x89, 0x87,
0xa1, 0x97, 0x6f, 0x64, 0x50, 0x1d, 0x4d, 0x0b, 0xbf, 0x7f, 0x22, 0x46, 0xfa, 0xc3, 0x1b, 0x16,
0x15, 0xfe, 0xbe, 0x2b, 0x51, 0x76, 0xf1, 0x59, 0xd2, 0x4e, 0x9c, 0xcf, 0xe0, 0xde, 0x67, 0xfb,
0x6b, 0xc8, 0x69, 0xe7, 0x7f, 0x64, 0x85, 0x5d, 0x9c, 0x14, 0xed, 0xe4, 0x24, 0x71, 0x36, 0x35,
0xe3, 0x8b, 0xa0, 0x7f, 0xbd, 0xc7, 0x20, 0xe8, 0x0f, 0x94, 0x5f, 0xb1, 0x54, 0xa7, 0xc9, 0x52,
0x9d, 0x86, 0x08, 0x30, 0x2e, 0x74, 0x15, 0x66, 0xe4, 0x4d, 0x41, 0xd1, 0xb6, 0xad, 0xe4, 0x86,
0x4a, 0xaa, 0x48, 0x76, 0x49, 0x9a, 0xa0, 0x88, 0x09, 0x13, 0x62, 0xc1, 0xc4, 0xe0, 0x91, 0xb4,
0x68, 0x44, 0xa4, 0x09, 0xf2, 0x82, 0xf3, 0xf8, 0xf3, 0x64, 0x1e, 0x4b, 0x71, 0x24, 0x5e, 0x77,
0x24, 0x08, 0x9d, 0xda, 0x0e, 0xe3, 0x34, 0xbc, 0xbe, 0x8d, 0x72, 0x21, 0x2f, 0xf8, 0x10, 0xb2,
0xa4, 0x2d, 0x4e, 0xf3, 0x6f, 0xe5, 0x42, 0x07, 0x74, 0xa8, 0x84, 0x9a, 0x04, 0x49, 0x11, 0xed,
0x69, 0xd6, 0x7b, 0xd9, 0xed, 0xa0, 0xe9, 0x6e, 0x29, 0x1d, 0x82, 0xf2, 0x29, 0xb6, 0x89, 0xb5,
0xb1, 0x13, 0xa1, 0x4e, 0xea, 0xa1, 0xc7, 0x5b, 0x43, 0x17, 0x08, 0xa2, 0xc0, 0xa3, 0x1b, 0xde,
0x81, 0x72, 0xf1, 0xb8, 0xa7, 0xc8, 0xab, 0xd8, 0x26, 0xa2, 0xc0, 0x15, 0xc9, 0xdd, 0xb2, 0x13,
0x89, 0xcd, 0xc7, 0xd8, 0x17, 0x13, 0x17, 0xeb, 0x16, 0x14, 0x41, 0xd2, 0xb7, 0x3b, 0x11, 0xa3,
0xc8, 0xa5, 0x8d, 0x3e, 0x4e, 0x13, 0xa8, 0x31, 0xf0, 0x74, 0x45, 0xc1, 0x59, 0x21, 0xce, 0x65,
0xb3, 0xd4, 0x08, 0x1a, 0xd6, 0x7b, 0x5f, 0x76, 0x4c, 0x4e, 0x85, 0xf1, 0x0e, 0x62, 0x3c, 0x4d,
0x4f, 0x72, 0xf3, 0xfc, 0x41, 0xbe, 0xbb, 0x78, 0x42, 0x0b, 0x4c, 0xd2, 0xbb, 0x6f, 0x85, 0x14,
0x6a, 0x2e, 0x64, 0xa2, 0x45, 0x9a, 0xba, 0x79, 0x08, 0xc1, 0x96, 0xe8, 0x55, 0x3d, 0x24, 0x8a,
0x8d, 0xde, 0xc2, 0x2d, 0xcc, 0xe4, 0x15, 0x66, 0x6e, 0x95, 0x5a, 0xc9, 0xb4, 0xf0, 0x4b, 0x91,
0x94, 0x80, 0x99, 0x88, 0x16, 0xa7, 0xce, 0xa9, 0xcd, 0x49, 0x8e, 0x3b, 0xc4, 0xd6, 0x40, 0x82,
0x1d, 0x89, 0xbc, 0xb2, 0xca, 0xd3, 0x23, 0x55, 0x53, 0xde, 0x62, 0xf6, 0x58, 0x32, 0x3b, 0x5b,
0xed, 0x2d, 0x45, 0x59, 0x27, 0x97, 0x35, 0x8c, 0xe1, 0x06, 0x45, 0x7d, 0xaf, 0xb6, 0x3a, 0x45,
0xe1, 0x77, 0x07, 0xbc, 0x3e, 0xc1, 0xc2, 0xf5, 0x61, 0x8b, 0x52, 0x9c, 0x93, 0x70, 0xef, 0xb0,
0x9a, 0xa9, 0x4c, 0xde, 0x77, 0xc4, 0xed, 0xcf, 0x9a, 0x05, 0xcb, 0x93, 0xb2, 0x9d, 0x62, 0xb0,
0xaf, 0x9a, 0xf8, 0xd1, 0xe7, 0x04, 0xb9, 0x79, 0x4c, 0xcf, 0xb8, 0x37, 0x63, 0x70, 0xe9, 0x03,
0x96, 0x05, 0xfa, 0x18, 0x38, 0x86, 0x83, 0x2f, 0x18, 0xa8, 0x83, 0x1c, 0x8b, 0xc9, 0xb4, 0xd7,
0xe0, 0x2a, 0xba, 0x1f, 0xd3, 0xca, 0x53, 0xb2, 0x51, 0x84, 0x57, 0x20, 0x4a, 0x5e, 0xd3, 0xf6,
0x95, 0x31, 0xc3, 0x45, 0xb1, 0x7d, 0xa8, 0xa6, 0x6d, 0x75, 0xe6, 0x84, 0x77, 0x3a, 0x45, 0x68,
0xb5, 0x13, 0x69, 0x72, 0x44, 0xc0, 0xd7, 0xd2, 0xde, 0x13, 0xcb, 0x1b, 0x75, 0xeb, 0x6b, 0xe0,
0xb0, 0xab, 0xda, 0x56, 0x4b, 0xb4, 0xf9, 0xcc, 0xda, 0x38, 0xee, 0xc7, 0x14, 0x88, 0xb5, 0x98,
0xe5, 0x08, 0xcb, 0xa4, 0xbe, 0x39, 0x60, 0xcc, 0x67, 0x77, 0x4f, 0x70, 0x08, 0x95, 0x2e, 0x6e,
0xf6, 0x08, 0x41, 0x38, 0x2d, 0xfc, 0x91, 0x75, 0x93, 0x96, 0xb9, 0xb8, 0x9e, 0x00, 0x58, 0x45,
0x5a, 0x86, 0x0b, 0x95, 0x16, 0xf9, 0xe5, 0x52, 0xe7, 0xf2, 0x64, 0x6a, 0x8d, 0xd9, 0xdc, 0x10,
0x84, 0x89, 0xb1, 0x13, 0x2a, 0x3a, 0x4d, 0xd4, 0x29, 0x45, 0x0a, 0xfa, 0x55, 0x47, 0x34, 0xa2,
0xa9, 0x2f, 0xd7, 0x28, 0xc3, 0x9a, 0xa4, 0x37, 0x36, 0xdd, 0x1f, 0xae, 0xf7, 0x5b, 0xcf, 0x2e,
0x1d, 0x3a, 0x62, 0x2f, 0xc7, 0x69, 0x5f, 0xd4, 0x47, 0xcf, 0xc4, 0xc9, 0xb6, 0xdf, 0x7f, 0x17,
0x01, 0xd4, 0xdf, 0x7f, 0xf7, 0x21, 0x09, 0x6c, 0x33, 0x9e, 0xaa, 0xcf, 0xf2, 0xc8, 0x63, 0x99,
0xb6, 0xb8, 0x00, 0x5f, 0x15, 0x3a, 0x4e, 0xe3, 0x54, 0x7f, 0xe1, 0xec, 0x9e, 0x0b, 0x39, 0x10,
0x37, 0x95, 0x74, 0x23, 0xee, 0xc1, 0xc8, 0xf3, 0x1f, 0x62, 0xc7, 0x0c, 0x1c, 0xfb, 0x90, 0x26,
0x6f, 0x09, 0x1f, 0x5f, 0xa6, 0xb7, 0x09, 0x58, 0x12, 0x26, 0x01, 0xe1, 0x24, 0x17, 0x86, 0x0b,
0xe9, 0x87, 0xa7, 0x4d, 0x05, 0x7d, 0xfc, 0x4f, 0x68, 0xd6, 0x6c, 0x1e, 0x25, 0x43, 0x6d, 0x02,
0xbc, 0x15, 0xaf, 0x9e, 0xce, 0x07, 0x97, 0x3e, 0x60, 0x05, 0xb2, 0x59, 0x9c, 0xde, 0x7a, 0xd6,
0x2a, 0xca, 0xa3, 0x09, 0x4c, 0x33, 0x36, 0x8d, 0xf2, 0x25, 0x60, 0x7a, 0xd9, 0xd0, 0x8a, 0x92,
0x38, 0x4a, 0x78, 0x67, 0x42, 0x22, 0xd3, 0xa2, 0x50, 0x14, 0x3d, 0xab, 0xdb, 0xe3, 0x5d, 0xbd,
0x75, 0x2e, 0x4e, 0x9c, 0xa2, 0xba, 0x04, 0xfb, 0x1d, 0x9f, 0x15, 0xa8, 0x2c, 0x5f, 0x3e, 0xa4,
0x4b, 0x6b, 0xec, 0x73, 0x87, 0x2d, 0xec, 0x77, 0xf2, 0xb8, 0x5b, 0x7d, 0x91, 0xdc, 0xd6, 0xeb,
0x06, 0xc6, 0x2c, 0xe5, 0x2e, 0xa4, 0x79, 0x98, 0xa9, 0x42, 0xd0, 0x01, 0x1c, 0x32, 0x75, 0xf8,
0x48, 0x1e, 0xb6, 0x4c, 0x93, 0x37, 0xc9, 0xb2, 0x2c, 0xc8, 0xde, 0xa5, 0x4c, 0x3a, 0xba, 0x46,
0xa7, 0x51, 0xbe, 0x20, 0x79, 0x89, 0x15, 0x7f, 0x1d, 0x13, 0x23, 0xfc, 0x08, 0x14, 0xc1, 0x62,
0xa6, 0x7e, 0xc4, 0x95, 0x96, 0x2f, 0xa5, 0xba, 0x47, 0x96, 0x36, 0x4f, 0x24, 0x05, 0xe6, 0x43,
0x1a, 0x25, 0xd9, 0x6a, 0xd3, 0x0f, 0x32, 0x83, 0xae, 0xe9, 0x92, 0x21, 0xc7, 0xdd, 0x50, 0x40,
0xfa, 0xaf, 0x0e, 0x49, 0x8e, 0x19, 0x89, 0x37, 0x9d, 0xf5, 0x4f, 0x64, 0x15, 0xe9, 0xb2, 0xb6,
0xbb, 0x8a, 0xda, 0xe2, 0x12, 0x24, 0x3e, 0xc5, 0x92, 0x5a, 0x9e, 0x78, 0xaf, 0x17, 0xd5, 0xf2,
0x8e, 0x7a, 0x74, 0x1a, 0x57, 0xdc, 0xf6, 0xa2, 0xcb, 0xdb, 0xd3, 0x82, 0x4e, 0x29, 0x7d, 0x15,
0x00, 0x84, 0x39, 0xef, 0xea, 0x7c, 0xf0, 0xce, 0x8d, 0x2b, 0xe2, 0xfb, 0x87, 0x25, 0x9d, 0x35,
0x5b, 0x71, 0x8a, 0xab, 0x3b, 0x1b, 0x73, 0xf7, 0xce, 0xe0, 0x3a, 0xa3, 0x6b, 0xf9, 0x2e, 0x3b,
0xed, 0xed, 0x56, 0x07, 0x33, 0x1a, 0x95, 0x89, 0x21, 0x55, 0xdd, 0xbe, 0xc3, 0x9e, 0x1a, 0xdf,
0xbe, 0x1b, 0x5e, 0x7b, 0x86, 0x48, 0xdb, 0xd7, 0x1b, 0xfb, 0x8d, 0xe1, 0xbe, 0x4c, 0x1a, 0x1a,
0x4c, 0xc6, 0x19, 0xcb, 0x2c, 0x26, 0x7b, 0x96, 0x68, 0x5a, 0x53, 0xdd, 0xc2, 0x16, 0x27, 0xc8,
0xd9, 0x43, 0x75, 0x93, 0xcf, 0xb3, 0xde, 0x64, 0xe9, 0xb7, 0x82, 0x5e, 0x5a, 0x55, 0xaa, 0xd3,
0x21, 0x61, 0x29, 0xc8, 0x53, 0x08, 0x33, 0x3a, 0x61, 0x9c, 0x7f, 0x8e, 0x9e, 0x56, 0x7c, 0x68,
0x19, 0xb5, 0x74, 0x26, 0x28, 0xd6, 0x82, 0x96, 0xa5, 0x3b, 0x7e, 0xde, 0x83, 0xd5, 0xb9, 0xe5,
0x93, 0xeb, 0xa8, 0xe8, 0x14, 0xc1, 0xb2, 0xb3, 0x80, 0x1a, 0x8b, 0x49, 0x95, 0x75, 0xc4, 0x99,
0x01, 0x4b, 0x46, 0x79, 0xa0, 0x74, 0x5a, 0xea, 0x7f, 0x67, 0x60, 0xb1, 0x02, 0x42, 0x27, 0xa7,
0x4b, 0x6a, 0x9e, 0x25, 0x92, 0x31, 0x09, 0x0b, 0xab, 0x4d, 0x32, 0xd2, 0xbd, 0x73, 0xa4, 0xf0,
0x15, 0x2f, 0xf7, 0x42, 0x8a, 0xc2, 0xb9, 0x88, 0x63, 0xb9, 0x75, 0xa1, 0x1a, 0x88, 0x0b, 0x6e,
0x0c, 0xf4, 0xe3, 0xa1, 0x1a, 0xd9, 0x23, 0x44, 0x5d, 0x3a, 0x2d, 0x75, 0x36, 0x5e, 0xfa, 0x30,
0xfc, 0xb4, 0xe6, 0xd6, 0xaf, 0xcb, 0x34, 0x8f, 0x08, 0x81, 0x30, 0x6f, 0x26, 0x50, 0x13, 0x65,
0x01, 0x1e, 0xde, 0x65, 0x6b, 0xe0, 0x1b, 0xf6, 0x11, 0x90, 0x87, 0xe5, 0xb5, 0x58, 0xe3, 0x80,
0xa2, 0xfd, 0x20, 0x6e, 0x98, 0x7d, 0x4b, 0x5f, 0x95, 0x68, 0xb8, 0x9c, 0xf0, 0x61, 0x8b, 0xf5,
0xba, 0x5a, 0x59, 0xb0, 0x93, 0x3a, 0x96, 0x9e, 0x7f, 0x71, 0xff, 0x41, 0xde, 0xcf, 0xb3, 0x2d,
0xe2, 0x34, 0xcb, 0x51, 0x77, 0x4c, 0x6f, 0x81, 0xf0, 0xf4, 0xd6, 0x4d, 0x82, 0x55, 0x34, 0x0f,
0xe8, 0x40, 0x18, 0x7a, 0xcb, 0x3e, 0x9f, 0xd3, 0x8d, 0xfb, 0xc8, 0x3f, 0xfd, 0xcd, 0xb6, 0x87,
0x47, 0x21, 0x1c, 0xf0, 0x1b, 0xbe, 0x06, 0xfa, 0xb3, 0x34, 0x9a, 0x3a, 0xae, 0x73, 0x92, 0x07,
0xb3, 0x20, 0x8b, 0x4e, 0x23, 0x7d, 0x25, 0x94, 0x3e, 0x7e, 0x12, 0xfd, 0xb0, 0x48, 0x13, 0xbe,
0x8e, 0x7e, 0x48, 0xa7, 0xf8, 0x09, 0xa6, 0x46, 0x29, 0xd7, 0xbd, 0xd0, 0xe1, 0x7e, 0xc3, 0x64,
0xb4, 0xa3, 0xf5, 0x3a, 0x03, 0x03, 0x41, 0x2c, 0xe9, 0x7b, 0xbb, 0x43, 0x75, 0xd6, 0x0e, 0x0b,
0xd7, 0xb6, 0x4e, 0x4f, 0xad, 0x36, 0xe4, 0x4a, 0x9a, 0x17, 0x78, 0x2c, 0xa1, 0x28, 0x12, 0x8c,
0xbf, 0x4d, 0xc7, 0x1b, 0x83, 0x2c, 0x5c, 0xb4, 0xa1, 0xaf, 0x36, 0x76, 0xa4, 0xa5, 0x10, 0x9d,
0x3c, 0x64, 0x47, 0x12, 0x63, 0xca, 0x67, 0x05, 0xc5, 0xdd, 0x79, 0x19, 0x99, 0xb7, 0x9c, 0x65,
0x10, 0xcd, 0x33, 0x2c, 0xa1, 0x67, 0x25, 0x18, 0xa6, 0x25, 0x6e, 0x85, 0xa6, 0xd7, 0xbc, 0x23,
0x16, 0xca, 0xf2, 0xfa, 0x4c, 0xbe, 0x7b, 0xd6, 0x27, 0xdd, 0x6e, 0x17, 0x3a, 0xf4, 0x71, 0x50,
0x9d, 0xbe, 0x04, 0x06, 0xce, 0xc2, 0xe3, 0x11, 0x60, 0xb3, 0xd9, 0x0c, 0xc0, 0x0c, 0x0b, 0x75,
0x59, 0xd8, 0x5c, 0xc7, 0x1b, 0xb8, 0x1b, 0x08, 0x4a, 0x7e, 0x43, 0x34, 0x0f, 0x51, 0x55, 0x9d,
0xed, 0xa6, 0xc3, 0x41, 0xaf, 0x20, 0xa5, 0x88, 0x7a, 0xf3, 0x1a, 0x33, 0xf2, 0x7d, 0x54, 0x8c,
0x3d, 0x95, 0x66, 0x09, 0x7c, 0x58, 0xfa, 0xf6, 0x01, 0x1c, 0x48, 0x69, 0xc6, 0xd1, 0x07, 0x17,
0x94, 0x19, 0x47, 0x5f, 0x5d, 0x50, 0x66, 0x5c, 0xee, 0xff, 0xd3, 0x86, 0xe7, 0x46, 0x27, 0x29,
0x0e, 0xba, 0xa1, 0x7f, 0xcd, 0x0b, 0x1d, 0x8d, 0xba, 0x4c, 0x04, 0x93, 0xf1, 0x68, 0x67, 0x22,
0x02, 0x4a, 0x4f, 0x11, 0x44, 0x1e, 0xb3, 0x11, 0xd9, 0x89, 0xa2, 0x98, 0x36, 0xb8, 0x77, 0x2b,
0x8c, 0xf7, 0xf8, 0xae, 0x15, 0x44, 0xaa, 0x46, 0xa1, 0xd5, 0xee, 0x7e, 0x88, 0xba, 0x58, 0x43,
0x6e, 0x40, 0x34, 0x3d, 0xde, 0x1d, 0x80, 0x7a, 0x1c, 0xdd, 0xfd, 0x00, 0x75, 0x31, 0xc5, 0x9b,
0x2b, 0x80, 0x0d, 0x3f, 0x59, 0x43, 0x0c, 0x76, 0xda, 0xa8, 0x81, 0x3c, 0x05, 0x7a, 0x67, 0xbc,
0xda, 0xd7, 0xae, 0x4d, 0xdc, 0xd1, 0x58, 0x7a, 0xd8, 0x4d, 0xa7, 0x3b, 0xdd, 0x71, 0xba, 0xb1,
0xbc, 0x69, 0xa7, 0xc4, 0xca, 0x96, 0x74, 0x78, 0x64, 0x90, 0xbf, 0x4a, 0x07, 0x79, 0xdb, 0x8f,
0x4f, 0x5f, 0xb2, 0xb0, 0xed, 0xf7, 0xd4, 0xa5, 0x4e, 0xff, 0xa7, 0xc6, 0xfe, 0x1a, 0xcc, 0x95,
0x99, 0x1f, 0xb8, 0x74, 0x01, 0x31, 0x70, 0xe7, 0x6c, 0x85, 0xdf, 0xc9, 0x80, 0xcb, 0x73, 0xb3,
0xa3, 0x5e, 0xdf, 0xbd, 0x38, 0x09, 0xf5, 0xb8, 0x67, 0x62, 0xb4, 0x0b, 0xf1, 0xbb, 0x12, 0x23,
0xae, 0xcf, 0x72, 0xee, 0x78, 0xed, 0x02, 0x2f, 0x9f, 0xcc, 0xc0, 0x37, 0x34, 0xf9, 0x4b, 0xf7,
0xf2, 0xf2, 0x92, 0xde, 0x67, 0xe2, 0xfd, 0xec, 0xcc, 0x3d, 0x3b, 0x3b, 0xc3, 0x7b, 0x57, 0xbe,
0x5f, 0x74, 0x45, 0x7a, 0x46, 0xe9, 0x4b, 0x5d, 0xb7, 0xdb, 0x15, 0xef, 0x2f, 0x75, 0xdd, 0x99,
0x7c, 0x17, 0x88, 0x94, 0x80, 0xc7, 0xbb, 0x11, 0x01, 0x61, 0xa6, 0x62, 0x8a, 0xd5, 0x76, 0x0f,
0x85, 0xfe, 0xc4, 0x56, 0x38, 0x9d, 0xb3, 0xa3, 0x48, 0x80, 0xc3, 0xe6, 0x7b, 0xcb, 0x09, 0xae,
0xaa, 0x31, 0x30, 0xa6, 0x20, 0x63, 0xa6, 0x53, 0x57, 0x4e, 0x7b, 0x2a, 0x83, 0x7d, 0x94, 0x90,
0x11, 0x53, 0x3d, 0x20, 0x59, 0x6d, 0xae, 0xaa, 0xcd, 0x75, 0xb5, 0xb9, 0xae, 0x36, 0xde, 0x1b,
0xa0, 0xa0, 0xd1, 0x4e, 0xf6, 0x8e, 0x26, 0x12, 0x1b, 0xf7, 0x00, 0xdd, 0x1c, 0x8d, 0x10, 0x44,
0xcd, 0x3e, 0x27, 0xaa, 0xcf, 0x89, 0xee, 0x73, 0x52, 0xf5, 0xb9, 0xd9, 0x08, 0x0e, 0xaf, 0x75,
0xee, 0xbc, 0xd8, 0xd6, 0x19, 0x1b, 0xc6, 0xd9, 0x83, 0xb2, 0xba, 0xbc, 0xbd, 0x87, 0xcf, 0xf6,
0x1f, 0x49, 0x83, 0xfc, 0x16, 0x91, 0x32, 0xb2, 0xa5, 0x9a, 0x41, 0x31, 0x6e, 0x06, 0xc5, 0x06,
0x4f, 0x5b, 0xba, 0xc3, 0x4e, 0xef, 0x24, 0x6a, 0xc3, 0x15, 0x83, 0x04, 0x4d, 0x21, 0x70, 0x2a,
0x7f, 0xb0, 0x76, 0xab, 0x49, 0x4a, 0x75, 0x1d, 0xe5, 0x90, 0x6f, 0x39, 0xd0, 0xe5, 0x49, 0xe6,
0x3c, 0x22, 0x9e, 0xcc, 0xc0, 0x55, 0xbe, 0xc3, 0x43, 0x1a, 0x33, 0x79, 0x3b, 0x16, 0xa1, 0x21,
0x7b, 0x27, 0x8c, 0x95, 0x3b, 0xfb, 0x62, 0x63, 0xa2, 0xf6, 0x6e, 0xa0, 0xea, 0xcc, 0xbd, 0x3c,
0x89, 0x07, 0xb5, 0x58, 0x34, 0xc4, 0xcf, 0x9e, 0xb8, 0x1c, 0x05, 0xde, 0x50, 0x7d, 0x2b, 0x58,
0x15, 0x8b, 0x45, 0x23, 0x41, 0x4c, 0x5c, 0x28, 0xbe, 0x58, 0x02, 0xfb, 0x07, 0xab, 0x23, 0x0d,
0x1c, 0x3a, 0xc1, 0x5e, 0x8e, 0xb8, 0x31, 0xd1, 0xb1, 0x8f, 0xc5, 0xd0, 0x86, 0x33, 0x7d, 0xf6,
0xc6, 0x85, 0x3e, 0xde, 0x6c, 0x9c, 0x9d, 0x33, 0x26, 0xb5, 0xe5, 0x35, 0x8d, 0x56, 0xd6, 0x2e,
0x21, 0x24, 0xdb, 0xc6, 0xd8, 0x7b, 0xd1, 0x87, 0xa5, 0xcc, 0xa9, 0x9d, 0xfa, 0x0f, 0xb5, 0xc9,
0x92, 0x71, 0x58, 0x4a, 0x64, 0x7e, 0xd5, 0x36, 0x4e, 0x66, 0x5a, 0x38, 0xa9, 0xa3, 0x7c, 0x62,
0xe9, 0x62, 0x53, 0x56, 0x8c, 0xac, 0x20, 0xbc, 0x9e, 0x8b, 0x95, 0xf4, 0x2c, 0x38, 0x60, 0x51,
0x58, 0xbb, 0xba, 0x9f, 0x84, 0x61, 0xd8, 0xea, 0x5f, 0x7c, 0xc6, 0x5a, 0xa4, 0x2d, 0x5b, 0xdd,
0xd6, 0x45, 0x97, 0xd2, 0x94, 0xdb, 0x6d, 0xbd, 0xa8, 0xf3, 0x61, 0x83, 0xd5, 0x50, 0x28, 0x34,
0xee, 0x59, 0x2f, 0xe1, 0x67, 0xbf, 0x24, 0x8f, 0x95, 0x0e, 0x92, 0x90, 0xc7, 0x22, 0xa7, 0xbb,
0x77, 0x6e, 0xdf, 0xa8, 0xfe, 0x9e, 0x33, 0xc7, 0xda, 0x2c, 0x23, 0xf3, 0xae, 0x2b, 0x2d, 0x3b,
0x1d, 0x5f, 0xb6, 0x40, 0x0f, 0x9f, 0x59, 0x7a, 0xc6, 0xea, 0xed, 0xf1, 0x29, 0xc3, 0xd7, 0xb7,
0xc8, 0x2f, 0x0b, 0x80, 0xe1, 0x2d, 0x1e, 0xe1, 0x3b, 0x3c, 0x02, 0x13, 0xbe, 0x85, 0x6e, 0x61,
0xb5, 0x22, 0x91, 0x51, 0x27, 0x16, 0x0b, 0x61, 0xe5, 0xcc, 0xc8, 0x72, 0x90, 0xd3, 0x9c, 0x14,
0xec, 0x41, 0x9b, 0xc1, 0x1e, 0xa8, 0x44, 0x18, 0xcd, 0x9e, 0xba, 0x41, 0x08, 0xfb, 0x84, 0x37,
0x03, 0xf2, 0xb0, 0xc9, 0xab, 0xac, 0xf7, 0xab, 0xb9, 0xfa, 0x34, 0x99, 0xce, 0x11, 0xb7, 0xa2,
0xd9, 0x9d, 0x97, 0xbb, 0x77, 0xec, 0x1e, 0xbf, 0xf7, 0x64, 0xaf, 0x18, 0x16, 0xcb, 0xbd, 0x61,
0xb1, 0xe4, 0x85, 0x34, 0x37, 0x8a, 0x2a, 0x6a, 0x54, 0xd4, 0x51, 0xa3, 0xa2, 0x8e, 0x1a, 0x69,
0x5b, 0x85, 0x0e, 0x37, 0x2a, 0xca, 0x86, 0xad, 0xd2, 0xb4, 0x77, 0xc2, 0xda, 0xde, 0x21, 0x1f,
0xfd, 0xb0, 0xbd, 0x93, 0xd4, 0xf6, 0x4e, 0xb0, 0x37, 0xd6, 0x3a, 0x52, 0x0a, 0x68, 0x36, 0xdb,
0x92, 0x97, 0x30, 0x6c, 0x4a, 0x0e, 0x89, 0x49, 0x6b, 0xc4, 0x40, 0x56, 0x24, 0x28, 0x59, 0xad,
0xc5, 0xbb, 0x4c, 0xfc, 0x57, 0x4b, 0x76, 0x29, 0x72, 0x21, 0x4c, 0x51, 0x44, 0x77, 0x79, 0xfd,
0x78, 0x27, 0xfa, 0xa2, 0x38, 0x6b, 0x9f, 0x19, 0x25, 0x43, 0x6a, 0x07, 0xf7, 0x13, 0x32, 0xbd,
0x5d, 0x23, 0xcd, 0xad, 0xd8, 0x27, 0xed, 0x9d, 0x89, 0xbd, 0x91, 0x90, 0x0e, 0xf6, 0x55, 0xc1,
0x6a, 0x8a, 0x4c, 0xb7, 0x53, 0x79, 0x90, 0xf2, 0x24, 0xa7, 0xf8, 0x74, 0xdb, 0x0e, 0x3b, 0xa9,
0x3c, 0x4f, 0x79, 0x02, 0x52, 0x10, 0x52, 0xc3, 0xd9, 0xfc, 0xeb, 0xc2, 0x3e, 0x9a, 0xd9, 0x74,
0x5c, 0xa1, 0x12, 0xfb, 0x41, 0x21, 0xe5, 0x10, 0x9b, 0xe9, 0x2b, 0x60, 0x7e, 0x36, 0x14, 0x67,
0xd3, 0x25, 0x8d, 0x89, 0xd8, 0x15, 0xd8, 0xdc, 0xb3, 0xf3, 0x6d, 0x01, 0x15, 0x8a, 0x73, 0x11,
0xa1, 0x02, 0xe0, 0xec, 0x8a, 0x27, 0x75, 0xc2, 0x4b, 0x7c, 0xee, 0xe2, 0xf8, 0xf8, 0x49, 0x00,
0x24, 0x0a, 0xff, 0x1d, 0x02, 0xee, 0x0b, 0x0a, 0xd6, 0x1d, 0xe2, 0xfc, 0xfd, 0x92, 0xac, 0x34,
0x3d, 0xb5, 0x4a, 0xec, 0x3d, 0x2e, 0x6b, 0x9e, 0xd1, 0xcd, 0xb3, 0xe4, 0x47, 0xaa, 0x19, 0x9e,
0x3d, 0x1c, 0x92, 0x23, 0x90, 0x0e, 0x93, 0xb4, 0x28, 0x52, 0x38, 0xa1, 0x01, 0xed, 0x89, 0x4b,
0x8b, 0x6d, 0xab, 0x86, 0x92, 0x1f, 0xc1, 0xa8, 0x3b, 0x26, 0xa6, 0x86, 0x93, 0x4a, 0x1e, 0x4b,
0x41, 0xb7, 0xf2, 0x77, 0x89, 0xba, 0xc0, 0xba, 0x87, 0x1b, 0xe7, 0x10, 0xcd, 0x6f, 0xcb, 0x9d,
0x9e, 0x92, 0x3b, 0xca, 0x69, 0xd7, 0x1e, 0x51, 0xb5, 0xe5, 0xf9, 0xaf, 0x0a, 0xa2, 0xd9, 0x48,
0x41, 0x1c, 0x0b, 0x89, 0x64, 0xbc, 0xde, 0x6f, 0x1e, 0x93, 0x7f, 0xa1, 0x39, 0x8e, 0x70, 0x6b,
0x1c, 0x52, 0xf2, 0x7c, 0x6b, 0x8c, 0x66, 0xbd, 0xfe, 0x17, 0x47, 0x17, 0x36, 0x47, 0x17, 0x1a,
0xa3, 0x23, 0x1c, 0x4f, 0x9a, 0x1f, 0x9f, 0xf4, 0x1f, 0x4c, 0xb7, 0x53, 0x6f, 0x55, 0x66, 0xde,
0x4b, 0xd1, 0x9f, 0x08, 0xb0, 0xc9, 0x8e, 0x1e, 0x54, 0x19, 0xfc, 0xfe, 0xe5, 0x16, 0x88, 0x5d,
0x52, 0x32, 0x36, 0x79, 0x3d, 0x38, 0xf4, 0xa4, 0xb9, 0x2b, 0x2b, 0xa1, 0x3a, 0x51, 0xd8, 0x34,
0x80, 0xbc, 0x7e, 0x1f, 0x32, 0xae, 0x69, 0xf3, 0x78, 0xbd, 0x1e, 0x3f, 0xdb, 0x18, 0x21, 0x9d,
0xdb, 0x4a, 0xd8, 0x8b, 0xcd, 0x13, 0xee, 0x54, 0x82, 0xbe, 0x12, 0xe9, 0xa9, 0x6f, 0xf3, 0xc6,
0x1e, 0x92, 0x96, 0xf0, 0x4e, 0x2d, 0xf8, 0x69, 0xf7, 0x53, 0x48, 0x39, 0xfa, 0x0e, 0xd9, 0x5f,
0x10, 0xa1, 0xda, 0x13, 0x7d, 0x64, 0xdf, 0x86, 0xf6, 0x24, 0x7a, 0x2f, 0xbb, 0x6d, 0xb1, 0x59,
0x43, 0x06, 0xf4, 0x51, 0xd7, 0x71, 0x4e, 0xec, 0xa4, 0x38, 0x15, 0x27, 0x0b, 0x72, 0x48, 0x5a,
0x29, 0x39, 0x53, 0x74, 0xde, 0xdc, 0x7a, 0xda, 0xde, 0xb9, 0x82, 0x39, 0xea, 0xf5, 0x6a, 0xa1,
0xcb, 0xdb, 0xb9, 0xdc, 0xf7, 0x0b, 0xd3, 0x1c, 0x0a, 0xfc, 0x84, 0xb6, 0x06, 0x4b, 0x9d, 0x97,
0xd3, 0x46, 0x06, 0xf2, 0x2a, 0xe1, 0x0b, 0x5d, 0xf4, 0xbf, 0x67, 0x31, 0x58, 0x17, 0x32, 0x6b,
0xdf, 0x16, 0xc3, 0xe6, 0x7f, 0x41, 0xcc, 0x23, 0x75, 0xb4, 0xdf, 0xe2, 0xdf, 0x8f, 0xe9, 0xed,
0xcd, 0xc4, 0x56, 0x06, 0x5a, 0xe8, 0x24, 0xac, 0xec, 0x44, 0xce, 0xab, 0x54, 0x5b, 0xad, 0x6a,
0xfb, 0xe4, 0xa8, 0x37, 0xd8, 0x52, 0x23, 0xa1, 0xa1, 0x46, 0xd2, 0x7d, 0x6a, 0x24, 0xdd, 0xd6,
0x02, 0x82, 0x5a, 0xfc, 0xf8, 0xd9, 0x6a, 0xe4, 0x29, 0x00, 0xff, 0x2e, 0x35, 0xf2, 0x33, 0x11,
0xd0, 0x5f, 0x55, 0x24, 0xd9, 0xbf, 0xa0, 0x48, 0x44, 0x47, 0xdf, 0x12, 0x17, 0x1f, 0xe8, 0x2b,
0x60, 0x0f, 0x46, 0x08, 0x33, 0x4b, 0xe9, 0xf6, 0xe6, 0x2f, 0xb0, 0x79, 0xc0, 0x9c, 0xf5, 0x76,
0x6d, 0xfb, 0xaa, 0x0b, 0xbd, 0x30, 0xe5, 0xf3, 0x86, 0xf1, 0xbc, 0xbd, 0x23, 0xbb, 0xcd, 0x16,
0xdb, 0x16, 0x3a, 0x1c, 0x1c, 0xd6, 0xba, 0xe7, 0x71, 0x9c, 0xde, 0xb2, 0x56, 0x1c, 0xdd, 0x70,
0xd6, 0x0a, 0xfe, 0x28, 0x03, 0xd6, 0x22, 0x7f, 0x87, 0xb5, 0x6e, 0x02, 0x0a, 0x17, 0xe2, 0x15,
0xf5, 0x1c, 0xcb, 0xdb, 0xdb, 0xba, 0xaa, 0x23, 0x9b, 0xc8, 0xe6, 0x12, 0x94, 0x06, 0x2c, 0x5a,
0x6f, 0x9e, 0x42, 0xc9, 0x7b, 0xe3, 0xfc, 0xf5, 0x61, 0xcc, 0x98, 0x73, 0xa5, 0x71, 0x04, 0x71,
0x3d, 0x1e, 0x19, 0xd1, 0x6b, 0x01, 0x05, 0x39, 0xcf, 0x8b, 0x4e, 0x0e, 0xb1, 0x29, 0x5d, 0x0c,
0xd6, 0x12, 0x08, 0x55, 0xc2, 0x4c, 0x0e, 0x45, 0xe1, 0xe6, 0x3b, 0x5a, 0xca, 0x84, 0xe7, 0xb9,
0x88, 0x09, 0x1e, 0x1c, 0x5c, 0x55, 0xed, 0xb9, 0x63, 0x13, 0x06, 0x27, 0x4b, 0x97, 0xf4, 0xe5,
0xe8, 0x7b, 0xaf, 0xd7, 0xc9, 0xa5, 0x91, 0xf7, 0x24, 0x16, 0xbe, 0x10, 0xe2, 0xe1, 0x91, 0x5e,
0x2a, 0x67, 0xa1, 0x7c, 0x42, 0xdf, 0xc7, 0xff, 0xff, 0xf5, 0x7d, 0xd8, 0xd4, 0xf7, 0xe1, 0x73,
0xf5, 0x7d, 0x6c, 0x8e, 0x23, 0xfe, 0x77, 0xe9, 0xfb, 0x70, 0x14, 0x37, 0x47, 0x17, 0x6f, 0xe9,
0x7b, 0x92, 0x7d, 0xd7, 0xc6, 0x96, 0x57, 0xb4, 0xbd, 0xf7, 0x59, 0x6f, 0x80, 0x0d, 0xa2, 0x3d,
0xdb, 0xa0, 0x52, 0xad, 0x52, 0xe0, 0x4f, 0x5d, 0xdb, 0x33, 0xe4, 0x5a, 0x4f, 0xe6, 0x89, 0xad,
0xaf, 0xdc, 0xd7, 0x87, 0x85, 0xe5, 0xdc, 0xbe, 0x6a, 0x66, 0xc2, 0x60, 0xe0, 0x19, 0x78, 0x68,
0x2b, 0x3b, 0x9a, 0xd2, 0xb7, 0x8f, 0xa7, 0xcc, 0xa6, 0xbd, 0xbf, 0xa6, 0x83, 0xa5, 0xdf, 0xbd,
0x91, 0x4a, 0x8d, 0x9d, 0xbd, 0x1b, 0x45, 0xd5, 0x27, 0x3f, 0x82, 0xe9, 0x54, 0x8a, 0x70, 0xa1,
0xff, 0xf4, 0xf5, 0x55, 0x53, 0xb6, 0x77, 0x1d, 0xe3, 0xa3, 0x01, 0xbb, 0x66, 0x0b, 0x96, 0x51,
0x74, 0xe4, 0xd5, 0x13, 0x67, 0x6a, 0x0c, 0x06, 0x2a, 0x98, 0xf4, 0x88, 0x3d, 0x1d, 0x3e, 0xda,
0x54, 0xa1, 0xc7, 0x68, 0x6b, 0xeb, 0x37, 0x7a, 0x7c, 0xeb, 0x37, 0x12, 0x9f, 0x11, 0x7d, 0xce,
0xd6, 0xaf, 0x9e, 0xd9, 0x76, 0x78, 0xbc, 0xfa, 0xb6, 0xb8, 0x38, 0x75, 0x62, 0x8c, 0x51, 0x7f,
0x00, 0x7d, 0xa0, 0xec, 0x16, 0x7e, 0xdb, 0xfa, 0xc9, 0x2e, 0xaa, 0xbb, 0x34, 0x54, 0x47, 0x6e,
0x16, 0x19, 0x7b, 0xc5, 0xea, 0x90, 0xa2, 0x02, 0x90, 0x2f, 0xc5, 0x97, 0x19, 0x13, 0x78, 0xa0,
0x51, 0x83, 0x12, 0xf6, 0xac, 0x81, 0x71, 0xac, 0x48, 0xf1, 0x86, 0x9f, 0x6c, 0x4c, 0x54, 0xd7,
0x97, 0x89, 0xe5, 0x1d, 0xff, 0x87, 0x5d, 0xac, 0xea, 0xfa, 0x15, 0x9d, 0xdc, 0x44, 0xf0, 0x15,
0xe4, 0x72, 0xd0, 0x55, 0x51, 0x8b, 0x45, 0x5b, 0x1b, 0xba, 0xea, 0xab, 0xf1, 0x5b, 0x78, 0x69,
0x6c, 0x8a, 0x37, 0xe7, 0x52, 0xb0, 0x9e, 0x43, 0xc7, 0x12, 0x12, 0x75, 0x89, 0xd4, 0xfe, 0x3f,
0x9a, 0x97, 0xfa, 0x04, 0xb9, 0xef, 0x1b, 0x83, 0xd2, 0xfb, 0xdc, 0x8f, 0x51, 0x29, 0x37, 0x50,
0x90, 0xa9, 0x73, 0x0e, 0xc9, 0x16, 0x12, 0x9a, 0x4d, 0x77, 0x3f, 0x41, 0x21, 0x5a, 0x9b, 0xc8,
0xa0, 0xeb, 0xba, 0x4f, 0x4d, 0xc0, 0x18, 0xff, 0x66, 0xcf, 0x58, 0xaa, 0x3e, 0x2d, 0x03, 0x7f,
0xbb, 0xe3, 0x7a, 0x2d, 0x05, 0xc7, 0xa1, 0x6f, 0x7c, 0x0c, 0xb6, 0xa8, 0xb7, 0xfb, 0xd4, 0x6a,
0x18, 0x6b, 0xa1, 0xd7, 0x6f, 0xb3, 0x2b, 0xa3, 0x1e, 0x6b, 0x18, 0x3d, 0x43, 0x44, 0x24, 0x07,
0x26, 0x1c, 0xc7, 0xe6, 0x6c, 0xf3, 0xad, 0xe9, 0xa6, 0xc9, 0xc1, 0x79, 0xea, 0x03, 0x04, 0x52,
0x48, 0x0e, 0x76, 0xbe, 0x10, 0x3c, 0x2c, 0x20, 0xe0, 0x0e, 0x88, 0x36, 0x3b, 0x43, 0xd1, 0x7a,
0x2d, 0x1e, 0xf4, 0x25, 0x46, 0xa7, 0xfa, 0x1a, 0x49, 0xb4, 0x25, 0x50, 0x51, 0x41, 0x7c, 0x9a,
0x79, 0x27, 0x77, 0x2f, 0xdc, 0x44, 0x7d, 0xa9, 0x45, 0x9e, 0x9f, 0x70, 0x36, 0x7b, 0xe1, 0x51,
0x87, 0x9b, 0xed, 0x79, 0xce, 0x66, 0xe6, 0x44, 0xeb, 0x33, 0x78, 0xb4, 0xa0, 0x7f, 0x69, 0x6a,
0x92, 0x4b, 0x33, 0x85, 0x16, 0x54, 0x93, 0x7f, 0x0a, 0x42, 0x8b, 0x9d, 0xea, 0x13, 0x0a, 0x10,
0x3e, 0xbd, 0x9d, 0x61, 0xd0, 0xe2, 0xec, 0xbf, 0x2e, 0xa9, 0x0f, 0x72, 0x88, 0x0f, 0xb8, 0x6f,
0x7f, 0x00, 0xa7, 0xd3, 0x1b, 0x74, 0x5f, 0x65, 0xf4, 0x39, 0x69, 0x71, 0x35, 0xb0, 0x2a, 0x1e,
0x65, 0xed, 0xde, 0x58, 0x9f, 0xd8, 0xd8, 0xd6, 0x60, 0x83, 0xa3, 0xa3, 0xed, 0x2f, 0xe1, 0x88,
0xcf, 0x06, 0x70, 0xb9, 0x34, 0xf4, 0x20, 0x03, 0xdf, 0x36, 0x16, 0x59, 0x94, 0x8c, 0x1e, 0x57,
0x57, 0x85, 0x5e, 0x02, 0x69, 0x66, 0x4b, 0x30, 0xbd, 0xad, 0x79, 0x9a, 0xc2, 0xf0, 0xe0, 0xf5,
0xd0, 0xff, 0xd9, 0x54, 0x9b, 0xcb, 0x3e, 0x50, 0x6a, 0xc4, 0x11, 0x28, 0xae, 0x86, 0x48, 0x74,
0x04, 0xe5, 0x14, 0xc2, 0x83, 0x8a, 0x1c, 0x28, 0x35, 0x73, 0xee, 0x35, 0x59, 0x46, 0xbb, 0x32,
0xe0, 0x9d, 0xf8, 0xea, 0x78, 0xbe, 0x2b, 0x97, 0x2a, 0x89, 0x53, 0xec, 0x48, 0xf5, 0x3c, 0xfa,
0x93, 0xef, 0x6d, 0xa0, 0x80, 0xd9, 0xfa, 0xe8, 0xe8, 0x66, 0xb7, 0xe9, 0x9e, 0x2f, 0x0e, 0x3c,
0x47, 0x9e, 0x88, 0x96, 0xb6, 0x29, 0x12, 0x1e, 0x91, 0xe7, 0xdb, 0x9c, 0x2f, 0x3e, 0x18, 0xb6,
0x3b, 0x60, 0x1e, 0xeb, 0x3f, 0x5e, 0xd1, 0x54, 0x69, 0xe2, 0xfb, 0x58, 0x52, 0x96, 0xec, 0x80,
0x32, 0x14, 0xf3, 0x96, 0x3c, 0x79, 0xa6, 0x98, 0x36, 0xac, 0x33, 0xfd, 0x99, 0x87, 0xbd, 0x06,
0x9b, 0x18, 0x89, 0x28, 0xf1, 0xe4, 0xb1, 0x24, 0x4b, 0xba, 0xa5, 0xbb, 0xb2, 0xcf, 0x2c, 0xde,
0x65, 0x42, 0xe1, 0xc1, 0x6e, 0x9f, 0xa9, 0xa2, 0xf1, 0x8a, 0xeb, 0x66, 0xc3, 0x9d, 0xce, 0xe4,
0x09, 0x25, 0x43, 0x90, 0xa2, 0xae, 0xd7, 0xdb, 0x5f, 0x57, 0x2a, 0xbc, 0x66, 0xd5, 0xbe, 0xef,
0x57, 0x1f, 0x6c, 0x32, 0xeb, 0xd2, 0x89, 0xa2, 0x66, 0xd5, 0x6d, 0xd2, 0xd8, 0x3a, 0x3b, 0x57,
0x7d, 0xf5, 0x4f, 0x0a, 0x8c, 0xa4, 0xda, 0xe8, 0xd0, 0x11, 0x85, 0xa6, 0x2c, 0xa3, 0x2f, 0x7b,
0x83, 0x35, 0x46, 0x0f, 0xd5, 0x57, 0x84, 0xbc, 0xdb, 0x62, 0xc3, 0x8c, 0xd7, 0x65, 0xb1, 0x19,
0xc3, 0x1d, 0xab, 0x5d, 0xb4, 0xf0, 0x5e, 0x9c, 0xec, 0x23, 0xc6, 0x68, 0x54, 0x63, 0xf2, 0x4b,
0xfc, 0xb9, 0xf7, 0x60, 0x86, 0xc4, 0xe4, 0xa6, 0xde, 0x66, 0xe3, 0x6c, 0x3b, 0x56, 0xc2, 0xa9,
0x12, 0x74, 0xf1, 0x43, 0x14, 0x5e, 0x93, 0x53, 0x15, 0x4d, 0x3d, 0x0a, 0x18, 0xe8, 0xa3, 0x45,
0xfa, 0x74, 0x1d, 0xa4, 0x85, 0x4c, 0x6d, 0x36, 0xb0, 0x38, 0x9a, 0x3e, 0x93, 0xa1, 0x91, 0xea,
0xef, 0x20, 0x89, 0x7d, 0x12, 0x35, 0x98, 0x3a, 0x86, 0x13, 0xed, 0x0b, 0xe1, 0x64, 0xec, 0x81,
0xce, 0xf2, 0xa8, 0xbf, 0xa2, 0xa1, 0xe3, 0x39, 0xe5, 0x16, 0x09, 0x48, 0x5b, 0x92, 0xc2, 0xd2,
0xc2, 0x45, 0xf5, 0x4a, 0xe5, 0x08, 0x25, 0xc2, 0x11, 0x71, 0xf4, 0xf9, 0xac, 0xeb, 0x27, 0xa3,
0x87, 0x92, 0xbf, 0xcf, 0xba, 0x5d, 0x1d, 0xa4, 0xa0, 0xa4, 0x24, 0x47, 0xb9, 0x8d, 0xa2, 0xad,
0x72, 0x88, 0x3e, 0x75, 0xb2, 0xd8, 0xbb, 0x64, 0x5b, 0x1b, 0x55, 0x9e, 0xb5, 0x82, 0xac, 0x8e,
0xe0, 0xd0, 0xe8, 0x60, 0xd6, 0x6b, 0x13, 0x82, 0x11, 0x21, 0xf4, 0xba, 0xcc, 0x74, 0xbc, 0xbc,
0x97, 0x6c, 0xd7, 0x3b, 0x93, 0x91, 0xd0, 0xca, 0x19, 0x33, 0x5f, 0x7f, 0x68, 0x86, 0x47, 0x59,
0xd3, 0x23, 0x27, 0x7f, 0xb0, 0x0e, 0x78, 0x78, 0xea, 0xc5, 0x18, 0x65, 0xf3, 0x08, 0x39, 0xab,
0xaf, 0xd6, 0xc8, 0x3e, 0x1a, 0x07, 0x2d, 0x7b, 0x7d, 0x56, 0x1d, 0xbf, 0x96, 0x7f, 0x5a, 0x86,
0x3d, 0xd4, 0xa8, 0xd0, 0x94, 0xa0, 0x8e, 0x55, 0x12, 0xa1, 0xc8, 0xbf, 0x86, 0x21, 0xfd, 0x15,
0x4b, 0x61, 0xdd, 0x62, 0xf2, 0x24, 0xa5, 0x04, 0x20, 0x5d, 0x84, 0x9b, 0x82, 0xdd, 0x15, 0xec,
0x63, 0xc1, 0xde, 0x16, 0xec, 0x5d, 0xe1, 0xdb, 0x6f, 0x4c, 0xaf, 0xc5, 0xbe, 0x29, 0xfc, 0x6b,
0xd3, 0x1f, 0xd9, 0x22, 0x91, 0x37, 0x05, 0xbb, 0x81, 0xb7, 0x88, 0x36, 0x6f, 0x7c, 0x00, 0x7a,
0x53, 0x18, 0x01, 0xdb, 0x37, 0x74, 0x0e, 0x5d, 0xa9, 0xfb, 0x08, 0x14, 0x77, 0xe0, 0xab, 0xa4,
0x82, 0xe2, 0x8d, 0x66, 0xbc, 0xba, 0xf4, 0x94, 0x98, 0x1f, 0xd2, 0x51, 0xd5, 0x87, 0x49, 0xfd,
0x75, 0xd3, 0x3f, 0x4a, 0x9e, 0xdd, 0xbf, 0xe7, 0x31, 0x17, 0x1f, 0xfa, 0xa3, 0x2f, 0x7b, 0x37,
0xfe, 0x96, 0x46, 0x24, 0x0e, 0x6e, 0x8a, 0xbf, 0x4e, 0x21, 0x05, 0xb5, 0xf1, 0xd5, 0xaf, 0x03,
0xa7, 0x09, 0x58, 0x39, 0xb8, 0x71, 0x23, 0xfa, 0xce, 0x62, 0x24, 0xbf, 0xf5, 0xc4, 0x7d, 0xf1,
0x37, 0x64, 0x7c, 0x3f, 0x95, 0xdf, 0x6d, 0xf7, 0x84, 0xe3, 0x96, 0xac, 0xd7, 0x89, 0x8b, 0xb9,
0xf9, 0xd5, 0x41, 0x54, 0xb2, 0x75, 0x58, 0x49, 0xfa, 0x98, 0xfe, 0x32, 0x09, 0x7d, 0xc4, 0x1b,
0xca, 0xd4, 0xa3, 0x53, 0x64, 0x89, 0x43, 0x49, 0xc6, 0xe9, 0x0f, 0x95, 0xdc, 0x31, 0xe3, 0x63,
0xe5, 0xdb, 0x7f, 0x45, 0x86, 0xfe, 0x9a, 0x41, 0x36, 0x1c, 0x45, 0x63, 0x8f, 0xcb, 0xae, 0x1a,
0x1f, 0x51, 0x4d, 0xcc, 0x8f, 0xa8, 0xb2, 0x92, 0x51, 0xc8, 0x43, 0xfc, 0xed, 0x13, 0xfa, 0x2b,
0x33, 0x25, 0x19, 0x72, 0xf6, 0x02, 0x8b, 0xb5, 0xcb, 0xc1, 0x0f, 0xdb, 0x27, 0xf1, 0xb4, 0x41,
0x2c, 0x6e, 0xf0, 0xd1, 0xd5, 0x01, 0x80, 0xb0, 0xe2, 0x34, 0x20, 0x56, 0xa2, 0x2f, 0x88, 0x1a,
0x87, 0x2f, 0x83, 0xe9, 0xbd, 0x50, 0x3a, 0x43, 0xac, 0x89, 0x77, 0xf8, 0xd0, 0xa8, 0xf5, 0xe5,
0xbb, 0xb7, 0xe2, 0x23, 0xc6, 0xc8, 0x03, 0x1c, 0xba, 0x1f, 0x4f, 0x68, 0x57, 0xb8, 0xb6, 0x3f,
0x16, 0xfe, 0x1d, 0xfd, 0xbf, 0x5e, 0x3f, 0x6c, 0x1c, 0x17, 0x9c, 0x99, 0x63, 0x24, 0xbe, 0x25,
0xfe, 0x80, 0x9b, 0x05, 0xc2, 0x73, 0xa5, 0xff, 0xf2, 0x53, 0x95, 0x94, 0xd2, 0xce, 0x7f, 0x57,
0x30, 0xfb, 0x6d, 0xe1, 0x23, 0xb7, 0xc4, 0x54, 0x6d, 0xf1, 0x14, 0x7f, 0x00, 0xc0, 0x5d, 0xf8,
0x0b, 0x50, 0xab, 0x5b, 0x7d, 0xf9, 0xfa, 0x0b, 0xfa, 0xb6, 0xe4, 0x9c, 0x28, 0xd8, 0x95, 0x8c,
0xeb, 0x4f, 0xc4, 0x8b, 0xdc, 0x5e, 0xf7, 0x97, 0xe2, 0x45, 0x44, 0xa7, 0xfc, 0x5b, 0x91, 0xfe,
0x22, 0xbd, 0xf3, 0xef, 0x89, 0xee, 0xc1, 0x03, 0xff, 0x0d, 0xd8, 0x16, 0x4f, 0xe4, 0x58, 0x6e,
0x00, 0x00
};
// Autogenerated from wled00/data/rangetouch.js, do not edit!!
const uint16_t rangetouchJs_length = 1828;
const uint8_t rangetouchJs[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xb5, 0x58, 0xdf, 0x8f, 0xdb, 0xb8,
0x11, 0x7e, 0xcf, 0x5f, 0x21, 0xab, 0xad, 0x8f, 0xdc, 0xe5, 0xca, 0xf6, 0x02, 0x79, 0x91, 0xc3,
0x18, 0x69, 0x2e, 0x07, 0x14, 0xcd, 0x36, 0x45, 0x36, 0x87, 0x16, 0xf0, 0xf9, 0x41, 0x96, 0x68,
0x9b, 0x17, 0x99, 0xd4, 0x91, 0x94, 0x37, 0xc6, 0xae, 0xfe, 0xf7, 0xce, 0x90, 0x92, 0x2d, 0x67,
0xed, 0x24, 0x0f, 0xd7, 0x60, 0x21, 0x4b, 0xd4, 0x70, 0x38, 0x3f, 0xbe, 0xf9, 0x66, 0x94, 0xd1,
0x28, 0xe2, 0x7f, 0xda, 0xbf, 0x17, 0xa3, 0x51, 0x64, 0x32, 0xb5, 0x16, 0x4e, 0xd7, 0xf9, 0x26,
0xf9, 0xdd, 0x46, 0xbb, 0xdb, 0x64, 0x9c, 0x4c, 0x70, 0xfd, 0x2e, 0xfb, 0x2c, 0xd5, 0x3a, 0x7a,
0x25, 0x55, 0x55, 0xbb, 0xc8, 0xed, 0x2b, 0xc1, 0x63, 0x2f, 0x1b, 0xbf, 0x8e, 0x1e, 0xb4, 0xf9,
0x1c, 0x69, 0x15, 0xf9, 0x6d, 0x51, 0x21, 0x76, 0x32, 0x17, 0x16, 0x37, 0x6d, 0x9c, 0xab, 0x6c,
0x3a, 0x1a, 0xad, 0xa5, 0xdb, 0xd4, 0xcb, 0x24, 0xd7, 0xdb, 0x91, 0xcd, 0xb6, 0x95, 0x76, 0xce,
0x8e, 0x8e, 0x07, 0xa1, 0xe4, 0x7b, 0xd8, 0xa2, 0xac, 0x48, 0xa3, 0x4f, 0x1b, 0x11, 0xdd, 0xfd,
0xe3, 0x53, 0xb7, 0x10, 0x11, 0x78, 0xa0, 0x28, 0xf1, 0x27, 0xba, 0x39, 0x58, 0xd5, 0x2a, 0x77,
0x52, 0x2b, 0x22, 0x98, 0xa3, 0x8f, 0xb1, 0x5e, 0xfe, 0x2e, 0x72, 0x17, 0x73, 0x8e, 0x6e, 0xe9,
0x55, 0x24, 0xbe, 0x54, 0xda, 0x38, 0x3b, 0x1c, 0xc6, 0xb5, 0x2a, 0xc4, 0x4a, 0x2a, 0x51, 0xc4,
0x83, 0xee, 0xe5, 0x56, 0x17, 0x75, 0x29, 0x66, 0xe1, 0x27, 0x69, 0x45, 0xb9, 0x23, 0x34, 0x8d,
0x3b, 0xb5, 0x47, 0x4d, 0x61, 0xf7, 0x70, 0x18, 0x7e, 0x93, 0x6c, 0x5b, 0xcc, 0xc2, 0x2d, 0x89,
0x3f, 0xa2, 0xff, 0x9f, 0xd0, 0xff, 0x18, 0x8c, 0x48, 0x89, 0xe0, 0xe2, 0xe9, 0xc9, 0x8a, 0x72,
0x45, 0x93, 0xe3, 0x2b, 0xd4, 0xdb, 0x10, 0xb7, 0x91, 0x96, 0x91, 0x83, 0xd1, 0x60, 0x71, 0x0d,
0x91, 0xb1, 0xce, 0x48, 0xb0, 0x7a, 0xda, 0xad, 0x47, 0x22, 0xb8, 0xb3, 0xd2, 0x86, 0xec, 0x32,
0x13, 0x29, 0x3e, 0x9e, 0xaa, 0x57, 0x2e, 0x29, 0x85, 0x5a, 0xbb, 0xcd, 0x54, 0x5d, 0x5f, 0xd3,
0x47, 0x5c, 0x37, 0xdc, 0xcd, 0xd5, 0x62, 0x6a, 0x12, 0xa1, 0xea, 0xad, 0x30, 0xd9, 0xb2, 0x14,
0xbc, 0xff, 0xf0, 0xf4, 0x34, 0x98, 0x30, 0x03, 0xc9, 0x52, 0x2b, 0xb9, 0xae, 0xc3, 0xfb, 0xc1,
0x98, 0xc5, 0xbb, 0xac, 0xac, 0x45, 0x2c, 0x55, 0x64, 0x86, 0x43, 0x62, 0x92, 0x07, 0x23, 0x5d,
0xfb, 0x8e, 0xb2, 0x0f, 0x3e, 0x82, 0x49, 0xf0, 0xed, 0xdf, 0x46, 0x57, 0xc2, 0xb8, 0x3d, 0x98,
0x63, 0x92, 0xcf, 0x62, 0xcf, 0x0c, 0x6d, 0x9a, 0x83, 0x95, 0x0e, 0xad, 0x64, 0x8a, 0x3e, 0x1a,
0xe1, 0x6a, 0x03, 0xcf, 0x11, 0xa8, 0x14, 0xb3, 0x4b, 0x1a, 0x1c, 0x7b, 0xf4, 0x07, 0xa7, 0x8a,
0x1d, 0x4d, 0x4c, 0xc1, 0x9e, 0xbe, 0x7d, 0xf8, 0xdc, 0xd9, 0x03, 0xf7, 0x0d, 0x4d, 0xc5, 0xdc,
0x2d, 0x38, 0x6c, 0x39, 0x9e, 0xdb, 0x26, 0x3b, 0x44, 0xa6, 0x3d, 0x0d, 0x8c, 0xb3, 0x44, 0xd0,
0xa9, 0x5c, 0x91, 0x76, 0x05, 0x20, 0xf9, 0xe1, 0x41, 0x75, 0xe7, 0xdf, 0xef, 0xb7, 0x4b, 0x5d,
0xda, 0x2e, 0x6e, 0xdf, 0x92, 0x41, 0x35, 0x0e, 0x03, 0x03, 0xb1, 0x5c, 0xc9, 0xd2, 0x09, 0x43,
0x8e, 0x19, 0x73, 0x07, 0x6f, 0xcf, 0xaa, 0xf8, 0x59, 0xd8, 0xdc, 0xc8, 0xca, 0x41, 0xe2, 0xd0,
0xc6, 0x5e, 0x2e, 0x1a, 0x4a, 0x29, 0x53, 0x49, 0x55, 0xdb, 0x4d, 0x92, 0x55, 0x55, 0xb9, 0x27,
0x0a, 0xa3, 0xd9, 0x2a, 0x53, 0x47, 0xef, 0x60, 0xe7, 0x31, 0xf3, 0x86, 0x4f, 0xa6, 0xe6, 0x55,
0x66, 0xd6, 0xa0, 0x46, 0x39, 0xdb, 0x21, 0xc0, 0x74, 0x08, 0x90, 0x5c, 0xd5, 0x65, 0x39, 0xe0,
0x07, 0x89, 0xb9, 0x59, 0xcc, 0xfa, 0x0f, 0xe9, 0x63, 0x33, 0x35, 0x7f, 0xbb, 0x9d, 0xa9, 0x36,
0x2c, 0x44, 0x52, 0x06, 0x69, 0x4e, 0xe0, 0x80, 0x77, 0x59, 0xbe, 0xe9, 0x79, 0x06, 0x79, 0xc4,
0x84, 0x2a, 0x26, 0x01, 0x53, 0x14, 0xcc, 0x4d, 0xbf, 0xe3, 0xa1, 0x3d, 0x9b, 0x69, 0x29, 0x20,
0x80, 0xec, 0x7b, 0x5b, 0xc1, 0x0c, 0x9a, 0xf6, 0x6c, 0x3a, 0x67, 0x10, 0x84, 0xfa, 0x32, 0x94,
0xbe, 0x17, 0x7d, 0x09, 0xd1, 0x47, 0x27, 0xba, 0x00, 0x8b, 0x26, 0x84, 0xeb, 0x31, 0x2b, 0x8a,
0xb7, 0xf7, 0xf7, 0x08, 0x33, 0x20, 0xb2, 0xed, 0xf2, 0x3f, 0xb2, 0x70, 0x9b, 0x74, 0xf2, 0x92,
0x3d, 0x64, 0x2e, 0xdf, 0x20, 0xe2, 0x8e, 0x55, 0x58, 0x07, 0x9c, 0xb5, 0x1a, 0x7a, 0x45, 0xdb,
0xae, 0xbc, 0x31, 0x26, 0xdb, 0x27, 0x2b, 0xa3, 0xb7, 0xa4, 0xd0, 0xb9, 0x0f, 0x79, 0xf2, 0x47,
0x2d, 0xcc, 0xfe, 0x5e, 0x94, 0x60, 0x9c, 0x36, 0x6f, 0xca, 0x12, 0xbc, 0xa0, 0x89, 0x54, 0x79,
0x59, 0x17, 0x10, 0x18, 0x2c, 0x7f, 0xda, 0x24, 0x79, 0x06, 0x2f, 0x50, 0xb7, 0x37, 0x4a, 0xf3,
0x23, 0x89, 0x1d, 0x74, 0x87, 0xb4, 0x8a, 0x99, 0xc0, 0xea, 0x05, 0x7e, 0xa8, 0x51, 0x5f, 0x8a,
0xab, 0x0d, 0xcb, 0xf9, 0x29, 0xeb, 0x85, 0x2d, 0x83, 0x01, 0x01, 0x7a, 0x02, 0xe0, 0x0a, 0x28,
0x43, 0xeb, 0x32, 0x95, 0x23, 0x6d, 0xc1, 0x19, 0xac, 0xbc, 0x74, 0x00, 0xe7, 0xa2, 0x61, 0xd9,
0xb9, 0xb7, 0x1a, 0xee, 0x81, 0x5f, 0x43, 0x94, 0x1b, 0x66, 0xbf, 0x21, 0x73, 0x0f, 0xe4, 0xa5,
0xd6, 0x0d, 0x5b, 0x9d, 0x93, 0x09, 0x21, 0x92, 0xd6, 0xff, 0xc2, 0x7a, 0xc3, 0x36, 0xe7, 0xc4,
0x72, 0x70, 0xe4, 0x5f, 0xba, 0x10, 0xef, 0xa5, 0x45, 0x83, 0x0b, 0x6e, 0xd9, 0x9e, 0xaf, 0xd8,
0x92, 0x6f, 0xd8, 0xf6, 0x92, 0xfc, 0xbb, 0x52, 0x60, 0xc4, 0x41, 0x7c, 0x7d, 0x51, 0x64, 0x17,
0x04, 0xaa, 0x73, 0x02, 0x90, 0x01, 0xfa, 0xf4, 0x44, 0xac, 0xff, 0x59, 0xf9, 0xeb, 0x06, 0xae,
0x74, 0x38, 0x1c, 0x88, 0xb6, 0xce, 0x9e, 0x9e, 0x32, 0x58, 0x81, 0x85, 0x53, 0x92, 0x69, 0xdf,
0xf6, 0x90, 0xb2, 0x0b, 0x89, 0x00, 0xf2, 0x99, 0xbc, 0x3e, 0x30, 0x53, 0xff, 0x4c, 0x5c, 0x71,
0x3c, 0x8e, 0x31, 0x9b, 0x79, 0xe6, 0x50, 0xc9, 0x16, 0x01, 0x47, 0x46, 0x64, 0x96, 0xfe, 0x96,
0x90, 0xdf, 0x8a, 0x6b, 0x4a, 0x67, 0x70, 0x3f, 0x17, 0xef, 0x16, 0x64, 0x7e, 0x7d, 0xb3, 0x98,
0x85, 0xa5, 0xbf, 0x8e, 0xe8, 0xb4, 0xa3, 0xd7, 0xd9, 0x5d, 0xe6, 0x36, 0xb0, 0xef, 0x0b, 0x19,
0x33, 0xe2, 0xe6, 0x93, 0xc5, 0x0c, 0x2f, 0xad, 0x35, 0xe9, 0x98, 0xde, 0xc0, 0xe2, 0xed, 0x62,
0x76, 0x8d, 0x57, 0x78, 0xa4, 0xe9, 0x18, 0x1a, 0xce, 0x61, 0x7b, 0x95, 0x19, 0x2b, 0x7e, 0x29,
0x35, 0x9e, 0x9e, 0x38, 0xfd, 0x8b, 0xfc, 0x22, 0x0a, 0x28, 0xfa, 0x43, 0x85, 0x78, 0xe5, 0x46,
0x43, 0x9f, 0x24, 0x62, 0xe4, 0xe8, 0x95, 0x6b, 0x9e, 0x03, 0xff, 0x84, 0xfa, 0x81, 0x30, 0xc8,
0x29, 0x10, 0xc1, 0x7f, 0x00, 0xe1, 0x29, 0xfc, 0xa8, 0xdb, 0x18, 0xfd, 0x10, 0x29, 0xf1, 0x10,
0x7d, 0x82, 0x4e, 0xfa, 0xce, 0x18, 0xa8, 0xce, 0xf8, 0x6d, 0xa6, 0x94, 0x76, 0x11, 0x16, 0x42,
0x94, 0x45, 0x79, 0x99, 0x59, 0x1b, 0x65, 0xf0, 0x77, 0x38, 0x2c, 0x86, 0xe2, 0x0d, 0xdd, 0xd2,
0x51, 0xb6, 0x85, 0x78, 0xcd, 0xf0, 0x21, 0x11, 0x21, 0xe9, 0x5c, 0xa4, 0x85, 0xcf, 0x0c, 0x39,
0x59, 0x3d, 0x5f, 0x85, 0x98, 0x54, 0x50, 0xd1, 0x97, 0x84, 0x9d, 0xd5, 0xc9, 0x42, 0x62, 0x0e,
0x8d, 0xfa, 0xa0, 0x35, 0xb4, 0x25, 0x6e, 0xc8, 0x63, 0xc3, 0x24, 0x83, 0x8b, 0xa2, 0xcc, 0xbf,
0x90, 0x4a, 0x42, 0x33, 0x3f, 0x72, 0x37, 0x77, 0x50, 0x92, 0xf3, 0x47, 0x40, 0x47, 0x1a, 0x5b,
0x58, 0xab, 0x62, 0x16, 0x1a, 0xdd, 0xd7, 0x08, 0x50, 0x7c, 0xf2, 0x8c, 0xcb, 0x87, 0xc3, 0x9d,
0x96, 0x45, 0x34, 0x1e, 0xf0, 0x1e, 0x89, 0x4f, 0xfa, 0x24, 0x3e, 0x41, 0x12, 0x67, 0xda, 0x33,
0x3d, 0xf6, 0xb7, 0xca, 0x63, 0x15, 0xfd, 0x9f, 0x69, 0xfe, 0x43, 0x1c, 0xe4, 0x65, 0x45, 0xfa,
0x93, 0x9f, 0xf8, 0xe6, 0xfd, 0x89, 0x6f, 0xf1, 0x13, 0xc0, 0x64, 0x1b, 0x54, 0xcd, 0xc5, 0x22,
0x5d, 0x3e, 0xd3, 0x2a, 0x68, 0xba, 0x0f, 0xa1, 0xd6, 0x5c, 0x74, 0xfd, 0x70, 0x0b, 0x11, 0xad,
0x88, 0xa6, 0xb4, 0x47, 0x26, 0x53, 0xf4, 0x30, 0x3f, 0x09, 0x17, 0x5a, 0x1b, 0xf2, 0x94, 0x27,
0x9e, 0x5f, 0x43, 0x18, 0x4a, 0x8e, 0x68, 0xb8, 0xab, 0x5d, 0x86, 0xc1, 0xf9, 0xb0, 0xb4, 0xc2,
0xec, 0x4e, 0x9a, 0x2c, 0x20, 0xab, 0x67, 0x81, 0xba, 0xd0, 0xad, 0xfa, 0x22, 0x09, 0xd0, 0xba,
0x28, 0x90, 0x42, 0xec, 0x05, 0x69, 0xd4, 0x33, 0x1c, 0xd6, 0xd0, 0x75, 0xd1, 0x1e, 0x34, 0xc0,
0xc1, 0x7d, 0xee, 0x7b, 0x84, 0xff, 0x9b, 0x96, 0x89, 0x0e, 0xa6, 0x1c, 0x23, 0xb9, 0xd4, 0xc5,
0x9e, 0x3d, 0xe6, 0x1b, 0x59, 0x16, 0x48, 0x4d, 0xd8, 0x35, 0x6c, 0xbd, 0x74, 0x46, 0x84, 0xd9,
0xa4, 0x43, 0x80, 0x86, 0xa2, 0xac, 0x7a, 0xc7, 0xf5, 0x58, 0xd6, 0x9f, 0x83, 0xb5, 0x82, 0x87,
0x34, 0x2c, 0x80, 0x44, 0x28, 0x9c, 0x08, 0x8a, 0x98, 0x41, 0xfb, 0x4a, 0x9f, 0xf5, 0x95, 0x58,
0x2b, 0x3f, 0x4c, 0x43, 0x11, 0x19, 0x87, 0x53, 0xda, 0xc1, 0x9c, 0xee, 0xa6, 0xa5, 0xbe, 0xa6,
0x59, 0x30, 0xc8, 0x4a, 0x8b, 0x3c, 0x44, 0xe5, 0x33, 0xe0, 0x41, 0x4f, 0x4f, 0xda, 0xd3, 0x4e,
0x61, 0x9d, 0x84, 0x3e, 0xf8, 0x55, 0x05, 0x25, 0xd6, 0xed, 0x61, 0x14, 0x86, 0x99, 0xd4, 0x04,
0xfc, 0xf0, 0x58, 0x69, 0x25, 0x62, 0x76, 0x46, 0xe8, 0x41, 0x2c, 0xff, 0x29, 0xdd, 0xaf, 0x3f,
0x22, 0xea, 0xdd, 0x79, 0xe3, 0x2d, 0xe2, 0xf1, 0x36, 0x53, 0xb2, 0xaa, 0xcb, 0x2c, 0x54, 0x79,
0x10, 0x2f, 0x21, 0xb8, 0x42, 0x09, 0x98, 0x0b, 0x70, 0x04, 0xbd, 0x50, 0x98, 0x3c, 0x74, 0xcf,
0x2e, 0x88, 0x90, 0x6a, 0x67, 0xf4, 0xfe, 0xff, 0xe0, 0xf2, 0x0f, 0xba, 0xfb, 0x7d, 0x57, 0xcf,
0xb8, 0x37, 0xb9, 0xec, 0x1e, 0x16, 0xd1, 0xd1, 0xbd, 0xc3, 0x9e, 0x4b, 0x64, 0xe2, 0x7c, 0x3c,
0x98, 0x82, 0x21, 0x21, 0x06, 0xcf, 0x7c, 0xaf, 0x7b, 0xdf, 0x6e, 0x8a, 0xd3, 0xd8, 0x88, 0xad,
0xde, 0x89, 0xd3, 0xd5, 0xe9, 0x3c, 0xee, 0x21, 0x8b, 0x85, 0x07, 0x14, 0xeb, 0xee, 0x85, 0x2a,
0xe2, 0xc5, 0x99, 0xfa, 0x11, 0x3e, 0xa8, 0xc1, 0x64, 0x98, 0x0e, 0x01, 0xd0, 0xe7, 0xc0, 0x0e,
0x31, 0x10, 0xd8, 0xda, 0x1a, 0x18, 0x31, 0x27, 0x27, 0x80, 0x07, 0x9c, 0x9f, 0x73, 0x03, 0xfb,
0xc5, 0x21, 0x59, 0xf0, 0xb1, 0xb2, 0x46, 0xaa, 0xfe, 0x9a, 0x52, 0x60, 0x4c, 0x06, 0xe2, 0x01,
0x8b, 0x41, 0x09, 0x93, 0x70, 0x9b, 0x6f, 0x30, 0x66, 0x85, 0x0f, 0x9a, 0xb0, 0xf3, 0xf1, 0x82,
0xd5, 0xbc, 0xd7, 0xdc, 0x0c, 0x0e, 0x85, 0x6f, 0x1c, 0x4c, 0x25, 0xcb, 0xda, 0xc1, 0xd7, 0xd9,
0x56, 0x02, 0xcc, 0x80, 0x30, 0xc7, 0x40, 0xa1, 0xdf, 0x12, 0xcb, 0xbe, 0x78, 0xb1, 0xc9, 0x18,
0x3e, 0x48, 0xbe, 0x25, 0x08, 0xb1, 0xac, 0x82, 0x24, 0x0c, 0x56, 0xfe, 0xe5, 0xdf, 0xb1, 0x69,
0xc2, 0x0c, 0xf4, 0xb6, 0x94, 0x10, 0x9f, 0x8f, 0x38, 0xd1, 0x52, 0x18, 0xab, 0x40, 0xd3, 0xa8,
0x4c, 0x1e, 0x70, 0xc0, 0xbc, 0x3a, 0xc1, 0xe1, 0x71, 0xf0, 0x1c, 0xdd, 0xd2, 0x11, 0x88, 0x75,
0x2d, 0x7a, 0xfc, 0x9a, 0xa8, 0xd3, 0x6d, 0x32, 0xc9, 0xbd, 0xd2, 0xff, 0xde, 0x94, 0xd0, 0x2f,
0x56, 0xd0, 0x4e, 0x67, 0xf0, 0x31, 0x98, 0x82, 0xcc, 0x2b, 0x05, 0x40, 0xf6, 0xd2, 0x94, 0xbd,
0x1c, 0xbf, 0x56, 0x33, 0x75, 0xc3, 0x09, 0x3c, 0xdd, 0xdc, 0x5e, 0x29, 0x7a, 0x95, 0xa5, 0x2f,
0x5b, 0x89, 0x6b, 0x7e, 0x7b, 0x45, 0xd4, 0xcd, 0xcb, 0x31, 0x2c, 0x52, 0x56, 0x5f, 0xef, 0x88,
0xc2, 0x23, 0xaf, 0x88, 0xbe, 0xa9, 0x29, 0xf2, 0x5f, 0x97, 0x23, 0x7b, 0x3e, 0x47, 0xbd, 0x62,
0x5a, 0x87, 0x61, 0xa8, 0x4b, 0x46, 0x52, 0x48, 0xdb, 0x95, 0x99, 0x48, 0x2a, 0x23, 0x10, 0x6b,
0x3f, 0x8b, 0x55, 0x56, 0x97, 0x18, 0x80, 0x83, 0x98, 0xd7, 0xe9, 0xc1, 0x8a, 0xc1, 0x02, 0x1d,
0xec, 0xd9, 0xd4, 0x80, 0x83, 0x6b, 0xd7, 0x22, 0x91, 0x32, 0x3d, 0x6c, 0x09, 0x7c, 0x30, 0x2e,
0xeb, 0x25, 0x9c, 0x60, 0x3d, 0xdb, 0x4e, 0x05, 0x9e, 0x58, 0x61, 0x1f, 0x09, 0xef, 0x81, 0x54,
0x1b, 0x72, 0x80, 0xc6, 0x11, 0xc1, 0x30, 0x94, 0xc2, 0x2a, 0x74, 0xb9, 0x59, 0x1c, 0xb0, 0x12,
0x23, 0x3b, 0x42, 0xeb, 0x8b, 0x11, 0x92, 0x0b, 0xf0, 0x41, 0x40, 0xc7, 0xa8, 0x8c, 0x76, 0x1a,
0xa5, 0x98, 0x86, 0x38, 0xf8, 0x35, 0x08, 0x07, 0x73, 0x2d, 0xe8, 0x34, 0xcb, 0x1b, 0xe2, 0xfb,
0xc2, 0x8b, 0xd1, 0xe8, 0x2f, 0x91, 0xd5, 0xb5, 0xc9, 0xc5, 0x1d, 0x7c, 0xb9, 0x41, 0xa2, 0x7f,
0xfd, 0xf8, 0x9e, 0x9f, 0xfc, 0xef, 0x0a, 0xf2, 0xff, 0x8b, 0xff, 0x01, 0x4a, 0x13, 0x82, 0xa3,
0xc1, 0x11, 0x00, 0x00
};

View File

@ -980,227 +980,224 @@ const uint8_t PAGE_settings_dmx[] PROGMEM = {
// Autogenerated from wled00/data/settings_ui.htm, do not edit!!
const uint16_t PAGE_settings_ui_length = 3501;
const uint16_t PAGE_settings_ui_length = 3448;
const uint8_t PAGE_settings_ui[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x5a, 0x6b, 0x77, 0xdb, 0x36,
0xb6, 0xfd, 0xae, 0x5f, 0x81, 0xa0, 0x5d, 0xae, 0xb8, 0xcc, 0xd0, 0xb2, 0xdb, 0xbb, 0x26, 0x91,
0x44, 0x69, 0x62, 0x27, 0x4d, 0x3c, 0xcb, 0x6d, 0x32, 0x51, 0x3c, 0x9d, 0x59, 0x99, 0x2c, 0x97,
0x22, 0x21, 0x09, 0x09, 0x45, 0x70, 0x08, 0xd0, 0x8f, 0xab, 0xea, 0xbf, 0xcf, 0x3e, 0x00, 0x49,
0x51, 0xf2, 0x23, 0x6e, 0xee, 0xfd, 0x62, 0x91, 0x78, 0x9c, 0x37, 0xf6, 0x39, 0x07, 0xf4, 0xf0,
0xc9, 0xcb, 0xb7, 0x27, 0x1f, 0xfe, 0xf5, 0xee, 0x15, 0x5b, 0x98, 0x65, 0x3a, 0x1a, 0xd2, 0x5f,
0x96, 0x46, 0xd9, 0x3c, 0xe4, 0x22, 0xe3, 0x78, 0x17, 0x51, 0x32, 0x1a, 0x2e, 0x85, 0x89, 0x58,
0xbc, 0x88, 0x0a, 0x2d, 0x4c, 0xc8, 0x4b, 0x33, 0x7b, 0xfa, 0x8c, 0x57, 0xa3, 0x9d, 0x58, 0x65,
0x46, 0x64, 0x18, 0xbe, 0x92, 0x89, 0x59, 0x84, 0x89, 0xb8, 0x94, 0xb1, 0x78, 0x6a, 0x5f, 0x7c,
0x99, 0x49, 0x23, 0xa3, 0xf4, 0xa9, 0x8e, 0xa3, 0x54, 0x84, 0x87, 0xfe, 0x32, 0xba, 0x96, 0xcb,
0x72, 0xd9, 0xbc, 0x97, 0x5a, 0x14, 0xf6, 0x25, 0x9a, 0xe2, 0x3d, 0x53, 0x9c, 0x75, 0xb2, 0x68,
0x29, 0x42, 0x7e, 0x29, 0xc5, 0x55, 0xae, 0x0a, 0x03, 0x2e, 0x46, 0x9a, 0x54, 0x8c, 0xce, 0x4f,
0xd9, 0x44, 0x18, 0x23, 0xb3, 0xb9, 0x1e, 0x1e, 0xb8, 0xa1, 0xa1, 0x8e, 0x0b, 0x99, 0x9b, 0x51,
0xe7, 0x32, 0x2a, 0x58, 0xaa, 0x62, 0x99, 0xd7, 0xfc, 0x2e, 0x12, 0xdd, 0x3c, 0x6a, 0xb3, 0x79,
0x2c, 0x7d, 0x95, 0x26, 0xe7, 0x45, 0xea, 0x1b, 0xb9, 0x14, 0xaa, 0x34, 0x7e, 0x12, 0x26, 0x2a,
0x2e, 0x97, 0x10, 0xdf, 0x07, 0x81, 0xf0, 0xc9, 0x21, 0xfd, 0xe4, 0x85, 0x32, 0x2a, 0xe4, 0x0b,
0x63, 0xf2, 0x3e, 0xf7, 0xa1, 0xb1, 0x09, 0xb3, 0x32, 0x4d, 0xfd, 0x34, 0x5c, 0xc5, 0x6a, 0x99,
0xf7, 0x57, 0x90, 0x56, 0xa4, 0xba, 0xcf, 0x27, 0x0b, 0x75, 0xc5, 0xa6, 0xa5, 0x31, 0x2a, 0x63,
0x6e, 0x8c, 0xfb, 0xb1, 0x4a, 0x55, 0xa1, 0xfb, 0xab, 0xb3, 0x17, 0xc7, 0xaf, 0xce, 0xfa, 0xfc,
0x84, 0x5e, 0x99, 0x16, 0xa9, 0x88, 0x8d, 0xc4, 0x32, 0x98, 0x6c, 0xa1, 0x12, 0xac, 0xcb, 0x65,
0xfc, 0x45, 0x14, 0xf5, 0x82, 0xdf, 0x16, 0x42, 0xa4, 0xdc, 0x2f, 0xe6, 0xd3, 0x3e, 0x7f, 0xff,
0xfa, 0x98, 0xe9, 0x54, 0x26, 0xa2, 0xc0, 0xb2, 0xff, 0x94, 0x58, 0xd7, 0xe7, 0x7f, 0xa7, 0x1f,
0x16, 0xb7, 0x88, 0x29, 0x9a, 0x5d, 0x88, 0xeb, 0x3e, 0x7f, 0xf3, 0xea, 0x9f, 0xd5, 0x8c, 0xcc,
0xf2, 0xd2, 0xf0, 0xb5, 0x9f, 0xc7, 0xcb, 0xa9, 0x32, 0xb5, 0x7c, 0x0a, 0xf2, 0x2d, 0x99, 0x89,
0xa6, 0x6c, 0x1a, 0xd1, 0x1a, 0xf6, 0xee, 0x84, 0x2d, 0x55, 0x22, 0x48, 0x86, 0xa4, 0x5a, 0x94,
0x17, 0x02, 0x7a, 0xb2, 0xd3, 0x97, 0x9a, 0x14, 0x9e, 0xa7, 0x22, 0xc3, 0x04, 0x06, 0xf0, 0x4c,
0xc6, 0x61, 0x18, 0x98, 0x9b, 0x05, 0x36, 0x6b, 0x83, 0x78, 0x60, 0x6a, 0xc6, 0xb4, 0x51, 0x39,
0x3b, 0x7b, 0xf5, 0xd2, 0xae, 0xcf, 0xaf, 0xa0, 0xc9, 0x1b, 0x88, 0xdc, 0x6c, 0xc8, 0xd5, 0x95,
0x28, 0xd8, 0x5e, 0xb4, 0xcc, 0x07, 0x6c, 0x5a, 0xc8, 0xf9, 0xc2, 0x64, 0x42, 0x3b, 0xe2, 0xe2,
0x1a, 0x66, 0x7d, 0x91, 0x5e, 0x45, 0x37, 0x9a, 0xe1, 0x39, 0xca, 0x12, 0x36, 0x93, 0x85, 0x6e,
0x98, 0xc1, 0x86, 0x1a, 0xc6, 0x7d, 0x95, 0x51, 0x4c, 0xb0, 0xb8, 0xd4, 0x24, 0xfe, 0xc9, 0x64,
0x02, 0x75, 0x13, 0xec, 0xd9, 0x9d, 0x79, 0xa3, 0x60, 0x2b, 0xa2, 0x95, 0x4a, 0x8d, 0xbd, 0xb3,
0xeb, 0x44, 0xcc, 0xfa, 0xfc, 0x5c, 0x0b, 0x26, 0x66, 0x33, 0x18, 0x8a, 0xe1, 0x3d, 0x2a, 0x53,
0x88, 0x14, 0x15, 0x08, 0x2d, 0x63, 0xcd, 0xaa, 0xa0, 0xdf, 0x3b, 0x2b, 0x62, 0xe5, 0xbe, 0xca,
0x00, 0xea, 0x52, 0x14, 0x05, 0xe9, 0x31, 0x83, 0x39, 0xdf, 0x66, 0x58, 0x38, 0x9b, 0x3d, 0x66,
0xe5, 0x6c, 0xc6, 0x7d, 0x99, 0x68, 0x04, 0x2c, 0xec, 0x86, 0xbf, 0xd5, 0x2a, 0xcd, 0xa6, 0x37,
0x30, 0x2a, 0x5c, 0x62, 0x16, 0x62, 0x29, 0xfa, 0xab, 0x28, 0xcd, 0x17, 0x51, 0x7f, 0x35, 0x9d,
0xf7, 0xf9, 0x71, 0x14, 0x7f, 0x99, 0x17, 0xaa, 0x84, 0xfa, 0x2a, 0x8f, 0x62, 0x69, 0x6e, 0xb8,
0x0f, 0x27, 0x61, 0xc2, 0xf1, 0xa9, 0x07, 0xd7, 0x3e, 0x56, 0xaf, 0xca, 0x22, 0xc5, 0xcc, 0x6b,
0x26, 0x97, 0xd1, 0x5c, 0xb0, 0xf3, 0xf7, 0x67, 0x08, 0x96, 0x0c, 0xde, 0x7b, 0x0f, 0xf3, 0xc1,
0x08, 0xf5, 0x8c, 0x1d, 0x7d, 0x5d, 0xc0, 0x1c, 0x74, 0xc0, 0xfa, 0xbc, 0x79, 0xb4, 0x13, 0xc7,
0x69, 0x09, 0x3f, 0xd1, 0x5f, 0x50, 0xb5, 0x21, 0x53, 0x89, 0xf2, 0x9a, 0x35, 0x41, 0xc4, 0xd7,
0xeb, 0xf5, 0x60, 0x56, 0x66, 0x2e, 0x5c, 0xe7, 0xa7, 0x49, 0x57, 0x78, 0xab, 0x42, 0x98, 0xb2,
0xc8, 0x58, 0x12, 0xcc, 0x85, 0x79, 0x95, 0x0a, 0xf2, 0xd2, 0xf1, 0x8d, 0x9d, 0x5a, 0x37, 0x4b,
0x8d, 0x9a, 0x23, 0x6e, 0x68, 0xb5, 0xdb, 0x14, 0xc4, 0x69, 0xa4, 0xf5, 0x19, 0x9c, 0x12, 0x54,
0x53, 0x7c, 0x01, 0x7b, 0x71, 0xcf, 0xa7, 0x79, 0xfe, 0xab, 0xe2, 0xfb, 0x0f, 0x2c, 0xda, 0xd0,
0x95, 0xfa, 0xed, 0xf4, 0x33, 0xfc, 0xd8, 0x92, 0x43, 0xec, 0xed, 0x71, 0x65, 0x07, 0x79, 0x18,
0x9a, 0x9b, 0x5c, 0x20, 0x1e, 0x31, 0xf6, 0xe4, 0x45, 0x01, 0x75, 0x03, 0xa9, 0xed, 0xef, 0x96,
0x70, 0xf0, 0x45, 0x57, 0xf8, 0xc6, 0x57, 0xde, 0x0a, 0xfe, 0xea, 0x5a, 0xc0, 0x08, 0x8d, 0x9f,
0x85, 0x22, 0xd0, 0x79, 0x2a, 0x4d, 0x97, 0x5f, 0x40, 0x30, 0x19, 0x66, 0x81, 0x8b, 0x74, 0x5f,
0x87, 0xbd, 0x81, 0x1e, 0xca, 0xa7, 0x87, 0x03, 0xbd, 0xbf, 0xef, 0xad, 0x68, 0x43, 0x11, 0x66,
0x1f, 0xf5, 0xa7, 0x41, 0xfa, 0xb1, 0xf8, 0xf4, 0xc7, 0x1f, 0x5d, 0xfa, 0x09, 0x57, 0x6b, 0x0f,
0xa8, 0x40, 0x8f, 0xeb, 0xf4, 0x63, 0xf6, 0x11, 0xcb, 0x3f, 0x7d, 0x0a, 0x55, 0x8b, 0x2d, 0xce,
0xd6, 0x07, 0x15, 0x69, 0xcb, 0x1c, 0xe8, 0xe2, 0x08, 0xa9, 0xd0, 0x5a, 0xc0, 0xd0, 0x04, 0xf7,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x5a, 0x6d, 0x77, 0xdb, 0x36,
0xb2, 0xfe, 0xae, 0x5f, 0x81, 0xa0, 0x3d, 0xae, 0x78, 0xcc, 0xd0, 0xb2, 0xdb, 0x7b, 0x36, 0x91,
0x44, 0x69, 0x63, 0x27, 0x4d, 0xbc, 0xc7, 0x6d, 0xb2, 0x51, 0xbc, 0xdd, 0x3d, 0xd9, 0x1c, 0x97,
0x22, 0x21, 0x09, 0x09, 0x45, 0x70, 0x09, 0xd0, 0x2f, 0x57, 0xd5, 0x7f, 0xdf, 0x67, 0x00, 0x92,
0xa2, 0xe4, 0x97, 0xb8, 0xb9, 0xf7, 0x8b, 0x45, 0x02, 0x83, 0xc1, 0xbc, 0xe1, 0x99, 0x19, 0xd0,
0xc3, 0x27, 0x2f, 0xdf, 0x9e, 0x7c, 0xf8, 0xd7, 0xbb, 0x57, 0x6c, 0x61, 0x96, 0xe9, 0x68, 0x48,
0x7f, 0x59, 0x1a, 0x65, 0xf3, 0x90, 0x8b, 0x8c, 0xe3, 0x5d, 0x44, 0xc9, 0x68, 0xb8, 0x14, 0x26,
0x62, 0xf1, 0x22, 0x2a, 0xb4, 0x30, 0x21, 0x2f, 0xcd, 0xec, 0xe9, 0x33, 0x5e, 0x8d, 0x76, 0x62,
0x95, 0x19, 0x91, 0x61, 0xf8, 0x4a, 0x26, 0x66, 0x11, 0x26, 0xe2, 0x52, 0xc6, 0xe2, 0xa9, 0x7d,
0xf1, 0x65, 0x26, 0x8d, 0x8c, 0xd2, 0xa7, 0x3a, 0x8e, 0x52, 0x11, 0x1e, 0xfa, 0xcb, 0xe8, 0x5a,
0x2e, 0xcb, 0x65, 0xf3, 0x5e, 0x6a, 0x51, 0xd8, 0x97, 0x68, 0x8a, 0xf7, 0x4c, 0x71, 0xd6, 0xc9,
0xa2, 0xa5, 0x08, 0xf9, 0xa5, 0x14, 0x57, 0xb9, 0x2a, 0x0c, 0x76, 0x31, 0xd2, 0xa4, 0x62, 0x74,
0x7e, 0xca, 0x26, 0xc2, 0x18, 0x99, 0xcd, 0xf5, 0xf0, 0xc0, 0x0d, 0x0d, 0x75, 0x5c, 0xc8, 0xdc,
0x8c, 0x3a, 0x97, 0x51, 0xc1, 0x52, 0x15, 0xcb, 0xbc, 0xde, 0xef, 0x22, 0xd1, 0xcd, 0xa3, 0x36,
0x9b, 0xc7, 0xd2, 0x57, 0x69, 0x72, 0x5e, 0xa4, 0xbe, 0x91, 0x4b, 0xa1, 0x4a, 0xe3, 0x27, 0x61,
0xa2, 0xe2, 0x72, 0x09, 0xf1, 0x7d, 0x30, 0x08, 0x9f, 0x1c, 0xd2, 0x4f, 0x5e, 0x28, 0xa3, 0x42,
0xbe, 0x30, 0x26, 0xef, 0x73, 0x1f, 0x1a, 0x9b, 0x30, 0x2b, 0xd3, 0xd4, 0x4f, 0xc3, 0x55, 0xac,
0x96, 0x79, 0x7f, 0x05, 0x69, 0x45, 0xaa, 0xfb, 0x7c, 0xb2, 0x50, 0x57, 0x6c, 0x5a, 0x1a, 0xa3,
0x32, 0xe6, 0xc6, 0xb8, 0x1f, 0xab, 0x54, 0x15, 0xba, 0xbf, 0x3a, 0x7b, 0x71, 0xfc, 0xea, 0xac,
0xcf, 0x4f, 0xe8, 0x95, 0x69, 0x91, 0x8a, 0xd8, 0x48, 0x90, 0xc1, 0x64, 0x0b, 0x95, 0x80, 0x2e,
0x97, 0xf1, 0x17, 0x51, 0xd4, 0x04, 0xbf, 0x2d, 0x84, 0x48, 0xb9, 0x5f, 0xcc, 0xa7, 0x7d, 0xfe,
0xfe, 0xf5, 0x31, 0xd3, 0xa9, 0x4c, 0x44, 0x01, 0xb2, 0xff, 0x94, 0xa0, 0xeb, 0xf3, 0xbf, 0xd3,
0x0f, 0x8b, 0x5b, 0xcc, 0x14, 0xcd, 0x2e, 0xc4, 0x75, 0x9f, 0xbf, 0x79, 0xf5, 0xcf, 0x6a, 0x46,
0x66, 0x79, 0x69, 0xf8, 0xda, 0xcf, 0xe3, 0xe5, 0x54, 0x99, 0x5a, 0x3e, 0x05, 0xf9, 0x96, 0xcc,
0x44, 0x53, 0x36, 0x8d, 0x88, 0x86, 0xbd, 0x3b, 0x61, 0x4b, 0x95, 0x08, 0x92, 0x21, 0xa9, 0x88,
0xf2, 0x42, 0x40, 0x4f, 0x76, 0xfa, 0x52, 0x93, 0xc2, 0xf3, 0x54, 0x64, 0x98, 0xc0, 0x00, 0x9e,
0xc9, 0x38, 0x0c, 0x03, 0x73, 0xb3, 0xc0, 0x62, 0x6d, 0x10, 0x0f, 0x4c, 0xcd, 0x98, 0x36, 0x2a,
0x67, 0x67, 0xaf, 0x5e, 0x5a, 0xfa, 0xfc, 0x0a, 0x9a, 0xbc, 0x81, 0xc8, 0xcd, 0x82, 0x5c, 0x5d,
0x89, 0x82, 0xed, 0x45, 0xcb, 0x7c, 0xc0, 0xa6, 0x85, 0x9c, 0x2f, 0x4c, 0x26, 0xb4, 0x63, 0x2e,
0xae, 0x61, 0xd6, 0x17, 0xe9, 0x55, 0x74, 0xa3, 0x19, 0x9e, 0xa3, 0x2c, 0x61, 0x33, 0x59, 0xe8,
0x66, 0x33, 0xd8, 0x50, 0xc3, 0xb8, 0xaf, 0x32, 0x8a, 0x09, 0x16, 0x97, 0x9a, 0xc4, 0x3f, 0x99,
0x4c, 0xa0, 0x6e, 0x82, 0x35, 0xbb, 0x33, 0x6f, 0x14, 0x6c, 0x45, 0xbc, 0x52, 0xa9, 0xb1, 0x76,
0x76, 0x9d, 0x88, 0x59, 0x9f, 0x9f, 0x6b, 0xc1, 0xc4, 0x6c, 0x06, 0x43, 0x31, 0xbc, 0x47, 0x65,
0x0a, 0x91, 0xa2, 0x02, 0xa1, 0x65, 0xac, 0x59, 0x15, 0xf4, 0x7b, 0x67, 0x45, 0xac, 0xdc, 0x57,
0x19, 0x40, 0x5d, 0x8a, 0xa2, 0x20, 0x3d, 0x66, 0x30, 0xe7, 0xdb, 0x0c, 0x84, 0xb3, 0xd9, 0x63,
0x28, 0x67, 0x33, 0xee, 0xcb, 0x44, 0x23, 0x60, 0x61, 0x37, 0xfc, 0xad, 0xa8, 0x34, 0x9b, 0xde,
0xc0, 0xa8, 0x70, 0x89, 0x59, 0x88, 0xa5, 0xe8, 0xaf, 0xa2, 0x34, 0x5f, 0x44, 0xfd, 0xd5, 0x74,
0xde, 0xe7, 0xc7, 0x51, 0xfc, 0x65, 0x5e, 0xa8, 0x12, 0xea, 0xab, 0x3c, 0x8a, 0xa5, 0xb9, 0xe1,
0x3e, 0x9c, 0x84, 0x09, 0xb7, 0x4f, 0x3d, 0xb8, 0xf6, 0x41, 0xbd, 0x2a, 0x8b, 0x14, 0x33, 0xaf,
0x99, 0x5c, 0x46, 0x73, 0xc1, 0xce, 0xdf, 0x9f, 0x21, 0x58, 0x32, 0x78, 0xef, 0x3d, 0xcc, 0x07,
0x23, 0xd4, 0x33, 0x76, 0xf4, 0x75, 0x01, 0x73, 0xd0, 0x01, 0xeb, 0xf3, 0xe6, 0xd1, 0x4e, 0x1c,
0xa7, 0x25, 0xfc, 0x44, 0x7f, 0xc1, 0xd5, 0x86, 0x4c, 0x25, 0xca, 0x6b, 0xd6, 0x04, 0x11, 0x5f,
0xaf, 0xd7, 0x83, 0x59, 0x99, 0xb9, 0x70, 0x9d, 0x9f, 0x26, 0x5d, 0xe1, 0xad, 0x0a, 0x61, 0xca,
0x22, 0x63, 0x49, 0x30, 0x17, 0xe6, 0x55, 0x2a, 0xc8, 0x4b, 0xc7, 0x37, 0x76, 0x6a, 0xdd, 0x90,
0x1a, 0x35, 0x47, 0xdc, 0x10, 0xb5, 0x5b, 0x14, 0xc4, 0x69, 0xa4, 0xf5, 0x19, 0x9c, 0x12, 0x54,
0x53, 0x7c, 0x01, 0x7b, 0x71, 0xcf, 0xa7, 0x79, 0xfe, 0xab, 0xe2, 0xfb, 0x0f, 0x10, 0x6d, 0xf8,
0x4a, 0xfd, 0x76, 0xfa, 0x19, 0x7e, 0x6c, 0xc9, 0x21, 0xf6, 0xf6, 0xb8, 0xb2, 0x83, 0x3c, 0x0c,
0xcd, 0x4d, 0x2e, 0x10, 0x8f, 0x18, 0x7b, 0xf2, 0xa2, 0x80, 0xba, 0x81, 0xd4, 0xf6, 0x77, 0x4b,
0x38, 0xf8, 0xa2, 0x2b, 0x7c, 0xe3, 0x2b, 0x6f, 0x05, 0x7f, 0x75, 0x2d, 0x60, 0x84, 0xc6, 0xcf,
0x42, 0x11, 0xe8, 0x3c, 0x95, 0xa6, 0xcb, 0x2f, 0x20, 0x98, 0x0c, 0xb3, 0xc0, 0x45, 0xba, 0xaf,
0xc3, 0xde, 0x40, 0x0f, 0xe5, 0xd3, 0xc3, 0x81, 0xde, 0xdf, 0xf7, 0x56, 0xb4, 0xa0, 0x08, 0xb3,
0x8f, 0xfa, 0xd3, 0x20, 0xfd, 0x58, 0x7c, 0xfa, 0xe3, 0x8f, 0x2e, 0xfd, 0x84, 0xab, 0xb5, 0x07,
0x54, 0xa0, 0xc7, 0x75, 0xfa, 0x31, 0xfb, 0x08, 0xf2, 0x4f, 0x9f, 0x42, 0xd5, 0xda, 0x16, 0x67,
0xeb, 0x83, 0x8a, 0xb4, 0xdd, 0x1c, 0xe8, 0xe2, 0x18, 0xa9, 0xd0, 0x5a, 0xc0, 0xd0, 0x04, 0xf7,
0x06, 0x2a, 0x90, 0x59, 0x26, 0x8a, 0x37, 0x1f, 0x7e, 0x39, 0x0b, 0x85, 0xaf, 0x5a, 0x26, 0x89,
0x92, 0xa4, 0x6b, 0xc6, 0x1c, 0x81, 0x06, 0xbf, 0xf4, 0x39, 0x51, 0x83, 0x94, 0x71, 0x2a, 0xa2,
0xe2, 0x83, 0x03, 0xb0, 0x6e, 0x05, 0x64, 0x1e, 0xf6, 0x69, 0x73, 0x93, 0x8a, 0x20, 0xca, 0x10,
0x08, 0xc4, 0x3c, 0xe4, 0x99, 0xca, 0xe0, 0xf7, 0x6a, 0x45, 0x08, 0x13, 0xd4, 0x9b, 0xba, 0xb5,
0x80, 0x5d, 0x6f, 0xd5, 0xe6, 0x57, 0x88, 0x25, 0xc2, 0xba, 0x5b, 0x31, 0x82, 0x6e, 0x47, 0xcf,
0x7b, 0xbd, 0x96, 0x15, 0x21, 0xcf, 0x7b, 0x11, 0x5b, 0x5d, 0x38, 0x8e, 0x86, 0x45, 0x45, 0xa7,
0x52, 0x8a, 0x81, 0x01, 0x59, 0x36, 0xc5, 0xd1, 0xb0, 0x20, 0x23, 0xdc, 0x44, 0x16, 0x9a, 0x7d,
0xd2, 0xe1, 0x02, 0xf2, 0x73, 0x6f, 0xbf, 0x18, 0xc8, 0x59, 0x77, 0xe3, 0x51, 0x18, 0xce, 0xf3,
0xd4, 0xde, 0x9e, 0xc2, 0x83, 0xfb, 0x1b, 0x58, 0xdc, 0xdc, 0xdb, 0xeb, 0xa6, 0xfb, 0xe1, 0xef,
0xc3, 0xc5, 0x8f, 0xa3, 0xef, 0x57, 0x9b, 0xe1, 0xf5, 0xf0, 0x00, 0x23, 0xbf, 0xc3, 0xe6, 0xfb,
0x61, 0x2d, 0x0b, 0x26, 0xfd, 0xcc, 0x57, 0x63, 0x5a, 0xd5, 0xb7, 0x02, 0x0d, 0x80, 0xc3, 0xc2,
0x32, 0x87, 0x3f, 0x89, 0x5f, 0xc5, 0x60, 0x2c, 0x43, 0xbb, 0x08, 0x5b, 0xf6, 0xb9, 0xa5, 0xc7,
0xc1, 0xb4, 0x2b, 0xc3, 0xf6, 0x80, 0xe7, 0x17, 0x70, 0x47, 0x22, 0xae, 0xdf, 0xce, 0xba, 0xd5,
0x98, 0x37, 0xea, 0x79, 0x94, 0xe3, 0x64, 0x56, 0x8a, 0x01, 0x91, 0xd5, 0x4d, 0xcc, 0x81, 0xdc,
0x80, 0x7c, 0x99, 0x79, 0xe3, 0x2e, 0x9f, 0x2a, 0x05, 0xcf, 0x64, 0x08, 0xc9, 0x50, 0x8f, 0xdd,
0x68, 0x10, 0x2f, 0x04, 0x60, 0x3e, 0x21, 0x16, 0x9f, 0xfa, 0xd5, 0xd8, 0x65, 0x94, 0x96, 0xc2,
0x8e, 0xf8, 0xd5, 0x08, 0xc0, 0xe2, 0x52, 0xaa, 0x52, 0x57, 0x47, 0x6b, 0x22, 0xa7, 0x29, 0xf2,
0x5c, 0x00, 0x3f, 0x62, 0xbf, 0xee, 0xf2, 0x20, 0xe5, 0x1e, 0x24, 0x7d, 0x78, 0xf5, 0x26, 0x88,
0xa4, 0xe7, 0xf5, 0xb7, 0xa5, 0x21, 0x63, 0x7e, 0xbf, 0x92, 0xeb, 0x3e, 0x1b, 0xda, 0x1c, 0xc1,
0xac, 0xcf, 0x43, 0x1e, 0xcd, 0x25, 0x8b, 0xa7, 0x9c, 0x91, 0x3e, 0x21, 0xb7, 0xc2, 0x4e, 0xd5,
0x35, 0x67, 0x32, 0x09, 0xbf, 0x5f, 0x65, 0x6b, 0xf6, 0xfd, 0x8a, 0xc4, 0x1c, 0xf3, 0x4a, 0x0d,
0xf2, 0xe1, 0x7a, 0x34, 0x9c, 0x16, 0xa3, 0xdf, 0xfb, 0x3c, 0x2b, 0x97, 0x53, 0x51, 0x7c, 0x95,
0x7e, 0x4d, 0xbc, 0x5a, 0xde, 0x90, 0x76, 0x56, 0x70, 0x0c, 0x1a, 0x9a, 0xda, 0x14, 0x50, 0xc5,
0xd2, 0xac, 0x42, 0xc0, 0x52, 0xa5, 0xd9, 0x3b, 0x08, 0x3f, 0x40, 0xca, 0x5b, 0xaf, 0x2b, 0xac,
0x48, 0x37, 0xe1, 0x3b, 0x17, 0xd9, 0xcf, 0xaa, 0x58, 0x76, 0xab, 0xd0, 0x34, 0x03, 0xd3, 0x44,
0x91, 0x8f, 0x78, 0x4e, 0x2b, 0x64, 0xc2, 0x32, 0xee, 0xb5, 0xcc, 0x69, 0xdc, 0xb0, 0x45, 0xf0,
0x8b, 0xe9, 0xfc, 0x02, 0x40, 0xca, 0x1b, 0xcf, 0x8e, 0xbb, 0xae, 0xa2, 0xa0, 0x03, 0x51, 0x23,
0xd8, 0xa9, 0x45, 0x62, 0x44, 0x92, 0xc5, 0xe6, 0xe3, 0x79, 0x17, 0xfe, 0xa8, 0x56, 0x6d, 0x53,
0x02, 0xa8, 0xf3, 0x2a, 0x1e, 0x36, 0x52, 0xbe, 0x16, 0xe6, 0x6c, 0x82, 0x83, 0xd9, 0xb5, 0x85,
0x07, 0xca, 0x91, 0x28, 0x9d, 0x20, 0xdb, 0x83, 0x24, 0xa1, 0xef, 0xa9, 0x11, 0xcb, 0x2e, 0xbf,
0x4a, 0x45, 0x72, 0x2e, 0x4f, 0x66, 0x73, 0xee, 0x79, 0xc0, 0x22, 0x4b, 0x15, 0x41, 0x5f, 0x14,
0x20, 0xe7, 0x60, 0x20, 0x91, 0xc0, 0xb5, 0xe8, 0x26, 0xe4, 0x32, 0x43, 0x74, 0x40, 0x9a, 0x81,
0x29, 0x6e, 0x56, 0x96, 0xe4, 0xdf, 0x26, 0x6f, 0x7f, 0x0d, 0x72, 0x2a, 0xe5, 0x2c, 0x0b, 0x6f,
0x1d, 0x53, 0x9c, 0x91, 0x55, 0xec, 0xf4, 0x6a, 0xed, 0x3f, 0x82, 0xde, 0xf6, 0x9a, 0x8d, 0xb1,
0xf8, 0xde, 0x77, 0xcf, 0x9f, 0x3d, 0x7b, 0x36, 0x68, 0x8a, 0x35, 0x46, 0xec, 0x28, 0xf7, 0x6a,
0xbc, 0xb1, 0x59, 0x24, 0x21, 0x7a, 0xc0, 0xba, 0x00, 0xff, 0x7d, 0xee, 0xf1, 0x75, 0xed, 0x13,
0x2b, 0x89, 0x23, 0x9a, 0x2c, 0x37, 0xe6, 0x0d, 0x79, 0x4a, 0xb5, 0x03, 0x45, 0x44, 0xdb, 0x74,
0x91, 0x16, 0xb7, 0x0d, 0x37, 0xa9, 0x0c, 0x57, 0x03, 0xbc, 0x08, 0x93, 0xe0, 0x3f, 0xa5, 0x28,
0x6e, 0x26, 0x55, 0xc1, 0xf4, 0x22, 0x4d, 0x71, 0x96, 0x28, 0x74, 0x3c, 0x20, 0x58, 0x6f, 0x60,
0x86, 0xa2, 0x82, 0xfb, 0x81, 0xa9, 0x41, 0x5e, 0xe1, 0x60, 0x9a, 0x4f, 0x00, 0xf5, 0x36, 0x2e,
0xd2, 0xe9, 0x8f, 0x50, 0xfb, 0x74, 0x39, 0x0e, 0x8b, 0x37, 0x56, 0xb5, 0x74, 0x7d, 0xe5, 0x64,
0x18, 0x50, 0x7a, 0x01, 0x8c, 0x27, 0xb6, 0x58, 0xa4, 0x40, 0xc2, 0x0e, 0x8d, 0xf3, 0x17, 0xa4,
0x6a, 0xde, 0x45, 0x0c, 0xd3, 0xdc, 0x9a, 0x92, 0x10, 0xb2, 0x24, 0x0e, 0x55, 0xba, 0x46, 0x80,
0x92, 0x3f, 0xb6, 0xbc, 0xab, 0x6f, 0x7b, 0xd7, 0xb7, 0xbe, 0x72, 0xa7, 0x42, 0xce, 0x6e, 0x9c,
0x95, 0xbc, 0xda, 0xf6, 0xba, 0x8c, 0xef, 0xf5, 0x4f, 0xe5, 0x54, 0xe5, 0xb2, 0xf1, 0x7d, 0x8b,
0x5d, 0x86, 0xf8, 0xff, 0x77, 0xb7, 0x8e, 0x2e, 0x77, 0xbc, 0xad, 0xac, 0xb7, 0x37, 0xce, 0x8a,
0xad, 0xab, 0xb6, 0xf4, 0x77, 0xd9, 0x67, 0x63, 0x82, 0x77, 0x70, 0xd3, 0xc3, 0x0b, 0x96, 0xe6,
0xab, 0x4b, 0xa2, 0xf4, 0x1a, 0x6b, 0x36, 0x79, 0x98, 0x9f, 0x50, 0xf6, 0x84, 0x50, 0xed, 0x12,
0x63, 0x12, 0x21, 0xeb, 0x79, 0xab, 0x2a, 0x80, 0xfc, 0x24, 0x98, 0xcc, 0x82, 0x97, 0x93, 0x0a,
0xa8, 0xc3, 0x4d, 0x4f, 0xb1, 0xb7, 0x67, 0xa7, 0x26, 0xe7, 0x4d, 0x78, 0x86, 0x9b, 0xd6, 0xe2,
0x8f, 0x3f, 0xec, 0xa4, 0x2e, 0xa7, 0x4b, 0xd4, 0x13, 0x2d, 0xea, 0xa9, 0x8a, 0x92, 0xbf, 0x4d,
0x5c, 0x05, 0xd0, 0x83, 0xce, 0x54, 0x3c, 0x22, 0x34, 0xe3, 0x42, 0x44, 0x46, 0x54, 0x20, 0x8e,
0x9c, 0x6b, 0x7b, 0x19, 0x5b, 0x0e, 0xc0, 0xcb, 0x2f, 0x0c, 0x7c, 0x8e, 0x82, 0x93, 0x92, 0x71,
0x11, 0x73, 0x5f, 0xd8, 0x04, 0xbf, 0x35, 0x4e, 0xb0, 0xca, 0x7d, 0x6e, 0xc4, 0xb5, 0x39, 0xf8,
0x1c, 0x5d, 0x46, 0x35, 0x81, 0x5b, 0x0b, 0x23, 0x7d, 0x93, 0x81, 0x84, 0x21, 0xc5, 0xa6, 0x2a,
0xb9, 0x09, 0xa2, 0x3c, 0x17, 0x59, 0x72, 0xb2, 0x90, 0x69, 0x82, 0x00, 0xc1, 0x7a, 0xa0, 0xe0,
0xab, 0x4b, 0x48, 0x41, 0xc1, 0x2e, 0xe0, 0x5a, 0x78, 0x1a, 0x32, 0x73, 0xbf, 0xeb, 0x85, 0xa3,
0x15, 0xf0, 0xe8, 0x1f, 0x30, 0xca, 0xc6, 0x0a, 0xe1, 0x96, 0x7d, 0x5a, 0xcd, 0x55, 0xb8, 0x63,
0x1d, 0xbf, 0x82, 0xb2, 0xf5, 0xdd, 0x3c, 0x5c, 0x59, 0xe3, 0x0b, 0xf0, 0x68, 0x1f, 0x17, 0xfe,
0x8a, 0xc6, 0x59, 0x65, 0x38, 0x1b, 0x46, 0x92, 0xea, 0x57, 0x98, 0x00, 0x75, 0x6c, 0x01, 0x53,
0x9d, 0x55, 0xe3, 0xc8, 0xc0, 0xd8, 0x38, 0x93, 0xf3, 0xb2, 0x88, 0x5c, 0xb9, 0x65, 0x4d, 0x50,
0x87, 0xdd, 0xbf, 0xb3, 0xd3, 0x8c, 0xfa, 0x35, 0x18, 0x5c, 0x00, 0x80, 0x50, 0x36, 0x27, 0x91,
0x89, 0x9e, 0x50, 0x61, 0xd3, 0x72, 0x7d, 0xd7, 0x79, 0x44, 0x84, 0x57, 0x48, 0xfb, 0xea, 0x2a,
0xa0, 0x70, 0xa2, 0x19, 0x2a, 0x1c, 0x38, 0x71, 0xee, 0x03, 0x7c, 0x44, 0x60, 0x7b, 0x42, 0x14,
0x92, 0xa4, 0x6b, 0xc6, 0x1c, 0x81, 0x06, 0xbf, 0xf4, 0x39, 0x71, 0x83, 0x94, 0x71, 0x2a, 0xa2,
0xe2, 0x83, 0x03, 0xb0, 0x6e, 0x05, 0x64, 0x1e, 0xd6, 0x69, 0x73, 0x93, 0x8a, 0x20, 0xca, 0x10,
0x08, 0xb4, 0x79, 0xc8, 0x33, 0x95, 0xc1, 0xef, 0x15, 0x45, 0x08, 0x13, 0xd4, 0x8b, 0xba, 0xb5,
0x80, 0x5d, 0x6f, 0xd5, 0xde, 0xaf, 0x10, 0x4b, 0x84, 0x75, 0xb7, 0xda, 0x08, 0xba, 0x1d, 0x3d,
0xef, 0xf5, 0x5a, 0x56, 0x84, 0x3c, 0xef, 0x45, 0x6c, 0x75, 0xe1, 0x38, 0x1a, 0x16, 0x15, 0x9d,
0x4a, 0x29, 0x06, 0x06, 0x64, 0xd9, 0x14, 0x47, 0xc3, 0x82, 0x8c, 0x70, 0x13, 0x59, 0x68, 0xf6,
0x49, 0x87, 0x0b, 0xc8, 0xcf, 0xbd, 0xfd, 0x62, 0x20, 0x67, 0xdd, 0x8d, 0x47, 0x61, 0x38, 0xcf,
0x53, 0x7b, 0x7b, 0x0a, 0x0f, 0xee, 0x6f, 0x60, 0x71, 0x73, 0x6f, 0xaf, 0x9b, 0xee, 0x87, 0xbf,
0x0f, 0x17, 0x3f, 0x8e, 0xbe, 0x5f, 0x6d, 0x86, 0xd7, 0xc3, 0x03, 0x8c, 0xfc, 0x0e, 0x9b, 0xef,
0x87, 0xb5, 0x2c, 0x98, 0xf4, 0x33, 0x5f, 0x8d, 0x89, 0xaa, 0x6f, 0x05, 0x1a, 0x00, 0x87, 0x85,
0xdd, 0x1c, 0xfe, 0xa4, 0xfd, 0xaa, 0x0d, 0xc6, 0x32, 0xb4, 0x44, 0x58, 0xb2, 0xcf, 0x2d, 0x3f,
0x8e, 0x4d, 0xbb, 0x32, 0x6c, 0x0f, 0x78, 0x7e, 0x01, 0x77, 0x24, 0xe2, 0xfa, 0xed, 0xac, 0x5b,
0x8d, 0x79, 0xa3, 0x9e, 0x47, 0x39, 0x4e, 0x66, 0xa5, 0x18, 0x10, 0x5b, 0xdd, 0xc4, 0x1c, 0xd8,
0x0d, 0xc8, 0x97, 0x99, 0x37, 0xee, 0xf2, 0xa9, 0x52, 0xf0, 0x4c, 0x86, 0x90, 0x0c, 0xf5, 0xd8,
0x8d, 0x06, 0xf1, 0x42, 0x00, 0xe6, 0x13, 0xda, 0xe2, 0x53, 0xbf, 0x1a, 0xbb, 0x8c, 0xd2, 0x52,
0xd8, 0x11, 0xbf, 0x1a, 0x01, 0x58, 0x5c, 0x4a, 0x55, 0xea, 0xea, 0x68, 0x4d, 0xe4, 0x34, 0x45,
0x9e, 0x0b, 0xe0, 0x47, 0xac, 0xd7, 0x5d, 0x1e, 0xa4, 0xdc, 0x83, 0xa4, 0x0f, 0x53, 0x6f, 0x82,
0x48, 0x7a, 0x5e, 0x7f, 0x5b, 0x1a, 0x32, 0xe6, 0xf7, 0x2b, 0xb9, 0xee, 0xb3, 0xa1, 0xcd, 0x11,
0xcc, 0xfa, 0x3c, 0xe4, 0xd1, 0x5c, 0xb2, 0x78, 0xca, 0x19, 0xe9, 0x13, 0x72, 0x2b, 0xec, 0x54,
0x5d, 0x73, 0x26, 0x93, 0xf0, 0xfb, 0x55, 0xb6, 0x66, 0xdf, 0xaf, 0x48, 0xcc, 0x31, 0xaf, 0xd4,
0x20, 0x1f, 0xae, 0x47, 0xc3, 0x69, 0x31, 0xfa, 0xbd, 0xcf, 0xb3, 0x72, 0x39, 0x15, 0xc5, 0x57,
0xf9, 0xd7, 0xcc, 0x2b, 0xf2, 0x86, 0xb5, 0xb3, 0x82, 0xdb, 0xa0, 0xe1, 0xa9, 0x4d, 0x01, 0x55,
0x2c, 0xcf, 0x2a, 0x04, 0x2c, 0x57, 0x9a, 0xbd, 0x83, 0xf1, 0x03, 0xac, 0xbc, 0xf5, 0xba, 0xc2,
0x8a, 0x74, 0x13, 0xbe, 0x73, 0x91, 0xfd, 0xac, 0x8a, 0x65, 0xb7, 0x0a, 0x4d, 0x33, 0x30, 0x4d,
0x14, 0xf9, 0x88, 0xe7, 0xb4, 0x42, 0x26, 0x90, 0x71, 0xaf, 0x65, 0x4e, 0xe3, 0x86, 0x2d, 0x82,
0x5f, 0x4c, 0xe7, 0x17, 0x00, 0x52, 0xde, 0x78, 0x76, 0xdc, 0x75, 0x15, 0x05, 0x1d, 0x88, 0x1a,
0xc1, 0x4e, 0x2d, 0x12, 0x23, 0x92, 0x2c, 0x36, 0x1f, 0xcf, 0xbb, 0xf0, 0x47, 0x45, 0xb5, 0xcd,
0x09, 0xa0, 0xce, 0xab, 0x78, 0xd8, 0x48, 0xf9, 0x5a, 0x98, 0xb3, 0x09, 0x0e, 0x66, 0xd7, 0x16,
0x1e, 0x28, 0x47, 0xa2, 0x74, 0x82, 0x6c, 0x0f, 0x96, 0x84, 0xbe, 0xa7, 0x46, 0x2c, 0xbb, 0xfc,
0x2a, 0x15, 0xc9, 0xb9, 0x3c, 0x99, 0xcd, 0xb9, 0xe7, 0x01, 0x8b, 0x2c, 0x57, 0x04, 0x7d, 0x51,
0x80, 0x9d, 0x83, 0x81, 0x44, 0x02, 0xd7, 0xa2, 0x9b, 0x90, 0xcb, 0x0c, 0xd1, 0x01, 0x69, 0x06,
0xa6, 0xb8, 0x59, 0x59, 0x96, 0x7f, 0x9b, 0xbc, 0xfd, 0x35, 0xc8, 0xa9, 0x94, 0xb3, 0x5b, 0x78,
0xeb, 0x98, 0xe2, 0x8c, 0xac, 0x62, 0xa7, 0x57, 0x6b, 0xff, 0x11, 0xfc, 0xb6, 0x69, 0x36, 0xc6,
0xe2, 0x7b, 0xdf, 0x3d, 0x7f, 0xf6, 0xec, 0xd9, 0xa0, 0x29, 0xd6, 0x18, 0x6d, 0x47, 0xb9, 0x57,
0xe3, 0x8d, 0xcd, 0x22, 0x09, 0xd1, 0x03, 0xd6, 0x05, 0xf8, 0xef, 0x73, 0x8f, 0xaf, 0x6b, 0x9f,
0x58, 0x49, 0x1c, 0xd3, 0x64, 0xb9, 0x31, 0x6f, 0xc8, 0x53, 0xaa, 0x1d, 0x28, 0x22, 0xda, 0xa6,
0x8b, 0xb4, 0xb8, 0x6d, 0xb8, 0x49, 0x65, 0xb8, 0x1a, 0xe0, 0x45, 0x98, 0x04, 0xff, 0x29, 0x45,
0x71, 0x33, 0xa9, 0x0a, 0xa6, 0x17, 0x69, 0x8a, 0xb3, 0x44, 0xa1, 0xe3, 0x01, 0xc1, 0x7a, 0x03,
0x33, 0x14, 0x15, 0xdc, 0x0f, 0x4c, 0x0d, 0xf2, 0x0a, 0x07, 0xd3, 0x7c, 0x02, 0xa8, 0xb7, 0x71,
0x91, 0x4e, 0x7f, 0x84, 0xda, 0xa7, 0xcb, 0x71, 0x58, 0xbc, 0xb1, 0xaa, 0xa5, 0xeb, 0x2b, 0x27,
0xc3, 0x80, 0xd2, 0x0b, 0x60, 0x3c, 0xb1, 0xc5, 0x22, 0x05, 0x12, 0x56, 0x68, 0x9c, 0xbf, 0x20,
0x55, 0xf3, 0x2e, 0x62, 0x98, 0xe6, 0xd6, 0x94, 0x84, 0x90, 0x25, 0x71, 0xa8, 0xd2, 0x35, 0x02,
0x94, 0xfc, 0xb1, 0xe5, 0x5d, 0x7d, 0xdb, 0xbb, 0xbe, 0xf5, 0x95, 0x3b, 0x15, 0x72, 0x76, 0xe3,
0xac, 0xe4, 0xd5, 0xb6, 0xd7, 0x65, 0x7c, 0xaf, 0x7f, 0x2a, 0xa7, 0x2a, 0x97, 0x8d, 0xef, 0x23,
0x76, 0x19, 0xe2, 0xff, 0xdf, 0xdd, 0x3a, 0xba, 0xdc, 0xf1, 0xb6, 0xb2, 0xde, 0xde, 0x38, 0x2b,
0xb6, 0xae, 0xda, 0xd2, 0xdf, 0x65, 0x9f, 0x8d, 0x09, 0xde, 0xc1, 0x4d, 0x0f, 0x13, 0x2c, 0xcd,
0x57, 0x49, 0xa2, 0xf4, 0x1a, 0x34, 0x9b, 0x3c, 0xcc, 0x4f, 0x28, 0x7b, 0x42, 0xa8, 0x76, 0x89,
0x31, 0x89, 0x90, 0xf5, 0xbc, 0x55, 0x15, 0x40, 0x7e, 0x12, 0x4c, 0x66, 0xc1, 0xcb, 0x49, 0x05,
0xd4, 0xe1, 0xa6, 0xa7, 0xd8, 0xdb, 0xb3, 0x53, 0x93, 0xf3, 0x26, 0x3c, 0xc3, 0x4d, 0x6b, 0xf1,
0xc7, 0x1f, 0x76, 0x52, 0x97, 0xd3, 0x25, 0xea, 0x89, 0x16, 0xf7, 0x54, 0x45, 0xc9, 0xdf, 0x26,
0xae, 0x02, 0xe8, 0x41, 0x67, 0x2a, 0x1e, 0x11, 0x9a, 0x71, 0x21, 0x22, 0x23, 0x2a, 0x10, 0x47,
0xce, 0xb5, 0xbd, 0x8c, 0x2d, 0x07, 0xe0, 0xe5, 0x17, 0x06, 0x3e, 0x47, 0xc1, 0x49, 0xc9, 0xb8,
0x88, 0xb9, 0x2f, 0x6c, 0x82, 0xdf, 0x1a, 0x27, 0x58, 0xe5, 0x3e, 0x37, 0xe2, 0xda, 0x1c, 0x7c,
0x8e, 0x2e, 0xa3, 0x9a, 0xc1, 0x2d, 0xc2, 0x48, 0xdf, 0x64, 0x60, 0x61, 0x48, 0xb1, 0xa9, 0x4a,
0x6e, 0x82, 0x28, 0xcf, 0x45, 0x96, 0x9c, 0x2c, 0x64, 0x9a, 0x20, 0x40, 0x40, 0x0f, 0x14, 0x7c,
0x75, 0x09, 0x29, 0x28, 0xd8, 0x05, 0x5c, 0x0b, 0x4f, 0x43, 0x66, 0xee, 0x77, 0xbd, 0x70, 0xb4,
0x02, 0x1e, 0xfd, 0x03, 0x46, 0xd9, 0x58, 0x21, 0xdc, 0xb2, 0x4f, 0xab, 0xb9, 0x0a, 0x77, 0xac,
0xe3, 0x57, 0x50, 0xb6, 0xbe, 0x7b, 0x0f, 0x57, 0xd6, 0xf8, 0x02, 0x7b, 0xb4, 0x8f, 0x0b, 0x7f,
0x45, 0xe3, 0xac, 0x32, 0x9c, 0x0d, 0x23, 0x49, 0xf5, 0x2b, 0x4c, 0x80, 0x3a, 0xb6, 0x80, 0xa9,
0xce, 0xaa, 0x71, 0x64, 0x60, 0x2c, 0x9c, 0xc9, 0x79, 0x59, 0x44, 0xae, 0xdc, 0xb2, 0x26, 0xa8,
0xc3, 0xee, 0xdf, 0xd9, 0x69, 0x46, 0xfd, 0x1a, 0x0c, 0x2e, 0x00, 0x40, 0x28, 0x9b, 0x93, 0xc8,
0x44, 0x4f, 0xa8, 0xb0, 0x69, 0xb9, 0xbe, 0xeb, 0x3c, 0x22, 0xc2, 0x2b, 0xa4, 0x7d, 0x75, 0x15,
0x50, 0x38, 0xd1, 0x0c, 0x15, 0x0e, 0x9c, 0x76, 0xee, 0x03, 0x7c, 0x44, 0x60, 0x7b, 0x42, 0x14,
0xc8, 0x9e, 0x6d, 0x13, 0x7b, 0x7e, 0xd7, 0xf6, 0x9b, 0xf7, 0xc0, 0x33, 0x46, 0x4f, 0x73, 0x07,
0xcd, 0x6e, 0x19, 0x76, 0x2f, 0x73, 0x48, 0xfe, 0x33, 0xe8, 0xb1, 0x5f, 0xd0, 0x7b, 0x05, 0xec,
0x1d, 0xe2, 0x90, 0x7a, 0x14, 0xf4, 0xce, 0x68, 0xff, 0xd0, 0x48, 0xb1, 0xd3, 0x77, 0x4f, 0x76,
0xc3, 0x59, 0x6f, 0x53, 0xf4, 0x2d, 0x35, 0xaf, 0xaa, 0x70, 0x48, 0x6c, 0x43, 0xa2, 0x45, 0x66,
0x41, 0x4d, 0x33, 0x0a, 0x32, 0x13, 0xa0, 0x71, 0x8c, 0x45, 0xf7, 0xd0, 0x37, 0x01, 0x5c, 0xac,
0x7f, 0x93, 0x66, 0xd1, 0xe5, 0x07, 0xc0, 0xac, 0xa7, 0x87, 0xfd, 0x4b, 0x25, 0x13, 0xd6, 0xf3,
0xea, 0x82, 0xf7, 0xc0, 0xc6, 0x9a, 0xc3, 0xbf, 0xd1, 0x11, 0xd2, 0xad, 0x0a, 0x72, 0x95, 0x77,
0xc9, 0x57, 0xee, 0xb7, 0xe9, 0x84, 0x37, 0xda, 0xfb, 0x95, 0xf6, 0x4e, 0x2b, 0x11, 0x2c, 0x94,
0x36, 0xc4, 0x7a, 0xbf, 0x8b, 0x35, 0x68, 0x7b, 0xc6, 0xa8, 0x10, 0xf6, 0xdd, 0xa3, 0x2d, 0xf7,
0xc0, 0x64, 0x5f, 0x05, 0x9f, 0x95, 0xcc, 0x2c, 0x3f, 0x6f, 0x5d, 0x9d, 0x05, 0x58, 0x0a, 0x2d,
0x0c, 0xc6, 0x74, 0x05, 0x1b, 0x07, 0x3a, 0xf8, 0xac, 0xc7, 0x79, 0xf8, 0x23, 0x2c, 0x80, 0x32,
0x99, 0x18, 0x40, 0x22, 0x1b, 0x4f, 0x91, 0x75, 0x54, 0x78, 0x7b, 0x4b, 0x29, 0x89, 0x62, 0x2b,
0xbb, 0xdb, 0x05, 0x4d, 0x97, 0x40, 0xa6, 0x1f, 0xd7, 0x3a, 0x40, 0x12, 0x88, 0x62, 0xc5, 0xb6,
0x82, 0xb5, 0xd2, 0xc6, 0x1b, 0x44, 0x40, 0xe5, 0x7b, 0x85, 0x73, 0xd1, 0xb5, 0x7d, 0xbf, 0xee,
0x1f, 0x1c, 0x7c, 0xc9, 0x54, 0x40, 0x18, 0x02, 0xbf, 0x1e, 0xcc, 0x70, 0x56, 0x4b, 0xb4, 0x74,
0x1b, 0xee, 0xdf, 0xd9, 0xab, 0x0b, 0x49, 0xee, 0x9b, 0x45, 0xb1, 0x78, 0x5a, 0x4f, 0xb4, 0x71,
0xe5, 0x78, 0x87, 0xf4, 0x2d, 0x1d, 0xa0, 0x2d, 0xbf, 0x40, 0x3f, 0x3f, 0x6b, 0xef, 0x3a, 0x3f,
0xed, 0x56, 0xa8, 0x2d, 0x13, 0x24, 0x9e, 0x05, 0x50, 0xe2, 0x46, 0x95, 0xb7, 0xa0, 0xf9, 0x56,
0xae, 0x1c, 0xd7, 0x60, 0xdd, 0x77, 0xb8, 0x3e, 0x70, 0x49, 0xf0, 0x56, 0xde, 0x1c, 0xa0, 0x55,
0x82, 0xbf, 0x1c, 0xba, 0xdd, 0x41, 0xc5, 0x65, 0xdc, 0x3e, 0x4f, 0xa2, 0xe2, 0x4b, 0x5b, 0xae,
0x4d, 0x39, 0x53, 0x9d, 0x98, 0xfa, 0x2e, 0x25, 0xdc, 0xae, 0x8d, 0x6c, 0x45, 0x6c, 0x1a, 0x82,
0xc4, 0x2c, 0x6c, 0x8c, 0x9a, 0xcb, 0x58, 0x97, 0xcb, 0x20, 0x5f, 0xc0, 0x29, 0xfa, 0xe0, 0xf0,
0xf9, 0x51, 0xef, 0xe0, 0xb0, 0xf7, 0xac, 0xe7, 0x12, 0x8c, 0xd9, 0x6f, 0x35, 0xac, 0x5b, 0x04,
0xf6, 0x43, 0x3e, 0x9e, 0x6f, 0xa6, 0xea, 0xd5, 0xb6, 0x95, 0xdd, 0x59, 0x08, 0xd5, 0x64, 0x16,
0xa7, 0x65, 0x42, 0x95, 0xf3, 0x18, 0xa1, 0xcf, 0xf7, 0xa0, 0xcc, 0x98, 0xa2, 0x71, 0x6a, 0x97,
0xcd, 0x8e, 0x0c, 0xab, 0x97, 0x39, 0x24, 0xff, 0x19, 0xfc, 0xd8, 0x2f, 0xe8, 0xbd, 0x02, 0xf6,
0x0e, 0x71, 0x48, 0x3d, 0x0a, 0x7a, 0x67, 0xb4, 0x7f, 0x68, 0xa4, 0xd8, 0xe9, 0xbb, 0x27, 0xbb,
0xe1, 0xac, 0xb7, 0x39, 0xfa, 0x96, 0x9b, 0x57, 0x55, 0x38, 0x24, 0xb6, 0x21, 0xd1, 0x22, 0xb3,
0xa0, 0xa6, 0x19, 0x05, 0x99, 0x09, 0xd0, 0x38, 0xc6, 0xa2, 0x7b, 0xe8, 0x9b, 0x00, 0x2e, 0xd6,
0xbf, 0x49, 0xb3, 0xe8, 0xf2, 0x03, 0x60, 0xd6, 0xd3, 0xc3, 0xfe, 0xa5, 0x92, 0x09, 0xeb, 0x79,
0x75, 0xc1, 0x7b, 0x60, 0x63, 0xcd, 0xe1, 0xdf, 0xe8, 0x08, 0xe9, 0x56, 0x05, 0xb9, 0xca, 0xbb,
0xe4, 0x2b, 0xf7, 0xdb, 0x74, 0xc2, 0x1b, 0xed, 0xfd, 0x4a, 0x7b, 0xa7, 0x95, 0x08, 0x16, 0x4a,
0x1b, 0xda, 0x7a, 0xbf, 0x0b, 0x1a, 0xb4, 0x3d, 0x63, 0x54, 0x08, 0xfb, 0xee, 0xd1, 0x96, 0x7b,
0xd8, 0x64, 0x5f, 0x05, 0x9f, 0x95, 0xcc, 0xec, 0x7e, 0xde, 0xba, 0x3a, 0x0b, 0xb0, 0x14, 0x5a,
0x18, 0x8c, 0xe9, 0x0a, 0x36, 0x0e, 0x74, 0xf0, 0x59, 0x8f, 0xf3, 0xf0, 0x47, 0x58, 0x00, 0x65,
0x32, 0x6d, 0x00, 0x89, 0x6c, 0x3c, 0x45, 0xd6, 0x51, 0xe1, 0xed, 0x25, 0xa5, 0x24, 0x8e, 0xad,
0xec, 0x6e, 0x09, 0x9a, 0x2e, 0x81, 0x4c, 0x3f, 0xae, 0x75, 0x80, 0x24, 0x10, 0xc5, 0x8a, 0x6d,
0x05, 0x6b, 0xa5, 0x8d, 0x37, 0x88, 0x80, 0xca, 0xf7, 0x0a, 0xe7, 0xa2, 0x6b, 0xfb, 0x7e, 0xdd,
0x3f, 0x38, 0xf8, 0x92, 0xa9, 0x80, 0x30, 0x04, 0x7e, 0x3d, 0x98, 0xe1, 0xac, 0x96, 0x68, 0xe9,
0x36, 0xbb, 0x7f, 0x67, 0xaf, 0x2e, 0x24, 0xb9, 0x6f, 0x16, 0xc5, 0xe2, 0x69, 0x3d, 0xd1, 0xc6,
0x95, 0xe3, 0x1d, 0xd6, 0xb7, 0x74, 0x80, 0xb6, 0xfc, 0x02, 0xfd, 0xfc, 0xac, 0xbd, 0xea, 0xfc,
0xb4, 0x5b, 0xa1, 0xb6, 0x4c, 0x90, 0x78, 0x16, 0x40, 0x89, 0x1b, 0x55, 0xde, 0x82, 0xe6, 0x5b,
0xb9, 0x72, 0x5c, 0x83, 0x75, 0xdf, 0xe1, 0xfa, 0xc0, 0x25, 0xc1, 0x5b, 0x79, 0x73, 0x80, 0x56,
0x09, 0xfe, 0x72, 0xe8, 0x76, 0x07, 0x17, 0x97, 0x71, 0xfb, 0x3c, 0x89, 0x8a, 0x2f, 0x6d, 0xb9,
0x36, 0xe5, 0x4c, 0x75, 0x62, 0xea, 0xbb, 0x94, 0x70, 0xbb, 0x36, 0xb2, 0x15, 0xb1, 0x69, 0x18,
0xd2, 0x66, 0x61, 0x63, 0xd4, 0x5c, 0xc6, 0xba, 0x5c, 0x06, 0xf9, 0x02, 0x4e, 0xd1, 0x07, 0x87,
0xcf, 0x8f, 0x7a, 0x07, 0x87, 0xbd, 0x67, 0x3d, 0x97, 0x60, 0xcc, 0x7e, 0xab, 0x61, 0xdd, 0x62,
0xb0, 0x1f, 0xf2, 0xf1, 0x7c, 0x33, 0x55, 0x53, 0xdb, 0x56, 0x76, 0x87, 0x10, 0xaa, 0xc9, 0x2c,
0x4e, 0xcb, 0x84, 0x2a, 0xe7, 0x31, 0x42, 0x9f, 0xef, 0x41, 0x99, 0x31, 0x45, 0xe3, 0xd4, 0x92,
0x7b, 0xfe, 0xbd, 0x55, 0x58, 0xd8, 0x8a, 0x8b, 0x32, 0xa7, 0x60, 0xa5, 0x13, 0x4b, 0xd0, 0x5d,
0x57, 0x07, 0x99, 0xb8, 0x62, 0xff, 0xfc, 0xe5, 0xec, 0x0d, 0xd4, 0x79, 0x2f, 0x50, 0x5d, 0x68,
0x33, 0x78, 0x00, 0x3f, 0x5b, 0x7d, 0xd6, 0x26, 0x05, 0x99, 0x85, 0xd4, 0x48, 0x54, 0x3a, 0x07,
0xe8, 0x89, 0x0f, 0x80, 0x6f, 0xdf, 0x8e, 0x68, 0x83, 0x10, 0xd3, 0xa3, 0xf0, 0x27, 0x6a, 0xb9,
0xbc, 0x07, 0x21, 0x73, 0x43, 0x57, 0xb4, 0x09, 0x0b, 0xa2, 0x11, 0x7f, 0xf1, 0x9f, 0xd4, 0x04,
0xbc, 0x07, 0x21, 0x73, 0xc3, 0x57, 0xb4, 0x19, 0x0b, 0xe2, 0x11, 0x7f, 0xf1, 0x9f, 0xd4, 0x0c,
0x5c, 0x3c, 0xbf, 0x7b, 0x3b, 0xf9, 0x80, 0x44, 0x71, 0xe0, 0x14, 0x82, 0xff, 0x5d, 0xc3, 0x46,
0x9a, 0x50, 0xe9, 0xf5, 0x12, 0xa0, 0x38, 0xa8, 0x8b, 0xe5, 0x2a, 0x37, 0x20, 0x24, 0x30, 0x0a,
0xcc, 0x0d, 0x08, 0x01, 0xf5, 0xc7, 0xde, 0x27, 0xdf, 0xb5, 0x98, 0x34, 0x87, 0xf2, 0xa6, 0x8e,
0x1e, 0x14, 0xbd, 0x4f, 0x0e, 0xd7, 0x9d, 0xe1, 0x41, 0x75, 0x13, 0x37, 0xb4, 0x21, 0x3a, 0xfa,
0xab, 0x5c, 0x12, 0x04, 0x30, 0x58, 0x16, 0xf9, 0xcb, 0x46, 0x6d, 0xac, 0x11, 0xec, 0x03, 0x2c,
0xb4, 0x0b, 0xd0, 0xc7, 0xd9, 0x6b, 0x45, 0x4a, 0x47, 0x40, 0x7a, 0x92, 0x2b, 0xe4, 0x80, 0x62,
0x3e, 0x1a, 0xa2, 0x7a, 0x5b, 0x76, 0xa8, 0xb4, 0xe7, 0xf4, 0x74, 0xa1, 0x39, 0x73, 0x17, 0x82,
0x93, 0x19, 0xaf, 0x2e, 0xcf, 0x42, 0x9e, 0x03, 0x76, 0xb0, 0x34, 0x91, 0x97, 0x75, 0x3f, 0x60,
0x14, 0x8e, 0xf9, 0xd5, 0xf6, 0xd8, 0x42, 0xa4, 0xf9, 0x31, 0x1f, 0x75, 0x86, 0xd5, 0xc5, 0x8d,
0xeb, 0x43, 0xdc, 0x0b, 0x07, 0xd7, 0x18, 0x50, 0xf9, 0x25, 0xe4, 0x6f, 0x88, 0xed, 0x78, 0x78,
0xe0, 0x26, 0x20, 0x1a, 0x48, 0x8c, 0xee, 0xde, 0xd3, 0x69, 0x36, 0x1d, 0xd3, 0x26, 0xba, 0xc1,
0xd9, 0xec, 0x7b, 0x98, 0x8b, 0x2b, 0x31, 0xf8, 0x88, 0x7e, 0x9b, 0x3d, 0x1d, 0xdb, 0xd8, 0xe8,
0xab, 0x5c, 0x12, 0x04, 0x30, 0x58, 0x16, 0xf9, 0xcb, 0x46, 0x6d, 0xac, 0x11, 0xec, 0x03, 0x10,
0x5a, 0x02, 0xf4, 0x71, 0xf6, 0x5a, 0x91, 0xd2, 0x11, 0x90, 0x9e, 0xe4, 0x0a, 0x39, 0xa0, 0x98,
0x8f, 0x86, 0xa8, 0xde, 0x96, 0x1d, 0x2a, 0xed, 0x39, 0x3d, 0x5d, 0x68, 0xce, 0xdc, 0x85, 0xe0,
0x64, 0xc6, 0xab, 0xcb, 0xb3, 0x90, 0xe7, 0x80, 0x1d, 0x90, 0x26, 0xf2, 0xb2, 0xee, 0x07, 0x8c,
0xc2, 0x31, 0xbf, 0xda, 0x1e, 0x5b, 0x88, 0x34, 0x3f, 0xe6, 0xa3, 0xce, 0xb0, 0xba, 0xb8, 0x71,
0x7d, 0x88, 0x7b, 0xe1, 0xd8, 0x35, 0x06, 0x54, 0x7e, 0x09, 0xf9, 0x1b, 0xda, 0x76, 0x3c, 0x3c,
0x70, 0x13, 0x10, 0x0d, 0x2c, 0x46, 0x77, 0xaf, 0xe9, 0x34, 0x8b, 0x8e, 0x69, 0x11, 0xdd, 0xe0,
0x6c, 0xd6, 0x3d, 0xbc, 0x8b, 0x2b, 0x31, 0xf8, 0x88, 0x7e, 0x9b, 0x35, 0x1d, 0xdb, 0xd8, 0xe8,
0x3c, 0xca, 0xac, 0xc2, 0xae, 0x48, 0x63, 0xd6, 0x44, 0xe8, 0xc6, 0xec, 0xfd, 0xcc, 0xbc, 0x10,
0x22, 0x1b, 0x54, 0x67, 0xbe, 0x6f, 0xcf, 0xf5, 0xa8, 0xb3, 0xf7, 0xdd, 0x61, 0xaf, 0xd7, 0xfb,
0x69, 0xc0, 0xce, 0x28, 0x59, 0x00, 0x30, 0x58, 0x0d, 0x28, 0x54, 0x79, 0x89, 0xe4, 0x09, 0xec,
0x0c, 0xa2, 0x23, 0xd6, 0xa6, 0x4d, 0xa5, 0x1b, 0xeb, 0x6c, 0x11, 0x47, 0x1d, 0x74, 0x9b, 0xb4,
0x0c, 0xa6, 0x23, 0xd6, 0xe6, 0x4d, 0xa5, 0x1b, 0xeb, 0x6c, 0x31, 0x47, 0x1d, 0x74, 0x9b, 0xb5,
0xab, 0xe7, 0x4e, 0x54, 0x99, 0x26, 0x2c, 0x53, 0x86, 0x45, 0x71, 0x2c, 0xb4, 0x66, 0x36, 0x2f,
0xd1, 0xad, 0x9f, 0x4d, 0x4c, 0xec, 0x97, 0xe8, 0x8b, 0x60, 0x1a, 0x90, 0xc8, 0xa4, 0x61, 0x52,
0x23, 0x8f, 0xd1, 0x9d, 0x5c, 0x42, 0x9d, 0x3f, 0xc0, 0xaa, 0x60, 0x53, 0xb8, 0x03, 0x2c, 0x83,
0x4e, 0x25, 0xca, 0x70, 0x51, 0xd4, 0xa6, 0x5d, 0x1c, 0x8d, 0x7e, 0x13, 0x53, 0xaa, 0x18, 0xcb,
0x1c, 0x81, 0x70, 0x34, 0x9a, 0x88, 0xe2, 0x12, 0x49, 0x10, 0x07, 0xd6, 0x46, 0x11, 0xe2, 0xba,
0xe9, 0x23, 0x9d, 0x35, 0xa9, 0xc6, 0x69, 0x6e, 0x86, 0x5f, 0x4e, 0x10, 0x08, 0xd1, 0xb5, 0x4b,
0x5c, 0x21, 0xff, 0xf1, 0x88, 0xdb, 0x96, 0xcf, 0x7a, 0x9e, 0x34, 0xfd, 0x55, 0x4d, 0x24, 0x25,
0x7d, 0xde, 0xc4, 0x01, 0x5d, 0x28, 0xa1, 0x7f, 0xac, 0xdf, 0xaf, 0xa2, 0x22, 0x83, 0xa6, 0x1f,
0x70, 0xe8, 0xe8, 0xe2, 0x71, 0x89, 0x77, 0xc1, 0xa6, 0x25, 0xaa, 0x21, 0x96, 0x28, 0xa1, 0xad,
0xd2, 0x15, 0x82, 0x30, 0x4d, 0xa4, 0xe4, 0x4c, 0x42, 0x33, 0xb2, 0x72, 0x99, 0x53, 0x5c, 0x07,
0x96, 0xdf, 0x81, 0xac, 0x15, 0x22, 0xce, 0x1d, 0x62, 0x5d, 0x31, 0x1e, 0x55, 0x17, 0x94, 0x5b,
0x9b, 0x77, 0x54, 0xda, 0xf4, 0xda, 0x55, 0x78, 0x9f, 0x57, 0x6a, 0x38, 0x92, 0x92, 0xe4, 0xa3,
0xbb, 0xc5, 0x34, 0x55, 0x57, 0x54, 0xeb, 0x80, 0xbb, 0xbb, 0xef, 0x94, 0xff, 0x1b, 0xd5, 0x37,
0x5a, 0xce, 0xe3, 0x24, 0x7d, 0x99, 0x49, 0x60, 0x11, 0x5d, 0xf5, 0x2e, 0xa8, 0xc3, 0x00, 0xb4,
0xb9, 0x92, 0xc2, 0xdd, 0xc5, 0x33, 0xba, 0x62, 0x25, 0x8c, 0x69, 0x79, 0x05, 0xac, 0x3a, 0xff,
0x52, 0x25, 0xbb, 0x92, 0x69, 0xca, 0x32, 0x01, 0x11, 0xb1, 0xcf, 0x36, 0x28, 0x80, 0x45, 0x16,
0xcd, 0xd1, 0xee, 0x30, 0x39, 0x63, 0xa5, 0xed, 0xda, 0x22, 0x96, 0xc8, 0xd9, 0x4c, 0x14, 0x74,
0xb1, 0x5b, 0x91, 0xf0, 0x6b, 0xda, 0xaa, 0xa9, 0x5e, 0xe8, 0x7a, 0x08, 0xb0, 0xa6, 0x1d, 0xf5,
0xf7, 0x62, 0x86, 0x97, 0x85, 0x95, 0x65, 0x49, 0xd4, 0xa0, 0x01, 0x58, 0x00, 0x5f, 0xd2, 0x1b,
0xfa, 0x92, 0x90, 0xcd, 0x85, 0x0e, 0xac, 0x11, 0xdb, 0xce, 0xa3, 0xde, 0x7b, 0xd4, 0xa9, 0x0b,
0xbc, 0x5a, 0xc7, 0x20, 0x08, 0xea, 0xd8, 0xf9, 0x91, 0x3e, 0x04, 0xbc, 0x00, 0x48, 0x45, 0x48,
0x47, 0xb1, 0xb0, 0x17, 0x42, 0x2e, 0xca, 0x2b, 0xef, 0xa6, 0xb0, 0xa3, 0x0b, 0xb9, 0xc6, 0xe2,
0x9d, 0x3b, 0xae, 0x37, 0x38, 0x55, 0x86, 0x17, 0xd5, 0xa5, 0xfd, 0xce, 0x75, 0xc8, 0x68, 0x73,
0x2c, 0xef, 0x20, 0xda, 0xb9, 0xc7, 0x8f, 0x0d, 0x51, 0x77, 0xfb, 0xfe, 0x28, 0xa2, 0x9d, 0x5d,
0x51, 0xef, 0x27, 0x2a, 0x93, 0x07, 0x28, 0x76, 0xee, 0x57, 0xfe, 0x5e, 0x8a, 0xee, 0x9a, 0xff,
0x4e, 0xa2, 0x9d, 0xaf, 0x59, 0xf4, 0x21, 0xa2, 0xf9, 0x55, 0x71, 0x8b, 0x68, 0xe7, 0x41, 0x8b,
0x3e, 0x82, 0xa8, 0xb8, 0xce, 0x79, 0xa3, 0xe5, 0xa3, 0xdc, 0x74, 0x0f, 0xd1, 0x4e, 0x43, 0xd5,
0x7e, 0x28, 0xf8, 0x73, 0xae, 0xdf, 0x8e, 0xa7, 0xfa, 0x46, 0x6b, 0x29, 0xb3, 0x90, 0xf7, 0x2c,
0x28, 0x85, 0xfc, 0xe8, 0x7f, 0x7a, 0x84, 0xe0, 0x22, 0x0f, 0xf9, 0x61, 0x4b, 0x05, 0xb5, 0x65,
0xe8, 0x3f, 0xe5, 0xba, 0x47, 0xb0, 0xd9, 0x28, 0xa5, 0x66, 0xb3, 0xfb, 0x18, 0x7d, 0x8b, 0x8d,
0xdc, 0x27, 0x8d, 0x3b, 0x8d, 0x74, 0xca, 0xa8, 0x30, 0x65, 0x54, 0x24, 0xda, 0xaf, 0x49, 0x0f,
0x53, 0x43, 0x85, 0x49, 0xb9, 0xd0, 0x1e, 0xfb, 0x90, 0x53, 0x85, 0xdb, 0x16, 0x8d, 0x56, 0x6c,
0xd5, 0xba, 0x75, 0x0e, 0xdc, 0x4e, 0x4e, 0x84, 0x8a, 0xbf, 0x2d, 0x6e, 0xd8, 0x95, 0xcd, 0x4d,
0x58, 0x37, 0x66, 0x04, 0x20, 0x7b, 0xdf, 0x5d, 0x1f, 0xfe, 0xfc, 0xfc, 0x2f, 0x2f, 0x06, 0x0e,
0x3f, 0x5d, 0xba, 0xf9, 0x16, 0x17, 0x06, 0xb5, 0x75, 0x0f, 0x83, 0xc6, 0xba, 0x18, 0xac, 0xfc,
0xe8, 0xea, 0x45, 0xfb, 0x01, 0xe7, 0xc2, 0x44, 0xd3, 0x6d, 0x33, 0xff, 0x89, 0x00, 0x7f, 0x88,
0x67, 0xe7, 0x21, 0xa6, 0xd3, 0xf9, 0x9f, 0x77, 0x6d, 0xa7, 0x9d, 0x40, 0x37, 0x04, 0x6d, 0xfa,
0xb7, 0x04, 0x5b, 0x99, 0xf4, 0xf9, 0xd7, 0xc9, 0x3f, 0x0a, 0xaf, 0xb6, 0x9a, 0x81, 0xdd, 0x9b,
0xe6, 0x4e, 0x13, 0x05, 0x3f, 0x6c, 0xfa, 0x89, 0xdd, 0x9b, 0xd3, 0x1f, 0x36, 0x09, 0xc1, 0x8d,
0x3c, 0x16, 0x8d, 0x77, 0xf5, 0xac, 0xaa, 0xfb, 0xdb, 0x7a, 0x6d, 0x12, 0xb7, 0x2b, 0x19, 0x1c,
0x9b, 0xe6, 0x30, 0x56, 0x25, 0xc3, 0xe2, 0xa7, 0xd1, 0xce, 0xf7, 0xb5, 0x26, 0x25, 0x21, 0xf1,
0xfc, 0xf4, 0x6d, 0x89, 0xa7, 0x6d, 0x9e, 0x4d, 0xb7, 0xb3, 0x6b, 0xa7, 0xcd, 0x61, 0xd9, 0x98,
0xe9, 0xff, 0x80, 0xa3, 0x6d, 0xa6, 0xb6, 0x69, 0xda, 0x05, 0xd3, 0x7b, 0x18, 0xb6, 0x4b, 0x12,
0x4b, 0xbc, 0x45, 0x8c, 0x9a, 0xc9, 0x36, 0x99, 0x7b, 0x4e, 0x2d, 0xfb, 0xf6, 0xf4, 0x4c, 0x4d,
0xc3, 0x9d, 0x00, 0x5d, 0x3b, 0x4e, 0x7f, 0x91, 0xa8, 0x17, 0x4e, 0x9a, 0x4f, 0xc4, 0xbb, 0xf1,
0x60, 0x6f, 0x8e, 0xaa, 0x0a, 0xcb, 0x76, 0x34, 0xb6, 0x9a, 0xcd, 0xd1, 0xb1, 0xda, 0x86, 0x64,
0xb4, 0x6d, 0xb2, 0xa6, 0xcc, 0xaf, 0x9a, 0x9b, 0x73, 0xd7, 0x30, 0x35, 0x45, 0xfc, 0x0f, 0xad,
0x96, 0xd0, 0x5e, 0x4d, 0x10, 0x49, 0x34, 0x56, 0x24, 0x85, 0x6b, 0x70, 0x7e, 0x68, 0x1b, 0xec,
0x9b, 0x33, 0xb3, 0xfd, 0xcc, 0x7d, 0x4f, 0x62, 0xae, 0x35, 0x5f, 0x54, 0x5f, 0xbd, 0xf9, 0xa8,
0xfe, 0xfe, 0xbd, 0x43, 0x77, 0x57, 0xf5, 0xa3, 0x96, 0xee, 0x9f, 0x35, 0xd4, 0x1c, 0xed, 0xd8,
0xaa, 0xd6, 0x7e, 0x47, 0xf9, 0xce, 0x83, 0xda, 0x1f, 0x41, 0xfd, 0x5a, 0x14, 0x47, 0x76, 0xdb,
0x06, 0xb5, 0xb8, 0xee, 0x5b, 0x27, 0xe1, 0x87, 0x2b, 0xe3, 0x8a, 0xaf, 0xf5, 0x4b, 0xf6, 0x7e,
0x18, 0xae, 0xa5, 0xdb, 0xda, 0xed, 0xde, 0x63, 0xd3, 0x71, 0x2d, 0x8a, 0xaf, 0x36, 0x77, 0x8f,
0xed, 0xd3, 0x3a, 0x0f, 0x37, 0x6a, 0xc3, 0x03, 0x6a, 0x46, 0xf1, 0x43, 0x0d, 0x2b, 0x75, 0xaf,
0xf4, 0xaf, 0x32, 0xff, 0x05, 0x5b, 0x4a, 0x2f, 0x9e, 0x3a, 0x23, 0x00, 0x00
0x23, 0x8f, 0xd1, 0x9d, 0x5c, 0x42, 0x9d, 0x3f, 0xc0, 0xaa, 0x60, 0x53, 0xb8, 0x03, 0x5b, 0x06,
0x9d, 0x4a, 0x94, 0xe1, 0xa2, 0xa8, 0x4d, 0xbb, 0x38, 0x1a, 0xfd, 0x26, 0xa6, 0x54, 0x31, 0x96,
0x39, 0x02, 0xe1, 0x68, 0x34, 0x11, 0xc5, 0x25, 0x92, 0x20, 0x0e, 0xac, 0x8d, 0x22, 0xc4, 0x75,
0xd3, 0x47, 0x3a, 0x6b, 0x52, 0x8d, 0xd3, 0xdc, 0x0c, 0xbf, 0x9c, 0x20, 0x10, 0xa2, 0x6b, 0x97,
0xb8, 0x42, 0xfe, 0xe3, 0x11, 0xb7, 0x2d, 0x5f, 0x75, 0x29, 0xa8, 0x11, 0x7a, 0xa9, 0x9c, 0x49,
0x88, 0x72, 0x7e, 0xba, 0xc3, 0x66, 0xd3, 0xdf, 0x56, 0xac, 0x26, 0xe7, 0x6e, 0xed, 0x50, 0x8e,
0x3a, 0x1f, 0x16, 0x74, 0x95, 0x97, 0xa6, 0xea, 0x8a, 0x4a, 0x0b, 0x98, 0xd4, 0x5d, 0x2f, 0xca,
0xff, 0x8d, 0xea, 0x0b, 0x24, 0x67, 0x60, 0x14, 0x8f, 0xac, 0xcc, 0x24, 0x8e, 0x3e, 0xdd, 0xac,
0x2e, 0xa8, 0xa0, 0x07, 0x92, 0xb8, 0x0c, 0xee, 0xae, 0xbe, 0x19, 0xdd, 0x68, 0xd2, 0x91, 0x6e,
0x19, 0x01, 0x9b, 0x74, 0xfe, 0xa5, 0x4a, 0x76, 0x25, 0xd3, 0x94, 0x65, 0x02, 0xd2, 0x61, 0x9d,
0xed, 0x07, 0x80, 0x42, 0x2c, 0x9a, 0xa3, 0xbb, 0x60, 0x72, 0xc6, 0x4a, 0xdb, 0x24, 0x45, 0x2c,
0x91, 0xb3, 0x99, 0x28, 0xe8, 0x1e, 0xb5, 0x62, 0xe1, 0xd7, 0xbc, 0x55, 0x53, 0x2c, 0xd0, 0x6d,
0x0c, 0x50, 0x44, 0x3b, 0xee, 0xef, 0xc5, 0x0c, 0x2f, 0x0b, 0x2b, 0xcb, 0x92, 0xb8, 0x41, 0x03,
0x6c, 0x81, 0xe3, 0x9c, 0xde, 0xd0, 0xc5, 0x7d, 0x36, 0x17, 0x3a, 0x18, 0x1e, 0x48, 0xa7, 0x2f,
0x9d, 0x12, 0x8a, 0x0a, 0x6a, 0x75, 0x47, 0x9d, 0xba, 0x9e, 0xaa, 0x75, 0x0c, 0x82, 0xa0, 0x76,
0xd5, 0x8f, 0x74, 0xef, 0xfe, 0x02, 0x98, 0x10, 0x01, 0xfd, 0x63, 0x61, 0xef, 0x5f, 0x5c, 0x50,
0x55, 0x87, 0x2c, 0x85, 0x05, 0x9d, 0x87, 0x1b, 0x63, 0x77, 0xee, 0xb8, 0x4d, 0xe0, 0x54, 0x88,
0x5d, 0x54, 0x77, 0xe4, 0x3b, 0xb7, 0x0f, 0xa3, 0xcd, 0x29, 0xb8, 0x83, 0x69, 0xe7, 0x1e, 0x17,
0x36, 0x4c, 0xdd, 0x65, 0xf7, 0xa3, 0x98, 0x76, 0x76, 0x45, 0xbd, 0x9f, 0xa9, 0x4c, 0x1e, 0xe0,
0xd8, 0xb9, 0x5f, 0xf9, 0x7b, 0x39, 0xba, 0x5b, 0xf5, 0x3b, 0x99, 0x76, 0xbe, 0x66, 0xd1, 0x87,
0x98, 0xe6, 0x57, 0xc5, 0x2d, 0xa6, 0x9d, 0x07, 0x2d, 0xfa, 0x08, 0xa6, 0xe2, 0x3a, 0xe7, 0x8d,
0x96, 0x8f, 0x72, 0xd3, 0x7d, 0x07, 0xad, 0xe1, 0x6a, 0xef, 0xe5, 0xff, 0x9c, 0xeb, 0xb7, 0xe3,
0xa9, 0xbe, 0x40, 0x5a, 0xca, 0x2c, 0xe4, 0x3d, 0x8b, 0x01, 0x21, 0x3f, 0xfa, 0x9f, 0x1e, 0x01,
0xa6, 0xc8, 0x43, 0x7e, 0xd8, 0x52, 0x41, 0x6d, 0x19, 0xfa, 0x4f, 0xb9, 0xee, 0x11, 0xdb, 0x6c,
0x94, 0x52, 0xb3, 0xd9, 0x7d, 0x1b, 0x7d, 0x8b, 0x8d, 0xdc, 0x17, 0x84, 0x3b, 0x8d, 0x74, 0xca,
0xa8, 0x0e, 0x64, 0x54, 0x93, 0xd9, 0x8f, 0x37, 0x0f, 0x73, 0x43, 0x41, 0x47, 0xa9, 0xc7, 0x1e,
0xfb, 0x90, 0x53, 0x41, 0xd9, 0x16, 0x8d, 0x28, 0xb6, 0x4a, 0xcb, 0x3a, 0xe5, 0x6c, 0xe7, 0x02,
0x42, 0xc5, 0xdf, 0x16, 0x37, 0xec, 0xca, 0xa6, 0x02, 0xd0, 0x8d, 0x19, 0x01, 0xc8, 0xde, 0x77,
0xd7, 0x87, 0x3f, 0x3f, 0xff, 0xcb, 0x8b, 0x81, 0x65, 0x58, 0xa1, 0xfb, 0xb7, 0xb8, 0x30, 0xa8,
0xad, 0x7b, 0x18, 0x34, 0xd6, 0xc5, 0x60, 0xe5, 0x47, 0x57, 0x9e, 0xd9, 0xef, 0x25, 0x17, 0x26,
0x9a, 0x6e, 0x9b, 0xf9, 0x4f, 0x04, 0xf8, 0x43, 0x7b, 0x76, 0x1e, 0xda, 0x74, 0x3a, 0xff, 0xf3,
0xae, 0xed, 0xb4, 0xf3, 0xd5, 0x86, 0xa1, 0xcd, 0xb6, 0x96, 0x61, 0x2b, 0x71, 0x3d, 0xff, 0x3a,
0xfb, 0x47, 0xe1, 0xd5, 0x56, 0xed, 0xbd, 0x7b, 0xb1, 0xdb, 0x69, 0xa2, 0xe0, 0x87, 0x4d, 0xf9,
0xbe, 0x7b, 0x51, 0xf9, 0xc3, 0x26, 0x21, 0xb8, 0x91, 0xc7, 0xa2, 0xf1, 0xae, 0x9e, 0x55, 0x31,
0x7d, 0x5b, 0x2f, 0x97, 0x4d, 0xea, 0x4d, 0x7e, 0x55, 0x6e, 0x9b, 0xe6, 0x30, 0xda, 0x4f, 0x3e,
0xc8, 0x36, 0x3f, 0x8d, 0x76, 0x3e, 0x67, 0x35, 0x29, 0x09, 0x89, 0xe7, 0xa7, 0x6f, 0x4b, 0x3c,
0x6d, 0xf3, 0x6c, 0x9a, 0x8b, 0x5d, 0x3b, 0x6d, 0x0e, 0xcb, 0xc6, 0x4c, 0xff, 0x07, 0x1c, 0x6d,
0x6f, 0x6a, 0x7b, 0x94, 0x5d, 0x30, 0xbd, 0x67, 0xc3, 0x96, 0xb1, 0x1c, 0xf3, 0x16, 0x33, 0xea,
0xdd, 0xda, 0x6c, 0xee, 0x39, 0xb5, 0xec, 0xdb, 0xd3, 0x33, 0xd5, 0xe8, 0x77, 0x02, 0x74, 0xed,
0x38, 0xfd, 0x45, 0xa2, 0x5e, 0x38, 0x69, 0xbe, 0xc8, 0xee, 0xc6, 0x83, 0xbd, 0xa8, 0xa9, 0xea,
0x75, 0xdb, 0x40, 0xd8, 0xe2, 0x31, 0x47, 0x83, 0x68, 0xeb, 0xff, 0xd1, 0xb6, 0xc9, 0x9a, 0xaa,
0xba, 0xea, 0x25, 0xce, 0x5d, 0x7f, 0xd2, 0xd4, 0xcc, 0x3f, 0xb4, 0x3a, 0x30, 0x7b, 0x13, 0x40,
0x2c, 0xd1, 0xc7, 0x90, 0x14, 0xae, 0x9f, 0xf8, 0xa1, 0x6d, 0xb0, 0x6f, 0xce, 0xcc, 0xf6, 0xab,
0xf2, 0x3d, 0x89, 0xb9, 0xd6, 0x7c, 0x51, 0x7d, 0x64, 0xe6, 0xa3, 0xfa, 0x73, 0xf3, 0x0e, 0xdf,
0x5d, 0xd5, 0x8f, 0x5a, 0xba, 0x7f, 0xd6, 0x50, 0x73, 0xb4, 0x63, 0xab, 0x5a, 0xfb, 0x1d, 0xe5,
0x3b, 0x0f, 0x6a, 0x7f, 0x04, 0xf5, 0x6b, 0x51, 0x1c, 0xdb, 0x6d, 0x1b, 0xd4, 0xe2, 0xba, 0x4f,
0x8b, 0x84, 0x1f, 0xae, 0x8c, 0x2b, 0xbe, 0xd6, 0x9e, 0xd8, 0xeb, 0x58, 0xb8, 0x96, 0x2e, 0x47,
0xb7, 0x4b, 0xfd, 0x4d, 0x83, 0xb3, 0x28, 0xbe, 0xda, 0x4b, 0x3d, 0xb6, 0x2d, 0xea, 0x3c, 0xdc,
0x17, 0x0d, 0x0f, 0xa8, 0xf7, 0xc3, 0x0f, 0xf5, 0x87, 0xd4, 0x2c, 0xd2, 0x7f, 0xa6, 0xfc, 0x17,
0x07, 0x60, 0x31, 0xcc, 0xa9, 0x22, 0x00, 0x00
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -650,6 +650,7 @@ void serializeInfo(JsonObject root)
root[F("name")] = serverDescription;
root[F("udpport")] = udpPort;
root[F("simplifiedui")] = simplifiedUI;
root["live"] = (bool)realtimeMode;
root[F("liveseg")] = useMainSegmentOnly ? strip.getMainSegmentId() : -1; // if using main segment only for live
@ -945,11 +946,11 @@ void serializeNetworks(JsonObject root)
for (int i = 0; i < status; i++) {
JsonObject node = networks.createNestedObject();
node["ssid"] = WiFi.SSID(i);
node["rssi"] = WiFi.RSSI(i);
node["bssid"] = WiFi.BSSIDstr(i);
node["channel"] = WiFi.channel(i);
node["enc"] = WiFi.encryptionType(i);
node[F("ssid")] = WiFi.SSID(i);
node[F("rssi")] = WiFi.RSSI(i);
node[F("bssid")] = WiFi.BSSIDstr(i);
node[F("channel")] = WiFi.channel(i);
node[F("enc")] = WiFi.encryptionType(i);
}
WiFi.scanDelete();
@ -1012,7 +1013,7 @@ static volatile bool servingClient = false;
void serveJson(AsyncWebServerRequest* request)
{
if (servingClient) {
request->send(503, "application/json", F("{\"error\":2}")); // ERR_CONCURENCY
serveJsonError(request, 503, ERR_CONCURRENCY);
return;
}
servingClient = true;
@ -1044,13 +1045,13 @@ void serveJson(AsyncWebServerRequest* request)
return;
}
else if (url.length() > 6) { //not just /json
request->send(501, "application/json", F("{\"error\":\"Not implemented\"}"));
serveJsonError(request, 501, ERR_NOT_IMPL);
servingClient = false;
return;
}
if (!requestJSONBufferLock(17)) {
request->send(503, "application/json", F("{\"error\":3}"));
serveJsonError(request, 503, ERR_NOBUF);
servingClient = false;
return;
}

View File

@ -167,7 +167,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
} else {
freqHz = 0;
}
channelSwap = (type == TYPE_SK6812_RGBW || type == TYPE_TM1814) ? request->arg(wo).toInt() : 0;
channelSwap = Bus::hasWhite(type) ? request->arg(wo).toInt() : 0;
if ((type > TYPE_TM1814 && type < TYPE_WS2801) || type >= TYPE_NET_DDP_RGB) { // analog and virtual
maPerLed = 0;
maMax = 0;
@ -221,15 +221,22 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
char bt[4] = "BT"; bt[2] = (i<10?48:55)+i; bt[3] = 0; // button pin (use A,B,C,... if WLED_MAX_BUTTONS>10)
char be[4] = "BE"; be[2] = (i<10?48:55)+i; be[3] = 0; // button type (use A,B,C,... if WLED_MAX_BUTTONS>10)
int hw_btn_pin = request->arg(bt).toInt();
if (pinManager.allocatePin(hw_btn_pin,false,PinOwner::Button)) {
if (hw_btn_pin >= 0 && pinManager.allocatePin(hw_btn_pin,false,PinOwner::Button)) {
btnPin[i] = hw_btn_pin;
buttonType[i] = request->arg(be).toInt();
#ifdef ARDUINO_ARCH_ESP32
// ESP32 only: check that analog button pin is a valid ADC gpio
// ESP32 only: check that button pin is a valid gpio
if (((buttonType[i] == BTN_TYPE_ANALOG) || (buttonType[i] == BTN_TYPE_ANALOG_INVERTED)) && (digitalPinToAnalogChannel(btnPin[i]) < 0))
{
// not an ADC analog pin
if (btnPin[i] >= 0) DEBUG_PRINTF("PIN ALLOC error: GPIO%d for analog button #%d is not an analog pin!\n", btnPin[i], i);
DEBUG_PRINTF("PIN ALLOC error: GPIO%d for analog button #%d is not an analog pin!\n", btnPin[i], i);
btnPin[i] = -1;
pinManager.deallocatePin(hw_btn_pin,PinOwner::Button);
}
else if ((buttonType[i] == BTN_TYPE_TOUCH || buttonType[i] == BTN_TYPE_TOUCH_SWITCH) && digitalPinToTouchChannel(btnPin[i]) < 0)
{
// not a touch pin
DEBUG_PRINTF("PIN ALLOC error: GPIO%d for touch button #%d is not an touch pin!\n", btnPin[i], i);
btnPin[i] = -1;
pinManager.deallocatePin(hw_btn_pin,PinOwner::Button);
}
@ -296,13 +303,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
{
strlcpy(serverDescription, request->arg(F("DS")).c_str(), 33);
//syncToggleReceive = request->hasArg(F("ST"));
#ifdef WLED_ENABLE_SIMPLE_UI
if (simplifiedUI ^ request->hasArg(F("SU"))) {
// UI selection changed, invalidate browser cache
cacheInvalidate++;
}
simplifiedUI = request->hasArg(F("SU"));
#endif
DEBUG_PRINTLN(F("Enumerating ledmaps"));
enumerateLedmaps();
DEBUG_PRINTLN(F("Loading custom palettes"));

View File

@ -139,9 +139,9 @@ void notify(byte callMode, bool followUp)
udpOut[29+ofs] = selseg.custom1;
udpOut[30+ofs] = selseg.custom2;
udpOut[31+ofs] = selseg.custom3 | (selseg.check1<<5) | (selseg.check2<<6) | (selseg.check3<<7);
udpOut[32+ofs] = selseg.startY >> 8;
udpOut[32+ofs] = selseg.startY >> 8; // ATM always 0 as Segment::startY is 8-bit
udpOut[33+ofs] = selseg.startY & 0xFF;
udpOut[34+ofs] = selseg.stopY >> 8;
udpOut[34+ofs] = selseg.stopY >> 8; // ATM always 0 as Segment::stopY is 8-bit
udpOut[35+ofs] = selseg.stopY & 0xFF;
++s;
}
@ -272,6 +272,7 @@ void parseNotifyPacket(uint8_t *udpIn) {
if (!receiveSegmentBounds) {
if (!selseg.isActive()) {
inactiveSegs++;
DEBUG_PRINTLN(F("Inactive segment."));
continue;
} else {
id += inactiveSegs; // adjust id
@ -279,24 +280,29 @@ void parseNotifyPacket(uint8_t *udpIn) {
}
DEBUG_PRINT(F("UDP segment processing: ")); DEBUG_PRINTLN(id);
uint16_t startY = 0, start = (udpIn[1+ofs] << 8 | udpIn[2+ofs]);
uint16_t stopY = 1, stop = (udpIn[3+ofs] << 8 | udpIn[4+ofs]);
uint16_t start = (udpIn[1+ofs] << 8 | udpIn[2+ofs]);
uint16_t stop = (udpIn[3+ofs] << 8 | udpIn[4+ofs]);
uint16_t startY = version > 11 ? (udpIn[32+ofs] << 8 | udpIn[33+ofs]) : 0;
uint16_t stopY = version > 11 ? (udpIn[34+ofs] << 8 | udpIn[35+ofs]) : 1;
uint16_t offset = (udpIn[7+ofs] << 8 | udpIn[8+ofs]);
if (!receiveSegmentOptions) {
//selseg.setUp(start, stop, selseg.grouping, selseg.spacing, offset, startY, stopY);
// we have to use strip.setSegment() instead of selseg.setUp() to prevent crash if segment would change during drawing
DEBUG_PRINTF("Set segment w/o options: %d [%d,%d;%d,%d]\n", id, (int)start, (int)stop, (int)startY, (int)stopY);
strip.setSegment(id, start, stop, selseg.grouping, selseg.spacing, offset, startY, stopY);
continue; // we do receive bounds, but not options
}
selseg.options = (selseg.options & 0x0071U) | (udpIn[9 +ofs] & 0x0E); // ignore selected, freeze, reset & transitional
selseg.setOpacity(udpIn[10+ofs]);
if (applyEffects) {
DEBUG_PRINT(F("Apply effect: ")); DEBUG_PRINTLN(id);
selseg.setMode(udpIn[11+ofs]);
selseg.speed = udpIn[12+ofs];
selseg.intensity = udpIn[13+ofs];
selseg.palette = udpIn[14+ofs];
}
if (receiveNotificationColor || !someSel) {
DEBUG_PRINT(F("Apply color: ")); DEBUG_PRINTLN(id);
selseg.setColor(0, RGBW32(udpIn[15+ofs],udpIn[16+ofs],udpIn[17+ofs],udpIn[18+ofs]));
selseg.setColor(1, RGBW32(udpIn[19+ofs],udpIn[20+ofs],udpIn[21+ofs],udpIn[22+ofs]));
selseg.setColor(2, RGBW32(udpIn[23+ofs],udpIn[24+ofs],udpIn[25+ofs],udpIn[26+ofs]));
@ -306,8 +312,10 @@ void parseNotifyPacket(uint8_t *udpIn) {
// when applying synced options ignore selected as it may be used as indicator of which segments to sync
// freeze, reset should never be synced
// LSB to MSB: select, reverse, on, mirror, freeze, reset, reverse_y, mirror_y, transpose, map1d2d (3), ssim (2), set (2)
DEBUG_PRINT(F("Apply options: ")); DEBUG_PRINTLN(id);
selseg.options = (selseg.options & 0b0000000000110001U) | (udpIn[28+ofs]<<8) | (udpIn[9 +ofs] & 0b11001110U); // ignore selected, freeze, reset
if (applyEffects) {
DEBUG_PRINT(F("Apply sliders: ")); DEBUG_PRINTLN(id);
selseg.custom1 = udpIn[29+ofs];
selseg.custom2 = udpIn[30+ofs];
selseg.custom3 = udpIn[31+ofs] & 0x1F;
@ -315,14 +323,14 @@ void parseNotifyPacket(uint8_t *udpIn) {
selseg.check1 = (udpIn[31+ofs]>>6) & 0x1;
selseg.check1 = (udpIn[31+ofs]>>7) & 0x1;
}
startY = (udpIn[32+ofs] << 8 | udpIn[33+ofs]);
stopY = (udpIn[34+ofs] << 8 | udpIn[35+ofs]);
}
if (receiveSegmentBounds) {
DEBUG_PRINTF("Set segment w/ options: %d [%d,%d;%d,%d]\n", id, (int)start, (int)stop, (int)startY, (int)stopY);
// we have to use strip.setSegment() instead of selseg.setUp() to prevent crash if segment would change during drawing
strip.setSegment(id, start, stop, udpIn[5+ofs], udpIn[6+ofs], offset, startY, stopY);
} else {
// we have to use strip.setSegment() instead of selseg.setUp() to prevent crash if segment would change during drawing
DEBUG_PRINTF("Set segment grouping: %d [%d,%d]\n", id, (int)udpIn[5+ofs], (int)udpIn[6+ofs]);
strip.setSegment(id, selseg.start, selseg.stop, udpIn[5+ofs], udpIn[6+ofs], selseg.offset, selseg.startY, selseg.stopY);
}
}

View File

@ -8,7 +8,7 @@
*/
// version code in format yymmddb (b = daily build)
#define VERSION 2312020
#define VERSION 2312190
//uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG
@ -365,7 +365,7 @@ WLED_GLOBAL char serverDescription[33] _INIT(SERVERNAME); // use predefined nam
#endif
//WLED_GLOBAL bool syncToggleReceive _INIT(false); // UIs which only have a single button for sync should toggle send+receive if this is true, only send otherwise
WLED_GLOBAL bool simplifiedUI _INIT(false); // enable simplified UI
WLED_GLOBAL byte cacheInvalidate _INIT(0); // used to invalidate browser cache when switching from regular to simplified UI
WLED_GLOBAL byte cacheInvalidate _INIT(0); // used to invalidate browser cache
// Sync CONFIG
WLED_GLOBAL NodesMap Nodes;

View File

@ -1,9 +1,6 @@
#include "wled.h"
#include "html_ui.h"
#ifdef WLED_ENABLE_SIMPLE_UI
#include "html_simple.h"
#endif
#include "html_settings.h"
#include "html_other.h"
#ifdef WLED_ENABLE_PIXART
@ -149,11 +146,15 @@ void initServer()
request->send(response);
});
server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request){
if(!handleFileRead(request, "/favicon.ico"))
{
request->send_P(200, "image/x-icon", favicon, 156);
}
server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request) {
if (handleFileRead(request, "/favicon.ico")) return;
request->send_P(200, "image/x-icon", favicon, 156);
});
server.on("/skin.css", HTTP_GET, [](AsyncWebServerRequest *request) {
if (handleFileRead(request, "/skin.css")) return;
AsyncWebServerResponse *response = request->beginResponse(200, "text/css");
request->send(response);
});
server.on("/welcome", HTTP_GET, [](AsyncWebServerRequest *request){
@ -183,7 +184,7 @@ void initServer()
JsonObject root = doc.as<JsonObject>();
if (error || root.isNull()) {
releaseJSONBufferLock();
request->send(400, "application/json", F("{\"error\":9}")); // ERR_JSON
serveJsonError(request, 400, ERR_JSON);
return;
}
if (root.containsKey("pin")) checkSettingsPIN(root["pin"].as<const char*>());
@ -201,8 +202,8 @@ void initServer()
verboseResponse = deserializeState(root);
} else {
if (!correctPIN && strlen(settingsPIN)>0) {
request->send(401, "application/json", F("{\"error\":1}")); // ERR_DENIED
releaseJSONBufferLock();
serveJsonError(request, 401, ERR_DENIED);
return;
}
verboseResponse = deserializeConfig(root); //use verboseResponse to determine whether cfg change should be saved immediately
@ -253,31 +254,6 @@ void initServer()
size_t len, bool final) {handleUpload(request, filename, index, data, len, final);}
);
#ifdef WLED_ENABLE_SIMPLE_UI
server.on("/simple.htm", HTTP_GET, [](AsyncWebServerRequest *request){
if (handleFileRead(request, "/simple.htm")) return;
if (handleIfNoneMatchCacheHeader(request)) return;
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_simple, PAGE_simple_L);
response->addHeader(FPSTR(s_content_enc),"gzip");
setStaticContentCacheHeaders(response);
request->send(response);
});
#endif
server.on("/iro.js", HTTP_GET, [](AsyncWebServerRequest *request){
AsyncWebServerResponse *response = request->beginResponse_P(200, "application/javascript", iroJs, iroJs_length);
response->addHeader(FPSTR(s_content_enc),"gzip");
setStaticContentCacheHeaders(response);
request->send(response);
});
server.on("/rangetouch.js", HTTP_GET, [](AsyncWebServerRequest *request){
AsyncWebServerResponse *response = request->beginResponse_P(200, "application/javascript", rangetouchJs, rangetouchJs_length);
response->addHeader(FPSTR(s_content_enc),"gzip");
setStaticContentCacheHeaders(response);
request->send(response);
});
createEditHandler(correctPIN);
#ifndef WLED_DISABLE_OTA
@ -420,29 +396,29 @@ void initServer()
});
}
bool handleIfNoneMatchCacheHeader(AsyncWebServerRequest* request)
{
AsyncWebHeader* header = request->getHeader("If-None-Match");
if (header && header->value() == String(VERSION)) {
bool handleIfNoneMatchCacheHeader(AsyncWebServerRequest *request) {
AsyncWebHeader *header = request->getHeader("If-None-Match");
char etag[11];
sprintf_P(etag, PSTR("%7d-%02x"), VERSION, cacheInvalidate);
if (header && header->value() == etag) {
request->send(304);
return true;
}
return false;
}
void setStaticContentCacheHeaders(AsyncWebServerResponse *response)
{
char tmp[12];
void setStaticContentCacheHeaders(AsyncWebServerResponse *response) {
// https://medium.com/@codebyamir/a-web-developers-guide-to-browser-caching-cc41f3b73e7c
#ifndef WLED_DEBUG
//this header name is misleading, "no-cache" will not disable cache,
//it just revalidates on every load using the "If-None-Match" header with the last ETag value
response->addHeader(F("Cache-Control"),"no-cache");
// this header name is misleading, "no-cache" will not disable cache,
// it just revalidates on every load using the "If-None-Match" header with the last ETag value
response->addHeader(F("Cache-Control"), "no-cache");
#else
response->addHeader(F("Cache-Control"),"no-store,max-age=0"); // prevent caching if debug build
response->addHeader(F("Cache-Control"), "no-store,max-age=0"); // prevent caching if debug build
#endif
sprintf_P(tmp, PSTR("%8d-%02x"), VERSION, cacheInvalidate);
response->addHeader(F("ETag"), tmp);
char etag[11];
sprintf_P(etag, PSTR("%7d-%02x"), VERSION, cacheInvalidate);
response->addHeader(F("ETag"), etag);
}
void serveIndex(AsyncWebServerRequest* request)
@ -451,13 +427,7 @@ void serveIndex(AsyncWebServerRequest* request)
if (handleIfNoneMatchCacheHeader(request)) return;
AsyncWebServerResponse *response;
#ifdef WLED_ENABLE_SIMPLE_UI
if (simplifiedUI)
response = request->beginResponse_P(200, "text/html", PAGE_simple, PAGE_simple_L);
else
#endif
response = request->beginResponse_P(200, "text/html", PAGE_index, PAGE_index_L);
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_index, PAGE_index_L);
response->addHeader(FPSTR(s_content_enc),"gzip");
setStaticContentCacheHeaders(response);
@ -509,6 +479,18 @@ void serveMessage(AsyncWebServerRequest* request, uint16_t code, const String& h
}
void serveJsonError(AsyncWebServerRequest* request, uint16_t code, uint16_t error)
{
AsyncJsonResponse *response = new AsyncJsonResponse(64);
if (error < ERR_NOT_IMPL) response->addHeader("Retry-After", "1");
response->setContentType("application/json");
response->setCode(code);
JsonObject obj = response->getRoot();
obj[F("error")] = error;
response->setLength();
request->send(response);
}
#ifdef WLED_ENABLE_DMX
String dmxProcessor(const String& var)
{

View File

@ -475,11 +475,7 @@ void getSettingsJS(byte subPage, char* dest)
{
sappends('s',SET_F("DS"),serverDescription);
//sappend('c',SET_F("ST"),syncToggleReceive);
#ifdef WLED_ENABLE_SIMPLE_UI
sappend('c',SET_F("SU"),simplifiedUI);
#else
oappend(SET_F("toggle('Simple');")); // hide Simplified UI settings
#endif
}
if (subPage == SUBPAGE_SYNC)