Merge branch 'MoonModules:mdev' into mdev

This commit is contained in:
tonyxforce
2023-09-10 19:05:07 +00:00
committed by GitHub
16 changed files with 1552 additions and 1462 deletions

View File

@@ -48,7 +48,7 @@ body:
attributes:
label: What version/release of MM WLED?
description: You can find this in by going to Config -> Security & Updates -> Scroll to Bottom. Copy and paste the entire line after "Server message"
placeholder: "e.g. WLEDMM_0.14.0.2.1_esp32_4MB_max (build 2212061)"
placeholder: "e.g. build 2308250, WLEDMM_0.14.0-b27.31_esp32_4MB_M.bin"
validations:
required: true
- type: dropdown
@@ -57,12 +57,12 @@ body:
label: Which microcontroller/board are you seeing the problem on?
multiple: true
options:
- ESP8266
- ESP32
- ESP32-S3
- ESP32-S2
- ESP32-C3
- Other
- ESP8266
validations:
required: true
- type: textarea

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "wled",
"version": "0.14.0-b26.30",
"version": "0.14.0-b27.31",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "wled",
"version": "0.14.0-b26.30",
"version": "0.14.0-b27.31",
"license": "GPL-3.0-or-later",
"dependencies": {
"clean-css": "^4.2.3",

View File

@@ -1,6 +1,6 @@
{
"name": "wled",
"version": "0.14.0-b26.30",
"version": "0.14.0-b27.31",
"description": "Tools for WLED project",
"main": "tools/cdata.js",
"directories": {

View File

@@ -39,12 +39,14 @@
; default_envs = esp32dev_qio80
; default_envs = esp32_eth_ota1mapp
; default_envs = esp32s2_saola
; default_envs = esp32c3dev
; default_envs = lolin_s2_mini
; MoonModules entries
; ===================
default_envs =
; esp32_4MB_S ;; experimental, optimized for speed
esp32_4MB_S ;; experimental, optimized for speed
esp32_4MB_M ;; esp32 recommended default
esp32_4MB_M_eth
esp32_4MB_M_debug
@@ -68,9 +70,9 @@ default_envs =
esp32_pico_4MB_M
esp32_4MB_PSRAM_S
; esp32_4MB_PSRAM_REV3_S ;; experimental, optimized for WROVER-E with "revision3" chip
esp32S3_8MB_S ;; experimental, optimized for speed
esp32S3_8MB_M
;; esp32S3_8MB_PSRAM_M ;; experiemental
;; esp32S3_8MB_S ;; experimental, optimized for speed
;; esp32s2_tinyUF2_PSRAM_S ;; experimental - only for adafruit -S2 boards with tinyUF2 bootloader !!!
esp32s2_PSRAM_M ;; experimental
esp32c3dev_4MB_M ;; experimental
@@ -563,8 +565,8 @@ board = esp32-c3-devkitm-1
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
build_flags = ${common.build_flags} ${esp32c3.build_flags} #-D WLED_RELEASE_NAME=ESP32-C3
-D WLED_WATCHDOG_TIMEOUT=0
; -DARDUINO_USB_CDC_ON_BOOT=1 ;; for virtual CDC USB
-DARDUINO_USB_CDC_ON_BOOT=0 ;; for serial-to-USB chip
-DARDUINO_USB_CDC_ON_BOOT=1 ;; for virtual CDC USB
;-DARDUINO_USB_CDC_ON_BOOT=0 ;; for serial-to-USB chip
upload_speed = 460800
build_unflags = ${common.build_unflags}
lib_deps = ${esp32c3.lib_deps}
@@ -676,10 +678,10 @@ platform = ${esp32s2.platform}
platform_packages = ${esp32s2.platform_packages}
board = lolin_s2_mini
board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
build_unflags = ${common.build_unflags} -DARDUINO_USB_CDC_ON_BOOT=1
build_unflags = ${common.build_unflags} #-DARDUINO_USB_CDC_ON_BOOT=1
build_flags = ${common.build_flags} ${esp32s2.build_flags} #-D WLED_RELEASE_NAME=LolinS2
-DBOARD_HAS_PSRAM
-DARDUINO_USB_CDC_ON_BOOT=0
-DARDUINO_USB_CDC_ON_BOOT=1 # try disabling and enabling unflag above in case of board-specific issues, will disable Serial
-DARDUINO_USB_MSC_ON_BOOT=0
-DARDUINO_USB_DFU_ON_BOOT=0
-DLOLIN_WIFI_FIX ; seems to work much better with this
@@ -1706,12 +1708,13 @@ build_unflags = ${env:esp32S3_8MB_M.build_unflags} ;; use the same as "normal"
${Speed_Flags.build_unflags} ;; to override -Os
build_flags = ${common.build_flags} ${esp32s3.build_flags} -Wno-misleading-indentation -Wno-format-truncation
${common_mm.build_flags_S}
-D WLED_RELEASE_NAME=esp32S3_8MB_PSRAM_S
-D WLED_RELEASE_NAME=esp32S3_8MB_S
-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 ;; for Serial-to-USB chip
;;-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=1 ;; for Hardware-CDC USB mode
;;-D WLED_DISABLE_ADALIGHT ;; disables serial protocols - recommended for Hardware-CDC USB (Serial RX will receive junk commands when RX pin is unconnected, unless its pulled down by resistor)
${Speed_Flags.build_flags} ;; optimize for speed instead of size
-D WLEDMM_FASTPATH ; WLEDMM experimental option. Reduces audio lag (latency), and allows for faster LED framerates. May break compatibility with previous versions.
${common_mm.animartrix_build_flags}
-D WLED_WATCHDOG_TIMEOUT=0 -D CONFIG_ASYNC_TCP_USE_WDT=0
-D WLED_DISABLE_LOXONE ; FLASH 1272 bytes
-D WLED_DISABLE_ALEXA ; RAM 116 bytes; FLASH 13524 bytes
@@ -1731,15 +1734,16 @@ build_flags = ${common.build_flags} ${esp32s3.build_flags} -Wno-misleading-inden
; -D WLED_DEBUG
; -D SR_DEBUG
; -D MIC_LOGGER
lib_deps = ${esp32s3.lib_deps} ${common_mm.lib_deps_S}
lib_deps = ${esp32s3.lib_deps} ${common_mm.lib_deps_S}
${common_mm.animartrix_lib_deps}
lib_ignore = IRremoteESP8266 ; use with WLED_DISABLE_INFRARED for faster compilation
board_build.partitions = tools/WLED_ESP32_8MB.csv
;; normal build
; RAM: [== ] 24.9% (used 81656 bytes from 327680 bytes)
; Flash: [======= ] 66.1% (used 1386229 bytes from 2097152 bytes)
;; optimized-for-speed build
; RAM: [== ] 24.9% (used 81712 bytes from 327680 bytes)
; Flash: [======== ] 75.2% (used 1576113 bytes from 2097152 bytes)
; RAM: [=== ] 25.8% (used 84544 bytes from 327680 bytes)
; Flash: [======== ] 78.1% (used 1638737 bytes from 2097152 bytes)
;; MM for Adafruit QT Py ESP32-S2 -> 4MB flash, PSRAM, and tinyUF2 bootloader
@@ -1769,7 +1773,7 @@ build_flags = ${common.build_flags} ${esp32s2.build_flags}
-D WLED_DISABLE_ADALIGHT ;; disables serial protocols when using CDC USB (Serial RX will receive junk commands, unless its pulled down by resistor)
-DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0
-D SERVERNAME='"WLED-S2"'
-DBOARD_HAS_PSRAM -D WLED_USE_PSRAM_JSON -D WLED_USE_PSRAM
-DBOARD_HAS_PSRAM -D WLED_USE_PSRAM_JSON ;; -D WLED_USE_PSRAM
-D WLED_DISABLE_LOXONE ;; FLASH 1272 bytes
-D WLED_DISABLE_HUESYNC ;; RAM 122 bytes; FLASH 6308 bytes
-D WLED_DISABLE_ALEXA ;; RAM 116 bytes; FLASH 13524 bytes
@@ -1815,11 +1819,12 @@ build_flags = ${common.build_flags} ${esp32s2.build_flags}
-D WLED_WATCHDOG_TIMEOUT=0 -D CONFIG_ASYNC_TCP_USE_WDT=0
${common_mm.build_flags_S} ${common_mm.build_flags_M}
-Wno-misleading-indentation -Wno-format-truncation
-D WLED_RELEASE_NAME=esp32S2_4MB_M
-D WLED_RELEASE_NAME=esp32s2_4MB_M
-DLOLIN_WIFI_FIX -DWLEDMM_WIFI_POWERON_HACK ;; seems to work much better with this
-DARDUINO_USB_CDC_ON_BOOT=0
-DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0
-D WLED_DISABLE_ADALIGHT ;; disables serial protocols, as the board only has CDC USB
-DBOARD_HAS_PSRAM -D WLED_USE_PSRAM_JSON -D WLED_USE_PSRAM
-DBOARD_HAS_PSRAM -D WLED_USE_PSRAM_JSON ;; -D WLED_USE_PSRAM
; -D WLEDMM_WIFI_POWERON_HACK -DLOLIN_WIFI_FIX ;; use this _only_ if your device is not able to make a WiFI connection!
-D WLED_DISABLE_INFRARED ;; save flash space
-D WLED_DISABLE_ALEXA ;; save flash space

View File

@@ -1,6 +1,33 @@
#pragma once
#include "wled.h"
// softhack007: workaround for ICE (internal compiler error) when compiling with new framework and "-O2":
/*
wled00/../usermods/usermod_v2_animartrix/usermod_v2_animartrix.h: In function 'uint16_t mode_Waves()':
wled00/../usermods/usermod_v2_animartrix/usermod_v2_animartrix.h:367:1: error: insn does not satisfy its constraints:
}
^
(insn 811 738 824 24 (set (reg/v:SF 19 f0 [orig:69 result ] [69])
(mem/u/c:SF (symbol_ref/u:SI ("*.LC1657") [flags 0x2]) [0 S4 A32])) ".pio/libdeps/my_esp32_16MB_V4_S/animartrix/ANIMartRIX.h":372 47 {movsf_internal}
(nil))
during RTL pass: postreload
wled00/../usermods/usermod_v2_animartrix/usermod_v2_animartrix.h:367:1: internal compiler error: in extract_constrain_insn, at recog.c:2210
libbacktrace could not find executable to open
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://gcc.gnu.org/bugs/> for instructions.
*/
#if defined(ARDUINO_ARCH_ESP32) && defined(ESP_IDF_VERSION)
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 0)
// this pragma temporarily raises gcc optimization level to "-O3", to avoid internal error conditions
#pragma GCC push_options
#pragma GCC optimize ("O3")
#endif
#endif
#include <ANIMartRIX.h>
#warning WLEDMM usermod: CC BY-NC 3.0 licensed effects by Stefan Petrick, include this usermod only if you accept the terms!
@@ -448,4 +475,10 @@ class AnimartrixUsermod : public Usermod {
};
#if defined(ARDUINO_ARCH_ESP32) && defined(ESP_IDF_VERSION)
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 4, 0)
// restore original gcc optimization level
#pragma GCC pop_options
#endif
#endif

View File

@@ -1354,7 +1354,7 @@ bool FourLineDisplayUsermod::handleButton(uint8_t b) {
static bool buttonLongPressed = false;
static unsigned long buttonPressedTime = 0;
static unsigned long buttonWaitTime = 0;
bool handled = true;
bool handled = false;
//momentary button logic
if (isButtonPressed(b)) { //pressed
@@ -1363,11 +1363,12 @@ bool FourLineDisplayUsermod::handleButton(uint8_t b) {
buttonPressedBefore = true;
if (now - buttonPressedTime > 600) { //long press
buttonLongPressed = true;
//TODO: handleButton() handles button 0 without preset in a different way for double click
//so we need to override with same behaviour
longPressAction(0);
//handled = false;
//DEBUG_PRINTLN(F("4LD action."));
//if (!buttonLongPressed) longPressAction(0);
buttonLongPressed = true;
return false;
}
} else if (!isButtonPressed(b) && buttonPressedBefore) { //released
@@ -1399,7 +1400,7 @@ bool FourLineDisplayUsermod::handleButton(uint8_t b) {
buttonWaitTime = 0;
//TODO: handleButton() handles button 0 without preset in a different way for double click
//so we need to override with same behaviour
shortPressAction(0);
//shortPressAction(0);
//handled = false;
}
return handled;

View File

@@ -21,6 +21,7 @@ void shortPressAction(uint8_t b)
case 1: ++effectCurrent %= strip.getModeCount(); stateChanged = true; colorUpdated(CALL_MODE_BUTTON); break;
}
} else {
unloadPlaylist(); // applying a preset unloads the playlist
applyPreset(macroButton[b], CALL_MODE_BUTTON_PRESET);
}
@@ -42,6 +43,7 @@ void longPressAction(uint8_t b)
case 1: bri += 8; stateUpdated(CALL_MODE_BUTTON); buttonPressedTime[b] = millis(); break; // repeatable action
}
} else {
unloadPlaylist(); // applying a preset unloads the playlist
applyPreset(macroLongPress[b], CALL_MODE_BUTTON_PRESET);
}
@@ -63,6 +65,7 @@ void doublePressAction(uint8_t b)
case 1: ++effectPalette %= strip.getPaletteCount(); colorUpdated(CALL_MODE_BUTTON); break;
}
} else {
unloadPlaylist(); // applying a preset unloads the playlist
applyPreset(macroDoublePress[b], CALL_MODE_BUTTON_PRESET);
}
@@ -262,7 +265,7 @@ void handleButton()
shortPressAction(b);
buttonPressedBefore[b] = true;
buttonPressedTime[b] = now; // continually update (for debouncing to work in release handler)
return;
continue;
}
if (!buttonPressedBefore[b]) buttonPressedTime[b] = now;
@@ -283,7 +286,7 @@ void handleButton()
// released after rising-edge short press action
if (macroButton[b] && macroButton[b] == macroLongPress[b] && macroButton[b] == macroDoublePress[b]) {
if (dur > WLED_DEBOUNCE_THRESHOLD) buttonPressedBefore[b] = false; // debounce, blocks button for 50 ms once it has been released
return;
continue;
}
if (dur < WLED_DEBOUNCE_THRESHOLD) {buttonPressedBefore[b] = false; continue;} // too short "press", debounce

View File

@@ -422,7 +422,11 @@
#else
#if defined(BOARD_HAS_PSRAM) && (defined(WLED_USE_PSRAM) || defined(WLED_USE_PSRAM_JSON))
#if defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32C3)
#define JSON_BUFFER_SIZE 48000 // WLEDMM
#if defined(ARDUINO_ARCH_ESP32C3)
#define JSON_BUFFER_SIZE 46000 // WLEDMM - max 46KB on -C3 with PSRAM (chip has 400kb RAM)
#else
#define JSON_BUFFER_SIZE 36000 // WLEDMM - max 36KB on -S2 with PSRAM (chip has 320kb RAM)
#endif
#else
#define JSON_BUFFER_SIZE 56000 // WLEDMM (was 60000) slightly reduced to avoid build error "region dram0_0_seg overflowed"
#endif

View File

@@ -676,8 +676,7 @@ function populateInfo(i)
if (i.ver.includes("0.14.1")) vcn = "Sitting Ducks"; // easter egg
if (i.ver.includes("0.14.0")) vcn = "Lupo"; // check for MM versioning scheme
if (i.ver.includes("0.14.0-b15")) vcn = "Sitting Ducks"; // late easter egg
if (i.ver.includes("0.14.0-b25")) vcn = "This is the way"; // recently watched The Mandalorian? I have spoken ;-)
if (i.ver.includes("0.14.0-b26")) vcn = "This is the way";
if (i.ver.includes("0.14.0-b2")) vcn = "This is the way"; // recently watched The Mandalorian? I have spoken ;-)
if (i.ver.includes("0.14.0-b15.22")) vcn = "Lupo";
cn += `v${i.ver} &nbsp;<i>"${vcn}"</i><p>(WLEDMM_${i.ver} ${i.rel}.bin)</p><p><em>build ${i.vid}</em></p><table>
${urows}

View File

@@ -99,10 +99,20 @@ void sendHuePoll();
void onHueData(void* arg, AsyncClient* client, void *data, size_t len);
//improv.cpp
enum ImprovRPCType {
Command_Wifi = 0x01,
Request_State = 0x02,
Request_Info = 0x03,
Request_Scan = 0x04
};
void handleImprovPacket();
void sendImprovRPCResult(ImprovRPCType type, uint8_t n_strings = 0, const char **strings = nullptr);
void sendImprovStateResponse(uint8_t state, bool error = false);
void sendImprovInfoResponse();
void sendImprovRPCResponse(uint8_t commandId);
void startImprovWifiScan();
void handleImprovWifiScan();
void sendImprovIPRPCResult(ImprovRPCType type);
//ir.cpp
void applyRepeatActions();
@@ -165,9 +175,11 @@ void handleTransitions();
void handleNightlight();
byte __attribute__((pure)) scaledBri(byte in); // WLEDMM: added attribute pure
#ifdef WLED_ENABLE_LOXONE
//lx_parser.cpp
bool parseLx(int lxValue, byte* rgbw);
void parseLxJson(int lxValue, byte segId, bool secondary);
#endif
//mqtt.cpp
bool initMqtt();
@@ -222,7 +234,7 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply=tru
//udp.cpp
void notify(byte callMode, bool followUp=false);
uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, byte *buffer, uint8_t bri=255, bool isRGBW=false);
uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8_t *buffer, uint8_t bri=255, bool isRGBW=false);
void realtimeLock(uint32_t timeoutMs, byte md = REALTIME_MODE_GENERIC);
void exitRealtime();
void handleNotifications();

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -10,6 +10,11 @@
#define DIMPROV_PRINTF(x...)
#endif
#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S3)
#undef WLED_DISABLE_IMPROV_WIFISCAN
#define WLED_DISABLE_IMPROV_WIFISCAN
#endif
#define IMPROV_VERSION 1
void parseWiFiCommand(char *rpcData);
@@ -28,20 +33,14 @@ enum ImprovPacketByte {
RPC_CommandType = 9
};
enum ImprovRPCType {
Command_Wifi = 0x01,
Request_State = 0x02,
Request_Info = 0x03
};
//File dbgf;
#ifndef WLED_DISABLE_IMPROV_WIFISCAN
static bool improvWifiScanRunning = false;
#endif
//blocking function to parse an Improv Serial packet
void handleImprovPacket() {
uint8_t header[6] = {'I','M','P','R','O','V'};
//dbgf = WLED_FS.open("/improv.log","a");
bool timeout = false;
uint8_t waitTime = 25;
uint16_t packetByte = 0;
@@ -62,12 +61,11 @@ void handleImprovPacket() {
byte next = Serial.read();
DIMPROV_PRINT("Received improv byte: "); DIMPROV_PRINTF("%x\r\n",next);
//f.write(next);
switch (packetByte) {
case ImprovPacketByte::Version: {
if (next != IMPROV_VERSION) {
DIMPROV_PRINTLN(F("Invalid version"));
//dbgf.close();
return;
}
break;
@@ -75,7 +73,6 @@ void handleImprovPacket() {
case ImprovPacketByte::PacketType: {
if (next != ImprovPacketType::RPC_Command) {
DIMPROV_PRINTF("Non RPC-command improv packet type %i\n",next);
//dbgf.close();
return;
}
if (!improvActive) improvActive = 1;
@@ -89,7 +86,6 @@ void handleImprovPacket() {
if (checksum != next) {
DIMPROV_PRINTF("Got RPC checksum %i, expected %i",next,checksum);
sendImprovStateResponse(0x01, true);
//dbgf.close();
return;
}
@@ -100,22 +96,23 @@ void handleImprovPacket() {
if (WLED_WIFI_CONFIGURED) improvState = 0x03; //provisioning
if (Network.isConnected()) improvState = 0x04; //provisioned
sendImprovStateResponse(improvState, false);
if (improvState == 0x04) sendImprovRPCResponse(ImprovRPCType::Request_State);
if (improvState == 0x04) sendImprovIPRPCResult(ImprovRPCType::Request_State);
break;
}
case ImprovRPCType::Request_Info: sendImprovInfoResponse(); break;
#ifndef WLED_DISABLE_IMPROV_WIFISCAN
case ImprovRPCType::Request_Scan: startImprovWifiScan(); break;
#endif
default: {
DIMPROV_PRINTF("Unknown RPC command %i\n",next);
sendImprovStateResponse(0x02, true);
}
}
//dbgf.close();
return;
}
if (packetByte < 6) { //check header
if (next != header[packetByte]) {
DIMPROV_PRINTLN(F("Invalid improv header"));
//dbgf.close();
return;
}
} else if (packetByte > 9) { //RPC data
@@ -128,7 +125,6 @@ void handleImprovPacket() {
checksum += next;
packetByte++;
}
//dbgf.close();
}
void sendImprovStateResponse(uint8_t state, bool error) {
@@ -147,79 +143,116 @@ void sendImprovStateResponse(uint8_t state, bool error) {
Serial.write('\n');
}
void sendImprovRPCResponse(byte commandId) {
// used by sendImprovIPRPCResult(), sendImprovInfoResponse(), and handleImprovWifiScan()
void sendImprovRPCResult(ImprovRPCType type, uint8_t n_strings, const char **strings) {
if (improvError > 0 && improvError < 3) sendImprovStateResponse(0x00, true);
uint8_t packetLen = 12;
char out[64] = {'I','M','P','R','O','V'};
char out[256] = {'I','M','P','R','O','V'};
out[6] = IMPROV_VERSION;
out[7] = ImprovPacketType::RPC_Response;
out[8] = 2; //Length (set below)
out[9] = commandId;
out[10] = 0; //Data len (set below)
out[11] = '\0'; //URL len (set below)
//out[8] = 2; //Length (set below)
out[9] = type;
//out[10] = 0; //Data len (set below)
uint16_t pos = 11;
if (Network.isConnected())
{
IPAddress localIP = Network.localIP();
uint8_t len = sprintf(out+12, "http://%d.%d.%d.%d", localIP[0], localIP[1], localIP[2], localIP[3]);
if (len > 24) return; //sprintf fail?
out[11] = len;
out[10] = 1 + len;
out[8] = 3 + len; //RPC command type + data len + url len + url
packetLen = 13 + len;
for (uint8_t s = 0; s < n_strings; s++) {
size_t len = strlen(strings[s]);
if (pos + len > 254) continue; // simple buffer overflow guard
out[pos++] = len;
strcpy(out + pos, strings[s]);
pos += len;
}
packetLen = pos +1;
out[8] = pos -9; // Length of packet (excluding first 9 header bytes and final checksum byte)
out[10] = pos -11; // Data len
uint8_t checksum = 0;
for (uint8_t i = 0; i < packetLen -1; i++) checksum += out[i];
out[packetLen -1] = checksum;
Serial.write((uint8_t*)out, packetLen);
Serial.write('\n');
DIMPROV_PRINT("RPC result checksum");
DIMPROV_PRINTLN(checksum);
}
void sendImprovIPRPCResult(ImprovRPCType type) {
if (Network.isConnected())
{
char urlStr[64];
IPAddress localIP = Network.localIP();
uint8_t len = sprintf(urlStr, "http://%d.%d.%d.%d", localIP[0], localIP[1], localIP[2], localIP[3]);
if (len > 24) return; //sprintf fail?
const char *str[1] = {urlStr};
sendImprovRPCResult(type, 1, str);
} else {
sendImprovRPCResult(type, 0);
}
improvActive = 1; //no longer provisioning
}
void sendImprovInfoResponse() {
if (improvError > 0 && improvError < 3) sendImprovStateResponse(0x00, true);
uint8_t packetLen = 12;
char out[128] = {'I','M','P','R','O','V'};
out[6] = IMPROV_VERSION;
out[7] = ImprovPacketType::RPC_Response;
//out[8] = 2; //Length (set below)
out[9] = ImprovRPCType::Request_Info;
//out[10] = 0; //Data len (set below)
out[11] = 4; //Firmware len ("WLED")
out[12] = 'W'; out[13] = 'L'; out[14] = 'E'; out[15] = 'D';
uint8_t lengthSum = 17;
uint8_t vlen = sprintf_P(out+lengthSum,PSTR("0.14.0-b26.30/%i"),VERSION);
out[16] = vlen; lengthSum += vlen;
uint8_t hlen = 7;
#ifdef ESP8266
strcpy(out+lengthSum+1,"esp8266");
#else
hlen = 5;
strcpy(out+lengthSum+1,"esp32");
#endif
out[lengthSum] = hlen;
lengthSum += hlen + 1;
const char* bString =
#ifdef ESP8266
"esp8266"
#elif CONFIG_IDF_TARGET_ESP32C3
"esp32-c3"
#elif CONFIG_IDF_TARGET_ESP32S2
"esp32-s2"
#elif CONFIG_IDF_TARGET_ESP32S3
"esp32-s3"
#else // ESP32
"esp32"
#endif
;
//Use serverDescription if it has been changed from the default "WLED", else mDNS name
bool useMdnsName = (strcmp(serverDescription, "WLED") == 0 && strlen(cmDNS) > 0);
strcpy(out+lengthSum+1,useMdnsName ? cmDNS : serverDescription);
uint8_t nlen = strlen(useMdnsName ? cmDNS : serverDescription);
out[lengthSum] = nlen;
lengthSum += nlen + 1;
char vString[32];
snprintf_P(vString, sizeof(vString)-1, PSTR("0.14.0-b27.31/%i"),VERSION);
const char *str[4] = {"WLED", vString, bString, useMdnsName ? cmDNS : serverDescription};
packetLen = lengthSum +1;
out[8] = lengthSum -9;
out[10] = lengthSum -11;
uint8_t checksum = 0;
for (uint8_t i = 0; i < packetLen -1; i++) checksum += out[i];
out[packetLen -1] = checksum;
Serial.write((uint8_t*)out, packetLen);
Serial.write('\n');
DIMPROV_PRINT("Info checksum");
DIMPROV_PRINTLN(checksum);
sendImprovRPCResult(ImprovRPCType::Request_Info, 4, str);
}
#ifndef WLED_DISABLE_IMPROV_WIFISCAN
void startImprovWifiScan() {
if (improvWifiScanRunning) return;
WiFi.scanNetworks(true);
improvWifiScanRunning = true;
}
void handleImprovWifiScan() {
if (!improvWifiScanRunning) return;
int16_t status = WiFi.scanComplete();
if (status == WIFI_SCAN_RUNNING) return;
// here scan completed or failed (-2)
improvWifiScanRunning = false;
for (int i = 0; i < status; i++) {
char rssiStr[8];
sprintf(rssiStr, "%d", WiFi.RSSI(i));
#ifdef ESP8266
bool isOpen = WiFi.encryptionType(i) == ENC_TYPE_NONE;
#else
bool isOpen = WiFi.encryptionType(i) == WIFI_AUTH_OPEN;
#endif
char ssidStr[33];
strcpy(ssidStr, WiFi.SSID(i).c_str());
const char *str[3] = {ssidStr, rssiStr, isOpen ? "NO":"YES"};
sendImprovRPCResult(ImprovRPCType::Request_Scan, 3, str);
}
sendImprovRPCResult(ImprovRPCType::Request_Scan, 0);
WiFi.scanDelete();
}
#else
void startImprovWifiScan() {}
void handleImprovWifiScan() {}
#endif
void parseWiFiCommand(char* rpcData) {
uint8_t len = rpcData[0];
if (!len || len > 126) return;

View File

@@ -258,7 +258,7 @@ void handlePresets()
fdo.remove("ps"); // remove load request for presets to prevent recursive crash (if not called by button and contains preset cycling string "1~5~")
deserializeState(fdo, CALL_MODE_NO_NOTIFY, tmpPreset); // may change presetToApply by calling applyPreset()
}
if (!errorFlag && tmpPreset < 255 && changePreset) presetCycCurr = currentPreset = tmpPreset;
if (!errorFlag && tmpPreset < 255 && changePreset) currentPreset = tmpPreset;
#if defined(ARDUINO_ARCH_ESP32)
//Aircoookie recommended not to delete buffer

View File

@@ -109,6 +109,7 @@ void WLED::loop()
handleRemote();
#endif
handleSerial();
handleImprovWifiScan();
#if defined(ARDUINO_ARCH_ESP32) && defined(WLEDMM_PROTECT_SERVICE) // WLEDMM experimental: handleNotifications() calls strip.show(); handleTransitions modifies segments
if (!suspendStripService) {
@@ -827,7 +828,7 @@ void WLED::initAP(bool resetAP)
USER_PRINTLN(apSSID); // WLEDMM
WiFi.softAPConfig(IPAddress(4, 3, 2, 1), IPAddress(4, 3, 2, 1), IPAddress(255, 255, 255, 0));
WiFi.softAP(apSSID, apPass, apChannel, apHide);
#if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2))
#if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32S3))
WiFi.setTxPower(WIFI_POWER_8_5dBm);
#endif
@@ -962,7 +963,6 @@ void WLED::initConnection()
ws.onEvent(wsEvent);
#endif
WiFi.disconnect(true); // close old connections
#ifdef ESP8266
WiFi.setPhyMode(WIFI_PHY_MODE_11N);
@@ -1010,7 +1010,7 @@ void WLED::initConnection()
WiFi.begin(clientSSID, clientPass);
#ifdef ARDUINO_ARCH_ESP32
#if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2))
#if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32S3))
WiFi.setTxPower(WIFI_POWER_8_5dBm);
#endif
WiFi.setSleep(!noWifiSleep);
@@ -1228,7 +1228,7 @@ void WLED::handleConnection()
if (improvActive) {
if (improvError == 3) sendImprovStateResponse(0x00, true);
sendImprovStateResponse(0x04);
if (improvActive > 1) sendImprovRPCResponse(0x01);
if (improvActive > 1) sendImprovIPRPCResult(ImprovRPCType::Command_Wifi);
}
initInterfaces();
userConnected();