Merge branch 'Aircoookie:main' into pr_fxsegs

This commit is contained in:
mx 2022-11-26 17:15:55 +01:00 committed by GitHub
commit 5c721ee435
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 1568 additions and 1342 deletions

View File

@ -399,10 +399,10 @@ build_unflags = ${common.build_unflags}
lib_deps = ${esp32c3.lib_deps}
[env:esp32s3dev_8MB]
;; ESP32-S3-DevKitC-1 development board, with 8MB FLASH, no PSRAM
;; ESP32-S3-DevKitC-1 development board, with 8MB FLASH, no PSRAM (flash_mode: qio)
board = esp32-s3-devkitc-1
platform = espressif32@5.1.1
platform_packages = platformio/framework-arduinoespressif32@3.20004.220825
platform_packages =
upload_speed = 921600
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} ${esp32s3.build_flags} -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=0 -D ARDUINO_USB_MSC_ON_BOOT=0
@ -412,6 +412,26 @@ board_build.f_flash = 80000000L
board_build.flash_mode = qio
monitor_filters = esp32_exception_decoder
[env:esp32s3dev_8MB_PSRAM]
;; ESP32-TinyS3 development board, with 8MB FLASH and 8MB PSRAM (memory_type: qio_opi, qio_qspi, or opi_opi)
;board = um_tinys3 ; -> needs workaround from https://github.com/Aircoookie/WLED/pull/2905#issuecomment-1328049860
;board = esp32s3box ; -> error: 'esp32_adc2gpio' was not declared in this scope
board = esp32-s3-devkitc-1 ; -> compiles, but does not support PSRAM
platform = espressif32 @ ~5.2.0
platform_packages =
upload_speed = 921600
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags} ${esp32s3.build_flags}
-D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_MSC_ON_BOOT=0
; -D ARDUINO_USB_CDC_ON_BOOT=0
; -D WLED_RELEASE_NAME=ESP32-S3_PSRAM
-D WLED_USE_PSRAM -DBOARD_HAS_PSRAM ; tells WLED that PSRAM shall be used
lib_deps = ${esp32s3.lib_deps}
board_build.partitions = tools/WLED_ESP32_8MB.csv
board_build.f_flash = 80000000L
board_build.flash_mode = qio
monitor_filters = esp32_exception_decoder
[env:esp8285_4CH_MagicHome]
board = esp8285
platform = ${common.platform_wled_default}
@ -515,9 +535,12 @@ build_flags = ${common.build_flags_esp32}
-D USERMOD_DALLASTEMPERATURE
-D USERMOD_FOUR_LINE_DISPLAY
-D TEMPERATURE_PIN=23
-D USE_ALT_DISPlAY ; new versions of USERMOD_FOUR_LINE_DISPLAY and USERMOD_ROTARY_ENCODER_UI
-D USERMOD_AUDIOREACTIVE
lib_deps = ${esp32.lib_deps}
OneWire@~2.3.5
olikraus/U8g2 @ ^2.28.8
https://github.com/blazoncek/arduinoFFT.git
board_build.partitions = ${esp32.default_partitions}
[env:m5atom]

View File

@ -16,14 +16,15 @@ private:
// NOTE: Do not implement any compile-time variables, anything the user needs to configure
// should be configurable from the Usermod menu using the methods below
// key settings set via usermod menu
unsigned long TemperatureDecimals = 0; // Number of decimal places in published temperaure values
unsigned long HumidityDecimals = 0; // Number of decimal places in published humidity values
unsigned long PressureDecimals = 0; // Number of decimal places in published pressure values
unsigned long TemperatureInterval = 5; // Interval to measure temperature (and humidity, dew point if available) in seconds
unsigned long PressureInterval = 300; // Interval to measure pressure in seconds
uint8_t TemperatureDecimals = 0; // Number of decimal places in published temperaure values
uint8_t HumidityDecimals = 0; // Number of decimal places in published humidity values
uint8_t PressureDecimals = 0; // Number of decimal places in published pressure values
uint16_t TemperatureInterval = 5; // Interval to measure temperature (and humidity, dew point if available) in seconds
uint16_t PressureInterval = 300; // Interval to measure pressure in seconds
bool PublishAlways = false; // Publish values even when they have not changed
bool UseCelsius = true; // Use Celsius for Reporting
bool HomeAssistantDiscovery = false; // Publish Home Assistant Device Information
bool enabled = true;
// set the default pins based on the architecture, these get overridden by Usermod menu settings
#ifdef ESP8266
@ -70,15 +71,10 @@ private:
// MQTT topic strings for publishing Home Assistant discovery topics
bool mqttInitialized = false;
String mqttTemperatureTopic = "";
String mqttHumidityTopic = "";
String mqttPressureTopic = "";
String mqttHeatIndexTopic = "";
String mqttDewPointTopic = "";
// Store packet IDs of MQTT publications
uint16_t mqttTemperaturePub = 0;
uint16_t mqttPressurePub = 0;
// strings to reduce flash memory usage (used more than twice)
static const char _name[];
static const char _enabled[];
// Read the BME280/BMP280 Sensor (which one runs depends on whether Celsius or Farenheit being set in Usermod Menu)
void UpdateBME280Data(int SensorType)
@ -95,7 +91,7 @@ private:
sensorTemperature = _temperature;
sensorHumidity = _humidity;
sensorPressure = _pressure;
tempScale = "°C";
tempScale = F("°C");
if (sensorType == 1)
{
sensorHeatIndex = EnvironmentCalculations::HeatIndex(_temperature, _humidity, envTempUnit);
@ -111,7 +107,7 @@ private:
sensorTemperature = _temperature;
sensorHumidity = _humidity;
sensorPressure = _pressure;
tempScale = "°F";
tempScale = F("°F");
if (sensorType == 1)
{
sensorHeatIndex = EnvironmentCalculations::HeatIndex(_temperature, _humidity, envTempUnit);
@ -123,18 +119,23 @@ private:
// Procedure to define all MQTT discovery Topics
void _mqttInitialize()
{
mqttTemperatureTopic = String(mqttDeviceTopic) + F("/temperature");
mqttPressureTopic = String(mqttDeviceTopic) + F("/pressure");
mqttHumidityTopic = String(mqttDeviceTopic) + F("/humidity");
mqttHeatIndexTopic = String(mqttDeviceTopic) + F("/heat_index");
mqttDewPointTopic = String(mqttDeviceTopic) + F("/dew_point");
char mqttTemperatureTopic[128];
char mqttHumidityTopic[128];
char mqttPressureTopic[128];
char mqttHeatIndexTopic[128];
char mqttDewPointTopic[128];
snprintf_P(mqttTemperatureTopic, 127, PSTR("%s/temperature"), mqttDeviceTopic);
snprintf_P(mqttPressureTopic, 127, PSTR("%s/pressure"), mqttDeviceTopic);
snprintf_P(mqttHumidityTopic, 127, PSTR("%s/humidity"), mqttDeviceTopic);
snprintf_P(mqttHeatIndexTopic, 127, PSTR("%s/heat_index"), mqttDeviceTopic);
snprintf_P(mqttDewPointTopic, 127, PSTR("%s/dew_point"), mqttDeviceTopic);
if (HomeAssistantDiscovery) {
_createMqttSensor(F("Temperature"), mqttTemperatureTopic, F("temperature"), tempScale);
_createMqttSensor(F("Pressure"), mqttPressureTopic, F("pressure"), F("hPa"));
_createMqttSensor(F("Humidity"), mqttHumidityTopic, F("humidity"), F("%"));
_createMqttSensor(F("HeatIndex"), mqttHeatIndexTopic, F("temperature"), tempScale);
_createMqttSensor(F("DewPoint"), mqttDewPointTopic, F("temperature"), tempScale);
_createMqttSensor(F("Temperature"), mqttTemperatureTopic, "temperature", tempScale);
_createMqttSensor(F("Pressure"), mqttPressureTopic, "pressure", F("hPa"));
_createMqttSensor(F("Humidity"), mqttHumidityTopic, "humidity", F("%"));
_createMqttSensor(F("HeatIndex"), mqttHeatIndexTopic, "temperature", tempScale);
_createMqttSensor(F("DewPoint"), mqttDewPointTopic, "temperature", tempScale);
}
}
@ -169,6 +170,15 @@ private:
mqtt->publish(t.c_str(), 0, true, temp.c_str());
}
void publishMqtt(const char *topic, const char* state) {
//Check if MQTT Connected, otherwise it will crash the 8266
if (WLED_MQTT_CONNECTED){
char subuf[128];
snprintf_P(subuf, 127, PSTR("%s/%s"), mqttDeviceTopic, topic);
mqtt->publish(subuf, 0, false, state);
}
}
public:
void setup()
{
@ -183,7 +193,7 @@ public:
if (!bme.begin())
{
sensorType = 0;
DEBUG_PRINTLN(F("Could not find BME280I2C sensor!"));
DEBUG_PRINTLN(F("Could not find BME280 I2C sensor!"));
}
else
{
@ -207,14 +217,16 @@ public:
void loop()
{
if (!enabled || strip.isUpdating()) return;
// BME280 sensor MQTT publishing
// Check if sensor present and MQTT Connected, otherwise it will crash the MCU
if (sensorType != 0 && WLED_MQTT_CONNECTED)
// Check if sensor present and Connected, otherwise it will crash the MCU
if (sensorType != 0)
{
// Timer to fetch new temperature, humidity and pressure data at intervals
timer = millis();
if (timer - lastTemperatureMeasure >= TemperatureInterval * 1000 || mqttTemperaturePub == 0)
if (timer - lastTemperatureMeasure >= TemperatureInterval * 1000)
{
lastTemperatureMeasure = timer;
@ -223,18 +235,11 @@ public:
float temperature = roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
float humidity, heatIndex, dewPoint;
if (WLED_MQTT_CONNECTED && !mqttInitialized)
{
_mqttInitialize();
mqttInitialized = true;
}
// If temperature has changed since last measure, create string populated with device topic
// from the UI and values read from sensor, then publish to broker
if (temperature != lastTemperature || PublishAlways)
{
String topic = String(mqttDeviceTopic) + "/temperature";
mqttTemperaturePub = mqtt->publish(topic.c_str(), 0, false, String(temperature, TemperatureDecimals).c_str());
publishMqtt("temperature", String(temperature, TemperatureDecimals).c_str());
}
lastTemperature = temperature; // Update last sensor temperature for next loop
@ -247,20 +252,17 @@ public:
if (humidity != lastHumidity || PublishAlways)
{
String topic = String(mqttDeviceTopic) + F("/humidity");
mqtt->publish(topic.c_str(), 0, false, String(humidity, HumidityDecimals).c_str());
publishMqtt("humidity", String(humidity, HumidityDecimals).c_str());
}
if (heatIndex != lastHeatIndex || PublishAlways)
{
String topic = String(mqttDeviceTopic) + F("/heat_index");
mqtt->publish(topic.c_str(), 0, false, String(heatIndex, TemperatureDecimals).c_str());
publishMqtt("heat_index", String(heatIndex, TemperatureDecimals).c_str());
}
if (dewPoint != lastDewPoint || PublishAlways)
{
String topic = String(mqttDeviceTopic) + F("/dew_point");
mqtt->publish(topic.c_str(), 0, false, String(dewPoint, TemperatureDecimals).c_str());
publishMqtt("dew_point", String(dewPoint, TemperatureDecimals).c_str());
}
lastHumidity = humidity;
@ -269,7 +271,7 @@ public:
}
}
if (timer - lastPressureMeasure >= PressureInterval * 1000 || mqttPressurePub == 0)
if (timer - lastPressureMeasure >= PressureInterval * 1000)
{
lastPressureMeasure = timer;
@ -277,8 +279,7 @@ public:
if (pressure != lastPressure || PublishAlways)
{
String topic = String(mqttDeviceTopic) + F("/pressure");
mqttPressurePub = mqtt->publish(topic.c_str(), 0, true, String(pressure, PressureDecimals).c_str());
publishMqtt("pressure", String(pressure, PressureDecimals).c_str());
}
lastPressure = pressure;
@ -286,6 +287,15 @@ public:
}
}
void onMqttConnect(bool sessionPresent)
{
if (WLED_MQTT_CONNECTED && !mqttInitialized)
{
_mqttInitialize();
mqttInitialized = true;
}
}
/*
* API calls te enable data exchange between WLED modules
*/
@ -295,8 +305,8 @@ public:
} else {
return (float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) * 1.8f + 32;
}
}
inline float getTemperatureF() {
if (UseCelsius) {
return ((float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) -32) * 0.56f;
@ -304,12 +314,15 @@ public:
return (float)roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
}
}
inline float getHumidity() {
return (float)roundf(sensorHumidity * powf(10, HumidityDecimals));
}
inline float getPressure() {
return (float)roundf(sensorPressure * powf(10, PressureDecimals));
}
inline float getDewPointC() {
if (UseCelsius) {
return (float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
@ -317,6 +330,7 @@ public:
return (float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) * 1.8f + 32;
}
}
inline float getDewPointF() {
if (UseCelsius) {
return ((float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) -32) * 0.56f;
@ -324,13 +338,16 @@ public:
return (float)roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
}
}
inline float getHeatIndexC() {
if (UseCelsius) {
return (float)roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals);
} else {
return (float)roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) * 1.8f + 32;
}
}inline float getHeatIndexF() {
}
inline float getHeatIndexF() {
if (UseCelsius) {
return ((float)roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) -32) * 0.56f;
} else {
@ -384,7 +401,8 @@ public:
// Save Usermod Config Settings
void addToConfig(JsonObject& root)
{
JsonObject top = root.createNestedObject(F("BME280/BMP280"));
JsonObject top = root.createNestedObject(FPSTR(_name));
top[FPSTR(_enabled)] = enabled;
top[F("TemperatureDecimals")] = TemperatureDecimals;
top[F("HumidityDecimals")] = HumidityDecimals;
top[F("PressureDecimals")] = PressureDecimals;
@ -405,17 +423,17 @@ public:
// default settings values could be set here (or below using the 3-argument getJsonValue()) instead of in the class definition or constructor
// setting them inside readFromConfig() is slightly more robust, handling the rare but plausible use case of single value being missing after boot (e.g. if the cfg.json was manually edited and a value was removed)
int8_t newPin[2]; for (byte i=0; i<2; i++) newPin[i] = ioPin[i]; // prepare to note changed pins
JsonObject top = root[F("BME280/BMP280")];
JsonObject top = root[FPSTR(_name)];
if (top.isNull()) {
DEBUG_PRINT(F("BME280/BMP280"));
DEBUG_PRINT(F(_name));
DEBUG_PRINTLN(F(": No config found. (Using defaults.)"));
return false;
}
bool configComplete = !top.isNull();
configComplete &= getJsonValue(top[FPSTR(_enabled)], enabled);
// A 3-argument getJsonValue() assigns the 3rd argument as a default value if the Json value is missing
configComplete &= getJsonValue(top[F("TemperatureDecimals")], TemperatureDecimals, 1);
configComplete &= getJsonValue(top[F("HumidityDecimals")], HumidityDecimals, 0);
@ -427,7 +445,7 @@ public:
configComplete &= getJsonValue(top[F("HomeAssistantDiscovery")], HomeAssistantDiscovery, false);
for (byte i=0; i<2; i++) configComplete &= getJsonValue(top[F("pin")][i], newPin[i], ioPin[i]);
DEBUG_PRINT(FPSTR(F("BME280/BMP280")));
DEBUG_PRINT(FPSTR(_name));
if (!initDone) {
// first run: reading from cfg.json
for (byte i=0; i<2; i++) ioPin[i] = newPin[i];
@ -455,3 +473,6 @@ public:
return USERMOD_ID_BME280;
}
};
const char UsermodBME280::_name[] PROGMEM = "BME280/BMP280";
const char UsermodBME280::_enabled[] PROGMEM = "enabled";

View File

@ -1554,18 +1554,18 @@ class AudioReactive : public Usermod {
pinArray.add(sdaPin);
pinArray.add(sclPin);
JsonObject cfg = top.createNestedObject("cfg");
JsonObject cfg = top.createNestedObject("config");
cfg[F("squelch")] = soundSquelch;
cfg[F("gain")] = sampleGain;
cfg[F("AGC")] = soundAgc;
JsonObject dynLim = top.createNestedObject("dynamics");
dynLim[F("Limiter")] = limiterOn;
dynLim[F("Rise")] = attackTime;
dynLim[F("Fall")] = decayTime;
dynLim[F("limiter")] = limiterOn;
dynLim[F("rise")] = attackTime;
dynLim[F("fall")] = decayTime;
JsonObject freqScale = top.createNestedObject("Frequency");
freqScale[F("Scale")] = FFTScalingMode;
JsonObject freqScale = top.createNestedObject("frequency");
freqScale[F("scale")] = FFTScalingMode;
JsonObject sync = top.createNestedObject("sync");
sync[F("port")] = audioSyncPort;
@ -1605,15 +1605,15 @@ class AudioReactive : public Usermod {
configComplete &= getJsonValue(top[FPSTR(_digitalmic)]["pin"][4], sdaPin);
configComplete &= getJsonValue(top[FPSTR(_digitalmic)]["pin"][5], sclPin);
configComplete &= getJsonValue(top["cfg"][F("squelch")], soundSquelch);
configComplete &= getJsonValue(top["cfg"][F("gain")], sampleGain);
configComplete &= getJsonValue(top["cfg"][F("AGC")], soundAgc);
configComplete &= getJsonValue(top["config"][F("squelch")], soundSquelch);
configComplete &= getJsonValue(top["config"][F("gain")], sampleGain);
configComplete &= getJsonValue(top["config"][F("AGC")], soundAgc);
configComplete &= getJsonValue(top["dynamics"][F("Limiter")], limiterOn);
configComplete &= getJsonValue(top["dynamics"][F("Rise")], attackTime);
configComplete &= getJsonValue(top["dynamics"][F("Fall")], decayTime);
configComplete &= getJsonValue(top["dynamics"][F("limiter")], limiterOn);
configComplete &= getJsonValue(top["dynamics"][F("rise")], attackTime);
configComplete &= getJsonValue(top["dynamics"][F("fall")], decayTime);
configComplete &= getJsonValue(top["Frequency"][F("Scale")], FFTScalingMode);
configComplete &= getJsonValue(top["frequency"][F("scale")], FFTScalingMode);
configComplete &= getJsonValue(top["sync"][F("port")], audioSyncPort);
configComplete &= getJsonValue(top["sync"][F("mode")], audioSyncEnabled);
@ -1635,20 +1635,20 @@ class AudioReactive : public Usermod {
#if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3)
oappend(SET_F("addOption(dd,'Generic I2S PDM',5);"));
#endif
oappend(SET_F("dd=addDropdown('AudioReactive','cfg:AGC');"));
oappend(SET_F("dd=addDropdown('AudioReactive','config:AGC');"));
oappend(SET_F("addOption(dd,'Off',0);"));
oappend(SET_F("addOption(dd,'Normal',1);"));
oappend(SET_F("addOption(dd,'Vivid',2);"));
oappend(SET_F("addOption(dd,'Lazy',3);"));
oappend(SET_F("dd=addDropdown('AudioReactive','dynamics:Limiter');"));
oappend(SET_F("dd=addDropdown('AudioReactive','dynamics:limiter');"));
oappend(SET_F("addOption(dd,'Off',0);"));
oappend(SET_F("addOption(dd,'On',1);"));
oappend(SET_F("addInfo('AudioReactive:dynamics:Limiter',0,' On ');")); // 0 is field type, 1 is actual field
oappend(SET_F("addInfo('AudioReactive:dynamics:Rise',1,'ms <i>(&#x266A; effects only)</i>');"));
oappend(SET_F("addInfo('AudioReactive:dynamics:Fall',1,'ms <i>(&#x266A; effects only)</i>');"));
oappend(SET_F("addInfo('AudioReactive:dynamics:limiter',0,' On ');")); // 0 is field type, 1 is actual field
oappend(SET_F("addInfo('AudioReactive:dynamics:rise',1,'ms <i>(&#x266A; effects only)</i>');"));
oappend(SET_F("addInfo('AudioReactive:dynamics:fall',1,'ms <i>(&#x266A; effects only)</i>');"));
oappend(SET_F("dd=addDropdown('AudioReactive','Frequency:Scale');"));
oappend(SET_F("dd=addDropdown('AudioReactive','frequency:scale');"));
oappend(SET_F("addOption(dd,'None',0);"));
oappend(SET_F("addOption(dd,'Linear (Amplitude)',2);"));
oappend(SET_F("addOption(dd,'Square Root (Energy)',3);"));
@ -1659,16 +1659,16 @@ class AudioReactive : public Usermod {
oappend(SET_F("addOption(dd,'Send',1);"));
oappend(SET_F("addOption(dd,'Receive',2);"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:type',1,'<i>requires reboot!</i>');")); // 0 is field type, 1 is actual field
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',0,'I2S SD');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',1,'I2S WS');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',2,'I2S SCK');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',0,'I2S Serial Data', '<i><span class=\"h\">sd/data/dout</span></i>');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',1,'I2S L/R Clock','<i><span class=\"h\">ws/clk/lrck</span></i>');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',2,'I2S Serial Clock','<i>sck/bclk</i>');"));
#if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3)
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',3,'I2S Master CLK <i>only use -1, 0, 1 or 3 for MCLK</i>');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',3,'I2S Master CLK','<i>only use -1, 0, 1 or 3</i>');"));
#else
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',3,'I2S Master CLK');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',3,'', 'I2S Master CLK');"));
#endif
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',4,'I2C SDA');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',5,'I2C SCL');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',4,'', 'I2C SDA');"));
oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',5,'', 'I2C SCL');"));
}

View File

@ -1032,11 +1032,11 @@ class FourLineDisplayUsermod : public Usermod {
oappend(SET_F("addOption(dd,'SSD1305 128x64',5);"));
oappend(SET_F("addOption(dd,'SSD1306 SPI',6);"));
oappend(SET_F("addOption(dd,'SSD1306 SPI 128x64',7);"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',0,'I2C/SPI CLK (-1 use global)');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',1,'I2C/SPI DTA (-1 use global)');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',2,'SPI CS');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',3,'SPI DC');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',4,'SPI RST');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',0,'<i>-1 use global</i>','I2C/SPI CLK');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',1,'<i>-1 use global</i>','I2C/SPI DTA');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',2,'','SPI CS');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',3,'','SPI DC');"));
oappend(SET_F("addInfo('4LineDisplay:pin[]',4,'','SPI RST');"));
}
/*

View File

@ -191,7 +191,7 @@ private:
re_sortModes(modes_qstrings, modes_alpha_indexes, strip.getModeCount(), MODE_SORT_SKIP_COUNT);
palettes_qstrings = re_findModeStrings(JSON_palette_names, strip.getPaletteCount());
palettes_alpha_indexes = re_initIndexArray(strip.getPaletteCount());
palettes_alpha_indexes = re_initIndexArray(strip.getPaletteCount()); // only use internal palettes
// How many palette names start with '*' and should not be sorted?
// (Also skipping the first one, 'Default').

View File

@ -596,7 +596,7 @@ uint16_t mode_twinkle(void) {
return FRAMETIME;
}
static const char _data_FX_MODE_TWINKLE[] PROGMEM = "Twinkle@!;!,!;!;mp12=0,1d"; //pixels
static const char _data_FX_MODE_TWINKLE[] PROGMEM = "Twinkle@!;!,!;!;m12=0,1d"; //pixels
/*
@ -673,7 +673,7 @@ uint16_t mode_sparkle(void) {
SEGMENT.setPixelColor(SEGENV.aux0, SEGCOLOR(0));
return FRAMETIME;
}
static const char _data_FX_MODE_SPARKLE[] PROGMEM = "Sparkle@!;!,!;!;mp12=0,1d";
static const char _data_FX_MODE_SPARKLE[] PROGMEM = "Sparkle@!;!,!;!;m12=0,1d";
/*
@ -694,7 +694,7 @@ uint16_t mode_flash_sparkle(void) {
}
return FRAMETIME;
}
static const char _data_FX_MODE_FLASH_SPARKLE[] PROGMEM = "Sparkle Dark@!,!;Bg,Fx;!;mp12=0,1d";
static const char _data_FX_MODE_FLASH_SPARKLE[] PROGMEM = "Sparkle Dark@!,!;Bg,Fx;!;m12=0,1d";
/*
@ -717,7 +717,7 @@ uint16_t mode_hyper_sparkle(void) {
}
return FRAMETIME;
}
static const char _data_FX_MODE_HYPER_SPARKLE[] PROGMEM = "Sparkle+@!,!;Bg,Fx;!;mp12=0,1d";
static const char _data_FX_MODE_HYPER_SPARKLE[] PROGMEM = "Sparkle+@!,!;Bg,Fx;!;m12=0,1d";
/*
@ -799,7 +799,7 @@ uint16_t mode_android(void) {
return 3 + ((8 * (uint32_t)(255 - SEGMENT.speed)) / SEGLEN);
}
static const char _data_FX_MODE_ANDROID[] PROGMEM = "Android@!,Width;!,!;!;mp12=1,1d"; //vertical
static const char _data_FX_MODE_ANDROID[] PROGMEM = "Android@!,Width;!,!;!;m12=1,1d"; //vertical
/*
@ -1146,7 +1146,7 @@ uint16_t larson_scanner(bool dual) {
uint16_t mode_larson_scanner(void){
return larson_scanner(false);
}
static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Fade rate;!,!;!;mp12=0,1d";
static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Fade rate;!,!;!;m12=0,1d";
/*
@ -1156,7 +1156,7 @@ static const char _data_FX_MODE_LARSON_SCANNER[] PROGMEM = "Scanner@!,Fade rate;
uint16_t mode_dual_larson_scanner(void){
return larson_scanner(true);
}
static const char _data_FX_MODE_DUAL_LARSON_SCANNER[] PROGMEM = "Scanner Dual@!,Fade rate;!,!;!;mp12=0,1d";
static const char _data_FX_MODE_DUAL_LARSON_SCANNER[] PROGMEM = "Scanner Dual@!,Fade rate;!,!;!;m12=0,1d";
/*
@ -1508,7 +1508,7 @@ uint16_t mode_fairytwinkle() {
}
return FRAMETIME;
}
static const char _data_FX_MODE_FAIRYTWINKLE[] PROGMEM = "Fairy Twinkle@;;;mp12=0,1d"; //pixels
static const char _data_FX_MODE_FAIRYTWINKLE[] PROGMEM = "Fairy Twinkle@;;;m12=0,1d"; //pixels
/*
@ -2016,7 +2016,7 @@ uint16_t mode_fire_2012()
return FRAMETIME;
}
static const char _data_FX_MODE_FIRE_2012[] PROGMEM = "Fire 2012@Cooling,Spark rate;1,2,3;!;sx=120,ix=64,mp12=1,1d"; //bars
static const char _data_FX_MODE_FIRE_2012[] PROGMEM = "Fire 2012@Cooling,Spark rate;1,2,3;!;sx=120,ix=64,m12=1,1d"; //bars
// ColorWavesWithPalettes by Mark Kriegsman: https://gist.github.com/kriegsman/8281905786e8b2632aeb
@ -2248,7 +2248,7 @@ uint16_t mode_colortwinkle()
}
return FRAMETIME_FIXED;
}
static const char _data_FX_MODE_COLORTWINKLE[] PROGMEM = "Colortwinkles@Fade speed,Spawn speed;1,2,3;!;mp12=0,1d"; //pixels
static const char _data_FX_MODE_COLORTWINKLE[] PROGMEM = "Colortwinkles@Fade speed,Spawn speed;1,2,3;!;m12=0,1d"; //pixels
//Calm effect, like a lake at night
@ -2857,7 +2857,7 @@ uint16_t mode_bouncing_balls(void) {
return FRAMETIME;
}
static const char _data_FX_MODE_BOUNCINGBALLS[] PROGMEM = "Bouncing Balls@Gravity,# of balls;!,!,!;!;mp12=1,1d"; //bar
static const char _data_FX_MODE_BOUNCINGBALLS[] PROGMEM = "Bouncing Balls@Gravity,# of balls;!,!,!;!;m12=1,1d"; //bar
/*
@ -2927,7 +2927,7 @@ uint16_t mode_glitter()
return FRAMETIME;
}
static const char _data_FX_MODE_GLITTER[] PROGMEM = "Glitter@,!;!,!,!;!;mp12=0,1d"; //pixels
static const char _data_FX_MODE_GLITTER[] PROGMEM = "Glitter@,!;!,!,!;!;m12=0,1d"; //pixels
//each needs 19 bytes
@ -3000,7 +3000,7 @@ uint16_t mode_popcorn(void) {
return FRAMETIME;
}
static const char _data_FX_MODE_POPCORN[] PROGMEM = "Popcorn@!,!;!,!,!;!;mp12=1,1d"; //bar
static const char _data_FX_MODE_POPCORN[] PROGMEM = "Popcorn@!,!;!,!,!;!;m12=1,1d"; //bar
//values close to 100 produce 5Hz flicker, which looks very candle-y
@ -3227,7 +3227,7 @@ uint16_t mode_starburst(void) {
return FRAMETIME;
}
#undef STARBURST_MAX_FRAG
static const char _data_FX_MODE_STARBURST[] PROGMEM = "Fireworks Starburst@Chance,Fragments;,!;!;pal=11,mp12=0,1d";
static const char _data_FX_MODE_STARBURST[] PROGMEM = "Fireworks Starburst@Chance,Fragments;,!;!;pal=11,m12=0,1d";
/*
@ -3449,7 +3449,7 @@ uint16_t mode_drip(void)
return FRAMETIME;
}
static const char _data_FX_MODE_DRIP[] PROGMEM = "Drip@Gravity,# of drips;!,!;!;mp12=1,1d"; //bar
static const char _data_FX_MODE_DRIP[] PROGMEM = "Drip@Gravity,# of drips;!,!;!;m12=1,1d"; //bar
/*
@ -3538,7 +3538,7 @@ uint16_t mode_tetrix(void) {
return FRAMETIME;
}
static const char _data_FX_MODE_TETRIX[] PROGMEM = "Tetrix@!,Width;!,!;!;sx=0,ix=0,pal=11,mp12=1,1d";
static const char _data_FX_MODE_TETRIX[] PROGMEM = "Tetrix@!,Width;!,!;!;sx=0,ix=0,pal=11,m12=1,1d";
/*
@ -3650,7 +3650,7 @@ uint16_t mode_heartbeat(void) {
return FRAMETIME;
}
static const char _data_FX_MODE_HEARTBEAT[] PROGMEM = "Heartbeat@!,!;!,!;!;mp12=1,1d";
static const char _data_FX_MODE_HEARTBEAT[] PROGMEM = "Heartbeat@!,!;!,!;!;m12=1,1d";
// "Pacifica"
@ -3782,7 +3782,7 @@ uint16_t mode_solid_glitter()
return FRAMETIME;
}
static const char _data_FX_MODE_SOLID_GLITTER[] PROGMEM = "Solid Glitter@,!;!;0;mp12=0,1d";
static const char _data_FX_MODE_SOLID_GLITTER[] PROGMEM = "Solid Glitter@,!;!;0;m12=0,1d";
/*
@ -3891,7 +3891,7 @@ uint16_t mode_twinkleup(void) { // A very short twinkle routine
return FRAMETIME;
}
static const char _data_FX_MODE_TWINKLEUP[] PROGMEM = "Twinkleup@!,Intensity;!,!;!;mp12=0,1d";
static const char _data_FX_MODE_TWINKLEUP[] PROGMEM = "Twinkleup@!,Intensity;!,!;!;m12=0,1d";
// Peaceful noise that's slow and with gradually changing palettes. Does not support WLED palettes or default colours or controls.
@ -3990,7 +3990,7 @@ uint16_t mode_flow(void)
return FRAMETIME;
}
static const char _data_FX_MODE_FLOW[] PROGMEM = "Flow@!,!;!,!,!;!;mp12=1,1d"; //vertical
static const char _data_FX_MODE_FLOW[] PROGMEM = "Flow@!,!;!,!,!;!;m12=1,1d"; //vertical
/*
@ -6048,7 +6048,7 @@ uint16_t mode_ripplepeak(void) { // * Ripple peak. By Andrew Tuli
return FRAMETIME;
} // mode_ripplepeak()
static const char _data_FX_MODE_RIPPLEPEAK[] PROGMEM = "Ripple Peak@Fade rate,Max # of ripples,Select bin,Volume (min);!,!;!;c2=0,mp12=0,ssim=0,1d,vo"; // Pixel, Beatsin
static const char _data_FX_MODE_RIPPLEPEAK[] PROGMEM = "Ripple Peak@Fade rate,Max # of ripples,Select bin,Volume (min);!,!;!;c2=0,m12=0,si=0,1d,vo"; // Pixel, Beatsin
#ifndef WLED_DISABLE_2D
@ -6096,7 +6096,7 @@ uint16_t mode_2DSwirl(void) {
return FRAMETIME;
} // mode_2DSwirl()
static const char _data_FX_MODE_2DSWIRL[] PROGMEM = "Swirl@!,Sensitivity,Blur;,Bg Swirl;!;ix=64ssim=0,2d,vo"; // Beatsin
static const char _data_FX_MODE_2DSWIRL[] PROGMEM = "Swirl@!,Sensitivity,Blur;,Bg Swirl;!;ix=64si=0,2d,vo"; // Beatsin
/////////////////////////
@ -6142,7 +6142,7 @@ uint16_t mode_2DWaverly(void) {
return FRAMETIME;
} // mode_2DWaverly()
static const char _data_FX_MODE_2DWAVERLY[] PROGMEM = "Waverly@Amplification,Sensitivity;;!;ix=64,ssim=0,2d,vo"; // Beatsin
static const char _data_FX_MODE_2DWAVERLY[] PROGMEM = "Waverly@Amplification,Sensitivity;;!;ix=64,si=0,2d,vo"; // Beatsin
#endif // WLED_DISABLE_2D
@ -6202,7 +6202,7 @@ uint16_t mode_gravcenter(void) { // Gravcenter. By Andrew Tuline.
return FRAMETIME;
} // mode_gravcenter()
static const char _data_FX_MODE_GRAVCENTER[] PROGMEM = "Gravcenter@Rate of fall,Sensitivity;,!;!;ix=128,mp12=2,ssim=0,1d,vo"; // Circle, Beatsin
static const char _data_FX_MODE_GRAVCENTER[] PROGMEM = "Gravcenter@Rate of fall,Sensitivity;,!;!;ix=128,m12=2,si=0,1d,vo"; // Circle, Beatsin
///////////////////////
@ -6253,7 +6253,7 @@ uint16_t mode_gravcentric(void) { // Gravcentric. By Andrew
return FRAMETIME;
} // mode_gravcentric()
static const char _data_FX_MODE_GRAVCENTRIC[] PROGMEM = "Gravcentric@Rate of fall,Sensitivity;!;!;ix=128,mp12=3,ssim=0,1d,vo"; // Corner, Beatsin
static const char _data_FX_MODE_GRAVCENTRIC[] PROGMEM = "Gravcentric@Rate of fall,Sensitivity;!;!;ix=128,m12=3,si=0,1d,vo"; // Corner, Beatsin
///////////////////////
@ -6299,7 +6299,7 @@ uint16_t mode_gravimeter(void) { // Gravmeter. By Andrew Tuline.
return FRAMETIME;
} // mode_gravimeter()
static const char _data_FX_MODE_GRAVIMETER[] PROGMEM = "Gravimeter@Rate of fall,Sensitivity;!,!;!;ix=128,mp12=2,ssim=0,1d,vo"; // Circle, Beatsin
static const char _data_FX_MODE_GRAVIMETER[] PROGMEM = "Gravimeter@Rate of fall,Sensitivity;!,!;!;ix=128,m12=2,si=0,1d,vo"; // Circle, Beatsin
//////////////////////
@ -6322,7 +6322,7 @@ uint16_t mode_juggles(void) { // Juggles. By Andrew Tuline.
return FRAMETIME;
} // mode_juggles()
static const char _data_FX_MODE_JUGGLES[] PROGMEM = "Juggles@!,# of balls;,!;!;mp12=0,ssim=0,1d,vo"; // Pixels, Beatsin
static const char _data_FX_MODE_JUGGLES[] PROGMEM = "Juggles@!,# of balls;,!;!;m12=0,si=0,1d,vo"; // Pixels, Beatsin
//////////////////////
@ -6354,7 +6354,7 @@ uint16_t mode_matripix(void) { // Matripix. By Andrew Tuline.
return FRAMETIME;
} // mode_matripix()
static const char _data_FX_MODE_MATRIPIX[] PROGMEM = "Matripix@!,Brightness;!,!;!;ix=64,mp12=2,ssim=1,1d,vo"; //,rev=1,mi=1,rY=1,mY=1 Circle, WeWillRockYou, reverseX
static const char _data_FX_MODE_MATRIPIX[] PROGMEM = "Matripix@!,Brightness;!,!;!;ix=64,m12=2,si=1,1d,vo"; //,rev=1,mi=1,rY=1,mY=1 Circle, WeWillRockYou, reverseX
//////////////////////
@ -6389,7 +6389,7 @@ uint16_t mode_midnoise(void) { // Midnoise. By Andrew Tuline.
return FRAMETIME;
} // mode_midnoise()
static const char _data_FX_MODE_MIDNOISE[] PROGMEM = "Midnoise@Fade rate,Maximum length;,!;!;ix=128,mp12=1,ssim=0,1d,vo"; // Bar, Beatsin
static const char _data_FX_MODE_MIDNOISE[] PROGMEM = "Midnoise@Fade rate,Maximum length;,!;!;ix=128,m12=1,si=0,1d,vo"; // Bar, Beatsin
//////////////////////
@ -6422,7 +6422,7 @@ uint16_t mode_noisefire(void) { // Noisefire. By Andrew Tuline.
return FRAMETIME;
} // mode_noisefire()
static const char _data_FX_MODE_NOISEFIRE[] PROGMEM = "Noisefire@!,!;;;mp12=2,ssim=0,1d,vo"; // Circle, Beatsin
static const char _data_FX_MODE_NOISEFIRE[] PROGMEM = "Noisefire@!,!;;;m12=2,si=0,1d,vo"; // Circle, Beatsin
///////////////////////
@ -6457,7 +6457,7 @@ uint16_t mode_noisemeter(void) { // Noisemeter. By Andrew Tuline.
return FRAMETIME;
} // mode_noisemeter()
static const char _data_FX_MODE_NOISEMETER[] PROGMEM = "Noisemeter@Fade rate,Width;!,!;!;ix=128,mp12=2,ssim=0,1d,vo"; // Circle, Beatsin
static const char _data_FX_MODE_NOISEMETER[] PROGMEM = "Noisemeter@Fade rate,Width;!,!;!;ix=128,m12=2,si=0,1d,vo"; // Circle, Beatsin
//////////////////////
@ -6491,7 +6491,7 @@ uint16_t mode_pixelwave(void) { // Pixelwave. By Andrew Tuline.
return FRAMETIME;
} // mode_pixelwave()
static const char _data_FX_MODE_PIXELWAVE[] PROGMEM = "Pixelwave@!,Sensitivity;!,!;!;ix=64,mp12=2,ssim=0,1d,vo"; // Circle, Beatsin
static const char _data_FX_MODE_PIXELWAVE[] PROGMEM = "Pixelwave@!,Sensitivity;!,!;!;ix=64,m12=2,si=0,1d,vo"; // Circle, Beatsin
//////////////////////
@ -6532,7 +6532,7 @@ uint16_t mode_plasmoid(void) { // Plasmoid. By Andrew Tuline.
return FRAMETIME;
} // mode_plasmoid()
static const char _data_FX_MODE_PLASMOID[] PROGMEM = "Plasmoid@Phase,# of pixels;!,!;!;sx=128,ix=128,mp12=0,ssim=0,1d,vo"; // Pixels, Beatsin
static const char _data_FX_MODE_PLASMOID[] PROGMEM = "Plasmoid@Phase,# of pixels;!,!;!;sx=128,ix=128,m12=0,si=0,1d,vo"; // Pixels, Beatsin
///////////////////////
@ -6576,7 +6576,7 @@ uint16_t mode_puddlepeak(void) { // Puddlepeak. By Andrew Tuline.
return FRAMETIME;
} // mode_puddlepeak()
static const char _data_FX_MODE_PUDDLEPEAK[] PROGMEM = "Puddlepeak@Fade rate,Puddle size,Select bin,Volume (min);!,!;!;c2=0,mp12=0,ssim=0,1d,vo"; // Pixels, Beatsin
static const char _data_FX_MODE_PUDDLEPEAK[] PROGMEM = "Puddlepeak@Fade rate,Puddle size,Select bin,Volume (min);!,!;!;c2=0,m12=0,si=0,1d,vo"; // Pixels, Beatsin
//////////////////////
@ -6607,7 +6607,7 @@ uint16_t mode_puddles(void) { // Puddles. By Andrew Tuline.
return FRAMETIME;
} // mode_puddles()
static const char _data_FX_MODE_PUDDLES[] PROGMEM = "Puddles@Fade rate,Puddle size;!,!;!;mp12=0,ssim=0,1d,vo"; // Pixels, Beatsin
static const char _data_FX_MODE_PUDDLES[] PROGMEM = "Puddles@Fade rate,Puddle size;!,!;!;m12=0,si=0,1d,vo"; // Pixels, Beatsin
//////////////////////
@ -6635,7 +6635,7 @@ uint16_t mode_pixels(void) { // Pixels. By Andrew Tuline.
return FRAMETIME;
} // mode_pixels()
static const char _data_FX_MODE_PIXELS[] PROGMEM = "Pixels@Fade rate,# of pixels;,!;!;mp12=0,ssim=0,1d,vo"; // Pixels, Beatsin
static const char _data_FX_MODE_PIXELS[] PROGMEM = "Pixels@Fade rate,# of pixels;,!;!;m12=0,si=0,1d,vo"; // Pixels, Beatsin
///////////////////////////////
@ -6676,7 +6676,7 @@ uint16_t mode_blurz(void) { // Blurz. By Andrew Tuline.
return FRAMETIME;
} // mode_blurz()
static const char _data_FX_MODE_BLURZ[] PROGMEM = "Blurz@Fade rate,Blur amount;!,Color mix;!;mp12=0,ssim=0,1d,fr"; // Pixels, Beatsin
static const char _data_FX_MODE_BLURZ[] PROGMEM = "Blurz@Fade rate,Blur amount;!,Color mix;!;m12=0,si=0,1d,fr"; // Pixels, Beatsin
/////////////////////////
@ -6711,7 +6711,7 @@ uint16_t mode_DJLight(void) { // Written by ??? Adapted by Wil
return FRAMETIME;
} // mode_DJLight()
static const char _data_FX_MODE_DJLIGHT[] PROGMEM = "DJ Light@Speed;;;mp12=2,ssim=0,1d,fr"; // Circle, Beatsin
static const char _data_FX_MODE_DJLIGHT[] PROGMEM = "DJ Light@Speed;;;m12=2,si=0,1d,fr"; // Circle, Beatsin
////////////////////
@ -6747,7 +6747,7 @@ uint16_t mode_freqmap(void) { // Map FFT_MajorPeak to SEGLEN.
return FRAMETIME;
} // mode_freqmap()
static const char _data_FX_MODE_FREQMAP[] PROGMEM = "Freqmap@Fade rate,Starting color;,!;!;mp12=0,ssim=0,1d,fr"; // Pixels, Beatsin
static const char _data_FX_MODE_FREQMAP[] PROGMEM = "Freqmap@Fade rate,Starting color;,!;!;m12=0,si=0,1d,fr"; // Pixels, Beatsin
///////////////////////
@ -6802,7 +6802,7 @@ uint16_t mode_freqmatrix(void) { // Freqmatrix. By Andreas Plesch
return FRAMETIME;
} // mode_freqmatrix()
static const char _data_FX_MODE_FREQMATRIX[] PROGMEM = "Freqmatrix@Time delay,Sound effect,Low bin,High bin,Sensivity;;;mp12=3,ssim=0,1d,fr"; // Corner, Beatsin
static const char _data_FX_MODE_FREQMATRIX[] PROGMEM = "Freqmatrix@Time delay,Sound effect,Low bin,High bin,Sensivity;;;m12=3,si=0,1d,fr"; // Corner, Beatsin
//////////////////////
@ -6837,7 +6837,7 @@ uint16_t mode_freqpixels(void) { // Freqpixel. By Andrew Tuline.
return FRAMETIME;
} // mode_freqpixels()
static const char _data_FX_MODE_FREQPIXELS[] PROGMEM = "Freqpixels@Fade rate,Starting colour and # of pixels;;;mp12=0,ssim=0,1d,fr"; // Pixels, Beatsin
static const char _data_FX_MODE_FREQPIXELS[] PROGMEM = "Freqpixels@Fade rate,Starting colour and # of pixels;;;m12=0,si=0,1d,fr"; // Pixels, Beatsin
//////////////////////
@ -6906,7 +6906,7 @@ uint16_t mode_freqwave(void) { // Freqwave. By Andreas Pleschun
return FRAMETIME;
} // mode_freqwave()
static const char _data_FX_MODE_FREQWAVE[] PROGMEM = "Freqwave@Time delay,Sound effect,Low bin,High bin,Pre-amp;;;mp12=2,ssim=0,1d,fr"; // Circle, Beatsin
static const char _data_FX_MODE_FREQWAVE[] PROGMEM = "Freqwave@Time delay,Sound effect,Low bin,High bin,Pre-amp;;;m12=2,si=0,1d,fr"; // Circle, Beatsin
///////////////////////
@ -6958,7 +6958,7 @@ uint16_t mode_gravfreq(void) { // Gravfreq. By Andrew Tuline.
return FRAMETIME;
} // mode_gravfreq()
static const char _data_FX_MODE_GRAVFREQ[] PROGMEM = "Gravfreq@Rate of fall,Sensivity;,!;!;ix=128,mp12=0,ssim=0,1d,fr"; // Pixels, Beatsin
static const char _data_FX_MODE_GRAVFREQ[] PROGMEM = "Gravfreq@Rate of fall,Sensivity;,!;!;ix=128,m12=0,si=0,1d,fr"; // Pixels, Beatsin
//////////////////////
@ -6986,7 +6986,7 @@ uint16_t mode_noisemove(void) { // Noisemove. By: Andrew Tuli
return FRAMETIME;
} // mode_noisemove()
static const char _data_FX_MODE_NOISEMOVE[] PROGMEM = "Noisemove@Speed of perlin movement,Fade rate;,!;!;mp12=0,ssim=0,1d,fr"; // Pixels, Beatsin
static const char _data_FX_MODE_NOISEMOVE[] PROGMEM = "Noisemove@Speed of perlin movement,Fade rate;,!;!;m12=0,si=0,1d,fr"; // Pixels, Beatsin
//////////////////////
@ -7026,7 +7026,7 @@ uint16_t mode_rocktaves(void) { // Rocktaves. Same note from eac
return FRAMETIME;
} // mode_rocktaves()
static const char _data_FX_MODE_ROCKTAVES[] PROGMEM = "Rocktaves@;,!;!;mp12=1,ssim=0,1d,fr"; // Bar, Beatsin
static const char _data_FX_MODE_ROCKTAVES[] PROGMEM = "Rocktaves@;,!;!;m12=1,si=0,1d,fr"; // Bar, Beatsin
///////////////////////
@ -7078,7 +7078,7 @@ uint16_t mode_waterfall(void) { // Waterfall. By: Andrew Tulin
return FRAMETIME;
} // mode_waterfall()
static const char _data_FX_MODE_WATERFALL[] PROGMEM = "Waterfall@!,Adjust color,Select bin,Volume (min);!,!;!;c2=0,mp12=2,ssim=0,1d,fr"; // Circles, Beatsin
static const char _data_FX_MODE_WATERFALL[] PROGMEM = "Waterfall@!,Adjust color,Select bin,Volume (min);!,!;!;c2=0,m12=2,si=0,1d,fr"; // Circles, Beatsin
#ifndef WLED_DISABLE_2D
@ -7138,7 +7138,7 @@ uint16_t mode_2DGEQ(void) { // By Will Tatam. Code reduction by Ewoud Wijma.
return FRAMETIME;
} // mode_2DGEQ()
static const char _data_FX_MODE_2DGEQ[] PROGMEM = "GEQ@Fade speed,Ripple decay,# of bands,,,Color bars;!,,Peak Color;!;c1=255,c2=64,pal=11,ssim=0,2d,fr"; // Beatsin
static const char _data_FX_MODE_2DGEQ[] PROGMEM = "GEQ@Fade speed,Ripple decay,# of bands,,,Color bars;!,,Peak Color;!;c1=255,c2=64,pal=11,si=0,2d,fr"; // Beatsin
/////////////////////////
@ -7196,7 +7196,7 @@ uint16_t mode_2DFunkyPlank(void) { // Written by ??? Adapted by Wil
return FRAMETIME;
} // mode_2DFunkyPlank
static const char _data_FX_MODE_2DFUNKYPLANK[] PROGMEM = "Funky Plank@Scroll speed,,# of bands;;;ssim=0,2d,fr"; // Beatsin
static const char _data_FX_MODE_2DFUNKYPLANK[] PROGMEM = "Funky Plank@Scroll speed,,# of bands;;;si=0,2d,fr"; // Beatsin
/////////////////////////
@ -7299,7 +7299,7 @@ uint16_t mode_2DAkemi(void) {
return FRAMETIME;
} // mode_2DAkemi
static const char _data_FX_MODE_2DAKEMI[] PROGMEM = "Akemi@Color speed,Dance;Head palette,Arms & Legs,Eyes & Mouth;Face palette;ssim=0,2d,fr"; //beatsin
static const char _data_FX_MODE_2DAKEMI[] PROGMEM = "Akemi@Color speed,Dance;Head palette,Arms & Legs,Eyes & Mouth;Face palette;si=0,2d,fr"; //beatsin
#endif // WLED_DISABLE_2D

View File

@ -767,7 +767,7 @@ class WS2812FX { // 96 bytes
inline uint8_t getSegmentsNum(void) { return _segments.size(); } // returns currently present segments
inline uint8_t getCurrSegmentId(void) { return _segment_index; }
inline uint8_t getMainSegmentId(void) { return _mainSegment; }
inline uint8_t getPaletteCount() { return 13 + GRADIENT_PALETTE_COUNT; }
inline uint8_t getPaletteCount() { return 13 + GRADIENT_PALETTE_COUNT; } // will only return built-in palette count
inline uint8_t getTargetFps() { return _targetFps; }
inline uint8_t getModeCount() { return _modeCount; }

View File

@ -114,10 +114,11 @@ void IRAM_ATTR WS2812FX::setPixelColorXY(int x, int y, uint32_t col)
#ifndef WLED_DISABLE_2D
if (!isMatrix) return; // not a matrix set-up
uint16_t index = y * matrixWidth + x;
if (index >= customMappingSize) return; // customMappingSize is always W * H of matrix in 2D setup
#else
uint16_t index = x;
#endif
if (index >= _length) return;
#endif
if (index < customMappingSize) index = customMappingTable[index];
busses.setPixelColor(index, col);
}
@ -126,10 +127,11 @@ void IRAM_ATTR WS2812FX::setPixelColorXY(int x, int y, uint32_t col)
uint32_t WS2812FX::getPixelColorXY(uint16_t x, uint16_t y) {
#ifndef WLED_DISABLE_2D
uint16_t index = (y * matrixWidth + x);
if (index >= customMappingSize) return 0; // customMappingSize is always W * H of matrix in 2D setup
#else
uint16_t index = x;
#endif
if (index >= _length) return 0;
#endif
if (index < customMappingSize) index = customMappingTable[index];
return busses.getPixelColor(index);
}

View File

@ -412,18 +412,13 @@ void Segment::setMode(uint8_t fx, bool loadDefaults) {
sOpt = extractModeDefaults(fx, "c1"); if (sOpt >= 0) custom1 = sOpt;
sOpt = extractModeDefaults(fx, "c2"); if (sOpt >= 0) custom2 = sOpt;
sOpt = extractModeDefaults(fx, "c3"); if (sOpt >= 0) custom3 = sOpt;
sOpt = extractModeDefaults(fx, "mp12"); if (sOpt >= 0) map1D2D = constrain(sOpt, 0, 7);
sOpt = extractModeDefaults(fx, "ssim"); if (sOpt >= 0) soundSim = constrain(sOpt, 0, 7);
sOpt = extractModeDefaults(fx, "m12"); if (sOpt >= 0) map1D2D = constrain(sOpt, 0, 7);
sOpt = extractModeDefaults(fx, "si"); if (sOpt >= 0) soundSim = constrain(sOpt, 0, 7);
sOpt = extractModeDefaults(fx, "rev"); if (sOpt >= 0) reverse = (bool)sOpt;
sOpt = extractModeDefaults(fx, "mi"); if (sOpt >= 0) mirror = (bool)sOpt; // NOTE: setting this option is a risky business
sOpt = extractModeDefaults(fx, "rY"); if (sOpt >= 0) reverse_y = (bool)sOpt;
sOpt = extractModeDefaults(fx, "mY"); if (sOpt >= 0) mirror_y = (bool)sOpt; // NOTE: setting this option is a risky business
sOpt = extractModeDefaults(fx, "pal");
if (sOpt >= 0 && (size_t)sOpt < strip.getPaletteCount() + strip.customPalettes.size()) {
if (sOpt != palette) {
palette = sOpt;
}
}
sOpt = extractModeDefaults(fx, "pal"); if (sOpt >= 0) setPalette(sOpt);
}
stateChanged = true; // send UDP/WS broadcast
}
@ -431,13 +426,13 @@ void Segment::setMode(uint8_t fx, bool loadDefaults) {
}
void Segment::setPalette(uint8_t pal) {
if (pal < strip.getPaletteCount()) {
if (pal != palette) {
if (strip.paletteFade) startTransition(strip.getTransition());
palette = pal;
}
if (pal < 245 && pal > GRADIENT_PALETTE_COUNT+13) pal = 0; // built in palettes
if (pal > 245 && (strip.customPalettes.size() == 0 || 255U-pal > strip.customPalettes.size()-1)) pal = 0; // custom palettes
if (pal != palette) {
if (strip.paletteFade) startTransition(strip.getTransition());
palette = pal;
stateChanged = true; // send UDP/WS broadcast
}
stateChanged = true; // send UDP/WS broadcast
}
// 2D matrix

View File

@ -718,19 +718,19 @@ function populateSegments(s)
miYck = `<label class="check revchkl">Mirror<input type="checkbox" id="seg${i}mY" onchange="setMiY(${i})" ${inst.mY?"checked":""}><span class="checkmark"></span></label>`;
}
let map2D = `<div id="seg${i}map2D" data-map="map2D" class="lbl-s hide">Expand 1D FX<br>
<div class="sel-p"><select class="sel-p" id="seg${i}mp12" onchange="setMp12(${i})">
<option value="0" ${inst.mp12==0?' selected':''}>Pixels</option>
<option value="1" ${inst.mp12==1?' selected':''}>Bar</option>
<option value="2" ${inst.mp12==2?' selected':''}>Arc</option>
<option value="3" ${inst.mp12==3?' selected':''}>Corner</option>
<div class="sel-p"><select class="sel-p" id="seg${i}m12" onchange="setM12(${i})">
<option value="0" ${inst.m12==0?' selected':''}>Pixels</option>
<option value="1" ${inst.m12==1?' selected':''}>Bar</option>
<option value="2" ${inst.m12==2?' selected':''}>Arc</option>
<option value="3" ${inst.m12==3?' selected':''}>Corner</option>
</select></div>
</div>`;
let sndSim = `<div data-snd="ssim" class="lbl-s hide">Sound sim<br>
<div class="sel-p"><select class="sel-p" id="seg${i}ssim" onchange="setSSim(${i})">
<option value="0" ${inst.ssim==0?' selected':''}>BeatSin</option>
<option value="1" ${inst.ssim==1?' selected':''}>WeWillRockYou</option>
<option value="2" ${inst.ssim==2?' selected':''}>U10_3</option>
<option value="3" ${inst.ssim==3?' selected':''}>U14_3</option>
let sndSim = `<div data-snd="si" class="lbl-s hide">Sound sim<br>
<div class="sel-p"><select class="sel-p" id="seg${i}si" onchange="setSi(${i})">
<option value="0" ${inst.si==0?' selected':''}>BeatSin</option>
<option value="1" ${inst.si==1?' selected':''}>WeWillRockYou</option>
<option value="2" ${inst.si==2?' selected':''}>U10_3</option>
<option value="3" ${inst.si==3?' selected':''}>U14_3</option>
</select></div>
</div>`;
cn += `<div class="seg lstI ${i==s.mainseg ? 'selected' : ''} ${exp ? "expanded":""}" id="seg${i}">
@ -1195,7 +1195,7 @@ function updateSelectedFx()
var selectedName = selectedEffect.querySelector(".lstIname").innerText;
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="ssim"]`);
var segs = gId("segcont").querySelectorAll(`div[data-snd="si"]`);
for (const seg of segs) if (selectedName.indexOf("\u266A")<0 && selectedName.indexOf("\266B")<0) seg.classList.add("hide"); else seg.classList.remove("hide"); // also "♫ "?
}
}
@ -1535,8 +1535,8 @@ function requestJson(command=null)
if (json.info) {
let i = json.info;
// append custom palettes (when loading for the 1st time)
if (!command && isEmpty(lastinfo) && i.leds && i.leds.cpal) {
for (let j = 0; j<i.leds.cpal; j++) {
if (!command && isEmpty(lastinfo) && i.cpalcount) {
for (let j = 0; j<i.cpalcount; j++) {
let div = d.createElement("div");
gId('pallist').appendChild(div);
div.outerHTML = generateListItemHtml(
@ -2073,17 +2073,17 @@ function setMiY(s)
requestJson(obj);
}
function setMp12(s)
function setM12(s)
{
var value = gId(`seg${s}mp12`).selectedIndex;
var obj = {"seg": {"id": s, "mp12": value}};
var value = gId(`seg${s}m12`).selectedIndex;
var obj = {"seg": {"id": s, "m12": value}};
requestJson(obj);
}
function setSSim(s)
function setSi(s)
{
var value = gId(`seg${s}ssim`).selectedIndex;
var obj = {"seg": {"id": s, "ssim": value}};
var value = gId(`seg${s}si`).selectedIndex;
var obj = {"seg": {"id": s, "si": value}};
requestJson(obj);
}
@ -2238,7 +2238,7 @@ function saveP(i,pl)
obj.ib = gId(`p${i}ibtgl`).checked;
obj.sb = gId(`p${i}sbtgl`).checked;
obj.sc = gId(`p${i}sbchk`).checked;
if (gId(`p${i}lmp`).value!=="") obj.ledmap = parseInt(gId(`p${i}lmp`).value);
if (gId(`p${i}lmp`) && gId(`p${i}lmp`).value!=="") obj.ledmap = parseInt(gId(`p${i}lmp`).value);
}
}

View File

@ -104,9 +104,14 @@
}
}
}
function initCap(s) {
if (typeof s !== 'string') return ''
return s.charAt(0).toUpperCase() + s.slice(1)
}
function addField(k,f,o,a=false) { //key, field, (sub)object, isArray
if (isO(o)) {
urows += '<hr class="sml">';
if (f!=='unknown' && !k.includes(":")) urows += `<p><u>${initCap(f)}</u></p>`; //show group title
for (const [s,v] of Object.entries(o)) {
// possibility to nest objects (only 1 level)
if (f!=='unknown' && !k.includes(":")) addField(k+":"+f,s,v);
@ -135,8 +140,7 @@
t = "text"; c = `value="${o}" style="width:250px;"`;
break;
}
if (k.includes(":")) urows += k.substr(k.indexOf(":")+1);
urows += ` ${f}: `;
urows += ` ${initCap(f)} `; //only show field (key is shown in grouping)
// https://stackoverflow.com/questions/11657123/posting-both-checked-and-unchecked-checkboxes
if (t=="checkbox") urows += `<input type="hidden" name="${k}:${f}${a?"[]":""}" value="false">`;
else if (!a) urows += `<input type="hidden" name="${k}:${f}${a?"[]":""}" value="${t}">`;
@ -179,11 +183,14 @@
}
}
// https://stackoverflow.com/questions/26440494/insert-text-after-this-input-element-with-javascript
function addInfo(name,el,txt) {
function addInfo(name,el,txt, txt2="") {
let obj = d.getElementsByName(name);
if (!obj.length) return;
if (typeof el === "string" && obj[0]) obj[0].placeholder = el;
else if (obj[el]) obj[el].insertAdjacentHTML('afterend', '&nbsp;'+txt);
else if (obj[el]) {
if (txt!="") obj[el].insertAdjacentHTML('afterend', '&nbsp;'+txt);
if (txt2!="") obj[el].insertAdjacentHTML('beforebegin', txt2 + '&nbsp;'); //add pre texts
}
}
// load settings and insert values into DOM
function ldS() {

View File

@ -6,13 +6,106 @@
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"/>
<title>WiFi Settings</title>
<script>
var d=document;
var d = document;
var loc = false, locip;
var scanLoops = 0, preScanSSID = "";
function gId(e) { return d.getElementById(e); }
function cE(e) { return d.createElement(e); }
function H(){window.open("https://kno.wled.ge/features/settings/#wifi-settings");}
function B(){window.open("/settings","_self");}
function N() {
const url = (loc?`http://${locip}`:"") + "/json/net";
const button = gId("scan");
button.disabled = true;
button.innerHTML = "Scanning...";
fetch(url).then((response) => {
return response.json();
}).then((json) => {
// Get the list of networks only, defaulting to an empty array.
return Object.assign(
{},
{"networks": []},
json,
).networks.sort(
// Sort by signal strength, descending.
(a, b) => b.rssi - a.rssi
).reduce(
// Filter out duplicate SSIDs. Since it is sorted by signal
// strength, the strongest signal will be kept in the
// order it orginally appeared in the array.
(unique, other) => {
if(!unique.some(obj => obj.ssid === other.ssid)) {
unique.push(other);
}
return unique;
},
[],
);
}).then((networks) => {
// If there are no networks, fetch it again in a second.
// but only do this a few times.
if (networks.length === 0 && scanLoops < 10) {
scanLoops++;
setTimeout(N, 1000);
return;
}
scanLoops = 0;
let cs = gId("CS");
if (cs) {
let select = cE("select");
select.setAttribute("id", "CS");
select.setAttribute("name", "CS");
select.setAttribute("onchange", "T()");
preScanSSID = cs.value;
for (let i = 0; i < select.children.length; i++) {
select.removeChild(select.children[i]);
}
for (let i = 0; i < networks.length; i++) {
const option = cE("option");
option.setAttribute("value", networks[i].ssid);
option.innerHTML = `${networks[i].ssid} (${networks[i].rssi} dBm)`;
if (networks[i].ssid === cs.value) {
option.setAttribute("selected", "selected");
}
select.appendChild(option);
}
const option = cE("option");
option.setAttribute("value", "!Cs");
option.innerHTML = `Other network...`;
select.appendChild(option);
cs.replaceWith(select);
}
button.disabled = false;
button.innerHTML = "Scan";
});
}
// replace WiFi select with custom SSID input field again
function T() {
let cs = gId("CS");
if (!cs || cs.value != "!Cs") return;
let input = cE("input");
input.type = "text";
input.id = "CS";
input.name ="CS";
input.setAttribute("maxlength",32);
input.value = preScanSSID;
cs.replaceWith(input);
}
// https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript
function loadJS(FILE_URL, async = true) {
let scE = d.createElement("script");
let scE = cE("script");
scE.setAttribute("src", FILE_URL);
scE.setAttribute("type", "text/javascript");
scE.setAttribute("async", async);
@ -31,13 +124,13 @@
function S() {
if (window.location.protocol == "file:") {
loc = true;
locip = localStorage.getItem('locIp');
locip = localStorage.getItem("locIp");
if (!locip) {
locip = prompt("File Mode. Please enter WLED IP!");
localStorage.setItem('locIp', locip);
localStorage.setItem("locIp", locip);
}
}
var url = (loc?`http://${locip}`:'') + '/settings/s.js?p=1';
let url = (loc?`http://${locip}`:'') + '/settings/s.js?p=1';
loadJS(url, false); // If we set async false, file is loaded and executed, then next statement is processed
}
</script>
@ -51,7 +144,9 @@
</div>
<h2>WiFi setup</h2>
<h3>Connect to existing network</h3>
Network name (SSID, empty to not connect): <br><input type="text" name="CS" maxlength="32"><br>
<button type="button" id="scan" onclick="N()">Scan</button><br>
Network name (SSID, empty to not connect):<br>
<input type="text" id="CS" name="CS" maxlength="32"><br>
Network password: <br> <input type="password" name="CP" maxlength="63"><br>
Static IP (leave at 0.0.0.0 for DHCP):<br>
<input name="I0" type="number" class="s" min="0" max="255" required> .
@ -68,7 +163,7 @@
<input name="S1" type="number" class="s" min="0" max="255" required> .
<input name="S2" type="number" class="s" min="0" max="255" required> .
<input name="S3" type="number" class="s" min="0" max="255" required><br>
mDNS address (leave empty for no mDNS):<br/>
mDNS address (leave empty for no mDNS):<br>
http:// <input type="text" name="CM" maxlength="32"> .local<br>
Client IP: <span class="sip"> Not connected </span> <br>
<h3>Configure Access Point</h3>

View File

@ -41,6 +41,9 @@ button.sml {
min-width: 40px;
margin: 0 0 0 10px;
}
#scan {
margin-top: -10px;
}
.toprow {
top: 0;
position: sticky;

View File

@ -6,68 +6,68 @@
*/
// Autogenerated from wled00/data/style.css, do not edit!!
const uint16_t PAGE_settingsCss_length = 836;
const uint16_t PAGE_settingsCss_length = 847;
const uint8_t PAGE_settingsCss[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x55, 0xc1, 0x8e, 0x9b, 0x30,
0x14, 0xfc, 0x15, 0xaa, 0x68, 0xa5, 0xad, 0x14, 0x10, 0x10, 0xc8, 0xa6, 0x46, 0x95, 0xaa, 0xde,
0x7b, 0xab, 0xaa, 0x4a, 0xd5, 0x1e, 0x0c, 0x7e, 0x04, 0x2b, 0xc6, 0x46, 0xb6, 0xe9, 0x92, 0x22,
0xfe, 0xbd, 0xb6, 0x81, 0x85, 0x64, 0xd1, 0xf6, 0x52, 0x45, 0x89, 0x92, 0x3c, 0x63, 0xcf, 0xcc,
0x9b, 0x37, 0xae, 0x74, 0xcd, 0x7a, 0x2d, 0xda, 0xa2, 0xf2, 0x71, 0xa1, 0xa9, 0xe0, 0xa8, 0xc6,
0x9c, 0x36, 0x2d, 0xc3, 0xf6, 0xc7, 0x90, 0x0b, 0x72, 0xed, 0x4b, 0xc1, 0xb5, 0x5f, 0xe2, 0x9a,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x55, 0xc1, 0x8e, 0x9b, 0x30,
0x10, 0xfd, 0x15, 0xaa, 0x68, 0xa5, 0xad, 0x14, 0x10, 0x10, 0xc8, 0xa6, 0x46, 0x95, 0xaa, 0xde,
0x7b, 0xab, 0xaa, 0x4a, 0xd5, 0x1e, 0x0c, 0x1e, 0x82, 0x15, 0x63, 0x23, 0xdb, 0x74, 0x49, 0x11,
0xff, 0x5e, 0xdb, 0xc0, 0x42, 0xb2, 0x68, 0x7b, 0xa9, 0xa2, 0x44, 0xc4, 0x63, 0xc6, 0x6f, 0xde,
0xbc, 0x79, 0xae, 0x74, 0xcd, 0x7a, 0x2d, 0xda, 0xa2, 0xf2, 0x71, 0xa1, 0xa9, 0xe0, 0xa8, 0xc6,
0x9c, 0x36, 0x2d, 0xc3, 0xf6, 0xcf, 0x90, 0x0b, 0x72, 0xed, 0x4b, 0xc1, 0xb5, 0x5f, 0xe2, 0x9a,
0xb2, 0x2b, 0xfa, 0x01, 0x92, 0x60, 0x8e, 0xf7, 0x0a, 0x73, 0xe5, 0x2b, 0x90, 0xb4, 0xcc, 0x5c,
0x59, 0xd1, 0x3f, 0x80, 0x22, 0x09, 0x75, 0xa6, 0xa1, 0xd3, 0x3e, 0x66, 0xf4, 0xcc, 0x51, 0x01,
0x58, 0xd1, 0x3f, 0x80, 0x22, 0x09, 0x75, 0xa6, 0xa1, 0xd3, 0x3e, 0x66, 0xf4, 0xcc, 0x51, 0x01,
0x5c, 0x83, 0xcc, 0x72, 0x5c, 0x5c, 0xce, 0x52, 0xb4, 0x9c, 0xa0, 0x5d, 0x1c, 0xc7, 0x59, 0x21,
0x98, 0x90, 0x68, 0x57, 0x96, 0x65, 0xc6, 0x28, 0x07, 0xbf, 0x02, 0x7a, 0xae, 0x34, 0x8a, 0xc3,
0xf0, 0x21, 0xab, 0xb1, 0x3c, 0x53, 0x8e, 0xc2, 0xa1, 0x92, 0x7d, 0x2e, 0x24, 0x01, 0xe9, 0x4f,
0xcb, 0x8f, 0xc7, 0xa3, 0xf9, 0x33, 0x50, 0x06, 0xef, 0x0b, 0x25, 0xba, 0x42, 0xf1, 0x31, 0x6c,
0xba, 0x01, 0xef, 0x31, 0xaa, 0xc4, 0x6f, 0x90, 0xfd, 0xb4, 0x2e, 0x3e, 0x95, 0x23, 0x06, 0x02,
0x85, 0x90, 0x8e, 0x06, 0xe2, 0x82, 0xc3, 0x10, 0xe4, 0x9a, 0xef, 0xf3, 0x56, 0x6b, 0xc1, 0xfb,
0x35, 0xa4, 0xc3, 0xe1, 0xb0, 0x86, 0xf4, 0x0f, 0xb6, 0x23, 0x28, 0x14, 0x1c, 0x8a, 0xca, 0x53,
0x82, 0x51, 0xe2, 0xb9, 0x0d, 0x26, 0xac, 0x12, 0x13, 0xda, 0x2a, 0x14, 0x27, 0x4d, 0x97, 0x11,
0xaa, 0x1a, 0x86, 0xaf, 0x88, 0x72, 0xc7, 0x32, 0x67, 0xa2, 0xb8, 0xac, 0xc4, 0x8a, 0x0d, 0xfa,
0x99, 0x6e, 0x14, 0x37, 0x9d, 0x77, 0x1a, 0xdf, 0x59, 0x83, 0x09, 0xa1, 0xfc, 0x8c, 0xec, 0x6f,
0x5b, 0xc8, 0x6a, 0xca, 0xfd, 0x91, 0x72, 0x62, 0xeb, 0x45, 0x2b, 0x95, 0x01, 0xdb, 0x08, 0xea,
0xd4, 0xdd, 0xe4, 0x3a, 0xd2, 0x74, 0x62, 0xad, 0xb6, 0xbb, 0x47, 0x69, 0x11, 0xac, 0xba, 0x97,
0xde, 0x9e, 0xb5, 0xc2, 0x17, 0x7a, 0xf6, 0x15, 0x59, 0xbd, 0x03, 0x2d, 0x1a, 0x29, 0x5e, 0x8c,
0x67, 0x1a, 0x14, 0x66, 0x8d, 0x50, 0xd4, 0x9d, 0xaa, 0x34, 0x2d, 0x2e, 0xd7, 0x55, 0xab, 0xe7,
0xb6, 0xd9, 0x86, 0xff, 0xf1, 0x29, 0x27, 0xd0, 0xa1, 0x68, 0x08, 0x18, 0xbf, 0x4c, 0x7d, 0x35,
0x3d, 0x0e, 0x2a, 0x60, 0xcd, 0xd7, 0x7e, 0xe5, 0x18, 0x06, 0xa5, 0x5e, 0x36, 0xc5, 0xb9, 0x51,
0xb8, 0xd5, 0x90, 0x8d, 0x88, 0x5c, 0xbf, 0x83, 0x8a, 0x12, 0xe8, 0x67, 0x6d, 0x1d, 0x59, 0xca,
0x9b, 0x56, 0xff, 0x87, 0x96, 0xa6, 0x37, 0x2d, 0x1d, 0xb7, 0x45, 0xe6, 0x24, 0x9c, 0x33, 0x20,
0xb3, 0xbd, 0x4e, 0xa7, 0xd3, 0x58, 0xf9, 0xa5, 0xaf, 0x0d, 0x7c, 0xe6, 0x6d, 0x9d, 0x83, 0x7c,
0xde, 0xaf, 0xfe, 0xb2, 0x74, 0x9e, 0xf7, 0x0a, 0x18, 0x14, 0xba, 0x5f, 0xe4, 0xad, 0xc1, 0x88,
0x5e, 0xcf, 0x8a, 0x9a, 0xbe, 0x6e, 0x6c, 0x33, 0x39, 0x3b, 0x81, 0x7a, 0xa3, 0x18, 0x74, 0xdd,
0x6c, 0xfd, 0x28, 0x0c, 0x37, 0x9f, 0x0f, 0x5e, 0x57, 0x9c, 0xd2, 0xed, 0x05, 0x73, 0xfd, 0x98,
0x6c, 0xd7, 0xeb, 0xa9, 0x9e, 0x1e, 0xb7, 0xeb, 0xaa, 0x5f, 0x9c, 0xb8, 0x09, 0xe0, 0x75, 0xc1,
0x1d, 0xc2, 0xa2, 0x82, 0xe2, 0x92, 0x8b, 0xee, 0xb9, 0xd7, 0xd2, 0x48, 0x5f, 0x0a, 0x59, 0x23,
0x55, 0x60, 0x06, 0x8f, 0x51, 0x90, 0x7e, 0x9c, 0x64, 0xf1, 0xa5, 0x4b, 0x02, 0x67, 0x34, 0x4d,
0xbc, 0xcd, 0xc7, 0x6f, 0x56, 0x4a, 0x30, 0x93, 0xaf, 0xd7, 0xe7, 0x94, 0x94, 0xc1, 0xf3, 0x4a,
0xf6, 0xc8, 0x12, 0x99, 0x9a, 0xb1, 0x68, 0x9f, 0xfd, 0x77, 0xb7, 0x68, 0xd9, 0xaf, 0xc3, 0xcc,
0x74, 0xe8, 0xc1, 0x50, 0x78, 0x9d, 0x3e, 0xdb, 0xef, 0x80, 0xa4, 0xb3, 0x38, 0x26, 0x28, 0x3f,
0xd0, 0xba, 0x11, 0x52, 0x63, 0xae, 0x87, 0xc0, 0xe8, 0xb0, 0x86, 0x1c, 0xa4, 0x36, 0x48, 0x6f,
0xe7, 0x7c, 0xd8, 0x7d, 0xff, 0xf6, 0xdd, 0xd3, 0xd6, 0x8b, 0x8b, 0x09, 0x1e, 0x86, 0x5d, 0xad,
0xce, 0xb7, 0xd3, 0xb0, 0xd3, 0x02, 0x2b, 0xdd, 0x8b, 0x06, 0x17, 0x54, 0x5f, 0xcd, 0x8c, 0xbe,
0x9d, 0xc9, 0x24, 0x49, 0xee, 0xa2, 0x20, 0x75, 0xe1, 0x60, 0x32, 0xa3, 0x76, 0xce, 0x78, 0x23,
0xc7, 0x88, 0xeb, 0x69, 0x95, 0x4e, 0x56, 0xd7, 0x6c, 0xc2, 0xe6, 0x9b, 0x2e, 0x70, 0xad, 0xdc,
0xf9, 0xcb, 0xf4, 0x96, 0xb4, 0x03, 0xb2, 0x71, 0x1d, 0xcc, 0x69, 0x90, 0x66, 0x8b, 0x13, 0xdc,
0x37, 0x73, 0xe7, 0xc0, 0xcf, 0x47, 0x3f, 0x0d, 0x1f, 0xac, 0x1f, 0xba, 0x29, 0x87, 0x3e, 0x99,
0x5b, 0xc1, 0xc6, 0x02, 0x4a, 0x2d, 0x5d, 0x47, 0x2e, 0x50, 0x95, 0x49, 0xa0, 0x99, 0x61, 0xb4,
0x95, 0x3a, 0xc7, 0x24, 0x33, 0xf7, 0x58, 0x3d, 0x46, 0x62, 0x89, 0x09, 0x50, 0xee, 0x05, 0xa9,
0xda, 0x2f, 0x5f, 0xbd, 0xd8, 0x7e, 0x38, 0x03, 0xa9, 0x59, 0xb5, 0x00, 0xa4, 0x14, 0xf2, 0xdd,
0x9d, 0xf3, 0x38, 0xda, 0xdc, 0x79, 0xf8, 0x62, 0x07, 0x1c, 0x7b, 0xaa, 0x90, 0x00, 0xdc, 0xc3,
0x9c, 0x78, 0x8f, 0x0b, 0x89, 0xa7, 0xa3, 0xd1, 0xee, 0x63, 0xbf, 0xf2, 0x29, 0xd4, 0x98, 0xb2,
0x9b, 0xdc, 0x70, 0xce, 0xdd, 0xbf, 0x9f, 0x2d, 0x0d, 0x56, 0xea, 0xc5, 0x74, 0xee, 0x2e, 0x70,
0xd8, 0xdb, 0x00, 0xba, 0x1f, 0x81, 0xf7, 0xf1, 0x25, 0xa7, 0xf0, 0x0e, 0xdf, 0x9b, 0x81, 0x0f,
0xff, 0x31, 0xf0, 0x87, 0xbb, 0x48, 0x1b, 0x07, 0x71, 0xba, 0xaa, 0xed, 0x85, 0x38, 0xec, 0xcc,
0x05, 0xac, 0xbc, 0x69, 0x16, 0x27, 0x0f, 0x27, 0xb6, 0x30, 0xfc, 0x05, 0x5d, 0xc6, 0x4e, 0xd9,
0x86, 0x08, 0x00, 0x00
0xdb, 0x8f, 0xc7, 0xa3, 0x59, 0x0c, 0x94, 0xc1, 0xfb, 0x42, 0x89, 0xae, 0x50, 0x7c, 0x0c, 0x9b,
0x6e, 0xc0, 0x7b, 0x8c, 0x2a, 0xf1, 0x1b, 0x64, 0x3f, 0xed, 0x8b, 0x4f, 0xe5, 0x88, 0x81, 0x40,
0x21, 0xa4, 0x2b, 0x03, 0x71, 0xc1, 0x61, 0x08, 0x72, 0xcd, 0xf7, 0x79, 0xab, 0xb5, 0xe0, 0xfd,
0x1a, 0xd2, 0xe1, 0x70, 0x58, 0x43, 0xfa, 0x47, 0xb5, 0x23, 0x28, 0x14, 0x1c, 0x8a, 0xca, 0x53,
0x82, 0x51, 0xe2, 0xb9, 0x04, 0x13, 0x56, 0x89, 0x09, 0x6d, 0x15, 0x8a, 0x93, 0xa6, 0xcb, 0x08,
0x55, 0x0d, 0xc3, 0x57, 0x44, 0xb9, 0xab, 0x32, 0x67, 0xa2, 0xb8, 0xac, 0xc8, 0x8a, 0x0d, 0xfa,
0xb9, 0xdc, 0x28, 0x6e, 0x3a, 0xef, 0x34, 0x7e, 0xb3, 0x06, 0x13, 0x42, 0xf9, 0x19, 0xd9, 0xff,
0x36, 0x90, 0xd5, 0x94, 0xfb, 0x63, 0xc9, 0x89, 0x8d, 0x17, 0xad, 0x54, 0x06, 0x6c, 0x23, 0xa8,
0x63, 0x77, 0xb3, 0xd6, 0xb1, 0x4c, 0x47, 0xd6, 0x2a, 0xdd, 0x3d, 0x4a, 0x8b, 0x60, 0xd5, 0xbd,
0xf4, 0xf6, 0xac, 0x15, 0xbe, 0xd0, 0xb3, 0x9f, 0xc8, 0xf2, 0xbd, 0x53, 0x05, 0xe6, 0xfd, 0xb8,
0xee, 0x6b, 0xd1, 0x20, 0xdf, 0x2d, 0x07, 0xe6, 0x51, 0x8a, 0x97, 0xde, 0xae, 0x84, 0x59, 0x23,
0x14, 0x75, 0x60, 0x94, 0xa6, 0xc5, 0xe5, 0xba, 0x52, 0xc0, 0xdc, 0x4d, 0xab, 0x83, 0x3f, 0x3e,
0xe5, 0x04, 0x3a, 0x14, 0x0d, 0x01, 0xe3, 0x97, 0xa9, 0xdd, 0xa6, 0xf5, 0x41, 0x05, 0xac, 0xf9,
0xda, 0xaf, 0x84, 0xc4, 0xa0, 0xd4, 0x4b, 0x52, 0x9c, 0x1b, 0xe2, 0x5b, 0x0d, 0xd9, 0x08, 0xd4,
0xc9, 0x20, 0xa8, 0x28, 0x81, 0x7e, 0xa6, 0xdc, 0x71, 0x40, 0x79, 0xd3, 0xea, 0xff, 0xd0, 0xe9,
0xf4, 0xa6, 0xd3, 0x63, 0x5a, 0x64, 0x4e, 0xc2, 0x39, 0x03, 0x32, 0xab, 0xee, 0x74, 0x3a, 0x8d,
0x91, 0x5f, 0xfa, 0xda, 0xc0, 0x67, 0xde, 0xd6, 0x39, 0xc8, 0xe7, 0xfd, 0x6a, 0xc9, 0x96, 0xf3,
0xbc, 0x57, 0xc0, 0xa0, 0xd0, 0xfd, 0xc2, 0x7a, 0x0d, 0xa6, 0x17, 0xf5, 0x4c, 0xb4, 0x69, 0xf7,
0x46, 0x9a, 0x49, 0xf0, 0x09, 0xd4, 0x1b, 0xc1, 0xa0, 0xeb, 0xe6, 0x89, 0x88, 0xc2, 0x70, 0xf3,
0xfd, 0xe0, 0x75, 0xc7, 0x29, 0xdd, 0xde, 0x30, 0xc7, 0x8f, 0xc9, 0x76, 0xbc, 0x9e, 0xe2, 0xe9,
0x71, 0x3b, 0xae, 0xfa, 0x45, 0xa0, 0x9b, 0x00, 0x5e, 0x37, 0xdc, 0x21, 0x2c, 0x2a, 0x28, 0x2e,
0xb9, 0xe8, 0x9e, 0x7b, 0x2d, 0x0d, 0xf5, 0xa5, 0x90, 0x35, 0x32, 0x0a, 0x63, 0xf0, 0x18, 0x05,
0xe9, 0xc7, 0x89, 0x16, 0x5f, 0x3a, 0x83, 0x70, 0x42, 0xd3, 0xc4, 0xdb, 0x7c, 0xfd, 0x66, 0xa7,
0x04, 0x63, 0x08, 0x7a, 0x7d, 0x4e, 0x49, 0x19, 0x3c, 0xaf, 0x68, 0x8f, 0x6c, 0x21, 0x53, 0x33,
0x16, 0xee, 0xb3, 0xff, 0xae, 0x16, 0x2d, 0xfb, 0xb5, 0xc7, 0x99, 0x0e, 0x3d, 0x98, 0x12, 0x5e,
0x87, 0xd2, 0xf6, 0x3b, 0x20, 0xe9, 0x4c, 0x8e, 0xf1, 0xcf, 0x0f, 0xb4, 0x6e, 0x84, 0xd4, 0x98,
0xeb, 0x21, 0x30, 0x3c, 0xac, 0x21, 0x07, 0xa9, 0xf5, 0xd7, 0xdb, 0xf1, 0x1f, 0x76, 0xdf, 0xbf,
0x7d, 0xf7, 0xb4, 0xd5, 0xe2, 0x22, 0x82, 0x87, 0x61, 0x57, 0xab, 0xf3, 0xed, 0x34, 0xec, 0xb4,
0xc0, 0x4a, 0xf7, 0xa2, 0xc1, 0x05, 0xd5, 0x57, 0x33, 0xa3, 0x6f, 0x67, 0x32, 0x49, 0x92, 0x3b,
0x87, 0x48, 0x9d, 0x67, 0x18, 0x2b, 0xa9, 0x9d, 0x32, 0xde, 0xd0, 0x31, 0xe2, 0x7a, 0x5a, 0x99,
0x96, 0xe5, 0x35, 0x9b, 0xb0, 0xf9, 0xa6, 0x0b, 0x5c, 0x2b, 0x77, 0xfe, 0x32, 0xbd, 0x25, 0xed,
0x80, 0x6c, 0xdc, 0x12, 0xb3, 0x1b, 0xa4, 0xd9, 0xa2, 0x04, 0xf7, 0x64, 0xae, 0x22, 0xf8, 0xf9,
0xe8, 0xa7, 0xe1, 0x83, 0xd5, 0x43, 0x37, 0xd9, 0xd3, 0x27, 0x73, 0x59, 0x58, 0x5b, 0x40, 0xa9,
0x2d, 0xd7, 0x15, 0x17, 0xa8, 0xca, 0x38, 0xd0, 0x5c, 0x61, 0xb4, 0xe5, 0x3a, 0xc7, 0x24, 0x33,
0xd7, 0x5b, 0x3d, 0x3a, 0x65, 0x89, 0x09, 0x50, 0xee, 0x05, 0xa9, 0xda, 0x2f, 0x8f, 0x5e, 0x6c,
0x7f, 0x9c, 0x80, 0xd4, 0xcc, 0x5a, 0x00, 0x52, 0x0a, 0xf9, 0x6e, 0xe6, 0x3c, 0x8e, 0x36, 0x33,
0x0f, 0x5f, 0xec, 0x80, 0x63, 0x4f, 0x15, 0x12, 0x80, 0x7b, 0x98, 0x13, 0xef, 0x71, 0x29, 0xe2,
0xe9, 0x68, 0xb8, 0xfb, 0xd8, 0xaf, 0x74, 0x0a, 0x35, 0xa6, 0xec, 0xc6, 0x37, 0x9c, 0x72, 0xf7,
0xef, 0x7b, 0x4b, 0x83, 0x95, 0x7a, 0x31, 0x9d, 0xbb, 0x33, 0x1c, 0xf6, 0xd6, 0x80, 0xee, 0x47,
0xe0, 0x7d, 0x7c, 0xc9, 0x29, 0xbc, 0xc3, 0xf7, 0x66, 0xe0, 0xc3, 0x7f, 0x0c, 0xfc, 0xe1, 0xce,
0xd2, 0xc6, 0x41, 0x9c, 0x6e, 0x70, 0x7b, 0x4f, 0x0e, 0x3b, 0x73, 0x2f, 0x2b, 0x6f, 0x9a, 0xc5,
0x49, 0xc3, 0x89, 0x0d, 0x0c, 0x7f, 0x01, 0xbc, 0xb1, 0xff, 0x31, 0x9d, 0x08, 0x00, 0x00
};
// Autogenerated from wled00/data/settings.htm, do not edit!!
const uint16_t PAGE_settings_length = 985;
const uint8_t PAGE_settings[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x56, 0x6d, 0x6f, 0xdb, 0x36,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x56, 0x6d, 0x6f, 0xdb, 0x36,
0x10, 0xfe, 0xee, 0x5f, 0xc1, 0xb0, 0x58, 0x23, 0xa1, 0xb2, 0xec, 0x38, 0xc3, 0xb0, 0xc9, 0x96,
0x8b, 0x35, 0x2f, 0x9d, 0x87, 0x04, 0x0d, 0x90, 0xa4, 0xdd, 0x80, 0x7d, 0xa1, 0xc9, 0x93, 0xcc,
0x46, 0x22, 0x05, 0xf2, 0xe4, 0xc4, 0x73, 0xf3, 0xdf, 0x77, 0x94, 0x9d, 0xb7, 0x36, 0xd8, 0x8a,
@ -133,113 +133,147 @@ const uint8_t PAGE_settings[] PROGMEM = {
// Autogenerated from wled00/data/settings_wifi.htm, do not edit!!
const uint16_t PAGE_settings_wifi_length = 1563;
const uint16_t PAGE_settings_wifi_length = 2098;
const uint8_t PAGE_settings_wifi[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xb5, 0x57, 0xe1, 0x6e, 0xdb, 0x36,
0x10, 0xfe, 0xef, 0xa7, 0x60, 0x38, 0xa0, 0xb0, 0x50, 0x59, 0x8e, 0xed, 0xa5, 0x2b, 0x52, 0xc9,
0x5d, 0x62, 0xbb, 0x4d, 0xb6, 0x34, 0xf5, 0xa0, 0xa0, 0xc1, 0x80, 0x01, 0x05, 0x2d, 0x9d, 0x6d,
0x2e, 0x14, 0xa9, 0x89, 0x94, 0x9d, 0x20, 0xcd, 0xbb, 0xef, 0x48, 0xc9, 0x8e, 0x9d, 0xc4, 0x6d,
0xd1, 0x65, 0x08, 0x1c, 0x98, 0xe4, 0xdd, 0x77, 0xc7, 0xbb, 0xef, 0x8e, 0xe7, 0x70, 0x6f, 0xf8,
0x71, 0x70, 0xf1, 0xe7, 0x78, 0x44, 0xe6, 0x26, 0x13, 0xfd, 0xd0, 0xfe, 0x27, 0x82, 0xc9, 0x59,
0x44, 0x41, 0x52, 0x5c, 0x03, 0x4b, 0xfb, 0x61, 0x06, 0x86, 0x91, 0x64, 0xce, 0x0a, 0x0d, 0x26,
0xa2, 0xa5, 0x99, 0xb6, 0x5e, 0xd3, 0x7a, 0xb7, 0x21, 0x59, 0x06, 0x11, 0x5d, 0x70, 0x58, 0xe6,
0xaa, 0x30, 0x94, 0x24, 0x4a, 0x1a, 0x90, 0x28, 0xb6, 0xe4, 0xa9, 0x99, 0x47, 0x07, 0xfb, 0xfb,
0x6b, 0xd1, 0x07, 0x47, 0x29, 0x2c, 0x78, 0x02, 0x2d, 0xb7, 0xf0, 0xb9, 0xe4, 0x86, 0x33, 0xd1,
0xd2, 0x09, 0x13, 0x10, 0x75, 0xfc, 0x8c, 0x5d, 0xf3, 0xac, 0xcc, 0xd6, 0xeb, 0x52, 0x43, 0xe1,
0x16, 0x6c, 0x82, 0x6b, 0xa9, 0xe8, 0x23, 0xcb, 0xfd, 0xd0, 0x70, 0x23, 0xa0, 0x7f, 0xc9, 0xdf,
0x71, 0x12, 0x83, 0x31, 0x5c, 0xce, 0x74, 0xd8, 0xae, 0x36, 0x43, 0x9d, 0x14, 0x3c, 0x37, 0xfd,
0xc6, 0x82, 0x15, 0x44, 0xa8, 0x84, 0xe7, 0x7e, 0x1a, 0xa5, 0x2a, 0x29, 0x33, 0x74, 0xc8, 0xc7,
0x8d, 0x68, 0xaf, 0xf3, 0x66, 0x5a, 0xca, 0xc4, 0x70, 0x25, 0xc9, 0x49, 0xd3, 0xbb, 0x5d, 0x72,
0x99, 0xaa, 0x65, 0xa0, 0x72, 0x90, 0x4d, 0x3a, 0x37, 0x26, 0xd7, 0x87, 0xed, 0xf6, 0x95, 0x54,
0xc1, 0x52, 0x40, 0x1a, 0xcc, 0xa0, 0x3d, 0x05, 0x66, 0xca, 0x02, 0x74, 0x5b, 0xd7, 0xb6, 0xda,
0x3f, 0x2d, 0xf9, 0x94, 0xb7, 0x56, 0x4b, 0xea, 0xdd, 0xad, 0x01, 0x8f, 0x1f, 0x02, 0xae, 0x95,
0xa8, 0x4f, 0x3f, 0x6b, 0x10, 0xd3, 0x4d, 0x69, 0xa1, 0x58, 0xfa, 0x5b, 0xdc, 0x34, 0x3e, 0x44,
0x7b, 0xfb, 0xde, 0xad, 0x00, 0x43, 0x54, 0x94, 0x06, 0x49, 0x81, 0x16, 0x61, 0x24, 0xc0, 0xfa,
0xdc, 0xa4, 0xd5, 0x8d, 0xa8, 0xf7, 0x46, 0x05, 0x08, 0x76, 0x64, 0x4c, 0xc1, 0x27, 0xa5, 0x01,
0x3c, 0x28, 0x12, 0xea, 0x1b, 0xcf, 0x7f, 0xb8, 0x6f, 0x6e, 0x72, 0x40, 0x73, 0x06, 0xae, 0x4d,
0xfb, 0x6f, 0xb6, 0x60, 0x2b, 0x80, 0x47, 0x82, 0x4c, 0xdf, 0x48, 0x84, 0x00, 0xcf, 0x4f, 0x83,
0x89, 0x4a, 0x6f, 0x02, 0x96, 0xa3, 0xd3, 0xe9, 0x60, 0xce, 0x45, 0xda, 0x54, 0x56, 0x9e, 0xa5,
0xe9, 0x68, 0x81, 0x5e, 0x9c, 0x71, 0x8d, 0x19, 0x85, 0xa2, 0x49, 0xad, 0xcf, 0xd4, 0x6f, 0x7a,
0x51, 0xff, 0xf6, 0x3d, 0x98, 0x4f, 0x4d, 0xef, 0xee, 0x69, 0x39, 0x28, 0x0a, 0x55, 0xa0, 0x7b,
0x28, 0x87, 0x74, 0xd0, 0x4a, 0x40, 0x20, 0xd4, 0xac, 0x49, 0x47, 0x76, 0x9f, 0xd4, 0x97, 0xc7,
0xc0, 0x90, 0x29, 0x17, 0xe0, 0xae, 0x81, 0xf9, 0x2f, 0xf0, 0xba, 0x67, 0xf5, 0xbe, 0x9a, 0x5a,
0x8a, 0x4d, 0xf9, 0xac, 0x2c, 0x98, 0x8b, 0x56, 0x75, 0x0d, 0x32, 0x65, 0xdc, 0x26, 0xe6, 0x2f,
0x79, 0x2a, 0x13, 0x95, 0xe5, 0x18, 0x34, 0x20, 0x39, 0x9b, 0x01, 0x49, 0x99, 0x61, 0x7b, 0x18,
0xde, 0x8d, 0x00, 0xc7, 0x98, 0x0e, 0x6a, 0x0d, 0x1c, 0xd2, 0x28, 0xaa, 0xf3, 0x82, 0x1c, 0x70,
0x78, 0x41, 0x5e, 0x28, 0xa3, 0x12, 0x25, 0x5e, 0xbc, 0x68, 0x3a, 0x5e, 0xec, 0xfb, 0x4d, 0x47,
0x98, 0xc8, 0x4a, 0x88, 0xd8, 0xa8, 0x02, 0x51, 0x91, 0x00, 0xe6, 0xd4, 0x40, 0x66, 0x2f, 0x9e,
0x9c, 0xe6, 0xd4, 0xf3, 0xbe, 0x7c, 0xa9, 0xc5, 0x50, 0x3f, 0xcb, 0xd1, 0xe1, 0x77, 0x88, 0x4f,
0x3e, 0xa8, 0x14, 0x02, 0x32, 0x16, 0xc0, 0x34, 0x10, 0x0c, 0x04, 0x14, 0xe4, 0xf2, 0x6c, 0x34,
0x24, 0xa7, 0x63, 0x74, 0xc9, 0xdf, 0x42, 0xd4, 0xdb, 0x88, 0xbe, 0x43, 0xf3, 0x3c, 0x2b, 0xe5,
0xe8, 0x60, 0xe1, 0xdf, 0x3a, 0x26, 0x22, 0x11, 0xe9, 0x4b, 0x77, 0x7c, 0x48, 0xa9, 0xf7, 0xf2,
0x9e, 0x4c, 0x6d, 0x1d, 0xfc, 0xad, 0xdf, 0xe6, 0x51, 0x87, 0xfa, 0x7b, 0x1d, 0xef, 0xae, 0x11,
0xb6, 0x6b, 0xda, 0x87, 0xda, 0xdc, 0x60, 0x15, 0xfc, 0xca, 0x33, 0x5b, 0x2a, 0xa4, 0x2c, 0x04,
0xd2, 0xc4, 0x6e, 0x05, 0x89, 0x46, 0xa2, 0xbe, 0x41, 0x41, 0x27, 0x10, 0xb6, 0xab, 0x82, 0xb7,
0x59, 0xc7, 0x64, 0x58, 0xcb, 0x11, 0xc5, 0x68, 0x61, 0x71, 0x4d, 0x55, 0x91, 0x35, 0x08, 0xc7,
0xb5, 0xfd, 0xf6, 0x59, 0x53, 0x52, 0xd5, 0x5f, 0x3c, 0xa5, 0x04, 0xcb, 0x7b, 0xae, 0xf0, 0x24,
0x57, 0xda, 0xd6, 0x61, 0xca, 0x17, 0x24, 0x11, 0x4c, 0xeb, 0x88, 0x1a, 0x85, 0xe1, 0x58, 0x6e,
0xef, 0xcd, 0x41, 0xe4, 0xc7, 0xb4, 0xdf, 0x08, 0x91, 0x6d, 0x06, 0xb3, 0x61, 0x79, 0x19, 0xd1,
0x6a, 0x41, 0xd1, 0x6a, 0x22, 0x78, 0x72, 0x15, 0xd1, 0x13, 0x6b, 0xf6, 0x6d, 0xd8, 0xae, 0x0e,
0xd0, 0x35, 0x84, 0xe8, 0x3f, 0xad, 0xd3, 0x58, 0x2b, 0x1d, 0x5b, 0xa5, 0x63, 0x96, 0x5c, 0xdd,
0xeb, 0x6d, 0x69, 0xe8, 0x72, 0x92, 0x71, 0xf4, 0x31, 0x66, 0x0b, 0x20, 0x2f, 0xc8, 0x40, 0x49,
0x09, 0x89, 0xb9, 0x17, 0x9e, 0x17, 0xe8, 0x57, 0x65, 0x69, 0xde, 0xad, 0x5a, 0x09, 0x06, 0xb7,
0xcc, 0x31, 0x30, 0x5d, 0xdc, 0xea, 0xf5, 0x6b, 0x0d, 0x62, 0x14, 0x81, 0x6b, 0x64, 0xb5, 0xa5,
0xa4, 0x04, 0xb3, 0x54, 0x05, 0x9a, 0xc4, 0xf3, 0xc6, 0x79, 0xb5, 0x70, 0xd1, 0x21, 0xcd, 0x38,
0x3e, 0x1d, 0xfa, 0x04, 0x90, 0x10, 0x37, 0x56, 0x45, 0x2a, 0x63, 0xd9, 0x6b, 0x11, 0xbc, 0xc3,
0x70, 0x52, 0xf4, 0x43, 0x2e, 0xf3, 0xd2, 0xd4, 0xce, 0xd9, 0xca, 0x5c, 0x85, 0x75, 0x10, 0xe3,
0xb5, 0xb0, 0x09, 0x0a, 0x90, 0x33, 0xec, 0x95, 0xb4, 0xd7, 0xc5, 0x20, 0xa2, 0xc2, 0x0a, 0x3e,
0xc7, 0x50, 0xe2, 0x97, 0xf4, 0x31, 0xca, 0xea, 0x64, 0x8d, 0x34, 0xde, 0x46, 0x7a, 0xd5, 0xab,
0x90, 0x62, 0x83, 0x7c, 0x4f, 0x90, 0x89, 0xa4, 0x89, 0xf4, 0xc4, 0x70, 0x30, 0x43, 0xf6, 0x03,
0xf7, 0x47, 0x30, 0xc5, 0x64, 0x78, 0x32, 0x18, 0x6f, 0x39, 0x59, 0xc1, 0x9d, 0xee, 0x23, 0x5c,
0x65, 0x49, 0x96, 0xd9, 0x04, 0x0a, 0xba, 0xca, 0x2b, 0x52, 0x22, 0xe3, 0x32, 0xa2, 0x28, 0x80,
0xe6, 0x22, 0xda, 0x3d, 0x38, 0xa0, 0xa4, 0x80, 0x7f, 0x4a, 0x5e, 0x40, 0xda, 0x27, 0x01, 0xd9,
0xc6, 0xe9, 0x3c, 0x13, 0x4e, 0xf7, 0x99, 0x70, 0x7a, 0x3f, 0x86, 0xb3, 0x11, 0xca, 0x19, 0xb6,
0xe7, 0x25, 0xbb, 0xd9, 0x88, 0x59, 0xa3, 0x06, 0x7f, 0x8f, 0xba, 0xff, 0xc9, 0xc7, 0xfa, 0xb1,
0x7b, 0xdf, 0x79, 0x26, 0x9c, 0xee, 0x33, 0xe1, 0xf4, 0x7e, 0x08, 0xc7, 0x06, 0xa8, 0x51, 0x07,
0x0d, 0x2b, 0x12, 0xeb, 0x07, 0xa5, 0xf4, 0xd5, 0x63, 0xb2, 0xc5, 0xdf, 0x11, 0xb7, 0xc6, 0x77,
0x24, 0x37, 0xee, 0x3c, 0x13, 0x4e, 0xf7, 0x99, 0x70, 0x7a, 0x3f, 0x86, 0x63, 0x03, 0x94, 0x0d,
0xcf, 0x63, 0x82, 0x0f, 0x2b, 0x8e, 0x1e, 0x7a, 0x55, 0xba, 0x55, 0x83, 0xb1, 0x55, 0x2b, 0x15,
0xb1, 0x02, 0x55, 0xe1, 0xd6, 0x8f, 0x05, 0x59, 0x91, 0xf1, 0x89, 0x36, 0xf3, 0xc1, 0x25, 0x68,
0xb3, 0xcb, 0x10, 0xf7, 0x14, 0x0a, 0xab, 0x3f, 0x10, 0x1c, 0xdf, 0x2c, 0x6c, 0x11, 0x87, 0x24,
0xd4, 0x39, 0x93, 0x6b, 0x2f, 0x79, 0x8e, 0xfd, 0xfb, 0xfc, 0xbe, 0x99, 0x41, 0x8a, 0x2f, 0x08,
0x0a, 0x38, 0x07, 0xeb, 0x36, 0xe9, 0x9e, 0x68, 0x20, 0x47, 0x49, 0x62, 0x1d, 0x1d, 0x2b, 0x2e,
0x4d, 0xd5, 0x21, 0x8f, 0xc6, 0xc4, 0xb6, 0xc5, 0x27, 0x7d, 0x3f, 0x1a, 0x7f, 0xa3, 0x2f, 0x1e,
0xc5, 0x8f, 0x1c, 0x6e, 0x58, 0x85, 0x13, 0x9e, 0xa2, 0xad, 0xb1, 0x93, 0x3a, 0x24, 0x5b, 0xea,
0xc9, 0x1c, 0x92, 0xab, 0x89, 0xba, 0x5e, 0x43, 0x9c, 0x54, 0x0d, 0xd0, 0x3a, 0xb2, 0x6a, 0x96,
0x8f, 0x9d, 0xb1, 0x73, 0x9a, 0xf7, 0xed, 0xee, 0x7a, 0xf4, 0xb8, 0xbb, 0x22, 0xa8, 0xc1, 0x87,
0x1e, 0xb3, 0xd8, 0x0c, 0x6e, 0x5f, 0xfb, 0xaf, 0x7a, 0x77, 0xde, 0x17, 0x7c, 0x96, 0x88, 0x9b,
0x44, 0x23, 0x3a, 0x72, 0x26, 0xd0, 0x02, 0x26, 0x3a, 0x20, 0xaf, 0xdd, 0x5c, 0xcd, 0x30, 0x84,
0x85, 0x5e, 0xb9, 0xb5, 0x11, 0x31, 0xe2, 0x9e, 0x20, 0x14, 0xc1, 0x30, 0x8b, 0xc3, 0x6d, 0x12,
0x1d, 0x0d, 0x76, 0x90, 0xe8, 0x7a, 0xc5, 0xa2, 0xce, 0x8a, 0x45, 0x9d, 0xde, 0x03, 0x12, 0xe1,
0xd5, 0xed, 0x05, 0xb5, 0x4d, 0x2c, 0x08, 0xfb, 0xa0, 0xd5, 0x98, 0xf8, 0x30, 0x87, 0x2a, 0x77,
0x53, 0xd2, 0x82, 0x89, 0x12, 0x2c, 0x15, 0x6d, 0xaa, 0x57, 0x99, 0xb6, 0x07, 0x6c, 0x6a, 0xe7,
0x98, 0x89, 0x52, 0x98, 0xd0, 0x4a, 0xf6, 0xa1, 0x4e, 0x87, 0xf6, 0x87, 0x5c, 0x6f, 0x90, 0xe3,
0x81, 0x58, 0xa3, 0x96, 0xc3, 0xec, 0x1d, 0x09, 0x6c, 0x99, 0x7a, 0x17, 0x10, 0xbe, 0x55, 0xe7,
0xb0, 0x40, 0x6b, 0x4d, 0xfb, 0x74, 0x16, 0x80, 0xa3, 0x1d, 0x4e, 0xbf, 0x29, 0xa4, 0xde, 0x5a,
0xc3, 0x4e, 0x39, 0xee, 0x0a, 0xab, 0x8b, 0x3d, 0x4d, 0x57, 0xcb, 0x56, 0x0c, 0x33, 0x5f, 0xc0,
0x03, 0xaa, 0x8e, 0xae, 0x73, 0x28, 0xb8, 0x9d, 0xa9, 0x91, 0xf4, 0x8e, 0xa0, 0xe8, 0xba, 0xfd,
0x95, 0x51, 0xc5, 0x5e, 0x0b, 0x80, 0xfc, 0x1b, 0x8c, 0xba, 0x8c, 0xab, 0xd4, 0x85, 0xbc, 0xdf,
0x18, 0xa0, 0x5d, 0x3b, 0xe1, 0x90, 0x25, 0x37, 0xf3, 0x75, 0xd4, 0x16, 0x1c, 0x73, 0xce, 0xb5,
0x2e, 0x41, 0x07, 0x2e, 0xc9, 0xc3, 0x6a, 0x18, 0x00, 0xe9, 0x2c, 0xf1, 0x69, 0x65, 0x8c, 0x6b,
0x62, 0x5f, 0x77, 0x3b, 0x54, 0x24, 0xaa, 0xc0, 0xeb, 0x1a, 0x71, 0xe3, 0x13, 0x2e, 0xed, 0xe8,
0xaf, 0x41, 0x93, 0x5c, 0x2d, 0x31, 0x16, 0x76, 0x70, 0x2e, 0x33, 0x77, 0xfb, 0x20, 0x6c, 0x73,
0x37, 0x5c, 0x55, 0xa3, 0x19, 0xce, 0x61, 0x29, 0xad, 0x6e, 0x65, 0xe6, 0x48, 0x41, 0x6c, 0xac,
0x17, 0xe8, 0xb1, 0xbb, 0xd6, 0x76, 0xa2, 0x47, 0x17, 0x27, 0x4f, 0x65, 0xfa, 0x5c, 0x49, 0x68,
0xec, 0x4a, 0x06, 0x66, 0x6b, 0x14, 0x8f, 0x7b, 0xdd, 0xd6, 0xf8, 0xe3, 0x68, 0x97, 0xcc, 0xab,
0x5a, 0x66, 0x08, 0xe5, 0xf5, 0x4e, 0xa0, 0x5f, 0x68, 0xff, 0xf7, 0xd3, 0x8b, 0xd6, 0xa7, 0x9d,
0x28, 0xf8, 0xf3, 0xf2, 0x8f, 0x92, 0x4b, 0x9c, 0x94, 0x5b, 0x43, 0x3e, 0x6b, 0x7d, 0x4c, 0x0c,
0xdb, 0x09, 0xf6, 0xf3, 0xbd, 0xac, 0xb3, 0xbc, 0x4b, 0xee, 0x00, 0x79, 0x7c, 0xb1, 0xe4, 0x82,
0xcf, 0xe6, 0xe6, 0x0c, 0x2b, 0xf8, 0xeb, 0xd2, 0x48, 0xbc, 0xcb, 0xaf, 0x0a, 0x20, 0xc5, 0x1b,
0x97, 0x17, 0x18, 0x0c, 0x8c, 0xe4, 0x7e, 0xe7, 0x5e, 0x6a, 0x93, 0x8c, 0xee, 0x53, 0x4f, 0x93,
0xc5, 0xff, 0x3e, 0xbb, 0xb6, 0xed, 0x60, 0x6e, 0xcb, 0xc1, 0x4e, 0xef, 0x76, 0x94, 0xb7, 0xbf,
0xe8, 0xff, 0x05, 0xa1, 0x98, 0xa8, 0xba, 0xe1, 0x0f, 0x00, 0x00
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xb5, 0x58, 0x6b, 0x6f, 0xdb, 0xca,
0x11, 0xfd, 0xae, 0x5f, 0xb1, 0xde, 0x16, 0x06, 0x09, 0xd3, 0x94, 0x64, 0x35, 0x69, 0x60, 0x8b,
0x4a, 0xfd, 0xd0, 0x8d, 0xdd, 0x3a, 0x8e, 0x0a, 0x19, 0xd7, 0x28, 0xd2, 0xe0, 0x5e, 0x9a, 0x1c,
0x49, 0x1b, 0x93, 0xbb, 0xbc, 0xdc, 0xa5, 0x64, 0xc3, 0xd6, 0x7f, 0xef, 0xcc, 0x2e, 0xf5, 0xb4,
0x9d, 0x16, 0x81, 0x8b, 0x20, 0x09, 0xb9, 0x3b, 0x3b, 0x33, 0x7b, 0xe6, 0xcc, 0x83, 0xea, 0xee,
0x9c, 0x7d, 0x39, 0xbd, 0xfe, 0xd7, 0xa0, 0xcf, 0x26, 0x26, 0xcf, 0x7a, 0x5d, 0xfa, 0x97, 0x65,
0xb1, 0x1c, 0x47, 0x1c, 0x24, 0xc7, 0x77, 0x88, 0xd3, 0x5e, 0x37, 0x07, 0x13, 0xb3, 0x64, 0x12,
0x97, 0x1a, 0x4c, 0xc4, 0x2b, 0x33, 0xda, 0xff, 0xc0, 0xeb, 0xd5, 0x86, 0x8c, 0x73, 0x88, 0xf8,
0x54, 0xc0, 0xac, 0x50, 0xa5, 0xe1, 0x2c, 0x51, 0xd2, 0x80, 0x44, 0xb1, 0x99, 0x48, 0xcd, 0x24,
0x7a, 0xd7, 0x6a, 0x2d, 0x45, 0xb7, 0xb6, 0x52, 0x98, 0x8a, 0x04, 0xf6, 0xed, 0x4b, 0x20, 0xa4,
0x30, 0x22, 0xce, 0xf6, 0x75, 0x12, 0x67, 0x10, 0xb5, 0x83, 0x3c, 0xbe, 0x17, 0x79, 0x95, 0x2f,
0xdf, 0x2b, 0x0d, 0xa5, 0x7d, 0x89, 0x6f, 0xf1, 0x5d, 0x2a, 0xfe, 0xcc, 0x72, 0xaf, 0x6b, 0x84,
0xc9, 0xa0, 0x77, 0x23, 0x7e, 0x11, 0x6c, 0x08, 0xc6, 0x08, 0x39, 0xd6, 0xdd, 0xa6, 0x5b, 0xec,
0xea, 0xa4, 0x14, 0x85, 0xe9, 0x35, 0xa6, 0x71, 0xc9, 0x32, 0x95, 0x88, 0x22, 0x48, 0xa3, 0x54,
0x25, 0x55, 0x8e, 0x0e, 0x05, 0xb8, 0x10, 0xed, 0xb4, 0x03, 0x54, 0x2f, 0x2f, 0x95, 0x2a, 0x74,
0xd4, 0x0a, 0x8a, 0x12, 0x86, 0xf8, 0x3a, 0x1c, 0x5e, 0x9c, 0x45, 0x9c, 0x1f, 0x8d, 0x2a, 0x99,
0x18, 0xa1, 0x24, 0x1b, 0x5f, 0xa4, 0x1e, 0xf8, 0x8f, 0x25, 0x98, 0xaa, 0x94, 0x2c, 0x0d, 0xc7,
0x60, 0xfa, 0x19, 0x90, 0x96, 0x93, 0x07, 0xbb, 0x35, 0x5f, 0x8a, 0x26, 0xfd, 0x0d, 0xc9, 0xa4,
0x84, 0xd8, 0x40, 0x2d, 0xbc, 0x21, 0x78, 0xee, 0xf9, 0x8f, 0x33, 0x21, 0x53, 0x35, 0x0b, 0x55,
0x01, 0xd2, 0xe3, 0x13, 0x63, 0x0a, 0x7d, 0xd8, 0x6c, 0xde, 0x49, 0x15, 0xce, 0x32, 0x20, 0x2b,
0xcd, 0x11, 0x9e, 0xae, 0x4a, 0xd0, 0x4d, 0x5d, 0x5f, 0xad, 0xf9, 0xa7, 0x99, 0x18, 0x89, 0xfd,
0xc5, 0x2b, 0x5f, 0x53, 0x78, 0xb2, 0xad, 0x70, 0x79, 0x88, 0x07, 0xfc, 0x37, 0x0d, 0xd9, 0x68,
0x5d, 0xfa, 0x0a, 0xa5, 0x31, 0x34, 0xda, 0x30, 0x88, 0x3c, 0x84, 0xe2, 0xa3, 0xb5, 0x8f, 0xe6,
0xf9, 0x9e, 0x45, 0xea, 0x90, 0x73, 0x7f, 0x8f, 0x37, 0xbf, 0x6b, 0x25, 0x9b, 0x12, 0x0c, 0x0f,
0x4c, 0x44, 0x28, 0x70, 0x82, 0x8b, 0xfb, 0x47, 0x26, 0x4c, 0x85, 0xa6, 0xa8, 0xa4, 0xd1, 0x4e,
0x2b, 0x30, 0xa1, 0x90, 0x12, 0xca, 0xf3, 0xeb, 0xcf, 0x97, 0x11, 0x27, 0x04, 0x25, 0x9a, 0x0d,
0xc3, 0x90, 0x07, 0x23, 0x30, 0xc9, 0x04, 0xef, 0x1d, 0x9a, 0x09, 0xba, 0x04, 0x51, 0x0f, 0x42,
0x52, 0xe9, 0xf9, 0xab, 0x95, 0x2f, 0xb7, 0xdf, 0x21, 0x31, 0x61, 0xac, 0xb5, 0x18, 0x4b, 0xef,
0x71, 0x1e, 0x3c, 0xa2, 0xbd, 0x99, 0x2a, 0xef, 0xf4, 0xe1, 0xd7, 0x6f, 0xf3, 0x00, 0xcf, 0x2e,
0xde, 0x43, 0x8d, 0x21, 0xf7, 0x3c, 0x08, 0x8c, 0x1f, 0xf5, 0x4c, 0x58, 0xe2, 0x89, 0x7d, 0xb0,
0xff, 0xf9, 0x61, 0x09, 0x69, 0x95, 0xc0, 0x62, 0xd3, 0x03, 0x94, 0xcd, 0xc1, 0x19, 0xc4, 0xfd,
0x34, 0x8a, 0x22, 0x63, 0x1f, 0xfc, 0xa7, 0x27, 0x08, 0x8b, 0x4a, 0x4f, 0x3c, 0xe3, 0xa3, 0xee,
0xe0, 0xeb, 0xb7, 0x35, 0x57, 0x1e, 0xc5, 0xc8, 0x6b, 0xa1, 0x28, 0x84, 0x19, 0xc8, 0xb1, 0x99,
0xec, 0xee, 0x2e, 0xd9, 0xd1, 0x6d, 0xb7, 0xfc, 0x3a, 0xaa, 0xcb, 0xb5, 0xbd, 0xbd, 0x60, 0xaa,
0x44, 0xca, 0x10, 0xe7, 0x6b, 0x91, 0x83, 0xaa, 0x8c, 0x77, 0x15, 0xb4, 0xa1, 0xe3, 0x1f, 0xad,
0x91, 0xea, 0x28, 0x03, 0xc3, 0xa4, 0x03, 0xef, 0x74, 0x88, 0xd0, 0xa1, 0x0d, 0xe9, 0x3f, 0xd2,
0xaa, 0x89, 0x90, 0x2d, 0x1c, 0x23, 0x83, 0xf7, 0xb7, 0x98, 0xa2, 0xa2, 0x63, 0x63, 0x4a, 0x71,
0x5b, 0x19, 0xf0, 0xb8, 0x48, 0x31, 0x70, 0x74, 0x24, 0xd8, 0xde, 0xa1, 0x24, 0x78, 0x6d, 0x4f,
0x49, 0xcc, 0x59, 0x39, 0xa6, 0xfd, 0x6b, 0xcf, 0x47, 0x81, 0x75, 0x52, 0xcb, 0x70, 0x1a, 0x67,
0x15, 0x1c, 0x8d, 0x54, 0xe9, 0x91, 0x07, 0x80, 0xfe, 0x41, 0xd7, 0x84, 0xc9, 0x44, 0x64, 0x69,
0x09, 0xb2, 0xbe, 0xf7, 0x11, 0xec, 0xed, 0xf9, 0x08, 0x30, 0xe4, 0x6a, 0x0a, 0xa7, 0xb4, 0xe7,
0xad, 0x64, 0xbe, 0xc2, 0x37, 0x7f, 0xa9, 0x40, 0xa1, 0x02, 0xd5, 0x5d, 0xe0, 0x75, 0xa4, 0xf0,
0x5c, 0x4d, 0x2b, 0x61, 0x2f, 0xa7, 0x0a, 0x62, 0x1b, 0xdd, 0x7a, 0xcb, 0x4d, 0xeb, 0x07, 0x0f,
0xe0, 0xab, 0xfa, 0xe6, 0xe2, 0x12, 0x88, 0x35, 0x12, 0xfd, 0xfe, 0xe7, 0xc7, 0xe5, 0xce, 0x9c,
0x79, 0xf5, 0x1b, 0x45, 0x7a, 0xce, 0xd2, 0x93, 0xdc, 0xff, 0x7d, 0x75, 0x10, 0xc3, 0x55, 0xdf,
0x6a, 0x77, 0x77, 0xdb, 0x88, 0x83, 0x16, 0x08, 0xc7, 0xe5, 0x23, 0x21, 0x16, 0x17, 0x98, 0x20,
0xa9, 0xbb, 0x98, 0xf0, 0xe7, 0xce, 0x61, 0xb5, 0xe9, 0xb0, 0x7a, 0xd9, 0x61, 0xbe, 0x73, 0x8a,
0x59, 0x17, 0xa8, 0x75, 0xc6, 0x7f, 0x41, 0xfe, 0x94, 0xac, 0x66, 0xa9, 0xa5, 0xfd, 0xa6, 0x09,
0xe5, 0x07, 0x12, 0xc1, 0x2c, 0xb2, 0x38, 0x81, 0x1b, 0x61, 0x88, 0x7a, 0xf3, 0xf5, 0x04, 0x6a,
0x3f, 0x4f, 0x20, 0x3e, 0x5f, 0xcb, 0x55, 0x8c, 0xe3, 0xa3, 0x8b, 0xd6, 0x06, 0x8b, 0x76, 0xe0,
0xe9, 0xc9, 0xba, 0xb3, 0x83, 0x84, 0xb5, 0xee, 0xd5, 0x0c, 0x3d, 0x5a, 0x91, 0x4b, 0xc8, 0xa2,
0x72, 0xdc, 0x32, 0x0f, 0x05, 0x16, 0x4e, 0x03, 0xf7, 0x94, 0xcb, 0x21, 0xe2, 0x46, 0x7a, 0xf0,
0xc9, 0x15, 0x54, 0xf7, 0xbc, 0x79, 0x63, 0xac, 0xc6, 0x2e, 0xac, 0x3c, 0xe8, 0x1c, 0x10, 0x6c,
0xd6, 0x46, 0xb4, 0xc6, 0xa7, 0x00, 0xb6, 0xaf, 0xb5, 0xf4, 0x39, 0x53, 0x71, 0xfa, 0xf7, 0x21,
0xa5, 0x23, 0x16, 0x08, 0xe7, 0xbe, 0x74, 0x74, 0xb7, 0x35, 0x19, 0x5d, 0x92, 0xdb, 0xc1, 0x2a,
0x13, 0x4e, 0x19, 0xb9, 0xbd, 0x4e, 0x8e, 0x23, 0xee, 0xe4, 0x79, 0xf3, 0x7b, 0x3c, 0x8d, 0x17,
0x0a, 0x9e, 0x09, 0xc6, 0xfa, 0x41, 0xa2, 0x0a, 0xcc, 0xeb, 0x34, 0xbc, 0x55, 0xe9, 0xc3, 0x46,
0x0c, 0x24, 0xc9, 0xc7, 0x69, 0xda, 0x9f, 0x62, 0x21, 0xbe, 0x14, 0x1a, 0x7b, 0x12, 0x94, 0x1e,
0x27, 0x37, 0x79, 0xe0, 0x61, 0xc9, 0x78, 0xfc, 0x04, 0xe6, 0x57, 0xcf, 0x9f, 0xbf, 0x2c, 0x07,
0x65, 0xa9, 0x4a, 0x74, 0x0f, 0xe5, 0x88, 0x2d, 0x2a, 0x43, 0xca, 0xab, 0xb1, 0xc7, 0xfb, 0xb4,
0xce, 0xea, 0xfb, 0x62, 0xd1, 0x63, 0x23, 0x91, 0x81, 0xbd, 0x06, 0x76, 0x30, 0x2c, 0x56, 0xfc,
0xb2, 0x5e, 0x57, 0x23, 0x6a, 0x92, 0x23, 0x31, 0xae, 0xca, 0xd8, 0x02, 0xe4, 0xae, 0xc1, 0x46,
0xb1, 0xa0, 0x5a, 0xff, 0x6f, 0x79, 0x21, 0x13, 0x95, 0x17, 0x88, 0x13, 0xb0, 0x22, 0x1e, 0x03,
0x4b, 0x63, 0x13, 0xef, 0x60, 0xc5, 0x5e, 0xc3, 0x74, 0x88, 0x3c, 0xe0, 0x64, 0xe0, 0x90, 0x47,
0x51, 0x5d, 0xea, 0xb1, 0x58, 0x5b, 0x7d, 0x61, 0x51, 0x2a, 0xa3, 0x12, 0x95, 0xed, 0xee, 0x7a,
0xb6, 0xb3, 0xb5, 0x02, 0xcf, 0x16, 0xf2, 0x88, 0x24, 0xb2, 0xa1, 0x51, 0x25, 0x6a, 0xa5, 0xce,
0x75, 0x61, 0x20, 0xa7, 0x8b, 0x27, 0x17, 0x05, 0xf7, 0xb1, 0x1c, 0xd6, 0x62, 0x78, 0x3e, 0x2f,
0xd0, 0xe1, 0x5f, 0x50, 0x3f, 0xfb, 0xac, 0x52, 0x08, 0xd9, 0x20, 0x83, 0x58, 0x03, 0x43, 0x20,
0x90, 0xde, 0x37, 0x97, 0xfd, 0x33, 0x76, 0x31, 0x40, 0x97, 0x82, 0x0d, 0x8d, 0x7a, 0x53, 0x63,
0x60, 0xb5, 0xf9, 0x3e, 0x49, 0x59, 0x06, 0xfc, 0xa0, 0xb9, 0x2c, 0x9b, 0x9a, 0xc6, 0xa6, 0xf0,
0xb1, 0x88, 0xda, 0x3c, 0xd8, 0x69, 0xfb, 0xf3, 0x46, 0xb7, 0x59, 0x37, 0xee, 0xae, 0x36, 0x0f,
0xd8, 0xc7, 0xff, 0x26, 0x72, 0x6a, 0xf6, 0xac, 0x2a, 0x33, 0xa4, 0x09, 0x2d, 0x85, 0x89, 0xc6,
0x2c, 0x3c, 0x42, 0x41, 0x2b, 0xd0, 0x6d, 0xba, 0x91, 0x85, 0xa2, 0x8e, 0xc1, 0x20, 0xcb, 0x98,
0x46, 0x58, 0xfd, 0x7a, 0x5d, 0x2c, 0x54, 0x79, 0x83, 0x11, 0xdd, 0xe9, 0xe9, 0x37, 0xcd, 0x99,
0x23, 0xfc, 0x70, 0xc4, 0x19, 0x0e, 0x28, 0x13, 0x85, 0x3b, 0x85, 0xd2, 0x34, 0x49, 0xa4, 0x62,
0xca, 0x92, 0x0c, 0xfb, 0x10, 0xa6, 0x89, 0x42, 0x38, 0x66, 0x9b, 0x6b, 0x13, 0xc8, 0x8a, 0x13,
0xde, 0x6b, 0x74, 0x91, 0x6d, 0x06, 0xa3, 0xe1, 0x12, 0xca, 0xbd, 0x70, 0xb4, 0x9a, 0x64, 0x22,
0xb9, 0x8b, 0xf8, 0x39, 0x99, 0xfd, 0xd8, 0x6d, 0xba, 0x0d, 0x74, 0x0d, 0x55, 0xf4, 0x5e, 0x3e,
0xd3, 0x58, 0x1e, 0x3a, 0xa1, 0x43, 0x27, 0x71, 0x72, 0xb7, 0x3a, 0xb7, 0x71, 0x42, 0x57, 0xb7,
0xb9, 0x40, 0x1f, 0x87, 0xf1, 0x14, 0xd8, 0x2e, 0x3b, 0x55, 0x58, 0x2d, 0x12, 0xb3, 0x12, 0x9e,
0x94, 0xe8, 0x97, 0xb3, 0x34, 0x39, 0x70, 0xc3, 0x10, 0x82, 0x5b, 0x15, 0x08, 0xcc, 0x01, 0x2e,
0x75, 0x7a, 0xf5, 0x09, 0x66, 0x14, 0x83, 0x7b, 0x64, 0x35, 0x51, 0xb2, 0x2e, 0x58, 0x28, 0xd3,
0x59, 0x9a, 0x6b, 0x6c, 0x7a, 0x48, 0xb8, 0xd9, 0x8e, 0xbf, 0xba, 0xdf, 0x15, 0xb9, 0x4a, 0x05,
0x60, 0xcd, 0x55, 0xb4, 0x7e, 0xe5, 0x94, 0x59, 0x74, 0x99, 0x67, 0x8b, 0x03, 0x03, 0x24, 0xd4,
0x03, 0x99, 0x94, 0xca, 0x10, 0xfb, 0xc9, 0x03, 0xff, 0x90, 0xc4, 0xbb, 0xb6, 0x2e, 0xb1, 0xb5,
0x9a, 0xc4, 0xea, 0x8a, 0xb4, 0x98, 0xf0, 0xe8, 0x71, 0x59, 0x80, 0x22, 0xde, 0x39, 0xe0, 0xd6,
0xce, 0xc2, 0x4c, 0x81, 0x21, 0xc1, 0x87, 0xf4, 0xb9, 0xb6, 0xc5, 0xce, 0x4a, 0xd3, 0x60, 0x43,
0xd3, 0xfb, 0x8e, 0xd3, 0x34, 0x34, 0x98, 0x37, 0x09, 0x32, 0x9a, 0x61, 0x23, 0x23, 0x58, 0x63,
0xc3, 0x5a, 0xa1, 0xfd, 0xc3, 0x90, 0x2a, 0xec, 0xec, 0xfc, 0x74, 0xb0, 0xe1, 0x6c, 0xad, 0xee,
0xa2, 0xc5, 0x6b, 0x4b, 0xb2, 0xca, 0x6f, 0xa1, 0xe4, 0x0b, 0x7e, 0x20, 0xb5, 0x72, 0x21, 0x23,
0xde, 0xb2, 0xe6, 0x22, 0x7e, 0xf0, 0xee, 0x1d, 0x67, 0x25, 0xfc, 0x51, 0x09, 0x9c, 0x4d, 0x7a,
0x2c, 0x64, 0x5b, 0x7a, 0xda, 0x6f, 0xa4, 0xe7, 0xe0, 0x8d, 0xf4, 0x74, 0x7e, 0x4a, 0xcf, 0x1a,
0x94, 0x63, 0x9c, 0x74, 0x67, 0xf1, 0xc3, 0x61, 0x63, 0x0d, 0x34, 0xa7, 0xfb, 0xd3, 0x4f, 0x63,
0xd6, 0xd8, 0xd4, 0xf3, 0x46, 0x98, 0x7d, 0x7a, 0x23, 0xcc, 0x3e, 0xfd, 0x3c, 0x66, 0x8d, 0x1a,
0x34, 0xcc, 0x6c, 0xcc, 0x43, 0x94, 0xd2, 0x77, 0x87, 0xcf, 0x70, 0x1b, 0xfe, 0x0f, 0xb8, 0x35,
0x7e, 0xe8, 0x68, 0xad, 0xa7, 0xfd, 0x46, 0x7a, 0x0e, 0xde, 0x48, 0x4f, 0xe7, 0xe7, 0xf4, 0x10,
0x40, 0xf9, 0xd9, 0xd5, 0x90, 0x61, 0x83, 0xc6, 0xaf, 0x22, 0xbd, 0x48, 0x5d, 0x57, 0x68, 0x28,
0x6b, 0xa5, 0x62, 0x24, 0xe0, 0x12, 0xb7, 0x6e, 0x3a, 0xb5, 0xed, 0xc6, 0x46, 0xb9, 0xa9, 0x6b,
0xc3, 0xe7, 0x67, 0x55, 0x86, 0xd9, 0x96, 0x9a, 0xd1, 0xf9, 0xd3, 0x4c, 0x60, 0xef, 0xc3, 0x12,
0x71, 0xc8, 0xba, 0xba, 0x88, 0xe5, 0xd2, 0x4b, 0x51, 0x60, 0x1f, 0xb8, 0x5a, 0x15, 0x35, 0x48,
0xb1, 0x13, 0xa1, 0x80, 0x75, 0xb0, 0x2e, 0xb7, 0xb6, 0xd5, 0x03, 0x3b, 0x4e, 0x12, 0x72, 0x74,
0xa0, 0x84, 0x34, 0xb6, 0xd2, 0x36, 0x8e, 0x07, 0x8c, 0xca, 0xe3, 0x8b, 0xbe, 0x1f, 0x0f, 0x5e,
0xad, 0x8f, 0xce, 0xe1, 0xe3, 0xe7, 0x65, 0xd1, 0xa6, 0xdb, 0xb9, 0x48, 0xd1, 0xd6, 0xc0, 0x4a,
0x1d, 0xb2, 0x8d, 0xe3, 0xc9, 0x04, 0x92, 0xbb, 0x5b, 0x75, 0xbf, 0x54, 0x71, 0xee, 0x0a, 0x20,
0x39, 0xb2, 0x28, 0x96, 0xcf, 0x9d, 0xa1, 0x4f, 0x48, 0xff, 0x47, 0xd5, 0xb5, 0x56, 0x36, 0x70,
0x91, 0x5a, 0xab, 0xae, 0xa8, 0xd4, 0xe0, 0xc0, 0x80, 0x51, 0xf4, 0xc2, 0xc7, 0x0f, 0xc1, 0xfb,
0xce, 0xdc, 0x7f, 0xc2, 0x9e, 0xc1, 0xec, 0x37, 0x79, 0xc4, 0xfb, 0xd6, 0x04, 0x5a, 0xc0, 0x40,
0x87, 0xec, 0x83, 0xfd, 0x85, 0x21, 0x46, 0x08, 0x4b, 0xbd, 0x70, 0x6b, 0x0d, 0x31, 0x66, 0x5b,
0x19, 0x7d, 0xd0, 0x48, 0xc8, 0x0e, 0x37, 0x49, 0x74, 0x7c, 0xfa, 0x0a, 0x89, 0xee, 0x17, 0x2c,
0x6a, 0x2f, 0x58, 0xd4, 0xee, 0x6c, 0x91, 0x08, 0xaf, 0x4e, 0x17, 0xd4, 0x14, 0x58, 0xfb, 0x61,
0xb0, 0xd0, 0x89, 0x0d, 0xbe, 0xeb, 0x3e, 0x01, 0x98, 0x9b, 0x76, 0x91, 0x8a, 0x14, 0xea, 0x45,
0xa4, 0x69, 0x23, 0x1e, 0xd1, 0x3c, 0x74, 0xab, 0x14, 0x06, 0xd4, 0xc9, 0x6e, 0x9f, 0x69, 0xf3,
0xde, 0x99, 0xd0, 0x6b, 0xe4, 0xd8, 0x12, 0x6b, 0xd4, 0x72, 0x18, 0xbd, 0xe3, 0x0c, 0x4b, 0xa6,
0x7e, 0x4d, 0x11, 0xf6, 0xaa, 0x2b, 0x98, 0xa2, 0x35, 0x8f, 0x5a, 0x68, 0x09, 0x38, 0x22, 0xe6,
0x38, 0xd2, 0x42, 0xea, 0x2f, 0x4f, 0xd0, 0xb4, 0x64, 0xaf, 0xb0, 0xb8, 0xd8, 0xcb, 0x74, 0x25,
0xb6, 0x22, 0xcc, 0x62, 0x0a, 0x5b, 0x54, 0xed, 0xdf, 0x17, 0x50, 0x0a, 0xfa, 0x79, 0x02, 0x49,
0x6f, 0x09, 0x7a, 0xe6, 0x3e, 0x4c, 0x1c, 0xf6, 0x3a, 0x03, 0x28, 0xfe, 0x0b, 0xa3, 0x6e, 0x86,
0x2e, 0x74, 0x5d, 0xd1, 0x6b, 0x9c, 0xa2, 0x5d, 0x9a, 0x94, 0xd8, 0x0c, 0xbf, 0x08, 0x96, 0xa8,
0x4d, 0x05, 0xc6, 0x5c, 0x68, 0x5d, 0x81, 0x0e, 0x6d, 0x90, 0xcf, 0xdc, 0x50, 0x00, 0xd2, 0x5a,
0x12, 0x23, 0x67, 0x4c, 0x68, 0x46, 0xdd, 0x9d, 0x86, 0x93, 0x44, 0x95, 0x78, 0x5d, 0x93, 0x3d,
0x04, 0x4c, 0x48, 0xfa, 0x15, 0x45, 0x83, 0x66, 0x85, 0x9a, 0x21, 0x16, 0x34, 0x80, 0x57, 0xb9,
0xbd, 0x7d, 0xd8, 0x6d, 0x0a, 0x3b, 0xa4, 0xb9, 0x11, 0x0f, 0xe7, 0xb9, 0x94, 0xbb, 0x5b, 0xd1,
0x27, 0x19, 0x15, 0xd6, 0x6b, 0xf4, 0xd8, 0x4d, 0x38, 0x1b, 0x81, 0xee, 0x5f, 0x9f, 0xbf, 0x14,
0xe9, 0x2b, 0x25, 0xa1, 0xf1, 0x5a, 0x30, 0x30, 0x5a, 0xfd, 0xe1, 0xa0, 0x73, 0xb0, 0x3f, 0xf8,
0xd2, 0x7f, 0x4d, 0xe6, 0x7d, 0x2d, 0x73, 0x06, 0xd5, 0xfd, 0xab, 0x8a, 0xfe, 0xca, 0x7b, 0xff,
0xb8, 0xb8, 0xde, 0xff, 0xf5, 0x55, 0x2d, 0x1f, 0x78, 0xef, 0x9f, 0x95, 0x90, 0x38, 0x71, 0xef,
0x9f, 0x89, 0xf1, 0xfe, 0x97, 0xc4, 0xc4, 0xaf, 0x2a, 0xfb, 0xcb, 0x4a, 0xd6, 0x5a, 0x7e, 0x4d,
0xee, 0x1d, 0xf2, 0xf8, 0x7a, 0x26, 0x32, 0x31, 0x9e, 0x98, 0x4b, 0xcc, 0xe0, 0x1f, 0x4b, 0x23,
0xf1, 0x6e, 0x7e, 0x28, 0x80, 0x14, 0x6f, 0xdc, 0x5c, 0x23, 0x18, 0x88, 0x64, 0xab, 0xbd, 0x92,
0x5a, 0x27, 0xa3, 0xfd, 0x5b, 0x4f, 0xa5, 0xe5, 0xff, 0x7d, 0x06, 0x6e, 0xd2, 0x80, 0x4f, 0xe9,
0x40, 0x5f, 0x01, 0xf4, 0x49, 0x40, 0xbf, 0x6d, 0xfe, 0x07, 0x10, 0x1c, 0x76, 0x1f, 0xeb, 0x14,
0x00, 0x00
};
// Autogenerated from wled00/data/settings_leds.htm, do not edit!!
const uint16_t PAGE_settings_leds_length = 7391;
const uint8_t PAGE_settings_leds[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x3c, 0xdb, 0x56, 0xe3, 0x48,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x3c, 0xdb, 0x56, 0xe3, 0x48,
0x92, 0xef, 0xfe, 0x8a, 0x24, 0xbb, 0x9b, 0x96, 0xc6, 0xc2, 0x96, 0x7c, 0xa1, 0x29, 0xdb, 0x32,
0x8b, 0x81, 0xaa, 0x66, 0x06, 0x1a, 0x0e, 0xa6, 0xbb, 0x66, 0x4e, 0x75, 0x9d, 0x2a, 0x59, 0x4a,
0xdb, 0x2a, 0x64, 0xc9, 0x23, 0xc9, 0x80, 0x17, 0xbc, 0xdf, 0xb4, 0xdf, 0xb0, 0x5f, 0xb6, 0x11,
@ -707,7 +741,7 @@ const uint8_t PAGE_settings_leds[] PROGMEM = {
// Autogenerated from wled00/data/settings_dmx.htm, do not edit!!
const uint16_t PAGE_settings_dmx_length = 1612;
const uint8_t PAGE_settings_dmx[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x57, 0xdb, 0x72, 0xdb, 0x36,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x95, 0x57, 0xdb, 0x72, 0xdb, 0x36,
0x10, 0x7d, 0xd7, 0x57, 0x20, 0x78, 0x88, 0xc9, 0x31, 0x43, 0x4a, 0x4e, 0x95, 0x36, 0x32, 0x49,
0x37, 0x56, 0x5c, 0xdb, 0x1d, 0xdb, 0xf5, 0x44, 0x49, 0xd3, 0x4e, 0xd3, 0xe9, 0x40, 0xe4, 0x4a,
0x44, 0x4c, 0x02, 0x2c, 0x00, 0x4a, 0x76, 0x2e, 0xff, 0xde, 0x05, 0x48, 0x5d, 0xec, 0xd8, 0x69,
@ -814,7 +848,7 @@ const uint8_t PAGE_settings_dmx[] PROGMEM = {
// Autogenerated from wled00/data/settings_ui.htm, do not edit!!
const uint16_t PAGE_settings_ui_length = 3090;
const uint8_t PAGE_settings_ui[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x59, 0x6b, 0x73, 0xda, 0x48,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x59, 0x6b, 0x73, 0xda, 0x48,
0x16, 0xfd, 0xce, 0xaf, 0xe8, 0x74, 0x52, 0x1e, 0x54, 0x56, 0x04, 0x4e, 0x66, 0x6b, 0x13, 0x40,
0x78, 0x63, 0xc7, 0x93, 0x78, 0xca, 0xd9, 0x64, 0x83, 0xbd, 0x99, 0xad, 0xac, 0xcb, 0x23, 0xa4,
0x06, 0x3a, 0x16, 0x92, 0x46, 0xdd, 0x32, 0x66, 0x09, 0xff, 0x7d, 0xcf, 0xed, 0x96, 0x40, 0x60,
@ -1014,7 +1048,7 @@ const uint8_t PAGE_settings_ui[] PROGMEM = {
// Autogenerated from wled00/data/settings_sync.htm, do not edit!!
const uint16_t PAGE_settings_sync_length = 3345;
const uint8_t PAGE_settings_sync[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x5a, 0xeb, 0x73, 0xe2, 0x38,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x5a, 0xeb, 0x73, 0xe2, 0x38,
0x12, 0xff, 0xee, 0xbf, 0x42, 0xe3, 0xad, 0x9a, 0x83, 0x0d, 0x01, 0x13, 0x42, 0x26, 0x93, 0x60,
0xcf, 0x85, 0x90, 0x49, 0xb8, 0x9d, 0x24, 0x0c, 0x24, 0xfb, 0xa8, 0xba, 0xaa, 0x2d, 0x61, 0x0b,
0x70, 0x62, 0x5b, 0x5e, 0x4b, 0xce, 0xa3, 0x66, 0xe7, 0x7f, 0xbf, 0x6e, 0xc9, 0x36, 0xe0, 0xf0,
@ -1230,7 +1264,7 @@ const uint8_t PAGE_settings_sync[] PROGMEM = {
// Autogenerated from wled00/data/settings_time.htm, do not edit!!
const uint16_t PAGE_settings_time_length = 3313;
const uint8_t PAGE_settings_time[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x38,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x38,
0xf6, 0x7b, 0x7e, 0x85, 0x50, 0x7b, 0x98, 0x78, 0x70, 0x9e, 0x90, 0x16, 0x92, 0xd8, 0xdd, 0x10,
0xd2, 0x42, 0x4b, 0x02, 0x67, 0x92, 0x0e, 0xbb, 0xd3, 0xf6, 0x4c, 0x15, 0x5b, 0x49, 0x0c, 0x8e,
0xe4, 0xb5, 0x65, 0x02, 0x4b, 0xf9, 0xef, 0x7b, 0x25, 0x39, 0xce, 0xd3, 0xd0, 0x76, 0x66, 0x3f,
@ -1444,7 +1478,7 @@ const uint8_t PAGE_settings_time[] PROGMEM = {
// Autogenerated from wled00/data/settings_sec.htm, do not edit!!
const uint16_t PAGE_settings_sec_length = 2405;
const uint8_t PAGE_settings_sec[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xa5, 0x58, 0x6d, 0x53, 0xdb, 0x48,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xa5, 0x58, 0x6d, 0x53, 0xdb, 0x48,
0x12, 0xfe, 0xee, 0x5f, 0x31, 0x4c, 0xaa, 0x58, 0xeb, 0x22, 0x2c, 0x43, 0x72, 0x5b, 0x09, 0x20,
0xe7, 0x20, 0x90, 0x0d, 0x57, 0x10, 0x28, 0x6c, 0x36, 0x77, 0x95, 0x4b, 0xa5, 0xc6, 0xd2, 0xd8,
0x9a, 0x58, 0xd6, 0x68, 0x67, 0x46, 0x38, 0xbe, 0xec, 0xfe, 0xf7, 0x7b, 0x7a, 0x24, 0xd9, 0x86,
@ -1599,180 +1633,186 @@ const uint8_t PAGE_settings_sec[] PROGMEM = {
// Autogenerated from wled00/data/settings_um.htm, do not edit!!
const uint16_t PAGE_settings_um_length = 2640;
const uint16_t PAGE_settings_um_length = 2728;
const uint8_t PAGE_settings_um[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xcd, 0x59, 0xfb, 0x6f, 0xdb, 0x38,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xcd, 0x59, 0xfb, 0x6f, 0xdb, 0x38,
0x12, 0xfe, 0x3d, 0x7f, 0x85, 0xc2, 0x06, 0x89, 0x04, 0x2b, 0xb2, 0xd3, 0xee, 0x02, 0x5d, 0xdb,
0x74, 0xae, 0x4d, 0xbb, 0x5b, 0x5f, 0x1f, 0x09, 0xe0, 0x7d, 0xe0, 0x90, 0x0b, 0x1a, 0x59, 0xa2,
0x6d, 0x36, 0x32, 0xa9, 0x13, 0xa9, 0x3c, 0xce, 0xf1, 0xff, 0x7e, 0xdf, 0x50, 0x92, 0x1f, 0x69,
0x52, 0xec, 0xf6, 0x70, 0xc0, 0xfd, 0x12, 0x4b, 0xe4, 0xcc, 0x68, 0x38, 0x8f, 0x6f, 0x66, 0x98,
0xfe, 0xee, 0x9b, 0xd3, 0x93, 0x5f, 0xff, 0x71, 0xf6, 0xd6, 0x9b, 0xd9, 0x79, 0x36, 0xe8, 0xd7,
0x7f, 0x45, 0x9c, 0x7a, 0x59, 0xac, 0xa6, 0x9c, 0x09, 0xc5, 0x06, 0xfd, 0xb9, 0xb0, 0xb1, 0x97,
0xcc, 0xe2, 0xc2, 0x08, 0xcb, 0x59, 0x69, 0x27, 0x87, 0x2f, 0x9b, 0xd5, 0x1d, 0x15, 0xcf, 0x05,
0x67, 0xd7, 0x52, 0xdc, 0xe4, 0xba, 0xb0, 0xcc, 0x4b, 0xb4, 0xb2, 0x42, 0x81, 0xec, 0x46, 0xa6,
0x76, 0xc6, 0x7f, 0xec, 0x74, 0x56, 0xa4, 0x0f, 0xb6, 0x52, 0x71, 0x2d, 0x13, 0x71, 0xe8, 0x5e,
0x42, 0xa9, 0xa4, 0x95, 0x71, 0x76, 0x68, 0x92, 0x38, 0x13, 0xfc, 0x28, 0x9c, 0xc7, 0xb7, 0x72,
0x5e, 0xce, 0x57, 0xef, 0xa5, 0x11, 0x85, 0x7b, 0x89, 0xc7, 0x78, 0x57, 0x9a, 0x7d, 0xf5, 0xe5,
0x41, 0xdf, 0x4a, 0x9b, 0x89, 0xc1, 0x6f, 0xa0, 0x9c, 0xeb, 0xd4, 0x1b, 0x09, 0x6b, 0xa5, 0x9a,
0x9a, 0x7e, 0xbb, 0x5a, 0xef, 0x9b, 0xa4, 0x90, 0xb9, 0x1d, 0xec, 0x5c, 0xc7, 0x85, 0xa7, 0x6f,
0x94, 0x28, 0xc2, 0x4c, 0x27, 0x32, 0x0f, 0xcb, 0x42, 0xdf, 0x98, 0x30, 0xe5, 0xa9, 0x4e, 0xca,
0x39, 0xf4, 0x0b, 0xcb, 0xf9, 0xc9, 0x64, 0xca, 0x17, 0xcb, 0x30, 0x97, 0xca, 0xf0, 0xf3, 0x0b,
0xfa, 0x3d, 0xa5, 0x5f, 0xd0, 0xf3, 0xdd, 0xa3, 0x50, 0x95, 0xf3, 0x8f, 0xbc, 0xd3, 0x9b, 0x94,
0x2a, 0xb1, 0x52, 0x2b, 0x6f, 0x3a, 0x4c, 0x7d, 0x11, 0x2c, 0x0a, 0x61, 0xcb, 0x42, 0x79, 0x69,
0x34, 0x15, 0xf6, 0x6d, 0x26, 0x48, 0xd4, 0xeb, 0x3b, 0xb7, 0xb5, 0x5c, 0x91, 0x4a, 0x73, 0xba,
0x41, 0x2a, 0xf6, 0xf7, 0x99, 0x1e, 0x7f, 0x11, 0x89, 0x65, 0x9c, 0xdb, 0xbb, 0x5c, 0xe8, 0x09,
0xad, 0xed, 0xbe, 0x2a, 0x8a, 0xf8, 0x2e, 0x92, 0xc6, 0xfd, 0x6e, 0xf1, 0xbf, 0xf3, 0x83, 0xc5,
0x8d, 0x54, 0xa9, 0xbe, 0x89, 0x74, 0x2e, 0x94, 0xcf, 0x66, 0xd6, 0xe6, 0xa6, 0xdb, 0x6e, 0x4f,
0xa5, 0x9d, 0x95, 0xe3, 0x28, 0xd1, 0xf3, 0xf6, 0x2b, 0x59, 0x24, 0x5a, 0xeb, 0x2b, 0x29, 0xda,
0x7f, 0x7c, 0x78, 0xfb, 0xa6, 0x7d, 0x23, 0xaf, 0x64, 0xbb, 0xb1, 0xc6, 0xb3, 0xb2, 0x32, 0xcf,
0xa1, 0xa9, 0x17, 0xd8, 0x86, 0xf4, 0xd7, 0x0f, 0xa5, 0xb7, 0x57, 0x54, 0x21, 0xfb, 0x6c, 0x44,
0x36, 0xd9, 0xa4, 0xce, 0x74, 0x9c, 0xfe, 0x7d, 0xe4, 0x8b, 0xd0, 0xf2, 0xdd, 0x4e, 0xb0, 0xc8,
0x84, 0xf5, 0x14, 0x4f, 0xa3, 0xa4, 0x10, 0xb1, 0x15, 0xb5, 0x01, 0x7c, 0x56, 0x59, 0x9d, 0x05,
0x3d, 0x15, 0x41, 0xd8, 0x2b, 0x6b, 0x0b, 0x39, 0x2e, 0xad, 0xc0, 0x46, 0x91, 0xb0, 0x50, 0x04,
0xe1, 0xc3, 0x75, 0xb2, 0x03, 0x3e, 0x67, 0xc5, 0xad, 0x6d, 0x7f, 0x89, 0xaf, 0xe3, 0x46, 0xc0,
0x57, 0x84, 0xb1, 0xb9, 0x53, 0x10, 0x61, 0x83, 0x30, 0x8d, 0xc6, 0x3a, 0xbd, 0x8b, 0xe2, 0x1c,
0x4a, 0xa7, 0x27, 0x33, 0x99, 0xa5, 0xbe, 0x22, 0xfa, 0x38, 0x4d, 0xdf, 0x5e, 0x43, 0x8b, 0x0f,
0xd2, 0x20, 0xf0, 0x44, 0xe1, 0x33, 0xd2, 0x99, 0x85, 0x7e, 0xc0, 0x07, 0x8b, 0x34, 0x2a, 0xe7,
0x9f, 0x73, 0x72, 0x6b, 0x1a, 0x15, 0xe6, 0x3a, 0xad, 0x9f, 0xf4, 0xe7, 0xc6, 0xeb, 0x69, 0x84,
0x20, 0xfc, 0x3c, 0xcd, 0xa5, 0xe6, 0x2f, 0x7e, 0x0a, 0x7f, 0x11, 0xf6, 0x77, 0x3f, 0xe8, 0x4d,
0x74, 0xe1, 0xd3, 0x49, 0x05, 0x02, 0x40, 0xf4, 0x2b, 0xce, 0x28, 0x13, 0x6a, 0x6a, 0x67, 0x3d,
0xd1, 0x6a, 0x05, 0xc4, 0x1c, 0xe5, 0xa5, 0x99, 0xf9, 0xd5, 0xde, 0xb9, 0xb8, 0x08, 0x5c, 0xfc,
0x54, 0x8b, 0x8c, 0xd6, 0x60, 0x8c, 0xc3, 0x23, 0xce, 0x2b, 0x05, 0xce, 0x3b, 0x17, 0xfb, 0xfb,
0xd5, 0x63, 0x64, 0x66, 0x72, 0x62, 0x7d, 0x3a, 0xcf, 0x68, 0x12, 0x8d, 0xde, 0xbc, 0x22, 0x05,
0xf8, 0x5a, 0x8d, 0x7a, 0xfd, 0xe4, 0xc3, 0xa3, 0xeb, 0x1f, 0x4f, 0x47, 0xc3, 0xa7, 0x18, 0xde,
0x3f, 0xce, 0x31, 0x1c, 0x9d, 0x3e, 0xd8, 0x58, 0x3e, 0x6e, 0x36, 0x51, 0x14, 0xba, 0x80, 0xb7,
0x60, 0x36, 0x24, 0xb1, 0xd1, 0x99, 0x88, 0x32, 0x3d, 0xf5, 0xd9, 0x5b, 0x5a, 0xf7, 0xea, 0x58,
0x40, 0x9c, 0x78, 0x13, 0x99, 0x09, 0xe7, 0x55, 0x64, 0x6d, 0x01, 0xef, 0x7f, 0xa8, 0xd7, 0x11,
0xd8, 0x60, 0x9c, 0xc8, 0x69, 0x59, 0xc4, 0x2e, 0x78, 0x2a, 0xaf, 0x7a, 0x93, 0x18, 0x0c, 0x69,
0xf4, 0x4f, 0x35, 0x54, 0x08, 0xdd, 0x1c, 0x96, 0x15, 0x5e, 0x1e, 0x4f, 0x85, 0x97, 0xc6, 0x36,
0xde, 0x45, 0xb4, 0x6d, 0xc4, 0xdb, 0x08, 0xd1, 0xc9, 0xe8, 0x03, 0x5d, 0x64, 0x4b, 0x1d, 0xa6,
0xc8, 0x48, 0x27, 0x2f, 0xca, 0x0b, 0x6d, 0x75, 0xa2, 0xb3, 0xfd, 0x7d, 0xdf, 0x65, 0x69, 0x27,
0xf4, 0x5d, 0x76, 0x73, 0xa2, 0xc8, 0x46, 0x56, 0x17, 0x90, 0x4a, 0x99, 0x39, 0xb4, 0x62, 0x4e,
0x71, 0x90, 0x0c, 0x73, 0x16, 0x04, 0xf7, 0xf7, 0x35, 0x19, 0xf8, 0xe7, 0x39, 0x14, 0xfe, 0x19,
0xf2, 0xbd, 0x8f, 0x3a, 0x15, 0x91, 0x77, 0x96, 0x89, 0xd8, 0x08, 0x0f, 0x86, 0x10, 0x85, 0x47,
0x99, 0xe4, 0x0d, 0xcf, 0xa0, 0x52, 0xb8, 0x25, 0xd1, 0x6c, 0x4b, 0xac, 0x20, 0x25, 0x08, 0x40,
0x95, 0x42, 0x5f, 0x07, 0x15, 0xf8, 0x06, 0x21, 0x04, 0x2b, 0xe7, 0x2c, 0x88, 0xa4, 0x82, 0x41,
0xdf, 0xfd, 0xfa, 0xf1, 0x03, 0x67, 0x9f, 0xb4, 0x57, 0x63, 0x95, 0xf1, 0x10, 0x35, 0x36, 0xce,
0xc8, 0x14, 0x6c, 0x0b, 0x2d, 0x7e, 0xde, 0x44, 0x0b, 0xce, 0x79, 0x0b, 0xf0, 0x20, 0x76, 0x39,
0xf7, 0x3b, 0xf7, 0xdb, 0xb0, 0x32, 0x7c, 0x8c, 0x90, 0x7f, 0x45, 0x98, 0xcc, 0x44, 0x72, 0x45,
0x29, 0x1b, 0x2c, 0x08, 0x06, 0x15, 0x17, 0x11, 0xc1, 0x68, 0x54, 0x88, 0x3c, 0x8b, 0x13, 0x24,
0xd5, 0xf9, 0x05, 0x72, 0x0f, 0x7a, 0x9a, 0x72, 0x6c, 0x6c, 0xe1, 0x1f, 0xbe, 0x08, 0x7a, 0x72,
0xe2, 0x33, 0x9c, 0x63, 0x2c, 0x0a, 0xd8, 0x5d, 0x44, 0x94, 0x9f, 0xc0, 0x2d, 0xc4, 0x34, 0x5e,
0x55, 0x43, 0xd8, 0x09, 0x5f, 0x04, 0xc1, 0x82, 0xb2, 0x83, 0xe4, 0x4a, 0x64, 0x87, 0xec, 0xbb,
0x5c, 0xa8, 0x73, 0x43, 0x22, 0x37, 0x20, 0xc8, 0xee, 0x72, 0x4a, 0x86, 0x73, 0x79, 0x11, 0x2c,
0xf0, 0x2a, 0xa2, 0xeb, 0x38, 0x2b, 0xa1, 0x27, 0x91, 0x62, 0x11, 0x72, 0xe5, 0x04, 0x62, 0xd7,
0x44, 0xb0, 0xb0, 0xbd, 0x43, 0xb8, 0xc1, 0xb5, 0xba, 0xe0, 0x2c, 0x93, 0x73, 0xc1, 0x7a, 0x63,
0x40, 0xcc, 0xd5, 0xf2, 0x11, 0xfe, 0xfb, 0xfb, 0x7a, 0xa5, 0x7f, 0x78, 0xb4, 0x7a, 0x1e, 0xac,
0xc3, 0xfb, 0x2b, 0x79, 0x85, 0x48, 0x1b, 0x71, 0xdb, 0x3b, 0x0e, 0x09, 0x88, 0x25, 0x32, 0x7a,
0x2e, 0x7c, 0xcb, 0x07, 0x16, 0x5f, 0xa1, 0x0a, 0x38, 0x04, 0xaa, 0xd5, 0x92, 0xc3, 0xa3, 0x4e,
0x10, 0x1c, 0x33, 0x44, 0x82, 0x9a, 0x0a, 0xd6, 0x65, 0xcf, 0x26, 0x93, 0x09, 0x5b, 0x2e, 0x45,
0x66, 0xc4, 0xc2, 0xdc, 0x48, 0x9b, 0xcc, 0xfc, 0xca, 0xbe, 0xc1, 0x22, 0x41, 0x28, 0x31, 0xa4,
0x34, 0xeb, 0x56, 0x4f, 0x27, 0x1f, 0xea, 0x27, 0x4a, 0xdb, 0xf5, 0xe2, 0xfb, 0x66, 0x15, 0xa9,
0xc9, 0xba, 0x4e, 0xb1, 0x5e, 0x2a, 0x26, 0x71, 0x99, 0xd9, 0x6e, 0xe5, 0xdd, 0x25, 0xd9, 0xf8,
0x71, 0xfb, 0x7e, 0x97, 0x45, 0xad, 0x9e, 0xc7, 0x56, 0xff, 0xdf, 0xdb, 0x74, 0x1d, 0xc2, 0xc8,
0xe1, 0x33, 0x68, 0x46, 0xf1, 0x0e, 0x6d, 0xab, 0x82, 0x1a, 0x90, 0x51, 0x08, 0x99, 0xec, 0xb9,
0x0a, 0xe5, 0x05, 0xd0, 0xe6, 0xd4, 0x95, 0xd5, 0x08, 0xc9, 0x5b, 0x48, 0x41, 0xc4, 0x41, 0x4d,
0x2c, 0x83, 0xc0, 0x15, 0x7f, 0xae, 0xc2, 0x46, 0x92, 0x0c, 0x7a, 0xe4, 0x32, 0x8f, 0x02, 0xbd,
0x09, 0xeb, 0x6f, 0x24, 0x04, 0x49, 0xda, 0xae, 0xd0, 0xb2, 0x52, 0x80, 0x22, 0xdf, 0xc2, 0x33,
0xb6, 0x2f, 0x1b, 0xb7, 0x58, 0x0a, 0xfb, 0x73, 0x7b, 0x31, 0xe0, 0x1d, 0x20, 0xd3, 0xba, 0x38,
0xd0, 0xda, 0x66, 0x5d, 0x70, 0x2a, 0x05, 0x8d, 0x1e, 0x5f, 0x51, 0x3f, 0x4d, 0xfa, 0x84, 0x2a,
0x8f, 0xa8, 0xb1, 0x3a, 0x2d, 0x7d, 0x7a, 0x6d, 0x4e, 0x80, 0xfd, 0xcf, 0x52, 0xa0, 0x62, 0x02,
0x14, 0x42, 0x18, 0x0f, 0x0d, 0xce, 0xca, 0xb0, 0x0a, 0x29, 0xed, 0xba, 0xa3, 0x16, 0x3f, 0xe8,
0xcf, 0x0a, 0x2f, 0xc9, 0x62, 0x63, 0x38, 0x33, 0xf3, 0x8c, 0x0d, 0x0e, 0x7a, 0x6b, 0x9b, 0xcb,
0xd0, 0x3c, 0x62, 0x73, 0x70, 0xb3, 0x52, 0x5d, 0x29, 0x28, 0x4c, 0x01, 0x68, 0x29, 0x78, 0xa4,
0x4a, 0xb2, 0x32, 0xc5, 0x26, 0x3c, 0x1b, 0x1c, 0x6f, 0x7c, 0x1b, 0x22, 0x82, 0xee, 0xfa, 0xbd,
0x85, 0xfd, 0x96, 0x75, 0xab, 0xcb, 0xc7, 0x0f, 0xaa, 0xd6, 0x36, 0x37, 0x38, 0xac, 0xe9, 0xab,
0xe6, 0xb0, 0x06, 0x87, 0xdd, 0x3e, 0xd5, 0xb9, 0xb9, 0x08, 0xd1, 0xa2, 0x38, 0x93, 0x39, 0xdc,
0xd3, 0x61, 0xd1, 0xf4, 0x5b, 0xaa, 0x57, 0x67, 0x6a, 0x51, 0x27, 0xe9, 0x58, 0xa3, 0xbc, 0xc5,
0x8a, 0x75, 0x11, 0xca, 0x0e, 0x2e, 0xc7, 0xfa, 0x96, 0x85, 0x9a, 0x1f, 0x54, 0x69, 0xc1, 0x6c,
0x51, 0x0a, 0x76, 0xd0, 0xf2, 0xd5, 0x31, 0xab, 0xe0, 0x14, 0xe1, 0xde, 0x45, 0x84, 0x54, 0x21,
0xdf, 0x73, 0x32, 0x6a, 0xb8, 0xec, 0x6a, 0x7e, 0x59, 0x73, 0xed, 0x2d, 0xd4, 0x92, 0x5d, 0x86,
0x75, 0x7c, 0x71, 0xbb, 0x11, 0x4f, 0xc7, 0xbe, 0x6e, 0xf1, 0x4b, 0x8f, 0x0a, 0x31, 0xc8, 0x36,
0x6a, 0x31, 0xf3, 0xe6, 0x52, 0x71, 0x76, 0x78, 0xc4, 0x56, 0x96, 0x87, 0x08, 0xa8, 0x25, 0x15,
0xfa, 0xa1, 0x2e, 0xb8, 0x0e, 0x3c, 0x54, 0xe8, 0x9c, 0xb3, 0x58, 0xdd, 0xad, 0x68, 0x6e, 0x6f,
0x33, 0x76, 0xd0, 0x7b, 0x00, 0x1d, 0xdc, 0xf5, 0x53, 0x74, 0x8c, 0x2d, 0x85, 0x3c, 0x97, 0x9e,
0x75, 0x43, 0xde, 0x7d, 0xfe, 0x63, 0x27, 0xbf, 0xed, 0xb1, 0xcb, 0xe5, 0x03, 0x3f, 0x21, 0x16,
0xeb, 0x28, 0x10, 0x8d, 0xda, 0x44, 0x91, 0x8a, 0xdb, 0xd3, 0x89, 0x23, 0x68, 0x1d, 0xa1, 0xe0,
0xd5, 0x24, 0x97, 0xde, 0xde, 0xc2, 0x2e, 0xbb, 0x1e, 0xce, 0xba, 0xb2, 0x1e, 0xe7, 0xc5, 0x71,
0xb3, 0xdd, 0x97, 0x2a, 0x2f, 0xad, 0x47, 0xd6, 0xe7, 0x6c, 0x26, 0xd3, 0x14, 0x13, 0x86, 0x57,
0xb5, 0xf2, 0x7b, 0x0b, 0xb1, 0xec, 0x12, 0xf7, 0xde, 0x42, 0x1e, 0x53, 0xe2, 0xc1, 0xac, 0xd0,
0xb1, 0x56, 0x78, 0x12, 0xc3, 0x7b, 0x6c, 0x70, 0xd9, 0x95, 0x28, 0xa8, 0xff, 0xb5, 0xb4, 0xbd,
0x45, 0xb1, 0x84, 0xb0, 0xb5, 0xda, 0x5b, 0x92, 0xf6, 0x16, 0xce, 0xc6, 0x9c, 0x14, 0x5f, 0x39,
0x13, 0x0c, 0xdf, 0x16, 0xbd, 0xb7, 0xd0, 0x4b, 0x34, 0x43, 0x4e, 0x50, 0x1d, 0x3b, 0xbe, 0x9d,
0x49, 0x13, 0x1e, 0xec, 0x2d, 0x9e, 0xb6, 0xdc, 0xf2, 0x20, 0xc0, 0xec, 0x32, 0x2e, 0x06, 0x97,
0xcb, 0xad, 0xac, 0x7c, 0x53, 0xe8, 0x1c, 0x2d, 0x8e, 0xaa, 0xaa, 0xf5, 0x53, 0xdd, 0xb5, 0xc8,
0x68, 0x7a, 0x08, 0x90, 0xb7, 0x9b, 0x73, 0x87, 0x79, 0x7d, 0xf7, 0x09, 0x9a, 0x36, 0x79, 0x14,
0x9c, 0x1f, 0x5d, 0x50, 0x19, 0x97, 0xa8, 0x06, 0xc3, 0x4f, 0x67, 0xbf, 0xfd, 0x4a, 0x27, 0x93,
0x91, 0x8d, 0xa7, 0x44, 0x05, 0xf7, 0x56, 0xd1, 0x51, 0x2d, 0xc2, 0x00, 0xf7, 0xf7, 0xeb, 0x82,
0x5f, 0x2f, 0x05, 0x95, 0x0a, 0x02, 0xaf, 0xce, 0x82, 0x3d, 0xe9, 0x0a, 0x5b, 0x6f, 0x3b, 0x07,
0x65, 0x14, 0x37, 0xfd, 0xf9, 0xaa, 0x32, 0xb5, 0x5a, 0xa6, 0x6a, 0x36, 0x34, 0xdf, 0xdc, 0x46,
0x4e, 0xf6, 0xaa, 0x5e, 0x7f, 0x97, 0x6b, 0x27, 0x0b, 0xca, 0x39, 0xd1, 0x9b, 0x0b, 0x2e, 0xa6,
0x37, 0x17, 0x5c, 0xc0, 0x6e, 0x2c, 0x3c, 0x18, 0x0a, 0xaa, 0xe5, 0x50, 0x57, 0x4a, 0x06, 0xcb,
0xba, 0x23, 0x7a, 0x38, 0x3a, 0x50, 0x77, 0x79, 0x08, 0x12, 0xd7, 0xaa, 0xca, 0x08, 0x35, 0x08,
0x46, 0xab, 0x6d, 0xd7, 0x40, 0x7f, 0x3d, 0x47, 0x84, 0x00, 0x5f, 0xb5, 0x92, 0x53, 0x66, 0xd9,
0x96, 0x93, 0x4e, 0x73, 0x7a, 0xaa, 0x50, 0xc6, 0xc1, 0x26, 0x51, 0xc0, 0x68, 0x22, 0xa8, 0x38,
0x7a, 0x64, 0x34, 0xf9, 0xb5, 0xdf, 0xb4, 0xe3, 0x03, 0x68, 0xd4, 0xe6, 0x44, 0x35, 0x82, 0x9d,
0xe1, 0x04, 0x6e, 0x43, 0xb1, 0x35, 0xc8, 0xc8, 0xf5, 0xcc, 0x51, 0x81, 0x3a, 0xaa, 0x29, 0x6d,
0x7c, 0x42, 0x8f, 0x6a, 0x36, 0xf1, 0x7d, 0xb1, 0xb9, 0x01, 0x8c, 0x6f, 0xca, 0xb8, 0x88, 0xe8,
0xb4, 0x38, 0x3f, 0x2d, 0xc0, 0xd7, 0xd4, 0xb3, 0x52, 0xd0, 0x88, 0x74, 0x48, 0x81, 0xc8, 0x6d,
0xb0, 0x1d, 0x77, 0x43, 0x35, 0xd1, 0xcd, 0x81, 0x1a, 0xed, 0x1f, 0x89, 0x2c, 0x52, 0xbd, 0xfa,
0x3a, 0xc5, 0x0f, 0x22, 0x1b, 0x6d, 0xfe, 0x7a, 0x8a, 0xb5, 0xfb, 0xfb, 0x12, 0x93, 0xcd, 0x31,
0xfd, 0x89, 0x9c, 0x39, 0x67, 0x3a, 0x4b, 0x51, 0x75, 0x6d, 0x97, 0xea, 0x0f, 0xed, 0x42, 0x43,
0x94, 0x23, 0x4c, 0x09, 0xaf, 0xd2, 0x2f, 0xd8, 0x57, 0x96, 0xba, 0x62, 0x4c, 0x75, 0x13, 0xb4,
0xdb, 0x38, 0x3d, 0xaa, 0xee, 0xbe, 0x1a, 0x9b, 0xbc, 0xc7, 0x5a, 0x80, 0xfa, 0x8d, 0xa9, 0x93,
0xfa, 0xea, 0xc5, 0x44, 0x10, 0x64, 0x53, 0xef, 0x7e, 0xec, 0x46, 0x60, 0x4c, 0xc0, 0xac, 0xe5,
0x7a, 0x6f, 0x82, 0xe2, 0x16, 0x6b, 0x27, 0x93, 0x69, 0xf4, 0xc5, 0xc0, 0xc4, 0xe1, 0x62, 0x2e,
0xec, 0x4c, 0xa7, 0x5d, 0x86, 0x43, 0xb0, 0x65, 0x10, 0xd9, 0x19, 0x26, 0x5b, 0x4c, 0x32, 0x30,
0x84, 0xbe, 0x6a, 0x7a, 0x73, 0x40, 0x4b, 0x51, 0x50, 0x95, 0x77, 0xed, 0x4a, 0x2a, 0x0d, 0x74,
0xbe, 0x23, 0xa0, 0xcd, 0xa4, 0x12, 0x48, 0x2f, 0xe1, 0x84, 0xf9, 0x68, 0xec, 0x57, 0xfc, 0xe4,
0xed, 0xea, 0xa6, 0x40, 0x60, 0x7a, 0x0b, 0xd7, 0x6d, 0x49, 0x05, 0x29, 0x9c, 0xb1, 0x90, 0x6a,
0xa8, 0x23, 0xd9, 0x6c, 0x50, 0x60, 0xda, 0x47, 0x8a, 0x65, 0x4d, 0xb6, 0x42, 0xa3, 0x59, 0x31,
0xe8, 0xcf, 0x5e, 0x0c, 0x08, 0x69, 0xfa, 0x6d, 0x3c, 0x5c, 0x86, 0x1b, 0x25, 0x6d, 0x55, 0x56,
0x81, 0x0c, 0x3d, 0x46, 0x49, 0xea, 0xf8, 0x1a, 0x9c, 0xe6, 0x6c, 0x35, 0x57, 0x6c, 0x0f, 0x5d,
0x4a, 0x63, 0xe2, 0xd2, 0xa5, 0x4a, 0x23, 0xc2, 0x9b, 0xb3, 0x42, 0x18, 0xe3, 0xf5, 0xe5, 0x60,
0x14, 0x5f, 0x8b, 0x7e, 0x5b, 0x0e, 0x3c, 0xab, 0xbd, 0xfa, 0x1e, 0x46, 0xfe, 0x1b, 0x23, 0x58,
0x55, 0x3c, 0x0c, 0x46, 0x92, 0xf0, 0xb1, 0x01, 0xa6, 0xba, 0x37, 0xa9, 0x6f, 0x01, 0xbe, 0xe1,
0x8a, 0xe6, 0x0e, 0xa1, 0x6d, 0x60, 0xc4, 0xe3, 0x9c, 0xbf, 0x64, 0x21, 0x7a, 0x0c, 0x78, 0x02,
0xa3, 0x1b, 0x75, 0xc8, 0x30, 0xe5, 0x9f, 0xf0, 0x41, 0xb8, 0x39, 0x78, 0x8a, 0xad, 0xc1, 0xd0,
0x5c, 0x8f, 0xa8, 0x1b, 0x14, 0x18, 0x02, 0x05, 0xcd, 0xad, 0x6f, 0x2a, 0xc5, 0x9b, 0x41, 0xda,
0x01, 0xf1, 0xef, 0x38, 0x53, 0x2a, 0xed, 0x9d, 0x1f, 0xd0, 0xb4, 0x8d, 0x55, 0xc0, 0xf1, 0x5c,
0x82, 0x66, 0xb9, 0xd3, 0x6f, 0xd7, 0x37, 0x43, 0x7d, 0xf7, 0xe5, 0xc1, 0xdf, 0xe4, 0x9c, 0x2e,
0x94, 0xbc, 0xb2, 0xc8, 0x7c, 0x56, 0xf7, 0xaf, 0x00, 0xa1, 0xa0, 0x07, 0x42, 0x47, 0x00, 0x87,
0x88, 0x38, 0x05, 0x66, 0xeb, 0xf4, 0x0e, 0x78, 0x4f, 0x16, 0xe0, 0x0c, 0x51, 0x09, 0x18, 0x87,
0x9b, 0xe7, 0x3b, 0x9e, 0xc4, 0x3b, 0x3d, 0x7d, 0x36, 0x4d, 0xc5, 0x18, 0x4d, 0x50, 0xcc, 0x5d,
0x1c, 0x72, 0x96, 0x6b, 0x63, 0x19, 0xf8, 0x2a, 0x0d, 0x50, 0xd4, 0x49, 0x7d, 0xd2, 0x9b, 0x04,
0xa4, 0xf2, 0xba, 0x29, 0xe4, 0x56, 0x63, 0x28, 0xbd, 0x61, 0x83, 0x9d, 0xcd, 0xc5, 0x99, 0xc8,
0xf2, 0xd7, 0x54, 0x2f, 0x4a, 0x6b, 0x71, 0xf4, 0xaa, 0x5c, 0x55, 0x2f, 0x24, 0x33, 0xc9, 0x64,
0x72, 0xc5, 0xd9, 0x3b, 0x52, 0xe6, 0xb8, 0xdf, 0xae, 0x36, 0xa0, 0x30, 0x24, 0xac, 0x78, 0x76,
0x9e, 0x60, 0x7a, 0x4d, 0x4c, 0xaf, 0xe3, 0xe4, 0x6a, 0xcd, 0xb7, 0xf5, 0x95, 0x4a, 0x5f, 0x56,
0x87, 0xcb, 0x8a, 0xa4, 0x80, 0x82, 0x26, 0x8f, 0x95, 0x3b, 0x75, 0x66, 0x4c, 0x99, 0xac, 0xda,
0x0a, 0xd7, 0xf6, 0x77, 0xa7, 0x85, 0x10, 0xaa, 0x57, 0xfb, 0xb3, 0xab, 0x34, 0x9c, 0x39, 0xd8,
0x7f, 0x76, 0xd4, 0xe9, 0x74, 0x7e, 0xe8, 0x79, 0x27, 0xdb, 0xb7, 0x02, 0x10, 0x9d, 0xee, 0x92,
0x47, 0x20, 0x70, 0xe0, 0x6d, 0xca, 0xa5, 0xd8, 0xd8, 0x96, 0x8b, 0x39, 0xe3, 0x81, 0xd4, 0x9d,
0xfd, 0x67, 0x3f, 0xbd, 0x7c, 0xf9, 0x92, 0xa4, 0x96, 0x59, 0xea, 0xc2, 0x9d, 0x9c, 0xb3, 0x9d,
0x05, 0x51, 0x2d, 0xdd, 0xa5, 0x58, 0x65, 0x98, 0xd9, 0xf3, 0xcd, 0x5b, 0xc3, 0x32, 0x87, 0x83,
0x9f, 0x0f, 0x76, 0x7e, 0xc9, 0xf4, 0x38, 0xce, 0xbc, 0x61, 0xdf, 0x94, 0xf9, 0xe0, 0x39, 0xb8,
0xf0, 0x73, 0xe2, 0xfd, 0x72, 0x36, 0x3c, 0x35, 0x9e, 0xff, 0xee, 0x8f, 0x80, 0x8e, 0xde, 0x97,
0xdb, 0x3a, 0xd5, 0x63, 0xcb, 0x60, 0xc7, 0x47, 0x5c, 0xdc, 0xd1, 0x9d, 0xa9, 0x9a, 0xd2, 0x8d,
0x25, 0xdd, 0x91, 0xbc, 0x1d, 0x9d, 0xbd, 0x78, 0x1e, 0x56, 0x6b, 0xc2, 0x2b, 0xc4, 0xbf, 0x4a,
0x89, 0x0c, 0xc4, 0x03, 0x3a, 0x4e, 0xbb, 0x1b, 0x50, 0x06, 0x92, 0x48, 0x0c, 0x89, 0xdd, 0xba,
0x19, 0xa9, 0x3d, 0x55, 0xd7, 0xe2, 0x75, 0x37, 0xe8, 0x5a, 0xc5, 0x1f, 0x5e, 0xae, 0x82, 0x0b,
0x63, 0x25, 0xb9, 0xd1, 0x09, 0xe6, 0x07, 0x1b, 0x8d, 0x07, 0xcd, 0x7e, 0xc1, 0x81, 0xb7, 0xb3,
0x6a, 0x1f, 0xbd, 0x4d, 0x2c, 0x76, 0x8c, 0x03, 0x0f, 0x63, 0x67, 0x77, 0xab, 0xfb, 0x79, 0xfa,
0x7b, 0xf5, 0x9d, 0x2b, 0x4d, 0xaf, 0xdf, 0xfc, 0xe0, 0x53, 0xdf, 0x03, 0x1f, 0xd9, 0x7d, 0xad,
0x10, 0x4d, 0x12, 0xb5, 0x9d, 0x47, 0x67, 0xc3, 0xff, 0xbd, 0x71, 0x69, 0xda, 0xfe, 0x8b, 0xd6,
0x75, 0x03, 0xfa, 0x77, 0x99, 0xd7, 0x71, 0x0e, 0x3c, 0x9a, 0xe5, 0xff, 0xa2, 0x81, 0xdd, 0xf8,
0xff, 0x3d, 0x16, 0x76, 0x8c, 0xce, 0xa5, 0xef, 0xbb, 0x3b, 0x7f, 0xf2, 0x9b, 0x2b, 0x9f, 0xbe,
0xff, 0xce, 0x28, 0x22, 0xce, 0x0a, 0xb9, 0x28, 0x55, 0x51, 0x25, 0x06, 0xcd, 0xb5, 0x5f, 0x03,
0xfd, 0x51, 0x14, 0x35, 0xa9, 0x56, 0xfc, 0x6f, 0x70, 0x08, 0x98, 0x41, 0x88, 0x8b, 0x8c, 0x26,
0x54, 0x26, 0x88, 0xa6, 0xff, 0x64, 0xfc, 0x07, 0xdc, 0x99, 0xc1, 0xa4, 0xdf, 0x18, 0x00, 0x00
0x54, 0xae, 0x4d, 0xbb, 0x5b, 0x5f, 0x1f, 0x09, 0x90, 0x7d, 0xe0, 0x90, 0x0b, 0x1a, 0xd9, 0xa2,
0x6d, 0x36, 0x32, 0xa9, 0x93, 0xa8, 0x3c, 0xce, 0xf1, 0xff, 0x7e, 0xdf, 0x50, 0x0f, 0xcb, 0xa9,
0x53, 0xec, 0x16, 0x58, 0xe0, 0x7e, 0x89, 0x25, 0x6a, 0x66, 0x38, 0x9c, 0xc7, 0x37, 0x33, 0xcc,
0x70, 0xf7, 0xcd, 0xe9, 0xc9, 0xaf, 0xff, 0x3a, 0x7b, 0xeb, 0xcc, 0xcd, 0x22, 0x09, 0x87, 0xd5,
0x5f, 0x11, 0xc5, 0x4e, 0x12, 0xa9, 0x19, 0x67, 0x42, 0xb1, 0x70, 0xb8, 0x10, 0x26, 0x72, 0x26,
0xf3, 0x28, 0xcb, 0x85, 0xe1, 0xac, 0x30, 0xd3, 0xc3, 0x97, 0xf5, 0xea, 0x8e, 0x8a, 0x16, 0x82,
0xb3, 0x1b, 0x29, 0x6e, 0x53, 0x9d, 0x19, 0xe6, 0x4c, 0xb4, 0x32, 0x42, 0x81, 0xec, 0x56, 0xc6,
0x66, 0xce, 0x7f, 0xec, 0xf5, 0x1a, 0xd2, 0x47, 0x9f, 0x62, 0x71, 0x23, 0x27, 0xe2, 0xd0, 0xbe,
0xf8, 0x52, 0x49, 0x23, 0xa3, 0xe4, 0x30, 0x9f, 0x44, 0x89, 0xe0, 0x47, 0xfe, 0x22, 0xba, 0x93,
0x8b, 0x62, 0xd1, 0xbc, 0x17, 0xb9, 0xc8, 0xec, 0x4b, 0x34, 0xc6, 0xbb, 0xd2, 0xec, 0xab, 0x9d,
0xc3, 0xa1, 0x91, 0x26, 0x11, 0xe1, 0x6f, 0xa0, 0x5c, 0xe8, 0xd8, 0x39, 0x17, 0xc6, 0x48, 0x35,
0xcb, 0x87, 0xdd, 0x72, 0x7d, 0x98, 0x4f, 0x32, 0x99, 0x9a, 0x70, 0xe7, 0x26, 0xca, 0x1c, 0x7d,
0xab, 0x44, 0xe6, 0x27, 0x7a, 0x22, 0x53, 0xbf, 0xc8, 0xf4, 0x6d, 0xee, 0xc7, 0x3c, 0xd6, 0x93,
0x62, 0x01, 0xfd, 0xfc, 0x62, 0x71, 0x32, 0x9d, 0xf1, 0xe5, 0xca, 0x4f, 0xa5, 0xca, 0xf9, 0xc5,
0x25, 0xfd, 0x9e, 0xd2, 0x2f, 0xe8, 0xf9, 0xee, 0x91, 0xaf, 0x8a, 0xc5, 0x47, 0xde, 0x1b, 0x4c,
0x0b, 0x35, 0x31, 0x52, 0x2b, 0x67, 0x36, 0x8a, 0x5d, 0xe1, 0x2d, 0x33, 0x61, 0x8a, 0x4c, 0x39,
0x71, 0x30, 0x13, 0xe6, 0x6d, 0x22, 0x48, 0xd4, 0xeb, 0x7b, 0xfb, 0x69, 0xd5, 0x90, 0xca, 0xfc,
0xb4, 0x45, 0x2a, 0xf6, 0xf7, 0x99, 0x1e, 0x7f, 0x11, 0x13, 0xc3, 0x38, 0x37, 0xf7, 0xa9, 0xd0,
0x53, 0x5a, 0xdb, 0x7d, 0x95, 0x65, 0xd1, 0x7d, 0x20, 0x73, 0xfb, 0xbb, 0xc1, 0xff, 0xce, 0xf5,
0x96, 0xb7, 0x52, 0xc5, 0xfa, 0x36, 0xd0, 0xa9, 0x50, 0x2e, 0x9b, 0x1b, 0x93, 0xe6, 0xfd, 0x6e,
0x77, 0x26, 0xcd, 0xbc, 0x18, 0x07, 0x13, 0xbd, 0xe8, 0xbe, 0x92, 0xd9, 0x44, 0x6b, 0x7d, 0x2d,
0x45, 0xf7, 0x8f, 0x0f, 0x6f, 0xdf, 0x74, 0x6f, 0xe5, 0xb5, 0xec, 0xd6, 0xd6, 0x78, 0x56, 0x94,
0xe6, 0x39, 0xcc, 0xab, 0x05, 0xd6, 0x92, 0xfe, 0xfa, 0xb1, 0xf4, 0x6e, 0x43, 0xe5, 0xb3, 0xcf,
0xb9, 0x48, 0xa6, 0x6d, 0xea, 0x44, 0x47, 0xf1, 0x3f, 0xcf, 0x5d, 0xe1, 0x1b, 0xbe, 0xdb, 0xf3,
0x96, 0x89, 0x30, 0x8e, 0xe2, 0x71, 0x30, 0xc9, 0x44, 0x64, 0x44, 0x65, 0x00, 0x97, 0x95, 0x56,
0x67, 0xde, 0x40, 0x05, 0x10, 0xf6, 0xca, 0x98, 0x4c, 0x8e, 0x0b, 0x23, 0xf0, 0x21, 0x9b, 0x30,
0x5f, 0x78, 0xfe, 0xe3, 0x75, 0xb2, 0x03, 0xb6, 0x33, 0xe2, 0xce, 0x74, 0xbf, 0x44, 0x37, 0x51,
0x2d, 0xe0, 0x2b, 0xc2, 0x28, 0xbf, 0x57, 0x10, 0x61, 0x3c, 0x3f, 0x0e, 0xc6, 0x3a, 0xbe, 0x0f,
0xa2, 0x14, 0x4a, 0xc7, 0x27, 0x73, 0x99, 0xc4, 0xae, 0x22, 0xfa, 0x28, 0x8e, 0xdf, 0xde, 0x40,
0x8b, 0x0f, 0x32, 0x47, 0xe0, 0x89, 0xcc, 0x65, 0xa4, 0x33, 0xf3, 0x5d, 0x8f, 0x87, 0xcb, 0x38,
0x28, 0x16, 0x9f, 0x53, 0x72, 0x6b, 0x1c, 0x64, 0xf9, 0x4d, 0x5c, 0x3d, 0xe9, 0xcf, 0xb5, 0xd7,
0xe3, 0x00, 0x41, 0xf8, 0x79, 0x96, 0x4a, 0xcd, 0x5f, 0xfc, 0xe4, 0xff, 0x22, 0xcc, 0xef, 0xae,
0x37, 0x98, 0xea, 0xcc, 0xa5, 0x93, 0x0a, 0x04, 0x80, 0x18, 0x96, 0x9c, 0x41, 0x22, 0xd4, 0xcc,
0xcc, 0x07, 0xa2, 0xd3, 0xf1, 0x88, 0x39, 0x48, 0x8b, 0x7c, 0xee, 0x96, 0xdf, 0x2e, 0xc4, 0xa5,
0x67, 0xe3, 0xa7, 0x5c, 0x64, 0xb4, 0x06, 0x63, 0x1c, 0x1e, 0x71, 0x5e, 0x2a, 0x70, 0xd1, 0xbb,
0xdc, 0xdf, 0x2f, 0x1f, 0x83, 0x7c, 0x2e, 0xa7, 0xc6, 0xa5, 0xf3, 0x9c, 0x4f, 0x83, 0xf3, 0x37,
0xaf, 0x48, 0x01, 0xbe, 0x56, 0xa3, 0x5a, 0x3f, 0xf9, 0xb0, 0x75, 0xfd, 0xe3, 0xe9, 0xf9, 0xe8,
0x29, 0x86, 0xf7, 0xdb, 0x39, 0x46, 0xe7, 0xa7, 0x8f, 0x3e, 0xac, 0xb6, 0x9b, 0x4d, 0x64, 0x99,
0xce, 0xe0, 0x2d, 0x98, 0x0d, 0x49, 0x9c, 0xeb, 0x44, 0x04, 0x89, 0x9e, 0xb9, 0xec, 0x2d, 0xad,
0x3b, 0x55, 0x2c, 0x20, 0x4e, 0x9c, 0xa9, 0x4c, 0x84, 0xf5, 0x2a, 0xb2, 0x36, 0x83, 0xf7, 0x3f,
0x54, 0xeb, 0x08, 0x6c, 0x30, 0x4e, 0xe5, 0xac, 0xc8, 0x22, 0x1b, 0x3c, 0xa5, 0x57, 0x9d, 0x69,
0x04, 0x86, 0x38, 0xf8, 0xb7, 0x1a, 0x29, 0x84, 0x6e, 0x0a, 0xcb, 0x0a, 0x27, 0x8d, 0x66, 0xc2,
0x89, 0x23, 0x13, 0xed, 0x22, 0xda, 0x5a, 0xf1, 0x76, 0x8e, 0xe8, 0x64, 0xb4, 0x41, 0x1f, 0xd9,
0x52, 0x85, 0x29, 0x32, 0xd2, 0xca, 0x0b, 0xd2, 0x4c, 0x1b, 0x3d, 0xd1, 0xc9, 0xfe, 0xbe, 0x6b,
0xb3, 0xb4, 0xe7, 0xbb, 0x36, 0xbb, 0x39, 0x51, 0x24, 0xe7, 0x46, 0x67, 0x90, 0x4a, 0x99, 0x39,
0x32, 0x62, 0x41, 0x71, 0x30, 0x19, 0xa5, 0xcc, 0xf3, 0x1e, 0x1e, 0x2a, 0x32, 0xf0, 0x2f, 0x52,
0x28, 0xfc, 0x33, 0xe4, 0x3b, 0x1f, 0x75, 0x2c, 0x02, 0xe7, 0x2c, 0x11, 0x51, 0x2e, 0x1c, 0x18,
0x42, 0x64, 0x0e, 0x65, 0x92, 0x33, 0x3a, 0x83, 0x4a, 0xfe, 0x86, 0xc4, 0x7c, 0x53, 0x62, 0x09,
0x29, 0x9e, 0x07, 0xaa, 0x18, 0xfa, 0x5a, 0xa8, 0xc0, 0x1e, 0x84, 0x10, 0xac, 0x58, 0x30, 0x2f,
0x90, 0x0a, 0x06, 0x7d, 0xf7, 0xeb, 0xc7, 0x0f, 0x9c, 0x7d, 0xd2, 0x4e, 0x85, 0x55, 0xb9, 0x83,
0xa8, 0x31, 0x51, 0x42, 0xa6, 0x60, 0x1b, 0x68, 0xf1, 0x73, 0x1b, 0x2d, 0x38, 0xe7, 0x1d, 0xc0,
0x83, 0xd8, 0xe5, 0xdc, 0xed, 0x3d, 0x6c, 0xc2, 0xca, 0x68, 0x1b, 0x21, 0xff, 0x8a, 0x70, 0x32,
0x17, 0x93, 0x6b, 0x4a, 0x59, 0x6f, 0x49, 0x30, 0xa8, 0xb8, 0x08, 0x08, 0x46, 0x83, 0x4c, 0xa4,
0x49, 0x34, 0x41, 0x52, 0x5d, 0x5c, 0x22, 0xf7, 0xa0, 0x67, 0x5e, 0x8c, 0x73, 0x93, 0xb9, 0x87,
0x2f, 0xbc, 0x81, 0x9c, 0xba, 0x0c, 0xe7, 0x18, 0x8b, 0x0c, 0x76, 0x17, 0x01, 0xe5, 0x27, 0x70,
0x0b, 0x31, 0x8d, 0x57, 0x55, 0x13, 0xf6, 0xfc, 0x17, 0x9e, 0xb7, 0xa4, 0xec, 0x20, 0xb9, 0x12,
0xd9, 0x21, 0x87, 0x36, 0x17, 0xaa, 0xdc, 0x90, 0xc8, 0x0d, 0x08, 0x32, 0xbb, 0x9c, 0x92, 0xe1,
0x42, 0x5e, 0x7a, 0x4b, 0xbc, 0x8a, 0xe0, 0x26, 0x4a, 0x0a, 0xe8, 0x49, 0xa4, 0x58, 0x84, 0x5c,
0x39, 0x85, 0xd8, 0x35, 0x11, 0x2c, 0x6c, 0xee, 0x11, 0x6e, 0x70, 0xad, 0xce, 0x38, 0x4b, 0xe4,
0x42, 0xb0, 0xc1, 0x18, 0x10, 0x73, 0xbd, 0xda, 0xc2, 0xff, 0xf0, 0x50, 0xad, 0x0c, 0x0f, 0x8f,
0x9a, 0xe7, 0x70, 0x1d, 0xde, 0x5f, 0xc9, 0xcb, 0x44, 0x5c, 0x8b, 0xdb, 0xfc, 0x62, 0x91, 0x80,
0x58, 0x82, 0x5c, 0x2f, 0x84, 0x6b, 0x78, 0x68, 0xb0, 0x0b, 0x55, 0xc0, 0x11, 0x50, 0xad, 0x92,
0xec, 0x1f, 0xf5, 0x3c, 0xef, 0x98, 0x21, 0x12, 0xd4, 0x4c, 0xb0, 0x3e, 0x7b, 0x36, 0x9d, 0x4e,
0xd9, 0x6a, 0x25, 0x92, 0x5c, 0x2c, 0xf3, 0x5b, 0x69, 0x26, 0x73, 0xb7, 0xb4, 0xaf, 0xb7, 0x9c,
0x20, 0x94, 0x18, 0x52, 0x9a, 0xf5, 0xcb, 0xa7, 0x93, 0x0f, 0xd5, 0x13, 0xa5, 0xed, 0x7a, 0xf1,
0x7d, 0xbd, 0x8a, 0xd4, 0x64, 0x7d, 0xab, 0xd8, 0x20, 0x16, 0xd3, 0xa8, 0x48, 0x4c, 0xbf, 0xf4,
0xee, 0x8a, 0x6c, 0xbc, 0xdd, 0xbe, 0xdf, 0x65, 0x51, 0xa3, 0x17, 0x91, 0xd1, 0xff, 0xf7, 0x36,
0x5d, 0x87, 0x30, 0x72, 0xf8, 0x0c, 0x9a, 0x51, 0xbc, 0x43, 0xdb, 0xb2, 0xa0, 0x7a, 0x64, 0x14,
0x42, 0x26, 0x73, 0xa1, 0x7c, 0x79, 0x09, 0xb4, 0x39, 0xb5, 0x65, 0x35, 0x40, 0xf2, 0x66, 0x52,
0x10, 0xb1, 0x57, 0x11, 0x4b, 0xcf, 0xb3, 0xc5, 0x9f, 0x2b, 0xbf, 0x96, 0x24, 0xbd, 0x01, 0xb9,
0xcc, 0xa1, 0x40, 0xaf, 0xc3, 0xfa, 0x1b, 0x09, 0x41, 0x92, 0x36, 0x2b, 0xb4, 0x2c, 0x15, 0xa0,
0xc8, 0x37, 0xf0, 0x8c, 0x19, 0xca, 0xda, 0x2d, 0x86, 0xc2, 0xfe, 0xc2, 0x5c, 0x86, 0xbc, 0x07,
0x64, 0x5a, 0x17, 0x07, 0x5a, 0x6b, 0xd7, 0x05, 0xab, 0x92, 0x57, 0xeb, 0xf1, 0x15, 0xf5, 0xd3,
0xa4, 0x4f, 0xa8, 0xb2, 0x45, 0x8d, 0xe6, 0xb4, 0xb4, 0x75, 0x0b, 0x3a, 0xd0, 0x78, 0x9d, 0x44,
0xe9, 0x1a, 0x3e, 0x18, 0x8e, 0x09, 0xc8, 0x66, 0xbb, 0x4d, 0x47, 0x72, 0xcc, 0x58, 0x1f, 0x3e,
0x44, 0xff, 0xf7, 0xca, 0xb8, 0x3d, 0x2f, 0x30, 0xfa, 0x37, 0x54, 0xda, 0xec, 0x04, 0x81, 0xea,
0x7a, 0x1d, 0xf8, 0x38, 0x41, 0x1f, 0xe7, 0x1e, 0xb5, 0x84, 0xa2, 0x82, 0xfc, 0x2c, 0x05, 0xca,
0x30, 0x90, 0xc6, 0x87, 0x47, 0xd0, 0x35, 0x35, 0xde, 0x52, 0xc0, 0x09, 0xdb, 0x72, 0x75, 0xf8,
0xc1, 0x70, 0x9e, 0x39, 0x93, 0x24, 0xca, 0x73, 0xce, 0xf2, 0x45, 0xc2, 0xc2, 0x03, 0x9f, 0x15,
0xea, 0x5a, 0xe1, 0x88, 0x14, 0xb2, 0x86, 0xc2, 0x4d, 0xaa, 0x49, 0x52, 0xc4, 0x70, 0x21, 0x62,
0x81, 0xe0, 0xba, 0x62, 0xbd, 0x1a, 0xa6, 0xe1, 0xb0, 0x08, 0xf7, 0x96, 0xb5, 0xfe, 0xc6, 0x5b,
0x0d, 0xbb, 0x45, 0x38, 0xec, 0xa6, 0xe1, 0x55, 0x59, 0xa6, 0xcb, 0x78, 0x90, 0xbe, 0xde, 0x12,
0x0f, 0x50, 0xe2, 0xdb, 0x3b, 0x1d, 0xb7, 0x8e, 0x00, 0x11, 0x5e, 0x7f, 0xfd, 0xde, 0xc1, 0xf7,
0x8e, 0xb1, 0xab, 0xab, 0xed, 0x4e, 0x50, 0xeb, 0x78, 0xd0, 0x70, 0x84, 0x1e, 0xaa, 0xda, 0x11,
0x1a, 0x8e, 0xd8, 0x34, 0xce, 0x85, 0xbe, 0xf4, 0xd1, 0x3e, 0x59, 0x77, 0x5a, 0x4c, 0xce, 0xfd,
0xac, 0xb6, 0xbc, 0x1a, 0x54, 0x28, 0x92, 0x55, 0x00, 0x32, 0xd6, 0x28, 0xbd, 0x91, 0x62, 0x7d,
0xa4, 0x99, 0x85, 0xf2, 0xb1, 0xbe, 0x63, 0x7e, 0xce, 0x0f, 0xca, 0x94, 0x65, 0x26, 0x2b, 0x04,
0x3b, 0xe8, 0xb8, 0xea, 0x98, 0x95, 0x50, 0x8f, 0x54, 0xec, 0x23, 0x7a, 0xcb, 0x74, 0x1c, 0x58,
0x19, 0x15, 0x94, 0xf7, 0x73, 0x7e, 0x55, 0x71, 0xed, 0x2d, 0xd5, 0x8a, 0x5d, 0xf9, 0x55, 0xec,
0x73, 0xd3, 0x8a, 0xf5, 0x63, 0x97, 0x6c, 0xed, 0x50, 0x93, 0x00, 0xb2, 0x56, 0x9f, 0xc0, 0x9c,
0x85, 0x54, 0x9c, 0x1d, 0x1e, 0xb1, 0xc6, 0x81, 0x10, 0x01, 0xb5, 0xa4, 0x42, 0xaf, 0xd6, 0x27,
0xe7, 0x3a, 0xe8, 0x1e, 0x52, 0xce, 0x22, 0x75, 0xdf, 0xd0, 0xdc, 0xdd, 0x25, 0xec, 0x60, 0xf0,
0x08, 0xd6, 0xb8, 0xed, 0xf5, 0xe8, 0x18, 0x1b, 0x0a, 0x39, 0x16, 0x3a, 0xaa, 0x61, 0xa1, 0xff,
0xfc, 0xc7, 0x5e, 0x7a, 0x37, 0x60, 0x57, 0xab, 0xda, 0xff, 0xce, 0x86, 0xeb, 0x1d, 0xa8, 0xdf,
0x18, 0x84, 0xf3, 0xec, 0xb8, 0x09, 0x13, 0xa9, 0xd2, 0xc2, 0x38, 0x64, 0x50, 0xce, 0xe6, 0x32,
0x8e, 0x31, 0xd0, 0x38, 0xe5, 0xe4, 0xb0, 0xb7, 0x14, 0xab, 0xfe, 0xde, 0xd2, 0xac, 0x20, 0xe9,
0x98, 0xf2, 0x1c, 0x96, 0xc2, 0xb6, 0x95, 0x0e, 0xd3, 0x08, 0x0e, 0x61, 0xe1, 0x55, 0x5f, 0xb6,
0x83, 0xee, 0x7b, 0xa5, 0xed, 0x2d, 0xb3, 0x15, 0x84, 0x79, 0xfe, 0x56, 0x49, 0x7b, 0x4b, 0x6b,
0x36, 0x4e, 0x8a, 0x37, 0xfe, 0x01, 0xc3, 0xb7, 0x45, 0xef, 0x2d, 0xf3, 0x15, 0x7a, 0x2f, 0x2b,
0xa8, 0x0a, 0x07, 0xd7, 0xcc, 0x65, 0xee, 0x1f, 0xec, 0x11, 0x24, 0x97, 0x3e, 0xa4, 0xb0, 0x8e,
0xc5, 0xdd, 0xe9, 0xd4, 0x46, 0x75, 0x07, 0x49, 0x7a, 0xe0, 0x61, 0x54, 0x1a, 0x67, 0xe1, 0xd5,
0x6a, 0x23, 0x5f, 0xdf, 0x64, 0x3a, 0x45, 0x47, 0xa5, 0xca, 0xe6, 0xe0, 0xa9, 0x66, 0x5e, 0x24,
0x34, 0xac, 0x78, 0xc8, 0xe8, 0xf6, 0x98, 0x93, 0xbf, 0xbe, 0xff, 0x04, 0x4d, 0xeb, 0xd4, 0xf0,
0x2e, 0x8e, 0x2e, 0xa9, 0x6b, 0x90, 0x28, 0x3e, 0xa3, 0x4f, 0x67, 0xbf, 0xfd, 0x4a, 0x27, 0x93,
0x81, 0x89, 0x66, 0x44, 0x05, 0x64, 0x2b, 0x1d, 0x5e, 0x2e, 0xc2, 0x00, 0x0f, 0x0f, 0xeb, 0xfe,
0xa2, 0x5a, 0xf2, 0x4a, 0x15, 0x04, 0x5e, 0xad, 0x05, 0x07, 0xd2, 0xd6, 0xd1, 0xc1, 0x66, 0x5a,
0xc9, 0x20, 0xaa, 0xc7, 0x81, 0xa6, 0x10, 0x76, 0x3a, 0xba, 0xec, 0x6d, 0x72, 0xde, 0xfe, 0x8c,
0x34, 0x1b, 0x94, 0xa3, 0xc5, 0x2e, 0xcf, 0xad, 0x2c, 0x28, 0x67, 0x45, 0xb7, 0x17, 0x6c, 0x98,
0xb6, 0x17, 0x6c, 0x0c, 0xb6, 0x16, 0x1e, 0xcd, 0x20, 0xe5, 0xb2, 0x9f, 0x97, 0x4a, 0x7a, 0xab,
0xaa, 0x01, 0x7b, 0x3c, 0xa9, 0x50, 0x33, 0x7b, 0x08, 0x12, 0xdb, 0x19, 0xcb, 0x00, 0x25, 0x0f,
0x46, 0xab, 0x6c, 0x57, 0x57, 0x9a, 0x6a, 0x6c, 0xf1, 0x81, 0xf5, 0xaa, 0x91, 0x53, 0x24, 0xc9,
0x86, 0x93, 0x4e, 0x53, 0x7a, 0x2a, 0x81, 0xc3, 0x02, 0x2a, 0x51, 0xc0, 0x68, 0xc2, 0x2b, 0x39,
0x06, 0x64, 0x34, 0xf9, 0xb5, 0xdf, 0xb4, 0xe5, 0x03, 0x0e, 0x54, 0xe6, 0x44, 0xf1, 0x83, 0x9d,
0xe1, 0x04, 0x6e, 0x7c, 0xb1, 0x31, 0x37, 0xc9, 0xf5, 0x88, 0x53, 0xd6, 0x10, 0x02, 0x7e, 0x7c,
0xf8, 0x84, 0x96, 0x38, 0x6f, 0x97, 0x93, 0x65, 0xfb, 0x03, 0x4a, 0x4a, 0xdd, 0x35, 0x88, 0x80,
0x4e, 0x8b, 0xf3, 0xd3, 0x02, 0x7c, 0x4d, 0x2d, 0x32, 0x05, 0x8d, 0x88, 0x47, 0x14, 0x88, 0x1c,
0xc9, 0xba, 0x71, 0xa4, 0x91, 0x9a, 0xea, 0xa6, 0x4c, 0x00, 0xaa, 0xac, 0xdf, 0xf5, 0xf6, 0xf0,
0xf2, 0x06, 0xba, 0x52, 0x81, 0x82, 0xa8, 0xaa, 0x53, 0xcd, 0xe4, 0x6c, 0xf6, 0xf7, 0x35, 0xa6,
0xa9, 0x63, 0xfa, 0x13, 0x58, 0x9b, 0xce, 0x75, 0x12, 0xa3, 0xd2, 0x9b, 0xbe, 0x86, 0x82, 0xc4,
0x02, 0x4f, 0x2a, 0xa2, 0x82, 0xba, 0x28, 0x85, 0x98, 0x50, 0x5e, 0xc5, 0x5f, 0x40, 0xa7, 0x0c,
0x75, 0xe4, 0x98, 0x28, 0xa7, 0x68, 0xf5, 0x61, 0x0a, 0x54, 0xfc, 0x7d, 0x35, 0xce, 0xd3, 0x01,
0xeb, 0x60, 0x8e, 0x24, 0x2e, 0xf9, 0x0d, 0xae, 0xb1, 0x80, 0xc5, 0xc4, 0x58, 0xcc, 0x00, 0x9f,
0xbe, 0xec, 0xd4, 0xac, 0x18, 0x02, 0x5a, 0xb3, 0x32, 0x4d, 0x03, 0xcb, 0xa9, 0x20, 0x30, 0xa7,
0x89, 0xe3, 0xd8, 0x0e, 0xee, 0x98, 0xdb, 0x59, 0xc7, 0x4e, 0x0c, 0x04, 0xd2, 0x1d, 0xd6, 0x9d,
0x4c, 0x67, 0xc1, 0x97, 0x1c, 0x9e, 0xf2, 0x97, 0x0b, 0x61, 0xe6, 0x3a, 0xee, 0x33, 0x98, 0x81,
0xad, 0x50, 0x73, 0xe7, 0x98, 0xc7, 0x31, 0x7f, 0xc1, 0x9e, 0xfa, 0xba, 0x9e, 0x28, 0x80, 0x50,
0x59, 0x46, 0xbd, 0x89, 0x6d, 0xb2, 0x62, 0x99, 0xe3, 0xd4, 0xf7, 0x04, 0xc1, 0x89, 0x54, 0x02,
0x59, 0x2a, 0xac, 0x30, 0x17, 0x9a, 0x34, 0xfc, 0x14, 0x34, 0xe5, 0xfd, 0x86, 0xc0, 0xcc, 0xe9,
0xaf, 0x9b, 0xa9, 0x12, 0x99, 0xe0, 0x01, 0x9f, 0x8a, 0xb4, 0x25, 0x69, 0xb7, 0x55, 0xf0, 0xd0,
0x96, 0x32, 0x5a, 0x91, 0x35, 0xa0, 0x36, 0xcf, 0xc2, 0xe1, 0xfc, 0x45, 0x48, 0x80, 0x35, 0xec,
0xe2, 0xe1, 0xca, 0x6f, 0x15, 0xbb, 0xa6, 0xe0, 0x02, 0x60, 0x06, 0x8c, 0x72, 0xdd, 0xf2, 0xc1,
0x2f, 0xd5, 0xd6, 0xcd, 0x34, 0xb4, 0x39, 0x2a, 0x2a, 0x8d, 0x39, 0x51, 0x17, 0x2a, 0x0e, 0x08,
0xb6, 0xce, 0x32, 0x91, 0xe7, 0xce, 0x50, 0x86, 0xe7, 0xd1, 0x8d, 0x18, 0x76, 0x65, 0xe8, 0x18,
0xed, 0x54, 0xb7, 0x47, 0xf2, 0xbf, 0x18, 0x1c, 0xcb, 0xb2, 0x92, 0x63, 0x90, 0xf2, 0xb7, 0x8d,
0x5d, 0xe5, 0x6d, 0x4f, 0x75, 0x77, 0xf1, 0x0d, 0x57, 0xd4, 0x37, 0x1f, 0xdd, 0x1c, 0x46, 0x3c,
0x4e, 0xf9, 0x4b, 0xe6, 0xa3, 0x89, 0x81, 0x27, 0x30, 0x70, 0x52, 0x5f, 0x0f, 0x53, 0xfe, 0x09,
0x1f, 0xf8, 0xed, 0x71, 0x59, 0x6c, 0x8c, 0xb3, 0xf9, 0xcd, 0x39, 0x35, 0x5d, 0x02, 0xa3, 0xab,
0xa0, 0x69, 0xfb, 0x4d, 0xa9, 0x78, 0x3d, 0xfe, 0x5b, 0x3c, 0xff, 0x1d, 0x67, 0x8a, 0xa5, 0xb9,
0x77, 0x3d, 0xba, 0x23, 0xc0, 0x2a, 0x50, 0x7d, 0x21, 0x41, 0xb3, 0xda, 0x19, 0x76, 0xab, 0xfb,
0xac, 0xa1, 0xdd, 0x39, 0xfc, 0x87, 0x5c, 0xd0, 0x35, 0x98, 0x53, 0x64, 0x89, 0xcb, 0xaa, 0xae,
0x1b, 0x58, 0xe6, 0x0d, 0x40, 0x68, 0x09, 0xe0, 0x10, 0x11, 0xc5, 0x80, 0x7e, 0x1d, 0xdf, 0xa3,
0x6c, 0x90, 0x05, 0x38, 0x43, 0x54, 0xa2, 0x1a, 0xc0, 0xcd, 0x8b, 0x1d, 0x47, 0xe2, 0x9d, 0x9e,
0x3e, 0xe7, 0x75, 0xe1, 0x39, 0x9f, 0xa2, 0xcc, 0xdb, 0x38, 0xe4, 0x2c, 0xd5, 0xb9, 0x61, 0xe0,
0x2b, 0x35, 0x40, 0xb9, 0x27, 0xf5, 0x49, 0x6f, 0x12, 0x10, 0xcb, 0x9b, 0xba, 0xc4, 0x1b, 0x8d,
0x51, 0xfa, 0x96, 0x85, 0x3b, 0xed, 0xc5, 0xb9, 0x48, 0xd2, 0xd7, 0x54, 0x76, 0x0a, 0x63, 0x70,
0xf4, 0xb2, 0xea, 0x95, 0x2f, 0x24, 0x73, 0x82, 0x06, 0xf2, 0x9a, 0xb3, 0x77, 0xa4, 0xcc, 0xf1,
0xb0, 0x5b, 0x7e, 0x80, 0xc2, 0x90, 0xd0, 0xf0, 0xec, 0x3c, 0xc1, 0xf4, 0x9a, 0x98, 0x5e, 0x47,
0x93, 0xeb, 0x35, 0xdf, 0xc6, 0x2e, 0xa5, 0xbe, 0xac, 0x0a, 0x97, 0x86, 0x24, 0x83, 0x82, 0x79,
0x1a, 0x29, 0x7b, 0xea, 0x24, 0xcf, 0x8b, 0x49, 0xd3, 0x70, 0xd8, 0x61, 0xa5, 0x3f, 0xcb, 0x84,
0x50, 0x83, 0xca, 0x9f, 0x7d, 0xa5, 0xe1, 0xcc, 0x70, 0xff, 0xd9, 0x51, 0xaf, 0xd7, 0xfb, 0x61,
0xe0, 0x9c, 0x6c, 0xde, 0x65, 0x40, 0x74, 0xbc, 0x4b, 0x1e, 0x81, 0xc0, 0xd0, 0x69, 0xcb, 0xa5,
0xd8, 0xd8, 0x94, 0x8b, 0xe9, 0xe8, 0x91, 0xd4, 0x9d, 0xfd, 0x67, 0x3f, 0xbd, 0x7c, 0xf9, 0x92,
0xa4, 0x16, 0x49, 0x6c, 0xc3, 0x9d, 0x9c, 0xb3, 0x99, 0x05, 0x41, 0x25, 0xdd, 0xa6, 0x58, 0x69,
0x98, 0xf9, 0xf3, 0xf6, 0x5d, 0x67, 0x91, 0xc2, 0xc1, 0xcf, 0xc3, 0x9d, 0x5f, 0x12, 0x3d, 0x8e,
0x12, 0x67, 0x34, 0xcc, 0x8b, 0x34, 0x7c, 0x0e, 0x2e, 0xfc, 0x9c, 0x38, 0xbf, 0x9c, 0x8d, 0x4e,
0x73, 0xc7, 0x7d, 0xf7, 0x87, 0x47, 0x47, 0x1f, 0xca, 0x4d, 0x9d, 0xaa, 0x61, 0x2b, 0xdc, 0x71,
0x11, 0x17, 0xf7, 0x74, 0xd3, 0xab, 0x66, 0x74, 0xcf, 0x4a, 0x37, 0x3b, 0x6f, 0xcf, 0xcf, 0x5e,
0x3c, 0xf7, 0xcb, 0x35, 0xe1, 0x64, 0xe2, 0x3f, 0x85, 0x44, 0x06, 0xe2, 0x01, 0xbd, 0xa8, 0xd9,
0xf5, 0x28, 0x03, 0x49, 0x24, 0x46, 0xdb, 0x7e, 0xd5, 0xd3, 0x54, 0x9e, 0xaa, 0x4a, 0xfa, 0xba,
0x4f, 0xb4, 0x4d, 0xe4, 0x0f, 0x2f, 0x9b, 0xe0, 0xc2, 0x30, 0x4c, 0x6e, 0xb4, 0x82, 0xf9, 0x41,
0xab, 0x7f, 0xa1, 0x89, 0xd5, 0x3b, 0x70, 0x76, 0x9a, 0xc6, 0xd2, 0x69, 0xa3, 0xb9, 0x65, 0x0c,
0x1d, 0x0c, 0xcb, 0xfd, 0x8d, 0x26, 0xea, 0xe9, 0xfd, 0xaa, 0x9b, 0x62, 0x9a, 0xb9, 0xbf, 0xb9,
0xe1, 0x53, 0xfb, 0x81, 0x8f, 0xec, 0xbe, 0x56, 0x88, 0x46, 0x95, 0xca, 0xce, 0xe7, 0x67, 0xa3,
0xbf, 0xdf, 0xb8, 0x74, 0x47, 0xf0, 0x17, 0xad, 0x6b, 0xaf, 0x15, 0xbe, 0xcb, 0xbc, 0x96, 0x33,
0x74, 0xe8, 0x06, 0xe2, 0x2f, 0x1a, 0xd8, 0x5e, 0x5a, 0x7c, 0x8f, 0x85, 0x2d, 0xa3, 0x75, 0xe9,
0xfb, 0xfe, 0xce, 0x9f, 0xdc, 0xb3, 0xf1, 0xe9, 0xfb, 0xef, 0x8c, 0x22, 0xe2, 0x2c, 0x91, 0x8b,
0x52, 0x15, 0x55, 0x22, 0xac, 0x2f, 0x2b, 0x6b, 0xe8, 0x0f, 0x82, 0xa0, 0x4e, 0xb5, 0xec, 0xef,
0xc1, 0x21, 0x60, 0x06, 0x21, 0x2e, 0x32, 0x9a, 0x50, 0x99, 0x20, 0x9a, 0xfe, 0xff, 0xf2, 0x3f,
0x66, 0x3b, 0x04, 0x72, 0x95, 0x19, 0x00, 0x00
};
// Autogenerated from wled00/data/settings_2D.htm, do not edit!!
const uint16_t PAGE_settings_2D_length = 1745;
const uint8_t PAGE_settings_2D[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x58, 0x5b, 0x6f, 0xdb, 0x36,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x95, 0x58, 0x5b, 0x6f, 0xdb, 0x36,
0x14, 0x7e, 0xd7, 0xaf, 0x60, 0x88, 0xa2, 0x93, 0x5a, 0x59, 0x8e, 0xbb, 0x0b, 0x8a, 0x58, 0x52,
0xd6, 0x34, 0xd9, 0x92, 0x21, 0x41, 0x83, 0xba, 0x4b, 0x31, 0xac, 0x43, 0x4b, 0x4b, 0xc7, 0x16,
0x1b, 0x89, 0x14, 0x48, 0xca, 0x49, 0xe6, 0xe6, 0xbf, 0xef, 0x90, 0x92, 0xaf, 0x71, 0xda, 0xee,
@ -1888,7 +1928,7 @@ const uint8_t PAGE_settings_2D[] PROGMEM = {
// Autogenerated from wled00/data/settings_pin.htm, do not edit!!
const uint16_t PAGE_settings_pin_length = 471;
const uint8_t PAGE_settings_pin[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x5d, 0x52, 0x4d, 0x6f, 0x13, 0x31,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x5d, 0x52, 0x4d, 0x6f, 0x13, 0x31,
0x10, 0xbd, 0xef, 0xaf, 0x30, 0x73, 0x69, 0x82, 0x92, 0x6c, 0xa8, 0xa8, 0x04, 0xaa, 0xbd, 0x42,
0x81, 0x1e, 0xb8, 0x94, 0x48, 0xe5, 0x52, 0x55, 0x55, 0xe5, 0xd8, 0xb3, 0x89, 0x55, 0x7f, 0x2c,
0xb6, 0x37, 0x21, 0x54, 0xfc, 0x77, 0xc6, 0xbb, 0xa1, 0xa0, 0x5c, 0xd6, 0x7e, 0x33, 0xe3, 0x37,

File diff suppressed because it is too large Load Diff

View File

@ -110,7 +110,7 @@ void changePalette(uint8_t pal)
for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) {
Segment& seg = strip.getSegment(i);
if (!seg.isActive() || !seg.isSelected()) continue;
seg.palette = pal;
seg.setPalette(pal);
}
setValuesFromFirstSelectedSeg();
} else {

View File

@ -2,6 +2,14 @@
#include "palettes.h"
#define JSON_PATH_STATE 1
#define JSON_PATH_INFO 2
#define JSON_PATH_STATE_INFO 3
#define JSON_PATH_NODES 4
#define JSON_PATH_PALETTES 5
#define JSON_PATH_FXDATA 6
#define JSON_PATH_NETWORKS 7
/*
* JSON API (De)serialization
*/
@ -79,8 +87,8 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
uint16_t grp = elem["grp"] | seg.grouping;
uint16_t spc = elem[F("spc")] | seg.spacing;
uint16_t of = seg.offset;
uint8_t soundSim = elem["ssim"] | seg.soundSim;
uint8_t map1D2D = elem["mp12"] | seg.map1D2D;
uint8_t soundSim = elem["si"] | seg.soundSim;
uint8_t map1D2D = elem["m12"] | seg.map1D2D;
if ((spc>0 && spc!=seg.spacing) || seg.map1D2D!=map1D2D) seg.fill(BLACK); // clear spacing gaps
@ -182,7 +190,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
getVal(elem["ix"], &seg.intensity);
uint8_t pal = seg.palette;
if (getVal(elem["pal"], &pal, 1, strip.getPaletteCount())) seg.setPalette(pal);
if (getVal(elem["pal"], &pal)) seg.setPalette(pal);
getVal(elem["c1"], &seg.custom1);
getVal(elem["c2"], &seg.custom2);
@ -482,8 +490,8 @@ void serializeSegment(JsonObject& root, Segment& seg, byte id, bool forPreset, b
root["o1"] = seg.check1;
root["o2"] = seg.check2;
root["o3"] = seg.check3;
root["ssim"] = seg.soundSim;
root["mp12"] = seg.map1D2D;
root["si"] = seg.soundSim;
root["m12"] = seg.map1D2D;
}
void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segmentBounds, bool selectedSegmentsOnly)
@ -558,7 +566,6 @@ void serializeInfo(JsonObject root)
leds[F("maxseg")] = strip.getMaxSegments();
//leds[F("actseg")] = strip.getActiveSegmentsNum();
//leds[F("seglock")] = false; //might be used in the future to prevent modifications to segment config
leds[F("cpal")] = strip.customPalettes.size(); //number of custom palettes
#ifndef WLED_DISABLE_2D
if (strip.isMatrix) {
@ -628,6 +635,7 @@ void serializeInfo(JsonObject root)
root[F("fxcount")] = strip.getModeCount();
root[F("palcount")] = strip.getPaletteCount();
root[F("cpalcount")] = strip.customPalettes.size(); //number of custom palettes
JsonArray ledmaps = root.createNestedArray(F("maps"));
for (size_t i=0; i<10; i++) {
@ -872,6 +880,35 @@ void serializePalettes(JsonObject root, AsyncWebServerRequest* request)
}
}
void serializeNetworks(JsonObject root)
{
JsonArray networks = root.createNestedArray(F("networks"));
int16_t status = WiFi.scanComplete();
switch (status) {
case WIFI_SCAN_FAILED:
WiFi.scanNetworks(true);
return;
case WIFI_SCAN_RUNNING:
return;
}
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);
}
WiFi.scanDelete();
if (WiFi.scanComplete() == WIFI_SCAN_FAILED) {
WiFi.scanNetworks(true);
}
}
void serializeNodes(JsonObject root)
{
JsonArray nodes = root.createNestedArray("nodes");
@ -922,12 +959,13 @@ void serveJson(AsyncWebServerRequest* request)
{
byte subJson = 0;
const String& url = request->url();
if (url.indexOf("state") > 0) subJson = 1;
else if (url.indexOf("info") > 0) subJson = 2;
else if (url.indexOf("si") > 0) subJson = 3;
else if (url.indexOf("nodes") > 0) subJson = 4;
else if (url.indexOf("palx") > 0) subJson = 5;
else if (url.indexOf("fxda") > 0) subJson = 6;
if (url.indexOf("state") > 0) subJson = JSON_PATH_STATE;
else if (url.indexOf("info") > 0) subJson = JSON_PATH_INFO;
else if (url.indexOf("si") > 0) subJson = JSON_PATH_STATE_INFO;
else if (url.indexOf("nodes") > 0) subJson = JSON_PATH_NODES;
else if (url.indexOf("palx") > 0) subJson = JSON_PATH_PALETTES;
else if (url.indexOf("fxda") > 0) subJson = JSON_PATH_FXDATA;
else if (url.indexOf("net") > 0) subJson = JSON_PATH_NETWORKS;
#ifdef WLED_ENABLE_JSONLIVE
else if (url.indexOf("live") > 0) {
serveLiveLeds(request);
@ -970,22 +1008,24 @@ void serveJson(AsyncWebServerRequest* request)
switch (subJson)
{
case 1: //state
case JSON_PATH_STATE:
serializeState(lDoc); break;
case 2: //info
case JSON_PATH_INFO:
serializeInfo(lDoc); break;
case 4: //node list
case JSON_PATH_NODES:
serializeNodes(lDoc); break;
case 5: //palettes
case JSON_PATH_PALETTES:
serializePalettes(lDoc, request); break;
case 6: // FX helper data
case JSON_PATH_FXDATA:
serializeModeData(lDoc.as<JsonArray>()); break;
case JSON_PATH_NETWORKS:
serializeNetworks(lDoc); break;
default: //all
JsonObject state = lDoc.createNestedObject("state");
serializeState(state);
JsonObject info = lDoc.createNestedObject("info");
serializeInfo(info);
if (subJson != 3)
if (subJson != JSON_PATH_STATE_INFO)
{
JsonArray effects = lDoc.createNestedArray(F("effects"));
serializeModeNames(effects); // remove WLED-SR extensions from effect names

View File

@ -12,7 +12,7 @@ static volatile byte presetToApply = 0;
static volatile byte callModeToApply = 0;
static volatile byte presetToSave = 0;
static volatile int8_t saveLedmap = -1;
static char quickLoad[3];
static char quickLoad[9];
static char saveName[33];
static bool includeBri = true, segBounds = true, selectedOnly = false, playlistSave = false;;
@ -199,7 +199,7 @@ void savePreset(byte index, const char* pname, JsonObject sObj)
presetToSave = index;
playlistSave = false;
if (sObj[F("ql")].is<const char*>()) strlcpy(quickLoad, sObj[F("ql")].as<const char*>(), 3); // only 2 chars for QL
if (sObj[F("ql")].is<const char*>()) strlcpy(quickLoad, sObj[F("ql")].as<const char*>(), 9); // client limits QL to 2 chars, buffer for 8 bytes to allow unicode
sObj.remove("v");
sObj.remove("time");
sObj.remove(F("error"));

View File

@ -411,10 +411,10 @@ void handleNotifications()
for (size_t i = 0; i < strip.getSegmentsNum(); i++) {
Segment& seg = strip.getSegment(i);
if (!seg.isActive() || !seg.isSelected()) continue;
if (udpIn[8] < strip.getModeCount()) strip.setMode(i, udpIn[8]);
seg.setMode(udpIn[8]);
seg.speed = udpIn[9];
if (version > 2) seg.intensity = udpIn[16];
if (version > 4 && udpIn[19] < strip.getPaletteCount()) seg.palette = udpIn[19];
if (version > 4) seg.setPalette(udpIn[19]);
}
stateChanged = true;
}

View File

@ -8,7 +8,7 @@
*/
// version code in format yymmddb (b = daily build)
#define VERSION 2211200
#define VERSION 2211250
//uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG