Merge remote-tracking branch 'upstream/main' into mdev

This commit is contained in:
Ewoud
2023-01-17 15:24:32 +01:00
37 changed files with 539 additions and 380 deletions

View File

@@ -92,12 +92,14 @@ class Animated_Staircase : public Usermod {
static const char _bottomEchoCm[]; static const char _bottomEchoCm[];
void publishMqtt(bool bottom, const char* state) { void publishMqtt(bool bottom, const char* state) {
#ifndef WLED_DISABLE_MQTT
//Check if MQTT Connected, otherwise it will crash the 8266 //Check if MQTT Connected, otherwise it will crash the 8266
if (WLED_MQTT_CONNECTED){ if (WLED_MQTT_CONNECTED){
char subuf[64]; char subuf[64];
sprintf_P(subuf, PSTR("%s/motion/%d"), mqttDeviceTopic, (int)bottom); sprintf_P(subuf, PSTR("%s/motion/%d"), mqttDeviceTopic, (int)bottom);
mqtt->publish(subuf, 0, false, state); mqtt->publish(subuf, 0, false, state);
} }
#endif
} }
void updateSegments() { void updateSegments() {
@@ -345,6 +347,7 @@ class Animated_Staircase : public Usermod {
uint16_t getId() { return USERMOD_ID_ANIMATED_STAIRCASE; } uint16_t getId() { return USERMOD_ID_ANIMATED_STAIRCASE; }
#ifndef WLED_DISABLE_MQTT
/** /**
* handling of MQTT message * handling of MQTT message
* topic only contains stripped topic (part after /wled/MAC) * topic only contains stripped topic (part after /wled/MAC)
@@ -382,6 +385,7 @@ class Animated_Staircase : public Usermod {
mqtt->subscribe(subuf, 0); mqtt->subscribe(subuf, 0);
} }
} }
#endif
void addToJsonState(JsonObject& root) { void addToJsonState(JsonObject& root) {
JsonObject staircase = root[FPSTR(_name)]; JsonObject staircase = root[FPSTR(_name)];

View File

@@ -1,6 +1,10 @@
// force the compiler to show a warning to confirm that this file is included WLEDMM: commented this warning as we want serious warnings ;-) // force the compiler to show a warning to confirm that this file is included WLEDMM: commented this warning as we want serious warnings ;-)
// #warning **** Included USERMOD_BH1750 **** // #warning **** Included USERMOD_BH1750 ****
#ifndef WLED_ENABLE_MQTT
#error "This user mod requires MQTT to be enabled."
#endif
#pragma once #pragma once
#include <Arduino.h> // WLEDMM: make sure that I2C drivers have the "right" Wire Object #include <Arduino.h> // WLEDMM: make sure that I2C drivers have the "right" Wire Object
@@ -179,6 +183,7 @@ public:
{ {
lastLux = lux; lastLux = lux;
lastSend = millis(); lastSend = millis();
#ifndef WLED_DISABLE_MQTT
if (WLED_MQTT_CONNECTED) if (WLED_MQTT_CONNECTED)
{ {
if (!mqttInitialized) if (!mqttInitialized)
@@ -193,6 +198,7 @@ public:
{ {
DEBUG_PRINTLN(F("Missing MQTT connection. Not publishing data")); DEBUG_PRINTLN(F("Missing MQTT connection. Not publishing data"));
} }
#endif
} }
} }

View File

@@ -1,6 +1,10 @@
// force the compiler to show a warning to confirm that this file is included WLEDMM: commented this warning as we want serious warnings ;-) // force the compiler to show a warning to confirm that this file is included WLEDMM: commented this warning as we want serious warnings ;-)
// #warning **** Included USERMOD_BME280 version 2.0 **** // #warning **** Included USERMOD_BME280 version 2.0 ****
#ifndef WLED_ENABLE_MQTT
#error "This user mod requires MQTT to be enabled."
#endif
#pragma once #pragma once
#include "wled.h" #include "wled.h"

View File

@@ -224,6 +224,7 @@ class UsermodBattery : public Usermod
if (autoOffEnabled && (autoOffThreshold >= batteryLevel)) if (autoOffEnabled && (autoOffThreshold >= batteryLevel))
turnOff(); turnOff();
#ifndef WLED_DISABLE_MQTT
// SmartHome stuff // SmartHome stuff
// still don't know much about MQTT and/or HA // still don't know much about MQTT and/or HA
if (WLED_MQTT_CONNECTED) { if (WLED_MQTT_CONNECTED) {
@@ -231,6 +232,7 @@ class UsermodBattery : public Usermod
snprintf_P(buf, 63, PSTR("%s/voltage"), mqttDeviceTopic); snprintf_P(buf, 63, PSTR("%s/voltage"), mqttDeviceTopic);
mqtt->publish(buf, 0, false, String(voltage).c_str()); mqtt->publish(buf, 0, false, String(voltage).c_str());
} }
#endif
} }

View File

@@ -1,6 +1,10 @@
#pragma once #pragma once
#include "wled.h" #include "wled.h"
#ifndef WLED_ENABLE_MQTT
#error "This user mod requires MQTT to be enabled."
#endif
#include <dht_nonblocking.h> #include <dht_nonblocking.h>

View File

@@ -1,3 +1,7 @@
#ifndef WLED_ENABLE_MQTT
#error "This user mod requires MQTT to be enabled."
#endif
#include "wled.h" #include "wled.h"
#include <Arduino.h> #include <Arduino.h>
#include <U8x8lib.h> // from https://github.com/olikraus/u8g2/ #include <U8x8lib.h> // from https://github.com/olikraus/u8g2/

View File

@@ -1,3 +1,7 @@
#ifndef WLED_ENABLE_MQTT
#error "This user mod requires MQTT to be enabled."
#endif
#include "wled.h" #include "wled.h"
#include <Arduino.h> #include <Arduino.h>
#include <U8x8lib.h> // from https://github.com/olikraus/u8g2/ #include <U8x8lib.h> // from https://github.com/olikraus/u8g2/

View File

@@ -159,6 +159,7 @@ private:
void publishMqtt(const char* state) void publishMqtt(const char* state)
{ {
#ifndef WLED_DISABLE_MQTT
//Check if MQTT Connected, otherwise it will crash the 8266 //Check if MQTT Connected, otherwise it will crash the 8266
if (WLED_MQTT_CONNECTED) { if (WLED_MQTT_CONNECTED) {
char subuf[64]; char subuf[64];
@@ -166,11 +167,13 @@ private:
strcat_P(subuf, PSTR("/motion")); strcat_P(subuf, PSTR("/motion"));
mqtt->publish(subuf, 0, false, state); mqtt->publish(subuf, 0, false, state);
} }
#endif
} }
// Create an MQTT Binary Sensor for Home Assistant Discovery purposes, this includes a pointer to the topic that is published to in the Loop. // Create an MQTT Binary Sensor for Home Assistant Discovery purposes, this includes a pointer to the topic that is published to in the Loop.
void publishHomeAssistantAutodiscovery() void publishHomeAssistantAutodiscovery()
{ {
#ifndef WLED_DISABLE_MQTT
if (WLED_MQTT_CONNECTED) { if (WLED_MQTT_CONNECTED) {
StaticJsonDocument<600> doc; StaticJsonDocument<600> doc;
char uid[24], json_str[1024], buf[128]; char uid[24], json_str[1024], buf[128];
@@ -200,6 +203,7 @@ private:
mqtt->publish(buf, 0, true, json_str, payload_size); // do we really need to retain? mqtt->publish(buf, 0, true, json_str, payload_size); // do we really need to retain?
} }
#endif
} }
/** /**

View File

@@ -109,6 +109,7 @@ public:
{ {
lastLDRValue = currentLDRValue; lastLDRValue = currentLDRValue;
#ifndef WLED_DISABLE_MQTT
if (WLED_MQTT_CONNECTED) if (WLED_MQTT_CONNECTED)
{ {
char subuf[45]; char subuf[45];
@@ -121,6 +122,7 @@ public:
DEBUG_PRINTLN("Missing MQTT connection. Not publishing data"); DEBUG_PRINTLN("Missing MQTT connection. Not publishing data");
} }
} }
#endif
} }
uint16_t getLastLDRValue() uint16_t getLastLDRValue()

View File

@@ -1,3 +1,7 @@
#ifndef WLED_ENABLE_MQTT
#error "This user mod requires MQTT to be enabled."
#endif
#pragma once #pragma once
// this is remixed from usermod_v2_SensorsToMqtt.h (sensors_to_mqtt usermod) // this is remixed from usermod_v2_SensorsToMqtt.h (sensors_to_mqtt usermod)

View File

@@ -134,6 +134,7 @@ class UsermodTemperature : public Usermod {
return false; return false;
} }
#ifndef WLED_DISABLE_MQTT
void publishHomeAssistantAutodiscovery() { void publishHomeAssistantAutodiscovery() {
if (!WLED_MQTT_CONNECTED) return; if (!WLED_MQTT_CONNECTED) return;
@@ -155,6 +156,7 @@ class UsermodTemperature : public Usermod {
mqtt->publish(buf, 0, true, json_str, payload_size); mqtt->publish(buf, 0, true, json_str, payload_size);
HApublished = true; HApublished = true;
} }
#endif
public: public:
@@ -213,6 +215,7 @@ class UsermodTemperature : public Usermod {
} }
errorCount = 0; errorCount = 0;
#ifndef WLED_DISABLE_MQTT
if (WLED_MQTT_CONNECTED) { if (WLED_MQTT_CONNECTED) {
char subuf[64]; char subuf[64];
strcpy(subuf, mqttDeviceTopic); strcpy(subuf, mqttDeviceTopic);
@@ -228,6 +231,7 @@ class UsermodTemperature : public Usermod {
// publish something else to indicate status? // publish something else to indicate status?
} }
} }
#endif
} }
} }
@@ -237,6 +241,7 @@ class UsermodTemperature : public Usermod {
*/ */
//void connected() {} //void connected() {}
#ifndef WLED_DISABLE_MQTT
/** /**
* subscribe to MQTT topic if needed * subscribe to MQTT topic if needed
*/ */
@@ -247,6 +252,7 @@ class UsermodTemperature : public Usermod {
publishHomeAssistantAutodiscovery(); publishHomeAssistantAutodiscovery();
} }
} }
#endif
/* /*
* API calls te enable data exchange between WLED modules * API calls te enable data exchange between WLED modules

View File

@@ -101,6 +101,7 @@ void userLoop() {
if (temptimer - lastMeasure > 60000) if (temptimer - lastMeasure > 60000)
{ {
lastMeasure = temptimer; lastMeasure = temptimer;
#ifndef WLED_DISABLE_MQTT
//Check if MQTT Connected, otherwise it will crash the 8266 //Check if MQTT Connected, otherwise it will crash the 8266
if (mqtt != nullptr) if (mqtt != nullptr)
{ {
@@ -116,6 +117,7 @@ void userLoop() {
t += "/temperature"; t += "/temperature";
mqtt->publish(t.c_str(), 0, true, String(board_temperature).c_str()); mqtt->publish(t.c_str(), 0, true, String(board_temperature).c_str());
} }
#endif
} }
// Check if we time interval for redrawing passes. // Check if we time interval for redrawing passes.

View File

@@ -103,6 +103,7 @@ void userLoop() {
{ {
lastMeasure = tempTimer; lastMeasure = tempTimer;
#ifndef WLED_DISABLE_MQTT
// Check if MQTT Connected, otherwise it will crash the 8266 // Check if MQTT Connected, otherwise it will crash the 8266
if (mqtt != nullptr) if (mqtt != nullptr)
{ {
@@ -122,6 +123,7 @@ void userLoop() {
h += "/humidity"; h += "/humidity";
mqtt->publish(h.c_str(), 0, true, String(board_humidity).c_str()); mqtt->publish(h.c_str(), 0, true, String(board_humidity).c_str());
} }
#endif
} }
// Check if we time interval for redrawing passes. // Check if we time interval for redrawing passes.

View File

@@ -219,6 +219,7 @@ class BobLightUsermod : public Usermod {
void enable(bool en) { enabled = en; } void enable(bool en) { enabled = en; }
#ifndef WLED_DISABLE_MQTT
/** /**
* handling of MQTT message * handling of MQTT message
* topic only contains stripped topic (part after /wled/MAC) * topic only contains stripped topic (part after /wled/MAC)
@@ -249,6 +250,7 @@ class BobLightUsermod : public Usermod {
// mqtt->subscribe(subuf, 0); // mqtt->subscribe(subuf, 0);
//} //}
} }
#endif
void addToJsonInfo(JsonObject& root) void addToJsonInfo(JsonObject& root)
{ {

View File

@@ -66,12 +66,14 @@ class MultiRelay : public Usermod {
static const char _HAautodiscovery[]; static const char _HAautodiscovery[];
void publishMqtt(int relay) { void publishMqtt(int relay) {
#ifndef WLED_DISABLE_MQTT
//Check if MQTT Connected, otherwise it will crash the 8266 //Check if MQTT Connected, otherwise it will crash the 8266
if (WLED_MQTT_CONNECTED){ if (WLED_MQTT_CONNECTED){
char subuf[64]; char subuf[64];
sprintf_P(subuf, PSTR("%s/relay/%d"), mqttDeviceTopic, relay); sprintf_P(subuf, PSTR("%s/relay/%d"), mqttDeviceTopic, relay);
mqtt->publish(subuf, 0, false, _relay[relay].state ? "on" : "off"); mqtt->publish(subuf, 0, false, _relay[relay].state ? "on" : "off");
} }
#endif
} }
/** /**
@@ -232,6 +234,7 @@ class MultiRelay : public Usermod {
//Functions called by WLED //Functions called by WLED
#ifndef WLED_DISABLE_MQTT
/** /**
* handling of MQTT message * handling of MQTT message
* topic only contains stripped topic (part after /wled/MAC) * topic only contains stripped topic (part after /wled/MAC)
@@ -313,6 +316,7 @@ class MultiRelay : public Usermod {
mqtt->publish(buf, 0, true, json_str, payload_size); mqtt->publish(buf, 0, true, json_str, payload_size);
} }
} }
#endif
/** /**
* setup() is called once at boot. WiFi is not yet connected at this point. * setup() is called once at boot. WiFi is not yet connected at this point.

View File

@@ -1,3 +1,7 @@
#ifndef WLED_ENABLE_MQTT
#error "This user mod requires MQTT to be enabled."
#endif
#pragma once #pragma once
#include "wled.h" #include "wled.h"

View File

@@ -1,3 +1,7 @@
#ifndef WLED_ENABLE_MQTT
#error "This user mod requires MQTT to be enabled."
#endif
#pragma once #pragma once
#include "wled.h" #include "wled.h"

View File

@@ -1,3 +1,7 @@
#ifndef WLED_ENABLE_MQTT
#error "This user mod requires MQTT to be enabled."
#endif
#pragma once #pragma once
#include "wled.h" #include "wled.h"

View File

@@ -1,3 +1,7 @@
#ifndef WLED_ENABLE_MQTT
#error "This user mod requires MQTT to be enabled."
#endif
#pragma once #pragma once
#include "SHT85.h" #include "SHT85.h"

View File

@@ -1,3 +1,7 @@
#ifndef WLED_ENABLE_MQTT
#error "This user mod requires MQTT to be enabled."
#endif
#pragma once #pragma once
#include "wled.h" #include "wled.h"

View File

@@ -4837,7 +4837,7 @@ static const char _data_FX_MODE_2DFRIZZLES[] PROGMEM = "Frizzles@X frequency,Y f
/////////////////////////////////////////// ///////////////////////////////////////////
typedef struct ColorCount { typedef struct ColorCount {
CRGB color; CRGB color;
int8_t count; int8_t count;
} colorCount; } colorCount;
uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https://natureofcode.com/book/chapter-7-cellular-automata/ and https://github.com/DougHaber/nlife-color uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https://natureofcode.com/book/chapter-7-cellular-automata/ and https://github.com/DougHaber/nlife-color
@@ -4846,20 +4846,18 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https:
const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t cols = SEGMENT.virtualWidth();
const uint16_t rows = SEGMENT.virtualHeight(); const uint16_t rows = SEGMENT.virtualHeight();
const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled
const uint16_t crcBufferLen = (SEGMENT.width() + SEGMENT.height())*2; // roughly sqrt(2)/2 for better repetition detection (Ewowi)
//array of patterns. Needed to identify repeating patterns. A pattern is one iteration of leds, without the color (on/off only) if (!SEGENV.allocateData(dataSize + sizeof(uint16_t)*crcBufferLen)) return mode_static(); //allocation failed
const int patternsSize = (cols + rows) * 2; //seems to be a good value to catch also repetition in moving patterns
if (!SEGENV.allocateData(dataSize + sizeof(unsigned long) + sizeof(uint16_t) * patternsSize)) return mode_static(); //allocation failed
CRGB *prevLeds = reinterpret_cast<CRGB*>(SEGENV.data); CRGB *prevLeds = reinterpret_cast<CRGB*>(SEGENV.data);
unsigned long *resetMillis = reinterpret_cast<unsigned long*>(SEGENV.data + dataSize); // triggers reset uint16_t *crcBuffer = reinterpret_cast<uint16_t*>(SEGENV.data + dataSize);
uint16_t* patterns = reinterpret_cast<uint16_t*>(SEGENV.data + dataSize + sizeof(unsigned long)); //WLEDMM we need patterns!!!
CRGB backgroundColor = SEGCOLOR(1); CRGB backgroundColor = SEGCOLOR(1);
if (SEGENV.call == 0 || strip.now - *resetMillis > 5000) { if (SEGENV.call == 0 || strip.now - SEGMENT.step > 5000) {
*resetMillis = strip.now; SEGENV.step = strip.now;
SEGENV.aux0 = 0;
random16_set_seed(strip.now); //seed the random generator random16_set_seed(millis()>>2); //seed the random generator
//give the leds random state and colors (based on intensity, colors from palette or all posible colors are chosen) //give the leds random state and colors (based on intensity, colors from palette or all posible colors are chosen)
for (int x = 0; x < cols; x++) for (int y = 0; y < rows; y++) { for (int x = 0; x < cols; x++) for (int y = 0; y < rows; y++) {
@@ -4867,18 +4865,18 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https:
if (state == 0) if (state == 0)
SEGMENT.setPixelColorXY(x,y, backgroundColor); SEGMENT.setPixelColorXY(x,y, backgroundColor);
else else
SEGMENT.setPixelColorXY(x,y, !SEGMENT.check1?SEGMENT.color_from_palette(random8(), false, PALETTE_SOLID_WRAP, 0): random(32)); //WLEDMM support all colors SEGMENT.setPixelColorXY(x,y, !SEGMENT.check1?SEGMENT.color_from_palette(random8(), false, PALETTE_SOLID_WRAP, 0): random16()*random16()); //WLEDMM support all colors
} }
for (int y = 0; y < rows; y++) for (int x = 0; x < cols; x++) prevLeds[XY(x,y)] = CRGB::Black; for (int y = 0; y < rows; y++) for (int x = 0; x < cols; x++) prevLeds[XY(x,y)] = CRGB::Black;
memset(crcBuffer, 0, sizeof(uint16_t)*crcBufferLen);
//WLEDMM back to 0.13 style!!! } else if (strip.now - SEGENV.step < FRAMETIME_FIXED * map(SEGMENT.speed,0,255,64,4)) {
//init patterns // update only when appropriate time passes (in 42 FPS slots)
SEGENV.aux0 = 0; //ewowi20210629: pka static! patternsize: round robin index of next slot to add pattern return FRAMETIME;
for (int i=0; i<patternsSize; i++) patterns[i] = 0;
} }
//copy previous leds (save previous generation) //copy previous leds (save previous generation)
//NOTE: using lossy getPixelColor() is a benefit as endlessly repeating patterns will eventually fade out causing a reset
for (int x = 0; x < cols; x++) for (int y = 0; y < rows; y++) prevLeds[XY(x,y)] = SEGMENT.getPixelColorXY(x,y); for (int x = 0; x < cols; x++) for (int y = 0; y < rows; y++) prevLeds[XY(x,y)] = SEGMENT.getPixelColorXY(x,y);
//calculate new leds //calculate new leds
@@ -4912,7 +4910,7 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https:
if ((col != bgc) && (neighbors < 2)) SEGMENT.setPixelColorXY(x,y, bgc); // Loneliness if ((col != bgc) && (neighbors < 2)) SEGMENT.setPixelColorXY(x,y, bgc); // Loneliness
else if ((col != bgc) && (neighbors > 3)) SEGMENT.setPixelColorXY(x,y, bgc); // Overpopulation else if ((col != bgc) && (neighbors > 3)) SEGMENT.setPixelColorXY(x,y, bgc); // Overpopulation
else if ((col == bgc) && (neighbors == 3)) { // Reproduction else if ((col == bgc) && (neighbors == 3)) { // Reproduction
//find dominantcolor and assign to cell //find dominant color and assign to cell
colorCount dominantColorCount = {backgroundColor, 0}; colorCount dominantColorCount = {backgroundColor, 0};
for (int i=0; i<9 && colorsCount[i].count != 0; i++) for (int i=0; i<9 && colorsCount[i].count != 0; i++)
if (colorsCount[i].count > dominantColorCount.count) dominantColorCount = colorsCount[i]; if (colorsCount[i].count > dominantColorCount.count) dominantColorCount = colorsCount[i];
@@ -4922,28 +4920,17 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https:
} //x,y } //x,y
// calculate CRC16 of leds // calculate CRC16 of leds
uint16_t crc = crc16((const unsigned char*)prevLeds, dataSize-1); //ewowi: prevLeds instead of leds work as well, tbd: compare more patterns, see SR! uint16_t crc = crc16((const unsigned char*)prevLeds, dataSize);
// check if we had same CRC and reset if needed
// WLEDMM: this is work in progress in case we are not happy with crc16
// byte index=0;
// for (int x = 0; x < cols; x+=MAX(cols/8,1)) for (int y = 0; y < rows; y+=MAX(rows/8,1)) {
// if (SEGMENT.getPixelColorXY(x,y) != (uint32_t)backgroundColor) crc = crc|crc << index;
// index ++;
// }
//WLEDMM back to 0.13 style!!!
//check if repetition of patterns occurs
bool repetition = false; bool repetition = false;
for (int i=0; i<patternsSize && !repetition; i++) for (int i=0; i<crcBufferLen && !repetition; i++) repetition = (crc == crcBuffer[i]); // (Ewowi)
repetition = patterns[(SEGENV.aux0 - 1 - i + patternsSize)%patternsSize] == crc; // same CRC would mean image did not change or was repeating itself
if (!repetition) SEGENV.step = strip.now; //if no repetition avoid reset
// remember CRCs across frames
crcBuffer[SEGENV.aux0] = crc;
++SEGENV.aux0 %= crcBufferLen;
//add current pattern to array and increase index (round robin) return FRAMETIME;
patterns[SEGENV.aux0] = crc;
SEGENV.aux0 = (SEGENV.aux0+1)%patternsSize;
if (!repetition) *resetMillis = strip.now; //if no repetition avoid reset
return FRAMETIME_FIXED * (128-(SEGMENT.speed>>1)); // update only when appropriate time passes (in 42 FPS slots)
} // mode_2Dgameoflife() } // mode_2Dgameoflife()
static const char _data_FX_MODE_2DGAMEOFLIFE[] PROGMEM = "Game Of Life@!,,,,,All colors=0;!,!;!;2"; //WLEDMM support all colors static const char _data_FX_MODE_2DGAMEOFLIFE[] PROGMEM = "Game Of Life@!,,,,,All colors=0;!,!;!;2"; //WLEDMM support all colors

View File

@@ -24,12 +24,14 @@ void shortPressAction(uint8_t b)
applyPreset(macroButton[b], CALL_MODE_BUTTON_PRESET); applyPreset(macroButton[b], CALL_MODE_BUTTON_PRESET);
} }
#ifndef WLED_DISABLE_MQTT
// publish MQTT message // publish MQTT message
if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { if (buttonPublishMqtt && WLED_MQTT_CONNECTED) {
char subuf[64]; char subuf[64];
sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b);
mqtt->publish(subuf, 0, false, "short"); mqtt->publish(subuf, 0, false, "short");
} }
#endif
} }
void longPressAction(uint8_t b) void longPressAction(uint8_t b)
@@ -43,12 +45,14 @@ void longPressAction(uint8_t b)
applyPreset(macroLongPress[b], CALL_MODE_BUTTON_PRESET); applyPreset(macroLongPress[b], CALL_MODE_BUTTON_PRESET);
} }
#ifndef WLED_DISABLE_MQTT
// publish MQTT message // publish MQTT message
if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { if (buttonPublishMqtt && WLED_MQTT_CONNECTED) {
char subuf[64]; char subuf[64];
sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b);
mqtt->publish(subuf, 0, false, "long"); mqtt->publish(subuf, 0, false, "long");
} }
#endif
} }
void doublePressAction(uint8_t b) void doublePressAction(uint8_t b)
@@ -62,12 +66,14 @@ void doublePressAction(uint8_t b)
applyPreset(macroDoublePress[b], CALL_MODE_BUTTON_PRESET); applyPreset(macroDoublePress[b], CALL_MODE_BUTTON_PRESET);
} }
#ifndef WLED_DISABLE_MQTT
// publish MQTT message // publish MQTT message
if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { if (buttonPublishMqtt && WLED_MQTT_CONNECTED) {
char subuf[64]; char subuf[64];
sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b);
mqtt->publish(subuf, 0, false, "double"); mqtt->publish(subuf, 0, false, "double");
} }
#endif
} }
bool isButtonPressed(uint8_t i) bool isButtonPressed(uint8_t i)
@@ -119,6 +125,7 @@ void handleSwitch(uint8_t b)
} }
} }
#ifndef WLED_DISABLE_MQTT
// publish MQTT message // publish MQTT message
if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { if (buttonPublishMqtt && WLED_MQTT_CONNECTED) {
char subuf[64]; char subuf[64];
@@ -126,6 +133,7 @@ void handleSwitch(uint8_t b)
else sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); else sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b);
mqtt->publish(subuf, 0, false, !buttonPressedBefore[b] ? "off" : "on"); mqtt->publish(subuf, 0, false, !buttonPressedBefore[b] ? "off" : "on");
} }
#endif
buttonLongPressed[b] = buttonPressedBefore[b]; //save the last "long term" switch state buttonLongPressed[b] = buttonPressedBefore[b]; //save the last "long term" switch state
} }

View File

@@ -408,6 +408,8 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
CJSON(e131SkipOutOfSequence, if_live_dmx[F("seqskip")]); CJSON(e131SkipOutOfSequence, if_live_dmx[F("seqskip")]);
CJSON(DMXAddress, if_live_dmx[F("addr")]); CJSON(DMXAddress, if_live_dmx[F("addr")]);
if (!DMXAddress || DMXAddress > 510) DMXAddress = 1; if (!DMXAddress || DMXAddress > 510) DMXAddress = 1;
CJSON(DMXSegmentSpacing, if_live_dmx[F("dss")]);
if (DMXSegmentSpacing > 150) DMXSegmentSpacing = 0;
CJSON(DMXMode, if_live_dmx["mode"]); CJSON(DMXMode, if_live_dmx["mode"]);
tdd = if_live[F("timeout")] | -1; tdd = if_live[F("timeout")] | -1;
@@ -870,6 +872,7 @@ void serializeConfig() {
if_live_dmx[F("uni")] = e131Universe; if_live_dmx[F("uni")] = e131Universe;
if_live_dmx[F("seqskip")] = e131SkipOutOfSequence; if_live_dmx[F("seqskip")] = e131SkipOutOfSequence;
if_live_dmx[F("addr")] = DMXAddress; if_live_dmx[F("addr")] = DMXAddress;
if_live_dmx[F("dss")] = DMXSegmentSpacing;
if_live_dmx["mode"] = DMXMode; if_live_dmx["mode"] = DMXMode;
if_live[F("timeout")] = realtimeTimeoutMs / 100; if_live[F("timeout")] = realtimeTimeoutMs / 100;

View File

@@ -173,10 +173,14 @@
#define DMX_MODE_DISABLED 0 //not used #define DMX_MODE_DISABLED 0 //not used
#define DMX_MODE_SINGLE_RGB 1 //all LEDs same RGB color (3 channels) #define DMX_MODE_SINGLE_RGB 1 //all LEDs same RGB color (3 channels)
#define DMX_MODE_SINGLE_DRGB 2 //all LEDs same RGB color and master dimmer (4 channels) #define DMX_MODE_SINGLE_DRGB 2 //all LEDs same RGB color and master dimmer (4 channels)
#define DMX_MODE_EFFECT 3 //trigger standalone effects of WLED (11 channels) #define DMX_MODE_EFFECT 3 //trigger standalone effects of WLED (15 channels)
#define DMX_MODE_EFFECT_W 7 //trigger standalone effects of WLED (18 channels)
#define DMX_MODE_MULTIPLE_RGB 4 //every LED is addressed with its own RGB (ledCount * 3 channels) #define DMX_MODE_MULTIPLE_RGB 4 //every LED is addressed with its own RGB (ledCount * 3 channels)
#define DMX_MODE_MULTIPLE_DRGB 5 //every LED is addressed with its own RGB and share a master dimmer (ledCount * 3 + 1 channels) #define DMX_MODE_MULTIPLE_DRGB 5 //every LED is addressed with its own RGB and share a master dimmer (ledCount * 3 + 1 channels)
#define DMX_MODE_MULTIPLE_RGBW 6 //every LED is addressed with its own RGBW (ledCount * 4 channels) #define DMX_MODE_MULTIPLE_RGBW 6 //every LED is addressed with its own RGBW (ledCount * 4 channels)
#define DMX_MODE_EFFECT_SEGMENT 8 //trigger standalone effects of WLED (15 channels per segement)
#define DMX_MODE_EFFECT_SEGMENT_W 9 //trigger standalone effects of WLED (18 channels per segement)
#define DMX_MODE_PRESET 10 //apply presets (1 channel)
//Light capability byte (unused) 0bRCCCTTTT //Light capability byte (unused) 0bRCCCTTTT
//bits 0/1/2/3: specifies a type of LED driver. A single "driver" may have different chip models but must have the same protocol/behavior //bits 0/1/2/3: specifies a type of LED driver. A single "driver" may have different chip models but must have the same protocol/behavior

View File

@@ -2551,7 +2551,8 @@ function rSegs()
//WLEDMM generate presets.json file //WLEDMM generate presets.json file
function genPresets() function genPresets()
{ {
var result = '{"0":{}'; var result = "";
var sep = "{";
var effects = eJson; var effects = eJson;
var playlistPS = JSON.parse("{}"); var playlistPS = JSON.parse("{}");
@@ -2603,7 +2604,8 @@ function genPresets()
if (!defaultString.includes("rY")) defaultString += ',"rY":false'; if (!defaultString.includes("rY")) defaultString += ',"rY":false';
if (!defaultString.includes("mY")) defaultString += ',"mY":false'; if (!defaultString.includes("mY")) defaultString += ',"mY":false';
} }
result += `\n,"${ef.id}":{"n":"${ef.name}","mainseg":0,"seg":[{"id":0,"fx":${ef.id}${defaultString}}]}`; result += `${sep}"${ef.id}":{"n":"${ef.name}","mainseg":0,"seg":[{"id":0,"fx":${ef.id}${defaultString}}]}`;
sep = "\n,";
addToPlaylist(m, ef.id); addToPlaylist(m, ef.id);
addToPlaylist("All", ef.id); addToPlaylist("All", ef.id);
if (m.includes("1")) addToPlaylist("All1", ef.id); if (m.includes("1")) addToPlaylist("All1", ef.id);

View File

@@ -96,11 +96,11 @@
<button type=submit id="b" onclick="window.location='/'">Back</button> <button type=submit id="b" onclick="window.location='/'">Back</button>
<button type="submit" onclick="window.location='./settings/wifi'">WiFi Setup</button> <button type="submit" onclick="window.location='./settings/wifi'">WiFi Setup</button>
<button type="submit" onclick="window.location='./settings/leds'">LED Preferences</button> <button type="submit" onclick="window.location='./settings/leds'">LED Preferences</button>
<button type="submit" onclick="window.location='./settings/2D'">2D Configuration</button> <button id="2dbtn" style="display:none;" type="submit" onclick="window.location='./settings/2D'">2D Configuration</button>
<div id="configMenu">Loading...</div> <div id="configMenu">Loading...</div>
<button type="submit" onclick="window.location='./settings/um'">Usermods (pins)</button> <!--WLEDMM: Move below UMs--> <button type="submit" onclick="window.location='./settings/um'">Usermods (pins)</button> <!--WLEDMM: Move below UMs-->
<button type="submit" onclick="window.location='./settings/ui'">User Interface</button> <button type="submit" onclick="window.location='./settings/ui'">User Interface</button>
<button id="dmxbtn" style="display: none;" type="submit" onclick="window.location='./settings/dmx'">DMX Output</button> <button id="dmxbtn" style="display:none;" type="submit" onclick="window.location='./settings/dmx'">DMX Output</button>
<button type="submit" onclick="window.location='./settings/sync'">Sync Interfaces</button> <button type="submit" onclick="window.location='./settings/sync'">Sync Interfaces</button>
<button type="submit" onclick="window.location='./settings/time'">Time & Macros</button> <button type="submit" onclick="window.location='./settings/time'">Time & Macros</button>
<button type="submit" onclick="window.location='./settings/sec'">Security & Updates</button> <button type="submit" onclick="window.location='./settings/sec'">Security & Updates</button>

View File

@@ -150,15 +150,20 @@ Start universe: <input name="EU" type="number" min="0" max="63999" required><br>
<i>Reboot required.</i> Check out <a href="https://github.com/LedFx/LedFx" target="_blank">LedFx</a>!<br> <i>Reboot required.</i> Check out <a href="https://github.com/LedFx/LedFx" target="_blank">LedFx</a>!<br>
Skip out-of-sequence packets: <input type="checkbox" name="ES"><br> Skip out-of-sequence packets: <input type="checkbox" name="ES"><br>
DMX start address: <input name="DA" type="number" min="1" max="510" required><br> DMX start address: <input name="DA" type="number" min="1" max="510" required><br>
DMX segment spacing: <input name="XX" type="number" min="0" max="150" required><br>
DMX mode: DMX mode:
<select name=DM> <select name=DM>
<option value=0>Disabled</option> <option value=0>Disabled</option>
<option value=1>Single RGB</option> <option value=1>Single RGB</option>
<option value=2>Single DRGB</option> <option value=2>Single DRGB</option>
<option value=3>Effect</option> <option value=3>Effect</option>
<option value=7>Effect + White</option>
<option value=8>Effect Segment</option>
<option value=9>Effect Segment + White</option>
<option value=4>Multi RGB</option> <option value=4>Multi RGB</option>
<option value=5>Dimmer + Multi RGB</option> <option value=5>Dimmer + Multi RGB</option>
<option value=6>Multi RGBW</option> <option value=6>Multi RGBW</option>
<option value=10>Preset</option>
</select><br> </select><br>
<a href="https://mm.kno.wled.ge/interfaces/e1.31-dmx/" target="_blank">E1.31 info</a><br> <a href="https://mm.kno.wled.ge/interfaces/e1.31-dmx/" target="_blank">E1.31 info</a><br>
Timeout: <input name="ET" type="number" min="1" max="65000" required> ms<br> Timeout: <input name="ET" type="number" min="1" max="65000" required> ms<br>

View File

@@ -132,7 +132,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){
return; // nothing to do return; // nothing to do
break; break;
case DMX_MODE_SINGLE_RGB: // RGB only case DMX_MODE_SINGLE_RGB: // 3 channel: [R,G,B]
if (uni != e131Universe) return; if (uni != e131Universe) return;
if (availDMXLen < 3) return; if (availDMXLen < 3) return;
@@ -145,7 +145,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){
setRealtimePixel(i, e131_data[dataOffset+0], e131_data[dataOffset+1], e131_data[dataOffset+2], wChannel); setRealtimePixel(i, e131_data[dataOffset+0], e131_data[dataOffset+1], e131_data[dataOffset+2], wChannel);
break; break;
case DMX_MODE_SINGLE_DRGB: // Dimmer + RGB case DMX_MODE_SINGLE_DRGB: // 4 channel: [Dimmer,R,G,B]
if (uni != e131Universe) return; if (uni != e131Universe) return;
if (availDMXLen < 4) return; if (availDMXLen < 4) return;
@@ -162,38 +162,77 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){
setRealtimePixel(i, e131_data[dataOffset+1], e131_data[dataOffset+2], e131_data[dataOffset+3], wChannel); setRealtimePixel(i, e131_data[dataOffset+1], e131_data[dataOffset+2], e131_data[dataOffset+3], wChannel);
break; break;
case DMX_MODE_EFFECT: // Length 1: Apply Preset ID, length 11-13: apply effect config case DMX_MODE_PRESET: // 2 channel: [Dimmer,Preset]
if (uni != e131Universe) return; if (uni != e131Universe || availDMXLen < 2) return;
if (availDMXLen < 11) { applyPreset(e131_data[dataOffset+1], CALL_MODE_NOTIFICATION);
if (availDMXLen > 1) return; if (bri != e131_data[dataOffset]) {
applyPreset(e131_data[dataOffset+0], CALL_MODE_NOTIFICATION); bri = e131_data[dataOffset];
return; strip.setBrightness(bri, true);
} }
return;
if (bri != e131_data[dataOffset+0]) {
bri = e131_data[dataOffset+0];
}
if (e131_data[dataOffset+1] < strip.getModeCount())
effectCurrent = e131_data[dataOffset+ 1];
effectSpeed = e131_data[dataOffset+ 2]; // flickers
effectIntensity = e131_data[dataOffset+ 3];
effectPalette = e131_data[dataOffset+ 4];
col[0] = e131_data[dataOffset+ 5];
col[1] = e131_data[dataOffset+ 6];
col[2] = e131_data[dataOffset+ 7];
colSec[0] = e131_data[dataOffset+ 8];
colSec[1] = e131_data[dataOffset+ 9];
colSec[2] = e131_data[dataOffset+10];
if (availDMXLen > 11)
{
col[3] = e131_data[dataOffset+11]; //white
colSec[3] = e131_data[dataOffset+12];
}
transitionDelayTemp = 0; // act fast
colorUpdated(CALL_MODE_NOTIFICATION); // don't send UDP
return; // don't activate realtime live mode
break; break;
case DMX_MODE_EFFECT: // 15 channels [bri,effectCurrent,effectSpeed,effectIntensity,effectPalette,effectOption,R,G,B,R2,G2,B2,R3,G3,B3]
case DMX_MODE_EFFECT_W: // 18 channels, same as above but with extra +3 white channels [..,W,W2,W3]
case DMX_MODE_EFFECT_SEGMENT: // 15 channels per segment;
case DMX_MODE_EFFECT_SEGMENT_W: // 18 Channels per segment;
{
if (uni != e131Universe) return;
bool isSegmentMode = DMXMode == DMX_MODE_EFFECT_SEGMENT || DMXMode == DMX_MODE_EFFECT_SEGMENT_W;
uint8_t dmxEffectChannels = (DMXMode == DMX_MODE_EFFECT || DMXMode == DMX_MODE_EFFECT_SEGMENT) ? 15 : 18;
for (uint8_t id = 0; id < strip.getSegmentsNum(); id++) {
Segment& seg = strip.getSegment(id);
if (isSegmentMode)
dataOffset = DMXAddress + id * (dmxEffectChannels + DMXSegmentSpacing);
else
dataOffset = DMXAddress;
// Modify address for Art-Net data
if (protocol == P_ARTNET && dataOffset > 0)
dataOffset--;
// Skip out of universe addresses
if (dataOffset > dmxChannels - dmxEffectChannels + 1)
return;
if (e131_data[dataOffset+1] < strip.getModeCount())
if (e131_data[dataOffset+1] != seg.mode) seg.setMode( e131_data[dataOffset+1]);
if (e131_data[dataOffset+2] != seg.speed) seg.speed = e131_data[dataOffset+2];
if (e131_data[dataOffset+3] != seg.intensity) seg.intensity = e131_data[dataOffset+3];
if (e131_data[dataOffset+4] != seg.palette) seg.setPalette(e131_data[dataOffset+4]);
uint8_t segOption = (uint8_t)floor(e131_data[dataOffset+5]/64.0);
if (segOption == 0 && (seg.mirror || seg.reverse )) {seg.setOption(SEG_OPTION_MIRROR, false); seg.setOption(SEG_OPTION_REVERSED, false);}
if (segOption == 1 && (seg.mirror || !seg.reverse)) {seg.setOption(SEG_OPTION_MIRROR, false); seg.setOption(SEG_OPTION_REVERSED, true);}
if (segOption == 2 && (!seg.mirror || seg.reverse )) {seg.setOption(SEG_OPTION_MIRROR, true); seg.setOption(SEG_OPTION_REVERSED, false);}
if (segOption == 3 && (!seg.mirror || !seg.reverse)) {seg.setOption(SEG_OPTION_MIRROR, true); seg.setOption(SEG_OPTION_REVERSED, true);}
uint32_t colors[3];
byte whites[3] = {0,0,0};
if (dmxEffectChannels == 18) {
whites[0] = e131_data[dataOffset+15];
whites[1] = e131_data[dataOffset+16];
whites[2] = e131_data[dataOffset+17];
}
colors[0] = RGBW32(e131_data[dataOffset+ 6], e131_data[dataOffset+ 7], e131_data[dataOffset+ 8], whites[0]);
colors[1] = RGBW32(e131_data[dataOffset+ 9], e131_data[dataOffset+10], e131_data[dataOffset+11], whites[1]);
colors[2] = RGBW32(e131_data[dataOffset+12], e131_data[dataOffset+13], e131_data[dataOffset+14], whites[2]);
if (colors[0] != seg.colors[0]) seg.setColor(0, colors[0]);
if (colors[1] != seg.colors[1]) seg.setColor(1, colors[1]);
if (colors[2] != seg.colors[2]) seg.setColor(2, colors[2]);
// Set segment opacity or global brightness
if (isSegmentMode) {
if (e131_data[dataOffset] != seg.opacity) seg.setOpacity(e131_data[dataOffset]);
} else if ( id == strip.getSegmentsNum()-1 ) {
if (bri != e131_data[dataOffset]) {
bri = e131_data[dataOffset];
strip.setBrightness(bri, true);
}
}
}
return;
break;
}
case DMX_MODE_MULTIPLE_DRGB: case DMX_MODE_MULTIPLE_DRGB:
case DMX_MODE_MULTIPLE_RGB: case DMX_MODE_MULTIPLE_RGB:
case DMX_MODE_MULTIPLE_RGBW: case DMX_MODE_MULTIPLE_RGBW:
@@ -279,7 +318,11 @@ void handleArtnetPollReply(IPAddress ipAddress) {
case DMX_MODE_SINGLE_RGB: case DMX_MODE_SINGLE_RGB:
case DMX_MODE_SINGLE_DRGB: case DMX_MODE_SINGLE_DRGB:
case DMX_MODE_PRESET:
case DMX_MODE_EFFECT: case DMX_MODE_EFFECT:
case DMX_MODE_EFFECT_W:
case DMX_MODE_EFFECT_SEGMENT:
case DMX_MODE_EFFECT_SEGMENT_W:
break; // 1 universe is enough break; // 1 universe is enough
case DMX_MODE_MULTIPLE_DRGB: case DMX_MODE_MULTIPLE_DRGB:

View File

@@ -1,18 +1,17 @@
#ifndef WLED_FCN_DECLARE_H #ifndef WLED_FCN_DECLARE_H
#define WLED_FCN_DECLARE_H #define WLED_FCN_DECLARE_H
#include <Arduino.h>
#include "src/dependencies/espalexa/EspalexaDevice.h"
#include "src/dependencies/e131/ESPAsyncE131.h"
/* /*
* All globally accessible functions are declared here * All globally accessible functions are declared here
*/ */
//alexa.cpp //alexa.cpp
#ifndef WLED_DISABLE_ALEXA
void onAlexaChange(EspalexaDevice* dev); void onAlexaChange(EspalexaDevice* dev);
void alexaInit(); void alexaInit();
void handleAlexa(); void handleAlexa();
void onAlexaChange(EspalexaDevice* dev); void onAlexaChange(EspalexaDevice* dev);
#endif
//blynk.cpp //blynk.cpp
#ifndef WLED_DISABLE_BLYNK #ifndef WLED_DISABLE_BLYNK

View File

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

View File

@@ -180,7 +180,9 @@ void handleTransitions()
{ {
//handle still pending interface update //handle still pending interface update
if (interfaceUpdateCallMode && millis() - lastInterfaceUpdate > INTERFACE_UPDATE_COOLDOWN) updateInterfaces(interfaceUpdateCallMode); if (interfaceUpdateCallMode && millis() - lastInterfaceUpdate > INTERFACE_UPDATE_COOLDOWN) updateInterfaces(interfaceUpdateCallMode);
#ifndef WLED_DISABLE_MQTT
if (doPublishMqtt) publishMqtt(); if (doPublishMqtt) publishMqtt();
#endif
if (transitionActive && transitionDelayTemp > 0) if (transitionActive && transitionDelayTemp > 0)
{ {

View File

@@ -177,8 +177,4 @@ bool initMqtt()
mqtt->connect(); mqtt->connect();
return true; return true;
} }
#else
bool initMqtt(){return false;}
void publishMqtt(){}
#endif #endif

View File

@@ -287,8 +287,10 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
if (t >= 0 && t <= 63999) e131Universe = t; if (t >= 0 && t <= 63999) e131Universe = t;
t = request->arg(F("DA")).toInt(); t = request->arg(F("DA")).toInt();
if (t >= 0 && t <= 510) DMXAddress = t; if (t >= 0 && t <= 510) DMXAddress = t;
t = request->arg(F("XX")).toInt();
if (t >= 0 && t <= 150) DMXSegmentSpacing = t;
t = request->arg(F("DM")).toInt(); t = request->arg(F("DM")).toInt();
if (t >= DMX_MODE_DISABLED && t <= DMX_MODE_MULTIPLE_RGBW) DMXMode = t; if (t >= DMX_MODE_DISABLED && t <= DMX_MODE_PRESET) DMXMode = t;
t = request->arg(F("ET")).toInt(); t = request->arg(F("ET")).toInt();
if (t > 99 && t <= 65000) realtimeTimeoutMs = t; if (t > 99 && t <= 65000) realtimeTimeoutMs = t;
arlsForceMaxBri = request->hasArg(F("FB")); arlsForceMaxBri = request->hasArg(F("FB"));
@@ -712,7 +714,9 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
lastEditTime = millis(); lastEditTime = millis();
if (subPage != 2 && !doReboot) doSerializeConfig = true; //serializeConfig(); //do not save if factory reset or LED settings (which are saved after LED re-init) if (subPage != 2 && !doReboot) doSerializeConfig = true; //serializeConfig(); //do not save if factory reset or LED settings (which are saved after LED re-init)
#ifndef WLED_DISABLE_ALEXA
if (subPage == 4) alexaInit(); if (subPage == 4) alexaInit();
#endif
} }

View File

@@ -47,7 +47,9 @@ void WLED::loop()
#endif #endif
handleTime(); handleTime();
#ifndef WLED_DISABLE_INFRARED
handleIR(); // 2nd call to function needed for ESP32 to return valid results -- should be good for ESP8266, too handleIR(); // 2nd call to function needed for ESP32 to return valid results -- should be good for ESP8266, too
#endif
handleConnection(); handleConnection();
handleSerial(); handleSerial();
handleNotifications(); handleNotifications();
@@ -69,7 +71,9 @@ void WLED::loop()
yield(); yield();
handleIO(); handleIO();
#ifndef WLED_DISABLE_INFRARED
handleIR(); handleIR();
#endif
#ifndef WLED_DISABLE_ALEXA #ifndef WLED_DISABLE_ALEXA
handleAlexa(); handleAlexa();
#endif #endif
@@ -140,7 +144,9 @@ void WLED::loop()
} }
if (millis() - lastMqttReconnectAttempt > 30000 || lastMqttReconnectAttempt == 0) { // lastMqttReconnectAttempt==0 forces immediate broadcast if (millis() - lastMqttReconnectAttempt > 30000 || lastMqttReconnectAttempt == 0) { // lastMqttReconnectAttempt==0 forces immediate broadcast
lastMqttReconnectAttempt = millis(); lastMqttReconnectAttempt = millis();
#ifndef WLED_DISABLE_MQTT
initMqtt(); initMqtt();
#endif
yield(); yield();
// refresh WLED nodes list // refresh WLED nodes list
refreshNodeList(); refreshNodeList();
@@ -497,8 +503,10 @@ void WLED::setup()
// fill in unique mdns default // fill in unique mdns default
if (strcmp(cmDNS, "x") == 0) sprintf_P(cmDNS, PSTR("wled-%*s"), 6, escapedMac.c_str() + 6); if (strcmp(cmDNS, "x") == 0) sprintf_P(cmDNS, PSTR("wled-%*s"), 6, escapedMac.c_str() + 6);
#ifndef WLED_DISABLE_MQTT
if (mqttDeviceTopic[0] == 0) sprintf_P(mqttDeviceTopic, PSTR("wled/%*s"), 6, escapedMac.c_str() + 6); if (mqttDeviceTopic[0] == 0) sprintf_P(mqttDeviceTopic, PSTR("wled/%*s"), 6, escapedMac.c_str() + 6);
if (mqttClientID[0] == 0) sprintf_P(mqttClientID, PSTR("WLED-%*s"), 6, escapedMac.c_str() + 6); if (mqttClientID[0] == 0) sprintf_P(mqttClientID, PSTR("WLED-%*s"), 6, escapedMac.c_str() + 6);
#endif
#ifdef WLED_ENABLE_ADALIGHT #ifdef WLED_ENABLE_ADALIGHT
if (Serial.available() > 0 && Serial.peek() == 'I') handleImprovPacket(); if (Serial.available() > 0 && Serial.peek() == 'I') handleImprovPacket();
@@ -798,9 +806,11 @@ void WLED::initInterfaces()
} }
#endif #endif
#ifndef WLED_DISABLE_ALEXA
// init Alexa hue emulation // init Alexa hue emulation
if (alexaEnabled) if (alexaEnabled)
alexaInit(); alexaInit();
#endif
#ifndef WLED_DISABLE_OTA #ifndef WLED_DISABLE_OTA
if (aOtaEnabled) if (aOtaEnabled)
@@ -846,7 +856,9 @@ void WLED::initInterfaces()
e131.begin(e131Multicast, e131Port, e131Universe, E131_MAX_UNIVERSE_COUNT); e131.begin(e131Multicast, e131Port, e131Universe, E131_MAX_UNIVERSE_COUNT);
ddp.begin(false, DDP_DEFAULT_PORT); ddp.begin(false, DDP_DEFAULT_PORT);
reconnectHue(); reconnectHue();
#ifndef WLED_DISABLE_MQTT
initMqtt(); initMqtt();
#endif
interfacesInited = true; interfacesInited = true;
wasConnected = true; wasConnected = true;
} }

View File

@@ -121,6 +121,7 @@
#define ESPALEXA_MAXDEVICES 10 #define ESPALEXA_MAXDEVICES 10
// #define ESPALEXA_DEBUG // #define ESPALEXA_DEBUG
#include "src/dependencies/espalexa/Espalexa.h" #include "src/dependencies/espalexa/Espalexa.h"
#include "src/dependencies/espalexa/EspalexaDevice.h"
#endif #endif
#ifndef WLED_DISABLE_BLYNK #ifndef WLED_DISABLE_BLYNK
#include "src/dependencies/blynk/BlynkSimpleEsp.h" #include "src/dependencies/blynk/BlynkSimpleEsp.h"
@@ -135,7 +136,9 @@
#endif #endif
#include "src/dependencies/e131/ESPAsyncE131.h" #include "src/dependencies/e131/ESPAsyncE131.h"
#ifdef WLED_ENABLE_MQTT
#include "src/dependencies/async-mqtt-client/AsyncMqttClient.h" #include "src/dependencies/async-mqtt-client/AsyncMqttClient.h"
#endif
#define ARDUINOJSON_DECODE_UNICODE 0 #define ARDUINOJSON_DECODE_UNICODE 0
#include "src/dependencies/json/AsyncJson-v6.h" #include "src/dependencies/json/AsyncJson-v6.h"
@@ -403,12 +406,18 @@ WLED_GLOBAL uint16_t e131Universe _INIT(1); // settings fo
WLED_GLOBAL uint16_t e131Port _INIT(5568); // DMX in port. E1.31 default is 5568, Art-Net is 6454 WLED_GLOBAL uint16_t e131Port _INIT(5568); // DMX in port. E1.31 default is 5568, Art-Net is 6454
WLED_GLOBAL byte DMXMode _INIT(DMX_MODE_MULTIPLE_RGB); // DMX mode (s.a.) WLED_GLOBAL byte DMXMode _INIT(DMX_MODE_MULTIPLE_RGB); // DMX mode (s.a.)
WLED_GLOBAL uint16_t DMXAddress _INIT(1); // DMX start address of fixture, a.k.a. first Channel [for E1.31 (sACN) protocol] WLED_GLOBAL uint16_t DMXAddress _INIT(1); // DMX start address of fixture, a.k.a. first Channel [for E1.31 (sACN) protocol]
WLED_GLOBAL uint16_t DMXSegmentSpacing _INIT(0); // Number of void/unused channels between each segments DMX channels
WLED_GLOBAL byte e131LastSequenceNumber[E131_MAX_UNIVERSE_COUNT]; // to detect packet loss WLED_GLOBAL byte e131LastSequenceNumber[E131_MAX_UNIVERSE_COUNT]; // to detect packet loss
WLED_GLOBAL bool e131Multicast _INIT(false); // multicast or unicast WLED_GLOBAL bool e131Multicast _INIT(false); // multicast or unicast
WLED_GLOBAL bool e131SkipOutOfSequence _INIT(false); // freeze instead of flickering WLED_GLOBAL bool e131SkipOutOfSequence _INIT(false); // freeze instead of flickering
WLED_GLOBAL uint16_t pollReplyCount _INIT(0); // count number of replies for ArtPoll node report WLED_GLOBAL uint16_t pollReplyCount _INIT(0); // count number of replies for ArtPoll node report
// mqtt
WLED_GLOBAL unsigned long lastMqttReconnectAttempt _INIT(0); // used for other periodic tasks too
#ifndef WLED_DISABLE_MQTT
WLED_GLOBAL AsyncMqttClient *mqtt _INIT(NULL);
WLED_GLOBAL bool mqttEnabled _INIT(false); WLED_GLOBAL bool mqttEnabled _INIT(false);
WLED_GLOBAL char mqttStatusTopic[40] _INIT(""); // this must be global because of async handlers
WLED_GLOBAL char mqttDeviceTopic[33] _INIT(""); // main MQTT topic (individual per device, default is wled/mac) WLED_GLOBAL char mqttDeviceTopic[33] _INIT(""); // main MQTT topic (individual per device, default is wled/mac)
WLED_GLOBAL char mqttGroupTopic[33] _INIT("wled/all"); // second MQTT topic (for example to group devices) WLED_GLOBAL char mqttGroupTopic[33] _INIT("wled/all"); // second MQTT topic (for example to group devices)
WLED_GLOBAL char mqttServer[33] _INIT(""); // both domains and IPs should work (no SSL) WLED_GLOBAL char mqttServer[33] _INIT(""); // both domains and IPs should work (no SSL)
@@ -416,6 +425,10 @@ WLED_GLOBAL char mqttUser[41] _INIT(""); // optional: username
WLED_GLOBAL char mqttPass[65] _INIT(""); // optional: password for MQTT auth WLED_GLOBAL char mqttPass[65] _INIT(""); // optional: password for MQTT auth
WLED_GLOBAL char mqttClientID[41] _INIT(""); // override the client ID WLED_GLOBAL char mqttClientID[41] _INIT(""); // override the client ID
WLED_GLOBAL uint16_t mqttPort _INIT(1883); WLED_GLOBAL uint16_t mqttPort _INIT(1883);
#define WLED_MQTT_CONNECTED (mqtt != nullptr && mqtt->connected())
#else
#define WLED_MQTT_CONNECTED false
#endif
#ifndef WLED_DISABLE_HUESYNC #ifndef WLED_DISABLE_HUESYNC
WLED_GLOBAL bool huePollingEnabled _INIT(false); // poll hue bridge for light state WLED_GLOBAL bool huePollingEnabled _INIT(false); // poll hue bridge for light state
@@ -595,11 +608,8 @@ WLED_GLOBAL uint8_t tpmPacketCount _INIT(0);
WLED_GLOBAL uint16_t tpmPayloadFrameSize _INIT(0); WLED_GLOBAL uint16_t tpmPayloadFrameSize _INIT(0);
WLED_GLOBAL bool useMainSegmentOnly _INIT(false); WLED_GLOBAL bool useMainSegmentOnly _INIT(false);
// mqtt
WLED_GLOBAL unsigned long lastMqttReconnectAttempt _INIT(0);
WLED_GLOBAL unsigned long lastInterfaceUpdate _INIT(0); WLED_GLOBAL unsigned long lastInterfaceUpdate _INIT(0);
WLED_GLOBAL byte interfaceUpdateCallMode _INIT(CALL_MODE_INIT); WLED_GLOBAL byte interfaceUpdateCallMode _INIT(CALL_MODE_INIT);
WLED_GLOBAL char mqttStatusTopic[40] _INIT(""); // this must be global because of async handlers
// alexa udp // alexa udp
WLED_GLOBAL String escapedMac; WLED_GLOBAL String escapedMac;
@@ -660,8 +670,7 @@ WLED_GLOBAL AsyncWebServer server _INIT_N(((80)));
#ifdef WLED_ENABLE_WEBSOCKETS #ifdef WLED_ENABLE_WEBSOCKETS
WLED_GLOBAL AsyncWebSocket ws _INIT_N((("/ws"))); WLED_GLOBAL AsyncWebSocket ws _INIT_N((("/ws")));
#endif #endif
WLED_GLOBAL AsyncClient* hueClient _INIT(NULL); WLED_GLOBAL AsyncClient *hueClient _INIT(NULL);
WLED_GLOBAL AsyncMqttClient* mqtt _INIT(NULL);
WLED_GLOBAL AsyncWebHandler *editHandler _INIT(nullptr); WLED_GLOBAL AsyncWebHandler *editHandler _INIT(nullptr);
// udp interface objects // udp interface objects
@@ -792,7 +801,6 @@ WLED_GLOBAL volatile uint8_t jsonBufferLock _INIT(0);
#define WLED_CONNECTED (WiFi.status() == WL_CONNECTED) #define WLED_CONNECTED (WiFi.status() == WL_CONNECTED)
#endif #endif
#define WLED_WIFI_CONFIGURED (strlen(clientSSID) >= 1 && strcmp(clientSSID, DEFAULT_CLIENT_SSID) != 0) #define WLED_WIFI_CONFIGURED (strlen(clientSSID) >= 1 && strcmp(clientSSID, DEFAULT_CLIENT_SSID) != 0)
#define WLED_MQTT_CONNECTED (mqtt != nullptr && mqtt->connected())
#ifndef WLED_AP_SSID_UNIQUE #ifndef WLED_AP_SSID_UNIQUE
#define WLED_SET_AP_SSID() do { \ #define WLED_SET_AP_SSID() do { \

View File

@@ -605,10 +605,14 @@ void serveSettings(AsyncWebServerRequest* request, bool post)
case 4: response = request->beginResponse_P(200, "text/html", PAGE_settings_sync, PAGE_settings_sync_length); break; case 4: response = request->beginResponse_P(200, "text/html", PAGE_settings_sync, PAGE_settings_sync_length); break;
case 5: response = request->beginResponse_P(200, "text/html", PAGE_settings_time, PAGE_settings_time_length); break; case 5: response = request->beginResponse_P(200, "text/html", PAGE_settings_time, PAGE_settings_time_length); break;
case 6: response = request->beginResponse_P(200, "text/html", PAGE_settings_sec, PAGE_settings_sec_length); break; case 6: response = request->beginResponse_P(200, "text/html", PAGE_settings_sec, PAGE_settings_sec_length); break;
#ifdef WLED_ENABLE_DMX
case 7: response = request->beginResponse_P(200, "text/html", PAGE_settings_dmx, PAGE_settings_dmx_length); break; case 7: response = request->beginResponse_P(200, "text/html", PAGE_settings_dmx, PAGE_settings_dmx_length); break;
#endif
case 8: response = request->beginResponse_P(200, "text/html", PAGE_settings_um, PAGE_settings_um_length); break; case 8: response = request->beginResponse_P(200, "text/html", PAGE_settings_um, PAGE_settings_um_length); break;
case 9: response = request->beginResponse_P(200, "text/html", PAGE_update, PAGE_update_length); break; case 9: response = request->beginResponse_P(200, "text/html", PAGE_update, PAGE_update_length); break;
#ifndef WLED_DISABLE_2D
case 10: response = request->beginResponse_P(200, "text/html", PAGE_settings_2D, PAGE_settings_2D_length); break; case 10: response = request->beginResponse_P(200, "text/html", PAGE_settings_2D, PAGE_settings_2D_length); break;
#endif
case 251: { case 251: {
correctPIN = !strlen(settingsPIN); // lock if a pin is set correctPIN = !strlen(settingsPIN); // lock if a pin is set
createEditHandler(correctPIN); createEditHandler(correctPIN);

View File

@@ -288,6 +288,9 @@ void getSettingsJS(AsyncWebServerRequest* request, byte subPage, char* dest) //W
if (subPage == 0) if (subPage == 0)
{ {
#ifndef WLED_DISABLE_2D // include only if 2D is compiled in
oappend(PSTR("gId('2dbtn').style.display='';"));
#endif
#ifdef WLED_ENABLE_DMX // include only if DMX is enabled #ifdef WLED_ENABLE_DMX // include only if DMX is enabled
oappend(PSTR("gId('dmxbtn').style.display='';")); oappend(PSTR("gId('dmxbtn').style.display='';"));
#endif #endif
@@ -512,6 +515,7 @@ void getSettingsJS(AsyncWebServerRequest* request, byte subPage, char* dest) //W
oappend(SET_F("hideNoDMX();")); // hide "not compiled in" message oappend(SET_F("hideNoDMX();")); // hide "not compiled in" message
#endif #endif
sappend('v',SET_F("DA"),DMXAddress); sappend('v',SET_F("DA"),DMXAddress);
sappend('v',SET_F("XX"),DMXSegmentSpacing);
sappend('v',SET_F("DM"),DMXMode); sappend('v',SET_F("DM"),DMXMode);
sappend('v',SET_F("ET"),realtimeTimeoutMs); sappend('v',SET_F("ET"),realtimeTimeoutMs);
sappend('c',SET_F("FB"),arlsForceMaxBri); sappend('c',SET_F("FB"),arlsForceMaxBri);