Merge branch 'dev' into audioreactive-prototype

This commit is contained in:
Blaz Kristan 2022-09-01 22:20:39 +02:00
commit 36e10539e0
17 changed files with 3292 additions and 3279 deletions

View File

@ -264,6 +264,7 @@ board_build.ldscript = ${common.ldscript_4m1m}
build_unflags = ${common.build_unflags} build_unflags = ${common.build_unflags}
build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266 build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266
lib_deps = ${esp8266.lib_deps} lib_deps = ${esp8266.lib_deps}
monitor_filters = esp8266_exception_decoder
[env:esp8266_2m] [env:esp8266_2m]
board = esp_wroom_02 board = esp_wroom_02

View File

@ -3470,9 +3470,9 @@ static const char _data_FX_MODE_DRIP[] PROGMEM = "Drip@Gravity,# of drips;!,!;!;
typedef struct Tetris { typedef struct Tetris {
float pos; float pos;
float speed; float speed;
uint32_t col; uint8_t col; // color index
uint16_t aux0; // 2D-fication of SEGENV.aux0 (brick size) uint16_t brick; // brick size in pixels
uint16_t aux1; // 2D-fication of SEGENV.aux1 (stack size) uint16_t stack; // stack size in pixels
uint32_t step; // 2D-fication of SEGENV.step (state) uint32_t step; // 2D-fication of SEGENV.step (state)
} tetris; } tetris;
@ -3491,7 +3491,7 @@ uint16_t mode_tetrix(void) {
static void runStrip(size_t stripNr, Tetris *drop) { static void runStrip(size_t stripNr, Tetris *drop) {
// initialize dropping on first call or segment full // initialize dropping on first call or segment full
if (SEGENV.call == 0) { if (SEGENV.call == 0) {
drop->aux1 = 0; // reset brick stack size drop->stack = 0; // reset brick stack size
drop->step = 0; drop->step = 0;
//for (int i=0; i<SEGLEN; i++) SEGMENT.setPixelColor(i | int((stripNr+1)<<16), SEGCOLOR(1)); // will fill virtual strip only //for (int i=0; i<SEGLEN; i++) SEGMENT.setPixelColor(i | int((stripNr+1)<<16), SEGCOLOR(1)); // will fill virtual strip only
} }
@ -3504,9 +3504,9 @@ uint16_t mode_tetrix(void) {
speed = map(speed, 1, 255, 5000, 250); // time taken for full (SEGLEN) drop speed = map(speed, 1, 255, 5000, 250); // time taken for full (SEGLEN) drop
drop->speed = float(SEGLEN * FRAMETIME) / float(speed); // set speed drop->speed = float(SEGLEN * FRAMETIME) / float(speed); // set speed
drop->pos = SEGLEN; // start at end of segment (no need to subtract 1) drop->pos = SEGLEN; // start at end of segment (no need to subtract 1)
drop->col = SEGMENT.color_from_palette(random8(0,15)<<4,false,false,0); // limit color choices so there is enough HUE gap drop->col = random8(0,15)<<4; // limit color choices so there is enough HUE gap
drop->step = 1; // drop state (0 init, 1 forming, 2 falling) drop->step = 1; // drop state (0 init, 1 forming, 2 falling)
drop->aux0 = (SEGMENT.intensity ? (SEGMENT.intensity>>5)+1 : random8(1,5)) * (1+(SEGLEN>>6)); // size of brick drop->brick = (SEGMENT.intensity ? (SEGMENT.intensity>>5)+1 : random8(1,5)) * (1+(SEGLEN>>6)); // size of brick
} }
if (drop->step == 1) { // forming if (drop->step == 1) { // forming
@ -3516,24 +3516,27 @@ uint16_t mode_tetrix(void) {
} }
if (drop->step == 2) { // falling if (drop->step == 2) { // falling
if (drop->pos > drop->aux1) { // fall until top of stack if (drop->pos > drop->stack) { // fall until top of stack
drop->pos -= drop->speed; // may add gravity as: speed += gravity drop->pos -= drop->speed; // may add gravity as: speed += gravity
if (uint16_t(drop->pos) < drop->aux1) drop->pos = drop->aux1; if (uint16_t(drop->pos) < drop->stack) drop->pos = drop->stack;
for (int i=int(drop->pos); i<SEGLEN; i++) SEGMENT.setPixelColor(i | int((stripNr+1)<<16), i<int(drop->pos)+drop->aux0 ? drop->col : SEGCOLOR(1)); for (int i=int(drop->pos); i<SEGLEN; i++) {
uint32_t col = i<int(drop->pos)+drop->brick ? SEGMENT.color_from_palette(drop->col, false, false, 0) : SEGCOLOR(1);
SEGMENT.setPixelColor(i | int((stripNr+1)<<16), col);
}
} else { // we hit bottom } else { // we hit bottom
drop->step = 0; // proceed with next brick, go back to init drop->step = 0; // proceed with next brick, go back to init
drop->aux1 += drop->aux0; // increase the stack size drop->stack += drop->brick; // increase the stack size
if (drop->aux1 >= SEGLEN) drop->step = millis() + 2000; // fade out stack if (drop->stack >= SEGLEN) drop->step = millis() + 2000; // fade out stack
} }
} }
if (drop->step > 2) { if (drop->step > 2) { // fade strip
drop->aux0 = 0; // reset brick size (no more growing) drop->brick = 0; // reset brick size (no more growing)
if (drop->step > millis()) { if (drop->step > millis()) {
// allow fading of virtual strip // allow fading of virtual strip
for (int i=0; i<SEGLEN; i++) SEGMENT.blendPixelColor(i | int((stripNr+1)<<16), SEGCOLOR(1), 25); // 10% blend for (int i=0; i<SEGLEN; i++) SEGMENT.blendPixelColor(i | int((stripNr+1)<<16), SEGCOLOR(1), 25); // 10% blend with Bg color
} else { } else {
drop->aux1 = 0; // reset brick stack size drop->stack = 0; // reset brick stack size
drop->step = 0; // proceed with next brick drop->step = 0; // proceed with next brick
} }
} }

View File

@ -357,26 +357,21 @@ typedef struct Segment {
union { union {
uint16_t options; //bit pattern: msb first: [transposed mirrorY reverseY] transitional (tbd) paused needspixelstate mirrored on reverse selected uint16_t options; //bit pattern: msb first: [transposed mirrorY reverseY] transitional (tbd) paused needspixelstate mirrored on reverse selected
struct { struct {
bool selected : 1; // 0 : selected bool selected : 1; // 0 : selected
bool reverse : 1; // 1 : reversed bool reverse : 1; // 1 : reversed
bool on : 1; // 2 : is On bool on : 1; // 2 : is On
bool mirror : 1; // 3 : mirrored bool mirror : 1; // 3 : mirrored
bool pxs : 1; // 4 : indicates that the effect does not use FRAMETIME or needs getPixelColor (?) bool freeze : 1; // 4 : paused/frozen
bool freeze : 1; // 5 : paused/frozen bool reset : 1; // 5 : indicates that Segment runtime requires reset
bool reset : 1; // 6 : indicates that Segment runtime requires reset bool transitional: 1; // 6 : transitional (there is transition occuring)
bool transitional: 1; // 7 : transitional (there is transition occuring) bool reverse_y : 1; // 7 : reversed Y (2D)
bool reverse_y : 1; // 8 : reversed Y (2D) bool mirror_y : 1; // 8 : mirrored Y (2D)
bool mirror_y : 1; // 9 : mirrored Y (2D) bool transpose : 1; // 9 : transposed (2D, swapped X & Y)
bool transpose : 1; // 10 : transposed (2D, swapped X & Y) uint8_t map1D2D : 3; // 10-12 : mapping for 1D effect on 2D (0-use as strip, 1-expand vertically, 2-circular/arc, 3-rectangular/corner, ...)
uint8_t map1D2D : 3; // 11-13 : mapping for 1D effect on 2D (0-use as strip, 1-expand vertically, 2-circular/arc, 3-rectangular/corner, ...) uint8_t soundSim : 3; // 13-15 : 0-7 sound simulation types
uint8_t soundSim : 2; // 14-15 : 0-3 sound simulation types
}; };
}; };
uint8_t grouping, spacing; uint8_t grouping, spacing;
//struct {
// uint8_t grouping : 4; // maximum 15 pixels in a group
// uint8_t spacing : 4; // maximum 15 pixels per gap
//};
uint8_t opacity; uint8_t opacity;
uint32_t colors[NUM_COLORS]; uint32_t colors[NUM_COLORS];
uint8_t cct; //0==1900K, 255==10091K uint8_t cct; //0==1900K, 255==10091K
@ -418,17 +413,20 @@ typedef struct Segment {
// transition data, valid only if transitional==true, holds values during transition // transition data, valid only if transitional==true, holds values during transition
struct Transition { struct Transition {
uint32_t _colorT[NUM_COLORS]; uint32_t _colorT[NUM_COLORS];
uint8_t _briT; // temporary brightness uint8_t _briT; // temporary brightness
uint8_t _cctT; // temporary CCT uint8_t _cctT; // temporary CCT
CRGBPalette16 _palT; // temporary palette CRGBPalette16 _palT; // temporary palette
uint8_t _modeP; // previous mode/effect uint8_t _modeP; // previous mode/effect
//uint16_t _aux0, _aux1; // previous mode/effect runtime data
//uint32_t _step, _call; // previous mode/effect runtime data
//byte *_data; // previous mode/effect runtime data
uint32_t _start; uint32_t _start;
uint16_t _dur; uint16_t _dur;
Transition(uint16_t dur=750) : _briT(255), _cctT(127), _palT(CRGBPalette16(CRGB::Black)), _modeP(FX_MODE_STATIC), _start(millis()), _dur(dur) {} Transition(uint16_t dur=750) : _briT(255), _cctT(127), _palT(CRGBPalette16(CRGB::Black)), _modeP(FX_MODE_STATIC), _start(millis()), _dur(dur) {}
Transition(uint16_t d, uint8_t b, uint8_t c, const uint32_t *o) : _briT(b), _cctT(c), _palT(CRGBPalette16(CRGB::Black)), _modeP(FX_MODE_STATIC), _start(millis()), _dur(d) { Transition(uint16_t d, uint8_t b, uint8_t c, const uint32_t *o) : _briT(b), _cctT(c), _palT(CRGBPalette16(CRGB::Black)), _modeP(FX_MODE_STATIC), _start(millis()), _dur(d) {
for (size_t i=0; i<NUM_COLORS; i++) _colorT[i] = o[i]; for (size_t i=0; i<NUM_COLORS; i++) _colorT[i] = o[i];
} }
} *_t; // this struct will bootloop ESP } *_t;
public: public:
@ -530,8 +528,7 @@ typedef struct Segment {
* Safe to call from interrupts and network requests. * Safe to call from interrupts and network requests.
*/ */
inline void markForReset(void) { reset = true; } // setOption(SEG_OPTION_RESET, true) inline void markForReset(void) { reset = true; } // setOption(SEG_OPTION_RESET, true)
//inline void setUpLeds() { if (!leds) leds = (CRGB*)malloc(sizeof(CRGB)*length()); } void setUpLeds(void); // set up leds[] array for loseless getPixelColor()
void setUpLeds(void);
// transition functions // transition functions
void startTransition(uint16_t dur); // transition has to start before actual segment values change void startTransition(uint16_t dur); // transition has to start before actual segment values change

View File

@ -297,8 +297,8 @@ void Segment::startTransition(uint16_t dur) {
if (!_t) _t = new Transition(dur); // no previous transition running if (!_t) _t = new Transition(dur); // no previous transition running
if (!_t) return; // failed to allocate data if (!_t) return; // failed to allocate data
_t->_briT = _briT; _t->_briT = _briT;
_t->_cctT = _cctT; _t->_cctT = _cctT;
_t->_palT = _palT; _t->_palT = _palT;
_t->_modeP = _modeP; _t->_modeP = _modeP;
for (size_t i=0; i<NUM_COLORS; i++) _t->_colorT[i] = _colorT[i]; for (size_t i=0; i<NUM_COLORS; i++) _t->_colorT[i] = _colorT[i];
@ -625,7 +625,7 @@ uint8_t Segment::differs(Segment& b) const {
if (stopY != b.stopY) d |= SEG_DIFFERS_BOUNDS; if (stopY != b.stopY) d |= SEG_DIFFERS_BOUNDS;
//bit pattern: msb first: [transposed mirrorY reverseY] transitional (tbd) paused needspixelstate mirrored on reverse selected //bit pattern: msb first: [transposed mirrorY reverseY] transitional (tbd) paused needspixelstate mirrored on reverse selected
if ((options & 0b1111111100101110) != (b.options & 0b1111111100101110)) d |= SEG_DIFFERS_OPT; if ((options & 0b1111111110011110) != (b.options & 0b1111111110011110)) d |= SEG_DIFFERS_OPT;
if ((options & 0x01) != (b.options & 0x01)) d |= SEG_DIFFERS_SEL; if ((options & 0x01) != (b.options & 0x01)) d |= SEG_DIFFERS_SEL;
for (uint8_t i = 0; i < NUM_COLORS; i++) if (colors[i] != b.colors[i]) d |= SEG_DIFFERS_COL; for (uint8_t i = 0; i < NUM_COLORS; i++) if (colors[i] != b.colors[i]) d |= SEG_DIFFERS_COL;
@ -1545,7 +1545,7 @@ const char JSON_mode_names[] PROGMEM = R"=====(["Mode names have moved"])=====";
const char JSON_palette_names[] PROGMEM = R"=====([ const char JSON_palette_names[] PROGMEM = R"=====([
"Default","* Random Cycle","* Color 1","* Colors 1&2","* Color Gradient","* Colors Only","Party","Cloud","Lava","Ocean", "Default","* Random Cycle","* Color 1","* Colors 1&2","* Color Gradient","* Colors Only","Party","Cloud","Lava","Ocean",
"Forest","Rainbow","Rainbow Bands","Sunset","Rivendell","Breeze","Red & Blue","Yellowout","Analogous","Splash", "Forest","Rainbow","Rainbow Bands","Sunset","Rivendell","Breeze","Red & Blue","Yellowout","Analogous","Splash",
"Pastel","Sunset 2","Beech","Vintage","Departure","Landscape","Beach","Sherbet","Hult","Hult 64", "Pastel","Sunset 2","Beach","Vintage","Departure","Landscape","Beech","Sherbet","Hult","Hult 64",
"Drywet","Jul","Grintage","Rewhi","Tertiary","Fire","Icefire","Cyane","Light Pink","Autumn", "Drywet","Jul","Grintage","Rewhi","Tertiary","Fire","Icefire","Cyane","Light Pink","Autumn",
"Magenta","Magred","Yelmag","Yelblu","Orange & Teal","Tiamat","April Night","Orangery","C9","Sakura", "Magenta","Magred","Yelmag","Yelblu","Orange & Teal","Tiamat","April Night","Orangery","C9","Sakura",
"Aurora","Atlantica","C9 2","C9 New","Temperature","Aurora 2","Retro Clown","Candy","Toxy Reaf","Fairy Reaf", "Aurora","Atlantica","C9 2","C9 New","Temperature","Aurora 2","Retro Clown","Candy","Toxy Reaf","Fairy Reaf",

View File

@ -226,13 +226,12 @@
#define SEG_OPTION_REVERSED 1 #define SEG_OPTION_REVERSED 1
#define SEG_OPTION_ON 2 #define SEG_OPTION_ON 2
#define SEG_OPTION_MIRROR 3 //Indicates that the effect will be mirrored within the segment #define SEG_OPTION_MIRROR 3 //Indicates that the effect will be mirrored within the segment
#define SEG_OPTION_NONUNITY 4 //Indicates that the effect does not use FRAMETIME or needs getPixelColor #define SEG_OPTION_FREEZE 4 //Segment contents will not be refreshed
#define SEG_OPTION_FREEZE 5 //Segment contents will not be refreshed #define SEG_OPTION_RESET 5 //Segment runtime requires reset
#define SEG_OPTION_RESET 6 //Segment runtime requires reset #define SEG_OPTION_TRANSITIONAL 6
#define SEG_OPTION_TRANSITIONAL 7 #define SEG_OPTION_REVERSED_Y 7
#define SEG_OPTION_REVERSED_Y 8 #define SEG_OPTION_MIRROR_Y 8
#define SEG_OPTION_MIRROR_Y 9 #define SEG_OPTION_TRANSPOSED 9
#define SEG_OPTION_TRANSPOSED 10
//Segment differs return byte //Segment differs return byte
#define SEG_DIFFERS_BRI 0x01 #define SEG_DIFFERS_BRI 0x01

View File

@ -653,8 +653,8 @@ function populateInfo(i)
} }
} }
var vcn = "Kuuhaku"; var vcn = "Kuuhaku";
if (i.ver.startsWith("0.13.")) vcn = "Toki"; if (i.ver.startsWith("0.14.")) vcn = "Hoshi";
if (i.ver.includes("-bl")) vcn = "Ryujin"; if (i.ver.includes("-bl")) vcn = "Supāku";
if (i.cn) vcn = i.cn; if (i.cn) vcn = i.cn;
cn += `v${i.ver} "${vcn}"<br><br><table> cn += `v${i.ver} "${vcn}"<br><br><table>
@ -714,7 +714,7 @@ function populateSegments(s)
} }
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':''}>Pxels</option> <option value="0" ${inst.mp12==0?' selected':''}>Pixels</option>
<option value="1" ${inst.mp12==1?' selected':''}>Bar</option> <option value="1" ${inst.mp12==1?' selected':''}>Bar</option>
<option value="2" ${inst.mp12==2?' selected':''}>Arc</option> <option value="2" ${inst.mp12==2?' selected':''}>Arc</option>
<option value="3" ${inst.mp12==3?' selected':''}>Corner</option> <option value="3" ${inst.mp12==3?' selected':''}>Corner</option>

View File

@ -230,6 +230,7 @@
Global SPI GPIOs (HW)<br> Global SPI GPIOs (HW)<br>
<i style="color: orange;">(only changable on ESP32, change requires reboot!)</i><br> <i style="color: orange;">(only changable on ESP32, change requires reboot!)</i><br>
MOSI:<input type="number" min="-1" max="33" name="MOSI" onchange="check(this,'if')" class="s" placeholder="MOSI"> MOSI:<input type="number" min="-1" max="33" name="MOSI" onchange="check(this,'if')" class="s" placeholder="MOSI">
MISO:<input type="number" min="-1" max="33" name="MISO" onchange="check(this,'if')" class="s" placeholder="MISO">
SCLK:<input type="number" min="-1" max="33" name="SCLK" onchange="check(this,'if')" class="s" placeholder="SCLK"> SCLK:<input type="number" min="-1" max="33" name="SCLK" onchange="check(this,'if')" class="s" placeholder="SCLK">
<div id="um">Loading settings...</div> <div id="um">Loading settings...</div>
<hr><button type="button" onclick="B()">Back</button><button type="submit">Save</button> <hr><button type="button" onclick="B()">Back</button><button type="submit">Save</button>

View File

@ -505,8 +505,8 @@ function populateInfo(i)
} }
} }
var vcn = "Kuuhaku"; var vcn = "Kuuhaku";
if (i.ver.startsWith("0.13.")) vcn = "Toki"; if (i.ver.startsWith("0.14.")) vcn = "Hoshi";
if (i.ver.includes("-bl")) vcn = "Ryujin"; if (i.ver.includes("-bl")) vcn = "Supāku";
if (i.cn) vcn = i.cn; if (i.cn) vcn = i.cn;
cn += `v${i.ver} "${vcn}"<br><br><table> cn += `v${i.ver} "${vcn}"<br><br><table>

View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -79,13 +79,13 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
uint16_t grp = elem["grp"] | seg.grouping; uint16_t grp = elem["grp"] | seg.grouping;
uint16_t spc = elem[F("spc")] | seg.spacing; uint16_t spc = elem[F("spc")] | seg.spacing;
uint16_t of = seg.offset; uint16_t of = seg.offset;
uint8_t soundSim = elem[F("ssim")] | seg.soundSim; uint8_t soundSim = elem["ssim"] | seg.soundSim;
uint8_t map1D2D = elem[F("mp12")] | seg.map1D2D; uint8_t map1D2D = elem["mp12"] | seg.map1D2D;
if ((spc>0 && spc!=seg.spacing) || seg.map1D2D!=map1D2D) seg.fill(BLACK); // clear spacing gaps if ((spc>0 && spc!=seg.spacing) || seg.map1D2D!=map1D2D) seg.fill(BLACK); // clear spacing gaps
seg.map1D2D = map1D2D & 0x07; seg.map1D2D = constrain(map1D2D, 0, 7);
seg.soundSim = soundSim & 0x03; seg.soundSim = constrain(soundSim, 0, 7);
uint16_t len = 1; uint16_t len = 1;
if (stop > start) len = stop - start; if (stop > start) len = stop - start;
@ -162,12 +162,12 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
} }
#endif #endif
seg.selected = elem["sel"] | seg.selected; seg.selected = elem["sel"] | seg.selected;
seg.reverse = elem["rev"] | seg.reverse; seg.reverse = elem["rev"] | seg.reverse;
seg.mirror = elem[F("mi")] | seg.mirror; seg.mirror = elem["mi"] | seg.mirror;
#ifndef WLED_DISABLE_2D #ifndef WLED_DISABLE_2D
seg.reverse_y = elem[F("rY")] | seg.reverse_y; seg.reverse_y = elem["rY"] | seg.reverse_y;
seg.mirror_y = elem[F("mY")] | seg.mirror_y; seg.mirror_y = elem["mY"] | seg.mirror_y;
seg.transpose = elem[F("tp")] | seg.transpose; seg.transpose = elem[F("tp")] | seg.transpose;
#endif #endif
@ -185,17 +185,17 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
if (elem[F("fxdef")]) if (elem[F("fxdef")])
{ {
int16_t sOpt; int16_t sOpt;
sOpt = extractModeDefaults(fx, SET_F("sx")); if (sOpt >= 0) seg.speed = sOpt; sOpt = extractModeDefaults(fx, "sx"); if (sOpt >= 0) seg.speed = sOpt;
sOpt = extractModeDefaults(fx, SET_F("ix")); if (sOpt >= 0) seg.intensity = sOpt; sOpt = extractModeDefaults(fx, "ix"); if (sOpt >= 0) seg.intensity = sOpt;
sOpt = extractModeDefaults(fx, SET_F("c1")); if (sOpt >= 0) seg.custom1 = sOpt; sOpt = extractModeDefaults(fx, "c1"); if (sOpt >= 0) seg.custom1 = sOpt;
sOpt = extractModeDefaults(fx, SET_F("c2")); if (sOpt >= 0) seg.custom2 = sOpt; sOpt = extractModeDefaults(fx, "c2"); if (sOpt >= 0) seg.custom2 = sOpt;
sOpt = extractModeDefaults(fx, SET_F("c3")); if (sOpt >= 0) seg.custom3 = sOpt; sOpt = extractModeDefaults(fx, "c3"); if (sOpt >= 0) seg.custom3 = sOpt;
sOpt = extractModeDefaults(fx, SET_F("mp12")); if (sOpt >= 0) seg.map1D2D = sOpt & 0x07; sOpt = extractModeDefaults(fx, "mp12"); if (sOpt >= 0) seg.map1D2D = constrain(sOpt, 0, 7);
sOpt = extractModeDefaults(fx, SET_F("ssim")); if (sOpt >= 0) seg.soundSim = sOpt & 0x03; sOpt = extractModeDefaults(fx, "ssim"); if (sOpt >= 0) seg.soundSim = constrain(sOpt, 0, 7);
sOpt = extractModeDefaults(fx, "rev"); if (sOpt >= 0) seg.reverse = (bool)sOpt; sOpt = extractModeDefaults(fx, "rev"); if (sOpt >= 0) seg.reverse = (bool)sOpt;
sOpt = extractModeDefaults(fx, SET_F("mi")); if (sOpt >= 0) seg.mirror = (bool)sOpt; // NOTE: setting this option is a risky business sOpt = extractModeDefaults(fx, "mi"); if (sOpt >= 0) seg.mirror = (bool)sOpt; // NOTE: setting this option is a risky business
sOpt = extractModeDefaults(fx, SET_F("rY")); if (sOpt >= 0) seg.reverse_y = (bool)sOpt; sOpt = extractModeDefaults(fx, "rY"); if (sOpt >= 0) seg.reverse_y = (bool)sOpt;
sOpt = extractModeDefaults(fx, SET_F("mY")); if (sOpt >= 0) seg.mirror_y = (bool)sOpt; // NOTE: setting this option is a risky business sOpt = extractModeDefaults(fx, "mY"); if (sOpt >= 0) seg.mirror_y = (bool)sOpt; // NOTE: setting this option is a risky business
sOpt = extractModeDefaults(fx, "pal"); sOpt = extractModeDefaults(fx, "pal");
if (sOpt >= 0 && sOpt < strip.getPaletteCount() + strip.customPalettes.size()) { if (sOpt >= 0 && sOpt < strip.getPaletteCount() + strip.customPalettes.size()) {
if (sOpt != seg.palette) { if (sOpt != seg.palette) {
@ -206,8 +206,8 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
} }
//getVal also supports inc/decrementing and random //getVal also supports inc/decrementing and random
getVal(elem[F("sx")], &seg.speed); getVal(elem["sx"], &seg.speed);
getVal(elem[F("ix")], &seg.intensity); getVal(elem["ix"], &seg.intensity);
uint8_t pal = seg.palette; uint8_t pal = seg.palette;
if (getVal(elem["pal"], &pal, 1, strip.getPaletteCount())) { if (getVal(elem["pal"], &pal, 1, strip.getPaletteCount())) {
if (pal != seg.palette) { if (pal != seg.palette) {
@ -215,15 +215,15 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
seg.palette = pal; seg.palette = pal;
} }
} }
getVal(elem[F("c1")], &seg.custom1); getVal(elem["c1"], &seg.custom1);
getVal(elem[F("c2")], &seg.custom2); getVal(elem["c2"], &seg.custom2);
uint8_t cust3 = seg.custom3; uint8_t cust3 = seg.custom3;
getVal(elem[F("c3")], &cust3); // we can't pass reference to bifield getVal(elem["c3"], &cust3); // we can't pass reference to bifield
seg.custom3 = cust3; seg.custom3 = constrain(cust3, 0, 31);
seg.check1 = elem[F("o1")] | seg.check1; seg.check1 = elem["o1"] | seg.check1;
seg.check2 = elem[F("o2")] | seg.check2; seg.check2 = elem["o2"] | seg.check2;
seg.check3 = elem[F("o3")] | seg.check3; seg.check3 = elem["o3"] | seg.check3;
JsonArray iarr = elem[F("i")]; //set individual LEDs JsonArray iarr = elem[F("i")]; //set individual LEDs
if (!iarr.isNull()) { if (!iarr.isNull()) {
@ -496,26 +496,26 @@ void serializeSegment(JsonObject& root, Segment& seg, byte id, bool forPreset, b
strcat(colstr, "]"); strcat(colstr, "]");
root["col"] = serialized(colstr); root["col"] = serialized(colstr);
root["fx"] = seg.mode; root["fx"] = seg.mode;
root[F("sx")] = seg.speed; root["sx"] = seg.speed;
root[F("ix")] = seg.intensity; root["ix"] = seg.intensity;
root["pal"] = seg.palette; root["pal"] = seg.palette;
root[F("c1")] = seg.custom1; root["c1"] = seg.custom1;
root[F("c2")] = seg.custom2; root["c2"] = seg.custom2;
root[F("c3")] = seg.custom3; root["c3"] = seg.custom3;
root[F("sel")] = seg.isSelected(); root["sel"] = seg.isSelected();
root["rev"] = seg.reverse; root["rev"] = seg.reverse;
root[F("mi")] = seg.mirror; root["mi"] = seg.mirror;
if (strip.isMatrix) { if (strip.isMatrix) {
root[F("rY")] = seg.reverse_y; root["rY"] = seg.reverse_y;
root[F("mY")] = seg.mirror_y; root["mY"] = seg.mirror_y;
root[F("tp")] = seg.transpose; root[F("tp")] = seg.transpose;
} }
root[F("o1")] = seg.check1; root["o1"] = seg.check1;
root[F("o2")] = seg.check2; root["o2"] = seg.check2;
root[F("o3")] = seg.check3; root["o3"] = seg.check3;
root[F("ssim")] = seg.soundSim; root["ssim"] = seg.soundSim;
root[F("mp12")] = seg.map1D2D; root["mp12"] = seg.map1D2D;
} }
void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segmentBounds) void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segmentBounds)
@ -628,6 +628,7 @@ void serializeInfo(JsonObject root)
JsonArray spi = root.createNestedArray(F("spi")); JsonArray spi = root.createNestedArray(F("spi"));
spi.add(spi_mosi); spi.add(spi_mosi);
spi.add(spi_sclk); spi.add(spi_sclk);
spi.add(spi_miso);
#endif #endif
root[F("str")] = syncToggleReceive; root[F("str")] = syncToggleReceive;
@ -920,12 +921,13 @@ void serializeNodes(JsonObject root)
void serializeModeData(JsonArray fxdata) void serializeModeData(JsonArray fxdata)
{ {
char lineBuffer[128];
for (size_t i = 0; i < strip.getModeCount(); i++) { for (size_t i = 0; i < strip.getModeCount(); i++) {
String lineBuffer = FPSTR(strip.getModeData(i)); strncpy_P(lineBuffer, strip.getModeData(i), 127);
if (lineBuffer.length() > 0) { if (lineBuffer[0] != 0) {
uint8_t endPos = lineBuffer.indexOf('@'); char* dataPtr = strchr(lineBuffer,'@');
if (endPos>0) fxdata.add(lineBuffer.substring(endPos)); if (dataPtr) fxdata.add(dataPtr);
else fxdata.add(""); else fxdata.add("");
} }
} }
} }
@ -933,12 +935,13 @@ void serializeModeData(JsonArray fxdata)
// deserializes mode names string into JsonArray // deserializes mode names string into JsonArray
// also removes WLED-SR extensions (@...) from deserialised names // also removes WLED-SR extensions (@...) from deserialised names
void serializeModeNames(JsonArray arr) { void serializeModeNames(JsonArray arr) {
char lineBuffer[128];
for (size_t i = 0; i < strip.getModeCount(); i++) { for (size_t i = 0; i < strip.getModeCount(); i++) {
String lineBuffer = FPSTR(strip.getModeData(i)); strncpy_P(lineBuffer, strip.getModeData(i), 127);
if (lineBuffer.length() > 0) { if (lineBuffer[0] != 0) {
uint8_t endPos = lineBuffer.indexOf('@'); char* dataPtr = strchr(lineBuffer,'@');
if (endPos>0) arr.add(lineBuffer.substring(0, endPos)); if (dataPtr) *dataPtr = 0; // terminate mode data after name
else arr.add(lineBuffer); arr.add(lineBuffer);
} }
} }
} }
@ -969,7 +972,6 @@ void serveJson(AsyncWebServerRequest* request)
request->send(response); request->send(response);
releaseJSONBufferLock(); releaseJSONBufferLock();
} else { } else {
//request->send_P(200, "application/json", JSON_mode_names);
request->send(503, "application/json", F("{\"error\":3}")); request->send(503, "application/json", F("{\"error\":3}"));
} }
return; return;
@ -1013,11 +1015,11 @@ void serveJson(AsyncWebServerRequest* request)
serializeInfo(info); serializeInfo(info);
if (subJson != 3) if (subJson != 3)
{ {
//lDoc[F("effects")] = serialized((const __FlashStringHelper*)JSON_mode_names);
JsonArray effects = lDoc.createNestedArray(F("effects")); JsonArray effects = lDoc.createNestedArray(F("effects"));
serializeModeNames(effects); // remove WLED-SR extensions from effect names serializeModeNames(effects); // remove WLED-SR extensions from effect names
lDoc[F("palettes")] = serialized((const __FlashStringHelper*)JSON_palette_names); lDoc[F("palettes")] = serialized((const __FlashStringHelper*)JSON_palette_names);
} }
//lDoc["m"] = lDoc.memoryUsage(); // JSON buffer usage, for remote debugging
} }
DEBUG_PRINTF("JSON buffer size: %u for request: %d\n", lDoc.memoryUsage(), subJson); DEBUG_PRINTF("JSON buffer size: %u for request: %d\n", lDoc.memoryUsage(), subJson);

View File

@ -665,6 +665,9 @@ void sendSysInfoUDP()
#define DDP_FLAGS1_STORAGE 0x08 #define DDP_FLAGS1_STORAGE 0x08
#define DDP_FLAGS1_TIME 0x10 #define DDP_FLAGS1_TIME 0x10
#define DDP_TYPE_RGB24 0x0A
#define DDP_TYPE_RGBW32 0x1A // proposal, this is still not an official part of the DDP spec
#define DDP_ID_DISPLAY 1 #define DDP_ID_DISPLAY 1
#define DDP_ID_CONFIG 250 #define DDP_ID_CONFIG 250
#define DDP_ID_STATUS 251 #define DDP_ID_STATUS 251
@ -724,7 +727,7 @@ uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8
// write the header // write the header
/*0*/ddpUdp.write(flags); /*0*/ddpUdp.write(flags);
/*1*/ddpUdp.write(sequenceNumber++ & 0x0F); // sequence may be unnecessary unless we are sending twice (as requested in Sync settings) /*1*/ddpUdp.write(sequenceNumber++ & 0x0F); // sequence may be unnecessary unless we are sending twice (as requested in Sync settings)
/*2*/ddpUdp.write(0); /*2*/ddpUdp.write(0); // data type, this is not fully defined by the DDP spec and thus left at "undefined" which is assumed to be 24-bit RGB
/*3*/ddpUdp.write(DDP_ID_DISPLAY); /*3*/ddpUdp.write(DDP_ID_DISPLAY);
// data offset in bytes, 32-bit number, MSB first // data offset in bytes, 32-bit number, MSB first
/*4*/ddpUdp.write(0xFF & (channel >> 24)); /*4*/ddpUdp.write(0xFF & (channel >> 24));

View File

@ -355,17 +355,22 @@ uint8_t extractModeSlider(uint8_t mode, uint8_t slider, char *dest, uint8_t maxL
} }
// extracts mode parameter defaults from last section of mode data (e.g. "Juggle@!,Trail;!,!,;!;sx=16,ix=240,1d")
int16_t extractModeDefaults(uint8_t mode, const char *segVar) int16_t extractModeDefaults(uint8_t mode, const char *segVar)
{ {
if (mode < strip.getModeCount()) { if (mode < strip.getModeCount()) {
String lineBuffer = FPSTR(strip.getModeData(mode)); char lineBuffer[128] = "";
if (lineBuffer.length() > 0) { strncpy_P(lineBuffer, strip.getModeData(mode), 127);
int16_t start = lineBuffer.lastIndexOf(';'); lineBuffer[127] = '\0'; // terminate string
if (start<0) return -1; if (lineBuffer[0] != 0) {
char* startPtr = strrchr(lineBuffer, ';'); // last ";" in FX data
if (!startPtr) return -1;
int16_t stop = lineBuffer.indexOf(segVar, start+1); char* stopPtr = strstr(startPtr, segVar);
if (stop<0) return -1; if (!stopPtr) return -1;
return atoi(lineBuffer.substring(stop+strlen(segVar)+1).c_str());
stopPtr += strlen(segVar) +1; // skip "="
return atoi(stopPtr);
} }
} }
return -1; return -1;

View File

@ -8,7 +8,7 @@
*/ */
// version code in format yymmddb (b = daily build) // version code in format yymmddb (b = daily build)
#define VERSION 2208301 #define VERSION 2208311
//uncomment this if you have a "my_config.h" file you'd like to use //uncomment this if you have a "my_config.h" file you'd like to use
//#define WLED_USE_MY_CONFIG //#define WLED_USE_MY_CONFIG
@ -222,7 +222,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));
#define WLED_CODENAME "Toki" #define WLED_CODENAME "Hoshi"
// AP and OTA default passwords (for maximum security change them!) // AP and OTA default passwords (for maximum security change them!)
WLED_GLOBAL char apPass[65] _INIT(DEFAULT_AP_PASS); WLED_GLOBAL char apPass[65] _INIT(DEFAULT_AP_PASS);

View File

@ -414,10 +414,10 @@ void deEEP() {
for (byte j = 0; j < numChannels; j++) colX.add(EEPROM.read(memloc + j)); for (byte j = 0; j < numChannels; j++) colX.add(EEPROM.read(memloc + j));
} }
segObj["fx"] = EEPROM.read(i+10); segObj["fx"] = EEPROM.read(i+10);
segObj[F("sx")] = EEPROM.read(i+11); segObj["sx"] = EEPROM.read(i+11);
segObj[F("ix")] = EEPROM.read(i+16); segObj["ix"] = EEPROM.read(i+16);
segObj["pal"] = EEPROM.read(i+17); segObj["pal"] = EEPROM.read(i+17);
} else { } else {
Segment* seg = strip.getSegments(); Segment* seg = strip.getSegments();
memcpy(seg, EEPROM.getDataPtr() +i+2, 240); memcpy(seg, EEPROM.getDataPtr() +i+2, 240);

View File

@ -641,6 +641,7 @@ void getSettingsJS(byte subPage, char* dest)
oappend(SET_F("addInfo('SDA','")); oappendi(HW_PIN_SDA); oappend(SET_F("');")); oappend(SET_F("addInfo('SDA','")); oappendi(HW_PIN_SDA); oappend(SET_F("');"));
oappend(SET_F("addInfo('SCL','")); oappendi(HW_PIN_SCL); oappend(SET_F("');")); oappend(SET_F("addInfo('SCL','")); oappendi(HW_PIN_SCL); oappend(SET_F("');"));
oappend(SET_F("addInfo('MOSI','")); oappendi(HW_PIN_DATASPI); oappend(SET_F("');")); oappend(SET_F("addInfo('MOSI','")); oappendi(HW_PIN_DATASPI); oappend(SET_F("');"));
oappend(SET_F("addInfo('MISO','")); oappendi(HW_PIN_MISOSPI); oappend(SET_F("');"));
oappend(SET_F("addInfo('SCLK','")); oappendi(HW_PIN_CLOCKSPI); oappend(SET_F("');")); oappend(SET_F("addInfo('SCLK','")); oappendi(HW_PIN_CLOCKSPI); oappend(SET_F("');"));
usermods.appendConfigData(); usermods.appendConfigData();
} }