From 01b1c5165322cec4327bbfd34e2d4c9a5e001b30 Mon Sep 17 00:00:00 2001 From: Jonny Davey Date: Sat, 7 Feb 2026 13:37:50 +0000 Subject: [PATCH 1/7] Add experimental ESP32-C5 support with WiFi 6 dual-band ESP32-C5 is a RISC-V based SoC with WiFi 6 (2.4GHz + 5GHz) support. Treats C5 similarly to C3 for hardware capabilities (2 RMT channels, no parallel I2S for LEDs, similar GPIO restrictions). Changes across 25 files: - Add CONFIG_IDF_TARGET_ESP32C5 conditionals alongside C3/C6 checks - Add [esp32c5] and [env:esp32c5dev] build environments in platformio.ini - Uses pioarduino platform (Tasmota framework lacks C5 Arduino libs) - Exclude esp_dmx library (doesn't support C5 UART registers yet) - Fix LEDC register access for IDF 5.5.0 (duty_init vs duty) - Guard mbedtls_sha1_shim for IDF 5.5.0 (SHA1 built-in) - Add C5 chip identification (ID: 0x0017) in OTA and web UI Known limitations: - RMT LED output shows flush timeouts (needs NeoPixelBus C5 support) - WiFi AP confirmed working on hardware - esp_dmx/DMX input disabled - Experimental: requires pioarduino community platform Co-Authored-By: Claude Opus 4.6 --- platformio.ini | 51 +++++++++++++++++++ usermods/audioreactive/audio_reactive.cpp | 30 ++++++------ wled00/FX.h | 8 +-- wled00/FX_fcn.cpp | 10 ++-- wled00/FXparticleSystem.cpp | 14 +++--- wled00/NodeStruct.h | 2 + wled00/bus_manager.cpp | 14 ++++-- wled00/bus_wrapper.h | 26 +++++----- wled00/button.cpp | 2 +- wled00/cfg.cpp | 4 +- wled00/const.h | 8 +-- wled00/data/index.js | 3 ++ wled00/dmx_output.cpp | 2 +- wled00/improv.cpp | 2 +- wled00/json.cpp | 6 ++- wled00/mbedtls_sha1_shim.cpp | 3 +- wled00/ota_update.cpp | 7 +++ wled00/pin_manager.cpp | 7 +++ wled00/set.cpp | 2 +- wled00/src/dependencies/dmx/ESPDMX.cpp | 2 +- wled00/src/dependencies/dmx/SparkFunDMX.cpp | 2 +- wled00/udp.cpp | 4 ++ wled00/util.cpp | 6 +-- wled00/wled.cpp | 54 ++++++++++++++++++++- wled00/wled.h | 10 ++-- 25 files changed, 206 insertions(+), 73 deletions(-) diff --git a/platformio.ini b/platformio.ini index aa542a3c34..1f80fb2a5f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -454,6 +454,57 @@ build_unflags = ${env:esp32c6dev_8MB.build_unflags} -D WLED_RELEASE_NAME=\"ESP32 build_flags = ${env:esp32c6dev_8MB.build_flags} -D WLED_RELEASE_NAME=\"ESP32-C6_4MB\" +[esp32c5] +;; generic definitions for all ESP32-C5 boards +;; NOTE: ESP32-C5 requires pioarduino platform (Tasmota framework doesn't include C5 Arduino libs yet) +platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip +platform_packages = +build_unflags = ${esp32_idf_V5.build_unflags} + -D WLED_ENABLE_DMX_INPUT ;; esp_dmx library doesn't support C5 UART registers yet +build_flags = -g + -Wshadow=compatible-local + -DARDUINO_ARCH_ESP32 + -DARDUINO_ARCH_ESP32C5 + -DCONFIG_IDF_TARGET_ESP32C5=1 + -D CONFIG_ASYNC_TCP_USE_WDT=0 + -DCO + -DARDUINO_USB_MODE=1 + ${esp32_idf_V5.build_flags} +lib_deps = + ${esp32_idf_V5.lib_deps} +lib_ignore = ${esp32_idf_V5.lib_ignore} + esp_dmx ;; esp_dmx library doesn't support C5 UART registers yet + +[env:esp32c5dev] +;; ESP32-C5 "devkit C" with 4MB flash - EXPERIMENTAL +extends = esp32c5 +platform = ${esp32c5.platform} +platform_packages = ${esp32c5.platform_packages} +framework = arduino +board = esp32-c5-devkitc-1 + +build_unflags = ${esp32c5.build_unflags} +build_flags = ${common.build_flags} ${esp32c5.build_flags} -D WLED_RELEASE_NAME=\"ESP32-C5\" + -Wno-volatile -Wno-deprecated-declarations + -D WLED_WATCHDOG_TIMEOUT=0 + -DARDUINO_USB_CDC_ON_BOOT=0 ;; for serial-to-USB chip + -D WLED_DISABLE_INFRARED ;; library not compatible with -C5 + -D WLED_DISABLE_ESPNOW ;; not yet tested + -D WLED_DISABLE_ALEXA ;; compile errors + -D WLED_DISABLE_WEBSOCKETS ;; not yet tested +upload_speed = 460800 +lib_deps = ${esp32c5.lib_deps} +lib_ignore = ${esp32c5.lib_ignore} + IRremoteESP8266 + QuickEspNow + +board_build.partitions = ${esp32.big_partitions} +board_build.f_flash = 80000000L +board_build.flash_mode = qio +board_build.arduino.memory_type = qio_qspi +monitor_filters = esp32_exception_decoder + + [esp32s3] ;; generic definitions for all ESP32-S3 boards platform = ${esp32_idf_V5.platform} diff --git a/usermods/audioreactive/audio_reactive.cpp b/usermods/audioreactive/audio_reactive.cpp index 1d1825fdf1..54f8a61b9e 100644 --- a/usermods/audioreactive/audio_reactive.cpp +++ b/usermods/audioreactive/audio_reactive.cpp @@ -672,7 +672,7 @@ class AudioReactive : public Usermod { static const char _dynamics[]; static const char _frequency[]; static const char _inputLvl[]; -#if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) +#if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32S3) static const char _analogmic[]; #endif static const char _digitalmic[]; @@ -1164,7 +1164,7 @@ class AudioReactive : public Usermod { // Reset I2S peripheral for good measure i2s_driver_uninstall(I2S_NUM_0); // E (696) I2S: i2s_driver_uninstall(2006): I2S port 0 has not installed - #if !defined(CONFIG_IDF_TARGET_ESP32C3) + #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) delay(100); periph_module_reset(PERIPH_I2S0_MODULE); // not possible on -C3 #endif @@ -1172,15 +1172,15 @@ class AudioReactive : public Usermod { useBandPassFilter = false; - #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) + #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) if ((i2sckPin == I2S_PIN_NO_CHANGE) && (i2ssdPin >= 0) && (i2swsPin >= 0) && ((dmType == 1) || (dmType == 4)) ) dmType = 5; // dummy user support: SCK == -1 --means--> PDM microphone #endif switch (dmType) { - #if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S3) + #if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32S3) // stub cases for not-yet-supported I2S modes on other ESP32 chips case 0: //ADC analog - #if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) + #if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) case 5: //PDM Microphone #endif #endif @@ -1208,7 +1208,7 @@ class AudioReactive : public Usermod { delay(100); if (audioSource) audioSource->initialize(i2swsPin, i2ssdPin, i2sckPin, mclkPin); break; - #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) + #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) case 5: DEBUGSR_PRINT(F("AR: I2S PDM Microphone - ")); DEBUGSR_PRINTLN(F(I2S_PDM_MIC_CHANNEL_TEXT)); audioSource = new I2SSource(SAMPLE_RATE, BLOCK_SIZE, 1.0f/4.0f); @@ -1224,7 +1224,7 @@ class AudioReactive : public Usermod { if (audioSource) audioSource->initialize(i2swsPin, i2ssdPin, i2sckPin, mclkPin); break; - #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) + #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32S3) // ADC over I2S is only possible on "classic" ESP32 case 0: DEBUGSR_PRINTLN(F("AR: Analog Microphone (left channel only).")); @@ -1801,7 +1801,7 @@ class AudioReactive : public Usermod { top[FPSTR(_addPalettes)] = addPalettes; #ifdef ARDUINO_ARCH_ESP32 - #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) + #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32S3) JsonObject amic = top.createNestedObject(FPSTR(_analogmic)); amic["pin"] = audioPin; #endif @@ -1860,16 +1860,16 @@ class AudioReactive : public Usermod { configComplete &= getJsonValue(top[FPSTR(_addPalettes)], addPalettes); #ifdef ARDUINO_ARCH_ESP32 - #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) + #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32S3) configComplete &= getJsonValue(top[FPSTR(_analogmic)]["pin"], audioPin); #else audioPin = -1; // MCU does not support analog mic #endif configComplete &= getJsonValue(top[FPSTR(_digitalmic)]["type"], dmType); - #if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S3) + #if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32S3) if (dmType == 0) dmType = SR_DMTYPE; // MCU does not support analog - #if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) + #if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) if (dmType == 5) dmType = SR_DMTYPE; // MCU does not support PDM #endif #endif @@ -1907,14 +1907,14 @@ class AudioReactive : public Usermod { #ifdef ARDUINO_ARCH_ESP32 uiScript.print(F("uxp=ux+':digitalmic:pin[]';")); // uxp = shortcut for AudioReactive:digitalmic:pin[] uiScript.print(F("dd=addDropdown(ux,'digitalmic:type');")); - #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) + #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32S3) uiScript.print(F("addOption(dd,'Generic Analog',0);")); #endif uiScript.print(F("addOption(dd,'Generic I2S',1);")); uiScript.print(F("addOption(dd,'ES7243',2);")); uiScript.print(F("addOption(dd,'SPH0654',3);")); uiScript.print(F("addOption(dd,'Generic I2S with Mclk',4);")); - #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) + #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) uiScript.print(F("addOption(dd,'Generic I2S PDM',5);")); #endif uiScript.print(F("addOption(dd,'ES8388',6);")); @@ -1950,7 +1950,7 @@ class AudioReactive : public Usermod { uiScript.print(F("addInfo(uxp,0,'sd/data/dout','I2S SD');")); uiScript.print(F("addInfo(uxp,1,'ws/clk/lrck','I2S WS');")); uiScript.print(F("addInfo(uxp,2,'sck/bclk','I2S SCK');")); - #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) + #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32S3) uiScript.print(F("addInfo(uxp,3,'only use -1, 0, 1 or 3','I2S MCLK');")); #else uiScript.print(F("addInfo(uxp,3,'master clock','I2S MCLK');")); @@ -2073,7 +2073,7 @@ const char AudioReactive::_config[] PROGMEM = "config"; const char AudioReactive::_dynamics[] PROGMEM = "dynamics"; const char AudioReactive::_frequency[] PROGMEM = "frequency"; const char AudioReactive::_inputLvl[] PROGMEM = "inputLevel"; -#if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) +#if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32S3) const char AudioReactive::_analogmic[] PROGMEM = "analogmic"; #endif const char AudioReactive::_digitalmic[] PROGMEM = "digitalmic"; diff --git a/wled00/FX.h b/wled00/FX.h index 250df2646d..196a72346d 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -70,10 +70,10 @@ extern byte realtimeMode; // used in getMappedPixelIndex() #define WLED_FPS 42 #define FRAMETIME_FIXED (1000/WLED_FPS) #define FRAMETIME strip.getFrameTime() -#if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S2) - #define MIN_FRAME_DELAY 2 // minimum wait between repaints, to keep other functions like WiFi alive -#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) - #define MIN_FRAME_DELAY 3 // S2/C3 are slower than normal esp32, and only have one core +#if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32S2) + #define MIN_FRAME_DELAY 2 // minimum wait between repaints, to keep other functions like WiFi alive +#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) + #define MIN_FRAME_DELAY 3 // S2/C3/C5 are slower than normal esp32, and only have one core #else #define MIN_FRAME_DELAY 8 // 8266 legacy MIN_SHOW_DELAY #endif diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 47ef23cd40..21d15cd58b 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -1161,7 +1161,7 @@ void WS2812FX::finalizeInit() { BusManager::removeAll(); unsigned digitalCount = 0; - #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) // determine if it is sensible to use parallel I2S outputs on ESP32 (i.e. more than 5 outputs = 1 I2S + 4 RMT) unsigned maxLedsOnBus = 0; unsigned busType = 0; @@ -1191,7 +1191,7 @@ void WS2812FX::finalizeInit() { unsigned memB = bus.memUsage(Bus::isDigital(bus.type) && !Bus::is2Pin(bus.type) ? digitalCount++ : 0); // does not include DMA/RMT buffer mem += memB; // estimate maximum I2S memory usage (only relevant for digital non-2pin busses) - #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) && !defined(ESP8266) + #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) && !defined(ESP8266) #if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S3) const bool usesI2S = ((useParallelI2S && digitalCount <= 8) || (!useParallelI2S && digitalCount == 1)); #elif defined(CONFIG_IDF_TARGET_ESP32S2) @@ -1339,8 +1339,8 @@ static uint8_t _add (uint8_t a, uint8_t b) { unsigned t = a + b; return t static uint8_t _subtract (uint8_t a, uint8_t b) { return b > a ? (b - a) : 0; } static uint8_t _difference(uint8_t a, uint8_t b) { return b > a ? (b - a) : (a - b); } static uint8_t _average (uint8_t a, uint8_t b) { return (a + b) >> 1; } -#if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) -static uint8_t _multiply (uint8_t a, uint8_t b) { return ((a * b) + 255) >> 8; } // faster than division on C3 but slightly less accurate +#if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) +static uint8_t _multiply (uint8_t a, uint8_t b) { return ((a * b) + 255) >> 8; } // faster than division on C3/C5 but slightly less accurate #else static uint8_t _multiply (uint8_t a, uint8_t b) { return (a * b) / 255; } // origianl uses a & b in range [0,1] #endif @@ -1350,7 +1350,7 @@ static uint8_t _darken (uint8_t a, uint8_t b) { return a < b ? a : b; } static uint8_t _screen (uint8_t a, uint8_t b) { return 255 - _multiply(~a,~b); } // 255 - (255-a)*(255-b)/255 static uint8_t _overlay (uint8_t a, uint8_t b) { return b < 128 ? 2 * _multiply(a,b) : (255 - 2 * _multiply(~a,~b)); } static uint8_t _hardlight (uint8_t a, uint8_t b) { return a < 128 ? 2 * _multiply(a,b) : (255 - 2 * _multiply(~a,~b)); } -#if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) +#if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) static uint8_t _softlight (uint8_t a, uint8_t b) { return (((b * b * (255 - 2 * a))) + ((2 * a * b + 256) << 8)) >> 16; } // Pegtop's formula (1 - 2a)b^2 #else static uint8_t _softlight (uint8_t a, uint8_t b) { return (b * b * (255 - 2 * a) + 255 * 2 * a * b) / (255 * 255); } // Pegtop's formula (1 - 2a)b^2 + 2ab diff --git a/wled00/FXparticleSystem.cpp b/wled00/FXparticleSystem.cpp index 1a1ed08850..f64ba1e5cc 100644 --- a/wled00/FXparticleSystem.cpp +++ b/wled00/FXparticleSystem.cpp @@ -493,7 +493,7 @@ void ParticleSystem2D::applyGravity(PSparticle &part) { // note: a coefficient smaller than 0 will speed them up (this is a feature, not a bug), coefficient larger than 255 inverts the speed, so don't do that void ParticleSystem2D::applyFriction(PSparticle &part, const int32_t coefficient) { // note: not checking if particle is dead can be done by caller (or can be omitted) - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(ESP8266) // use bitshifts with rounding instead of division (2x faster) + #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(ESP8266) // use bitshifts with rounding instead of division (2x faster) int32_t friction = 256 - coefficient; part.vx = ((int32_t)part.vx * friction + (((int32_t)part.vx >> 31) & 0xFF)) >> 8; // note: (v>>31) & 0xFF)) extracts the sign and adds 255 if negative for correct rounding using shifts part.vy = ((int32_t)part.vy * friction + (((int32_t)part.vy >> 31) & 0xFF)) >> 8; @@ -507,7 +507,7 @@ void ParticleSystem2D::applyFriction(PSparticle &part, const int32_t coefficient // apply friction to all particles // note: not checking if particle is dead is faster as most are usually alive and if few are alive, rendering is fast anyways void ParticleSystem2D::applyFriction(const int32_t coefficient) { - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(ESP8266) // use bitshifts with rounding instead of division (2x faster) + #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(ESP8266) // use bitshifts with rounding instead of division (2x faster) int32_t friction = 256 - coefficient; for (uint32_t i = 0; i < usedParticles; i++) { particles[i].vx = ((int32_t)particles[i].vx * friction + (((int32_t)particles[i].vx >> 31) & 0xFF)) >> 8; // note: (v>>31) & 0xFF)) extracts the sign and adds 255 if negative for correct rounding using shifts @@ -891,7 +891,7 @@ void WLED_O2_ATTR ParticleSystem2D::collideParticles(PSparticle &particle1, PSpa int32_t surfacehardness = 1 + max(collisionHardness, (int32_t)PS_P_MINSURFACEHARDNESS); // if particles are soft, the impulse must stay above a limit or collisions slip through at higher speeds, 170 seems to be a good value int32_t impulse = (((((-dotProduct) << 15) / distanceSquared) * surfacehardness) >> 8); // note: inverting before bitshift corrects for asymmetry in right-shifts (is slightly faster) - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(ESP8266) // use bitshifts with rounding instead of division (2x faster) + #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(ESP8266) // use bitshifts with rounding instead of division (2x faster) int32_t ximpulse = (impulse * dx + ((dx >> 31) & 32767)) >> 15; // note: extracting sign bit and adding rounding value to correct for asymmetry in right shifts int32_t yimpulse = (impulse * dy + ((dy >> 31) & 32767)) >> 15; #else @@ -906,7 +906,7 @@ void WLED_O2_ATTR ParticleSystem2D::collideParticles(PSparticle &particle1, PSpa if (collisionHardness < PS_P_MINSURFACEHARDNESS && (SEGMENT.call & 0x07) == 0) { // if particles are soft, they become 'sticky' i.e. apply some friction (they do pile more nicely and stop sloshing around) const uint32_t coeff = collisionHardness + (255 - PS_P_MINSURFACEHARDNESS); // Note: could call applyFriction, but this is faster and speed is key here - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(ESP8266) // use bitshifts with rounding instead of division (2x faster) + #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(ESP8266) // use bitshifts with rounding instead of division (2x faster) particle1.vx = ((int32_t)particle1.vx * coeff + (((int32_t)particle1.vx >> 31) & 0xFF)) >> 8; // note: (v>>31) & 0xFF)) extracts the sign and adds 255 if negative for correct rounding using shifts particle1.vy = ((int32_t)particle1.vy * coeff + (((int32_t)particle1.vy >> 31) & 0xFF)) >> 8; particle2.vx = ((int32_t)particle2.vx * coeff + (((int32_t)particle2.vx >> 31) & 0xFF)) >> 8; @@ -1398,7 +1398,7 @@ void ParticleSystem1D::applyGravity(PSparticle1D &part, PSparticleFlags1D &partF // slow down particle by friction, the higher the speed, the higher the friction. a high friction coefficient slows them more (255 means instant stop) // note: a coefficient smaller than 0 will speed them up (this is a feature, not a bug), coefficient larger than 255 inverts the speed, so don't do that void ParticleSystem1D::applyFriction(int32_t coefficient) { - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(ESP8266) // use bitshifts with rounding instead of division (2x faster) + #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(ESP8266) // use bitshifts with rounding instead of division (2x faster) int32_t friction = 256 - coefficient; for (uint32_t i = 0; i < usedParticles; i++) { if (particles[i].ttl) @@ -1652,7 +1652,7 @@ void WLED_O2_ATTR ParticleSystem1D::collideParticles(PSparticle1D &particle1, co if (dotProduct < 0) { // particles are moving towards each other uint32_t surfacehardness = max(collisionHardness, (int32_t)PS_P_MINSURFACEHARDNESS_1D); // if particles are soft, the impulse must stay above a limit or collisions slip through // Calculate new velocities after collision note: not using dot product like in 2D as impulse is purely speed depnedent - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(ESP8266) // use bitshifts with rounding instead of division (2x faster) + #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(ESP8266) // use bitshifts with rounding instead of division (2x faster) int32_t impulse = ((dv * surfacehardness) + ((dv >> 31) & 0xFF)) >> 8; // note: (v>>31) & 0xFF)) extracts the sign and adds 255 if negative for correct rounding using shifts #else // division is faster on ESP32, S2 and S3 int32_t impulse = (dv * surfacehardness) / 255; @@ -1668,7 +1668,7 @@ void WLED_O2_ATTR ParticleSystem1D::collideParticles(PSparticle1D &particle1, co if (collisionHardness < PS_P_MINSURFACEHARDNESS_1D && (SEGMENT.call & 0x07) == 0) { // if particles are soft, they become 'sticky' i.e. apply some friction const uint32_t coeff = collisionHardness + (250 - PS_P_MINSURFACEHARDNESS_1D); - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(ESP8266) // use bitshifts with rounding instead of division (2x faster) + #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(ESP8266) // use bitshifts with rounding instead of division (2x faster) particle1.vx = ((int32_t)particle1.vx * coeff + (((int32_t)particle1.vx >> 31) & 0xFF)) >> 8; // note: (v>>31) & 0xFF)) extracts the sign and adds 255 if negative for correct rounding using shifts particle2.vx = ((int32_t)particle2.vx * coeff + (((int32_t)particle2.vx >> 31) & 0xFF)) >> 8; #else // division is faster on ESP32, S2 and S3 diff --git a/wled00/NodeStruct.h b/wled00/NodeStruct.h index 34f73ab418..f436a6519e 100644 --- a/wled00/NodeStruct.h +++ b/wled00/NodeStruct.h @@ -14,6 +14,8 @@ #define NODE_TYPE_ID_ESP32S2 33 // etc #define NODE_TYPE_ID_ESP32S3 34 #define NODE_TYPE_ID_ESP32C3 35 +#define NODE_TYPE_ID_ESP32C6 36 +#define NODE_TYPE_ID_ESP32C5 41 /*********************************************************************************************\ * NodeStruct diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index e2e28cebc0..abd50111e6 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -9,7 +9,7 @@ #include "src/dependencies/network/Network.h" // for isConnected() (& WiFi) #include "driver/ledc.h" #include "soc/ledc_struct.h" - #if !(defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)) + #if !(defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)) #define LEDC_MUTEX_LOCK() do {} while (xSemaphoreTake(_ledc_sys_lock, portMAX_DELAY) != pdPASS) #define LEDC_MUTEX_UNLOCK() xSemaphoreGive(_ledc_sys_lock) extern SemaphoreHandle_t _ledc_sys_lock; @@ -593,7 +593,11 @@ void BusPwm::show() { unsigned ch = channel%8; // group channel // directly write to LEDC struct as there is no HAL exposed function for dithering // duty has 20 bit resolution with 4 fractional bits (24 bits in total) + #if defined(CONFIG_IDF_TARGET_ESP32C5) + LEDC.channel_group[gr].channel[ch].duty_init.duty = duty << ((!dithering)*4); // C5 LEDC struct uses duty_init + #else LEDC.channel_group[gr].channel[ch].duty.duty = duty << ((!dithering)*4); // lowest 4 bits are used for dithering, shift by 4 bits if not using dithering + #endif LEDC.channel_group[gr].channel[ch].hpoint.hpoint = hPoint >> bitShift; // hPoint is at _depth resolution (needs shifting if dithering) ledc_update_duty((ledc_mode_t)gr, (ledc_channel_t)ch); #endif @@ -1140,12 +1144,12 @@ size_t BusManager::memUsage() { // front buffers are always allocated per bus unsigned size = 0; unsigned maxI2S = 0; - #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(ESP8266) + #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(ESP8266) unsigned digitalCount = 0; #endif for (const auto &bus : busses) { size += bus->getBusSize(); - #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(ESP8266) + #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(ESP8266) if (bus->isDigital() && !bus->is2Pin()) { digitalCount++; if ((PolyBus::isParallelI2S1Output() && digitalCount <= 8) || (!PolyBus::isParallelI2S1Output() && digitalCount == 1)) { @@ -1242,8 +1246,8 @@ void BusManager::removeAll() { // If enabled, RMT idle level is set to HIGH when off // to prevent leakage current when using an N-channel MOSFET to toggle LED power void BusManager::esp32RMTInvertIdle() { -#if defined(CONFIG_IDF_TARGET_ESP32C6) - // ESP32-C6 uses BitBang method, not RMT - nothing to do here +#if defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32C6) + // ESP32-C5/C6 use shared RMT method - idle level inversion not supported return; #else bool idle_out; diff --git a/wled00/bus_wrapper.h b/wled00/bus_wrapper.h index 43bc0e2ed7..6beab153bf 100644 --- a/wled00/bus_wrapper.h +++ b/wled00/bus_wrapper.h @@ -248,7 +248,7 @@ typedef NeoEsp32I2s0Apa106Method X1Apa106Method; typedef NeoEsp32I2s0Ws2805Method X1Ws2805Method; typedef NeoEsp32I2s0Tm1914Method X1Tm1914Method; -#elif !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) +#elif !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) // regular ESP32 will use I2S1 typedef NeoEsp32I2s1Ws2812xMethod X1Ws2812xMethod; typedef NeoEsp32I2s1Sk6812Method X1Sk6812Method; @@ -464,7 +464,7 @@ class PolyBus { case I_32_RN_TM1914_3: beginTM1914(busPtr); break; case I_32_RN_SM16825_5: (static_cast(busPtr))->Begin(); break; // I2S1 bus or parellel buses - #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) case I_32_I2_NEO_3: if (_useParallelI2S) (static_cast(busPtr))->Begin(); else (static_cast(busPtr))->Begin(); break; case I_32_I2_NEO_4: if (_useParallelI2S) (static_cast(busPtr))->Begin(); else (static_cast(busPtr))->Begin(); break; case I_32_I2_400_3: if (_useParallelI2S) (static_cast(busPtr))->Begin(); else (static_cast(busPtr))->Begin(); break; @@ -496,7 +496,7 @@ class PolyBus { static void* create(uint8_t busType, uint8_t* pins, uint16_t len, uint8_t channel) { // NOTE: "channel" is only used on ESP32 (and its variants) for RMT channel allocation - #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) if (_useParallelI2S && (channel >= 8)) { // Parallel I2S channels are to be used first, so subtract 8 to get the RMT channel number channel -= 8; @@ -576,7 +576,7 @@ class PolyBus { case I_32_RN_TM1914_3: busPtr = new B_32_RN_TM1914_3(len, pins[0], (NeoBusChannel)channel); break; case I_32_RN_SM16825_5: busPtr = new B_32_RN_SM16825_5(len, pins[0], (NeoBusChannel)channel); break; // I2S1 bus or paralell buses - #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) case I_32_I2_NEO_3: if (_useParallelI2S) busPtr = new B_32_IP_NEO_3(len, pins[0]); else busPtr = new B_32_I2_NEO_3(len, pins[0]); break; case I_32_I2_NEO_4: if (_useParallelI2S) busPtr = new B_32_IP_NEO_4(len, pins[0]); else busPtr = new B_32_I2_NEO_4(len, pins[0]); break; case I_32_I2_400_3: if (_useParallelI2S) busPtr = new B_32_IP_400_3(len, pins[0]); else busPtr = new B_32_I2_400_3(len, pins[0]); break; @@ -675,7 +675,7 @@ class PolyBus { case I_32_RN_TM1914_3: (static_cast(busPtr))->Show(consistent); break; case I_32_RN_SM16825_5: (static_cast(busPtr))->Show(consistent); break; // I2S1 bus or paralell buses - #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) case I_32_I2_NEO_3: if (_useParallelI2S) (static_cast(busPtr))->Show(consistent); else (static_cast(busPtr))->Show(consistent); break; case I_32_I2_NEO_4: if (_useParallelI2S) (static_cast(busPtr))->Show(consistent); else (static_cast(busPtr))->Show(consistent); break; case I_32_I2_400_3: if (_useParallelI2S) (static_cast(busPtr))->Show(consistent); else (static_cast(busPtr))->Show(consistent); break; @@ -771,7 +771,7 @@ class PolyBus { case I_32_RN_TM1914_3: return (static_cast(busPtr))->CanShow(); break; case I_32_RN_SM16825_5: return (static_cast(busPtr))->CanShow(); break; // I2S1 bus or paralell buses - #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) case I_32_I2_NEO_3: if (_useParallelI2S) return (static_cast(busPtr))->CanShow(); else return (static_cast(busPtr))->CanShow(); break; case I_32_I2_NEO_4: if (_useParallelI2S) return (static_cast(busPtr))->CanShow(); else return (static_cast(busPtr))->CanShow(); break; case I_32_I2_400_3: if (_useParallelI2S) return (static_cast(busPtr))->CanShow(); else return (static_cast(busPtr))->CanShow(); break; @@ -893,7 +893,7 @@ class PolyBus { case I_32_RN_TM1914_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; case I_32_RN_SM16825_5: (static_cast(busPtr))->SetPixelColor(pix, Rgbww80Color(col.R*257, col.G*257, col.B*257, cctWW*257, cctCW*257)); break; // I2S1 bus or paralell buses - #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) case I_32_I2_NEO_3: if (_useParallelI2S) (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); else (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; case I_32_I2_NEO_4: if (_useParallelI2S) (static_cast(busPtr))->SetPixelColor(pix, col); else (static_cast(busPtr))->SetPixelColor(pix, col); break; case I_32_I2_400_3: if (_useParallelI2S) (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); else (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; @@ -990,7 +990,7 @@ class PolyBus { case I_32_RN_TM1914_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_32_RN_SM16825_5: { Rgbww80Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R/257,c.G/257,c.B/257,max(c.WW,c.CW)/257); } break; // will not return original W // I2S1 bus or paralell buses - #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) case I_32_I2_NEO_3: col = (_useParallelI2S) ? (static_cast(busPtr))->GetPixelColor(pix) : (static_cast(busPtr))->GetPixelColor(pix); break; case I_32_I2_NEO_4: col = (_useParallelI2S) ? (static_cast(busPtr))->GetPixelColor(pix) : (static_cast(busPtr))->GetPixelColor(pix); break; case I_32_I2_400_3: col = (_useParallelI2S) ? (static_cast(busPtr))->GetPixelColor(pix) : (static_cast(busPtr))->GetPixelColor(pix); break; @@ -1105,7 +1105,7 @@ class PolyBus { case I_32_RN_TM1914_3: delete (static_cast(busPtr)); break; case I_32_RN_SM16825_5: delete (static_cast(busPtr)); break; // I2S1 bus or paralell buses - #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) case I_32_I2_NEO_3: if (_useParallelI2S) delete (static_cast(busPtr)); else delete (static_cast(busPtr)); break; case I_32_I2_NEO_4: if (_useParallelI2S) delete (static_cast(busPtr)); else delete (static_cast(busPtr)); break; case I_32_I2_400_3: if (_useParallelI2S) delete (static_cast(busPtr)); else delete (static_cast(busPtr)); break; @@ -1202,7 +1202,7 @@ class PolyBus { case I_32_RN_TM1914_3: size = (static_cast(busPtr))->PixelsSize()*2; break; case I_32_RN_SM16825_5: size = (static_cast(busPtr))->PixelsSize()*2; break; // I2S1 bus or paralell buses (front + DMA; DMA = front * cadence, aligned to 4 bytes) - #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) case I_32_I2_NEO_3: size = (_useParallelI2S) ? (static_cast(busPtr))->PixelsSize()*4 : (static_cast(busPtr))->PixelsSize()*4; break; case I_32_I2_NEO_4: size = (_useParallelI2S) ? (static_cast(busPtr))->PixelsSize()*4 : (static_cast(busPtr))->PixelsSize()*4; break; case I_32_I2_400_3: size = (_useParallelI2S) ? (static_cast(busPtr))->PixelsSize()*4 : (static_cast(busPtr))->PixelsSize()*4; break; @@ -1281,7 +1281,7 @@ class PolyBus { case I_32_RN_2805_5 : size = (size + 2*count)*2; break; // 5 channels case I_32_RN_SM16825_5: size = (size + 2*count)*2*2; break; // 16bit, 5 channels // I2S1 bus or paralell I2S1 buses (1x front, does not include DMA buffer which is front*cadence, a bit(?) more for LCD) - #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) case I_32_I2_NEO_3 : // fallthrough case I_32_I2_400_3 : // fallthrough case I_32_I2_TM2_3 : // fallthrough @@ -1368,8 +1368,8 @@ class PolyBus { if (num > 4) return I_NONE; if (num > 3) offset = 1; // only one I2S0 (use last to allow Audioreactive) } - #elif defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32P4) - // On ESP32-C3 only the first 2 RMT channels are usable for transmitting + #elif defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32P4) + // On ESP32-C3/C5/C6 only the first 2 RMT channels are usable for transmitting if (num > 1) return I_NONE; //if (num > 1) offset = 1; // I2S not supported yet (only 1 I2S) #elif defined(CONFIG_IDF_TARGET_ESP32S3) diff --git a/wled00/button.cpp b/wled00/button.cpp index 651f12cf18..f1a29ecb72 100644 --- a/wled00/button.cpp +++ b/wled00/button.cpp @@ -109,7 +109,7 @@ bool isButtonPressed(uint8_t b) break; case BTN_TYPE_TOUCH: case BTN_TYPE_TOUCH_SWITCH: - #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) #ifdef SOC_TOUCH_VERSION_2 //ESP32 S2 and S3 provide a function to check touch state (state is updated in interrupt) if (touchInterruptGetLastStatus(pin)) return true; #else diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index 2bc3fe4503..bcab0af736 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -165,7 +165,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { uint8_t cctBlending = hw_led[F("cb")] | Bus::getCCTBlend(); Bus::setCCTBlend(cctBlending); strip.setTargetFps(hw_led["fps"]); //NOP if 0, default 42 FPS - #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) CJSON(useParallelI2S, hw_led[F("prl")]); #endif @@ -933,7 +933,7 @@ void serializeConfig(JsonObject root) { hw_led[F("cb")] = Bus::getCCTBlend(); hw_led["fps"] = strip.getTargetFps(); hw_led[F("rgbwm")] = Bus::getGlobalAWMode(); // global auto white mode override - #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) hw_led[F("prl")] = BusManager::hasParallelOutput(); #endif diff --git a/wled00/const.h b/wled00/const.h index ce03f9d856..d5078e8678 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -66,7 +66,7 @@ constexpr size_t FIXED_PALETTE_COUNT = DYNAMIC_PALETTE_COUNT + FASTLED_PALETTE_C constexpr size_t WLED_MAX_ANALOG_CHANNELS = static_cast(LEDC_CHANNEL_MAX) * static_cast(LEDC_SPEED_MODE_MAX); - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) + #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32C6) // 2 RMT, 6 LEDC, only has 1 I2S but NPB does not support it ATM #define WLED_MAX_DIGITAL_CHANNELS 2 //#define WLED_MAX_ANALOG_CHANNELS 6 @@ -477,7 +477,7 @@ static_assert(WLED_MAX_BUSSES <= 32, "WLED_MAX_BUSSES exceeds hard limit"); #define MAX_LEDS 1536 //can't rely on memory limit to limit this to 1536 LEDs #elif defined(CONFIG_IDF_TARGET_ESP32S2) #define MAX_LEDS 2048 //due to memory constraints S2 - #elif defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) + #elif defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32C6) #define MAX_LEDS 4096 #else #define MAX_LEDS 16384 @@ -490,7 +490,7 @@ static_assert(WLED_MAX_BUSSES <= 32, "WLED_MAX_BUSSES exceeds hard limit"); #else #if defined(ARDUINO_ARCH_ESP32S2) #define MAX_LED_MEMORY 16384 - #elif defined(ARDUINO_ARCH_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) + #elif defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32C6) #define MAX_LED_MEMORY 32768 #else #define MAX_LED_MEMORY 65536 @@ -606,7 +606,7 @@ static_assert(WLED_MAX_BUSSES <= 32, "WLED_MAX_BUSSES exceeds hard limit"); #endif // Defaults pins, type and counts to configure LED output -#if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) +#if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) #ifdef WLED_ENABLE_DMX #define DEFAULT_LED_PIN 1 #warning "Compiling with DMX. The default LED pin has been changed to pin 1." diff --git a/wled00/data/index.js b/wled00/data/index.js index 84b256183c..478f970ce2 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -735,6 +735,7 @@ ${urows===""?'':'
"):''} ${inforow("Build",i.vid)} ${inforow("Signal strength",i.wifi.signal +"% ("+ i.wifi.rssi, " dBm)")} +${i.wifi.band?inforow("WiFi band",i.wifi.band + " (Ch " + i.wifi.channel + ")"):""} ${inforow("Uptime",getRuntimeStr(i.uptime))} ${inforow("Time",i.time)} ${inforow("Free heap",(i.freeheap/1024).toFixed(1)," kB")} @@ -1096,6 +1097,8 @@ function btype(b) case 34: return "ESP32-S3"; case 5: case 35: return "ESP32-C3"; + case 36: return "ESP32-C6"; + case 41: return "ESP32-C5"; case 1: case 82: return "ESP8266"; } diff --git a/wled00/dmx_output.cpp b/wled00/dmx_output.cpp index eace2145e6..f7b87cb048 100644 --- a/wled00/dmx_output.cpp +++ b/wled00/dmx_output.cpp @@ -69,7 +69,7 @@ void handleDMXOutput() } void initDMXOutput() { - #if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S2) + #if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32S2) dmx.init(512); // initialize with bus length #else dmx.initWrite(512); // initialize with bus length diff --git a/wled00/improv.cpp b/wled00/improv.cpp index 1eb83627db..d94cf35381 100644 --- a/wled00/improv.cpp +++ b/wled00/improv.cpp @@ -10,7 +10,7 @@ #define DIMPROV_PRINTF(x...) #endif -#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S3) +#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32S3) #undef WLED_DISABLE_IMPROV_WIFISCAN #define WLED_DISABLE_IMPROV_WIFISCAN #endif diff --git a/wled00/json.cpp b/wled00/json.cpp index 22ebcf7b03..60c9c3a036 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -796,7 +796,9 @@ void serializeInfo(JsonObject root) int qrssi = WiFi.RSSI(); wifi_info[F("rssi")] = qrssi; wifi_info[F("signal")] = getSignalQuality(qrssi); - wifi_info[F("channel")] = WiFi.channel(); + int wifiChannel = WiFi.channel(); + wifi_info[F("channel")] = wifiChannel; + wifi_info[F("band")] = (wifiChannel >= 36) ? F("5GHz") : F("2.4GHz"); wifi_info[F("ap")] = apActive; JsonObject fs_info = root.createNestedObject("fs"); @@ -811,7 +813,7 @@ void serializeInfo(JsonObject root) wifi_info[F("txPower")] = (int) WiFi.getTxPower(); wifi_info[F("sleep")] = (bool) WiFi.getSleep(); #endif - #if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) root[F("arch")] = "esp32"; #else root[F("arch")] = ESP.getChipModel(); diff --git a/wled00/mbedtls_sha1_shim.cpp b/wled00/mbedtls_sha1_shim.cpp index 8561afcfc3..a009553bee 100644 --- a/wled00/mbedtls_sha1_shim.cpp +++ b/wled00/mbedtls_sha1_shim.cpp @@ -1,6 +1,7 @@ #include "wled.h" #ifdef ESP32 -#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 2, 0) +// ESP32-C5 on pioarduino uses IDF 5.5+ which has SHA1 built-in, skip shim +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 2, 0) && ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 5, 0) #include "mbedtls/sha1.h" #include "SHA1Builder.h" diff --git a/wled00/ota_update.cpp b/wled00/ota_update.cpp index 2f758b2c79..e91e5a98c0 100644 --- a/wled00/ota_update.cpp +++ b/wled00/ota_update.cpp @@ -435,6 +435,13 @@ bool verifyBootloaderImage(const uint8_t* &buffer, size_t &len, String* bootload } *bootloaderErrorMsg = "ESP32-S3 update not supported yet"; return false; + #elif defined(CONFIG_IDF_TARGET_ESP32C5) + if (chipId != 0x0017) { + *bootloaderErrorMsg = "Chip ID mismatch - expected ESP32-C5 (0x0017), got 0x" + String(chipId, HEX); + return false; + } + *bootloaderErrorMsg = "ESP32-C5 update not supported yet"; + return false; #elif defined(CONFIG_IDF_TARGET_ESP32C6) if (chipId != 0x000D) { *bootloaderErrorMsg = "Chip ID mismatch - expected ESP32-C6 (0x000D), got 0x" + String(chipId, HEX); diff --git a/wled00/pin_manager.cpp b/wled00/pin_manager.cpp index 729e845039..cf7d492527 100644 --- a/wled00/pin_manager.cpp +++ b/wled00/pin_manager.cpp @@ -232,6 +232,13 @@ bool PinManager::isPinOk(byte gpio, bool output) if (gpio > 21 && gpio < 33) return false; // 22 to 32: not connected + SPI FLASH // JTAG: GPIO39-42 are usually used for inline debugging // GPIO46 is input only and pulled down + #elif defined(CONFIG_IDF_TARGET_ESP32C5) + // strapping pins: 2, 7, 27, 28 + // GPIO 0-15 directly usable, 16-22 are for SPI flash + if (gpio > 15 && gpio < 23) return false; // 16-22 SPI FLASH + #if ARDUINO_USB_CDC_ON_BOOT == 1 || ARDUINO_USB_DFU_ON_BOOT == 1 + if (gpio == 13 || gpio == 14) return false; // 13-14 USB-JTAG + #endif #elif defined(CONFIG_IDF_TARGET_ESP32C6) // strapping pins: 8, 9, 15 // GPIO 0-23 directly usable, 24-30 are for SPI flash diff --git a/wled00/set.cpp b/wled00/set.cpp index b1831cf9e7..45107492f0 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -155,7 +155,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) Bus::setCCTBlend(cctBlending); Bus::setGlobalAWMode(request->arg(F("AW")).toInt()); strip.setTargetFps(request->arg(F("FR")).toInt()); - #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) useParallelI2S = request->hasArg(F("PR")); #endif diff --git a/wled00/src/dependencies/dmx/ESPDMX.cpp b/wled00/src/dependencies/dmx/ESPDMX.cpp index a80cad71c8..b1a613375a 100644 --- a/wled00/src/dependencies/dmx/ESPDMX.cpp +++ b/wled00/src/dependencies/dmx/ESPDMX.cpp @@ -11,7 +11,7 @@ // - - - - - /* ----- LIBRARIES ----- */ -#if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S2) +#if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32S2) #include diff --git a/wled00/src/dependencies/dmx/SparkFunDMX.cpp b/wled00/src/dependencies/dmx/SparkFunDMX.cpp index 064b9ff620..a180869b80 100644 --- a/wled00/src/dependencies/dmx/SparkFunDMX.cpp +++ b/wled00/src/dependencies/dmx/SparkFunDMX.cpp @@ -17,7 +17,7 @@ Distributed as-is; no warranty is given. #if defined(ARDUINO_ARCH_ESP32) #include -#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S2) +#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32S2) #include "SparkFunDMX.h" #include diff --git a/wled00/udp.cpp b/wled00/udp.cpp index c1e4951b42..477acf2da1 100644 --- a/wled00/udp.cpp +++ b/wled00/udp.cpp @@ -722,6 +722,10 @@ void sendSysInfoUDP() memcpy((byte *)data + 6, serverDescription, 32); #ifdef ESP8266 data[38] = NODE_TYPE_ID_ESP8266; + #elif defined(CONFIG_IDF_TARGET_ESP32C5) + data[38] = NODE_TYPE_ID_ESP32C5; + #elif defined(CONFIG_IDF_TARGET_ESP32C6) + data[38] = NODE_TYPE_ID_ESP32C6; #elif defined(CONFIG_IDF_TARGET_ESP32C3) data[38] = NODE_TYPE_ID_ESP32C3; #elif defined(CONFIG_IDF_TARGET_ESP32S3) diff --git a/wled00/util.cpp b/wled00/util.cpp index a391d536b8..2237512457 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -633,8 +633,8 @@ int32_t hw_random(int32_t lowerlimit, int32_t upperlimit) { // PSRAM compile time checks to provide info for misconfigured env #if defined(BOARD_HAS_PSRAM) - #if defined(IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32C61) || defined(ESP8266) - #error "ESP32-C3 and ESP8266 with PSRAM is not supported, please remove BOARD_HAS_PSRAM definition" + #if defined(IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32C61) || defined(ESP8266) + #error "ESP32-C3/C5 and ESP8266 with PSRAM is not supported, please remove BOARD_HAS_PSRAM definition" #else #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32S3) // PSRAM fix only needed for classic esp32 // BOARD_HAS_PSRAM also means that compiler flag "-mfix-esp32-psram-cache-issue" has to be used for old "rev.1" esp32 @@ -694,7 +694,7 @@ static void *validateFreeHeap(void *buffer) { void *d_malloc(size_t size) { void *buffer; - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32P4) + #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32P4) // the newer ESP32 variants have byte-accessible fast RTC memory that can be used as heap, access speed is on-par with DRAM // the system does prefer normal DRAM until full, since free RTC memory is ~7.5k only, its below the minimum heap threshold and needs to be allocated explicitly // use RTC RAM for small allocations to improve fragmentation or if DRAM is running low diff --git a/wled00/wled.cpp b/wled00/wled.cpp index d41c75465e..c27b0e75a8 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -351,7 +351,7 @@ void WLED::setup() Serial.setTimeout(50); // this causes troubles on new MCUs that have a "virtual" USB Serial (HWCDC) #else #endif - #if defined(WLED_DEBUG) && defined(ARDUINO_ARCH_ESP32) && (defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || ARDUINO_USB_CDC_ON_BOOT) + #if defined(WLED_DEBUG) && defined(ARDUINO_ARCH_ESP32) && (defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || ARDUINO_USB_CDC_ON_BOOT) delay(2500); // allow CDC USB serial to initialise #endif #if !defined(WLED_DEBUG) && defined(ARDUINO_ARCH_ESP32) && !defined(WLED_DEBUG_HOST) && ARDUINO_USB_CDC_ON_BOOT @@ -696,7 +696,56 @@ if (multiWiFi.empty()) { // guard: handle empty WiFi list // convert the "serverDescription" into a valid DNS hostname (alphanumeric) char hostname[25]; prepareHostname(hostname); +#if defined(CONFIG_IDF_TARGET_ESP32C5) + // ESP32-C5: Prefer 5GHz WiFi 6 for better performance + DEBUG_PRINTF_P(PSTR("ESP32-C5: Trying 5GHz for SSID: %s\n"), multiWiFi[selectedWiFi].clientSSID); + + WiFi.disconnect(true); + WiFi.mode(WIFI_STA); + + // Set country code to enable all 5GHz channels + wifi_country_t country = { + .cc = "US", + .schan = 1, + .nchan = 14, + .max_tx_power = 80, + .policy = WIFI_COUNTRY_POLICY_MANUAL + }; + esp_wifi_set_country(&country); + WiFi.setBandMode(WIFI_BAND_MODE_5G_ONLY); + DEBUG_PRINTLN(F("ESP32-C5: Band mode set to 5GHz ONLY")); + + wifi_config_t wifi_config = {}; + strncpy((char*)wifi_config.sta.ssid, multiWiFi[selectedWiFi].clientSSID, sizeof(wifi_config.sta.ssid) - 1); + strncpy((char*)wifi_config.sta.password, multiWiFi[selectedWiFi].clientPass, sizeof(wifi_config.sta.password) - 1); + wifi_config.sta.scan_method = WIFI_ALL_CHANNEL_SCAN; + wifi_config.sta.sort_method = WIFI_CONNECT_AP_BY_SIGNAL; + wifi_config.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK; + esp_wifi_set_config(WIFI_IF_STA, &wifi_config); + esp_wifi_connect(); + + // Wait up to 20 seconds for 5GHz connection + DEBUG_PRINTLN(F("ESP32-C5: Waiting for 5GHz connection (20s timeout)...")); + unsigned long c5start = millis(); + while (WiFi.status() != WL_CONNECTED && millis() - c5start < 20000) { + delay(250); + if ((millis() - c5start) % 3000 < 250) { + DEBUG_PRINTF_P(PSTR(" ...%lus, status=%d\n"), (millis() - c5start) / 1000, WiFi.status()); + } + } + + if (WiFi.status() != WL_CONNECTED) { + DEBUG_PRINTLN(F("ESP32-C5: 5GHz failed, falling back to AUTO mode")); + esp_wifi_disconnect(); + WiFi.setBandMode(WIFI_BAND_MODE_AUTO); + esp_wifi_set_config(WIFI_IF_STA, &wifi_config); + esp_wifi_connect(); + } else { + DEBUG_PRINTF_P(PSTR("ESP32-C5: Connected on 5GHz, channel: %d\n"), WiFi.channel()); + } +#else WiFi.begin(multiWiFi[selectedWiFi].clientSSID, multiWiFi[selectedWiFi].clientPass); // no harm if called multiple times +#endif #ifdef ARDUINO_ARCH_ESP32 WiFi.setTxPower(wifi_power_t(txPower)); @@ -873,6 +922,9 @@ void WLED::handleConnection() DEBUG_PRINTLN(); DEBUG_PRINT(F("Connected! IP address: ")); DEBUG_PRINTLN(WLEDNetwork.localIP()); + #if defined(CONFIG_IDF_TARGET_ESP32C5) + { int32_t ch = WiFi.channel(); DEBUG_PRINTF_P(PSTR("WiFi channel: %d (%s)\n"), ch, (ch >= 36) ? "5GHz" : "2.4GHz"); } + #endif if (improvActive) { if (improvError == 3) sendImprovStateResponse(0x00, true); sendImprovStateResponse(0x04); diff --git a/wled00/wled.h b/wled00/wled.h index 9046a36557..02002d9fe8 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -154,7 +154,7 @@ #endif #ifdef WLED_ENABLE_DMX - #if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32S2) + #if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32S2) #include "src/dependencies/dmx/ESPDMX.h" #else //ESP32 #include "src/dependencies/dmx/SparkFunDMX.h" @@ -327,7 +327,7 @@ WLED_GLOBAL bool rlyOpenDrain _INIT(RLYODRAIN); #define IRTYPE 0 #endif -#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32P4) || defined(CONFIG_IDF_TARGET_ESP32S2) || (defined(RX) && defined(TX)) +#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32P4) || defined(CONFIG_IDF_TARGET_ESP32S2) || (defined(RX) && defined(TX)) // use RX/TX as set by the framework - these boards do _not_ have RX=3 and TX=1 constexpr uint8_t hardwareRX = RX; constexpr uint8_t hardwareTX = TX; @@ -388,7 +388,7 @@ WLED_GLOBAL bool noWifiSleep _INIT(false); WLED_GLOBAL bool force802_3g _INIT(false); #endif // WLED_SAVE_RAM #ifdef ARDUINO_ARCH_ESP32 - #if defined(LOLIN_WIFI_FIX) && (defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)) + #if defined(LOLIN_WIFI_FIX) && (defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)) WLED_GLOBAL uint8_t txPower _INIT(WIFI_POWER_8_5dBm); #else WLED_GLOBAL uint8_t txPower _INIT(WIFI_POWER_19_5dBm); @@ -415,7 +415,7 @@ WLED_GLOBAL byte bootPreset _INIT(0); // save preset to load WLED_GLOBAL bool useGlobalLedBuffer _INIT(false); // double buffering disabled on ESP8266 #else WLED_GLOBAL bool useGlobalLedBuffer _INIT(true); // double buffering enabled on ESP32 - #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) WLED_GLOBAL bool useParallelI2S _INIT(false); // parallel I2S for ESP32 #endif #endif @@ -469,7 +469,7 @@ WLED_GLOBAL bool arlsDisableGammaCorrection _INIT(true); // activate if WLED_GLOBAL bool arlsForceMaxBri _INIT(false); // enable to force max brightness if source has very dark colors that would be black #ifdef WLED_ENABLE_DMX - #if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32S2) + #if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32S2) WLED_GLOBAL DMXESPSerial dmx; #else //ESP32 WLED_GLOBAL SparkFunDMX dmx; From 8268c4a9486fb6d757396c1266df7f6b2e1bcae4 Mon Sep 17 00:00:00 2001 From: Jonny Davey Date: Sat, 7 Feb 2026 16:16:11 +0000 Subject: [PATCH 2/7] Applied changes based on comments on PR --- .claude/settings.local.json | 7 + .vscode/extensions.json | 3 +- platformio.ini | 20 +- wled00/NodeStruct.h | 11 +- wled00/idf_component.yml | 2 + wled00/idf_component.yml.orig | 2 + wled00/js_iro.h | 636 ++++++++++++++++++++++++++++++++++ wled00/wled.cpp | 49 --- 8 files changed, 668 insertions(+), 62 deletions(-) create mode 100644 .claude/settings.local.json create mode 100644 wled00/idf_component.yml create mode 100644 wled00/idf_component.yml.orig create mode 100644 wled00/js_iro.h diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000000..0e384661ea --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,7 @@ +{ + "permissions": { + "allow": [ + "Bash(gh pr view:*)" + ] + } +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 080e70d08b..8057bc70a7 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,7 +1,6 @@ { - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format "recommendations": [ + "pioarduino.pioarduino-ide", "platformio.platformio-ide" ], "unwantedRecommendations": [ diff --git a/platformio.ini b/platformio.ini index 1f80fb2a5f..663e0b037c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -468,7 +468,9 @@ build_flags = -g -DCONFIG_IDF_TARGET_ESP32C5=1 -D CONFIG_ASYNC_TCP_USE_WDT=0 -DCO - -DARDUINO_USB_MODE=1 + ;; please make sure that the following flags are properly set (to 0 or 1) by your board.json, or included in your custom platformio_override.ini entry: + ;; ARDUINO_USB_MODE + ;; ARDUINO_USB_CDC_ON_BOOT ${esp32_idf_V5.build_flags} lib_deps = ${esp32_idf_V5.lib_deps} @@ -476,22 +478,22 @@ lib_ignore = ${esp32_idf_V5.lib_ignore} esp_dmx ;; esp_dmx library doesn't support C5 UART registers yet [env:esp32c5dev] -;; ESP32-C5 "devkit C" with 4MB flash - EXPERIMENTAL +;; ESP32-C5 "devkit C" with 4MB flash, no PSRAM - EXPERIMENTAL extends = esp32c5 platform = ${esp32c5.platform} platform_packages = ${esp32c5.platform_packages} -framework = arduino board = esp32-c5-devkitc-1 build_unflags = ${esp32c5.build_unflags} build_flags = ${common.build_flags} ${esp32c5.build_flags} -D WLED_RELEASE_NAME=\"ESP32-C5\" -Wno-volatile -Wno-deprecated-declarations -D WLED_WATCHDOG_TIMEOUT=0 - -DARDUINO_USB_CDC_ON_BOOT=0 ;; for serial-to-USB chip - -D WLED_DISABLE_INFRARED ;; library not compatible with -C5 - -D WLED_DISABLE_ESPNOW ;; not yet tested - -D WLED_DISABLE_ALEXA ;; compile errors - -D WLED_DISABLE_WEBSOCKETS ;; not yet tested + -DARDUINO_USB_MODE=1 ;; this flag is mandatory for ESP32-C5 + -DARDUINO_USB_CDC_ON_BOOT=0 ;; for serial-to-USB chip + -D WLED_DISABLE_INFRARED ;; library not compatible with -C5 + -D WLED_DISABLE_ESPNOW ;; not yet tested + -D WLED_DISABLE_ALEXA ;; compile errors + -D WLED_DISABLE_WEBSOCKETS ;; not yet tested upload_speed = 460800 lib_deps = ${esp32c5.lib_deps} lib_ignore = ${esp32c5.lib_ignore} @@ -501,7 +503,7 @@ lib_ignore = ${esp32c5.lib_ignore} board_build.partitions = ${esp32.big_partitions} board_build.f_flash = 80000000L board_build.flash_mode = qio -board_build.arduino.memory_type = qio_qspi +board_build.arduino.memory_type = qio_qspi ;; flash config only, this board has no PSRAM monitor_filters = esp32_exception_decoder diff --git a/wled00/NodeStruct.h b/wled00/NodeStruct.h index f436a6519e..9f0965220a 100644 --- a/wled00/NodeStruct.h +++ b/wled00/NodeStruct.h @@ -14,8 +14,15 @@ #define NODE_TYPE_ID_ESP32S2 33 // etc #define NODE_TYPE_ID_ESP32S3 34 #define NODE_TYPE_ID_ESP32C3 35 -#define NODE_TYPE_ID_ESP32C6 36 -#define NODE_TYPE_ID_ESP32C5 41 + +// updated node types from the ESP Easy project +// https://github.com/letscontrolit/ESPEasy/blob/mega/src/src/DataTypes/NodeTypeID.h +#define NODE_TYPE_ID_ESP32C2 37 +#define NODE_TYPE_ID_ESP32H2 38 +#define NODE_TYPE_ID_ESP32C6 39 +#define NODE_TYPE_ID_ESP32C61 40 +#define NODE_TYPE_ID_ESP32C5 41 +#define NODE_TYPE_ID_ESP32P4 42 /*********************************************************************************************\ * NodeStruct diff --git a/wled00/idf_component.yml b/wled00/idf_component.yml new file mode 100644 index 0000000000..d752765ffb --- /dev/null +++ b/wled00/idf_component.yml @@ -0,0 +1,2 @@ +dependencies: + idf: '>=5.1' diff --git a/wled00/idf_component.yml.orig b/wled00/idf_component.yml.orig new file mode 100644 index 0000000000..d752765ffb --- /dev/null +++ b/wled00/idf_component.yml.orig @@ -0,0 +1,2 @@ +dependencies: + idf: '>=5.1' diff --git a/wled00/js_iro.h b/wled00/js_iro.h new file mode 100644 index 0000000000..2dfc6daa6c --- /dev/null +++ b/wled00/js_iro.h @@ -0,0 +1,636 @@ +/* + * More web UI HTML source arrays. + * This file is auto generated, please don't make any changes manually. + * + * Instead, see https://kno.wled.ge/advanced/custom-features/#changing-web-ui + * to find out how to easily modify the web UI source! + */ + +// Autogenerated from wled00/data//iro.js, do not edit!! +const uint16_t JS_iro_length = 9964; +const uint8_t JS_iro[] PROGMEM = { + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xc5, 0x7d, 0x6b, 0x73, 0xe3, 0x36, + 0xb2, 0xe8, 0xf7, 0x5b, 0x75, 0xff, 0x83, 0xcd, 0x64, 0x54, 0x80, 0x04, 0xc1, 0x94, 0x6c, 0x79, + 0xc6, 0x94, 0x71, 0x54, 0xc9, 0xe4, 0x31, 0xb3, 0x9b, 0xd9, 0xc9, 0xc9, 0xcc, 0x66, 0x77, 0xa3, + 0x51, 0x52, 0x14, 0x05, 0x49, 0x18, 0x53, 0xa0, 0x02, 0x82, 0xb2, 0x1d, 0x91, 0xff, 0xfd, 0x56, + 0x03, 0xe0, 0x43, 0x0f, 0x3f, 0xb2, 0xf7, 0xec, 0xbd, 0x95, 0xd4, 0x08, 0xc4, 0xa3, 0x01, 0x34, + 0xba, 0x1b, 0xdd, 0x8d, 0x06, 0xfc, 0xbf, 0xff, 0xd7, 0xe9, 0x3c, 0x93, 0x91, 0x16, 0x89, 0x44, + 0x9a, 0x48, 0xbc, 0xf5, 0x92, 0xe9, 0x67, 0x1e, 0x69, 0x8f, 0x31, 0x7d, 0xbf, 0xe6, 0xc9, 0xfc, + 0x84, 0xdf, 0xad, 0x13, 0xa5, 0xd3, 0x56, 0xcb, 0xcb, 0xe4, 0x8c, 0xcf, 0x85, 0xe4, 0x33, 0xef, + 0xb4, 0x2c, 0x5c, 0x25, 0xb3, 0x2c, 0xe6, 0x23, 0xfb, 0x43, 0x5d, 0x55, 0x26, 0x11, 0x0e, 0xbc, + 0x12, 0x6c, 0x0d, 0xc9, 0xb6, 0x6e, 0xb5, 0xec, 0x2f, 0x0d, 0x57, 0xb3, 0x91, 0x4d, 0x22, 0x89, + 0x03, 0xa4, 0x99, 0xce, 0xf3, 0x94, 0xc7, 0x73, 0x4c, 0x85, 0x4a, 0x00, 0x46, 0x81, 0xf4, 0x52, + 0xa4, 0xa4, 0x1a, 0x1f, 0xde, 0x7a, 0x59, 0xca, 0x4f, 0x52, 0xad, 0x44, 0xa4, 0xbd, 0xe1, 0x26, + 0x54, 0x27, 0x2b, 0x92, 0x12, 0x49, 0x04, 0x49, 0xc8, 0x1d, 0xdb, 0x16, 0xe4, 0x33, 0x1b, 0x4f, + 0x88, 0x62, 0x67, 0x61, 0x24, 0x74, 0xce, 0xef, 0xd0, 0x28, 0x48, 0xf3, 0x45, 0x2e, 0xf3, 0x75, + 0xfe, 0x25, 0xce, 0xd5, 0x7a, 0x99, 0x2f, 0x94, 0x98, 0xe5, 0xc9, 0x6d, 0x9a, 0xaf, 0x64, 0x94, + 0x4b, 0x7d, 0x9b, 0x0b, 0xc9, 0xc7, 0xd1, 0x72, 0x92, 0xff, 0x91, 0x24, 0xf9, 0xaf, 0x89, 0x9a, + 0xe5, 0xbf, 0x76, 0xbb, 0x67, 0x62, 0x58, 0xf6, 0x79, 0xf2, 0xce, 0x62, 0x65, 0x9e, 0x28, 0x04, + 0xfd, 0x89, 0x13, 0x21, 0x4f, 0x24, 0xd6, 0x63, 0x31, 0x61, 0x72, 0x2c, 0x26, 0x43, 0xc5, 0x75, + 0xa6, 0xe4, 0x89, 0x2e, 0xaa, 0x16, 0xf7, 0x48, 0xe3, 0x2d, 0xd4, 0x95, 0x4c, 0xd3, 0x75, 0xa8, + 0xb8, 0xd4, 0x7f, 0x4b, 0x66, 0x7c, 0x28, 0x5b, 0x2d, 0x49, 0x15, 0x5f, 0x25, 0x1b, 0xfe, 0x7a, + 0x29, 0xe2, 0x19, 0xd2, 0xb8, 0x6e, 0xb4, 0x84, 0x6e, 0x88, 0xb0, 0x0d, 0x15, 0xe1, 0x24, 0x23, + 0x09, 0x89, 0x59, 0xa8, 0x16, 0xd9, 0x8a, 0x4b, 0x9d, 0x0e, 0xc5, 0x1c, 0x49, 0xf6, 0x0e, 0x6d, + 0x0b, 0x22, 0x31, 0x39, 0xbf, 0xae, 0x0a, 0x68, 0xcc, 0xe5, 0x42, 0x2f, 0x31, 0x0c, 0x50, 0xb0, + 0xb1, 0x80, 0xe9, 0x9f, 0x0f, 0xd5, 0x41, 0x85, 0xa1, 0xea, 0x74, 0xb0, 0xa0, 0xeb, 0x2c, 0x5d, + 0xa2, 0x78, 0xac, 0x26, 0xd8, 0x40, 0xcc, 0xe2, 0xf8, 0x94, 0x89, 0x56, 0x0b, 0x49, 0x1a, 0xc1, + 0x98, 0x14, 0x97, 0x4c, 0x60, 0x62, 0xf3, 0x75, 0xab, 0xe5, 0x12, 0x74, 0xc6, 0xe7, 0x61, 0x16, + 0xeb, 0x1f, 0x55, 0xb2, 0x4e, 0x4d, 0x57, 0x1c, 0xf0, 0xb0, 0x97, 0xbf, 0x49, 0xc4, 0xec, 0xc4, + 0x67, 0x8c, 0xc9, 0x31, 0x9f, 0x00, 0xcc, 0x31, 0x9f, 0xec, 0xb5, 0x1d, 0xf3, 0x09, 0x2e, 0x51, + 0x96, 0x30, 0x49, 0x6f, 0xf8, 0xbd, 0xeb, 0x0c, 0x65, 0x0c, 0xb0, 0x33, 0xc7, 0x40, 0x1e, 0x31, + 0xd7, 0xfc, 0xc4, 0x7c, 0xba, 0xd2, 0xa4, 0x91, 0x0b, 0x6d, 0x22, 0x83, 0xae, 0x84, 0x64, 0x0d, + 0x14, 0xda, 0x3c, 0x41, 0x94, 0x45, 0x22, 0x67, 0x5b, 0x20, 0xbb, 0x40, 0x93, 0x35, 0xf4, 0x1c, + 0x48, 0x72, 0xc3, 0xef, 0x03, 0x41, 0x14, 0x9f, 0x07, 0x8a, 0xc8, 0x00, 0x00, 0x13, 0x61, 0x7f, + 0x78, 0xe0, 0x93, 0xc4, 0x26, 0x63, 0xfb, 0x13, 0xb9, 0x9f, 0x44, 0xa6, 0x5a, 0x65, 0x91, 0x4e, + 0x54, 0x60, 0xa7, 0x57, 0x94, 0xc3, 0x5f, 0xd1, 0x8d, 0x4c, 0x66, 0xbc, 0xd5, 0x72, 0x09, 0xc4, + 0x31, 0xe1, 0xf5, 0x68, 0xde, 0x03, 0x15, 0x94, 0xc4, 0x51, 0x21, 0xb7, 0x2e, 0x7f, 0x6b, 0xe9, + 0x0a, 0x08, 0x9c, 0x9a, 0x01, 0x32, 0x4d, 0xcc, 0x47, 0x94, 0x48, 0xcd, 0xef, 0x34, 0x6b, 0xd4, + 0xbd, 0xb5, 0x75, 0xdd, 0x82, 0x31, 0x26, 0x71, 0x05, 0x58, 0x8c, 0x6e, 0x91, 0xa6, 0x82, 0x68, + 0x2a, 0xa8, 0xa4, 0x42, 0xce, 0xf8, 0xdd, 0xfb, 0x39, 0xd2, 0xb8, 0xd3, 0xc3, 0x66, 0x06, 0xc3, + 0x8a, 0x70, 0x87, 0xf2, 0x5a, 0x53, 0x59, 0x52, 0x83, 0x04, 0x6a, 0x28, 0x09, 0x00, 0x09, 0xa6, + 0xa9, 0x1c, 0xcb, 0x09, 0x2e, 0x57, 0x5c, 0xd0, 0xa4, 0xec, 0x43, 0xd0, 0xc4, 0x4d, 0xf9, 0x08, + 0x47, 0x6b, 0x0a, 0x09, 0x18, 0x83, 0xed, 0xae, 0x1e, 0x73, 0x58, 0x71, 0x01, 0x11, 0x35, 0xa9, + 0x01, 0x93, 0x53, 0x81, 0x6b, 0xc2, 0x8a, 0x2c, 0x6b, 0x69, 0x9a, 0xc0, 0x07, 0x9d, 0x86, 0x29, + 0x67, 0x06, 0xf3, 0x92, 0xf9, 0x7f, 0x7a, 0xc4, 0xdb, 0x1d, 0x30, 0x30, 0xf0, 0xa9, 0xe2, 0xe1, + 0x4d, 0xe1, 0x66, 0x02, 0x43, 0x2a, 0xea, 0x11, 0x72, 0x18, 0x21, 0x3a, 0xd5, 0x74, 0xde, 0x6a, + 0x21, 0x4d, 0xe7, 0xec, 0xd4, 0xc7, 0xad, 0x56, 0x8f, 0x31, 0x96, 0x5a, 0x36, 0xd1, 0x38, 0xcf, + 0xc5, 0x29, 0x63, 0x2b, 0x3a, 0xe3, 0xd3, 0x24, 0x93, 0x11, 0xff, 0x89, 0xcb, 0x19, 0x57, 0x42, + 0x2e, 0x70, 0xab, 0x85, 0xc4, 0xb1, 0x02, 0x82, 0x8e, 0x64, 0xe6, 0xb9, 0xc4, 0x28, 0xc3, 0x0d, + 0x5a, 0xcd, 0x90, 0x45, 0x8e, 0xa3, 0xd8, 0x92, 0xdf, 0xcd, 0x6a, 0xa5, 0x34, 0x4d, 0x94, 0x46, + 0xbb, 0x52, 0xd9, 0x4d, 0x41, 0xd2, 0x19, 0xe5, 0x5d, 0x0d, 0xff, 0x16, 0x78, 0xa8, 0x61, 0xa4, + 0xc9, 0x1a, 0xe1, 0x21, 0xb6, 0xb3, 0x50, 0x4c, 0x30, 0x4b, 0xa6, 0x24, 0x63, 0x88, 0x33, 0x24, + 0x99, 0xc6, 0x74, 0x86, 0x69, 0x42, 0x80, 0xdb, 0xd6, 0x24, 0x66, 0x92, 0x66, 0x44, 0xd2, 0x8c, + 0x9d, 0xf6, 0x48, 0x62, 0x26, 0x61, 0x04, 0xe6, 0x0d, 0x4a, 0x08, 0x27, 0x46, 0xbc, 0x70, 0x4c, + 0x24, 0xbd, 0x25, 0x16, 0xcc, 0x29, 0x63, 0x09, 0x4d, 0x6e, 0x25, 0x57, 0x1f, 0x7e, 0xfe, 0xfe, + 0xdb, 0x98, 0x83, 0x44, 0x21, 0x96, 0x73, 0x48, 0x4c, 0x2c, 0x35, 0x66, 0xa3, 0x5b, 0xc4, 0x71, + 0x90, 0x61, 0x32, 0x43, 0x02, 0x9a, 0xab, 0x53, 0x96, 0xb5, 0x5a, 0x21, 0xe2, 0xb8, 0x39, 0xe5, + 0x0f, 0x08, 0xa6, 0xaa, 0xeb, 0xc9, 0x92, 0xd4, 0xe2, 0x20, 0x22, 0x21, 0x99, 0x93, 0x25, 0xd9, + 0x90, 0x19, 0x59, 0x90, 0x29, 0x88, 0x1d, 0x4d, 0x65, 0x9e, 0x7f, 0x26, 0x6b, 0x36, 0x2d, 0x57, + 0x5f, 0xcc, 0x51, 0xcc, 0xd8, 0x5d, 0xab, 0x85, 0x62, 0x66, 0x17, 0x3c, 0x1b, 0x65, 0x63, 0x7f, + 0x12, 0xac, 0x81, 0xf8, 0x88, 0x6f, 0xc9, 0x0f, 0x93, 0x88, 0xf9, 0x44, 0x50, 0xc9, 0xbe, 0x42, + 0x82, 0xca, 0x7a, 0xe7, 0xd0, 0x15, 0xf7, 0x9c, 0x32, 0x9b, 0xd6, 0x54, 0x30, 0x60, 0x1b, 0xa0, + 0x13, 0xde, 0xe9, 0xb9, 0xb9, 0x30, 0x34, 0x67, 0xd3, 0x71, 0x34, 0xc1, 0x79, 0x3e, 0x87, 0x61, + 0xdc, 0xf0, 0x7b, 0xc6, 0xe6, 0xf0, 0x03, 0x5f, 0x40, 0xeb, 0x0c, 0xbe, 0x21, 0x81, 0xa1, 0x9e, + 0xc3, 0xf6, 0x90, 0xc7, 0x29, 0x3f, 0x81, 0xc5, 0x0b, 0x99, 0x3f, 0x0c, 0xaf, 0xd7, 0xc3, 0xb0, + 0xd3, 0x31, 0xdd, 0x18, 0x78, 0x21, 0x90, 0xe9, 0xe3, 0xc0, 0xb6, 0x50, 0xab, 0x84, 0x66, 0xa9, + 0x76, 0x6e, 0x26, 0x5a, 0x88, 0x39, 0x5a, 0xb2, 0x1b, 0x24, 0x89, 0x26, 0x73, 0x36, 0xcf, 0xf3, + 0xbb, 0x0a, 0x83, 0x56, 0x5e, 0x91, 0x14, 0x13, 0x14, 0x32, 0xed, 0x84, 0xe7, 0x1c, 0x7e, 0x4f, + 0x59, 0xd8, 0x6a, 0xa1, 0x05, 0x5b, 0xe4, 0xf9, 0x78, 0x82, 0x2d, 0x35, 0x87, 0x44, 0xd3, 0x28, + 0xcf, 0x97, 0x44, 0x97, 0xf2, 0x7d, 0xd9, 0x10, 0x29, 0xb3, 0x56, 0x0b, 0xcd, 0xd8, 0xb2, 0x12, + 0xfd, 0x34, 0xc6, 0x4b, 0xf8, 0x97, 0x68, 0x6a, 0x11, 0x6e, 0xa7, 0x28, 0xe6, 0x28, 0x63, 0x30, + 0x8a, 0xe5, 0x29, 0x8b, 0xf3, 0xdc, 0xb6, 0x5d, 0x36, 0x76, 0x39, 0xbc, 0xd5, 0x41, 0x05, 0x34, + 0xce, 0xf3, 0xb8, 0x51, 0x76, 0x0a, 0x92, 0x4b, 0xd2, 0x70, 0xbd, 0xe6, 0x72, 0x66, 0xb7, 0xc0, + 0x25, 0x36, 0x70, 0xed, 0xf6, 0xca, 0x62, 0x02, 0xe8, 0x43, 0x1b, 0xb6, 0xa1, 0x92, 0xdf, 0xe9, + 0x0f, 0x62, 0x1a, 0x5b, 0x5e, 0xb3, 0x18, 0x65, 0x7d, 0x10, 0x00, 0x1b, 0xc6, 0x96, 0xd8, 0x60, + 0xe8, 0x44, 0x0f, 0x41, 0xe4, 0xa5, 0x5c, 0xe9, 0xaf, 0xf9, 0x3c, 0x51, 0x1c, 0x2d, 0x49, 0x8c, + 0x0b, 0x2f, 0x59, 0x3b, 0x21, 0x25, 0x0c, 0x6e, 0xcd, 0xee, 0xb6, 0x09, 0xe3, 0x8c, 0x33, 0xcf, + 0xc3, 0x45, 0xcc, 0x96, 0x4d, 0xe8, 0xe4, 0x88, 0x54, 0xab, 0xda, 0x09, 0x1a, 0xb3, 0x25, 0x2e, + 0x4a, 0x01, 0x12, 0x75, 0x3a, 0x44, 0x17, 0x98, 0x08, 0x9a, 0xb0, 0x99, 0xc3, 0x54, 0xd6, 0x6a, + 0xd5, 0x10, 0x4e, 0x77, 0x21, 0x98, 0x9d, 0x32, 0x62, 0x59, 0x49, 0xc4, 0x51, 0xb7, 0x3b, 0xc4, + 0xae, 0xd9, 0x38, 0x9a, 0xb4, 0x5a, 0xf7, 0x08, 0x7e, 0xf1, 0xd0, 0xd6, 0x5b, 0x37, 0x2b, 0x4c, + 0x4d, 0x85, 0xbf, 0x21, 0xf8, 0x25, 0x86, 0x24, 0x81, 0x07, 0x16, 0x0e, 0xa4, 0x3f, 0x8c, 0xae, + 0x17, 0x15, 0xd8, 0x4e, 0x07, 0x7f, 0x8b, 0x16, 0x50, 0x71, 0x31, 0xee, 0x74, 0xaa, 0x9f, 0x06, + 0xf3, 0x7d, 0x55, 0xaa, 0x17, 0xd5, 0xda, 0x08, 0xc7, 0xfc, 0xd8, 0x51, 0xbe, 0xce, 0x73, 0x6f, + 0x9a, 0x24, 0x31, 0x0f, 0x9b, 0xe2, 0x1d, 0xcb, 0x56, 0xcb, 0x29, 0x0d, 0xd2, 0x34, 0xc4, 0xb8, + 0x22, 0x84, 0xaf, 0x94, 0x0a, 0xef, 0xa9, 0x48, 0xcd, 0x2f, 0xd2, 0x18, 0x97, 0x5b, 0x8d, 0x62, + 0xfe, 0x50, 0x5d, 0xeb, 0xa6, 0xe2, 0xf1, 0x15, 0xd2, 0x63, 0x35, 0x31, 0x43, 0x70, 0xed, 0x1d, + 0xd0, 0x91, 0x44, 0x47, 0x98, 0xf4, 0xc1, 0xe1, 0x94, 0x62, 0x10, 0x08, 0x52, 0xcc, 0x91, 0x07, + 0xaa, 0xa0, 0x5c, 0x34, 0x6a, 0xe4, 0xb9, 0x27, 0xb3, 0xd5, 0x94, 0xab, 0x23, 0xad, 0x22, 0x03, + 0x9b, 0x38, 0x01, 0x66, 0x66, 0x33, 0xac, 0x3b, 0xa4, 0x89, 0xdd, 0x4a, 0x98, 0xd9, 0x95, 0xca, + 0x0d, 0x76, 0x68, 0x15, 0xb9, 0x08, 0x59, 0x86, 0x25, 0xda, 0x6e, 0xd6, 0x44, 0x57, 0xaa, 0x4b, + 0xa5, 0xcf, 0x48, 0xb3, 0xf9, 0x24, 0x44, 0x16, 0x80, 0x8c, 0x40, 0x57, 0x05, 0xa2, 0x5e, 0x87, + 0x79, 0xb9, 0x0e, 0x5e, 0xd7, 0x33, 0x8a, 0x92, 0x3f, 0x19, 0x69, 0x9a, 0x72, 0xa3, 0x1d, 0x71, + 0xa5, 0xef, 0x41, 0x48, 0xe2, 0x40, 0x8f, 0xe5, 0x84, 0x1d, 0x4c, 0x44, 0xb4, 0x5a, 0xa7, 0xb0, + 0x3d, 0x29, 0xaa, 0x79, 0xaa, 0x91, 0xc4, 0x23, 0xd1, 0xf1, 0xd6, 0x77, 0x5e, 0xe0, 0x56, 0x74, + 0xe4, 0x79, 0x41, 0xa3, 0xaf, 0x9f, 0x50, 0xb5, 0xbb, 0x58, 0x41, 0xeb, 0xa4, 0x2e, 0x89, 0x0c, + 0xea, 0x6e, 0xf8, 0x3d, 0x0c, 0x01, 0x49, 0xc6, 0x47, 0x5e, 0x14, 0x87, 0x69, 0xfa, 0xb7, 0x70, + 0xc5, 0xcd, 0xa8, 0xdc, 0xb7, 0x17, 0xc8, 0xc0, 0xa5, 0x1a, 0xb9, 0xa6, 0x56, 0x20, 0x71, 0x9e, + 0x7b, 0xa5, 0x56, 0x63, 0x8a, 0x6b, 0xc2, 0xf0, 0x52, 0x7d, 0x1f, 0x5b, 0x48, 0xd8, 0x08, 0x0c, + 0x4d, 0x4d, 0x0e, 0x39, 0x58, 0x2e, 0x81, 0x33, 0x1a, 0xa5, 0xe9, 0x47, 0xd0, 0x77, 0x84, 0x95, + 0x04, 0xc7, 0x56, 0x55, 0xb5, 0x5a, 0xa8, 0xae, 0xe8, 0x79, 0x44, 0x31, 0x2b, 0xed, 0x95, 0xa1, + 0xb9, 0x04, 0x74, 0x51, 0x85, 0x45, 0xab, 0x65, 0x52, 0x22, 0xcf, 0xe7, 0x08, 0xe6, 0xea, 0x79, + 0x66, 0x7d, 0x85, 0xa9, 0x14, 0x9b, 0x22, 0xac, 0x5a, 0x2d, 0x31, 0x8e, 0x27, 0x80, 0xc5, 0x71, + 0x3c, 0xb1, 0x35, 0x63, 0x02, 0x59, 0xb8, 0x80, 0xfe, 0xbd, 0xa4, 0x5c, 0x97, 0x56, 0xcb, 0xb3, + 0x13, 0x1b, 0xf7, 0x26, 0x23, 0x94, 0x32, 0x79, 0x6a, 0x90, 0x05, 0x5a, 0xe9, 0x3a, 0x0e, 0x23, + 0x8e, 0xce, 0x5e, 0x87, 0x6b, 0x9d, 0x29, 0xfe, 0xe5, 0x19, 0xf4, 0x84, 0x89, 0x64, 0x08, 0x45, + 0x4c, 0x52, 0x9d, 0xfc, 0x90, 0xdc, 0x72, 0xf5, 0x3a, 0x4c, 0x39, 0xc2, 0x18, 0xd4, 0xe4, 0x51, + 0x14, 0x48, 0x4c, 0xd3, 0x58, 0x44, 0x1c, 0xf5, 0x31, 0x11, 0x23, 0xa4, 0xf2, 0x5c, 0xd3, 0x70, + 0x36, 0xfb, 0x76, 0xc3, 0xa5, 0xfe, 0x41, 0xa4, 0x9a, 0x4b, 0xae, 0x90, 0x24, 0x1b, 0x23, 0xcd, + 0x35, 0xd5, 0x79, 0x0e, 0xff, 0xb2, 0x6d, 0x81, 0x31, 0xd0, 0x02, 0xd0, 0x84, 0xb3, 0x1d, 0x8e, + 0x35, 0xc1, 0x81, 0x17, 0x8b, 0x54, 0x7b, 0x20, 0x61, 0x5b, 0x2d, 0x4f, 0x87, 0x0b, 0xb3, 0x4a, + 0xee, 0x73, 0x9e, 0xa8, 0x95, 0x4b, 0x9f, 0xf2, 0x56, 0x4b, 0x1a, 0xd5, 0x7d, 0x64, 0x68, 0xac, + 0x49, 0x39, 0xc1, 0x31, 0x39, 0xd6, 0x6a, 0x79, 0xb3, 0x50, 0x2e, 0xb8, 0x4a, 0xb2, 0x34, 0xbe, + 0xff, 0xc0, 0xf5, 0x5b, 0x29, 0xb9, 0x7a, 0xf3, 0xf1, 0xdd, 0x0f, 0x0e, 0x22, 0x3a, 0xc4, 0xcb, + 0xaf, 0x77, 0xb1, 0x90, 0x37, 0xc1, 0xc8, 0xe2, 0x65, 0xe4, 0xfa, 0xc8, 0x73, 0x43, 0xbc, 0x62, + 0x54, 0x4e, 0xe4, 0x2b, 0xad, 0x95, 0x98, 0x66, 0x9a, 0xff, 0xed, 0x03, 0xf2, 0x96, 0x5a, 0xaf, + 0x83, 0xb3, 0xb3, 0xdb, 0xdb, 0x5b, 0x7a, 0x7b, 0x4e, 0x13, 0xb5, 0x38, 0xeb, 0x5d, 0x5d, 0x5d, + 0x9d, 0x19, 0x48, 0x1e, 0xd9, 0x47, 0x6a, 0x60, 0x78, 0xe6, 0xdf, 0x07, 0x00, 0x3c, 0xf6, 0xe4, + 0xb0, 0xc0, 0x28, 0xdd, 0xed, 0xc7, 0x30, 0x67, 0x43, 0xaa, 0x6e, 0x9a, 0x3a, 0x3e, 0xe8, 0xee, + 0x7a, 0x6c, 0xc5, 0xc4, 0x04, 0xad, 0x28, 0x87, 0x75, 0x1a, 0xb9, 0x5f, 0xd0, 0x8f, 0x9b, 0xe6, + 0xde, 0x0d, 0xda, 0xd3, 0xfc, 0x80, 0x2d, 0x2d, 0x97, 0xee, 0x28, 0x43, 0x64, 0x4d, 0xee, 0xc9, + 0x2d, 0xb9, 0x01, 0xb2, 0xba, 0x5f, 0x73, 0x20, 0xe7, 0x4a, 0x31, 0x93, 0xb4, 0x61, 0x9d, 0xec, + 0x48, 0x46, 0x14, 0xb2, 0x15, 0xe5, 0xb0, 0x6f, 0x22, 0x89, 0x87, 0x5a, 0xdd, 0xdb, 0x4d, 0xf9, + 0xc8, 0x4e, 0x77, 0x63, 0x44, 0xee, 0x1a, 0x74, 0x43, 0x23, 0xd6, 0xee, 0x19, 0x0a, 0xd9, 0x4d, + 0x69, 0x83, 0x7c, 0x84, 0x3d, 0xac, 0xd5, 0x52, 0xe3, 0x90, 0x46, 0x13, 0x72, 0xcb, 0xc2, 0xd1, + 0xfd, 0xe8, 0xde, 0xd6, 0xb4, 0x1b, 0x6a, 0x10, 0x52, 0x11, 0x28, 0x22, 0x68, 0x34, 0x9a, 0x82, + 0xea, 0x24, 0x69, 0xc4, 0x04, 0x8d, 0x30, 0x15, 0xa0, 0xe7, 0x04, 0xc8, 0x5b, 0xab, 0x44, 0x27, + 0xd0, 0x97, 0x27, 0xe4, 0xc9, 0x4d, 0xab, 0x75, 0x43, 0xab, 0x1c, 0xaa, 0x8c, 0x7a, 0x3c, 0x82, + 0x36, 0x73, 0x26, 0xf9, 0xed, 0xc9, 0x0d, 0x5a, 0x93, 0x5b, 0x1c, 0xa0, 0x3a, 0xe7, 0xad, 0xc9, + 0x21, 0xf3, 0xe6, 0x4c, 0xd9, 0x0d, 0x99, 0xbb, 0xb6, 0xec, 0x0f, 0x4c, 0xee, 0x5b, 0xad, 0x7b, + 0x9a, 0x66, 0x53, 0x34, 0x87, 0x7a, 0xd6, 0x92, 0x5a, 0x93, 0x39, 0x4d, 0x75, 0xa8, 0x79, 0x9e, + 0x23, 0x97, 0x02, 0x4e, 0xb2, 0x70, 0x8c, 0x71, 0x75, 0x4b, 0xe6, 0xf4, 0x96, 0x29, 0xb2, 0x64, + 0x73, 0xa3, 0xf8, 0x93, 0x39, 0x5d, 0x35, 0x36, 0xc3, 0x39, 0xfd, 0xdc, 0x6a, 0xa1, 0x39, 0xfd, + 0xcc, 0x5c, 0xf3, 0x52, 0x2f, 0xba, 0xa1, 0x0b, 0xae, 0xbf, 0xe1, 0x4a, 0x6c, 0xf8, 0xec, 0x03, + 0x14, 0x7c, 0xa7, 0x92, 0x95, 0xb1, 0x6c, 0x5b, 0xad, 0x77, 0xa6, 0x41, 0xd9, 0x62, 0x04, 0x1f, + 0x46, 0xa1, 0x9e, 0xd3, 0xcf, 0x38, 0x98, 0xd3, 0xcf, 0xe4, 0xe1, 0xc6, 0x68, 0x6d, 0x6a, 0x61, + 0xb2, 0xc4, 0x76, 0x00, 0x8f, 0xf5, 0x63, 0x47, 0x02, 0x73, 0x59, 0xad, 0x13, 0xc9, 0xa5, 0xfe, + 0x87, 0x88, 0xe3, 0x77, 0x49, 0x26, 0x35, 0x68, 0x7f, 0x87, 0xb9, 0xa8, 0x1c, 0x7c, 0xa3, 0xf0, + 0x1b, 0x31, 0x73, 0x2d, 0x12, 0xbb, 0x11, 0xcf, 0x71, 0x25, 0x7e, 0x9f, 0x37, 0x02, 0xc6, 0xe2, + 0x07, 0x86, 0xf2, 0x13, 0x8f, 0xb8, 0xd8, 0x70, 0x57, 0xf7, 0x91, 0x42, 0xbb, 0xb8, 0xa7, 0x0d, + 0x38, 0xe9, 0x32, 0xc9, 0xe2, 0xd9, 0xeb, 0xb2, 0xc1, 0xdf, 0xd7, 0xb3, 0x50, 0x73, 0xb7, 0xeb, + 0x3d, 0x50, 0x6a, 0x51, 0x47, 0x6e, 0xb1, 0x35, 0x24, 0x0f, 0x48, 0x00, 0xd6, 0x92, 0x98, 0x45, + 0xee, 0x11, 0x34, 0xa7, 0x33, 0x26, 0x31, 0x4d, 0x9c, 0x09, 0x91, 0x8e, 0xd2, 0x53, 0xd0, 0x12, + 0x93, 0x51, 0x1a, 0x08, 0xea, 0x1c, 0x00, 0x92, 0x4a, 0x06, 0xb6, 0x83, 0xd5, 0xe4, 0x65, 0x6d, + 0x80, 0x82, 0x4a, 0x2f, 0xa9, 0x1c, 0x87, 0xc6, 0xb7, 0x61, 0x12, 0x54, 0xc0, 0xbe, 0xe7, 0x94, + 0xd1, 0xe2, 0x28, 0x36, 0xca, 0x39, 0x1c, 0xcd, 0xae, 0x06, 0x5f, 0x58, 0x05, 0xd8, 0x8d, 0x9e, + 0xcc, 0x4a, 0x2a, 0xda, 0x23, 0xd9, 0x63, 0x73, 0x33, 0xcc, 0xfe, 0xce, 0x31, 0x7b, 0x39, 0x53, + 0x33, 0x51, 0x68, 0xc0, 0x34, 0x09, 0x59, 0xc9, 0x2f, 0x25, 0x76, 0xc8, 0x01, 0x74, 0x6c, 0xa6, + 0xfd, 0x95, 0xb3, 0x90, 0xc2, 0x56, 0x2b, 0x74, 0xf6, 0xc9, 0xfb, 0x72, 0xb5, 0x43, 0x50, 0x78, + 0x46, 0xa1, 0xe3, 0xfe, 0x72, 0xe7, 0x0f, 0xc2, 0x9a, 0xb8, 0x16, 0x5c, 0x1b, 0xa5, 0xfe, 0xb5, + 0x05, 0x69, 0xcc, 0xd1, 0x77, 0xc8, 0xb0, 0x80, 0x82, 0x81, 0xed, 0x95, 0x23, 0x0c, 0xf4, 0x5e, + 0xda, 0x10, 0xa6, 0xf8, 0x83, 0x0c, 0xd7, 0xe9, 0x32, 0x71, 0xda, 0xbc, 0x45, 0x51, 0x9e, 0xa3, + 0xc5, 0xc3, 0xa5, 0x68, 0x43, 0x66, 0x18, 0x93, 0x0f, 0x7b, 0xe2, 0x14, 0x84, 0x29, 0x99, 0x3b, + 0x6f, 0x02, 0x4d, 0x86, 0x80, 0x82, 0x55, 0x69, 0x2a, 0x97, 0xcc, 0x5d, 0xa1, 0x10, 0x93, 0x90, + 0x46, 0x61, 0x1c, 0x03, 0x13, 0x54, 0x03, 0xda, 0xd4, 0x23, 0x6b, 0x72, 0x4d, 0x39, 0xa8, 0x63, + 0xb9, 0xc8, 0x08, 0x6d, 0x4c, 0xa6, 0x06, 0xfc, 0x0d, 0x9b, 0x03, 0x79, 0x80, 0x9e, 0x62, 0x34, + 0x0b, 0xa3, 0x1f, 0x36, 0x8d, 0xfa, 0xa6, 0xf8, 0xb7, 0xa2, 0x3f, 0x25, 0xce, 0x16, 0x66, 0xc2, + 0x2d, 0xd4, 0xa6, 0x94, 0xcc, 0x20, 0xf9, 0x39, 0xf3, 0xd2, 0xcd, 0xc2, 0xe8, 0x24, 0x66, 0x75, + 0xf2, 0x9c, 0x97, 0xca, 0x7b, 0xc9, 0x42, 0x99, 0xd1, 0x75, 0x52, 0xe6, 0x0f, 0xd3, 0xeb, 0xca, + 0xec, 0x48, 0x77, 0x3c, 0x27, 0x11, 0xcb, 0xc6, 0x29, 0x18, 0xa4, 0x8e, 0xd1, 0x1d, 0xb0, 0xd1, + 0x39, 0x63, 0x2c, 0xa2, 0xe0, 0xc9, 0x02, 0xb1, 0x1f, 0x44, 0x34, 0x4e, 0xa2, 0x30, 0x06, 0x3d, + 0xa2, 0xaa, 0x83, 0xf1, 0x56, 0xb3, 0x88, 0x40, 0x7b, 0x6b, 0x13, 0x5a, 0x43, 0xb5, 0xd6, 0xa1, + 0x1b, 0x0a, 0x7c, 0xd9, 0xc4, 0xed, 0x4b, 0xb3, 0x24, 0x32, 0xee, 0x48, 0x1a, 0x29, 0x1e, 0x6a, + 0x0e, 0x8a, 0x1c, 0x98, 0x84, 0x68, 0x03, 0x5e, 0x0c, 0x3e, 0xda, 0x2b, 0x76, 0x9e, 0x86, 0xe3, + 0xfb, 0x7a, 0xdf, 0xf7, 0xfd, 0x33, 0x40, 0x04, 0x71, 0x5d, 0x04, 0xc7, 0x5b, 0x23, 0x57, 0x4c, + 0x32, 0x6b, 0x48, 0x37, 0x76, 0xc8, 0x7a, 0xd6, 0xcb, 0x53, 0xc6, 0x36, 0x0e, 0x17, 0xc6, 0x98, + 0x43, 0xd9, 0x38, 0x6b, 0xf8, 0xd1, 0x26, 0x4e, 0xd3, 0xd4, 0x74, 0x16, 0xea, 0x90, 0x6d, 0x70, + 0x00, 0xfa, 0x8e, 0xd8, 0x6d, 0xc1, 0x3e, 0x5b, 0xe5, 0xce, 0x52, 0x91, 0xf3, 0xf6, 0xc1, 0xf4, + 0x52, 0x8c, 0x49, 0xc8, 0x50, 0xb5, 0x9e, 0x79, 0x7e, 0x87, 0xe9, 0x03, 0xfa, 0x14, 0x99, 0xb3, + 0xcd, 0x83, 0x65, 0x31, 0xec, 0x64, 0x79, 0x1e, 0xc2, 0xb2, 0xcd, 0x5b, 0xad, 0x10, 0xe4, 0xc9, + 0x7b, 0x60, 0xca, 0xf7, 0x46, 0x51, 0x14, 0x65, 0x45, 0x36, 0x37, 0x25, 0x79, 0x6e, 0x34, 0xd2, + 0x43, 0x6a, 0x73, 0x86, 0x80, 0x31, 0x38, 0x33, 0xab, 0x11, 0x9b, 0x1f, 0x99, 0xe7, 0x60, 0x2e, + 0x64, 0xce, 0xb7, 0x33, 0xce, 0x26, 0x44, 0xe1, 0xba, 0x96, 0xc4, 0xfc, 0xa8, 0x99, 0x2b, 0xc7, + 0xd9, 0x24, 0xcf, 0x3d, 0xa3, 0x0b, 0x00, 0x5d, 0x66, 0xc6, 0x28, 0xe0, 0xd1, 0x0d, 0x9f, 0xb9, + 0x4f, 0x00, 0x65, 0x94, 0x68, 0xa8, 0xe8, 0xba, 0x00, 0xe8, 0xae, 0x8b, 0x02, 0x69, 0xb2, 0x21, + 0x4b, 0xc2, 0x49, 0x6c, 0x45, 0x90, 0xdc, 0x13, 0x30, 0x64, 0x9e, 0xe7, 0x35, 0x77, 0x83, 0x2a, + 0xcb, 0xc5, 0x42, 0xbe, 0xb7, 0x47, 0x14, 0xa7, 0xe5, 0x32, 0xb6, 0x5a, 0x96, 0x8f, 0xee, 0x00, + 0x0c, 0xe0, 0xca, 0x0d, 0x49, 0xc8, 0x93, 0x4d, 0xab, 0x55, 0x69, 0x4c, 0x1b, 0xab, 0xb5, 0xb4, + 0x5a, 0x2e, 0x71, 0x0a, 0xb6, 0x9e, 0xcb, 0x42, 0x2e, 0xe5, 0x54, 0x62, 0x57, 0x03, 0x14, 0x63, + 0x97, 0xc4, 0xa4, 0x9a, 0xda, 0x01, 0x58, 0x57, 0x00, 0x80, 0x5d, 0xd2, 0x80, 0xae, 0xb2, 0x51, + 0x95, 0xae, 0x2b, 0x83, 0xf8, 0xd3, 0x05, 0x12, 0x60, 0x31, 0x36, 0x44, 0x41, 0x84, 0xad, 0xfa, + 0x36, 0x13, 0xf3, 0x39, 0x9f, 0x39, 0xb1, 0x5e, 0x44, 0xa1, 0x8e, 0xc0, 0x21, 0xb9, 0x5d, 0xd1, + 0xc4, 0x99, 0x90, 0x45, 0x6d, 0x76, 0xd6, 0x7a, 0xe5, 0x6c, 0xef, 0xb4, 0x62, 0x08, 0x7e, 0xd2, + 0xd2, 0x45, 0xa8, 0xee, 0xb7, 0xe2, 0x50, 0x05, 0x40, 0x07, 0xd0, 0x05, 0x9d, 0xe1, 0x62, 0x45, + 0x23, 0x70, 0x6d, 0x47, 0xd0, 0x7b, 0x05, 0xfe, 0xdb, 0xd2, 0x7c, 0x05, 0x58, 0xc7, 0xdc, 0xc1, + 0x23, 0x6d, 0xb5, 0xe6, 0x28, 0x53, 0xe0, 0xf5, 0x61, 0xf2, 0x00, 0x76, 0xd3, 0x03, 0xfb, 0xb7, + 0x83, 0x43, 0x0f, 0x10, 0x73, 0x2b, 0x9a, 0xc9, 0x95, 0x55, 0x4e, 0xaa, 0x24, 0xd2, 0x98, 0x20, + 0x55, 0x39, 0xb9, 0xbe, 0x45, 0xca, 0x19, 0xf1, 0x98, 0x88, 0x3c, 0x7f, 0xd0, 0x31, 0x9d, 0xe7, + 0x48, 0xb8, 0xbd, 0x1e, 0x71, 0x30, 0xce, 0x01, 0xe7, 0xc6, 0x4c, 0x8f, 0x59, 0xe5, 0x04, 0x38, + 0x65, 0x06, 0x72, 0x84, 0x8d, 0xf4, 0x52, 0x7b, 0xfb, 0xb4, 0xed, 0xdf, 0x20, 0xef, 0x78, 0xd1, + 0x21, 0xfe, 0x24, 0x2e, 0x94, 0xdd, 0x7b, 0x14, 0x5d, 0x57, 0x4e, 0x3c, 0xe8, 0x43, 0x1a, 0xf1, + 0x9c, 0x31, 0x7f, 0x98, 0x5d, 0xab, 0x52, 0x3c, 0x67, 0x9d, 0x0e, 0x56, 0xe3, 0xcc, 0x78, 0x7b, + 0xe0, 0xd7, 0x7a, 0x49, 0xec, 0xc8, 0x38, 0xf8, 0x88, 0x78, 0x63, 0x05, 0xfe, 0x28, 0x51, 0xd6, + 0x34, 0x3b, 0x1a, 0xda, 0xb1, 0x45, 0x71, 0x55, 0x7d, 0xb1, 0x47, 0x0f, 0xcc, 0x1f, 0x8a, 0xeb, + 0x4a, 0xa3, 0x11, 0xe0, 0xa4, 0xb4, 0x1e, 0x1b, 0x7b, 0x96, 0x45, 0xb9, 0xcc, 0x56, 0x5c, 0x85, + 0xd3, 0x18, 0xc6, 0x5e, 0x7f, 0x80, 0x91, 0x44, 0x60, 0xfa, 0x72, 0x2e, 0x16, 0x99, 0x2d, 0x3f, + 0xf5, 0x49, 0xcd, 0x65, 0x60, 0xa1, 0x2b, 0x7a, 0xab, 0x84, 0x76, 0x65, 0x98, 0x58, 0x1e, 0xa5, + 0xf6, 0x80, 0xaf, 0x72, 0x6f, 0x68, 0xa2, 0x8c, 0xe7, 0x44, 0x35, 0xe9, 0x60, 0x8a, 0xca, 0xf9, + 0xa0, 0x29, 0x73, 0xed, 0xc2, 0x34, 0x15, 0x0b, 0x99, 0xe7, 0x4d, 0xef, 0x50, 0x39, 0x0d, 0x59, + 0x9f, 0x8b, 0x11, 0xc1, 0x7a, 0x43, 0x71, 0x78, 0xda, 0xb5, 0x3f, 0xb5, 0xb2, 0x29, 0xb7, 0xbe, + 0x02, 0xd7, 0x49, 0x6d, 0x8c, 0x2c, 0xc3, 0xf4, 0xfd, 0xad, 0x2c, 0x87, 0x69, 0x05, 0x39, 0xc8, + 0x4b, 0xe0, 0x5d, 0x38, 0xc6, 0x52, 0x70, 0x72, 0x55, 0x54, 0x87, 0x7d, 0x18, 0xbc, 0x98, 0xf1, + 0xbd, 0x3d, 0x9f, 0xac, 0x3a, 0xc7, 0xc5, 0x0a, 0x0e, 0x21, 0xdf, 0x36, 0xe0, 0xa6, 0x5c, 0x7f, + 0xb0, 0x7a, 0xc6, 0x8e, 0x3b, 0xdf, 0x2e, 0x86, 0x59, 0xbc, 0xcf, 0x20, 0x2a, 0x20, 0x61, 0xf4, + 0x91, 0x56, 0xcb, 0x66, 0x82, 0x58, 0x37, 0x09, 0x6b, 0x43, 0xd4, 0x15, 0x30, 0x1e, 0x1e, 0x23, + 0xf7, 0x56, 0xeb, 0x14, 0xce, 0x56, 0x90, 0x20, 0xf5, 0x89, 0x12, 0xc6, 0x79, 0xfe, 0x0e, 0x72, + 0x1a, 0x07, 0x7a, 0xa6, 0xd4, 0x48, 0x24, 0x48, 0x98, 0x63, 0x00, 0xe9, 0x72, 0x57, 0xce, 0x25, + 0x87, 0x09, 0x37, 0xa5, 0x18, 0xef, 0x4e, 0x65, 0x9e, 0xa8, 0xc8, 0xa9, 0x5d, 0xac, 0xb9, 0x2a, + 0x35, 0xc8, 0x5d, 0x40, 0x1a, 0x93, 0xb2, 0x13, 0xff, 0x01, 0x90, 0xce, 0x8c, 0x7b, 0x4f, 0x52, + 0x38, 0x86, 0x90, 0xec, 0xc8, 0xcc, 0x7e, 0x54, 0xc9, 0x4a, 0xa4, 0x7c, 0xe4, 0x7e, 0x1b, 0x8d, + 0xf5, 0x92, 0x4b, 0x3a, 0x15, 0x72, 0x86, 0xca, 0x32, 0xc5, 0xd3, 0x24, 0xde, 0x18, 0x07, 0x41, + 0xca, 0xf5, 0x47, 0xb1, 0xe2, 0x49, 0xa6, 0xc9, 0xf1, 0x73, 0x9a, 0xd5, 0x81, 0x36, 0x56, 0xd3, + 0x97, 0x1a, 0xc2, 0x46, 0x24, 0x86, 0xa0, 0x35, 0x21, 0x05, 0x56, 0x2d, 0x6e, 0xb5, 0x4e, 0x15, + 0x15, 0x56, 0x86, 0x5a, 0x21, 0x51, 0xb1, 0x5c, 0xa9, 0x7b, 0xed, 0x64, 0x1e, 0xb3, 0x9e, 0xbe, + 0x55, 0x0a, 0x0c, 0xf5, 0x8a, 0x26, 0xd0, 0xf3, 0x5a, 0x80, 0x37, 0x71, 0xcf, 0x38, 0x53, 0x3b, + 0x62, 0xfc, 0x35, 0x88, 0x1f, 0x0c, 0x9a, 0xbc, 0x90, 0x19, 0x1f, 0x1e, 0x29, 0x84, 0x83, 0x2f, + 0x47, 0xbb, 0xd0, 0xeb, 0x0d, 0x53, 0xa5, 0xd0, 0x82, 0x23, 0x48, 0x26, 0x0b, 0xbd, 0x54, 0xc9, + 0xed, 0x89, 0x2e, 0x48, 0xc2, 0xee, 0x8c, 0xcb, 0x53, 0x33, 0x0f, 0x8d, 0x82, 0x71, 0xf7, 0xd3, + 0xa7, 0xce, 0x64, 0xf4, 0xe9, 0xd3, 0xac, 0xfd, 0xe9, 0x13, 0xfd, 0xf4, 0x69, 0xd6, 0x79, 0x31, + 0xc2, 0xf9, 0x4e, 0x01, 0xe4, 0x78, 0x24, 0x66, 0xde, 0xf8, 0xd3, 0xa7, 0x34, 0xff, 0xf4, 0x09, + 0x4d, 0x3a, 0xc8, 0xeb, 0xe8, 0x8e, 0x87, 0xc7, 0x24, 0xff, 0xf4, 0x29, 0x7d, 0xe8, 0xf3, 0xd3, + 0xa7, 0xb4, 0xfd, 0xe9, 0x13, 0x1e, 0x79, 0x64, 0xfd, 0xa7, 0xdb, 0x3e, 0x08, 0xea, 0x37, 0xe3, + 0x35, 0xf8, 0x89, 0x2f, 0xbe, 0xbd, 0x5b, 0x23, 0x4f, 0x2d, 0xa6, 0x5e, 0x27, 0xc6, 0xe4, 0xcd, + 0x7e, 0x6e, 0xe8, 0x75, 0xd6, 0x98, 0xfc, 0xb8, 0x93, 0xbd, 0x4c, 0x63, 0x53, 0xf9, 0xcb, 0xfd, + 0x5c, 0x5b, 0xf9, 0x23, 0xf3, 0x7e, 0x45, 0xa3, 0xe0, 0x8b, 0x51, 0xee, 0xdf, 0xc1, 0x84, 0xff, + 0xc1, 0x3c, 0x34, 0xf6, 0xbb, 0x57, 0x61, 0x77, 0xfe, 0x55, 0xf7, 0xbb, 0xc9, 0xb6, 0x57, 0x60, + 0x8f, 0xbc, 0xde, 0xcb, 0xec, 0x43, 0xe6, 0x37, 0x4d, 0x80, 0x1f, 0x3b, 0xff, 0x30, 0xff, 0x79, + 0x5f, 0x7a, 0x98, 0x7c, 0x77, 0xac, 0xc4, 0x95, 0xfd, 0xb0, 0x5b, 0xf6, 0xda, 0xfc, 0x67, 0x4a, + 0xbe, 0x3e, 0x56, 0xe2, 0xca, 0x7e, 0x67, 0xef, 0x42, 0xbd, 0xa4, 0x71, 0xb2, 0x20, 0xdf, 0xdb, + 0xa4, 0x4a, 0x32, 0x39, 0x23, 0xbf, 0xd8, 0x8f, 0x79, 0x9c, 0x24, 0xaa, 0x0e, 0x6d, 0xf8, 0xcb, + 0xde, 0x5e, 0x62, 0xea, 0xac, 0x84, 0x44, 0x36, 0x11, 0xde, 0x19, 0x59, 0xb5, 0xb3, 0x9f, 0xfc, + 0xb5, 0x29, 0xbe, 0xba, 0xbd, 0x6b, 0x5d, 0xa9, 0xca, 0xde, 0x0b, 0x0f, 0x13, 0xc5, 0xd6, 0xa1, + 0x4a, 0xf9, 0x77, 0x71, 0x12, 0xc2, 0x96, 0x5d, 0x39, 0xc0, 0x47, 0xf2, 0xac, 0xe7, 0xfb, 0x6d, + 0x15, 0xa8, 0x1a, 0xd4, 0x7f, 0x37, 0x9c, 0x67, 0xa6, 0xd5, 0x5b, 0xd8, 0xe6, 0x49, 0xef, 0xb2, + 0xd1, 0xdd, 0xdf, 0x77, 0x0e, 0xd1, 0x75, 0xf2, 0xc1, 0x38, 0x86, 0x51, 0xef, 0x12, 0xd3, 0x75, + 0x08, 0x6c, 0xa2, 0x34, 0xea, 0x13, 0xcf, 0xf7, 0x70, 0x01, 0x43, 0xfa, 0x99, 0x35, 0x42, 0x45, + 0x2a, 0x20, 0x71, 0xe3, 0xa4, 0xfd, 0x4b, 0xb6, 0x5d, 0x06, 0x3e, 0x49, 0x03, 0x9f, 0x6c, 0x02, + 0x9f, 0x84, 0x41, 0xaf, 0x20, 0xa5, 0xd8, 0x4a, 0xb9, 0xae, 0x64, 0x56, 0x22, 0x5f, 0x2f, 0x41, + 0x15, 0x67, 0xd2, 0x7e, 0x0b, 0x29, 0xb4, 0x08, 0xe3, 0x9f, 0x8d, 0x86, 0x38, 0xad, 0x24, 0xf2, + 0x97, 0xb6, 0x5f, 0xcd, 0xe2, 0x5a, 0x2e, 0x55, 0x11, 0x21, 0x00, 0x90, 0xed, 0x1d, 0x6e, 0x1c, + 0x1e, 0x58, 0xe0, 0xb3, 0x06, 0x5d, 0x35, 0x89, 0xe7, 0x9c, 0xbc, 0x2a, 0xbe, 0x3c, 0xb3, 0xae, + 0x7e, 0x8d, 0x47, 0xa6, 0xbf, 0x25, 0xbf, 0xb3, 0x28, 0x60, 0x3a, 0x38, 0xfb, 0x15, 0x28, 0x79, + 0xb4, 0x57, 0x43, 0x2d, 0xa6, 0x8d, 0x1a, 0x40, 0xbe, 0x75, 0x8d, 0x52, 0xea, 0x2f, 0xd3, 0xb8, + 0xac, 0x53, 0x0b, 0x96, 0x32, 0xec, 0xe7, 0xb4, 0x1e, 0x99, 0x15, 0x0a, 0x40, 0x6d, 0x56, 0x0e, + 0x79, 0x6f, 0xe5, 0x26, 0x8c, 0xc5, 0xec, 0x24, 0x4a, 0xe2, 0x44, 0x9d, 0xd8, 0xcd, 0x1f, 0x0f, + 0xf5, 0x89, 0x90, 0xa9, 0x0e, 0x65, 0x04, 0xad, 0x62, 0x37, 0xd0, 0x74, 0x03, 0x47, 0x92, 0xf0, + 0x13, 0x78, 0x0a, 0x34, 0x04, 0xdd, 0x6a, 0x79, 0x8b, 0x32, 0x31, 0xf5, 0xac, 0x0b, 0xda, 0x8d, + 0x98, 0xe9, 0xc0, 0x5b, 0x96, 0x65, 0x69, 0x99, 0xd8, 0x34, 0x2a, 0x2d, 0xd3, 0xcd, 0xf1, 0x4a, + 0xf1, 0x4e, 0xa5, 0x18, 0x2a, 0xdd, 0xf0, 0x78, 0x23, 0xa4, 0xab, 0x60, 0x67, 0x6c, 0xb3, 0x98, + 0x76, 0x09, 0x5c, 0x14, 0xc4, 0x2c, 0x0f, 0x2c, 0xb2, 0xe4, 0xf1, 0xc1, 0x46, 0x60, 0x37, 0x01, + 0x68, 0x3a, 0xd6, 0x93, 0x7a, 0xbd, 0xc7, 0x7a, 0x42, 0x60, 0x43, 0xd8, 0x16, 0xd6, 0x29, 0x4f, + 0x14, 0x6c, 0x68, 0xa0, 0x94, 0xee, 0x2c, 0xb5, 0xa3, 0x35, 0x8b, 0x83, 0x7d, 0xea, 0x81, 0xfa, + 0x51, 0x9c, 0x48, 0xde, 0xac, 0x5f, 0xaa, 0xf2, 0xfc, 0x16, 0xa8, 0x15, 0x36, 0x4a, 0xa8, 0x96, + 0x49, 0xd8, 0xdd, 0x0e, 0xe0, 0x56, 0xb4, 0xe9, 0x02, 0x52, 0x48, 0x0c, 0x5d, 0x7d, 0x4c, 0x7e, + 0x5a, 0x4c, 0x77, 0xc8, 0xad, 0x0c, 0x41, 0x5a, 0x9e, 0x5d, 0xfa, 0x04, 0xec, 0x80, 0x14, 0x98, + 0x90, 0x80, 0x1e, 0xba, 0x31, 0x29, 0xce, 0x7e, 0x81, 0xdd, 0x3e, 0x63, 0xb2, 0xcb, 0x49, 0xc2, + 0x54, 0x1b, 0xf5, 0xba, 0x02, 0x93, 0xd8, 0xa6, 0xb2, 0xb6, 0xc0, 0x24, 0xb5, 0x69, 0xf8, 0xc4, + 0xf0, 0x1d, 0x31, 0xfe, 0xe2, 0x92, 0x84, 0x6c, 0x9c, 0x12, 0x45, 0x14, 0x89, 0x49, 0x42, 0x92, + 0x09, 0x1c, 0x3c, 0xce, 0xd9, 0x38, 0x31, 0x8e, 0x17, 0x93, 0x0d, 0x59, 0x8e, 0x0f, 0xb6, 0x2a, + 0xf8, 0x0b, 0xea, 0x0f, 0x06, 0xed, 0xb1, 0xab, 0x0e, 0x75, 0x4c, 0x13, 0x9f, 0xf4, 0x07, 0x03, + 0x4c, 0x16, 0xae, 0x3c, 0x2c, 0x33, 0xa6, 0x2e, 0x63, 0xee, 0x32, 0x0a, 0x98, 0xa1, 0x5a, 0x4c, + 0x3f, 0x26, 0x6f, 0xd2, 0xcd, 0xd1, 0x19, 0xaa, 0xb3, 0xfe, 0x60, 0x60, 0xa6, 0xb8, 0x30, 0x29, + 0x98, 0xe2, 0xd4, 0xa4, 0x38, 0xab, 0x64, 0x99, 0x0d, 0x0d, 0x22, 0x19, 0xab, 0xc4, 0x9c, 0xcb, + 0x49, 0x18, 0xef, 0x66, 0x24, 0x66, 0x3e, 0x49, 0x19, 0x87, 0x00, 0x02, 0xc6, 0x18, 0x1f, 0xf9, + 0x41, 0x72, 0xc6, 0x87, 0xe9, 0xad, 0x80, 0x5d, 0x92, 0xe3, 0x6d, 0x14, 0xa6, 0xfc, 0x24, 0x0b, + 0x62, 0xe6, 0x8e, 0xe7, 0x87, 0x26, 0x43, 0x06, 0x31, 0x43, 0xa2, 0xab, 0xf0, 0x59, 0xd2, 0x41, + 0xe2, 0x5a, 0x8d, 0x2e, 0x03, 0x1f, 0x37, 0x2b, 0x08, 0xa8, 0xa0, 0xba, 0x12, 0x2a, 0xf4, 0x9b, + 0x05, 0x0a, 0x0a, 0x64, 0x57, 0x40, 0xc1, 0x85, 0xdb, 0x9c, 0xb7, 0xcb, 0xe0, 0xd2, 0x6f, 0xc7, + 0x2f, 0xce, 0x2f, 0x41, 0x44, 0xfd, 0x05, 0x81, 0xcc, 0x8c, 0x88, 0x4f, 0x7a, 0xbe, 0x8f, 0xc9, + 0xc6, 0x65, 0xa4, 0x2e, 0xa3, 0xa8, 0x16, 0xfe, 0x4d, 0x1a, 0x1f, 0x45, 0x8b, 0x5d, 0x6f, 0x51, + 0xad, 0xb7, 0x62, 0xa8, 0xdf, 0x95, 0xb8, 0x2d, 0x08, 0x67, 0xea, 0x9a, 0xf5, 0x46, 0x2a, 0xe8, + 0x77, 0x15, 0xc9, 0x18, 0xbf, 0xee, 0xf1, 0xee, 0xd5, 0xc8, 0x0f, 0x64, 0x5b, 0x9c, 0x95, 0x02, + 0x6c, 0xbb, 0x0c, 0x34, 0x5d, 0x56, 0xe3, 0xc8, 0xca, 0x71, 0xc4, 0xc1, 0x5f, 0xd0, 0xc0, 0x6f, + 0xab, 0xdd, 0x61, 0xc4, 0x0f, 0xad, 0x4e, 0xbf, 0x0d, 0x51, 0x04, 0x86, 0xfc, 0xda, 0x48, 0x5e, + 0xb3, 0x9e, 0xef, 0x8f, 0x64, 0xd0, 0xf7, 0x7d, 0xc0, 0x89, 0x1d, 0x95, 0xec, 0x88, 0x72, 0x00, + 0xfd, 0xb6, 0x38, 0x43, 0xb2, 0x23, 0xf0, 0xf1, 0x41, 0xa8, 0x26, 0x32, 0x4c, 0xbd, 0xb3, 0x7e, + 0x73, 0x1c, 0x96, 0xbd, 0x1f, 0x60, 0x05, 0x6b, 0x64, 0x33, 0x0d, 0xbd, 0x96, 0x42, 0x5a, 0x31, + 0x7e, 0x7d, 0x79, 0x39, 0x42, 0x92, 0x59, 0x0a, 0xea, 0xf6, 0x06, 0x03, 0xda, 0x1f, 0x5c, 0xbc, + 0x1a, 0x0c, 0x2e, 0xfb, 0x2f, 0xfd, 0xab, 0xde, 0xcb, 0xab, 0x2e, 0xbd, 0xb8, 0x18, 0x5c, 0x5d, + 0x5e, 0x0d, 0xfc, 0x8b, 0xcb, 0xab, 0xc1, 0xcb, 0xab, 0xde, 0xf9, 0x79, 0x1b, 0x09, 0xc6, 0xbb, + 0x7d, 0xdc, 0xe9, 0xf9, 0x17, 0xf4, 0xe2, 0xaa, 0xdf, 0xbb, 0xec, 0x5d, 0x5d, 0x9d, 0x5f, 0x9d, + 0xbf, 0x7a, 0xf5, 0xaa, 0xfd, 0x3b, 0x12, 0x98, 0xf0, 0xeb, 0xbe, 0x3f, 0xf2, 0x03, 0xfa, 0xaa, + 0xff, 0xf2, 0xc2, 0xbf, 0xba, 0xf4, 0x2f, 0x2f, 0x7c, 0xff, 0xe5, 0xf9, 0xd5, 0xa0, 0x8d, 0x14, + 0xe3, 0xdd, 0x9e, 0x8f, 0xbb, 0xfd, 0xc1, 0x05, 0x7d, 0x79, 0x79, 0x75, 0x3e, 0xe8, 0xbd, 0xba, + 0xe8, 0xf5, 0xfd, 0x2b, 0xbf, 0xdf, 0xe9, 0xf5, 0x06, 0xf4, 0xf2, 0xe5, 0xd5, 0xd5, 0xc5, 0x85, + 0xdf, 0xf3, 0x2f, 0x2f, 0x7b, 0x17, 0x2f, 0xdb, 0xbf, 0x23, 0x85, 0xe1, 0x40, 0x84, 0x9d, 0x0f, + 0x7a, 0xf4, 0xea, 0xe5, 0xe5, 0x95, 0x3f, 0xb8, 0xbc, 0x7c, 0xe5, 0x0f, 0x2e, 0xaf, 0xce, 0x3b, + 0xb4, 0xd7, 0xbb, 0xe8, 0xfb, 0x97, 0x17, 0x83, 0xf3, 0x97, 0xaf, 0x2e, 0x7a, 0x97, 0x83, 0x36, + 0x9c, 0xe4, 0x76, 0x07, 0x03, 0xdc, 0xbd, 0xf0, 0x69, 0x7f, 0x70, 0x7e, 0x79, 0x79, 0xee, 0x5f, + 0x9d, 0x9f, 0xf7, 0x7b, 0x7d, 0x80, 0x03, 0xfb, 0x38, 0x3b, 0xef, 0x0f, 0xe8, 0xc5, 0xc5, 0xd5, + 0x45, 0xaf, 0x3f, 0x78, 0xd9, 0xeb, 0x5d, 0xbd, 0xbc, 0xe8, 0x50, 0xff, 0xe5, 0xd5, 0xc5, 0xf9, + 0xc5, 0xe0, 0x12, 0xea, 0x5f, 0xf6, 0xcf, 0x2f, 0xfa, 0x76, 0x6e, 0x03, 0x18, 0xe2, 0x2b, 0xea, + 0xbf, 0x1a, 0xf4, 0xaf, 0x2e, 0xcf, 0x07, 0xfe, 0xcb, 0xab, 0xc1, 0x4b, 0x3b, 0x35, 0xc3, 0xa2, + 0x86, 0xa9, 0x8d, 0xf0, 0x68, 0x30, 0xf1, 0x2f, 0x50, 0xdc, 0xe0, 0xe1, 0x5f, 0x90, 0xc2, 0x07, + 0x2c, 0xfc, 0x57, 0x2b, 0x89, 0x8f, 0x5a, 0x75, 0x86, 0x4a, 0x94, 0xe5, 0x5e, 0xc2, 0x59, 0x9f, + 0x9f, 0x93, 0x8c, 0x5d, 0xf0, 0x8b, 0x21, 0xbd, 0xb8, 0xce, 0xba, 0x7c, 0x68, 0xd7, 0x31, 0x61, + 0x3b, 0xeb, 0x8c, 0x24, 0xa3, 0x83, 0x36, 0xca, 0x3a, 0x60, 0x19, 0x25, 0x74, 0x7a, 0x96, 0x50, + 0xf5, 0x5f, 0x4c, 0x9d, 0x89, 0x51, 0xc6, 0x64, 0xc0, 0x99, 0xac, 0xfc, 0x24, 0x05, 0xd9, 0x17, + 0xf3, 0xb2, 0xd5, 0x5a, 0xa0, 0x86, 0x15, 0x68, 0xb4, 0x1d, 0x93, 0x07, 0x4a, 0x0f, 0x8a, 0xc9, + 0x78, 0x0b, 0x31, 0x83, 0xde, 0x32, 0xdd, 0x78, 0x64, 0xc1, 0x75, 0xd0, 0x10, 0xc5, 0x76, 0xdf, + 0xb7, 0x5a, 0xc0, 0x3e, 0xb1, 0x6a, 0x9a, 0x92, 0x4d, 0xa0, 0xe9, 0xa6, 0x28, 0x48, 0xda, 0x6c, + 0x56, 0x33, 0xa7, 0x6d, 0x07, 0x71, 0x48, 0x76, 0x7b, 0x91, 0x64, 0x5f, 0xf5, 0x28, 0xb5, 0xac, + 0xed, 0x32, 0x38, 0xed, 0x91, 0x0d, 0xfc, 0x93, 0xc2, 0x3f, 0x61, 0x70, 0xda, 0x2b, 0x2a, 0x7b, + 0x56, 0x59, 0xf7, 0x9c, 0x18, 0xab, 0x09, 0x83, 0x10, 0x8b, 0x53, 0x26, 0xc7, 0x6a, 0x32, 0x74, + 0xca, 0x8e, 0x26, 0x48, 0xd0, 0x65, 0x9e, 0x0b, 0x9a, 0xc2, 0x3f, 0x1b, 0xf8, 0x07, 0x7c, 0x88, + 0x3b, 0x1d, 0x59, 0x23, 0x56, 0x38, 0x2f, 0x75, 0xd9, 0xb2, 0x28, 0x48, 0x35, 0xf9, 0xf0, 0x60, + 0xf6, 0x0e, 0xa7, 0x3b, 0x9a, 0xd0, 0xc1, 0x54, 0xeb, 0x9d, 0xbb, 0x06, 0x96, 0xf1, 0x87, 0x60, + 0x59, 0x30, 0x74, 0xf9, 0x08, 0x1c, 0x40, 0x70, 0x51, 0xc1, 0x4a, 0x43, 0x9d, 0xa9, 0xd0, 0x58, + 0x8b, 0x8f, 0x83, 0x4c, 0x1f, 0x03, 0x99, 0x36, 0x41, 0x5a, 0x95, 0xe6, 0x71, 0x68, 0x9b, 0xc7, + 0xa0, 0x6d, 0x9a, 0xd0, 0xc2, 0x78, 0xbd, 0x0c, 0x9f, 0x80, 0x16, 0x3e, 0x02, 0xad, 0xc6, 0xee, + 0x32, 0xdd, 0x90, 0x6d, 0x18, 0xe8, 0x02, 0x57, 0xc0, 0x9d, 0x96, 0xf3, 0x00, 0xf4, 0x1d, 0x6e, + 0x43, 0xa5, 0x9e, 0xf5, 0xd0, 0x1a, 0x81, 0x0a, 0xb6, 0xcb, 0x54, 0xba, 0xee, 0x48, 0xf1, 0xd9, + 0xa3, 0x73, 0x50, 0x8b, 0x29, 0x55, 0x8f, 0x00, 0xae, 0x67, 0xa1, 0x16, 0x53, 0x90, 0x1c, 0xcd, + 0x59, 0x2c, 0x14, 0xe7, 0xf2, 0x49, 0xf0, 0x8b, 0xe7, 0x83, 0x5f, 0xec, 0x80, 0x9f, 0x3e, 0xb5, + 0x9c, 0x00, 0x7d, 0xfa, 0x7c, 0xe8, 0xd3, 0x1d, 0xe8, 0x60, 0x5f, 0x1e, 0x17, 0x0b, 0xb5, 0x46, + 0x86, 0x1c, 0x77, 0x10, 0xa3, 0xa7, 0x58, 0x1d, 0xc5, 0x4a, 0xb8, 0x5a, 0x3f, 0xfa, 0x1e, 0x04, + 0xe9, 0x22, 0xf8, 0x1e, 0xe4, 0xe7, 0x34, 0xf8, 0x1e, 0x81, 0x6f, 0xec, 0x09, 0xaa, 0xa8, 0x15, + 0x22, 0x30, 0x59, 0xb6, 0x61, 0x50, 0xc5, 0x5e, 0x6b, 0x1a, 0x8e, 0x7a, 0x81, 0xa6, 0xe1, 0xee, + 0x40, 0x9f, 0xc1, 0xc2, 0x66, 0x86, 0x61, 0x60, 0xd2, 0x86, 0x74, 0x8b, 0xc7, 0xe8, 0xa5, 0x29, + 0x20, 0xe2, 0xc7, 0xd1, 0xf0, 0x26, 0x8d, 0x77, 0xd0, 0xb0, 0xb4, 0xea, 0x80, 0x41, 0x43, 0x5c, + 0xcb, 0x4e, 0x83, 0x86, 0xd4, 0xa2, 0x21, 0x7e, 0x2e, 0x1a, 0x4a, 0xcd, 0xe3, 0x39, 0x68, 0x30, + 0xc6, 0xfc, 0x93, 0x68, 0x58, 0xa6, 0xf1, 0x33, 0xd1, 0x60, 0xec, 0x8d, 0x26, 0x92, 0xad, 0x55, + 0xf5, 0xd8, 0x56, 0xa1, 0x16, 0xe5, 0xba, 0x43, 0x7d, 0xf0, 0x5f, 0x50, 0xd5, 0xf1, 0xc8, 0x09, + 0x24, 0x16, 0x65, 0x62, 0xda, 0xf1, 0xb0, 0xf7, 0xc0, 0xce, 0x51, 0x9e, 0x14, 0x80, 0xd7, 0x73, + 0x8e, 0x90, 0x64, 0xbf, 0x51, 0x7e, 0xc7, 0x23, 0xf0, 0x11, 0x8d, 0x90, 0x60, 0x7f, 0x45, 0x10, + 0xae, 0x64, 0xf7, 0x60, 0x65, 0xbe, 0xfa, 0xee, 0x8b, 0x9b, 0xaf, 0x73, 0xfb, 0x65, 0x74, 0x8a, + 0x37, 0x55, 0x4b, 0x13, 0x0a, 0xf8, 0xcc, 0xa6, 0x24, 0x33, 0x5f, 0x17, 0x13, 0xd2, 0xc3, 0x98, + 0x9c, 0xca, 0x87, 0xad, 0x44, 0xb5, 0x98, 0x9e, 0x38, 0x73, 0x17, 0x0f, 0x2b, 0xba, 0xd9, 0xaa, + 0x40, 0x90, 0x45, 0xa0, 0xc8, 0x34, 0xe0, 0x24, 0x0c, 0xb2, 0x62, 0x87, 0x4a, 0x9f, 0x85, 0xc1, + 0xb0, 0x81, 0xc2, 0xf0, 0x61, 0x1c, 0xda, 0x44, 0x78, 0x1c, 0x99, 0xfb, 0xc6, 0x72, 0x4d, 0x24, + 0xa5, 0x89, 0xfd, 0xcc, 0x65, 0xfc, 0xc2, 0xeb, 0xfc, 0x1d, 0x69, 0xaa, 0xb0, 0xf9, 0x59, 0xd8, + 0x9f, 0x63, 0x92, 0x76, 0x77, 0xf9, 0xfa, 0x83, 0x81, 0x5b, 0xc0, 0x6f, 0x76, 0x16, 0xb0, 0xf7, + 0xb2, 0xfd, 0xdf, 0x66, 0x21, 0x60, 0x11, 0xdc, 0x47, 0x7f, 0x02, 0x6b, 0xe0, 0x3e, 0xce, 0x27, + 0x76, 0xf5, 0xbe, 0xfb, 0xd3, 0xcd, 0x80, 0x68, 0xec, 0xc7, 0x85, 0x83, 0xf1, 0xc3, 0x0e, 0x8c, + 0x1a, 0x40, 0xdd, 0xba, 0xd9, 0xe3, 0xd7, 0xbb, 0xf4, 0xf2, 0x48, 0x75, 0x92, 0xb1, 0xb2, 0x9b, + 0x47, 0x29, 0x64, 0xc9, 0xef, 0x9e, 0x41, 0x21, 0x60, 0xc8, 0x15, 0xcd, 0xf5, 0x79, 0xf5, 0xe7, + 0xa8, 0xe4, 0x81, 0x15, 0xea, 0xfc, 0x1d, 0xfd, 0x62, 0xec, 0x4c, 0x4d, 0x43, 0xfc, 0x20, 0x8b, + 0xd7, 0x0e, 0x97, 0xa6, 0x18, 0x79, 0x7a, 0x00, 0xcb, 0xb4, 0x94, 0x6c, 0x50, 0xdf, 0x10, 0xe9, + 0xb2, 0x24, 0xc9, 0xb4, 0xe3, 0xbd, 0xb0, 0xa9, 0xb8, 0xe3, 0xbd, 0x78, 0x3e, 0xab, 0xff, 0x78, + 0x8c, 0xd5, 0xcf, 0x2f, 0xfd, 0x06, 0xbf, 0x1a, 0xe3, 0xa8, 0xe2, 0x57, 0xf8, 0x32, 0x4b, 0xf7, + 0xe5, 0x51, 0x56, 0x7f, 0xaa, 0xe9, 0xf3, 0x59, 0x7d, 0x99, 0xc6, 0x7b, 0x0b, 0x09, 0xb2, 0x71, + 0xbb, 0x0c, 0x04, 0x49, 0x03, 0x45, 0xe2, 0x7d, 0x56, 0x07, 0x49, 0xfc, 0x2c, 0x1c, 0x86, 0x0d, + 0x24, 0x86, 0x8f, 0x61, 0xf1, 0x69, 0x66, 0x6f, 0x78, 0xbd, 0x8a, 0x62, 0x82, 0x49, 0x5c, 0x20, + 0x5c, 0xfb, 0x42, 0xff, 0xd9, 0x40, 0x3b, 0xd3, 0xf4, 0x56, 0xcc, 0xf4, 0xd2, 0x6c, 0x50, 0x69, + 0x2c, 0x66, 0x5c, 0x7d, 0x10, 0x7f, 0x70, 0xb0, 0x1d, 0xe9, 0x34, 0x51, 0x33, 0xae, 0xfe, 0x61, + 0x8a, 0x21, 0xb0, 0x75, 0x19, 0xca, 0x59, 0xcc, 0x7f, 0x0a, 0x67, 0x22, 0x4b, 0x49, 0x62, 0x2e, + 0x7c, 0xcd, 0x66, 0x70, 0xbe, 0x10, 0xd7, 0x6d, 0x97, 0xe1, 0x9a, 0x93, 0x94, 0x79, 0xcb, 0x44, + 0x89, 0x3f, 0x12, 0xa9, 0xc3, 0xd8, 0x33, 0x3b, 0x54, 0x1c, 0xde, 0x27, 0x99, 0xfe, 0x46, 0x28, + 0x6e, 0xc6, 0x50, 0xdb, 0xa4, 0xee, 0x54, 0x52, 0x32, 0x85, 0xc1, 0x56, 0x6e, 0x27, 0x9d, 0x7e, + 0x3b, 0x23, 0x5e, 0x24, 0x54, 0x64, 0xe3, 0x6a, 0xe3, 0xd1, 0xd6, 0x76, 0x6c, 0x5c, 0xa0, 0x41, + 0xd5, 0x6b, 0x67, 0x6f, 0x40, 0xe5, 0x87, 0x5c, 0xf0, 0x40, 0x74, 0xfb, 0xed, 0xa4, 0x0b, 0x80, + 0xcc, 0xe4, 0x02, 0x41, 0x96, 0x5c, 0x2c, 0x96, 0x3a, 0x10, 0x24, 0xba, 0x0b, 0xc4, 0x59, 0x9f, + 0x44, 0xf7, 0xe6, 0x47, 0x99, 0xb6, 0x90, 0xec, 0xf2, 0xb3, 0x7e, 0x11, 0xec, 0x74, 0xa5, 0xce, + 0xfa, 0x7b, 0x50, 0x55, 0xd9, 0x00, 0x8a, 0xee, 0x02, 0x9f, 0xdc, 0x07, 0xbe, 0xeb, 0x22, 0x1d, + 0xa9, 0xba, 0x9b, 0x74, 0x24, 0x02, 0xd5, 0x38, 0xf4, 0xfb, 0x57, 0xd3, 0x95, 0x0c, 0xe8, 0x27, + 0x8a, 0x09, 0x87, 0x78, 0xb8, 0x94, 0x61, 0x9b, 0x91, 0x0c, 0x92, 0x75, 0x87, 0x24, 0xa9, 0xbe, + 0xcd, 0x80, 0xe0, 0xe4, 0xe1, 0x09, 0xbc, 0x92, 0x94, 0xc5, 0x23, 0x75, 0xd6, 0x0f, 0x38, 0xcc, + 0x91, 0x25, 0x9d, 0x63, 0x47, 0x71, 0xd2, 0xb8, 0xeb, 0xc0, 0x19, 0x61, 0x84, 0xbb, 0xf3, 0xfb, + 0x94, 0x4b, 0x68, 0x02, 0x21, 0x8d, 0x0b, 0xc8, 0xa8, 0xc3, 0x41, 0xb9, 0x52, 0xe0, 0x79, 0xa2, + 0x83, 0x81, 0xf1, 0xe8, 0x38, 0x5d, 0xb6, 0x2e, 0x5b, 0x34, 0xca, 0x8c, 0x22, 0x5a, 0x17, 0x4d, + 0x1b, 0x45, 0xd6, 0x4a, 0x28, 0xcb, 0xc0, 0xcb, 0x21, 0x68, 0x68, 0x8b, 0x9c, 0x8e, 0x1f, 0xd8, + 0xeb, 0x6c, 0x1a, 0x9c, 0x56, 0x1f, 0xf9, 0x6a, 0xcd, 0x15, 0x58, 0x3e, 0xdc, 0xd0, 0xdf, 0x2a, + 0xbc, 0x6b, 0x64, 0x19, 0x3f, 0x1e, 0x92, 0x4e, 0x95, 0xef, 0x72, 0x7c, 0x96, 0xb5, 0x1b, 0xde, + 0x8e, 0xca, 0x17, 0xe6, 0x93, 0xca, 0x09, 0x96, 0x58, 0x29, 0x61, 0x3b, 0x5c, 0x36, 0x46, 0x29, + 0xe8, 0xf2, 0x8c, 0x9d, 0xd3, 0x4b, 0x5b, 0xd2, 0x30, 0xb6, 0xea, 0x0a, 0xa9, 0x2d, 0xb3, 0x56, + 0x53, 0xe0, 0xee, 0xf9, 0xd5, 0xc5, 0x9b, 0xa2, 0x30, 0x28, 0x36, 0xbe, 0xff, 0xac, 0x1c, 0x44, + 0xdc, 0x6a, 0xa1, 0x88, 0x75, 0x7b, 0xed, 0xa8, 0x93, 0x75, 0xfa, 0xed, 0x04, 0x93, 0xed, 0x5d, + 0x10, 0x8f, 0xd2, 0x20, 0x22, 0xf7, 0x41, 0x3c, 0x8a, 0x82, 0xb4, 0xb0, 0x4e, 0x75, 0x4d, 0xa4, + 0x66, 0xfd, 0xb6, 0x19, 0xe9, 0x8f, 0x6f, 0x89, 0xd0, 0xec, 0xd8, 0x95, 0x28, 0xa4, 0x5f, 0xc8, + 0x8e, 0xc4, 0x2f, 0x64, 0x41, 0xd4, 0xf1, 0x1a, 0x76, 0xda, 0xe9, 0xef, 0x4a, 0x23, 0xdd, 0xd6, + 0x1d, 0xd9, 0x96, 0xb8, 0xa8, 0x19, 0xdf, 0x38, 0xfd, 0xeb, 0x33, 0x06, 0x43, 0x7f, 0x67, 0xfd, + 0x6e, 0xc5, 0x52, 0xdd, 0x5d, 0x96, 0xea, 0xee, 0x88, 0x80, 0xc6, 0x85, 0x2e, 0xdd, 0xf4, 0xbc, + 0x39, 0x28, 0xa5, 0x6e, 0x6b, 0xb9, 0xa1, 0x92, 0x2a, 0x96, 0x5d, 0xe4, 0x2e, 0x28, 0x60, 0x42, + 0x09, 0x2c, 0x28, 0x1b, 0x3c, 0x92, 0xe8, 0x1d, 0x8f, 0x34, 0x40, 0x5e, 0x72, 0x1e, 0x7f, 0x25, + 0x17, 0xb1, 0x15, 0x47, 0xe6, 0xf3, 0x40, 0x82, 0x40, 0xd4, 0x76, 0x14, 0x27, 0xd1, 0xcd, 0xad, + 0x48, 0x8d, 0xbc, 0xe0, 0x23, 0xc9, 0x54, 0xc7, 0x44, 0xf3, 0xef, 0xe5, 0x9e, 0x5f, 0xfa, 0x5d, + 0x28, 0x81, 0x26, 0xa1, 0xd4, 0xe2, 0x48, 0xb3, 0xde, 0x2b, 0xbf, 0x2b, 0x83, 0x23, 0xa5, 0x10, + 0x04, 0xc5, 0xc0, 0xb7, 0x49, 0x84, 0x46, 0xd2, 0x6c, 0x27, 0xf5, 0xd0, 0xe3, 0xbd, 0xa1, 0x1b, + 0x04, 0x81, 0xe3, 0x91, 0x46, 0x77, 0x24, 0x83, 0x9f, 0x7b, 0xf0, 0xbc, 0x9a, 0x63, 0x22, 0x70, + 0x5c, 0x81, 0xdc, 0xcd, 0xba, 0xc2, 0x1c, 0x3e, 0xc6, 0xcc, 0x4c, 0xdc, 0xac, 0x5b, 0xa8, 0x43, + 0xd9, 0x47, 0x5d, 0x41, 0xc0, 0x73, 0x89, 0xce, 0x2f, 0xfd, 0x33, 0xa9, 0x31, 0x38, 0xa6, 0x2b, + 0x0a, 0x56, 0xda, 0xc4, 0x65, 0x93, 0xa4, 0xe1, 0x34, 0xac, 0xcf, 0xbe, 0x50, 0x0c, 0x46, 0x45, + 0xe3, 0xbb, 0xe7, 0xfb, 0x67, 0x49, 0x3b, 0x6d, 0xc6, 0x1f, 0xa4, 0x87, 0x8b, 0x67, 0x76, 0x81, + 0x69, 0x72, 0xf7, 0xc6, 0x48, 0xa1, 0xdd, 0x85, 0x94, 0xa5, 0x48, 0x73, 0x37, 0x0f, 0x47, 0x22, + 0x90, 0xe5, 0xaa, 0x3e, 0x24, 0x8a, 0x1b, 0xbd, 0x45, 0x7b, 0x98, 0x49, 0x2b, 0xcc, 0xdc, 0xba, + 0x6d, 0x45, 0x95, 0xc2, 0x2f, 0x61, 0x8a, 0x5a, 0xc0, 0xc4, 0x78, 0x8b, 0x13, 0x7c, 0x86, 0x38, + 0xc8, 0x71, 0x0c, 0x6c, 0x4d, 0x52, 0xf0, 0x3d, 0x43, 0x5e, 0x56, 0xe5, 0x95, 0x23, 0x75, 0x53, + 0xde, 0x63, 0xf6, 0xd8, 0x32, 0x3b, 0xd9, 0x1c, 0x2d, 0xed, 0xf9, 0x7e, 0x37, 0xb5, 0x35, 0x1a, + 0xc3, 0x0d, 0x75, 0x7d, 0xaf, 0xb6, 0x8a, 0xa2, 0x60, 0xfe, 0x90, 0xd7, 0x11, 0x2c, 0xbc, 0x0c, + 0xb6, 0xc8, 0x4c, 0x9c, 0x04, 0xbd, 0xeb, 0x4a, 0x18, 0x3a, 0x24, 0xef, 0xbb, 0xe6, 0xf6, 0x67, + 0xcd, 0x82, 0x59, 0x3b, 0xeb, 0x24, 0xed, 0x04, 0x5f, 0xef, 0xe2, 0xa7, 0x8c, 0x13, 0xe4, 0xcd, + 0x30, 0xbd, 0xc6, 0xbd, 0x99, 0x06, 0x97, 0x6e, 0xa7, 0xc9, 0xdd, 0x07, 0xf1, 0x87, 0x90, 0x8b, + 0xc0, 0xb3, 0x0c, 0xd4, 0x9d, 0x26, 0x77, 0x1e, 0xb1, 0xe9, 0x60, 0x87, 0xab, 0xe0, 0x7e, 0xcc, + 0x49, 0x9a, 0x80, 0x8e, 0x62, 0xac, 0x02, 0x53, 0xf2, 0x1a, 0x8e, 0xaf, 0x1a, 0x33, 0x5c, 0xea, + 0xfd, 0xa0, 0x9a, 0x8e, 0xd7, 0x5d, 0x00, 0xde, 0x21, 0x8a, 0xd0, 0xeb, 0x48, 0xab, 0x72, 0x08, + 0xba, 0x0a, 0xd7, 0xe8, 0x88, 0x2f, 0x6f, 0xec, 0xd7, 0xd7, 0xc0, 0xc7, 0xbd, 0x49, 0xc7, 0x3b, + 0x31, 0x6d, 0x5e, 0x78, 0x05, 0xa6, 0x9f, 0x13, 0x21, 0x91, 0x47, 0x3c, 0x6c, 0x34, 0x93, 0xfa, + 0xe6, 0x40, 0x63, 0x3e, 0x87, 0x67, 0x82, 0x23, 0x1d, 0x68, 0x73, 0xb3, 0xc7, 0x08, 0xc2, 0x99, + 0x66, 0x63, 0x6f, 0x95, 0x64, 0xa9, 0xb9, 0x9e, 0xe0, 0x11, 0x4f, 0x27, 0x59, 0xb4, 0x74, 0x69, + 0x93, 0x9f, 0xad, 0xcb, 0x5c, 0x2e, 0x67, 0xde, 0x84, 0x2c, 0x1a, 0x82, 0x50, 0x36, 0x4e, 0x42, + 0x4d, 0xa7, 0xd2, 0x45, 0x29, 0x82, 0xd3, 0xaf, 0x0a, 0xd1, 0x10, 0x33, 0x66, 0xd7, 0x48, 0x85, + 0x72, 0x96, 0xac, 0x10, 0xdc, 0x1f, 0xae, 0xcf, 0x5b, 0xcf, 0x2f, 0x31, 0x84, 0xd8, 0xdb, 0x71, + 0xa2, 0x41, 0x1d, 0x7a, 0x66, 0x22, 0xdb, 0x7e, 0xfb, 0xcd, 0x38, 0x50, 0x7f, 0xfb, 0x8d, 0x49, + 0x4c, 0x50, 0xd3, 0x9f, 0x5a, 0xc6, 0xf2, 0xd8, 0xb0, 0x4c, 0x64, 0x2e, 0xc0, 0x57, 0x85, 0x18, + 0xef, 0x44, 0xf5, 0x6b, 0x7c, 0x18, 0x17, 0xf2, 0x80, 0xdf, 0xd4, 0xd2, 0x8d, 0xb9, 0x07, 0x63, + 0xe3, 0x3f, 0xcc, 0x89, 0x19, 0x11, 0x6c, 0x9b, 0xc8, 0x77, 0x80, 0x8f, 0x6f, 0x92, 0x5b, 0x19, + 0x48, 0x92, 0x48, 0x83, 0x93, 0xd4, 0x28, 0x2e, 0xb0, 0x3f, 0x3c, 0xad, 0x2a, 0x94, 0xe1, 0x7f, + 0x66, 0x67, 0x55, 0x0b, 0x21, 0x47, 0xa5, 0x0a, 0xf0, 0xce, 0x7c, 0x06, 0x65, 0x3e, 0xc9, 0xd8, + 0x36, 0xd9, 0x70, 0x35, 0x8f, 0x93, 0xdb, 0xc0, 0xdb, 0x88, 0x54, 0x4c, 0x63, 0xee, 0x91, 0x99, + 0x48, 0xd7, 0x71, 0x78, 0x1f, 0xa8, 0x91, 0x27, 0x64, 0x2c, 0x24, 0xef, 0x4e, 0x41, 0x64, 0x7a, + 0xe0, 0x8a, 0x82, 0xdf, 0xea, 0xf6, 0xb8, 0x5f, 0x1e, 0x9d, 0x9b, 0x88, 0x53, 0x35, 0xf2, 0x2c, + 0xd8, 0x1f, 0xf8, 0x5c, 0x7b, 0x81, 0xfb, 0xf8, 0x98, 0xac, 0xbd, 0x09, 0xe3, 0x98, 0x2c, 0xd1, + 0x7b, 0x1b, 0xee, 0x56, 0x5f, 0x24, 0x47, 0xe5, 0xba, 0x11, 0x41, 0x32, 0x7b, 0x0a, 0xd9, 0x0c, + 0x66, 0xaa, 0x10, 0xf4, 0x00, 0x0e, 0x89, 0x0b, 0x3e, 0xb2, 0xc1, 0x96, 0x89, 0x7c, 0x2b, 0xd7, + 0x99, 0x06, 0x7d, 0x17, 0x32, 0x21, 0x74, 0x0d, 0xa2, 0x51, 0xbe, 0x06, 0x79, 0x29, 0xe4, 0xe2, + 0x75, 0x0c, 0x8c, 0xf0, 0x13, 0x8f, 0x34, 0xc2, 0x43, 0xe8, 0xc7, 0x5c, 0x69, 0xf9, 0xc6, 0x6e, + 0xf7, 0x08, 0x0f, 0x4b, 0xf5, 0xc4, 0x52, 0x60, 0x3a, 0x82, 0x51, 0x82, 0xae, 0x36, 0xfb, 0x68, + 0x33, 0xe0, 0x9a, 0x2e, 0x28, 0x72, 0x9c, 0x46, 0x06, 0xd2, 0x3f, 0xbb, 0x20, 0x39, 0xe6, 0x20, + 0xde, 0xca, 0xac, 0x7f, 0x75, 0x15, 0xd5, 0xc9, 0xba, 0xd6, 0xbb, 0x74, 0xad, 0x71, 0x19, 0x12, + 0x9f, 0x25, 0xb7, 0xd2, 0x0b, 0xcc, 0x77, 0xbd, 0xa8, 0x5e, 0x70, 0xda, 0x83, 0x68, 0x5c, 0x73, + 0xdb, 0x0b, 0x2e, 0x6f, 0xcf, 0x34, 0x44, 0x29, 0x7d, 0x1b, 0x46, 0xcb, 0x1d, 0x3e, 0xad, 0xe2, + 0x83, 0x0f, 0x6e, 0x5c, 0x01, 0xdf, 0x6f, 0xd7, 0x10, 0x6b, 0xb6, 0xe1, 0xe0, 0x57, 0xc7, 0x45, + 0xf3, 0xf4, 0xae, 0xc1, 0x75, 0x8d, 0xae, 0xed, 0xb7, 0xed, 0xb4, 0x77, 0x58, 0x3d, 0x5b, 0x37, + 0x2b, 0x03, 0x43, 0xba, 0xba, 0x7d, 0x4c, 0x9e, 0x1a, 0xdf, 0xb1, 0x1b, 0x5e, 0x47, 0x86, 0x08, + 0xc7, 0xd7, 0x05, 0x7a, 0xdb, 0x30, 0x5f, 0xa6, 0x3b, 0x3b, 0x98, 0xf5, 0x33, 0x66, 0x2a, 0x06, + 0x7d, 0x16, 0x68, 0xba, 0xa4, 0xba, 0x25, 0x32, 0x11, 0xe4, 0x64, 0x5b, 0xdd, 0xe4, 0x0b, 0xbc, + 0xb7, 0x2a, 0x79, 0x63, 0xe8, 0xe5, 0xa4, 0x4a, 0x75, 0xbb, 0x20, 0x2c, 0x0d, 0x79, 0x1a, 0x61, + 0x06, 0x11, 0xc6, 0xe9, 0x57, 0x91, 0x16, 0x1b, 0x3e, 0xf2, 0x1a, 0xb5, 0xca, 0x4c, 0x2f, 0xf0, + 0x3c, 0x4c, 0xcc, 0x1d, 0xbf, 0x60, 0xeb, 0x75, 0x6f, 0xf9, 0xf4, 0x46, 0xe8, 0xae, 0x0e, 0xd7, + 0xdd, 0xa5, 0x58, 0x2c, 0x63, 0xd8, 0xca, 0xba, 0x26, 0x66, 0xc0, 0xb3, 0x5e, 0x1e, 0xe4, 0x93, + 0x13, 0xf7, 0x3f, 0x1e, 0x7a, 0x44, 0xab, 0x50, 0xa6, 0x70, 0x49, 0x2d, 0xf0, 0x4c, 0x32, 0x06, + 0x61, 0xe1, 0x75, 0x40, 0x46, 0xd2, 0x3b, 0x6c, 0x85, 0xaf, 0xf9, 0xb8, 0x37, 0x52, 0x94, 0xdc, + 0x8a, 0x38, 0xb6, 0x47, 0x17, 0xae, 0x81, 0xb9, 0xe0, 0x46, 0x74, 0xb2, 0x0e, 0x36, 0x1a, 0x81, + 0x3e, 0x02, 0xd4, 0x55, 0xa6, 0xed, 0x9e, 0xbd, 0xd1, 0xa8, 0xdf, 0x96, 0xb8, 0xdc, 0xb9, 0xcb, + 0xcf, 0x75, 0x92, 0x0a, 0x40, 0x60, 0xe0, 0x85, 0xd3, 0x34, 0x89, 0x33, 0xcd, 0x3d, 0x72, 0xc8, + 0xd6, 0x45, 0x01, 0xc7, 0x42, 0x4b, 0x04, 0xaf, 0x8f, 0x78, 0x64, 0x27, 0x40, 0x11, 0x6d, 0xcd, + 0x0d, 0xb3, 0x37, 0xf0, 0xaa, 0xc4, 0x8e, 0xc9, 0xa9, 0x99, 0xd6, 0x79, 0x5e, 0xad, 0xec, 0x82, + 0x6b, 0x17, 0x96, 0x9e, 0x7e, 0x7d, 0xff, 0xd1, 0xde, 0xcf, 0x43, 0x1e, 0x70, 0x9a, 0x87, 0xdd, + 0x1d, 0xd3, 0x5b, 0x21, 0x67, 0xc9, 0x2d, 0x95, 0xe1, 0x46, 0x2c, 0x42, 0x08, 0x08, 0xcb, 0x52, + 0xae, 0xbe, 0x5a, 0xc0, 0x8d, 0x7b, 0xc1, 0xce, 0x7e, 0x45, 0x68, 0x74, 0x1a, 0x2d, 0x55, 0xb2, + 0xe2, 0x79, 0x28, 0x67, 0x2a, 0x11, 0x33, 0x4c, 0x71, 0x3b, 0x0d, 0xe7, 0xa1, 0x12, 0x67, 0xa2, + 0xbc, 0x12, 0x0a, 0x8f, 0x9f, 0x88, 0x1f, 0x97, 0x89, 0xe4, 0xb9, 0xf8, 0x31, 0x99, 0xe5, 0xe2, + 0xc7, 0x70, 0xd6, 0x28, 0xe5, 0x65, 0x2f, 0x10, 0xdc, 0xdf, 0x50, 0x19, 0x91, 0xc8, 0x73, 0x85, + 0x5b, 0x2d, 0xff, 0x5a, 0x97, 0xf7, 0x76, 0x47, 0x2e, 0xd6, 0x2e, 0x4a, 0xe2, 0x8e, 0x77, 0x76, + 0xe6, 0x75, 0x38, 0x5d, 0x26, 0xa9, 0xee, 0x70, 0xba, 0x0e, 0xf5, 0x52, 0x86, 0x2b, 0xde, 0x81, + 0xf0, 0xc6, 0x50, 0x45, 0xcb, 0x8e, 0x0e, 0x20, 0x92, 0xb9, 0x94, 0x42, 0x10, 0x79, 0x48, 0x4e, + 0x2d, 0xc6, 0x9c, 0xcd, 0x4a, 0xb6, 0xd1, 0x5d, 0xa0, 0x40, 0xbd, 0xe5, 0x44, 0x05, 0x92, 0xcc, + 0x45, 0x1c, 0x07, 0x9e, 0x4c, 0x24, 0xec, 0x61, 0xa9, 0x56, 0xc9, 0x0d, 0xef, 0x9a, 0x85, 0xf2, + 0x82, 0x3e, 0xb1, 0xdf, 0x81, 0xf7, 0x85, 0xef, 0xfb, 0x5e, 0xf1, 0x04, 0xa8, 0x6e, 0xdf, 0x02, + 0xd3, 0x14, 0x7e, 0x1e, 0x01, 0x36, 0x9f, 0xcf, 0xbd, 0xa2, 0x79, 0x7b, 0x6f, 0xad, 0x11, 0x2f, + 0xfd, 0x0d, 0x9c, 0x86, 0x86, 0x92, 0xdf, 0x02, 0xcd, 0x93, 0x8c, 0x55, 0xb1, 0xdd, 0x10, 0x1c, + 0x74, 0xcd, 0xa9, 0xa1, 0xde, 0xb4, 0xc6, 0x8c, 0xfd, 0x1e, 0xeb, 0x49, 0xe0, 0xd2, 0x44, 0xb2, + 0x7f, 0xc2, 0x0b, 0x20, 0x60, 0x40, 0x5a, 0x35, 0x0e, 0x1e, 0x5c, 0x70, 0x6a, 0x1c, 0xbc, 0xba, + 0xe0, 0xd4, 0xb8, 0x94, 0xfd, 0x0b, 0x71, 0x92, 0x41, 0x24, 0xc5, 0x83, 0x66, 0xe8, 0x9f, 0xb3, + 0x42, 0xc7, 0x63, 0x9f, 0x18, 0x67, 0xb2, 0x4f, 0xbc, 0x8e, 0x32, 0x1e, 0x50, 0xf8, 0x35, 0x4e, + 0xe4, 0x09, 0x19, 0x83, 0x9e, 0x68, 0x8a, 0xe1, 0x80, 0xfb, 0xb0, 0xc2, 0xe4, 0x88, 0xed, 0x5a, + 0x41, 0x84, 0x6a, 0xe0, 0x5a, 0xf5, 0x8f, 0x43, 0x2c, 0x8b, 0x4b, 0xc8, 0x3b, 0x10, 0x9b, 0x16, + 0xef, 0x01, 0xc0, 0x72, 0x1c, 0xfe, 0x71, 0x80, 0x65, 0x31, 0xf8, 0x9b, 0x2b, 0x80, 0x3b, 0x76, + 0x72, 0x09, 0x31, 0x3c, 0x68, 0xe3, 0x06, 0xf2, 0x14, 0xe8, 0x83, 0xf1, 0x96, 0xb6, 0x76, 0xad, + 0xe2, 0x8e, 0x27, 0xd6, 0xc2, 0xde, 0x35, 0xba, 0x93, 0x03, 0xa3, 0x9b, 0xc4, 0x2c, 0xe9, 0x66, + 0x24, 0x65, 0x19, 0x04, 0x8f, 0x0c, 0xd3, 0xeb, 0x64, 0x98, 0x76, 0x58, 0x7c, 0xf6, 0x8a, 0x44, + 0x1d, 0xd6, 0x73, 0x97, 0x3a, 0xd9, 0xcf, 0x3b, 0xe7, 0x6b, 0x29, 0x26, 0x73, 0x16, 0x52, 0xb8, + 0x80, 0x18, 0xd2, 0x05, 0xd9, 0xb0, 0x90, 0x4e, 0x87, 0xdc, 0xc6, 0xcd, 0x8e, 0x7b, 0x7d, 0x3a, + 0x68, 0x47, 0xe5, 0xb8, 0xe7, 0x66, 0xb4, 0x4b, 0xf3, 0xef, 0xc6, 0x8c, 0xb8, 0x8e, 0xe5, 0x3c, + 0xb0, 0xda, 0x0d, 0x5e, 0xbe, 0x98, 0xfb, 0xbe, 0x99, 0xfc, 0x25, 0xbd, 0xbc, 0xbc, 0x84, 0xef, + 0xb9, 0xf9, 0x3e, 0x3f, 0xa7, 0xe7, 0xe7, 0xe7, 0xc4, 0xfb, 0xc2, 0xb7, 0xdf, 0x03, 0xdf, 0xa4, + 0xe7, 0x90, 0xbe, 0x2c, 0xeb, 0xfa, 0xbe, 0xf9, 0x7e, 0x55, 0xd6, 0x9d, 0xdb, 0x6f, 0x83, 0x48, + 0x0b, 0x78, 0x72, 0xe8, 0x11, 0x30, 0x6a, 0x2a, 0xfb, 0xb9, 0x3e, 0xee, 0x01, 0xd7, 0x9f, 0x39, + 0x0a, 0x87, 0x38, 0x3b, 0xf0, 0x04, 0x60, 0xb2, 0x38, 0x5a, 0x0e, 0x70, 0x5d, 0x8d, 0x61, 0x63, + 0x0a, 0xd6, 0x67, 0x3a, 0xa3, 0x76, 0xda, 0x33, 0xeb, 0xec, 0x83, 0x84, 0xf5, 0x98, 0x96, 0x03, + 0xb2, 0xd5, 0x16, 0xae, 0xda, 0xa2, 0xac, 0xb6, 0x28, 0xab, 0x4d, 0x8e, 0x3a, 0x28, 0x60, 0xb4, + 0xd3, 0xa3, 0xa3, 0x11, 0xe6, 0xe0, 0xbe, 0xe7, 0xfb, 0xbb, 0xa3, 0x31, 0x82, 0x68, 0xb7, 0xcf, + 0xa9, 0xeb, 0x73, 0x5a, 0xf6, 0x39, 0xad, 0xfa, 0x2c, 0x0a, 0xc3, 0xe1, 0xf5, 0x9e, 0xbb, 0xd0, + 0xfb, 0x7b, 0x46, 0x41, 0x38, 0xd9, 0x3a, 0xad, 0x2b, 0x38, 0x1a, 0x7c, 0x76, 0x3c, 0x24, 0x8d, + 0x70, 0xeb, 0x29, 0x03, 0x5d, 0x6a, 0xd7, 0x29, 0xc6, 0x9b, 0x4e, 0xb1, 0xe1, 0xd3, 0x9a, 0xee, + 0xa8, 0xdb, 0x6b, 0x8b, 0x4e, 0xd6, 0x49, 0x02, 0xd9, 0x4d, 0x88, 0xaa, 0xc3, 0xa4, 0x6a, 0xb3, + 0x1a, 0xa4, 0x94, 0x8f, 0x9d, 0x41, 0xbe, 0x67, 0x40, 0x67, 0x6d, 0x85, 0x1f, 0x11, 0x4f, 0x4d, + 0xc7, 0x55, 0x7a, 0xc0, 0x43, 0x25, 0x66, 0xd2, 0x4e, 0x6c, 0x5c, 0x43, 0xe8, 0xc0, 0x8d, 0x95, + 0xe2, 0x63, 0xbe, 0x31, 0x53, 0xfb, 0xd0, 0x51, 0x75, 0x4e, 0x2f, 0xdb, 0xf1, 0xb0, 0x16, 0x8b, + 0x0d, 0xf1, 0x73, 0xc4, 0x2f, 0x07, 0x8e, 0xb7, 0x76, 0x3c, 0xdc, 0x73, 0x56, 0xc5, 0x66, 0xd1, + 0x40, 0x10, 0x03, 0x17, 0x9a, 0x17, 0x4b, 0xa8, 0x80, 0xd5, 0xb1, 0x0a, 0x0e, 0x44, 0xb0, 0x67, + 0x63, 0xde, 0x98, 0xe8, 0x84, 0x29, 0xc2, 0x4b, 0xc5, 0x19, 0x9e, 0xbd, 0xa1, 0x62, 0x86, 0x8b, + 0x02, 0x1f, 0xc4, 0x98, 0xd4, 0x9a, 0xd7, 0x4c, 0x6c, 0xbc, 0x43, 0x42, 0x90, 0xfb, 0xca, 0xd8, + 0x07, 0xd3, 0x87, 0xe7, 0xd4, 0xa9, 0x83, 0xfa, 0xdb, 0x5a, 0x65, 0x51, 0x3c, 0x0e, 0x8d, 0xfa, + 0x55, 0xeb, 0x38, 0xaa, 0xa9, 0xe1, 0x24, 0xd8, 0xd9, 0xc4, 0xd6, 0xc4, 0x86, 0xac, 0x18, 0x93, + 0x69, 0x18, 0xdd, 0x2c, 0xcc, 0x4a, 0x06, 0x5e, 0x94, 0x48, 0x11, 0xd5, 0xa6, 0xee, 0x17, 0x51, + 0x14, 0x9d, 0xf4, 0x07, 0x2f, 0xc8, 0x09, 0xec, 0x96, 0x27, 0xfe, 0xc9, 0xc0, 0x87, 0x34, 0xe4, + 0xfa, 0x27, 0x2f, 0xeb, 0x7c, 0xec, 0x35, 0xa0, 0x80, 0x6b, 0x3c, 0xf0, 0x5e, 0xad, 0xef, 0x4e, + 0x5e, 0x81, 0xc5, 0x0a, 0x81, 0x24, 0x60, 0xb1, 0xd8, 0xe9, 0x1e, 0x9d, 0xdb, 0xf7, 0xae, 0xbf, + 0xe7, 0xcc, 0xb1, 0x56, 0xcb, 0x40, 0xbd, 0xf3, 0xad, 0x66, 0x57, 0xfa, 0x97, 0xbd, 0x9e, 0xef, + 0xbf, 0xf0, 0xca, 0x19, 0xbb, 0xaf, 0xc7, 0xa7, 0xbc, 0xd4, 0xc8, 0x03, 0xbb, 0x2c, 0x54, 0x1e, + 0xd9, 0xe3, 0x11, 0x7e, 0xc0, 0x23, 0x9e, 0x4e, 0x4e, 0x74, 0xb2, 0xf6, 0x02, 0x48, 0x28, 0xe8, + 0xc4, 0x23, 0x11, 0x2e, 0xc8, 0x1c, 0x34, 0x07, 0x3b, 0xcd, 0xa9, 0x26, 0xdb, 0x52, 0x0d, 0x0e, + 0x4e, 0x7d, 0x62, 0x94, 0xe6, 0xc0, 0xdd, 0x20, 0x24, 0x2a, 0xe0, 0xbb, 0x0e, 0xf9, 0x4c, 0xc5, + 0x55, 0xd6, 0x87, 0xcd, 0xc2, 0x3d, 0x4d, 0x56, 0xe6, 0x98, 0x5b, 0xd1, 0xe4, 0x2e, 0x48, 0xe9, + 0x1d, 0xb9, 0x0f, 0x52, 0x7a, 0x0f, 0xfa, 0x4a, 0x43, 0x63, 0xb9, 0x6f, 0x68, 0x2c, 0xa9, 0xb6, + 0xea, 0x86, 0xae, 0xbc, 0x46, 0xba, 0xf6, 0x1a, 0xe9, 0xda, 0x6b, 0x54, 0xea, 0x2a, 0x10, 0xdc, + 0xe8, 0x28, 0x9b, 0xc8, 0x3d, 0x7d, 0x27, 0xaa, 0xf5, 0x1d, 0xb0, 0xd1, 0x1f, 0xd6, 0x77, 0x64, + 0xad, 0xef, 0x84, 0x47, 0x7d, 0xad, 0x63, 0xb7, 0x01, 0xcd, 0xe7, 0x7b, 0xf2, 0x52, 0xd2, 0x65, + 0xc6, 0x3b, 0x1e, 0x78, 0x97, 0x5e, 0x90, 0x81, 0x6f, 0x04, 0x25, 0xa9, 0x77, 0x71, 0x9f, 0x98, + 0xff, 0x6a, 0xc9, 0x6e, 0x45, 0xee, 0x64, 0x52, 0x20, 0xdf, 0xdc, 0xe5, 0x65, 0xf1, 0x81, 0xf7, + 0xc5, 0x71, 0xd6, 0x31, 0x35, 0xca, 0xba, 0xd4, 0x1e, 0x3c, 0x4f, 0x50, 0xe5, 0x71, 0x8d, 0x55, + 0xb7, 0x62, 0x06, 0xbb, 0xb7, 0x32, 0x67, 0x23, 0x11, 0x04, 0xf6, 0x55, 0xce, 0x6a, 0xf0, 0x4c, + 0x77, 0x12, 0x1b, 0x48, 0xd9, 0x4e, 0xc1, 0x3f, 0xdd, 0x41, 0x51, 0x37, 0xb1, 0xf1, 0x94, 0xed, + 0x08, 0x5b, 0xa9, 0x81, 0x8b, 0x7f, 0x5f, 0xd8, 0x8b, 0x39, 0x82, 0x70, 0x85, 0x4a, 0xec, 0x87, + 0xda, 0xca, 0x21, 0x32, 0x2f, 0xaf, 0x80, 0x31, 0x35, 0x32, 0xb1, 0xe9, 0x96, 0xc6, 0x8c, 0xef, + 0x0a, 0x29, 0x1c, 0xa0, 0x74, 0x5f, 0x40, 0x45, 0x26, 0x2e, 0x22, 0x72, 0x00, 0xf0, 0xa1, 0x78, + 0x72, 0x11, 0x5e, 0xe6, 0xb9, 0x8b, 0x56, 0xeb, 0x49, 0x00, 0x20, 0x0a, 0xff, 0x13, 0x02, 0xee, + 0x6b, 0x70, 0xd6, 0x3d, 0xc4, 0xf9, 0xc7, 0x25, 0x59, 0xd6, 0xb4, 0xd4, 0x2a, 0xb1, 0xf7, 0xb8, + 0xac, 0x79, 0x46, 0x37, 0xcf, 0x92, 0x1f, 0x49, 0xc9, 0xf0, 0x64, 0xfb, 0x90, 0x1c, 0xd1, 0xc9, + 0xc9, 0x34, 0xd1, 0x3a, 0x59, 0x79, 0x24, 0x84, 0x33, 0x71, 0xab, 0xb1, 0xed, 0xd5, 0x70, 0xf2, + 0x23, 0x1c, 0xfb, 0x13, 0x60, 0x6a, 0x4c, 0x62, 0xb0, 0x58, 0x34, 0xdc, 0xca, 0x3f, 0x24, 0x6a, + 0x7d, 0xca, 0x58, 0x54, 0xe0, 0x87, 0x68, 0x7e, 0x5f, 0xee, 0xf4, 0x9c, 0xdc, 0x71, 0x46, 0x7b, + 0x69, 0x11, 0x55, 0x47, 0x9e, 0xff, 0xae, 0x20, 0x9a, 0x8f, 0x1d, 0xc4, 0x89, 0x91, 0x48, 0x8d, + 0xcf, 0xfb, 0xe2, 0x31, 0xf9, 0x17, 0x35, 0xc7, 0x11, 0xed, 0x8d, 0xc3, 0x4a, 0x9e, 0x37, 0x8d, + 0xd1, 0xe4, 0xf9, 0xbf, 0x39, 0xba, 0x68, 0x77, 0x74, 0x51, 0x63, 0x74, 0x80, 0xe3, 0xe9, 0xee, + 0xe3, 0x93, 0x6c, 0xdb, 0x34, 0x3b, 0xcb, 0xa3, 0x4a, 0x15, 0xbc, 0x32, 0xfd, 0x19, 0x07, 0x9b, + 0xed, 0x68, 0xeb, 0xca, 0x8a, 0x82, 0xac, 0xf7, 0x40, 0x1c, 0x92, 0x52, 0xe3, 0x90, 0x37, 0xf0, + 0xa6, 0xb0, 0xda, 0xb5, 0x96, 0x50, 0x45, 0x14, 0xee, 0x2a, 0x40, 0x41, 0xbf, 0xef, 0xfb, 0x64, + 0x57, 0xe7, 0x09, 0x7a, 0x3d, 0x7e, 0x5e, 0x34, 0x5c, 0x3a, 0xb7, 0x95, 0xb0, 0x37, 0x87, 0x27, + 0x1c, 0x57, 0x82, 0xbe, 0x12, 0xe9, 0x09, 0x43, 0x7c, 0xe7, 0x0c, 0xa9, 0x94, 0xf0, 0xb8, 0x16, + 0xfc, 0x70, 0xfa, 0x69, 0xa4, 0x1c, 0xbc, 0x43, 0xf6, 0x27, 0x44, 0x68, 0x69, 0x89, 0x3e, 0x72, + 0x6e, 0x03, 0x67, 0x12, 0xbd, 0x57, 0x7e, 0xc7, 0x1c, 0xd6, 0x80, 0x02, 0x7d, 0xea, 0x63, 0xdc, + 0x46, 0x52, 0x9f, 0x99, 0xc8, 0x82, 0x94, 0x09, 0x27, 0x39, 0x13, 0x12, 0xb1, 0xdd, 0xa3, 0xa7, + 0xfd, 0x93, 0xab, 0x51, 0xb7, 0x17, 0xf4, 0x6a, 0xa1, 0xcb, 0x3b, 0xa9, 0x3d, 0xf7, 0x8b, 0x92, + 0x14, 0xc5, 0xb8, 0x0d, 0x47, 0x83, 0x59, 0x99, 0x97, 0xc2, 0x41, 0x06, 0x6e, 0x47, 0x95, 0xf0, + 0x25, 0x21, 0xfb, 0x9f, 0xd3, 0x18, 0xbc, 0x81, 0xcd, 0x3a, 0x76, 0xc4, 0x50, 0xfc, 0x0f, 0x88, + 0x79, 0x31, 0x47, 0xa7, 0xc7, 0x35, 0xfe, 0xe3, 0x98, 0xde, 0x3f, 0x4c, 0x3c, 0x51, 0x1a, 0xc1, + 0x69, 0x59, 0xd6, 0x15, 0xf8, 0x3a, 0x29, 0xb5, 0x56, 0x77, 0x7c, 0x72, 0xda, 0x1b, 0xee, 0x6d, + 0x23, 0x51, 0x63, 0x1b, 0x49, 0x8e, 0x6d, 0x23, 0xc9, 0xfe, 0x2e, 0x60, 0xa8, 0x85, 0xc5, 0xcf, + 0xde, 0x46, 0x9e, 0x02, 0xf0, 0x9f, 0xda, 0x46, 0xfe, 0x01, 0x04, 0xf4, 0x67, 0x37, 0x12, 0xf5, + 0x6f, 0x6c, 0x24, 0xa6, 0xa3, 0x37, 0xc0, 0xc5, 0x0f, 0xf4, 0x15, 0x92, 0x6d, 0xc3, 0x85, 0xa9, + 0x12, 0xb8, 0xbd, 0xf9, 0x0b, 0xf2, 0x3a, 0x88, 0x37, 0x8e, 0x6b, 0x3b, 0x57, 0x3e, 0xee, 0x78, + 0x33, 0xbe, 0xd8, 0x51, 0x9e, 0xf7, 0x4f, 0x64, 0xf7, 0xd9, 0x62, 0x5f, 0x43, 0x57, 0x7c, 0x46, + 0x4e, 0xee, 0x79, 0x1c, 0x27, 0xb7, 0xe4, 0x24, 0x16, 0x2b, 0x4e, 0x4e, 0xc2, 0xdf, 0xb3, 0x90, + 0x9c, 0x80, 0xbd, 0x43, 0x4e, 0x56, 0x21, 0xb8, 0x0b, 0x43, 0x72, 0xa2, 0xf8, 0x0c, 0x7b, 0xc1, + 0xd1, 0xd6, 0x55, 0x1d, 0xdb, 0xc4, 0x36, 0xb7, 0xa0, 0x4a, 0xc0, 0xa6, 0x75, 0xf1, 0x14, 0x4a, + 0x3e, 0x34, 0xe2, 0xaf, 0x1f, 0xc6, 0x4c, 0x73, 0xae, 0x30, 0x8e, 0x30, 0xae, 0xc7, 0x63, 0x3d, + 0x7a, 0x27, 0x51, 0x9c, 0xa4, 0x3c, 0xd5, 0xdd, 0x54, 0xcc, 0xb8, 0x35, 0x31, 0xc8, 0x89, 0x41, + 0xa8, 0x13, 0x66, 0x76, 0x28, 0x0e, 0x37, 0x3f, 0xc0, 0x52, 0x4a, 0x9e, 0xa6, 0xc6, 0x27, 0xf8, + 0xe0, 0xe0, 0xaa, 0x6a, 0xcf, 0x1d, 0x9b, 0x51, 0x38, 0x49, 0xb2, 0x86, 0x97, 0xa3, 0xef, 0x83, + 0x5e, 0x37, 0xb5, 0x4a, 0xde, 0x93, 0x58, 0xf8, 0xda, 0x88, 0x87, 0x47, 0x7a, 0xa9, 0x8c, 0x85, + 0xec, 0x89, 0xfd, 0x3e, 0xfe, 0xff, 0xbf, 0xdf, 0x47, 0xbb, 0xfb, 0x7d, 0xf4, 0xdc, 0xfd, 0x3e, + 0x6e, 0x8e, 0x23, 0xfe, 0x4f, 0xed, 0xf7, 0xd1, 0x38, 0xde, 0x1d, 0x5d, 0xbc, 0xb7, 0xdf, 0x83, + 0xec, 0xbb, 0x69, 0x1c, 0x79, 0x89, 0xfd, 0xb3, 0xcf, 0xfa, 0x00, 0x6c, 0x28, 0x8e, 0x1c, 0x83, + 0xda, 0x6d, 0x15, 0x1c, 0x7f, 0xee, 0xda, 0x5e, 0x43, 0xae, 0xf5, 0x6c, 0x9e, 0x39, 0xfa, 0x4a, + 0x59, 0x19, 0x2c, 0x6c, 0xe7, 0xf6, 0xed, 0x6e, 0xe6, 0x8c, 0xcf, 0xb9, 0x52, 0x7c, 0xb6, 0x97, + 0x2d, 0x66, 0xf0, 0xf6, 0xf1, 0x8c, 0x20, 0x38, 0xfb, 0xdb, 0x35, 0xb0, 0xca, 0xef, 0x60, 0xec, + 0x52, 0x13, 0x7c, 0xf4, 0xa0, 0xa8, 0x7a, 0xf2, 0x23, 0x9c, 0xcd, 0xac, 0x08, 0x37, 0xfb, 0x5f, + 0x79, 0x7d, 0xb5, 0x29, 0xdb, 0x7d, 0xdc, 0x78, 0x34, 0xe0, 0x50, 0x6d, 0xd1, 0x64, 0x6b, 0x3a, + 0x0a, 0xea, 0x89, 0x13, 0x37, 0x86, 0x06, 0x2a, 0x88, 0xb5, 0x88, 0x83, 0xd2, 0x7d, 0x54, 0x54, + 0xae, 0x47, 0xb1, 0x77, 0xf4, 0x2b, 0x1e, 0x3f, 0xfa, 0x15, 0xe6, 0x19, 0xd1, 0xe7, 0x1c, 0xfd, + 0x96, 0x33, 0xdb, 0x77, 0x8f, 0x57, 0x6f, 0x8b, 0x9b, 0xa8, 0x93, 0xc6, 0x18, 0xcb, 0x07, 0xd0, + 0x87, 0x4e, 0x6f, 0xe1, 0xb7, 0x27, 0x3f, 0x23, 0x5d, 0xdd, 0xa5, 0x81, 0x3a, 0xf6, 0xb0, 0xa8, + 0x71, 0x56, 0xec, 0x82, 0x14, 0x1d, 0x80, 0x74, 0x6d, 0x5e, 0x66, 0x94, 0xc4, 0x87, 0x30, 0x92, + 0x66, 0xc9, 0xe1, 0x1a, 0x34, 0xc2, 0x8a, 0x1c, 0x6f, 0x30, 0x59, 0x34, 0x51, 0x5d, 0x5f, 0x26, + 0xb6, 0x77, 0xfc, 0xb7, 0x87, 0x58, 0x2d, 0xeb, 0x57, 0x74, 0xb2, 0x12, 0x1a, 0x79, 0x76, 0x39, + 0xe0, 0xaa, 0xa8, 0x47, 0xc4, 0xde, 0x81, 0xae, 0x7b, 0x35, 0x7e, 0x0f, 0x2f, 0x3b, 0x87, 0xe2, + 0xbb, 0x73, 0xd1, 0xa4, 0x87, 0x21, 0x2c, 0x41, 0xba, 0x4b, 0xa4, 0xe8, 0xff, 0xd1, 0xbc, 0xdc, + 0x13, 0xe4, 0x8c, 0x35, 0x06, 0x55, 0x9e, 0x73, 0x3f, 0x46, 0xa5, 0xbc, 0x81, 0x02, 0xe5, 0xe2, + 0x1c, 0xe4, 0x1e, 0x12, 0x76, 0x9b, 0x1e, 0x3e, 0x41, 0x61, 0x5a, 0x37, 0x91, 0x01, 0xd7, 0x75, + 0x9f, 0x9a, 0x40, 0x63, 0xfc, 0xc5, 0x91, 0xb1, 0x54, 0x7d, 0x7a, 0x0d, 0xfc, 0x1d, 0x8e, 0xeb, + 0xb5, 0x15, 0x1c, 0x0f, 0xbd, 0xf1, 0x31, 0xdc, 0xa3, 0x5e, 0xff, 0xa9, 0xd5, 0x68, 0xac, 0x45, + 0xb9, 0x7e, 0xc5, 0xa1, 0x8c, 0x7a, 0xac, 0xa1, 0x78, 0x86, 0x88, 0x90, 0x0f, 0x4c, 0x38, 0x8e, + 0x9b, 0xb3, 0x4d, 0xf7, 0xa6, 0x9b, 0xc8, 0x07, 0xe7, 0x59, 0x06, 0x10, 0x58, 0x21, 0x39, 0x3c, + 0x78, 0x21, 0x78, 0xa4, 0x83, 0xb1, 0x7e, 0x40, 0xb4, 0x21, 0x35, 0xd6, 0x93, 0x3c, 0x37, 0x3f, + 0xf0, 0x12, 0x23, 0xae, 0x5e, 0x23, 0x11, 0x7b, 0x02, 0x75, 0xac, 0x27, 0xe6, 0x69, 0xe6, 0x83, + 0xdc, 0xa3, 0x70, 0xa5, 0x7b, 0xa9, 0xc5, 0xc6, 0x4f, 0xe0, 0xe2, 0x28, 0x3c, 0xe8, 0xb0, 0xd8, + 0x9f, 0xe7, 0x7c, 0xde, 0x9c, 0x68, 0x1d, 0x83, 0x07, 0x0b, 0xfa, 0xa7, 0xa6, 0x66, 0xb9, 0x54, + 0x39, 0xb4, 0x8c, 0xf5, 0xc4, 0xfe, 0x29, 0x88, 0x52, 0xec, 0x54, 0x4f, 0x28, 0x08, 0x4c, 0x7a, + 0x07, 0xc3, 0x80, 0xc5, 0x39, 0x7e, 0x5d, 0xb2, 0x0c, 0xe4, 0x30, 0x0f, 0xb8, 0xef, 0x3f, 0x80, + 0xd3, 0xed, 0x0d, 0xfd, 0x6b, 0x05, 0xcf, 0x49, 0x9b, 0xab, 0x81, 0x55, 0xf1, 0x58, 0x75, 0x7a, + 0x93, 0x32, 0x62, 0x63, 0x7f, 0x07, 0x1b, 0x9e, 0x9e, 0xee, 0xbf, 0x84, 0x63, 0x9e, 0x0d, 0xe0, + 0x76, 0x69, 0xe0, 0x07, 0x14, 0x7c, 0xd4, 0x58, 0x64, 0x53, 0x32, 0x7e, 0x7c, 0xbb, 0xd2, 0xe5, + 0x12, 0x58, 0x35, 0xdb, 0x82, 0xe9, 0xed, 0xcd, 0xb3, 0x29, 0x0c, 0x1f, 0xbc, 0x1e, 0xfa, 0x7f, + 0x37, 0xd5, 0xdd, 0x65, 0x1f, 0xba, 0x6d, 0x04, 0x1b, 0x14, 0x57, 0x43, 0x04, 0x3a, 0x8a, 0x12, + 0x19, 0x85, 0x1a, 0x09, 0x8c, 0x09, 0x6a, 0xce, 0xbd, 0x26, 0x4b, 0x71, 0x28, 0x03, 0xde, 0x9b, + 0x57, 0xc7, 0xd3, 0x43, 0xb9, 0x54, 0x49, 0x1c, 0x7d, 0x20, 0xd5, 0x53, 0xf1, 0x07, 0x3f, 0xda, + 0xc0, 0x01, 0x43, 0x65, 0xe8, 0x68, 0x71, 0xd8, 0xf4, 0xc8, 0x8b, 0x03, 0xcf, 0x91, 0x27, 0xa6, + 0x25, 0x6a, 0x8a, 0x84, 0x47, 0xe4, 0xf9, 0x3e, 0xe7, 0x9b, 0x07, 0xc3, 0x0e, 0x07, 0xcc, 0xe3, + 0xf2, 0x8f, 0x57, 0xec, 0x6e, 0x69, 0xe6, 0x7d, 0x2c, 0x2b, 0x4b, 0x0e, 0x40, 0x35, 0x36, 0xe6, + 0x3d, 0x79, 0xf2, 0x4c, 0x31, 0xdd, 0xd0, 0xce, 0xca, 0x67, 0x1e, 0x8e, 0x2a, 0x6c, 0x66, 0x24, + 0xa6, 0x24, 0xb0, 0x61, 0x49, 0x9e, 0x35, 0x4b, 0x0f, 0x65, 0x5f, 0xb3, 0xf8, 0x90, 0x09, 0x8d, + 0x05, 0xbb, 0x1f, 0x53, 0x05, 0xe3, 0x35, 0xd7, 0xcd, 0x46, 0x07, 0x9d, 0xd9, 0x08, 0xa5, 0x86, + 0x20, 0x25, 0x12, 0x07, 0xbd, 0xe3, 0x75, 0xed, 0x86, 0xb7, 0x5b, 0xb5, 0xcf, 0x58, 0xf5, 0x60, + 0x53, 0xb3, 0x2e, 0x44, 0x14, 0xed, 0x56, 0xdd, 0x27, 0x8d, 0xbd, 0xd8, 0xb9, 0xea, 0xd5, 0x3f, + 0x2b, 0x30, 0x64, 0x75, 0xd0, 0x51, 0x7a, 0x14, 0x76, 0x65, 0x19, 0xbc, 0xec, 0x8d, 0x24, 0x1b, + 0x6f, 0xab, 0x57, 0x84, 0x82, 0x5b, 0x5d, 0x90, 0xc6, 0xe7, 0x5a, 0x17, 0x13, 0xc2, 0x69, 0x6d, + 0xa2, 0x45, 0xf7, 0x26, 0xb2, 0x0f, 0x18, 0x63, 0xa7, 0x1a, 0xb1, 0x2f, 0xf1, 0xa7, 0xc1, 0xb6, + 0xe9, 0x12, 0xb3, 0x87, 0x7a, 0x45, 0x81, 0xf7, 0x0d, 0x2b, 0x63, 0x54, 0x19, 0xba, 0xf8, 0x51, + 0x44, 0x37, 0x60, 0x54, 0x89, 0x59, 0x00, 0x0e, 0x83, 0x32, 0xb4, 0xa8, 0x8c, 0xae, 0xe3, 0xd4, + 0xa5, 0x8a, 0x82, 0xc8, 0x3d, 0x9b, 0xa9, 0xb1, 0x23, 0xd5, 0xef, 0x20, 0x99, 0x73, 0x12, 0x37, + 0x98, 0xda, 0x87, 0x23, 0x8e, 0xb9, 0x70, 0x14, 0xd9, 0x42, 0x2c, 0x8f, 0xfb, 0x2b, 0x1a, 0xa5, + 0x3f, 0x27, 0xdb, 0x23, 0x01, 0xab, 0x4b, 0x82, 0x5b, 0xda, 0x98, 0xa8, 0x41, 0xe6, 0x0c, 0x21, + 0x69, 0x0c, 0x11, 0x5c, 0xc6, 0x67, 0xdd, 0x3c, 0xe9, 0x3d, 0xb4, 0xfc, 0x7d, 0xee, 0xfb, 0xa5, + 0x93, 0x02, 0x92, 0x96, 0x1c, 0xed, 0x31, 0x4a, 0xa9, 0x95, 0x8f, 0x27, 0xc4, 0x45, 0x16, 0x07, + 0x97, 0x64, 0xef, 0xa0, 0x2a, 0xf0, 0x36, 0x5c, 0x69, 0x11, 0x85, 0x71, 0xe9, 0xcc, 0x7a, 0xdd, + 0x84, 0xd0, 0xf0, 0x10, 0x06, 0x3e, 0x69, 0x1a, 0x5e, 0xc1, 0x2b, 0x72, 0x68, 0x9d, 0x59, 0x4f, + 0x68, 0x65, 0x8c, 0x35, 0x3f, 0x7f, 0xdc, 0x75, 0x8f, 0x92, 0x5d, 0x8b, 0x1c, 0xec, 0xc1, 0xda, + 0xe1, 0x11, 0xb8, 0x8f, 0xc6, 0x28, 0x77, 0x43, 0xc8, 0x49, 0x7d, 0xb5, 0xc6, 0xf6, 0xb1, 0x13, + 0x68, 0xd9, 0xeb, 0x93, 0x2a, 0xfc, 0xda, 0xfe, 0x69, 0x19, 0xb2, 0xad, 0x51, 0x51, 0x52, 0x82, + 0x0b, 0xab, 0x04, 0x42, 0xb1, 0x7f, 0x0d, 0xc3, 0xda, 0x2b, 0x9e, 0xc3, 0xba, 0x47, 0x6c, 0x24, + 0xa5, 0x05, 0x60, 0x4d, 0x84, 0x95, 0x26, 0x77, 0x9a, 0x7c, 0xd6, 0xe4, 0x9d, 0x26, 0xef, 0x35, + 0x43, 0x6f, 0x9b, 0x56, 0x0b, 0x5a, 0x69, 0x76, 0xd3, 0xb4, 0x47, 0xf6, 0x48, 0xe4, 0xad, 0x26, + 0x2b, 0x8d, 0xc9, 0x5b, 0x4d, 0xdf, 0xb2, 0x95, 0x26, 0x6f, 0x75, 0xc3, 0x61, 0xfb, 0x16, 0xe2, + 0xd0, 0xdd, 0x76, 0x2f, 0x88, 0x62, 0x0f, 0xbc, 0x4a, 0x6a, 0x28, 0xbe, 0xd1, 0x8c, 0x57, 0x97, + 0x9e, 0x64, 0xf3, 0x21, 0x1d, 0x57, 0x7d, 0x24, 0xeb, 0xd7, 0x4d, 0x7f, 0xcf, 0xb8, 0xba, 0xff, + 0xc0, 0x63, 0x6e, 0x1e, 0xfa, 0x83, 0x97, 0xbd, 0x77, 0xfe, 0x96, 0x86, 0x30, 0x81, 0x9b, 0xe6, + 0xaf, 0x53, 0x58, 0x41, 0xdd, 0x78, 0xf5, 0xeb, 0x81, 0x68, 0x02, 0x92, 0x0d, 0x57, 0x54, 0xc0, + 0x3b, 0x8b, 0xc2, 0xbe, 0xf5, 0xc4, 0x99, 0xf9, 0x1b, 0x32, 0x8c, 0x25, 0xf6, 0xdd, 0xf6, 0xc0, + 0x18, 0x6e, 0x32, 0xcf, 0x25, 0x95, 0x44, 0xb3, 0x2a, 0x10, 0x15, 0x74, 0x1d, 0x92, 0xc1, 0x7e, + 0x0c, 0x7f, 0x99, 0x04, 0x1e, 0xf1, 0x96, 0x4c, 0x07, 0x10, 0x45, 0x26, 0x31, 0x24, 0x09, 0x87, + 0x3f, 0x54, 0x72, 0x47, 0x1a, 0x8f, 0x95, 0xef, 0xff, 0x15, 0x19, 0xf8, 0x6b, 0x06, 0x6a, 0x34, + 0x16, 0x93, 0x80, 0xdb, 0xae, 0x76, 0x1e, 0x51, 0x95, 0xcd, 0x47, 0x54, 0x49, 0x46, 0xc0, 0xe5, + 0x61, 0xfe, 0xf6, 0x09, 0xfc, 0x95, 0x99, 0x0c, 0x14, 0x39, 0xb4, 0x44, 0xab, 0x23, 0x4e, 0xd8, + 0xed, 0x7e, 0x24, 0x5e, 0xa9, 0x10, 0x9b, 0x1b, 0x7c, 0x70, 0x75, 0x40, 0x61, 0xe2, 0xc5, 0x49, + 0x08, 0xac, 0x04, 0x2f, 0x88, 0x36, 0x82, 0x2f, 0xc3, 0xd9, 0xbd, 0xd9, 0x74, 0x46, 0x1c, 0x35, + 0x1e, 0x95, 0x3d, 0x08, 0x1a, 0xf5, 0xbe, 0x79, 0xff, 0xce, 0x3c, 0x62, 0x2c, 0xf5, 0x0f, 0x49, + 0x38, 0x83, 0xfb, 0xf1, 0x80, 0x76, 0x87, 0x6b, 0xf4, 0x59, 0xb3, 0x3b, 0xf8, 0x3f, 0xcf, 0xb7, + 0x05, 0xa6, 0x1b, 0xae, 0x52, 0x91, 0x48, 0xe6, 0x0d, 0xe8, 0x80, 0xf6, 0x3d, 0xf2, 0x59, 0x53, + 0x6b, 0xbf, 0xfc, 0x5c, 0x25, 0xad, 0xb4, 0x63, 0xef, 0x35, 0x41, 0xef, 0x34, 0xfb, 0xac, 0x69, + 0x26, 0xf2, 0x1c, 0x99, 0x5f, 0xf3, 0x07, 0x00, 0xe8, 0x92, 0x2d, 0xc9, 0x3b, 0xa8, 0xec, 0xc4, + 0xd9, 0xd7, 0xf0, 0xb6, 0xe4, 0x02, 0x28, 0x98, 0x5a, 0xc6, 0x65, 0x53, 0xf3, 0x61, 0x8f, 0xd7, + 0xd9, 0xda, 0x7c, 0x18, 0xef, 0x14, 0xbb, 0x35, 0xe9, 0xaf, 0x93, 0x3b, 0x76, 0x0f, 0x74, 0x5f, + 0xe0, 0xe1, 0xff, 0x01, 0xdb, 0x7f, 0xac, 0xfd, 0xf1, 0x6d, 0x00, 0x00 +}; + diff --git a/wled00/wled.cpp b/wled00/wled.cpp index c27b0e75a8..a2d97b077f 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -696,56 +696,7 @@ if (multiWiFi.empty()) { // guard: handle empty WiFi list // convert the "serverDescription" into a valid DNS hostname (alphanumeric) char hostname[25]; prepareHostname(hostname); -#if defined(CONFIG_IDF_TARGET_ESP32C5) - // ESP32-C5: Prefer 5GHz WiFi 6 for better performance - DEBUG_PRINTF_P(PSTR("ESP32-C5: Trying 5GHz for SSID: %s\n"), multiWiFi[selectedWiFi].clientSSID); - - WiFi.disconnect(true); - WiFi.mode(WIFI_STA); - - // Set country code to enable all 5GHz channels - wifi_country_t country = { - .cc = "US", - .schan = 1, - .nchan = 14, - .max_tx_power = 80, - .policy = WIFI_COUNTRY_POLICY_MANUAL - }; - esp_wifi_set_country(&country); - WiFi.setBandMode(WIFI_BAND_MODE_5G_ONLY); - DEBUG_PRINTLN(F("ESP32-C5: Band mode set to 5GHz ONLY")); - - wifi_config_t wifi_config = {}; - strncpy((char*)wifi_config.sta.ssid, multiWiFi[selectedWiFi].clientSSID, sizeof(wifi_config.sta.ssid) - 1); - strncpy((char*)wifi_config.sta.password, multiWiFi[selectedWiFi].clientPass, sizeof(wifi_config.sta.password) - 1); - wifi_config.sta.scan_method = WIFI_ALL_CHANNEL_SCAN; - wifi_config.sta.sort_method = WIFI_CONNECT_AP_BY_SIGNAL; - wifi_config.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK; - esp_wifi_set_config(WIFI_IF_STA, &wifi_config); - esp_wifi_connect(); - - // Wait up to 20 seconds for 5GHz connection - DEBUG_PRINTLN(F("ESP32-C5: Waiting for 5GHz connection (20s timeout)...")); - unsigned long c5start = millis(); - while (WiFi.status() != WL_CONNECTED && millis() - c5start < 20000) { - delay(250); - if ((millis() - c5start) % 3000 < 250) { - DEBUG_PRINTF_P(PSTR(" ...%lus, status=%d\n"), (millis() - c5start) / 1000, WiFi.status()); - } - } - - if (WiFi.status() != WL_CONNECTED) { - DEBUG_PRINTLN(F("ESP32-C5: 5GHz failed, falling back to AUTO mode")); - esp_wifi_disconnect(); - WiFi.setBandMode(WIFI_BAND_MODE_AUTO); - esp_wifi_set_config(WIFI_IF_STA, &wifi_config); - esp_wifi_connect(); - } else { - DEBUG_PRINTF_P(PSTR("ESP32-C5: Connected on 5GHz, channel: %d\n"), WiFi.channel()); - } -#else WiFi.begin(multiWiFi[selectedWiFi].clientSSID, multiWiFi[selectedWiFi].clientPass); // no harm if called multiple times -#endif #ifdef ARDUINO_ARCH_ESP32 WiFi.setTxPower(wifi_power_t(txPower)); From 11f5be1861f96e92b24aac6040bbae9c8c552379 Mon Sep 17 00:00:00 2001 From: Jonny Davey Date: Sat, 7 Feb 2026 17:02:22 +0000 Subject: [PATCH 3/7] Removed Leftover file --- .claude/settings.local.json | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 .claude/settings.local.json diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index 0e384661ea..0000000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(gh pr view:*)" - ] - } -} From 35706f094036d3677348d578ef43bf0c4baf4b20 Mon Sep 17 00:00:00 2001 From: Will Tatam Date: Sat, 7 Feb 2026 17:52:08 +0000 Subject: [PATCH 4/7] Apply suggestion from @coderabbitai[bot] for WiFi band Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- wled00/json.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wled00/json.cpp b/wled00/json.cpp index 60c9c3a036..1c25433bde 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -798,7 +798,9 @@ void serializeInfo(JsonObject root) wifi_info[F("signal")] = getSignalQuality(qrssi); int wifiChannel = WiFi.channel(); wifi_info[F("channel")] = wifiChannel; - wifi_info[F("band")] = (wifiChannel >= 36) ? F("5GHz") : F("2.4GHz"); + if (wifiChannel > 0) { + wifi_info[F("band")] = (wifiChannel >= 36) ? F("5GHz") : F("2.4GHz"); + } wifi_info[F("ap")] = apActive; JsonObject fs_info = root.createNestedObject("fs"); From 5137768a8fec22d69c553614765f903234aee623 Mon Sep 17 00:00:00 2001 From: Jonny Davey Date: Sat, 7 Feb 2026 18:13:12 +0000 Subject: [PATCH 5/7] Address PR review: pin pioarduino, fix I2S1 remap, simplify arch check --- platformio.ini | 3 +- wled00/bus_wrapper.h | 2 +- wled00/idf_component.yml | 2 - wled00/idf_component.yml.orig | 2 - wled00/js_iro.h | 636 ---------------------------------- wled00/json.cpp | 5 +- wled00/ota_update.cpp | 1 + wled00/wled.cpp | 2 +- wled00/wled.h | 8 +- 9 files changed, 14 insertions(+), 647 deletions(-) delete mode 100644 wled00/idf_component.yml delete mode 100644 wled00/idf_component.yml.orig delete mode 100644 wled00/js_iro.h diff --git a/platformio.ini b/platformio.ini index 663e0b037c..9e7b612584 100644 --- a/platformio.ini +++ b/platformio.ini @@ -30,6 +30,7 @@ default_envs = ; esp32s3dev_8MB_opi ;; TODO: disabled NeoEsp32RmtMethodIsr ; esp32s3_4M_qspi ;; TODO: disabled NeoEsp32RmtMethodIsr esp32c6dev_4MB + esp32c5dev ; esp32c3dev_qio ; esp32S3_wroom2 ; usermods @@ -457,7 +458,7 @@ build_flags = ${env:esp32c6dev_8MB.build_flags} -D WLED_RELEASE_NAME=\"ESP32 [esp32c5] ;; generic definitions for all ESP32-C5 boards ;; NOTE: ESP32-C5 requires pioarduino platform (Tasmota framework doesn't include C5 Arduino libs yet) -platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip +platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.36/platform-espressif32.zip platform_packages = build_unflags = ${esp32_idf_V5.build_unflags} -D WLED_ENABLE_DMX_INPUT ;; esp_dmx library doesn't support C5 UART registers yet diff --git a/wled00/bus_wrapper.h b/wled00/bus_wrapper.h index 6beab153bf..9a687f19af 100644 --- a/wled00/bus_wrapper.h +++ b/wled00/bus_wrapper.h @@ -503,7 +503,7 @@ class PolyBus { } #endif - #if defined(ARDUINO_ARCH_ESP32) && !(defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3)) + #if defined(ARDUINO_ARCH_ESP32) && !(defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5)) // since 0.15.0-b3 I2S1 is favoured for classic ESP32 and moved to position 0 (channel 0) so we need to subtract 1 for correct RMT allocation if (!_useParallelI2S && channel > 0) channel--; // accommodate I2S1 which is used as 1st bus on classic ESP32 #endif diff --git a/wled00/idf_component.yml b/wled00/idf_component.yml deleted file mode 100644 index d752765ffb..0000000000 --- a/wled00/idf_component.yml +++ /dev/null @@ -1,2 +0,0 @@ -dependencies: - idf: '>=5.1' diff --git a/wled00/idf_component.yml.orig b/wled00/idf_component.yml.orig deleted file mode 100644 index d752765ffb..0000000000 --- a/wled00/idf_component.yml.orig +++ /dev/null @@ -1,2 +0,0 @@ -dependencies: - idf: '>=5.1' diff --git a/wled00/js_iro.h b/wled00/js_iro.h deleted file mode 100644 index 2dfc6daa6c..0000000000 --- a/wled00/js_iro.h +++ /dev/null @@ -1,636 +0,0 @@ -/* - * More web UI HTML source arrays. - * This file is auto generated, please don't make any changes manually. - * - * Instead, see https://kno.wled.ge/advanced/custom-features/#changing-web-ui - * to find out how to easily modify the web UI source! - */ - -// Autogenerated from wled00/data//iro.js, do not edit!! -const uint16_t JS_iro_length = 9964; -const uint8_t JS_iro[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xc5, 0x7d, 0x6b, 0x73, 0xe3, 0x36, - 0xb2, 0xe8, 0xf7, 0x5b, 0x75, 0xff, 0x83, 0xcd, 0x64, 0x54, 0x80, 0x04, 0xc1, 0x94, 0x6c, 0x79, - 0xc6, 0x94, 0x71, 0x54, 0xc9, 0xe4, 0x31, 0xb3, 0x9b, 0xd9, 0xc9, 0xc9, 0xcc, 0x66, 0x77, 0xa3, - 0x51, 0x52, 0x14, 0x05, 0x49, 0x18, 0x53, 0xa0, 0x02, 0x82, 0xb2, 0x1d, 0x91, 0xff, 0xfd, 0x56, - 0x03, 0xe0, 0x43, 0x0f, 0x3f, 0xb2, 0xf7, 0xec, 0xbd, 0x95, 0xd4, 0x08, 0xc4, 0xa3, 0x01, 0x34, - 0xba, 0x1b, 0xdd, 0x8d, 0x06, 0xfc, 0xbf, 0xff, 0xd7, 0xe9, 0x3c, 0x93, 0x91, 0x16, 0x89, 0x44, - 0x9a, 0x48, 0xbc, 0xf5, 0x92, 0xe9, 0x67, 0x1e, 0x69, 0x8f, 0x31, 0x7d, 0xbf, 0xe6, 0xc9, 0xfc, - 0x84, 0xdf, 0xad, 0x13, 0xa5, 0xd3, 0x56, 0xcb, 0xcb, 0xe4, 0x8c, 0xcf, 0x85, 0xe4, 0x33, 0xef, - 0xb4, 0x2c, 0x5c, 0x25, 0xb3, 0x2c, 0xe6, 0x23, 0xfb, 0x43, 0x5d, 0x55, 0x26, 0x11, 0x0e, 0xbc, - 0x12, 0x6c, 0x0d, 0xc9, 0xb6, 0x6e, 0xb5, 0xec, 0x2f, 0x0d, 0x57, 0xb3, 0x91, 0x4d, 0x22, 0x89, - 0x03, 0xa4, 0x99, 0xce, 0xf3, 0x94, 0xc7, 0x73, 0x4c, 0x85, 0x4a, 0x00, 0x46, 0x81, 0xf4, 0x52, - 0xa4, 0xa4, 0x1a, 0x1f, 0xde, 0x7a, 0x59, 0xca, 0x4f, 0x52, 0xad, 0x44, 0xa4, 0xbd, 0xe1, 0x26, - 0x54, 0x27, 0x2b, 0x92, 0x12, 0x49, 0x04, 0x49, 0xc8, 0x1d, 0xdb, 0x16, 0xe4, 0x33, 0x1b, 0x4f, - 0x88, 0x62, 0x67, 0x61, 0x24, 0x74, 0xce, 0xef, 0xd0, 0x28, 0x48, 0xf3, 0x45, 0x2e, 0xf3, 0x75, - 0xfe, 0x25, 0xce, 0xd5, 0x7a, 0x99, 0x2f, 0x94, 0x98, 0xe5, 0xc9, 0x6d, 0x9a, 0xaf, 0x64, 0x94, - 0x4b, 0x7d, 0x9b, 0x0b, 0xc9, 0xc7, 0xd1, 0x72, 0x92, 0xff, 0x91, 0x24, 0xf9, 0xaf, 0x89, 0x9a, - 0xe5, 0xbf, 0x76, 0xbb, 0x67, 0x62, 0x58, 0xf6, 0x79, 0xf2, 0xce, 0x62, 0x65, 0x9e, 0x28, 0x04, - 0xfd, 0x89, 0x13, 0x21, 0x4f, 0x24, 0xd6, 0x63, 0x31, 0x61, 0x72, 0x2c, 0x26, 0x43, 0xc5, 0x75, - 0xa6, 0xe4, 0x89, 0x2e, 0xaa, 0x16, 0xf7, 0x48, 0xe3, 0x2d, 0xd4, 0x95, 0x4c, 0xd3, 0x75, 0xa8, - 0xb8, 0xd4, 0x7f, 0x4b, 0x66, 0x7c, 0x28, 0x5b, 0x2d, 0x49, 0x15, 0x5f, 0x25, 0x1b, 0xfe, 0x7a, - 0x29, 0xe2, 0x19, 0xd2, 0xb8, 0x6e, 0xb4, 0x84, 0x6e, 0x88, 0xb0, 0x0d, 0x15, 0xe1, 0x24, 0x23, - 0x09, 0x89, 0x59, 0xa8, 0x16, 0xd9, 0x8a, 0x4b, 0x9d, 0x0e, 0xc5, 0x1c, 0x49, 0xf6, 0x0e, 0x6d, - 0x0b, 0x22, 0x31, 0x39, 0xbf, 0xae, 0x0a, 0x68, 0xcc, 0xe5, 0x42, 0x2f, 0x31, 0x0c, 0x50, 0xb0, - 0xb1, 0x80, 0xe9, 0x9f, 0x0f, 0xd5, 0x41, 0x85, 0xa1, 0xea, 0x74, 0xb0, 0xa0, 0xeb, 0x2c, 0x5d, - 0xa2, 0x78, 0xac, 0x26, 0xd8, 0x40, 0xcc, 0xe2, 0xf8, 0x94, 0x89, 0x56, 0x0b, 0x49, 0x1a, 0xc1, - 0x98, 0x14, 0x97, 0x4c, 0x60, 0x62, 0xf3, 0x75, 0xab, 0xe5, 0x12, 0x74, 0xc6, 0xe7, 0x61, 0x16, - 0xeb, 0x1f, 0x55, 0xb2, 0x4e, 0x4d, 0x57, 0x1c, 0xf0, 0xb0, 0x97, 0xbf, 0x49, 0xc4, 0xec, 0xc4, - 0x67, 0x8c, 0xc9, 0x31, 0x9f, 0x00, 0xcc, 0x31, 0x9f, 0xec, 0xb5, 0x1d, 0xf3, 0x09, 0x2e, 0x51, - 0x96, 0x30, 0x49, 0x6f, 0xf8, 0xbd, 0xeb, 0x0c, 0x65, 0x0c, 0xb0, 0x33, 0xc7, 0x40, 0x1e, 0x31, - 0xd7, 0xfc, 0xc4, 0x7c, 0xba, 0xd2, 0xa4, 0x91, 0x0b, 0x6d, 0x22, 0x83, 0xae, 0x84, 0x64, 0x0d, - 0x14, 0xda, 0x3c, 0x41, 0x94, 0x45, 0x22, 0x67, 0x5b, 0x20, 0xbb, 0x40, 0x93, 0x35, 0xf4, 0x1c, - 0x48, 0x72, 0xc3, 0xef, 0x03, 0x41, 0x14, 0x9f, 0x07, 0x8a, 0xc8, 0x00, 0x00, 0x13, 0x61, 0x7f, - 0x78, 0xe0, 0x93, 0xc4, 0x26, 0x63, 0xfb, 0x13, 0xb9, 0x9f, 0x44, 0xa6, 0x5a, 0x65, 0x91, 0x4e, - 0x54, 0x60, 0xa7, 0x57, 0x94, 0xc3, 0x5f, 0xd1, 0x8d, 0x4c, 0x66, 0xbc, 0xd5, 0x72, 0x09, 0xc4, - 0x31, 0xe1, 0xf5, 0x68, 0xde, 0x03, 0x15, 0x94, 0xc4, 0x51, 0x21, 0xb7, 0x2e, 0x7f, 0x6b, 0xe9, - 0x0a, 0x08, 0x9c, 0x9a, 0x01, 0x32, 0x4d, 0xcc, 0x47, 0x94, 0x48, 0xcd, 0xef, 0x34, 0x6b, 0xd4, - 0xbd, 0xb5, 0x75, 0xdd, 0x82, 0x31, 0x26, 0x71, 0x05, 0x58, 0x8c, 0x6e, 0x91, 0xa6, 0x82, 0x68, - 0x2a, 0xa8, 0xa4, 0x42, 0xce, 0xf8, 0xdd, 0xfb, 0x39, 0xd2, 0xb8, 0xd3, 0xc3, 0x66, 0x06, 0xc3, - 0x8a, 0x70, 0x87, 0xf2, 0x5a, 0x53, 0x59, 0x52, 0x83, 0x04, 0x6a, 0x28, 0x09, 0x00, 0x09, 0xa6, - 0xa9, 0x1c, 0xcb, 0x09, 0x2e, 0x57, 0x5c, 0xd0, 0xa4, 0xec, 0x43, 0xd0, 0xc4, 0x4d, 0xf9, 0x08, - 0x47, 0x6b, 0x0a, 0x09, 0x18, 0x83, 0xed, 0xae, 0x1e, 0x73, 0x58, 0x71, 0x01, 0x11, 0x35, 0xa9, - 0x01, 0x93, 0x53, 0x81, 0x6b, 0xc2, 0x8a, 0x2c, 0x6b, 0x69, 0x9a, 0xc0, 0x07, 0x9d, 0x86, 0x29, - 0x67, 0x06, 0xf3, 0x92, 0xf9, 0x7f, 0x7a, 0xc4, 0xdb, 0x1d, 0x30, 0x30, 0xf0, 0xa9, 0xe2, 0xe1, - 0x4d, 0xe1, 0x66, 0x02, 0x43, 0x2a, 0xea, 0x11, 0x72, 0x18, 0x21, 0x3a, 0xd5, 0x74, 0xde, 0x6a, - 0x21, 0x4d, 0xe7, 0xec, 0xd4, 0xc7, 0xad, 0x56, 0x8f, 0x31, 0x96, 0x5a, 0x36, 0xd1, 0x38, 0xcf, - 0xc5, 0x29, 0x63, 0x2b, 0x3a, 0xe3, 0xd3, 0x24, 0x93, 0x11, 0xff, 0x89, 0xcb, 0x19, 0x57, 0x42, - 0x2e, 0x70, 0xab, 0x85, 0xc4, 0xb1, 0x02, 0x82, 0x8e, 0x64, 0xe6, 0xb9, 0xc4, 0x28, 0xc3, 0x0d, - 0x5a, 0xcd, 0x90, 0x45, 0x8e, 0xa3, 0xd8, 0x92, 0xdf, 0xcd, 0x6a, 0xa5, 0x34, 0x4d, 0x94, 0x46, - 0xbb, 0x52, 0xd9, 0x4d, 0x41, 0xd2, 0x19, 0xe5, 0x5d, 0x0d, 0xff, 0x16, 0x78, 0xa8, 0x61, 0xa4, - 0xc9, 0x1a, 0xe1, 0x21, 0xb6, 0xb3, 0x50, 0x4c, 0x30, 0x4b, 0xa6, 0x24, 0x63, 0x88, 0x33, 0x24, - 0x99, 0xc6, 0x74, 0x86, 0x69, 0x42, 0x80, 0xdb, 0xd6, 0x24, 0x66, 0x92, 0x66, 0x44, 0xd2, 0x8c, - 0x9d, 0xf6, 0x48, 0x62, 0x26, 0x61, 0x04, 0xe6, 0x0d, 0x4a, 0x08, 0x27, 0x46, 0xbc, 0x70, 0x4c, - 0x24, 0xbd, 0x25, 0x16, 0xcc, 0x29, 0x63, 0x09, 0x4d, 0x6e, 0x25, 0x57, 0x1f, 0x7e, 0xfe, 0xfe, - 0xdb, 0x98, 0x83, 0x44, 0x21, 0x96, 0x73, 0x48, 0x4c, 0x2c, 0x35, 0x66, 0xa3, 0x5b, 0xc4, 0x71, - 0x90, 0x61, 0x32, 0x43, 0x02, 0x9a, 0xab, 0x53, 0x96, 0xb5, 0x5a, 0x21, 0xe2, 0xb8, 0x39, 0xe5, - 0x0f, 0x08, 0xa6, 0xaa, 0xeb, 0xc9, 0x92, 0xd4, 0xe2, 0x20, 0x22, 0x21, 0x99, 0x93, 0x25, 0xd9, - 0x90, 0x19, 0x59, 0x90, 0x29, 0x88, 0x1d, 0x4d, 0x65, 0x9e, 0x7f, 0x26, 0x6b, 0x36, 0x2d, 0x57, - 0x5f, 0xcc, 0x51, 0xcc, 0xd8, 0x5d, 0xab, 0x85, 0x62, 0x66, 0x17, 0x3c, 0x1b, 0x65, 0x63, 0x7f, - 0x12, 0xac, 0x81, 0xf8, 0x88, 0x6f, 0xc9, 0x0f, 0x93, 0x88, 0xf9, 0x44, 0x50, 0xc9, 0xbe, 0x42, - 0x82, 0xca, 0x7a, 0xe7, 0xd0, 0x15, 0xf7, 0x9c, 0x32, 0x9b, 0xd6, 0x54, 0x30, 0x60, 0x1b, 0xa0, - 0x13, 0xde, 0xe9, 0xb9, 0xb9, 0x30, 0x34, 0x67, 0xd3, 0x71, 0x34, 0xc1, 0x79, 0x3e, 0x87, 0x61, - 0xdc, 0xf0, 0x7b, 0xc6, 0xe6, 0xf0, 0x03, 0x5f, 0x40, 0xeb, 0x0c, 0xbe, 0x21, 0x81, 0xa1, 0x9e, - 0xc3, 0xf6, 0x90, 0xc7, 0x29, 0x3f, 0x81, 0xc5, 0x0b, 0x99, 0x3f, 0x0c, 0xaf, 0xd7, 0xc3, 0xb0, - 0xd3, 0x31, 0xdd, 0x18, 0x78, 0x21, 0x90, 0xe9, 0xe3, 0xc0, 0xb6, 0x50, 0xab, 0x84, 0x66, 0xa9, - 0x76, 0x6e, 0x26, 0x5a, 0x88, 0x39, 0x5a, 0xb2, 0x1b, 0x24, 0x89, 0x26, 0x73, 0x36, 0xcf, 0xf3, - 0xbb, 0x0a, 0x83, 0x56, 0x5e, 0x91, 0x14, 0x13, 0x14, 0x32, 0xed, 0x84, 0xe7, 0x1c, 0x7e, 0x4f, - 0x59, 0xd8, 0x6a, 0xa1, 0x05, 0x5b, 0xe4, 0xf9, 0x78, 0x82, 0x2d, 0x35, 0x87, 0x44, 0xd3, 0x28, - 0xcf, 0x97, 0x44, 0x97, 0xf2, 0x7d, 0xd9, 0x10, 0x29, 0xb3, 0x56, 0x0b, 0xcd, 0xd8, 0xb2, 0x12, - 0xfd, 0x34, 0xc6, 0x4b, 0xf8, 0x97, 0x68, 0x6a, 0x11, 0x6e, 0xa7, 0x28, 0xe6, 0x28, 0x63, 0x30, - 0x8a, 0xe5, 0x29, 0x8b, 0xf3, 0xdc, 0xb6, 0x5d, 0x36, 0x76, 0x39, 0xbc, 0xd5, 0x41, 0x05, 0x34, - 0xce, 0xf3, 0xb8, 0x51, 0x76, 0x0a, 0x92, 0x4b, 0xd2, 0x70, 0xbd, 0xe6, 0x72, 0x66, 0xb7, 0xc0, - 0x25, 0x36, 0x70, 0xed, 0xf6, 0xca, 0x62, 0x02, 0xe8, 0x43, 0x1b, 0xb6, 0xa1, 0x92, 0xdf, 0xe9, - 0x0f, 0x62, 0x1a, 0x5b, 0x5e, 0xb3, 0x18, 0x65, 0x7d, 0x10, 0x00, 0x1b, 0xc6, 0x96, 0xd8, 0x60, - 0xe8, 0x44, 0x0f, 0x41, 0xe4, 0xa5, 0x5c, 0xe9, 0xaf, 0xf9, 0x3c, 0x51, 0x1c, 0x2d, 0x49, 0x8c, - 0x0b, 0x2f, 0x59, 0x3b, 0x21, 0x25, 0x0c, 0x6e, 0xcd, 0xee, 0xb6, 0x09, 0xe3, 0x8c, 0x33, 0xcf, - 0xc3, 0x45, 0xcc, 0x96, 0x4d, 0xe8, 0xe4, 0x88, 0x54, 0xab, 0xda, 0x09, 0x1a, 0xb3, 0x25, 0x2e, - 0x4a, 0x01, 0x12, 0x75, 0x3a, 0x44, 0x17, 0x98, 0x08, 0x9a, 0xb0, 0x99, 0xc3, 0x54, 0xd6, 0x6a, - 0xd5, 0x10, 0x4e, 0x77, 0x21, 0x98, 0x9d, 0x32, 0x62, 0x59, 0x49, 0xc4, 0x51, 0xb7, 0x3b, 0xc4, - 0xae, 0xd9, 0x38, 0x9a, 0xb4, 0x5a, 0xf7, 0x08, 0x7e, 0xf1, 0xd0, 0xd6, 0x5b, 0x37, 0x2b, 0x4c, - 0x4d, 0x85, 0xbf, 0x21, 0xf8, 0x25, 0x86, 0x24, 0x81, 0x07, 0x16, 0x0e, 0xa4, 0x3f, 0x8c, 0xae, - 0x17, 0x15, 0xd8, 0x4e, 0x07, 0x7f, 0x8b, 0x16, 0x50, 0x71, 0x31, 0xee, 0x74, 0xaa, 0x9f, 0x06, - 0xf3, 0x7d, 0x55, 0xaa, 0x17, 0xd5, 0xda, 0x08, 0xc7, 0xfc, 0xd8, 0x51, 0xbe, 0xce, 0x73, 0x6f, - 0x9a, 0x24, 0x31, 0x0f, 0x9b, 0xe2, 0x1d, 0xcb, 0x56, 0xcb, 0x29, 0x0d, 0xd2, 0x34, 0xc4, 0xb8, - 0x22, 0x84, 0xaf, 0x94, 0x0a, 0xef, 0xa9, 0x48, 0xcd, 0x2f, 0xd2, 0x18, 0x97, 0x5b, 0x8d, 0x62, - 0xfe, 0x50, 0x5d, 0xeb, 0xa6, 0xe2, 0xf1, 0x15, 0xd2, 0x63, 0x35, 0x31, 0x43, 0x70, 0xed, 0x1d, - 0xd0, 0x91, 0x44, 0x47, 0x98, 0xf4, 0xc1, 0xe1, 0x94, 0x62, 0x10, 0x08, 0x52, 0xcc, 0x91, 0x07, - 0xaa, 0xa0, 0x5c, 0x34, 0x6a, 0xe4, 0xb9, 0x27, 0xb3, 0xd5, 0x94, 0xab, 0x23, 0xad, 0x22, 0x03, - 0x9b, 0x38, 0x01, 0x66, 0x66, 0x33, 0xac, 0x3b, 0xa4, 0x89, 0xdd, 0x4a, 0x98, 0xd9, 0x95, 0xca, - 0x0d, 0x76, 0x68, 0x15, 0xb9, 0x08, 0x59, 0x86, 0x25, 0xda, 0x6e, 0xd6, 0x44, 0x57, 0xaa, 0x4b, - 0xa5, 0xcf, 0x48, 0xb3, 0xf9, 0x24, 0x44, 0x16, 0x80, 0x8c, 0x40, 0x57, 0x05, 0xa2, 0x5e, 0x87, - 0x79, 0xb9, 0x0e, 0x5e, 0xd7, 0x33, 0x8a, 0x92, 0x3f, 0x19, 0x69, 0x9a, 0x72, 0xa3, 0x1d, 0x71, - 0xa5, 0xef, 0x41, 0x48, 0xe2, 0x40, 0x8f, 0xe5, 0x84, 0x1d, 0x4c, 0x44, 0xb4, 0x5a, 0xa7, 0xb0, - 0x3d, 0x29, 0xaa, 0x79, 0xaa, 0x91, 0xc4, 0x23, 0xd1, 0xf1, 0xd6, 0x77, 0x5e, 0xe0, 0x56, 0x74, - 0xe4, 0x79, 0x41, 0xa3, 0xaf, 0x9f, 0x50, 0xb5, 0xbb, 0x58, 0x41, 0xeb, 0xa4, 0x2e, 0x89, 0x0c, - 0xea, 0x6e, 0xf8, 0x3d, 0x0c, 0x01, 0x49, 0xc6, 0x47, 0x5e, 0x14, 0x87, 0x69, 0xfa, 0xb7, 0x70, - 0xc5, 0xcd, 0xa8, 0xdc, 0xb7, 0x17, 0xc8, 0xc0, 0xa5, 0x1a, 0xb9, 0xa6, 0x56, 0x20, 0x71, 0x9e, - 0x7b, 0xa5, 0x56, 0x63, 0x8a, 0x6b, 0xc2, 0xf0, 0x52, 0x7d, 0x1f, 0x5b, 0x48, 0xd8, 0x08, 0x0c, - 0x4d, 0x4d, 0x0e, 0x39, 0x58, 0x2e, 0x81, 0x33, 0x1a, 0xa5, 0xe9, 0x47, 0xd0, 0x77, 0x84, 0x95, - 0x04, 0xc7, 0x56, 0x55, 0xb5, 0x5a, 0xa8, 0xae, 0xe8, 0x79, 0x44, 0x31, 0x2b, 0xed, 0x95, 0xa1, - 0xb9, 0x04, 0x74, 0x51, 0x85, 0x45, 0xab, 0x65, 0x52, 0x22, 0xcf, 0xe7, 0x08, 0xe6, 0xea, 0x79, - 0x66, 0x7d, 0x85, 0xa9, 0x14, 0x9b, 0x22, 0xac, 0x5a, 0x2d, 0x31, 0x8e, 0x27, 0x80, 0xc5, 0x71, - 0x3c, 0xb1, 0x35, 0x63, 0x02, 0x59, 0xb8, 0x80, 0xfe, 0xbd, 0xa4, 0x5c, 0x97, 0x56, 0xcb, 0xb3, - 0x13, 0x1b, 0xf7, 0x26, 0x23, 0x94, 0x32, 0x79, 0x6a, 0x90, 0x05, 0x5a, 0xe9, 0x3a, 0x0e, 0x23, - 0x8e, 0xce, 0x5e, 0x87, 0x6b, 0x9d, 0x29, 0xfe, 0xe5, 0x19, 0xf4, 0x84, 0x89, 0x64, 0x08, 0x45, - 0x4c, 0x52, 0x9d, 0xfc, 0x90, 0xdc, 0x72, 0xf5, 0x3a, 0x4c, 0x39, 0xc2, 0x18, 0xd4, 0xe4, 0x51, - 0x14, 0x48, 0x4c, 0xd3, 0x58, 0x44, 0x1c, 0xf5, 0x31, 0x11, 0x23, 0xa4, 0xf2, 0x5c, 0xd3, 0x70, - 0x36, 0xfb, 0x76, 0xc3, 0xa5, 0xfe, 0x41, 0xa4, 0x9a, 0x4b, 0xae, 0x90, 0x24, 0x1b, 0x23, 0xcd, - 0x35, 0xd5, 0x79, 0x0e, 0xff, 0xb2, 0x6d, 0x81, 0x31, 0xd0, 0x02, 0xd0, 0x84, 0xb3, 0x1d, 0x8e, - 0x35, 0xc1, 0x81, 0x17, 0x8b, 0x54, 0x7b, 0x20, 0x61, 0x5b, 0x2d, 0x4f, 0x87, 0x0b, 0xb3, 0x4a, - 0xee, 0x73, 0x9e, 0xa8, 0x95, 0x4b, 0x9f, 0xf2, 0x56, 0x4b, 0x1a, 0xd5, 0x7d, 0x64, 0x68, 0xac, - 0x49, 0x39, 0xc1, 0x31, 0x39, 0xd6, 0x6a, 0x79, 0xb3, 0x50, 0x2e, 0xb8, 0x4a, 0xb2, 0x34, 0xbe, - 0xff, 0xc0, 0xf5, 0x5b, 0x29, 0xb9, 0x7a, 0xf3, 0xf1, 0xdd, 0x0f, 0x0e, 0x22, 0x3a, 0xc4, 0xcb, - 0xaf, 0x77, 0xb1, 0x90, 0x37, 0xc1, 0xc8, 0xe2, 0x65, 0xe4, 0xfa, 0xc8, 0x73, 0x43, 0xbc, 0x62, - 0x54, 0x4e, 0xe4, 0x2b, 0xad, 0x95, 0x98, 0x66, 0x9a, 0xff, 0xed, 0x03, 0xf2, 0x96, 0x5a, 0xaf, - 0x83, 0xb3, 0xb3, 0xdb, 0xdb, 0x5b, 0x7a, 0x7b, 0x4e, 0x13, 0xb5, 0x38, 0xeb, 0x5d, 0x5d, 0x5d, - 0x9d, 0x19, 0x48, 0x1e, 0xd9, 0x47, 0x6a, 0x60, 0x78, 0xe6, 0xdf, 0x07, 0x00, 0x3c, 0xf6, 0xe4, - 0xb0, 0xc0, 0x28, 0xdd, 0xed, 0xc7, 0x30, 0x67, 0x43, 0xaa, 0x6e, 0x9a, 0x3a, 0x3e, 0xe8, 0xee, - 0x7a, 0x6c, 0xc5, 0xc4, 0x04, 0xad, 0x28, 0x87, 0x75, 0x1a, 0xb9, 0x5f, 0xd0, 0x8f, 0x9b, 0xe6, - 0xde, 0x0d, 0xda, 0xd3, 0xfc, 0x80, 0x2d, 0x2d, 0x97, 0xee, 0x28, 0x43, 0x64, 0x4d, 0xee, 0xc9, - 0x2d, 0xb9, 0x01, 0xb2, 0xba, 0x5f, 0x73, 0x20, 0xe7, 0x4a, 0x31, 0x93, 0xb4, 0x61, 0x9d, 0xec, - 0x48, 0x46, 0x14, 0xb2, 0x15, 0xe5, 0xb0, 0x6f, 0x22, 0x89, 0x87, 0x5a, 0xdd, 0xdb, 0x4d, 0xf9, - 0xc8, 0x4e, 0x77, 0x63, 0x44, 0xee, 0x1a, 0x74, 0x43, 0x23, 0xd6, 0xee, 0x19, 0x0a, 0xd9, 0x4d, - 0x69, 0x83, 0x7c, 0x84, 0x3d, 0xac, 0xd5, 0x52, 0xe3, 0x90, 0x46, 0x13, 0x72, 0xcb, 0xc2, 0xd1, - 0xfd, 0xe8, 0xde, 0xd6, 0xb4, 0x1b, 0x6a, 0x10, 0x52, 0x11, 0x28, 0x22, 0x68, 0x34, 0x9a, 0x82, - 0xea, 0x24, 0x69, 0xc4, 0x04, 0x8d, 0x30, 0x15, 0xa0, 0xe7, 0x04, 0xc8, 0x5b, 0xab, 0x44, 0x27, - 0xd0, 0x97, 0x27, 0xe4, 0xc9, 0x4d, 0xab, 0x75, 0x43, 0xab, 0x1c, 0xaa, 0x8c, 0x7a, 0x3c, 0x82, - 0x36, 0x73, 0x26, 0xf9, 0xed, 0xc9, 0x0d, 0x5a, 0x93, 0x5b, 0x1c, 0xa0, 0x3a, 0xe7, 0xad, 0xc9, - 0x21, 0xf3, 0xe6, 0x4c, 0xd9, 0x0d, 0x99, 0xbb, 0xb6, 0xec, 0x0f, 0x4c, 0xee, 0x5b, 0xad, 0x7b, - 0x9a, 0x66, 0x53, 0x34, 0x87, 0x7a, 0xd6, 0x92, 0x5a, 0x93, 0x39, 0x4d, 0x75, 0xa8, 0x79, 0x9e, - 0x23, 0x97, 0x02, 0x4e, 0xb2, 0x70, 0x8c, 0x71, 0x75, 0x4b, 0xe6, 0xf4, 0x96, 0x29, 0xb2, 0x64, - 0x73, 0xa3, 0xf8, 0x93, 0x39, 0x5d, 0x35, 0x36, 0xc3, 0x39, 0xfd, 0xdc, 0x6a, 0xa1, 0x39, 0xfd, - 0xcc, 0x5c, 0xf3, 0x52, 0x2f, 0xba, 0xa1, 0x0b, 0xae, 0xbf, 0xe1, 0x4a, 0x6c, 0xf8, 0xec, 0x03, - 0x14, 0x7c, 0xa7, 0x92, 0x95, 0xb1, 0x6c, 0x5b, 0xad, 0x77, 0xa6, 0x41, 0xd9, 0x62, 0x04, 0x1f, - 0x46, 0xa1, 0x9e, 0xd3, 0xcf, 0x38, 0x98, 0xd3, 0xcf, 0xe4, 0xe1, 0xc6, 0x68, 0x6d, 0x6a, 0x61, - 0xb2, 0xc4, 0x76, 0x00, 0x8f, 0xf5, 0x63, 0x47, 0x02, 0x73, 0x59, 0xad, 0x13, 0xc9, 0xa5, 0xfe, - 0x87, 0x88, 0xe3, 0x77, 0x49, 0x26, 0x35, 0x68, 0x7f, 0x87, 0xb9, 0xa8, 0x1c, 0x7c, 0xa3, 0xf0, - 0x1b, 0x31, 0x73, 0x2d, 0x12, 0xbb, 0x11, 0xcf, 0x71, 0x25, 0x7e, 0x9f, 0x37, 0x02, 0xc6, 0xe2, - 0x07, 0x86, 0xf2, 0x13, 0x8f, 0xb8, 0xd8, 0x70, 0x57, 0xf7, 0x91, 0x42, 0xbb, 0xb8, 0xa7, 0x0d, - 0x38, 0xe9, 0x32, 0xc9, 0xe2, 0xd9, 0xeb, 0xb2, 0xc1, 0xdf, 0xd7, 0xb3, 0x50, 0x73, 0xb7, 0xeb, - 0x3d, 0x50, 0x6a, 0x51, 0x47, 0x6e, 0xb1, 0x35, 0x24, 0x0f, 0x48, 0x00, 0xd6, 0x92, 0x98, 0x45, - 0xee, 0x11, 0x34, 0xa7, 0x33, 0x26, 0x31, 0x4d, 0x9c, 0x09, 0x91, 0x8e, 0xd2, 0x53, 0xd0, 0x12, - 0x93, 0x51, 0x1a, 0x08, 0xea, 0x1c, 0x00, 0x92, 0x4a, 0x06, 0xb6, 0x83, 0xd5, 0xe4, 0x65, 0x6d, - 0x80, 0x82, 0x4a, 0x2f, 0xa9, 0x1c, 0x87, 0xc6, 0xb7, 0x61, 0x12, 0x54, 0xc0, 0xbe, 0xe7, 0x94, - 0xd1, 0xe2, 0x28, 0x36, 0xca, 0x39, 0x1c, 0xcd, 0xae, 0x06, 0x5f, 0x58, 0x05, 0xd8, 0x8d, 0x9e, - 0xcc, 0x4a, 0x2a, 0xda, 0x23, 0xd9, 0x63, 0x73, 0x33, 0xcc, 0xfe, 0xce, 0x31, 0x7b, 0x39, 0x53, - 0x33, 0x51, 0x68, 0xc0, 0x34, 0x09, 0x59, 0xc9, 0x2f, 0x25, 0x76, 0xc8, 0x01, 0x74, 0x6c, 0xa6, - 0xfd, 0x95, 0xb3, 0x90, 0xc2, 0x56, 0x2b, 0x74, 0xf6, 0xc9, 0xfb, 0x72, 0xb5, 0x43, 0x50, 0x78, - 0x46, 0xa1, 0xe3, 0xfe, 0x72, 0xe7, 0x0f, 0xc2, 0x9a, 0xb8, 0x16, 0x5c, 0x1b, 0xa5, 0xfe, 0xb5, - 0x05, 0x69, 0xcc, 0xd1, 0x77, 0xc8, 0xb0, 0x80, 0x82, 0x81, 0xed, 0x95, 0x23, 0x0c, 0xf4, 0x5e, - 0xda, 0x10, 0xa6, 0xf8, 0x83, 0x0c, 0xd7, 0xe9, 0x32, 0x71, 0xda, 0xbc, 0x45, 0x51, 0x9e, 0xa3, - 0xc5, 0xc3, 0xa5, 0x68, 0x43, 0x66, 0x18, 0x93, 0x0f, 0x7b, 0xe2, 0x14, 0x84, 0x29, 0x99, 0x3b, - 0x6f, 0x02, 0x4d, 0x86, 0x80, 0x82, 0x55, 0x69, 0x2a, 0x97, 0xcc, 0x5d, 0xa1, 0x10, 0x93, 0x90, - 0x46, 0x61, 0x1c, 0x03, 0x13, 0x54, 0x03, 0xda, 0xd4, 0x23, 0x6b, 0x72, 0x4d, 0x39, 0xa8, 0x63, - 0xb9, 0xc8, 0x08, 0x6d, 0x4c, 0xa6, 0x06, 0xfc, 0x0d, 0x9b, 0x03, 0x79, 0x80, 0x9e, 0x62, 0x34, - 0x0b, 0xa3, 0x1f, 0x36, 0x8d, 0xfa, 0xa6, 0xf8, 0xb7, 0xa2, 0x3f, 0x25, 0xce, 0x16, 0x66, 0xc2, - 0x2d, 0xd4, 0xa6, 0x94, 0xcc, 0x20, 0xf9, 0x39, 0xf3, 0xd2, 0xcd, 0xc2, 0xe8, 0x24, 0x66, 0x75, - 0xf2, 0x9c, 0x97, 0xca, 0x7b, 0xc9, 0x42, 0x99, 0xd1, 0x75, 0x52, 0xe6, 0x0f, 0xd3, 0xeb, 0xca, - 0xec, 0x48, 0x77, 0x3c, 0x27, 0x11, 0xcb, 0xc6, 0x29, 0x18, 0xa4, 0x8e, 0xd1, 0x1d, 0xb0, 0xd1, - 0x39, 0x63, 0x2c, 0xa2, 0xe0, 0xc9, 0x02, 0xb1, 0x1f, 0x44, 0x34, 0x4e, 0xa2, 0x30, 0x06, 0x3d, - 0xa2, 0xaa, 0x83, 0xf1, 0x56, 0xb3, 0x88, 0x40, 0x7b, 0x6b, 0x13, 0x5a, 0x43, 0xb5, 0xd6, 0xa1, - 0x1b, 0x0a, 0x7c, 0xd9, 0xc4, 0xed, 0x4b, 0xb3, 0x24, 0x32, 0xee, 0x48, 0x1a, 0x29, 0x1e, 0x6a, - 0x0e, 0x8a, 0x1c, 0x98, 0x84, 0x68, 0x03, 0x5e, 0x0c, 0x3e, 0xda, 0x2b, 0x76, 0x9e, 0x86, 0xe3, - 0xfb, 0x7a, 0xdf, 0xf7, 0xfd, 0x33, 0x40, 0x04, 0x71, 0x5d, 0x04, 0xc7, 0x5b, 0x23, 0x57, 0x4c, - 0x32, 0x6b, 0x48, 0x37, 0x76, 0xc8, 0x7a, 0xd6, 0xcb, 0x53, 0xc6, 0x36, 0x0e, 0x17, 0xc6, 0x98, - 0x43, 0xd9, 0x38, 0x6b, 0xf8, 0xd1, 0x26, 0x4e, 0xd3, 0xd4, 0x74, 0x16, 0xea, 0x90, 0x6d, 0x70, - 0x00, 0xfa, 0x8e, 0xd8, 0x6d, 0xc1, 0x3e, 0x5b, 0xe5, 0xce, 0x52, 0x91, 0xf3, 0xf6, 0xc1, 0xf4, - 0x52, 0x8c, 0x49, 0xc8, 0x50, 0xb5, 0x9e, 0x79, 0x7e, 0x87, 0xe9, 0x03, 0xfa, 0x14, 0x99, 0xb3, - 0xcd, 0x83, 0x65, 0x31, 0xec, 0x64, 0x79, 0x1e, 0xc2, 0xb2, 0xcd, 0x5b, 0xad, 0x10, 0xe4, 0xc9, - 0x7b, 0x60, 0xca, 0xf7, 0x46, 0x51, 0x14, 0x65, 0x45, 0x36, 0x37, 0x25, 0x79, 0x6e, 0x34, 0xd2, - 0x43, 0x6a, 0x73, 0x86, 0x80, 0x31, 0x38, 0x33, 0xab, 0x11, 0x9b, 0x1f, 0x99, 0xe7, 0x60, 0x2e, - 0x64, 0xce, 0xb7, 0x33, 0xce, 0x26, 0x44, 0xe1, 0xba, 0x96, 0xc4, 0xfc, 0xa8, 0x99, 0x2b, 0xc7, - 0xd9, 0x24, 0xcf, 0x3d, 0xa3, 0x0b, 0x00, 0x5d, 0x66, 0xc6, 0x28, 0xe0, 0xd1, 0x0d, 0x9f, 0xb9, - 0x4f, 0x00, 0x65, 0x94, 0x68, 0xa8, 0xe8, 0xba, 0x00, 0xe8, 0xae, 0x8b, 0x02, 0x69, 0xb2, 0x21, - 0x4b, 0xc2, 0x49, 0x6c, 0x45, 0x90, 0xdc, 0x13, 0x30, 0x64, 0x9e, 0xe7, 0x35, 0x77, 0x83, 0x2a, - 0xcb, 0xc5, 0x42, 0xbe, 0xb7, 0x47, 0x14, 0xa7, 0xe5, 0x32, 0xb6, 0x5a, 0x96, 0x8f, 0xee, 0x00, - 0x0c, 0xe0, 0xca, 0x0d, 0x49, 0xc8, 0x93, 0x4d, 0xab, 0x55, 0x69, 0x4c, 0x1b, 0xab, 0xb5, 0xb4, - 0x5a, 0x2e, 0x71, 0x0a, 0xb6, 0x9e, 0xcb, 0x42, 0x2e, 0xe5, 0x54, 0x62, 0x57, 0x03, 0x14, 0x63, - 0x97, 0xc4, 0xa4, 0x9a, 0xda, 0x01, 0x58, 0x57, 0x00, 0x80, 0x5d, 0xd2, 0x80, 0xae, 0xb2, 0x51, - 0x95, 0xae, 0x2b, 0x83, 0xf8, 0xd3, 0x05, 0x12, 0x60, 0x31, 0x36, 0x44, 0x41, 0x84, 0xad, 0xfa, - 0x36, 0x13, 0xf3, 0x39, 0x9f, 0x39, 0xb1, 0x5e, 0x44, 0xa1, 0x8e, 0xc0, 0x21, 0xb9, 0x5d, 0xd1, - 0xc4, 0x99, 0x90, 0x45, 0x6d, 0x76, 0xd6, 0x7a, 0xe5, 0x6c, 0xef, 0xb4, 0x62, 0x08, 0x7e, 0xd2, - 0xd2, 0x45, 0xa8, 0xee, 0xb7, 0xe2, 0x50, 0x05, 0x40, 0x07, 0xd0, 0x05, 0x9d, 0xe1, 0x62, 0x45, - 0x23, 0x70, 0x6d, 0x47, 0xd0, 0x7b, 0x05, 0xfe, 0xdb, 0xd2, 0x7c, 0x05, 0x58, 0xc7, 0xdc, 0xc1, - 0x23, 0x6d, 0xb5, 0xe6, 0x28, 0x53, 0xe0, 0xf5, 0x61, 0xf2, 0x00, 0x76, 0xd3, 0x03, 0xfb, 0xb7, - 0x83, 0x43, 0x0f, 0x10, 0x73, 0x2b, 0x9a, 0xc9, 0x95, 0x55, 0x4e, 0xaa, 0x24, 0xd2, 0x98, 0x20, - 0x55, 0x39, 0xb9, 0xbe, 0x45, 0xca, 0x19, 0xf1, 0x98, 0x88, 0x3c, 0x7f, 0xd0, 0x31, 0x9d, 0xe7, - 0x48, 0xb8, 0xbd, 0x1e, 0x71, 0x30, 0xce, 0x01, 0xe7, 0xc6, 0x4c, 0x8f, 0x59, 0xe5, 0x04, 0x38, - 0x65, 0x06, 0x72, 0x84, 0x8d, 0xf4, 0x52, 0x7b, 0xfb, 0xb4, 0xed, 0xdf, 0x20, 0xef, 0x78, 0xd1, - 0x21, 0xfe, 0x24, 0x2e, 0x94, 0xdd, 0x7b, 0x14, 0x5d, 0x57, 0x4e, 0x3c, 0xe8, 0x43, 0x1a, 0xf1, - 0x9c, 0x31, 0x7f, 0x98, 0x5d, 0xab, 0x52, 0x3c, 0x67, 0x9d, 0x0e, 0x56, 0xe3, 0xcc, 0x78, 0x7b, - 0xe0, 0xd7, 0x7a, 0x49, 0xec, 0xc8, 0x38, 0xf8, 0x88, 0x78, 0x63, 0x05, 0xfe, 0x28, 0x51, 0xd6, - 0x34, 0x3b, 0x1a, 0xda, 0xb1, 0x45, 0x71, 0x55, 0x7d, 0xb1, 0x47, 0x0f, 0xcc, 0x1f, 0x8a, 0xeb, - 0x4a, 0xa3, 0x11, 0xe0, 0xa4, 0xb4, 0x1e, 0x1b, 0x7b, 0x96, 0x45, 0xb9, 0xcc, 0x56, 0x5c, 0x85, - 0xd3, 0x18, 0xc6, 0x5e, 0x7f, 0x80, 0x91, 0x44, 0x60, 0xfa, 0x72, 0x2e, 0x16, 0x99, 0x2d, 0x3f, - 0xf5, 0x49, 0xcd, 0x65, 0x60, 0xa1, 0x2b, 0x7a, 0xab, 0x84, 0x76, 0x65, 0x98, 0x58, 0x1e, 0xa5, - 0xf6, 0x80, 0xaf, 0x72, 0x6f, 0x68, 0xa2, 0x8c, 0xe7, 0x44, 0x35, 0xe9, 0x60, 0x8a, 0xca, 0xf9, - 0xa0, 0x29, 0x73, 0xed, 0xc2, 0x34, 0x15, 0x0b, 0x99, 0xe7, 0x4d, 0xef, 0x50, 0x39, 0x0d, 0x59, - 0x9f, 0x8b, 0x11, 0xc1, 0x7a, 0x43, 0x71, 0x78, 0xda, 0xb5, 0x3f, 0xb5, 0xb2, 0x29, 0xb7, 0xbe, - 0x02, 0xd7, 0x49, 0x6d, 0x8c, 0x2c, 0xc3, 0xf4, 0xfd, 0xad, 0x2c, 0x87, 0x69, 0x05, 0x39, 0xc8, - 0x4b, 0xe0, 0x5d, 0x38, 0xc6, 0x52, 0x70, 0x72, 0x55, 0x54, 0x87, 0x7d, 0x18, 0xbc, 0x98, 0xf1, - 0xbd, 0x3d, 0x9f, 0xac, 0x3a, 0xc7, 0xc5, 0x0a, 0x0e, 0x21, 0xdf, 0x36, 0xe0, 0xa6, 0x5c, 0x7f, - 0xb0, 0x7a, 0xc6, 0x8e, 0x3b, 0xdf, 0x2e, 0x86, 0x59, 0xbc, 0xcf, 0x20, 0x2a, 0x20, 0x61, 0xf4, - 0x91, 0x56, 0xcb, 0x66, 0x82, 0x58, 0x37, 0x09, 0x6b, 0x43, 0xd4, 0x15, 0x30, 0x1e, 0x1e, 0x23, - 0xf7, 0x56, 0xeb, 0x14, 0xce, 0x56, 0x90, 0x20, 0xf5, 0x89, 0x12, 0xc6, 0x79, 0xfe, 0x0e, 0x72, - 0x1a, 0x07, 0x7a, 0xa6, 0xd4, 0x48, 0x24, 0x48, 0x98, 0x63, 0x00, 0xe9, 0x72, 0x57, 0xce, 0x25, - 0x87, 0x09, 0x37, 0xa5, 0x18, 0xef, 0x4e, 0x65, 0x9e, 0xa8, 0xc8, 0xa9, 0x5d, 0xac, 0xb9, 0x2a, - 0x35, 0xc8, 0x5d, 0x40, 0x1a, 0x93, 0xb2, 0x13, 0xff, 0x01, 0x90, 0xce, 0x8c, 0x7b, 0x4f, 0x52, - 0x38, 0x86, 0x90, 0xec, 0xc8, 0xcc, 0x7e, 0x54, 0xc9, 0x4a, 0xa4, 0x7c, 0xe4, 0x7e, 0x1b, 0x8d, - 0xf5, 0x92, 0x4b, 0x3a, 0x15, 0x72, 0x86, 0xca, 0x32, 0xc5, 0xd3, 0x24, 0xde, 0x18, 0x07, 0x41, - 0xca, 0xf5, 0x47, 0xb1, 0xe2, 0x49, 0xa6, 0xc9, 0xf1, 0x73, 0x9a, 0xd5, 0x81, 0x36, 0x56, 0xd3, - 0x97, 0x1a, 0xc2, 0x46, 0x24, 0x86, 0xa0, 0x35, 0x21, 0x05, 0x56, 0x2d, 0x6e, 0xb5, 0x4e, 0x15, - 0x15, 0x56, 0x86, 0x5a, 0x21, 0x51, 0xb1, 0x5c, 0xa9, 0x7b, 0xed, 0x64, 0x1e, 0xb3, 0x9e, 0xbe, - 0x55, 0x0a, 0x0c, 0xf5, 0x8a, 0x26, 0xd0, 0xf3, 0x5a, 0x80, 0x37, 0x71, 0xcf, 0x38, 0x53, 0x3b, - 0x62, 0xfc, 0x35, 0x88, 0x1f, 0x0c, 0x9a, 0xbc, 0x90, 0x19, 0x1f, 0x1e, 0x29, 0x84, 0x83, 0x2f, - 0x47, 0xbb, 0xd0, 0xeb, 0x0d, 0x53, 0xa5, 0xd0, 0x82, 0x23, 0x48, 0x26, 0x0b, 0xbd, 0x54, 0xc9, - 0xed, 0x89, 0x2e, 0x48, 0xc2, 0xee, 0x8c, 0xcb, 0x53, 0x33, 0x0f, 0x8d, 0x82, 0x71, 0xf7, 0xd3, - 0xa7, 0xce, 0x64, 0xf4, 0xe9, 0xd3, 0xac, 0xfd, 0xe9, 0x13, 0xfd, 0xf4, 0x69, 0xd6, 0x79, 0x31, - 0xc2, 0xf9, 0x4e, 0x01, 0xe4, 0x78, 0x24, 0x66, 0xde, 0xf8, 0xd3, 0xa7, 0x34, 0xff, 0xf4, 0x09, - 0x4d, 0x3a, 0xc8, 0xeb, 0xe8, 0x8e, 0x87, 0xc7, 0x24, 0xff, 0xf4, 0x29, 0x7d, 0xe8, 0xf3, 0xd3, - 0xa7, 0xb4, 0xfd, 0xe9, 0x13, 0x1e, 0x79, 0x64, 0xfd, 0xa7, 0xdb, 0x3e, 0x08, 0xea, 0x37, 0xe3, - 0x35, 0xf8, 0x89, 0x2f, 0xbe, 0xbd, 0x5b, 0x23, 0x4f, 0x2d, 0xa6, 0x5e, 0x27, 0xc6, 0xe4, 0xcd, - 0x7e, 0x6e, 0xe8, 0x75, 0xd6, 0x98, 0xfc, 0xb8, 0x93, 0xbd, 0x4c, 0x63, 0x53, 0xf9, 0xcb, 0xfd, - 0x5c, 0x5b, 0xf9, 0x23, 0xf3, 0x7e, 0x45, 0xa3, 0xe0, 0x8b, 0x51, 0xee, 0xdf, 0xc1, 0x84, 0xff, - 0xc1, 0x3c, 0x34, 0xf6, 0xbb, 0x57, 0x61, 0x77, 0xfe, 0x55, 0xf7, 0xbb, 0xc9, 0xb6, 0x57, 0x60, - 0x8f, 0xbc, 0xde, 0xcb, 0xec, 0x43, 0xe6, 0x37, 0x4d, 0x80, 0x1f, 0x3b, 0xff, 0x30, 0xff, 0x79, - 0x5f, 0x7a, 0x98, 0x7c, 0x77, 0xac, 0xc4, 0x95, 0xfd, 0xb0, 0x5b, 0xf6, 0xda, 0xfc, 0x67, 0x4a, - 0xbe, 0x3e, 0x56, 0xe2, 0xca, 0x7e, 0x67, 0xef, 0x42, 0xbd, 0xa4, 0x71, 0xb2, 0x20, 0xdf, 0xdb, - 0xa4, 0x4a, 0x32, 0x39, 0x23, 0xbf, 0xd8, 0x8f, 0x79, 0x9c, 0x24, 0xaa, 0x0e, 0x6d, 0xf8, 0xcb, - 0xde, 0x5e, 0x62, 0xea, 0xac, 0x84, 0x44, 0x36, 0x11, 0xde, 0x19, 0x59, 0xb5, 0xb3, 0x9f, 0xfc, - 0xb5, 0x29, 0xbe, 0xba, 0xbd, 0x6b, 0x5d, 0xa9, 0xca, 0xde, 0x0b, 0x0f, 0x13, 0xc5, 0xd6, 0xa1, - 0x4a, 0xf9, 0x77, 0x71, 0x12, 0xc2, 0x96, 0x5d, 0x39, 0xc0, 0x47, 0xf2, 0xac, 0xe7, 0xfb, 0x6d, - 0x15, 0xa8, 0x1a, 0xd4, 0x7f, 0x37, 0x9c, 0x67, 0xa6, 0xd5, 0x5b, 0xd8, 0xe6, 0x49, 0xef, 0xb2, - 0xd1, 0xdd, 0xdf, 0x77, 0x0e, 0xd1, 0x75, 0xf2, 0xc1, 0x38, 0x86, 0x51, 0xef, 0x12, 0xd3, 0x75, - 0x08, 0x6c, 0xa2, 0x34, 0xea, 0x13, 0xcf, 0xf7, 0x70, 0x01, 0x43, 0xfa, 0x99, 0x35, 0x42, 0x45, - 0x2a, 0x20, 0x71, 0xe3, 0xa4, 0xfd, 0x4b, 0xb6, 0x5d, 0x06, 0x3e, 0x49, 0x03, 0x9f, 0x6c, 0x02, - 0x9f, 0x84, 0x41, 0xaf, 0x20, 0xa5, 0xd8, 0x4a, 0xb9, 0xae, 0x64, 0x56, 0x22, 0x5f, 0x2f, 0x41, - 0x15, 0x67, 0xd2, 0x7e, 0x0b, 0x29, 0xb4, 0x08, 0xe3, 0x9f, 0x8d, 0x86, 0x38, 0xad, 0x24, 0xf2, - 0x97, 0xb6, 0x5f, 0xcd, 0xe2, 0x5a, 0x2e, 0x55, 0x11, 0x21, 0x00, 0x90, 0xed, 0x1d, 0x6e, 0x1c, - 0x1e, 0x58, 0xe0, 0xb3, 0x06, 0x5d, 0x35, 0x89, 0xe7, 0x9c, 0xbc, 0x2a, 0xbe, 0x3c, 0xb3, 0xae, - 0x7e, 0x8d, 0x47, 0xa6, 0xbf, 0x25, 0xbf, 0xb3, 0x28, 0x60, 0x3a, 0x38, 0xfb, 0x15, 0x28, 0x79, - 0xb4, 0x57, 0x43, 0x2d, 0xa6, 0x8d, 0x1a, 0x40, 0xbe, 0x75, 0x8d, 0x52, 0xea, 0x2f, 0xd3, 0xb8, - 0xac, 0x53, 0x0b, 0x96, 0x32, 0xec, 0xe7, 0xb4, 0x1e, 0x99, 0x15, 0x0a, 0x40, 0x6d, 0x56, 0x0e, - 0x79, 0x6f, 0xe5, 0x26, 0x8c, 0xc5, 0xec, 0x24, 0x4a, 0xe2, 0x44, 0x9d, 0xd8, 0xcd, 0x1f, 0x0f, - 0xf5, 0x89, 0x90, 0xa9, 0x0e, 0x65, 0x04, 0xad, 0x62, 0x37, 0xd0, 0x74, 0x03, 0x47, 0x92, 0xf0, - 0x13, 0x78, 0x0a, 0x34, 0x04, 0xdd, 0x6a, 0x79, 0x8b, 0x32, 0x31, 0xf5, 0xac, 0x0b, 0xda, 0x8d, - 0x98, 0xe9, 0xc0, 0x5b, 0x96, 0x65, 0x69, 0x99, 0xd8, 0x34, 0x2a, 0x2d, 0xd3, 0xcd, 0xf1, 0x4a, - 0xf1, 0x4e, 0xa5, 0x18, 0x2a, 0xdd, 0xf0, 0x78, 0x23, 0xa4, 0xab, 0x60, 0x67, 0x6c, 0xb3, 0x98, - 0x76, 0x09, 0x5c, 0x14, 0xc4, 0x2c, 0x0f, 0x2c, 0xb2, 0xe4, 0xf1, 0xc1, 0x46, 0x60, 0x37, 0x01, - 0x68, 0x3a, 0xd6, 0x93, 0x7a, 0xbd, 0xc7, 0x7a, 0x42, 0x60, 0x43, 0xd8, 0x16, 0xd6, 0x29, 0x4f, - 0x14, 0x6c, 0x68, 0xa0, 0x94, 0xee, 0x2c, 0xb5, 0xa3, 0x35, 0x8b, 0x83, 0x7d, 0xea, 0x81, 0xfa, - 0x51, 0x9c, 0x48, 0xde, 0xac, 0x5f, 0xaa, 0xf2, 0xfc, 0x16, 0xa8, 0x15, 0x36, 0x4a, 0xa8, 0x96, - 0x49, 0xd8, 0xdd, 0x0e, 0xe0, 0x56, 0xb4, 0xe9, 0x02, 0x52, 0x48, 0x0c, 0x5d, 0x7d, 0x4c, 0x7e, - 0x5a, 0x4c, 0x77, 0xc8, 0xad, 0x0c, 0x41, 0x5a, 0x9e, 0x5d, 0xfa, 0x04, 0xec, 0x80, 0x14, 0x98, - 0x90, 0x80, 0x1e, 0xba, 0x31, 0x29, 0xce, 0x7e, 0x81, 0xdd, 0x3e, 0x63, 0xb2, 0xcb, 0x49, 0xc2, - 0x54, 0x1b, 0xf5, 0xba, 0x02, 0x93, 0xd8, 0xa6, 0xb2, 0xb6, 0xc0, 0x24, 0xb5, 0x69, 0xf8, 0xc4, - 0xf0, 0x1d, 0x31, 0xfe, 0xe2, 0x92, 0x84, 0x6c, 0x9c, 0x12, 0x45, 0x14, 0x89, 0x49, 0x42, 0x92, - 0x09, 0x1c, 0x3c, 0xce, 0xd9, 0x38, 0x31, 0x8e, 0x17, 0x93, 0x0d, 0x59, 0x8e, 0x0f, 0xb6, 0x2a, - 0xf8, 0x0b, 0xea, 0x0f, 0x06, 0xed, 0xb1, 0xab, 0x0e, 0x75, 0x4c, 0x13, 0x9f, 0xf4, 0x07, 0x03, - 0x4c, 0x16, 0xae, 0x3c, 0x2c, 0x33, 0xa6, 0x2e, 0x63, 0xee, 0x32, 0x0a, 0x98, 0xa1, 0x5a, 0x4c, - 0x3f, 0x26, 0x6f, 0xd2, 0xcd, 0xd1, 0x19, 0xaa, 0xb3, 0xfe, 0x60, 0x60, 0xa6, 0xb8, 0x30, 0x29, - 0x98, 0xe2, 0xd4, 0xa4, 0x38, 0xab, 0x64, 0x99, 0x0d, 0x0d, 0x22, 0x19, 0xab, 0xc4, 0x9c, 0xcb, - 0x49, 0x18, 0xef, 0x66, 0x24, 0x66, 0x3e, 0x49, 0x19, 0x87, 0x00, 0x02, 0xc6, 0x18, 0x1f, 0xf9, - 0x41, 0x72, 0xc6, 0x87, 0xe9, 0xad, 0x80, 0x5d, 0x92, 0xe3, 0x6d, 0x14, 0xa6, 0xfc, 0x24, 0x0b, - 0x62, 0xe6, 0x8e, 0xe7, 0x87, 0x26, 0x43, 0x06, 0x31, 0x43, 0xa2, 0xab, 0xf0, 0x59, 0xd2, 0x41, - 0xe2, 0x5a, 0x8d, 0x2e, 0x03, 0x1f, 0x37, 0x2b, 0x08, 0xa8, 0xa0, 0xba, 0x12, 0x2a, 0xf4, 0x9b, - 0x05, 0x0a, 0x0a, 0x64, 0x57, 0x40, 0xc1, 0x85, 0xdb, 0x9c, 0xb7, 0xcb, 0xe0, 0xd2, 0x6f, 0xc7, - 0x2f, 0xce, 0x2f, 0x41, 0x44, 0xfd, 0x05, 0x81, 0xcc, 0x8c, 0x88, 0x4f, 0x7a, 0xbe, 0x8f, 0xc9, - 0xc6, 0x65, 0xa4, 0x2e, 0xa3, 0xa8, 0x16, 0xfe, 0x4d, 0x1a, 0x1f, 0x45, 0x8b, 0x5d, 0x6f, 0x51, - 0xad, 0xb7, 0x62, 0xa8, 0xdf, 0x95, 0xb8, 0x2d, 0x08, 0x67, 0xea, 0x9a, 0xf5, 0x46, 0x2a, 0xe8, - 0x77, 0x15, 0xc9, 0x18, 0xbf, 0xee, 0xf1, 0xee, 0xd5, 0xc8, 0x0f, 0x64, 0x5b, 0x9c, 0x95, 0x02, - 0x6c, 0xbb, 0x0c, 0x34, 0x5d, 0x56, 0xe3, 0xc8, 0xca, 0x71, 0xc4, 0xc1, 0x5f, 0xd0, 0xc0, 0x6f, - 0xab, 0xdd, 0x61, 0xc4, 0x0f, 0xad, 0x4e, 0xbf, 0x0d, 0x51, 0x04, 0x86, 0xfc, 0xda, 0x48, 0x5e, - 0xb3, 0x9e, 0xef, 0x8f, 0x64, 0xd0, 0xf7, 0x7d, 0xc0, 0x89, 0x1d, 0x95, 0xec, 0x88, 0x72, 0x00, - 0xfd, 0xb6, 0x38, 0x43, 0xb2, 0x23, 0xf0, 0xf1, 0x41, 0xa8, 0x26, 0x32, 0x4c, 0xbd, 0xb3, 0x7e, - 0x73, 0x1c, 0x96, 0xbd, 0x1f, 0x60, 0x05, 0x6b, 0x64, 0x33, 0x0d, 0xbd, 0x96, 0x42, 0x5a, 0x31, - 0x7e, 0x7d, 0x79, 0x39, 0x42, 0x92, 0x59, 0x0a, 0xea, 0xf6, 0x06, 0x03, 0xda, 0x1f, 0x5c, 0xbc, - 0x1a, 0x0c, 0x2e, 0xfb, 0x2f, 0xfd, 0xab, 0xde, 0xcb, 0xab, 0x2e, 0xbd, 0xb8, 0x18, 0x5c, 0x5d, - 0x5e, 0x0d, 0xfc, 0x8b, 0xcb, 0xab, 0xc1, 0xcb, 0xab, 0xde, 0xf9, 0x79, 0x1b, 0x09, 0xc6, 0xbb, - 0x7d, 0xdc, 0xe9, 0xf9, 0x17, 0xf4, 0xe2, 0xaa, 0xdf, 0xbb, 0xec, 0x5d, 0x5d, 0x9d, 0x5f, 0x9d, - 0xbf, 0x7a, 0xf5, 0xaa, 0xfd, 0x3b, 0x12, 0x98, 0xf0, 0xeb, 0xbe, 0x3f, 0xf2, 0x03, 0xfa, 0xaa, - 0xff, 0xf2, 0xc2, 0xbf, 0xba, 0xf4, 0x2f, 0x2f, 0x7c, 0xff, 0xe5, 0xf9, 0xd5, 0xa0, 0x8d, 0x14, - 0xe3, 0xdd, 0x9e, 0x8f, 0xbb, 0xfd, 0xc1, 0x05, 0x7d, 0x79, 0x79, 0x75, 0x3e, 0xe8, 0xbd, 0xba, - 0xe8, 0xf5, 0xfd, 0x2b, 0xbf, 0xdf, 0xe9, 0xf5, 0x06, 0xf4, 0xf2, 0xe5, 0xd5, 0xd5, 0xc5, 0x85, - 0xdf, 0xf3, 0x2f, 0x2f, 0x7b, 0x17, 0x2f, 0xdb, 0xbf, 0x23, 0x85, 0xe1, 0x40, 0x84, 0x9d, 0x0f, - 0x7a, 0xf4, 0xea, 0xe5, 0xe5, 0x95, 0x3f, 0xb8, 0xbc, 0x7c, 0xe5, 0x0f, 0x2e, 0xaf, 0xce, 0x3b, - 0xb4, 0xd7, 0xbb, 0xe8, 0xfb, 0x97, 0x17, 0x83, 0xf3, 0x97, 0xaf, 0x2e, 0x7a, 0x97, 0x83, 0x36, - 0x9c, 0xe4, 0x76, 0x07, 0x03, 0xdc, 0xbd, 0xf0, 0x69, 0x7f, 0x70, 0x7e, 0x79, 0x79, 0xee, 0x5f, - 0x9d, 0x9f, 0xf7, 0x7b, 0x7d, 0x80, 0x03, 0xfb, 0x38, 0x3b, 0xef, 0x0f, 0xe8, 0xc5, 0xc5, 0xd5, - 0x45, 0xaf, 0x3f, 0x78, 0xd9, 0xeb, 0x5d, 0xbd, 0xbc, 0xe8, 0x50, 0xff, 0xe5, 0xd5, 0xc5, 0xf9, - 0xc5, 0xe0, 0x12, 0xea, 0x5f, 0xf6, 0xcf, 0x2f, 0xfa, 0x76, 0x6e, 0x03, 0x18, 0xe2, 0x2b, 0xea, - 0xbf, 0x1a, 0xf4, 0xaf, 0x2e, 0xcf, 0x07, 0xfe, 0xcb, 0xab, 0xc1, 0x4b, 0x3b, 0x35, 0xc3, 0xa2, - 0x86, 0xa9, 0x8d, 0xf0, 0x68, 0x30, 0xf1, 0x2f, 0x50, 0xdc, 0xe0, 0xe1, 0x5f, 0x90, 0xc2, 0x07, - 0x2c, 0xfc, 0x57, 0x2b, 0x89, 0x8f, 0x5a, 0x75, 0x86, 0x4a, 0x94, 0xe5, 0x5e, 0xc2, 0x59, 0x9f, - 0x9f, 0x93, 0x8c, 0x5d, 0xf0, 0x8b, 0x21, 0xbd, 0xb8, 0xce, 0xba, 0x7c, 0x68, 0xd7, 0x31, 0x61, - 0x3b, 0xeb, 0x8c, 0x24, 0xa3, 0x83, 0x36, 0xca, 0x3a, 0x60, 0x19, 0x25, 0x74, 0x7a, 0x96, 0x50, - 0xf5, 0x5f, 0x4c, 0x9d, 0x89, 0x51, 0xc6, 0x64, 0xc0, 0x99, 0xac, 0xfc, 0x24, 0x05, 0xd9, 0x17, - 0xf3, 0xb2, 0xd5, 0x5a, 0xa0, 0x86, 0x15, 0x68, 0xb4, 0x1d, 0x93, 0x07, 0x4a, 0x0f, 0x8a, 0xc9, - 0x78, 0x0b, 0x31, 0x83, 0xde, 0x32, 0xdd, 0x78, 0x64, 0xc1, 0x75, 0xd0, 0x10, 0xc5, 0x76, 0xdf, - 0xb7, 0x5a, 0xc0, 0x3e, 0xb1, 0x6a, 0x9a, 0x92, 0x4d, 0xa0, 0xe9, 0xa6, 0x28, 0x48, 0xda, 0x6c, - 0x56, 0x33, 0xa7, 0x6d, 0x07, 0x71, 0x48, 0x76, 0x7b, 0x91, 0x64, 0x5f, 0xf5, 0x28, 0xb5, 0xac, - 0xed, 0x32, 0x38, 0xed, 0x91, 0x0d, 0xfc, 0x93, 0xc2, 0x3f, 0x61, 0x70, 0xda, 0x2b, 0x2a, 0x7b, - 0x56, 0x59, 0xf7, 0x9c, 0x18, 0xab, 0x09, 0x83, 0x10, 0x8b, 0x53, 0x26, 0xc7, 0x6a, 0x32, 0x74, - 0xca, 0x8e, 0x26, 0x48, 0xd0, 0x65, 0x9e, 0x0b, 0x9a, 0xc2, 0x3f, 0x1b, 0xf8, 0x07, 0x7c, 0x88, - 0x3b, 0x1d, 0x59, 0x23, 0x56, 0x38, 0x2f, 0x75, 0xd9, 0xb2, 0x28, 0x48, 0x35, 0xf9, 0xf0, 0x60, - 0xf6, 0x0e, 0xa7, 0x3b, 0x9a, 0xd0, 0xc1, 0x54, 0xeb, 0x9d, 0xbb, 0x06, 0x96, 0xf1, 0x87, 0x60, - 0x59, 0x30, 0x74, 0xf9, 0x08, 0x1c, 0x40, 0x70, 0x51, 0xc1, 0x4a, 0x43, 0x9d, 0xa9, 0xd0, 0x58, - 0x8b, 0x8f, 0x83, 0x4c, 0x1f, 0x03, 0x99, 0x36, 0x41, 0x5a, 0x95, 0xe6, 0x71, 0x68, 0x9b, 0xc7, - 0xa0, 0x6d, 0x9a, 0xd0, 0xc2, 0x78, 0xbd, 0x0c, 0x9f, 0x80, 0x16, 0x3e, 0x02, 0xad, 0xc6, 0xee, - 0x32, 0xdd, 0x90, 0x6d, 0x18, 0xe8, 0x02, 0x57, 0xc0, 0x9d, 0x96, 0xf3, 0x00, 0xf4, 0x1d, 0x6e, - 0x43, 0xa5, 0x9e, 0xf5, 0xd0, 0x1a, 0x81, 0x0a, 0xb6, 0xcb, 0x54, 0xba, 0xee, 0x48, 0xf1, 0xd9, - 0xa3, 0x73, 0x50, 0x8b, 0x29, 0x55, 0x8f, 0x00, 0xae, 0x67, 0xa1, 0x16, 0x53, 0x90, 0x1c, 0xcd, - 0x59, 0x2c, 0x14, 0xe7, 0xf2, 0x49, 0xf0, 0x8b, 0xe7, 0x83, 0x5f, 0xec, 0x80, 0x9f, 0x3e, 0xb5, - 0x9c, 0x00, 0x7d, 0xfa, 0x7c, 0xe8, 0xd3, 0x1d, 0xe8, 0x60, 0x5f, 0x1e, 0x17, 0x0b, 0xb5, 0x46, - 0x86, 0x1c, 0x77, 0x10, 0xa3, 0xa7, 0x58, 0x1d, 0xc5, 0x4a, 0xb8, 0x5a, 0x3f, 0xfa, 0x1e, 0x04, - 0xe9, 0x22, 0xf8, 0x1e, 0xe4, 0xe7, 0x34, 0xf8, 0x1e, 0x81, 0x6f, 0xec, 0x09, 0xaa, 0xa8, 0x15, - 0x22, 0x30, 0x59, 0xb6, 0x61, 0x50, 0xc5, 0x5e, 0x6b, 0x1a, 0x8e, 0x7a, 0x81, 0xa6, 0xe1, 0xee, - 0x40, 0x9f, 0xc1, 0xc2, 0x66, 0x86, 0x61, 0x60, 0xd2, 0x86, 0x74, 0x8b, 0xc7, 0xe8, 0xa5, 0x29, - 0x20, 0xe2, 0xc7, 0xd1, 0xf0, 0x26, 0x8d, 0x77, 0xd0, 0xb0, 0xb4, 0xea, 0x80, 0x41, 0x43, 0x5c, - 0xcb, 0x4e, 0x83, 0x86, 0xd4, 0xa2, 0x21, 0x7e, 0x2e, 0x1a, 0x4a, 0xcd, 0xe3, 0x39, 0x68, 0x30, - 0xc6, 0xfc, 0x93, 0x68, 0x58, 0xa6, 0xf1, 0x33, 0xd1, 0x60, 0xec, 0x8d, 0x26, 0x92, 0xad, 0x55, - 0xf5, 0xd8, 0x56, 0xa1, 0x16, 0xe5, 0xba, 0x43, 0x7d, 0xf0, 0x5f, 0x50, 0xd5, 0xf1, 0xc8, 0x09, - 0x24, 0x16, 0x65, 0x62, 0xda, 0xf1, 0xb0, 0xf7, 0xc0, 0xce, 0x51, 0x9e, 0x14, 0x80, 0xd7, 0x73, - 0x8e, 0x90, 0x64, 0xbf, 0x51, 0x7e, 0xc7, 0x23, 0xf0, 0x11, 0x8d, 0x90, 0x60, 0x7f, 0x45, 0x10, - 0xae, 0x64, 0xf7, 0x60, 0x65, 0xbe, 0xfa, 0xee, 0x8b, 0x9b, 0xaf, 0x73, 0xfb, 0x65, 0x74, 0x8a, - 0x37, 0x55, 0x4b, 0x13, 0x0a, 0xf8, 0xcc, 0xa6, 0x24, 0x33, 0x5f, 0x17, 0x13, 0xd2, 0xc3, 0x98, - 0x9c, 0xca, 0x87, 0xad, 0x44, 0xb5, 0x98, 0x9e, 0x38, 0x73, 0x17, 0x0f, 0x2b, 0xba, 0xd9, 0xaa, - 0x40, 0x90, 0x45, 0xa0, 0xc8, 0x34, 0xe0, 0x24, 0x0c, 0xb2, 0x62, 0x87, 0x4a, 0x9f, 0x85, 0xc1, - 0xb0, 0x81, 0xc2, 0xf0, 0x61, 0x1c, 0xda, 0x44, 0x78, 0x1c, 0x99, 0xfb, 0xc6, 0x72, 0x4d, 0x24, - 0xa5, 0x89, 0xfd, 0xcc, 0x65, 0xfc, 0xc2, 0xeb, 0xfc, 0x1d, 0x69, 0xaa, 0xb0, 0xf9, 0x59, 0xd8, - 0x9f, 0x63, 0x92, 0x76, 0x77, 0xf9, 0xfa, 0x83, 0x81, 0x5b, 0xc0, 0x6f, 0x76, 0x16, 0xb0, 0xf7, - 0xb2, 0xfd, 0xdf, 0x66, 0x21, 0x60, 0x11, 0xdc, 0x47, 0x7f, 0x02, 0x6b, 0xe0, 0x3e, 0xce, 0x27, - 0x76, 0xf5, 0xbe, 0xfb, 0xd3, 0xcd, 0x80, 0x68, 0xec, 0xc7, 0x85, 0x83, 0xf1, 0xc3, 0x0e, 0x8c, - 0x1a, 0x40, 0xdd, 0xba, 0xd9, 0xe3, 0xd7, 0xbb, 0xf4, 0xf2, 0x48, 0x75, 0x92, 0xb1, 0xb2, 0x9b, - 0x47, 0x29, 0x64, 0xc9, 0xef, 0x9e, 0x41, 0x21, 0x60, 0xc8, 0x15, 0xcd, 0xf5, 0x79, 0xf5, 0xe7, - 0xa8, 0xe4, 0x81, 0x15, 0xea, 0xfc, 0x1d, 0xfd, 0x62, 0xec, 0x4c, 0x4d, 0x43, 0xfc, 0x20, 0x8b, - 0xd7, 0x0e, 0x97, 0xa6, 0x18, 0x79, 0x7a, 0x00, 0xcb, 0xb4, 0x94, 0x6c, 0x50, 0xdf, 0x10, 0xe9, - 0xb2, 0x24, 0xc9, 0xb4, 0xe3, 0xbd, 0xb0, 0xa9, 0xb8, 0xe3, 0xbd, 0x78, 0x3e, 0xab, 0xff, 0x78, - 0x8c, 0xd5, 0xcf, 0x2f, 0xfd, 0x06, 0xbf, 0x1a, 0xe3, 0xa8, 0xe2, 0x57, 0xf8, 0x32, 0x4b, 0xf7, - 0xe5, 0x51, 0x56, 0x7f, 0xaa, 0xe9, 0xf3, 0x59, 0x7d, 0x99, 0xc6, 0x7b, 0x0b, 0x09, 0xb2, 0x71, - 0xbb, 0x0c, 0x04, 0x49, 0x03, 0x45, 0xe2, 0x7d, 0x56, 0x07, 0x49, 0xfc, 0x2c, 0x1c, 0x86, 0x0d, - 0x24, 0x86, 0x8f, 0x61, 0xf1, 0x69, 0x66, 0x6f, 0x78, 0xbd, 0x8a, 0x62, 0x82, 0x49, 0x5c, 0x20, - 0x5c, 0xfb, 0x42, 0xff, 0xd9, 0x40, 0x3b, 0xd3, 0xf4, 0x56, 0xcc, 0xf4, 0xd2, 0x6c, 0x50, 0x69, - 0x2c, 0x66, 0x5c, 0x7d, 0x10, 0x7f, 0x70, 0xb0, 0x1d, 0xe9, 0x34, 0x51, 0x33, 0xae, 0xfe, 0x61, - 0x8a, 0x21, 0xb0, 0x75, 0x19, 0xca, 0x59, 0xcc, 0x7f, 0x0a, 0x67, 0x22, 0x4b, 0x49, 0x62, 0x2e, - 0x7c, 0xcd, 0x66, 0x70, 0xbe, 0x10, 0xd7, 0x6d, 0x97, 0xe1, 0x9a, 0x93, 0x94, 0x79, 0xcb, 0x44, - 0x89, 0x3f, 0x12, 0xa9, 0xc3, 0xd8, 0x33, 0x3b, 0x54, 0x1c, 0xde, 0x27, 0x99, 0xfe, 0x46, 0x28, - 0x6e, 0xc6, 0x50, 0xdb, 0xa4, 0xee, 0x54, 0x52, 0x32, 0x85, 0xc1, 0x56, 0x6e, 0x27, 0x9d, 0x7e, - 0x3b, 0x23, 0x5e, 0x24, 0x54, 0x64, 0xe3, 0x6a, 0xe3, 0xd1, 0xd6, 0x76, 0x6c, 0x5c, 0xa0, 0x41, - 0xd5, 0x6b, 0x67, 0x6f, 0x40, 0xe5, 0x87, 0x5c, 0xf0, 0x40, 0x74, 0xfb, 0xed, 0xa4, 0x0b, 0x80, - 0xcc, 0xe4, 0x02, 0x41, 0x96, 0x5c, 0x2c, 0x96, 0x3a, 0x10, 0x24, 0xba, 0x0b, 0xc4, 0x59, 0x9f, - 0x44, 0xf7, 0xe6, 0x47, 0x99, 0xb6, 0x90, 0xec, 0xf2, 0xb3, 0x7e, 0x11, 0xec, 0x74, 0xa5, 0xce, - 0xfa, 0x7b, 0x50, 0x55, 0xd9, 0x00, 0x8a, 0xee, 0x02, 0x9f, 0xdc, 0x07, 0xbe, 0xeb, 0x22, 0x1d, - 0xa9, 0xba, 0x9b, 0x74, 0x24, 0x02, 0xd5, 0x38, 0xf4, 0xfb, 0x57, 0xd3, 0x95, 0x0c, 0xe8, 0x27, - 0x8a, 0x09, 0x87, 0x78, 0xb8, 0x94, 0x61, 0x9b, 0x91, 0x0c, 0x92, 0x75, 0x87, 0x24, 0xa9, 0xbe, - 0xcd, 0x80, 0xe0, 0xe4, 0xe1, 0x09, 0xbc, 0x92, 0x94, 0xc5, 0x23, 0x75, 0xd6, 0x0f, 0x38, 0xcc, - 0x91, 0x25, 0x9d, 0x63, 0x47, 0x71, 0xd2, 0xb8, 0xeb, 0xc0, 0x19, 0x61, 0x84, 0xbb, 0xf3, 0xfb, - 0x94, 0x4b, 0x68, 0x02, 0x21, 0x8d, 0x0b, 0xc8, 0xa8, 0xc3, 0x41, 0xb9, 0x52, 0xe0, 0x79, 0xa2, - 0x83, 0x81, 0xf1, 0xe8, 0x38, 0x5d, 0xb6, 0x2e, 0x5b, 0x34, 0xca, 0x8c, 0x22, 0x5a, 0x17, 0x4d, - 0x1b, 0x45, 0xd6, 0x4a, 0x28, 0xcb, 0xc0, 0xcb, 0x21, 0x68, 0x68, 0x8b, 0x9c, 0x8e, 0x1f, 0xd8, - 0xeb, 0x6c, 0x1a, 0x9c, 0x56, 0x1f, 0xf9, 0x6a, 0xcd, 0x15, 0x58, 0x3e, 0xdc, 0xd0, 0xdf, 0x2a, - 0xbc, 0x6b, 0x64, 0x19, 0x3f, 0x1e, 0x92, 0x4e, 0x95, 0xef, 0x72, 0x7c, 0x96, 0xb5, 0x1b, 0xde, - 0x8e, 0xca, 0x17, 0xe6, 0x93, 0xca, 0x09, 0x96, 0x58, 0x29, 0x61, 0x3b, 0x5c, 0x36, 0x46, 0x29, - 0xe8, 0xf2, 0x8c, 0x9d, 0xd3, 0x4b, 0x5b, 0xd2, 0x30, 0xb6, 0xea, 0x0a, 0xa9, 0x2d, 0xb3, 0x56, - 0x53, 0xe0, 0xee, 0xf9, 0xd5, 0xc5, 0x9b, 0xa2, 0x30, 0x28, 0x36, 0xbe, 0xff, 0xac, 0x1c, 0x44, - 0xdc, 0x6a, 0xa1, 0x88, 0x75, 0x7b, 0xed, 0xa8, 0x93, 0x75, 0xfa, 0xed, 0x04, 0x93, 0xed, 0x5d, - 0x10, 0x8f, 0xd2, 0x20, 0x22, 0xf7, 0x41, 0x3c, 0x8a, 0x82, 0xb4, 0xb0, 0x4e, 0x75, 0x4d, 0xa4, - 0x66, 0xfd, 0xb6, 0x19, 0xe9, 0x8f, 0x6f, 0x89, 0xd0, 0xec, 0xd8, 0x95, 0x28, 0xa4, 0x5f, 0xc8, - 0x8e, 0xc4, 0x2f, 0x64, 0x41, 0xd4, 0xf1, 0x1a, 0x76, 0xda, 0xe9, 0xef, 0x4a, 0x23, 0xdd, 0xd6, - 0x1d, 0xd9, 0x96, 0xb8, 0xa8, 0x19, 0xdf, 0x38, 0xfd, 0xeb, 0x33, 0x06, 0x43, 0x7f, 0x67, 0xfd, - 0x6e, 0xc5, 0x52, 0xdd, 0x5d, 0x96, 0xea, 0xee, 0x88, 0x80, 0xc6, 0x85, 0x2e, 0xdd, 0xf4, 0xbc, - 0x39, 0x28, 0xa5, 0x6e, 0x6b, 0xb9, 0xa1, 0x92, 0x2a, 0x96, 0x5d, 0xe4, 0x2e, 0x28, 0x60, 0x42, - 0x09, 0x2c, 0x28, 0x1b, 0x3c, 0x92, 0xe8, 0x1d, 0x8f, 0x34, 0x40, 0x5e, 0x72, 0x1e, 0x7f, 0x25, - 0x17, 0xb1, 0x15, 0x47, 0xe6, 0xf3, 0x40, 0x82, 0x40, 0xd4, 0x76, 0x14, 0x27, 0xd1, 0xcd, 0xad, - 0x48, 0x8d, 0xbc, 0xe0, 0x23, 0xc9, 0x54, 0xc7, 0x44, 0xf3, 0xef, 0xe5, 0x9e, 0x5f, 0xfa, 0x5d, - 0x28, 0x81, 0x26, 0xa1, 0xd4, 0xe2, 0x48, 0xb3, 0xde, 0x2b, 0xbf, 0x2b, 0x83, 0x23, 0xa5, 0x10, - 0x04, 0xc5, 0xc0, 0xb7, 0x49, 0x84, 0x46, 0xd2, 0x6c, 0x27, 0xf5, 0xd0, 0xe3, 0xbd, 0xa1, 0x1b, - 0x04, 0x81, 0xe3, 0x91, 0x46, 0x77, 0x24, 0x83, 0x9f, 0x7b, 0xf0, 0xbc, 0x9a, 0x63, 0x22, 0x70, - 0x5c, 0x81, 0xdc, 0xcd, 0xba, 0xc2, 0x1c, 0x3e, 0xc6, 0xcc, 0x4c, 0xdc, 0xac, 0x5b, 0xa8, 0x43, - 0xd9, 0x47, 0x5d, 0x41, 0xc0, 0x73, 0x89, 0xce, 0x2f, 0xfd, 0x33, 0xa9, 0x31, 0x38, 0xa6, 0x2b, - 0x0a, 0x56, 0xda, 0xc4, 0x65, 0x93, 0xa4, 0xe1, 0x34, 0xac, 0xcf, 0xbe, 0x50, 0x0c, 0x46, 0x45, - 0xe3, 0xbb, 0xe7, 0xfb, 0x67, 0x49, 0x3b, 0x6d, 0xc6, 0x1f, 0xa4, 0x87, 0x8b, 0x67, 0x76, 0x81, - 0x69, 0x72, 0xf7, 0xc6, 0x48, 0xa1, 0xdd, 0x85, 0x94, 0xa5, 0x48, 0x73, 0x37, 0x0f, 0x47, 0x22, - 0x90, 0xe5, 0xaa, 0x3e, 0x24, 0x8a, 0x1b, 0xbd, 0x45, 0x7b, 0x98, 0x49, 0x2b, 0xcc, 0xdc, 0xba, - 0x6d, 0x45, 0x95, 0xc2, 0x2f, 0x61, 0x8a, 0x5a, 0xc0, 0xc4, 0x78, 0x8b, 0x13, 0x7c, 0x86, 0x38, - 0xc8, 0x71, 0x0c, 0x6c, 0x4d, 0x52, 0xf0, 0x3d, 0x43, 0x5e, 0x56, 0xe5, 0x95, 0x23, 0x75, 0x53, - 0xde, 0x63, 0xf6, 0xd8, 0x32, 0x3b, 0xd9, 0x1c, 0x2d, 0xed, 0xf9, 0x7e, 0x37, 0xb5, 0x35, 0x1a, - 0xc3, 0x0d, 0x75, 0x7d, 0xaf, 0xb6, 0x8a, 0xa2, 0x60, 0xfe, 0x90, 0xd7, 0x11, 0x2c, 0xbc, 0x0c, - 0xb6, 0xc8, 0x4c, 0x9c, 0x04, 0xbd, 0xeb, 0x4a, 0x18, 0x3a, 0x24, 0xef, 0xbb, 0xe6, 0xf6, 0x67, - 0xcd, 0x82, 0x59, 0x3b, 0xeb, 0x24, 0xed, 0x04, 0x5f, 0xef, 0xe2, 0xa7, 0x8c, 0x13, 0xe4, 0xcd, - 0x30, 0xbd, 0xc6, 0xbd, 0x99, 0x06, 0x97, 0x6e, 0xa7, 0xc9, 0xdd, 0x07, 0xf1, 0x87, 0x90, 0x8b, - 0xc0, 0xb3, 0x0c, 0xd4, 0x9d, 0x26, 0x77, 0x1e, 0xb1, 0xe9, 0x60, 0x87, 0xab, 0xe0, 0x7e, 0xcc, - 0x49, 0x9a, 0x80, 0x8e, 0x62, 0xac, 0x02, 0x53, 0xf2, 0x1a, 0x8e, 0xaf, 0x1a, 0x33, 0x5c, 0xea, - 0xfd, 0xa0, 0x9a, 0x8e, 0xd7, 0x5d, 0x00, 0xde, 0x21, 0x8a, 0xd0, 0xeb, 0x48, 0xab, 0x72, 0x08, - 0xba, 0x0a, 0xd7, 0xe8, 0x88, 0x2f, 0x6f, 0xec, 0xd7, 0xd7, 0xc0, 0xc7, 0xbd, 0x49, 0xc7, 0x3b, - 0x31, 0x6d, 0x5e, 0x78, 0x05, 0xa6, 0x9f, 0x13, 0x21, 0x91, 0x47, 0x3c, 0x6c, 0x34, 0x93, 0xfa, - 0xe6, 0x40, 0x63, 0x3e, 0x87, 0x67, 0x82, 0x23, 0x1d, 0x68, 0x73, 0xb3, 0xc7, 0x08, 0xc2, 0x99, - 0x66, 0x63, 0x6f, 0x95, 0x64, 0xa9, 0xb9, 0x9e, 0xe0, 0x11, 0x4f, 0x27, 0x59, 0xb4, 0x74, 0x69, - 0x93, 0x9f, 0xad, 0xcb, 0x5c, 0x2e, 0x67, 0xde, 0x84, 0x2c, 0x1a, 0x82, 0x50, 0x36, 0x4e, 0x42, - 0x4d, 0xa7, 0xd2, 0x45, 0x29, 0x82, 0xd3, 0xaf, 0x0a, 0xd1, 0x10, 0x33, 0x66, 0xd7, 0x48, 0x85, - 0x72, 0x96, 0xac, 0x10, 0xdc, 0x1f, 0xae, 0xcf, 0x5b, 0xcf, 0x2f, 0x31, 0x84, 0xd8, 0xdb, 0x71, - 0xa2, 0x41, 0x1d, 0x7a, 0x66, 0x22, 0xdb, 0x7e, 0xfb, 0xcd, 0x38, 0x50, 0x7f, 0xfb, 0x8d, 0x49, - 0x4c, 0x50, 0xd3, 0x9f, 0x5a, 0xc6, 0xf2, 0xd8, 0xb0, 0x4c, 0x64, 0x2e, 0xc0, 0x57, 0x85, 0x18, - 0xef, 0x44, 0xf5, 0x6b, 0x7c, 0x18, 0x17, 0xf2, 0x80, 0xdf, 0xd4, 0xd2, 0x8d, 0xb9, 0x07, 0x63, - 0xe3, 0x3f, 0xcc, 0x89, 0x19, 0x11, 0x6c, 0x9b, 0xc8, 0x77, 0x80, 0x8f, 0x6f, 0x92, 0x5b, 0x19, - 0x48, 0x92, 0x48, 0x83, 0x93, 0xd4, 0x28, 0x2e, 0xb0, 0x3f, 0x3c, 0xad, 0x2a, 0x94, 0xe1, 0x7f, - 0x66, 0x67, 0x55, 0x0b, 0x21, 0x47, 0xa5, 0x0a, 0xf0, 0xce, 0x7c, 0x06, 0x65, 0x3e, 0xc9, 0xd8, - 0x36, 0xd9, 0x70, 0x35, 0x8f, 0x93, 0xdb, 0xc0, 0xdb, 0x88, 0x54, 0x4c, 0x63, 0xee, 0x91, 0x99, - 0x48, 0xd7, 0x71, 0x78, 0x1f, 0xa8, 0x91, 0x27, 0x64, 0x2c, 0x24, 0xef, 0x4e, 0x41, 0x64, 0x7a, - 0xe0, 0x8a, 0x82, 0xdf, 0xea, 0xf6, 0xb8, 0x5f, 0x1e, 0x9d, 0x9b, 0x88, 0x53, 0x35, 0xf2, 0x2c, - 0xd8, 0x1f, 0xf8, 0x5c, 0x7b, 0x81, 0xfb, 0xf8, 0x98, 0xac, 0xbd, 0x09, 0xe3, 0x98, 0x2c, 0xd1, - 0x7b, 0x1b, 0xee, 0x56, 0x5f, 0x24, 0x47, 0xe5, 0xba, 0x11, 0x41, 0x32, 0x7b, 0x0a, 0xd9, 0x0c, - 0x66, 0xaa, 0x10, 0xf4, 0x00, 0x0e, 0x89, 0x0b, 0x3e, 0xb2, 0xc1, 0x96, 0x89, 0x7c, 0x2b, 0xd7, - 0x99, 0x06, 0x7d, 0x17, 0x32, 0x21, 0x74, 0x0d, 0xa2, 0x51, 0xbe, 0x06, 0x79, 0x29, 0xe4, 0xe2, - 0x75, 0x0c, 0x8c, 0xf0, 0x13, 0x8f, 0x34, 0xc2, 0x43, 0xe8, 0xc7, 0x5c, 0x69, 0xf9, 0xc6, 0x6e, - 0xf7, 0x08, 0x0f, 0x4b, 0xf5, 0xc4, 0x52, 0x60, 0x3a, 0x82, 0x51, 0x82, 0xae, 0x36, 0xfb, 0x68, - 0x33, 0xe0, 0x9a, 0x2e, 0x28, 0x72, 0x9c, 0x46, 0x06, 0xd2, 0x3f, 0xbb, 0x20, 0x39, 0xe6, 0x20, - 0xde, 0xca, 0xac, 0x7f, 0x75, 0x15, 0xd5, 0xc9, 0xba, 0xd6, 0xbb, 0x74, 0xad, 0x71, 0x19, 0x12, - 0x9f, 0x25, 0xb7, 0xd2, 0x0b, 0xcc, 0x77, 0xbd, 0xa8, 0x5e, 0x70, 0xda, 0x83, 0x68, 0x5c, 0x73, - 0xdb, 0x0b, 0x2e, 0x6f, 0xcf, 0x34, 0x44, 0x29, 0x7d, 0x1b, 0x46, 0xcb, 0x1d, 0x3e, 0xad, 0xe2, - 0x83, 0x0f, 0x6e, 0x5c, 0x01, 0xdf, 0x6f, 0xd7, 0x10, 0x6b, 0xb6, 0xe1, 0xe0, 0x57, 0xc7, 0x45, - 0xf3, 0xf4, 0xae, 0xc1, 0x75, 0x8d, 0xae, 0xed, 0xb7, 0xed, 0xb4, 0x77, 0x58, 0x3d, 0x5b, 0x37, - 0x2b, 0x03, 0x43, 0xba, 0xba, 0x7d, 0x4c, 0x9e, 0x1a, 0xdf, 0xb1, 0x1b, 0x5e, 0x47, 0x86, 0x08, - 0xc7, 0xd7, 0x05, 0x7a, 0xdb, 0x30, 0x5f, 0xa6, 0x3b, 0x3b, 0x98, 0xf5, 0x33, 0x66, 0x2a, 0x06, - 0x7d, 0x16, 0x68, 0xba, 0xa4, 0xba, 0x25, 0x32, 0x11, 0xe4, 0x64, 0x5b, 0xdd, 0xe4, 0x0b, 0xbc, - 0xb7, 0x2a, 0x79, 0x63, 0xe8, 0xe5, 0xa4, 0x4a, 0x75, 0xbb, 0x20, 0x2c, 0x0d, 0x79, 0x1a, 0x61, - 0x06, 0x11, 0xc6, 0xe9, 0x57, 0x91, 0x16, 0x1b, 0x3e, 0xf2, 0x1a, 0xb5, 0xca, 0x4c, 0x2f, 0xf0, - 0x3c, 0x4c, 0xcc, 0x1d, 0xbf, 0x60, 0xeb, 0x75, 0x6f, 0xf9, 0xf4, 0x46, 0xe8, 0xae, 0x0e, 0xd7, - 0xdd, 0xa5, 0x58, 0x2c, 0x63, 0xd8, 0xca, 0xba, 0x26, 0x66, 0xc0, 0xb3, 0x5e, 0x1e, 0xe4, 0x93, - 0x13, 0xf7, 0x3f, 0x1e, 0x7a, 0x44, 0xab, 0x50, 0xa6, 0x70, 0x49, 0x2d, 0xf0, 0x4c, 0x32, 0x06, - 0x61, 0xe1, 0x75, 0x40, 0x46, 0xd2, 0x3b, 0x6c, 0x85, 0xaf, 0xf9, 0xb8, 0x37, 0x52, 0x94, 0xdc, - 0x8a, 0x38, 0xb6, 0x47, 0x17, 0xae, 0x81, 0xb9, 0xe0, 0x46, 0x74, 0xb2, 0x0e, 0x36, 0x1a, 0x81, - 0x3e, 0x02, 0xd4, 0x55, 0xa6, 0xed, 0x9e, 0xbd, 0xd1, 0xa8, 0xdf, 0x96, 0xb8, 0xdc, 0xb9, 0xcb, - 0xcf, 0x75, 0x92, 0x0a, 0x40, 0x60, 0xe0, 0x85, 0xd3, 0x34, 0x89, 0x33, 0xcd, 0x3d, 0x72, 0xc8, - 0xd6, 0x45, 0x01, 0xc7, 0x42, 0x4b, 0x04, 0xaf, 0x8f, 0x78, 0x64, 0x27, 0x40, 0x11, 0x6d, 0xcd, - 0x0d, 0xb3, 0x37, 0xf0, 0xaa, 0xc4, 0x8e, 0xc9, 0xa9, 0x99, 0xd6, 0x79, 0x5e, 0xad, 0xec, 0x82, - 0x6b, 0x17, 0x96, 0x9e, 0x7e, 0x7d, 0xff, 0xd1, 0xde, 0xcf, 0x43, 0x1e, 0x70, 0x9a, 0x87, 0xdd, - 0x1d, 0xd3, 0x5b, 0x21, 0x67, 0xc9, 0x2d, 0x95, 0xe1, 0x46, 0x2c, 0x42, 0x08, 0x08, 0xcb, 0x52, - 0xae, 0xbe, 0x5a, 0xc0, 0x8d, 0x7b, 0xc1, 0xce, 0x7e, 0x45, 0x68, 0x74, 0x1a, 0x2d, 0x55, 0xb2, - 0xe2, 0x79, 0x28, 0x67, 0x2a, 0x11, 0x33, 0x4c, 0x71, 0x3b, 0x0d, 0xe7, 0xa1, 0x12, 0x67, 0xa2, - 0xbc, 0x12, 0x0a, 0x8f, 0x9f, 0x88, 0x1f, 0x97, 0x89, 0xe4, 0xb9, 0xf8, 0x31, 0x99, 0xe5, 0xe2, - 0xc7, 0x70, 0xd6, 0x28, 0xe5, 0x65, 0x2f, 0x10, 0xdc, 0xdf, 0x50, 0x19, 0x91, 0xc8, 0x73, 0x85, - 0x5b, 0x2d, 0xff, 0x5a, 0x97, 0xf7, 0x76, 0x47, 0x2e, 0xd6, 0x2e, 0x4a, 0xe2, 0x8e, 0x77, 0x76, - 0xe6, 0x75, 0x38, 0x5d, 0x26, 0xa9, 0xee, 0x70, 0xba, 0x0e, 0xf5, 0x52, 0x86, 0x2b, 0xde, 0x81, - 0xf0, 0xc6, 0x50, 0x45, 0xcb, 0x8e, 0x0e, 0x20, 0x92, 0xb9, 0x94, 0x42, 0x10, 0x79, 0x48, 0x4e, - 0x2d, 0xc6, 0x9c, 0xcd, 0x4a, 0xb6, 0xd1, 0x5d, 0xa0, 0x40, 0xbd, 0xe5, 0x44, 0x05, 0x92, 0xcc, - 0x45, 0x1c, 0x07, 0x9e, 0x4c, 0x24, 0xec, 0x61, 0xa9, 0x56, 0xc9, 0x0d, 0xef, 0x9a, 0x85, 0xf2, - 0x82, 0x3e, 0xb1, 0xdf, 0x81, 0xf7, 0x85, 0xef, 0xfb, 0x5e, 0xf1, 0x04, 0xa8, 0x6e, 0xdf, 0x02, - 0xd3, 0x14, 0x7e, 0x1e, 0x01, 0x36, 0x9f, 0xcf, 0xbd, 0xa2, 0x79, 0x7b, 0x6f, 0xad, 0x11, 0x2f, - 0xfd, 0x0d, 0x9c, 0x86, 0x86, 0x92, 0xdf, 0x02, 0xcd, 0x93, 0x8c, 0x55, 0xb1, 0xdd, 0x10, 0x1c, - 0x74, 0xcd, 0xa9, 0xa1, 0xde, 0xb4, 0xc6, 0x8c, 0xfd, 0x1e, 0xeb, 0x49, 0xe0, 0xd2, 0x44, 0xb2, - 0x7f, 0xc2, 0x0b, 0x20, 0x60, 0x40, 0x5a, 0x35, 0x0e, 0x1e, 0x5c, 0x70, 0x6a, 0x1c, 0xbc, 0xba, - 0xe0, 0xd4, 0xb8, 0x94, 0xfd, 0x0b, 0x71, 0x92, 0x41, 0x24, 0xc5, 0x83, 0x66, 0xe8, 0x9f, 0xb3, - 0x42, 0xc7, 0x63, 0x9f, 0x18, 0x67, 0xb2, 0x4f, 0xbc, 0x8e, 0x32, 0x1e, 0x50, 0xf8, 0x35, 0x4e, - 0xe4, 0x09, 0x19, 0x83, 0x9e, 0x68, 0x8a, 0xe1, 0x80, 0xfb, 0xb0, 0xc2, 0xe4, 0x88, 0xed, 0x5a, - 0x41, 0x84, 0x6a, 0xe0, 0x5a, 0xf5, 0x8f, 0x43, 0x2c, 0x8b, 0x4b, 0xc8, 0x3b, 0x10, 0x9b, 0x16, - 0xef, 0x01, 0xc0, 0x72, 0x1c, 0xfe, 0x71, 0x80, 0x65, 0x31, 0xf8, 0x9b, 0x2b, 0x80, 0x3b, 0x76, - 0x72, 0x09, 0x31, 0x3c, 0x68, 0xe3, 0x06, 0xf2, 0x14, 0xe8, 0x83, 0xf1, 0x96, 0xb6, 0x76, 0xad, - 0xe2, 0x8e, 0x27, 0xd6, 0xc2, 0xde, 0x35, 0xba, 0x93, 0x03, 0xa3, 0x9b, 0xc4, 0x2c, 0xe9, 0x66, - 0x24, 0x65, 0x19, 0x04, 0x8f, 0x0c, 0xd3, 0xeb, 0x64, 0x98, 0x76, 0x58, 0x7c, 0xf6, 0x8a, 0x44, - 0x1d, 0xd6, 0x73, 0x97, 0x3a, 0xd9, 0xcf, 0x3b, 0xe7, 0x6b, 0x29, 0x26, 0x73, 0x16, 0x52, 0xb8, - 0x80, 0x18, 0xd2, 0x05, 0xd9, 0xb0, 0x90, 0x4e, 0x87, 0xdc, 0xc6, 0xcd, 0x8e, 0x7b, 0x7d, 0x3a, - 0x68, 0x47, 0xe5, 0xb8, 0xe7, 0x66, 0xb4, 0x4b, 0xf3, 0xef, 0xc6, 0x8c, 0xb8, 0x8e, 0xe5, 0x3c, - 0xb0, 0xda, 0x0d, 0x5e, 0xbe, 0x98, 0xfb, 0xbe, 0x99, 0xfc, 0x25, 0xbd, 0xbc, 0xbc, 0x84, 0xef, - 0xb9, 0xf9, 0x3e, 0x3f, 0xa7, 0xe7, 0xe7, 0xe7, 0xc4, 0xfb, 0xc2, 0xb7, 0xdf, 0x03, 0xdf, 0xa4, - 0xe7, 0x90, 0xbe, 0x2c, 0xeb, 0xfa, 0xbe, 0xf9, 0x7e, 0x55, 0xd6, 0x9d, 0xdb, 0x6f, 0x83, 0x48, - 0x0b, 0x78, 0x72, 0xe8, 0x11, 0x30, 0x6a, 0x2a, 0xfb, 0xb9, 0x3e, 0xee, 0x01, 0xd7, 0x9f, 0x39, - 0x0a, 0x87, 0x38, 0x3b, 0xf0, 0x04, 0x60, 0xb2, 0x38, 0x5a, 0x0e, 0x70, 0x5d, 0x8d, 0x61, 0x63, - 0x0a, 0xd6, 0x67, 0x3a, 0xa3, 0x76, 0xda, 0x33, 0xeb, 0xec, 0x83, 0x84, 0xf5, 0x98, 0x96, 0x03, - 0xb2, 0xd5, 0x16, 0xae, 0xda, 0xa2, 0xac, 0xb6, 0x28, 0xab, 0x4d, 0x8e, 0x3a, 0x28, 0x60, 0xb4, - 0xd3, 0xa3, 0xa3, 0x11, 0xe6, 0xe0, 0xbe, 0xe7, 0xfb, 0xbb, 0xa3, 0x31, 0x82, 0x68, 0xb7, 0xcf, - 0xa9, 0xeb, 0x73, 0x5a, 0xf6, 0x39, 0xad, 0xfa, 0x2c, 0x0a, 0xc3, 0xe1, 0xf5, 0x9e, 0xbb, 0xd0, - 0xfb, 0x7b, 0x46, 0x41, 0x38, 0xd9, 0x3a, 0xad, 0x2b, 0x38, 0x1a, 0x7c, 0x76, 0x3c, 0x24, 0x8d, - 0x70, 0xeb, 0x29, 0x03, 0x5d, 0x6a, 0xd7, 0x29, 0xc6, 0x9b, 0x4e, 0xb1, 0xe1, 0xd3, 0x9a, 0xee, - 0xa8, 0xdb, 0x6b, 0x8b, 0x4e, 0xd6, 0x49, 0x02, 0xd9, 0x4d, 0x88, 0xaa, 0xc3, 0xa4, 0x6a, 0xb3, - 0x1a, 0xa4, 0x94, 0x8f, 0x9d, 0x41, 0xbe, 0x67, 0x40, 0x67, 0x6d, 0x85, 0x1f, 0x11, 0x4f, 0x4d, - 0xc7, 0x55, 0x7a, 0xc0, 0x43, 0x25, 0x66, 0xd2, 0x4e, 0x6c, 0x5c, 0x43, 0xe8, 0xc0, 0x8d, 0x95, - 0xe2, 0x63, 0xbe, 0x31, 0x53, 0xfb, 0xd0, 0x51, 0x75, 0x4e, 0x2f, 0xdb, 0xf1, 0xb0, 0x16, 0x8b, - 0x0d, 0xf1, 0x73, 0xc4, 0x2f, 0x07, 0x8e, 0xb7, 0x76, 0x3c, 0xdc, 0x73, 0x56, 0xc5, 0x66, 0xd1, - 0x40, 0x10, 0x03, 0x17, 0x9a, 0x17, 0x4b, 0xa8, 0x80, 0xd5, 0xb1, 0x0a, 0x0e, 0x44, 0xb0, 0x67, - 0x63, 0xde, 0x98, 0xe8, 0x84, 0x29, 0xc2, 0x4b, 0xc5, 0x19, 0x9e, 0xbd, 0xa1, 0x62, 0x86, 0x8b, - 0x02, 0x1f, 0xc4, 0x98, 0xd4, 0x9a, 0xd7, 0x4c, 0x6c, 0xbc, 0x43, 0x42, 0x90, 0xfb, 0xca, 0xd8, - 0x07, 0xd3, 0x87, 0xe7, 0xd4, 0xa9, 0x83, 0xfa, 0xdb, 0x5a, 0x65, 0x51, 0x3c, 0x0e, 0x8d, 0xfa, - 0x55, 0xeb, 0x38, 0xaa, 0xa9, 0xe1, 0x24, 0xd8, 0xd9, 0xc4, 0xd6, 0xc4, 0x86, 0xac, 0x18, 0x93, - 0x69, 0x18, 0xdd, 0x2c, 0xcc, 0x4a, 0x06, 0x5e, 0x94, 0x48, 0x11, 0xd5, 0xa6, 0xee, 0x17, 0x51, - 0x14, 0x9d, 0xf4, 0x07, 0x2f, 0xc8, 0x09, 0xec, 0x96, 0x27, 0xfe, 0xc9, 0xc0, 0x87, 0x34, 0xe4, - 0xfa, 0x27, 0x2f, 0xeb, 0x7c, 0xec, 0x35, 0xa0, 0x80, 0x6b, 0x3c, 0xf0, 0x5e, 0xad, 0xef, 0x4e, - 0x5e, 0x81, 0xc5, 0x0a, 0x81, 0x24, 0x60, 0xb1, 0xd8, 0xe9, 0x1e, 0x9d, 0xdb, 0xf7, 0xae, 0xbf, - 0xe7, 0xcc, 0xb1, 0x56, 0xcb, 0x40, 0xbd, 0xf3, 0xad, 0x66, 0x57, 0xfa, 0x97, 0xbd, 0x9e, 0xef, - 0xbf, 0xf0, 0xca, 0x19, 0xbb, 0xaf, 0xc7, 0xa7, 0xbc, 0xd4, 0xc8, 0x03, 0xbb, 0x2c, 0x54, 0x1e, - 0xd9, 0xe3, 0x11, 0x7e, 0xc0, 0x23, 0x9e, 0x4e, 0x4e, 0x74, 0xb2, 0xf6, 0x02, 0x48, 0x28, 0xe8, - 0xc4, 0x23, 0x11, 0x2e, 0xc8, 0x1c, 0x34, 0x07, 0x3b, 0xcd, 0xa9, 0x26, 0xdb, 0x52, 0x0d, 0x0e, - 0x4e, 0x7d, 0x62, 0x94, 0xe6, 0xc0, 0xdd, 0x20, 0x24, 0x2a, 0xe0, 0xbb, 0x0e, 0xf9, 0x4c, 0xc5, - 0x55, 0xd6, 0x87, 0xcd, 0xc2, 0x3d, 0x4d, 0x56, 0xe6, 0x98, 0x5b, 0xd1, 0xe4, 0x2e, 0x48, 0xe9, - 0x1d, 0xb9, 0x0f, 0x52, 0x7a, 0x0f, 0xfa, 0x4a, 0x43, 0x63, 0xb9, 0x6f, 0x68, 0x2c, 0xa9, 0xb6, - 0xea, 0x86, 0xae, 0xbc, 0x46, 0xba, 0xf6, 0x1a, 0xe9, 0xda, 0x6b, 0x54, 0xea, 0x2a, 0x10, 0xdc, - 0xe8, 0x28, 0x9b, 0xc8, 0x3d, 0x7d, 0x27, 0xaa, 0xf5, 0x1d, 0xb0, 0xd1, 0x1f, 0xd6, 0x77, 0x64, - 0xad, 0xef, 0x84, 0x47, 0x7d, 0xad, 0x63, 0xb7, 0x01, 0xcd, 0xe7, 0x7b, 0xf2, 0x52, 0xd2, 0x65, - 0xc6, 0x3b, 0x1e, 0x78, 0x97, 0x5e, 0x90, 0x81, 0x6f, 0x04, 0x25, 0xa9, 0x77, 0x71, 0x9f, 0x98, - 0xff, 0x6a, 0xc9, 0x6e, 0x45, 0xee, 0x64, 0x52, 0x20, 0xdf, 0xdc, 0xe5, 0x65, 0xf1, 0x81, 0xf7, - 0xc5, 0x71, 0xd6, 0x31, 0x35, 0xca, 0xba, 0xd4, 0x1e, 0x3c, 0x4f, 0x50, 0xe5, 0x71, 0x8d, 0x55, - 0xb7, 0x62, 0x06, 0xbb, 0xb7, 0x32, 0x67, 0x23, 0x11, 0x04, 0xf6, 0x55, 0xce, 0x6a, 0xf0, 0x4c, - 0x77, 0x12, 0x1b, 0x48, 0xd9, 0x4e, 0xc1, 0x3f, 0xdd, 0x41, 0x51, 0x37, 0xb1, 0xf1, 0x94, 0xed, - 0x08, 0x5b, 0xa9, 0x81, 0x8b, 0x7f, 0x5f, 0xd8, 0x8b, 0x39, 0x82, 0x70, 0x85, 0x4a, 0xec, 0x87, - 0xda, 0xca, 0x21, 0x32, 0x2f, 0xaf, 0x80, 0x31, 0x35, 0x32, 0xb1, 0xe9, 0x96, 0xc6, 0x8c, 0xef, - 0x0a, 0x29, 0x1c, 0xa0, 0x74, 0x5f, 0x40, 0x45, 0x26, 0x2e, 0x22, 0x72, 0x00, 0xf0, 0xa1, 0x78, - 0x72, 0x11, 0x5e, 0xe6, 0xb9, 0x8b, 0x56, 0xeb, 0x49, 0x00, 0x20, 0x0a, 0xff, 0x13, 0x02, 0xee, - 0x6b, 0x70, 0xd6, 0x3d, 0xc4, 0xf9, 0xc7, 0x25, 0x59, 0xd6, 0xb4, 0xd4, 0x2a, 0xb1, 0xf7, 0xb8, - 0xac, 0x79, 0x46, 0x37, 0xcf, 0x92, 0x1f, 0x49, 0xc9, 0xf0, 0x64, 0xfb, 0x90, 0x1c, 0xd1, 0xc9, - 0xc9, 0x34, 0xd1, 0x3a, 0x59, 0x79, 0x24, 0x84, 0x33, 0x71, 0xab, 0xb1, 0xed, 0xd5, 0x70, 0xf2, - 0x23, 0x1c, 0xfb, 0x13, 0x60, 0x6a, 0x4c, 0x62, 0xb0, 0x58, 0x34, 0xdc, 0xca, 0x3f, 0x24, 0x6a, - 0x7d, 0xca, 0x58, 0x54, 0xe0, 0x87, 0x68, 0x7e, 0x5f, 0xee, 0xf4, 0x9c, 0xdc, 0x71, 0x46, 0x7b, - 0x69, 0x11, 0x55, 0x47, 0x9e, 0xff, 0xae, 0x20, 0x9a, 0x8f, 0x1d, 0xc4, 0x89, 0x91, 0x48, 0x8d, - 0xcf, 0xfb, 0xe2, 0x31, 0xf9, 0x17, 0x35, 0xc7, 0x11, 0xed, 0x8d, 0xc3, 0x4a, 0x9e, 0x37, 0x8d, - 0xd1, 0xe4, 0xf9, 0xbf, 0x39, 0xba, 0x68, 0x77, 0x74, 0x51, 0x63, 0x74, 0x80, 0xe3, 0xe9, 0xee, - 0xe3, 0x93, 0x6c, 0xdb, 0x34, 0x3b, 0xcb, 0xa3, 0x4a, 0x15, 0xbc, 0x32, 0xfd, 0x19, 0x07, 0x9b, - 0xed, 0x68, 0xeb, 0xca, 0x8a, 0x82, 0xac, 0xf7, 0x40, 0x1c, 0x92, 0x52, 0xe3, 0x90, 0x37, 0xf0, - 0xa6, 0xb0, 0xda, 0xb5, 0x96, 0x50, 0x45, 0x14, 0xee, 0x2a, 0x40, 0x41, 0xbf, 0xef, 0xfb, 0x64, - 0x57, 0xe7, 0x09, 0x7a, 0x3d, 0x7e, 0x5e, 0x34, 0x5c, 0x3a, 0xb7, 0x95, 0xb0, 0x37, 0x87, 0x27, - 0x1c, 0x57, 0x82, 0xbe, 0x12, 0xe9, 0x09, 0x43, 0x7c, 0xe7, 0x0c, 0xa9, 0x94, 0xf0, 0xb8, 0x16, - 0xfc, 0x70, 0xfa, 0x69, 0xa4, 0x1c, 0xbc, 0x43, 0xf6, 0x27, 0x44, 0x68, 0x69, 0x89, 0x3e, 0x72, - 0x6e, 0x03, 0x67, 0x12, 0xbd, 0x57, 0x7e, 0xc7, 0x1c, 0xd6, 0x80, 0x02, 0x7d, 0xea, 0x63, 0xdc, - 0x46, 0x52, 0x9f, 0x99, 0xc8, 0x82, 0x94, 0x09, 0x27, 0x39, 0x13, 0x12, 0xb1, 0xdd, 0xa3, 0xa7, - 0xfd, 0x93, 0xab, 0x51, 0xb7, 0x17, 0xf4, 0x6a, 0xa1, 0xcb, 0x3b, 0xa9, 0x3d, 0xf7, 0x8b, 0x92, - 0x14, 0xc5, 0xb8, 0x0d, 0x47, 0x83, 0x59, 0x99, 0x97, 0xc2, 0x41, 0x06, 0x6e, 0x47, 0x95, 0xf0, - 0x25, 0x21, 0xfb, 0x9f, 0xd3, 0x18, 0xbc, 0x81, 0xcd, 0x3a, 0x76, 0xc4, 0x50, 0xfc, 0x0f, 0x88, - 0x79, 0x31, 0x47, 0xa7, 0xc7, 0x35, 0xfe, 0xe3, 0x98, 0xde, 0x3f, 0x4c, 0x3c, 0x51, 0x1a, 0xc1, - 0x69, 0x59, 0xd6, 0x15, 0xf8, 0x3a, 0x29, 0xb5, 0x56, 0x77, 0x7c, 0x72, 0xda, 0x1b, 0xee, 0x6d, - 0x23, 0x51, 0x63, 0x1b, 0x49, 0x8e, 0x6d, 0x23, 0xc9, 0xfe, 0x2e, 0x60, 0xa8, 0x85, 0xc5, 0xcf, - 0xde, 0x46, 0x9e, 0x02, 0xf0, 0x9f, 0xda, 0x46, 0xfe, 0x01, 0x04, 0xf4, 0x67, 0x37, 0x12, 0xf5, - 0x6f, 0x6c, 0x24, 0xa6, 0xa3, 0x37, 0xc0, 0xc5, 0x0f, 0xf4, 0x15, 0x92, 0x6d, 0xc3, 0x85, 0xa9, - 0x12, 0xb8, 0xbd, 0xf9, 0x0b, 0xf2, 0x3a, 0x88, 0x37, 0x8e, 0x6b, 0x3b, 0x57, 0x3e, 0xee, 0x78, - 0x33, 0xbe, 0xd8, 0x51, 0x9e, 0xf7, 0x4f, 0x64, 0xf7, 0xd9, 0x62, 0x5f, 0x43, 0x57, 0x7c, 0x46, - 0x4e, 0xee, 0x79, 0x1c, 0x27, 0xb7, 0xe4, 0x24, 0x16, 0x2b, 0x4e, 0x4e, 0xc2, 0xdf, 0xb3, 0x90, - 0x9c, 0x80, 0xbd, 0x43, 0x4e, 0x56, 0x21, 0xb8, 0x0b, 0x43, 0x72, 0xa2, 0xf8, 0x0c, 0x7b, 0xc1, - 0xd1, 0xd6, 0x55, 0x1d, 0xdb, 0xc4, 0x36, 0xb7, 0xa0, 0x4a, 0xc0, 0xa6, 0x75, 0xf1, 0x14, 0x4a, - 0x3e, 0x34, 0xe2, 0xaf, 0x1f, 0xc6, 0x4c, 0x73, 0xae, 0x30, 0x8e, 0x30, 0xae, 0xc7, 0x63, 0x3d, - 0x7a, 0x27, 0x51, 0x9c, 0xa4, 0x3c, 0xd5, 0xdd, 0x54, 0xcc, 0xb8, 0x35, 0x31, 0xc8, 0x89, 0x41, - 0xa8, 0x13, 0x66, 0x76, 0x28, 0x0e, 0x37, 0x3f, 0xc0, 0x52, 0x4a, 0x9e, 0xa6, 0xc6, 0x27, 0xf8, - 0xe0, 0xe0, 0xaa, 0x6a, 0xcf, 0x1d, 0x9b, 0x51, 0x38, 0x49, 0xb2, 0x86, 0x97, 0xa3, 0xef, 0x83, - 0x5e, 0x37, 0xb5, 0x4a, 0xde, 0x93, 0x58, 0xf8, 0xda, 0x88, 0x87, 0x47, 0x7a, 0xa9, 0x8c, 0x85, - 0xec, 0x89, 0xfd, 0x3e, 0xfe, 0xff, 0xbf, 0xdf, 0x47, 0xbb, 0xfb, 0x7d, 0xf4, 0xdc, 0xfd, 0x3e, - 0x6e, 0x8e, 0x23, 0xfe, 0x4f, 0xed, 0xf7, 0xd1, 0x38, 0xde, 0x1d, 0x5d, 0xbc, 0xb7, 0xdf, 0x83, - 0xec, 0xbb, 0x69, 0x1c, 0x79, 0x89, 0xfd, 0xb3, 0xcf, 0xfa, 0x00, 0x6c, 0x28, 0x8e, 0x1c, 0x83, - 0xda, 0x6d, 0x15, 0x1c, 0x7f, 0xee, 0xda, 0x5e, 0x43, 0xae, 0xf5, 0x6c, 0x9e, 0x39, 0xfa, 0x4a, - 0x59, 0x19, 0x2c, 0x6c, 0xe7, 0xf6, 0xed, 0x6e, 0xe6, 0x8c, 0xcf, 0xb9, 0x52, 0x7c, 0xb6, 0x97, - 0x2d, 0x66, 0xf0, 0xf6, 0xf1, 0x8c, 0x20, 0x38, 0xfb, 0xdb, 0x35, 0xb0, 0xca, 0xef, 0x60, 0xec, - 0x52, 0x13, 0x7c, 0xf4, 0xa0, 0xa8, 0x7a, 0xf2, 0x23, 0x9c, 0xcd, 0xac, 0x08, 0x37, 0xfb, 0x5f, - 0x79, 0x7d, 0xb5, 0x29, 0xdb, 0x7d, 0xdc, 0x78, 0x34, 0xe0, 0x50, 0x6d, 0xd1, 0x64, 0x6b, 0x3a, - 0x0a, 0xea, 0x89, 0x13, 0x37, 0x86, 0x06, 0x2a, 0x88, 0xb5, 0x88, 0x83, 0xd2, 0x7d, 0x54, 0x54, - 0xae, 0x47, 0xb1, 0x77, 0xf4, 0x2b, 0x1e, 0x3f, 0xfa, 0x15, 0xe6, 0x19, 0xd1, 0xe7, 0x1c, 0xfd, - 0x96, 0x33, 0xdb, 0x77, 0x8f, 0x57, 0x6f, 0x8b, 0x9b, 0xa8, 0x93, 0xc6, 0x18, 0xcb, 0x07, 0xd0, - 0x87, 0x4e, 0x6f, 0xe1, 0xb7, 0x27, 0x3f, 0x23, 0x5d, 0xdd, 0xa5, 0x81, 0x3a, 0xf6, 0xb0, 0xa8, - 0x71, 0x56, 0xec, 0x82, 0x14, 0x1d, 0x80, 0x74, 0x6d, 0x5e, 0x66, 0x94, 0xc4, 0x87, 0x30, 0x92, - 0x66, 0xc9, 0xe1, 0x1a, 0x34, 0xc2, 0x8a, 0x1c, 0x6f, 0x30, 0x59, 0x34, 0x51, 0x5d, 0x5f, 0x26, - 0xb6, 0x77, 0xfc, 0xb7, 0x87, 0x58, 0x2d, 0xeb, 0x57, 0x74, 0xb2, 0x12, 0x1a, 0x79, 0x76, 0x39, - 0xe0, 0xaa, 0xa8, 0x47, 0xc4, 0xde, 0x81, 0xae, 0x7b, 0x35, 0x7e, 0x0f, 0x2f, 0x3b, 0x87, 0xe2, - 0xbb, 0x73, 0xd1, 0xa4, 0x87, 0x21, 0x2c, 0x41, 0xba, 0x4b, 0xa4, 0xe8, 0xff, 0xd1, 0xbc, 0xdc, - 0x13, 0xe4, 0x8c, 0x35, 0x06, 0x55, 0x9e, 0x73, 0x3f, 0x46, 0xa5, 0xbc, 0x81, 0x02, 0xe5, 0xe2, - 0x1c, 0xe4, 0x1e, 0x12, 0x76, 0x9b, 0x1e, 0x3e, 0x41, 0x61, 0x5a, 0x37, 0x91, 0x01, 0xd7, 0x75, - 0x9f, 0x9a, 0x40, 0x63, 0xfc, 0xc5, 0x91, 0xb1, 0x54, 0x7d, 0x7a, 0x0d, 0xfc, 0x1d, 0x8e, 0xeb, - 0xb5, 0x15, 0x1c, 0x0f, 0xbd, 0xf1, 0x31, 0xdc, 0xa3, 0x5e, 0xff, 0xa9, 0xd5, 0x68, 0xac, 0x45, - 0xb9, 0x7e, 0xc5, 0xa1, 0x8c, 0x7a, 0xac, 0xa1, 0x78, 0x86, 0x88, 0x90, 0x0f, 0x4c, 0x38, 0x8e, - 0x9b, 0xb3, 0x4d, 0xf7, 0xa6, 0x9b, 0xc8, 0x07, 0xe7, 0x59, 0x06, 0x10, 0x58, 0x21, 0x39, 0x3c, - 0x78, 0x21, 0x78, 0xa4, 0x83, 0xb1, 0x7e, 0x40, 0xb4, 0x21, 0x35, 0xd6, 0x93, 0x3c, 0x37, 0x3f, - 0xf0, 0x12, 0x23, 0xae, 0x5e, 0x23, 0x11, 0x7b, 0x02, 0x75, 0xac, 0x27, 0xe6, 0x69, 0xe6, 0x83, - 0xdc, 0xa3, 0x70, 0xa5, 0x7b, 0xa9, 0xc5, 0xc6, 0x4f, 0xe0, 0xe2, 0x28, 0x3c, 0xe8, 0xb0, 0xd8, - 0x9f, 0xe7, 0x7c, 0xde, 0x9c, 0x68, 0x1d, 0x83, 0x07, 0x0b, 0xfa, 0xa7, 0xa6, 0x66, 0xb9, 0x54, - 0x39, 0xb4, 0x8c, 0xf5, 0xc4, 0xfe, 0x29, 0x88, 0x52, 0xec, 0x54, 0x4f, 0x28, 0x08, 0x4c, 0x7a, - 0x07, 0xc3, 0x80, 0xc5, 0x39, 0x7e, 0x5d, 0xb2, 0x0c, 0xe4, 0x30, 0x0f, 0xb8, 0xef, 0x3f, 0x80, - 0xd3, 0xed, 0x0d, 0xfd, 0x6b, 0x05, 0xcf, 0x49, 0x9b, 0xab, 0x81, 0x55, 0xf1, 0x58, 0x75, 0x7a, - 0x93, 0x32, 0x62, 0x63, 0x7f, 0x07, 0x1b, 0x9e, 0x9e, 0xee, 0xbf, 0x84, 0x63, 0x9e, 0x0d, 0xe0, - 0x76, 0x69, 0xe0, 0x07, 0x14, 0x7c, 0xd4, 0x58, 0x64, 0x53, 0x32, 0x7e, 0x7c, 0xbb, 0xd2, 0xe5, - 0x12, 0x58, 0x35, 0xdb, 0x82, 0xe9, 0xed, 0xcd, 0xb3, 0x29, 0x0c, 0x1f, 0xbc, 0x1e, 0xfa, 0x7f, - 0x37, 0xd5, 0xdd, 0x65, 0x1f, 0xba, 0x6d, 0x04, 0x1b, 0x14, 0x57, 0x43, 0x04, 0x3a, 0x8a, 0x12, - 0x19, 0x85, 0x1a, 0x09, 0x8c, 0x09, 0x6a, 0xce, 0xbd, 0x26, 0x4b, 0x71, 0x28, 0x03, 0xde, 0x9b, - 0x57, 0xc7, 0xd3, 0x43, 0xb9, 0x54, 0x49, 0x1c, 0x7d, 0x20, 0xd5, 0x53, 0xf1, 0x07, 0x3f, 0xda, - 0xc0, 0x01, 0x43, 0x65, 0xe8, 0x68, 0x71, 0xd8, 0xf4, 0xc8, 0x8b, 0x03, 0xcf, 0x91, 0x27, 0xa6, - 0x25, 0x6a, 0x8a, 0x84, 0x47, 0xe4, 0xf9, 0x3e, 0xe7, 0x9b, 0x07, 0xc3, 0x0e, 0x07, 0xcc, 0xe3, - 0xf2, 0x8f, 0x57, 0xec, 0x6e, 0x69, 0xe6, 0x7d, 0x2c, 0x2b, 0x4b, 0x0e, 0x40, 0x35, 0x36, 0xe6, - 0x3d, 0x79, 0xf2, 0x4c, 0x31, 0xdd, 0xd0, 0xce, 0xca, 0x67, 0x1e, 0x8e, 0x2a, 0x6c, 0x66, 0x24, - 0xa6, 0x24, 0xb0, 0x61, 0x49, 0x9e, 0x35, 0x4b, 0x0f, 0x65, 0x5f, 0xb3, 0xf8, 0x90, 0x09, 0x8d, - 0x05, 0xbb, 0x1f, 0x53, 0x05, 0xe3, 0x35, 0xd7, 0xcd, 0x46, 0x07, 0x9d, 0xd9, 0x08, 0xa5, 0x86, - 0x20, 0x25, 0x12, 0x07, 0xbd, 0xe3, 0x75, 0xed, 0x86, 0xb7, 0x5b, 0xb5, 0xcf, 0x58, 0xf5, 0x60, - 0x53, 0xb3, 0x2e, 0x44, 0x14, 0xed, 0x56, 0xdd, 0x27, 0x8d, 0xbd, 0xd8, 0xb9, 0xea, 0xd5, 0x3f, - 0x2b, 0x30, 0x64, 0x75, 0xd0, 0x51, 0x7a, 0x14, 0x76, 0x65, 0x19, 0xbc, 0xec, 0x8d, 0x24, 0x1b, - 0x6f, 0xab, 0x57, 0x84, 0x82, 0x5b, 0x5d, 0x90, 0xc6, 0xe7, 0x5a, 0x17, 0x13, 0xc2, 0x69, 0x6d, - 0xa2, 0x45, 0xf7, 0x26, 0xb2, 0x0f, 0x18, 0x63, 0xa7, 0x1a, 0xb1, 0x2f, 0xf1, 0xa7, 0xc1, 0xb6, - 0xe9, 0x12, 0xb3, 0x87, 0x7a, 0x45, 0x81, 0xf7, 0x0d, 0x2b, 0x63, 0x54, 0x19, 0xba, 0xf8, 0x51, - 0x44, 0x37, 0x60, 0x54, 0x89, 0x59, 0x00, 0x0e, 0x83, 0x32, 0xb4, 0xa8, 0x8c, 0xae, 0xe3, 0xd4, - 0xa5, 0x8a, 0x82, 0xc8, 0x3d, 0x9b, 0xa9, 0xb1, 0x23, 0xd5, 0xef, 0x20, 0x99, 0x73, 0x12, 0x37, - 0x98, 0xda, 0x87, 0x23, 0x8e, 0xb9, 0x70, 0x14, 0xd9, 0x42, 0x2c, 0x8f, 0xfb, 0x2b, 0x1a, 0xa5, - 0x3f, 0x27, 0xdb, 0x23, 0x01, 0xab, 0x4b, 0x82, 0x5b, 0xda, 0x98, 0xa8, 0x41, 0xe6, 0x0c, 0x21, - 0x69, 0x0c, 0x11, 0x5c, 0xc6, 0x67, 0xdd, 0x3c, 0xe9, 0x3d, 0xb4, 0xfc, 0x7d, 0xee, 0xfb, 0xa5, - 0x93, 0x02, 0x92, 0x96, 0x1c, 0xed, 0x31, 0x4a, 0xa9, 0x95, 0x8f, 0x27, 0xc4, 0x45, 0x16, 0x07, - 0x97, 0x64, 0xef, 0xa0, 0x2a, 0xf0, 0x36, 0x5c, 0x69, 0x11, 0x85, 0x71, 0xe9, 0xcc, 0x7a, 0xdd, - 0x84, 0xd0, 0xf0, 0x10, 0x06, 0x3e, 0x69, 0x1a, 0x5e, 0xc1, 0x2b, 0x72, 0x68, 0x9d, 0x59, 0x4f, - 0x68, 0x65, 0x8c, 0x35, 0x3f, 0x7f, 0xdc, 0x75, 0x8f, 0x92, 0x5d, 0x8b, 0x1c, 0xec, 0xc1, 0xda, - 0xe1, 0x11, 0xb8, 0x8f, 0xc6, 0x28, 0x77, 0x43, 0xc8, 0x49, 0x7d, 0xb5, 0xc6, 0xf6, 0xb1, 0x13, - 0x68, 0xd9, 0xeb, 0x93, 0x2a, 0xfc, 0xda, 0xfe, 0x69, 0x19, 0xb2, 0xad, 0x51, 0x51, 0x52, 0x82, - 0x0b, 0xab, 0x04, 0x42, 0xb1, 0x7f, 0x0d, 0xc3, 0xda, 0x2b, 0x9e, 0xc3, 0xba, 0x47, 0x6c, 0x24, - 0xa5, 0x05, 0x60, 0x4d, 0x84, 0x95, 0x26, 0x77, 0x9a, 0x7c, 0xd6, 0xe4, 0x9d, 0x26, 0xef, 0x35, - 0x43, 0x6f, 0x9b, 0x56, 0x0b, 0x5a, 0x69, 0x76, 0xd3, 0xb4, 0x47, 0xf6, 0x48, 0xe4, 0xad, 0x26, - 0x2b, 0x8d, 0xc9, 0x5b, 0x4d, 0xdf, 0xb2, 0x95, 0x26, 0x6f, 0x75, 0xc3, 0x61, 0xfb, 0x16, 0xe2, - 0xd0, 0xdd, 0x76, 0x2f, 0x88, 0x62, 0x0f, 0xbc, 0x4a, 0x6a, 0x28, 0xbe, 0xd1, 0x8c, 0x57, 0x97, - 0x9e, 0x64, 0xf3, 0x21, 0x1d, 0x57, 0x7d, 0x24, 0xeb, 0xd7, 0x4d, 0x7f, 0xcf, 0xb8, 0xba, 0xff, - 0xc0, 0x63, 0x6e, 0x1e, 0xfa, 0x83, 0x97, 0xbd, 0x77, 0xfe, 0x96, 0x86, 0x30, 0x81, 0x9b, 0xe6, - 0xaf, 0x53, 0x58, 0x41, 0xdd, 0x78, 0xf5, 0xeb, 0x81, 0x68, 0x02, 0x92, 0x0d, 0x57, 0x54, 0xc0, - 0x3b, 0x8b, 0xc2, 0xbe, 0xf5, 0xc4, 0x99, 0xf9, 0x1b, 0x32, 0x8c, 0x25, 0xf6, 0xdd, 0xf6, 0xc0, - 0x18, 0x6e, 0x32, 0xcf, 0x25, 0x95, 0x44, 0xb3, 0x2a, 0x10, 0x15, 0x74, 0x1d, 0x92, 0xc1, 0x7e, - 0x0c, 0x7f, 0x99, 0x04, 0x1e, 0xf1, 0x96, 0x4c, 0x07, 0x10, 0x45, 0x26, 0x31, 0x24, 0x09, 0x87, - 0x3f, 0x54, 0x72, 0x47, 0x1a, 0x8f, 0x95, 0xef, 0xff, 0x15, 0x19, 0xf8, 0x6b, 0x06, 0x6a, 0x34, - 0x16, 0x93, 0x80, 0xdb, 0xae, 0x76, 0x1e, 0x51, 0x95, 0xcd, 0x47, 0x54, 0x49, 0x46, 0xc0, 0xe5, - 0x61, 0xfe, 0xf6, 0x09, 0xfc, 0x95, 0x99, 0x0c, 0x14, 0x39, 0xb4, 0x44, 0xab, 0x23, 0x4e, 0xd8, - 0xed, 0x7e, 0x24, 0x5e, 0xa9, 0x10, 0x9b, 0x1b, 0x7c, 0x70, 0x75, 0x40, 0x61, 0xe2, 0xc5, 0x49, - 0x08, 0xac, 0x04, 0x2f, 0x88, 0x36, 0x82, 0x2f, 0xc3, 0xd9, 0xbd, 0xd9, 0x74, 0x46, 0x1c, 0x35, - 0x1e, 0x95, 0x3d, 0x08, 0x1a, 0xf5, 0xbe, 0x79, 0xff, 0xce, 0x3c, 0x62, 0x2c, 0xf5, 0x0f, 0x49, - 0x38, 0x83, 0xfb, 0xf1, 0x80, 0x76, 0x87, 0x6b, 0xf4, 0x59, 0xb3, 0x3b, 0xf8, 0x3f, 0xcf, 0xb7, - 0x05, 0xa6, 0x1b, 0xae, 0x52, 0x91, 0x48, 0xe6, 0x0d, 0xe8, 0x80, 0xf6, 0x3d, 0xf2, 0x59, 0x53, - 0x6b, 0xbf, 0xfc, 0x5c, 0x25, 0xad, 0xb4, 0x63, 0xef, 0x35, 0x41, 0xef, 0x34, 0xfb, 0xac, 0x69, - 0x26, 0xf2, 0x1c, 0x99, 0x5f, 0xf3, 0x07, 0x00, 0xe8, 0x92, 0x2d, 0xc9, 0x3b, 0xa8, 0xec, 0xc4, - 0xd9, 0xd7, 0xf0, 0xb6, 0xe4, 0x02, 0x28, 0x98, 0x5a, 0xc6, 0x65, 0x53, 0xf3, 0x61, 0x8f, 0xd7, - 0xd9, 0xda, 0x7c, 0x18, 0xef, 0x14, 0xbb, 0x35, 0xe9, 0xaf, 0x93, 0x3b, 0x76, 0x0f, 0x74, 0x5f, - 0xe0, 0xe1, 0xff, 0x01, 0xdb, 0x7f, 0xac, 0xfd, 0xf1, 0x6d, 0x00, 0x00 -}; - diff --git a/wled00/json.cpp b/wled00/json.cpp index 1c25433bde..dded3ea75e 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -796,10 +796,11 @@ void serializeInfo(JsonObject root) int qrssi = WiFi.RSSI(); wifi_info[F("rssi")] = qrssi; wifi_info[F("signal")] = getSignalQuality(qrssi); + constexpr int WIFI_5GHZ_MIN_CHANNEL = 36; int wifiChannel = WiFi.channel(); wifi_info[F("channel")] = wifiChannel; if (wifiChannel > 0) { - wifi_info[F("band")] = (wifiChannel >= 36) ? F("5GHz") : F("2.4GHz"); + wifi_info[F("band")] = (wifiChannel >= WIFI_5GHZ_MIN_CHANNEL) ? F("5GHz") : F("2.4GHz"); } wifi_info[F("ap")] = apActive; @@ -815,7 +816,7 @@ void serializeInfo(JsonObject root) wifi_info[F("txPower")] = (int) WiFi.getTxPower(); wifi_info[F("sleep")] = (bool) WiFi.getSleep(); #endif - #if !defined(CONFIG_IDF_TARGET_ESP32C2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C5) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(CONFIG_IDF_TARGET_ESP32C6) && !defined(CONFIG_IDF_TARGET_ESP32P4) + #if defined(CONFIG_IDF_TARGET_ESP32) root[F("arch")] = "esp32"; #else root[F("arch")] = ESP.getChipModel(); diff --git a/wled00/ota_update.cpp b/wled00/ota_update.cpp index e91e5a98c0..6748e6e7b1 100644 --- a/wled00/ota_update.cpp +++ b/wled00/ota_update.cpp @@ -410,6 +410,7 @@ bool verifyBootloaderImage(const uint8_t* &buffer, size_t &len, String* bootload // 0x000C = ESP32-C2 // 0x000D = ESP32-C6 // 0x0010 = ESP32-H2 + // 0x0017 = ESP32-C5 #if defined(CONFIG_IDF_TARGET_ESP32) if (chipId != 0x0000) { diff --git a/wled00/wled.cpp b/wled00/wled.cpp index a2d97b077f..ebbbdec72f 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -874,7 +874,7 @@ void WLED::handleConnection() DEBUG_PRINT(F("Connected! IP address: ")); DEBUG_PRINTLN(WLEDNetwork.localIP()); #if defined(CONFIG_IDF_TARGET_ESP32C5) - { int32_t ch = WiFi.channel(); DEBUG_PRINTF_P(PSTR("WiFi channel: %d (%s)\n"), ch, (ch >= 36) ? "5GHz" : "2.4GHz"); } + { constexpr int kFirst5GHzChannel = 36; int32_t ch = WiFi.channel(); DEBUG_PRINTF_P(PSTR("WiFi channel: %d (%s)\n"), ch, (ch >= kFirst5GHzChannel) ? "5GHz" : "2.4GHz"); } #endif if (improvActive) { if (improvError == 3) sendImprovStateResponse(0x00, true); diff --git a/wled00/wled.h b/wled00/wled.h index 02002d9fe8..e53781b575 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -154,7 +154,9 @@ #endif #ifdef WLED_ENABLE_DMX - #if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32S2) + #if defined(CONFIG_IDF_TARGET_ESP32C5) + #error "DMX output is not supported on ESP32-C5 (esp_dmx library excluded)" + #elif defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32S2) #include "src/dependencies/dmx/ESPDMX.h" #else //ESP32 #include "src/dependencies/dmx/SparkFunDMX.h" @@ -469,7 +471,9 @@ WLED_GLOBAL bool arlsDisableGammaCorrection _INIT(true); // activate if WLED_GLOBAL bool arlsForceMaxBri _INIT(false); // enable to force max brightness if source has very dark colors that would be black #ifdef WLED_ENABLE_DMX - #if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C5) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32S2) + #if defined(CONFIG_IDF_TARGET_ESP32C5) + #error "DMX output is not supported on ESP32-C5 (esp_dmx library excluded)" + #elif defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32S2) WLED_GLOBAL DMXESPSerial dmx; #else //ESP32 WLED_GLOBAL SparkFunDMX dmx; From d2e6a568baf3a70393f457a830e09de8cee08a52 Mon Sep 17 00:00:00 2001 From: Jonny Davey Date: Sat, 7 Feb 2026 21:52:22 +0000 Subject: [PATCH 6/7] Use NeoPixelBus fork with ESP32-C5 bit-bang and I2S fixes Replace upstream NeoPixelBus with jonny190/NeoPixelBus fork (d4bbe3f) which adds C5 to the I2S exclusion guard and fixes the bit-bang LED output method (cycle counter CSR 0xC00, GPIO register types). Spell out C5 lib_deps explicitly to avoid pulling both the upstream and fork NeoPixelBus, which causes duplicate compilation errors. Upstream PR: https://github.com/netmindz/NeoPixelBus/pull/1 --- platformio.ini | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 9e7b612584..1c7a992b59 100644 --- a/platformio.ini +++ b/platformio.ini @@ -474,9 +474,17 @@ build_flags = -g ;; ARDUINO_USB_CDC_ON_BOOT ${esp32_idf_V5.build_flags} lib_deps = - ${esp32_idf_V5.lib_deps} + ;; NB: we spell out deps explicitly (instead of ${esp32_idf_V5.lib_deps}) to replace + ;; the upstream NeoPixelBus with a C5-patched fork; using both causes duplicate compilation. + ${esp32_all_variants.lib_deps} + fastled/FastLED @ 3.10.1 + https://github.com/jonny190/NeoPixelBus.git#d4bbe3f899a9d7c39ff4569827b2cf4665b3b64d ;; C5 support: I2S exclusion + bit-bang CSR/GPIO fixes on top of netmindz CORE3 + https://github.com/Aircoookie/ESPAsyncWebServer.git#v2.4.2 + marvinroger/AsyncMqttClient @ 0.9.0 + https://github.com/blazoncek/QuickESPNow.git#optional-debug lib_ignore = ${esp32_idf_V5.lib_ignore} esp_dmx ;; esp_dmx library doesn't support C5 UART registers yet +extra_scripts = ${scripts_defaults.extra_scripts} [env:esp32c5dev] ;; ESP32-C5 "devkit C" with 4MB flash, no PSRAM - EXPERIMENTAL From 1a025f563639959ec039b19cd81542ea796fdeca Mon Sep 17 00:00:00 2001 From: Jonny Davey Date: Sun, 8 Feb 2026 11:20:29 +0000 Subject: [PATCH 7/7] Fix MAC address on ESP32-C5 and update NeoPixelBus fork - Fix WiFi.macAddress() returning all zeros on ESP32-C5 by falling back to esp_read_mac() when WiFi netif is not yet created - Update NeoPixelBus fork to latest with channel ctor overload fix - Enable WLED_DEBUG, remove WLED_DISABLE_WEBSOCKETS for C5 build --- platformio.ini | 4 ++-- wled00/wled.cpp | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 1c7a992b59..a2e2c4e079 100644 --- a/platformio.ini +++ b/platformio.ini @@ -478,7 +478,7 @@ lib_deps = ;; the upstream NeoPixelBus with a C5-patched fork; using both causes duplicate compilation. ${esp32_all_variants.lib_deps} fastled/FastLED @ 3.10.1 - https://github.com/jonny190/NeoPixelBus.git#d4bbe3f899a9d7c39ff4569827b2cf4665b3b64d ;; C5 support: I2S exclusion + bit-bang CSR/GPIO fixes on top of netmindz CORE3 + https://github.com/jonny190/NeoPixelBus.git#103cfb585ef8efcdd6645ebb9938bf7012d093fd ;; C5 support: I2S exclusion, bit-bang CSR/GPIO, channel ctor overload https://github.com/Aircoookie/ESPAsyncWebServer.git#v2.4.2 marvinroger/AsyncMqttClient @ 0.9.0 https://github.com/blazoncek/QuickESPNow.git#optional-debug @@ -502,7 +502,7 @@ build_flags = ${common.build_flags} ${esp32c5.build_flags} -D WLED_RELEASE_NAME= -D WLED_DISABLE_INFRARED ;; library not compatible with -C5 -D WLED_DISABLE_ESPNOW ;; not yet tested -D WLED_DISABLE_ALEXA ;; compile errors - -D WLED_DISABLE_WEBSOCKETS ;; not yet tested + -D WLED_DEBUG upload_speed = 460800 lib_deps = ${esp32c5.lib_deps} lib_ignore = ${esp32c5.lib_ignore} diff --git a/wled00/wled.cpp b/wled00/wled.cpp index ebbbdec72f..c5a5594b79 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -1,6 +1,9 @@ #define WLED_DEFINE_GLOBAL_VARS //only in one source file, wled.cpp! #include "wled.h" #include "wled_ethernet.h" +#ifdef ARDUINO_ARCH_ESP32 +#include "esp_mac.h" +#endif #include "ota_update.h" #ifdef WLED_ENABLE_AOTA #define NO_OTA_PORT @@ -442,6 +445,18 @@ void WLED::setup() escapedMac = WiFi.macAddress(); escapedMac.replace(":", ""); escapedMac.toLowerCase(); +#ifdef ARDUINO_ARCH_ESP32 + // WiFi.macAddress() may return all zeros if the WiFi netif is not yet created + // (e.g. on ESP32-C5 where WiFi.mode() hasn't been called yet). Fall back to + // reading the base MAC directly from eFuse. + if (escapedMac == "000000000000") { + uint8_t mac[6] = {0}; + esp_read_mac(mac, ESP_MAC_WIFI_STA); + char buf[13]; + sprintf(buf, "%02x%02x%02x%02x%02x%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + escapedMac = buf; + } +#endif WLED_SET_AP_SSID(); // otherwise it is empty on first boot until config is saved multiWiFi.push_back(WiFiConfig(CLIENT_SSID,CLIENT_PASS)); // initialise vector with default WiFi