Merge branch 'master' into master-merge

Few UI fixes.
This commit is contained in:
Blaz Kristan 2022-02-03 17:40:44 +01:00
commit 52f0ae9350
22 changed files with 2016 additions and 1884 deletions

View File

@ -15,7 +15,7 @@
default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32s2_saola, esp32c3 default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32s2_saola, esp32c3
# Build everything # Build everything
; default_envs = esp32dev, esp8285_4CH_MagicHome, esp8285_4CH_H801, codm-controller-0.6-rev2, codm-controller-0.6, esp32s2_saola, d1_mini_5CH_Shojo_PCB, d1_mini, sp501e, travis_esp8266, travis_esp32, nodemcuv2, esp32_eth, anavi_miracle_controller, esp07, esp01_1m_full, m5atom, h803wf, d1_mini_ota, heltec_wifi_kit_8, esp8285_5CH_H801, d1_mini_debug, wemos_shield_esp32, elekstube_ips ; default_envs = esp32dev, esp8285_4CH_MagicHome, codm-controller-0.6-rev2, codm-controller-0.6, esp32s2_saola, d1_mini_5CH_Shojo_PCB, d1_mini, sp501e, travis_esp8266, travis_esp32, nodemcuv2, esp32_eth, anavi_miracle_controller, esp07, esp01_1m_full, m5atom, h803wf, d1_mini_ota, heltec_wifi_kit_8, esp8285_H801, d1_mini_debug, wemos_shield_esp32, elekstube_ips
# Single binaries (uncomment your board) # Single binaries (uncomment your board)
; default_envs = elekstube_ips ; default_envs = elekstube_ips
@ -30,12 +30,12 @@ default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32s
; default_envs = d1_mini_ota ; default_envs = d1_mini_ota
; default_envs = esp32dev ; default_envs = esp32dev
; default_envs = esp8285_4CH_MagicHome ; default_envs = esp8285_4CH_MagicHome
; default_envs = esp8285_4CH_H801 ; default_envs = esp8285_H801
; default_envs = esp8285_5CH_H801
; default_envs = d1_mini_5CH_Shojo_PCB ; default_envs = d1_mini_5CH_Shojo_PCB
; default_envs = wemos_shield_esp32 ; default_envs = wemos_shield_esp32
; default_envs = m5atom ; default_envs = m5atom
; default_envs = esp32_eth ; default_envs = esp32_eth
; default_envs = esp32s2_saola
src_dir = ./wled00 src_dir = ./wled00
data_dir = ./wled00/data data_dir = ./wled00/data
@ -78,10 +78,8 @@ debug_flags = -D DEBUG=1 -D WLED_DEBUG -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# FLAGS: ldscript (available ldscripts at https://github.com/esp8266/Arduino/tree/master/tools/sdk/ld) # FLAGS: ldscript (available ldscripts at https://github.com/esp8266/Arduino/tree/master/tools/sdk/ld)
# ldscript_1m0m (1024 KB) = 999 KB sketch, 4 KB eeprom, no spiffs, 16 KB reserved
# ldscript_2m1m (2048 KB) = 1019 KB sketch, 4 KB eeprom, 1004 KB spiffs, 16 KB reserved # ldscript_2m1m (2048 KB) = 1019 KB sketch, 4 KB eeprom, 1004 KB spiffs, 16 KB reserved
# ldscript_4m1m (4096 KB) = 1019 KB sketch, 4 KB eeprom, 1002 KB spiffs, 16 KB reserved, 2048 KB empty/ota? # ldscript_4m1m (4096 KB) = 1019 KB sketch, 4 KB eeprom, 1002 KB spiffs, 16 KB reserved, 2048 KB empty/ota?
# ldscript_4m3m (4096 KB) = 1019 KB sketch, 4 KB eeprom, 3040 KB spiffs, 16 KB reserved
# #
# Available lwIP variants (macros): # Available lwIP variants (macros):
# -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH = v1.4 Higher Bandwidth (default) # -DPIO_FRAMEWORK_ARDUINO_LWIP_HIGHER_BANDWIDTH = v1.4 Higher Bandwidth (default)
@ -200,16 +198,21 @@ build_flags =
lib_deps = lib_deps =
${env.lib_deps} ${env.lib_deps}
https://github.com/lorol/LITTLEFS.git #https://github.com/lorol/LITTLEFS.git
# ESPAsyncTCP @ 1.2.0 # ESPAsyncTCP @ 1.2.0
ESPAsyncUDP ESPAsyncUDP
makuna/NeoPixelBus @ 2.6.7 # 2.6.5/2.6.6 and newer do not compile on ESP core < 3.0.0 makuna/NeoPixelBus @ 2.6.7 # 2.6.5/2.6.6 and newer do not compile on ESP core < 3.0.0
[esp32] [esp32]
#platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.2/platform-tasmota-espressif32-2.0.2.zip
platform = espressif32@3.5.0
build_flags = -g build_flags = -g
-DARDUINO_ARCH_ESP32 -DARDUINO_ARCH_ESP32
-DCONFIG_LITTLEFS_FOR_IDF_3_2 #-DCONFIG_LITTLEFS_FOR_IDF_3_2
-D CONFIG_ASYNC_TCP_USE_WDT=0 -D CONFIG_ASYNC_TCP_USE_WDT=0
#use LITTLEFS library by lorol in ESP32 core 1.x.x instead of built-in in 2.x.x
-D LOROL_LITTLEFS
default_partitions = tools/WLED_ESP32_4MB_1MB_FS.csv default_partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
@ -314,15 +317,16 @@ lib_deps = ${esp8266.lib_deps}
[env:esp32dev] [env:esp32dev]
board = esp32dev board = esp32dev
platform = espressif32@2.0 platform = ${esp32.platform}
build_unflags = ${common.build_unflags} build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32 #-D WLED_DISABLE_BROWNOUT_DET build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32 #-D WLED_DISABLE_BROWNOUT_DET
lib_deps = ${esp32.lib_deps} lib_deps = ${esp32.lib_deps}
monitor_filters = esp32_exception_decoder
board_build.partitions = ${esp32.default_partitions} board_build.partitions = ${esp32.default_partitions}
[env:esp32_eth] [env:esp32_eth]
board = esp32-poe board = esp32-poe
platform = espressif32@2.0 platform = ${esp32.platform}
upload_speed = 921600 upload_speed = 921600
build_unflags = ${common.build_unflags} build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32_Ethernet -D RLYPIN=-1 -D WLED_USE_ETHERNET -D BTNPIN=-1 build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32_Ethernet -D RLYPIN=-1 -D WLED_USE_ETHERNET -D BTNPIN=-1
@ -331,7 +335,7 @@ board_build.partitions = ${esp32.default_partitions}
[env:esp32s2_saola] [env:esp32s2_saola]
board = esp32-s2-saola-1 board = esp32-s2-saola-1
platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.2.1/platform-tasmota-espressif32-2.0.2.1.zip platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.2.2/platform-tasmota-espressif32-2.0.2.zip
platform_packages = platform_packages =
framework = arduino framework = arduino
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
@ -342,7 +346,7 @@ lib_deps = ${esp32s2.lib_deps}
[env:esp32c3] [env:esp32c3]
board = esp32-c3-devkitm-1 board = esp32-c3-devkitm-1
platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.2.1/platform-tasmota-espressif32-2.0.2.1.zip platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.2.2/platform-tasmota-espressif32-2.0.2.zip
platform_packages = platform_packages =
framework = arduino framework = arduino
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
@ -359,16 +363,7 @@ build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_OTA build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_OTA
lib_deps = ${esp8266.lib_deps} lib_deps = ${esp8266.lib_deps}
[env:esp8285_4CH_H801] [env:esp8285_H801]
board = esp8285
platform = ${common.platform_wled_default}
platform_packages = ${common.platform_packages}
board_build.ldscript = ${common.ldscript_1m128k}
build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags_esp8266} -D WLED_DISABLE_OTA
lib_deps = ${esp8266.lib_deps}
[env:esp8285_5CH_H801]
board = esp8285 board = esp8285
platform = ${common.platform_wled_default} platform = ${common.platform_wled_default}
platform_packages = ${common.platform_packages} platform_packages = ${common.platform_packages}
@ -473,6 +468,13 @@ board_build.ldscript = ${common.ldscript_2m512k}
build_flags = ${common.build_flags_esp8266} -D WLED_MAX_CCT_BLEND=0 -D BTNPIN=-1 -D IRPIN=-1 -D WLED_DISABLE_INFRARED build_flags = ${common.build_flags_esp8266} -D WLED_MAX_CCT_BLEND=0 -D BTNPIN=-1 -D IRPIN=-1 -D WLED_DISABLE_INFRARED
lib_deps = ${esp8266.lib_deps} lib_deps = ${esp8266.lib_deps}
[env:athom15w]
board = esp_wroom_02
platform = ${common.platform_wled_default}
board_build.ldscript = ${common.ldscript_2m512k}
build_flags = ${common.build_flags_esp8266} -D WLED_USE_IC_CCT -D BTNPIN=-1 -D IRPIN=-1 -D WLED_DISABLE_INFRARED
lib_deps = ${esp8266.lib_deps}
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# travis test board configurations # travis test board configurations
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------

View File

@ -32,6 +32,7 @@ class RTCUsermod : public Usermod {
} }
void loop() { void loop() {
if (strip.isUpdating()) return;
if (!disabled && toki.isTick()) { if (!disabled && toki.isTick()) {
time_t t = toki.second(); time_t t = toki.second();
if (t != RTC.get()) RTC.set(t); //set RTC to NTP/UI-provided value if (t != RTC.get()) RTC.set(t); //set RTC to NTP/UI-provided value

View File

@ -74,7 +74,7 @@ class UsermodVL53L0XGestures : public Usermod {
void loop() { void loop() {
if (!enabled) return; if (!enabled || strip.isUpdating()) return;
if (millis() - lastTime > VL53L0X_DELAY_MS) if (millis() - lastTime > VL53L0X_DELAY_MS)
{ {
lastTime = millis(); lastTime = millis();

View File

@ -164,7 +164,7 @@ class MPU6050Driver : public Usermod {
*/ */
void loop() { void loop() {
// if programming failed, don't try to do anything // if programming failed, don't try to do anything
if (!enabled || !dmpReady) return; if (!enabled || !dmpReady || strip.isUpdating()) return;
// wait for MPU interrupt or extra packet(s) available // wait for MPU interrupt or extra packet(s) available
if (!mpuInterrupt && fifoCount < packetSize) return; if (!mpuInterrupt && fifoCount < packetSize) return;

View File

@ -113,7 +113,7 @@ struct ColorOrderMap {
return &(_mappings[n]); return &(_mappings[n]);
} }
inline uint8_t getPixelColorOrder(uint16_t pix, uint8_t defaultColorOrder) const { inline uint8_t IRAM_ATTR getPixelColorOrder(uint16_t pix, uint8_t defaultColorOrder) const {
if (_count == 0) return defaultColorOrder; if (_count == 0) return defaultColorOrder;
for (uint8_t i = 0; i < _count; i++) { for (uint8_t i = 0; i < _count; i++) {
@ -639,7 +639,7 @@ class BusManager {
} }
} }
void setPixelColor(uint16_t pix, uint32_t c, int16_t cct=-1) { void IRAM_ATTR setPixelColor(uint16_t pix, uint32_t c, int16_t cct=-1) {
for (uint8_t i = 0; i < numBusses; i++) { for (uint8_t i = 0; i < numBusses; i++) {
Bus* b = busses[i]; Bus* b = busses[i];
uint16_t bstart = b->getStart(); uint16_t bstart = b->getStart();

View File

@ -214,6 +214,10 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
rlyMde = !relay["rev"]; rlyMde = !relay["rev"];
} }
CJSON(serialBaud, hw[F("baud")]);
if (serialBaud < 96 || serialBaud > 15000) serialBaud = 1152;
updateBaudRate(serialBaud *100);
//int hw_status_pin = hw[F("status")]["pin"]; // -1 //int hw_status_pin = hw[F("status")]["pin"]; // -1
JsonObject light = doc[F("light")]; JsonObject light = doc[F("light")];
@ -626,6 +630,8 @@ void serializeConfig() {
hw_relay["pin"] = rlyPin; hw_relay["pin"] = rlyPin;
hw_relay["rev"] = !rlyMde; hw_relay["rev"] = !rlyMde;
hw[F("baud")] = serialBaud;
//JsonObject hw_status = hw.createNestedObject("status"); //JsonObject hw_status = hw.createNestedObject("status");
//hw_status["pin"] = -1; //hw_status["pin"] = -1;

View File

@ -289,8 +289,14 @@ function showErrorToast()
function clearErrorToast() function clearErrorToast()
{ {
var x = gId("toast");
if (x.classList.contains("error")) {
clearTimeout(timeout); clearTimeout(timeout);
timeout = setTimeout(()=>{gId("toast").classList.remove("error");}, 10000); timeout = setTimeout(()=>{
x.classList.remove("show");
x.classList.remove("error");
}, 10000);
}
} }
function getRuntimeStr(rt) function getRuntimeStr(rt)
@ -422,7 +428,6 @@ function loadPresets(callback = null)
return res.json(); return res.json();
}) })
.then(json => { .then(json => {
clearErrorToast();
pJson = json; pJson = json;
populatePresets(); populatePresets();
}) })
@ -447,7 +452,6 @@ function loadPalettes(callback = null)
return res.json(); return res.json();
}) })
.then((json)=>{ .then((json)=>{
clearErrorToast();
lJson = Object.entries(json); lJson = Object.entries(json);
populatePalettes(); populatePalettes();
}) })
@ -473,7 +477,6 @@ function loadFX(callback = null)
return res.json(); return res.json();
}) })
.then((json)=>{ .then((json)=>{
clearErrorToast();
eJson = Object.entries(json); eJson = Object.entries(json);
populateEffects(); populateEffects();
}) })
@ -499,7 +502,6 @@ function loadFXData(callback = null)
return res.json(); return res.json();
}) })
.then((json)=>{ .then((json)=>{
clearErrorToast();
fxdata = json||[]; fxdata = json||[];
// add default value for Solid // add default value for Solid
fxdata.shift() fxdata.shift()
@ -1081,7 +1083,9 @@ function cmpP(a, b)
function makeWS() { function makeWS() {
if (ws) return; if (ws) return;
ws = new WebSocket('ws://'+(loc?locip:window.location.hostname)+'/ws'); ws = new WebSocket('ws://'+(loc?locip:window.location.hostname)+'/ws');
ws.binaryType = "arraybuffer";
ws.onmessage = (e)=>{ ws.onmessage = (e)=>{
if (e.data instanceof ArrayBuffer) return; //liveview packet
var json = JSON.parse(e.data); var json = JSON.parse(e.data);
if (json.leds) return; //liveview packet if (json.leds) return; //liveview packet
clearTimeout(jsonTimeout); clearTimeout(jsonTimeout);
@ -1110,7 +1114,6 @@ function makeWS() {
ws.onopen = (e)=>{ ws.onopen = (e)=>{
ws.send("{'v':true}"); ws.send("{'v':true}");
reqsLegal = true; reqsLegal = true;
clearErrorToast();
} }
} }

View File

@ -24,40 +24,40 @@
function updatePreview(leds) { function updatePreview(leds) {
var str = "linear-gradient(90deg,"; var str = "linear-gradient(90deg,";
var len = leds.length; var len = leds.length;
for (i = 0; i < len; i++) { for (i = 2; i < len; i+=3) {
var leddata = leds[i]; str += `rgb(${leds[i]},${leds[i+1]},${leds[i+2]})`;
if (leddata.length > 6) leddata = leddata.substring(2); if (i < len -3) str += ","
str += "#" + leddata;
if (i < len -1) str += ","
} }
str += ")"; str += ")";
document.getElementById("canv").style.background = str; document.getElementById("canv").style.background = str;
} }
function getLiveJson(event) { function getLiveJson(e) {
try { try {
var json = JSON.parse(event.data); if (toString.call(e.data) === '[object ArrayBuffer]') {
if (json && json.leds) { let leds = new Uint8Array(event.data);
requestAnimationFrame(function () {updatePreview(json.leds);}); if (leds[0] != 76) return; //'L'
updatePreview(leds);
} }
} }
catch (err) { catch (err) {
console.error("Live-Preview ws error:",err); console.error("Peek WS error:",err);
} }
} }
var ws = top.window.ws; var ws = top.window.ws;
if (ws && ws.readyState === WebSocket.OPEN) { if (ws && ws.readyState === WebSocket.OPEN) {
console.info("Use top WS for peek"); console.info("Peek uses top WS");
ws.send("{'lv':true}"); ws.send("{'lv':true}");
} else { } else {
console.info("Peek ws opening"); console.info("Peek WS opening");
ws = new WebSocket("ws://"+document.location.host+"/ws"); ws = new WebSocket("ws://"+document.location.host+"/ws");
ws.onopen = function () { ws.onopen = function () {
console.info("Peek WS opened"); console.info("Peek WS open");
ws.send("{'lv':true}"); ws.send("{'lv':true}");
} }
} }
ws.binaryType = "arraybuffer";
ws.addEventListener('message',getLiveJson); ws.addEventListener('message',getLiveJson);
</script> </script>
</body> </body>

View File

@ -169,7 +169,21 @@ Hue Bridge IP:<br>
<input name="H3" type="number" class="s" min="0" max="255" ><br> <input name="H3" type="number" class="s" min="0" max="255" ><br>
<b>Press the pushlink button on the bridge, after that save this page!</b><br> <b>Press the pushlink button on the bridge, after that save this page!</b><br>
(when first connecting)<br> (when first connecting)<br>
Hue status: <span class="sip"> Disabled in this build </span><hr> Hue status: <span class="sip"> Disabled in this build </span>
<h3>Serial</h3>
Baud rate:
<select name=BD>
<option value=1152>115200</option>
<option value=2304>230400</option>
<option value=4608>460800</option>
<option value=5000>500000</option>
<option value=5760>576000</option>
<option value=9216>921600</option>
<option value=10000>1000000</option>
<option value=15000>1500000</option>
</select><br>
<i>Keep at 115200 to use Improv. Some boards may not support high rates.</i>
<hr>
<button type="button" onclick="B()">Back</button><button type="submit">Save</button> <button type="button" onclick="B()">Back</button><button type="submit">Save</button>
</form> </form>
</body> </body>

View File

@ -139,7 +139,9 @@ void serializeInfo(JsonObject root);
void serializeModeNames(JsonArray arr, const char *qstring); void serializeModeNames(JsonArray arr, const char *qstring);
void serializeModeData(JsonObject root); void serializeModeData(JsonObject root);
void serveJson(AsyncWebServerRequest* request); void serveJson(AsyncWebServerRequest* request);
#ifdef WLED_ENABLE_JSONLIVE
bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient = 0); bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient = 0);
#endif
//led.cpp //led.cpp
void setValuesFromMainSeg(); void setValuesFromMainSeg();
@ -314,6 +316,7 @@ void clearEEPROM();
//wled_serial.cpp //wled_serial.cpp
void handleSerial(); void handleSerial();
void updateBaudRate(uint32_t rate);
//wled_server.cpp //wled_server.cpp
bool isIp(String str); bool isIp(String str);

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -662,7 +662,7 @@ void handleIR()
{ {
if (results.value != 0) // only print results if anything is received ( != 0 ) if (results.value != 0) // only print results if anything is received ( != 0 )
{ {
if (!pinManager.isPinAllocated(1)) //GPIO 1 - Serial TX pin if (!pinManager.isPinAllocated(1) || pinManager.getPinOwner(1) == PinOwner::DebugOut) //GPIO 1 - Serial TX pin
Serial.printf_P(PSTR("IR recv: 0x%lX\n"), (unsigned long)results.value); Serial.printf_P(PSTR("IR recv: 0x%lX\n"), (unsigned long)results.value);
} }
decodeIR(results.value); decodeIR(results.value);

View File

@ -422,9 +422,9 @@ void serializeSegment(JsonObject& root, WS2812FX::Segment& seg, byte id, bool fo
} }
char tmpcol[22]; char tmpcol[22];
sprintf_P(tmpcol, format, (unsigned)c[0], (unsigned)c[1], (unsigned)c[2], (unsigned)c[3]); sprintf_P(tmpcol, format, (unsigned)c[0], (unsigned)c[1], (unsigned)c[2], (unsigned)c[3]);
strcat(colstr, i<2 ? strcat_P(tmpcol, PSTR(",")) : tmpcol); strcat(colstr, i<2 ? strcat(tmpcol, ",") : tmpcol);
} }
strcat_P(colstr, PSTR("]")); strcat(colstr, "]");
root["col"] = serialized(colstr); root["col"] = serialized(colstr);
root["fx"] = seg.mode; root["fx"] = seg.mode;
@ -883,10 +883,12 @@ void serveJson(AsyncWebServerRequest* request)
else if (url.indexOf("nodes") > 0) subJson = 4; else if (url.indexOf("nodes") > 0) subJson = 4;
else if (url.indexOf("palx") > 0) subJson = 5; else if (url.indexOf("palx") > 0) subJson = 5;
else if (url.indexOf("fxda") > 0) subJson = 6; else if (url.indexOf("fxda") > 0) subJson = 6;
#ifdef WLED_ENABLE_JSONLIVE
else if (url.indexOf("live") > 0) { else if (url.indexOf("live") > 0) {
serveLiveLeds(request); serveLiveLeds(request);
return; return;
} }
#endif
else if (url.indexOf(F("eff")) > 0) { else if (url.indexOf(F("eff")) > 0) {
// this is going to serve raw effect names which will include WLED-SR extensions in names // this is going to serve raw effect names which will include WLED-SR extensions in names
if (requestJSONBufferLock(19)) { if (requestJSONBufferLock(19)) {
@ -951,6 +953,7 @@ void serveJson(AsyncWebServerRequest* request)
releaseJSONBufferLock(); releaseJSONBufferLock();
} }
#ifdef WLED_ENABLE_JSONLIVE
#define MAX_LIVE_LEDS 180 #define MAX_LIVE_LEDS 180
bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient) bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient)
@ -992,3 +995,4 @@ bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient)
#endif #endif
return true; return true;
} }
#endif

View File

@ -13,8 +13,8 @@
* DO NOT make changes to the "my_config_sample.h" file directly! Your changes will not be applied. * DO NOT make changes to the "my_config_sample.h" file directly! Your changes will not be applied.
*/ */
// force the compiler to show a warning to confirm that this file is included // uncomment to force the compiler to show a warning to confirm that this file is included
#warning **** my_config.h: Settings from this file are honored **** //#warning **** my_config.h: Settings from this file are honored ****
/* Uncomment to use your WIFI settings as defaults /* Uncomment to use your WIFI settings as defaults
//WARNING: this will hardcode these as the default even after a factory reset //WARNING: this will hardcode these as the default even after a factory reset

View File

@ -293,6 +293,10 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
hueStoreAllowed = true; hueStoreAllowed = true;
reconnectHue(); reconnectHue();
#endif #endif
t = request->arg(F("BD")).toInt();
if (t >= 96 && t <= 15000) serialBaud = t;
updateBaudRate(serialBaud *100);
} }
//TIME //TIME

View File

@ -234,7 +234,7 @@ void releaseJSONBufferLock()
// extracts effect mode (or palette) name from names serialized string // extracts effect mode (or palette) name from names serialized string
// caller must provide large enough buffer! // caller must provide large enough buffer for name (incluing SR extensions)!
uint8_t extractModeName(uint8_t mode, const char *src, char *dest, uint8_t maxLen) uint8_t extractModeName(uint8_t mode, const char *src, char *dest, uint8_t maxLen)
{ {
uint8_t qComma = 0; uint8_t qComma = 0;
@ -260,7 +260,6 @@ uint8_t extractModeName(uint8_t mode, const char *src, char *dest, uint8_t maxLe
default: default:
if (!insideQuotes || (qComma != mode)) break; if (!insideQuotes || (qComma != mode)) break;
dest[printedChars++] = singleJsonSymbol; dest[printedChars++] = singleJsonSymbol;
break;
} }
if ((qComma > mode) || (printedChars >= maxLen)) break; if ((qComma > mode) || (printedChars >= maxLen)) break;
} }

View File

@ -8,7 +8,7 @@
*/ */
// version code in format yymmddb (b = daily build) // version code in format yymmddb (b = daily build)
#define VERSION 2202022 #define VERSION 2202031
//uncomment this if you have a "my_config.h" file you'd like to use //uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG //#define WLED_USE_MY_CONFIG
@ -34,6 +34,7 @@
#endif #endif
//#define WLED_ENABLE_ADALIGHT // saves 500b only (uses GPIO3 (RX) for serial) //#define WLED_ENABLE_ADALIGHT // saves 500b only (uses GPIO3 (RX) for serial)
//#define WLED_ENABLE_DMX // uses 3.5kb (use LEDPIN other than 2) //#define WLED_ENABLE_DMX // uses 3.5kb (use LEDPIN other than 2)
//#define WLED_ENABLE_JSONLIVE // peek LED output via /json/live (WS binary peek is always enabled)
#ifndef WLED_DISABLE_LOXONE #ifndef WLED_DISABLE_LOXONE
#define WLED_ENABLE_LOXONE // uses 1.2kb #define WLED_ENABLE_LOXONE // uses 1.2kb
#endif #endif
@ -70,8 +71,7 @@
#include "esp_wifi.h" #include "esp_wifi.h"
#include <ESPmDNS.h> #include <ESPmDNS.h>
#include <AsyncTCP.h> #include <AsyncTCP.h>
//#include "SPIFFS.h" #if LOROL_LITTLEFS
#if ESP_IDF_VERSION_MAJOR < 4
#ifndef CONFIG_LITTLEFS_FOR_IDF_3_2 #ifndef CONFIG_LITTLEFS_FOR_IDF_3_2
#define CONFIG_LITTLEFS_FOR_IDF_3_2 #define CONFIG_LITTLEFS_FOR_IDF_3_2
#endif #endif
@ -180,7 +180,7 @@ using PSRAMDynamicJsonDocument = BasicJsonDocument<PSRAM_Allocator>;
#ifdef ESP8266 #ifdef ESP8266
#define WLED_FS LittleFS #define WLED_FS LittleFS
#else #else
#if ESP_IDF_VERSION_MAJOR < 4 #if LOROL_LITTLEFS
#define WLED_FS LITTLEFS #define WLED_FS LITTLEFS
#else #else
#define WLED_FS LittleFS #define WLED_FS LittleFS
@ -375,6 +375,8 @@ WLED_GLOBAL bool hueApplyBri _INIT(true);
WLED_GLOBAL bool hueApplyColor _INIT(true); WLED_GLOBAL bool hueApplyColor _INIT(true);
#endif #endif
WLED_GLOBAL uint16_t serialBaud _INIT(1152); // serial baud rate, multiply by 100
// Time CONFIG // Time CONFIG
WLED_GLOBAL bool ntpEnabled _INIT(false); // get internet time. Only required if you use clock overlays or time-activated macros WLED_GLOBAL bool ntpEnabled _INIT(false); // get internet time. Only required if you use clock overlays or time-activated macros
WLED_GLOBAL bool useAMPM _INIT(false); // 12h/24h clock format WLED_GLOBAL bool useAMPM _INIT(false); // 12h/24h clock format

View File

@ -19,6 +19,21 @@ enum class AdaState {
TPM2_Header_CountLo, TPM2_Header_CountLo,
}; };
uint16_t currentBaud = 1152; //default baudrate 115200 (divided by 100)
void updateBaudRate(uint32_t rate){
uint16_t rate100 = rate/100;
if (rate100 == currentBaud || rate100 < 96) return;
currentBaud = rate100;
if (!pinManager.isPinAllocated(1) || pinManager.getPinOwner(1) == PinOwner::DebugOut){
Serial.print(F("Baud is now ")); Serial.println(rate);
}
Serial.flush();
Serial.begin(rate);
}
void handleSerial() void handleSerial()
{ {
if (pinManager.isPinAllocated(3)) return; if (pinManager.isPinAllocated(3)) return;
@ -31,6 +46,8 @@ void handleSerial()
static byte red = 0x00; static byte red = 0x00;
static byte green = 0x00; static byte green = 0x00;
uint16_t nBytes = 0;
while (Serial.available() > 0) while (Serial.available() > 0)
{ {
yield(); yield();
@ -46,6 +63,41 @@ void handleSerial()
return; return;
} else if (next == 'v') { } else if (next == 'v') {
Serial.print("WLED"); Serial.write(' '); Serial.println(VERSION); Serial.print("WLED"); Serial.write(' '); Serial.println(VERSION);
} else if (next == 0xB0) {updateBaudRate( 115200);
} else if (next == 0xB1) {updateBaudRate( 230400);
} else if (next == 0xB2) {updateBaudRate( 460800);
} else if (next == 0xB3) {updateBaudRate( 500000);
} else if (next == 0xB4) {updateBaudRate( 576000);
} else if (next == 0xB5) {updateBaudRate( 921600);
} else if (next == 0xB6) {updateBaudRate(1000000);
} else if (next == 0xB7) {updateBaudRate(1500000);
} else if (next == 'l') { //RGB(W) LED data return as JSON array. Slow, but easy to use on the other end.
if (!pinManager.isPinAllocated(1) || pinManager.getPinOwner(1) == PinOwner::DebugOut){
uint16_t used = strip.getLengthTotal();
Serial.write('[');
for (uint16_t i=0; i<used; i+=1) {
Serial.print(strip.getPixelColor(i));
if (i != used-1) Serial.write(',');
}
Serial.println("]");
}
} else if (next == 'L') { //RGB LED data returned as bytes in tpm2 format. Faster, and slightly less easy to use on the other end.
if (!pinManager.isPinAllocated(1) || pinManager.getPinOwner(1) == PinOwner::DebugOut) {
Serial.write(0xC9); Serial.write(0xDA);
uint16_t used = strip.getLengthTotal();
uint16_t len = used*3;
Serial.write((len << 8) & 0xFF);
Serial.write( len & 0xFF);
for (uint16_t i=0; i < used; i++) {
uint32_t c = strip.getPixelColor(i);
Serial.write(qadd8(W(c), R(c))); //R, add white channel to RGB channels as a simple RGBW -> RGB map
Serial.write(qadd8(W(c), G(c))); //G
Serial.write(qadd8(W(c), B(c))); //B
}
Serial.write(0x36); Serial.write('\n');
}
} else if (next == '{') { //JSON API } else if (next == '{') { //JSON API
bool verboseResponse = false; bool verboseResponse = false;
if (!requestJSONBufferLock(16)) return; if (!requestJSONBufferLock(16)) return;
@ -57,7 +109,7 @@ void handleSerial()
} }
verboseResponse = deserializeState(doc.as<JsonObject>()); verboseResponse = deserializeState(doc.as<JsonObject>());
//only send response if TX pin is unused for other purposes //only send response if TX pin is unused for other purposes
if (verboseResponse && !pinManager.isPinAllocated(1)) { if (verboseResponse && (!pinManager.isPinAllocated(1) || pinManager.getPinOwner(1) == PinOwner::DebugOut)) {
doc.clear(); doc.clear();
JsonObject state = doc.createNestedObject("state"); JsonObject state = doc.createNestedObject("state");
serializeState(state); serializeState(state);

View File

@ -130,6 +130,34 @@ void sendDataWs(AsyncWebSocketClient * client)
} }
} }
#define MAX_LIVE_LEDS_WS 256
bool sendLiveLedsWs(uint32_t wsClient)
{
AsyncWebSocketClient * wsc = ws.client(wsClient);
if (!wsc || wsc->queueLength() > 0) return false; //only send if queue free
uint16_t used = strip.getLengthTotal();
uint16_t n = (used -1) /MAX_LIVE_LEDS_WS +1; //only serve every n'th LED if count over MAX_LIVE_LEDS
AsyncWebSocketMessageBuffer * wsBuf = ws.makeBuffer(2 + MIN(used, MAX_LIVE_LEDS_WS)*3);
if (!wsBuf) return false; //out of memory
uint8_t* buffer = wsBuf->get();
buffer[0] = 'L';
buffer[1] = 1; //version
uint16_t pos = 2;
for (uint16_t i= 0; i < used; i += n)
{
uint32_t c = strip.getPixelColor(i);
buffer[pos++] = qadd8(W(c), R(c)); //R, add white channel to RGB channels as a simple RGBW -> RGB map
buffer[pos++] = qadd8(W(c), G(c)); //G
buffer[pos++] = qadd8(W(c), B(c)); //B
}
wsc->binary(wsBuf);
return true;
}
void handleWs() void handleWs()
{ {
if (millis() - wsLastLiveTime > WS_LIVE_INTERVAL) if (millis() - wsLastLiveTime > WS_LIVE_INTERVAL)
@ -140,7 +168,7 @@ void handleWs()
ws.cleanupClients(); ws.cleanupClients();
#endif #endif
bool success = true; bool success = true;
if (wsLiveClientId) success = serveLiveLeds(nullptr, wsLiveClientId); if (wsLiveClientId) success = sendLiveLedsWs(wsLiveClientId);
wsLastLiveTime = millis(); wsLastLiveTime = millis();
if (!success) wsLastLiveTime -= 20; //try again in 20ms if failed due to non-empty WS queue if (!success) wsLastLiveTime -= 20; //try again in 20ms if failed due to non-empty WS queue
} }

View File

@ -509,6 +509,7 @@ void getSettingsJS(byte subPage, char* dest)
sappends('m',SET_F("(\"sip\")[0]"),hueErrorString); sappends('m',SET_F("(\"sip\")[0]"),hueErrorString);
#endif #endif
sappend('v',SET_F("BD"),serialBaud);
} }
if (subPage == 5) if (subPage == 5)