var app=(()=>{var t={};t.config={sessionToken:!1};t.helpers={};t.helpers.objEquals=(e,o,{title:n,debug:s})=>{let r=JSON.stringify(e),c=JSON.stringify(o),l=r===c;return s&&(console.log(`${n}s are ${l?"equal":"not equal"}`),console.log("obj1:",r),console.log("obj2:",c)),l};t.helpers.evtCounters={};t.helpers.evtCounterInc=(e,o=t.helpers.evtCounters)=>{let n=o[e.type];n||(o[e.type]=n=0),o[e.type]=++n};t.helpers.leafletClsnameFrom=e=>{let o=[[L.Marker,"marker"],[L.CircleMarker,"circlemarker"],[L.Circle,"circle"],[L.Polyline,"polyline"],[L.Polygon,"polygon"],[L.Rectangle,"rectangle"],[L.GeoJSON,"geojson"],[L.LayerGroup,"layergroup"],[L.FeatureGroup,"featuregroup"]];if(!e)return null;for(let[n,s]of o)if(e instanceof n)return s;return null};t.helpers.layerMapFrom=e=>{let o={};return e&&e?.eachLayer(n=>{let s=t.helpers.leafletClsnameFrom(n);if(s=typeof s=="string"&&s.trim().length>0?s.trim():"unknown",!s)return;let r=o[s];r||(o[s]=r=0),o[s]=++r}),o};t.helpers.coordsNormalize=e=>{if(e=e instanceof Array&&e.length>0?e:!1,!e)return;let o=e.length-1;for(;o>=0;){let n=e[o];t.helpers.coordsNormalize(n),n instanceof Array&&n.length===0&&e.splice(o,1),o--}};t.helpers.geojsnFeaturesFrom=(e,o)=>{let n=[];return e&&e?.eachLayer(s=>{try{let r=t.helpers.leafletClsnameFrom(s);if(r=typeof r=="string"&&r.trim().length>0?r.trim():!1,!(r&&o.indexOf(r)>-1))return;let c=s.toGeoJSON(5),l=JSON.stringify(c?.geometry?.coordinates),d=JSON.parse(l);t.helpers.coordsNormalize(d);let a=JSON.stringify(d);if(l!==a&&(c.geometry.coordinates=d),!(d?.length>0))return;n.push(c)}catch(r){console.log("geojsnFeaturesFrom error:",r)}}),n};t.helpers.isPoint=e=>e instanceof Array&&e?.length===2&&typeof e[0]=="number"&&typeof e[1]=="number";t.helpers.isPointWrapper=e=>{if(!(e instanceof Array&&e?.length>0))return!1;for(let o of e)if(!(o instanceof Array&&o?.length>0))return!1;return!0};t.helpers._latlngFromCoords=e=>{if(t.helpers.isPoint(e)){let o=e[0];e[0]=e[1],e[1]=o}else if(t.helpers.isPointWrapper(e))for(let o of e)t.helpers._latlngFromCoords(o);else throw new Error("Invalid coords")};t.helpers.latlngFromCoords=e=>{let o=JSON.parse(JSON.stringify(e));return t.helpers._latlngFromCoords(o),o};t.helpers.featureType2LayerType={Point:"marker",LineString:"polygon",Polygon:"polygon"};t.helpers.layersFromGeojsn=e=>{let o=e?.type==="FeatureCollection"?e.type:!1,n=e.features instanceof Array?e.features:!1;if(!(o&&n.length>=0))throw new Error("Required fields are missing");let s=[];for(let r of n)try{let c=r?.type==="Feature"?r.type:!1,l=typeof r?.geometry=="object"?r.geometry:!1,d=typeof r?.geometry?.type=="string"&&["Point","LineString","Polygon"].indexOf(r.geometry.type)>-1?r.geometry.type:!1,a=typeof r?.geometry?.coordinates=="object"&&r.geometry.coordinates?.length>0?r.geometry.coordinates:!1;if(!(c&&l&&d&&a))throw new Error("Required fields are missing");let i={type:t.helpers.featureType2LayerType[d],props:r?.properties,latlngs:d!=="LineString"?t.helpers.latlngFromCoords(a):[t.helpers.latlngFromCoords(a)]};s.push(i)}catch(c){console.log("layersFromGeojsn error:",c)}return s};t.city2geoloc={Stuttgart:[9.1829,48.7758],M\u00FCnchen:[11.582,48.1351],Berlin:[13.405,52.52],Potsdam:[13.0645,52.3906],Bremen:[8.8017,53.0793],Hamburg:[9.9872,53.5488],Wiesbaden:[8.2398,50.0782],Schwerin:[11.4003,53.6353],Hannover:[9.732,52.3759],D\u00FCsseldorf:[6.7825,51.223],Mainz:[8.2473,49.9929],Saarbr\u00FCcken:[6.9975,49.2382],Dresden:[13.7373,51.0504],Magdeburg:[11.6081,52.1132],Kiel:[10.1228,54.3233],Erfurt:[11.0299,50.9848]};t.randomCity=()=>{let e=Object.keys(t.city2geoloc);return e[Math.floor(Math.random()*e.length)]};t.bodyClassLoggedinToggle=e=>{let o=document.querySelector("body");e?o.classList.add("loggedIn"):o.classList.remove("loggedIn")};t.localstorageRead=e=>{let o=localStorage.getItem(e);try{return JSON.parse(o)}catch{return o}};t.localstorageWrite=(e,o)=>{try{let n=JSON.stringify(o);return localStorage.setItem(e,n),!0}catch{return localStorage.setItem(e,""),!1}};t.tokenGet=()=>{let e=t.localstorageRead("token");typeof e=="object"?(t.config.sessionToken=e,t.bodyClassLoggedinToggle(!0)):(t.config.sessionToken=!1,t.bodyClassLoggedinToggle(!1))};t.tokenSet=e=>{t.localstorageWrite("token",e),typeof e=="object"?(t.config.sessionToken=e,t.bodyClassLoggedinToggle(!0)):(t.config.sessionToken=!1,t.bodyClassLoggedinToggle(!1))};t.windowurlGet=()=>{let e=new URL(window.location.href),o={path:e.pathname,hash:e.hash,searchParams:{}};for(let[n,s]of e.searchParams.entries())o.searchParams[n]=s;return o};t.windowurlSet=({path:e,searchParams:o,hash:n}={})=>{let s=new URL(window.location.href);e=typeof e=="string"&&e.trim().length>0?e.trim():!1,n=typeof n=="string"&&n.trim().length>0?n.trim():!1,o=typeof o=="object"?o:{},e&&(s.pathname=e),n&&(s.hash=n),Object.entries(o).forEach(([r,c])=>{c?s.searchParams.set(r,c):s.searchParams.delete(r)}),window.location.href=s.toString()};t.httpclient={};t.httpclient.apicall=async({headers:e,path:o,method:n,queryStringObject:s,payload:r})=>{e=typeof e=="object"&&e!==null?e:{},o=typeof o=="string"?o:"/",n=typeof n=="string"&&["POST","GET","PUT","PATCH","DELETE"].indexOf(n.toUpperCase())>-1?n.toUpperCase():"GET",s=typeof s=="object"&&s!==null?s:{},r=typeof r=="object"&&r!==null?r:{};let c=o,l={method:n,headers:{"Content-type":"application/json; charset=UTF-8"},body:["GET","DELETE"].indexOf(n)>-1?void 0:JSON.stringify(r)},d=[];for(let a in s)s.hasOwnProperty(a)&&d.push(`${a}=${s[a]}`);d.length>0&&(c+="?"+d.join("&")),typeof s?.tokenId=="string"?l.headers.tokenid=s?.tokenId:t.config.sessionToken&&(l.headers.tokenid=t.config.sessionToken?.tokenId);for(let a in e)e.hasOwnProperty(a)&&(l.headers[a]=e[a]);return await fetch(c,l)};t.logout=e=>{(async()=>{await t.httpclient.apicall({path:"api/tokens",method:"DELETE",queryStringObject:{tokenId:t.config.sessionToken?.tokenId}}),t.tokenSet(!1),typeof e=="string"&&(window.location=e)})().catch(o=>{t.tokenSet(!1),typeof e=="string"&&(window.location=e)})};t.logoutButtonBind=()=>{document.getElementById("logoutButton")?.addEventListener("click",e=>{e.preventDefault(),t.logout("/session/deleted")})};t.forms={};t.forms.submitButtonBind=()=>{let e=document.querySelectorAll("form");if(e=typeof e=="object"&&e?.length>0?e:!1,!!e)for(let o=0;o{s.preventDefault();let r=s.target,c=r?.id;document.querySelector("#"+c+" .formError")&&(document.querySelector("#"+c+" .formError").style.display="none"),document.querySelector("#"+c+" .formSuccess")&&(document.querySelector("#"+c+" .formSuccess").style.display="none");let l={path:r?.action,method:r?.method?.toUpperCase(),payload:{},queryStringObject:{}},d=r?.elements;for(let a=0;a{let a=await t.httpclient.apicall(l),i=await a.json();if(a.ok)await t.forms.submitSuccessProcessor(c,i);else{let p=typeof i?.message=="string"?i?.message:a.statusText;document.querySelector("#"+c+" .formError").innerHTML=p,document.querySelector("#"+c+" .formError").style.display="block",a.status===403&&t.logout()}})().catch(a=>{let i=`${a.name}: ${a.message}`;document.querySelector("#"+c+" .formError").innerHTML=i,document.querySelector("#"+c+" .formError").style.display="block"})})};t.forms.accountCreateSuccess=async(e,o)=>{t.windowurlSet({path:"/account/created",searchParams:{accountCreateSuccessMessage:o?.message}})};t.forms.accountCreate2Success=async(e,o)=>{t.tokenSet(o?.data?.token),window.location="/maps/all"};t.forms.sessionCreateSuccess=async(e,o)=>{t.tokenSet(o?.data),window.location="/maps/all"};t.forms.accountPwdresetSuccess=async(e,o)=>{t.windowurlSet({path:"/account/pwdreseted",searchParams:{}})};t.forms.accountPwdreset2Success=async(e,o)=>{t.tokenSet(o?.data?.token),window.location="/maps/all"};t.forms.accountEdit1Success=async(e,o)=>{document.querySelector("#"+e+" .formSuccess").innerHTML=o?.message,document.querySelector("#"+e+" .formSuccess").style.display="block"};t.forms.accountEdit2Success=async(e,o)=>{document.querySelector("#"+e+" .formSuccess").innerHTML=o?.message,document.querySelector("#"+e+" .formSuccess").style.display="block"};t.forms.accountEdit3Success=async(e,o)=>{t.logout("/account/deleted")};t.forms.mapCreateSuccess=async(e,o)=>{window.location="/maps/all"};t.forms.submitSuccessHandlers={accountCreate:t.forms.accountCreateSuccess,accountCreate2:t.forms.accountCreate2Success,sessionCreate:t.forms.sessionCreateSuccess,accountPwdreset:t.forms.accountPwdresetSuccess,accountPwdreset2:t.forms.accountPwdreset2Success,accountEdit1:t.forms.accountEdit1Success,accountEdit2:t.forms.accountEdit2Success,accountEdit3:t.forms.accountEdit3Success,mapCreate:t.forms.mapCreateSuccess};t.forms.submitSuccessProcessor=async(e,o)=>{let n=t.forms.submitSuccessHandlers[e];typeof n=="function"&&await n(e,o)};t.accountCreatedPageHydrate=async()=>{console.log("accountCreatedPageHydrate/url:",t.windowurlGet())};t.accountPwdreset2PageHydrate=async()=>{try{let e=t.windowurlGet(),o=typeof e.searchParams?.tokenId=="string"&&e.searchParams?.tokenId?.length===20?e.searchParams?.tokenId.trim():!1;if(!o)throw new Error("Missing required fields");let n=await t.httpclient.apicall({path:"api/tokens",method:"GET",queryStringObject:{tokenId:o}});if(!n.ok)throw new Error(n?.error?.message||"Invalid token");let r=(await n.json())?.data;if(typeof r!="object")throw new Error("Failed to retrieve token data");if(r?.type!=="pwdreset")throw new Error(`Token type is invalid: expected 'pwdreset', got ${r?.type}`);document.querySelector("#accountPwdreset2 .hiddenUserIdInput").value=r.userId,document.querySelector("#accountPwdreset2 .displayUserIdInput").value=r.userId}catch(e){document.querySelector("#accountPwdreset2 .formError").innerHTML=e.message,document.querySelector("#accountPwdreset2 .formError").style.display="block"}};t.accountEmailnewPageHydrate=async()=>{try{let e=t.windowurlGet(),o=typeof e.searchParams?.tokenId=="string"&&e.searchParams?.tokenId?.length===20?e.searchParams?.tokenId.trim():!1;if(!o)throw new Error("Missing required fields");let n=await t.httpclient.apicall({path:"api/tokens",method:"GET",queryStringObject:{tokenId:o}});if(!n.ok)throw new Error(n?.error?.message||"Invalid token");let r=(await n.json())?.data;if(typeof r!="object")throw new Error("Failed to retrieve token data");if(r?.type!=="emailnew")throw new Error(`Token type is invalid: expected 'usernew', got ${r?.type}`);let c=await t.httpclient.apicall({path:"api/users",method:"PUT",payload:{userId:r.userId,email:"does.not@exists.com"},queryStringObject:{tokenId:r.tokenId}});if(!c.ok)throw new Error(n?.error?.message||"Email update failed");let d=(await c.json())?.data;t.tokenSet(d?.token),document.querySelector(" .blurb").innerHTML=`Email change verified and completed. From now on, your active Yomap email is ${d.email}`}catch(e){document.querySelector(" .blurb").innerHTML=`${e?.message||"Email update failed"}`}};t.accountCreate2PageHydrate=async()=>{try{let e=t.windowurlGet(),o=typeof e.searchParams?.tokenId=="string"&&e.searchParams?.tokenId?.length===20?e.searchParams?.tokenId.trim():!1;if(!o)throw new Error("Missing required fields");let n=await t.httpclient.apicall({path:"api/tokens",method:"GET",queryStringObject:{tokenId:o}});if(!n.ok)throw new Error(n?.error?.message||"Invalid token");let r=(await n.json())?.data;if(typeof r!="object")throw new Error("Failed to retrieve token data");if(r?.type!=="usernew")throw new Error(`Token type is invalid: expected 'usernew', got ${r?.type}`);document.querySelector("#accountCreate2 .hiddenUserIdInput").value=r.userId,document.querySelector("#accountCreate2 .hiddenTokenIdInput").value=r.tokenId,document.querySelector("#accountCreate2 .displayUserIdInput").value=r.userId}catch(e){document.querySelector("#accountCreate2 .formError").innerHTML=e?.message,document.querySelector("#accountCreate2 .formError").style.display="block"}};t.accountEditPageHydrate=async()=>{let e=typeof t.config.sessionToken?.userId=="string"?t.config.sessionToken.userId:!1;if(!e){t.logout();return}let o=await t.httpclient.apicall({path:"api/users",method:"GET",queryStringObject:{userId:e}});if(!o.ok){t.logout();return}let s=(await o.json()).data;document.querySelector("#accountEdit1 .displayUserIdInput").value=s.userId,document.querySelector("#accountEdit1 .emailInput").value=s.email,document.querySelector("#accountEdit1 .firstNameInput").value=s.firstName||"",document.querySelector("#accountEdit1 .lastNameInput").value=s.lastName||"",document.querySelector("#accountEdit1 .companyNameInput").value=s.companyName||"";let r=document.querySelectorAll("input.hiddenUserIdInput");r=typeof r=="object"&&r.length>0?r:!1;for(let c=0;c{let e=await t.httpclient.apicall({path:"api/maps",method:"GET"});if(!e.ok)return;let n=(await e.json()).data;if(n?.length===0){document.getElementById("noChecksMessage").style.display="table-row";return}let s=document.getElementById("mapsListTable");for(let r of n){let c=s.insertRow(-1);c.classList.add("checkRow"),c.id=`tr_${r.mapId}`,c.insertCell(0).innerHTML=r.mapId,c.insertCell(1).innerHTML=r.description,c.insertCell(2).innerHTML=`
Display Edit Delete
`,document.getElementById(`a_${r.mapId}`)?.addEventListener("click",async l=>{l.preventDefault();let d=l?.target?.id?.substring(2),a;(await t.httpclient.apicall({path:"api/maps",method:"DELETE",queryStringObject:{mapId:d}})).ok?(console.log("map delete success:"),document.getElementById(`tr_${d}`).remove()):(a=tokenGetRes?.error?.message||"Invalid token",console.log("map delete error:",a))})}};t.mapCreatePageHydrate=async()=>{let e=t.randomCity(),o=t.city2geoloc[e];document.querySelector("#mapCreate .hiddenGeoLocationInput").value=JSON.stringify(o),document.querySelector("#mapCreate .geoLocationNameInput").value=e,document.querySelector("#mapCreate .descriptionInput").value=""};t.mapDisplayPageHydrate=async()=>{try{let e=t.windowurlGet(),o=typeof e?.searchParams?.mapId=="string"&&e?.searchParams?.mapId?.trim()?.length===20?e?.searchParams?.mapId?.trim():!1;if(!o)throw new Error("Invalid mapId parameter");document.getElementById("editMode")?.addEventListener("click",i=>{i.preventDefault(),window.location=`/maps/edit?mapId=${o}`});let n=await t.httpclient.apicall({path:"api/maps",method:"GET",queryStringObject:{mapId:o}});if(!n.ok)throw new Error(n?.error?.message||`Map[${o}] retrieval failed`);let r=(await n.json())?.data,c={x:100,y:200,z:13,...r?.mapData},l=L.map("map").setView([c.y,c.x],c.z);L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{maxZoom:18,attribution:"\xA9 OpenStreetMap contributors"}).addTo(l),new L.Control.Geocoder().addTo(l);let d=t.helpers.layersFromGeojsn(r?.geoJson);for(let i of d){let p;if(i.type==="marker")p=L.marker(i.latlngs).addTo(l);else if(i.type==="polygon")p=L.polygon(i.latlngs).addTo(l);else{console.log(`Unsupported layer type[${i.type}]`);continue}console.log("lyaer:",p)}let a=!1;l.on("moveend",()=>{console.log("map changed/old/new",a,!0),a=!0})}catch(e){document.querySelector("#mapDisplay .formError").innerHTML=e.message,document.querySelector("#mapDisplay .formError").style.display="block"}};t.mapEditBtnSave=async(e,o)=>{try{let n=o.editTools.featuresLayer;console.log("collected event counters before save",t.helpers.evtCounters),console.log("collected features before save",t.helpers.layerMapFrom(n));let s=Object.values(t.helpers.evtCounters).reduce((p,u)=>p+u,0);for(let p of Object.keys(t.helpers.evtCounters))t.helpers.evtCounters[p]=0;let r={x:o.getCenter().lng,y:o.getCenter().lat,z:o.getZoom()},c={type:"FeatureCollection",features:t.helpers.geojsnFeaturesFrom(n,["marker","polygon","polyline"])},l=!t.helpers.objEquals(e.geoJson,c,{title:"geoJson",debug:!0}),d=!t.helpers.objEquals(e.mapData,r,{title:"mapData",debug:!0});if(!(l||d))return;e.geoJson=c,e.mapData=r;let a=await t.httpclient.apicall({path:"api/maps",method:"PUT",payload:e,queryStringObject:{}});if(!a.ok)throw new Error(a?.error?.message||"Map update failed");let i=await a.json();e=i?.data,document.querySelector("#mapEdit .formSuccess").innerHTML=i?.message||"Map updated successfully",document.querySelector("#mapEdit .formSuccess").style.display="block"}catch(n){document.querySelector("#mapEdit .formError").innerHTML=n.message,document.querySelector("#mapEdit .formError").style.display="block"}};t.helpers.deleteShape=e=>{try{let o=t.helpers.leafletClsnameFrom(e?.target),n=e.originalEvent.ctrlKey||e.originalEvent.metaKey,s=e?.target?.editEnabled();console.log("deleteShape tType:",o,"ctrlKey:",n,"targetEditEnable:d",s),console.log("deleteShape editor:",e?.target?.editor),n&&s&&(["polyline","polygon"].indexOf(o)>-1?e?.target?.editor?.deleteShapeAt(e.latlng):["marker"].indexOf(o)>-1&&(e?.target?.remove(),e?.target?.removeFrom(e?.target?.editor?.map?.editTools?.featuresLayer)))}catch(o){console.log("deleteShape error:",o)}};t.mapEditPageHydrate=async()=>{try{let e=t.windowurlGet(),o=typeof e?.searchParams?.mapId=="string"&&e?.searchParams?.mapId?.trim()?.length===20?e?.searchParams?.mapId?.trim():!1;if(!o)throw new Error("Invalid mapId parameter");let n=await t.httpclient.apicall({path:"api/maps",method:"GET",queryStringObject:{mapId:o}});if(!n.ok)throw new Error(n?.error?.message||`Map[${o}] retrieval failed`);let r=(await n.json())?.data;document.getElementById("displayMode")?.addEventListener("click",a=>{a.preventDefault(),window.location=`/maps/display?mapId=${o}`}),document.getElementById("saveMap")?.addEventListener("click",async a=>{a.preventDefault(),await t.mapEditBtnSave(r,l)});let c={x:100,y:200,z:13,...r?.mapData},l=L.map("map",{editable:!0}).setView([c.y,c.x],c.z);L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{maxZoom:18,attribution:"\xA9 OpenStreetMap contributors"}).addTo(l),new L.Control.Geocoder().addTo(l),L.EditControl=L.Control.extend({options:{position:"topleft",callback:null,kind:"",html:""},onAdd:function(a){let i=L.DomUtil.create("div","leaflet-control leaflet-bar"),p=L.DomUtil.create("a","",i);return p.href="#",p.title="Create a new "+this.options.kind,p.innerHTML=this.options.html,L.DomEvent.on(p,"click",L.DomEvent.stop).on(p,"click",function(){window.LAYER=this.options.callback.call(a.editTools)},this),i}}),L.NewPolygonControl=L.EditControl.extend({options:{position:"topleft",callback:l.editTools.startPolygon,kind:"polygon",html:"\u25B0"}}),L.NewMarkerControl=L.EditControl.extend({options:{position:"topleft",callback:l.editTools.startMarker,kind:"marker",html:"\u25C9\uFE0E"}}),l.addControl(new L.NewPolygonControl),l.addControl(new L.NewMarkerControl);let d=t.helpers.layersFromGeojsn(r?.geoJson);for(let a of d){let i;if(a.type==="marker")i=L.marker(a.latlngs).addTo(l.editTools.featuresLayer),i.on("click",L.DomEvent.stop).on("click",t.helpers.deleteShape,i),i.enableEdit();else if(a.type==="polygon")i=L.polygon(a.latlngs).addTo(l.editTools.featuresLayer),i.on("dblclick",L.DomEvent.stop).on("dblclick",i.toggleEdit),i.on("click",L.DomEvent.stop).on("click",t.helpers.deleteShape,i),i.enableEdit();else{console.log(`Unsupported layer type[${a.type}]`);continue}}l.editTools.on("editable:editing editable:drawing:move",a=>{t.helpers.evtCounterInc(a)}),l.editTools.on("editable:drawing:commit",a=>{t.helpers.evtCounterInc(a)}),l.on("layeradd",a=>{t.helpers.evtCounterInc(a);let i=t.helpers.leafletClsnameFrom(a?.layer)||"unknown";["marker","polyline","polygon"].indexOf(i)>-1&&a.layer.on("click",L.DomEvent.stop).on("click",t.helpers.deleteShape,a.layer),["polyline","polygon"].indexOf(i)>-1&&a.layer.on("dblclick",L.DomEvent.stop).on("dblclick",a.layer.toggleEdit)}),l.on("layerremove",a=>{t.helpers.evtCounterInc(a)}),l.on("moveend",a=>{t.helpers.evtCounterInc(a)})}catch(e){document.querySelector("#mapEdit .formError").innerHTML=e.message,document.querySelector("#mapEdit .formError").style.display="block"}};t.pageHydrateHandlers={accountCreated:t.accountCreatedPageHydrate,accountCreate2:t.accountCreate2PageHydrate,accountPwdreset2:t.accountPwdreset2PageHydrate,accountEmailnew:t.accountEmailnewPageHydrate,accountEdit:t.accountEditPageHydrate,mapsList:t.mapsListPageHydrate,mapCreate:t.mapCreatePageHydrate,mapDisplay:t.mapDisplayPageHydrate,mapEdit:t.mapEditPageHydrate};t.pageHydrate=async()=>{let e=document.querySelector("body").classList,o=typeof e=="object"&&e.length>0&&typeof e[0]=="string"?e[0]:!1,n=t.pageHydrateHandlers[o];typeof n=="function"&&await n()};t.init=()=>{t.forms.submitButtonBind(),t.logoutButtonBind(),t.tokenGet(),(async()=>{await t.pageHydrate()})().catch(e=>{console.log("app.pageHydrate failed:",e)})};window.onload=()=>{t.init()};})();