Merge remote-tracking branch 'upstream/mdev' into animartrix-library

This commit is contained in:
Will Tatam
2023-05-29 15:09:11 +01:00
21 changed files with 2116 additions and 1979 deletions

View File

@@ -13,14 +13,14 @@
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git+https://github.com/Aircoookie/WLED.git" "url": "git+https://github.com/MoonModules/WLED.git"
}, },
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"bugs": { "bugs": {
"url": "https://github.com/Aircoookie/WLED/issues" "url": "https://github.com/MoonModules/WLED/issues"
}, },
"homepage": "https://github.com/Aircoookie/WLED#readme", "homepage": "https://github.com/MoonModules/WLED#readme",
"dependencies": { "dependencies": {
"clean-css": "^4.2.3", "clean-css": "^4.2.3",
"html-minifier-terser": "^5.1.1", "html-minifier-terser": "^5.1.1",

View File

@@ -146,7 +146,7 @@ build_flags =
-DSECURE_CLIENT=SECURE_CLIENT_BEARSSL -DSECURE_CLIENT=SECURE_CLIENT_BEARSSL
-DBEARSSL_SSL_BASIC -DBEARSSL_SSL_BASIC
-D CORE_DEBUG_LEVEL=0 -D CORE_DEBUG_LEVEL=0
-D NDEBUG ;-D NDEBUG ;; WLEDMM espressif docs say NDEBUG is not recommended. see https://docs.espressif.com/projects/esp-idf/en/v4.4.4/esp32/api-guides/performance/speed.html#not-recommended
#build_flags for the IRremoteESP8266 library (enabled decoders have to appear here) #build_flags for the IRremoteESP8266 library (enabled decoders have to appear here)
-D _IR_ENABLE_DEFAULT_=false -D _IR_ENABLE_DEFAULT_=false
-D DECODE_HASH=true -D DECODE_HASH=true
@@ -825,7 +825,7 @@ build_flags_S =
; -D WLED_ENABLE_DMX ; -D WLED_ENABLE_DMX
lib_deps_S = lib_deps_S =
https://github.com/kosme/arduinoFFT#develop @ 1.9.2+sha.e5e4c74 ; used for USERMOD_AUDIOREACTIVE - using "known working" hash https://github.com/kosme/arduinoFFT#develop @ 1.9.2+sha.419d7b0 ; used for USERMOD_AUDIOREACTIVE - using "known working" hash
build_flags_M = build_flags_M =
-D WLED_MAX_USERMODS=25 ; default only 4-6, also for _XL configs takes 25 pointers in memory -D WLED_MAX_USERMODS=25 ; default only 4-6, also for _XL configs takes 25 pointers in memory
@@ -974,6 +974,7 @@ build_flags =
[Debug_Flags] [Debug_Flags]
build_flags = build_flags =
-DDEBUG=1 ;; enable some debug assertions in the platform core
-D WLED_DEBUG ; lots of generic debug messages -D WLED_DEBUG ; lots of generic debug messages
-D SR_DEBUG ; some extra debug messages from audioreactive -D SR_DEBUG ; some extra debug messages from audioreactive
; -D MIC_LOGGER ; for sound input monitoring & debugging (use arduino serial plotter) ; -D MIC_LOGGER ; for sound input monitoring & debugging (use arduino serial plotter)

View File

@@ -63,6 +63,7 @@ function adoptVersionAndRepo(html) {
// Replace we // Replace we
html = strReplace(html, "https://github.com/atuline/WLED", repoUrl); html = strReplace(html, "https://github.com/atuline/WLED", repoUrl);
html = strReplace(html, "https://github.com/Aircoookie/WLED", repoUrl); html = strReplace(html, "https://github.com/Aircoookie/WLED", repoUrl);
html = strReplace(html, "https://github.com/MoonModules/WLED", repoUrl); //WLEDMM
} }
let version = packageJson.version; let version = packageJson.version;
if (version) { if (version) {

View File

@@ -294,6 +294,7 @@ static float windowWeighingFactors[samplesFFT] = {0.0f};
//#define FFT_SQRT_APPROXIMATION // enables "quake3" style inverse sqrt - WLEDMM slower on ESP32 //#define FFT_SQRT_APPROXIMATION // enables "quake3" style inverse sqrt - WLEDMM slower on ESP32
#endif #endif
#define sqrt(x) sqrtf(x) // little hack that reduces FFT time by 10-50% on ESP32 (as alternative to FFT_SQRT_APPROXIMATION) #define sqrt(x) sqrtf(x) // little hack that reduces FFT time by 10-50% on ESP32 (as alternative to FFT_SQRT_APPROXIMATION)
#define sqrt_internal sqrtf // see https://github.com/kosme/arduinoFFT/pull/83
#else #else
// around 50% slower on -S2 // around 50% slower on -S2
// lib_deps += https://github.com/blazoncek/arduinoFFT.git // lib_deps += https://github.com/blazoncek/arduinoFFT.git

View File

@@ -106,6 +106,9 @@
#endif #endif
// max number of samples for a single i2s_read --> size of global buffer.
#define I2S_SAMPLES_MAX 512 // same as samplesFFT
/* Interface class /* Interface class
AudioSource serves as base class for all microphone types AudioSource serves as base class for all microphone types
This enables accessing all microphones with one single interface This enables accessing all microphones with one single interface
@@ -162,6 +165,7 @@ class AudioSource {
bool _initialized; // Gets set to true if initialization is successful bool _initialized; // Gets set to true if initialization is successful
bool _i2sMaster; // when false, ESP32 will be in I2S SLAVE mode (for devices that only operate in MASTER mode). Only workds in newer IDF >= 4.4.x bool _i2sMaster; // when false, ESP32 will be in I2S SLAVE mode (for devices that only operate in MASTER mode). Only workds in newer IDF >= 4.4.x
float _sampleScale; // pre-scaling factor for I2S samples float _sampleScale; // pre-scaling factor for I2S samples
I2S_datatype newSampleBuffer[I2S_SAMPLES_MAX+4] = { 0 }; // global buffer for i2s_read
}; };
/* Basic I2S microphone source /* Basic I2S microphone source
@@ -345,17 +349,20 @@ class I2SSource : public AudioSource {
if (_initialized) { if (_initialized) {
esp_err_t err; esp_err_t err;
size_t bytes_read = 0; /* Counter variable to check if we actually got enough data */ size_t bytes_read = 0; /* Counter variable to check if we actually got enough data */
I2S_datatype newSamples[num_samples]; /* Intermediary sample storage */
err = i2s_read(I2S_NUM_0, (void *)newSamples, sizeof(newSamples), &bytes_read, portMAX_DELAY); memset(buffer, 0, sizeof(float) * num_samples); // clear output buffer
I2S_datatype *newSamples = newSampleBuffer; // use global input buffer
if (num_samples > I2S_SAMPLES_MAX) num_samples = I2S_SAMPLES_MAX; // protect the buffer from overflow
err = i2s_read(I2S_NUM_0, (void *)newSamples, num_samples * sizeof(I2S_datatype), &bytes_read, portMAX_DELAY);
if (err != ESP_OK) { if (err != ESP_OK) {
DEBUGSR_PRINTF("Failed to get samples: %d\n", err); DEBUGSR_PRINTF("Failed to get samples: %d\n", err);
return; return;
} }
// For correct operation, we need to read exactly sizeof(samples) bytes from i2s // For correct operation, we need to read exactly sizeof(samples) bytes from i2s
if (bytes_read != sizeof(newSamples)) { if (bytes_read != (num_samples * sizeof(I2S_datatype))) {
DEBUGSR_PRINTF("Failed to get enough samples: wanted: %d read: %d\n", sizeof(newSamples), bytes_read); DEBUGSR_PRINTF("Failed to get enough samples: wanted: %d read: %d\n", num_samples * sizeof(I2S_datatype), bytes_read);
return; return;
} }
@@ -520,27 +527,74 @@ class ES8388Source : public I2SSource {
void _es8388InitAdc() { void _es8388InitAdc() {
// https://dl.radxa.com/rock2/docs/hw/ds/ES8388%20user%20Guide.pdf Section 10.1 // https://dl.radxa.com/rock2/docs/hw/ds/ES8388%20user%20Guide.pdf Section 10.1
// http://www.everest-semi.com/pdf/ES8388%20DS.pdf Better spec sheet, more clear.
// https://docs.google.com/spreadsheets/d/1CN3MvhkcPVESuxKyx1xRYqfUit5hOdsG45St9BCUm-g/edit#gid=0 generally // https://docs.google.com/spreadsheets/d/1CN3MvhkcPVESuxKyx1xRYqfUit5hOdsG45St9BCUm-g/edit#gid=0 generally
// Sets ADC to around what AudioReactive expects, and loops line-in to line-out/headphone for monitoring. // Sets ADC to around what AudioReactive expects, and loops line-in to line-out/headphone for monitoring.
// Registries are decimal, settings are binary as that's how everything is listed in the docs
// ...which makes it easier to reference the docs.
//
_es8388I2cBegin(); _es8388I2cBegin();
_es8388I2cWrite(0x08,0x00); // I2S to slave _es8388I2cWrite( 8,0b00000000); // I2S to slave
_es8388I2cWrite(0x02,0xf3); // Power down DEM and STM _es8388I2cWrite( 2,0b11110011); // Power down DEM and STM
_es8388I2cWrite(0x2b,0x80); // Set same LRCK _es8388I2cWrite(43,0b10000000); // Set same LRCK
_es8388I2cWrite(0x00,0x05); // Set chip to Play & Record Mode _es8388I2cWrite( 0,0b00000101); // Set chip to Play & Record Mode
_es8388I2cWrite(0x0d,0x02); // Set MCLK/LRCK ratio to 256 _es8388I2cWrite(13,0b00000010); // Set MCLK/LRCK ratio to 256
_es8388I2cWrite(0x01,0x40); // Power up analog and lbias _es8388I2cWrite( 1,0b01000000); // Power up analog and lbias
_es8388I2cWrite(0x03,0x00); // Power up ADC, Analog Input, and Mic Bias _es8388I2cWrite( 3,0b00000000); // Power up ADC, Analog Input, and Mic Bias
_es8388I2cWrite(0x0a,0x50); // Use Lin2/Rin2 for ADC input ("line-in") _es8388I2cWrite( 4,0b11111100); // Power down DAC, Turn on LOUT1 and ROUT1 and LOUT2 and ROUT2 power
_es8388I2cWrite(0x09,0x00); // Select Analog Input PGA Gain for ADC to 0dB (L+R) _es8388I2cWrite( 2,0b01000000); // Power up DEM and STM and undocumented bit for "turn on line-out amp"
_es8388I2cWrite(0x10,0b01000000); // Set ADC digital volume attenuation to -32dB (left)
_es8388I2cWrite(0x11,0b01000000); // Set ADC digital volume attenuation to -32dB (right) // #define use_es8388_mic
_es8388I2cWrite(0x04,0x0c); // Turn on LOUT2 and ROUT2 power
_es8388I2cWrite(0x02,0b01000000); // Power up DEM and STM and undocumented bit for "turn on line-out amp" #ifdef use_es8388_mic
_es8388I2cWrite(0x26,0x09); // Mixer - route LIN2/RIN2 to output // The mics *and* line-in are BOTH connected to LIN2/RIN2 on the AudioKit
_es8388I2cWrite(0x27,0b01010000); // Mixer - route LIN to left mixer, 0dB gain // so there's no way to completely eliminate the mics. It's also hella noisy.
_es8388I2cWrite(0x2a,0b01010000); // Mixer - route RIN to right mixer, 0dB gain // Line-in works OK on the AudioKit, generally speaking, as the mics really need
_es8388I2cWrite(0x30,0b00011110); // LOUT2VOL - 0 = -45dB, 0b00011110 = +0dB // amplification to be noticable in a quiet room. If you're in a very loud room,
_es8388I2cWrite(0x31,0b00011110); // ROUT2VOL - 0 = -45dB, 0b00011110 = +0dB // the mics on the AudioKit WILL pick up sound even in line-in mode.
// TL;DR: Don't use the AudioKit for anything, use the LyraT.
//
// The LyraT does a reasonable job with mic input as configured below.
// Pick one of these. If you have to use the mics, use a LyraT over an AudioKit if you can:
_es8388I2cWrite(10,0b00000000); // Use Lin1/Rin1 for ADC input (mic on LyraT)
//_es8388I2cWrite(10,0b01010000); // Use Lin2/Rin2 for ADC input (mic *and* line-in on AudioKit)
_es8388I2cWrite( 9,0b10001000); // Select Analog Input PGA Gain for ADC to +24dB (L+R)
_es8388I2cWrite(16,0b00000000); // Set ADC digital volume attenuation to 0dB (left)
_es8388I2cWrite(17,0b00000000); // Set ADC digital volume attenuation to 0dB (right)
_es8388I2cWrite(38,0b00011011); // Mixer - route LIN1/RIN1 to output after mic gain
_es8388I2cWrite(39,0b01000000); // Mixer - route LIN to mixL, +6dB gain
_es8388I2cWrite(42,0b01000000); // Mixer - route RIN to mixR, +6dB gain
_es8388I2cWrite(46,0b00100001); // LOUT1VOL - 0b00100001 = +4.5dB
_es8388I2cWrite(47,0b00100001); // ROUT1VOL - 0b00100001 = +4.5dB
_es8388I2cWrite(48,0b00100001); // LOUT2VOL - 0b00100001 = +4.5dB
_es8388I2cWrite(49,0b00100001); // ROUT2VOL - 0b00100001 = +4.5dB
// Music ALC - the mics like Auto Level Control
// You can also use this for line-in, but it's not really needed.
//
_es8388I2cWrite(18,0b11111000); // ALC: stereo, max gain +35.5dB, min gain -12dB
_es8388I2cWrite(19,0b00110000); // ALC: target -1.5dB, 0ms hold time
_es8388I2cWrite(20,0b10100110); // ALC: gain ramp up = 420ms/93ms, gain ramp down = check manual for calc
_es8388I2cWrite(21,0b00000110); // ALC: use "ALC" mode, no zero-cross, window 96 samples
_es8388I2cWrite(22,0b01011001); // ALC: noise gate threshold, PGA gain constant, noise gate enabled
#else
_es8388I2cWrite(10,0b01010000); // Use Lin2/Rin2 for ADC input ("line-in")
_es8388I2cWrite( 9,0b00000000); // Select Analog Input PGA Gain for ADC to 0dB (L+R)
_es8388I2cWrite(16,0b01000000); // Set ADC digital volume attenuation to -32dB (left)
_es8388I2cWrite(17,0b01000000); // Set ADC digital volume attenuation to -32dB (right)
_es8388I2cWrite(38,0b00001001); // Mixer - route LIN2/RIN2 to output
_es8388I2cWrite(39,0b01010000); // Mixer - route LIN to mixL, 0dB gain
_es8388I2cWrite(42,0b01010000); // Mixer - route RIN to mixR, 0dB gain
_es8388I2cWrite(46,0b00011011); // LOUT1VOL - 0b00011110 = +0dB, 0b00011011 = LyraT balance fix
_es8388I2cWrite(47,0b00011110); // ROUT1VOL - 0b00011110 = +0dB
_es8388I2cWrite(48,0b00011110); // LOUT2VOL - 0b00011110 = +0dB
_es8388I2cWrite(49,0b00011110); // ROUT2VOL - 0b00011110 = +0dB
#endif
} }
public: public:
@@ -551,6 +605,10 @@ class ES8388Source : public I2SSource {
void initialize(int8_t sdaPin, int8_t sclPin, int8_t i2swsPin, int8_t i2ssdPin, int8_t i2sckPin, int8_t mclkPin) { void initialize(int8_t sdaPin, int8_t sclPin, int8_t i2swsPin, int8_t i2ssdPin, int8_t i2sckPin, int8_t mclkPin) {
// BUG: "use global I2C pins" are valid as -1, and -1 is seen as invalid here.
// Workaround: Set I2C pins here, which will also set them globally.
// Bug also exists in ES7243.
// check that pins are valid // check that pins are valid
if ((sdaPin < 0) || (sclPin < 0)) { if ((sdaPin < 0) || (sclPin < 0)) {
ERRORSR_PRINTF("\nAR: invalid ES8388 I2C pins: SDA=%d, SCL=%d\n", sdaPin, sclPin); ERRORSR_PRINTF("\nAR: invalid ES8388 I2C pins: SDA=%d, SCL=%d\n", sdaPin, sclPin);

View File

@@ -158,7 +158,7 @@ void ShtUsermod::cleanup()
* @return void * @return void
*/ */
void ShtUsermod::publishTemperatureAndHumidityViaMqtt() { void ShtUsermod::publishTemperatureAndHumidityViaMqtt() {
#ifdef WLED_ENABLED_MQTT #ifdef WLED_ENABLE_MQTT
if (!WLED_MQTT_CONNECTED) return; if (!WLED_MQTT_CONNECTED) return;
char buf[128]; char buf[128];
@@ -179,7 +179,7 @@ void ShtUsermod::publishTemperatureAndHumidityViaMqtt() {
* @return void * @return void
*/ */
void ShtUsermod::publishHomeAssistantAutodiscovery() { void ShtUsermod::publishHomeAssistantAutodiscovery() {
#ifdef WLED_ENABLED_MQTT #ifdef WLED_ENABLE_MQTT
if (!WLED_MQTT_CONNECTED) return; if (!WLED_MQTT_CONNECTED) return;
char json_str[1024], buf[128]; char json_str[1024], buf[128];
@@ -225,7 +225,7 @@ void ShtUsermod::publishHomeAssistantAutodiscovery() {
* *
* @return void * @return void
*/ */
#ifdef WLED_ENABLED_MQTT #ifdef WLED_ENABLE_MQTT
void ShtUsermod::appendDeviceToMqttDiscoveryMessage(JsonDocument& root) { void ShtUsermod::appendDeviceToMqttDiscoveryMessage(JsonDocument& root) {
JsonObject device = root.createNestedObject(F("dev")); JsonObject device = root.createNestedObject(F("dev"));
device[F("ids")] = escapedMac.c_str(); device[F("ids")] = escapedMac.c_str();
@@ -339,7 +339,7 @@ void ShtUsermod::loop()
* @return void * @return void
*/ */
void ShtUsermod::onMqttConnect(bool sessionPresent) { void ShtUsermod::onMqttConnect(bool sessionPresent) {
#ifdef WLED_ENABLED_MQTT #ifdef WLED_ENABLE_MQTT
if (haMqttDiscovery && !haMqttDiscoveryDone) publishHomeAssistantAutodiscovery(); if (haMqttDiscovery && !haMqttDiscoveryDone) publishHomeAssistantAutodiscovery();
#endif #endif
} }

View File

@@ -383,7 +383,8 @@ typedef struct Segment {
uint16_t aux0; // custom var uint16_t aux0; // custom var
uint16_t aux1; // custom var uint16_t aux1; // custom var
byte* data; // effect data pointer byte* data; // effect data pointer
CRGB* leds; // local leds[] array (may be a pointer to global) CRGB* ledsrgb; // local leds[] array (may be a pointer to global) //WLEDMM rename to ledsrgb to search on them (temp?)
uint16_t ledsrgbSize; //WLEDMM
static CRGB *_globalLeds; // global leds[] array static CRGB *_globalLeds; // global leds[] array
static uint16_t maxWidth, maxHeight; // these define matrix width & height (max. segment dimensions) static uint16_t maxWidth, maxHeight; // these define matrix width & height (max. segment dimensions)
void *jMap = nullptr; //WLEDMM jMap void *jMap = nullptr; //WLEDMM jMap
@@ -468,7 +469,8 @@ typedef struct Segment {
aux0(0), aux0(0),
aux1(0), aux1(0),
data(nullptr), data(nullptr),
leds(nullptr), ledsrgb(nullptr),
ledsrgbSize(0), //WLEDMM
_capabilities(0), _capabilities(0),
_dataLen(0), _dataLen(0),
_t(nullptr) _t(nullptr)
@@ -486,13 +488,13 @@ typedef struct Segment {
~Segment() { ~Segment() {
//#ifdef WLED_DEBUG //#ifdef WLED_DEBUG
//Serial.print(F("Destroying segment:")); Serial.print(F("Destroying segment:"));
//if (name) Serial.printf(" %s (%p)", name, name); if (name) Serial.printf(" %s (%p)", name, name);
//if (data) Serial.printf(" %d (%p)", (int)_dataLen, data); if (data) Serial.printf(" %d (%p)", (int)_dataLen, data);
//if (leds) Serial.printf(" [%u]", length()*sizeof(CRGB)); if (ledsrgb) Serial.printf(" [%u]", length()*sizeof(CRGB));
//Serial.println(); Serial.println();
//#endif //#endif
if (!Segment::_globalLeds && leds) free(leds); if (!Segment::_globalLeds && ledsrgb) free(ledsrgb);
if (name) delete[] name; if (name) delete[] name;
if (_t) delete _t; if (_t) delete _t;
deallocateData(); deallocateData();
@@ -502,7 +504,7 @@ typedef struct Segment {
Segment& operator= (Segment &&orig) noexcept; // move assignment Segment& operator= (Segment &&orig) noexcept; // move assignment
#ifdef WLED_DEBUG #ifdef WLED_DEBUG
size_t getSize() const { return sizeof(Segment) + (data?_dataLen:0) + (name?strlen(name):0) + (_t?sizeof(Transition):0) + (!Segment::_globalLeds && leds?sizeof(CRGB)*length():0); } size_t getSize() const { return sizeof(Segment) + (data?_dataLen:0) + (name?strlen(name):0) + (_t?sizeof(Transition):0) + (!Segment::_globalLeds && ledsrgb?sizeof(CRGB)*length():0); }
#endif #endif
inline bool getOption(uint8_t n) const { return ((options >> n) & 0x01); } inline bool getOption(uint8_t n) const { return ((options >> n) & 0x01); }
@@ -521,6 +523,8 @@ typedef struct Segment {
static uint16_t getUsedSegmentData(void) { return _usedSegmentData; } static uint16_t getUsedSegmentData(void) { return _usedSegmentData; }
static void addUsedSegmentData(int len) { _usedSegmentData += len; } static void addUsedSegmentData(int len) { _usedSegmentData += len; }
void allocLeds(); //WLEDMM
void set(uint16_t i1, uint16_t i2, uint8_t grp=1, uint8_t spc=0, uint16_t ofs=UINT16_MAX, uint16_t i1Y=0, uint16_t i2Y=1); void set(uint16_t i1, uint16_t i2, uint8_t grp=1, uint8_t spc=0, uint16_t ofs=UINT16_MAX, uint16_t i1Y=0, uint16_t i2Y=1);
bool setColor(uint8_t slot, uint32_t c); //returns true if changed bool setColor(uint8_t slot, uint32_t c); //returns true if changed
void setCCT(uint16_t k); void setCCT(uint16_t k);

View File

@@ -200,7 +200,7 @@ void IRAM_ATTR_YN Segment::setPixelColorXY(int x, int y, uint32_t col) //WLEDMM:
if (Segment::maxHeight==1) return; // not a matrix set-up if (Segment::maxHeight==1) return; // not a matrix set-up
if (x >= virtualWidth() || y >= virtualHeight() || x<0 || y<0) return; // if pixel would fall out of virtual segment just exit if (x >= virtualWidth() || y >= virtualHeight() || x<0 || y<0) return; // if pixel would fall out of virtual segment just exit
if (leds) leds[XY(x,y)] = col; if (ledsrgb) ledsrgb[XY(x,y)] = col;
uint8_t _bri_t = currentBri(on ? opacity : 0); uint8_t _bri_t = currentBri(on ? opacity : 0);
if (!_bri_t && !transitional) return; if (!_bri_t && !transitional) return;
@@ -289,7 +289,7 @@ void Segment::setPixelColorXY(float x, float y, uint32_t col, bool aa)
// returns RGBW values of pixel // returns RGBW values of pixel
uint32_t Segment::getPixelColorXY(uint16_t x, uint16_t y) { uint32_t Segment::getPixelColorXY(uint16_t x, uint16_t y) {
int i = XY(x,y); int i = XY(x,y);
if (leds) return RGBW32(leds[i].r, leds[i].g, leds[i].b, 0); if (ledsrgb) return RGBW32(ledsrgb[i].r, ledsrgb[i].g, ledsrgb[i].b, 0);
if (reverse ) x = virtualWidth() - x - 1; if (reverse ) x = virtualWidth() - x - 1;
if (reverse_y) y = virtualHeight() - y - 1; if (reverse_y) y = virtualHeight() - y - 1;
if (transpose) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed if (transpose) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed

View File

@@ -83,40 +83,55 @@ uint16_t Segment::maxHeight = 1;
// copy constructor // copy constructor
Segment::Segment(const Segment &orig) { Segment::Segment(const Segment &orig) {
//DEBUG_PRINTLN(F("-- Copy segment constructor --")); USER_PRINTLN(F("-- Copy segment constructor --"));
memcpy((void*)this, (void*)&orig, sizeof(Segment)); memcpy((void*)this, (void*)&orig, sizeof(Segment)); //WLEDMM copy to this
name = nullptr; name = nullptr;
data = nullptr; data = nullptr;
_dataLen = 0; _dataLen = 0;
_t = nullptr; _t = nullptr;
if (leds && !Segment::_globalLeds) leds = nullptr; if (ledsrgb && !Segment::_globalLeds) ledsrgb = nullptr; //WLEDMM constructor so there was nothing. ledsrgb not freed as still used by orig!
if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); } if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); }
if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); } if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); }
if (orig._t) { _t = new Transition(orig._t->_dur, orig._t->_briT, orig._t->_cctT, orig._t->_colorT); } if (orig._t) { _t = new Transition(orig._t->_dur, orig._t->_briT, orig._t->_cctT, orig._t->_colorT); }
if (orig.leds && !Segment::_globalLeds) { leds = (CRGB*)malloc(sizeof(CRGB)*length()); if (leds) memcpy(leds, orig.leds, sizeof(CRGB)*length()); } if (orig.ledsrgb && !Segment::_globalLeds) { allocLeds(); if (ledsrgb) memcpy(ledsrgb, orig.ledsrgb, sizeof(CRGB)*length()); }
jMap = nullptr; //WLEDMM jMap jMap = nullptr; //WLEDMM jMap
} }
//WLEDMM: recreate ledsrgb if more space needed (will not free ledsrgb!)
void Segment::allocLeds() {
if (!ledsrgb || sizeof(CRGB)*length() > ledsrgbSize) {
USER_PRINTF("allocLeds %d from %d\n", sizeof(CRGB)*length(), ledsrgb?ledsrgbSize:0);
ledsrgb = (CRGB*)malloc(sizeof(CRGB)*length());
ledsrgbSize = ledsrgb?sizeof(CRGB)*length():0;
}
else {
USER_PRINTF("reuse Leds %d from %d\n", sizeof(CRGB)*length(), ledsrgb?ledsrgbSize:0);
}
}
// move constructor // move constructor
Segment::Segment(Segment &&orig) noexcept { Segment::Segment(Segment &&orig) noexcept {
//DEBUG_PRINTLN(F("-- Move segment constructor --")); USER_PRINTLN(F("-- Move segment constructor --"));
memcpy((void*)this, (void*)&orig, sizeof(Segment)); memcpy((void*)this, (void*)&orig, sizeof(Segment));
orig.name = nullptr; orig.name = nullptr;
orig.data = nullptr; orig.data = nullptr;
orig._dataLen = 0; orig._dataLen = 0;
orig._t = nullptr; orig._t = nullptr;
orig.leds = nullptr; orig.ledsrgb = nullptr; //WLEDMM: do not free as moved to here (constructor so there where no leds)
orig.jMap = nullptr; //WLEDMM jMap orig.jMap = nullptr; //WLEDMM jMap
} }
// copy assignment // copy assignment
Segment& Segment::operator= (const Segment &orig) { Segment& Segment::operator= (const Segment &orig) {
//DEBUG_PRINTLN(F("-- Copying segment --")); USER_PRINTLN(F("-- Copying segment --"));
if (this != &orig) { if (this != &orig) {
// clean destination // clean destination
if (name) delete[] name; if (name) delete[] name;
if (_t) delete _t; if (_t) delete _t;
if (leds && !Segment::_globalLeds) free(leds); // WLEDMM reuse leds instead of removing themn
// if (ledsrgb && !Segment::_globalLeds) free(ledsrgb); //WLEDMM: nullify below!
CRGB* oldLeds = ledsrgb;
uint16_t oldLedsSize = ledsrgbSize;
deallocateData(); deallocateData();
// copy source // copy source
memcpy((void*)this, (void*)&orig, sizeof(Segment)); memcpy((void*)this, (void*)&orig, sizeof(Segment));
@@ -125,12 +140,12 @@ Segment& Segment::operator= (const Segment &orig) {
data = nullptr; data = nullptr;
_dataLen = 0; _dataLen = 0;
_t = nullptr; _t = nullptr;
if (!Segment::_globalLeds) leds = nullptr; if (!Segment::_globalLeds) {ledsrgb = oldLeds; ledsrgbSize = oldLedsSize;};// WLEDMM reuse leds instead of ledsrgb = nullptr;
// copy source data // copy source data
if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); } if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); }
if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); } if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); }
if (orig._t) { _t = new Transition(orig._t->_dur, orig._t->_briT, orig._t->_cctT, orig._t->_colorT); } if (orig._t) { _t = new Transition(orig._t->_dur, orig._t->_briT, orig._t->_cctT, orig._t->_colorT); }
if (orig.leds && !Segment::_globalLeds) { leds = (CRGB*)malloc(sizeof(CRGB)*length()); if (leds) memcpy(leds, orig.leds, sizeof(CRGB)*length()); } if (orig.ledsrgb && !Segment::_globalLeds) { allocLeds(); if (ledsrgb) memcpy(ledsrgb, orig.ledsrgb, sizeof(CRGB)*length()); }
jMap = nullptr; //WLEDMM jMap jMap = nullptr; //WLEDMM jMap
} }
return *this; return *this;
@@ -138,18 +153,18 @@ Segment& Segment::operator= (const Segment &orig) {
// move assignment // move assignment
Segment& Segment::operator= (Segment &&orig) noexcept { Segment& Segment::operator= (Segment &&orig) noexcept {
//DEBUG_PRINTLN(F("-- Moving segment --")); USER_PRINTLN(F("-- Moving segment --"));
if (this != &orig) { if (this != &orig) {
if (name) delete[] name; // free old name if (name) delete[] name; // free old name
deallocateData(); // free old runtime data deallocateData(); // free old runtime data
if (_t) delete _t; if (_t) delete _t;
if (leds && !Segment::_globalLeds) free(leds); if (ledsrgb && !Segment::_globalLeds) free(ledsrgb); //WLEDMM: not needed anymore as we will use leds from copy. no need to nullify ledsrgb as it gets new value in memcpy
memcpy((void*)this, (void*)&orig, sizeof(Segment)); memcpy((void*)this, (void*)&orig, sizeof(Segment));
orig.name = nullptr; orig.name = nullptr;
orig.data = nullptr; orig.data = nullptr;
orig._dataLen = 0; orig._dataLen = 0;
orig._t = nullptr; orig._t = nullptr;
orig.leds = nullptr; orig.ledsrgb = nullptr; //WLEDMM: do not free as moved to here
orig.jMap = nullptr; //WLEDMM jMap orig.jMap = nullptr; //WLEDMM jMap
} }
return *this; return *this;
@@ -190,7 +205,8 @@ void Segment::deallocateData() {
*/ */
void Segment::resetIfRequired() { void Segment::resetIfRequired() {
if (reset) { if (reset) {
if (leds && !Segment::_globalLeds) { free(leds); leds = nullptr; } //WLEDMM no need to free leds as we will reuse them
// if (ledsrgb && !Segment::_globalLeds) { free(ledsrgb); ledsrgb = nullptr; }
if (transitional && _t) { transitional = false; delete _t; _t = nullptr; } if (transitional && _t) { transitional = false; delete _t; _t = nullptr; }
deallocateData(); deallocateData();
next_time = 0; step = 0; call = 0; aux0 = 0; aux1 = 0; next_time = 0; step = 0; call = 0; aux0 = 0; aux1 = 0;
@@ -202,17 +218,17 @@ void Segment::setUpLeds() {
// deallocation happens in resetIfRequired() as it is called when segment changes or in destructor // deallocation happens in resetIfRequired() as it is called when segment changes or in destructor
if (Segment::_globalLeds) if (Segment::_globalLeds)
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
leds = &Segment::_globalLeds[start + startY*Segment::maxWidth]; ledsrgb = &Segment::_globalLeds[start + startY*Segment::maxWidth];
#else #else
leds = &Segment::_globalLeds[start]; leds = &Segment::_globalLeds[start];
#endif #endif
else if (!leds) { else if ((ledsrgb == nullptr) && (length() > 0)) { //softhack007 quickfix - avoid malloc(0) which is undefined behaviour (should not happen, but i've seen it)
#if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM) //#if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM)
if (psramFound()) //if (psramFound())
leds = (CRGB*)ps_malloc(sizeof(CRGB)*length()); // WLEDMM: stupid - PSRAM is too slow for this !!! // ledsrgb = (CRGB*)ps_malloc(sizeof(CRGB)*length()); // softhack007 disabled; putting leds into psram leads to horrible slowdown on WROVER boards
else //else
#endif //#endif
leds = (CRGB*)malloc(sizeof(CRGB)*length()); allocLeds(); //WLEDMM
} }
} }
@@ -891,7 +907,7 @@ void IRAM_ATTR_YN Segment::setPixelColor(int i, uint32_t col) //WLEDMM: IRAM_ATT
} }
#endif #endif
if (leds) leds[i] = col; if (ledsrgb) ledsrgb[i] = col;
uint16_t len = length(); uint16_t len = length();
uint8_t _bri_t = currentBri(on ? opacity : 0); uint8_t _bri_t = currentBri(on ? opacity : 0);
@@ -1017,7 +1033,7 @@ uint32_t Segment::getPixelColor(int i)
} }
#endif #endif
if (leds) return RGBW32(leds[i].r, leds[i].g, leds[i].b, 0); if (ledsrgb) return RGBW32(ledsrgb[i].r, ledsrgb[i].g, ledsrgb[i].b, 0);
if (reverse) i = virtualLength() - i - 1; if (reverse) i = virtualLength() - i - 1;
i *= groupLength(); i *= groupLength();
@@ -1470,13 +1486,14 @@ void WS2812FX::finalizeInit(void)
} }
if (useLedsArray) { if (useLedsArray) {
size_t arrSize = sizeof(CRGB) * getLengthTotal(); size_t arrSize = sizeof(CRGB) * getLengthTotal();
#if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM) // softhack007 disabled; putting leds into psram leads to horrible slowdown on WROVER boards (see setUpLeds())
if (psramFound()) //#if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM)
Segment::_globalLeds = (CRGB*) ps_malloc(arrSize); //if (psramFound())
else // Segment::_globalLeds = (CRGB*) ps_malloc(arrSize);
#endif //else
Segment::_globalLeds = (CRGB*) malloc(arrSize); //#endif
memset(Segment::_globalLeds, 0, arrSize); if (arrSize > 0) Segment::_globalLeds = (CRGB*) malloc(arrSize); // WLEDMM avoid malloc(0)
if (Segment::_globalLeds != nullptr) memset(Segment::_globalLeds, 0, arrSize); // WLEDMM avoid dereferencing nullptr
} }
//segments are created in makeAutoSegments(); //segments are created in makeAutoSegments();
@@ -1850,6 +1867,7 @@ void WS2812FX::restartRuntime() {
} }
void WS2812FX::resetSegments(bool boundsOnly) { //WLEDMM add boundsonly void WS2812FX::resetSegments(bool boundsOnly) { //WLEDMM add boundsonly
USER_PRINTF("resetSegments %d %dx%d\n", boundsOnly, Segment::maxWidth, Segment::maxHeight);
if (!boundsOnly) { if (!boundsOnly) {
_segments.clear(); // destructs all Segment as part of clearing _segments.clear(); // destructs all Segment as part of clearing
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
@@ -1861,6 +1879,7 @@ void WS2812FX::resetSegments(bool boundsOnly) { //WLEDMM add boundsonly
_mainSegment = 0; _mainSegment = 0;
} else { //WLEDMM boundsonly } else { //WLEDMM boundsonly
for (segment &seg : _segments) { for (segment &seg : _segments) {
bool recreateLeds = false;
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
seg.start = 0; seg.start = 0;
seg.stop = Segment::maxWidth; seg.stop = Segment::maxWidth;
@@ -1870,9 +1889,9 @@ void WS2812FX::resetSegments(bool boundsOnly) { //WLEDMM add boundsonly
seg.start = 0; seg.start = 0;
seg.stop = _length; seg.stop = _length;
#endif #endif
seg.allocLeds();
} }
} }
} }
void WS2812FX::makeAutoSegments(bool forceReset) { void WS2812FX::makeAutoSegments(bool forceReset) {
@@ -2167,9 +2186,9 @@ bool WS2812FX::deserializeMap(uint8_t n) {
#ifdef WLED_DEBUG #ifdef WLED_DEBUG
DEBUG_PRINTF("Custom ledmap: %d\n", loadedLedmap); DEBUG_PRINTF("Custom ledmap: %d\n", loadedLedmap);
for (uint16_t i=0; i<customMappingSize; i++) { for (uint16_t j=0; j<customMappingSize; j++) { // fixing a minor warning: declaration of 'i' shadows a previous local
if (!(i%Segment::maxWidth)) DEBUG_PRINTLN(); if (!(j%Segment::maxWidth)) DEBUG_PRINTLN();
DEBUG_PRINTF("%4d,", customMappingTable[i]); DEBUG_PRINTF("%4d,", customMappingTable[j]);
} }
DEBUG_PRINTLN(); DEBUG_PRINTLN();
#endif #endif

View File

@@ -1082,8 +1082,8 @@ function ddpAll() {
ins.push(output); ins.push(output);
start+=node.count; start+=node.count;
} }
console.log("ins", ins); console.log("ins", lastinfo.ip,JSON.stringify({"hw":{"led":{"ins":ins}}}));
callNode("4.3.2.1", "cfg", {"hw":{"led":{"ins":ins}}}); callNode(lastinfo.ip, "cfg", {"hw":{"led":{"ins":ins}}});
} }
function populateNodes(i,n) function populateNodes(i,n)
@@ -1103,7 +1103,7 @@ function populateNodes(i,n)
//WLEDMM add this node to nodes //WLEDMM add this node to nodes
let thisNode = {}; let thisNode = {};
thisNode.name = i.name; thisNode.name = i.name;
thisNode.ip = locip; //not working for ap node yet... thisNode.ip = i.ip;
n.nodes.push(thisNode); n.nodes.push(thisNode);
n.nodes.sort((a,b) => (a.name).localeCompare(b.name)); n.nodes.sort((a,b) => (a.name).localeCompare(b.name));
@@ -1274,7 +1274,7 @@ function updateLen(s, draw=true) //WLEDMM conditonally draw segment view
gId(`seg${s}len`).innerHTML = out; gId(`seg${s}len`).innerHTML = out;
// console.log("drawSegmentView","updateLen"); console.log("drawSegmentView","updateLen");
if (draw && isM) drawSegmentView(); //WLEDMM draw new segmentview if something changes in a segment if (draw && isM) drawSegmentView(); //WLEDMM draw new segmentview if something changes in a segment
} }
@@ -1491,7 +1491,7 @@ function drawSegmentView() {
} }
post(); post();
}, function(parms,error) { //error handling }, function(parms,error) { //error handling
// console.log("drawledmap error fetching " + fileName +": ", error); console.log("drawledmap error fetching " + fileName +": ", error);
// downloadGHFile("LM", fileName, true, false); WLEDMM: remove as this has too much impact // downloadGHFile("LM", fileName, true, false); WLEDMM: remove as this has too much impact
post(); post();
}); });
@@ -1670,8 +1670,8 @@ function makeWS() {
var s = json.state ? json.state : json; var s = json.state ? json.state : json;
displayRover(i, s); displayRover(i, s);
readState(s); readState(s);
// console.log("drawSegmentView","websocket", json); console.log("drawSegmentView","websocket", json);
// if (isM) drawSegmentView(); if (isM) drawSegmentView();
}; };
ws.onclose = (e)=>{ ws.onclose = (e)=>{
gId('connind').style.backgroundColor = "var(--c-r)"; gId('connind').style.backgroundColor = "var(--c-r)";
@@ -1983,7 +1983,7 @@ function requestJson(command=null)
//WLEDMM init, gfx default on upon web page load //WLEDMM init, gfx default on upon web page load
if (isM) { if (isM) {
// console.log("drawSegmentView","requestjson"); // console.log("drawSegmentView","requestjson");
drawSegmentView(); // drawSegmentView();
toggleLiveview(); toggleLiveview();
} }
@@ -3358,7 +3358,7 @@ function togglePcMode(fromB = false)
sCol('--bh', gId('bot').clientHeight + "px"); sCol('--bh', gId('bot').clientHeight + "px");
_C.style.width = (pcMode)?'100%':'400%'; _C.style.width = (pcMode)?'100%':'400%';
//WLEDMM resize segmentview //WLEDMM resize segmentview
// console.log("drawSegmentView","togglePCMode"); console.log("drawSegmentView","togglePCMode");
if (isM) drawSegmentView(); if (isM) drawSegmentView();
} }

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -53,6 +53,7 @@ void onMqttConnect(bool sessionPresent)
void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) {
static char *payloadStr;
DEBUG_PRINT(F("MQTT msg: ")); DEBUG_PRINT(F("MQTT msg: "));
DEBUG_PRINTLN(topic); DEBUG_PRINTLN(topic);
@@ -62,11 +63,22 @@ void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties
DEBUG_PRINTLN(F("no payload -> leave")); DEBUG_PRINTLN(F("no payload -> leave"));
return; return;
} }
//make a copy of the payload to 0-terminate it
char* payloadStr = new char[len+1]; if (index == 0) { // start (1st partial packet or the only packet)
if (payloadStr == nullptr) return; //no mem if (payloadStr) delete[] payloadStr; // fail-safe: release buffer
strncpy(payloadStr, payload, len); payloadStr = new char[total+1]; // allocate new buffer
payloadStr[len] = '\0'; }
if (payloadStr == nullptr) return; // buffer not allocated
// copy (partial) packet to buffer and 0-terminate it if it is last packet
char* buff = payloadStr + index;
memcpy(buff, payload, len);
if (index + len >= total) { // at end
payloadStr[total] = '\0'; // terminate c style string
} else {
DEBUG_PRINTLN(F("Partial packet received."));
return; // process next packet
}
DEBUG_PRINTLN(payloadStr); DEBUG_PRINTLN(payloadStr);
size_t topicPrefixLen = strlen(mqttDeviceTopic); size_t topicPrefixLen = strlen(mqttDeviceTopic);
@@ -80,6 +92,7 @@ void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties
// Non-Wled Topic used here. Probably a usermod subscribed to this topic. // Non-Wled Topic used here. Probably a usermod subscribed to this topic.
usermods.onMqttMessage(topic, payloadStr); usermods.onMqttMessage(topic, payloadStr);
delete[] payloadStr; delete[] payloadStr;
payloadStr = nullptr;
return; return;
} }
} }
@@ -87,16 +100,20 @@ void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties
//Prefix is stripped from the topic at this point //Prefix is stripped from the topic at this point
if (strcmp_P(topic, PSTR("/col")) == 0) { if (strcmp_P(topic, PSTR("/col")) == 0) {
colorFromDecOrHexString(col, (char*)payloadStr); colorFromDecOrHexString(col, payloadStr);
colorUpdated(CALL_MODE_DIRECT_CHANGE); colorUpdated(CALL_MODE_DIRECT_CHANGE);
} else if (strcmp_P(topic, PSTR("/api")) == 0) { } else if (strcmp_P(topic, PSTR("/api")) == 0) {
if (!requestJSONBufferLock(15)) { delete[] payloadStr; return; } if (!requestJSONBufferLock(15)) {
if (payload[0] == '{') { //JSON API delete[] payloadStr;
payloadStr = nullptr;
return;
}
if (payloadStr[0] == '{') { //JSON API
deserializeJson(doc, payloadStr); deserializeJson(doc, payloadStr);
deserializeState(doc.as<JsonObject>()); deserializeState(doc.as<JsonObject>());
} else { //HTTP API } else { //HTTP API
String apireq = "win"; apireq += '&'; // reduce flash string usage String apireq = "win"; apireq += '&'; // reduce flash string usage
apireq += (char*)payloadStr; apireq += payloadStr;
handleSet(nullptr, apireq); handleSet(nullptr, apireq);
} }
releaseJSONBufferLock(); releaseJSONBufferLock();
@@ -108,6 +125,7 @@ void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties
parseMQTTBriPayload(payloadStr); parseMQTTBriPayload(payloadStr);
} }
delete[] payloadStr; delete[] payloadStr;
payloadStr = nullptr;
} }

View File

@@ -10,7 +10,7 @@
*/ */
/* /*
* @title Espalexa library * @title Espalexa library
* @version 2.7.0 * @version 2.7.1
* @author Christian Schwinne * @author Christian Schwinne
* @license MIT * @license MIT
* @contributors d-999 * @contributors d-999
@@ -50,7 +50,7 @@
#include "../network/Network.h" #include "../network/Network.h"
#ifdef ESPALEXA_DEBUG #ifdef ESPALEXA_DEBUG
#pragma message "Espalexa 2.7.0 debug mode" #pragma message "Espalexa 2.7.1 debug mode"
#define EA_DEBUG(x) Serial.print (x) #define EA_DEBUG(x) Serial.print (x)
#define EA_DEBUGLN(x) Serial.println (x) #define EA_DEBUGLN(x) Serial.println (x)
#else #else
@@ -142,7 +142,7 @@ private:
} }
//device JSON string: color+temperature device emulates LCT015, dimmable device LWB010, (TODO: on/off Plug 01, color temperature device LWT010, color device LST001) //device JSON string: color+temperature device emulates LCT015, dimmable device LWB010, (TODO: on/off Plug 01, color temperature device LWT010, color device LST001)
void deviceJsonString(EspalexaDevice* dev, char* buf) void deviceJsonString(EspalexaDevice* dev, char* buf, size_t maxBuf) // softhack007 "size" parameter added, to avoid buffer overrun
{ {
char buf_lightid[27]; char buf_lightid[27];
encodeLightId(dev->getId() + 1, buf_lightid); encodeLightId(dev->getId() + 1, buf_lightid);
@@ -153,19 +153,19 @@ private:
//TODO: %f is not working for some reason on ESP8266 in v0.11.0 (was fine in 0.10.2). Need to investigate //TODO: %f is not working for some reason on ESP8266 in v0.11.0 (was fine in 0.10.2). Need to investigate
//sprintf_P(buf_col,PSTR(",\"hue\":%u,\"sat\":%u,\"effect\":\"none\",\"xy\":[%f,%f]") //sprintf_P(buf_col,PSTR(",\"hue\":%u,\"sat\":%u,\"effect\":\"none\",\"xy\":[%f,%f]")
// ,dev->getHue(), dev->getSat(), dev->getX(), dev->getY()); // ,dev->getHue(), dev->getSat(), dev->getX(), dev->getY());
sprintf_P(buf_col,PSTR(",\"hue\":%u,\"sat\":%u,\"effect\":\"none\",\"xy\":[%s,%s]"),dev->getHue(), dev->getSat(), snprintf_P(buf_col, sizeof(buf_col), PSTR(",\"hue\":%u,\"sat\":%u,\"effect\":\"none\",\"xy\":[%s,%s]"),dev->getHue(), dev->getSat(),
((String)dev->getX()).c_str(), ((String)dev->getY()).c_str()); ((String)dev->getX()).c_str(), ((String)dev->getY()).c_str());
char buf_ct[16] = ""; char buf_ct[16] = "";
//white spectrum support //white spectrum support
if (static_cast<uint8_t>(dev->getType()) > 1 && dev->getType() != EspalexaDeviceType::color) if (static_cast<uint8_t>(dev->getType()) > 1 && dev->getType() != EspalexaDeviceType::color)
sprintf(buf_ct, ",\"ct\":%u", dev->getCt()); snprintf(buf_ct, sizeof(buf_ct), ",\"ct\":%u", dev->getCt());
char buf_cm[20] = ""; char buf_cm[20] = "";
if (static_cast<uint8_t>(dev->getType()) > 1) if (static_cast<uint8_t>(dev->getType()) > 1)
sprintf(buf_cm,PSTR("\",\"colormode\":\"%s"), modeString(dev->getColorMode())); snprintf(buf_cm, sizeof(buf_cm), PSTR("\",\"colormode\":\"%s"), modeString(dev->getColorMode()));
sprintf_P(buf, PSTR("{\"state\":{\"on\":%s,\"bri\":%u%s%s,\"alert\":\"none%s\",\"mode\":\"homeautomation\",\"reachable\":true}," snprintf_P(buf, maxBuf, PSTR("{\"state\":{\"on\":%s,\"bri\":%u%s%s,\"alert\":\"none%s\",\"mode\":\"homeautomation\",\"reachable\":true},"
"\"type\":\"%s\",\"name\":\"%s\",\"modelid\":\"%s\",\"manufacturername\":\"Philips\",\"productname\":\"E%u" "\"type\":\"%s\",\"name\":\"%s\",\"modelid\":\"%s\",\"manufacturername\":\"Philips\",\"productname\":\"E%u"
"\",\"uniqueid\":\"%s\",\"swversion\":\"espalexa-2.7.0\"}") "\",\"uniqueid\":\"%s\",\"swversion\":\"espalexa-2.7.0\"}")
@@ -219,10 +219,10 @@ private:
EA_DEBUGLN("# Responding to description.xml ... #\n"); EA_DEBUGLN("# Responding to description.xml ... #\n");
IPAddress localIP = Network.localIP(); IPAddress localIP = Network.localIP();
char s[16]; char s[16];
sprintf(s, "%d.%d.%d.%d", localIP[0], localIP[1], localIP[2], localIP[3]); snprintf(s, sizeof(s), "%d.%d.%d.%d", localIP[0], localIP[1], localIP[2], localIP[3]);
char buf[1024]; char buf[1024];
sprintf_P(buf,PSTR("<?xml version=\"1.0\" ?>" snprintf_P(buf, sizeof(buf), PSTR("<?xml version=\"1.0\" ?>"
"<root xmlns=\"urn:schemas-upnp-org:device-1-0\">" "<root xmlns=\"urn:schemas-upnp-org:device-1-0\">"
"<specVersion><major>1</major><minor>0</minor></specVersion>" "<specVersion><major>1</major><minor>0</minor></specVersion>"
"<URLBase>http://%s:80/</URLBase>" "<URLBase>http://%s:80/</URLBase>"
@@ -297,7 +297,7 @@ private:
char buf[1024]; char buf[1024];
sprintf_P(buf,PSTR("HTTP/1.1 200 OK\r\n" snprintf_P(buf, sizeof(buf), PSTR("HTTP/1.1 200 OK\r\n"
"EXT:\r\n" "EXT:\r\n"
"CACHE-CONTROL: max-age=100\r\n" // SSDP_INTERVAL "CACHE-CONTROL: max-age=100\r\n" // SSDP_INTERVAL
"LOCATION: http://%s:80/description.xml\r\n" "LOCATION: http://%s:80/description.xml\r\n"
@@ -493,7 +493,7 @@ public:
unsigned idx = decodeLightKey(devId); unsigned idx = decodeLightKey(devId);
EA_DEBUGLN(idx); EA_DEBUGLN(idx);
char buf[50]; char buf[50];
sprintf_P(buf,PSTR("[{\"success\":{\"/lights/%u/state/\": true}}]"),devId); snprintf_P(buf,sizeof(buf),PSTR("[{\"success\":{\"/lights/%u/state/\": true}}]"),devId);
server->send(200, "application/json", buf); server->send(200, "application/json", buf);
if (idx >= currentDeviceCount) return true; //return if invalid ID if (idx >= currentDeviceCount) return true; //return if invalid ID
EspalexaDevice* dev = devices[idx]; EspalexaDevice* dev = devices[idx];
@@ -571,7 +571,7 @@ public:
jsonTemp += ':'; jsonTemp += ':';
char buf[512]; char buf[512];
deviceJsonString(devices[i], buf); deviceJsonString(devices[i], buf, sizeof(buf)-1);
jsonTemp += buf; jsonTemp += buf;
if (i < currentDeviceCount-1) jsonTemp += ','; if (i < currentDeviceCount-1) jsonTemp += ',';
} }
@@ -588,7 +588,7 @@ public:
return true; return true;
} }
char buf[512]; char buf[512];
deviceJsonString(devices[idx], buf); deviceJsonString(devices[idx], buf, sizeof(buf)-1);
server->send(200, "application/json", buf); server->send(200, "application/json", buf);
} }

View File

@@ -2,6 +2,15 @@
#include "EspalexaDevice.h" #include "EspalexaDevice.h"
// debug macros
#ifdef ESPALEXA_DEBUG
#define EA_DEBUG(x) Serial.print (x)
#define EA_DEBUGLN(x) Serial.println (x)
#else
#define EA_DEBUG(x)
#define EA_DEBUGLN(x)
#endif
EspalexaDevice::EspalexaDevice(){} EspalexaDevice::EspalexaDevice(){}
EspalexaDevice::EspalexaDevice(String deviceName, BrightnessCallbackFunction gnCallback, uint8_t initialValue) { //constructor for dimmable device EspalexaDevice::EspalexaDevice(String deviceName, BrightnessCallbackFunction gnCallback, uint8_t initialValue) { //constructor for dimmable device
@@ -124,18 +133,21 @@ uint32_t EspalexaDevice::getRGB()
{ {
//TODO tweak a bit to match hue lamp characteristics //TODO tweak a bit to match hue lamp characteristics
//based on https://gist.github.com/paulkaplan/5184275 //based on https://gist.github.com/paulkaplan/5184275
float temp = 10000/ _ct; //kelvins = 1,000,000/mired (and that /100) float temp = (_ct != 0) ? (10000/ _ct) : 2; //kelvins = 1,000,000/mired (and that /100) softhack007: avoid division by zero - using "2" as substitute
float r, g, b; float r, g, b;
#ifdef ESPALEXA_DEBUG
if (_ct == 0) {EA_DEBUGLN(F("EspalexaDevice::getRGB() Warning: ct = 0!"));}
#endif
if (temp <= 66) { if (temp <= 66) {
r = 255; r = 255;
g = temp; g = temp;
g = 99.470802 * log(g) - 161.119568; g = 99.470802 * logf(g) - 161.119568;
if (temp <= 19) { if (temp <= 19) {
b = 0; b = 0;
} else { } else {
b = temp-10; b = temp-10;
b = 138.517731 * log(b) - 305.044793; b = 138.517731 * logf(b) - 305.044793;
} }
} else { } else {
r = temp - 60; r = temp - 60;
@@ -192,9 +204,9 @@ uint32_t EspalexaDevice::getRGB()
b = 1.0f; b = 1.0f;
} }
// Apply gamma correction // Apply gamma correction
r = r <= 0.0031308f ? 12.92f * r : (1.0f + 0.055f) * pow(r, (1.0f / 2.4f)) - 0.055f; r = r <= 0.0031308f ? 12.92f * r : (1.0f + 0.055f) * powf(r, (1.0f / 2.4f)) - 0.055f;
g = g <= 0.0031308f ? 12.92f * g : (1.0f + 0.055f) * pow(g, (1.0f / 2.4f)) - 0.055f; g = g <= 0.0031308f ? 12.92f * g : (1.0f + 0.055f) * powf(g, (1.0f / 2.4f)) - 0.055f;
b = b <= 0.0031308f ? 12.92f * b : (1.0f + 0.055f) * pow(b, (1.0f / 2.4f)) - 0.055f; b = b <= 0.0031308f ? 12.92f * b : (1.0f + 0.055f) * powf(b, (1.0f / 2.4f)) - 0.055f;
if (r > b && r > g) { if (r > b && r > g) {
// red is biggest // red is biggest
@@ -328,8 +340,10 @@ void EspalexaDevice::setColor(uint8_t r, uint8_t g, uint8_t b)
float X = r * 0.664511f + g * 0.154324f + b * 0.162028f; float X = r * 0.664511f + g * 0.154324f + b * 0.162028f;
float Y = r * 0.283881f + g * 0.668433f + b * 0.047685f; float Y = r * 0.283881f + g * 0.668433f + b * 0.047685f;
float Z = r * 0.000088f + g * 0.072310f + b * 0.986039f; float Z = r * 0.000088f + g * 0.072310f + b * 0.986039f;
_x = X / (X + Y + Z); if ((r+g+b) > 0) { // softhack007: avoid division by zero
_y = Y / (X + Y + Z); _x = X / (X + Y + Z);
_y = Y / (X + Y + Z);
} else { _x = _y = 0.5f;} // softhack007: use default values in case of "black"
_rgb = ((r << 16) | (g << 8) | b); _rgb = ((r << 16) | (g << 8) | b);
_mode = EspalexaColorMode::xy; _mode = EspalexaColorMode::xy;
} }

View File

@@ -8,7 +8,7 @@
*/ */
// version code in format yymmddb (b = daily build) // version code in format yymmddb (b = daily build)
#define VERSION 2305170 #define VERSION 2305241
//uncomment this if you have a "my_config.h" file you'd like to use //uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG //#define WLED_USE_MY_CONFIG
@@ -152,6 +152,10 @@ struct PSRAM_Allocator {
if (psramFound()) return ps_malloc(size); // use PSRAM if it exists if (psramFound()) return ps_malloc(size); // use PSRAM if it exists
else return malloc(size); // fallback else return malloc(size); // fallback
} }
void* reallocate(void* ptr, size_t new_size) {
if (psramFound()) return ps_realloc(ptr, new_size); // use PSRAM if it exists
else return realloc(ptr, new_size); // fallback
}
void deallocate(void* pointer) { void deallocate(void* pointer) {
free(pointer); free(pointer);
} }

View File

@@ -12,10 +12,21 @@
*/ */
#include "wled.h" #include "wled.h"
unsigned long lastMillis = 0; //WLEDMM
unsigned long loopCounter = 0; //WLEDMM
void setup() { void setup() {
WLED::instance().setup(); WLED::instance().setup();
} }
void loop() { void loop() {
//WLEDMM show loops per second
loopCounter++;
if (millis() - lastMillis >= 10000) {
USER_PRINTF("%lu lps\n",loopCounter/10);
lastMillis = millis();
loopCounter = 0;
}
WLED::instance().loop(); WLED::instance().loop();
} }

View File

@@ -364,12 +364,13 @@ void initServer()
}); });
#endif #endif
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
USER_PRINTLN("Client request"); //WLEDMM: want to see if client connects to wled USER_PRINT("Client request"); //WLEDMM: want to see if client connects to wled
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
DEBUG_PRINTF("%s min free stack %d\n", pcTaskGetTaskName(NULL), uxTaskGetStackHighWaterMark(NULL)); //WLEDMM DEBUG_PRINTF("%s min free stack %d\n", pcTaskGetTaskName(NULL), uxTaskGetStackHighWaterMark(NULL)); //WLEDMM
#endif #endif
if (captivePortal(request)) return; if (captivePortal(request)) return;
serveIndexOrWelcome(request); serveIndexOrWelcome(request);
USER_PRINTLN(" done"); //WLEDMM: want to see if client connects to wled
}); });
#ifdef WLED_ENABLE_PIXART #ifdef WLED_ENABLE_PIXART

View File

@@ -15,13 +15,14 @@ void wsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventTyp
{ {
if(type == WS_EVT_CONNECT){ if(type == WS_EVT_CONNECT){
//client connected //client connected
DEBUG_PRINTLN(F("WS client connected.")); USER_PRINTLN(F("WS client connected."));
sendDataWs(client); sendDataWs(client);
} else if(type == WS_EVT_DISCONNECT){ } else if(type == WS_EVT_DISCONNECT){
//client disconnected //client disconnected
if (client->id() == wsLiveClientId) wsLiveClientId = 0; if (client->id() == wsLiveClientId) wsLiveClientId = 0;
DEBUG_PRINTLN(F("WS client disconnected.")); USER_PRINTLN(F("WS client disconnected."));
} else if(type == WS_EVT_DATA){ } else if(type == WS_EVT_DATA){
USER_PRINTLN(F("WS event data."));
// data packet // data packet
AwsFrameInfo * info = (AwsFrameInfo*)arg; AwsFrameInfo * info = (AwsFrameInfo*)arg;
if(info->final && info->index == 0 && info->len == len){ if(info->final && info->index == 0 && info->len == len){
@@ -97,6 +98,7 @@ void wsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventTyp
void sendDataWs(AsyncWebSocketClient * client) void sendDataWs(AsyncWebSocketClient * client)
{ {
USER_PRINTF("sendDataWs\n");
if (!ws.count()) return; if (!ws.count()) return;
AsyncWebSocketMessageBuffer * buffer; AsyncWebSocketMessageBuffer * buffer;

View File

@@ -415,7 +415,7 @@ void getSettingsJS(AsyncWebServerRequest* request, byte subPage, char* dest) //W
char rf[4] = "RF"; rf[2] = 48+s; rf[3] = 0; //off refresh char rf[4] = "RF"; rf[2] = 48+s; rf[3] = 0; //off refresh
char aw[4] = "AW"; aw[2] = 48+s; aw[3] = 0; //auto white mode char aw[4] = "AW"; aw[2] = 48+s; aw[3] = 0; //auto white mode
char wo[4] = "WO"; wo[2] = 48+s; wo[3] = 0; //swap channels char wo[4] = "WO"; wo[2] = 48+s; wo[3] = 0; //swap channels
char sp[4] = "SP"; sp[2] = 48+s; sp[3] = 0; //bus clock speed // char sp[4] = "SP"; sp[2] = 48+s; sp[3] = 0; //bus clock speed WLEDMM to do bus
oappend(SET_F("addLEDs(1);")); oappend(SET_F("addLEDs(1);"));
uint8_t pins[5]; uint8_t pins[5];
uint8_t nPins = bus->getPins(pins); uint8_t nPins = bus->getPins(pins);