Merge branch 'MoonModules:mdev' into mdev

This commit is contained in:
tonyxforce
2023-09-10 19:05:07 +00:00
committed by GitHub
16 changed files with 1552 additions and 1462 deletions

View File

@@ -21,6 +21,7 @@ void shortPressAction(uint8_t b)
case 1: ++effectCurrent %= strip.getModeCount(); stateChanged = true; colorUpdated(CALL_MODE_BUTTON); break;
}
} else {
unloadPlaylist(); // applying a preset unloads the playlist
applyPreset(macroButton[b], CALL_MODE_BUTTON_PRESET);
}
@@ -42,6 +43,7 @@ void longPressAction(uint8_t b)
case 1: bri += 8; stateUpdated(CALL_MODE_BUTTON); buttonPressedTime[b] = millis(); break; // repeatable action
}
} else {
unloadPlaylist(); // applying a preset unloads the playlist
applyPreset(macroLongPress[b], CALL_MODE_BUTTON_PRESET);
}
@@ -63,6 +65,7 @@ void doublePressAction(uint8_t b)
case 1: ++effectPalette %= strip.getPaletteCount(); colorUpdated(CALL_MODE_BUTTON); break;
}
} else {
unloadPlaylist(); // applying a preset unloads the playlist
applyPreset(macroDoublePress[b], CALL_MODE_BUTTON_PRESET);
}
@@ -262,7 +265,7 @@ void handleButton()
shortPressAction(b);
buttonPressedBefore[b] = true;
buttonPressedTime[b] = now; // continually update (for debouncing to work in release handler)
return;
continue;
}
if (!buttonPressedBefore[b]) buttonPressedTime[b] = now;
@@ -283,7 +286,7 @@ void handleButton()
// released after rising-edge short press action
if (macroButton[b] && macroButton[b] == macroLongPress[b] && macroButton[b] == macroDoublePress[b]) {
if (dur > WLED_DEBOUNCE_THRESHOLD) buttonPressedBefore[b] = false; // debounce, blocks button for 50 ms once it has been released
return;
continue;
}
if (dur < WLED_DEBOUNCE_THRESHOLD) {buttonPressedBefore[b] = false; continue;} // too short "press", debounce

View File

@@ -422,7 +422,11 @@
#else
#if defined(BOARD_HAS_PSRAM) && (defined(WLED_USE_PSRAM) || defined(WLED_USE_PSRAM_JSON))
#if defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32C3)
#define JSON_BUFFER_SIZE 48000 // WLEDMM
#if defined(ARDUINO_ARCH_ESP32C3)
#define JSON_BUFFER_SIZE 46000 // WLEDMM - max 46KB on -C3 with PSRAM (chip has 400kb RAM)
#else
#define JSON_BUFFER_SIZE 36000 // WLEDMM - max 36KB on -S2 with PSRAM (chip has 320kb RAM)
#endif
#else
#define JSON_BUFFER_SIZE 56000 // WLEDMM (was 60000) slightly reduced to avoid build error "region dram0_0_seg overflowed"
#endif

View File

@@ -676,8 +676,7 @@ function populateInfo(i)
if (i.ver.includes("0.14.1")) vcn = "Sitting Ducks"; // easter egg
if (i.ver.includes("0.14.0")) vcn = "Lupo"; // check for MM versioning scheme
if (i.ver.includes("0.14.0-b15")) vcn = "Sitting Ducks"; // late easter egg
if (i.ver.includes("0.14.0-b25")) vcn = "This is the way"; // recently watched The Mandalorian? I have spoken ;-)
if (i.ver.includes("0.14.0-b26")) vcn = "This is the way";
if (i.ver.includes("0.14.0-b2")) vcn = "This is the way"; // recently watched The Mandalorian? I have spoken ;-)
if (i.ver.includes("0.14.0-b15.22")) vcn = "Lupo";
cn += `v${i.ver} &nbsp;<i>"${vcn}"</i><p>(WLEDMM_${i.ver} ${i.rel}.bin)</p><p><em>build ${i.vid}</em></p><table>
${urows}

View File

@@ -99,10 +99,20 @@ void sendHuePoll();
void onHueData(void* arg, AsyncClient* client, void *data, size_t len);
//improv.cpp
enum ImprovRPCType {
Command_Wifi = 0x01,
Request_State = 0x02,
Request_Info = 0x03,
Request_Scan = 0x04
};
void handleImprovPacket();
void sendImprovRPCResult(ImprovRPCType type, uint8_t n_strings = 0, const char **strings = nullptr);
void sendImprovStateResponse(uint8_t state, bool error = false);
void sendImprovInfoResponse();
void sendImprovRPCResponse(uint8_t commandId);
void startImprovWifiScan();
void handleImprovWifiScan();
void sendImprovIPRPCResult(ImprovRPCType type);
//ir.cpp
void applyRepeatActions();
@@ -165,9 +175,11 @@ void handleTransitions();
void handleNightlight();
byte __attribute__((pure)) scaledBri(byte in); // WLEDMM: added attribute pure
#ifdef WLED_ENABLE_LOXONE
//lx_parser.cpp
bool parseLx(int lxValue, byte* rgbw);
void parseLxJson(int lxValue, byte segId, bool secondary);
#endif
//mqtt.cpp
bool initMqtt();
@@ -222,7 +234,7 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply=tru
//udp.cpp
void notify(byte callMode, bool followUp=false);
uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, byte *buffer, uint8_t bri=255, bool isRGBW=false);
uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8_t *buffer, uint8_t bri=255, bool isRGBW=false);
void realtimeLock(uint32_t timeoutMs, byte md = REALTIME_MODE_GENERIC);
void exitRealtime();
void handleNotifications();

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -10,6 +10,11 @@
#define DIMPROV_PRINTF(x...)
#endif
#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S3)
#undef WLED_DISABLE_IMPROV_WIFISCAN
#define WLED_DISABLE_IMPROV_WIFISCAN
#endif
#define IMPROV_VERSION 1
void parseWiFiCommand(char *rpcData);
@@ -28,20 +33,14 @@ enum ImprovPacketByte {
RPC_CommandType = 9
};
enum ImprovRPCType {
Command_Wifi = 0x01,
Request_State = 0x02,
Request_Info = 0x03
};
//File dbgf;
#ifndef WLED_DISABLE_IMPROV_WIFISCAN
static bool improvWifiScanRunning = false;
#endif
//blocking function to parse an Improv Serial packet
void handleImprovPacket() {
uint8_t header[6] = {'I','M','P','R','O','V'};
//dbgf = WLED_FS.open("/improv.log","a");
bool timeout = false;
uint8_t waitTime = 25;
uint16_t packetByte = 0;
@@ -62,12 +61,11 @@ void handleImprovPacket() {
byte next = Serial.read();
DIMPROV_PRINT("Received improv byte: "); DIMPROV_PRINTF("%x\r\n",next);
//f.write(next);
switch (packetByte) {
case ImprovPacketByte::Version: {
if (next != IMPROV_VERSION) {
DIMPROV_PRINTLN(F("Invalid version"));
//dbgf.close();
return;
}
break;
@@ -75,7 +73,6 @@ void handleImprovPacket() {
case ImprovPacketByte::PacketType: {
if (next != ImprovPacketType::RPC_Command) {
DIMPROV_PRINTF("Non RPC-command improv packet type %i\n",next);
//dbgf.close();
return;
}
if (!improvActive) improvActive = 1;
@@ -89,7 +86,6 @@ void handleImprovPacket() {
if (checksum != next) {
DIMPROV_PRINTF("Got RPC checksum %i, expected %i",next,checksum);
sendImprovStateResponse(0x01, true);
//dbgf.close();
return;
}
@@ -100,22 +96,23 @@ void handleImprovPacket() {
if (WLED_WIFI_CONFIGURED) improvState = 0x03; //provisioning
if (Network.isConnected()) improvState = 0x04; //provisioned
sendImprovStateResponse(improvState, false);
if (improvState == 0x04) sendImprovRPCResponse(ImprovRPCType::Request_State);
if (improvState == 0x04) sendImprovIPRPCResult(ImprovRPCType::Request_State);
break;
}
case ImprovRPCType::Request_Info: sendImprovInfoResponse(); break;
#ifndef WLED_DISABLE_IMPROV_WIFISCAN
case ImprovRPCType::Request_Scan: startImprovWifiScan(); break;
#endif
default: {
DIMPROV_PRINTF("Unknown RPC command %i\n",next);
sendImprovStateResponse(0x02, true);
}
}
//dbgf.close();
return;
}
if (packetByte < 6) { //check header
if (next != header[packetByte]) {
DIMPROV_PRINTLN(F("Invalid improv header"));
//dbgf.close();
return;
}
} else if (packetByte > 9) { //RPC data
@@ -128,7 +125,6 @@ void handleImprovPacket() {
checksum += next;
packetByte++;
}
//dbgf.close();
}
void sendImprovStateResponse(uint8_t state, bool error) {
@@ -147,79 +143,116 @@ void sendImprovStateResponse(uint8_t state, bool error) {
Serial.write('\n');
}
void sendImprovRPCResponse(byte commandId) {
// used by sendImprovIPRPCResult(), sendImprovInfoResponse(), and handleImprovWifiScan()
void sendImprovRPCResult(ImprovRPCType type, uint8_t n_strings, const char **strings) {
if (improvError > 0 && improvError < 3) sendImprovStateResponse(0x00, true);
uint8_t packetLen = 12;
char out[64] = {'I','M','P','R','O','V'};
char out[256] = {'I','M','P','R','O','V'};
out[6] = IMPROV_VERSION;
out[7] = ImprovPacketType::RPC_Response;
out[8] = 2; //Length (set below)
out[9] = commandId;
out[10] = 0; //Data len (set below)
out[11] = '\0'; //URL len (set below)
//out[8] = 2; //Length (set below)
out[9] = type;
//out[10] = 0; //Data len (set below)
uint16_t pos = 11;
if (Network.isConnected())
{
IPAddress localIP = Network.localIP();
uint8_t len = sprintf(out+12, "http://%d.%d.%d.%d", localIP[0], localIP[1], localIP[2], localIP[3]);
if (len > 24) return; //sprintf fail?
out[11] = len;
out[10] = 1 + len;
out[8] = 3 + len; //RPC command type + data len + url len + url
packetLen = 13 + len;
for (uint8_t s = 0; s < n_strings; s++) {
size_t len = strlen(strings[s]);
if (pos + len > 254) continue; // simple buffer overflow guard
out[pos++] = len;
strcpy(out + pos, strings[s]);
pos += len;
}
packetLen = pos +1;
out[8] = pos -9; // Length of packet (excluding first 9 header bytes and final checksum byte)
out[10] = pos -11; // Data len
uint8_t checksum = 0;
for (uint8_t i = 0; i < packetLen -1; i++) checksum += out[i];
out[packetLen -1] = checksum;
Serial.write((uint8_t*)out, packetLen);
Serial.write('\n');
DIMPROV_PRINT("RPC result checksum");
DIMPROV_PRINTLN(checksum);
}
void sendImprovIPRPCResult(ImprovRPCType type) {
if (Network.isConnected())
{
char urlStr[64];
IPAddress localIP = Network.localIP();
uint8_t len = sprintf(urlStr, "http://%d.%d.%d.%d", localIP[0], localIP[1], localIP[2], localIP[3]);
if (len > 24) return; //sprintf fail?
const char *str[1] = {urlStr};
sendImprovRPCResult(type, 1, str);
} else {
sendImprovRPCResult(type, 0);
}
improvActive = 1; //no longer provisioning
}
void sendImprovInfoResponse() {
if (improvError > 0 && improvError < 3) sendImprovStateResponse(0x00, true);
uint8_t packetLen = 12;
char out[128] = {'I','M','P','R','O','V'};
out[6] = IMPROV_VERSION;
out[7] = ImprovPacketType::RPC_Response;
//out[8] = 2; //Length (set below)
out[9] = ImprovRPCType::Request_Info;
//out[10] = 0; //Data len (set below)
out[11] = 4; //Firmware len ("WLED")
out[12] = 'W'; out[13] = 'L'; out[14] = 'E'; out[15] = 'D';
uint8_t lengthSum = 17;
uint8_t vlen = sprintf_P(out+lengthSum,PSTR("0.14.0-b26.30/%i"),VERSION);
out[16] = vlen; lengthSum += vlen;
uint8_t hlen = 7;
#ifdef ESP8266
strcpy(out+lengthSum+1,"esp8266");
#else
hlen = 5;
strcpy(out+lengthSum+1,"esp32");
#endif
out[lengthSum] = hlen;
lengthSum += hlen + 1;
const char* bString =
#ifdef ESP8266
"esp8266"
#elif CONFIG_IDF_TARGET_ESP32C3
"esp32-c3"
#elif CONFIG_IDF_TARGET_ESP32S2
"esp32-s2"
#elif CONFIG_IDF_TARGET_ESP32S3
"esp32-s3"
#else // ESP32
"esp32"
#endif
;
//Use serverDescription if it has been changed from the default "WLED", else mDNS name
bool useMdnsName = (strcmp(serverDescription, "WLED") == 0 && strlen(cmDNS) > 0);
strcpy(out+lengthSum+1,useMdnsName ? cmDNS : serverDescription);
uint8_t nlen = strlen(useMdnsName ? cmDNS : serverDescription);
out[lengthSum] = nlen;
lengthSum += nlen + 1;
char vString[32];
snprintf_P(vString, sizeof(vString)-1, PSTR("0.14.0-b27.31/%i"),VERSION);
const char *str[4] = {"WLED", vString, bString, useMdnsName ? cmDNS : serverDescription};
packetLen = lengthSum +1;
out[8] = lengthSum -9;
out[10] = lengthSum -11;
uint8_t checksum = 0;
for (uint8_t i = 0; i < packetLen -1; i++) checksum += out[i];
out[packetLen -1] = checksum;
Serial.write((uint8_t*)out, packetLen);
Serial.write('\n');
DIMPROV_PRINT("Info checksum");
DIMPROV_PRINTLN(checksum);
sendImprovRPCResult(ImprovRPCType::Request_Info, 4, str);
}
#ifndef WLED_DISABLE_IMPROV_WIFISCAN
void startImprovWifiScan() {
if (improvWifiScanRunning) return;
WiFi.scanNetworks(true);
improvWifiScanRunning = true;
}
void handleImprovWifiScan() {
if (!improvWifiScanRunning) return;
int16_t status = WiFi.scanComplete();
if (status == WIFI_SCAN_RUNNING) return;
// here scan completed or failed (-2)
improvWifiScanRunning = false;
for (int i = 0; i < status; i++) {
char rssiStr[8];
sprintf(rssiStr, "%d", WiFi.RSSI(i));
#ifdef ESP8266
bool isOpen = WiFi.encryptionType(i) == ENC_TYPE_NONE;
#else
bool isOpen = WiFi.encryptionType(i) == WIFI_AUTH_OPEN;
#endif
char ssidStr[33];
strcpy(ssidStr, WiFi.SSID(i).c_str());
const char *str[3] = {ssidStr, rssiStr, isOpen ? "NO":"YES"};
sendImprovRPCResult(ImprovRPCType::Request_Scan, 3, str);
}
sendImprovRPCResult(ImprovRPCType::Request_Scan, 0);
WiFi.scanDelete();
}
#else
void startImprovWifiScan() {}
void handleImprovWifiScan() {}
#endif
void parseWiFiCommand(char* rpcData) {
uint8_t len = rpcData[0];
if (!len || len > 126) return;

View File

@@ -258,7 +258,7 @@ void handlePresets()
fdo.remove("ps"); // remove load request for presets to prevent recursive crash (if not called by button and contains preset cycling string "1~5~")
deserializeState(fdo, CALL_MODE_NO_NOTIFY, tmpPreset); // may change presetToApply by calling applyPreset()
}
if (!errorFlag && tmpPreset < 255 && changePreset) presetCycCurr = currentPreset = tmpPreset;
if (!errorFlag && tmpPreset < 255 && changePreset) currentPreset = tmpPreset;
#if defined(ARDUINO_ARCH_ESP32)
//Aircoookie recommended not to delete buffer

View File

@@ -109,6 +109,7 @@ void WLED::loop()
handleRemote();
#endif
handleSerial();
handleImprovWifiScan();
#if defined(ARDUINO_ARCH_ESP32) && defined(WLEDMM_PROTECT_SERVICE) // WLEDMM experimental: handleNotifications() calls strip.show(); handleTransitions modifies segments
if (!suspendStripService) {
@@ -827,7 +828,7 @@ void WLED::initAP(bool resetAP)
USER_PRINTLN(apSSID); // WLEDMM
WiFi.softAPConfig(IPAddress(4, 3, 2, 1), IPAddress(4, 3, 2, 1), IPAddress(255, 255, 255, 0));
WiFi.softAP(apSSID, apPass, apChannel, apHide);
#if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2))
#if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32S3))
WiFi.setTxPower(WIFI_POWER_8_5dBm);
#endif
@@ -962,7 +963,6 @@ void WLED::initConnection()
ws.onEvent(wsEvent);
#endif
WiFi.disconnect(true); // close old connections
#ifdef ESP8266
WiFi.setPhyMode(WIFI_PHY_MODE_11N);
@@ -1010,7 +1010,7 @@ void WLED::initConnection()
WiFi.begin(clientSSID, clientPass);
#ifdef ARDUINO_ARCH_ESP32
#if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2))
#if defined(LOLIN_WIFI_FIX) && (defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32S3))
WiFi.setTxPower(WIFI_POWER_8_5dBm);
#endif
WiFi.setSleep(!noWifiSleep);
@@ -1228,7 +1228,7 @@ void WLED::handleConnection()
if (improvActive) {
if (improvError == 3) sendImprovStateResponse(0x00, true);
sendImprovStateResponse(0x04);
if (improvActive > 1) sendImprovRPCResponse(0x01);
if (improvActive > 1) sendImprovIPRPCResult(ImprovRPCType::Command_Wifi);
}
initInterfaces();
userConnected();