Reverse proxy support.

This commit is contained in:
Blaz Kristan 2023-06-04 18:40:29 +02:00
parent 1e7071bff3
commit 26bec11d76
26 changed files with 5055 additions and 4819 deletions

View File

@ -42,6 +42,6 @@
<img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAbUExURQAAAAB81gCU/zKq/////9bW1oCAgGhoaAAAAGPLX8AAAAAJdFJOU///////////AFNPeBIAAAAJcEhZcwAADsAAAA7AAWrWiQkAAACdSURBVDhPxc9bDoUgEANQebP/FUuHMjBGY/B+3EYR7RH0qC/ZBc6HwCljgHO+xZIVSI2sYgHaG7EBWh8jWoxTrCBFdDJ+BD4lbIHxAcz8APAVLTsrZE4eQD5qzt3cAFTYokC4YCN9Gybgu4yAQtBFLQXHuHABA7JMeOEC/E0W5uy9gv4vo5QHK2i7yq2C8UABM4HmL+CSTXCTF1DrCX6+Gp9zB5dsAAAAAElFTkSuQmCC"> <img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAbUExURQAAAAB81gCU/zKq/////9bW1oCAgGhoaAAAAGPLX8AAAAAJdFJOU///////////AFNPeBIAAAAJcEhZcwAADsAAAA7AAWrWiQkAAACdSURBVDhPxc9bDoUgEANQebP/FUuHMjBGY/B+3EYR7RH0qC/ZBc6HwCljgHO+xZIVSI2sYgHaG7EBWh8jWoxTrCBFdDJ+BD4lbIHxAcz8APAVLTsrZE4eQD5qzt3cAFTYokC4YCN9Gybgu4yAQtBFLQXHuHABA7JMeOEC/E0W5uy9gv4vo5QHK2i7yq2C8UABM4HmL+CSTXCTF1DrCX6+Gp9zB5dsAAAAAElFTkSuQmCC">
<h1>404 Not Found</h1> <h1>404 Not Found</h1>
<b>Akemi does not know where you are headed...</b><br><br> <b>Akemi does not know where you are headed...</b><br><br>
<button onclick="window.location.href='/sliders'">Back to controls</button> <button onclick="window.location.href='../sliders'">Back to controls</button>
</body> </body>
</html> </html>

View File

@ -67,7 +67,7 @@
<button id="buttonSr" onclick="toggleLiveview()"><i class="icons">&#xe410;</i><p class="tab-label">Peek</p></button> <button id="buttonSr" onclick="toggleLiveview()"><i class="icons">&#xe410;</i><p class="tab-label">Peek</p></button>
<button id="buttonI" onclick="toggleInfo()"><i class="icons">&#xe066;</i><p class="tab-label">Info</p></button> <button id="buttonI" onclick="toggleInfo()"><i class="icons">&#xe066;</i><p class="tab-label">Info</p></button>
<button id="buttonNodes" onclick="toggleNodes()"><i class="icons">&#xe22d;</i><p class="tab-label">Nodes</p></button> <button id="buttonNodes" onclick="toggleNodes()"><i class="icons">&#xe22d;</i><p class="tab-label">Nodes</p></button>
<button onclick="window.location.href='/settings';"><i class="icons">&#xe0a2;</i><p class="tab-label">Config</p></button> <button onclick="window.location.href=getURL('/settings');"><i class="icons">&#xe0a2;</i><p class="tab-label">Config</p></button>
<button id="buttonPcm" onclick="togglePcMode(true)"><i class="icons">&#xe23d;</i><p class="tab-label">PC Mode</p></button> <button id="buttonPcm" onclick="togglePcMode(true)"><i class="icons">&#xe23d;</i><p class="tab-label">PC Mode</p></button>
</div> </div>
<div id="briwrap"> <div id="briwrap">
@ -88,7 +88,7 @@
<div class ="container"> <div class ="container">
<div id="Colors" class="tabcontent"> <div id="Colors" class="tabcontent">
<div id="picker" class="noslide"></div> <div id="picker" class="noslide"></div>
<div id="hwrap" class="slider"> <div id="hwrap" class="slider" style="margin-top: 20px;">
<div class="sliderwrap il"> <div class="sliderwrap il">
<input id="sliderH" class="noslide" oninput="fromH()" onchange="setColor(0)" max="359" min="0" type="range" value="0" step="any"> <input id="sliderH" class="noslide" oninput="fromH()" onchange="setColor(0)" max="359" min="0" type="range" value="0" step="any">
<div class="sliderdisplay" style="background: linear-gradient(90deg, #f00 2%, #ff0 19%, #0f0 35%, #0ff 52%, #00f 68%, #f0f 85%, #f00)"></div> <div class="sliderdisplay" style="background: linear-gradient(90deg, #f00 2%, #ff0 19%, #0f0 35%, #0ff 52%, #00f 68%, #f0f 85%, #f00)"></div>
@ -199,7 +199,7 @@
</div> </div>
</div> </div>
<div style="padding-bottom: 10px;"> <div style="padding-bottom: 10px;">
<button class="btn btn-xs" type="button" onclick="window.location.href=(loc?'http://'+locip:'')+'/cpal.htm'"><i class="icons btn-icon">&#xe18a;</i></button> <button class="btn btn-xs" type="button" onclick="window.location.href=getURL('/cpal.htm')"><i class="icons btn-icon">&#xe18a;</i></button>
<button class="btn btn-xs" type="button" onclick="palettesData=null;localStorage.removeItem('wledPalx');requestJson({rmcpal:true});setTimeout(loadPalettes,250,loadPalettesData);"><i class="icons btn-icon">&#xe037;</i></button> <button class="btn btn-xs" type="button" onclick="palettesData=null;localStorage.removeItem('wledPalx');requestJson({rmcpal:true});setTimeout(loadPalettes,250,loadPalettesData);"><i class="icons btn-icon">&#xe037;</i></button>
</div> </div>
</div> </div>

View File

@ -1,5 +1,5 @@
//page js //page js
var loc = false, locip; var loc = false, locip, locproto = "http:";
var isOn = false, nlA = false, isLv = false, isInfo = false, isNodes = false, syncSend = false, syncTglRecv = true; var isOn = false, nlA = false, isLv = false, isInfo = false, isNodes = false, syncSend = false, syncTglRecv = true;
var hasWhite = false, hasRGB = false, hasCCT = false; var hasWhite = false, hasRGB = false, hasCCT = false;
var nlDur = 60, nlTar = 0; var nlDur = 60, nlTar = 0;
@ -193,12 +193,15 @@ function loadSkinCSS(cId)
l.id = cId; l.id = cId;
l.rel = 'stylesheet'; l.rel = 'stylesheet';
l.type = 'text/css'; l.type = 'text/css';
l.href = (loc?`http://${locip}`:'.') + '/skin.css'; l.href = getURL('/skin.css');
l.media = 'all'; l.media = 'all';
h.appendChild(l); h.appendChild(l);
} }
} }
function getURL(path) {
return (loc ? locproto + "//" + locip : "") + path;
}
function onLoad() function onLoad()
{ {
if (window.location.protocol == "file:") { if (window.location.protocol == "file:") {
@ -208,6 +211,19 @@ function onLoad()
locip = prompt("File Mode. Please enter WLED IP!"); locip = prompt("File Mode. Please enter WLED IP!");
localStorage.setItem('locIp', locip); localStorage.setItem('locIp', locip);
} }
} else {
// detect reverse proxy and/or HTTPS
let l = window.location;
let pathn = l.pathname;
let paths = pathn.slice(1,pathn.endsWith('/')?-1:undefined).split("/");
locproto = l.protocol;
locip = l.hostname + (l.port ? ":" + l.port : "")
if (paths.length > 1) {
loc = true;
locip += "/" + paths[0];
} else if (locproto==="https:") {
loc = true;
}
} }
var sett = localStorage.getItem('wledUiCfg'); var sett = localStorage.getItem('wledUiCfg');
if (sett) cfg = mergeDeep(cfg, JSON.parse(sett)); if (sett) cfg = mergeDeep(cfg, JSON.parse(sett));
@ -217,7 +233,7 @@ function onLoad()
if (localStorage.getItem('pcm') == "true" || (!/Mobi/.test(navigator.userAgent) && localStorage.getItem('pcm') == null)) togglePcMode(true); if (localStorage.getItem('pcm') == "true" || (!/Mobi/.test(navigator.userAgent) && localStorage.getItem('pcm') == null)) togglePcMode(true);
applyCfg(); applyCfg();
if (cfg.comp.hdays) { //load custom holiday list if (cfg.comp.hdays) { //load custom holiday list
fetch((loc?`http://${locip}`:'.') + "/holidays.json", { // may be loaded from external source fetch(getURL("/holidays.json"), { // may be loaded from external source
method: 'get' method: 'get'
}) })
.then((res)=>{ .then((res)=>{
@ -433,9 +449,7 @@ function loadPresets(callback = null)
// afterwards // afterwards
if (!callback && pmt == pmtLast) return; if (!callback && pmt == pmtLast) return;
var url = (loc?`http://${locip}`:'') + '/presets.json'; fetch(getURL('/presets.json'), {
fetch(url, {
method: 'get' method: 'get'
}) })
.then(res => { .then(res => {
@ -459,9 +473,7 @@ function loadPresets(callback = null)
function loadPalettes(callback = null) function loadPalettes(callback = null)
{ {
var url = (loc?`http://${locip}`:'') + '/json/palettes'; fetch(getURL('/json/palettes'), {
fetch(url, {
method: 'get' method: 'get'
}) })
.then((res)=>{ .then((res)=>{
@ -483,9 +495,7 @@ function loadPalettes(callback = null)
function loadFX(callback = null) function loadFX(callback = null)
{ {
var url = (loc?`http://${locip}`:'') + '/json/effects'; fetch(getURL('/json/effects'), {
fetch(url, {
method: 'get' method: 'get'
}) })
.then((res)=>{ .then((res)=>{
@ -508,9 +518,7 @@ function loadFX(callback = null)
function loadFXData(callback = null) function loadFXData(callback = null)
{ {
var url = (loc?`http://${locip}`:'') + '/json/fxdata'; fetch(getURL('/json/fxdata'), {
fetch(url, {
method: 'get' method: 'get'
}) })
.then((res)=>{ .then((res)=>{
@ -1034,8 +1042,7 @@ function populateNodes(i,n)
function loadNodes() function loadNodes()
{ {
var url = (loc?`http://${locip}`:'') + '/json/nodes'; fetch(getURL('/json/nodes'), {
fetch(url, {
method: 'get' method: 'get'
}) })
.then((res)=>{ .then((res)=>{
@ -1296,7 +1303,8 @@ function cmpP(a, b)
function makeWS() { function makeWS() {
if (ws || lastinfo.ws < 0) return; if (ws || lastinfo.ws < 0) return;
ws = new WebSocket((window.location.protocol == "https:"?"wss":"ws")+'://'+(loc?locip:window.location.hostname)+'/ws'); let url = loc ? getURL('/ws').replace("http","ws") : "ws://"+window.location.hostname+"/ws";
ws = new WebSocket(url);
ws.binaryType = "arraybuffer"; ws.binaryType = "arraybuffer";
ws.onmessage = (e)=>{ ws.onmessage = (e)=>{
if (e.data instanceof ArrayBuffer) return; // liveview packet if (e.data instanceof ArrayBuffer) return; // liveview packet
@ -1575,7 +1583,6 @@ function requestJson(command=null)
if (command && !reqsLegal) return; // stop post requests from chrome onchange event on page restore if (command && !reqsLegal) return; // stop post requests from chrome onchange event on page restore
if (!jsonTimeout) jsonTimeout = setTimeout(()=>{if (ws) ws.close(); ws=null; showErrorToast()}, 3000); if (!jsonTimeout) jsonTimeout = setTimeout(()=>{if (ws) ws.close(); ws=null; showErrorToast()}, 3000);
var req = null; var req = null;
var url = (loc?`http://${locip}`:'') + '/json/si';
var useWs = (ws && ws.readyState === WebSocket.OPEN); var useWs = (ws && ws.readyState === WebSocket.OPEN);
var type = command ? 'post':'get'; var type = command ? 'post':'get';
if (command) { if (command) {
@ -1596,7 +1603,7 @@ function requestJson(command=null)
return; return;
} }
fetch(url, { fetch(getURL('/json/si'), {
method: type, method: type,
headers: { headers: {
"Content-type": "application/json; charset=UTF-8" "Content-type": "application/json; charset=UTF-8"
@ -1691,7 +1698,7 @@ function toggleLiveview()
} }
gId(lvID).style.display = (isLv) ? "block":"none"; gId(lvID).style.display = (isLv) ? "block":"none";
var url = (loc?`http://${locip}`:'') + "/" + lvID; var url = getURL("/" + lvID);
gId(lvID).src = (isLv) ? url:"about:blank"; gId(lvID).src = (isLv) ? url:"about:blank";
gId('buttonSr').className = (isLv) ? "active":""; gId('buttonSr').className = (isLv) ? "active":"";
if (!isLv && ws && ws.readyState === WebSocket.OPEN) ws.send('{"lv":false}'); if (!isLv && ws && ws.readyState === WebSocket.OPEN) ws.send('{"lv":false}');
@ -2641,9 +2648,7 @@ function loadPalettesData(callback = null)
function getPalettesData(page, callback) function getPalettesData(page, callback)
{ {
var url = (loc?`http://${locip}`:'') + `/json/palx?page=${page}`; fetch(getURL(`/json/palx?page=${page}`), {
fetch(url, {
method: 'get', method: 'get',
headers: { headers: {
"Content-type": "application/json; charset=UTF-8" "Content-type": "application/json; charset=UTF-8"

View File

@ -31,7 +31,7 @@
tmout = setTimeout(update, 250); tmout = setTimeout(update, 250);
return; return;
} }
fetch('/json/live') fetch('./json/live')
.then(res => { .then(res => {
if (!res.ok) { if (!res.ok) {
clearTimeout(tmout); clearTimeout(tmout);

View File

@ -29,8 +29,15 @@
//console.info("Peek uses top WS"); //console.info("Peek uses top WS");
ws.send("{'lv':true}"); ws.send("{'lv':true}");
} else { } else {
console.info("Peek WS opening"); //console.info("Peek WS opening");
ws = new WebSocket((window.location.protocol == "https:"?"wss":"ws")+"://"+document.location.host+"/ws"); let l = window.location;
let pathn = l.pathname;
let paths = pathn.slice(1,pathn.endsWith('/')?-1:undefined).split("/");
let url = l.origin.replace("http","ws");
if (paths.length > 1) {
url += "/" + paths[0];
}
ws = new WebSocket(url+"/ws");
ws.onopen = function () { ws.onopen = function () {
//console.info("Peek WS open"); //console.info("Peek WS open");
ws.send("{'lv':true}"); ws.send("{'lv':true}");

View File

@ -33,7 +33,14 @@
if (ws && ws.readyState === WebSocket.OPEN) { if (ws && ws.readyState === WebSocket.OPEN) {
ws.send("{'lv':true}"); ws.send("{'lv':true}");
} else { } else {
ws = new WebSocket((window.location.protocol == "https:"?"wss":"ws")+"://"+document.location.host+"/ws"); let l = window.location;
let pathn = l.pathname;
let paths = pathn.slice(1,pathn.endsWith('/')?-1:undefined).split("/");
let url = l.origin.replace("http","ws");
if (paths.length > 1) {
url += "/" + paths[0];
}
ws = new WebSocket(url+"/ws");
ws.onopen = ()=>{ ws.onopen = ()=>{
ws.send("{'lv':true}"); ws.send("{'lv':true}");
} }

View File

@ -6,8 +6,8 @@
<title>WLED Message</title> <title>WLED Message</title>
<script> <script>
function B() { window.history.back() }; function B() { window.history.back() };
function RS() { window.location = "/settings"; } function RS() { window.location = "../settings"; }
function RP() { top.location.href = "/"; } function RP() { top.location.href = "../"; }
</script> </script>
<style> <style>
@import url("style.css"); @import url("style.css");

View File

@ -6,7 +6,7 @@
<title>WLED Settings</title> <title>WLED Settings</title>
<script> <script>
var d=document; var d=document;
var loc = false, locip; var loc = false, locip, locproto = "http:";
function gId(n){return d.getElementById(n);} function gId(n){return d.getElementById(n);}
// https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript // https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript
function loadJS(FILE_URL, async = true) { function loadJS(FILE_URL, async = true) {
@ -34,9 +34,20 @@
locip = prompt("File Mode. Please enter WLED IP!"); locip = prompt("File Mode. Please enter WLED IP!");
localStorage.setItem('locIp', locip); localStorage.setItem('locIp', locip);
} }
} else {
// detect reverse proxy
let path = window.location.pathname;
let paths = path.slice(1,path.endsWith('/')?-1:undefined).split("/");
if (paths.length > 1) {
locproto = window.location.protocol;
loc = true;
locip = window.location.hostname+window.location.port+"/"+paths[0];
} }
var url = (loc?`http://${locip}`:'') + '/settings/s.js?p=0'; }
loadJS(url, false); // If we set async false, file is loaded and executed, then next statement is processed loadJS(getURL('/settings/s.js?p=0'), false); // If we set async false, file is loaded and executed, then next statement is processed
}
function getURL(path) {
return (loc ? locproto + "//" + locip : "") + path;
} }
</script> </script>
<style> <style>
@ -65,15 +76,15 @@
</style> </style>
</head> </head>
<body onload="S()"> <body onload="S()">
<button type=submit id="b" onclick="window.location='/'">Back</button> <button type=submit id="b" onclick="window.location=getURL('/')">Back</button>
<button type="submit" onclick="window.location='./settings/wifi'">WiFi Setup</button> <button type="submit" onclick="window.location=getURL('/settings/wifi')">WiFi Setup</button>
<button type="submit" onclick="window.location='./settings/leds'">LED Preferences</button> <button type="submit" onclick="window.location=getURL('/settings/leds')">LED Preferences</button>
<button id="2dbtn" style="display:none;" type="submit" onclick="window.location='./settings/2D'">2D Configuration</button> <button id="2dbtn" style="display:none;" type="submit" onclick="window.location=getURL('/settings/2D')">2D Configuration</button>
<button type="submit" onclick="window.location='./settings/ui'">User Interface</button> <button type="submit" onclick="window.location=getURL('/settings/ui')">User Interface</button>
<button id="dmxbtn" style="display:none;" type="submit" onclick="window.location='./settings/dmx'">DMX Output</button> <button id="dmxbtn" style="display:none;" type="submit" onclick="window.location=getURL('/settings/dmx')">DMX Output</button>
<button type="submit" onclick="window.location='./settings/sync'">Sync Interfaces</button> <button type="submit" onclick="window.location=getURL('/settings/sync')">Sync Interfaces</button>
<button type="submit" onclick="window.location='./settings/time'">Time & Macros</button> <button type="submit" onclick="window.location=getURL('/settings/time')">Time & Macros</button>
<button type="submit" onclick="window.location='./settings/um'">Usermods</button> <button type="submit" onclick="window.location=getURL('/settings/um')">Usermods</button>
<button type="submit" onclick="window.location='./settings/sec'">Security & Updates</button> <button type="submit" onclick="window.location=getURL('/settings/sec')">Security & Updates</button>
</body> </body>
</html> </html>

View File

@ -7,11 +7,11 @@
<title>2D Set-up</title> <title>2D Set-up</title>
<script> <script>
var d=document; var d=document;
var loc = false, locip; var loc = false, locip, locproto = "http:";
var maxPanels=64; var maxPanels=64;
var ctx = null; // WLEDMM var ctx = null; // WLEDMM
function H(){window.open("https://kno.wled.ge/features/2D");} function H(){window.open("https://kno.wled.ge/features/2D");}
function B(){window.open("/settings","_self");} function B(){window.open(getURL("/settings"),"_self");}
function gId(n){return d.getElementById(n);} function gId(n){return d.getElementById(n);}
function fS(){d.Sf.submit();} // <button type=submit> sometimes didn't work function fS(){d.Sf.submit();} // <button type=submit> sometimes didn't work
// https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript // https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript
@ -42,9 +42,21 @@
locip = prompt("File Mode. Please enter WLED IP!"); locip = prompt("File Mode. Please enter WLED IP!");
localStorage.setItem('locIp', locip); localStorage.setItem('locIp', locip);
} }
} else {
// detect reverse proxy
let path = window.location.pathname;
let paths = path.slice(1,path.endsWith('/')?-1:undefined).split("/");
if (paths.length > 2) {
locproto = window.location.protocol;
loc = true;
locip = window.location.hostname+window.location.port+"/"+paths[0];
} }
var url = (loc?`http://${locip}`:'') + '/settings/s.js?p=10'; }
loadJS(url, false); // If we set async false, file is loaded and executed, then next statement is processed loadJS(getURL('/settings/s.js?p=10'), false); // If we set async false, file is loaded and executed, then next statement is processed
if (loc) d.Sf.action = getURL('/settings/2D');
}
function getURL(path) {
return (loc ? locproto + "//" + locip : "") + path;
} }
function UI() { function UI() {

View File

@ -7,9 +7,9 @@
<title>DMX Settings</title> <title>DMX Settings</title>
<script> <script>
var d=document; var d=document;
var loc = false, locip; var loc = false, locip, locproto = "http:";
function H(){window.open("https://github.com/Aircoookie/WLED/wiki/DMX");} function H(){window.open("https://github.com/Aircoookie/WLED/wiki/DMX");}
function B(){window.history.back();} function B(){window.open(getURL("/settings"),"_self");}
function GCH(num) { function GCH(num) {
d.getElementById('dmxchannels').innerHTML += ""; d.getElementById('dmxchannels').innerHTML += "";
for (i=0;i<num;i++) { for (i=0;i<num;i++) {
@ -61,9 +61,21 @@
locip = prompt("File Mode. Please enter WLED IP!"); locip = prompt("File Mode. Please enter WLED IP!");
localStorage.setItem('locIp', locip); localStorage.setItem('locIp', locip);
} }
} else {
// detect reverse proxy
let path = window.location.pathname;
let paths = path.slice(1,path.endsWith('/')?-1:undefined).split("/");
if (paths.length > 2) {
locproto = window.location.protocol;
loc = true;
locip = window.location.hostname+window.location.port+"/"+paths[0];
} }
var url = (loc?`http://${locip}`:'') + '/settings/s.js?p=7'; }
loadJS(url, false); // If we set async false, file is loaded and executed, then next statement is processed loadJS(getURL('/settings/s.js?p=7'), false); // If we set async false, file is loaded and executed, then next statement is processed
if (loc) d.Sf.action = getURL('/settings/dmx');
}
function getURL(path) {
return (loc ? locproto + "//" + locip : "") + path;
} }
</script> </script>
<style>@import url("style.css");</style> <style>@import url("style.css");</style>

View File

@ -12,9 +12,9 @@
d.ro_gpio = []; d.ro_gpio = [];
d.max_gpio = 39; d.max_gpio = 39;
var customStarts=false,startsDirty=[],maxCOOverrides=5; var customStarts=false,startsDirty=[],maxCOOverrides=5;
var loc = false, locip; var loc = false, locip, locproto = "http:";
function H(){window.open("https://kno.wled.ge/features/settings/#led-settings");} function H(){window.open("https://kno.wled.ge/features/settings/#led-settings");}
function B(){window.open("/settings","_self");} function B(){window.open(getURL("/settings"),"_self");}
function gId(n){return d.getElementById(n);} function gId(n){return d.getElementById(n);}
function off(n){d.getElementsByName(n)[0].value = -1;} function off(n){d.getElementsByName(n)[0].value = -1;}
// https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript // https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript
@ -554,9 +554,21 @@ Length: <input type="number" name="XC${i}" id="xc${i}" class="l" min="1" max="65
locip = prompt("File Mode. Please enter WLED IP!"); locip = prompt("File Mode. Please enter WLED IP!");
localStorage.setItem('locIp', locip); localStorage.setItem('locIp', locip);
} }
} else {
// detect reverse proxy
let path = window.location.pathname;
let paths = path.slice(1,path.endsWith('/')?-1:undefined).split("/");
if (paths.length > 2) {
locproto = window.location.protocol;
loc = true;
locip = window.location.hostname+window.location.port+"/"+paths[0];
} }
var url = (loc?`http://${locip}`:'') + '/settings/s.js?p=2'; }
loadJS(url, false); // If we set async false, file is loaded and executed, then next statement is processed loadJS(getURL('/settings/s.js?p=2'), false); // If we set async false, file is loaded and executed, then next statement is processed
if (loc) d.Sf.action = getURL('/settings/leds');
}
function getURL(path) {
return (loc ? locproto + "//" + locip : "") + path;
} }
</script> </script>
<style>@import url("style.css");</style> <style>@import url("style.css");</style>

View File

@ -7,7 +7,7 @@
<title>PIN required</title> <title>PIN required</title>
<script> <script>
var d = document; var d = document;
function B() { window.open("/settings","_self"); } function B() { window.open("../settings","_self"); }
</script> </script>
<style> <style>
@import url("style.css"); @import url("style.css");

View File

@ -7,10 +7,10 @@
<title>Misc Settings</title> <title>Misc Settings</title>
<script> <script>
var d = document; var d = document;
var loc = false, locip; var loc = false, locip, locproto = "http:";
function H() { window.open("https://kno.wled.ge/features/settings/#security-settings"); } function H() { window.open("https://kno.wled.ge/features/settings/#security-settings"); }
function B() { window.open("/settings","_self"); } function B() { window.open(getURL("/settings"),"_self"); }
function U() { window.open("/update","_self"); } function U() { window.open(getURL("/update"),"_self"); }
function gId(s) { return d.getElementById(s); } function gId(s) { return d.getElementById(s); }
function isObj(o) { return (o && typeof o === 'object' && !Array.isArray(o)); } function isObj(o) { return (o && typeof o === 'object' && !Array.isArray(o)); }
// https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript // https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript
@ -72,9 +72,21 @@
locip = prompt("File Mode. Please enter WLED IP!"); locip = prompt("File Mode. Please enter WLED IP!");
localStorage.setItem('locIp', locip); localStorage.setItem('locIp', locip);
} }
} else {
// detect reverse proxy
let path = window.location.pathname;
let paths = path.slice(1,path.endsWith('/')?-1:undefined).split("/");
if (paths.length > 2) {
locproto = window.location.protocol;
loc = true;
locip = window.location.hostname+window.location.port+"/"+paths[0];
} }
var url = (loc?`http://${locip}`:'') + '/settings/s.js?p=6'; }
loadJS(url, false); // If we set async false, file is loaded and executed, then next statement is processed loadJS(getURL('/settings/s.js?p=6'), false); // If we set async false, file is loaded and executed, then next statement is processed
if (loc) d.Sf.action = getURL('/settings/sec');
}
function getURL(path) {
return (loc ? locproto + "//" + locip : "") + path;
} }
</script> </script>
<style> <style>

View File

@ -6,11 +6,11 @@
<meta charset="utf-8"> <meta charset="utf-8">
<title>Sync Settings</title> <title>Sync Settings</title>
<script>var d=document; <script>var d=document;
var loc = false, locip; var loc = false, locip, locproto;
function gId(s){return d.getElementById(s);} function gId(s){return d.getElementById(s);}
function toggle(el){gId(el).classList.toggle("hide"); gId('No'+el).classList.toggle("hide");} function toggle(el){gId(el).classList.toggle("hide"); gId('No'+el).classList.toggle("hide");}
function H(){window.open("https://kno.wled.ge/interfaces/udp-notifier/");} function H(){window.open("https://kno.wled.ge/interfaces/udp-notifier/");}
function B(){window.open("/settings","_self");} function B(){window.open(getURL("/settings"),"_self");}
function adj(){if (d.Sf.DI.value == 6454) {if (d.Sf.EU.value == 1) d.Sf.EU.value = 0;} function adj(){if (d.Sf.DI.value == 6454) {if (d.Sf.EU.value == 1) d.Sf.EU.value = 0;}
else if (d.Sf.DI.value == 5568) {if (d.Sf.DA.value == 0) d.Sf.DA.value = 1; if (d.Sf.EU.value == 0) d.Sf.EU.value = 1;} } else if (d.Sf.DI.value == 5568) {if (d.Sf.DA.value == 0) d.Sf.DA.value = 1; if (d.Sf.EU.value == 0) d.Sf.EU.value = 1;} }
// https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript // https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript
@ -56,6 +56,7 @@
function SP(){var p = d.Sf.DI.value; gId("xp").style.display = (p > 0)?"none":"block"; if (p > 0) d.Sf.EP.value = p;} function SP(){var p = d.Sf.DI.value; gId("xp").style.display = (p > 0)?"none":"block"; if (p > 0) d.Sf.EP.value = p;}
function SetVal(){switch(parseInt(d.Sf.EP.value)){case 5568: d.Sf.DI.value = 5568; break; case 6454: d.Sf.DI.value = 6454; break; case 4048: d.Sf.DI.value = 4048; break; }; SP();FC();} function SetVal(){switch(parseInt(d.Sf.EP.value)){case 5568: d.Sf.DI.value = 5568; break; case 6454: d.Sf.DI.value = 6454; break; case 4048: d.Sf.DI.value = 4048; break; }; SP();FC();}
function S(){ function S(){
locproto = "http:";
if (window.location.protocol == "file:") { if (window.location.protocol == "file:") {
loc = true; loc = true;
locip = localStorage.getItem('locIp'); locip = localStorage.getItem('locIp');
@ -63,9 +64,20 @@
locip = prompt("File Mode. Please enter WLED IP!"); locip = prompt("File Mode. Please enter WLED IP!");
localStorage.setItem('locIp', locip); localStorage.setItem('locIp', locip);
} }
} else {
// detect reverse proxy
let paths = window.location.pathname.slice(1,window.location.pathname.endsWith('/')?-1:0).split("/");
if (paths.length > 2) {
locproto = window.location.protocol;
loc = true;
locip = window.location.hostname+window.location.port+"/"+paths[0];
} }
var url = (loc?`http://${locip}`:'') + '/settings/s.js?p=4'; }
loadJS(url, false); // If we set async false, file is loaded and executed, then next statement is processed loadJS(getURL('/settings/s.js?p=4'), false); // If we set async false, file is loaded and executed, then next statement is processed
if (loc) d.Sf.action = getURL('/settings/sync');
}
function getURL(path) {
return (loc ? locproto + "//" + locip : "") + path;
} }
</script> </script>
<style>@import url("style.css");</style> <style>@import url("style.css");</style>

View File

@ -7,11 +7,11 @@
<title>Time Settings</title> <title>Time Settings</title>
<script> <script>
var d=document; var d=document;
var loc = false, locip; var loc = false, locip, locproto = "http:";
var el=false; var el=false;
var ms=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; var ms=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
function H() { window.open("https://kno.wled.ge/features/settings/#time-settings"); } function H() { window.open("https://kno.wled.ge/features/settings/#time-settings"); }
function B() { window.open("/settings","_self"); } function B() { window.open(getURL("/settings"),"_self"); }
function gId(s) { return d.getElementById(s); } function gId(s) { return d.getElementById(s); }
function gN(s) { return d.getElementsByName(s)[0]; } function gN(s) { return d.getElementsByName(s)[0]; }
// https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript // https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript
@ -40,9 +40,21 @@
locip = prompt("File Mode. Please enter WLED IP!"); locip = prompt("File Mode. Please enter WLED IP!");
localStorage.setItem('locIp', locip); localStorage.setItem('locIp', locip);
} }
} else {
// detect reverse proxy
let path = window.location.pathname;
let paths = path.slice(1,path.endsWith('/')?-1:undefined).split("/");
if (paths.length > 2) {
locproto = window.location.protocol;
loc = true;
locip = window.location.hostname+window.location.port+"/"+paths[0];
} }
var url = (loc?`http://${locip}`:'') + '/settings/s.js?p=5'; }
loadJS(url, false); // If we set async false, file is loaded and executed, then next statement is processed loadJS(getURL('/settings/s.js?p=5'), false); // If we set async false, file is loaded and executed, then next statement is processed
if (loc) d.Sf.action = getURL('/settings/time');
}
function getURL(path) {
return (loc ? locproto + "//" + locip : "") + path;
} }
function expand(o,i) function expand(o,i)
{ {

View File

@ -7,7 +7,7 @@
<title>UI Settings</title> <title>UI Settings</title>
<script> <script>
var d = document; var d = document;
var loc = false, locip; var loc = false, locip, locproto = "http:";
var initial_ds, initial_st, initial_su; var initial_ds, initial_st, initial_su;
var sett = null; var sett = null;
var l = { var l = {
@ -185,8 +185,7 @@
alert("Loading of configuration script failed.\nIncomplete page data!"); alert("Loading of configuration script failed.\nIncomplete page data!");
}); });
} }
function S() function S() {
{
if (window.location.protocol == "file:") { if (window.location.protocol == "file:") {
loc = true; loc = true;
locip = localStorage.getItem('locIp'); locip = localStorage.getItem('locIp');
@ -194,12 +193,24 @@
locip = prompt("File Mode. Please enter WLED IP!"); locip = prompt("File Mode. Please enter WLED IP!");
localStorage.setItem('locIp', locip); localStorage.setItem('locIp', locip);
} }
} else {
// detect reverse proxy
let path = window.location.pathname;
let paths = path.slice(1,path.endsWith('/')?-1:undefined).split("/");
if (paths.length > 2) {
locproto = window.location.protocol;
loc = true;
locip = window.location.hostname+window.location.port+"/"+paths[0];
} }
var url = (loc?`http://${locip}`:'') + '/settings/s.js?p=3'; }
loadJS(url, false); // If we set async false, file is loaded and executed, then next statement is processed loadJS(getURL('/settings/s.js?p=3'), false); // If we set async false, file is loaded and executed, then next statement is processed
if (loc) d.Sf.action = getURL('/settings/ui');
}
function getURL(path) {
return (loc ? locproto + "//" + locip : "") + path;
} }
function H() { window.open("https://kno.wled.ge/features/settings/#user-interface-settings"); } function H() { window.open("https://kno.wled.ge/features/settings/#user-interface-settings"); }
function B() { window.open("/settings","_self"); } function B() { window.open(getURL("/settings"),"_self"); }
function UI() function UI()
{ {
gId('idonthateyou').style.display = (gId('dm').checked) ? 'inline':'none'; gId('idonthateyou').style.display = (gId('dm').checked) ? 'inline':'none';

View File

@ -13,13 +13,13 @@
d.ro_gpio = []; d.ro_gpio = [];
var umCfg = {}; var umCfg = {};
var pins = [], pinO = [], owner; var pins = [], pinO = [], owner;
var loc = false, locip; var loc = false, locip, locproto = "http:";
var urows; var urows;
var numM = 0; var numM = 0;
function gId(s) { return d.getElementById(s); } function gId(s) { return d.getElementById(s); }
function isO(i) { return (i && typeof i === 'object' && !Array.isArray(i)); } function isO(i) { return (i && typeof i === 'object' && !Array.isArray(i)); }
function H() { window.open("https://github.com/Aircoookie/WLED/wiki/Settings#usermod-settings"); } function H() { window.open("https://github.com/Aircoookie/WLED/wiki/Settings#usermod-settings"); }
function B() { window.open("/settings","_self"); } function B() { window.open(getURL("/settings"),"_self"); }
// https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript // https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript
function loadJS(FILE_URL, async = true) { function loadJS(FILE_URL, async = true) {
let scE = d.createElement("script"); let scE = d.createElement("script");
@ -54,9 +54,22 @@
locip = prompt("File Mode. Please enter WLED IP!"); locip = prompt("File Mode. Please enter WLED IP!");
localStorage.setItem('locIp', locip); localStorage.setItem('locIp', locip);
} }
} else {
// detect reverse proxy
let path = window.location.pathname;
let paths = path.slice(1,path.endsWith('/')?-1:undefined).split("/");
if (paths.length > 2) {
locproto = window.location.protocol;
loc = true;
locip = window.location.hostname+window.location.port+"/"+paths[0];
}
} }
ldS(); ldS();
if (!numM) gId("um").innerHTML = "No Usermods installed."; if (!numM) gId("um").innerHTML = "No Usermods installed.";
if (loc) d.Sf.action = getURL('/settings/um');
}
function getURL(path) {
return (loc ? locproto + "//" + locip : "") + path;
} }
// 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); }
@ -196,8 +209,7 @@
} }
// load settings and insert values into DOM // load settings and insert values into DOM
function ldS() { function ldS() {
var url = (loc?`http://${locip}`:'') + '/cfg.json'; fetch(getURL('/cfg.json'), {
fetch(url, {
method: 'get' method: 'get'
}) })
.then(res => { .then(res => {
@ -216,8 +228,7 @@
} }
if (urows==="") urows = "Usermods configuration not found.<br>Press <i>Save</i> to initialize defaults."; if (urows==="") urows = "Usermods configuration not found.<br>Press <i>Save</i> to initialize defaults.";
gId("um").innerHTML = urows; gId("um").innerHTML = urows;
var url = (loc?`http://${locip}`:'') + '/settings/s.js?p=8'; loadJS(getURL('/settings/s.js?p=8'), false); // If we set async false, file is loaded and executed, then next statement is processed
loadJS(url, false); // If we set async false, file is loaded and executed, then next statement is processed
}) })
.catch((error)=>{ .catch((error)=>{
gId('lserr').style.display = "inline"; gId('lserr').style.display = "inline";

View File

@ -7,21 +7,19 @@
<title>WiFi Settings</title> <title>WiFi Settings</title>
<script> <script>
var d = document; var d = document;
var loc = false, locip; var loc = false, locip, locproto = "http:";
var scanLoops = 0, preScanSSID = ""; var scanLoops = 0, preScanSSID = "";
function gId(e) { return d.getElementById(e); } function gId(e) { return d.getElementById(e); }
function cE(e) { return d.createElement(e); } function cE(e) { return d.createElement(e); }
function H(){window.open("https://kno.wled.ge/features/settings/#wifi-settings");} function H(){window.open("https://kno.wled.ge/features/settings/#wifi-settings");}
function B(){window.open("/settings","_self");} function B(){window.open(getURL("/settings"),"_self");}
function N() { function N() {
const url = (loc?`http://${locip}`:"") + "/json/net";
const button = gId("scan"); const button = gId("scan");
button.disabled = true; button.disabled = true;
button.innerHTML = "Scanning..."; button.innerHTML = "Scanning...";
fetch(url).then((response) => { fetch(getURL("/json/net")).then((response) => {
return response.json(); return response.json();
}).then((json) => { }).then((json) => {
// Get the list of networks only, defaulting to an empty array. // Get the list of networks only, defaulting to an empty array.
@ -124,14 +122,26 @@
function S() { function S() {
if (window.location.protocol == "file:") { if (window.location.protocol == "file:") {
loc = true; loc = true;
locip = localStorage.getItem("locIp"); locip = localStorage.getItem('locIp');
if (!locip) { if (!locip) {
locip = prompt("File Mode. Please enter WLED IP!"); locip = prompt("File Mode. Please enter WLED IP!");
localStorage.setItem("locIp", locip); localStorage.setItem('locIp', locip);
}
} else {
// detect reverse proxy
let path = window.location.pathname;
let paths = path.slice(1,path.endsWith('/')?-1:undefined).split("/");
if (paths.length > 2) {
locproto = window.location.protocol;
loc = true;
locip = window.location.hostname+window.location.port+"/"+paths[0];
} }
} }
let url = (loc?`http://${locip}`:'') + '/settings/s.js?p=1'; loadJS(getURL('/settings/s.js?p=1'), false); // If we set async false, file is loaded and executed, then next statement is processed
loadJS(url, false); // If we set async false, file is loaded and executed, then next statement is processed if (loc) d.Sf.action = getURL('/settings/wifi');
}
function getURL(path) {
return (loc ? locproto + "//" + locip : "") + path;
} }
</script> </script>
<style>@import url("style.css");</style> <style>@import url("style.css");</style>

View File

@ -1,5 +1,5 @@
//page js //page js
var loc = false, locip; var loc = false, locip, locproto = "http:";
var noNewSegs = false; var noNewSegs = false;
var isOn = false, isInfo = false, isNodes = false, isRgbw = false, cct = false; var isOn = false, isInfo = false, isNodes = false, isRgbw = false, cct = false;
var whites = [0,0,0]; var whites = [0,0,0];
@ -148,12 +148,15 @@ function loadSkinCSS(cId)
l.id = cId; l.id = cId;
l.rel = 'stylesheet'; l.rel = 'stylesheet';
l.type = 'text/css'; l.type = 'text/css';
l.href = (loc?`http://${locip}`:'.') + '/skin.css'; l.href = getURL('/skin.css');
l.media = 'all'; l.media = 'all';
h.appendChild(l); h.appendChild(l);
} }
} }
function getURL(path) {
return (loc ? locproto + "//" + locip : "") + path;
}
async function onLoad() async function onLoad()
{ {
if (window.location.protocol == "file:") { if (window.location.protocol == "file:") {
@ -164,6 +167,19 @@ async function onLoad()
locip = prompt("File Mode. Please enter WLED IP!"); locip = prompt("File Mode. Please enter WLED IP!");
localStorage.setItem('locIp', locip); localStorage.setItem('locIp', locip);
} }
} else {
// detect reverse proxy and/or HTTPS
let l = window.location;
let pathn = l.pathname;
let paths = pathn.slice(1,pathn.endsWith('/')?-1:undefined).split("/");
locproto = l.protocol;
locip = l.hostname + (l.port ? ":" + l.port : "")
if (paths.length > 1) {
loc = true;
locip += "/" + paths[0];
} else if (locproto==="https:") {
loc = true;
}
} }
var sett = localStorage.getItem('wledUiCfg'); var sett = localStorage.getItem('wledUiCfg');
if (sett) cfg = mergeDeep(cfg, JSON.parse(sett)); if (sett) cfg = mergeDeep(cfg, JSON.parse(sett));
@ -173,7 +189,7 @@ async function onLoad()
applyCfg(); applyCfg();
if (cfg.theme.bg.url=="" || cfg.theme.bg.url === "https://picsum.photos/1920/1080") { if (cfg.theme.bg.url=="" || cfg.theme.bg.url === "https://picsum.photos/1920/1080") {
var iUrl = cfg.theme.bg.url; var iUrl = cfg.theme.bg.url;
fetch((loc?`http://${locip}`:'.') + "/holidays.json", { fetch(getURL("/holidays.json"), {
method: 'get' method: 'get'
}) })
.then((res)=>{ .then((res)=>{
@ -330,9 +346,7 @@ function loadPresets(callback = null)
pmtLast = pmt; pmtLast = pmt;
var url = (loc?`http://${locip}`:'') + '/presets.json'; fetch(getURL('/presets.json'), {
fetch(url, {
method: 'get' method: 'get'
}) })
.then(res => { .then(res => {
@ -355,9 +369,7 @@ function loadPresets(callback = null)
function loadPalettes(callback = null) function loadPalettes(callback = null)
{ {
var url = (loc?`http://${locip}`:'') + '/json/palettes'; fetch(getURL('/json/palettes'), {
fetch(url, {
method: 'get' method: 'get'
}) })
.then(res => { .then(res => {
@ -379,9 +391,7 @@ function loadPalettes(callback = null)
function loadFX(callback = null) function loadFX(callback = null)
{ {
var url = (loc?`http://${locip}`:'') + '/json/effects'; fetch(getURL('/json/effects'), {
fetch(url, {
method: 'get' method: 'get'
}) })
.then(res => { .then(res => {
@ -403,9 +413,7 @@ function loadFX(callback = null)
function loadFXData(callback = null) function loadFXData(callback = null)
{ {
var url = (loc?`http://${locip}`:'') + '/json/fxdata'; fetch(getURL('/json/fxdata'), {
fetch(url, {
method: 'get' method: 'get'
}) })
.then(res => { .then(res => {
@ -611,8 +619,7 @@ function populateNodes(i,n)
function loadNodes() function loadNodes()
{ {
var url = (loc?`http://${locip}`:'') + '/json/nodes'; fetch(getURL('/json/nodes'), {
fetch(url, {
method: 'get' method: 'get'
}) })
.then(res => { .then(res => {
@ -855,7 +862,8 @@ function cmpP(a, b)
function makeWS() { function makeWS() {
if (ws) return; if (ws) return;
ws = new WebSocket('ws://'+(loc?locip:window.location.hostname)+'/ws'); let url = loc ? getURL('/ws').replace("http","ws") : "ws://"+window.location.hostname+"/ws";
ws = new WebSocket(url);
ws.onmessage = (e)=>{ ws.onmessage = (e)=>{
var json = JSON.parse(e.data); var json = JSON.parse(e.data);
if (json.leds) return; //liveview packet if (json.leds) return; //liveview packet
@ -974,7 +982,6 @@ function requestJson(command=null)
if (command && !reqsLegal) return; //stop post requests from chrome onchange event on page restore if (command && !reqsLegal) return; //stop post requests from chrome onchange event on page restore
if (!jsonTimeout) jsonTimeout = setTimeout(showErrorToast, 3000); if (!jsonTimeout) jsonTimeout = setTimeout(showErrorToast, 3000);
var req = null; var req = null;
var url = (loc?`http://${locip}`:'') + '/json/si';
var useWs = (ws && ws.readyState === WebSocket.OPEN); var useWs = (ws && ws.readyState === WebSocket.OPEN);
var type = command ? 'post':'get'; var type = command ? 'post':'get';
if (command) { if (command) {
@ -991,7 +998,7 @@ function requestJson(command=null)
setTimeout(requestJson,200); setTimeout(requestJson,200);
} }
fetch(url, { fetch(getURL('/json/si'), {
method: type, method: type,
headers: { headers: {
"Content-type": "application/json; charset=UTF-8" "Content-type": "application/json; charset=UTF-8"
@ -1314,9 +1321,7 @@ function loadPalettesData(callback = null)
function getPalettesData(page, callback) function getPalettesData(page, callback)
{ {
var url = (loc?`http://${locip}`:'') + `/json/palx?page=${page}`; fetch(getURL(`/json/palx?page=${page}`), {
fetch(url, {
method: 'get', method: 'get',
headers: { headers: {
"Content-type": "application/json; charset=UTF-8" "Content-type": "application/json; charset=UTF-8"

View File

@ -15,7 +15,7 @@
<body onload="GetV()"> <body onload="GetV()">
<h2>WLED Software Update</h2> <h2>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 version: <span class="sip">##VERSION##</span><br> Installed version: <span class="sip">##VERSION##</span><br>
Download the latest binary: <a href="https://github.com/Aircoookie/WLED/releases" target="_blank"> Download the latest binary: <a href="https://github.com/Aircoookie/WLED/releases" target="_blank">
<img src="https://img.shields.io/github/release/Aircoookie/WLED.svg?style=flat-square"></a><br> <img src="https://img.shields.io/github/release/Aircoookie/WLED.svg?style=flat-square"></a><br>

View File

@ -55,9 +55,9 @@
<h3>Thank you for installing my application!</h3> <h3>Thank you for installing my application!</h3>
<b>Next steps:</b><br><br> <b>Next steps:</b><br><br>
Connect the module to your local WiFi here!<br> Connect the module to your local WiFi here!<br>
<button onclick="window.location.href='/settings/wifi'">WiFi settings</button><br> <button onclick="window.location.href='./settings/wifi'">WiFi settings</button><br>
<i>Just trying this out in AP mode?</i><br> <i>Just trying this out in AP mode?</i><br>
<button onclick="window.location.href='/sliders'">To the controls!</button><br> <button onclick="window.location.href='./sliders'">To the controls!</button><br>
</div> </div>
</body> </body>
</html> </html>

View File

@ -20,7 +20,7 @@ const uint8_t PAGE_usermod[] PROGMEM = {
// Autogenerated from wled00/data/msg.htm, do not edit!! // Autogenerated from wled00/data/msg.htm, do not edit!!
const char PAGE_msg[] PROGMEM = R"=====(<!DOCTYPE html><html><head><meta content="width=device-width" name="viewport"> const char PAGE_msg[] PROGMEM = R"=====(<!DOCTYPE html><html><head><meta content="width=device-width" name="viewport">
<title>WLED Message</title><script> <title>WLED Message</title><script>
function B(){window.history.back()}function RS(){window.location="/settings"}function RP(){top.location.href="/"} function B(){window.history.back()}function RS(){window.location="../settings"}function RP(){top.location.href="../"}
</script><style>@import url("style.css");</style></head><body><h2>%MSG%</body></html>)====="; </script><style>@import url("style.css");</style></head><body><h2>%MSG%</body></html>)=====";
@ -41,52 +41,52 @@ const char PAGE_dmxmap[] PROGMEM = R"=====()=====";
#endif #endif
// Autogenerated from wled00/data/update.htm, do not edit!! // Autogenerated from wled00/data/update.htm, do not edit!!
const uint16_t PAGE_update_length = 615; const uint16_t PAGE_update_length = 616;
const uint8_t PAGE_update[] PROGMEM = { const uint8_t PAGE_update[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x75, 0x53, 0x5d, 0x6f, 0xd4, 0x30, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x75, 0x53, 0x5d, 0x6f, 0xd4, 0x30,
0x10, 0x7c, 0xcf, 0xaf, 0x70, 0xfd, 0x74, 0x27, 0x71, 0x4e, 0xa9, 0x78, 0xa1, 0x24, 0x29, 0x1c, 0x10, 0x7c, 0xcf, 0xaf, 0x70, 0xfd, 0x74, 0x27, 0x71, 0x76, 0xa9, 0x78, 0xa1, 0x24, 0x29, 0x94,
0xad, 0x50, 0x25, 0xa4, 0x56, 0x6a, 0x0b, 0xe2, 0x09, 0x39, 0xf6, 0xe6, 0x62, 0xce, 0xb1, 0x53, 0x56, 0xa8, 0x12, 0x12, 0x95, 0xda, 0x82, 0x78, 0x42, 0x8e, 0xbd, 0xb9, 0x98, 0x73, 0xec, 0xd4,
0x7b, 0x73, 0xa7, 0xa8, 0xea, 0x7f, 0x67, 0xe3, 0xdc, 0x15, 0xc4, 0xc7, 0x4b, 0x14, 0x67, 0x67, 0xde, 0xdc, 0xe9, 0x84, 0xfa, 0xdf, 0xd9, 0x38, 0x77, 0x05, 0xf1, 0xf1, 0x12, 0xc5, 0xd9, 0xd9,
0xc7, 0xbb, 0x33, 0x93, 0xe2, 0xe4, 0xf2, 0xe6, 0xe3, 0xfd, 0xb7, 0xdb, 0x2b, 0xd6, 0x62, 0x67, 0xf1, 0xee, 0xcc, 0xa4, 0x3c, 0xb9, 0xfa, 0xf4, 0xfe, 0xfe, 0xeb, 0xed, 0x35, 0xeb, 0xb0, 0x77,
0xab, 0xe2, 0xf0, 0x04, 0xa9, 0xab, 0xa2, 0x03, 0x94, 0x4c, 0x79, 0x87, 0xe0, 0xb0, 0xe4, 0x7b, 0x75, 0x79, 0x78, 0x82, 0x32, 0x75, 0xd9, 0x03, 0x2a, 0xa6, 0x83, 0x47, 0xf0, 0x58, 0xf1, 0x9d,
0xa3, 0xb1, 0x2d, 0x35, 0xec, 0x8c, 0x82, 0x55, 0x3a, 0x70, 0xe6, 0x64, 0x07, 0x25, 0xdf, 0x19, 0x35, 0xd8, 0x55, 0x06, 0xb6, 0x56, 0xc3, 0x2a, 0x1f, 0x38, 0xf3, 0xaa, 0x87, 0x8a, 0x6f, 0x2d,
0xd8, 0xf7, 0x3e, 0x20, 0xaf, 0xb2, 0x02, 0x0d, 0x5a, 0xa8, 0xbe, 0x7e, 0xbe, 0xba, 0x64, 0x0f, 0xec, 0x86, 0x10, 0x91, 0xd7, 0x45, 0x89, 0x16, 0x1d, 0xd4, 0x5f, 0x3e, 0x5e, 0x5f, 0xb1, 0x87,
0xbd, 0x96, 0x08, 0x45, 0x3e, 0x7f, 0x2a, 0xa2, 0x0a, 0xa6, 0xc7, 0x2a, 0x6b, 0x06, 0xa7, 0xd0, 0xc1, 0x28, 0x84, 0x52, 0xce, 0x9f, 0xca, 0xa4, 0xa3, 0x1d, 0xb0, 0x2e, 0xda, 0xd1, 0x6b, 0xb4,
0x78, 0xc7, 0xd6, 0x8b, 0xe5, 0xd3, 0xde, 0x38, 0xed, 0xf7, 0xa2, 0x35, 0x11, 0x7d, 0x18, 0x45, 0xc1, 0xb3, 0xcb, 0xc5, 0xf2, 0xc7, 0xce, 0x7a, 0x13, 0x76, 0xa2, 0xb3, 0x09, 0x43, 0xdc, 0x8b,
0x2d, 0xd5, 0x76, 0xb1, 0x7c, 0x7e, 0x81, 0x3c, 0x10, 0x44, 0x7b, 0x35, 0x74, 0x34, 0x81, 0xd8, 0x46, 0xe9, 0xcd, 0x62, 0xf9, 0xf4, 0x0c, 0x79, 0x20, 0x88, 0x09, 0x7a, 0xec, 0x69, 0x02, 0xb1,
0x00, 0x5e, 0x59, 0x98, 0x5e, 0xd7, 0xe3, 0xb5, 0x5e, 0xf0, 0xa1, 0xe1, 0x4b, 0x11, 0x71, 0xb4, 0x06, 0xbc, 0x76, 0x30, 0xbd, 0x5e, 0xee, 0x6f, 0xcc, 0x82, 0x8f, 0x2d, 0x5f, 0x8a, 0x84, 0x7b,
0x20, 0xb4, 0x89, 0xbd, 0x95, 0x63, 0xc9, 0x9d, 0x77, 0xc0, 0x5f, 0xfd, 0xb7, 0xa5, 0x8b, 0x9b, 0x07, 0xc2, 0xd8, 0x34, 0x38, 0xb5, 0xaf, 0xb8, 0x0f, 0x1e, 0xf8, 0x8b, 0xff, 0xb6, 0xf4, 0x69,
0xbf, 0x7b, 0x6a, 0xeb, 0xd5, 0x96, 0x3f, 0x67, 0x45, 0x7e, 0x18, 0xf1, 0x30, 0x2a, 0x8b, 0x41, 0xfd, 0x77, 0x4f, 0xe3, 0x82, 0xde, 0xf0, 0xa7, 0xa2, 0x94, 0x87, 0x11, 0x0f, 0xa3, 0xb2, 0x14,
0x95, 0x3c, 0x8f, 0x80, 0x68, 0xdc, 0x26, 0xe6, 0x51, 0xfc, 0x88, 0x17, 0x7d, 0xf9, 0x96, 0x57, 0x75, 0xc5, 0x65, 0x02, 0x44, 0xeb, 0xd7, 0x49, 0x26, 0xf1, 0x3d, 0x5d, 0x0c, 0xd5, 0x6b, 0x5e,
0xbf, 0x21, 0x27, 0xaa, 0x2a, 0x7b, 0x6f, 0xba, 0x49, 0x00, 0x36, 0x04, 0xbb, 0xe0, 0x33, 0xbd, 0xff, 0x86, 0x9c, 0xa8, 0xea, 0xe2, 0xad, 0xed, 0x27, 0x01, 0xd8, 0x18, 0xdd, 0x82, 0xcf, 0xf4,
0x8a, 0x91, 0x2f, 0xdf, 0x11, 0x32, 0x21, 0x8a, 0x7c, 0x96, 0xb4, 0xf6, 0x7a, 0x64, 0xde, 0x59, 0x3a, 0x25, 0xbe, 0x7c, 0x43, 0xc8, 0x8c, 0x28, 0xe5, 0x2c, 0x69, 0x13, 0xcc, 0x9e, 0x05, 0xef,
0x2f, 0x75, 0xc9, 0x3f, 0x01, 0x7e, 0x59, 0x2c, 0x89, 0xae, 0x3d, 0xab, 0xb2, 0x24, 0xd9, 0x9d, 0x82, 0x32, 0x15, 0xff, 0x00, 0xf8, 0x79, 0xb1, 0x24, 0xba, 0xee, 0xac, 0x2e, 0xb2, 0x64, 0x77,
0x6f, 0x70, 0x2f, 0x03, 0xbc, 0x68, 0x47, 0x95, 0xa2, 0xf1, 0xa1, 0x63, 0xe4, 0x45, 0xeb, 0xa9, 0xa1, 0xc5, 0x9d, 0x8a, 0xf0, 0xac, 0x1d, 0x55, 0xca, 0x36, 0xc4, 0x9e, 0x91, 0x17, 0x5d, 0xa0,
0xe7, 0xf6, 0xe6, 0xee, 0x9e, 0x33, 0x99, 0xe4, 0xa1, 0xe1, 0x86, 0x84, 0xe3, 0xcc, 0x50, 0x89, 0x9e, 0xdb, 0x4f, 0x77, 0xf7, 0x9c, 0xa9, 0x2c, 0x4f, 0xc5, 0x85, 0x1c, 0x33, 0x90, 0x33, 0x4b,
0xf4, 0x60, 0x19, 0x90, 0x72, 0x63, 0x4f, 0xa6, 0x74, 0x83, 0x45, 0xd3, 0xcb, 0x80, 0xf9, 0xd4, 0x35, 0x12, 0x84, 0x15, 0x40, 0xd2, 0xed, 0x07, 0x72, 0xa5, 0x1f, 0x1d, 0xda, 0x41, 0x45, 0x94,
0xbf, 0x22, 0x98, 0xe4, 0x74, 0x73, 0x1c, 0xea, 0xce, 0x90, 0x9b, 0x0f, 0xd3, 0xc5, 0xd7, 0x2e, 0x13, 0xc1, 0x8a, 0x60, 0x8a, 0xd3, 0xd5, 0x69, 0x6c, 0x7a, 0x4b, 0x76, 0x3e, 0x4c, 0x37, 0xdf,
0xa2, 0xb4, 0x16, 0x34, 0xdb, 0x41, 0x88, 0xc4, 0x78, 0xce, 0x8a, 0xd8, 0x4b, 0xc7, 0x32, 0x65, 0xf8, 0x84, 0xca, 0x39, 0x30, 0x6c, 0x0b, 0x31, 0x11, 0xe5, 0x39, 0x2b, 0xd3, 0xa0, 0x3c, 0x2b,
0x65, 0x8c, 0x25, 0x8f, 0xa6, 0xe7, 0xd5, 0xa9, 0x78, 0xfd, 0x46, 0x9c, 0xae, 0xea, 0x33, 0x5a, 0xb4, 0x53, 0x29, 0x55, 0x3c, 0xd9, 0x81, 0xd7, 0xa7, 0xe2, 0xe5, 0x2b, 0x71, 0xba, 0x6a, 0xce,
0x86, 0x8a, 0xb4, 0x44, 0xa8, 0x2e, 0xfd, 0x3e, 0x2d, 0xc1, 0xb0, 0x05, 0x66, 0x69, 0x84, 0x88, 0x68, 0x1b, 0x2a, 0xd2, 0x16, 0xb1, 0xbe, 0x0a, 0xbb, 0xbc, 0x05, 0xc3, 0x0e, 0x98, 0xa3, 0x11,
0xac, 0x36, 0x4e, 0x86, 0x91, 0x28, 0x24, 0xcb, 0xda, 0x00, 0x4d, 0xc9, 0x5b, 0xc4, 0x3e, 0x9e, 0x12, 0xb2, 0xc6, 0x7a, 0x15, 0xf7, 0x44, 0xa1, 0x58, 0xd1, 0x45, 0x68, 0x2b, 0xde, 0x21, 0x0e,
0xe7, 0xf9, 0xc6, 0x60, 0x3b, 0xd4, 0x42, 0xf9, 0x2e, 0xff, 0x60, 0x82, 0xf2, 0xde, 0x6f, 0x0d, 0xe9, 0x5c, 0xca, 0xb5, 0xc5, 0x6e, 0x6c, 0x84, 0x0e, 0xbd, 0x7c, 0x67, 0xa3, 0x0e, 0x21, 0x6c,
0xe4, 0xd3, 0xc6, 0x79, 0x00, 0x0b, 0x32, 0x42, 0xe4, 0x0c, 0x65, 0x20, 0xbb, 0x4a, 0xfe, 0xbd, 0x2c, 0xc8, 0x69, 0x65, 0x19, 0xc1, 0x81, 0x4a, 0x90, 0x38, 0x43, 0x15, 0xc9, 0xaf, 0x8a, 0x7f,
0xb6, 0xd2, 0x6d, 0x49, 0x15, 0xd3, 0x6d, 0x58, 0x96, 0x3c, 0x38, 0xf2, 0xd0, 0x17, 0x11, 0x5b, 0x6b, 0x9c, 0xf2, 0x1b, 0x92, 0xc5, 0xf6, 0x6b, 0x56, 0x64, 0x13, 0x8e, 0x3c, 0xf4, 0x45, 0xa4,
0x03, 0x56, 0x47, 0x61, 0xfc, 0x81, 0xf6, 0x48, 0xf1, 0x27, 0xb5, 0x88, 0xbb, 0xcd, 0x45, 0x52, 0xce, 0x82, 0x33, 0x49, 0xd8, 0x70, 0xa0, 0x3d, 0x52, 0xfc, 0x49, 0x2d, 0xd2, 0x76, 0x7d, 0x91,
0xbf, 0x6c, 0x68, 0xc2, 0x55, 0x7c, 0x1c, 0x48, 0xd9, 0x29, 0xa3, 0xb9, 0x4c, 0x3b, 0x14, 0xc6, 0xe5, 0xaf, 0x5a, 0x9a, 0x70, 0x95, 0x1e, 0x47, 0x92, 0x76, 0x0a, 0xa9, 0x54, 0x79, 0x87, 0xd2,
0xf5, 0x03, 0xb2, 0x59, 0xae, 0xc6, 0x58, 0x38, 0xe6, 0xf9, 0x28, 0x6a, 0x80, 0xc7, 0xc1, 0x04, 0xfa, 0x61, 0x44, 0x36, 0xcb, 0xd5, 0x5a, 0x07, 0xc7, 0x40, 0x1f, 0x45, 0x8d, 0xf0, 0x38, 0xda,
0xd0, 0x33, 0xba, 0x1e, 0x10, 0x29, 0x92, 0x33, 0x7c, 0x96, 0x91, 0xc8, 0x66, 0xa3, 0x4e, 0x8a, 0x08, 0x66, 0x46, 0x37, 0x23, 0x22, 0x65, 0x72, 0x86, 0xcf, 0x32, 0x12, 0xd9, 0xec, 0xd4, 0x49,
0x7c, 0x2e, 0xff, 0x03, 0x3a, 0x1f, 0x26, 0xed, 0x95, 0x35, 0x6a, 0x5b, 0xf2, 0xf5, 0x24, 0xfd, 0x29, 0xe7, 0xf2, 0x3f, 0xa0, 0xf3, 0x61, 0xd2, 0x5e, 0x3b, 0xab, 0x37, 0x15, 0xbf, 0x9c, 0xa4,
0x9a, 0x92, 0xfe, 0xab, 0x29, 0x79, 0x54, 0x15, 0xda, 0xec, 0xb2, 0x64, 0xe5, 0x94, 0x53, 0xa2, 0xbf, 0xa4, 0xa8, 0xff, 0x6a, 0xca, 0x1e, 0xd5, 0xa5, 0xb1, 0xdb, 0x22, 0x5b, 0x39, 0x05, 0x95,
0xa9, 0x12, 0x3b, 0x85, 0x4f, 0x08, 0x41, 0xe0, 0x44, 0x7e, 0x9b, 0x96, 0x65, 0xda, 0x33, 0xe7, 0x68, 0xea, 0xcc, 0x4e, 0xe9, 0x13, 0x42, 0x10, 0x38, 0x93, 0xdf, 0xe6, 0x65, 0x99, 0x09, 0xcc,
0x91, 0x29, 0xeb, 0xe9, 0xe0, 0x03, 0xcd, 0xda, 0x04, 0x88, 0x6d, 0xf2, 0xa3, 0x97, 0x1b, 0x60, 0x07, 0x64, 0xda, 0x05, 0x3a, 0x84, 0x48, 0xb3, 0xb6, 0x11, 0x52, 0x97, 0xfd, 0x18, 0xd4, 0x1a,
0xe7, 0xcb, 0x22, 0x27, 0xbe, 0x69, 0xdd, 0x29, 0x74, 0x53, 0x02, 0xa7, 0x5f, 0xfb, 0x27, 0x3b, 0xd8, 0xf9, 0xb2, 0x94, 0xc4, 0x37, 0xad, 0x3b, 0xa5, 0x6e, 0x8a, 0xe0, 0xf4, 0x6f, 0xff, 0x04,
0x01, 0xc5, 0x54, 0xf0, 0x03, 0x00, 0x00 0xfa, 0x00, 0xbc, 0xef, 0xf1, 0x03, 0x00, 0x00
}; };
// Autogenerated from wled00/data/welcome.htm, do not edit!! // Autogenerated from wled00/data/welcome.htm, do not edit!!
const uint16_t PAGE_welcome_length = 1528; const uint16_t PAGE_welcome_length = 1529;
const uint8_t PAGE_welcome[] PROGMEM = { const uint8_t PAGE_welcome[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x56, 0x5b, 0x93, 0xaa, 0x3a, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x56, 0x5b, 0x93, 0xaa, 0x3a,
0x16, 0x7e, 0xef, 0x5f, 0xc1, 0x76, 0xea, 0xd4, 0x79, 0x70, 0x77, 0x73, 0x13, 0x51, 0xdb, 0xee, 0x16, 0x7e, 0xef, 0x5f, 0xc1, 0x76, 0xea, 0xd4, 0x79, 0x70, 0x77, 0x73, 0x13, 0x51, 0xdb, 0xee,
@ -177,18 +177,18 @@ const uint8_t PAGE_welcome[] PROGMEM = {
0x72, 0xff, 0x3e, 0x19, 0x38, 0x4d, 0xa1, 0xcb, 0x04, 0x2e, 0x8e, 0x42, 0x82, 0xbd, 0x3c, 0xbe, 0x72, 0xff, 0x3e, 0x19, 0x38, 0x4d, 0xa1, 0xcb, 0x04, 0x2e, 0x8e, 0x42, 0x82, 0xbd, 0x3c, 0xbe,
0x07, 0xe3, 0x7e, 0x89, 0x10, 0x63, 0x17, 0xc4, 0xc2, 0x16, 0x0d, 0x90, 0x10, 0x42, 0xc2, 0x05, 0x07, 0xe3, 0x7e, 0x89, 0x10, 0x63, 0x17, 0xc4, 0xc2, 0x16, 0x0d, 0x90, 0x10, 0x42, 0xc2, 0x05,
0xf1, 0x6e, 0x73, 0xd7, 0x26, 0xe1, 0x09, 0xa7, 0x2e, 0x8f, 0x71, 0x7c, 0xfb, 0xf3, 0x8c, 0x52, 0xf1, 0x6e, 0x73, 0xd7, 0x26, 0xe1, 0x09, 0xa7, 0x2e, 0x8f, 0x71, 0x7c, 0xfb, 0xf3, 0x8c, 0x52,
0x0f, 0x9f, 0x5f, 0xca, 0xc5, 0x65, 0xc0, 0x97, 0x90, 0x40, 0xff, 0xad, 0x22, 0x72, 0xe1, 0x66, 0x0f, 0x9f, 0x5f, 0xca, 0xc5, 0x65, 0xc0, 0x97, 0x90, 0x40, 0xff, 0xad, 0xf2, 0x22, 0x72, 0xe5,
0x9c, 0x0e, 0x15, 0xcf, 0xc8, 0x47, 0x95, 0x3f, 0xdf, 0xef, 0x6e, 0xbe, 0x41, 0xce, 0xe0, 0xee, 0x66, 0x9c, 0x0f, 0x15, 0xcf, 0xc8, 0x47, 0x95, 0x3f, 0xdf, 0xef, 0x7e, 0xbe, 0x41, 0x4e, 0xe1,
0xe6, 0x41, 0x03, 0xbd, 0x3f, 0x8d, 0x73, 0xca, 0x29, 0x90, 0x6b, 0x99, 0x00, 0x0b, 0x11, 0x15, 0xee, 0xe7, 0xc1, 0x03, 0xbd, 0x3f, 0x8d, 0x73, 0xca, 0x39, 0x90, 0x6b, 0x99, 0x01, 0x0b, 0x11,
0xb8, 0xf6, 0xf1, 0xa4, 0x84, 0xce, 0xbc, 0x24, 0x05, 0xff, 0xdd, 0x16, 0xd1, 0xfb, 0x3f, 0x0b, 0x15, 0xb8, 0xf8, 0xf1, 0xac, 0x84, 0xce, 0xbc, 0x64, 0x05, 0xff, 0xdd, 0x16, 0xd1, 0xfb, 0x3f,
0xcf, 0x55, 0x09, 0x12, 0xca, 0x03, 0xaf, 0xf1, 0x3d, 0xb7, 0x52, 0xee, 0x09, 0x8e, 0xe9, 0x8f, 0x8c, 0xcf, 0x75, 0x09, 0x12, 0xca, 0x23, 0xaf, 0xf1, 0x3d, 0xbb, 0x52, 0xf0, 0x09, 0x8e, 0xe9,
0xbf, 0xc6, 0x16, 0xf9, 0xb6, 0xf3, 0xcd, 0x17, 0x1f, 0x65, 0x5d, 0xbc, 0xff, 0x07, 0xf9, 0x2f, 0x8f, 0xbf, 0x06, 0x17, 0xf9, 0xc6, 0xf3, 0xed, 0x17, 0x1f, 0x85, 0x5d, 0xbc, 0xff, 0x0b, 0xf9,
0xec, 0xfa, 0x82, 0xd2, 0x99, 0x08, 0x00, 0x00 0x2f, 0x52, 0xe7, 0x8f, 0x07, 0x9b, 0x08, 0x00, 0x00
}; };
// Autogenerated from wled00/data/liveview.htm, do not edit!! // Autogenerated from wled00/data/liveview.htm, do not edit!!
const uint16_t PAGE_liveview_length = 547; const uint16_t PAGE_liveview_length = 548;
const uint8_t PAGE_liveview[] PROGMEM = { const uint8_t PAGE_liveview[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x53, 0x4d, 0x6f, 0xdb, 0x30, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x53, 0x4d, 0x6f, 0xdb, 0x30,
0x0c, 0xbd, 0xe7, 0x57, 0x78, 0x2a, 0x5a, 0x48, 0x88, 0x63, 0x3b, 0xc5, 0xba, 0x8f, 0xf8, 0xe3, 0x0c, 0xbd, 0xe7, 0x57, 0x78, 0x2a, 0x5a, 0x48, 0x88, 0x63, 0x3b, 0xc5, 0xba, 0x8f, 0xf8, 0xe3,
@ -212,128 +212,133 @@ const uint8_t PAGE_liveview[] PROGMEM = {
0xbc, 0x11, 0x03, 0x6f, 0x74, 0x02, 0xec, 0xd5, 0x86, 0x4a, 0x2b, 0x7c, 0x1b, 0x6a, 0x4f, 0x1a, 0xbc, 0x11, 0x03, 0x6f, 0x74, 0x02, 0xec, 0xd5, 0x86, 0x4a, 0x2b, 0x7c, 0x1b, 0x6a, 0x4f, 0x1a,
0x25, 0x25, 0x18, 0xe6, 0x00, 0xbd, 0x33, 0x91, 0xd0, 0xc0, 0xdd, 0x83, 0x6a, 0x21, 0xdc, 0xa6, 0x25, 0x25, 0x18, 0xe6, 0x00, 0xbd, 0x33, 0x91, 0xd0, 0xc0, 0xdd, 0x83, 0x6a, 0x21, 0xdc, 0xa6,
0x23, 0x07, 0x8b, 0x7b, 0xab, 0xe4, 0x64, 0x97, 0x41, 0xd5, 0x93, 0x73, 0x22, 0x8b, 0x2f, 0xaf, 0x23, 0x07, 0x8b, 0x7b, 0xab, 0xe4, 0x64, 0x97, 0x41, 0xd5, 0x93, 0x73, 0x22, 0x8b, 0x2f, 0xaf,
0x32, 0xc6, 0xf2, 0x0d, 0xa0, 0x68, 0x28, 0x49, 0x7f, 0x77, 0xd6, 0xa4, 0x3a, 0xc8, 0x46, 0x58, 0x32, 0xc6, 0xf2, 0x0d, 0xa0, 0x68, 0x28, 0x49, 0xd2, 0xdf, 0x9d, 0x35, 0xa9, 0x0e, 0xba, 0x11,
0x12, 0x94, 0x36, 0x14, 0xcb, 0x8a, 0x62, 0x62, 0x1f, 0x9f, 0x9f, 0xe9, 0xbf, 0xa8, 0xff, 0xc3, 0x96, 0x04, 0xa9, 0x0d, 0xc5, 0xb2, 0xa2, 0x98, 0xd8, 0xc7, 0xe7, 0x67, 0xfa, 0x2f, 0xee, 0xff,
0x1a, 0x68, 0x63, 0x4c, 0x06, 0x42, 0xca, 0xd8, 0x2b, 0xdb, 0x7e, 0x28, 0x2e, 0xf4, 0x51, 0x2b, 0xd0, 0x06, 0xde, 0x18, 0x93, 0x81, 0x90, 0x32, 0xf6, 0xca, 0xb6, 0x1f, 0xaa, 0x0b, 0x8d, 0xd4,
0x13, 0xe8, 0x16, 0xb5, 0xe3, 0x52, 0x85, 0x32, 0xe8, 0xe7, 0x4c, 0x42, 0x1d, 0x93, 0xd8, 0x97, 0xca, 0x04, 0xba, 0x45, 0xed, 0xb8, 0x54, 0xa1, 0x0e, 0xfa, 0x39, 0x93, 0x50, 0xc7, 0x24, 0xf6,
0x98, 0x68, 0x90, 0x5d, 0x58, 0x4c, 0x8d, 0x4d, 0xbe, 0xb1, 0x8e, 0xaa, 0x32, 0xcb, 0x55, 0xe1, 0x25, 0x26, 0x1a, 0x64, 0x17, 0x16, 0x53, 0x63, 0x93, 0x6f, 0xac, 0xa3, 0xaa, 0xcc, 0x72, 0x55,
0x73, 0x35, 0x9f, 0xb3, 0xf1, 0xbe, 0x3d, 0x82, 0x7e, 0xaa, 0x5f, 0xb9, 0x3d, 0x22, 0xab, 0x0f, 0xf8, 0x5c, 0xcd, 0xe7, 0x6c, 0xbc, 0x6f, 0x8f, 0xa0, 0x9f, 0xea, 0x57, 0x6e, 0x8f, 0xc8, 0xea,
0x17, 0x17, 0xd4, 0x96, 0x36, 0xe9, 0xfc, 0xba, 0x43, 0xa7, 0x4c, 0x4d, 0x2f, 0x43, 0x0a, 0x30, 0xc3, 0xc5, 0x05, 0xb5, 0xa5, 0x4d, 0x3a, 0xbf, 0xee, 0xd0, 0x29, 0x53, 0xd3, 0xcb, 0x90, 0x02,
0x0f, 0xd3, 0x41, 0xe6, 0x36, 0x0e, 0x04, 0x8b, 0x65, 0x80, 0x0c, 0x07, 0x31, 0x61, 0x87, 0xe1, 0xcc, 0xc3, 0x78, 0x90, 0xb9, 0x8d, 0x03, 0xc1, 0x62, 0x19, 0x20, 0xc3, 0x41, 0x4c, 0xd8, 0x61,
0xcf, 0x48, 0xfc, 0xa2, 0x63, 0x0d, 0x78, 0xa3, 0x61, 0x30, 0xbf, 0xec, 0x6e, 0x25, 0x9d, 0x9a, 0xf8, 0x33, 0x12, 0xbf, 0x08, 0x59, 0x03, 0xde, 0x68, 0x18, 0xcc, 0x2f, 0xbb, 0x5b, 0x49, 0xa7,
0xc3, 0x92, 0xb1, 0x7f, 0xc9, 0xeb, 0x64, 0x94, 0x10, 0xbf, 0x45, 0x88, 0xf7, 0x19, 0x3b, 0xb0, 0xee, 0xb0, 0x64, 0x6c, 0x60, 0xf2, 0x3a, 0x1a, 0x25, 0xc4, 0x6f, 0x11, 0xe2, 0x7d, 0xc6, 0x0e,
0x44, 0xf0, 0x41, 0x5e, 0x7a, 0x6a, 0x24, 0x45, 0xb6, 0x7f, 0xb3, 0x9a, 0x07, 0xc6, 0xc6, 0x79, 0x2c, 0x11, 0x7c, 0xd0, 0x97, 0x9e, 0x3a, 0x49, 0x91, 0xed, 0xdf, 0xac, 0xe6, 0x81, 0xb1, 0x71,
0x9a, 0x86, 0xa5, 0x48, 0xa7, 0x51, 0x4a, 0xc7, 0x17, 0xf9, 0x07, 0xe3, 0xed, 0x60, 0x85, 0xa7, 0xa0, 0xa6, 0x69, 0x29, 0xd2, 0x69, 0x96, 0xd2, 0xf1, 0x49, 0xfe, 0x01, 0x0f, 0xfb, 0xef, 0x75,
0x03, 0x00, 0x00 0xa8, 0x03, 0x00, 0x00
}; };
// Autogenerated from wled00/data/liveviewws.htm, do not edit!! // Autogenerated from wled00/data/liveviewws.htm, do not edit!!
const uint16_t PAGE_liveviewws_length = 711; const uint16_t PAGE_liveviewws_length = 747;
const uint8_t PAGE_liveviewws[] PROGMEM = { const uint8_t PAGE_liveviewws[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x6d, 0x54, 0x5d, 0x8f, 0x9b, 0x3a, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x6d, 0x54, 0x6d, 0x8f, 0x9b, 0x38,
0x10, 0x7d, 0xcf, 0xaf, 0xa0, 0xde, 0xdb, 0x2d, 0x56, 0x08, 0x24, 0xdb, 0xdb, 0x2f, 0xc0, 0x59, 0x10, 0xfe, 0x9e, 0x5f, 0x41, 0xbd, 0xd7, 0x2d, 0x28, 0x84, 0x90, 0x6d, 0xaf, 0x2f, 0x01, 0xa7,
0xb5, 0xb7, 0x79, 0xa8, 0xb4, 0x6a, 0x57, 0xda, 0x5e, 0xad, 0xaa, 0x55, 0xa4, 0x1a, 0x98, 0x80, 0xba, 0x5e, 0xf3, 0xe1, 0xa4, 0x55, 0xbb, 0xd2, 0xb6, 0x5a, 0x9d, 0x56, 0x91, 0x6a, 0x60, 0x02,
0xef, 0x82, 0x1d, 0xd9, 0x43, 0x50, 0x84, 0xf8, 0xef, 0x77, 0x20, 0xdb, 0xac, 0x2a, 0x95, 0x07, 0xbe, 0x05, 0x1b, 0xd9, 0x03, 0x28, 0x42, 0xfc, 0xf7, 0x1b, 0x93, 0x74, 0xab, 0x93, 0x8e, 0x0f,
0xdb, 0xc3, 0x9c, 0x99, 0x33, 0x33, 0x3e, 0x90, 0xbe, 0xf8, 0xfc, 0xed, 0x9f, 0xef, 0x3f, 0x6e, 0x60, 0x7b, 0xe6, 0x99, 0x97, 0x67, 0x1e, 0x93, 0xbe, 0xf8, 0xfc, 0xf5, 0xcf, 0x6f, 0x7f, 0xdf,
0x37, 0x5e, 0x85, 0x4d, 0xbd, 0x4e, 0x9f, 0x56, 0x90, 0xc5, 0x3a, 0x6d, 0x00, 0xa5, 0xa7, 0x65, 0xed, 0xbd, 0x0a, 0x9b, 0x7a, 0x97, 0x5e, 0xde, 0x20, 0x8a, 0x5d, 0xda, 0x00, 0x0a, 0x4f, 0x89,
0x03, 0x82, 0x1d, 0x14, 0x74, 0x7b, 0x63, 0x91, 0x79, 0xb3, 0xdc, 0x68, 0x04, 0x8d, 0x82, 0x75, 0x06, 0x38, 0xeb, 0x25, 0x0c, 0xad, 0x36, 0xc8, 0xbc, 0x45, 0xae, 0x15, 0x82, 0x42, 0xce, 0x06,
0xaa, 0xc0, 0x4a, 0x14, 0x70, 0x50, 0x39, 0x2c, 0x26, 0x23, 0x50, 0x5a, 0xa1, 0x92, 0xf5, 0xc2, 0x59, 0x60, 0xc5, 0x0b, 0xe8, 0x65, 0x0e, 0xab, 0x79, 0x13, 0x4a, 0x25, 0x51, 0x8a, 0x7a, 0x65,
0xe5, 0xb2, 0x06, 0xb1, 0x0a, 0x1a, 0x7a, 0xd1, 0xb4, 0xcd, 0x2f, 0x9b, 0x3d, 0xe5, 0x9c, 0xe5, 0x73, 0x51, 0x03, 0xdf, 0x84, 0x0d, 0x1d, 0x34, 0x5d, 0xf3, 0x73, 0xcf, 0x2e, 0x31, 0x17, 0x79,
0x95, 0xb4, 0x0e, 0x28, 0x47, 0x8b, 0xbb, 0xc5, 0x7b, 0xf6, 0x1b, 0x15, 0x56, 0xd0, 0xc0, 0x22, 0x25, 0x8c, 0x05, 0x8a, 0xd1, 0xe1, 0x71, 0xf5, 0x9e, 0xfd, 0x27, 0x15, 0x56, 0xd0, 0xc0, 0x2a,
0x37, 0xb5, 0xb1, 0xcc, 0x3b, 0x93, 0x5d, 0x5c, 0x4d, 0x0f, 0x41, 0x51, 0x61, 0x0d, 0xeb, 0xd9, 0xd7, 0xb5, 0x36, 0xcc, 0x7b, 0x4e, 0x76, 0x75, 0x33, 0x3f, 0xe4, 0x8a, 0x12, 0x6b, 0xd8, 0x2d,
0xfd, 0xcd, 0xe6, 0xb3, 0x77, 0xa3, 0x0e, 0xe0, 0xdd, 0x5a, 0x18, 0xcb, 0x4b, 0xa3, 0x93, 0x27, 0x1e, 0x6e, 0xf7, 0x9f, 0xbd, 0x5b, 0xd9, 0x83, 0x77, 0x67, 0xc0, 0x95, 0x97, 0xae, 0xcf, 0x96,
0x75, 0x78, 0x1c, 0x01, 0x99, 0x29, 0x8e, 0x7d, 0x23, 0x6d, 0xa9, 0x74, 0xbc, 0x1c, 0x2e, 0x72, 0xd4, 0xe2, 0xc9, 0x39, 0x64, 0xba, 0x38, 0x8d, 0x8d, 0x30, 0xa5, 0x54, 0xdb, 0x78, 0xba, 0xca,
0xa9, 0x0f, 0x7d, 0x26, 0xf3, 0xc7, 0xd2, 0x9a, 0x56, 0x17, 0xf1, 0xc5, 0x72, 0xb9, 0x4c, 0x76, 0x85, 0xea, 0xc7, 0x4c, 0xe4, 0x4f, 0xa5, 0xd1, 0x9d, 0x2a, 0xb6, 0x57, 0x71, 0x1c, 0x27, 0x47,
0xaa, 0x46, 0xb0, 0x71, 0x66, 0x55, 0x59, 0xa1, 0x06, 0xe7, 0xfc, 0xd5, 0xbb, 0x37, 0x2f, 0x79, 0x59, 0x23, 0x98, 0x6d, 0x66, 0x64, 0x59, 0xa1, 0x02, 0x6b, 0xfd, 0xcd, 0xbb, 0xdf, 0x5f, 0x06,
0x32, 0x75, 0x13, 0xaf, 0x96, 0xcb, 0x97, 0x49, 0x05, 0xa3, 0xef, 0x74, 0xde, 0x1b, 0x47, 0xfd, 0xc9, 0xdc, 0xcd, 0x76, 0x13, 0xc7, 0x2f, 0x93, 0x0a, 0x9c, 0xed, 0xbc, 0x6e, 0xb5, 0xa5, 0xfe,
0x19, 0x1d, 0xcb, 0xcc, 0x99, 0xba, 0x45, 0x18, 0x66, 0x69, 0x74, 0xa2, 0x4b, 0xa3, 0xd3, 0xcc, 0xb4, 0xda, 0x8a, 0xcc, 0xea, 0xba, 0x43, 0x98, 0x16, 0xe9, 0xfa, 0x9c, 0x2e, 0x5d, 0x9f, 0x39,
0x46, 0xd6, 0x75, 0x5a, 0xa8, 0x83, 0xa7, 0x0a, 0xc1, 0x46, 0x52, 0x2a, 0x39, 0x22, 0x9b, 0xea, 0x73, 0x59, 0x77, 0x69, 0x21, 0x7b, 0x4f, 0x16, 0x9c, 0xb9, 0xa4, 0x54, 0xf2, 0x9a, 0xf6, 0x54,
0xca, 0xad, 0xda, 0xe3, 0x7a, 0x76, 0x90, 0xd6, 0xeb, 0x5c, 0x82, 0xf6, 0xd8, 0x77, 0x4e, 0xa0, 0x57, 0x6e, 0x64, 0x8b, 0xbb, 0x45, 0x2f, 0x8c, 0x37, 0xd8, 0x04, 0xcd, 0x69, 0x1c, 0x2c, 0x47,
0xd9, 0x87, 0x9d, 0xd2, 0x85, 0xe9, 0xc2, 0xce, 0x0d, 0xb9, 0xc4, 0xbc, 0xf2, 0x81, 0xf7, 0x43, 0xdd, 0x46, 0x83, 0x54, 0x85, 0x1e, 0xa2, 0xc1, 0x4e, 0xb9, 0xc0, 0xbc, 0xf2, 0x21, 0x18, 0x27,
0xe7, 0x2e, 0x2f, 0x3b, 0x17, 0x5a, 0xca, 0x7a, 0xbc, 0x43, 0x89, 0x20, 0x84, 0xb8, 0x87, 0xec, 0x79, 0xf4, 0x07, 0x7b, 0x7d, 0x3d, 0xd8, 0xc8, 0x50, 0xe0, 0xd3, 0x3d, 0x0a, 0x04, 0xce, 0xf9,
0xce, 0xe4, 0x8f, 0x80, 0xe1, 0xb7, 0xdb, 0xcd, 0xd7, 0x6b, 0x72, 0x3b, 0xd0, 0x85, 0xcf, 0xfa, 0x03, 0x64, 0xf7, 0x3a, 0x7f, 0x02, 0x8c, 0xbe, 0xde, 0xed, 0xbf, 0x04, 0x64, 0xb6, 0xa0, 0x0a,
0x57, 0xf5, 0xe1, 0x55, 0x8c, 0xb6, 0x85, 0x81, 0xf1, 0xd8, 0xa7, 0xa1, 0x51, 0x79, 0x10, 0x2a, 0x9f, 0x8d, 0xaf, 0xea, 0xfe, 0xd5, 0x16, 0x4d, 0x07, 0x13, 0x0b, 0x12, 0xa8, 0x2d, 0x8c, 0x35,
0xbd, 0x33, 0x3e, 0xbb, 0x05, 0x78, 0xf4, 0xee, 0xef, 0x3c, 0xb3, 0x07, 0xad, 0x74, 0xc9, 0x78, 0xa0, 0x07, 0xfc, 0x12, 0xbb, 0xd6, 0x14, 0x9a, 0x4a, 0x0f, 0x91, 0x43, 0xd4, 0x0a, 0xac, 0x1c,
0xe0, 0x13, 0xad, 0x86, 0xce, 0x3b, 0xa7, 0xf3, 0x7d, 0x56, 0x21, 0xee, 0x5d, 0xcc, 0x84, 0x78, 0xd9, 0xa1, 0xe1, 0x18, 0xd9, 0x9a, 0xe6, 0xe7, 0x6f, 0x42, 0x8c, 0x28, 0x90, 0x7d, 0x90, 0x58,
0xaa, 0xa5, 0x36, 0x54, 0x0a, 0xb5, 0x1a, 0xee, 0xad, 0x41, 0x43, 0xb7, 0x71, 0xcd, 0x3a, 0xe7, 0xf9, 0x6c, 0xcd, 0x82, 0x8f, 0xab, 0xcd, 0xb6, 0xd7, 0xb2, 0xf0, 0xe2, 0x20, 0xb2, 0x6d, 0x2d,
0x58, 0x4c, 0x2b, 0xe3, 0x73, 0x16, 0x47, 0x11, 0x9b, 0x17, 0x26, 0x6f, 0x1b, 0xba, 0x9d, 0x67, 0x71, 0x3e, 0x0d, 0x15, 0xc1, 0x35, 0xd1, 0x25, 0x15, 0xd5, 0xd5, 0xd6, 0x82, 0xa0, 0xac, 0x42,
0x70, 0x65, 0x1c, 0xce, 0x59, 0x34, 0x62, 0x78, 0x68, 0xf4, 0x48, 0x29, 0x76, 0xad, 0xce, 0x47, 0x6c, 0x59, 0xc8, 0x06, 0x4b, 0x99, 0x4d, 0x54, 0x83, 0x2a, 0xb1, 0xda, 0x6d, 0xae, 0xaf, 0x7d,
0xa7, 0xcf, 0xfb, 0x3f, 0x17, 0x3c, 0xf0, 0x80, 0x1c, 0x99, 0xd2, 0xd2, 0x1e, 0xbf, 0x1f, 0xf7, 0xb5, 0xe4, 0x04, 0x5a, 0x9a, 0xc7, 0xf8, 0x10, 0x84, 0xd4, 0x0e, 0x57, 0x30, 0x78, 0xcf, 0x1d,
0x24, 0x01, 0x69, 0xad, 0x3c, 0x66, 0xed, 0x6e, 0x07, 0x96, 0x8d, 0x3e, 0x59, 0x14, 0x9b, 0x03, 0x90, 0x99, 0xad, 0x1d, 0x28, 0x88, 0xb4, 0xd2, 0x2d, 0x28, 0x7e, 0xec, 0x54, 0xee, 0x8a, 0xf4,
0x11, 0xdd, 0x28, 0x47, 0x6a, 0x00, 0xeb, 0xb3, 0x86, 0xee, 0x4a, 0x96, 0xc0, 0x02, 0x10, 0xeb, 0x83, 0xf1, 0xff, 0x1b, 0x9b, 0x26, 0x3a, 0xcf, 0xa4, 0x12, 0xe6, 0xf4, 0xed, 0xd4, 0x92, 0x58,
0x7e, 0x9c, 0xa4, 0xda, 0xf9, 0xec, 0xc1, 0x64, 0xff, 0x41, 0x8e, 0xde, 0xc7, 0x31, 0xfc, 0xd3, 0x84, 0x31, 0xe2, 0x94, 0x75, 0xc7, 0x23, 0x18, 0x16, 0x92, 0x4d, 0x14, 0xc5, 0xbe, 0x27, 0xc1,
0x14, 0xbe, 0xa5, 0x8e, 0x68, 0xc4, 0x77, 0x68, 0xa9, 0xf5, 0x90, 0x54, 0x58, 0xfb, 0x10, 0x16, 0xdc, 0x4a, 0x4b, 0xba, 0x01, 0xe3, 0xb3, 0x86, 0xa6, 0x2a, 0x4a, 0x60, 0x21, 0xf0, 0xdd, 0xe8,
0x12, 0x25, 0xe7, 0x7d, 0x0d, 0xe8, 0xc1, 0x34, 0x88, 0x7f, 0x95, 0xc6, 0xf7, 0x53, 0x94, 0x0f, 0x38, 0x27, 0x62, 0xd9, 0xa3, 0xce, 0xfe, 0x81, 0x1c, 0xbd, 0x3f, 0x1c, 0xfc, 0xd3, 0x0c, 0x3f,
0x23, 0xcf, 0x09, 0x91, 0x50, 0xce, 0x77, 0x6f, 0x5f, 0x08, 0x78, 0x58, 0x6e, 0xb9, 0x05, 0x6c, 0x30, 0x62, 0x17, 0xf5, 0x3d, 0x1a, 0xa9, 0xca, 0x88, 0xf4, 0x5a, 0xfb, 0x10, 0x15, 0x02, 0x45,
0xad, 0x4e, 0xc6, 0x18, 0x52, 0x63, 0xad, 0x34, 0x48, 0xbb, 0x28, 0xad, 0x2c, 0x14, 0xe1, 0xfd, 0x10, 0x5c, 0x98, 0x74, 0xc5, 0x7f, 0x97, 0x0a, 0xdf, 0xcf, 0x28, 0x1f, 0x5c, 0x9e, 0xb3, 0x47,
0x0f, 0xcb, 0x02, 0xca, 0x80, 0x05, 0x5a, 0x40, 0x58, 0x83, 0x2e, 0xe9, 0x53, 0xb0, 0xe2, 0x4a, 0x42, 0x31, 0xdf, 0xbd, 0x7d, 0xc1, 0xc1, 0x35, 0x6a, 0x00, 0x3b, 0xa3, 0x12, 0x87, 0x21, 0xdd,
0x50, 0xe8, 0x6a, 0x7b, 0xfd, 0x77, 0x7c, 0x95, 0xec, 0x8c, 0xf5, 0x95, 0xb0, 0x89, 0x4a, 0x75, 0xd6, 0x52, 0x81, 0x30, 0xab, 0xd2, 0x88, 0x42, 0x92, 0xbf, 0xff, 0x21, 0x2e, 0xa0, 0x0c, 0x19,
0xa2, 0xe6, 0xe2, 0x35, 0xc7, 0xb9, 0xf8, 0x69, 0xcb, 0xcc, 0xff, 0xab, 0x87, 0x07, 0xb5, 0x1d, 0x31, 0x0f, 0x17, 0xa6, 0x88, 0xd2, 0x1b, 0x4e, 0xd0, 0xcd, 0xe1, 0xe3, 0x9b, 0xed, 0x4d, 0x72,
0x82, 0x69, 0x9f, 0xaf, 0xce, 0xa7, 0xab, 0xed, 0xc0, 0x7f, 0x06, 0x04, 0x5f, 0xbc, 0xbe, 0xbc, 0xd4, 0xc6, 0x97, 0x5c, 0x25, 0x32, 0x35, 0x89, 0x5c, 0xf2, 0xd7, 0x01, 0x2e, 0xf9, 0x0f, 0x53,
0xf4, 0x09, 0xcd, 0x02, 0xc6, 0x93, 0x71, 0xe7, 0x2c, 0x38, 0x0f, 0xbe, 0x04, 0xdc, 0xd4, 0x30, 0x66, 0xfe, 0x6f, 0x23, 0x3c, 0xca, 0xc3, 0x14, 0xce, 0xdf, 0xe5, 0xe6, 0x79, 0x75, 0x73, 0x98,
0x1e, 0x3f, 0x1d, 0xbf, 0xd0, 0x5c, 0x27, 0xbd, 0xf1, 0x70, 0x92, 0x64, 0xf8, 0x2c, 0x76, 0x81, 0x82, 0x1f, 0x21, 0xb9, 0xaf, 0x5e, 0x13, 0xe5, 0xe4, 0x4d, 0xa3, 0x08, 0x12, 0xf7, 0x0d, 0x58,
0xc3, 0xb3, 0xb2, 0x7e, 0xa9, 0x03, 0xac, 0xa5, 0xa2, 0xce, 0xf2, 0x98, 0xcc, 0x98, 0x06, 0xca, 0x58, 0xe8, 0xbc, 0x6b, 0x5c, 0x9d, 0x25, 0xe0, 0xbe, 0x06, 0xb7, 0xfc, 0x74, 0xfa, 0x8b, 0x68,
0x87, 0x81, 0x8f, 0xb2, 0x3e, 0xa9, 0x35, 0x8d, 0x4e, 0x8a, 0x8e, 0xa6, 0x1f, 0xc3, 0xff, 0x16, 0x9d, 0x95, 0x49, 0x93, 0x75, 0xe2, 0x8d, 0x7e, 0x5d, 0x0b, 0x8e, 0xd3, 0x2f, 0x0d, 0xd2, 0xe5,
0x7e, 0x9e, 0x8e, 0x2e, 0x04, 0x00, 0x00 0x23, 0x99, 0x43, 0x04, 0xc6, 0x50, 0x51, 0xec, 0x0e, 0xe0, 0xc9, 0x7b, 0xb8, 0xf7, 0xe6, 0xed,
0x96, 0x08, 0xa5, 0x71, 0x04, 0xee, 0x02, 0x9c, 0x75, 0x9d, 0xae, 0xcf, 0xda, 0x5f, 0xcf, 0xbf,
0x90, 0x7f, 0x01, 0x26, 0x24, 0x5a, 0x77, 0x58, 0x04, 0x00, 0x00
}; };
// Autogenerated from wled00/data/liveviewws2D.htm, do not edit!! // Autogenerated from wled00/data/liveviewws2D.htm, do not edit!!
const uint16_t PAGE_liveviewws2D_length = 818; const uint16_t PAGE_liveviewws2D_length = 870;
const uint8_t PAGE_liveviewws2D[] PROGMEM = { const uint8_t PAGE_liveviewws2D[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x6d, 0x54, 0x6d, 0x6f, 0xdb, 0x36, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x6d, 0x54, 0x6d, 0x6f, 0xdb, 0x36,
0x10, 0xfe, 0xee, 0x5f, 0xa1, 0x70, 0x43, 0x2b, 0xda, 0xb2, 0xe4, 0xb8, 0xed, 0x96, 0xd9, 0xa2, 0x10, 0xfe, 0xee, 0x5f, 0xa1, 0x70, 0x43, 0x2a, 0xc6, 0xb2, 0x64, 0xbb, 0xed, 0x96, 0xc5, 0xa2,
0x8b, 0x36, 0x35, 0xb0, 0x02, 0xd9, 0x6a, 0xc0, 0x19, 0x82, 0x21, 0x30, 0x50, 0x5a, 0x3a, 0x5b, 0x87, 0x35, 0x0d, 0xb0, 0x02, 0xd9, 0x6a, 0x20, 0x19, 0x82, 0x21, 0x30, 0x50, 0x5a, 0x3a, 0x5b,
0x5c, 0x25, 0xd2, 0xa0, 0xce, 0x96, 0x35, 0x47, 0xff, 0x7d, 0x47, 0xc9, 0xf1, 0x32, 0x74, 0xfa, 0x5c, 0x25, 0xd2, 0x20, 0xcf, 0x96, 0x35, 0x47, 0xff, 0x7d, 0x47, 0xc9, 0xc9, 0x32, 0x74, 0xfe,
0x40, 0x91, 0xf7, 0xf2, 0xdc, 0xf1, 0xb9, 0x3b, 0xc6, 0x57, 0x9f, 0xbe, 0xdc, 0xde, 0xff, 0xb9, 0x20, 0x93, 0xf7, 0xf2, 0xdc, 0xdb, 0x73, 0x4c, 0xcf, 0x3e, 0x7e, 0xbe, 0xbe, 0xff, 0x73, 0x71,
0x98, 0x7b, 0x19, 0x16, 0xf9, 0x2c, 0x3e, 0xaf, 0x20, 0xd3, 0x59, 0x5c, 0x00, 0x4a, 0x4f, 0xcb, 0x13, 0x14, 0x58, 0x95, 0xf3, 0xf4, 0xf4, 0x05, 0x99, 0xcf, 0xd3, 0x0a, 0x50, 0x06, 0x5a, 0x56,
0x02, 0x04, 0x3b, 0x28, 0xa8, 0x76, 0xc6, 0x22, 0xf3, 0x7a, 0x89, 0xd1, 0x08, 0x1a, 0x05, 0xab, 0x20, 0xd8, 0x5e, 0x41, 0xbd, 0x35, 0x16, 0x59, 0x30, 0xc8, 0x8c, 0x46, 0xd0, 0x28, 0x58, 0xad,
0x54, 0x8a, 0x99, 0x48, 0xe1, 0xa0, 0x12, 0x18, 0xb6, 0x87, 0x40, 0x69, 0x85, 0x4a, 0xe6, 0xc3, 0x72, 0x2c, 0x44, 0x0e, 0x7b, 0x95, 0xc1, 0xa8, 0xbb, 0x44, 0x4a, 0x2b, 0x54, 0xb2, 0x1c, 0xb9,
0x32, 0x91, 0x39, 0x88, 0xeb, 0xa0, 0x20, 0x41, 0xb1, 0x2f, 0x9e, 0xcf, 0xec, 0x8c, 0xd9, 0x4b, 0x4c, 0x96, 0x20, 0x26, 0x51, 0x45, 0x82, 0x6a, 0x57, 0x3d, 0xdf, 0xd9, 0x09, 0x73, 0x90, 0x15,
0x32, 0x69, 0x4b, 0x20, 0x8c, 0x3d, 0x6e, 0x86, 0x37, 0xec, 0x3f, 0xa1, 0x30, 0x83, 0x02, 0x86, 0xd2, 0x3a, 0x20, 0x8c, 0x1d, 0xae, 0x47, 0x97, 0xec, 0x3f, 0xa1, 0xb0, 0x80, 0x0a, 0x46, 0x99,
0x89, 0xc9, 0x8d, 0x65, 0xde, 0x25, 0xd8, 0x0f, 0xe3, 0xf6, 0x23, 0x53, 0x54, 0x98, 0xc3, 0xac, 0x29, 0x8d, 0x65, 0xc1, 0x4b, 0xb0, 0xef, 0xa6, 0xdd, 0x8f, 0x4c, 0x51, 0x61, 0x09, 0xf3, 0xc1,
0xf7, 0x70, 0x37, 0xff, 0xe4, 0xdd, 0xa9, 0x03, 0x78, 0x0b, 0x0b, 0x2e, 0xbd, 0x38, 0xea, 0x34, 0xc3, 0xed, 0xcd, 0xc7, 0xe0, 0x56, 0xed, 0x21, 0x58, 0x58, 0xf0, 0xe9, 0xa5, 0x49, 0xaf, 0x49,
0x71, 0x89, 0x35, 0xfd, 0xd6, 0x26, 0xad, 0x4f, 0x85, 0xb4, 0x5b, 0xa5, 0x27, 0xa3, 0x26, 0x8e, 0x1d, 0x36, 0xf4, 0xb7, 0x32, 0x79, 0x73, 0xac, 0xa4, 0xdd, 0x28, 0x7d, 0x35, 0x6e, 0xd3, 0xa4,
0x3a, 0x69, 0x1c, 0x75, 0x57, 0x73, 0xda, 0x59, 0x9c, 0x48, 0x7d, 0x90, 0xa5, 0xd7, 0x53, 0xa9, 0x97, 0xa6, 0x49, 0x5f, 0x9a, 0xd7, 0xce, 0xd3, 0x4c, 0xea, 0xbd, 0x74, 0xc1, 0x40, 0xe5, 0x82,
0x60, 0x6e, 0x4f, 0xe8, 0x51, 0x27, 0x23, 0x94, 0xc4, 0xaa, 0x1d, 0xce, 0x7a, 0x07, 0x69, 0xbd, 0xf9, 0x33, 0xa1, 0x27, 0xbd, 0x8c, 0x50, 0x32, 0xab, 0xb6, 0x38, 0x1f, 0xec, 0xa5, 0x0d, 0x32,
0x44, 0xa4, 0x26, 0xd9, 0x17, 0x94, 0x48, 0xb8, 0x05, 0x9c, 0xe7, 0xe0, 0xb6, 0x1f, 0xeb, 0xcf, 0x91, 0x9b, 0x6c, 0x57, 0x51, 0x22, 0xf1, 0x06, 0xf0, 0xa6, 0x04, 0x7f, 0xfc, 0xd0, 0x7c, 0xca,
0xa9, 0xdf, 0xb9, 0xf1, 0x20, 0x87, 0xb4, 0x14, 0x8c, 0x05, 0x98, 0x59, 0x83, 0x94, 0x45, 0x2a, 0xc3, 0xde, 0x8d, 0x47, 0x25, 0xe4, 0x4e, 0x30, 0x16, 0x61, 0x61, 0x0d, 0x52, 0x16, 0xb9, 0x38,
0xae, 0xae, 0xa7, 0x9b, 0xbd, 0x4e, 0x50, 0x19, 0xed, 0xd1, 0x55, 0x6f, 0x5b, 0x58, 0x9f, 0x9f, 0x9b, 0xcc, 0xd6, 0x3b, 0x9d, 0xa1, 0x32, 0x3a, 0xa0, 0x52, 0xaf, 0x3b, 0xd8, 0x90, 0x1f, 0xb3,
0x92, 0xb0, 0xe3, 0x2d, 0xfc, 0xe5, 0xa6, 0x5f, 0x29, 0x9d, 0x9a, 0x2a, 0x54, 0x5a, 0x83, 0x7d, 0xb8, 0xef, 0x5b, 0xfc, 0xd3, 0xe5, 0x45, 0xad, 0x74, 0x6e, 0xea, 0x58, 0x69, 0x0d, 0xf6, 0xa1,
0x68, 0x09, 0x4c, 0xc2, 0x0c, 0xd4, 0x36, 0xc3, 0xef, 0xd4, 0xbf, 0xb6, 0xe2, 0xe6, 0x05, 0xd2, 0x6b, 0x60, 0x16, 0x17, 0xa0, 0x36, 0x05, 0x7e, 0xa3, 0xfe, 0xb5, 0x13, 0xb7, 0xaf, 0x90, 0x66,
0xb4, 0xcd, 0x0c, 0x8f, 0x22, 0x71, 0x49, 0xdd, 0x3a, 0xa2, 0x8e, 0xe8, 0xb3, 0x71, 0xca, 0xf8, 0x5d, 0x66, 0x78, 0x10, 0x99, 0x4f, 0xea, 0xda, 0x37, 0xea, 0x80, 0x21, 0x9b, 0xe6, 0x8c, 0xcf,
0x54, 0x6d, 0x7c, 0xd2, 0xf0, 0x93, 0x33, 0xa9, 0xca, 0x29, 0xda, 0xfa, 0x54, 0x95, 0x02, 0xcd, 0xd4, 0x3a, 0x24, 0x0d, 0x3f, 0x7a, 0x93, 0xda, 0xcd, 0xd0, 0x36, 0xc7, 0xda, 0x09, 0x34, 0xdb,
0x2e, 0x3c, 0x63, 0x56, 0x65, 0x93, 0x48, 0x4c, 0x32, 0x1f, 0xf9, 0xa9, 0xa9, 0xca, 0x57, 0xaf, 0xf8, 0x84, 0x59, 0xbb, 0x36, 0x93, 0x98, 0x15, 0x21, 0xf2, 0x63, 0x4b, 0xd6, 0xb5, 0x3b, 0x3f,
0xaa, 0x32, 0xb4, 0xc4, 0x4c, 0xbd, 0x44, 0x89, 0x20, 0x84, 0x78, 0x80, 0xf5, 0xd2, 0x24, 0xdf, 0xaf, 0x5d, 0x6c, 0xa9, 0x39, 0xcd, 0x1d, 0x4a, 0x04, 0x21, 0xc4, 0x03, 0xac, 0xee, 0x4c, 0xf6,
0x00, 0xc3, 0x2f, 0x8b, 0xf9, 0xef, 0xef, 0x49, 0x5d, 0x82, 0xa6, 0xfb, 0x9e, 0x5e, 0xe7, 0x87, 0x15, 0x30, 0xfe, 0xbc, 0xb8, 0xf9, 0x9d, 0x93, 0xda, 0x81, 0xa6, 0x92, 0x8f, 0x6f, 0xca, 0xfd,
0xd7, 0x13, 0xb4, 0x7b, 0x68, 0x18, 0x9f, 0xf8, 0x84, 0xaa, 0xa1, 0xf2, 0x2e, 0xd6, 0xbe, 0xcf, 0x9b, 0x2b, 0xb4, 0x3b, 0x68, 0x29, 0x14, 0x94, 0x0e, 0x8e, 0x25, 0x60, 0x80, 0xe2, 0x84, 0x5d,
0x32, 0xc4, 0x5d, 0x39, 0x61, 0x42, 0x9c, 0x43, 0xe5, 0x86, 0x22, 0x11, 0x0b, 0xe1, 0x8e, 0xa8, 0x1a, 0x82, 0xa6, 0xb2, 0x23, 0x10, 0x18, 0x6f, 0x25, 0x16, 0x7e, 0xae, 0x91, 0x15, 0x10, 0xbb,
0x31, 0x54, 0xd7, 0xf7, 0xac, 0x2a, 0x4b, 0x36, 0xa1, 0x95, 0xf1, 0x01, 0x9b, 0x44, 0x11, 0x1b, 0x92, 0xa8, 0x12, 0x4e, 0x22, 0x88, 0x09, 0xc8, 0x3d, 0x28, 0x2c, 0x42, 0x96, 0x30, 0xfe, 0xf3,
0x5c, 0xe8, 0xbd, 0x18, 0x67, 0xa6, 0xc4, 0x01, 0x8b, 0x9c, 0x0d, 0x0f, 0x8d, 0x36, 0x3b, 0xd0, 0x68, 0x72, 0xb5, 0x37, 0x2a, 0x0f, 0xc6, 0x3c, 0x76, 0xdb, 0x52, 0x61, 0x27, 0x8d, 0x34, 0xb9,
0xc2, 0xe7, 0x62, 0x76, 0xfa, 0xff, 0x4c, 0x9a, 0x80, 0xe4, 0x6b, 0xa5, 0xa5, 0xad, 0xef, 0xeb, 0x1b, 0xab, 0x68, 0x80, 0x94, 0xd7, 0xb6, 0x94, 0xe4, 0xca, 0x0a, 0xc4, 0x2d, 0x8b, 0x58, 0xed,
0x1d, 0x75, 0x91, 0xb4, 0x56, 0xd6, 0xeb, 0xfd, 0x66, 0x03, 0x96, 0x39, 0x9d, 0x4c, 0xd3, 0xf9, 0x28, 0xb2, 0x8d, 0x4b, 0xd0, 0x1b, 0x2c, 0xe6, 0x93, 0xf3, 0xf3, 0x50, 0x0f, 0x05, 0x39, 0x0d,
0x81, 0x22, 0xdc, 0xa9, 0x92, 0x1a, 0x0a, 0xac, 0xcf, 0x0a, 0x28, 0x4b, 0xb9, 0x05, 0xaa, 0x19, 0xed, 0xe3, 0x78, 0xc9, 0x23, 0x2a, 0x47, 0x68, 0xa8, 0x83, 0x97, 0x0a, 0x48, 0xcd, 0x12, 0xef,
0xa1, 0x3a, 0x86, 0x88, 0x34, 0xf6, 0x68, 0xd6, 0x7f, 0x41, 0x82, 0xde, 0x07, 0xe7, 0xfe, 0xb1, 0xc4, 0x63, 0xa3, 0xcd, 0x16, 0xb4, 0x08, 0xb9, 0x98, 0x1f, 0xff, 0xbf, 0xa4, 0xb6, 0x25, 0xf9,
0x75, 0x5f, 0xd1, 0x55, 0x88, 0xba, 0x25, 0x5a, 0xa5, 0xb7, 0x21, 0x35, 0x72, 0xee, 0x63, 0x98, 0x4a, 0x69, 0x69, 0x9b, 0xfb, 0x66, 0x4b, 0x8c, 0x94, 0xd6, 0xca, 0x66, 0xb5, 0x5b, 0xaf, 0xc1,
0x4a, 0x94, 0x9c, 0x9f, 0x72, 0x40, 0x0f, 0x5b, 0x06, 0xfe, 0x50, 0x1a, 0x6f, 0x5a, 0x2f, 0x1f, 0xb2, 0x88, 0x74, 0x32, 0xcf, 0x6f, 0xf6, 0xc4, 0x80, 0x5b, 0xe5, 0x88, 0x9c, 0x60, 0x43, 0x56,
0x5c, 0x9c, 0xce, 0xc2, 0x15, 0xe2, 0xe7, 0x9f, 0xae, 0x04, 0x3e, 0x8e, 0x56, 0x4f, 0x4f, 0x63, 0x81, 0x73, 0x72, 0x03, 0x34, 0x7f, 0x42, 0xf5, 0xdd, 0xa6, 0x96, 0xb2, 0x47, 0xb3, 0xfa, 0x0b,
0xb7, 0xb9, 0xa6, 0xcd, 0x95, 0x2b, 0x8e, 0x05, 0xdc, 0x5b, 0x3d, 0x75, 0x10, 0x96, 0xe4, 0xe3, 0x32, 0x0c, 0x7e, 0xf1, 0xee, 0x1f, 0x3a, 0xf7, 0x25, 0xa3, 0xbe, 0xa2, 0xb9, 0x43, 0xab, 0xf4,
0x55, 0xa0, 0xe9, 0xf7, 0x66, 0x15, 0x18, 0xf1, 0x9b, 0xc4, 0x2c, 0xa4, 0xd9, 0xf1, 0xcf, 0xcd, 0x26, 0xa6, 0xa5, 0x28, 0x43, 0x8c, 0x73, 0x89, 0x92, 0xf3, 0x53, 0x0f, 0x7d, 0xda, 0x7f, 0x28,
0x12, 0xd9, 0x4b, 0x63, 0x44, 0x9a, 0x07, 0xb2, 0x33, 0xd8, 0xe4, 0xc6, 0x58, 0xff, 0xd9, 0x66, 0x8d, 0x97, 0x9d, 0x57, 0x08, 0x3e, 0x4e, 0x6f, 0xe1, 0x87, 0xfa, 0xe3, 0x0f, 0x67, 0x02, 0xa9,
0x68, 0xfa, 0x96, 0x47, 0xe3, 0xae, 0x2d, 0x40, 0xbc, 0x9d, 0x6e, 0x48, 0x59, 0x8b, 0xf0, 0xdd, 0xc4, 0xa7, 0xa7, 0xa9, 0x3f, 0x4c, 0xe8, 0x70, 0xe6, 0x07, 0x6d, 0x01, 0x77, 0x56, 0xcf, 0x3c,
0xb4, 0x8e, 0xf5, 0xb4, 0x1e, 0x0c, 0xb8, 0x13, 0x1c, 0x9d, 0xe0, 0x18, 0xdb, 0xe9, 0x91, 0x04, 0x84, 0x25, 0xf9, 0x74, 0xe9, 0x9b, 0xf7, 0xf8, 0x76, 0x19, 0x49, 0xf1, 0x1b, 0x0d, 0x20, 0xa6,
0x94, 0x45, 0xb8, 0x51, 0x79, 0xbe, 0x74, 0xa3, 0x21, 0xbe, 0xda, 0xed, 0xda, 0xff, 0xf1, 0x84, 0x3d, 0x0c, 0x4f, 0xc4, 0x4b, 0xec, 0x0b, 0xc9, 0x12, 0xcd, 0x23, 0xd5, 0x1b, 0xac, 0x4b, 0x63,
0x8f, 0xb0, 0x6a, 0x82, 0xf6, 0x3f, 0xb8, 0xbe, 0xec, 0xc6, 0xab, 0x86, 0x7f, 0x0d, 0x9c, 0xc3, 0x6c, 0xf8, 0x6c, 0x33, 0x92, 0x17, 0x96, 0x27, 0xd3, 0x9e, 0x62, 0x20, 0xde, 0xcd, 0xd6, 0xa4,
0x1a, 0x68, 0xa2, 0x16, 0x14, 0xdf, 0xe7, 0xed, 0x59, 0xda, 0xc4, 0x3f, 0xf6, 0xcd, 0x40, 0x06, 0x6c, 0x44, 0xfc, 0x7e, 0xd6, 0xa4, 0x7a, 0xd6, 0x0c, 0x87, 0xdc, 0x0b, 0x0e, 0x5e, 0x70, 0x48,
0x75, 0xdf, 0x04, 0xe1, 0x5b, 0x5a, 0x46, 0xc1, 0xb8, 0xdf, 0x66, 0xb8, 0xf8, 0xdc, 0xd9, 0xb8, 0xed, 0xec, 0x40, 0x02, 0xca, 0x22, 0x5e, 0xab, 0xb2, 0xbc, 0xf3, 0x6b, 0x26, 0xbe, 0xd8, 0xcd,
0x20, 0x64, 0x0e, 0x03, 0xf1, 0xa6, 0xf9, 0xb7, 0xef, 0x68, 0xb6, 0x4b, 0x93, 0x43, 0x08, 0xd6, 0x2a, 0xfc, 0xfe, 0x88, 0x8f, 0xb0, 0x6c, 0xa3, 0xee, 0x7f, 0x38, 0x79, 0x39, 0x4d, 0x97, 0x2d,
0x52, 0x66, 0x6c, 0x01, 0xf0, 0xcd, 0x7b, 0x58, 0x7a, 0xed, 0x71, 0x42, 0x65, 0xe1, 0x4d, 0xc3, 0xff, 0x12, 0x79, 0x87, 0x15, 0xd0, 0x70, 0x17, 0x14, 0x3f, 0xe4, 0xdd, 0x5d, 0xda, 0x2c, 0x3c,
0x9b, 0x73, 0x13, 0x7d, 0x5f, 0x3e, 0x0b, 0xa5, 0xfa, 0xfb, 0xb9, 0x7a, 0xcf, 0x53, 0xf7, 0xf4, 0x5c, 0xc8, 0xa1, 0x8a, 0x9a, 0x0b, 0x19, 0xc5, 0xef, 0xe8, 0x33, 0x8e, 0xa6, 0x17, 0x5d, 0x86,
0xe4, 0xbf, 0x98, 0x90, 0x97, 0xd3, 0x38, 0x0a, 0x48, 0x71, 0xaf, 0x0a, 0x30, 0x7b, 0x6a, 0x52, 0x8b, 0x4f, 0xbd, 0x8d, 0x0f, 0x42, 0xe6, 0x30, 0x14, 0x6f, 0xdb, 0x7f, 0x39, 0x4c, 0xef, 0x84,
0xfe, 0xd2, 0x89, 0x46, 0xb5, 0x09, 0xc6, 0xef, 0x46, 0x9c, 0x37, 0xbc, 0x47, 0x0f, 0x45, 0x37, 0x33, 0x25, 0xf1, 0xca, 0x5a, 0xca, 0x8c, 0x2d, 0x00, 0xbe, 0x06, 0x0f, 0x77, 0x41, 0x77, 0xbd,
0xf8, 0x71, 0xd4, 0xbd, 0x11, 0x51, 0xfb, 0x22, 0xfe, 0x03, 0x69, 0xb3, 0xce, 0x95, 0x27, 0x05, 0xa2, 0xb1, 0xd0, 0x50, 0x79, 0x7b, 0xe2, 0xe7, 0xb7, 0xe3, 0xb3, 0xe0, 0xd4, 0xdf, 0xcf, 0xd3,
0x00, 0x00 0x7b, 0xde, 0xe0, 0xa7, 0xa7, 0xf0, 0xd5, 0xb6, 0xbd, 0xde, 0xec, 0x71, 0x44, 0x8a, 0x7b, 0x55,
0x81, 0xd9, 0x61, 0xd8, 0x11, 0xe9, 0xf5, 0xda, 0xb7, 0xd1, 0xf4, 0xfd, 0x98, 0xf3, 0x96, 0x0f,
0xe8, 0xd1, 0xe9, 0x1f, 0x91, 0x34, 0xe9, 0xdf, 0x9b, 0xa4, 0x7b, 0x5d, 0xff, 0x01, 0x47, 0xe8,
0xd7, 0x03, 0x73, 0x05, 0x00, 0x00
}; };
@ -341,60 +346,60 @@ const uint8_t PAGE_liveviewws2D[] PROGMEM = {
const uint16_t PAGE_404_length = 868; const uint16_t PAGE_404_length = 868;
const uint8_t PAGE_404[] PROGMEM = { const uint8_t PAGE_404[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x65, 0x54, 0x5b, 0x73, 0xaa, 0x3a, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x65, 0x54, 0x5b, 0x73, 0xaa, 0x3a,
0x14, 0x7e, 0xef, 0xaf, 0xe0, 0x78, 0xe6, 0xcc, 0x7e, 0x68, 0x2d, 0xa8, 0xd8, 0x2a, 0xa2, 0x33, 0x14, 0x7e, 0xef, 0xaf, 0x60, 0x7b, 0x66, 0xcf, 0x7e, 0x68, 0x15, 0x54, 0xac, 0x8a, 0xe8, 0x4c,
0x01, 0x51, 0xec, 0xc5, 0x7a, 0xa3, 0xd6, 0xbe, 0x05, 0x12, 0x21, 0x15, 0x08, 0x4d, 0x82, 0x62, 0x40, 0x14, 0x7b, 0xf1, 0x4e, 0xad, 0x7d, 0x0b, 0x10, 0x21, 0x15, 0x08, 0x4d, 0x82, 0x62, 0x3b,
0x3b, 0xfd, 0xef, 0x3b, 0x40, 0xf7, 0x9c, 0xce, 0xec, 0x35, 0x03, 0x2b, 0xf9, 0x56, 0xd6, 0x7d, 0xfd, 0xef, 0x3b, 0x40, 0x3b, 0xa7, 0x33, 0x7b, 0xcd, 0xc0, 0x4a, 0xbe, 0x95, 0x75, 0x5f, 0x89,
0x25, 0xe6, 0x3f, 0xe3, 0x27, 0x7b, 0xb3, 0x5b, 0x38, 0x4a, 0x24, 0x92, 0x78, 0x64, 0x7e, 0xff, 0xfe, 0x6b, 0xbc, 0x30, 0xb7, 0xfb, 0xa5, 0x25, 0x85, 0x3c, 0x8e, 0x46, 0xfa, 0xd7, 0x1f, 0x41,
0x31, 0x44, 0x23, 0x33, 0xc1, 0x02, 0x2a, 0x41, 0x04, 0x19, 0xc7, 0x62, 0xd8, 0xc8, 0xc5, 0xbe, 0x7f, 0xa4, 0xc7, 0x88, 0x43, 0xc9, 0x0b, 0x21, 0x65, 0x88, 0x0f, 0x6b, 0x19, 0x3f, 0xd4, 0x7b,
0xd9, 0x6b, 0x7c, 0xa3, 0x17, 0x01, 0x4d, 0x05, 0x4e, 0x25, 0x7c, 0x22, 0x48, 0x44, 0x43, 0x84, 0xb5, 0x2f, 0xf4, 0xca, 0x23, 0x09, 0x47, 0x89, 0x80, 0xcf, 0xd8, 0xe7, 0xe1, 0xd0, 0x47, 0x27,
0x8f, 0x24, 0xc0, 0xcd, 0x6a, 0xd3, 0x50, 0x52, 0x98, 0xe0, 0x61, 0xe3, 0x48, 0xf0, 0x29, 0xa3, 0xec, 0xa1, 0x7a, 0xb9, 0xa9, 0x49, 0x09, 0x8c, 0xd1, 0xb0, 0x76, 0xc2, 0xe8, 0x9c, 0x12, 0xca,
0x4c, 0xfc, 0xd1, 0xa9, 0x51, 0x11, 0xe1, 0x04, 0x37, 0x03, 0x1a, 0x53, 0xd6, 0xf8, 0x61, 0xe6, 0xbf, 0x75, 0x2a, 0x94, 0x87, 0x28, 0x46, 0x75, 0x8f, 0x44, 0x84, 0xd6, 0x7e, 0x98, 0xf9, 0xaf,
0xdf, 0x76, 0x45, 0xf2, 0xac, 0x20, 0x22, 0xc6, 0xa3, 0x39, 0x15, 0xca, 0x9e, 0xe6, 0x29, 0x32, 0x55, 0x92, 0x38, 0xcb, 0x31, 0x8f, 0xd0, 0x68, 0x4e, 0xb8, 0x74, 0x20, 0x59, 0xe2, 0xeb, 0x72,
0xd5, 0x1a, 0x30, 0xb9, 0x38, 0x4b, 0x76, 0xe1, 0x53, 0x74, 0xfe, 0xdc, 0x4b, 0xb5, 0xe6, 0x1e, 0x05, 0xe8, 0x8c, 0x5f, 0x04, 0xbb, 0x72, 0x89, 0x7f, 0xf9, 0x38, 0x08, 0xb5, 0xfa, 0x01, 0xc6,
0x26, 0x24, 0x3e, 0x1b, 0xcf, 0x98, 0x21, 0x98, 0xc2, 0x2b, 0x17, 0xc7, 0x47, 0x2c, 0x48, 0x00, 0x38, 0xba, 0x68, 0x4f, 0x88, 0xfa, 0x30, 0x81, 0x37, 0x36, 0x8a, 0x4e, 0x88, 0x63, 0x0f, 0xde,
0xaf, 0x38, 0x4c, 0x79, 0x93, 0x63, 0x46, 0xf6, 0x03, 0x81, 0x0b, 0xd1, 0x84, 0x31, 0x09, 0x53, 0x30, 0x98, 0xb0, 0x3a, 0x43, 0x14, 0x1f, 0x06, 0x1c, 0xe5, 0xbc, 0x0e, 0x23, 0x1c, 0x24, 0x9a,
0x23, 0x90, 0x7e, 0x30, 0x1b, 0xf8, 0x30, 0x38, 0x84, 0xac, 0xb4, 0x5c, 0x07, 0x61, 0x94, 0x9e, 0x27, 0xfc, 0x20, 0x3a, 0x70, 0xa1, 0x77, 0x0c, 0x68, 0x61, 0xb9, 0x0a, 0x42, 0x2b, 0x3c, 0x0f,
0x07, 0x09, 0x64, 0x21, 0x49, 0x0d, 0x6d, 0xf0, 0x8d, 0xed, 0xf7, 0xfb, 0x2f, 0x92, 0x84, 0x9f, 0x62, 0x48, 0x03, 0x9c, 0x68, 0xca, 0xe0, 0x0b, 0x3b, 0x1c, 0x0e, 0x9f, 0x38, 0x0e, 0x3e, 0xca,
0x55, 0x42, 0x86, 0xae, 0x69, 0x59, 0x21, 0xcf, 0x14, 0x75, 0x82, 0x46, 0x57, 0xfb, 0x6f, 0x40, 0x84, 0x34, 0x55, 0x51, 0xd2, 0x5c, 0x9c, 0xc9, 0xab, 0x04, 0xb5, 0x8e, 0xf2, 0x7b, 0x80, 0x63,
0x12, 0x18, 0xe2, 0x26, 0xc3, 0x29, 0x92, 0x8e, 0xd2, 0xd0, 0xc8, 0x48, 0x81, 0x63, 0x28, 0x30, 0x18, 0xa0, 0x3a, 0x45, 0x89, 0x2f, 0x1c, 0x25, 0x81, 0x96, 0xe2, 0x1c, 0x45, 0x90, 0x23, 0xff,
0xfa, 0x4b, 0x12, 0x30, 0xc2, 0xb3, 0x26, 0x46, 0x21, 0xe6, 0x7f, 0xfc, 0xb4, 0xbb, 0x59, 0xa1, 0x1f, 0x89, 0x47, 0x31, 0x4b, 0xeb, 0xc8, 0x0f, 0x10, 0xfb, 0xf6, 0xd3, 0xea, 0xa4, 0xb9, 0xa4,
0x68, 0x4a, 0xb3, 0xa5, 0x95, 0xfc, 0xcb, 0xcf, 0x85, 0xa0, 0xe9, 0x27, 0xcd, 0x45, 0x4c, 0x52, 0x48, 0xf5, 0xa6, 0x52, 0xf0, 0x4f, 0x37, 0xe3, 0x9c, 0x24, 0x1f, 0x24, 0xe3, 0x11, 0x4e, 0x50,
0x5c, 0x46, 0x91, 0x33, 0x2e, 0xc3, 0xc8, 0x28, 0xa9, 0x62, 0xce, 0x20, 0x42, 0xa5, 0xa5, 0x5e, 0x11, 0x45, 0x46, 0x99, 0x08, 0x23, 0x25, 0xb8, 0x8c, 0x39, 0x85, 0xbe, 0x5f, 0x58, 0xea, 0x95,
0x15, 0x45, 0x65, 0xa1, 0xd4, 0x1c, 0xd4, 0xd1, 0xb4, 0x3b, 0xe5, 0xba, 0xca, 0x54, 0x30, 0x99, 0x51, 0x94, 0x16, 0x0a, 0xcd, 0x41, 0x15, 0x4d, 0xab, 0x5d, 0xac, 0xcb, 0x4c, 0x39, 0x15, 0xa9,
0xfa, 0x9e, 0xb2, 0xc4, 0xc8, 0xb3, 0x0c, 0xb3, 0x00, 0x72, 0x3c, 0xf8, 0x59, 0xab, 0xe8, 0x4f, 0x1f, 0x08, 0x8d, 0xb5, 0x2c, 0x4d, 0x11, 0xf5, 0x20, 0x43, 0x83, 0x9f, 0xb5, 0x0a, 0xbf, 0x6b,
0x8d, 0x6a, 0x94, 0x93, 0x0f, 0x6c, 0xb4, 0xfa, 0x52, 0xfb, 0xef, 0xaa, 0x74, 0x3a, 0x9d, 0x1f, 0x54, 0xa1, 0x0c, 0xbf, 0x23, 0xad, 0xd9, 0x17, 0xda, 0xff, 0x56, 0xa5, 0xdd, 0x6e, 0xff, 0x28,
0xc5, 0x18, 0xf8, 0x94, 0xc9, 0x74, 0x0c, 0x4d, 0xe1, 0x34, 0x26, 0x48, 0xf9, 0x81, 0x35, 0x19, 0xc6, 0xc0, 0x25, 0x54, 0xa4, 0xa3, 0x29, 0x12, 0x23, 0x11, 0xf6, 0xa5, 0x1f, 0x58, 0x9d, 0x42,
0x44, 0x24, 0xe7, 0x55, 0x4e, 0x5f, 0x17, 0xa6, 0x5a, 0xf7, 0xc9, 0x54, 0xeb, 0x19, 0x2a, 0xdb, 0x1f, 0x67, 0xac, 0xcc, 0xe9, 0xf3, 0x4a, 0x97, 0xab, 0x3e, 0xe9, 0x72, 0x35, 0x43, 0x45, 0xbb,
0x35, 0x32, 0x65, 0x29, 0x15, 0x18, 0xcb, 0x36, 0xcb, 0x96, 0x73, 0x16, 0x0c, 0x1b, 0x08, 0x0a, 0x46, 0xba, 0x28, 0xa5, 0x04, 0x23, 0xd1, 0x66, 0xd1, 0x72, 0x46, 0xbd, 0x61, 0xcd, 0x87, 0x1c,
0x68, 0x54, 0x85, 0x52, 0xb3, 0x34, 0x94, 0xee, 0x39, 0xbe, 0xd1, 0xaf, 0xc8, 0xb3, 0xf5, 0xb4, 0x6a, 0x65, 0xa1, 0xe4, 0x34, 0x09, 0x84, 0x7b, 0x86, 0x6e, 0xd5, 0x1b, 0xfc, 0x64, 0x2c, 0xd6,
0x3a, 0x69, 0xf7, 0xd3, 0x90, 0x02, 0x49, 0xf3, 0xb5, 0x17, 0x39, 0x5e, 0x28, 0x57, 0x76, 0xb9, 0x67, 0xe5, 0x7e, 0x1a, 0x10, 0x20, 0x68, 0xbe, 0x71, 0x42, 0xcb, 0x09, 0xc4, 0xca, 0x2c, 0xb6,
0x05, 0xa1, 0x0d, 0x1e, 0x25, 0xb3, 0x9c, 0x6c, 0xc6, 0xa6, 0x15, 0xf2, 0x32, 0x5f, 0xaf, 0xb4, 0x20, 0x30, 0xc1, 0xa3, 0x60, 0x86, 0x95, 0xce, 0xe8, 0xb4, 0x44, 0x9e, 0xe7, 0x9b, 0xb5, 0x32,
0x19, 0x60, 0x5c, 0x0f, 0x6e, 0x96, 0x25, 0xb0, 0x4a, 0x97, 0x5e, 0xcb, 0x92, 0x0a, 0xc5, 0xdb, 0x03, 0x94, 0xa9, 0xde, 0xed, 0xaa, 0x00, 0xd6, 0xc9, 0xca, 0x69, 0x1a, 0x42, 0x21, 0x7f, 0x3d,
0xe9, 0xd8, 0xdb, 0x2d, 0xbd, 0x12, 0xf4, 0x3d, 0xa7, 0xf0, 0x56, 0x95, 0xdc, 0xea, 0xb5, 0x42, 0x9f, 0x7a, 0xfb, 0x95, 0x53, 0x80, 0xae, 0x63, 0xe5, 0xce, 0xba, 0x94, 0x1b, 0xbd, 0x66, 0x60,
0xdb, 0x53, 0x3f, 0xee, 0xdf, 0xd5, 0x92, 0xfa, 0xfe, 0xb6, 0x45, 0x6d, 0x10, 0x4e, 0x23, 0x0a, 0x3a, 0xf2, 0xfb, 0xfd, 0x9b, 0x5c, 0x50, 0xdf, 0xdd, 0x35, 0x89, 0x09, 0x82, 0x69, 0x48, 0x60,
0x4b, 0xf1, 0x74, 0xf1, 0xf0, 0xd2, 0xab, 0x2c, 0xdf, 0xa1, 0xc9, 0xdd, 0x93, 0xa7, 0xfe, 0x4f, 0x21, 0x9e, 0x2e, 0x1f, 0x9e, 0x7b, 0xa5, 0xe5, 0x3b, 0x7f, 0x72, 0xb7, 0x70, 0xe4, 0xff, 0x09,
0x60, 0x32, 0x5f, 0x60, 0x6b, 0x56, 0xc9, 0x02, 0x27, 0x7a, 0x0d, 0x4e, 0x00, 0x8c, 0x79, 0xb9, 0x4c, 0xe6, 0x4b, 0x64, 0xcc, 0x4a, 0x99, 0x67, 0x85, 0x2f, 0xde, 0x19, 0x80, 0x31, 0x2b, 0xb6,
0xbd, 0x05, 0x60, 0xcb, 0xb6, 0x64, 0x79, 0x28, 0x03, 0x45, 0x6b, 0x6f, 0x65, 0x3d, 0x8f, 0xa3, 0x5d, 0x00, 0x76, 0x74, 0x87, 0x57, 0xc7, 0x22, 0x50, 0x7f, 0xe3, 0xac, 0x8d, 0xa7, 0x71, 0xb8,
0x45, 0x11, 0xf4, 0xfd, 0x31, 0xf5, 0x42, 0x07, 0xcc, 0x97, 0xd8, 0x5f, 0xa8, 0x13, 0x2f, 0x77, 0xcc, 0xbd, 0xbe, 0x3b, 0x26, 0x4e, 0x60, 0x81, 0xf9, 0x0a, 0xb9, 0x4b, 0x79, 0xe2, 0x64, 0xf6,
0x1f, 0xdf, 0xac, 0xe9, 0x4e, 0xb5, 0x2e, 0x3b, 0xce, 0x6e, 0x75, 0xbb, 0x72, 0xb5, 0x77, 0x5b, 0xe3, 0xab, 0x31, 0xdd, 0xcb, 0xc6, 0x75, 0xdb, 0xda, 0xaf, 0xbb, 0x6b, 0x5b, 0x79, 0x33, 0xe5,
0x7d, 0xb5, 0x82, 0x1b, 0xf7, 0x64, 0xc7, 0x6f, 0xa1, 0xfb, 0x74, 0x59, 0xbc, 0xce, 0x9e, 0xd7, 0x17, 0xc3, 0xbb, 0xb5, 0xcf, 0x66, 0xf4, 0x1a, 0xd8, 0x8b, 0xeb, 0xfc, 0x65, 0xf6, 0xb4, 0x99,
0xb3, 0x36, 0xdf, 0x85, 0x2e, 0x9c, 0xde, 0x3a, 0xd6, 0x36, 0xea, 0xbd, 0x6d, 0x69, 0xb1, 0x61, 0xb5, 0xd8, 0x3e, 0xb0, 0xe1, 0xb4, 0x6b, 0x19, 0xbb, 0xb0, 0xf7, 0xba, 0x23, 0xf9, 0x96, 0x9a,
0xb6, 0x35, 0x41, 0xe3, 0xbb, 0x4b, 0x6b, 0xac, 0xc7, 0xfe, 0xcc, 0x2d, 0x40, 0xf0, 0xd1, 0x03, 0xc6, 0xc4, 0x1f, 0xdf, 0x5d, 0x1b, 0x63, 0x35, 0x72, 0x67, 0x76, 0x0e, 0xbc, 0xf7, 0x1e, 0x58,
0x0b, 0xf0, 0xfc, 0xb0, 0xe1, 0xec, 0xd5, 0xd1, 0xf1, 0x72, 0xdc, 0x7d, 0xff, 0x10, 0x9d, 0x00, 0x82, 0xa7, 0x87, 0x2d, 0xa3, 0x2f, 0x96, 0x8a, 0x56, 0xe3, 0xce, 0xdb, 0x3b, 0x6f, 0x7b, 0x60,
0x4c, 0x36, 0x3b, 0x7a, 0xb0, 0xf5, 0x9d, 0x3d, 0xef, 0x4f, 0xcf, 0x7e, 0x98, 0xeb, 0x67, 0xb0, 0xb2, 0xdd, 0x93, 0xa3, 0xa9, 0xee, 0xcd, 0x79, 0x7f, 0x7a, 0x71, 0x83, 0x4c, 0xbd, 0x80, 0x15,
0x14, 0xd6, 0xe4, 0x61, 0xf9, 0xe2, 0xe6, 0x2e, 0xb0, 0xc0, 0xed, 0xdd, 0x23, 0x7e, 0x72, 0x6c, 0x37, 0x26, 0x0f, 0xab, 0x67, 0x3b, 0xb3, 0x81, 0x01, 0xba, 0x77, 0x8f, 0x68, 0x61, 0x99, 0xb2,
0xd5, 0xd1, 0xb6, 0xdd, 0xfc, 0xdc, 0x0f, 0x8f, 0xfa, 0x91, 0x76, 0x97, 0xee, 0x7d, 0x9b, 0xdc, 0xa5, 0xec, 0x3a, 0xd9, 0xa5, 0x1f, 0x9c, 0xd4, 0x13, 0xe9, 0xac, 0xec, 0xfb, 0x16, 0xee, 0x5e,
0x9e, 0xdf, 0xdb, 0x76, 0xcf, 0x03, 0xd6, 0xa3, 0xee, 0x26, 0x0f, 0x97, 0xf6, 0x7a, 0xf3, 0x62, 0xde, 0x5a, 0x66, 0xcf, 0x01, 0xc6, 0xa3, 0x6a, 0xc7, 0x0f, 0xd7, 0xe6, 0x66, 0xfb, 0x6c, 0x6e,
0x6f, 0x26, 0xad, 0x31, 0xb3, 0x5f, 0x6e, 0x2e, 0xa7, 0x59, 0xff, 0xc3, 0xea, 0xa2, 0x2a, 0x5b, 0x27, 0xcd, 0x31, 0x35, 0x9f, 0x6f, 0xaf, 0xa7, 0x69, 0xff, 0xdd, 0xe8, 0xf8, 0x65, 0xb6, 0xc0,
0xe0, 0xc4, 0x93, 0xcd, 0x61, 0x9d, 0x2f, 0x13, 0xdb, 0x6e, 0x8c, 0x2e, 0xcc, 0xa8, 0x35, 0xd2, 0x8a, 0x26, 0xdb, 0xe3, 0x26, 0x5b, 0xc5, 0xa6, 0x59, 0x1b, 0x5d, 0xe9, 0x61, 0x73, 0xa4, 0x2a,
0x35, 0x5d, 0x29, 0xef, 0xeb, 0xa4, 0xbe, 0xaf, 0x12, 0x31, 0xfd, 0x11, 0x38, 0xe0, 0x84, 0x28, 0xaa, 0x54, 0xdc, 0xd7, 0x49, 0x75, 0x5f, 0x05, 0xa2, 0xbb, 0x23, 0x70, 0x44, 0x31, 0x96, 0x7c,
0x88, 0x62, 0xae, 0xa4, 0x52, 0x76, 0x48, 0xe9, 0x49, 0x39, 0x45, 0x98, 0x61, 0xe5, 0x4c, 0x73, 0x82, 0x98, 0x94, 0x08, 0xd9, 0x31, 0x21, 0x67, 0xe9, 0x1c, 0x22, 0x8a, 0xa4, 0x0b, 0xc9, 0x24,
0x05, 0x4a, 0x5e, 0x0e, 0x08, 0x46, 0xd7, 0xd7, 0xd7, 0xa6, 0xea, 0x4b, 0x0d, 0x56, 0x7d, 0x17, 0x28, 0x78, 0x31, 0x20, 0xc8, 0x6f, 0x34, 0x1a, 0xba, 0xec, 0x0a, 0x0d, 0x5a, 0x7e, 0x57, 0x7a,
0x66, 0x7d, 0x19, 0x14, 0x9a, 0x06, 0x31, 0x09, 0x0e, 0xc3, 0x5f, 0x27, 0x92, 0x22, 0x7a, 0xba, 0x75, 0x19, 0x24, 0x92, 0x78, 0x11, 0xf6, 0x8e, 0xc3, 0x3f, 0x67, 0x9c, 0xf8, 0xe4, 0xdc, 0x88,
0x8e, 0x69, 0x00, 0x05, 0xa1, 0xe9, 0x75, 0xc4, 0xf0, 0x7e, 0xd8, 0x50, 0xb9, 0x1c, 0x43, 0xcc, 0x88, 0x07, 0x39, 0x26, 0x49, 0x23, 0xa4, 0xe8, 0x30, 0xac, 0x35, 0x1a, 0x32, 0x13, 0x83, 0x88,
0x78, 0xe3, 0xd7, 0xc8, 0x92, 0xb3, 0xab, 0x08, 0xaa, 0x94, 0x6f, 0x09, 0xa3, 0x31, 0x97, 0xe6, 0x28, 0xab, 0xfd, 0x19, 0x19, 0x62, 0x7a, 0x25, 0x4e, 0xa4, 0xe2, 0x35, 0xa1, 0x24, 0x62, 0xc2,
0x2a, 0x13, 0xd2, 0x96, 0x5a, 0x8f, 0x9f, 0x5a, 0xbd, 0x6a, 0xbf, 0x01, 0x22, 0xc8, 0xb7, 0x64, 0x60, 0x69, 0x44, 0x58, 0x93, 0xab, 0x01, 0x94, 0xcb, 0x77, 0xed, 0x2f, 0xa3, 0xab, 0x2b, 0xfe,
0xeb, 0x04, 0x00, 0x00 0xed, 0x04, 0x00, 0x00
}; };

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,7 @@
*/ */
// version code in format yymmddb (b = daily build) // version code in format yymmddb (b = daily build)
#define VERSION 2305280 #define VERSION 2306040
//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