Compare commits

...

17 Commits

Author SHA1 Message Date
Frank
a42f78b08b Update CONTRIBUTING.md
Trying to explain why any PR should have a`description`
2024-03-14 20:27:03 +01:00
Blaz Kristan
9d70ec56f2 Distinguish 160MHz binaries 2024-03-11 23:22:14 +01:00
Blaz Kristan
7f8ec59939 Changelog update 2024-03-11 23:08:50 +01:00
Blaz Kristan
0398ec40b7 Merge branch 'main' into v0142-beta2 2024-03-11 23:00:17 +01:00
Blaz Kristan
f55465f8b8 Fix AsyncWebServer library 2024-03-11 18:02:03 +01:00
Christian Schwinne
6322ab9f07 . 2024-03-09 22:00:18 +01:00
Christian Schwinne
21d0f10dd7 Fix AR compilation 2024-03-09 21:59:45 +01:00
Christian Schwinne
91c11a18e0 Update CONTRIBUTING.md 2024-03-09 21:31:53 +01:00
Will Miles
d9b0df94e2 LockedJsonResponse: Release early if possible
Release the json buffer lock as soon as we've finished serializing.
This should slightly reduce the number of lock collisions as the
response class isn't destructed until after the last packet is ack'd.
2024-03-03 10:58:40 +01:00
Blaz Kristan
1fc0680c71 160MHz clock & alternate AWS 2024-03-02 14:12:57 +01:00
Will Miles
c8c394b4e9 TZ_TABLE: Add missing const 2024-02-20 18:33:18 +01:00
Will Miles
59886a1528 Move timezone table to PROGMEM 2024-02-20 18:33:09 +01:00
Blaz Kristan
a4733b4d91 Move strings into flash 2024-02-18 14:25:07 +01:00
Blaz Kristan
c932621b5d string fix 2024-02-17 15:00:47 +01:00
Frank
8422ffcd19 Fixing a potential array bounds violation in ESPDMX
DMXESPSerial::write and DMXESPSerial::read could access DMXDataStore[512] -   one more than the allocated number of elements (i.e. 0...511].
2024-02-15 00:53:00 +01:00
Blaž Kristan
0a815179a2 Merge pull request #3758 from lost-hope/main
Fixing stairway usermod and adding buildflags
2024-02-14 09:45:52 +01:00
lost-hope
23aad24027 Fixing stairway usermod and adding buildflags
Fixing Stairway:
missing setup function

Adding builflags:
USERMOD_STAIRCASE_WIPE to install the usermod
2024-02-12 22:41:13 +01:00
17 changed files with 1452 additions and 947 deletions

View File

@@ -1,5 +1,14 @@
## WLED changelog
#### Build 2403110
- Beta WLED 0.14.2-b2
- New AsyncWebServer (improved performance and reduced memory use)
- New builds for ESP8266 with 160MHz CPU clock
- Fixing stairway usermod and adding buildflags (#3758 by @lost-hope)
- Fixing a potential array bounds violation in ESPDMX
- Reduced RAM usage (moved strings and TZ data (by @willmmiles) to PROGMEM)
- LockedJsonResponse: Release early if possible (by @willmmiles)
#### Build 2402120
- Beta WLED 0.14.2-b1
- Possible fix for #3589 & partial fix for #3605

View File

@@ -2,6 +2,20 @@
Here are a few suggestions to make it easier for you to contribute!
### Describe your PR
Please add a description of your proposed code changes. It does not need to be an exhaustive essay, however a PR with no description or just a few words might not get accepted, simply because very basic information is missing.
A good description helps us to review and understand your proposed changes. For example, you could say a few words about
* what you try to achieve (new feature, fixing a bug, refactoring, security enhancements, etc.)
* how your code works (short technical summary - focus on important aspects that might not be obvious when reading the code)
* testing you performed, known limitations, open ends you possibly could not solve.
* any areas where you like to get help from an experienced maintainer (yes WLED has become big 😉)
### Target branch for pull requests
Please make all PRs against the `0_15` branch.
### Code style
When in doubt, it is easiest to replicate the code style you find in the files you want to edit :)
@@ -73,6 +87,6 @@ Good:
<!-- This is an HTML comment -->
```
There is no set character limit for a comment within a line,
though as a rule of thumb you should wrap your comment if it exceeds the width of your editor window.
Inline comments are OK if they describe that line only and are not exceedingly wide.
There is no hard character limit for a comment within a line,
though as a rule of thumb consider wrapping after 120 characters.
Inline comments are OK if they describe that line only and are not exceedingly wide.

1605
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "wled",
"version": "0.14.2-b1",
"version": "0.14.2-b2",
"description": "Tools for WLED project",
"main": "tools/cdata.js",
"directories": {

View File

@@ -11,7 +11,7 @@
# CI binaries
; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth # ESP32 variant builds are temporarily excluded from CI due to toolchain issues on the GitHub Actions Linux environment
default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi
default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, nodemcuv2_160, esp8266_2m_160, esp01_1m_full_160, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi
# Release binaries
; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB
@@ -181,7 +181,7 @@ lib_deps =
fastled/FastLED @ 3.6.0
IRremoteESP8266 @ 2.8.2
makuna/NeoPixelBus @ 2.7.5
https://github.com/Aircoookie/ESPAsyncWebServer.git @ ~2.0.7
https://github.com/Aircoookie/ESPAsyncWebServer.git @ ^2.1.0
#For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line
#TFT_eSPI
#For compatible OLED display uncomment following
@@ -245,7 +245,7 @@ lib_deps =
${env.lib_deps}
# additional build flags for audioreactive
AR_build_flags = -D USERMOD_AUDIOREACTIVE -D UM_AUDIOREACTIVE_USE_NEW_FFT
AR_lib_deps = https://github.com/kosme/arduinoFFT#develop @ ^1.9.2
AR_lib_deps = https://github.com/kosme/arduinoFFT#419d7b0
[esp32_idf_V4]
;; experimental build environment for ESP32 using ESP-IDF 4.4.x / arduino-esp32 v2.0.5
@@ -337,6 +337,11 @@ build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266 #-DWLED
lib_deps = ${esp8266.lib_deps}
monitor_filters = esp8266_exception_decoder
[env:nodemcuv2_160]
extends = env:nodemcuv2
board_build.f_cpu = 160000000L
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266_160 #-DWLED_DISABLE_2D
[env:esp8266_2m]
board = esp_wroom_02
platform = ${common.platform_wled_default}
@@ -346,6 +351,11 @@ build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP02
lib_deps = ${esp8266.lib_deps}
[env:esp8266_2m_160]
extends = env:esp8266_2m
board_build.f_cpu = 160000000L
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP02_160
[env:esp01_1m_full]
board = esp01_1m
platform = ${common.platform_wled_default}
@@ -356,6 +366,12 @@ build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP01 -D WLED_D
; -D WLED_USE_UNREAL_MATH ;; may cause wrong sunset/sunrise times, but saves 7064 bytes FLASH and 975 bytes RAM
lib_deps = ${esp8266.lib_deps}
[env:esp01_1m_full_160]
extends = env:esp01_1m_full
board_build.f_cpu = 160000000L
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP01_160 -D WLED_DISABLE_OTA
; -D WLED_USE_UNREAL_MATH ;; may cause wrong sunset/sunrise times, but saves 7064 bytes FLASH and 975 bytes RAM
[env:esp07]
board = esp07
platform = ${common.platform_wled_default}

View File

@@ -1,5 +1,13 @@
### Stairway lighting
# Stairway lighting
## Install
Add the buildflag `-D USERMOD_STAIRCASE_WIPE` to your enviroment to activate it.
### Configuration
`-D STAIRCASE_WIPE_OFF`
<br>Have the LEDs wipe off instead of fading out
## Description
Quick usermod to accomplish something similar to [this video](https://www.youtube.com/watch?v=NHkju5ncC4A).
This usermod enables you to add a lightstrip alongside or on the steps of a staircase.

View File

@@ -19,10 +19,12 @@ class StairwayWipeUsermod : public Usermod {
unsigned long timeStaticStart = 0;
uint16_t previousUserVar0 = 0;
//moved to buildflag
//comment this out if you want the turn off effect to be just fading out instead of reverse wipe
#define STAIRCASE_WIPE_OFF
//#define STAIRCASE_WIPE_OFF
public:
void setup() {
}
void loop() {
//userVar0 (U0 in HTTP API):
//has to be set to 1 if movement is detected on the PIR that is the same side of the staircase as the ESP8266
@@ -84,7 +86,7 @@ class StairwayWipeUsermod : public Usermod {
uint16_t getId()
{
return USERMOD_ID_EXAMPLE;
return USERMOD_ID_STAIRWAY_WIPE;
}

View File

@@ -151,6 +151,7 @@
#define USERMOD_ID_WIREGUARD 41 //Usermod "wireguard.h"
#define USERMOD_ID_INTERNAL_TEMPERATURE 42 //Usermod "usermod_internal_temperature.h"
#define USERMOD_ID_LDR_DUSK_DAWN 43 //Usermod "usermod_LDR_Dusk_Dawn_v2.h"
#define USERMOD_ID_STAIRWAY_WIPE 44 //Usermod "stairway-wipe-usermod-v2.h"
//Access point behavior
#define AP_BEHAVIOR_BOOT_NO_CONN 0 //Open AP when no connection after boot

View File

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

View File

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

View File

@@ -210,7 +210,7 @@ void sendImprovInfoResponse() {
//Use serverDescription if it has been changed from the default "WLED", else mDNS name
bool useMdnsName = (strcmp(serverDescription, "WLED") == 0 && strlen(cmDNS) > 0);
char vString[20];
sprintf_P(vString, PSTR("0.14.2-b1/%i"), VERSION);
sprintf_P(vString, PSTR("0.14.2-b2/%i"), VERSION);
const char *str[4] = {"WLED", vString, bString, useMdnsName ? cmDNS : serverDescription};
sendImprovRPCResult(ImprovRPCType::Request_Info, 4, str);

View File

@@ -1022,14 +1022,26 @@ void serializeModeNames(JsonArray arr)
// Global buffer locking response helper class (to make sure lock is released when AsyncJsonResponse is destroyed)
class LockedJsonResponse: public AsyncJsonResponse {
bool _holding_lock;
public:
// WARNING: constructor assumes requestJSONBufferLock() was successfully acquired externally/prior to constructing the instance
// Not a good practice with C++. Unfortunately AsyncJsonResponse only has 2 constructors - for dynamic buffer or existing buffer,
// with existing buffer it clears its content during construction
// if the lock was not acquired (using JSONBufferGuard class) previous implementation still cleared existing buffer
inline LockedJsonResponse(JsonDocument *doc, bool isArray) : AsyncJsonResponse(doc, isArray) {};
inline LockedJsonResponse(JsonDocument* doc, bool isArray) : AsyncJsonResponse(doc, isArray), _holding_lock(true) {};
virtual size_t _fillBuffer(uint8_t *buf, size_t maxLen) {
size_t result = AsyncJsonResponse::_fillBuffer(buf, maxLen);
// Release lock as soon as we're done filling content
if (((result + _sentLength) >= (_contentLength)) && _holding_lock) {
releaseJSONBufferLock();
_holding_lock = false;
}
return result;
}
// destructor will remove JSON buffer lock when response is destroyed in AsyncWebServer
virtual ~LockedJsonResponse() { releaseJSONBufferLock(); };
virtual ~LockedJsonResponse() { if (_holding_lock) releaseJSONBufferLock(); };
};
void serveJson(AsyncWebServerRequest* request)
@@ -1051,10 +1063,10 @@ void serveJson(AsyncWebServerRequest* request)
}
#endif
else if (url.indexOf("pal") > 0) {
request->send_P(200, "application/json", JSON_palette_names);
request->send_P(200, F("application/json"), JSON_palette_names);
return;
}
else if (url.indexOf("cfg") > 0 && handleFileRead(request, "/cfg.json")) {
else if (url.indexOf("cfg") > 0 && handleFileRead(request, F("/cfg.json"))) {
return;
}
else if (url.length() > 6) { //not just /json
@@ -1081,7 +1093,7 @@ void serveJson(AsyncWebServerRequest* request)
case JSON_PATH_NODES:
serializeNodes(lDoc); break;
case JSON_PATH_PALETTES:
serializePalettes(lDoc, request->hasParam("page") ? request->getParam("page")->value().toInt() : 0); break;
serializePalettes(lDoc, request->hasParam(F("page")) ? request->getParam(F("page"))->value().toInt() : 0); break;
case JSON_PATH_EFFECTS:
serializeModeNames(lDoc); break;
case JSON_PATH_FXDATA:
@@ -1150,7 +1162,7 @@ bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient)
oappendi(n);
oappend("}");
if (request) {
request->send(200, "application/json", buffer);
request->send(200, F("application/json"), buffer);
}
#ifdef WLED_ENABLE_WEBSOCKETS
else {

View File

@@ -48,129 +48,118 @@ Timezone* tz;
#define TZ_ANCHORAGE 20
#define TZ_MX_CENTRAL 21
#define TZ_PAKISTAN 22
#define TZ_COUNT 23
#define TZ_INIT 255
byte tzCurrent = TZ_INIT; //uninitialized
/* C++11 form -- static std::array<std::pair<TimeChangeRule, TimeChangeRule>, TZ_COUNT> TZ_TABLE PROGMEM = {{ */
static const std::pair<TimeChangeRule, TimeChangeRule> TZ_TABLE[] PROGMEM = {
/* TZ_UTC */ {
{Last, Sun, Mar, 1, 0}, // UTC
{Last, Sun, Mar, 1, 0} // Same
},
/* TZ_UK */ {
{Last, Sun, Mar, 1, 60}, //British Summer Time
{Last, Sun, Oct, 2, 0} //Standard Time
},
/* TZ_EUROPE_CENTRAL */ {
{Last, Sun, Mar, 2, 120}, //Central European Summer Time
{Last, Sun, Oct, 3, 60} //Central European Standard Time
},
/* TZ_EUROPE_EASTERN */ {
{Last, Sun, Mar, 3, 180}, //East European Summer Time
{Last, Sun, Oct, 4, 120} //East European Standard Time
},
/* TZ_US_EASTERN */ {
{Second, Sun, Mar, 2, -240}, //EDT = UTC - 4 hours
{First, Sun, Nov, 2, -300} //EST = UTC - 5 hours
},
/* TZ_US_CENTRAL */ {
{Second, Sun, Mar, 2, -300}, //CDT = UTC - 5 hours
{First, Sun, Nov, 2, -360} //CST = UTC - 6 hours
},
/* TZ_US_MOUNTAIN */ {
{Second, Sun, Mar, 2, -360}, //MDT = UTC - 6 hours
{First, Sun, Nov, 2, -420} //MST = UTC - 7 hours
},
/* TZ_US_ARIZONA */ {
{First, Sun, Nov, 2, -420}, //MST = UTC - 7 hours
{First, Sun, Nov, 2, -420} //MST = UTC - 7 hours
},
/* TZ_US_PACIFIC */ {
{Second, Sun, Mar, 2, -420}, //PDT = UTC - 7 hours
{First, Sun, Nov, 2, -480} //PST = UTC - 8 hours
},
/* TZ_CHINA */ {
{Last, Sun, Mar, 1, 480}, //CST = UTC + 8 hours
{Last, Sun, Mar, 1, 480}
},
/* TZ_JAPAN */ {
{Last, Sun, Mar, 1, 540}, //JST = UTC + 9 hours
{Last, Sun, Mar, 1, 540}
},
/* TZ_AUSTRALIA_EASTERN */ {
{First, Sun, Oct, 2, 660}, //AEDT = UTC + 11 hours
{First, Sun, Apr, 3, 600} //AEST = UTC + 10 hours
},
/* TZ_NEW_ZEALAND */ {
{Last, Sun, Sep, 2, 780}, //NZDT = UTC + 13 hours
{First, Sun, Apr, 3, 720} //NZST = UTC + 12 hours
},
/* TZ_NORTH_KOREA */ {
{Last, Sun, Mar, 1, 510}, //Pyongyang Time = UTC + 8.5 hours
{Last, Sun, Mar, 1, 510}
},
/* TZ_INDIA */ {
{Last, Sun, Mar, 1, 330}, //India Standard Time = UTC + 5.5 hours
{Last, Sun, Mar, 1, 330}
},
/* TZ_SASKACHEWAN */ {
{First, Sun, Nov, 2, -360}, //CST = UTC - 6 hours
{First, Sun, Nov, 2, -360}
},
/* TZ_AUSTRALIA_NORTHERN */ {
{First, Sun, Apr, 3, 570}, //ACST = UTC + 9.5 hours
{First, Sun, Apr, 3, 570}
},
/* TZ_AUSTRALIA_SOUTHERN */ {
{First, Sun, Oct, 2, 630}, //ACDT = UTC + 10.5 hours
{First, Sun, Apr, 3, 570} //ACST = UTC + 9.5 hours
},
/* TZ_HAWAII */ {
{Last, Sun, Mar, 1, -600}, //HST = UTC - 10 hours
{Last, Sun, Mar, 1, -600}
},
/* TZ_NOVOSIBIRSK */ {
{Last, Sun, Mar, 1, 420}, //CST = UTC + 7 hours
{Last, Sun, Mar, 1, 420}
},
/* TZ_ANCHORAGE */ {
{Second, Sun, Mar, 2, -480}, //AKDT = UTC - 8 hours
{First, Sun, Nov, 2, -540} //AKST = UTC - 9 hours
},
/* TZ_MX_CENTRAL */ {
{First, Sun, Apr, 2, -360}, //CST = UTC - 6 hours
{First, Sun, Apr, 2, -360}
},
/* TZ_PAKISTAN */ {
{Last, Sun, Mar, 1, 300}, //Pakistan Standard Time = UTC + 5 hours
{Last, Sun, Mar, 1, 300}
}
};
void updateTimezone() {
delete tz;
TimeChangeRule tcrDaylight = {Last, Sun, Mar, 1, 0}; //UTC
TimeChangeRule tcrStandard = tcrDaylight; //UTC
switch (currentTimezone) {
case TZ_UK : {
tcrDaylight = {Last, Sun, Mar, 1, 60}; //British Summer Time
tcrStandard = {Last, Sun, Oct, 2, 0}; //Standard Time
break;
}
case TZ_EUROPE_CENTRAL : {
tcrDaylight = {Last, Sun, Mar, 2, 120}; //Central European Summer Time
tcrStandard = {Last, Sun, Oct, 3, 60}; //Central European Standard Time
break;
}
case TZ_EUROPE_EASTERN : {
tcrDaylight = {Last, Sun, Mar, 3, 180}; //East European Summer Time
tcrStandard = {Last, Sun, Oct, 4, 120}; //East European Standard Time
break;
}
case TZ_US_EASTERN : {
tcrDaylight = {Second, Sun, Mar, 2, -240}; //EDT = UTC - 4 hours
tcrStandard = {First, Sun, Nov, 2, -300}; //EST = UTC - 5 hours
break;
}
case TZ_US_CENTRAL : {
tcrDaylight = {Second, Sun, Mar, 2, -300}; //CDT = UTC - 5 hours
tcrStandard = {First, Sun, Nov, 2, -360}; //CST = UTC - 6 hours
break;
}
case TZ_US_MOUNTAIN : {
tcrDaylight = {Second, Sun, Mar, 2, -360}; //MDT = UTC - 6 hours
tcrStandard = {First, Sun, Nov, 2, -420}; //MST = UTC - 7 hours
break;
}
case TZ_US_ARIZONA : {
tcrDaylight = {First, Sun, Nov, 2, -420}; //MST = UTC - 7 hours
tcrStandard = {First, Sun, Nov, 2, -420}; //MST = UTC - 7 hours
break;
}
case TZ_US_PACIFIC : {
tcrDaylight = {Second, Sun, Mar, 2, -420}; //PDT = UTC - 7 hours
tcrStandard = {First, Sun, Nov, 2, -480}; //PST = UTC - 8 hours
break;
}
case TZ_CHINA : {
tcrDaylight = {Last, Sun, Mar, 1, 480}; //CST = UTC + 8 hours
tcrStandard = tcrDaylight;
break;
}
case TZ_JAPAN : {
tcrDaylight = {Last, Sun, Mar, 1, 540}; //JST = UTC + 9 hours
tcrStandard = tcrDaylight;
break;
}
case TZ_AUSTRALIA_EASTERN : {
tcrDaylight = {First, Sun, Oct, 2, 660}; //AEDT = UTC + 11 hours
tcrStandard = {First, Sun, Apr, 3, 600}; //AEST = UTC + 10 hours
break;
}
case TZ_NEW_ZEALAND : {
tcrDaylight = {Last, Sun, Sep, 2, 780}; //NZDT = UTC + 13 hours
tcrStandard = {First, Sun, Apr, 3, 720}; //NZST = UTC + 12 hours
break;
}
case TZ_NORTH_KOREA : {
tcrDaylight = {Last, Sun, Mar, 1, 510}; //Pyongyang Time = UTC + 8.5 hours
tcrStandard = tcrDaylight;
break;
}
case TZ_INDIA : {
tcrDaylight = {Last, Sun, Mar, 1, 330}; //India Standard Time = UTC + 5.5 hours
tcrStandard = tcrDaylight;
break;
}
case TZ_SASKACHEWAN : {
tcrDaylight = {First, Sun, Nov, 2, -360}; //CST = UTC - 6 hours
tcrStandard = tcrDaylight;
break;
}
case TZ_AUSTRALIA_NORTHERN : {
tcrDaylight = {First, Sun, Apr, 3, 570}; //ACST = UTC + 9.5 hours
tcrStandard = tcrDaylight;
break;
}
case TZ_AUSTRALIA_SOUTHERN : {
tcrDaylight = {First, Sun, Oct, 2, 630}; //ACDT = UTC + 10.5 hours
tcrStandard = {First, Sun, Apr, 3, 570}; //ACST = UTC + 9.5 hours
break;
}
case TZ_HAWAII : {
tcrDaylight = {Last, Sun, Mar, 1, -600}; //HST = UTC - 10 hours
tcrStandard = tcrDaylight;
break;
}
case TZ_NOVOSIBIRSK : {
tcrDaylight = {Last, Sun, Mar, 1, 420}; //CST = UTC + 7 hours
tcrStandard = tcrDaylight;
break;
}
case TZ_ANCHORAGE : {
tcrDaylight = {Second, Sun, Mar, 2, -480}; //AKDT = UTC - 8 hours
tcrStandard = {First, Sun, Nov, 2, -540}; //AKST = UTC - 9 hours
break;
}
case TZ_MX_CENTRAL : {
tcrDaylight = {First, Sun, Apr, 2, -360}; //CST = UTC - 6 hours
tcrStandard = tcrDaylight;
break;
}
case TZ_PAKISTAN : {
tcrDaylight = {Last, Sun, Mar, 1, 300}; //Pakistan Standard Time = UTC + 5 hours
tcrStandard = tcrDaylight;
break;
}
TimeChangeRule tcrDaylight, tcrStandard;
auto tz_table_entry = currentTimezone;
if (tz_table_entry >= TZ_COUNT) {
tz_table_entry = 0;
}
tzCurrent = currentTimezone;
memcpy_P(&tcrDaylight, &TZ_TABLE[tz_table_entry].first, sizeof(tcrDaylight));
memcpy_P(&tcrStandard, &TZ_TABLE[tz_table_entry].second, sizeof(tcrStandard));
tz = new Timezone(tcrDaylight, tcrStandard);
}

View File

@@ -30,8 +30,8 @@
bool dmxStarted = false;
int sendPin = 2; //default on ESP8266
//DMX value array and size. Entry 0 will hold startbyte
uint8_t dmxDataStore[dmxMaxChannel] = {};
//DMX value array and size. Entry 0 will hold startbyte, so we need 512+1 elements
uint8_t dmxDataStore[dmxMaxChannel+1] = {};
int channelSize;
@@ -106,4 +106,4 @@ void DMXESPSerial::update() {
// Function to update the DMX bus
#endif
#endif

View File

@@ -201,6 +201,9 @@
#include "../usermods/LDR_Dusk_Dawn_v2/usermod_LDR_Dusk_Dawn_v2.h"
#endif
#ifdef USERMOD_STAIRCASE_WIPE
#include "../usermods/stairway_wipe_basic/stairway-wipe-usermod-v2.h"
#endif
void registerUsermods()
{
/*
@@ -380,4 +383,8 @@ void registerUsermods()
#ifdef USERMOD_LDR_DUSK_DAWN
usermods.add(new LDR_Dusk_Dawn_v2());
#endif
#ifdef USERMOD_STAIRCASE_WIPE
usermods.add(new StairwayWipeUsermod());
#endif
}

View File

@@ -3,12 +3,12 @@
/*
Main sketch, global variable declarations
@title WLED project sketch
@version 0.14.1
@version 0.14.2-b1
@author Christian Schwinne
*/
// version code in format yymmddb (b = daily build)
#define VERSION 2402120
#define VERSION 2403110
//uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG

View File

@@ -80,13 +80,13 @@ void createEditHandler(bool enable) {
editHandler = &server.addHandler(new SPIFFSEditor("","",WLED_FS));//http_username,http_password));
#endif
#else
editHandler = &server.on("/edit", HTTP_GET, [](AsyncWebServerRequest *request){
editHandler = &server.on(SET_F("/edit"), HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 501, "Not implemented", F("The FS editor is disabled in this build."), 254);
});
#endif
} else {
editHandler = &server.on("/edit", HTTP_ANY, [](AsyncWebServerRequest *request){
serveMessage(request, 401, "Access Denied", FPSTR(s_unlock_cfg), 254);
editHandler = &server.on(SET_F("/edit"), HTTP_ANY, [](AsyncWebServerRequest *request){
serveMessage(request, 401, F("Access Denied"), FPSTR(s_unlock_cfg), 254);
});
}
}
@@ -95,11 +95,11 @@ bool captivePortal(AsyncWebServerRequest *request)
{
if (ON_STA_FILTER(request)) return false; //only serve captive in AP mode
String hostH;
if (!request->hasHeader("Host")) return false;
hostH = request->getHeader("Host")->value();
if (!request->hasHeader(F("Host"))) return false;
hostH = request->getHeader(F("Host"))->value();
if (!isIp(hostH) && hostH.indexOf("wled.me") < 0 && hostH.indexOf(cmDNS) < 0) {
DEBUG_PRINTLN("Captive portal");
if (!isIp(hostH) && hostH.indexOf(F("wled.me")) < 0 && hostH.indexOf(cmDNS) < 0) {
DEBUG_PRINTLN(F("Captive portal"));
AsyncWebServerResponse *response = request->beginResponse(302);
response->addHeader(F("Location"), F("http://4.3.2.1"));
request->send(response);
@@ -117,7 +117,7 @@ void initServer()
#ifdef WLED_ENABLE_WEBSOCKETS
#ifndef WLED_DISABLE_2D
server.on("/liveview2D", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/liveview2D"), HTTP_GET, [](AsyncWebServerRequest *request){
if (handleIfNoneMatchCacheHeader(request)) return;
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_liveviewws2D, PAGE_liveviewws2D_length);
response->addHeader(FPSTR(s_content_enc),"gzip");
@@ -126,7 +126,7 @@ void initServer()
});
#endif
#endif
server.on("/liveview", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/liveview"), HTTP_GET, [](AsyncWebServerRequest *request){
if (handleIfNoneMatchCacheHeader(request)) return;
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_liveview, PAGE_liveview_length);
response->addHeader(FPSTR(s_content_enc),"gzip");
@@ -135,13 +135,13 @@ void initServer()
});
//settings page
server.on("/settings", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/settings"), HTTP_GET, [](AsyncWebServerRequest *request){
serveSettings(request);
});
// "/settings/settings.js&p=x" request also handled by serveSettings()
server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/style.css"), HTTP_GET, [](AsyncWebServerRequest *request){
if (handleIfNoneMatchCacheHeader(request)) return;
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/css", PAGE_settingsCss, PAGE_settingsCss_length);
response->addHeader(FPSTR(s_content_enc),"gzip");
@@ -149,31 +149,31 @@ void initServer()
request->send(response);
});
server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/favicon.ico"), HTTP_GET, [](AsyncWebServerRequest *request){
if(!handleFileRead(request, "/favicon.ico"))
{
request->send_P(200, "image/x-icon", favicon, 156);
}
});
server.on("/welcome", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/welcome"), HTTP_GET, [](AsyncWebServerRequest *request){
serveSettings(request);
});
server.on("/reset", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/reset"), HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 200,F("Rebooting now..."),F("Please wait ~10 seconds..."),129);
doReboot = true;
});
server.on("/settings", HTTP_POST, [](AsyncWebServerRequest *request){
server.on(SET_F("/settings"), HTTP_POST, [](AsyncWebServerRequest *request){
serveSettings(request, true);
});
server.on("/json", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/json"), HTTP_GET, [](AsyncWebServerRequest *request){
serveJson(request);
});
AsyncCallbackJsonWebHandler* handler = new AsyncCallbackJsonWebHandler("/json", [](AsyncWebServerRequest *request) {
AsyncCallbackJsonWebHandler* handler = new AsyncCallbackJsonWebHandler(F("/json"), [](AsyncWebServerRequest *request) {
bool verboseResponse = false;
bool isConfig = false;
@@ -222,15 +222,15 @@ void initServer()
}, JSON_BUFFER_SIZE);
server.addHandler(handler);
server.on("/version", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/version"), HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", (String)VERSION);
});
server.on("/uptime", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/uptime"), HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", (String)millis());
});
server.on("/freeheap", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/freeheap"), HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", (String)ESP.getFreeHeap());
});
@@ -244,17 +244,17 @@ void initServer()
});
#endif
server.on("/teapot", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/teapot"), HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 418, F("418. I'm a teapot."), F("(Tangible Embedded Advanced Project Of Twinkling)"), 254);
});
server.on("/upload", HTTP_POST, [](AsyncWebServerRequest *request) {},
server.on(SET_F("/upload"), HTTP_POST, [](AsyncWebServerRequest *request) {},
[](AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data,
size_t len, bool final) {handleUpload(request, filename, index, data, len, final);}
);
#ifdef WLED_ENABLE_SIMPLE_UI
server.on("/simple.htm", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/simple.htm"), HTTP_GET, [](AsyncWebServerRequest *request){
if (handleFileRead(request, "/simple.htm")) return;
if (handleIfNoneMatchCacheHeader(request)) return;
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_simple, PAGE_simple_L);
@@ -264,14 +264,14 @@ void initServer()
});
#endif
server.on("/iro.js", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/iro.js"), HTTP_GET, [](AsyncWebServerRequest *request){
AsyncWebServerResponse *response = request->beginResponse_P(200, "application/javascript", iroJs, iroJs_length);
response->addHeader(FPSTR(s_content_enc),"gzip");
setStaticContentCacheHeaders(response);
request->send(response);
});
server.on("/rangetouch.js", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/rangetouch.js"), HTTP_GET, [](AsyncWebServerRequest *request){
AsyncWebServerResponse *response = request->beginResponse_P(200, "application/javascript", rangetouchJs, rangetouchJs_length);
response->addHeader(FPSTR(s_content_enc),"gzip");
setStaticContentCacheHeaders(response);
@@ -282,20 +282,20 @@ void initServer()
#ifndef WLED_DISABLE_OTA
//init ota page
server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/update"), HTTP_GET, [](AsyncWebServerRequest *request){
if (otaLock) {
serveMessage(request, 401, "Access Denied", FPSTR(s_unlock_ota), 254);
serveMessage(request, 401, F("Access Denied"), FPSTR(s_unlock_ota), 254);
} else
serveSettings(request); // checks for "upd" in URL and handles PIN
});
server.on("/update", HTTP_POST, [](AsyncWebServerRequest *request){
server.on(SET_F("/update"), HTTP_POST, [](AsyncWebServerRequest *request){
if (!correctPIN) {
serveSettings(request, true); // handle PIN page POST request
return;
}
if (otaLock) {
serveMessage(request, 401, "Access Denied", FPSTR(s_unlock_ota), 254);
serveMessage(request, 401, F("Access Denied"), FPSTR(s_unlock_ota), 254);
return;
}
if (Update.hasError()) {
@@ -328,19 +328,19 @@ void initServer()
}
});
#else
server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 501, "Not implemented", F("OTA updating is disabled in this build."), 254);
server.on(SET_F("/update"), HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 501, F("Not implemented"), F("OTA updating is disabled in this build."), 254);
});
#endif
#ifdef WLED_ENABLE_DMX
server.on("/dmxmap", HTTP_GET, [](AsyncWebServerRequest *request){
server.on(SET_F("/dmxmap"), HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", PAGE_dmxmap , dmxProcessor);
});
#else
server.on("/dmxmap", HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 501, "Not implemented", F("DMX support is not enabled in this build."), 254);
server.on(SET_F("/dmxmap"), HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 501, F("Not implemented"), F("DMX support is not enabled in this build."), 254);
});
#endif
@@ -354,8 +354,8 @@ void initServer()
});
#ifdef WLED_ENABLE_PIXART
server.on("/pixart.htm", HTTP_GET, [](AsyncWebServerRequest *request){
if (handleFileRead(request, "/pixart.htm")) return;
server.on(SET_F("/pixart.htm"), HTTP_GET, [](AsyncWebServerRequest *request){
if (handleFileRead(request, F("/pixart.htm"))) return;
if (handleIfNoneMatchCacheHeader(request)) return;
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_pixart, PAGE_pixart_L);
response->addHeader(FPSTR(s_content_enc),"gzip");
@@ -365,8 +365,8 @@ void initServer()
#endif
#ifndef WLED_DISABLE_PXMAGIC
server.on("/pxmagic.htm", HTTP_GET, [](AsyncWebServerRequest *request){
if (handleFileRead(request, "/pxmagic.htm")) return;
server.on(SET_F("/pxmagic.htm"), HTTP_GET, [](AsyncWebServerRequest *request){
if (handleFileRead(request, F("/pxmagic.htm"))) return;
if (handleIfNoneMatchCacheHeader(request)) return;
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_pxmagic, PAGE_pxmagic_L);
response->addHeader(FPSTR(s_content_enc),"gzip");
@@ -375,8 +375,8 @@ void initServer()
});
#endif
server.on("/cpal.htm", HTTP_GET, [](AsyncWebServerRequest *request){
if (handleFileRead(request, "/cpal.htm")) return;
server.on(SET_F("/cpal.htm"), HTTP_GET, [](AsyncWebServerRequest *request){
if (handleFileRead(request, F("/cpal.htm"))) return;
if (handleIfNoneMatchCacheHeader(request)) return;
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", PAGE_cpal, PAGE_cpal_L);
response->addHeader(FPSTR(s_content_enc),"gzip");
@@ -442,7 +442,7 @@ void setStaticContentCacheHeaders(AsyncWebServerResponse *response)
void serveIndex(AsyncWebServerRequest* request)
{
if (handleFileRead(request, "/index.htm")) return;
if (handleFileRead(request, F("/index.htm"))) return;
if (handleIfNoneMatchCacheHeader(request)) return;
@@ -586,7 +586,7 @@ void serveSettings(AsyncWebServerRequest* request, bool post)
// if OTA locked or too frequent PIN entry requests fail hard
if ((subPage == SUBPAGE_WIFI && wifiLock && otaLock) || (post && !correctPIN && millis()-lastEditTime < PIN_RETRY_COOLDOWN))
{
serveMessage(request, 401, "Access Denied", FPSTR(s_unlock_ota), 254); return;
serveMessage(request, 401, F("Access Denied"), FPSTR(s_unlock_ota), 254); return;
}
if (post) { //settings/set POST request, saving