const char JS_CONTROLS[] PROGMEM = R"=====( const UI_INITIAL_GUI=200;const UI_RELOAD=201;const UPDATE_OFFSET=100;const UI_EXTEND_GUI=210;const ALERT_I=240;const ALERT_W=241;const ALERT_E=242;const ALERT_S=243;const UI_TITEL=0;const UI_PAD=1;const UPDATE_PAD=101;const UI_CPAD=2;const UPDATE_CPAD=102;const UI_BUTTON=3;const UPDATE_BUTTON=103;const UI_LABEL=4;const UPDATE_LABEL=104;const UI_SWITCHER=5;const UPDATE_SWITCHER=105;const UI_SLIDER=6;const UPDATE_SLIDER=106;const UI_NUMBER=7;const UPDATE_NUMBER=107;const UI_TEXT_INPUT=8;const UPDATE_TEXT_INPUT=108;const UI_GRAPH=9;const ADD_GRAPH_POINT=10;const CLEAR_GRAPH=109;const UI_TAB=11;const UPDATE_TAB=111;const UI_SELECT=12;const UPDATE_SELECT=112;const UI_OPTION=13;const UPDATE_OPTION=113;const UI_MIN=14;const UPDATE_MIN=114;const UI_MAX=15;const UPDATE_MAX=115;const UI_STEP=16;const UPDATE_STEP=116;const UI_GAUGE=17;const UPDATE_GAUGE=117;const UI_ACCEL=18;const UPDATE_ACCEL=118;const UI_SEPARATOR=19;const UPDATE_SEPARATOR=119;const UI_TIME=20;const UPDATE_TIME=120;const UI_FRAGMENT=21;const UP=0;const DOWN=1;const LEFT=2;const RIGHT=3;const CENTER=4;const C_TURQUOISE=0;const C_EMERALD=1;const C_PETERRIVER=2;const C_WETASPHALT=3;const C_SUNFLOWER=4;const C_CARROT=5;const C_ALIZARIN=6;const C_DARK=7;const C_NONE=255;var controlAssemblyArray=new Object();var FragmentAssemblyTimer=0;var graphData=new Array();var hasAccel=false;var sliderContinuous=false;class Alert{static fire(icon,message,position="tl",type="",options={},onConfirm=function(){},onCancel=function(){}){const el=document.createElement("div");el.className="Alert";const divIcon=document.createElement("div");divIcon.className="AlertIcon";const divMessage=document.createElement("div");divMessage.className="AlertMessage";el.appendChild(divIcon);el.appendChild(divMessage);if(icon=="succ"){divIcon.innerHTML='✓';}else if(icon=="err"){divIcon.innerHTML='⨷';el.style.backgroundColor="rgba(180, 0, 0, 0.75)" message="ERROR
"+message;}else if(icon=="info"){divIcon.innerHTML='⚠';}else if(icon=="warn"){divIcon.innerHTML="𝕎";el.style.backgroundColor="rgba(100, 0, 0, 0.75);"} divMessage.innerHTML="

"+message+"

";if(type=="dialog"){el.style.flexDirection="column";divIcon.style.position="relative";divIcon.style.left="0px";divIcon.style.marginTop="15px";const divControls=document.createElement("div");divControls.className="AlertControls";const btnConfirm=document.createElement("button");btnConfirm.className="BtnConfirm";btnConfirm.innerHTML="Confirm";const btnCancel=document.createElement("button");btnCancel.className="BtnCancel";btnCancel.innerHTML="Cancel";el.appendChild(divControls);divControls.appendChild(btnConfirm);divControls.appendChild(btnCancel);btnConfirm.onclick=function(){onConfirm();removeAlert(el);};btnCancel.onclick=function(){onCancel();removeAlert(el);};if(Object.keys(options).length>0){if(options.confirmButtonText){btnConfirm.innerHTML=options.confirmButtonText;} if(options.cancelButtonText){btnCancel.innerHTML=options.cancelButtonText;} if(options.confirmButtonColor){btnConfirm.style.backgroundColor=options.confirmButtonColor;} if(options.cancelButtonColor){btnCancel.style.backgroundColor=options.cancelButtonColor;}}} el.style.left=0;switch(position){case"tl":el.style.top=0;break;case"tm":el.style.right=0;el.style.marginLeft="auto";el.style.marginRight="auto";break;case"bl":el.style.bottom=0;break;case"bm":el.style.right=0;el.style.bottom=0;el.style.marginLeft="auto";el.style.marginRight="auto";break;case"center":el.style.right=0;el.style.marginLeft="auto";el.style.marginRight="auto";el.style.marginTop="20%";break;} if(Object.keys(options).length>0){if(options.backgroundColor){el.style.backgroundColor=options.backgroundColor;} if(options.fontColor){divMessage.style.color=options.fontColor;} if(options.iconColor){divIcon.style.color=options.iconColor;} if(options.borderRadius){el.style.borderRadius=options.borderRadius;} if(options.border){el.style.border=options.border;}} document.body.appendChild(el);if(type==""){setTimeout(()=>{el.parentNode.removeChild(el);},8000);} function remAlert(element){element.parentNode.removeChild(element);}}} function colorClass(colorId){colorId=Number(colorId);switch(colorId){case C_TURQUOISE:return"turquoise";case C_EMERALD:return"emerald";case C_PETERRIVER:return"peterriver";case C_WETASPHALT:return"wetasphalt";case C_SUNFLOWER:return"sunflower";case C_CARROT:return"carrot";case C_ALIZARIN:return"alizarin";case C_DARK:case C_NONE:return"dark";default:return"";}} var websock;var websockConnected=false;var WebSocketTimer=null;function requestOrientationPermission(){} function saveGraphData(){localStorage.setItem("espuigraphs",JSON.stringify(graphData));} function restoreGraphData(id){var savedData=localStorage.getItem("espuigraphs",graphData);if(savedData!=null){savedData=JSON.parse(savedData);let idData=savedData[id];return Array.isArray(idData)?idData:[];} return[];} function restart(){$(document).add("*").off();$("#row").html("");conStatusError();start();} function FragmentAssemblyTimerStop(){if(FragmentAssemblyTimer) FragmentAssemblyTimer.forEach(element=>{clearInterval(element);});FragmentAssemblyTimer=0;} function conStatusError(){FragmentAssemblyTimerStop();controlAssemblyArray=new Object();if(true===websockConnected){websockConnected=false;websock.close();$("#conStatus").removeClass("color-green");$("#conStatus").addClass("color-red");$("#conStatus").html("Error / No Connection ↻");$("#conStatus").off();$("#conStatus").on({click:restart,});}} function handleVisibilityChange(){if(!websockConnected&&!document.hidden){restart();}} function start(){let location=window.location.hostname;let port=window.location.port;document.addEventListener("visibilitychange",handleVisibilityChange,false);if(port!=""||port!=80||port!=443){websock=new WebSocket("ws://"+location+":"+port+"/ws");}else{websock=new WebSocket("ws://"+location+"/ws");} if(null===WebSocketTimer){WebSocketTimer=setInterval(function(){if(websock.readyState===3){console.info("Web Socket Is Closed");restart();}},5000);} websock.onopen=function(evt){console.log("websock open");$("#conStatus").addClass("color-green");$("#conStatus").text("Connected");websockConnected=true;controlAssemblyArray=new Object();};websock.onclose=function(evt){console.log("websock close");conStatusError();FragmentAssemblyTimerStop();controlAssemblyArray=new Object();};websock.onerror=function(evt){console.log("websock Error");restart();FragmentAssemblyTimerStop();controlAssemblyArray=new Object();};var handleEvent=function(evt){try{var data=JSON.parse(evt.data);} catch(Event){console.error(Event);websock.send("uiok:"+0);return;} var e=document.body;var center="";console.info("data.type: '"+data.type+"'");switch(data.type){case UI_INITIAL_GUI:$("#row").html("");$("#tabsnav").html("");$("#tabscontent").html("");if(data.sliderContinuous){sliderContinuous=data.sliderContinuous;} data.controls.forEach(element=>{var fauxEvent={data:JSON.stringify(element),};handleEvent(fauxEvent);});if(data.totalcontrols>(data.controls.length-1)){websock.send("uiok:"+(data.controls.length-1));} break;case UI_EXTEND_GUI:data.controls.forEach(element=>{var fauxEvent={data:JSON.stringify(element),};handleEvent(fauxEvent);});if(data.totalcontrols>data.startindex+(data.controls.length-1)){websock.send("uiok:"+(data.startindex+(data.controls.length-1)));} break;case UI_RELOAD:window.location.reload();break;case UI_TITEL:document.title=data.label;$("#mainHeader").html(data.label);break;case ALERT_I:Alert.fire("info",data.value);break;case ALERT_W:Alert.fire("warn",data.value);break;case ALERT_E:Alert.fire("err",data.value);break;case ALERT_S:Alert.fire("succ",data.value);break;case UI_LABEL:case UI_NUMBER:case UI_TEXT_INPUT:case UI_SELECT:case UI_GAUGE:case UI_SEPARATOR:if(data.visible)addToHTML(data);break;case UI_BUTTON:if(data.visible){addToHTML(data);$("#btn"+data.id).on({touchstart:function(e){e.preventDefault();buttonclick(data.id,true);},touchend:function(e){e.preventDefault();buttonclick(data.id,false);},});} break;case UI_SWITCHER:if(data.visible){addToHTML(data);switcher(data.id,data.value);} break;case UI_CPAD:case UI_PAD:if(data.visible){addToHTML(data);$("#pf"+data.id).on({touchstart:function(e){e.preventDefault();padclick(UP,data.id,true);},touchend:function(e){e.preventDefault();padclick(UP,data.id,false);},});$("#pl"+data.id).on({touchstart:function(e){e.preventDefault();padclick(LEFT,data.id,true);},touchend:function(e){e.preventDefault();padclick(LEFT,data.id,false);},});$("#pr"+data.id).on({touchstart:function(e){e.preventDefault();padclick(RIGHT,data.id,true);},touchend:function(e){e.preventDefault();padclick(RIGHT,data.id,false);},});$("#pb"+data.id).on({touchstart:function(e){e.preventDefault();padclick(DOWN,data.id,true);},touchend:function(e){e.preventDefault();padclick(DOWN,data.id,false);},});$("#pc"+data.id).on({touchstart:function(e){e.preventDefault();padclick(CENTER,data.id,true);},touchend:function(e){e.preventDefault();padclick(CENTER,data.id,false);},});} break;case UI_SLIDER:if(data.visible){addToHTML(data);rangeSlider(!sliderContinuous);} break;case UI_TAB:if(data.visible){$("#tabsnav").append("
  • "+data.value+"
  • ");$("#tabscontent").append("
    ");tabs=$(".tabscontent").tabbedContent({loop:true}).data("api");$("a").filter(function(){return $(this).attr("href")==="#click-to-switch";}).on("click",function(e){var tab=prompt("Tab to switch to (number or id)?");if(!tabs.switchTab(tab)){alert("That tab does not exist :\\");} e.preventDefault();});} break;case UI_OPTION:if(data.parentControl){var parent=$("#select"+data.parentControl);parent.append("");} break;case UI_MIN:if(data.parentControl){if($('#sl'+data.parentControl).length){$('#sl'+data.parentControl).attr("min",data.value);}else if($('#num'+data.parentControl).length){$('#num'+data.parentControl).attr("min",data.value);}} break;case UI_MAX:if(data.parentControl){if($('#sl'+data.parentControl).length){$('#sl'+data.parentControl).attr("max",data.value);}else if($('#text'+data.parentControl).length){$('#text'+data.parentControl).attr("maxlength",data.value);}else if($('#num'+data.parentControl).length){$('#num'+data.parentControl).attr("max",data.value);}} break;case UI_STEP:if(data.parentControl){if($('#sl'+data.parentControl).length){$('#sl'+data.parentControl).attr("step",data.value);}else if($('#num'+data.parentControl).length){$('#num'+data.parentControl).attr("step",data.value);}} break;case UI_GRAPH:if(data.visible){addToHTML(data);graphData[data.id]=restoreGraphData(data.id);renderGraphSvg(graphData[data.id],"graph"+data.id);} break;case ADD_GRAPH_POINT:var ts=new Date().getTime();graphData[data.id].push({x:ts,y:data.value});saveGraphData();renderGraphSvg(graphData[data.id],"graph"+data.id);break;case CLEAR_GRAPH:graphData[data.id]=[];saveGraphData();renderGraphSvg(graphData[data.id],"graph"+data.id);break;case UI_ACCEL:if(hasAccel)break;hasAccel=true;if(data.visible){addToHTML(data);requestOrientationPermission();} break;case UPDATE_LABEL:$("#l"+data.id).html(data.value);if(data.hasOwnProperty('elementStyle')){$("#l"+data.id).attr("style",data.elementStyle);} break;case UPDATE_SWITCHER:switcher(data.id,data.value=="0"?0:1);if(data.hasOwnProperty('elementStyle')){$("#sl"+data.id).attr("style",data.elementStyle);} break;case UPDATE_SLIDER:$("#sl"+data.id).attr("value",data.value) slider_move($("#sl"+data.id).parent().parent(),data.value,"100",false);if(data.hasOwnProperty('elementStyle')){$("#sl"+data.id).attr("style",data.elementStyle);} break;case UPDATE_NUMBER:$("#num"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#num"+data.id).attr("style",data.elementStyle);} break;case UPDATE_TEXT_INPUT:$("#text"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#text"+data.id).attr("style",data.elementStyle);} if(data.hasOwnProperty('inputType')){$("#text"+data.id).attr("type",data.inputType);} break;case UPDATE_SELECT:$("#select"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#select"+data.id).attr("style",data.elementStyle);} break;case UPDATE_BUTTON:$("#btn"+data.id).val(data.value);$("#btn"+data.id).text(data.value);if(data.hasOwnProperty('elementStyle')){$("#btn"+data.id).attr("style",data.elementStyle);} break;case UPDATE_PAD:case UPDATE_CPAD:break;case UPDATE_GAUGE:$("#gauge"+data.id).val(data.value);if(data.hasOwnProperty('elementStyle')){$("#gauge"+data.id).attr("style",data.elementStyle);} break;case UPDATE_ACCEL:break;case UPDATE_TIME:var rv=new Date().toISOString();websock.send("time:"+rv+":"+data.id);break;case UI_FRAGMENT:let FragmentLen=data.length;let FragementOffset=data.offset;let NextFragmentOffset=FragementOffset+FragmentLen;let Total=data.total;let Arrived=(FragmentLen+FragementOffset);let FragmentFinal=Total===Arrived;if(!data.hasOwnProperty('control')) {console.error("UI_FRAGMENT:Missing control record, skipping control");break;} let control=data.control;StopFragmentAssemblyTimer(data.control.id);if(0===FragementOffset) {controlAssemblyArray[control.id]=data;controlAssemblyArray[control.id].offset=NextFragmentOffset;StartFragmentAssemblyTimer(control.id);let TotalRequest=JSON.stringify({'id':control.id,'offset':NextFragmentOffset});websock.send("uifragmentok:"+0+": "+TotalRequest+":");break;} if("undefined"===typeof controlAssemblyArray[control.id]) {console.error("Missing first fragment for control: "+control.id);StartFragmentAssemblyTimer(control.id);let TotalRequest=JSON.stringify({'id':control.id,'offset':0});websock.send("uifragmentok:"+0+": "+TotalRequest+":");break;} if(FragementOffset!==controlAssemblyArray[control.id].offset) {console.error("Wrong next fragment. Expected: "+controlAssemblyArray[control.id].offset+" Got: "+FragementOffset);StartFragmentAssemblyTimer(control.id);let TotalRequest=JSON.stringify({'id':control.id,'offset':controlAssemblyArray[control.id].length+controlAssemblyArray[control.id].offset});websock.send("uifragmentok:"+0+": "+TotalRequest+":");break;} controlAssemblyArray[control.id].control.value+=control.value;controlAssemblyArray[control.id].offset=NextFragmentOffset;if(true===FragmentFinal) {var fauxEvent={data:JSON.stringify(controlAssemblyArray[control.id].control),};handleEvent(fauxEvent);controlAssemblyArray[control.id]=null;} else {StartFragmentAssemblyTimer(control.id);let TotalRequest=JSON.stringify({'id':control.id,'offset':NextFragmentOffset});websock.send("uifragmentok:"+0+": "+TotalRequest+":");} break;default:console.error("Unknown type or event");break;} if(data.type>=UI_TITEL&&data.type=UPDATE_OFFSET&&data.type0){var parent=data.hasOwnProperty('parentControl')?$("#tab"+data.parentControl):$("#row");var html="";switch(data.type){case UI_LABEL:case UI_BUTTON:case UI_SWITCHER:case UI_CPAD:case UI_PAD:case UI_SLIDER:case UI_NUMBER:case UI_TEXT_INPUT:case UI_SELECT:case UI_GRAPH:case UI_GAUGE:case UI_ACCEL:html="
    "+data.label+"

    "+ elementHTML(data)+ "
    ";break;case UI_SEPARATOR:html="
    "+ "
    "+data.label+"

    ";break;case UI_TIME:break;} parent.append(html);}else{var parent=$("#id"+data.parentControl);parent.append(elementHTML(data));}} var elementHTML=function(data){var id=data.id var elementStyle=data.hasOwnProperty('elementStyle')?" style='"+data.elementStyle+"' ":"";var inputType=data.hasOwnProperty('inputType')?" type='"+data.inputType+"' ":"";switch(data.type){case UI_LABEL:return""+data.value+"";case UI_BUTTON:return"";case UI_SWITCHER:return"";case UI_CPAD:case UI_PAD:return"";case UI_SLIDER:return"
    "+ ""+ data.value+"
    ";case UI_NUMBER:return"";case UI_TEXT_INPUT:return"";case UI_SELECT:return"";case UI_ACCEL:return"ACCEL // Not implemented fully!
    ";default:return"";}}
    var processEnabled=function(data){switch(data.type){case UI_SWITCHER:case UPDATE_SWITCHER:if(data.enabled){$("#sl"+data.id).removeClass('disabled');$("#s"+data.id).prop("disabled",false);}else{$("#sl"+data.id).addClass('disabled');$("#s"+data.id).prop("disabled",true);}
    break;case UI_SLIDER:case UPDATE_SLIDER:$("#sl"+data.id).prop("disabled",!data.enabled);break;case UI_NUMBER:case UPDATE_NUMBER:$("#num"+data.id).prop("disabled",!data.enabled);break;case UI_TEXT_INPUT:case UPDATE_TEXT_INPUT:$("#text"+data.id).prop("disabled",!data.enabled);break;case UI_SELECT:case UPDATE_SELECT:$("#select"+data.id).prop("disabled",!data.enabled);break;case UI_BUTTON:case UPDATE_BUTTON:$("#btn"+data.id).prop("disabled",!data.enabled);break;case UI_PAD:case UI_CPAD:case UPDATE_PAD:case UPDATE_CPAD:if(data.enabled){$("#id"+data.id+" nav").removeClass('disabled');}else{$("#id"+data.id+" nav").addClass('disabled');}
    break;}}
    )=====";
    
    const uint8_t JS_CONTROLS_GZIP[5711] PROGMEM = { 31,139,8,0,19,56,151,101,2,255,213,60,107,115,219,56,146,223,253,43,104,102,206,34,207,138,44,37,147,153,140,100,58,165,200,74,162,91,191,206,86,54,83,151,201,185,40,10,178,121,161,72,46,73,249,177,30,253,247,109,52,30,4,248,144,100,123,114,87,87,53,53,145,26,141,70,163,31,64,119,163,101,47,10,211,204,248,60,186,28,157,140,198,163,254,209,229,199,207,35,231,85,187,221,243,196,192,249,240,232,180,127,8,176,142,128,157,29,246,199,195,203,211,15,31,46,134,99,167,163,226,14,127,31,15,79,14,25,141,142,128,247,143,134,231,227,75,128,252,172,67,190,0,164,163,65,134,0,121,165,65,46,0,242,58,167,63,30,141,135,71,142,178,224,25,112,86,224,11,65,57,179,163,203,1,133,188,210,145,6,12,235,85,142,245,254,243,120,124,122,226,188,214,241,56,180,211,86,152,56,234,191,7,38,126,214,17,25,176,211,254,57,199,187,248,50,26,15,62,13,207,157,55,58,170,132,119,218,111,20,236,163,209,33,192,126,41,224,50,104,167,253,75,142,121,242,249,248,61,192,126,213,49,57,180,211,254,85,17,23,232,3,20,123,246,121,236,188,213,177,149,145,78,251,109,62,227,227,121,255,236,147,243,155,208,193,225,33,131,92,158,157,142,78,40,42,31,24,28,13,251,231,28,185,211,254,77,89,177,255,222,233,20,20,194,96,138,66,46,134,71,195,1,80,43,232,68,128,59,138,86,78,207,198,35,42,255,130,90,4,184,163,168,229,120,4,128,130,86,16,214,81,116,114,220,255,221,233,20,244,129,176,142,170,138,241,240,204,233,20,53,129,192,142,162,135,143,253,207,31,135,78,167,160,7,14,237,40,106,232,15,6,212,54,10,42,224,208,206,91,85,48,103,253,243,254,248,20,212,248,91,81,54,114,164,163,138,123,116,12,62,211,46,200,155,2,59,175,20,47,249,112,222,255,120,60,4,5,190,202,85,35,189,232,240,244,203,137,244,161,163,225,135,177,244,149,243,209,199,79,99,233,17,3,32,0,6,38,132,57,184,28,127,62,255,207,207,167,163,139,161,36,53,184,28,30,15,207,251,71,185,79,14,46,207,134,48,235,124,244,119,152,250,74,2,191,12,199,253,139,179,79,253,35,133,252,229,197,231,147,15,71,167,95,180,53,6,253,243,243,211,177,244,160,193,101,255,104,244,95,253,115,80,235,47,18,116,216,63,255,155,244,134,193,229,201,233,9,200,228,205,155,222,141,155,24,0,204,146,40,232,167,41,153,79,130,251,126,146,184,247,78,72,110,141,211,201,255,16,47,179,108,196,250,144,184,87,115,18,102,2,109,236,207,73,2,187,162,99,87,137,27,95,31,186,153,139,211,144,0,159,117,237,166,125,207,35,129,51,115,131,148,32,40,13,252,41,73,6,176,168,31,46,162,69,202,135,188,192,77,83,163,31,144,36,123,72,51,55,243,61,99,230,39,196,242,129,189,230,156,164,169,123,69,154,113,148,250,153,31,133,142,153,5,102,51,187,143,137,99,154,205,40,166,176,212,121,88,54,163,16,8,195,188,185,51,91,132,30,5,91,54,3,187,33,178,161,64,237,7,38,14,0,79,35,111,65,55,215,242,18,226,102,100,24,16,250,205,50,167,254,141,105,247,72,208,66,238,78,220,57,172,135,44,154,92,148,128,48,130,79,107,8,112,172,18,21,10,84,40,29,179,93,174,39,198,17,75,244,56,220,164,28,187,113,76,194,233,224,218,15,166,22,95,223,174,128,243,41,118,207,159,161,168,29,199,76,23,158,103,218,15,130,105,63,12,73,242,105,124,124,228,52,118,188,107,226,125,239,53,122,75,2,42,51,242,41,36,73,106,102,188,128,163,19,142,219,6,93,58,205,238,3,210,154,184,222,247,171,36,90,0,19,81,16,37,142,153,92,77,92,171,243,182,221,52,248,127,173,95,223,216,230,22,215,185,99,238,79,14,192,59,78,207,247,247,38,7,251,147,228,192,220,229,67,37,54,252,112,22,213,241,241,219,219,183,111,43,56,191,117,147,176,114,138,9,172,195,125,14,119,173,185,150,247,182,206,123,207,92,110,41,90,82,104,238,199,57,247,187,230,254,30,124,165,130,71,67,118,64,191,110,16,93,1,55,114,189,89,64,238,14,193,11,60,102,244,94,20,44,230,96,49,130,91,134,148,59,69,66,2,112,156,27,82,196,8,200,44,115,204,118,124,87,28,152,187,201,149,31,142,163,216,49,59,111,232,176,180,197,1,59,20,210,245,198,40,48,75,214,40,6,4,213,73,38,157,179,142,232,100,145,101,224,18,118,47,199,85,201,190,151,80,83,197,80,4,44,135,243,37,153,227,111,180,34,162,22,23,68,160,169,140,171,203,241,193,178,95,137,205,235,34,82,145,242,13,172,198,193,37,52,137,68,161,23,248,222,119,245,48,147,231,30,156,187,9,153,71,55,4,85,96,209,153,75,133,247,234,169,56,86,57,19,140,147,221,2,173,239,228,62,181,248,73,107,131,69,133,87,217,245,65,219,126,0,12,14,109,121,140,133,247,40,210,49,185,203,236,135,74,45,213,226,247,150,91,42,57,100,171,72,173,168,131,58,236,2,45,117,41,244,93,141,183,106,239,174,159,92,207,168,66,155,113,186,134,116,113,106,111,185,92,110,201,105,232,184,237,94,122,235,103,222,181,37,28,29,46,46,55,37,244,10,236,74,204,12,124,184,221,155,128,113,127,239,177,209,185,50,154,248,87,215,148,144,4,48,199,63,194,115,193,93,100,145,89,28,58,199,25,124,76,33,59,81,23,157,68,192,247,92,95,119,178,114,93,57,227,249,156,120,224,191,36,249,235,54,89,24,195,67,241,85,251,223,196,154,168,241,205,125,161,160,112,229,76,175,51,133,2,92,55,177,25,156,14,156,144,114,179,48,130,158,70,70,98,234,4,232,117,151,19,80,174,0,125,182,68,211,103,79,162,4,98,182,115,119,234,47,82,117,43,10,216,169,194,173,162,82,154,95,152,9,30,176,37,79,235,73,52,189,215,78,68,122,44,229,55,38,220,149,41,201,104,40,26,45,50,203,178,157,3,74,60,118,19,152,123,18,77,193,38,240,68,203,167,46,155,111,219,237,54,252,187,37,78,64,3,80,196,137,135,119,2,229,15,63,212,211,97,120,232,170,146,12,202,113,64,175,14,11,63,142,166,52,190,196,15,206,201,98,62,33,137,132,11,127,206,241,192,158,213,100,161,155,144,108,1,113,9,252,239,31,139,200,7,99,239,113,20,158,59,8,4,96,36,113,131,169,28,206,19,9,129,17,19,112,146,4,98,130,68,34,229,137,133,64,186,37,153,155,198,215,110,144,73,36,153,104,8,156,116,17,206,130,232,86,161,195,242,14,49,238,185,73,18,229,243,69,14,34,134,221,192,255,167,155,248,161,68,160,25,73,151,127,166,233,136,64,156,186,201,119,8,83,200,204,93,4,153,0,154,212,40,104,242,112,75,38,105,4,33,168,242,25,206,240,16,156,146,76,149,28,227,11,153,92,192,16,51,141,196,9,23,65,208,83,20,254,143,5,73,179,211,196,7,45,186,20,116,70,146,185,159,166,60,47,200,117,154,186,55,228,163,200,109,96,40,136,60,55,184,200,162,4,157,143,100,163,140,204,45,147,164,241,194,199,20,40,53,155,255,113,113,122,2,214,13,59,189,242,103,247,150,204,140,236,130,205,165,64,69,161,237,131,21,96,114,4,43,78,49,147,210,214,186,170,92,43,39,78,93,66,78,221,198,253,130,103,72,90,200,20,88,115,74,114,44,187,23,144,204,240,25,130,132,126,245,167,223,122,76,232,44,143,107,249,41,203,231,24,166,253,142,253,219,253,250,13,246,195,16,241,163,182,53,23,188,201,126,248,201,18,110,108,183,220,233,212,50,255,221,180,91,209,108,6,129,198,79,150,249,34,137,110,225,251,117,54,15,44,240,99,26,176,93,128,54,22,233,16,236,40,1,28,78,70,165,93,153,131,130,140,98,11,207,222,202,97,123,171,18,12,231,100,50,116,193,9,185,55,195,201,225,5,196,77,70,244,82,185,113,3,197,203,237,94,93,238,171,185,191,206,254,195,10,94,123,235,51,110,122,196,37,11,56,226,156,162,149,219,15,53,118,207,193,16,190,70,160,103,38,99,201,21,72,154,31,97,120,66,153,120,244,188,188,74,8,161,177,111,17,21,180,165,225,37,100,90,129,197,84,135,251,53,246,140,147,200,224,28,81,113,236,188,120,251,203,235,55,189,138,89,185,1,104,208,208,122,192,200,180,203,237,167,185,164,231,107,46,223,107,55,156,6,228,239,126,234,79,252,192,207,238,7,0,184,34,76,239,219,69,137,236,236,108,203,27,228,218,159,78,9,132,76,210,46,53,178,194,86,169,47,80,143,195,60,234,214,15,167,209,109,75,124,111,93,71,105,22,66,62,128,30,19,71,73,86,194,160,192,158,92,18,196,55,188,129,15,71,126,154,17,136,83,45,243,70,242,237,33,223,102,179,122,63,77,84,37,170,159,146,220,134,27,238,207,63,217,167,183,109,241,233,231,159,95,75,35,64,171,145,167,157,101,222,166,221,189,61,115,87,48,182,107,118,205,93,58,107,215,220,187,5,57,179,244,119,227,201,124,14,189,195,233,145,2,214,168,31,172,246,67,225,160,165,103,162,112,32,37,197,128,249,194,58,33,150,154,222,83,181,83,219,126,205,74,48,81,64,147,228,89,100,153,64,206,96,244,140,81,106,12,168,37,83,203,83,117,215,124,195,47,112,65,49,10,35,8,15,242,140,134,220,100,57,89,200,167,97,95,12,211,160,120,27,88,123,157,87,100,144,85,88,166,52,50,192,40,121,34,245,217,13,188,123,217,203,153,71,119,221,132,123,68,172,58,40,159,119,210,168,188,16,74,113,19,94,112,105,77,49,207,101,130,21,11,169,79,160,235,20,152,200,146,123,188,30,167,133,219,12,6,91,83,188,204,150,91,96,180,112,156,227,236,156,107,220,17,7,202,141,166,16,77,90,230,194,143,190,131,119,180,109,126,223,245,88,132,161,148,223,104,240,201,42,164,152,106,128,51,246,116,115,165,75,183,104,40,218,53,26,230,174,252,182,107,54,76,25,228,73,40,15,243,244,103,164,110,197,77,72,65,153,59,73,67,247,166,10,76,165,9,252,168,67,224,95,184,76,177,180,10,49,64,177,216,90,137,7,91,71,184,39,106,16,229,203,145,138,1,66,178,59,166,157,7,138,222,45,196,58,226,198,108,46,123,138,38,45,57,11,175,82,193,106,22,101,110,32,214,59,176,244,229,89,70,245,178,99,203,115,78,215,89,45,58,108,36,207,16,245,199,182,238,255,237,14,153,220,169,179,192,213,65,238,118,159,180,227,77,230,151,101,192,30,39,187,197,59,43,33,65,228,78,193,249,116,108,124,62,236,74,31,200,252,44,32,204,106,2,119,66,2,52,195,185,235,135,159,224,32,135,100,128,91,97,142,160,209,227,207,154,93,76,176,90,88,207,103,69,218,38,78,128,107,98,65,42,38,124,209,38,96,137,118,245,132,161,54,129,86,163,87,227,95,104,248,88,240,174,155,32,30,51,187,226,27,123,68,148,95,243,87,66,9,98,143,116,242,43,190,118,41,131,252,149,170,43,12,5,131,131,128,216,112,15,141,35,90,211,178,216,145,166,51,193,94,89,75,147,30,138,179,168,126,38,89,200,143,35,200,43,48,182,202,162,133,119,141,230,211,205,79,86,200,116,91,113,66,168,229,30,178,124,139,90,3,214,162,48,22,179,56,137,38,189,214,104,238,140,84,192,44,159,66,131,71,54,75,12,236,10,22,42,94,123,215,239,142,29,170,16,82,9,178,170,214,138,100,233,3,182,148,59,253,188,145,240,226,217,147,101,23,187,83,182,233,207,103,205,167,202,174,138,134,42,59,100,49,120,62,139,244,21,243,249,76,106,84,74,108,38,207,103,19,223,87,159,207,167,78,166,196,232,228,249,140,210,39,226,231,243,169,81,41,177,233,61,159,77,246,66,253,124,70,11,116,86,122,55,246,103,172,119,190,132,102,64,23,24,154,88,219,165,80,166,68,118,220,127,95,166,169,199,78,172,112,104,153,251,129,127,176,239,26,81,56,7,74,100,17,59,13,192,97,251,144,18,221,53,237,134,113,157,144,153,211,160,20,20,120,227,128,127,193,99,134,62,219,185,7,251,123,64,178,50,40,147,107,78,253,27,195,159,226,82,26,177,253,61,24,161,115,233,60,7,8,180,116,2,240,109,66,166,3,246,221,122,8,162,40,238,82,53,45,109,12,117,45,211,141,125,182,178,11,216,51,63,128,208,84,77,182,120,245,230,39,43,187,246,83,224,39,203,32,1,165,27,51,109,72,185,32,165,161,251,126,153,69,47,217,89,106,66,204,66,141,201,68,184,217,84,13,128,134,68,192,142,19,39,209,60,134,220,103,236,78,140,44,50,216,68,250,9,210,66,90,217,52,162,4,182,106,191,99,161,232,54,221,79,139,33,193,12,11,190,66,88,227,98,141,213,28,95,187,25,165,105,76,35,146,26,97,148,25,228,14,210,100,163,251,199,31,152,106,86,216,92,133,73,177,222,22,169,126,86,168,229,47,104,140,109,6,162,226,125,145,66,216,230,101,92,7,58,106,143,125,205,149,198,74,209,168,55,246,209,220,221,18,186,219,50,27,6,154,128,211,16,80,102,17,116,64,64,216,98,132,98,31,8,24,198,69,0,216,223,99,52,15,204,242,142,142,71,181,219,1,240,79,86,227,69,26,52,170,182,192,67,63,106,250,245,56,204,8,230,126,33,142,146,143,225,116,46,168,114,253,2,181,72,117,43,148,246,217,255,253,199,239,211,189,91,177,79,154,198,175,95,161,30,75,174,193,208,127,180,68,75,123,41,29,175,227,225,217,15,23,105,154,145,248,7,239,180,98,137,226,86,177,153,110,253,69,34,235,226,95,185,235,126,115,74,5,119,113,143,66,242,15,249,84,130,3,23,55,87,86,121,110,211,68,88,126,245,234,190,91,232,255,235,226,153,153,98,121,3,200,16,203,166,197,123,90,13,177,170,24,107,197,139,244,218,122,184,235,102,105,243,190,155,111,30,206,188,194,227,195,83,24,85,216,84,186,17,187,21,242,249,250,237,47,94,79,180,244,81,109,137,38,48,155,141,203,158,48,172,150,173,15,11,86,62,215,20,14,82,165,209,20,75,43,106,160,156,39,170,220,190,196,210,192,208,233,109,120,150,68,49,92,81,247,86,131,167,249,23,244,141,178,97,179,160,66,37,36,236,21,134,185,193,170,51,170,89,146,41,206,138,12,6,110,231,182,249,174,221,237,60,142,181,244,217,188,177,0,173,134,22,178,166,57,230,22,11,206,46,233,123,130,85,154,197,156,219,202,63,40,83,155,102,167,221,54,149,42,247,255,222,38,121,218,78,105,193,65,164,16,163,181,234,167,90,133,78,233,41,108,41,229,3,140,37,225,218,249,139,120,43,144,90,207,92,29,113,63,140,23,217,248,62,94,77,153,150,56,57,97,57,161,198,220,88,121,164,20,154,61,119,195,37,98,79,209,7,47,179,148,171,40,69,206,202,24,248,62,240,84,230,117,82,79,225,60,47,118,228,237,251,221,50,26,171,70,209,37,175,220,197,21,249,139,100,95,164,245,148,13,176,251,162,194,69,70,199,67,188,86,147,27,245,90,205,162,209,197,233,5,214,102,173,98,109,63,131,251,182,107,238,38,55,248,0,86,115,63,137,142,239,46,125,214,19,239,23,71,36,228,213,78,140,92,122,98,12,153,63,157,205,82,146,177,241,8,63,227,248,9,40,94,204,231,40,133,41,187,10,121,156,50,166,197,97,39,175,19,35,176,143,141,26,83,199,82,176,119,11,148,236,158,202,237,7,63,4,50,140,152,227,240,249,152,131,85,106,142,151,139,65,105,91,133,23,18,83,149,199,49,189,92,195,43,209,24,110,36,196,139,146,105,211,72,191,251,113,172,12,152,182,236,141,162,76,113,168,163,86,166,123,244,9,168,242,109,72,43,96,163,118,128,237,54,236,162,184,97,100,181,244,126,244,53,159,249,13,87,236,173,195,226,26,115,202,218,2,38,221,36,171,230,82,101,80,42,238,156,133,36,78,225,121,224,161,225,79,27,221,124,70,179,193,150,108,116,203,107,46,203,207,81,51,142,192,158,165,192,114,33,169,84,151,163,182,108,171,221,104,230,2,34,180,153,31,146,169,9,114,163,7,112,52,51,214,137,161,172,122,161,238,153,159,64,34,46,184,48,102,145,252,105,0,229,68,21,196,15,151,87,251,175,16,79,193,144,182,29,103,67,19,41,139,232,75,18,129,128,66,208,162,148,79,203,24,222,197,152,234,43,210,89,71,121,215,52,62,70,25,157,80,114,235,31,46,211,181,44,178,19,111,211,173,60,91,67,107,215,17,159,89,145,197,209,190,62,199,219,243,222,26,237,24,5,173,111,240,4,184,41,215,43,222,8,215,30,103,216,174,70,187,128,83,178,245,240,255,233,108,18,183,186,232,222,43,222,49,225,247,48,186,13,13,122,82,209,146,33,214,249,116,159,149,175,229,7,142,120,139,220,217,145,192,125,237,103,149,246,67,156,68,30,73,211,97,232,66,230,56,181,68,39,64,129,142,58,71,35,166,189,196,179,178,161,120,14,166,49,141,63,85,66,135,186,96,40,118,67,18,104,161,144,58,173,34,14,202,39,172,138,185,121,54,76,105,114,148,175,18,6,71,120,105,157,244,58,186,181,232,239,123,192,100,74,131,215,144,173,89,69,193,56,142,150,253,229,93,175,90,159,24,203,244,94,202,70,84,254,235,173,151,188,241,84,124,205,187,76,5,36,111,41,21,16,217,64,42,0,172,99,84,124,147,13,162,116,23,68,244,81,233,108,208,115,86,118,217,242,248,129,182,52,139,190,166,202,45,228,188,11,166,21,110,85,54,37,127,156,177,85,28,213,242,177,85,99,147,180,206,143,15,28,47,121,242,124,137,223,76,187,69,104,27,130,82,191,231,133,251,175,237,111,188,42,160,87,242,89,58,78,243,15,6,165,151,146,197,139,27,149,152,172,128,174,116,249,136,31,86,41,199,147,218,201,184,226,192,25,77,109,122,32,213,69,116,35,230,39,219,143,233,195,212,251,128,42,81,190,142,224,76,172,236,44,187,68,134,244,72,104,123,117,36,4,83,190,177,57,244,148,173,139,9,56,214,163,14,213,50,133,214,198,215,48,98,63,243,94,93,46,151,205,78,187,221,110,142,166,182,174,207,21,250,66,73,84,43,108,103,167,90,172,181,58,178,119,118,234,199,182,244,238,218,122,68,149,117,230,42,172,101,146,63,53,177,99,26,72,56,162,42,196,225,152,190,22,101,151,6,232,4,32,54,248,23,115,65,142,221,123,180,63,234,213,176,162,147,242,87,42,201,57,91,102,5,231,88,57,90,197,122,88,199,185,178,10,173,56,172,88,131,213,105,86,45,146,109,178,136,120,42,173,92,130,62,110,174,92,193,157,108,176,6,43,221,172,82,52,175,237,172,84,246,6,11,169,157,41,108,184,233,167,83,8,74,240,158,229,31,117,178,19,10,83,168,225,187,71,1,101,17,87,47,39,159,203,169,239,52,203,11,138,171,154,141,64,118,192,123,254,220,148,95,94,83,63,197,123,4,142,241,7,217,166,200,59,11,149,166,66,246,26,223,173,219,66,236,173,223,67,236,105,155,208,202,48,245,132,103,27,16,158,213,17,166,205,14,245,164,55,144,123,60,169,35,77,251,82,234,73,7,27,144,14,234,72,99,43,73,61,237,100,3,218,73,5,109,173,43,93,188,17,112,139,161,191,135,39,104,48,41,235,156,102,63,240,160,71,119,241,20,204,77,7,127,171,205,44,167,224,39,174,71,127,36,172,31,134,26,17,165,35,90,16,209,59,199,5,37,200,155,214,209,210,127,118,144,147,147,239,135,124,75,157,188,206,191,138,141,34,14,132,91,113,62,46,250,89,10,180,219,101,218,53,108,173,33,47,218,92,88,171,176,210,176,146,247,43,251,233,161,159,122,224,171,188,127,2,145,156,218,235,70,249,147,8,222,68,253,89,174,118,247,233,119,16,156,24,116,3,113,224,122,196,218,251,239,63,14,119,247,174,154,38,70,122,172,137,6,155,131,176,10,223,173,184,200,212,136,145,66,248,13,182,92,242,22,156,218,27,176,102,98,15,15,50,149,65,207,13,2,250,115,198,11,2,233,221,182,99,82,173,152,204,94,85,241,136,73,57,183,66,16,75,97,111,42,10,147,133,134,179,85,191,110,147,175,218,91,46,69,127,185,124,89,204,229,140,225,249,67,158,147,57,107,147,188,119,166,129,233,156,211,144,29,37,98,112,151,246,129,116,77,179,135,160,91,96,179,154,28,29,161,132,232,191,136,95,91,176,213,30,202,27,246,159,127,202,59,183,254,177,157,254,16,85,233,128,217,132,238,187,85,100,243,22,117,214,164,15,218,167,157,240,245,237,237,122,187,44,127,80,41,181,122,214,54,105,22,218,198,158,222,118,139,111,221,213,77,184,236,169,129,109,69,54,106,41,57,51,106,114,87,213,172,129,127,21,192,105,100,183,145,193,254,12,67,42,48,168,26,41,130,155,76,141,140,253,84,128,182,3,85,167,136,216,1,118,253,70,180,148,177,214,32,115,127,15,64,251,215,201,30,237,25,226,201,102,254,4,142,173,67,216,52,86,120,193,200,123,137,159,178,149,148,253,86,11,73,138,61,209,94,55,88,109,5,131,213,156,224,27,141,168,227,232,77,85,148,53,225,206,133,206,44,201,230,202,174,172,146,60,228,1,172,140,20,93,154,14,131,36,184,16,84,236,21,126,174,191,108,149,60,93,29,150,190,142,11,137,7,79,103,221,3,42,208,196,226,139,32,41,135,36,189,117,126,197,127,17,187,159,130,74,81,215,112,91,9,45,107,12,110,73,69,163,14,13,252,255,203,219,196,141,203,13,141,148,216,129,89,236,53,23,75,177,160,25,23,195,103,202,186,229,120,127,37,13,128,0,83,137,180,217,148,166,129,183,51,109,158,51,213,94,204,42,76,118,209,54,14,244,70,59,224,148,33,43,188,202,3,69,112,203,118,75,153,77,215,139,134,183,50,138,31,88,136,54,140,142,249,78,94,250,160,20,240,192,154,50,29,252,227,195,173,131,138,165,95,94,138,208,205,224,243,76,238,81,212,51,249,154,126,200,97,168,124,110,15,184,218,36,186,107,48,206,5,227,81,56,192,191,215,209,144,33,33,151,16,70,128,216,118,184,134,115,83,184,236,254,30,74,70,17,93,233,232,21,34,132,44,68,48,43,158,12,15,246,23,1,227,90,235,165,101,186,86,123,214,13,93,217,148,67,83,81,118,37,42,215,54,110,157,182,223,179,70,217,157,23,191,253,242,166,221,203,219,109,215,173,206,154,188,55,101,160,128,173,241,144,60,153,7,108,136,223,148,5,29,89,227,32,120,50,7,216,66,190,41,7,58,178,198,193,100,37,7,123,204,28,180,122,50,179,168,119,38,176,150,91,15,253,203,41,141,26,86,121,19,249,134,188,114,236,106,110,61,193,237,233,223,40,163,194,251,246,247,192,150,213,211,130,5,21,194,208,21,175,84,163,243,220,173,54,112,120,62,67,119,119,230,218,250,33,196,28,29,215,105,24,115,31,4,209,134,127,221,59,167,209,105,183,149,214,98,245,192,67,105,232,247,78,21,195,60,157,0,47,197,107,161,18,3,41,86,156,168,120,246,139,91,189,16,109,9,57,177,237,240,219,16,3,153,238,4,178,143,239,61,163,230,106,164,59,199,18,23,239,155,102,123,103,89,85,237,86,225,18,192,16,95,32,242,228,135,201,15,20,189,167,48,168,196,127,58,147,128,157,223,169,143,228,152,21,204,138,173,222,117,76,42,213,183,74,22,121,60,42,47,108,44,97,61,86,136,162,240,197,153,202,87,215,74,102,149,235,179,0,88,44,63,243,175,22,9,65,154,188,109,147,255,28,1,6,60,151,247,165,23,98,62,101,8,191,0,1,149,62,134,212,156,254,151,209,209,145,241,126,104,244,13,4,27,245,38,195,246,197,27,134,126,148,121,176,0,159,243,134,95,140,61,250,55,10,192,39,231,49,19,51,153,26,51,184,68,239,183,213,83,192,165,141,169,36,137,230,244,137,136,113,138,32,201,233,129,138,61,129,124,83,202,145,93,178,49,200,184,138,86,180,200,64,30,57,114,140,162,172,251,51,39,250,35,82,49,182,173,15,17,11,217,85,161,245,84,60,255,17,70,182,162,177,82,173,138,52,68,237,177,193,203,34,106,143,39,150,69,100,113,82,214,69,120,206,94,108,215,20,117,156,199,144,228,149,156,234,223,18,109,210,189,90,36,184,173,237,189,144,191,104,217,229,154,134,209,71,17,46,229,169,155,180,125,62,106,5,45,237,93,223,97,249,40,218,90,242,190,166,65,242,81,132,213,200,115,80,236,92,172,236,100,172,52,94,45,207,229,197,243,58,27,206,141,179,106,86,165,141,10,235,91,46,255,5,73,64,121,145,3,90,0,0 };