Merge branch 'mdev' of https://github.com/MoonModules/WLED into mdev

This commit is contained in:
Frank
2022-11-09 18:36:39 +01:00
30 changed files with 4174 additions and 4173 deletions

2
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{ {
"name": "wled", "name": "wled",
"version": "0.14.0.2.0_MM", "version": "0.14.0.2.1",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {

View File

@@ -1,6 +1,6 @@
{ {
"name": "wled", "name": "wled",
"version": "0.14.0.2.0_MM", "version": "0.14.0.2.1",
"description": "Tools for WLED project", "description": "Tools for WLED project",
"main": "tools/cdata.js", "main": "tools/cdata.js",
"directories": { "directories": {

View File

@@ -35,7 +35,7 @@ def bin_rename_copy(source, target, env):
if release_name: if release_name:
_create_dirs(["release"]) _create_dirs(["release"])
version = _get_cpp_define_value(env, "WLED_VERSION") version = _get_cpp_define_value(env, "WLED_VERSION")
release_file = "{}release{}WLED_{}_{}.bin".format(OUTPUT_DIR, os.path.sep, version, release_name) release_file = "{}release{}WLEDMM_{}_{}.bin".format(OUTPUT_DIR, os.path.sep, version, release_name) #WLEDMM: add MM postfix to WLED
shutil.copy(str(target[0]), release_file) shutil.copy(str(target[0]), release_file)
# check if new target files exist and remove if necessary # check if new target files exist and remove if necessary

View File

@@ -242,7 +242,7 @@ default_partitions = tools/WLED_ESP32_4MB_1MB_FS.csv
lib_deps = lib_deps =
${env.lib_deps} ${env.lib_deps}
; https://github.com/lorol/LITTLEFS.git ; https://github.com/lorol/LITTLEFS.git
; WLEDSR specific: use patched version of lorol LittleFS ; WLEDMM specific: use patched version of lorol LittleFS
https://github.com/softhack007/LITTLEFS-threadsafe.git#master https://github.com/softhack007/LITTLEFS-threadsafe.git#master
makuna/NeoPixelBus @ 2.6.9 makuna/NeoPixelBus @ 2.6.9
https://github.com/pbolduc/AsyncTCP.git @ 1.2.0 https://github.com/pbolduc/AsyncTCP.git @ 1.2.0
@@ -551,7 +551,7 @@ build_flags_min =
-D WLED_USE_MY_CONFIG -D WLED_USE_MY_CONFIG
-D USERMOD_AUDIOREACTIVE -D USERMOD_AUDIOREACTIVE
-D UM_AUDIOREACTIVE_USE_NEW_FFT ; use latest (upstream) FFTLib, instead of older library midified by blazoncek. Slightly faster, more accurate, needs 2KB RAM extra -D UM_AUDIOREACTIVE_USE_NEW_FFT ; use latest (upstream) FFTLib, instead of older library midified by blazoncek. Slightly faster, more accurate, needs 2KB RAM extra
-D USERMOD_CUSTOMEFFECTS ; WLEDSR usermod -D USERMOD_CUSTOMEFFECTS ; WLEDMM usermod
; -D WLED_DEBUG ; lots of generic debug messages ; -D WLED_DEBUG ; lots of generic debug messages
; -D SR_DEBUG ; some extra debug messages from audioreactive ; -D SR_DEBUG ; some extra debug messages from audioreactive
@@ -568,9 +568,9 @@ build_flags_max =
-D USERMOD_FOUR_LINE_DISPLAY -D USERMOD_FOUR_LINE_DISPLAY
-D USERMOD_ROTARY_ENCODER_UI -D USERMOD_ROTARY_ENCODER_UI
-D USERMOD_AUTO_SAVE -D USERMOD_AUTO_SAVE
-D USERMOD_WEATHER ; WLEDSR usermod -D USERMOD_WEATHER ; WLEDMM usermod
-D USERMOD_MPU6050_IMU ; gyro/accelero for USERMOD_GAMES (ONLY WORKS IF USERMOD_FOUR_LINE_DISPLAY NOT INCLUDED - I2C SHARING BUG) -D USERMOD_MPU6050_IMU ; gyro/accelero for USERMOD_GAMES (ONLY WORKS IF USERMOD_FOUR_LINE_DISPLAY NOT INCLUDED - I2C SHARING BUG)
-D USERMOD_GAMES ; WLEDSR usermod -D USERMOD_GAMES ; WLEDMM usermod
lib_deps_max = lib_deps_max =
OneWire@~2.3.5 ; used for USERMOD_FOUR_LINE_DISPLAY and USERMOD_DALLASTEMPERATURE OneWire@~2.3.5 ; used for USERMOD_FOUR_LINE_DISPLAY and USERMOD_DALLASTEMPERATURE

View File

@@ -177,7 +177,7 @@ class FourLineDisplayUsermod : public Usermod {
isHW = (ioPin[0]==i2c_scl && ioPin[1]==i2c_sda); isHW = (ioPin[0]==i2c_scl && ioPin[1]==i2c_sda);
//isHW = true; //isHW = true;
if (isHW) po = PinOwner::HW_I2C; // allow multiple allocations of HW I2C bus pins if (isHW) po = PinOwner::HW_I2C; // allow multiple allocations of HW I2C bus pins
if (ioPin[0] < 0 || ioPin[1] < 0) { type=NONE; return; } //WLEDSR bugfix - ensure that "final" GPIO are valid if (ioPin[0] < 0 || ioPin[1] < 0) { type=NONE; return; } //WLEDMM bugfix - ensure that "final" GPIO are valid
PinManagerPinType pins[2] = { { ioPin[0], true }, { ioPin[1], true } }; PinManagerPinType pins[2] = { { ioPin[0], true }, { ioPin[1], true } };
if (!pinManager.allocateMultiplePins(pins, 2, po)) { type=NONE; return; } if (!pinManager.allocateMultiplePins(pins, 2, po)) { type=NONE; return; }
} }

View File

@@ -339,7 +339,7 @@ class FourLineDisplayUsermod : public Usermod {
// isHW = true; // isHW = true;
if (isHW) po = PinOwner::HW_I2C; // allow multiple allocations of HW I2C bus pins if (isHW) po = PinOwner::HW_I2C; // allow multiple allocations of HW I2C bus pins
PinManagerPinType pins[2] = { {ioPin[0], true }, { ioPin[1], true } }; PinManagerPinType pins[2] = { {ioPin[0], true }, { ioPin[1], true } };
if (ioPin[0] < 0 || ioPin[1] < 0) { type=NONE; return; } //WLEDSR bugfix - ensure that "final" GPIO are valid if (ioPin[0] < 0 || ioPin[1] < 0) { type=NONE; return; } //WLEDMM bugfix - ensure that "final" GPIO are valid
if (!pinManager.allocateMultiplePins(pins, 2, po)) { type=NONE; return; } if (!pinManager.allocateMultiplePins(pins, 2, po)) { type=NONE; return; }
} }

View File

@@ -211,7 +211,7 @@ static const char _data_FX_MODE_IMUTest[] PROGMEM = "🎮 IMUTest@;;;2d";
#endif #endif
//WLEDSR 3D to 2D mapping //WLEDMM 3D to 2D mapping
struct Voxel { struct Voxel {
float x; float x;
float y; float y;

View File

@@ -1083,7 +1083,7 @@ uint16_t mode_running_random(void) {
uint8_t z = it % zoneSize; uint8_t z = it % zoneSize;
bool nzone = (!z && it != SEGENV.aux1); bool nzone = (!z && it != SEGENV.aux1);
for (int i=SEGLEN-1; i >= 0; i--) { // WLEDSR bugfix for (int i=SEGLEN-1; i >= 0; i--) { // WLEDMM bugfix
if (nzone || z >= zoneSize) { if (nzone || z >= zoneSize) {
uint8_t lastrand = PRNG16 >> 8; uint8_t lastrand = PRNG16 >> 8;
int16_t diff = 0; int16_t diff = 0;
@@ -1724,7 +1724,7 @@ uint16_t mode_random_chase(void)
uint32_t color = SEGENV.step; uint32_t color = SEGENV.step;
random16_set_seed(SEGENV.aux0); random16_set_seed(SEGENV.aux0);
for (int i = SEGLEN -1; i >= 0; i--) { // WLEDSR bugfix for (int i = SEGLEN -1; i >= 0; i--) { // WLEDMM bugfix
uint8_t r = random8(6) != 0 ? (color >> 16 & 0xFF) : random8(); uint8_t r = random8(6) != 0 ? (color >> 16 & 0xFF) : random8();
uint8_t g = random8(6) != 0 ? (color >> 8 & 0xFF) : random8(); uint8_t g = random8(6) != 0 ? (color >> 8 & 0xFF) : random8();
uint8_t b = random8(6) != 0 ? (color & 0xFF) : random8(); uint8_t b = random8(6) != 0 ? (color & 0xFF) : random8();
@@ -5347,7 +5347,7 @@ static const char _data_FX_MODE_2DPOLARLIGHTS[] PROGMEM = "Polar Lights@Speed,Sc
uint16_t mode_2DPulser(void) { // By: ldirko https://editor.soulmatelights.com/gallery/878-pulse-test , modifed by: Andrew Tuline uint16_t mode_2DPulser(void) { // By: ldirko https://editor.soulmatelights.com/gallery/878-pulse-test , modifed by: Andrew Tuline
if (!strip.isMatrix) return mode_static(); // not a 2D set-up if (!strip.isMatrix) return mode_static(); // not a 2D set-up
const uint16_t cols = SEGMENT.virtualWidth(); // WLEDSR bugfix const uint16_t cols = SEGMENT.virtualWidth(); // WLEDMM bugfix
const uint16_t rows = SEGMENT.virtualHeight(); const uint16_t rows = SEGMENT.virtualHeight();
if (SEGENV.call == 0) { if (SEGENV.call == 0) {
@@ -5358,7 +5358,7 @@ uint16_t mode_2DPulser(void) { // By: ldirko https://edi
SEGMENT.fadeToBlackBy(8 - (SEGMENT.intensity>>5)); SEGMENT.fadeToBlackBy(8 - (SEGMENT.intensity>>5));
uint32_t a = strip.now / (18 - SEGMENT.speed / 16); uint32_t a = strip.now / (18 - SEGMENT.speed / 16);
uint16_t x = (a / 14) % cols; // WLEDSR bugfix uint16_t x = (a / 14) % cols; // WLEDMM bugfix
uint16_t y = map((sin8(a * 5) + sin8(a * 4) + sin8(a * 2)), 0, 765, rows-1, 0); uint16_t y = map((sin8(a * 5) + sin8(a * 4) + sin8(a * 2)), 0, 765, rows-1, 0);
SEGMENT.setPixelColorXY(x, y, ColorFromPalette(SEGPALETTE, map(y, 0, rows-1, 0, 255), 255, LINEARBLEND)); SEGMENT.setPixelColorXY(x, y, ColorFromPalette(SEGPALETTE, map(y, 0, rows-1, 0, 255), 255, LINEARBLEND));

View File

@@ -317,7 +317,7 @@
#define FX_MODE_WAVESINS 184 #define FX_MODE_WAVESINS 184
#define FX_MODE_ROCKTAVES 185 #define FX_MODE_ROCKTAVES 185
#define FX_MODE_2DAKEMI 186 #define FX_MODE_2DAKEMI 186
#define FX_MODE_CUSTOMEFFECT 187 //WLEDSR Custom Effects #define FX_MODE_CUSTOMEFFECT 187 //WLEDMM Custom Effects
#define MODE_COUNT 188 #define MODE_COUNT 188
@@ -326,9 +326,9 @@ typedef enum mapping1D2D {
M12_pBar = 1, M12_pBar = 1,
M12_pArc = 2, M12_pArc = 2,
M12_pCorner = 3, M12_pCorner = 3,
M12_jMap = 4, //WLEDSR jMap M12_jMap = 4, //WLEDMM jMap
M12_sCircle = 5, //WLEDSR jMap M12_sCircle = 5, //WLEDMM jMap
M12_sBlock = 6 //WLEDSR jMap M12_sBlock = 6 //WLEDMM jMap
} mapping1D2D_t; } mapping1D2D_t;
// segment, 72 bytes // segment, 72 bytes
@@ -382,7 +382,7 @@ typedef struct Segment {
byte* data; byte* data;
CRGB* leds; CRGB* leds;
static CRGB *_globalLeds; static CRGB *_globalLeds;
void *jMap; //WLEDSR jMap void *jMap; //WLEDMM jMap
private: private:
union { union {
@@ -473,7 +473,7 @@ typedef struct Segment {
} }
Segment(uint16_t sStartX, uint16_t sStopX, uint16_t sStartY, uint16_t sStopY) : Segment(sStartX, sStopX) { Segment(uint16_t sStartX, uint16_t sStopX, uint16_t sStartY, uint16_t sStopY) : Segment(sStartX, sStopX) {
Serial.println("Segment"); //WLEDSR jMap Serial.println("Segment"); //WLEDMM jMap
startY = sStartY; startY = sStartY;
stopY = sStopY; stopY = sStopY;
} }
@@ -576,8 +576,8 @@ typedef struct Segment {
uint16_t virtualWidth(void) const; uint16_t virtualWidth(void) const;
uint16_t virtualHeight(void) const; uint16_t virtualHeight(void) const;
uint16_t nrOfVStrips(void) const; uint16_t nrOfVStrips(void) const;
void createjMap(); //WLEDSR jMap void createjMap(); //WLEDMM jMap
void deletejMap(); //WLEDSR jMap void deletejMap(); //WLEDMM jMap
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
uint16_t XY(uint16_t x, uint16_t y); // support function to get relative index within segment (for leds[]) uint16_t XY(uint16_t x, uint16_t y); // support function to get relative index within segment (for leds[])
void setPixelColorXY(int x, int y, uint32_t c); // set relative pixel within segment with color void setPixelColorXY(int x, int y, uint32_t c); // set relative pixel within segment with color

View File

@@ -109,7 +109,7 @@ void WS2812FX::setUpMatrix() {
} }
// absolute matrix version of setPixelColor() // absolute matrix version of setPixelColor()
void IRAM_ATTR_YN WS2812FX::setPixelColorXY(int x, int y, uint32_t col) //WLEDSR: IRAM_ATTR conditionaly void IRAM_ATTR_YN WS2812FX::setPixelColorXY(int x, int y, uint32_t col) //WLEDMM: IRAM_ATTR conditionaly
{ {
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
if (!isMatrix) return; // not a matrix set-up if (!isMatrix) return; // not a matrix set-up
@@ -141,13 +141,13 @@ uint32_t WS2812FX::getPixelColorXY(uint16_t x, uint16_t y) {
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
// XY(x,y) - gets pixel index within current segment (often used to reference leds[] array element) // XY(x,y) - gets pixel index within current segment (often used to reference leds[] array element)
uint16_t IRAM_ATTR_YN Segment::XY(uint16_t x, uint16_t y) { //WLEDSR: IRAM_ATTR conditionaly uint16_t IRAM_ATTR_YN Segment::XY(uint16_t x, uint16_t y) { //WLEDMM: IRAM_ATTR conditionaly
uint16_t width = virtualWidth(); // segment width in logical pixels uint16_t width = virtualWidth(); // segment width in logical pixels
uint16_t height = virtualHeight(); // segment height in logical pixels uint16_t height = virtualHeight(); // segment height in logical pixels
return (x%width) + (y%height) * width; return (x%width) + (y%height) * width;
} }
void IRAM_ATTR_YN Segment::setPixelColorXY(int x, int y, uint32_t col) //WLEDSR: IRAM_ATTR conditionaly void IRAM_ATTR_YN Segment::setPixelColorXY(int x, int y, uint32_t col) //WLEDMM: IRAM_ATTR conditionaly
{ {
if (!strip.isMatrix) return; // not a matrix set-up if (!strip.isMatrix) return; // not a matrix set-up
if (x >= virtualWidth() || y >= virtualHeight() || x<0 || y<0) return; // if pixel would fall out of virtual segment just exit if (x >= virtualWidth() || y >= virtualHeight() || x<0 || y<0) return; // if pixel would fall out of virtual segment just exit

View File

@@ -89,7 +89,7 @@ Segment::Segment(const Segment &orig) {
if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); } if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); }
if (orig._t) { _t = new Transition(orig._t->_dur, orig._t->_briT, orig._t->_cctT, orig._t->_colorT); } if (orig._t) { _t = new Transition(orig._t->_dur, orig._t->_briT, orig._t->_cctT, orig._t->_colorT); }
if (orig.leds && !Segment::_globalLeds) { leds = (CRGB*)malloc(sizeof(CRGB)*length()); if (leds) memcpy(leds, orig.leds, sizeof(CRGB)*length()); } if (orig.leds && !Segment::_globalLeds) { leds = (CRGB*)malloc(sizeof(CRGB)*length()); if (leds) memcpy(leds, orig.leds, sizeof(CRGB)*length()); }
jMap = nullptr; //WLEDSR jMap jMap = nullptr; //WLEDMM jMap
} }
// move constructor // move constructor
@@ -101,7 +101,7 @@ Segment::Segment(Segment &&orig) noexcept {
orig._dataLen = 0; orig._dataLen = 0;
orig._t = nullptr; orig._t = nullptr;
orig.leds = nullptr; orig.leds = nullptr;
orig.jMap = nullptr; //WLEDSR jMap orig.jMap = nullptr; //WLEDMM jMap
} }
// copy assignment // copy assignment
@@ -126,7 +126,7 @@ Segment& Segment::operator= (const Segment &orig) {
if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); } if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); }
if (orig._t) { _t = new Transition(orig._t->_dur, orig._t->_briT, orig._t->_cctT, orig._t->_colorT); } if (orig._t) { _t = new Transition(orig._t->_dur, orig._t->_briT, orig._t->_cctT, orig._t->_colorT); }
if (orig.leds && !Segment::_globalLeds) { leds = (CRGB*)malloc(sizeof(CRGB)*length()); if (leds) memcpy(leds, orig.leds, sizeof(CRGB)*length()); } if (orig.leds && !Segment::_globalLeds) { leds = (CRGB*)malloc(sizeof(CRGB)*length()); if (leds) memcpy(leds, orig.leds, sizeof(CRGB)*length()); }
jMap = nullptr; //WLEDSR jMap jMap = nullptr; //WLEDMM jMap
} }
return *this; return *this;
} }
@@ -145,7 +145,7 @@ Segment& Segment::operator= (Segment &&orig) noexcept {
orig._dataLen = 0; orig._dataLen = 0;
orig._t = nullptr; orig._t = nullptr;
orig.leds = nullptr; orig.leds = nullptr;
orig.jMap = nullptr; //WLEDSR jMap orig.jMap = nullptr; //WLEDMM jMap
} }
return *this; return *this;
} }
@@ -465,10 +465,10 @@ uint16_t Segment::nrOfVStrips() const {
case M12_pBar: case M12_pBar:
vLen = virtualWidth(); vLen = virtualWidth();
break; break;
case M12_sCircle: //WLEDSR case M12_sCircle: //WLEDMM
vLen = (virtualWidth() + virtualHeight()) / 6; // take third of the average width vLen = (virtualWidth() + virtualHeight()) / 6; // take third of the average width
break; break;
case M12_sBlock: //WLEDSR case M12_sBlock: //WLEDMM
vLen = (virtualWidth() + virtualHeight()) / 8; // take half of the average width vLen = (virtualWidth() + virtualHeight()) / 8; // take half of the average width
break; break;
} }
@@ -477,7 +477,7 @@ uint16_t Segment::nrOfVStrips() const {
return vLen; return vLen;
} }
//WLEDSR jMap //WLEDMM jMap
struct XandY { struct XandY {
uint8_t x; uint8_t x;
uint8_t y; uint8_t y;
@@ -609,7 +609,7 @@ class JMapC {
} //updatejMapDoc } //updatejMapDoc
}; //class JMapC }; //class JMapC
//WLEDSR jMap //WLEDMM jMap
void Segment::createjMap() { void Segment::createjMap() {
if (!jMap) { if (!jMap) {
Serial.println("createjMap"); Serial.println("createjMap");
@@ -617,7 +617,7 @@ void Segment::createjMap() {
} }
} }
//WLEDSR jMap //WLEDMM jMap
void Segment::deletejMap() { void Segment::deletejMap() {
//Should be called from ~Segment but causes crash (and ~Segment is called quite often...) //Should be called from ~Segment but causes crash (and ~Segment is called quite often...)
if (jMap) { if (jMap) {
@@ -641,15 +641,15 @@ uint16_t Segment::virtualLength() const {
case M12_pArc: case M12_pArc:
vLen = max(vW,vH); // get the longest dimension vLen = max(vW,vH); // get the longest dimension
break; break;
case M12_jMap: //WLEDSR jMap case M12_jMap: //WLEDMM jMap
if (jMap) if (jMap)
vLen = ((JMapC *)jMap)->length(); vLen = ((JMapC *)jMap)->length();
break; break;
case M12_sCircle: //WLEDSR case M12_sCircle: //WLEDMM
vLen = max(vW,vH); // get the longest dimension vLen = max(vW,vH); // get the longest dimension
// vLen = (virtualWidth() + virtualHeight()) * 3; // vLen = (virtualWidth() + virtualHeight()) * 3;
break; break;
case M12_sBlock: //WLEDSR case M12_sBlock: //WLEDMM
if (nrOfVStrips()>1) if (nrOfVStrips()>1)
vLen = max(vW,vH) * 4;//0.5; // get the longest dimension vLen = max(vW,vH) * 4;//0.5; // get the longest dimension
else else
@@ -665,7 +665,7 @@ uint16_t Segment::virtualLength() const {
return vLength; return vLength;
} }
//WLEDSR used for M12_sBlock //WLEDMM used for M12_sBlock
void xyFromBlock(uint16_t &x,uint16_t &y, uint16_t i, uint16_t vW, uint16_t vH, uint16_t vStrip) { void xyFromBlock(uint16_t &x,uint16_t &y, uint16_t i, uint16_t vW, uint16_t vH, uint16_t vStrip) {
float i2; float i2;
if (i<=SEGLEN*0.25) { //top, left to right if (i<=SEGLEN*0.25) { //top, left to right
@@ -691,7 +691,7 @@ void xyFromBlock(uint16_t &x,uint16_t &y, uint16_t i, uint16_t vW, uint16_t vH,
} }
void IRAM_ATTR_YN Segment::setPixelColor(int i, uint32_t col) //WLEDSR: IRAM_ATTR conditionaly void IRAM_ATTR_YN Segment::setPixelColor(int i, uint32_t col) //WLEDMM: IRAM_ATTR conditionaly
{ {
int vStrip = i>>16; // hack to allow running on virtual strips (2D segment columns/rows) int vStrip = i>>16; // hack to allow running on virtual strips (2D segment columns/rows)
i &= 0xFFFF; i &= 0xFFFF;
@@ -723,11 +723,11 @@ void IRAM_ATTR_YN Segment::setPixelColor(int i, uint32_t col) //WLEDSR: IRAM_ATT
for (int x = 0; x <= i; x++) setPixelColorXY(x, i, col); for (int x = 0; x <= i; x++) setPixelColorXY(x, i, col);
for (int y = 0; y < i; y++) setPixelColorXY(i, y, col); for (int y = 0; y < i; y++) setPixelColorXY(i, y, col);
break; break;
case M12_jMap: //WLEDSR jMap case M12_jMap: //WLEDMM jMap
if (jMap) if (jMap)
((JMapC *)jMap)->setPixelColor(i, col); ((JMapC *)jMap)->setPixelColor(i, col);
break; break;
case M12_sCircle: //WLEDSR case M12_sCircle: //WLEDMM
if (vStrip > 0) if (vStrip > 0)
{ {
int x = roundf(sin_t(360*i/SEGLEN*DEG_TO_RAD) * vW * (vStrip+1)/nrOfVStrips()); int x = roundf(sin_t(360*i/SEGLEN*DEG_TO_RAD) * vW * (vStrip+1)/nrOfVStrips());
@@ -737,7 +737,7 @@ void IRAM_ATTR_YN Segment::setPixelColor(int i, uint32_t col) //WLEDSR: IRAM_ATT
else // pArc -> circle else // pArc -> circle
drawArc(vW/2, vH/2, i/2, col); drawArc(vW/2, vH/2, i/2, col);
break; break;
case M12_sBlock: //WLEDSR case M12_sBlock: //WLEDMM
if (vStrip > 0) if (vStrip > 0)
{ {
//vStrip+1 is distance from centre, i is how much of the square is filled //vStrip+1 is distance from centre, i is how much of the square is filled
@@ -862,11 +862,11 @@ uint32_t Segment::getPixelColor(int i)
// use longest dimension // use longest dimension
return vW>vH ? getPixelColorXY(i, 0) : getPixelColorXY(0, i); return vW>vH ? getPixelColorXY(i, 0) : getPixelColorXY(0, i);
break; break;
case M12_jMap: //WLEDSR jMap case M12_jMap: //WLEDMM jMap
if (jMap) if (jMap)
return ((JMapC *)jMap)->getPixelColor(i); return ((JMapC *)jMap)->getPixelColor(i);
break; break;
case M12_sCircle: //WLEDSR case M12_sCircle: //WLEDMM
if (vStrip > 0) if (vStrip > 0)
{ {
int x = roundf(sin_t(360*i/SEGLEN*DEG_TO_RAD) * vW * (vStrip+1)/nrOfVStrips()); int x = roundf(sin_t(360*i/SEGLEN*DEG_TO_RAD) * vW * (vStrip+1)/nrOfVStrips());
@@ -876,7 +876,7 @@ uint32_t Segment::getPixelColor(int i)
else else
return vW>vH ? getPixelColorXY(i, 0) : getPixelColorXY(0, i); return vW>vH ? getPixelColorXY(i, 0) : getPixelColorXY(0, i);
break; break;
case M12_sBlock: //WLEDSR case M12_sBlock: //WLEDMM
if (vStrip > 0) if (vStrip > 0)
{ {
uint16_t x=0,y=0; uint16_t x=0,y=0;

View File

@@ -96,7 +96,7 @@
#define USERMOD_ID_ANALOG_CLOCK 33 //Usermod "Analog_Clock.h" #define USERMOD_ID_ANALOG_CLOCK 33 //Usermod "Analog_Clock.h"
#define USERMOD_ID_PING_PONG_CLOCK 34 //Usermod "usermod_v2_ping_pong_clock.h" #define USERMOD_ID_PING_PONG_CLOCK 34 //Usermod "usermod_v2_ping_pong_clock.h"
#define USERMOD_ID_ADS1115 35 //Usermod "usermod_ads1115.h" #define USERMOD_ID_ADS1115 35 //Usermod "usermod_ads1115.h"
//WLEDSR //WLEDMM
#define USERMOD_ID_CUSTOMEFFECTS 36 //Usermod "usermod_v2_customeffects.h" #define USERMOD_ID_CUSTOMEFFECTS 36 //Usermod "usermod_v2_customeffects.h"
#define USERMOD_ID_WEATHER 37 //Usermod "usermod_v2_weather.h" #define USERMOD_ID_WEATHER 37 //Usermod "usermod_v2_weather.h"
#define USERMOD_ID_GAMES 38 //Usermod "usermod_v2_games.h" #define USERMOD_ID_GAMES 38 //Usermod "usermod_v2_games.h"
@@ -431,7 +431,7 @@
#define HW_PIN_CSSPI SS #define HW_PIN_CSSPI SS
#endif #endif
// WLEDSR: IRAM_ATTR for 8266 causes error: section `.text1' will not fit in region `iram1_0_seg' // WLEDMM: IRAM_ATTR for 8266 causes error: section `.text1' will not fit in region `iram1_0_seg'
// error only in MM, not in upstream... tbd: find out why // error only in MM, not in upstream... tbd: find out why
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
#define IRAM_ATTR_YN IRAM_ATTR #define IRAM_ATTR_YN IRAM_ATTR

View File

@@ -51,7 +51,7 @@
setTimeout(()=>{h.appendChild(l)},100); setTimeout(()=>{h.appendChild(l)},100);
</script> </script>
<link rel="stylesheet" href="index.css"> <link rel="stylesheet" href="index.css">
<link rel="stylesheet" href="../../usermods/customeffects/customeffects.css"> <!--WLEDSR Custom Effects --> <link rel="stylesheet" href="../../usermods/customeffects/customeffects.css"> <!--WLEDMM Custom Effects -->
</head> </head>
<body> <body>
@@ -366,7 +366,7 @@
</div> </div>
</div> </div>
<!-- WLEDSR Custom Effects --> <!-- WLEDMM Custom Effects -->
<div id="ceEditor" class="modal"> <div id="ceEditor" class="modal">
<div id="kceEditor">Loading...</div><br> <div id="kceEditor">Loading...</div><br>
</div> </div>
@@ -386,6 +386,6 @@
</div> </div>
<i id="roverstar" class="icons huge" onclick="setLor(0)">&#xe410;</i><br> <i id="roverstar" class="icons huge" onclick="setLor(0)">&#xe410;</i><br>
<script src="index.js"></script> <script src="index.js"></script>
<script src="../../usermods/customeffects/customeffects.js"></script> <!--WLEDSR Custom Effects--> <script src="../../usermods/customeffects/customeffects.js"></script> <!--WLEDMM Custom Effects-->
</body> </body>
</html> </html>

View File

@@ -642,7 +642,7 @@ function populateInfo(i)
var cn=""; var cn="";
var heap = i.freeheap/1000; var heap = i.freeheap/1000;
heap = heap.toFixed(1); heap = heap.toFixed(1);
var theap = (i.totalheap>0)?i.totalheap/1000:-1; theap = theap.toFixed(1); //WLEDSR - total heap is not available on 8266 var theap = (i.totalheap>0)?i.totalheap/1000:-1; theap = theap.toFixed(1); //WLEDMM - total heap is not available on 8266
var pwr = i.leds.pwr; var pwr = i.leds.pwr;
var pwru = "Not calculated"; var pwru = "Not calculated";
if (pwr > 1000) {pwr /= 1000; pwr = pwr.toFixed((pwr > 10) ? 0 : 1); pwru = pwr + " A";} if (pwr > 1000) {pwr /= 1000; pwr = pwr.toFixed((pwr > 10) ? 0 : 1); pwru = pwr + " A";}
@@ -661,10 +661,10 @@ function populateInfo(i)
if (i.ver.includes("-bl")) vcn = "Supāku"; if (i.ver.includes("-bl")) vcn = "Supāku";
if (i.cn) vcn = i.cn; if (i.cn) vcn = i.cn;
//WLEDSR: add total heap and total PSRAM, and build number //WLEDMM: add total heap and total PSRAM, and build number, add bin name
if (i.ver.includes(".14.1-")) vcn = "Sitting Ducks"; // easter egg if (i.ver.includes(".14.1-")) vcn = "Sitting Ducks"; // easter egg
if ((i.ver.includes("14.0."))&&(i.ver.includes("_MM"))) vcn = "Lupo"; if ((i.ver.includes("14.0."))&&(i.ver.includes("_MM"))) vcn = "Lupo";
cn += `v${i.ver} &nbsp;<i>"${vcn}"</i><p><em>build ${i.vid}</em></p><table> 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} ${urows}
${urows===""?'':'<tr><td colspan=2><hr style="height:1px;border-width:0;color:gray;background-color:gray"></td></tr>'} ${urows===""?'':'<tr><td colspan=2><hr style="height:1px;border-width:0;color:gray;background-color:gray"></td></tr>'}
${inforow("Build",i.vid)} ${inforow("Build",i.vid)}
@@ -672,7 +672,7 @@ ${inforow("Signal strength",i.wifi.signal +"% ("+ i.wifi.rssi, " dBm)")}
${inforow("Uptime",getRuntimeStr(i.uptime))} ${inforow("Uptime",getRuntimeStr(i.uptime))}
${inforow("Estimated current",pwru)} ${inforow("Estimated current",pwru)}
${inforow("Average FPS",i.leds.fps)} ${inforow("Average FPS",i.leds.fps)}
<!-- WLEDSR begin--> <!-- WLEDMM begin-->
<tr><td colspan=2><hr style="height:1px;border-width:0;color:SeaGreen;background-color:SeaGreen"></td></tr> <tr><td colspan=2><hr style="height:1px;border-width:0;color:SeaGreen;background-color:SeaGreen"></td></tr>
${inforow("MAC address",i.mac)} ${inforow("MAC address",i.mac)}
${inforow("Filesystem",i.fs.u + "/" + i.fs.t + " kB (" +Math.round(i.fs.u*100/i.fs.t) + "%)")} ${inforow("Filesystem",i.fs.u + "/" + i.fs.t + " kB (" +Math.round(i.fs.u*100/i.fs.t) + "%)")}
@@ -688,7 +688,7 @@ ${i.e32model?inforow(i.e32model,i.e32cores +" core(s)"," "+i.e32speed+" Mhz"):""
${i.e32flash?inforow("Flash "+i.e32flash+" MB"+", mode "+i.e32flashmode+i.e32flashtext,i.e32flashspeed," Mhz"):""} ${i.e32flash?inforow("Flash "+i.e32flash+" MB"+", mode "+i.e32flashmode+i.e32flashtext,i.e32flashspeed," Mhz"):""}
${i.e32core0code?inforow("Core0 rst reason",i.e32core0code, " "+i.e32core0text):""} ${i.e32core0code?inforow("Core0 rst reason",i.e32core0code, " "+i.e32core0text):""}
${i.e32core1code?inforow("Core1 rst reason",i.e32core1code, " "+i.e32core1text):""} ${i.e32core1code?inforow("Core1 rst reason",i.e32core1code, " "+i.e32core1text):""}
<!-- WLEDSR end--> <!-- WLEDMM end-->
</table>`; </table>`;
gId('kv').innerHTML = cn; gId('kv').innerHTML = cn;
// update all sliders in Info // update all sliders in Info
@@ -732,7 +732,7 @@ function populateSegments(s)
rvYck = `<label class="check revchkl">Reverse<input type="checkbox" id="seg${i}rY" onchange="setRevY(${i})" ${inst.rY?"checked":""}><span class="checkmark"></span></label>`; rvYck = `<label class="check revchkl">Reverse<input type="checkbox" id="seg${i}rY" onchange="setRevY(${i})" ${inst.rY?"checked":""}><span class="checkmark"></span></label>`;
miYck = `<label class="check revchkl">Mirror<input type="checkbox" id="seg${i}mY" onchange="setMiY(${i})" ${inst.mY?"checked":""}><span class="checkmark"></span></label>`; miYck = `<label class="check revchkl">Mirror<input type="checkbox" id="seg${i}mY" onchange="setMiY(${i})" ${inst.mY?"checked":""}><span class="checkmark"></span></label>`;
} }
// WLEDSR: jMap // WLEDMM: jMap
let map2D = `<div id="seg${i}map2D" data-map="map2D" class="lbl-s hide">Expand 1D FX<br> let map2D = `<div id="seg${i}map2D" data-map="map2D" class="lbl-s hide">Expand 1D FX<br>
<div class="sel-p"><select class="sel-p" id="seg${i}mp12" onchange="setMp12(${i})"> <div class="sel-p"><select class="sel-p" id="seg${i}mp12" onchange="setMp12(${i})">
<option value="0" ${inst.mp12==0?' selected':''}>Pixels</option> <option value="0" ${inst.mp12==0?' selected':''}>Pixels</option>
@@ -752,7 +752,7 @@ function populateSegments(s)
<option value="3" ${inst.ssim==3?' selected':''}>U14_3</option> <option value="3" ${inst.ssim==3?' selected':''}>U14_3</option>
</select></div> </select></div>
</div>`; </div>`;
//WLEDSR Custom Effects //WLEDMM Custom Effects
let fxName = eJson.find((o)=>{return o.id==selectedFx}).name; let fxName = eJson.find((o)=>{return o.id==selectedFx}).name;
let cusEff = `<button class="btn" onclick="toggleCEEditor('${inst.n?inst.n:"default"}', ${i})">Custom Effect Editor</button><br>`; let cusEff = `<button class="btn" onclick="toggleCEEditor('${inst.n?inst.n:"default"}', ${i})">Custom Effect Editor</button><br>`;
cn += `<div class="seg lstI ${i==s.mainseg ? 'selected' : ''} ${exp ? "expanded":""}" id="seg${i}"> cn += `<div class="seg lstI ${i==s.mainseg ? 'selected' : ''} ${exp ? "expanded":""}" id="seg${i}">
@@ -854,7 +854,7 @@ function populateEffects()
}); });
for (let ef of effects) { for (let ef of effects) {
// WLEDSR: add slider and color control to setFX (used by requestjson) // WLEDMM: add slider and color control to setFX (used by requestjson)
let id = ef.id; let id = ef.id;
let nm = ef.name+" "; let nm = ef.name+" ";
let fd = ""; let fd = "";
@@ -1366,7 +1366,7 @@ function readState(s,command=false)
return true; return true;
} }
// WLEDSR: control HTML elements for Slider and Color Control // WLEDMM: control HTML elements for Slider and Color Control
// Technical notes // Technical notes
// =============== // ===============
// If an effect name is followed by an @, slider and color control is effective. // If an effect name is followed by an @, slider and color control is effective.
@@ -1623,7 +1623,7 @@ function toggleSync()
function toggleLiveview() function toggleLiveview()
{ {
//WLEDSR adding liveview2D support //WLEDMM adding liveview2D support
if (isInfo && isM) toggleInfo(); if (isInfo && isM) toggleInfo();
if (isNodes && isM) toggleNodes(); if (isNodes && isM) toggleNodes();
isLv = !isLv; isLv = !isLv;

View File

@@ -46,10 +46,10 @@
if (leds[0] != 76 || leds[1] != 2 || !ctx) return; //'L', set in ws.cpp if (leds[0] != 76 || leds[1] != 2 || !ctx) return; //'L', set in ws.cpp
let mW = leds[2]; // matrix width let mW = leds[2]; // matrix width
let mH = leds[3]; // matrix height let mH = leds[3]; // matrix height
let pPL = Math.min(c.width / mW, (c.height-10) / mH); // pixels per LED (width of circle) WLEDSR -10 for prompts let pPL = Math.min(c.width / mW, (c.height-10) / mH); // pixels per LED (width of circle) WLEDMM -10 for prompts
let lOf = Math.floor((c.width - pPL*mW)/2); //left offeset (to center matrix) let lOf = Math.floor((c.width - pPL*mW)/2); //left offeset (to center matrix)
var i = 6; var i = 6;
ctx.clearRect(0, 0, c.width, c.height); //WLEDSR ctx.clearRect(0, 0, c.width, c.height); //WLEDMM
for (y=0.5;y<mH;y++) for (x=0.5; x<mW; x++) { for (y=0.5;y<mH;y++) for (x=0.5; x<mW; x++) {
ctx.fillStyle = `rgb(${leds[i]},${leds[i+1]},${leds[i+2]})`; ctx.fillStyle = `rgb(${leds[i]},${leds[i+1]},${leds[i+2]})`;
ctx.beginPath(); ctx.beginPath();
@@ -57,7 +57,7 @@
ctx.fill(); ctx.fill();
i+=3; i+=3;
} }
//WLEDSR show preset and playlist id //WLEDMM show preset and playlist id
ctx.fillStyle = `rgb(255,255,255)`; ctx.fillStyle = `rgb(255,255,255)`;
if (leds[4] != 0) ctx.fillText("preset " + leds[4].toString(), lOf, mH*pPL+10); if (leds[4] != 0) ctx.fillText("preset " + leds[4].toString(), lOf, mH*pPL+10);
if (leds[5] != 255) ctx.fillText("playlist " + leds[5].toString(), lOf + 70, mH*pPL+10); if (leds[5] != 255) ctx.fillText("playlist " + leds[5].toString(), lOf + 70, mH*pPL+10);

View File

@@ -63,7 +63,7 @@
localStorage.setItem('locIp', locip); localStorage.setItem('locIp', locip);
} }
} }
//WLEDSR: add ldS and move loadJS there (like in settings_um) //WLEDMM: add ldS and move loadJS there (like in settings_um)
ldS(); ldS();
} }
</script> </script>

View File

@@ -55,7 +55,7 @@
} }
} }
ldS(); ldS();
if (!numM) gId("um").innerHTML = ""; //WLEDSR: Do not display no usermods installed if (!numM) gId("um").innerHTML = ""; //WLEDMM: Do not display no usermods installed
} }
// https://stackoverflow.com/questions/3885817/how-do-i-check-that-a-number-is-float-or-integer // https://stackoverflow.com/questions/3885817/how-do-i-check-that-a-number-is-float-or-integer
function isF(n) { return n === +n && n !== (n|0); } function isF(n) { return n === +n && n !== (n|0); }
@@ -200,7 +200,7 @@
getPins(json); getPins(json);
urows=""; urows="";
if (isO(umCfg)) { if (isO(umCfg)) {
//WLEDSR: read url parameter. e.g. um=AudioReactive and if set only add the usermod with the same name //WLEDMM: read url parameter. e.g. um=AudioReactive and if set only add the usermod with the same name
const queryString = window.location.search; const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString); const urlParams = new URLSearchParams(queryString);
const userMod = urlParams.get('um') const userMod = urlParams.get('um')
@@ -214,7 +214,7 @@
} }
if (userMod != null && urows==="") urows = "Usermods configuration not found.<br>Press <i>Save</i> to initialize defaults."; if (userMod != null && urows==="") urows = "Usermods configuration not found.<br>Press <i>Save</i> to initialize defaults.";
} }
//WLEDSR: only show globalGPIOs if no usermod info is shown (url without um parameter) //WLEDMM: only show globalGPIOs if no usermod info is shown (url without um parameter)
gId("globalGPIOs").style.display = urows===""?"block":"none"; gId("globalGPIOs").style.display = urows===""?"block":"none";
gId("um").innerHTML = urows; gId("um").innerHTML = urows;
@@ -242,7 +242,7 @@
<span id="lssuc" style="color:green; display:none">&#10004; Configuration saved!</span> <span id="lssuc" style="color:green; display:none">&#10004; Configuration saved!</span>
<span id="lserr" style="color:red; display:none">&#9888; Could not load configuration.</span> <span id="lserr" style="color:red; display:none">&#9888; Could not load configuration.</span>
</div> </div>
<div id="globalGPIOs" style="display:none;"> <!--WLEDSR: show in ldS--> <div id="globalGPIOs" style="display:none;"> <!--WLEDMM: show in ldS-->
<hr> <hr>
<h2>Usermod Setup</h2> <h2>Usermod Setup</h2>
Global I<sup>2</sup>C GPIOs (HW)<br> Global I<sup>2</sup>C GPIOs (HW)<br>

View File

@@ -491,7 +491,7 @@ function populateInfo(i)
var cn=""; var cn="";
var heap = i.freeheap/1000; var heap = i.freeheap/1000;
heap = heap.toFixed(1); heap = heap.toFixed(1);
var theap = (i.totalheap>0)?i.totalheap/1000:-1; theap = theap.toFixed(1); //WLEDSR - total heap is not available on 8266 var theap = (i.totalheap>0)?i.totalheap/1000:-1; theap = theap.toFixed(1); //WLEDMM - total heap is not available on 8266
var pwr = i.leds.pwr; var pwr = i.leds.pwr;
var pwru = "Not calculated"; var pwru = "Not calculated";
if (pwr > 1000) {pwr /= 1000; pwr = pwr.toFixed((pwr > 10) ? 0 : 1); pwru = pwr + " A";} if (pwr > 1000) {pwr /= 1000; pwr = pwr.toFixed((pwr > 10) ? 0 : 1); pwru = pwr + " A";}
@@ -510,7 +510,7 @@ function populateInfo(i)
if (i.ver.includes("-bl")) vcn = "Supāku"; if (i.ver.includes("-bl")) vcn = "Supāku";
if (i.cn) vcn = i.cn; if (i.cn) vcn = i.cn;
//WLEDSR: add total heap and total PSRAM, and build number //WLEDMM: add total heap and total PSRAM, and build number
if (i.ver.includes("14.1-")) vcn = "Sitting Ducks"; // easter egg if (i.ver.includes("14.1-")) vcn = "Sitting Ducks"; // easter egg
if (i.ver.includes("14.0-mdev")) vcn = "Lupo"; if (i.ver.includes("14.0-mdev")) vcn = "Lupo";
cn += `v${i.ver} &nbsp;<i>"${vcn}"</i><p><em>build ${i.vid}</em></p><table> cn += `v${i.ver} &nbsp;<i>"${vcn}"</i><p><em>build ${i.vid}</em></p><table>
@@ -520,7 +520,7 @@ ${inforow("Signal strength",i.wifi.signal +"% ("+ i.wifi.rssi, " dBm)")}
${inforow("Uptime",getRuntimeStr(i.uptime))} ${inforow("Uptime",getRuntimeStr(i.uptime))}
${inforow("Estimated current",pwru)} ${inforow("Estimated current",pwru)}
${inforow("Average FPS",i.leds.fps)} ${inforow("Average FPS",i.leds.fps)}
<!-- WLEDSR begin--> <!-- WLEDMM begin-->
<tr><td colspan=2><hr style="height:1px;border-width:0;color:SeaGreen;background-color:SeaGreen"></td></tr> <tr><td colspan=2><hr style="height:1px;border-width:0;color:SeaGreen;background-color:SeaGreen"></td></tr>
${inforow("MAC address",i.mac)} ${inforow("MAC address",i.mac)}
${inforow("Filesystem",i.fs.u + "/" + i.fs.t + " kB (" +Math.round(i.fs.u*100/i.fs.t) + "%)")} ${inforow("Filesystem",i.fs.u + "/" + i.fs.t + " kB (" +Math.round(i.fs.u*100/i.fs.t) + "%)")}
@@ -531,7 +531,7 @@ ${i.tpram?inforow("Total PSRAM",(i.tpram/1024).toFixed(1)," kB"):""}
${i.psusedram?((i.tpram-i.psusedram)>16383?inforow("Max Used PSRAM",((i.tpram-i.psusedram)/1024).toFixed(1)," kB"):inforow("Max Used PSRAM",(i.tpram-i.psusedram)," B")):""} ${i.psusedram?((i.tpram-i.psusedram)>16383?inforow("Max Used PSRAM",((i.tpram-i.psusedram)/1024).toFixed(1)," kB"):inforow("Max Used PSRAM",(i.tpram-i.psusedram)," B")):""}
${i.e32model?inforow(i.e32model,i.e32cores +" core(s)"," "+i.e32speed+" Mhz"):""} ${i.e32model?inforow(i.e32model,i.e32cores +" core(s)"," "+i.e32speed+" Mhz"):""}
${i.e32flash?inforow("Flash "+i.e32flash+" MB"+", mode "+i.e32flashmode+i.e32flashtext,i.e32flashspeed," Mhz"):""} ${i.e32flash?inforow("Flash "+i.e32flash+" MB"+", mode "+i.e32flashmode+i.e32flashtext,i.e32flashspeed," Mhz"):""}
<!-- WLEDSR end--> <!-- WLEDMM end-->
</table>`; </table>`;
gId('kv').innerHTML = cn; gId('kv').innerHTML = cn;
} }
@@ -654,7 +654,7 @@ function populateEffects()
}); });
for (let i = 0; i < effects.length; i++) { for (let i = 0; i < effects.length; i++) {
// WLEDSR: add slider and color control to setEffect (used by requestjson) // WLEDMM: add slider and color control to setEffect (used by requestjson)
if (effects[i].name.indexOf("RSVD") < 0) { if (effects[i].name.indexOf("RSVD") < 0) {
var posAt = effects[i].name.indexOf("@"); var posAt = effects[i].name.indexOf("@");
var extra = ''; var extra = '';

View File

@@ -16,7 +16,7 @@
<body onload="GetV()"> <body onload="GetV()">
<h2>MoonMod WLED Software Update</h2> <h2>MoonMod WLED Software Update</h2>
<form method='POST' action='/update' id='uf' enctype='multipart/form-data' onsubmit="U()"> <form method='POST' action='/update' id='uf' enctype='multipart/form-data' onsubmit="U()">
Installed bin: <span class="sip">##VERSION##</span><br> <!--WLEDSR: show bin name--> Installed bin: <span class="sip">##VERSION##</span><br> <!--WLEDMM: show bin name-->
Download the latest binary: <a href="https://github.com/MoonModules/WLED/releases" target="_blank"> Download the latest binary: <a href="https://github.com/MoonModules/WLED/releases" target="_blank">
<img src="https://img.shields.io/github/release/MoonModules/WLED.svg?style=flat-square"></a><br> <img src="https://img.shields.io/github/release/MoonModules/WLED.svg?style=flat-square"></a><br>
<input type='file' name='update' required><br> <!--should have accept='.bin', but it prevents file upload from android app--> <input type='file' name='update' required><br> <!--should have accept='.bin', but it prevents file upload from android app-->

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
#include "palettes.h" #include "palettes.h"
// begin WLEDSR // begin WLEDMM
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
#include <Esp.h> #include <Esp.h>
// get the right RTC.H for each MCU // get the right RTC.H for each MCU
@@ -23,7 +23,7 @@
#include <Esp.h> #include <Esp.h>
#include <user_interface.h> #include <user_interface.h>
#endif #endif
// end WLEDSR // end WLEDMM
/* /*
* JSON API (De)serialization * JSON API (De)serialization
@@ -34,7 +34,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
byte id = elem["id"] | it; byte id = elem["id"] | it;
if (id >= strip.getMaxSegments()) return; if (id >= strip.getMaxSegments()) return;
//WLEDSR: add compatibility for SR presets //WLEDMM: add compatibility for SR presets
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
// Serial.printf("before %d: %s %s %s %s\n", id, elem["start"].as<std::string>().c_str(), elem["stop"].as<std::string>().c_str(), elem["startY"].as<std::string>().c_str(), elem["stopY"].as<std::string>().c_str()); // Serial.printf("before %d: %s %s %s %s\n", id, elem["start"].as<std::string>().c_str(), elem["stop"].as<std::string>().c_str(), elem["startY"].as<std::string>().c_str(), elem["stopY"].as<std::string>().c_str());
if (strip.isMatrix && !elem["start"].isNull() && !elem["stop"].isNull() && elem["startY"].isNull() && elem["stopY"].isNull()) { if (strip.isMatrix && !elem["start"].isNull() && !elem["stop"].isNull() && elem["startY"].isNull() && elem["stopY"].isNull()) {
@@ -123,7 +123,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
uint8_t soundSim = elem["ssim"] | seg.soundSim; uint8_t soundSim = elem["ssim"] | seg.soundSim;
uint8_t map1D2D = elem["mp12"] | seg.map1D2D; uint8_t map1D2D = elem["mp12"] | seg.map1D2D;
//WLEDSR jMap //WLEDMM jMap
if (map1D2D == M12_jMap && !seg.jMap) if (map1D2D == M12_jMap && !seg.jMap)
seg.createjMap(); seg.createjMap();
if (map1D2D != M12_jMap && seg.jMap) if (map1D2D != M12_jMap && seg.jMap)
@@ -156,7 +156,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
if (elem["on"].is<const char*>() && elem["on"].as<const char*>()[0] == 't') on = !on; if (elem["on"].is<const char*>() && elem["on"].as<const char*>()[0] == 't') on = !on;
seg.setOption(SEG_OPTION_ON, on); // use transition seg.setOption(SEG_OPTION_ON, on); // use transition
//WLEDSR Custom Effects (but general usable) //WLEDMM Custom Effects (but general usable)
bool reset = elem["reset"]; bool reset = elem["reset"];
if (reset) if (reset)
seg.markForReset(); seg.markForReset();
@@ -593,7 +593,7 @@ void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segme
} }
} }
// begin WLEDSR // begin WLEDMM
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
static String resetCode2Info(int reason) { static String resetCode2Info(int reason) {
switch(reason) { switch(reason) {
@@ -649,11 +649,12 @@ static String resetCode2Info(int reason) {
} }
} }
#endif #endif
// end WLEDSR // end WLEDMM
void serializeInfo(JsonObject root) void serializeInfo(JsonObject root)
{ {
root[F("ver")] = versionString; root[F("ver")] = versionString;
root[F("rel")] = releaseString; //WLEDMM to add bin name
root[F("vid")] = VERSION; root[F("vid")] = VERSION;
//root[F("cn")] = WLED_CODENAME; //root[F("cn")] = WLED_CODENAME;
@@ -769,11 +770,11 @@ void serializeInfo(JsonObject root)
//root[F("maxalloc")] = ESP.getMaxAllocHeap(); //root[F("maxalloc")] = ESP.getMaxAllocHeap();
#ifdef WLED_DEBUG #ifdef WLED_DEBUG
root[F("resetReason0")] = (int)rtc_get_reset_reason(0); root[F("resetReason0")] = (int)rtc_get_reset_reason(0);
if(ESP.getChipCores() > 1) // WLEDSR if(ESP.getChipCores() > 1) // WLEDMM
root[F("resetReason1")] = (int)rtc_get_reset_reason(1); root[F("resetReason1")] = (int)rtc_get_reset_reason(1);
#endif #endif
root[F("lwip")] = 0; //deprecated root[F("lwip")] = 0; //deprecated
root[F("totalheap")] = ESP.getHeapSize(); //WLEDSR root[F("totalheap")] = ESP.getHeapSize(); //WLEDMM
#else #else
root[F("arch")] = "esp8266"; root[F("arch")] = "esp8266";
root[F("core")] = ESP.getCoreVersion(); root[F("core")] = ESP.getCoreVersion();
@@ -785,24 +786,24 @@ void serializeInfo(JsonObject root)
#endif #endif
root[F("freeheap")] = ESP.getFreeHeap(); root[F("freeheap")] = ESP.getFreeHeap();
//WLEDSR: conditional on esp32 //WLEDMM: conditional on esp32
#if defined(ARDUINO_ARCH_ESP32) #if defined(ARDUINO_ARCH_ESP32)
root[F("minfreeheap")] = ESP.getMinFreeHeap(); root[F("minfreeheap")] = ESP.getMinFreeHeap();
#endif #endif
#if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM) && defined(BOARD_HAS_PSRAM) #if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM) && defined(BOARD_HAS_PSRAM)
if (psramFound()) { if (psramFound()) {
root[F("tpram")] = ESP.getPsramSize(); //WLEDSR root[F("tpram")] = ESP.getPsramSize(); //WLEDMM
root[F("psram")] = ESP.getFreePsram(); root[F("psram")] = ESP.getFreePsram();
root[F("psusedram")] = ESP.getMinFreePsram(); root[F("psusedram")] = ESP.getMinFreePsram();
} }
#else #else
// for testing // for testing
// root[F("tpram")] = 4194304; //WLEDSR // root[F("tpram")] = 4194304; //WLEDMM
// root[F("psram")] = 4193000; // root[F("psram")] = 4193000;
// root[F("psusedram")] = 3083000; // root[F("psusedram")] = 3083000;
#endif #endif
// begin WLEDSR // begin WLEDMM
#ifdef ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP32
root[F("e32core0code")] = (int)rtc_get_reset_reason(0); root[F("e32core0code")] = (int)rtc_get_reset_reason(0);
root[F("e32core0text")] = resetCode2Info(rtc_get_reset_reason(0)); root[F("e32core0text")] = resetCode2Info(rtc_get_reset_reason(0));
@@ -831,7 +832,7 @@ void serializeInfo(JsonObject root)
root[F("e32core0code")] = (int)ESP.getResetInfoPtr()->reason; root[F("e32core0code")] = (int)ESP.getResetInfoPtr()->reason;
root[F("e32core0text")] = F(""); root[F("e32core0text")] = F("");
#endif #endif
// end WLEDSR // end WLEDMM
root[F("uptime")] = millis()/1000 + rolloverMillis*4294967; root[F("uptime")] = millis()/1000 + rolloverMillis*4294967;

View File

@@ -127,7 +127,7 @@ void handlePresets()
#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S2) #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S2)
// this does not make sense on single core // this does not make sense on single core
core = xPortGetCoreID(); core = xPortGetCoreID();
// begin WLEDSR specific // begin WLEDMM specific
// loopTask (arduino main loop) sometimes runs on core #1 // loopTask (arduino main loop) sometimes runs on core #1
if ((core == 1) && (strncmp(pcTaskGetTaskName(NULL), "loopTask", 8) == 0)) { if ((core == 1) && (strncmp(pcTaskGetTaskName(NULL), "loopTask", 8) == 0)) {
DEBUG_PRINTF("[applyPreset] called from loopTask on core %d; forcing core = 0\n", (int)core); DEBUG_PRINTF("[applyPreset] called from loopTask on core %d; forcing core = 0\n", (int)core);
@@ -138,7 +138,7 @@ void handlePresets()
DEBUG_PRINTF("[applyPreset] called from async_tcp on core %d; forcing core = 1\n", (int)core); DEBUG_PRINTF("[applyPreset] called from async_tcp on core %d; forcing core = 1\n", (int)core);
core = 1; core = 1;
} }
// end WLEDSR specific // end WLEDMM specific
#endif #endif
#endif #endif
//only allow use of fileDoc from the core responsible for network requests (AKA HTTP JSON API) //only allow use of fileDoc from the core responsible for network requests (AKA HTTP JSON API)

View File

@@ -160,7 +160,7 @@
#include "../usermods/ADS1115_v2/usermod_ads1115.h" #include "../usermods/ADS1115_v2/usermod_ads1115.h"
#endif #endif
//WLEDSR Custom Effects //WLEDMM Custom Effects
#ifdef USERMOD_CUSTOMEFFECTS #ifdef USERMOD_CUSTOMEFFECTS
#include "../usermods/customeffects/usermod_v2_customeffects.h" #include "../usermods/customeffects/usermod_v2_customeffects.h"
#endif #endif
@@ -324,7 +324,7 @@ void registerUsermods()
usermods.add(new ADS1115Usermod()); usermods.add(new ADS1115Usermod());
#endif #endif
//WLEDSR Custom Effects //WLEDMM Custom Effects
#ifdef USERMOD_CUSTOMEFFECTS #ifdef USERMOD_CUSTOMEFFECTS
usermods.add(new CustomEffectsUserMod()); usermods.add(new CustomEffectsUserMod());
#endif #endif

View File

@@ -226,7 +226,7 @@ using PSRAMDynamicJsonDocument = BasicJsonDocument<PSRAM_Allocator>;
// Global Variable definitions // Global Variable definitions
WLED_GLOBAL char versionString[] _INIT(TOSTRING(WLED_VERSION)); WLED_GLOBAL char versionString[] _INIT(TOSTRING(WLED_VERSION));
WLED_GLOBAL char releaseString[] _INIT(TOSTRING(WLED_RELEASE_NAME)); //WLEDSR: to show on update page WLED_GLOBAL char releaseString[] _INIT(TOSTRING(WLED_RELEASE_NAME)); //WLEDMM: to show on update page
#define WLED_CODENAME "Hoshi" #define WLED_CODENAME "Hoshi"
// AP and OTA default passwords (for maximum security change them!) // AP and OTA default passwords (for maximum security change them!)

View File

@@ -45,18 +45,18 @@ void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t
request->_tempFile = WLED_FS.open(finalname, "w"); request->_tempFile = WLED_FS.open(finalname, "w");
DEBUG_PRINT(F("Uploading ")); DEBUG_PRINT(F("Uploading "));
DEBUG_PRINTLN(finalname); DEBUG_PRINTLN(finalname);
if (finalname.equals("/presets.json")) presetsModifiedTime = toki.second(); // WLEDSR if (finalname.equals("/presets.json")) presetsModifiedTime = toki.second(); // WLEDMM
} }
if (len) { if (len) {
request->_tempFile.write(data,len); request->_tempFile.write(data,len);
} }
if (final) { if (final) {
request->_tempFile.close(); request->_tempFile.close();
if (filename.equalsIgnoreCase("/cfg.json") || filename.equalsIgnoreCase("cfg.json")) { // WLEDSR if (filename.equalsIgnoreCase("/cfg.json") || filename.equalsIgnoreCase("cfg.json")) { // WLEDMM
request->send(200, "text/plain", F("Configuration restore successful.\nRebooting...")); request->send(200, "text/plain", F("Configuration restore successful.\nRebooting..."));
doReboot = true; doReboot = true;
} else { } else {
if (filename.equals("/presets.json") || filename.equals("presets.json")) { // WLEDSR if (filename.equals("/presets.json") || filename.equals("presets.json")) { // WLEDMM
request->send(200, "text/plain", F("Presets File Uploaded!")); request->send(200, "text/plain", F("Presets File Uploaded!"));
} else } else
request->send(200, "text/plain", F("File Uploaded!")); request->send(200, "text/plain", F("File Uploaded!"));

View File

@@ -151,7 +151,7 @@ bool sendLiveLedsWs(uint32_t wsClient)
uint16_t used = strip.getLengthTotal(); uint16_t used = strip.getLengthTotal();
const uint16_t MAX_LIVE_LEDS_WS = strip.isMatrix ? 1024 : 256; const uint16_t MAX_LIVE_LEDS_WS = strip.isMatrix ? 1024 : 256;
uint16_t n = ((used -1)/MAX_LIVE_LEDS_WS) +1; //only serve every n'th LED if count over MAX_LIVE_LEDS_WS uint16_t n = ((used -1)/MAX_LIVE_LEDS_WS) +1; //only serve every n'th LED if count over MAX_LIVE_LEDS_WS
uint16_t pos = (strip.isMatrix ? 6 : 2); //WLEDSR 6 instead of 4 uint16_t pos = (strip.isMatrix ? 6 : 2); //WLEDMM 6 instead of 4
uint16_t bufSize = pos + (used/n)*3; uint16_t bufSize = pos + (used/n)*3;
AsyncWebSocketMessageBuffer * wsBuf = ws.makeBuffer(bufSize); AsyncWebSocketMessageBuffer * wsBuf = ws.makeBuffer(bufSize);
if (!wsBuf) return false; //out of memory if (!wsBuf) return false; //out of memory
@@ -163,8 +163,8 @@ bool sendLiveLedsWs(uint32_t wsClient)
buffer[1] = 2; //version buffer[1] = 2; //version
buffer[2] = strip.matrixWidth; buffer[2] = strip.matrixWidth;
buffer[3] = strip.matrixHeight; buffer[3] = strip.matrixHeight;
buffer[4] = currentPreset; //WLEDSR buffer[4] = currentPreset; //WLEDMM
buffer[5] = currentPlaylist; //WLEDSR buffer[5] = currentPlaylist; //WLEDMM
} }
#endif #endif

View File

@@ -719,8 +719,8 @@ void getSettingsJS(byte subPage, char* dest)
if (subPage == 9) // update if (subPage == 9) // update
{ {
//WLEDSR: show bin name //WLEDMM: show bin name
sappends('m',SET_F("(\"sip\")[0]"),(char*)F("WLED_")); sappends('m',SET_F("(\"sip\")[0]"),(char*)F("WLEDMM_"));
olen -= 2; //delete "; olen -= 2; //delete ";
oappend(versionString); oappend(versionString);
oappend(SET_F("_")); oappend(SET_F("_"));