Merge pull request #111 from MoonModules/dmx_input

Implement dmx input with rdm support - with tweaks
This commit is contained in:
netmindz
2024-02-10 17:39:59 +00:00
committed by GitHub
19 changed files with 4406 additions and 4056 deletions

View File

@@ -1080,7 +1080,7 @@ build_flags = ${common.build_flags} ${common_mm.build_flags_S} ;; do not inclu
;-Wsuggest-attribute=const -Wsuggest-attribute=pure ;; ask compiler for hints on attributes
-D WLED_ENABLE_DMX_INPUT
lib_deps = ${common_mm.lib_deps_S} ;; do not include ${esp32.lib_depsV4} here !!!!
https://github.com/someweisguy/esp_dmx.git#v3.0.2-beta ;; for DMX_INPUT
https://github.com/someweisguy/esp_dmx.git#47db25d ;; for DMX_INPUT
esp32_build_flags = ${esp32.build_flagsV4} ${esp32_4MB_V4_S_base.build_flags} ;; this is for esp32 only, including specific "V4" flags
esp32_lib_deps = ${esp32.lib_depsV4} ${esp32_4MB_V4_S_base.lib_deps} ;; this is for esp32 only, including specific "V4" flags
board_build.partitions = ${esp32.default_partitions}

View File

@@ -465,9 +465,9 @@ bool deserializeConfig(JsonObject doc, bool fromFS) {
if (tdd >= 0) realtimeTimeoutMs = tdd * 100;
#ifdef WLED_ENABLE_DMX_INPUT
CJSON(dmxTransmitPin, if_live_dmx[F("rxPin")]);
CJSON(dmxReceivePin, if_live_dmx[F("txPin")]);
CJSON(dmxEnablePin, if_live_dmx[F("enablePin")]);
CJSON(dmxInputTransmitPin, if_live_dmx[F("inputRxPin")]);
CJSON(dmxInputReceivePin, if_live_dmx[F("inputTxPin")]);
CJSON(dmxInputEnablePin, if_live_dmx[F("inputEnablePin")]);
#endif
CJSON(arlsForceMaxBri, if_live[F("maxbri")]);
@@ -955,9 +955,9 @@ void serializeConfig() {
if_live_dmx[F("dss")] = DMXSegmentSpacing;
if_live_dmx["mode"] = DMXMode;
#ifdef WLED_ENABLE_DMX_INPUT
if_live_dmx[F("rxPin")] = dmxTransmitPin;
if_live_dmx[F("txPin")] = dmxReceivePin;
if_live_dmx[F("enablePin")] = dmxEnablePin;
if_live_dmx[F("inputRxPin")] = dmxInputTransmitPin;
if_live_dmx[F("inputTxPin")] = dmxInputReceivePin;
if_live_dmx[F("inputEnablePin")] = dmxInputEnablePin;
#endif
if_live[F("timeout")] = realtimeTimeoutMs / 100;

View File

@@ -174,10 +174,11 @@ Force max brightness: <input type="checkbox" name="FB"><br>
Disable realtime gamma correction: <input type="checkbox" name="RG"><br>
Realtime LED offset: <input name="WO" type="number" min="-255" max="255" required>
<div id="dmxInput"> <!--WLEDMM-->
<em>DMX Input Pins</em><br/>
DMX RX: <input name="DMR" type="number" min="-1" max="99"><br/>
DMX TX: <input name="DMT" type="number" min="-1" max="99"><br/>
DMX Enable: <input name="DME" type="number" min="-1" max="99"><br/>
<h4>Wired DMX Input Pins</h4>
DMX RX: <input name="IDMR" type="number" min="-1" max="99">RO<br/>
DMX TX: <input name="IDMT" type="number" min="-1" max="99">DI<br/>
DMX Enable: <input name="IDME" type="number" min="-1" max="99">RE+DE<br/>
<div style="display: none">DMX Port: <input name="IDMP" type="number" min="1" max="2"><br/></div>
</div>
<div id="dmxInputOff"> <!--WLEDMM-->
<br><em style="color:darkorange">This firmware build does not include DMX Input support. <br></em>

273
wled00/dmx_input.cpp Normal file
View File

@@ -0,0 +1,273 @@
#include "wled.h"
#ifdef WLED_ENABLE_DMX_INPUT
#ifdef ESP8266
#error DMX input is only supported on ESP32
#endif
#include "dmx_input.h"
#include <rdm/responder.h>
void rdmPersonalityChangedCb(dmx_port_t dmxPort, const rdm_header_t *header,
void *context)
{
DMXInput *dmx = static_cast<DMXInput *>(context);
if (!dmx) {
USER_PRINTLN("DMX: Error: no context in rdmPersonalityChangedCb");
return;
}
if (header->cc == RDM_CC_SET_COMMAND_RESPONSE) {
const uint8_t personality = dmx_get_current_personality(dmx->inputPortNum);
DMXMode = std::min(DMX_MODE_PRESET, std::max(DMX_MODE_SINGLE_RGB, int(personality)));
doSerializeConfig = true;
USER_PRINTF("DMX personality changed to to: %d\n", DMXMode);
}
}
void rdmAddressChangedCb(dmx_port_t dmxPort, const rdm_header_t *header,
void *context)
{
DMXInput *dmx = static_cast<DMXInput *>(context);
if (!dmx) {
USER_PRINTLN("DMX: Error: no context in rdmAddressChangedCb");
return;
}
if (header->cc == RDM_CC_SET_COMMAND_RESPONSE) {
const uint16_t addr = dmx_get_start_address(dmx->inputPortNum);
DMXAddress = std::min(512, int(addr));
doSerializeConfig = true;
USER_PRINTF("DMX start addr changed to: %d\n", DMXAddress);
}
}
static dmx_config_t createConfig()
{
dmx_config_t config;
config.pd_size = 255;
config.dmx_start_address = DMXAddress;
config.model_id = 0;
config.product_category = RDM_PRODUCT_CATEGORY_FIXTURE;
config.software_version_id = VERSION;
strcpy(config.device_label, "WLED_MM");
const std::string versionString = "WLED_V" + std::to_string(VERSION);
strncpy(config.software_version_label, versionString.c_str(), 32);
config.software_version_label[32] = '\0'; // zero termination in case versionString string was longer than 32 chars
config.personalities[0].description = "SINGLE_RGB";
config.personalities[0].footprint = 3;
config.personalities[1].description = "SINGLE_DRGB";
config.personalities[1].footprint = 4;
config.personalities[2].description = "EFFECT";
config.personalities[2].footprint = 15;
config.personalities[3].description = "MULTIPLE_RGB";
config.personalities[3].footprint = std::min(512, int(strip.getLengthTotal()) * 3);
config.personalities[4].description = "MULTIPLE_DRGB";
config.personalities[4].footprint = std::min(512, int(strip.getLengthTotal()) * 3 + 1);
config.personalities[5].description = "MULTIPLE_RGBW";
config.personalities[5].footprint = std::min(512, int(strip.getLengthTotal()) * 4);
config.personalities[6].description = "EFFECT_W";
config.personalities[6].footprint = 18;
config.personalities[7].description = "EFFECT_SEGMENT";
config.personalities[7].footprint = std::min(512, strip.getSegmentsNum() * 15);
config.personalities[8].description = "EFFECT_SEGMENT_W";
config.personalities[8].footprint = std::min(512, strip.getSegmentsNum() * 18);
config.personalities[9].description = "PRESET";
config.personalities[9].footprint = 1;
config.personality_count = 10;
// rdm personalities are numbered from 1, thus we can just set the DMXMode directly.
config.current_personality = DMXMode;
return config;
}
void dmxReceiverTask(void *context)
{
DMXInput *instance = static_cast<DMXInput *>(context);
if (instance == nullptr) {
return;
}
if (instance->installDriver()) {
while (true) {
instance->updateInternal();
}
}
}
bool DMXInput::installDriver()
{
const auto config = createConfig();
if (!dmx_driver_install(inputPortNum, &config, DMX_INTR_FLAGS_DEFAULT)) {
USER_PRINTF("Error: Failed to install dmx driver\n");
return false;
}
USER_PRINTF("Listening for DMX on pin %u\n", rxPin);
USER_PRINTF("Sending DMX on pin %u\n", txPin);
USER_PRINTF("DMX enable pin is: %u\n", enPin);
dmx_set_pin(inputPortNum, txPin, rxPin, enPin);
rdm_register_dmx_start_address(inputPortNum, rdmAddressChangedCb, this);
rdm_register_dmx_personality(inputPortNum, rdmPersonalityChangedCb, this);
initialized = true;
return true;
}
void DMXInput::init(uint8_t rxPin, uint8_t txPin, uint8_t enPin, uint8_t inputPortNum)
{
#ifdef WLED_ENABLE_DMX_OUTPUT
//TODO add again once dmx output has been merged
// if(inputPortNum == dmxOutputPort)
// {
// USER_PRINTF("DMXInput: Error: Input port == output port");
// return;
// }
#endif
if (inputPortNum < 3 && inputPortNum > 0) {
this->inputPortNum = inputPortNum;
}
else {
USER_PRINTF("DMXInput: Error: invalid inputPortNum: %d\n", inputPortNum);
return;
}
if (rxPin > 0 && enPin > 0 && txPin > 0) {
const managed_pin_type pins[] = {
{(int8_t)txPin, false}, // these are not used as gpio pins, thus isOutput is always false.
{(int8_t)rxPin, false},
{(int8_t)enPin, false}};
const bool pinsAllocated = pinManager.allocateMultiplePins(pins, 3, PinOwner::DMX_INPUT);
if (!pinsAllocated) {
USER_PRINTF("DMXInput: Error: Failed to allocate pins for DMX_INPUT. Pins already in use:\n");
USER_PRINTF("rx in use by: %s\n", pinManager.getPinOwnerText(rxPin).c_str());
USER_PRINTF("tx in use by: %s\n", pinManager.getPinOwnerText(txPin).c_str());
USER_PRINTF("en in use by: %s\n", pinManager.getPinOwnerText(enPin).c_str());
return;
}
this->rxPin = rxPin;
this->txPin = txPin;
this->enPin = enPin;
// put dmx receiver into seperate task because it should not be blocked
// pin to core 0 because wled is running on core 1
xTaskCreatePinnedToCore(dmxReceiverTask, "DMX_RCV_TASK", 10240, this, 2, &task, 0);
if (!task) {
USER_PRINTF("Error: Failed to create dmx rcv task");
}
}
else {
USER_PRINTLN("DMX input disabled due to rxPin, enPin or txPin not set");
return;
}
}
void DMXInput::updateInternal()
{
if (!initialized) {
return;
}
checkAndUpdateConfig();
dmx_packet_t packet;
unsigned long now = millis();
if (dmx_receive(inputPortNum, &packet, DMX_TIMEOUT_TICK)) {
if (!packet.err) {
connected = true;
identify = isIdentifyOn();
if (!packet.is_rdm) {
const std::lock_guard<std::mutex> lock(dmxDataLock);
dmx_read(inputPortNum, dmxdata, packet.size);
}
}
else {
connected = false;
}
}
else {
connected = false;
}
}
void DMXInput::update()
{
if (identify) {
turnOnAllLeds();
}
else if (connected) {
const std::lock_guard<std::mutex> lock(dmxDataLock);
handleDMXData(1, 512, dmxdata, REALTIME_MODE_DMX, 0);
}
}
void DMXInput::turnOnAllLeds()
{
// TODO not sure if this is the correct way?
const uint16_t numPixels = strip.getLengthTotal();
for (uint16_t i = 0; i < numPixels; ++i)
{
strip.setPixelColor(i, 255, 255, 255, 255);
}
strip.setBrightness(255, true);
strip.show();
}
void DMXInput::disable()
{
if (initialized) {
dmx_driver_disable(inputPortNum);
}
}
void DMXInput::enable()
{
if (initialized) {
dmx_driver_enable(inputPortNum);
}
}
bool DMXInput::isIdentifyOn() const
{
uint8_t identify = 0;
const bool gotIdentify = rdm_get_identify_device(inputPortNum, &identify);
// gotIdentify should never be false because it is a default parameter in rdm
// but just in case we check for it anyway
return bool(identify) && gotIdentify;
}
void DMXInput::checkAndUpdateConfig()
{
/**
* The global configuration variables are modified by the web interface.
* If they differ from the driver configuration, we have to update the driver
* configuration.
*/
const uint8_t currentPersonality = dmx_get_current_personality(inputPortNum);
if (currentPersonality != DMXMode) {
DEBUG_PRINTF("DMX personality has changed from %d to %d\n", currentPersonality, DMXMode);
dmx_set_current_personality(inputPortNum, DMXMode);
}
const uint16_t currentAddr = dmx_get_start_address(inputPortNum);
if (currentAddr != DMXAddress) {
DEBUG_PRINTF("DMX address has changed from %d to %d\n", currentAddr, DMXAddress);
dmx_set_start_address(inputPortNum, DMXAddress);
}
}
#endif

73
wled00/dmx_input.h Normal file
View File

@@ -0,0 +1,73 @@
#pragma once
#include <cstdint>
#include <esp_dmx.h>
#include <atomic>
#include <mutex>
/*
* Support for DMX/RDM input via serial (e.g. max485) on ESP32
* ESP32 Library from:
* https://github.com/someweisguy/esp_dmx
*/
class DMXInput
{
public:
void init(uint8_t rxPin, uint8_t txPin, uint8_t enPin, uint8_t inputPortNum);
void update();
/**disable dmx receiver (do this before disabling the cache)*/
void disable();
void enable();
private:
/// @return true if rdm identify is active
bool isIdentifyOn() const;
/**
* Checks if the global dmx config has changed and updates the changes in rdm
*/
void checkAndUpdateConfig();
/// overrides everything and turns on all leds
void turnOnAllLeds();
/// installs the dmx driver
/// @return false on fail
bool installDriver();
/// is called by the dmx receive task regularly to receive new dmx data
void updateInternal();
// is invoked whenver the dmx start address is changed via rdm
friend void rdmAddressChangedCb(dmx_port_t dmxPort, const rdm_header_t *header,
void *context);
// is invoked whenever the personality is changed via rdm
friend void rdmPersonalityChangedCb(dmx_port_t dmxPort, const rdm_header_t *header,
void *context);
/// The internal dmx task.
/// This is the main loop of the dmx receiver. It never returns.
friend void dmxReceiverTask(void * context);
uint8_t inputPortNum = 255;
uint8_t rxPin = 255;
uint8_t txPin = 255;
uint8_t enPin = 255;
/// is written to by the dmx receive task.
byte dmxdata[DMX_PACKET_SIZE];
/// True once the dmx input has been initialized successfully
bool initialized = false; // true once init finished successfully
/// True if dmx is currently connected
std::atomic<bool> connected{false};
std::atomic<bool> identify{false};
/// Timestamp of the last time a dmx frame was received
unsigned long lastUpdate = 0;
/// Taskhandle of the dmx task that is running in the background
TaskHandle_t task;
/// Guards access to dmxData
std::mutex dmxDataLock;
};

View File

@@ -1,7 +1,7 @@
#include "wled.h"
/*
* Support for DMX Output via MAX485.
* Support for DMX output via serial (e.g. MAX485).
* Change the output pin in src/dependencies/ESPDMX.cpp, if needed (ESP8266)
* Change the output pin in src/dependencies/SparkFunDMX.cpp, if needed (ESP32)
* ESP8266 Library from:
@@ -26,7 +26,7 @@
#endif
#endif
void handleDMX()
void handleDMXOutput()
{
// don't act, when in DMX Proxy mode
if (e131ProxyUniverse != 0) return;
@@ -82,7 +82,7 @@ void handleDMX()
dmx.update(); // update the DMX bus
}
void initDMX() {
void initDMXOutput() {
#ifdef ESP8266
dmx.init(512); // initialize with bus length
#else
@@ -90,72 +90,6 @@ void initDMX() {
#endif
}
#else
void handleDMX() {}
#endif
#ifdef WLED_ENABLE_DMX_INPUT
#include <esp_dmx.h>
dmx_port_t dmxPort = 2;
void initDMX() {
/* Set the DMX hardware pins to the pins that we want to use. */
if(dmxReceivePin > 0) {
USER_PRINTF("Listening for DMX on pin %u\n", dmxReceivePin);
dmx_set_pin(dmxPort, dmxTransmitPin, dmxReceivePin, dmxEnablePin);
}
else {
USER_PRINTLN("DMX input disabled due to dmxReceivePin not being set");
return;
}
/* Now we can install the DMX driver! We'll tell it which DMX port to use and
which interrupt priority it should have. If you aren't sure which interrupt
priority to use, you can use the macro `DMX_DEFAULT_INTR_FLAG` to set the
interrupt to its default settings.*/
dmx_driver_install(dmxPort, ESP_INTR_FLAG_LEVEL3);
}
bool dmxIsConnected = false;
unsigned long dmxLastUpdate = 0;
void handleDMXInput() {
if(dmxReceivePin < 1) {
return;
}
byte dmxdata[DMX_PACKET_SIZE];
dmx_packet_t packet;
unsigned long now = millis();
if (dmx_receive(dmxPort, &packet, 0)) {
/* We should check to make sure that there weren't any DMX errors. */
if (!packet.err) {
/* If this is the first DMX data we've received, lets log it! */
if (!dmxIsConnected) {
USER_PRINTLN("DMX is connected!");
dmxIsConnected = true;
}
dmx_read(dmxPort, dmxdata, packet.size);
handleDMXData(1, 512, dmxdata, REALTIME_MODE_DMX, 0);
dmxLastUpdate = now;
} else {
/* Oops! A DMX error occurred! Don't worry, this can happen when you first
connect or disconnect your DMX devices. If you are consistently getting
DMX errors, then something may have gone wrong with your code or
something is seriously wrong with your DMX transmitter. */
DEBUG_PRINT("A DMX error occurred - ");
DEBUG_PRINTLN(packet.err);
}
}
else if (dmxIsConnected && (now - dmxLastUpdate > 5000)) {
dmxIsConnected = false;
USER_PRINTLN("DMX was disconnected.");
}
}
#else
void initDMX();
void initDMXOutput(){}
void handleDMXOutput() {}
#endif

View File

@@ -69,9 +69,12 @@ uint8_t __attribute__((pure)) gamma8(uint8_t b);
uint32_t __attribute__((pure)) gamma32(uint32_t); // WLEDMM: added attribute pure
uint8_t unGamma8(uint8_t value); // WLEDMM revert gamma correction
//dmx.cpp
void initDMX();
void handleDMX();
//dmx_output.cpp
void initDMXOutput();
void handleDMXOutput();
//dmx_input.cpp
void initDMXInput();
void handleDMXInput();
//e131.cpp

View File

@@ -9,7 +9,7 @@
// Autogenerated from wled00/data/cpal/cpal.htm, do not edit!!
const uint16_t PAGE_cpal_L = 4970;
const uint8_t PAGE_cpal[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xbd, 0x3b, 0xfd, 0x77, 0xdb, 0x36,
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xbd, 0x3b, 0xfd, 0x77, 0xdb, 0x36,
0x92, 0xbf, 0xe7, 0xaf, 0x40, 0x98, 0xd4, 0x21, 0x6b, 0x8a, 0x22, 0x29, 0x5b, 0xb2, 0x25, 0xd1,
0xdd, 0xd4, 0xc9, 0x9e, 0x73, 0xcf, 0x6e, 0xf2, 0x36, 0x3e, 0xb7, 0x3d, 0x9f, 0xf7, 0x99, 0x26,
0x21, 0x89, 0x0d, 0x45, 0x70, 0x41, 0x48, 0xb6, 0x2b, 0xeb, 0x7f, 0xbf, 0x19, 0x00, 0xa4, 0x48,

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -49,6 +49,7 @@ String PinManagerClass::getOwnerText(PinOwner tag) {
case PinOwner::DMX : return(F("DMX out")); break; // 'DMX' == hard-coded to IO2
case PinOwner::HW_I2C : return(F("I2C (hw)")); break; // 'I2C' == hardware I2C pins (4&5 on ESP8266, 21&22 on ESP32)
case PinOwner::HW_SPI : return(F("SPI (hw)")); break; // 'SPI' == hardware (V)SPI pins (13,14&15 on ESP8266, 5,18&23 on ESP32)
case PinOwner::DMX_INPUT : return(F("DMX Input")); break;
case PinOwner::UM_Audioreactive : return(F("AudioReactive (UM)")); break; // audioreactive usermod - analog or digital audio input
case PinOwner::UM_Temperature : return(F("Temperature (UM)")); break; // "usermod_temperature.h"
@@ -446,7 +447,9 @@ bool PinManagerClass::allocateMultiplePins(const managed_pin_type * mptArray, by
bool PinManagerClass::allocatePin(byte gpio, bool output, PinOwner tag)
{
// HW I2C & SPI pins have to be allocated using allocateMultiplePins variant since there is always SCL/SDA pair
if (!isPinOk(gpio, output) || (gpio >= WLED_NUM_PINS) || tag==PinOwner::HW_I2C || tag==PinOwner::HW_SPI) {
// DMX_INPUT pins have to be allocated using allocateMultiplePins variant since there is always RX/TX/EN triple
if (!isPinOk(gpio, output) || (gpio >= WLED_NUM_PINS) || tag==PinOwner::HW_I2C || tag==PinOwner::HW_SPI
|| tag==PinOwner::DMX_INPUT) {
#ifdef WLED_DEBUG
if (gpio < 255) { // 255 (-1) is the "not defined GPIO"
if (!isPinOk(gpio, output)) {

View File

@@ -26,15 +26,16 @@ enum struct PinOwner : uint8_t {
Ethernet = 0x81,
BusDigital = 0x82,
BusOnOff = 0x83,
BusPwm = 0x84, // 'BusP' == PWM output using BusPwm
Button = 0x85, // 'Butn' == button from configuration
IR = 0x86, // 'IR' == IR receiver pin from configuration
Relay = 0x87, // 'Rly' == Relay pin from configuration
SPI_RAM = 0x88, // 'SpiR' == SPI RAM
DebugOut = 0x89, // 'Dbg' == debug output always IO1
DMX = 0x8A, // 'DMX' == hard-coded to IO2
HW_I2C = 0x8B, // 'I2C' == hardware I2C pins (4&5 on ESP8266, 21&22 on ESP32)
HW_SPI = 0x8C, // 'SPI' == hardware (V)SPI pins (13,14&15 on ESP8266, 5,18&23 on ESP32)
BusPwm = 0x84, // 'BusP' == PWM output using BusPwm
Button = 0x85, // 'Butn' == button from configuration
IR = 0x86, // 'IR' == IR receiver pin from configuration
Relay = 0x87, // 'Rly' == Relay pin from configuration
SPI_RAM = 0x88, // 'SpiR' == SPI RAM
DebugOut = 0x89, // 'Dbg' == debug output always IO1
DMX = 0x8A, // 'DMX' == hard-coded to IO2
HW_I2C = 0x8B, // 'I2C' == hardware I2C pins (4&5 on ESP8266, 21&22 on ESP32)
HW_SPI = 0x8C, // 'SPI' == hardware (V)SPI pins (13,14&15 on ESP8266, 5,18&23 on ESP32)
DMX_INPUT = 0x8D, // 'DMX_INPUT' == DMX input via serial
// Use UserMod IDs from const.h here
UM_Unspecified = USERMOD_ID_UNSPECIFIED, // 0x01
UM_Example = USERMOD_ID_EXAMPLE, // 0x02 // Usermod "usermod_v2_example.h"

View File

@@ -358,9 +358,11 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
if (t >= -255 && t <= 255) arlsOffset = t;
#ifdef WLED_ENABLE_DMX_INPUT
dmxTransmitPin = request->arg(F("DMT")).toInt();
dmxReceivePin = request->arg(F("DMR")).toInt();
dmxEnablePin= request->arg(F("DME")).toInt();
dmxInputTransmitPin = request->arg(F("IDMT")).toInt();
dmxInputReceivePin = request->arg(F("IDMR")).toInt();
dmxInputEnablePin = request->arg(F("IDME")).toInt();
dmxInputPort = request->arg(F("IDMP")).toInt();
if(dmxInputPort <= 0 || dmxInputPort > 2) dmxInputPort = 2;
#endif
alexaEnabled = request->hasArg(F("AL"));

View File

@@ -139,10 +139,10 @@ void WLED::loop()
#endif
#ifdef WLED_ENABLE_DMX
handleDMX();
handleDMXOutput();
#endif
#ifdef WLED_ENABLE_DMX_INPUT
handleDMXInput();
dmxInput.update();
#endif
userLoop();
@@ -179,7 +179,11 @@ void WLED::loop()
}
#endif
if (doSerializeConfig) serializeConfig();
if (doSerializeConfig)
{
serializeConfig();
}
if (doReboot && !doInitBusses) // if busses have to be inited & saved, wait until next iteration
reset();
@@ -621,11 +625,6 @@ pinManager.allocateMultiplePins(pins, sizeof(pins)/sizeof(managed_pin_type), Pin
#ifdef WLED_ENABLE_DMX //reserve GPIO2 as hardcoded DMX pin
pinManager.allocatePin(2, true, PinOwner::DMX);
#endif
#ifdef WLED_ENABLE_DMX_INPUT
if(dmxTransmitPin > 0) pinManager.allocatePin(dmxTransmitPin, true, PinOwner::DMX);
if(dmxReceivePin > 0) pinManager.allocatePin(dmxReceivePin, true, PinOwner::DMX);
if(dmxEnablePin > 0) pinManager.allocatePin(dmxEnablePin, true, PinOwner::DMX);
#endif
#if defined(ALL_JSON_TO_PSRAM) && defined(WLED_USE_PSRAM_JSON)
USER_PRINTLN(F("JSON gabage collection (initial)."));
@@ -752,8 +751,11 @@ pinManager.allocateMultiplePins(pins, sizeof(pins)/sizeof(managed_pin_type), Pin
ArduinoOTA.setHostname(cmDNS);
}
#endif
#if defined(WLED_ENABLE_DMX) || defined(WLED_ENABLE_DMX_INPUT)
initDMX();
#ifdef WLED_ENABLE_DMX
initDMXOutput();
#endif
#ifdef WLED_ENABLE_DMX_INPUT
dmxInput.init(dmxInputReceivePin, dmxInputTransmitPin, dmxInputEnablePin, dmxInputPort);
#endif
#ifdef WLED_ENABLE_ADALIGHT

View File

@@ -165,6 +165,10 @@
#endif
#endif
#ifdef WLED_ENABLE_DMX_INPUT
#include "dmx_input.h"
#endif
#include "src/dependencies/e131/ESPAsyncE131.h"
#ifdef WLED_ENABLE_MQTT
#include "src/dependencies/async-mqtt-client/AsyncMqttClient.h"
@@ -443,9 +447,11 @@ WLED_GLOBAL bool arlsForceMaxBri _INIT(false); // enable to f
WLED_GLOBAL uint16_t e131ProxyUniverse _INIT(0); // output this E1.31 (sACN) / ArtNet universe via MAX485 (0 = disabled)
#endif
#ifdef WLED_ENABLE_DMX_INPUT
WLED_GLOBAL int dmxTransmitPin _INIT(0);
WLED_GLOBAL int dmxReceivePin _INIT(0);
WLED_GLOBAL int dmxEnablePin _INIT(0);
WLED_GLOBAL int dmxInputTransmitPin _INIT(0);
WLED_GLOBAL int dmxInputReceivePin _INIT(0);
WLED_GLOBAL int dmxInputEnablePin _INIT(0);
WLED_GLOBAL int dmxInputPort _INIT(2);
WLED_GLOBAL DMXInput dmxInput;
#endif
WLED_GLOBAL uint16_t e131Universe _INIT(1); // settings for E1.31 (sACN) protocol (only DMX_MODE_MULTIPLE_* can span over consecutive universes)

View File

@@ -581,9 +581,10 @@ void getSettingsJS(AsyncWebServerRequest* request, byte subPage, char* dest) //W
oappend(SET_F("hideDMXInput();")); // WLEDMM hide "dmx input" settings
#else
oappend(SET_F("hideNoDMXInput();")); // WLEDMM hide "not compiled in" message
sappend('v',SET_F("DMT"),dmxTransmitPin);
sappend('v',SET_F("DMR"),dmxReceivePin);
sappend('v',SET_F("DME"),dmxEnablePin);
sappend('v',SET_F("IDMT"),dmxInputTransmitPin);
sappend('v',SET_F("IDMR"),dmxInputReceivePin);
sappend('v',SET_F("IDME"),dmxInputEnablePin);
sappend('v',SET_F("IDMP"),dmxInputPort);
#endif
sappend('v',SET_F("DA"),DMXAddress);
sappend('v',SET_F("XX"),DMXSegmentSpacing);