From 7847f5e79c2c1cca8cf0b6994839760f403b6e3f Mon Sep 17 00:00:00 2001 From: legop3 Date: Sun, 26 Apr 2026 21:17:59 -0400 Subject: [PATCH] remove status line stuff --- .../{index-C8eHY4sq.js => index-DXZzGFh7.js} | 16 ++++++++-------- server/public/index.html | 2 +- webui/src/components/vip/VipNeatoCard.jsx | 19 ++++++------------- 3 files changed, 15 insertions(+), 22 deletions(-) rename server/public/assets/{index-C8eHY4sq.js => index-DXZzGFh7.js} (87%) diff --git a/server/public/assets/index-C8eHY4sq.js b/server/public/assets/index-DXZzGFh7.js similarity index 87% rename from server/public/assets/index-C8eHY4sq.js rename to server/public/assets/index-DXZzGFh7.js index 4750c9c1..08ef0e66 100644 --- a/server/public/assets/index-C8eHY4sq.js +++ b/server/public/assets/index-DXZzGFh7.js @@ -1,21 +1,21 @@ -(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const f of document.querySelectorAll('link[rel="modulepreload"]'))o(f);new MutationObserver(f=>{for(const d of f)if(d.type==="childList")for(const h of d.addedNodes)h.tagName==="LINK"&&h.rel==="modulepreload"&&o(h)}).observe(document,{childList:!0,subtree:!0});function i(f){const d={};return f.integrity&&(d.integrity=f.integrity),f.referrerPolicy&&(d.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?d.credentials="include":f.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function o(f){if(f.ep)return;f.ep=!0;const d=i(f);fetch(f.href,d)}})();function py(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var Xu={exports:{}},li={};var x0;function xy(){if(x0)return li;x0=1;var n=Symbol.for("react.transitional.element"),s=Symbol.for("react.fragment");function i(o,f,d){var h=null;if(d!==void 0&&(h=""+d),f.key!==void 0&&(h=""+f.key),"key"in f){d={};for(var p in f)p!=="key"&&(d[p]=f[p])}else d=f;return f=d.ref,{$$typeof:n,type:o,key:h,ref:f!==void 0?f:null,props:d}}return li.Fragment=s,li.jsx=i,li.jsxs=i,li}var g0;function gy(){return g0||(g0=1,Xu.exports=xy()),Xu.exports}var r=gy(),Qu={exports:{}},we={};var v0;function vy(){if(v0)return we;v0=1;var n=Symbol.for("react.transitional.element"),s=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),d=Symbol.for("react.consumer"),h=Symbol.for("react.context"),p=Symbol.for("react.forward_ref"),x=Symbol.for("react.suspense"),g=Symbol.for("react.memo"),v=Symbol.for("react.lazy"),y=Symbol.for("react.activity"),S=Symbol.iterator;function E(R){return R===null||typeof R!="object"?null:(R=S&&R[S]||R["@@iterator"],typeof R=="function"?R:null)}var C={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},k=Object.assign,w={};function j(R,$,ee){this.props=R,this.context=$,this.refs=w,this.updater=ee||C}j.prototype.isReactComponent={},j.prototype.setState=function(R,$){if(typeof R!="object"&&typeof R!="function"&&R!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,R,$,"setState")},j.prototype.forceUpdate=function(R){this.updater.enqueueForceUpdate(this,R,"forceUpdate")};function N(){}N.prototype=j.prototype;function q(R,$,ee){this.props=R,this.context=$,this.refs=w,this.updater=ee||C}var M=q.prototype=new N;M.constructor=q,k(M,j.prototype),M.isPureReactComponent=!0;var O=Array.isArray;function K(){}var _={H:null,A:null,T:null,S:null},U=Object.prototype.hasOwnProperty;function z(R,$,ee){var ae=ee.ref;return{$$typeof:n,type:R,key:$,ref:ae!==void 0?ae:null,props:ee}}function H(R,$){return z(R.type,$,R.props)}function V(R){return typeof R=="object"&&R!==null&&R.$$typeof===n}function W(R){var $={"=":"=0",":":"=2"};return"$"+R.replace(/[=:]/g,function(ee){return $[ee]})}var oe=/\/+/g;function ce(R,$){return typeof R=="object"&&R!==null&&R.key!=null?W(""+R.key):$.toString(36)}function Y(R){switch(R.status){case"fulfilled":return R.value;case"rejected":throw R.reason;default:switch(typeof R.status=="string"?R.then(K,K):(R.status="pending",R.then(function($){R.status==="pending"&&(R.status="fulfilled",R.value=$)},function($){R.status==="pending"&&(R.status="rejected",R.reason=$)})),R.status){case"fulfilled":return R.value;case"rejected":throw R.reason}}throw R}function T(R,$,ee,ae,me){var re=typeof R;(re==="undefined"||re==="boolean")&&(R=null);var ue=!1;if(R===null)ue=!0;else switch(re){case"bigint":case"string":case"number":ue=!0;break;case"object":switch(R.$$typeof){case n:case s:ue=!0;break;case v:return ue=R._init,T(ue(R._payload),$,ee,ae,me)}}if(ue)return me=me(R),ue=ae===""?"."+ce(R,0):ae,O(me)?(ee="",ue!=null&&(ee=ue.replace(oe,"$&/")+"/"),T(me,$,ee,"",function(xe){return xe})):me!=null&&(V(me)&&(me=H(me,ee+(me.key==null||R&&R.key===me.key?"":(""+me.key).replace(oe,"$&/")+"/")+ue)),$.push(me)),1;ue=0;var ve=ae===""?".":ae+":";if(O(R))for(var be=0;be>>1,de=T[ie];if(0>>1;ief(ee,I))aef(me,ee)?(T[ie]=me,T[ae]=I,ie=ae):(T[ie]=ee,T[$]=I,ie=$);else if(aef(me,I))T[ie]=me,T[ae]=I,ie=ae;else break e}}return G}function f(T,G){var I=T.sortIndex-G.sortIndex;return I!==0?I:T.id-G.id}if(n.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var d=performance;n.unstable_now=function(){return d.now()}}else{var h=Date,p=h.now();n.unstable_now=function(){return h.now()-p}}var x=[],g=[],v=1,y=null,S=3,E=!1,C=!1,k=!1,w=!1,j=typeof setTimeout=="function"?setTimeout:null,N=typeof clearTimeout=="function"?clearTimeout:null,q=typeof setImmediate<"u"?setImmediate:null;function M(T){for(var G=i(g);G!==null;){if(G.callback===null)o(g);else if(G.startTime<=T)o(g),G.sortIndex=G.expirationTime,s(x,G);else break;G=i(g)}}function O(T){if(k=!1,M(T),!C)if(i(x)!==null)C=!0,K||(K=!0,W());else{var G=i(g);G!==null&&Y(O,G.startTime-T)}}var K=!1,_=-1,U=5,z=-1;function H(){return w?!0:!(n.unstable_now()-zT&&H());){var ie=y.callback;if(typeof ie=="function"){y.callback=null,S=y.priorityLevel;var de=ie(y.expirationTime<=T);if(T=n.unstable_now(),typeof de=="function"){y.callback=de,M(T),G=!0;break t}y===i(x)&&o(x),M(T)}else o(x);y=i(x)}if(y!==null)G=!0;else{var R=i(g);R!==null&&Y(O,R.startTime-T),G=!1}}break e}finally{y=null,S=I,E=!1}G=void 0}}finally{G?W():K=!1}}}var W;if(typeof q=="function")W=function(){q(V)};else if(typeof MessageChannel<"u"){var oe=new MessageChannel,ce=oe.port2;oe.port1.onmessage=V,W=function(){ce.postMessage(null)}}else W=function(){j(V,0)};function Y(T,G){_=j(function(){T(n.unstable_now())},G)}n.unstable_IdlePriority=5,n.unstable_ImmediatePriority=1,n.unstable_LowPriority=4,n.unstable_NormalPriority=3,n.unstable_Profiling=null,n.unstable_UserBlockingPriority=2,n.unstable_cancelCallback=function(T){T.callback=null},n.unstable_forceFrameRate=function(T){0>T||125ie?(T.sortIndex=I,s(g,T),i(x)===null&&T===i(g)&&(k?(N(_),_=-1):k=!0,Y(O,I-ie))):(T.sortIndex=de,s(x,T),C||E||(C=!0,K||(K=!0,W()))),T},n.unstable_shouldYield=H,n.unstable_wrapCallback=function(T){var G=S;return function(){var I=S;S=G;try{return T.apply(this,arguments)}finally{S=I}}}})(Iu)),Iu}var S0;function yy(){return S0||(S0=1,Zu.exports=by()),Zu.exports}var Ju={exports:{}},Bt={};var j0;function Sy(){if(j0)return Bt;j0=1;var n=Gf();function s(x){var g="https://react.dev/errors/"+x;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(s){console.error(s)}}return n(),Ju.exports=Sy(),Ju.exports}var N0;function Ay(){if(N0)return ii;N0=1;var n=yy(),s=Gf(),i=jy();function o(e){var t="https://react.dev/errors/"+e;if(1de||(e.current=ie[de],ie[de]=null,de--)}function ee(e,t){de++,ie[de]=e.current,e.current=t}var ae=R(null),me=R(null),re=R(null),ue=R(null);function ve(e,t){switch(ee(re,t),ee(me,e),ee(ae,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Up(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Up(t),e=Hp(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}$(ae),ee(ae,e)}function be(){$(ae),$(me),$(re)}function xe(e){e.memoizedState!==null&&ee(ue,e);var t=ae.current,a=Hp(t,e.type);t!==a&&(ee(me,e),ee(ae,a))}function Be(e){me.current===e&&($(ae),$(me)),ue.current===e&&($(ue),ti._currentValue=I)}var ze,Ae;function tt(e){if(ze===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);ze=t&&t[1]||"",Ae=-1{for(const d of f)if(d.type==="childList")for(const h of d.addedNodes)h.tagName==="LINK"&&h.rel==="modulepreload"&&o(h)}).observe(document,{childList:!0,subtree:!0});function i(f){const d={};return f.integrity&&(d.integrity=f.integrity),f.referrerPolicy&&(d.referrerPolicy=f.referrerPolicy),f.crossOrigin==="use-credentials"?d.credentials="include":f.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function o(f){if(f.ep)return;f.ep=!0;const d=i(f);fetch(f.href,d)}})();function py(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var Xu={exports:{}},li={};var x0;function xy(){if(x0)return li;x0=1;var n=Symbol.for("react.transitional.element"),s=Symbol.for("react.fragment");function i(o,f,d){var h=null;if(d!==void 0&&(h=""+d),f.key!==void 0&&(h=""+f.key),"key"in f){d={};for(var p in f)p!=="key"&&(d[p]=f[p])}else d=f;return f=d.ref,{$$typeof:n,type:o,key:h,ref:f!==void 0?f:null,props:d}}return li.Fragment=s,li.jsx=i,li.jsxs=i,li}var g0;function gy(){return g0||(g0=1,Xu.exports=xy()),Xu.exports}var r=gy(),Qu={exports:{}},we={};var v0;function vy(){if(v0)return we;v0=1;var n=Symbol.for("react.transitional.element"),s=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),d=Symbol.for("react.consumer"),h=Symbol.for("react.context"),p=Symbol.for("react.forward_ref"),x=Symbol.for("react.suspense"),g=Symbol.for("react.memo"),v=Symbol.for("react.lazy"),y=Symbol.for("react.activity"),S=Symbol.iterator;function E(R){return R===null||typeof R!="object"?null:(R=S&&R[S]||R["@@iterator"],typeof R=="function"?R:null)}var C={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},k=Object.assign,w={};function j(R,G,te){this.props=R,this.context=G,this.refs=w,this.updater=te||C}j.prototype.isReactComponent={},j.prototype.setState=function(R,G){if(typeof R!="object"&&typeof R!="function"&&R!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,R,G,"setState")},j.prototype.forceUpdate=function(R){this.updater.enqueueForceUpdate(this,R,"forceUpdate")};function N(){}N.prototype=j.prototype;function q(R,G,te){this.props=R,this.context=G,this.refs=w,this.updater=te||C}var M=q.prototype=new N;M.constructor=q,k(M,j.prototype),M.isPureReactComponent=!0;var O=Array.isArray;function K(){}var _={H:null,A:null,T:null,S:null},H=Object.prototype.hasOwnProperty;function z(R,G,te){var ae=te.ref;return{$$typeof:n,type:R,key:G,ref:ae!==void 0?ae:null,props:te}}function V(R,G){return z(R.type,G,R.props)}function U(R){return typeof R=="object"&&R!==null&&R.$$typeof===n}function W(R){var G={"=":"=0",":":"=2"};return"$"+R.replace(/[=:]/g,function(te){return G[te]})}var ce=/\/+/g;function oe(R,G){return typeof R=="object"&&R!==null&&R.key!=null?W(""+R.key):G.toString(36)}function $(R){switch(R.status){case"fulfilled":return R.value;case"rejected":throw R.reason;default:switch(typeof R.status=="string"?R.then(K,K):(R.status="pending",R.then(function(G){R.status==="pending"&&(R.status="fulfilled",R.value=G)},function(G){R.status==="pending"&&(R.status="rejected",R.reason=G)})),R.status){case"fulfilled":return R.value;case"rejected":throw R.reason}}throw R}function T(R,G,te,ae,pe){var re=typeof R;(re==="undefined"||re==="boolean")&&(R=null);var ue=!1;if(R===null)ue=!0;else switch(re){case"bigint":case"string":case"number":ue=!0;break;case"object":switch(R.$$typeof){case n:case s:ue=!0;break;case v:return ue=R._init,T(ue(R._payload),G,te,ae,pe)}}if(ue)return pe=pe(R),ue=ae===""?"."+oe(R,0):ae,O(pe)?(te="",ue!=null&&(te=ue.replace(ce,"$&/")+"/"),T(pe,G,te,"",function(xe){return xe})):pe!=null&&(U(pe)&&(pe=V(pe,te+(pe.key==null||R&&R.key===pe.key?"":(""+pe.key).replace(ce,"$&/")+"/")+ue)),G.push(pe)),1;ue=0;var ve=ae===""?".":ae+":";if(O(R))for(var be=0;be>>1,de=T[ie];if(0>>1;ief(te,I))aef(pe,te)?(T[ie]=pe,T[ae]=I,ie=ae):(T[ie]=te,T[G]=I,ie=G);else if(aef(pe,I))T[ie]=pe,T[ae]=I,ie=ae;else break e}}return Y}function f(T,Y){var I=T.sortIndex-Y.sortIndex;return I!==0?I:T.id-Y.id}if(n.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var d=performance;n.unstable_now=function(){return d.now()}}else{var h=Date,p=h.now();n.unstable_now=function(){return h.now()-p}}var x=[],g=[],v=1,y=null,S=3,E=!1,C=!1,k=!1,w=!1,j=typeof setTimeout=="function"?setTimeout:null,N=typeof clearTimeout=="function"?clearTimeout:null,q=typeof setImmediate<"u"?setImmediate:null;function M(T){for(var Y=i(g);Y!==null;){if(Y.callback===null)o(g);else if(Y.startTime<=T)o(g),Y.sortIndex=Y.expirationTime,s(x,Y);else break;Y=i(g)}}function O(T){if(k=!1,M(T),!C)if(i(x)!==null)C=!0,K||(K=!0,W());else{var Y=i(g);Y!==null&&$(O,Y.startTime-T)}}var K=!1,_=-1,H=5,z=-1;function V(){return w?!0:!(n.unstable_now()-zT&&V());){var ie=y.callback;if(typeof ie=="function"){y.callback=null,S=y.priorityLevel;var de=ie(y.expirationTime<=T);if(T=n.unstable_now(),typeof de=="function"){y.callback=de,M(T),Y=!0;break t}y===i(x)&&o(x),M(T)}else o(x);y=i(x)}if(y!==null)Y=!0;else{var R=i(g);R!==null&&$(O,R.startTime-T),Y=!1}}break e}finally{y=null,S=I,E=!1}Y=void 0}}finally{Y?W():K=!1}}}var W;if(typeof q=="function")W=function(){q(U)};else if(typeof MessageChannel<"u"){var ce=new MessageChannel,oe=ce.port2;ce.port1.onmessage=U,W=function(){oe.postMessage(null)}}else W=function(){j(U,0)};function $(T,Y){_=j(function(){T(n.unstable_now())},Y)}n.unstable_IdlePriority=5,n.unstable_ImmediatePriority=1,n.unstable_LowPriority=4,n.unstable_NormalPriority=3,n.unstable_Profiling=null,n.unstable_UserBlockingPriority=2,n.unstable_cancelCallback=function(T){T.callback=null},n.unstable_forceFrameRate=function(T){0>T||125ie?(T.sortIndex=I,s(g,T),i(x)===null&&T===i(g)&&(k?(N(_),_=-1):k=!0,$(O,I-ie))):(T.sortIndex=de,s(x,T),C||E||(C=!0,K||(K=!0,W()))),T},n.unstable_shouldYield=V,n.unstable_wrapCallback=function(T){var Y=S;return function(){var I=S;S=Y;try{return T.apply(this,arguments)}finally{S=I}}}})(Iu)),Iu}var S0;function yy(){return S0||(S0=1,Zu.exports=by()),Zu.exports}var Ju={exports:{}},Bt={};var j0;function Sy(){if(j0)return Bt;j0=1;var n=Gf();function s(x){var g="https://react.dev/errors/"+x;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(s){console.error(s)}}return n(),Ju.exports=Sy(),Ju.exports}var N0;function Ay(){if(N0)return ii;N0=1;var n=yy(),s=Gf(),i=jy();function o(e){var t="https://react.dev/errors/"+e;if(1de||(e.current=ie[de],ie[de]=null,de--)}function te(e,t){de++,ie[de]=e.current,e.current=t}var ae=R(null),pe=R(null),re=R(null),ue=R(null);function ve(e,t){switch(te(re,t),te(pe,e),te(ae,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Up(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Up(t),e=Hp(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}G(ae),te(ae,e)}function be(){G(ae),G(pe),G(re)}function xe(e){e.memoizedState!==null&&te(ue,e);var t=ae.current,a=Hp(t,e.type);t!==a&&(te(pe,e),te(ae,a))}function Be(e){pe.current===e&&(G(ae),G(pe)),ue.current===e&&(G(ue),ti._currentValue=I)}var ze,Ae;function tt(e){if(ze===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);ze=t&&t[1]||"",Ae=-1)":-1c||D[l]!==X[c]){var J=` -`+D[l].replace(" at new "," at ");return e.displayName&&J.includes("")&&(J=J.replace("",e.displayName)),J}while(1<=l&&0<=c);break}}}finally{Je=!1,Error.prepareStackTrace=a}return(a=e?e.displayName||e.name:"")?tt(a):""}function le(e,t){switch(e.tag){case 26:case 27:case 5:return tt(e.type);case 16:return tt("Lazy");case 13:return e.child!==t&&t!==null?tt("Suspense Fallback"):tt("Suspense");case 19:return tt("SuspenseList");case 0:case 15:return vt(e.type,!1);case 11:return vt(e.type.render,!1);case 1:return vt(e.type,!0);case 31:return tt("Activity");default:return""}}function he(e){try{var t="",a=null;do t+=le(e,a),a=e,e=e.return;while(e);return t}catch(l){return` +`+D[l].replace(" at new "," at ");return e.displayName&&J.includes("")&&(J=J.replace("",e.displayName)),J}while(1<=l&&0<=c);break}}}finally{Je=!1,Error.prepareStackTrace=a}return(a=e?e.displayName||e.name:"")?tt(a):""}function le(e,t){switch(e.tag){case 26:case 27:case 5:return tt(e.type);case 16:return tt("Lazy");case 13:return e.child!==t&&t!==null?tt("Suspense Fallback"):tt("Suspense");case 19:return tt("SuspenseList");case 0:case 15:return vt(e.type,!1);case 11:return vt(e.type.render,!1);case 1:return vt(e.type,!0);case 31:return tt("Activity");default:return""}}function me(e){try{var t="",a=null;do t+=le(e,a),a=e,e=e.return;while(e);return t}catch(l){return` Error generating stack: `+l.message+` -`+l.stack}}var se=Object.prototype.hasOwnProperty,P=n.unstable_scheduleCallback,fe=n.unstable_cancelCallback,Ne=n.unstable_shouldYield,pt=n.unstable_requestPaint,Ve=n.unstable_now,st=n.unstable_getCurrentPriorityLevel,lt=n.unstable_ImmediatePriority,Ot=n.unstable_UserBlockingPriority,it=n.unstable_NormalPriority,ds=n.unstable_LowPriority,Yt=n.unstable_IdlePriority,La=n.log,Bo=n.unstable_setDisableYieldValue,Bn=null,Nt=null;function Ft(e){if(typeof La=="function"&&Bo(e),Nt&&typeof Nt.setStrictMode=="function")try{Nt.setStrictMode(Bn,e)}catch{}}var Mt=Math.clz32?Math.clz32:ms,fa=Math.log,Oo=Math.LN2;function ms(e){return e>>>=0,e===0?32:31-(fa(e)/Oo|0)|0}var hs=256,za=262144,Pe=4194304;function On(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Cn(e,t,a){var l=e.pendingLanes;if(l===0)return 0;var c=0,u=e.suspendedLanes,b=e.pingedLanes;e=e.warmLanes;var A=l&134217727;return A!==0?(l=A&~u,l!==0?c=On(l):(b&=A,b!==0?c=On(b):a||(a=A&~e,a!==0&&(c=On(a))))):(A=l&~u,A!==0?c=On(A):b!==0?c=On(b):a||(a=l&~e,a!==0&&(c=On(a)))),c===0?0:t!==0&&t!==c&&(t&u)===0&&(u=c&-c,a=t&-t,u>=a||u===32&&(a&4194048)!==0)?t:c}function Ln(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function ps(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function ml(){var e=Pe;return Pe<<=1,(Pe&62914560)===0&&(Pe=4194304),e}function hl(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function Ua(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Lo(e,t,a,l,c,u){var b=e.pendingLanes;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=a,e.entangledLanes&=a,e.errorRecoveryDisabledLanes&=a,e.shellSuspendCounter=0;var A=e.entanglements,D=e.expirationTimes,X=e.hiddenUpdates;for(a=b&~a;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var cv=/[\n"\\]/g;function ln(e){return e.replace(cv,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function Ho(e,t,a,l,c,u,b,A){e.name="",b!=null&&typeof b!="function"&&typeof b!="symbol"&&typeof b!="boolean"?e.type=b:e.removeAttribute("type"),t!=null?b==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+sn(t)):e.value!==""+sn(t)&&(e.value=""+sn(t)):b!=="submit"&&b!=="reset"||e.removeAttribute("value"),t!=null?Vo(e,b,sn(t)):a!=null?Vo(e,b,sn(a)):l!=null&&e.removeAttribute("value"),c==null&&u!=null&&(e.defaultChecked=!!u),c!=null&&(e.checked=c&&typeof c!="function"&&typeof c!="symbol"),A!=null&&typeof A!="function"&&typeof A!="symbol"&&typeof A!="boolean"?e.name=""+sn(A):e.removeAttribute("name")}function Dd(e,t,a,l,c,u,b,A){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(e.type=u),t!=null||a!=null){if(!(u!=="submit"&&u!=="reset"||t!=null)){Uo(e);return}a=a!=null?""+sn(a):"",t=t!=null?""+sn(t):a,A||t===e.value||(e.value=t),e.defaultValue=t}l=l??c,l=typeof l!="function"&&typeof l!="symbol"&&!!l,e.checked=A?e.checked:!!l,e.defaultChecked=!!l,b!=null&&typeof b!="function"&&typeof b!="symbol"&&typeof b!="boolean"&&(e.name=b),Uo(e)}function Vo(e,t,a){t==="number"&&Bi(e.ownerDocument)===e||e.defaultValue===""+a||(e.defaultValue=""+a)}function ys(e,t,a,l){if(e=e.options,t){t={};for(var c=0;c"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Xo=!1;if(Vn)try{var bl={};Object.defineProperty(bl,"passive",{get:function(){Xo=!0}}),window.addEventListener("test",bl,bl),window.removeEventListener("test",bl,bl)}catch{Xo=!1}var da=null,Qo=null,Li=null;function Hd(){if(Li)return Li;var e,t=Qo,a=t.length,l,c="value"in da?da.value:da.textContent,u=c.length;for(e=0;e=jl),Xd=" ",Qd=!1;function Kd(e,t){switch(e){case"keyup":return Lv.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Zd(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Ns=!1;function Uv(e,t){switch(e){case"compositionend":return Zd(t);case"keypress":return t.which!==32?null:(Qd=!0,Xd);case"textInput":return e=t.data,e===Xd&&Qd?null:e;default:return null}}function Hv(e,t){if(Ns)return e==="compositionend"||!Po&&Kd(e,t)?(e=Hd(),Li=Qo=da=null,Ns=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:a,offset:t-e};e=l}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=am(a)}}function lm(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?lm(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function im(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Bi(e.document);t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=Bi(e.document)}return t}function tc(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var Kv=Vn&&"documentMode"in document&&11>=document.documentMode,ws=null,nc=null,Cl=null,ac=!1;function rm(e,t,a){var l=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;ac||ws==null||ws!==Bi(l)||(l=ws,"selectionStart"in l&&tc(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),Cl&&wl(Cl,l)||(Cl=l,l=Rr(nc,"onSelect"),0>=b,c-=b,En=1<<32-Mt(t)+c|a<Ee?(Te=ge,ge=null):Te=ge.sibling;var Le=Q(L,ge,F[Ee],te);if(Le===null){ge===null&&(ge=Te);break}e&&ge&&Le.alternate===null&&t(L,ge),B=u(Le,B,Ee),Oe===null?Se=Le:Oe.sibling=Le,Oe=Le,ge=Te}if(Ee===F.length)return a(L,ge),De&&Gn(L,Ee),Se;if(ge===null){for(;EeEe?(Te=ge,ge=null):Te=ge.sibling;var _a=Q(L,ge,Le.value,te);if(_a===null){ge===null&&(ge=Te);break}e&&ge&&_a.alternate===null&&t(L,ge),B=u(_a,B,Ee),Oe===null?Se=_a:Oe.sibling=_a,Oe=_a,ge=Te}if(Le.done)return a(L,ge),De&&Gn(L,Ee),Se;if(ge===null){for(;!Le.done;Ee++,Le=F.next())Le=ne(L,Le.value,te),Le!==null&&(B=u(Le,B,Ee),Oe===null?Se=Le:Oe.sibling=Le,Oe=Le);return De&&Gn(L,Ee),Se}for(ge=l(ge);!Le.done;Ee++,Le=F.next())Le=Z(ge,L,Ee,Le.value,te),Le!==null&&(e&&Le.alternate!==null&&ge.delete(Le.key===null?Ee:Le.key),B=u(Le,B,Ee),Oe===null?Se=Le:Oe.sibling=Le,Oe=Le);return e&&ge.forEach(function(hy){return t(L,hy)}),De&&Gn(L,Ee),Se}function Ke(L,B,F,te){if(typeof F=="object"&&F!==null&&F.type===k&&F.key===null&&(F=F.props.children),typeof F=="object"&&F!==null){switch(F.$$typeof){case E:e:{for(var Se=F.key;B!==null;){if(B.key===Se){if(Se=F.type,Se===k){if(B.tag===7){a(L,B.sibling),te=c(B,F.props.children),te.return=L,L=te;break e}}else if(B.elementType===Se||typeof Se=="object"&&Se!==null&&Se.$$typeof===U&&Ia(Se)===B.type){a(L,B.sibling),te=c(B,F.props),Tl(te,F),te.return=L,L=te;break e}a(L,B);break}else t(L,B);B=B.sibling}F.type===k?(te=Fa(F.props.children,L.mode,te,F.key),te.return=L,L=te):(te=Qi(F.type,F.key,F.props,null,L.mode,te),Tl(te,F),te.return=L,L=te)}return b(L);case C:e:{for(Se=F.key;B!==null;){if(B.key===Se)if(B.tag===4&&B.stateNode.containerInfo===F.containerInfo&&B.stateNode.implementation===F.implementation){a(L,B.sibling),te=c(B,F.children||[]),te.return=L,L=te;break e}else{a(L,B);break}else t(L,B);B=B.sibling}te=uc(F,L.mode,te),te.return=L,L=te}return b(L);case U:return F=Ia(F),Ke(L,B,F,te)}if(Y(F))return pe(L,B,F,te);if(W(F)){if(Se=W(F),typeof Se!="function")throw Error(o(150));return F=Se.call(F),je(L,B,F,te)}if(typeof F.then=="function")return Ke(L,B,er(F),te);if(F.$$typeof===q)return Ke(L,B,Ii(L,F),te);tr(L,F)}return typeof F=="string"&&F!==""||typeof F=="number"||typeof F=="bigint"?(F=""+F,B!==null&&B.tag===6?(a(L,B.sibling),te=c(B,F),te.return=L,L=te):(a(L,B),te=cc(F,L.mode,te),te.return=L,L=te),b(L)):a(L,B)}return function(L,B,F,te){try{ql=0;var Se=Ke(L,B,F,te);return Os=null,Se}catch(ge){if(ge===Bs||ge===Pi)throw ge;var Oe=Qt(29,ge,null,L.mode);return Oe.lanes=te,Oe.return=L,Oe}finally{}}}var Pa=Rm(!0),qm=Rm(!1),ga=!1;function jc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ac(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function va(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function ba(e,t,a){var l=e.updateQueue;if(l===null)return null;if(l=l.shared,(Ue&2)!==0){var c=l.pending;return c===null?t.next=t:(t.next=c.next,c.next=t),l.pending=t,t=Xi(e),hm(e,null,a),t}return Fi(e,l,t,a),Xi(e)}function Dl(e,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194048)!==0)){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,an(e,a)}}function Nc(e,t){var a=e.updateQueue,l=e.alternate;if(l!==null&&(l=l.updateQueue,a===l)){var c=null,u=null;if(a=a.firstBaseUpdate,a!==null){do{var b={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};u===null?c=u=b:u=u.next=b,a=a.next}while(a!==null);u===null?c=u=t:u=u.next=t}else c=u=t;a={baseState:l.baseState,firstBaseUpdate:c,lastBaseUpdate:u,shared:l.shared,callbacks:l.callbacks},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=t:e.next=t,a.lastBaseUpdate=t}var wc=!1;function _l(){if(wc){var e=_s;if(e!==null)throw e}}function Bl(e,t,a,l){wc=!1;var c=e.updateQueue;ga=!1;var u=c.firstBaseUpdate,b=c.lastBaseUpdate,A=c.shared.pending;if(A!==null){c.shared.pending=null;var D=A,X=D.next;D.next=null,b===null?u=X:b.next=X,b=D;var J=e.alternate;J!==null&&(J=J.updateQueue,A=J.lastBaseUpdate,A!==b&&(A===null?J.firstBaseUpdate=X:A.next=X,J.lastBaseUpdate=D))}if(u!==null){var ne=c.baseState;b=0,J=X=D=null,A=u;do{var Q=A.lane&-536870913,Z=Q!==A.lane;if(Z?(qe&Q)===Q:(l&Q)===Q){Q!==0&&Q===Ds&&(wc=!0),J!==null&&(J=J.next={lane:0,tag:A.tag,payload:A.payload,callback:null,next:null});e:{var pe=e,je=A;Q=t;var Ke=a;switch(je.tag){case 1:if(pe=je.payload,typeof pe=="function"){ne=pe.call(Ke,ne,Q);break e}ne=pe;break e;case 3:pe.flags=pe.flags&-65537|128;case 0:if(pe=je.payload,Q=typeof pe=="function"?pe.call(Ke,ne,Q):pe,Q==null)break e;ne=y({},ne,Q);break e;case 2:ga=!0}}Q=A.callback,Q!==null&&(e.flags|=64,Z&&(e.flags|=8192),Z=c.callbacks,Z===null?c.callbacks=[Q]:Z.push(Q))}else Z={lane:Q,tag:A.tag,payload:A.payload,callback:A.callback,next:null},J===null?(X=J=Z,D=ne):J=J.next=Z,b|=Q;if(A=A.next,A===null){if(A=c.shared.pending,A===null)break;Z=A,A=Z.next,Z.next=null,c.lastBaseUpdate=Z,c.shared.pending=null}}while(!0);J===null&&(D=ne),c.baseState=D,c.firstBaseUpdate=X,c.lastBaseUpdate=J,u===null&&(c.shared.lanes=0),Na|=b,e.lanes=b,e.memoizedState=ne}}function Tm(e,t){if(typeof e!="function")throw Error(o(191,e));e.call(t)}function Dm(e,t){var a=e.callbacks;if(a!==null)for(e.callbacks=null,e=0;eu?u:8;var b=T.T,A={};T.T=A,Yc(e,!1,t,a);try{var D=c(),X=T.S;if(X!==null&&X(A,D),D!==null&&typeof D=="object"&&typeof D.then=="function"){var J=ab(D,l);zl(e,t,J,Pt(e))}else zl(e,t,l,Pt(e))}catch(ne){zl(e,t,{then:function(){},status:"rejected",reason:ne},Pt())}finally{G.p=u,b!==null&&A.types!==null&&(b.types=A.types),T.T=b}}function cb(){}function $c(e,t,a,l){if(e.tag!==5)throw Error(o(476));var c=fh(e).queue;uh(e,c,t,I,a===null?cb:function(){return dh(e),a(l)})}function fh(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:I,baseState:I,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Qn,lastRenderedState:I},next:null};var a={};return t.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Qn,lastRenderedState:a},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function dh(e){var t=fh(e);t.next===null&&(t=e.alternate.memoizedState),zl(e,t.next.queue,{},Pt())}function Gc(){return qt(ti)}function mh(){return gt().memoizedState}function hh(){return gt().memoizedState}function ub(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var a=Pt();e=va(a);var l=ba(t,e,a);l!==null&&(Gt(l,t,a),Dl(l,t,a)),t={cache:vc()},e.payload=t;return}t=t.return}}function fb(e,t,a){var l=Pt();a={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},fr(e)?xh(t,a):(a=rc(e,t,a,l),a!==null&&(Gt(a,e,l),gh(a,t,l)))}function ph(e,t,a){var l=Pt();zl(e,t,a,l)}function zl(e,t,a,l){var c={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(fr(e))xh(t,c);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var b=t.lastRenderedState,A=u(b,a);if(c.hasEagerState=!0,c.eagerState=A,Xt(A,b))return Fi(e,t,c,0),Ie===null&&Yi(),!1}catch{}finally{}if(a=rc(e,t,c,l),a!==null)return Gt(a,e,l),gh(a,t,l),!0}return!1}function Yc(e,t,a,l){if(l={lane:2,revertLane:ju(),gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},fr(e)){if(t)throw Error(o(479))}else t=rc(e,a,l,2),t!==null&&Gt(t,e,2)}function fr(e){var t=e.alternate;return e===Ce||t!==null&&t===Ce}function xh(e,t){zs=sr=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function gh(e,t,a){if((a&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,an(e,a)}}var Ul={readContext:qt,use:rr,useCallback:dt,useContext:dt,useEffect:dt,useImperativeHandle:dt,useLayoutEffect:dt,useInsertionEffect:dt,useMemo:dt,useReducer:dt,useRef:dt,useState:dt,useDebugValue:dt,useDeferredValue:dt,useTransition:dt,useSyncExternalStore:dt,useId:dt,useHostTransitionStatus:dt,useFormState:dt,useActionState:dt,useOptimistic:dt,useMemoCache:dt,useCacheRefresh:dt};Ul.useEffectEvent=dt;var vh={readContext:qt,use:rr,useCallback:function(e,t){return Lt().memoizedState=[e,t===void 0?null:t],e},useContext:qt,useEffect:th,useImperativeHandle:function(e,t,a){a=a!=null?a.concat([e]):null,cr(4194308,4,lh.bind(null,t,e),a)},useLayoutEffect:function(e,t){return cr(4194308,4,e,t)},useInsertionEffect:function(e,t){cr(4,2,e,t)},useMemo:function(e,t){var a=Lt();t=t===void 0?null:t;var l=e();if(Wa){Ft(!0);try{e()}finally{Ft(!1)}}return a.memoizedState=[l,t],l},useReducer:function(e,t,a){var l=Lt();if(a!==void 0){var c=a(t);if(Wa){Ft(!0);try{a(t)}finally{Ft(!1)}}}else c=t;return l.memoizedState=l.baseState=c,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:c},l.queue=e,e=e.dispatch=fb.bind(null,Ce,e),[l.memoizedState,e]},useRef:function(e){var t=Lt();return e={current:e},t.memoizedState=e},useState:function(e){e=Lc(e);var t=e.queue,a=ph.bind(null,Ce,t);return t.dispatch=a,[e.memoizedState,a]},useDebugValue:Hc,useDeferredValue:function(e,t){var a=Lt();return Vc(a,e,t)},useTransition:function(){var e=Lc(!1);return e=uh.bind(null,Ce,e.queue,!0,!1),Lt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,a){var l=Ce,c=Lt();if(De){if(a===void 0)throw Error(o(407));a=a()}else{if(a=t(),Ie===null)throw Error(o(349));(qe&127)!==0||Um(l,t,a)}c.memoizedState=a;var u={value:a,getSnapshot:t};return c.queue=u,th(Vm.bind(null,l,u,e),[e]),l.flags|=2048,Hs(9,{destroy:void 0},Hm.bind(null,l,u,a,t),null),a},useId:function(){var e=Lt(),t=Ie.identifierPrefix;if(De){var a=kn,l=En;a=(l&~(1<<32-Mt(l)-1)).toString(32)+a,t="_"+t+"R_"+a,a=lr++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof l.is=="string"?b.createElement("select",{is:l.is}):b.createElement("select"),l.multiple?u.multiple=!0:l.size&&(u.size=l.size);break;default:u=typeof l.is=="string"?b.createElement(c,{is:l.is}):b.createElement(c)}}u[ot]=t,u[wt]=l;e:for(b=t.child;b!==null;){if(b.tag===5||b.tag===6)u.appendChild(b.stateNode);else if(b.tag!==4&&b.tag!==27&&b.child!==null){b.child.return=b,b=b.child;continue}if(b===t)break e;for(;b.sibling===null;){if(b.return===null||b.return===t)break e;b=b.return}b.sibling.return=b.return,b=b.sibling}t.stateNode=u;e:switch(Dt(u,c,l),c){case"button":case"input":case"select":case"textarea":l=!!l.autoFocus;break e;case"img":l=!0;break e;default:l=!1}l&&Zn(t)}}return et(t),su(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,a),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==l&&Zn(t);else{if(typeof l!="string"&&t.stateNode===null)throw Error(o(166));if(e=re.current,qs(t)){if(e=t.stateNode,a=t.memoizedProps,l=null,c=Rt,c!==null)switch(c.tag){case 27:case 5:l=c.memoizedProps}e[ot]=t,e=!!(e.nodeValue===a||l!==null&&l.suppressHydrationWarning===!0||Lp(e.nodeValue,a)),e||pa(t,!0)}else e=qr(e).createTextNode(l),e[ot]=t,t.stateNode=e}return et(t),null;case 31:if(a=t.memoizedState,e===null||e.memoizedState!==null){if(l=qs(t),a!==null){if(e===null){if(!l)throw Error(o(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(o(557));e[ot]=t}else Xa(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;et(t),e=!1}else a=hc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),e=!0;if(!e)return t.flags&256?(Zt(t),t):(Zt(t),null);if((t.flags&128)!==0)throw Error(o(558))}return et(t),null;case 13:if(l=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(c=qs(t),l!==null&&l.dehydrated!==null){if(e===null){if(!c)throw Error(o(318));if(c=t.memoizedState,c=c!==null?c.dehydrated:null,!c)throw Error(o(317));c[ot]=t}else Xa(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;et(t),c=!1}else c=hc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=c),c=!0;if(!c)return t.flags&256?(Zt(t),t):(Zt(t),null)}return Zt(t),(t.flags&128)!==0?(t.lanes=a,t):(a=l!==null,e=e!==null&&e.memoizedState!==null,a&&(l=t.child,c=null,l.alternate!==null&&l.alternate.memoizedState!==null&&l.alternate.memoizedState.cachePool!==null&&(c=l.alternate.memoizedState.cachePool.pool),u=null,l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(u=l.memoizedState.cachePool.pool),u!==c&&(l.flags|=2048)),a!==e&&a&&(t.child.flags|=8192),xr(t,t.updateQueue),et(t),null);case 4:return be(),e===null&&Cu(t.stateNode.containerInfo),et(t),null;case 10:return Fn(t.type),et(t),null;case 19:if($(xt),l=t.memoizedState,l===null)return et(t),null;if(c=(t.flags&128)!==0,u=l.rendering,u===null)if(c)Vl(l,!1);else{if(mt!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(u=ar(e),u!==null){for(t.flags|=128,Vl(l,!1),e=u.updateQueue,t.updateQueue=e,xr(t,e),t.subtreeFlags=0,e=a,a=t.child;a!==null;)pm(a,e),a=a.sibling;return ee(xt,xt.current&1|2),De&&Gn(t,l.treeForkCount),t.child}e=e.sibling}l.tail!==null&&Ve()>Sr&&(t.flags|=128,c=!0,Vl(l,!1),t.lanes=4194304)}else{if(!c)if(e=ar(u),e!==null){if(t.flags|=128,c=!0,e=e.updateQueue,t.updateQueue=e,xr(t,e),Vl(l,!0),l.tail===null&&l.tailMode==="hidden"&&!u.alternate&&!De)return et(t),null}else 2*Ve()-l.renderingStartTime>Sr&&a!==536870912&&(t.flags|=128,c=!0,Vl(l,!1),t.lanes=4194304);l.isBackwards?(u.sibling=t.child,t.child=u):(e=l.last,e!==null?e.sibling=u:t.child=u,l.last=u)}return l.tail!==null?(e=l.tail,l.rendering=e,l.tail=e.sibling,l.renderingStartTime=Ve(),e.sibling=null,a=xt.current,ee(xt,c?a&1|2:a&1),De&&Gn(t,l.treeForkCount),e):(et(t),null);case 22:case 23:return Zt(t),Ec(),l=t.memoizedState!==null,e!==null?e.memoizedState!==null!==l&&(t.flags|=8192):l&&(t.flags|=8192),l?(a&536870912)!==0&&(t.flags&128)===0&&(et(t),t.subtreeFlags&6&&(t.flags|=8192)):et(t),a=t.updateQueue,a!==null&&xr(t,a.retryQueue),a=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(a=e.memoizedState.cachePool.pool),l=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(l=t.memoizedState.cachePool.pool),l!==a&&(t.flags|=2048),e!==null&&$(Za),null;case 24:return a=null,e!==null&&(a=e.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),Fn(bt),et(t),null;case 25:return null;case 30:return null}throw Error(o(156,t.tag))}function xb(e,t){switch(dc(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Fn(bt),be(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Be(t),null;case 31:if(t.memoizedState!==null){if(Zt(t),t.alternate===null)throw Error(o(340));Xa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Zt(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(o(340));Xa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return $(xt),null;case 4:return be(),null;case 10:return Fn(t.type),null;case 22:case 23:return Zt(t),Ec(),e!==null&&$(Za),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Fn(bt),null;case 25:return null;default:return null}}function $h(e,t){switch(dc(t),t.tag){case 3:Fn(bt),be();break;case 26:case 27:case 5:Be(t);break;case 4:be();break;case 31:t.memoizedState!==null&&Zt(t);break;case 13:Zt(t);break;case 19:$(xt);break;case 10:Fn(t.type);break;case 22:case 23:Zt(t),Ec(),e!==null&&$(Za);break;case 24:Fn(bt)}}function $l(e,t){try{var a=t.updateQueue,l=a!==null?a.lastEffect:null;if(l!==null){var c=l.next;a=c;do{if((a.tag&e)===e){l=void 0;var u=a.create,b=a.inst;l=u(),b.destroy=l}a=a.next}while(a!==c)}}catch(A){Ye(t,t.return,A)}}function ja(e,t,a){try{var l=t.updateQueue,c=l!==null?l.lastEffect:null;if(c!==null){var u=c.next;l=u;do{if((l.tag&e)===e){var b=l.inst,A=b.destroy;if(A!==void 0){b.destroy=void 0,c=t;var D=a,X=A;try{X()}catch(J){Ye(c,D,J)}}}l=l.next}while(l!==u)}}catch(J){Ye(t,t.return,J)}}function Gh(e){var t=e.updateQueue;if(t!==null){var a=e.stateNode;try{Dm(t,a)}catch(l){Ye(e,e.return,l)}}}function Yh(e,t,a){a.props=es(e.type,e.memoizedProps),a.state=e.memoizedState;try{a.componentWillUnmount()}catch(l){Ye(e,t,l)}}function Gl(e,t){try{var a=e.ref;if(a!==null){switch(e.tag){case 26:case 27:case 5:var l=e.stateNode;break;case 30:l=e.stateNode;break;default:l=e.stateNode}typeof a=="function"?e.refCleanup=a(l):a.current=l}}catch(c){Ye(e,t,c)}}function Mn(e,t){var a=e.ref,l=e.refCleanup;if(a!==null)if(typeof l=="function")try{l()}catch(c){Ye(e,t,c)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(c){Ye(e,t,c)}else a.current=null}function Fh(e){var t=e.type,a=e.memoizedProps,l=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":a.autoFocus&&l.focus();break e;case"img":a.src?l.src=a.src:a.srcSet&&(l.srcset=a.srcSet)}}catch(c){Ye(e,e.return,c)}}function lu(e,t,a){try{var l=e.stateNode;zb(l,e.type,a,t),l[wt]=t}catch(c){Ye(e,e.return,c)}}function Xh(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Ma(e.type)||e.tag===4}function iu(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Xh(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Ma(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function ru(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(e,t):(t=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,t.appendChild(e),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=Hn));else if(l!==4&&(l===27&&Ma(e.type)&&(a=e.stateNode,t=null),e=e.child,e!==null))for(ru(e,t,a),e=e.sibling;e!==null;)ru(e,t,a),e=e.sibling}function gr(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?a.insertBefore(e,t):a.appendChild(e);else if(l!==4&&(l===27&&Ma(e.type)&&(a=e.stateNode),e=e.child,e!==null))for(gr(e,t,a),e=e.sibling;e!==null;)gr(e,t,a),e=e.sibling}function Qh(e){var t=e.stateNode,a=e.memoizedProps;try{for(var l=e.type,c=t.attributes;c.length;)t.removeAttributeNode(c[0]);Dt(t,l,a),t[ot]=e,t[wt]=a}catch(u){Ye(e,e.return,u)}}var In=!1,jt=!1,ou=!1,Kh=typeof WeakSet=="function"?WeakSet:Set,kt=null;function gb(e,t){if(e=e.containerInfo,Mu=zr,e=im(e),tc(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var l=a.getSelection&&a.getSelection();if(l&&l.rangeCount!==0){a=l.anchorNode;var c=l.anchorOffset,u=l.focusNode;l=l.focusOffset;try{a.nodeType,u.nodeType}catch{a=null;break e}var b=0,A=-1,D=-1,X=0,J=0,ne=e,Q=null;t:for(;;){for(var Z;ne!==a||c!==0&&ne.nodeType!==3||(A=b+c),ne!==u||l!==0&&ne.nodeType!==3||(D=b+l),ne.nodeType===3&&(b+=ne.nodeValue.length),(Z=ne.firstChild)!==null;)Q=ne,ne=Z;for(;;){if(ne===e)break t;if(Q===a&&++X===c&&(A=b),Q===u&&++J===l&&(D=b),(Z=ne.nextSibling)!==null)break;ne=Q,Q=ne.parentNode}ne=Z}a=A===-1||D===-1?null:{start:A,end:D}}else a=null}a=a||{start:0,end:0}}else a=null;for(Ru={focusedElem:e,selectionRange:a},zr=!1,kt=t;kt!==null;)if(t=kt,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,kt=e;else for(;kt!==null;){switch(t=kt,u=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(a=0;a title"))),Dt(u,l,a),u[ot]=e,Et(u),l=u;break e;case"link":var b=e0("link","href",c).get(l+(a.href||""));if(b){for(var A=0;AKe&&(b=Ke,Ke=je,je=b);var L=sm(A,je),B=sm(A,Ke);if(L&&B&&(Z.rangeCount!==1||Z.anchorNode!==L.node||Z.anchorOffset!==L.offset||Z.focusNode!==B.node||Z.focusOffset!==B.offset)){var F=ne.createRange();F.setStart(L.node,L.offset),Z.removeAllRanges(),je>Ke?(Z.addRange(F),Z.extend(B.node,B.offset)):(F.setEnd(B.node,B.offset),Z.addRange(F))}}}}for(ne=[],Z=A;Z=Z.parentNode;)Z.nodeType===1&&ne.push({element:Z,left:Z.scrollLeft,top:Z.scrollTop});for(typeof A.focus=="function"&&A.focus(),A=0;Aa?32:a,T.T=null,a=pu,pu=null;var u=Ca,b=ta;if(Ct=0,Fs=Ca=null,ta=0,(Ue&6)!==0)throw Error(o(331));var A=Ue;if(Ue|=4,lp(u.current),np(u,u.current,b,a),Ue=A,Zl(0,!1),Nt&&typeof Nt.onPostCommitFiberRoot=="function")try{Nt.onPostCommitFiberRoot(Bn,u)}catch{}return!0}finally{G.p=c,T.T=l,Ap(e,t)}}function wp(e,t,a){t=on(a,t),t=Kc(e.stateNode,t,2),e=ba(e,t,2),e!==null&&(Ua(e,2),Rn(e))}function Ye(e,t,a){if(e.tag===3)wp(e,e,a);else for(;t!==null;){if(t.tag===3){wp(t,e,a);break}else if(t.tag===1){var l=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof l.componentDidCatch=="function"&&(wa===null||!wa.has(l))){e=on(a,e),a=Ch(2),l=ba(t,a,2),l!==null&&(Eh(a,l,t,e),Ua(l,2),Rn(l));break}}t=t.return}}function bu(e,t,a){var l=e.pingCache;if(l===null){l=e.pingCache=new yb;var c=new Set;l.set(t,c)}else c=l.get(t),c===void 0&&(c=new Set,l.set(t,c));c.has(a)||(fu=!0,c.add(a),e=wb.bind(null,e,t,a),t.then(e,e))}function wb(e,t,a){var l=e.pingCache;l!==null&&l.delete(t),e.pingedLanes|=e.suspendedLanes&a,e.warmLanes&=~a,Ie===e&&(qe&a)===a&&(mt===4||mt===3&&(qe&62914560)===qe&&300>Ve()-yr?(Ue&2)===0&&Xs(e,0):du|=a,Ys===qe&&(Ys=0)),Rn(e)}function Cp(e,t){t===0&&(t=ml()),e=Ya(e,t),e!==null&&(Ua(e,t),Rn(e))}function Cb(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),Cp(e,a)}function Eb(e,t){var a=0;switch(e.tag){case 31:case 13:var l=e.stateNode,c=e.memoizedState;c!==null&&(a=c.retryLane);break;case 19:l=e.stateNode;break;case 22:l=e.stateNode._retryCache;break;default:throw Error(o(314))}l!==null&&l.delete(t),Cp(e,a)}function kb(e,t){return P(e,t)}var Er=null,Ks=null,yu=!1,kr=!1,Su=!1,ka=0;function Rn(e){e!==Ks&&e.next===null&&(Ks===null?Er=Ks=e:Ks=Ks.next=e),kr=!0,yu||(yu=!0,Rb())}function Zl(e,t){if(!Su&&kr){Su=!0;do for(var a=!1,l=Er;l!==null;){if(e!==0){var c=l.pendingLanes;if(c===0)var u=0;else{var b=l.suspendedLanes,A=l.pingedLanes;u=(1<<31-Mt(42|e)+1)-1,u&=c&~(b&~A),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(a=!0,Rp(l,u))}else u=qe,u=Cn(l,l===Ie?u:0,l.cancelPendingCommit!==null||l.timeoutHandle!==-1),(u&3)===0||Ln(l,u)||(a=!0,Rp(l,u));l=l.next}while(a);Su=!1}}function Mb(){Ep()}function Ep(){kr=yu=!1;var e=0;ka!==0&&Hb()&&(e=ka);for(var t=Ve(),a=null,l=Er;l!==null;){var c=l.next,u=kp(l,t);u===0?(l.next=null,a===null?Er=c:a.next=c,c===null&&(Ks=a)):(a=l,(e!==0||(u&3)!==0)&&(kr=!0)),l=c}Ct!==0&&Ct!==5||Zl(e),ka!==0&&(ka=0)}function kp(e,t){for(var a=e.suspendedLanes,l=e.pingedLanes,c=e.expirationTimes,u=e.pendingLanes&-62914561;0A)break;var J=D.transferSize,ne=D.initiatorType;J&&zp(ne)&&(D=D.responseEnd,b+=J*(D"u"?null:document;function Ip(e,t,a){var l=Zs;if(l&&typeof t=="string"&&t){var c=ln(t);c='link[rel="'+e+'"][href="'+c+'"]',typeof a=="string"&&(c+='[crossorigin="'+a+'"]'),Zp.has(c)||(Zp.add(c),e={rel:e,crossOrigin:a,href:t},l.querySelector(c)===null&&(t=l.createElement("link"),Dt(t,"link",e),Et(t),l.head.appendChild(t)))}}function Zb(e){na.D(e),Ip("dns-prefetch",e,null)}function Ib(e,t){na.C(e,t),Ip("preconnect",e,t)}function Jb(e,t,a){na.L(e,t,a);var l=Zs;if(l&&e&&t){var c='link[rel="preload"][as="'+ln(t)+'"]';t==="image"&&a&&a.imageSrcSet?(c+='[imagesrcset="'+ln(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(c+='[imagesizes="'+ln(a.imageSizes)+'"]')):c+='[href="'+ln(e)+'"]';var u=c;switch(t){case"style":u=Is(e);break;case"script":u=Js(e)}hn.has(u)||(e=y({rel:"preload",href:t==="image"&&a&&a.imageSrcSet?void 0:e,as:t},a),hn.set(u,e),l.querySelector(c)!==null||t==="style"&&l.querySelector(Wl(u))||t==="script"&&l.querySelector(ei(u))||(t=l.createElement("link"),Dt(t,"link",e),Et(t),l.head.appendChild(t)))}}function Pb(e,t){na.m(e,t);var a=Zs;if(a&&e){var l=t&&typeof t.as=="string"?t.as:"script",c='link[rel="modulepreload"][as="'+ln(l)+'"][href="'+ln(e)+'"]',u=c;switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=Js(e)}if(!hn.has(u)&&(e=y({rel:"modulepreload",href:e},t),hn.set(u,e),a.querySelector(c)===null)){switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(ei(u)))return}l=a.createElement("link"),Dt(l,"link",e),Et(l),a.head.appendChild(l)}}}function Wb(e,t,a){na.S(e,t,a);var l=Zs;if(l&&e){var c=vs(l).hoistableStyles,u=Is(e);t=t||"default";var b=c.get(u);if(!b){var A={loading:0,preload:null};if(b=l.querySelector(Wl(u)))A.loading=5;else{e=y({rel:"stylesheet",href:e,"data-precedence":t},a),(a=hn.get(u))&&Lu(e,a);var D=b=l.createElement("link");Et(D),Dt(D,"link",e),D._p=new Promise(function(X,J){D.onload=X,D.onerror=J}),D.addEventListener("load",function(){A.loading|=1}),D.addEventListener("error",function(){A.loading|=2}),A.loading|=4,Dr(b,t,l)}b={type:"stylesheet",instance:b,count:1,state:A},c.set(u,b)}}}function ey(e,t){na.X(e,t);var a=Zs;if(a&&e){var l=vs(a).hoistableScripts,c=Js(e),u=l.get(c);u||(u=a.querySelector(ei(c)),u||(e=y({src:e,async:!0},t),(t=hn.get(c))&&zu(e,t),u=a.createElement("script"),Et(u),Dt(u,"link",e),a.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},l.set(c,u))}}function ty(e,t){na.M(e,t);var a=Zs;if(a&&e){var l=vs(a).hoistableScripts,c=Js(e),u=l.get(c);u||(u=a.querySelector(ei(c)),u||(e=y({src:e,async:!0,type:"module"},t),(t=hn.get(c))&&zu(e,t),u=a.createElement("script"),Et(u),Dt(u,"link",e),a.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},l.set(c,u))}}function Jp(e,t,a,l){var c=(c=re.current)?Tr(c):null;if(!c)throw Error(o(446));switch(e){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(t=Is(a.href),a=vs(c).hoistableStyles,l=a.get(t),l||(l={type:"style",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){e=Is(a.href);var u=vs(c).hoistableStyles,b=u.get(e);if(b||(c=c.ownerDocument||c,b={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(e,b),(u=c.querySelector(Wl(e)))&&!u._p&&(b.instance=u,b.state.loading=5),hn.has(e)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},hn.set(e,a),u||ny(c,e,a,b.state))),t&&l===null)throw Error(o(528,""));return b}if(t&&l!==null)throw Error(o(529,""));return null;case"script":return t=a.async,a=a.src,typeof a=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Js(a),a=vs(c).hoistableScripts,l=a.get(t),l||(l={type:"script",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};default:throw Error(o(444,e))}}function Is(e){return'href="'+ln(e)+'"'}function Wl(e){return'link[rel="stylesheet"]['+e+"]"}function Pp(e){return y({},e,{"data-precedence":e.precedence,precedence:null})}function ny(e,t,a,l){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?l.loading=1:(t=e.createElement("link"),l.preload=t,t.addEventListener("load",function(){return l.loading|=1}),t.addEventListener("error",function(){return l.loading|=2}),Dt(t,"link",a),Et(t),e.head.appendChild(t))}function Js(e){return'[src="'+ln(e)+'"]'}function ei(e){return"script[async]"+e}function Wp(e,t,a){if(t.count++,t.instance===null)switch(t.type){case"style":var l=e.querySelector('style[data-href~="'+ln(a.href)+'"]');if(l)return t.instance=l,Et(l),l;var c=y({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return l=(e.ownerDocument||e).createElement("style"),Et(l),Dt(l,"style",c),Dr(l,a.precedence,e),t.instance=l;case"stylesheet":c=Is(a.href);var u=e.querySelector(Wl(c));if(u)return t.state.loading|=4,t.instance=u,Et(u),u;l=Pp(a),(c=hn.get(c))&&Lu(l,c),u=(e.ownerDocument||e).createElement("link"),Et(u);var b=u;return b._p=new Promise(function(A,D){b.onload=A,b.onerror=D}),Dt(u,"link",l),t.state.loading|=4,Dr(u,a.precedence,e),t.instance=u;case"script":return u=Js(a.src),(c=e.querySelector(ei(u)))?(t.instance=c,Et(c),c):(l=a,(c=hn.get(u))&&(l=y({},a),zu(l,c)),e=e.ownerDocument||e,c=e.createElement("script"),Et(c),Dt(c,"link",l),e.head.appendChild(c),t.instance=c);case"void":return null;default:throw Error(o(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(l=t.instance,t.state.loading|=4,Dr(l,a.precedence,e));return t.instance}function Dr(e,t,a){for(var l=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),c=l.length?l[l.length-1]:null,u=c,b=0;b title"):null)}function ay(e,t,a){if(a===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function n0(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function sy(e,t,a,l){if(a.type==="stylesheet"&&(typeof l.media!="string"||matchMedia(l.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var c=Is(l.href),u=t.querySelector(Wl(c));if(u){t=u._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=Br.bind(e),t.then(e,e)),a.state.loading|=4,a.instance=u,Et(u);return}u=t.ownerDocument||t,l=Pp(l),(c=hn.get(c))&&Lu(l,c),u=u.createElement("link"),Et(u);var b=u;b._p=new Promise(function(A,D){b.onload=A,b.onerror=D}),Dt(u,"link",l),a.instance=u}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(a,t),(t=a.state.preload)&&(a.state.loading&3)===0&&(e.count++,a=Br.bind(e),t.addEventListener("load",a),t.addEventListener("error",a))}}var Uu=0;function ly(e,t){return e.stylesheets&&e.count===0&&Lr(e,e.stylesheets),0Uu?50:800)+t);return e.unsuspend=a,function(){e.unsuspend=null,clearTimeout(l),clearTimeout(c)}}:null}function Br(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Lr(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Or=null;function Lr(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Or=new Map,t.forEach(iy,e),Or=null,Br.call(e))}function iy(e,t){if(!(t.state.loading&4)){var a=Or.get(e);if(a)var l=a.get(null);else{a=new Map,Or.set(e,a);for(var c=e.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(s){console.error(s)}}return n(),Ku.exports=Ay(),Ku.exports}var wy=Ny();var C0="popstate";function Cy(n={}){function s(o,f){let{pathname:d,search:h,hash:p}=o.location;return Nf("",{pathname:d,search:h,hash:p},f.state&&f.state.usr||null,f.state&&f.state.key||"default")}function i(o,f){return typeof f=="string"?f:bi(f)}return ky(s,i,null,n)}function ut(n,s){if(n===!1||n===null||typeof n>"u")throw new Error(s)}function Nn(n,s){if(!n){typeof console<"u"&&console.warn(s);try{throw new Error(s)}catch{}}}function Ey(){return Math.random().toString(36).substring(2,10)}function E0(n,s){return{usr:n.state,key:n.key,idx:s}}function Nf(n,s,i=null,o){return{pathname:typeof n=="string"?n:n.pathname,search:"",hash:"",...typeof s=="string"?cl(s):s,state:i,key:s&&s.key||o||Ey()}}function bi({pathname:n="/",search:s="",hash:i=""}){return s&&s!=="?"&&(n+=s.charAt(0)==="?"?s:"?"+s),i&&i!=="#"&&(n+=i.charAt(0)==="#"?i:"#"+i),n}function cl(n){let s={};if(n){let i=n.indexOf("#");i>=0&&(s.hash=n.substring(i),n=n.substring(0,i));let o=n.indexOf("?");o>=0&&(s.search=n.substring(o),n=n.substring(0,o)),n&&(s.pathname=n)}return s}function ky(n,s,i,o={}){let{window:f=document.defaultView,v5Compat:d=!1}=o,h=f.history,p="POP",x=null,g=v();g==null&&(g=0,h.replaceState({...h.state,idx:g},""));function v(){return(h.state||{idx:null}).idx}function y(){p="POP";let w=v(),j=w==null?null:w-g;g=w,x&&x({action:p,location:k.location,delta:j})}function S(w,j){p="PUSH";let N=Nf(k.location,w,j);g=v()+1;let q=E0(N,g),M=k.createHref(N);try{h.pushState(q,"",M)}catch(O){if(O instanceof DOMException&&O.name==="DataCloneError")throw O;f.location.assign(M)}d&&x&&x({action:p,location:k.location,delta:1})}function E(w,j){p="REPLACE";let N=Nf(k.location,w,j);g=v();let q=E0(N,g),M=k.createHref(N);h.replaceState(q,"",M),d&&x&&x({action:p,location:k.location,delta:0})}function C(w){return My(w)}let k={get action(){return p},get location(){return n(f,h)},listen(w){if(x)throw new Error("A history only accepts one active listener");return f.addEventListener(C0,y),x=w,()=>{f.removeEventListener(C0,y),x=null}},createHref(w){return s(f,w)},createURL:C,encodeLocation(w){let j=C(w);return{pathname:j.pathname,search:j.search,hash:j.hash}},push:S,replace:E,go(w){return h.go(w)}};return k}function My(n,s=!1){let i="http://localhost";typeof window<"u"&&(i=window.location.origin!=="null"?window.location.origin:window.location.href),ut(i,"No window.location.(origin|href) available to create URL");let o=typeof n=="string"?n:bi(n);return o=o.replace(/ $/,"%20"),!s&&o.startsWith("//")&&(o=i+o),new URL(o,i)}function Rx(n,s,i="/"){return Ry(n,s,i,!1)}function Ry(n,s,i,o){let f=typeof s=="string"?cl(s):s,d=oa(f.pathname||"/",i);if(d==null)return null;let h=qx(n);qy(h);let p=null;for(let x=0;p==null&&x{let v={relativePath:g===void 0?h.path||"":g,caseSensitive:h.caseSensitive===!0,childrenIndex:p,route:h};if(v.relativePath.startsWith("/")){if(!v.relativePath.startsWith(o)&&x)return;ut(v.relativePath.startsWith(o),`Absolute route path "${v.relativePath}" nested under path "${o}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),v.relativePath=v.relativePath.slice(o.length)}let y=ra([o,v.relativePath]),S=i.concat(v);h.children&&h.children.length>0&&(ut(h.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${y}".`),qx(h.children,s,S,y,x)),!(h.path==null&&!h.index)&&s.push({path:y,score:zy(y,h.index),routesMeta:S})};return n.forEach((h,p)=>{if(h.path===""||!h.path?.includes("?"))d(h,p);else for(let x of Tx(h.path))d(h,p,!0,x)}),s}function Tx(n){let s=n.split("/");if(s.length===0)return[];let[i,...o]=s,f=i.endsWith("?"),d=i.replace(/\?$/,"");if(o.length===0)return f?[d,""]:[d];let h=Tx(o.join("/")),p=[];return p.push(...h.map(x=>x===""?d:[d,x].join("/"))),f&&p.push(...h),p.map(x=>n.startsWith("/")&&x===""?"/":x)}function qy(n){n.sort((s,i)=>s.score!==i.score?i.score-s.score:Uy(s.routesMeta.map(o=>o.childrenIndex),i.routesMeta.map(o=>o.childrenIndex)))}var Ty=/^:[\w-]+$/,Dy=3,_y=2,By=1,Oy=10,Ly=-2,k0=n=>n==="*";function zy(n,s){let i=n.split("/"),o=i.length;return i.some(k0)&&(o+=Ly),s&&(o+=_y),i.filter(f=>!k0(f)).reduce((f,d)=>f+(Ty.test(d)?Dy:d===""?By:Oy),o)}function Uy(n,s){return n.length===s.length&&n.slice(0,-1).every((o,f)=>o===s[f])?n[n.length-1]-s[s.length-1]:0}function Hy(n,s,i=!1){let{routesMeta:o}=n,f={},d="/",h=[];for(let p=0;p{if(v==="*"){let C=p[S]||"";h=d.slice(0,d.length-C.length).replace(/(.)\/+$/,"$1")}const E=p[S];return y&&!E?g[v]=void 0:g[v]=(E||"").replace(/%2F/g,"/"),g},{}),pathname:d,pathnameBase:h,pattern:n}}function Vy(n,s=!1,i=!0){Nn(n==="*"||!n.endsWith("*")||n.endsWith("/*"),`Route path "${n}" will be treated as if it were "${n.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${n.replace(/\*$/,"/*")}".`);let o=[],f="^"+n.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(h,p,x)=>(o.push({paramName:p,isOptional:x!=null}),x?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return n.endsWith("*")?(o.push({paramName:"*"}),f+=n==="*"||n==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):i?f+="\\/*$":n!==""&&n!=="/"&&(f+="(?:(?=\\/|$))"),[new RegExp(f,s?void 0:"i"),o]}function $y(n){try{return n.split("/").map(s=>decodeURIComponent(s).replace(/\//g,"%2F")).join("/")}catch(s){return Nn(!1,`The URL path "${n}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${s}).`),n}}function oa(n,s){if(s==="/")return n;if(!n.toLowerCase().startsWith(s.toLowerCase()))return null;let i=s.endsWith("/")?s.length-1:s.length,o=n.charAt(i);return o&&o!=="/"?null:n.slice(i)||"/"}var Gy=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Yy=n=>Gy.test(n);function Fy(n,s="/"){let{pathname:i,search:o="",hash:f=""}=typeof n=="string"?cl(n):n,d;if(i)if(Yy(i))d=i;else{if(i.includes("//")){let h=i;i=i.replace(/\/\/+/g,"/"),Nn(!1,`Pathnames cannot have embedded double slashes - normalizing ${h} -> ${i}`)}i.startsWith("/")?d=M0(i.substring(1),"/"):d=M0(i,s)}else d=s;return{pathname:d,search:Ky(o),hash:Zy(f)}}function M0(n,s){let i=s.replace(/\/+$/,"").split("/");return n.split("/").forEach(f=>{f===".."?i.length>1&&i.pop():f!=="."&&i.push(f)}),i.length>1?i.join("/"):"/"}function Pu(n,s,i,o){return`Cannot include a '${n}' character in a manually specified \`to.${s}\` field [${JSON.stringify(o)}]. Please separate it out to the \`to.${i}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function Xy(n){return n.filter((s,i)=>i===0||s.route.path&&s.route.path.length>0)}function Dx(n){let s=Xy(n);return s.map((i,o)=>o===s.length-1?i.pathname:i.pathnameBase)}function _x(n,s,i,o=!1){let f;typeof n=="string"?f=cl(n):(f={...n},ut(!f.pathname||!f.pathname.includes("?"),Pu("?","pathname","search",f)),ut(!f.pathname||!f.pathname.includes("#"),Pu("#","pathname","hash",f)),ut(!f.search||!f.search.includes("#"),Pu("#","search","hash",f)));let d=n===""||f.pathname==="",h=d?"/":f.pathname,p;if(h==null)p=i;else{let y=s.length-1;if(!o&&h.startsWith("..")){let S=h.split("/");for(;S[0]==="..";)S.shift(),y-=1;f.pathname=S.join("/")}p=y>=0?s[y]:"/"}let x=Fy(f,p),g=h&&h!=="/"&&h.endsWith("/"),v=(d||h===".")&&i.endsWith("/");return!x.pathname.endsWith("/")&&(g||v)&&(x.pathname+="/"),x}var ra=n=>n.join("/").replace(/\/\/+/g,"/"),Qy=n=>n.replace(/\/+$/,"").replace(/^\/*/,"/"),Ky=n=>!n||n==="?"?"":n.startsWith("?")?n:"?"+n,Zy=n=>!n||n==="#"?"":n.startsWith("#")?n:"#"+n;function Iy(n){return n!=null&&typeof n.status=="number"&&typeof n.statusText=="string"&&typeof n.internal=="boolean"&&"data"in n}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var Bx=["POST","PUT","PATCH","DELETE"];new Set(Bx);var Jy=["GET",...Bx];new Set(Jy);var ul=m.createContext(null);ul.displayName="DataRouter";var No=m.createContext(null);No.displayName="DataRouterState";m.createContext(!1);var Ox=m.createContext({isTransitioning:!1});Ox.displayName="ViewTransition";var Py=m.createContext(new Map);Py.displayName="Fetchers";var Wy=m.createContext(null);Wy.displayName="Await";var _n=m.createContext(null);_n.displayName="Navigation";var ki=m.createContext(null);ki.displayName="Location";var ua=m.createContext({outlet:null,matches:[],isDataRoute:!1});ua.displayName="Route";var Yf=m.createContext(null);Yf.displayName="RouteError";function e1(n,{relative:s}={}){ut(Mi(),"useHref() may be used only in the context of a component.");let{basename:i,navigator:o}=m.useContext(_n),{hash:f,pathname:d,search:h}=Ri(n,{relative:s}),p=d;return i!=="/"&&(p=d==="/"?i:ra([i,d])),o.createHref({pathname:p,search:h,hash:f})}function Mi(){return m.useContext(ki)!=null}function fs(){return ut(Mi(),"useLocation() may be used only in the context of a component."),m.useContext(ki).location}var Lx="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function zx(n){m.useContext(_n).static||m.useLayoutEffect(n)}function t1(){let{isDataRoute:n}=m.useContext(ua);return n?h1():n1()}function n1(){ut(Mi(),"useNavigate() may be used only in the context of a component.");let n=m.useContext(ul),{basename:s,navigator:i}=m.useContext(_n),{matches:o}=m.useContext(ua),{pathname:f}=fs(),d=JSON.stringify(Dx(o)),h=m.useRef(!1);return zx(()=>{h.current=!0}),m.useCallback((x,g={})=>{if(Nn(h.current,Lx),!h.current)return;if(typeof x=="number"){i.go(x);return}let v=_x(x,JSON.parse(d),f,g.relative==="path");n==null&&s!=="/"&&(v.pathname=v.pathname==="/"?s:ra([s,v.pathname])),(g.replace?i.replace:i.push)(v,g.state,g)},[s,i,d,f,n])}m.createContext(null);function Ri(n,{relative:s}={}){let{matches:i}=m.useContext(ua),{pathname:o}=fs(),f=JSON.stringify(Dx(i));return m.useMemo(()=>_x(n,JSON.parse(f),o,s==="path"),[n,f,o,s])}function a1(n,s){return Ux(n,s)}function Ux(n,s,i,o,f){ut(Mi(),"useRoutes() may be used only in the context of a component.");let{navigator:d}=m.useContext(_n),{matches:h}=m.useContext(ua),p=h[h.length-1],x=p?p.params:{},g=p?p.pathname:"/",v=p?p.pathnameBase:"/",y=p&&p.route;{let N=y&&y.path||"";Hx(g,!y||N.endsWith("*")||N.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${g}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. +`+l.stack}}var se=Object.prototype.hasOwnProperty,P=n.unstable_scheduleCallback,fe=n.unstable_cancelCallback,Ne=n.unstable_shouldYield,pt=n.unstable_requestPaint,Ve=n.unstable_now,st=n.unstable_getCurrentPriorityLevel,lt=n.unstable_ImmediatePriority,Ot=n.unstable_UserBlockingPriority,it=n.unstable_NormalPriority,ds=n.unstable_LowPriority,Yt=n.unstable_IdlePriority,La=n.log,Bo=n.unstable_setDisableYieldValue,Bn=null,Nt=null;function Ft(e){if(typeof La=="function"&&Bo(e),Nt&&typeof Nt.setStrictMode=="function")try{Nt.setStrictMode(Bn,e)}catch{}}var Mt=Math.clz32?Math.clz32:ms,fa=Math.log,Oo=Math.LN2;function ms(e){return e>>>=0,e===0?32:31-(fa(e)/Oo|0)|0}var hs=256,za=262144,Pe=4194304;function On(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Cn(e,t,a){var l=e.pendingLanes;if(l===0)return 0;var c=0,u=e.suspendedLanes,b=e.pingedLanes;e=e.warmLanes;var A=l&134217727;return A!==0?(l=A&~u,l!==0?c=On(l):(b&=A,b!==0?c=On(b):a||(a=A&~e,a!==0&&(c=On(a))))):(A=l&~u,A!==0?c=On(A):b!==0?c=On(b):a||(a=l&~e,a!==0&&(c=On(a)))),c===0?0:t!==0&&t!==c&&(t&u)===0&&(u=c&-c,a=t&-t,u>=a||u===32&&(a&4194048)!==0)?t:c}function Ln(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function ps(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function ml(){var e=Pe;return Pe<<=1,(Pe&62914560)===0&&(Pe=4194304),e}function hl(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function Ua(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Lo(e,t,a,l,c,u){var b=e.pendingLanes;e.pendingLanes=a,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=a,e.entangledLanes&=a,e.errorRecoveryDisabledLanes&=a,e.shellSuspendCounter=0;var A=e.entanglements,D=e.expirationTimes,X=e.hiddenUpdates;for(a=b&~a;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var cv=/[\n"\\]/g;function ln(e){return e.replace(cv,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function Ho(e,t,a,l,c,u,b,A){e.name="",b!=null&&typeof b!="function"&&typeof b!="symbol"&&typeof b!="boolean"?e.type=b:e.removeAttribute("type"),t!=null?b==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+sn(t)):e.value!==""+sn(t)&&(e.value=""+sn(t)):b!=="submit"&&b!=="reset"||e.removeAttribute("value"),t!=null?Vo(e,b,sn(t)):a!=null?Vo(e,b,sn(a)):l!=null&&e.removeAttribute("value"),c==null&&u!=null&&(e.defaultChecked=!!u),c!=null&&(e.checked=c&&typeof c!="function"&&typeof c!="symbol"),A!=null&&typeof A!="function"&&typeof A!="symbol"&&typeof A!="boolean"?e.name=""+sn(A):e.removeAttribute("name")}function Dd(e,t,a,l,c,u,b,A){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(e.type=u),t!=null||a!=null){if(!(u!=="submit"&&u!=="reset"||t!=null)){Uo(e);return}a=a!=null?""+sn(a):"",t=t!=null?""+sn(t):a,A||t===e.value||(e.value=t),e.defaultValue=t}l=l??c,l=typeof l!="function"&&typeof l!="symbol"&&!!l,e.checked=A?e.checked:!!l,e.defaultChecked=!!l,b!=null&&typeof b!="function"&&typeof b!="symbol"&&typeof b!="boolean"&&(e.name=b),Uo(e)}function Vo(e,t,a){t==="number"&&Bi(e.ownerDocument)===e||e.defaultValue===""+a||(e.defaultValue=""+a)}function ys(e,t,a,l){if(e=e.options,t){t={};for(var c=0;c"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Xo=!1;if(Vn)try{var bl={};Object.defineProperty(bl,"passive",{get:function(){Xo=!0}}),window.addEventListener("test",bl,bl),window.removeEventListener("test",bl,bl)}catch{Xo=!1}var da=null,Qo=null,Li=null;function Hd(){if(Li)return Li;var e,t=Qo,a=t.length,l,c="value"in da?da.value:da.textContent,u=c.length;for(e=0;e=jl),Xd=" ",Qd=!1;function Kd(e,t){switch(e){case"keyup":return Lv.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Zd(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Ns=!1;function Uv(e,t){switch(e){case"compositionend":return Zd(t);case"keypress":return t.which!==32?null:(Qd=!0,Xd);case"textInput":return e=t.data,e===Xd&&Qd?null:e;default:return null}}function Hv(e,t){if(Ns)return e==="compositionend"||!Po&&Kd(e,t)?(e=Hd(),Li=Qo=da=null,Ns=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:a,offset:t-e};e=l}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=am(a)}}function lm(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?lm(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function im(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Bi(e.document);t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=Bi(e.document)}return t}function tc(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var Kv=Vn&&"documentMode"in document&&11>=document.documentMode,ws=null,nc=null,Cl=null,ac=!1;function rm(e,t,a){var l=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;ac||ws==null||ws!==Bi(l)||(l=ws,"selectionStart"in l&&tc(l)?l={start:l.selectionStart,end:l.selectionEnd}:(l=(l.ownerDocument&&l.ownerDocument.defaultView||window).getSelection(),l={anchorNode:l.anchorNode,anchorOffset:l.anchorOffset,focusNode:l.focusNode,focusOffset:l.focusOffset}),Cl&&wl(Cl,l)||(Cl=l,l=Rr(nc,"onSelect"),0>=b,c-=b,En=1<<32-Mt(t)+c|a<Ee?(Te=ge,ge=null):Te=ge.sibling;var Le=Q(L,ge,F[Ee],ee);if(Le===null){ge===null&&(ge=Te);break}e&&ge&&Le.alternate===null&&t(L,ge),B=u(Le,B,Ee),Oe===null?Se=Le:Oe.sibling=Le,Oe=Le,ge=Te}if(Ee===F.length)return a(L,ge),De&&Gn(L,Ee),Se;if(ge===null){for(;EeEe?(Te=ge,ge=null):Te=ge.sibling;var _a=Q(L,ge,Le.value,ee);if(_a===null){ge===null&&(ge=Te);break}e&&ge&&_a.alternate===null&&t(L,ge),B=u(_a,B,Ee),Oe===null?Se=_a:Oe.sibling=_a,Oe=_a,ge=Te}if(Le.done)return a(L,ge),De&&Gn(L,Ee),Se;if(ge===null){for(;!Le.done;Ee++,Le=F.next())Le=ne(L,Le.value,ee),Le!==null&&(B=u(Le,B,Ee),Oe===null?Se=Le:Oe.sibling=Le,Oe=Le);return De&&Gn(L,Ee),Se}for(ge=l(ge);!Le.done;Ee++,Le=F.next())Le=Z(ge,L,Ee,Le.value,ee),Le!==null&&(e&&Le.alternate!==null&&ge.delete(Le.key===null?Ee:Le.key),B=u(Le,B,Ee),Oe===null?Se=Le:Oe.sibling=Le,Oe=Le);return e&&ge.forEach(function(hy){return t(L,hy)}),De&&Gn(L,Ee),Se}function Ke(L,B,F,ee){if(typeof F=="object"&&F!==null&&F.type===k&&F.key===null&&(F=F.props.children),typeof F=="object"&&F!==null){switch(F.$$typeof){case E:e:{for(var Se=F.key;B!==null;){if(B.key===Se){if(Se=F.type,Se===k){if(B.tag===7){a(L,B.sibling),ee=c(B,F.props.children),ee.return=L,L=ee;break e}}else if(B.elementType===Se||typeof Se=="object"&&Se!==null&&Se.$$typeof===H&&Ia(Se)===B.type){a(L,B.sibling),ee=c(B,F.props),Tl(ee,F),ee.return=L,L=ee;break e}a(L,B);break}else t(L,B);B=B.sibling}F.type===k?(ee=Fa(F.props.children,L.mode,ee,F.key),ee.return=L,L=ee):(ee=Qi(F.type,F.key,F.props,null,L.mode,ee),Tl(ee,F),ee.return=L,L=ee)}return b(L);case C:e:{for(Se=F.key;B!==null;){if(B.key===Se)if(B.tag===4&&B.stateNode.containerInfo===F.containerInfo&&B.stateNode.implementation===F.implementation){a(L,B.sibling),ee=c(B,F.children||[]),ee.return=L,L=ee;break e}else{a(L,B);break}else t(L,B);B=B.sibling}ee=uc(F,L.mode,ee),ee.return=L,L=ee}return b(L);case H:return F=Ia(F),Ke(L,B,F,ee)}if($(F))return he(L,B,F,ee);if(W(F)){if(Se=W(F),typeof Se!="function")throw Error(o(150));return F=Se.call(F),je(L,B,F,ee)}if(typeof F.then=="function")return Ke(L,B,er(F),ee);if(F.$$typeof===q)return Ke(L,B,Ii(L,F),ee);tr(L,F)}return typeof F=="string"&&F!==""||typeof F=="number"||typeof F=="bigint"?(F=""+F,B!==null&&B.tag===6?(a(L,B.sibling),ee=c(B,F),ee.return=L,L=ee):(a(L,B),ee=cc(F,L.mode,ee),ee.return=L,L=ee),b(L)):a(L,B)}return function(L,B,F,ee){try{ql=0;var Se=Ke(L,B,F,ee);return Os=null,Se}catch(ge){if(ge===Bs||ge===Pi)throw ge;var Oe=Qt(29,ge,null,L.mode);return Oe.lanes=ee,Oe.return=L,Oe}finally{}}}var Pa=Rm(!0),qm=Rm(!1),ga=!1;function jc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ac(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function va(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function ba(e,t,a){var l=e.updateQueue;if(l===null)return null;if(l=l.shared,(Ue&2)!==0){var c=l.pending;return c===null?t.next=t:(t.next=c.next,c.next=t),l.pending=t,t=Xi(e),hm(e,null,a),t}return Fi(e,l,t,a),Xi(e)}function Dl(e,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194048)!==0)){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,an(e,a)}}function Nc(e,t){var a=e.updateQueue,l=e.alternate;if(l!==null&&(l=l.updateQueue,a===l)){var c=null,u=null;if(a=a.firstBaseUpdate,a!==null){do{var b={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};u===null?c=u=b:u=u.next=b,a=a.next}while(a!==null);u===null?c=u=t:u=u.next=t}else c=u=t;a={baseState:l.baseState,firstBaseUpdate:c,lastBaseUpdate:u,shared:l.shared,callbacks:l.callbacks},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=t:e.next=t,a.lastBaseUpdate=t}var wc=!1;function _l(){if(wc){var e=_s;if(e!==null)throw e}}function Bl(e,t,a,l){wc=!1;var c=e.updateQueue;ga=!1;var u=c.firstBaseUpdate,b=c.lastBaseUpdate,A=c.shared.pending;if(A!==null){c.shared.pending=null;var D=A,X=D.next;D.next=null,b===null?u=X:b.next=X,b=D;var J=e.alternate;J!==null&&(J=J.updateQueue,A=J.lastBaseUpdate,A!==b&&(A===null?J.firstBaseUpdate=X:A.next=X,J.lastBaseUpdate=D))}if(u!==null){var ne=c.baseState;b=0,J=X=D=null,A=u;do{var Q=A.lane&-536870913,Z=Q!==A.lane;if(Z?(qe&Q)===Q:(l&Q)===Q){Q!==0&&Q===Ds&&(wc=!0),J!==null&&(J=J.next={lane:0,tag:A.tag,payload:A.payload,callback:null,next:null});e:{var he=e,je=A;Q=t;var Ke=a;switch(je.tag){case 1:if(he=je.payload,typeof he=="function"){ne=he.call(Ke,ne,Q);break e}ne=he;break e;case 3:he.flags=he.flags&-65537|128;case 0:if(he=je.payload,Q=typeof he=="function"?he.call(Ke,ne,Q):he,Q==null)break e;ne=y({},ne,Q);break e;case 2:ga=!0}}Q=A.callback,Q!==null&&(e.flags|=64,Z&&(e.flags|=8192),Z=c.callbacks,Z===null?c.callbacks=[Q]:Z.push(Q))}else Z={lane:Q,tag:A.tag,payload:A.payload,callback:A.callback,next:null},J===null?(X=J=Z,D=ne):J=J.next=Z,b|=Q;if(A=A.next,A===null){if(A=c.shared.pending,A===null)break;Z=A,A=Z.next,Z.next=null,c.lastBaseUpdate=Z,c.shared.pending=null}}while(!0);J===null&&(D=ne),c.baseState=D,c.firstBaseUpdate=X,c.lastBaseUpdate=J,u===null&&(c.shared.lanes=0),Na|=b,e.lanes=b,e.memoizedState=ne}}function Tm(e,t){if(typeof e!="function")throw Error(o(191,e));e.call(t)}function Dm(e,t){var a=e.callbacks;if(a!==null)for(e.callbacks=null,e=0;eu?u:8;var b=T.T,A={};T.T=A,Yc(e,!1,t,a);try{var D=c(),X=T.S;if(X!==null&&X(A,D),D!==null&&typeof D=="object"&&typeof D.then=="function"){var J=ab(D,l);zl(e,t,J,Pt(e))}else zl(e,t,l,Pt(e))}catch(ne){zl(e,t,{then:function(){},status:"rejected",reason:ne},Pt())}finally{Y.p=u,b!==null&&A.types!==null&&(b.types=A.types),T.T=b}}function cb(){}function $c(e,t,a,l){if(e.tag!==5)throw Error(o(476));var c=fh(e).queue;uh(e,c,t,I,a===null?cb:function(){return dh(e),a(l)})}function fh(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:I,baseState:I,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Qn,lastRenderedState:I},next:null};var a={};return t.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Qn,lastRenderedState:a},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function dh(e){var t=fh(e);t.next===null&&(t=e.alternate.memoizedState),zl(e,t.next.queue,{},Pt())}function Gc(){return qt(ti)}function mh(){return gt().memoizedState}function hh(){return gt().memoizedState}function ub(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var a=Pt();e=va(a);var l=ba(t,e,a);l!==null&&(Gt(l,t,a),Dl(l,t,a)),t={cache:vc()},e.payload=t;return}t=t.return}}function fb(e,t,a){var l=Pt();a={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},fr(e)?xh(t,a):(a=rc(e,t,a,l),a!==null&&(Gt(a,e,l),gh(a,t,l)))}function ph(e,t,a){var l=Pt();zl(e,t,a,l)}function zl(e,t,a,l){var c={lane:l,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(fr(e))xh(t,c);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var b=t.lastRenderedState,A=u(b,a);if(c.hasEagerState=!0,c.eagerState=A,Xt(A,b))return Fi(e,t,c,0),Ie===null&&Yi(),!1}catch{}finally{}if(a=rc(e,t,c,l),a!==null)return Gt(a,e,l),gh(a,t,l),!0}return!1}function Yc(e,t,a,l){if(l={lane:2,revertLane:ju(),gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},fr(e)){if(t)throw Error(o(479))}else t=rc(e,a,l,2),t!==null&&Gt(t,e,2)}function fr(e){var t=e.alternate;return e===Ce||t!==null&&t===Ce}function xh(e,t){zs=sr=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function gh(e,t,a){if((a&4194048)!==0){var l=t.lanes;l&=e.pendingLanes,a|=l,t.lanes=a,an(e,a)}}var Ul={readContext:qt,use:rr,useCallback:dt,useContext:dt,useEffect:dt,useImperativeHandle:dt,useLayoutEffect:dt,useInsertionEffect:dt,useMemo:dt,useReducer:dt,useRef:dt,useState:dt,useDebugValue:dt,useDeferredValue:dt,useTransition:dt,useSyncExternalStore:dt,useId:dt,useHostTransitionStatus:dt,useFormState:dt,useActionState:dt,useOptimistic:dt,useMemoCache:dt,useCacheRefresh:dt};Ul.useEffectEvent=dt;var vh={readContext:qt,use:rr,useCallback:function(e,t){return Lt().memoizedState=[e,t===void 0?null:t],e},useContext:qt,useEffect:th,useImperativeHandle:function(e,t,a){a=a!=null?a.concat([e]):null,cr(4194308,4,lh.bind(null,t,e),a)},useLayoutEffect:function(e,t){return cr(4194308,4,e,t)},useInsertionEffect:function(e,t){cr(4,2,e,t)},useMemo:function(e,t){var a=Lt();t=t===void 0?null:t;var l=e();if(Wa){Ft(!0);try{e()}finally{Ft(!1)}}return a.memoizedState=[l,t],l},useReducer:function(e,t,a){var l=Lt();if(a!==void 0){var c=a(t);if(Wa){Ft(!0);try{a(t)}finally{Ft(!1)}}}else c=t;return l.memoizedState=l.baseState=c,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:c},l.queue=e,e=e.dispatch=fb.bind(null,Ce,e),[l.memoizedState,e]},useRef:function(e){var t=Lt();return e={current:e},t.memoizedState=e},useState:function(e){e=Lc(e);var t=e.queue,a=ph.bind(null,Ce,t);return t.dispatch=a,[e.memoizedState,a]},useDebugValue:Hc,useDeferredValue:function(e,t){var a=Lt();return Vc(a,e,t)},useTransition:function(){var e=Lc(!1);return e=uh.bind(null,Ce,e.queue,!0,!1),Lt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,a){var l=Ce,c=Lt();if(De){if(a===void 0)throw Error(o(407));a=a()}else{if(a=t(),Ie===null)throw Error(o(349));(qe&127)!==0||Um(l,t,a)}c.memoizedState=a;var u={value:a,getSnapshot:t};return c.queue=u,th(Vm.bind(null,l,u,e),[e]),l.flags|=2048,Hs(9,{destroy:void 0},Hm.bind(null,l,u,a,t),null),a},useId:function(){var e=Lt(),t=Ie.identifierPrefix;if(De){var a=kn,l=En;a=(l&~(1<<32-Mt(l)-1)).toString(32)+a,t="_"+t+"R_"+a,a=lr++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof l.is=="string"?b.createElement("select",{is:l.is}):b.createElement("select"),l.multiple?u.multiple=!0:l.size&&(u.size=l.size);break;default:u=typeof l.is=="string"?b.createElement(c,{is:l.is}):b.createElement(c)}}u[ot]=t,u[wt]=l;e:for(b=t.child;b!==null;){if(b.tag===5||b.tag===6)u.appendChild(b.stateNode);else if(b.tag!==4&&b.tag!==27&&b.child!==null){b.child.return=b,b=b.child;continue}if(b===t)break e;for(;b.sibling===null;){if(b.return===null||b.return===t)break e;b=b.return}b.sibling.return=b.return,b=b.sibling}t.stateNode=u;e:switch(Dt(u,c,l),c){case"button":case"input":case"select":case"textarea":l=!!l.autoFocus;break e;case"img":l=!0;break e;default:l=!1}l&&Zn(t)}}return et(t),su(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,a),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==l&&Zn(t);else{if(typeof l!="string"&&t.stateNode===null)throw Error(o(166));if(e=re.current,qs(t)){if(e=t.stateNode,a=t.memoizedProps,l=null,c=Rt,c!==null)switch(c.tag){case 27:case 5:l=c.memoizedProps}e[ot]=t,e=!!(e.nodeValue===a||l!==null&&l.suppressHydrationWarning===!0||Lp(e.nodeValue,a)),e||pa(t,!0)}else e=qr(e).createTextNode(l),e[ot]=t,t.stateNode=e}return et(t),null;case 31:if(a=t.memoizedState,e===null||e.memoizedState!==null){if(l=qs(t),a!==null){if(e===null){if(!l)throw Error(o(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(o(557));e[ot]=t}else Xa(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;et(t),e=!1}else a=hc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),e=!0;if(!e)return t.flags&256?(Zt(t),t):(Zt(t),null);if((t.flags&128)!==0)throw Error(o(558))}return et(t),null;case 13:if(l=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(c=qs(t),l!==null&&l.dehydrated!==null){if(e===null){if(!c)throw Error(o(318));if(c=t.memoizedState,c=c!==null?c.dehydrated:null,!c)throw Error(o(317));c[ot]=t}else Xa(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;et(t),c=!1}else c=hc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=c),c=!0;if(!c)return t.flags&256?(Zt(t),t):(Zt(t),null)}return Zt(t),(t.flags&128)!==0?(t.lanes=a,t):(a=l!==null,e=e!==null&&e.memoizedState!==null,a&&(l=t.child,c=null,l.alternate!==null&&l.alternate.memoizedState!==null&&l.alternate.memoizedState.cachePool!==null&&(c=l.alternate.memoizedState.cachePool.pool),u=null,l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(u=l.memoizedState.cachePool.pool),u!==c&&(l.flags|=2048)),a!==e&&a&&(t.child.flags|=8192),xr(t,t.updateQueue),et(t),null);case 4:return be(),e===null&&Cu(t.stateNode.containerInfo),et(t),null;case 10:return Fn(t.type),et(t),null;case 19:if(G(xt),l=t.memoizedState,l===null)return et(t),null;if(c=(t.flags&128)!==0,u=l.rendering,u===null)if(c)Vl(l,!1);else{if(mt!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(u=ar(e),u!==null){for(t.flags|=128,Vl(l,!1),e=u.updateQueue,t.updateQueue=e,xr(t,e),t.subtreeFlags=0,e=a,a=t.child;a!==null;)pm(a,e),a=a.sibling;return te(xt,xt.current&1|2),De&&Gn(t,l.treeForkCount),t.child}e=e.sibling}l.tail!==null&&Ve()>Sr&&(t.flags|=128,c=!0,Vl(l,!1),t.lanes=4194304)}else{if(!c)if(e=ar(u),e!==null){if(t.flags|=128,c=!0,e=e.updateQueue,t.updateQueue=e,xr(t,e),Vl(l,!0),l.tail===null&&l.tailMode==="hidden"&&!u.alternate&&!De)return et(t),null}else 2*Ve()-l.renderingStartTime>Sr&&a!==536870912&&(t.flags|=128,c=!0,Vl(l,!1),t.lanes=4194304);l.isBackwards?(u.sibling=t.child,t.child=u):(e=l.last,e!==null?e.sibling=u:t.child=u,l.last=u)}return l.tail!==null?(e=l.tail,l.rendering=e,l.tail=e.sibling,l.renderingStartTime=Ve(),e.sibling=null,a=xt.current,te(xt,c?a&1|2:a&1),De&&Gn(t,l.treeForkCount),e):(et(t),null);case 22:case 23:return Zt(t),Ec(),l=t.memoizedState!==null,e!==null?e.memoizedState!==null!==l&&(t.flags|=8192):l&&(t.flags|=8192),l?(a&536870912)!==0&&(t.flags&128)===0&&(et(t),t.subtreeFlags&6&&(t.flags|=8192)):et(t),a=t.updateQueue,a!==null&&xr(t,a.retryQueue),a=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(a=e.memoizedState.cachePool.pool),l=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(l=t.memoizedState.cachePool.pool),l!==a&&(t.flags|=2048),e!==null&&G(Za),null;case 24:return a=null,e!==null&&(a=e.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),Fn(bt),et(t),null;case 25:return null;case 30:return null}throw Error(o(156,t.tag))}function xb(e,t){switch(dc(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Fn(bt),be(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Be(t),null;case 31:if(t.memoizedState!==null){if(Zt(t),t.alternate===null)throw Error(o(340));Xa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Zt(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(o(340));Xa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return G(xt),null;case 4:return be(),null;case 10:return Fn(t.type),null;case 22:case 23:return Zt(t),Ec(),e!==null&&G(Za),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Fn(bt),null;case 25:return null;default:return null}}function $h(e,t){switch(dc(t),t.tag){case 3:Fn(bt),be();break;case 26:case 27:case 5:Be(t);break;case 4:be();break;case 31:t.memoizedState!==null&&Zt(t);break;case 13:Zt(t);break;case 19:G(xt);break;case 10:Fn(t.type);break;case 22:case 23:Zt(t),Ec(),e!==null&&G(Za);break;case 24:Fn(bt)}}function $l(e,t){try{var a=t.updateQueue,l=a!==null?a.lastEffect:null;if(l!==null){var c=l.next;a=c;do{if((a.tag&e)===e){l=void 0;var u=a.create,b=a.inst;l=u(),b.destroy=l}a=a.next}while(a!==c)}}catch(A){Ye(t,t.return,A)}}function ja(e,t,a){try{var l=t.updateQueue,c=l!==null?l.lastEffect:null;if(c!==null){var u=c.next;l=u;do{if((l.tag&e)===e){var b=l.inst,A=b.destroy;if(A!==void 0){b.destroy=void 0,c=t;var D=a,X=A;try{X()}catch(J){Ye(c,D,J)}}}l=l.next}while(l!==u)}}catch(J){Ye(t,t.return,J)}}function Gh(e){var t=e.updateQueue;if(t!==null){var a=e.stateNode;try{Dm(t,a)}catch(l){Ye(e,e.return,l)}}}function Yh(e,t,a){a.props=es(e.type,e.memoizedProps),a.state=e.memoizedState;try{a.componentWillUnmount()}catch(l){Ye(e,t,l)}}function Gl(e,t){try{var a=e.ref;if(a!==null){switch(e.tag){case 26:case 27:case 5:var l=e.stateNode;break;case 30:l=e.stateNode;break;default:l=e.stateNode}typeof a=="function"?e.refCleanup=a(l):a.current=l}}catch(c){Ye(e,t,c)}}function Mn(e,t){var a=e.ref,l=e.refCleanup;if(a!==null)if(typeof l=="function")try{l()}catch(c){Ye(e,t,c)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(c){Ye(e,t,c)}else a.current=null}function Fh(e){var t=e.type,a=e.memoizedProps,l=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":a.autoFocus&&l.focus();break e;case"img":a.src?l.src=a.src:a.srcSet&&(l.srcset=a.srcSet)}}catch(c){Ye(e,e.return,c)}}function lu(e,t,a){try{var l=e.stateNode;zb(l,e.type,a,t),l[wt]=t}catch(c){Ye(e,e.return,c)}}function Xh(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Ma(e.type)||e.tag===4}function iu(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Xh(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Ma(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function ru(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(e,t):(t=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,t.appendChild(e),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=Hn));else if(l!==4&&(l===27&&Ma(e.type)&&(a=e.stateNode,t=null),e=e.child,e!==null))for(ru(e,t,a),e=e.sibling;e!==null;)ru(e,t,a),e=e.sibling}function gr(e,t,a){var l=e.tag;if(l===5||l===6)e=e.stateNode,t?a.insertBefore(e,t):a.appendChild(e);else if(l!==4&&(l===27&&Ma(e.type)&&(a=e.stateNode),e=e.child,e!==null))for(gr(e,t,a),e=e.sibling;e!==null;)gr(e,t,a),e=e.sibling}function Qh(e){var t=e.stateNode,a=e.memoizedProps;try{for(var l=e.type,c=t.attributes;c.length;)t.removeAttributeNode(c[0]);Dt(t,l,a),t[ot]=e,t[wt]=a}catch(u){Ye(e,e.return,u)}}var In=!1,jt=!1,ou=!1,Kh=typeof WeakSet=="function"?WeakSet:Set,kt=null;function gb(e,t){if(e=e.containerInfo,Mu=zr,e=im(e),tc(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var l=a.getSelection&&a.getSelection();if(l&&l.rangeCount!==0){a=l.anchorNode;var c=l.anchorOffset,u=l.focusNode;l=l.focusOffset;try{a.nodeType,u.nodeType}catch{a=null;break e}var b=0,A=-1,D=-1,X=0,J=0,ne=e,Q=null;t:for(;;){for(var Z;ne!==a||c!==0&&ne.nodeType!==3||(A=b+c),ne!==u||l!==0&&ne.nodeType!==3||(D=b+l),ne.nodeType===3&&(b+=ne.nodeValue.length),(Z=ne.firstChild)!==null;)Q=ne,ne=Z;for(;;){if(ne===e)break t;if(Q===a&&++X===c&&(A=b),Q===u&&++J===l&&(D=b),(Z=ne.nextSibling)!==null)break;ne=Q,Q=ne.parentNode}ne=Z}a=A===-1||D===-1?null:{start:A,end:D}}else a=null}a=a||{start:0,end:0}}else a=null;for(Ru={focusedElem:e,selectionRange:a},zr=!1,kt=t;kt!==null;)if(t=kt,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,kt=e;else for(;kt!==null;){switch(t=kt,u=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(a=0;a title"))),Dt(u,l,a),u[ot]=e,Et(u),l=u;break e;case"link":var b=e0("link","href",c).get(l+(a.href||""));if(b){for(var A=0;AKe&&(b=Ke,Ke=je,je=b);var L=sm(A,je),B=sm(A,Ke);if(L&&B&&(Z.rangeCount!==1||Z.anchorNode!==L.node||Z.anchorOffset!==L.offset||Z.focusNode!==B.node||Z.focusOffset!==B.offset)){var F=ne.createRange();F.setStart(L.node,L.offset),Z.removeAllRanges(),je>Ke?(Z.addRange(F),Z.extend(B.node,B.offset)):(F.setEnd(B.node,B.offset),Z.addRange(F))}}}}for(ne=[],Z=A;Z=Z.parentNode;)Z.nodeType===1&&ne.push({element:Z,left:Z.scrollLeft,top:Z.scrollTop});for(typeof A.focus=="function"&&A.focus(),A=0;Aa?32:a,T.T=null,a=pu,pu=null;var u=Ca,b=ta;if(Ct=0,Fs=Ca=null,ta=0,(Ue&6)!==0)throw Error(o(331));var A=Ue;if(Ue|=4,lp(u.current),np(u,u.current,b,a),Ue=A,Zl(0,!1),Nt&&typeof Nt.onPostCommitFiberRoot=="function")try{Nt.onPostCommitFiberRoot(Bn,u)}catch{}return!0}finally{Y.p=c,T.T=l,Ap(e,t)}}function wp(e,t,a){t=on(a,t),t=Kc(e.stateNode,t,2),e=ba(e,t,2),e!==null&&(Ua(e,2),Rn(e))}function Ye(e,t,a){if(e.tag===3)wp(e,e,a);else for(;t!==null;){if(t.tag===3){wp(t,e,a);break}else if(t.tag===1){var l=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof l.componentDidCatch=="function"&&(wa===null||!wa.has(l))){e=on(a,e),a=Ch(2),l=ba(t,a,2),l!==null&&(Eh(a,l,t,e),Ua(l,2),Rn(l));break}}t=t.return}}function bu(e,t,a){var l=e.pingCache;if(l===null){l=e.pingCache=new yb;var c=new Set;l.set(t,c)}else c=l.get(t),c===void 0&&(c=new Set,l.set(t,c));c.has(a)||(fu=!0,c.add(a),e=wb.bind(null,e,t,a),t.then(e,e))}function wb(e,t,a){var l=e.pingCache;l!==null&&l.delete(t),e.pingedLanes|=e.suspendedLanes&a,e.warmLanes&=~a,Ie===e&&(qe&a)===a&&(mt===4||mt===3&&(qe&62914560)===qe&&300>Ve()-yr?(Ue&2)===0&&Xs(e,0):du|=a,Ys===qe&&(Ys=0)),Rn(e)}function Cp(e,t){t===0&&(t=ml()),e=Ya(e,t),e!==null&&(Ua(e,t),Rn(e))}function Cb(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),Cp(e,a)}function Eb(e,t){var a=0;switch(e.tag){case 31:case 13:var l=e.stateNode,c=e.memoizedState;c!==null&&(a=c.retryLane);break;case 19:l=e.stateNode;break;case 22:l=e.stateNode._retryCache;break;default:throw Error(o(314))}l!==null&&l.delete(t),Cp(e,a)}function kb(e,t){return P(e,t)}var Er=null,Ks=null,yu=!1,kr=!1,Su=!1,ka=0;function Rn(e){e!==Ks&&e.next===null&&(Ks===null?Er=Ks=e:Ks=Ks.next=e),kr=!0,yu||(yu=!0,Rb())}function Zl(e,t){if(!Su&&kr){Su=!0;do for(var a=!1,l=Er;l!==null;){if(e!==0){var c=l.pendingLanes;if(c===0)var u=0;else{var b=l.suspendedLanes,A=l.pingedLanes;u=(1<<31-Mt(42|e)+1)-1,u&=c&~(b&~A),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(a=!0,Rp(l,u))}else u=qe,u=Cn(l,l===Ie?u:0,l.cancelPendingCommit!==null||l.timeoutHandle!==-1),(u&3)===0||Ln(l,u)||(a=!0,Rp(l,u));l=l.next}while(a);Su=!1}}function Mb(){Ep()}function Ep(){kr=yu=!1;var e=0;ka!==0&&Hb()&&(e=ka);for(var t=Ve(),a=null,l=Er;l!==null;){var c=l.next,u=kp(l,t);u===0?(l.next=null,a===null?Er=c:a.next=c,c===null&&(Ks=a)):(a=l,(e!==0||(u&3)!==0)&&(kr=!0)),l=c}Ct!==0&&Ct!==5||Zl(e),ka!==0&&(ka=0)}function kp(e,t){for(var a=e.suspendedLanes,l=e.pingedLanes,c=e.expirationTimes,u=e.pendingLanes&-62914561;0A)break;var J=D.transferSize,ne=D.initiatorType;J&&zp(ne)&&(D=D.responseEnd,b+=J*(D"u"?null:document;function Ip(e,t,a){var l=Zs;if(l&&typeof t=="string"&&t){var c=ln(t);c='link[rel="'+e+'"][href="'+c+'"]',typeof a=="string"&&(c+='[crossorigin="'+a+'"]'),Zp.has(c)||(Zp.add(c),e={rel:e,crossOrigin:a,href:t},l.querySelector(c)===null&&(t=l.createElement("link"),Dt(t,"link",e),Et(t),l.head.appendChild(t)))}}function Zb(e){na.D(e),Ip("dns-prefetch",e,null)}function Ib(e,t){na.C(e,t),Ip("preconnect",e,t)}function Jb(e,t,a){na.L(e,t,a);var l=Zs;if(l&&e&&t){var c='link[rel="preload"][as="'+ln(t)+'"]';t==="image"&&a&&a.imageSrcSet?(c+='[imagesrcset="'+ln(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(c+='[imagesizes="'+ln(a.imageSizes)+'"]')):c+='[href="'+ln(e)+'"]';var u=c;switch(t){case"style":u=Is(e);break;case"script":u=Js(e)}hn.has(u)||(e=y({rel:"preload",href:t==="image"&&a&&a.imageSrcSet?void 0:e,as:t},a),hn.set(u,e),l.querySelector(c)!==null||t==="style"&&l.querySelector(Wl(u))||t==="script"&&l.querySelector(ei(u))||(t=l.createElement("link"),Dt(t,"link",e),Et(t),l.head.appendChild(t)))}}function Pb(e,t){na.m(e,t);var a=Zs;if(a&&e){var l=t&&typeof t.as=="string"?t.as:"script",c='link[rel="modulepreload"][as="'+ln(l)+'"][href="'+ln(e)+'"]',u=c;switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=Js(e)}if(!hn.has(u)&&(e=y({rel:"modulepreload",href:e},t),hn.set(u,e),a.querySelector(c)===null)){switch(l){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(ei(u)))return}l=a.createElement("link"),Dt(l,"link",e),Et(l),a.head.appendChild(l)}}}function Wb(e,t,a){na.S(e,t,a);var l=Zs;if(l&&e){var c=vs(l).hoistableStyles,u=Is(e);t=t||"default";var b=c.get(u);if(!b){var A={loading:0,preload:null};if(b=l.querySelector(Wl(u)))A.loading=5;else{e=y({rel:"stylesheet",href:e,"data-precedence":t},a),(a=hn.get(u))&&Lu(e,a);var D=b=l.createElement("link");Et(D),Dt(D,"link",e),D._p=new Promise(function(X,J){D.onload=X,D.onerror=J}),D.addEventListener("load",function(){A.loading|=1}),D.addEventListener("error",function(){A.loading|=2}),A.loading|=4,Dr(b,t,l)}b={type:"stylesheet",instance:b,count:1,state:A},c.set(u,b)}}}function ey(e,t){na.X(e,t);var a=Zs;if(a&&e){var l=vs(a).hoistableScripts,c=Js(e),u=l.get(c);u||(u=a.querySelector(ei(c)),u||(e=y({src:e,async:!0},t),(t=hn.get(c))&&zu(e,t),u=a.createElement("script"),Et(u),Dt(u,"link",e),a.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},l.set(c,u))}}function ty(e,t){na.M(e,t);var a=Zs;if(a&&e){var l=vs(a).hoistableScripts,c=Js(e),u=l.get(c);u||(u=a.querySelector(ei(c)),u||(e=y({src:e,async:!0,type:"module"},t),(t=hn.get(c))&&zu(e,t),u=a.createElement("script"),Et(u),Dt(u,"link",e),a.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},l.set(c,u))}}function Jp(e,t,a,l){var c=(c=re.current)?Tr(c):null;if(!c)throw Error(o(446));switch(e){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(t=Is(a.href),a=vs(c).hoistableStyles,l=a.get(t),l||(l={type:"style",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){e=Is(a.href);var u=vs(c).hoistableStyles,b=u.get(e);if(b||(c=c.ownerDocument||c,b={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(e,b),(u=c.querySelector(Wl(e)))&&!u._p&&(b.instance=u,b.state.loading=5),hn.has(e)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},hn.set(e,a),u||ny(c,e,a,b.state))),t&&l===null)throw Error(o(528,""));return b}if(t&&l!==null)throw Error(o(529,""));return null;case"script":return t=a.async,a=a.src,typeof a=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=Js(a),a=vs(c).hoistableScripts,l=a.get(t),l||(l={type:"script",instance:null,count:0,state:null},a.set(t,l)),l):{type:"void",instance:null,count:0,state:null};default:throw Error(o(444,e))}}function Is(e){return'href="'+ln(e)+'"'}function Wl(e){return'link[rel="stylesheet"]['+e+"]"}function Pp(e){return y({},e,{"data-precedence":e.precedence,precedence:null})}function ny(e,t,a,l){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?l.loading=1:(t=e.createElement("link"),l.preload=t,t.addEventListener("load",function(){return l.loading|=1}),t.addEventListener("error",function(){return l.loading|=2}),Dt(t,"link",a),Et(t),e.head.appendChild(t))}function Js(e){return'[src="'+ln(e)+'"]'}function ei(e){return"script[async]"+e}function Wp(e,t,a){if(t.count++,t.instance===null)switch(t.type){case"style":var l=e.querySelector('style[data-href~="'+ln(a.href)+'"]');if(l)return t.instance=l,Et(l),l;var c=y({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return l=(e.ownerDocument||e).createElement("style"),Et(l),Dt(l,"style",c),Dr(l,a.precedence,e),t.instance=l;case"stylesheet":c=Is(a.href);var u=e.querySelector(Wl(c));if(u)return t.state.loading|=4,t.instance=u,Et(u),u;l=Pp(a),(c=hn.get(c))&&Lu(l,c),u=(e.ownerDocument||e).createElement("link"),Et(u);var b=u;return b._p=new Promise(function(A,D){b.onload=A,b.onerror=D}),Dt(u,"link",l),t.state.loading|=4,Dr(u,a.precedence,e),t.instance=u;case"script":return u=Js(a.src),(c=e.querySelector(ei(u)))?(t.instance=c,Et(c),c):(l=a,(c=hn.get(u))&&(l=y({},a),zu(l,c)),e=e.ownerDocument||e,c=e.createElement("script"),Et(c),Dt(c,"link",l),e.head.appendChild(c),t.instance=c);case"void":return null;default:throw Error(o(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(l=t.instance,t.state.loading|=4,Dr(l,a.precedence,e));return t.instance}function Dr(e,t,a){for(var l=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),c=l.length?l[l.length-1]:null,u=c,b=0;b title"):null)}function ay(e,t,a){if(a===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function n0(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function sy(e,t,a,l){if(a.type==="stylesheet"&&(typeof l.media!="string"||matchMedia(l.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var c=Is(l.href),u=t.querySelector(Wl(c));if(u){t=u._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=Br.bind(e),t.then(e,e)),a.state.loading|=4,a.instance=u,Et(u);return}u=t.ownerDocument||t,l=Pp(l),(c=hn.get(c))&&Lu(l,c),u=u.createElement("link"),Et(u);var b=u;b._p=new Promise(function(A,D){b.onload=A,b.onerror=D}),Dt(u,"link",l),a.instance=u}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(a,t),(t=a.state.preload)&&(a.state.loading&3)===0&&(e.count++,a=Br.bind(e),t.addEventListener("load",a),t.addEventListener("error",a))}}var Uu=0;function ly(e,t){return e.stylesheets&&e.count===0&&Lr(e,e.stylesheets),0Uu?50:800)+t);return e.unsuspend=a,function(){e.unsuspend=null,clearTimeout(l),clearTimeout(c)}}:null}function Br(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Lr(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Or=null;function Lr(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Or=new Map,t.forEach(iy,e),Or=null,Br.call(e))}function iy(e,t){if(!(t.state.loading&4)){var a=Or.get(e);if(a)var l=a.get(null);else{a=new Map,Or.set(e,a);for(var c=e.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(s){console.error(s)}}return n(),Ku.exports=Ay(),Ku.exports}var wy=Ny();var C0="popstate";function Cy(n={}){function s(o,f){let{pathname:d,search:h,hash:p}=o.location;return Nf("",{pathname:d,search:h,hash:p},f.state&&f.state.usr||null,f.state&&f.state.key||"default")}function i(o,f){return typeof f=="string"?f:bi(f)}return ky(s,i,null,n)}function ut(n,s){if(n===!1||n===null||typeof n>"u")throw new Error(s)}function Nn(n,s){if(!n){typeof console<"u"&&console.warn(s);try{throw new Error(s)}catch{}}}function Ey(){return Math.random().toString(36).substring(2,10)}function E0(n,s){return{usr:n.state,key:n.key,idx:s}}function Nf(n,s,i=null,o){return{pathname:typeof n=="string"?n:n.pathname,search:"",hash:"",...typeof s=="string"?cl(s):s,state:i,key:s&&s.key||o||Ey()}}function bi({pathname:n="/",search:s="",hash:i=""}){return s&&s!=="?"&&(n+=s.charAt(0)==="?"?s:"?"+s),i&&i!=="#"&&(n+=i.charAt(0)==="#"?i:"#"+i),n}function cl(n){let s={};if(n){let i=n.indexOf("#");i>=0&&(s.hash=n.substring(i),n=n.substring(0,i));let o=n.indexOf("?");o>=0&&(s.search=n.substring(o),n=n.substring(0,o)),n&&(s.pathname=n)}return s}function ky(n,s,i,o={}){let{window:f=document.defaultView,v5Compat:d=!1}=o,h=f.history,p="POP",x=null,g=v();g==null&&(g=0,h.replaceState({...h.state,idx:g},""));function v(){return(h.state||{idx:null}).idx}function y(){p="POP";let w=v(),j=w==null?null:w-g;g=w,x&&x({action:p,location:k.location,delta:j})}function S(w,j){p="PUSH";let N=Nf(k.location,w,j);g=v()+1;let q=E0(N,g),M=k.createHref(N);try{h.pushState(q,"",M)}catch(O){if(O instanceof DOMException&&O.name==="DataCloneError")throw O;f.location.assign(M)}d&&x&&x({action:p,location:k.location,delta:1})}function E(w,j){p="REPLACE";let N=Nf(k.location,w,j);g=v();let q=E0(N,g),M=k.createHref(N);h.replaceState(q,"",M),d&&x&&x({action:p,location:k.location,delta:0})}function C(w){return My(w)}let k={get action(){return p},get location(){return n(f,h)},listen(w){if(x)throw new Error("A history only accepts one active listener");return f.addEventListener(C0,y),x=w,()=>{f.removeEventListener(C0,y),x=null}},createHref(w){return s(f,w)},createURL:C,encodeLocation(w){let j=C(w);return{pathname:j.pathname,search:j.search,hash:j.hash}},push:S,replace:E,go(w){return h.go(w)}};return k}function My(n,s=!1){let i="http://localhost";typeof window<"u"&&(i=window.location.origin!=="null"?window.location.origin:window.location.href),ut(i,"No window.location.(origin|href) available to create URL");let o=typeof n=="string"?n:bi(n);return o=o.replace(/ $/,"%20"),!s&&o.startsWith("//")&&(o=i+o),new URL(o,i)}function Rx(n,s,i="/"){return Ry(n,s,i,!1)}function Ry(n,s,i,o){let f=typeof s=="string"?cl(s):s,d=oa(f.pathname||"/",i);if(d==null)return null;let h=qx(n);qy(h);let p=null;for(let x=0;p==null&&x{let v={relativePath:g===void 0?h.path||"":g,caseSensitive:h.caseSensitive===!0,childrenIndex:p,route:h};if(v.relativePath.startsWith("/")){if(!v.relativePath.startsWith(o)&&x)return;ut(v.relativePath.startsWith(o),`Absolute route path "${v.relativePath}" nested under path "${o}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),v.relativePath=v.relativePath.slice(o.length)}let y=ra([o,v.relativePath]),S=i.concat(v);h.children&&h.children.length>0&&(ut(h.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${y}".`),qx(h.children,s,S,y,x)),!(h.path==null&&!h.index)&&s.push({path:y,score:zy(y,h.index),routesMeta:S})};return n.forEach((h,p)=>{if(h.path===""||!h.path?.includes("?"))d(h,p);else for(let x of Tx(h.path))d(h,p,!0,x)}),s}function Tx(n){let s=n.split("/");if(s.length===0)return[];let[i,...o]=s,f=i.endsWith("?"),d=i.replace(/\?$/,"");if(o.length===0)return f?[d,""]:[d];let h=Tx(o.join("/")),p=[];return p.push(...h.map(x=>x===""?d:[d,x].join("/"))),f&&p.push(...h),p.map(x=>n.startsWith("/")&&x===""?"/":x)}function qy(n){n.sort((s,i)=>s.score!==i.score?i.score-s.score:Uy(s.routesMeta.map(o=>o.childrenIndex),i.routesMeta.map(o=>o.childrenIndex)))}var Ty=/^:[\w-]+$/,Dy=3,_y=2,By=1,Oy=10,Ly=-2,k0=n=>n==="*";function zy(n,s){let i=n.split("/"),o=i.length;return i.some(k0)&&(o+=Ly),s&&(o+=_y),i.filter(f=>!k0(f)).reduce((f,d)=>f+(Ty.test(d)?Dy:d===""?By:Oy),o)}function Uy(n,s){return n.length===s.length&&n.slice(0,-1).every((o,f)=>o===s[f])?n[n.length-1]-s[s.length-1]:0}function Hy(n,s,i=!1){let{routesMeta:o}=n,f={},d="/",h=[];for(let p=0;p{if(v==="*"){let C=p[S]||"";h=d.slice(0,d.length-C.length).replace(/(.)\/+$/,"$1")}const E=p[S];return y&&!E?g[v]=void 0:g[v]=(E||"").replace(/%2F/g,"/"),g},{}),pathname:d,pathnameBase:h,pattern:n}}function Vy(n,s=!1,i=!0){Nn(n==="*"||!n.endsWith("*")||n.endsWith("/*"),`Route path "${n}" will be treated as if it were "${n.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${n.replace(/\*$/,"/*")}".`);let o=[],f="^"+n.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(h,p,x)=>(o.push({paramName:p,isOptional:x!=null}),x?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return n.endsWith("*")?(o.push({paramName:"*"}),f+=n==="*"||n==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):i?f+="\\/*$":n!==""&&n!=="/"&&(f+="(?:(?=\\/|$))"),[new RegExp(f,s?void 0:"i"),o]}function $y(n){try{return n.split("/").map(s=>decodeURIComponent(s).replace(/\//g,"%2F")).join("/")}catch(s){return Nn(!1,`The URL path "${n}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${s}).`),n}}function oa(n,s){if(s==="/")return n;if(!n.toLowerCase().startsWith(s.toLowerCase()))return null;let i=s.endsWith("/")?s.length-1:s.length,o=n.charAt(i);return o&&o!=="/"?null:n.slice(i)||"/"}var Gy=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Yy=n=>Gy.test(n);function Fy(n,s="/"){let{pathname:i,search:o="",hash:f=""}=typeof n=="string"?cl(n):n,d;if(i)if(Yy(i))d=i;else{if(i.includes("//")){let h=i;i=i.replace(/\/\/+/g,"/"),Nn(!1,`Pathnames cannot have embedded double slashes - normalizing ${h} -> ${i}`)}i.startsWith("/")?d=M0(i.substring(1),"/"):d=M0(i,s)}else d=s;return{pathname:d,search:Ky(o),hash:Zy(f)}}function M0(n,s){let i=s.replace(/\/+$/,"").split("/");return n.split("/").forEach(f=>{f===".."?i.length>1&&i.pop():f!=="."&&i.push(f)}),i.length>1?i.join("/"):"/"}function Pu(n,s,i,o){return`Cannot include a '${n}' character in a manually specified \`to.${s}\` field [${JSON.stringify(o)}]. Please separate it out to the \`to.${i}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function Xy(n){return n.filter((s,i)=>i===0||s.route.path&&s.route.path.length>0)}function Dx(n){let s=Xy(n);return s.map((i,o)=>o===s.length-1?i.pathname:i.pathnameBase)}function _x(n,s,i,o=!1){let f;typeof n=="string"?f=cl(n):(f={...n},ut(!f.pathname||!f.pathname.includes("?"),Pu("?","pathname","search",f)),ut(!f.pathname||!f.pathname.includes("#"),Pu("#","pathname","hash",f)),ut(!f.search||!f.search.includes("#"),Pu("#","search","hash",f)));let d=n===""||f.pathname==="",h=d?"/":f.pathname,p;if(h==null)p=i;else{let y=s.length-1;if(!o&&h.startsWith("..")){let S=h.split("/");for(;S[0]==="..";)S.shift(),y-=1;f.pathname=S.join("/")}p=y>=0?s[y]:"/"}let x=Fy(f,p),g=h&&h!=="/"&&h.endsWith("/"),v=(d||h===".")&&i.endsWith("/");return!x.pathname.endsWith("/")&&(g||v)&&(x.pathname+="/"),x}var ra=n=>n.join("/").replace(/\/\/+/g,"/"),Qy=n=>n.replace(/\/+$/,"").replace(/^\/*/,"/"),Ky=n=>!n||n==="?"?"":n.startsWith("?")?n:"?"+n,Zy=n=>!n||n==="#"?"":n.startsWith("#")?n:"#"+n;function Iy(n){return n!=null&&typeof n.status=="number"&&typeof n.statusText=="string"&&typeof n.internal=="boolean"&&"data"in n}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var Bx=["POST","PUT","PATCH","DELETE"];new Set(Bx);var Jy=["GET",...Bx];new Set(Jy);var ul=m.createContext(null);ul.displayName="DataRouter";var No=m.createContext(null);No.displayName="DataRouterState";m.createContext(!1);var Ox=m.createContext({isTransitioning:!1});Ox.displayName="ViewTransition";var Py=m.createContext(new Map);Py.displayName="Fetchers";var Wy=m.createContext(null);Wy.displayName="Await";var _n=m.createContext(null);_n.displayName="Navigation";var ki=m.createContext(null);ki.displayName="Location";var ua=m.createContext({outlet:null,matches:[],isDataRoute:!1});ua.displayName="Route";var Yf=m.createContext(null);Yf.displayName="RouteError";function e1(n,{relative:s}={}){ut(Mi(),"useHref() may be used only in the context of a component.");let{basename:i,navigator:o}=m.useContext(_n),{hash:f,pathname:d,search:h}=Ri(n,{relative:s}),p=d;return i!=="/"&&(p=d==="/"?i:ra([i,d])),o.createHref({pathname:p,search:h,hash:f})}function Mi(){return m.useContext(ki)!=null}function fs(){return ut(Mi(),"useLocation() may be used only in the context of a component."),m.useContext(ki).location}var Lx="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function zx(n){m.useContext(_n).static||m.useLayoutEffect(n)}function t1(){let{isDataRoute:n}=m.useContext(ua);return n?h1():n1()}function n1(){ut(Mi(),"useNavigate() may be used only in the context of a component.");let n=m.useContext(ul),{basename:s,navigator:i}=m.useContext(_n),{matches:o}=m.useContext(ua),{pathname:f}=fs(),d=JSON.stringify(Dx(o)),h=m.useRef(!1);return zx(()=>{h.current=!0}),m.useCallback((x,g={})=>{if(Nn(h.current,Lx),!h.current)return;if(typeof x=="number"){i.go(x);return}let v=_x(x,JSON.parse(d),f,g.relative==="path");n==null&&s!=="/"&&(v.pathname=v.pathname==="/"?s:ra([s,v.pathname])),(g.replace?i.replace:i.push)(v,g.state,g)},[s,i,d,f,n])}m.createContext(null);function Ri(n,{relative:s}={}){let{matches:i}=m.useContext(ua),{pathname:o}=fs(),f=JSON.stringify(Dx(i));return m.useMemo(()=>_x(n,JSON.parse(f),o,s==="path"),[n,f,o,s])}function a1(n,s){return Ux(n,s)}function Ux(n,s,i,o,f){ut(Mi(),"useRoutes() may be used only in the context of a component.");let{navigator:d}=m.useContext(_n),{matches:h}=m.useContext(ua),p=h[h.length-1],x=p?p.params:{},g=p?p.pathname:"/",v=p?p.pathnameBase:"/",y=p&&p.route;{let N=y&&y.path||"";Hx(g,!y||N.endsWith("*")||N.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${g}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. -Please change the parent to .`)}let S=fs(),E;if(s){let N=typeof s=="string"?cl(s):s;ut(v==="/"||N.pathname?.startsWith(v),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${v}" but pathname "${N.pathname}" was given in the \`location\` prop.`),E=N}else E=S;let C=E.pathname||"/",k=C;if(v!=="/"){let N=v.replace(/^\//,"").split("/");k="/"+C.replace(/^\//,"").split("/").slice(N.length).join("/")}let w=Rx(n,{pathname:k});Nn(y||w!=null,`No routes matched location "${E.pathname}${E.search}${E.hash}" `),Nn(w==null||w[w.length-1].route.element!==void 0||w[w.length-1].route.Component!==void 0||w[w.length-1].route.lazy!==void 0,`Matched leaf route at location "${E.pathname}${E.search}${E.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let j=o1(w&&w.map(N=>Object.assign({},N,{params:Object.assign({},x,N.params),pathname:ra([v,d.encodeLocation?d.encodeLocation(N.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:N.pathname]),pathnameBase:N.pathnameBase==="/"?v:ra([v,d.encodeLocation?d.encodeLocation(N.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:N.pathnameBase])})),h,i,o,f);return s&&j?m.createElement(ki.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...E},navigationType:"POP"}},j):j}function s1(){let n=m1(),s=Iy(n)?`${n.status} ${n.statusText}`:n instanceof Error?n.message:JSON.stringify(n),i=n instanceof Error?n.stack:null,o="rgba(200,200,200, 0.5)",f={padding:"0.5rem",backgroundColor:o},d={padding:"2px 4px",backgroundColor:o},h=null;return console.error("Error handled by React Router default ErrorBoundary:",n),h=m.createElement(m.Fragment,null,m.createElement("p",null,"💿 Hey developer 👋"),m.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",m.createElement("code",{style:d},"ErrorBoundary")," or"," ",m.createElement("code",{style:d},"errorElement")," prop on your route.")),m.createElement(m.Fragment,null,m.createElement("h2",null,"Unexpected Application Error!"),m.createElement("h3",{style:{fontStyle:"italic"}},s),i?m.createElement("pre",{style:f},i):null,h)}var l1=m.createElement(s1,null),i1=class extends m.Component{constructor(n){super(n),this.state={location:n.location,revalidation:n.revalidation,error:n.error}}static getDerivedStateFromError(n){return{error:n}}static getDerivedStateFromProps(n,s){return s.location!==n.location||s.revalidation!=="idle"&&n.revalidation==="idle"?{error:n.error,location:n.location,revalidation:n.revalidation}:{error:n.error!==void 0?n.error:s.error,location:s.location,revalidation:n.revalidation||s.revalidation}}componentDidCatch(n,s){this.props.onError?this.props.onError(n,s):console.error("React Router caught the following error during render",n)}render(){return this.state.error!==void 0?m.createElement(ua.Provider,{value:this.props.routeContext},m.createElement(Yf.Provider,{value:this.state.error,children:this.props.component})):this.props.children}};function r1({routeContext:n,match:s,children:i}){let o=m.useContext(ul);return o&&o.static&&o.staticContext&&(s.route.errorElement||s.route.ErrorBoundary)&&(o.staticContext._deepestRenderedBoundaryId=s.route.id),m.createElement(ua.Provider,{value:n},i)}function o1(n,s=[],i=null,o=null,f=null){if(n==null){if(!i)return null;if(i.errors)n=i.matches;else if(s.length===0&&!i.initialized&&i.matches.length>0)n=i.matches;else return null}let d=n,h=i?.errors;if(h!=null){let v=d.findIndex(y=>y.route.id&&h?.[y.route.id]!==void 0);ut(v>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(h).join(",")}`),d=d.slice(0,Math.min(d.length,v+1))}let p=!1,x=-1;if(i)for(let v=0;v=0?d=d.slice(0,x+1):d=[d[0]];break}}}let g=i&&o?(v,y)=>{o(v,{location:i.location,params:i.matches?.[0]?.params??{},errorInfo:y})}:void 0;return d.reduceRight((v,y,S)=>{let E,C=!1,k=null,w=null;i&&(E=h&&y.route.id?h[y.route.id]:void 0,k=y.route.errorElement||l1,p&&(x<0&&S===0?(Hx("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),C=!0,w=null):x===S&&(C=!0,w=y.route.hydrateFallbackElement||null)));let j=s.concat(d.slice(0,S+1)),N=()=>{let q;return E?q=k:C?q=w:y.route.Component?q=m.createElement(y.route.Component,null):y.route.element?q=y.route.element:q=v,m.createElement(r1,{match:y,routeContext:{outlet:v,matches:j,isDataRoute:i!=null},children:q})};return i&&(y.route.ErrorBoundary||y.route.errorElement||S===0)?m.createElement(i1,{location:i.location,revalidation:i.revalidation,component:k,error:E,children:N(),routeContext:{outlet:null,matches:j,isDataRoute:!0},onError:g}):N()},null)}function Ff(n){return`${n} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function c1(n){let s=m.useContext(ul);return ut(s,Ff(n)),s}function u1(n){let s=m.useContext(No);return ut(s,Ff(n)),s}function f1(n){let s=m.useContext(ua);return ut(s,Ff(n)),s}function Xf(n){let s=f1(n),i=s.matches[s.matches.length-1];return ut(i.route.id,`${n} can only be used on routes that contain a unique "id"`),i.route.id}function d1(){return Xf("useRouteId")}function m1(){let n=m.useContext(Yf),s=u1("useRouteError"),i=Xf("useRouteError");return n!==void 0?n:s.errors?.[i]}function h1(){let{router:n}=c1("useNavigate"),s=Xf("useNavigate"),i=m.useRef(!1);return zx(()=>{i.current=!0}),m.useCallback(async(f,d={})=>{Nn(i.current,Lx),i.current&&(typeof f=="number"?n.navigate(f):await n.navigate(f,{fromRouteId:s,...d}))},[n,s])}var R0={};function Hx(n,s,i){!s&&!R0[n]&&(R0[n]=!0,Nn(!1,i))}m.memo(p1);function p1({routes:n,future:s,state:i,unstable_onError:o}){return Ux(n,void 0,i,o,s)}function no(n){ut(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function x1({basename:n="/",children:s=null,location:i,navigationType:o="POP",navigator:f,static:d=!1}){ut(!Mi(),"You cannot render a inside another . You should never have more than one in your app.");let h=n.replace(/^\/*/,"/"),p=m.useMemo(()=>({basename:h,navigator:f,static:d,future:{}}),[h,f,d]);typeof i=="string"&&(i=cl(i));let{pathname:x="/",search:g="",hash:v="",state:y=null,key:S="default"}=i,E=m.useMemo(()=>{let C=oa(x,h);return C==null?null:{location:{pathname:C,search:g,hash:v,state:y,key:S},navigationType:o}},[h,x,g,v,y,S,o]);return Nn(E!=null,` is not able to match the URL "${x}${g}${v}" because it does not start with the basename, so the won't render anything.`),E==null?null:m.createElement(_n.Provider,{value:p},m.createElement(ki.Provider,{children:s,value:E}))}function g1({children:n,location:s}){return a1(wf(n),s)}function wf(n,s=[]){let i=[];return m.Children.forEach(n,(o,f)=>{if(!m.isValidElement(o))return;let d=[...s,f];if(o.type===m.Fragment){i.push.apply(i,wf(o.props.children,d));return}ut(o.type===no,`[${typeof o.type=="string"?o.type:o.type.name}] is not a component. All component children of must be a or `),ut(!o.props.index||!o.props.children,"An index route cannot have child routes.");let h={id:o.props.id||d.join("-"),caseSensitive:o.props.caseSensitive,element:o.props.element,Component:o.props.Component,index:o.props.index,path:o.props.path,middleware:o.props.middleware,loader:o.props.loader,action:o.props.action,hydrateFallbackElement:o.props.hydrateFallbackElement,HydrateFallback:o.props.HydrateFallback,errorElement:o.props.errorElement,ErrorBoundary:o.props.ErrorBoundary,hasErrorBoundary:o.props.hasErrorBoundary===!0||o.props.ErrorBoundary!=null||o.props.errorElement!=null,shouldRevalidate:o.props.shouldRevalidate,handle:o.props.handle,lazy:o.props.lazy};o.props.children&&(h.children=wf(o.props.children,d)),i.push(h)}),i}var ao="get",so="application/x-www-form-urlencoded";function wo(n){return n!=null&&typeof n.tagName=="string"}function v1(n){return wo(n)&&n.tagName.toLowerCase()==="button"}function b1(n){return wo(n)&&n.tagName.toLowerCase()==="form"}function y1(n){return wo(n)&&n.tagName.toLowerCase()==="input"}function S1(n){return!!(n.metaKey||n.altKey||n.ctrlKey||n.shiftKey)}function j1(n,s){return n.button===0&&(!s||s==="_self")&&!S1(n)}var Fr=null;function A1(){if(Fr===null)try{new FormData(document.createElement("form"),0),Fr=!1}catch{Fr=!0}return Fr}var N1=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function Wu(n){return n!=null&&!N1.has(n)?(Nn(!1,`"${n}" is not a valid \`encType\` for \`\`/\`\` and will default to "${so}"`),null):n}function w1(n,s){let i,o,f,d,h;if(b1(n)){let p=n.getAttribute("action");o=p?oa(p,s):null,i=n.getAttribute("method")||ao,f=Wu(n.getAttribute("enctype"))||so,d=new FormData(n)}else if(v1(n)||y1(n)&&(n.type==="submit"||n.type==="image")){let p=n.form;if(p==null)throw new Error('Cannot submit a or without a ');let x=n.getAttribute("formaction")||p.getAttribute("action");if(o=x?oa(x,s):null,i=n.getAttribute("formmethod")||p.getAttribute("method")||ao,f=Wu(n.getAttribute("formenctype"))||Wu(p.getAttribute("enctype"))||so,d=new FormData(p,n),!A1()){let{name:g,type:v,value:y}=n;if(v==="image"){let S=g?`${g}.`:"";d.append(`${S}x`,"0"),d.append(`${S}y`,"0")}else g&&d.append(g,y)}}else{if(wo(n))throw new Error('Cannot submit element that is not , , or ');i=ao,o=null,f=so,h=n}return d&&f==="text/plain"&&(h=d,d=void 0),{action:o,method:i.toLowerCase(),encType:f,formData:d,body:h}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");function Qf(n,s){if(n===!1||n===null||typeof n>"u")throw new Error(s)}function C1(n,s,i){let o=typeof n=="string"?new URL(n,typeof window>"u"?"server://singlefetch/":window.location.origin):n;return o.pathname==="/"?o.pathname=`_root.${i}`:s&&oa(o.pathname,s)==="/"?o.pathname=`${s.replace(/\/$/,"")}/_root.${i}`:o.pathname=`${o.pathname.replace(/\/$/,"")}.${i}`,o}async function E1(n,s){if(n.id in s)return s[n.id];try{let i=await import(n.module);return s[n.id]=i,i}catch(i){return console.error(`Error loading route module \`${n.module}\`, reloading page...`),console.error(i),window.__reactRouterContext&&window.__reactRouterContext.isSpaMode,window.location.reload(),new Promise(()=>{})}}function k1(n){return n==null?!1:n.href==null?n.rel==="preload"&&typeof n.imageSrcSet=="string"&&typeof n.imageSizes=="string":typeof n.rel=="string"&&typeof n.href=="string"}async function M1(n,s,i){let o=await Promise.all(n.map(async f=>{let d=s.routes[f.route.id];if(d){let h=await E1(d,i);return h.links?h.links():[]}return[]}));return D1(o.flat(1).filter(k1).filter(f=>f.rel==="stylesheet"||f.rel==="preload").map(f=>f.rel==="stylesheet"?{...f,rel:"prefetch",as:"style"}:{...f,rel:"prefetch"}))}function q0(n,s,i,o,f,d){let h=(x,g)=>i[g]?x.route.id!==i[g].route.id:!0,p=(x,g)=>i[g].pathname!==x.pathname||i[g].route.path?.endsWith("*")&&i[g].params["*"]!==x.params["*"];return d==="assets"?s.filter((x,g)=>h(x,g)||p(x,g)):d==="data"?s.filter((x,g)=>{let v=o.routes[x.route.id];if(!v||!v.hasLoader)return!1;if(h(x,g)||p(x,g))return!0;if(x.route.shouldRevalidate){let y=x.route.shouldRevalidate({currentUrl:new URL(f.pathname+f.search+f.hash,window.origin),currentParams:i[0]?.params||{},nextUrl:new URL(n,window.origin),nextParams:x.params,defaultShouldRevalidate:!0});if(typeof y=="boolean")return y}return!0}):[]}function R1(n,s,{includeHydrateFallback:i}={}){return q1(n.map(o=>{let f=s.routes[o.route.id];if(!f)return[];let d=[f.module];return f.clientActionModule&&(d=d.concat(f.clientActionModule)),f.clientLoaderModule&&(d=d.concat(f.clientLoaderModule)),i&&f.hydrateFallbackModule&&(d=d.concat(f.hydrateFallbackModule)),f.imports&&(d=d.concat(f.imports)),d}).flat(1))}function q1(n){return[...new Set(n)]}function T1(n){let s={},i=Object.keys(n).sort();for(let o of i)s[o]=n[o];return s}function D1(n,s){let i=new Set;return new Set(s),n.reduce((o,f)=>{let d=JSON.stringify(T1(f));return i.has(d)||(i.add(d),o.push({key:d,link:f})),o},[])}function Vx(){let n=m.useContext(ul);return Qf(n,"You must render this element inside a element"),n}function _1(){let n=m.useContext(No);return Qf(n,"You must render this element inside a element"),n}var Kf=m.createContext(void 0);Kf.displayName="FrameworkContext";function $x(){let n=m.useContext(Kf);return Qf(n,"You must render this element inside a element"),n}function B1(n,s){let i=m.useContext(Kf),[o,f]=m.useState(!1),[d,h]=m.useState(!1),{onFocus:p,onBlur:x,onMouseEnter:g,onMouseLeave:v,onTouchStart:y}=s,S=m.useRef(null);m.useEffect(()=>{if(n==="render"&&h(!0),n==="viewport"){let k=j=>{j.forEach(N=>{h(N.isIntersecting)})},w=new IntersectionObserver(k,{threshold:.5});return S.current&&w.observe(S.current),()=>{w.disconnect()}}},[n]),m.useEffect(()=>{if(o){let k=setTimeout(()=>{h(!0)},100);return()=>{clearTimeout(k)}}},[o]);let E=()=>{f(!0)},C=()=>{f(!1),h(!1)};return i?n!=="intent"?[d,S,{}]:[d,S,{onFocus:ri(p,E),onBlur:ri(x,C),onMouseEnter:ri(g,E),onMouseLeave:ri(v,C),onTouchStart:ri(y,E)}]:[!1,S,{}]}function ri(n,s){return i=>{n&&n(i),i.defaultPrevented||s(i)}}function O1({page:n,...s}){let{router:i}=Vx(),o=m.useMemo(()=>Rx(i.routes,n,i.basename),[i.routes,n,i.basename]);return o?m.createElement(z1,{page:n,matches:o,...s}):null}function L1(n){let{manifest:s,routeModules:i}=$x(),[o,f]=m.useState([]);return m.useEffect(()=>{let d=!1;return M1(n,s,i).then(h=>{d||f(h)}),()=>{d=!0}},[n,s,i]),o}function z1({page:n,matches:s,...i}){let o=fs(),{manifest:f,routeModules:d}=$x(),{basename:h}=Vx(),{loaderData:p,matches:x}=_1(),g=m.useMemo(()=>q0(n,s,x,f,o,"data"),[n,s,x,f,o]),v=m.useMemo(()=>q0(n,s,x,f,o,"assets"),[n,s,x,f,o]),y=m.useMemo(()=>{if(n===o.pathname+o.search+o.hash)return[];let C=new Set,k=!1;if(s.forEach(j=>{let N=f.routes[j.route.id];!N||!N.hasLoader||(!g.some(q=>q.route.id===j.route.id)&&j.route.id in p&&d[j.route.id]?.shouldRevalidate||N.hasClientLoader?k=!0:C.add(j.route.id))}),C.size===0)return[];let w=C1(n,h,"data");return k&&C.size>0&&w.searchParams.set("_routes",s.filter(j=>C.has(j.route.id)).map(j=>j.route.id).join(",")),[w.pathname+w.search]},[h,p,o,f,g,s,n,d]),S=m.useMemo(()=>R1(v,f),[v,f]),E=L1(v);return m.createElement(m.Fragment,null,y.map(C=>m.createElement("link",{key:C,rel:"prefetch",as:"fetch",href:C,...i})),S.map(C=>m.createElement("link",{key:C,rel:"modulepreload",href:C,...i})),E.map(({key:C,link:k})=>m.createElement("link",{key:C,nonce:i.nonce,...k})))}function U1(...n){return s=>{n.forEach(i=>{typeof i=="function"?i(s):i!=null&&(i.current=s)})}}var Gx=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";try{Gx&&(window.__reactRouterVersion="7.9.6")}catch{}function H1({basename:n,children:s,window:i}){let o=m.useRef();o.current==null&&(o.current=Cy({window:i,v5Compat:!0}));let f=o.current,[d,h]=m.useState({action:f.action,location:f.location}),p=m.useCallback(x=>{m.startTransition(()=>h(x))},[h]);return m.useLayoutEffect(()=>f.listen(p),[f,p]),m.createElement(x1,{basename:n,children:s,location:d.location,navigationType:d.action,navigator:f})}var Yx=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Fx=m.forwardRef(function({onClick:s,discover:i="render",prefetch:o="none",relative:f,reloadDocument:d,replace:h,state:p,target:x,to:g,preventScrollReset:v,viewTransition:y,...S},E){let{basename:C}=m.useContext(_n),k=typeof g=="string"&&Yx.test(g),w,j=!1;if(typeof g=="string"&&k&&(w=g,Gx))try{let z=new URL(window.location.href),H=g.startsWith("//")?new URL(z.protocol+g):new URL(g),V=oa(H.pathname,C);H.origin===z.origin&&V!=null?g=V+H.search+H.hash:j=!0}catch{Nn(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}let N=e1(g,{relative:f}),[q,M,O]=B1(o,S),K=Y1(g,{replace:h,state:p,target:x,preventScrollReset:v,relative:f,viewTransition:y});function _(z){s&&s(z),z.defaultPrevented||K(z)}let U=m.createElement("a",{...S,...O,href:w||N,onClick:j||d?s:_,ref:U1(E,M),target:x,"data-discover":!k&&i==="render"?"true":void 0});return q&&!k?m.createElement(m.Fragment,null,U,m.createElement(O1,{page:N})):U});Fx.displayName="Link";var V1=m.forwardRef(function({"aria-current":s="page",caseSensitive:i=!1,className:o="",end:f=!1,style:d,to:h,viewTransition:p,children:x,...g},v){let y=Ri(h,{relative:g.relative}),S=fs(),E=m.useContext(No),{navigator:C,basename:k}=m.useContext(_n),w=E!=null&&Z1(y)&&p===!0,j=C.encodeLocation?C.encodeLocation(y).pathname:y.pathname,N=S.pathname,q=E&&E.navigation&&E.navigation.location?E.navigation.location.pathname:null;i||(N=N.toLowerCase(),q=q?q.toLowerCase():null,j=j.toLowerCase()),q&&k&&(q=oa(q,k)||q);const M=j!=="/"&&j.endsWith("/")?j.length-1:j.length;let O=N===j||!f&&N.startsWith(j)&&N.charAt(M)==="/",K=q!=null&&(q===j||!f&&q.startsWith(j)&&q.charAt(j.length)==="/"),_={isActive:O,isPending:K,isTransitioning:w},U=O?s:void 0,z;typeof o=="function"?z=o(_):z=[o,O?"active":null,K?"pending":null,w?"transitioning":null].filter(Boolean).join(" ");let H=typeof d=="function"?d(_):d;return m.createElement(Fx,{...g,"aria-current":U,className:z,ref:v,style:H,to:h,viewTransition:p},typeof x=="function"?x(_):x)});V1.displayName="NavLink";var $1=m.forwardRef(({discover:n="render",fetcherKey:s,navigate:i,reloadDocument:o,replace:f,state:d,method:h=ao,action:p,onSubmit:x,relative:g,preventScrollReset:v,viewTransition:y,...S},E)=>{let C=Q1(),k=K1(p,{relative:g}),w=h.toLowerCase()==="get"?"get":"post",j=typeof p=="string"&&Yx.test(p),N=q=>{if(x&&x(q),q.defaultPrevented)return;q.preventDefault();let M=q.nativeEvent.submitter,O=M?.getAttribute("formmethod")||h;C(M||q.currentTarget,{fetcherKey:s,method:O,navigate:i,replace:f,state:d,relative:g,preventScrollReset:v,viewTransition:y})};return m.createElement("form",{ref:E,method:w,action:k,onSubmit:o?x:N,...S,"data-discover":!j&&n==="render"?"true":void 0})});$1.displayName="Form";function G1(n){return`${n} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function Xx(n){let s=m.useContext(ul);return ut(s,G1(n)),s}function Y1(n,{target:s,replace:i,state:o,preventScrollReset:f,relative:d,viewTransition:h}={}){let p=t1(),x=fs(),g=Ri(n,{relative:d});return m.useCallback(v=>{if(j1(v,s)){v.preventDefault();let y=i!==void 0?i:bi(x)===bi(g);p(n,{replace:y,state:o,preventScrollReset:f,relative:d,viewTransition:h})}},[x,p,g,i,o,s,n,f,d,h])}var F1=0,X1=()=>`__${String(++F1)}__`;function Q1(){let{router:n}=Xx("useSubmit"),{basename:s}=m.useContext(_n),i=d1();return m.useCallback(async(o,f={})=>{let{action:d,method:h,encType:p,formData:x,body:g}=w1(o,s);if(f.navigate===!1){let v=f.fetcherKey||X1();await n.fetch(v,i,f.action||d,{preventScrollReset:f.preventScrollReset,formData:x,body:g,formMethod:f.method||h,formEncType:f.encType||p,flushSync:f.flushSync})}else await n.navigate(f.action||d,{preventScrollReset:f.preventScrollReset,formData:x,body:g,formMethod:f.method||h,formEncType:f.encType||p,replace:f.replace,state:f.state,fromRouteId:i,flushSync:f.flushSync,viewTransition:f.viewTransition})},[n,s,i])}function K1(n,{relative:s}={}){let{basename:i}=m.useContext(_n),o=m.useContext(ua);ut(o,"useFormAction must be used inside a RouteContext");let[f]=o.matches.slice(-1),d={...Ri(n||".",{relative:s})},h=fs();if(n==null){d.search=h.search;let p=new URLSearchParams(d.search),x=p.getAll("index");if(x.some(v=>v==="")){p.delete("index"),x.filter(y=>y).forEach(y=>p.append("index",y));let v=p.toString();d.search=v?`?${v}`:""}}return(!n||n===".")&&f.route.index&&(d.search=d.search?d.search.replace(/^\?/,"?index&"):"?index"),i!=="/"&&(d.pathname=d.pathname==="/"?i:ra([i,d.pathname])),bi(d)}function Z1(n,{relative:s}={}){let i=m.useContext(Ox);ut(i!=null,"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?");let{basename:o}=Xx("useViewTransitionState"),f=Ri(n,{relative:s});if(!i.isTransitioning)return!1;let d=oa(i.currentLocation.pathname,o)||i.currentLocation.pathname,h=oa(i.nextLocation.pathname,o)||i.nextLocation.pathname;return mo(f.pathname,h)!=null||mo(f.pathname,d)!=null}const Dn=Object.create(null);Dn.open="0";Dn.close="1";Dn.ping="2";Dn.pong="3";Dn.message="4";Dn.upgrade="5";Dn.noop="6";const lo=Object.create(null);Object.keys(Dn).forEach(n=>{lo[Dn[n]]=n});const Cf={type:"error",data:"parser error"},Qx=typeof Blob=="function"||typeof Blob<"u"&&Object.prototype.toString.call(Blob)==="[object BlobConstructor]",Kx=typeof ArrayBuffer=="function",Zx=n=>typeof ArrayBuffer.isView=="function"?ArrayBuffer.isView(n):n&&n.buffer instanceof ArrayBuffer,Zf=({type:n,data:s},i,o)=>Qx&&s instanceof Blob?i?o(s):T0(s,o):Kx&&(s instanceof ArrayBuffer||Zx(s))?i?o(s):T0(new Blob([s]),o):o(Dn[n]+(s||"")),T0=(n,s)=>{const i=new FileReader;return i.onload=function(){const o=i.result.split(",")[1];s("b"+(o||""))},i.readAsDataURL(n)};function D0(n){return n instanceof Uint8Array?n:n instanceof ArrayBuffer?new Uint8Array(n):new Uint8Array(n.buffer,n.byteOffset,n.byteLength)}let ef;function I1(n,s){if(Qx&&n.data instanceof Blob)return n.data.arrayBuffer().then(D0).then(s);if(Kx&&(n.data instanceof ArrayBuffer||Zx(n.data)))return s(D0(n.data));Zf(n,!1,i=>{ef||(ef=new TextEncoder),s(ef.encode(i))})}const _0="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",mi=typeof Uint8Array>"u"?[]:new Uint8Array(256);for(let n=0;n<_0.length;n++)mi[_0.charCodeAt(n)]=n;const J1=n=>{let s=n.length*.75,i=n.length,o,f=0,d,h,p,x;n[n.length-1]==="="&&(s--,n[n.length-2]==="="&&s--);const g=new ArrayBuffer(s),v=new Uint8Array(g);for(o=0;o>4,v[f++]=(h&15)<<4|p>>2,v[f++]=(p&3)<<6|x&63;return g},P1=typeof ArrayBuffer=="function",If=(n,s)=>{if(typeof n!="string")return{type:"message",data:Ix(n,s)};const i=n.charAt(0);return i==="b"?{type:"message",data:W1(n.substring(1),s)}:lo[i]?n.length>1?{type:lo[i],data:n.substring(1)}:{type:lo[i]}:Cf},W1=(n,s)=>{if(P1){const i=J1(n);return Ix(i,s)}else return{base64:!0,data:n}},Ix=(n,s)=>{switch(s){case"blob":return n instanceof Blob?n:new Blob([n]);case"arraybuffer":default:return n instanceof ArrayBuffer?n:n.buffer}},Jx="",eS=(n,s)=>{const i=n.length,o=new Array(i);let f=0;n.forEach((d,h)=>{Zf(d,!1,p=>{o[h]=p,++f===i&&s(o.join(Jx))})})},tS=(n,s)=>{const i=n.split(Jx),o=[];for(let f=0;f{const o=i.length;let f;if(o<126)f=new Uint8Array(1),new DataView(f.buffer).setUint8(0,o);else if(o<65536){f=new Uint8Array(3);const d=new DataView(f.buffer);d.setUint8(0,126),d.setUint16(1,o)}else{f=new Uint8Array(9);const d=new DataView(f.buffer);d.setUint8(0,127),d.setBigUint64(1,BigInt(o))}n.data&&typeof n.data!="string"&&(f[0]|=128),s.enqueue(f),s.enqueue(i)})}})}let tf;function Xr(n){return n.reduce((s,i)=>s+i.length,0)}function Qr(n,s){if(n[0].length===s)return n.shift();const i=new Uint8Array(s);let o=0;for(let f=0;fMath.pow(2,21)-1){p.enqueue(Cf);break}f=v*Math.pow(2,32)+g.getUint32(4),o=3}else{if(Xr(i)n){p.enqueue(Cf);break}}}})}const Px=4;function At(n){if(n)return sS(n)}function sS(n){for(var s in At.prototype)n[s]=At.prototype[s];return n}At.prototype.on=At.prototype.addEventListener=function(n,s){return this._callbacks=this._callbacks||{},(this._callbacks["$"+n]=this._callbacks["$"+n]||[]).push(s),this};At.prototype.once=function(n,s){function i(){this.off(n,i),s.apply(this,arguments)}return i.fn=s,this.on(n,i),this};At.prototype.off=At.prototype.removeListener=At.prototype.removeAllListeners=At.prototype.removeEventListener=function(n,s){if(this._callbacks=this._callbacks||{},arguments.length==0)return this._callbacks={},this;var i=this._callbacks["$"+n];if(!i)return this;if(arguments.length==1)return delete this._callbacks["$"+n],this;for(var o,f=0;fPromise.resolve().then(s):(s,i)=>i(s,0),gn=typeof self<"u"?self:typeof window<"u"?window:Function("return this")(),lS="arraybuffer";function Wx(n,...s){return s.reduce((i,o)=>(n.hasOwnProperty(o)&&(i[o]=n[o]),i),{})}const iS=gn.setTimeout,rS=gn.clearTimeout;function Eo(n,s){s.useNativeTimers?(n.setTimeoutFn=iS.bind(gn),n.clearTimeoutFn=rS.bind(gn)):(n.setTimeoutFn=gn.setTimeout.bind(gn),n.clearTimeoutFn=gn.clearTimeout.bind(gn))}const oS=1.33;function cS(n){return typeof n=="string"?uS(n):Math.ceil((n.byteLength||n.size)*oS)}function uS(n){let s=0,i=0;for(let o=0,f=n.length;o=57344?i+=3:(o++,i+=4);return i}function eg(){return Date.now().toString(36).substring(3)+Math.random().toString(36).substring(2,5)}function fS(n){let s="";for(let i in n)n.hasOwnProperty(i)&&(s.length&&(s+="&"),s+=encodeURIComponent(i)+"="+encodeURIComponent(n[i]));return s}function dS(n){let s={},i=n.split("&");for(let o=0,f=i.length;o{this.readyState="paused",s()};if(this._polling||!this.writable){let o=0;this._polling&&(o++,this.once("pollComplete",function(){--o||i()})),this.writable||(o++,this.once("drain",function(){--o||i()}))}else i()}_poll(){this._polling=!0,this.doPoll(),this.emitReserved("poll")}onData(s){const i=o=>{if(this.readyState==="opening"&&o.type==="open"&&this.onOpen(),o.type==="close")return this.onClose({description:"transport closed by the server"}),!1;this.onPacket(o)};tS(s,this.socket.binaryType).forEach(i),this.readyState!=="closed"&&(this._polling=!1,this.emitReserved("pollComplete"),this.readyState==="open"&&this._poll())}doClose(){const s=()=>{this.write([{type:"close"}])};this.readyState==="open"?s():this.once("open",s)}write(s){this.writable=!1,eS(s,i=>{this.doWrite(i,()=>{this.writable=!0,this.emitReserved("drain")})})}uri(){const s=this.opts.secure?"https":"http",i=this.query||{};return this.opts.timestampRequests!==!1&&(i[this.opts.timestampParam]=eg()),!this.supportsBinary&&!i.sid&&(i.b64=1),this.createUri(s,i)}}let tg=!1;try{tg=typeof XMLHttpRequest<"u"&&"withCredentials"in new XMLHttpRequest}catch{}const pS=tg;function xS(){}class gS extends hS{constructor(s){if(super(s),typeof location<"u"){const i=location.protocol==="https:";let o=location.port;o||(o=i?"443":"80"),this.xd=typeof location<"u"&&s.hostname!==location.hostname||o!==s.port}}doWrite(s,i){const o=this.request({method:"POST",data:s});o.on("success",i),o.on("error",(f,d)=>{this.onError("xhr post error",f,d)})}doPoll(){const s=this.request();s.on("data",this.onData.bind(this)),s.on("error",(i,o)=>{this.onError("xhr poll error",i,o)}),this.pollXhr=s}}class Tn extends At{constructor(s,i,o){super(),this.createRequest=s,Eo(this,o),this._opts=o,this._method=o.method||"GET",this._uri=i,this._data=o.data!==void 0?o.data:null,this._create()}_create(){var s;const i=Wx(this._opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");i.xdomain=!!this._opts.xd;const o=this._xhr=this.createRequest(i);try{o.open(this._method,this._uri,!0);try{if(this._opts.extraHeaders){o.setDisableHeaderCheck&&o.setDisableHeaderCheck(!0);for(let f in this._opts.extraHeaders)this._opts.extraHeaders.hasOwnProperty(f)&&o.setRequestHeader(f,this._opts.extraHeaders[f])}}catch{}if(this._method==="POST")try{o.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch{}try{o.setRequestHeader("Accept","*/*")}catch{}(s=this._opts.cookieJar)===null||s===void 0||s.addCookies(o),"withCredentials"in o&&(o.withCredentials=this._opts.withCredentials),this._opts.requestTimeout&&(o.timeout=this._opts.requestTimeout),o.onreadystatechange=()=>{var f;o.readyState===3&&((f=this._opts.cookieJar)===null||f===void 0||f.parseCookies(o.getResponseHeader("set-cookie"))),o.readyState===4&&(o.status===200||o.status===1223?this._onLoad():this.setTimeoutFn(()=>{this._onError(typeof o.status=="number"?o.status:0)},0))},o.send(this._data)}catch(f){this.setTimeoutFn(()=>{this._onError(f)},0);return}typeof document<"u"&&(this._index=Tn.requestsCount++,Tn.requests[this._index]=this)}_onError(s){this.emitReserved("error",s,this._xhr),this._cleanup(!0)}_cleanup(s){if(!(typeof this._xhr>"u"||this._xhr===null)){if(this._xhr.onreadystatechange=xS,s)try{this._xhr.abort()}catch{}typeof document<"u"&&delete Tn.requests[this._index],this._xhr=null}}_onLoad(){const s=this._xhr.responseText;s!==null&&(this.emitReserved("data",s),this.emitReserved("success"),this._cleanup())}abort(){this._cleanup()}}Tn.requestsCount=0;Tn.requests={};if(typeof document<"u"){if(typeof attachEvent=="function")attachEvent("onunload",B0);else if(typeof addEventListener=="function"){const n="onpagehide"in gn?"pagehide":"unload";addEventListener(n,B0,!1)}}function B0(){for(let n in Tn.requests)Tn.requests.hasOwnProperty(n)&&Tn.requests[n].abort()}const vS=(function(){const n=ng({xdomain:!1});return n&&n.responseType!==null})();class bS extends gS{constructor(s){super(s);const i=s&&s.forceBase64;this.supportsBinary=vS&&!i}request(s={}){return Object.assign(s,{xd:this.xd},this.opts),new Tn(ng,this.uri(),s)}}function ng(n){const s=n.xdomain;try{if(typeof XMLHttpRequest<"u"&&(!s||pS))return new XMLHttpRequest}catch{}if(!s)try{return new gn[["Active"].concat("Object").join("X")]("Microsoft.XMLHTTP")}catch{}}const ag=typeof navigator<"u"&&typeof navigator.product=="string"&&navigator.product.toLowerCase()==="reactnative";class yS extends Jf{get name(){return"websocket"}doOpen(){const s=this.uri(),i=this.opts.protocols,o=ag?{}:Wx(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(o.headers=this.opts.extraHeaders);try{this.ws=this.createSocket(s,i,o)}catch(f){return this.emitReserved("error",f)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=s=>this.onClose({description:"websocket connection closed",context:s}),this.ws.onmessage=s=>this.onData(s.data),this.ws.onerror=s=>this.onError("websocket error",s)}write(s){this.writable=!1;for(let i=0;i{try{this.doWrite(o,d)}catch{}f&&Co(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){typeof this.ws<"u"&&(this.ws.onerror=()=>{},this.ws.close(),this.ws=null)}uri(){const s=this.opts.secure?"wss":"ws",i=this.query||{};return this.opts.timestampRequests&&(i[this.opts.timestampParam]=eg()),this.supportsBinary||(i.b64=1),this.createUri(s,i)}}const nf=gn.WebSocket||gn.MozWebSocket;class SS extends yS{createSocket(s,i,o){return ag?new nf(s,i,o):i?new nf(s,i):new nf(s)}doWrite(s,i){this.ws.send(i)}}class jS extends Jf{get name(){return"webtransport"}doOpen(){try{this._transport=new WebTransport(this.createUri("https"),this.opts.transportOptions[this.name])}catch(s){return this.emitReserved("error",s)}this._transport.closed.then(()=>{this.onClose()}).catch(s=>{this.onError("webtransport error",s)}),this._transport.ready.then(()=>{this._transport.createBidirectionalStream().then(s=>{const i=aS(Number.MAX_SAFE_INTEGER,this.socket.binaryType),o=s.readable.pipeThrough(i).getReader(),f=nS();f.readable.pipeTo(s.writable),this._writer=f.writable.getWriter();const d=()=>{o.read().then(({done:p,value:x})=>{p||(this.onPacket(x),d())}).catch(p=>{})};d();const h={type:"open"};this.query.sid&&(h.data=`{"sid":"${this.query.sid}"}`),this._writer.write(h).then(()=>this.onOpen())})})}write(s){this.writable=!1;for(let i=0;i{f&&Co(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){var s;(s=this._transport)===null||s===void 0||s.close()}}const AS={websocket:SS,webtransport:jS,polling:bS},NS=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,wS=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];function Ef(n){if(n.length>8e3)throw"URI too long";const s=n,i=n.indexOf("["),o=n.indexOf("]");i!=-1&&o!=-1&&(n=n.substring(0,i)+n.substring(i,o).replace(/:/g,";")+n.substring(o,n.length));let f=NS.exec(n||""),d={},h=14;for(;h--;)d[wS[h]]=f[h]||"";return i!=-1&&o!=-1&&(d.source=s,d.host=d.host.substring(1,d.host.length-1).replace(/;/g,":"),d.authority=d.authority.replace("[","").replace("]","").replace(/;/g,":"),d.ipv6uri=!0),d.pathNames=CS(d,d.path),d.queryKey=ES(d,d.query),d}function CS(n,s){const i=/\/{2,9}/g,o=s.replace(i,"/").split("/");return(s.slice(0,1)=="/"||s.length===0)&&o.splice(0,1),s.slice(-1)=="/"&&o.splice(o.length-1,1),o}function ES(n,s){const i={};return s.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,function(o,f,d){f&&(i[f]=d)}),i}const kf=typeof addEventListener=="function"&&typeof removeEventListener=="function",io=[];kf&&addEventListener("offline",()=>{io.forEach(n=>n())},!1);class Oa extends At{constructor(s,i){if(super(),this.binaryType=lS,this.writeBuffer=[],this._prevBufferLen=0,this._pingInterval=-1,this._pingTimeout=-1,this._maxPayload=-1,this._pingTimeoutTime=1/0,s&&typeof s=="object"&&(i=s,s=null),s){const o=Ef(s);i.hostname=o.host,i.secure=o.protocol==="https"||o.protocol==="wss",i.port=o.port,o.query&&(i.query=o.query)}else i.host&&(i.hostname=Ef(i.host).host);Eo(this,i),this.secure=i.secure!=null?i.secure:typeof location<"u"&&location.protocol==="https:",i.hostname&&!i.port&&(i.port=this.secure?"443":"80"),this.hostname=i.hostname||(typeof location<"u"?location.hostname:"localhost"),this.port=i.port||(typeof location<"u"&&location.port?location.port:this.secure?"443":"80"),this.transports=[],this._transportsByName={},i.transports.forEach(o=>{const f=o.prototype.name;this.transports.push(f),this._transportsByName[f]=o}),this.opts=Object.assign({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},i),this.opts.path=this.opts.path.replace(/\/$/,"")+(this.opts.addTrailingSlash?"/":""),typeof this.opts.query=="string"&&(this.opts.query=dS(this.opts.query)),kf&&(this.opts.closeOnBeforeunload&&(this._beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener("beforeunload",this._beforeunloadEventListener,!1)),this.hostname!=="localhost"&&(this._offlineEventListener=()=>{this._onClose("transport close",{description:"network connection lost"})},io.push(this._offlineEventListener))),this.opts.withCredentials&&(this._cookieJar=void 0),this._open()}createTransport(s){const i=Object.assign({},this.opts.query);i.EIO=Px,i.transport=s,this.id&&(i.sid=this.id);const o=Object.assign({},this.opts,{query:i,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[s]);return new this._transportsByName[s](o)}_open(){if(this.transports.length===0){this.setTimeoutFn(()=>{this.emitReserved("error","No transports available")},0);return}const s=this.opts.rememberUpgrade&&Oa.priorWebsocketSuccess&&this.transports.indexOf("websocket")!==-1?"websocket":this.transports[0];this.readyState="opening";const i=this.createTransport(s);i.open(),this.setTransport(i)}setTransport(s){this.transport&&this.transport.removeAllListeners(),this.transport=s,s.on("drain",this._onDrain.bind(this)).on("packet",this._onPacket.bind(this)).on("error",this._onError.bind(this)).on("close",i=>this._onClose("transport close",i))}onOpen(){this.readyState="open",Oa.priorWebsocketSuccess=this.transport.name==="websocket",this.emitReserved("open"),this.flush()}_onPacket(s){if(this.readyState==="opening"||this.readyState==="open"||this.readyState==="closing")switch(this.emitReserved("packet",s),this.emitReserved("heartbeat"),s.type){case"open":this.onHandshake(JSON.parse(s.data));break;case"ping":this._sendPacket("pong"),this.emitReserved("ping"),this.emitReserved("pong"),this._resetPingTimeout();break;case"error":const i=new Error("server error");i.code=s.data,this._onError(i);break;case"message":this.emitReserved("data",s.data),this.emitReserved("message",s.data);break}}onHandshake(s){this.emitReserved("handshake",s),this.id=s.sid,this.transport.query.sid=s.sid,this._pingInterval=s.pingInterval,this._pingTimeout=s.pingTimeout,this._maxPayload=s.maxPayload,this.onOpen(),this.readyState!=="closed"&&this._resetPingTimeout()}_resetPingTimeout(){this.clearTimeoutFn(this._pingTimeoutTimer);const s=this._pingInterval+this._pingTimeout;this._pingTimeoutTime=Date.now()+s,this._pingTimeoutTimer=this.setTimeoutFn(()=>{this._onClose("ping timeout")},s),this.opts.autoUnref&&this._pingTimeoutTimer.unref()}_onDrain(){this.writeBuffer.splice(0,this._prevBufferLen),this._prevBufferLen=0,this.writeBuffer.length===0?this.emitReserved("drain"):this.flush()}flush(){if(this.readyState!=="closed"&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){const s=this._getWritablePackets();this.transport.send(s),this._prevBufferLen=s.length,this.emitReserved("flush")}}_getWritablePackets(){if(!(this._maxPayload&&this.transport.name==="polling"&&this.writeBuffer.length>1))return this.writeBuffer;let i=1;for(let o=0;o0&&i>this._maxPayload)return this.writeBuffer.slice(0,o);i+=2}return this.writeBuffer}_hasPingExpired(){if(!this._pingTimeoutTime)return!0;const s=Date.now()>this._pingTimeoutTime;return s&&(this._pingTimeoutTime=0,Co(()=>{this._onClose("ping timeout")},this.setTimeoutFn)),s}write(s,i,o){return this._sendPacket("message",s,i,o),this}send(s,i,o){return this._sendPacket("message",s,i,o),this}_sendPacket(s,i,o,f){if(typeof i=="function"&&(f=i,i=void 0),typeof o=="function"&&(f=o,o=null),this.readyState==="closing"||this.readyState==="closed")return;o=o||{},o.compress=o.compress!==!1;const d={type:s,data:i,options:o};this.emitReserved("packetCreate",d),this.writeBuffer.push(d),f&&this.once("flush",f),this.flush()}close(){const s=()=>{this._onClose("forced close"),this.transport.close()},i=()=>{this.off("upgrade",i),this.off("upgradeError",i),s()},o=()=>{this.once("upgrade",i),this.once("upgradeError",i)};return(this.readyState==="opening"||this.readyState==="open")&&(this.readyState="closing",this.writeBuffer.length?this.once("drain",()=>{this.upgrading?o():s()}):this.upgrading?o():s()),this}_onError(s){if(Oa.priorWebsocketSuccess=!1,this.opts.tryAllTransports&&this.transports.length>1&&this.readyState==="opening")return this.transports.shift(),this._open();this.emitReserved("error",s),this._onClose("transport error",s)}_onClose(s,i){if(this.readyState==="opening"||this.readyState==="open"||this.readyState==="closing"){if(this.clearTimeoutFn(this._pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),kf&&(this._beforeunloadEventListener&&removeEventListener("beforeunload",this._beforeunloadEventListener,!1),this._offlineEventListener)){const o=io.indexOf(this._offlineEventListener);o!==-1&&io.splice(o,1)}this.readyState="closed",this.id=null,this.emitReserved("close",s,i),this.writeBuffer=[],this._prevBufferLen=0}}}Oa.protocol=Px;class kS extends Oa{constructor(){super(...arguments),this._upgrades=[]}onOpen(){if(super.onOpen(),this.readyState==="open"&&this.opts.upgrade)for(let s=0;s{o||(i.send([{type:"ping",data:"probe"}]),i.once("packet",y=>{if(!o)if(y.type==="pong"&&y.data==="probe"){if(this.upgrading=!0,this.emitReserved("upgrading",i),!i)return;Oa.priorWebsocketSuccess=i.name==="websocket",this.transport.pause(()=>{o||this.readyState!=="closed"&&(v(),this.setTransport(i),i.send([{type:"upgrade"}]),this.emitReserved("upgrade",i),i=null,this.upgrading=!1,this.flush())})}else{const S=new Error("probe error");S.transport=i.name,this.emitReserved("upgradeError",S)}}))};function d(){o||(o=!0,v(),i.close(),i=null)}const h=y=>{const S=new Error("probe error: "+y);S.transport=i.name,d(),this.emitReserved("upgradeError",S)};function p(){h("transport closed")}function x(){h("socket closed")}function g(y){i&&y.name!==i.name&&d()}const v=()=>{i.removeListener("open",f),i.removeListener("error",h),i.removeListener("close",p),this.off("close",x),this.off("upgrading",g)};i.once("open",f),i.once("error",h),i.once("close",p),this.once("close",x),this.once("upgrading",g),this._upgrades.indexOf("webtransport")!==-1&&s!=="webtransport"?this.setTimeoutFn(()=>{o||i.open()},200):i.open()}onHandshake(s){this._upgrades=this._filterUpgrades(s.upgrades),super.onHandshake(s)}_filterUpgrades(s){const i=[];for(let o=0;oAS[f]).filter(f=>!!f)),super(s,o)}};function RS(n,s="",i){let o=n;i=i||typeof location<"u"&&location,n==null&&(n=i.protocol+"//"+i.host),typeof n=="string"&&(n.charAt(0)==="/"&&(n.charAt(1)==="/"?n=i.protocol+n:n=i.host+n),/^(https?|wss?):\/\//.test(n)||(typeof i<"u"?n=i.protocol+"//"+n:n="https://"+n),o=Ef(n)),o.port||(/^(http|ws)$/.test(o.protocol)?o.port="80":/^(http|ws)s$/.test(o.protocol)&&(o.port="443")),o.path=o.path||"/";const d=o.host.indexOf(":")!==-1?"["+o.host+"]":o.host;return o.id=o.protocol+"://"+d+":"+o.port+s,o.href=o.protocol+"://"+d+(i&&i.port===o.port?"":":"+o.port),o}const qS=typeof ArrayBuffer=="function",TS=n=>typeof ArrayBuffer.isView=="function"?ArrayBuffer.isView(n):n.buffer instanceof ArrayBuffer,sg=Object.prototype.toString,DS=typeof Blob=="function"||typeof Blob<"u"&&sg.call(Blob)==="[object BlobConstructor]",_S=typeof File=="function"||typeof File<"u"&&sg.call(File)==="[object FileConstructor]";function Pf(n){return qS&&(n instanceof ArrayBuffer||TS(n))||DS&&n instanceof Blob||_S&&n instanceof File}function ro(n,s){if(!n||typeof n!="object")return!1;if(Array.isArray(n)){for(let i=0,o=n.length;i=0&&n.num{delete this.acks[s];for(let p=0;p{this.io.clearTimeoutFn(d),i.apply(this,p)};h.withError=!0,this.acks[s]=h}emitWithAck(s,...i){return new Promise((o,f)=>{const d=(h,p)=>h?f(h):o(p);d.withError=!0,i.push(d),this.emit(s,...i)})}_addToQueue(s){let i;typeof s[s.length-1]=="function"&&(i=s.pop());const o={id:this._queueSeq++,tryCount:0,pending:!1,args:s,flags:Object.assign({fromQueue:!0},this.flags)};s.push((f,...d)=>o!==this._queue[0]?void 0:(f!==null?o.tryCount>this._opts.retries&&(this._queue.shift(),i&&i(f)):(this._queue.shift(),i&&i(null,...d)),o.pending=!1,this._drainQueue())),this._queue.push(o),this._drainQueue()}_drainQueue(s=!1){if(!this.connected||this._queue.length===0)return;const i=this._queue[0];i.pending&&!s||(i.pending=!0,i.tryCount++,this.flags=i.flags,this.emit.apply(this,i.args))}packet(s){s.nsp=this.nsp,this.io._packet(s)}onopen(){typeof this.auth=="function"?this.auth(s=>{this._sendConnectPacket(s)}):this._sendConnectPacket(this.auth)}_sendConnectPacket(s){this.packet({type:_e.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},s):s})}onerror(s){this.connected||this.emitReserved("connect_error",s)}onclose(s,i){this.connected=!1,delete this.id,this.emitReserved("disconnect",s,i),this._clearAcks()}_clearAcks(){Object.keys(this.acks).forEach(s=>{if(!this.sendBuffer.some(o=>String(o.id)===s)){const o=this.acks[s];delete this.acks[s],o.withError&&o.call(this,new Error("socket has been disconnected"))}})}onpacket(s){if(s.nsp===this.nsp)switch(s.type){case _e.CONNECT:s.data&&s.data.sid?this.onconnect(s.data.sid,s.data.pid):this.emitReserved("connect_error",new Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));break;case _e.EVENT:case _e.BINARY_EVENT:this.onevent(s);break;case _e.ACK:case _e.BINARY_ACK:this.onack(s);break;case _e.DISCONNECT:this.ondisconnect();break;case _e.CONNECT_ERROR:this.destroy();const o=new Error(s.data.message);o.data=s.data.data,this.emitReserved("connect_error",o);break}}onevent(s){const i=s.data||[];s.id!=null&&i.push(this.ack(s.id)),this.connected?this.emitEvent(i):this.receiveBuffer.push(Object.freeze(i))}emitEvent(s){if(this._anyListeners&&this._anyListeners.length){const i=this._anyListeners.slice();for(const o of i)o.apply(this,s)}super.emit.apply(this,s),this._pid&&s.length&&typeof s[s.length-1]=="string"&&(this._lastOffset=s[s.length-1])}ack(s){const i=this;let o=!1;return function(...f){o||(o=!0,i.packet({type:_e.ACK,id:s,data:f}))}}onack(s){const i=this.acks[s.id];typeof i=="function"&&(delete this.acks[s.id],i.withError&&s.data.unshift(null),i.apply(this,s.data))}onconnect(s,i){this.id=s,this.recovered=i&&this._pid===i,this._pid=i,this.connected=!0,this.emitBuffered(),this.emitReserved("connect"),this._drainQueue(!0)}emitBuffered(){this.receiveBuffer.forEach(s=>this.emitEvent(s)),this.receiveBuffer=[],this.sendBuffer.forEach(s=>{this.notifyOutgoingListeners(s),this.packet(s)}),this.sendBuffer=[]}ondisconnect(){this.destroy(),this.onclose("io server disconnect")}destroy(){this.subs&&(this.subs.forEach(s=>s()),this.subs=void 0),this.io._destroy(this)}disconnect(){return this.connected&&this.packet({type:_e.DISCONNECT}),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}close(){return this.disconnect()}compress(s){return this.flags.compress=s,this}get volatile(){return this.flags.volatile=!0,this}timeout(s){return this.flags.timeout=s,this}onAny(s){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(s),this}prependAny(s){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(s),this}offAny(s){if(!this._anyListeners)return this;if(s){const i=this._anyListeners;for(let o=0;o0&&n.jitter<=1?n.jitter:0,this.attempts=0}fl.prototype.duration=function(){var n=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var s=Math.random(),i=Math.floor(s*this.jitter*n);n=(Math.floor(s*10)&1)==0?n-i:n+i}return Math.min(n,this.max)|0};fl.prototype.reset=function(){this.attempts=0};fl.prototype.setMin=function(n){this.ms=n};fl.prototype.setMax=function(n){this.max=n};fl.prototype.setJitter=function(n){this.jitter=n};class qf extends At{constructor(s,i){var o;super(),this.nsps={},this.subs=[],s&&typeof s=="object"&&(i=s,s=void 0),i=i||{},i.path=i.path||"/socket.io",this.opts=i,Eo(this,i),this.reconnection(i.reconnection!==!1),this.reconnectionAttempts(i.reconnectionAttempts||1/0),this.reconnectionDelay(i.reconnectionDelay||1e3),this.reconnectionDelayMax(i.reconnectionDelayMax||5e3),this.randomizationFactor((o=i.randomizationFactor)!==null&&o!==void 0?o:.5),this.backoff=new fl({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(i.timeout==null?2e4:i.timeout),this._readyState="closed",this.uri=s;const f=i.parser||VS;this.encoder=new f.Encoder,this.decoder=new f.Decoder,this._autoConnect=i.autoConnect!==!1,this._autoConnect&&this.open()}reconnection(s){return arguments.length?(this._reconnection=!!s,s||(this.skipReconnect=!0),this):this._reconnection}reconnectionAttempts(s){return s===void 0?this._reconnectionAttempts:(this._reconnectionAttempts=s,this)}reconnectionDelay(s){var i;return s===void 0?this._reconnectionDelay:(this._reconnectionDelay=s,(i=this.backoff)===null||i===void 0||i.setMin(s),this)}randomizationFactor(s){var i;return s===void 0?this._randomizationFactor:(this._randomizationFactor=s,(i=this.backoff)===null||i===void 0||i.setJitter(s),this)}reconnectionDelayMax(s){var i;return s===void 0?this._reconnectionDelayMax:(this._reconnectionDelayMax=s,(i=this.backoff)===null||i===void 0||i.setMax(s),this)}timeout(s){return arguments.length?(this._timeout=s,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&this.backoff.attempts===0&&this.reconnect()}open(s){if(~this._readyState.indexOf("open"))return this;this.engine=new MS(this.uri,this.opts);const i=this.engine,o=this;this._readyState="opening",this.skipReconnect=!1;const f=jn(i,"open",function(){o.onopen(),s&&s()}),d=p=>{this.cleanup(),this._readyState="closed",this.emitReserved("error",p),s?s(p):this.maybeReconnectOnOpen()},h=jn(i,"error",d);if(this._timeout!==!1){const p=this._timeout,x=this.setTimeoutFn(()=>{f(),d(new Error("timeout")),i.close()},p);this.opts.autoUnref&&x.unref(),this.subs.push(()=>{this.clearTimeoutFn(x)})}return this.subs.push(f),this.subs.push(h),this}connect(s){return this.open(s)}onopen(){this.cleanup(),this._readyState="open",this.emitReserved("open");const s=this.engine;this.subs.push(jn(s,"ping",this.onping.bind(this)),jn(s,"data",this.ondata.bind(this)),jn(s,"error",this.onerror.bind(this)),jn(s,"close",this.onclose.bind(this)),jn(this.decoder,"decoded",this.ondecoded.bind(this)))}onping(){this.emitReserved("ping")}ondata(s){try{this.decoder.add(s)}catch(i){this.onclose("parse error",i)}}ondecoded(s){Co(()=>{this.emitReserved("packet",s)},this.setTimeoutFn)}onerror(s){this.emitReserved("error",s)}socket(s,i){let o=this.nsps[s];return o?this._autoConnect&&!o.active&&o.connect():(o=new lg(this,s,i),this.nsps[s]=o),o}_destroy(s){const i=Object.keys(this.nsps);for(const o of i)if(this.nsps[o].active)return;this._close()}_packet(s){const i=this.encoder.encode(s);for(let o=0;os()),this.subs.length=0,this.decoder.destroy()}_close(){this.skipReconnect=!0,this._reconnecting=!1,this.onclose("forced close")}disconnect(){return this._close()}onclose(s,i){var o;this.cleanup(),(o=this.engine)===null||o===void 0||o.close(),this.backoff.reset(),this._readyState="closed",this.emitReserved("close",s,i),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;const s=this;if(this.backoff.attempts>=this._reconnectionAttempts)this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{const i=this.backoff.duration();this._reconnecting=!0;const o=this.setTimeoutFn(()=>{s.skipReconnect||(this.emitReserved("reconnect_attempt",s.backoff.attempts),!s.skipReconnect&&s.open(f=>{f?(s._reconnecting=!1,s.reconnect(),this.emitReserved("reconnect_error",f)):s.onreconnect()}))},i);this.opts.autoUnref&&o.unref(),this.subs.push(()=>{this.clearTimeoutFn(o)})}}onreconnect(){const s=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",s)}}const oi={};function oo(n,s){typeof n=="object"&&(s=n,n=void 0),s=s||{};const i=RS(n,s.path||"/socket.io"),o=i.source,f=i.id,d=i.path,h=oi[f]&&d in oi[f].nsps,p=s.forceNew||s["force new connection"]||s.multiplex===!1||h;let x;return p?x=new qf(o,s):(oi[f]||(oi[f]=new qf(o,s)),x=oi[f]),i.query&&!s.query&&(s.query=i.queryKey),x.socket(i.path,s)}Object.assign(oo,{Manager:qf,Socket:lg,io:oo,connect:oo});const ig="roverSettings",GS=3600*24*365;function YS(n){try{const s=decodeURIComponent(n??"");return JSON.parse(s)}catch(s){return console.warn("Failed to parse settings cookie",s),null}}function Tf(){if(typeof document>"u")return{};const n=`${ig}=`,s=document.cookie.split(";").map(o=>o.trim()).find(o=>o.startsWith(n));if(!s)return{};const i=s.substring(n.length);return YS(i)??{}}function L0(n){if(typeof document>"u")return!1;try{const s=encodeURIComponent(JSON.stringify(n??{})),i=`${ig}=${s}; path=/; max-age=${GS}; samesite=strict`;return document.cookie=i,!0}catch(s){return console.warn("Failed to write settings cookie",s),!1}}const rg=window.location.origin;console.info("[socket] connecting to",rg);const FS=Tf(),XS=FS?.page?.connectionTransport||"websocket",QS=XS==="polling"?["polling"]:["websocket","polling"],ed=oo(rg,{transports:QS,timeout:15e3});ed.on("connect_error",n=>console.error("connect_error",n.code,n.message,n.data));const og=m.createContext(ed),KS=({children:n})=>r.jsx(og.Provider,{value:ed,children:n}),tn=()=>m.useContext(og),ZS={connected:!1,session:null,logs:[],adminLogs:[],llmCommentaryState:null,llmCommentaryStatus:null,alerts:[]},td=m.createContext(null);function IS(n){return m.useCallback((s,i={})=>new Promise((o,f)=>{n.emit(s,i,(d={})=>{d.error?f(new Error(d.error)):o(d)})}),[n])}function JS(n){return typeof n=="function"?n:s=>s}function PS({children:n}){const s=tn(),i=IS(s),o=m.useRef({...ZS,connected:s.connected}),f=m.useRef(new Set),d=m.useCallback(()=>o.current,[]),h=m.useCallback(v=>{const y=o.current,S=typeof v=="function"?v(y):{...y,...v||{}};S!==y&&(o.current=S,f.current.forEach(E=>{const C=E.selector(S);E.equalityFn(E.current,C)||(E.current=C,E.listener(C))}))},[]),p=m.useCallback((v,y,S=Object.is)=>{const E=JS(v),C={selector:E,equalityFn:S,listener:y,current:E(o.current)};return f.current.add(C),()=>{f.current.delete(C)}},[]);m.useEffect(()=>{const v=()=>{h(S=>S.connected?S:{...S,connected:!0})},y=()=>{h(S=>S.connected?{...S,connected:!1}:S)};return s.on("connect",v),s.on("disconnect",y),()=>{s.off("connect",v),s.off("disconnect",y)}},[h,s]),m.useEffect(()=>{function v(j){h(N=>({...N,session:j}))}function y(j=[]){h(N=>({...N,logs:j}))}function S(j){h(N=>({...N,logs:[...N.logs.slice(-199),j]}))}function E(j=[]){h(N=>({...N,adminLogs:j}))}function C(j){h(N=>({...N,adminLogs:[...N.adminLogs.slice(-199),j]}))}function k(j=null){const N=j&&typeof j=="object"?j:null,q=N?.debug?.status&&typeof N.debug.status=="object"?N.debug.status:null;h(M=>({...M,llmCommentaryState:N,llmCommentaryStatus:q}))}function w(j={}){h(N=>({...N,alerts:[...N.alerts.slice(-49),{...j,receivedAt:Date.now()}]}))}return s.on("session:sync",v),s.on("log:init",y),s.on("log:entry",S),s.on("adminlog:init",E),s.on("adminlog:entry",C),s.on("llm:state",k),s.on("alert:new",w),()=>{s.off("session:sync",v),s.off("log:init",y),s.off("log:entry",S),s.off("adminlog:init",E),s.off("adminlog:entry",C),s.off("llm:state",k),s.off("alert:new",w)}},[h,s]);const x=m.useMemo(()=>({login:(v,y)=>i("auth:login",{username:v,password:y}),identifySession:({cookieUserId:v,nickname:y}={})=>i("session:identify",{cookieUserId:v,nickname:y}),setRole:v=>i("session:setRole",{role:v}),requestControl:(v,y={})=>i("session:requestControl",{roverId:v,...y}),releaseControl:v=>i("session:releaseControl",{roverId:v}),subscribeAll:()=>i("session:subscribeAll"),lockRover:(v,y)=>i("session:lockRover",{roverId:v,locked:y}),setMode:v=>i("setMode",{mode:v}),homeAssistantToggle:v=>i("homeAssistant:toggle",{entityId:v}),homeAssistantSetState:(v,y)=>i("homeAssistant:setState",{entityId:v,state:y}),homeAssistantSetLightColor:(v,y)=>i("homeAssistant:lightColor",{entityId:v,rgbColor:y}),homeAssistantSetLightWhite:v=>i("homeAssistant:lightWhite",{entityId:v}),neatoStart:()=>i("neato:start"),neatoSendHome:()=>i("neato:sendHome"),neatoLocate:()=>i("neato:locate"),neatoClearErrors:()=>i("neato:clearErrors"),setNickname:v=>i("nickname:set",{nickname:v}),requestVerification:()=>i("verification:request"),requestPrivateRoverAccess:v=>i("session:privateRover:requestAccess",{roverId:v}),triggerReplay:(v=[])=>i("replay:trigger",{sources:v}),setCommunityGoal:v=>i("communityGoal:set",{text:v}),setAdminReason:v=>i("adminReason:set",{text:v}),rebootRover:v=>i("command",{roverId:v,type:"reboot",data:{reboot:{}}}),rebootServer:()=>i("server:reboot"),playUploadedAudio:({roverId:v,name:y,mime:S,dataBase64:E})=>i("audio:uploadPlay",{roverId:v,name:y,mime:S,dataBase64:E}),stopUploadedAudio:v=>i("audio:uploadStop",{roverId:v}),startMicWhip:v=>i("audio:micWhipStart",{roverId:v}),readyMicWhip:v=>i("audio:micWhipReady",{roverId:v}),stopMicWhip:v=>i("audio:micWhipStop",{roverId:v}),setAudioLevels:(v={})=>i("audioLevels:set",v),setPrivateSafety:(v,y={})=>i("session:privateSafety:set",{roverId:v,safety:y}),llmControl:(v,y={})=>i("llm:control",{controls:{action:v,...y}}),pushAlert:v=>h(y=>({...y,alerts:[...y.alerts.slice(-49),{...v,receivedAt:Date.now(),id:v.id||Math.random().toString(36).slice(2)}]}))}),[i,h]),g=m.useMemo(()=>({getState:d,subscribe:p,actions:x}),[x,d,p]);return r.jsx(td.Provider,{value:g,children:n})}function ft(n,s=Object.is){const i=m.useContext(td);if(!i)throw new Error("useSessionSelector must be used within SessionProvider");const o=m.useRef(n);o.current=n;const f=m.useRef(s);f.current=s;const[d,h]=m.useState(()=>n(i.getState()));return m.useEffect(()=>(h(p=>{const x=o.current(i.getState());return f.current(p,x)?p:x}),i.subscribe(p=>o.current(p),p=>{h(x=>f.current(x,p)?x:p)},(p,x)=>f.current(p,x))),[i]),d}function wn(){const n=m.useContext(td);if(!n)throw new Error("useSessionActions must be used within SessionProvider");return n.actions}function nn(){const n=ft(i=>i),s=wn();return m.useMemo(()=>({...n,...s}),[s,n])}const cg=m.createContext({frames:{}});function WS({children:n}){const s=tn(),[i,o]=m.useState({});m.useEffect(()=>{function d({roverId:h,sensors:p={},frame:x={}}){h&&o(g=>({...g,[h]:{roverId:h,sensors:p,raw:x?.data||null,receivedAt:Date.now()}}))}return s.on("sensorFrame",d),()=>{s.off("sensorFrame",d)}},[s]);const f=m.useMemo(()=>({frames:i}),[i]);return r.jsx(cg.Provider,{value:f,children:n})}function nd(){return m.useContext(cg).frames}function dl(n){const s=nd();return n?s[n]??null:null}const ej=650,tj={161:{red:!0},164:{green:!0},165:{force:!0},168:{red:!0,green:!0},169:{red:!0,force:!0},172:{green:!0,force:!0},173:{red:!0,green:!0,force:!0}};function af(n){if(typeof n!="number"||n<=0)return null;const s=tj[n];return s?{code:n,...s}:null}function nj(n,s={}){const i=s.holdMs||ej,[o,f]=m.useState({left:null,right:null,omni:null}),[d,h]=m.useState(0);return m.useEffect(()=>{const p=setInterval(()=>h(Date.now()),Math.max(i/2,100));return()=>clearInterval(p)},[i]),m.useEffect(()=>{const p=Date.now(),x=af(n?.infraredCharacterLeft),g=af(n?.infraredCharacterRight),v=af(n?.infraredCharacterOmni);!x&&!g&&!v||f(y=>({left:x?{...x,ts:p}:y.left,right:g?{...g,ts:p}:y.right,omni:v?{...v,ts:p}:y.omni}))},[n?.infraredCharacterLeft,n?.infraredCharacterRight,n?.infraredCharacterOmni]),m.useEffect(()=>{const{left:p,right:x,omni:g}=o;if(!(p?.ts||x?.ts||g?.ts))return;const y=new Date().toISOString();console.debug("[DockIR]",y,{left:p?.code??0,omni:g?.code??0,right:x?.code??0})},[o.left?.code,o.right?.code,o.omni?.code]),m.useMemo(()=>{const p=Date.now(),x=w=>{if(!w)return{active:!1,red:!1,green:!1,force:!1,age:null,code:null};const j=p-w.ts,N=j<=i;return{active:N,age:j,code:w.code,red:!!(w.red&&N),green:!!(w.green&&N),force:!!(w.force&&N)}},g=x(o.left),v=x(o.right),y=x(o.omni),S=g.force||v.force||y.force,E=g.active||v.active||y.active,C=g.active&&!v.active?"right":v.active&&!g.active?"left":"center",k=(v.active?1:0)-(g.active?1:0);return{visible:E,forceDetected:S,left:g,right:v,omni:y,bias:C,balance:Math.max(-1,Math.min(1,k))}},[o.left,o.right,o.omni,i,d])}function aj(){ft(S=>S.connected);const n=ft(S=>S.session),s=n?.assignment?.roverId,i=dl(s),o=i?.sensors||{},f=nj(o),d=o.voltageMv!=null?`${(o.voltageMv/1e3).toFixed(2)} V`:null,h=o.currentMa!=null?`${o.currentMa} mA`:null,p=o.batteryTemperatureC!=null?`${o.batteryTemperatureC} °C`:null,x=o.batteryChargeMah,g=o.batteryCapacityMah;i?.receivedAt&&new Date(i.receivedAt).toLocaleTimeString();const v=i?.raw?i.raw:null,y=s?n?.activeDrivers?.[s]:null;return m.useMemo(()=>s?y?y===n?.socketId?"You":(n?.users||[]).find(E=>E.socketId===y)?.nickname||y.slice(0,6):"Available":"n/a",[y,s,n?.socketId,n?.users]),r.jsxs("section",{className:"panel-section space-y-0.5 text-base text-slate-100",children:[s?i?r.jsxs(r.Fragment,{children:[r.jsx(sj,{sensors:o,voltage:d,current:h,batteryTemp:p,charge:x,capacity:g}),r.jsx(lj,{sensors:o,dockState:f})]}):r.jsx("p",{className:"text-sm text-slate-500",children:"Waiting for sensor frames…"}):r.jsx("p",{className:"text-sm text-slate-500",children:"Assign a rover to view sensors."}),v&&r.jsx("pre",{className:"surface whitespace-pre-wrap break-words text-xs text-lime-300",children:v})]})}function sj({sensors:n,voltage:s,current:i,batteryTemp:o,charge:f,capacity:d}){const h=f!=null&&d?`${Math.round(f/d*100)}`:"--",p=n?.oiMode?.label||"--",x=n?.chargingSources?.homeBase?"Yes":"No",g=n?.chargingState?.label||"--";return r.jsxs("div",{className:"grid grid-cols-2 gap-0.5 md:grid-cols-3",children:[r.jsx(aa,{label:"Voltage",value:s??"--"}),r.jsx(aa,{label:"Current",value:i??"--"}),r.jsx(aa,{label:"Battery temp",value:o??"--"}),r.jsx(aa,{label:"Charge",value:f!=null?`${f} mAh`:"--"}),r.jsx(aa,{label:"Capacity",value:d!=null?`${d} mAh`:"--"}),r.jsx(aa,{label:"Charge",value:h}),r.jsx(aa,{label:"OI mode",value:p}),r.jsx(aa,{label:"Docked",value:x}),r.jsx(aa,{label:"Charging state",value:g})]})}function aa({label:n,value:s}){return r.jsxs("div",{className:"surface flex items-center justify-between gap-0.5 px-1 py-0.5 text-sm",children:[r.jsx("span",{className:"text-slate-400",children:n}),r.jsx("span",{className:"text-slate-100",children:s})]})}function lj({sensors:n,dockState:s}){const i=n?.bumpsAndWheelDrops||{},o=n?.wheelOvercurrents||{},f=[{label:"Left",value:n?.lightBumpLeftSignal},{label:"Front Left",value:n?.lightBumpFrontLeftSignal},{label:"Center Left",value:n?.lightBumpCenterLeftSignal},{label:"Center Right",value:n?.lightBumpCenterRightSignal},{label:"Front Right",value:n?.lightBumpFrontRightSignal},{label:"Right",value:n?.lightBumpRightSignal}],d=[{label:"Left",value:n?.cliffLeftSignal,active:n?.cliffLeft},{label:"Front Left",value:n?.cliffFrontLeftSignal,active:n?.cliffFrontLeft},{label:"Front Right",value:n?.cliffFrontRightSignal,active:n?.cliffFrontRight},{label:"Right",value:n?.cliffRightSignal,active:n?.cliffRight}],h=[{label:"Wheel L",value:n?.wheelLeftCurrentMa,over:o.leftWheel},{label:"Wheel R",value:n?.wheelRightCurrentMa,over:o.rightWheel},{label:"Side brush",value:n?.sideBrushCurrentMa,over:o.sideBrush},{label:"Main brush",value:n?.mainBrushCurrentMa,over:o.mainBrush}];return r.jsxs("div",{className:"grid gap-0.5 md:grid-cols-2",children:[r.jsxs(Ws,{title:"Dock IR",children:[r.jsx(ij,{sensors:n}),r.jsx(rj,{state:s})]}),r.jsxs(Ws,{title:"Bumps & drops",children:[r.jsx(sa,{label:"Bump L",value:r.jsx(ci,{active:i.bumpLeft})}),r.jsx(sa,{label:"Bump R",value:r.jsx(ci,{active:i.bumpRight})}),r.jsx(sa,{label:"Wheel drop L",value:r.jsx(ci,{active:i.wheelDropLeft,tone:"amber"})}),r.jsx(sa,{label:"Wheel drop R",value:r.jsx(ci,{active:i.wheelDropRight,tone:"amber"})})]}),r.jsx(Ws,{title:"Light bumps (raw)",children:f.map(p=>r.jsx(sa,{label:p.label,value:ui(p.value)},p.label))}),r.jsx(Ws,{title:"Cliff sensors",children:d.map(p=>r.jsx(sa,{label:p.label,value:`${ui(p.value)} · ${p.active?"bool: true":"bool: false"}`},p.label))}),r.jsx(Ws,{title:"Currents",children:h.map(p=>r.jsx(sa,{label:p.label,value:r.jsxs("span",{className:"flex items-center gap-0.5",children:[r.jsx("span",{children:ui(p.value,"mA")}),p.over?r.jsx(ci,{active:!0,tone:"red",label:"over"}):null]})},p.label))}),r.jsxs(Ws,{title:"Dirt detect",children:[r.jsx(sa,{label:"Left",value:ui(n?.dirtDetectLeft)}),r.jsx(sa,{label:"Right",value:ui(n?.dirtDetect)})]})]})}function Ws({title:n,children:s}){return r.jsxs("div",{className:"surface space-y-0.5 p-1 text-sm",children:[r.jsx("div",{className:"text-[0.8rem] uppercase tracking-wide text-slate-400",children:n}),r.jsx("div",{className:"space-y-0.5",children:s})]})}function sa({label:n,value:s}){return r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{className:"text-slate-300",children:n}),r.jsx("span",{className:"text-slate-100",children:s})]})}function ci({active:n,tone:s="green",label:i}){const o="rounded px-1.5 py-0.5 text-[0.7rem] font-semibold",f=s==="red"?n?"bg-red-600 text-white":"bg-slate-700 text-slate-300":s==="amber"?n?"bg-amber-500 text-slate-900":"bg-slate-700 text-slate-300":n?"bg-emerald-600 text-white":"bg-slate-700 text-slate-300";return r.jsx("span",{className:`${o} ${f}`,children:i||(n?"true":"false")})}function ui(n,s){return n==null||Number.isNaN(n)?"--":s?`${n} ${s}`:n}function ij({sensors:n}){const s=n?.infraredCharacterLeft,i=n?.infraredCharacterRight,o=n?.infraredCharacterOmni,f=d=>r.jsx("span",{className:`rounded px-1 py-0.25 text-[0.7rem] font-semibold ${d?"bg-emerald-600 text-white":"bg-slate-700 text-slate-300"}`,children:d||"--"});return r.jsxs("div",{className:"flex items-center justify-between gap-0.5 text-xs text-slate-200",children:[r.jsxs("div",{className:"flex items-center gap-0.5",children:[r.jsx("span",{className:"text-slate-400",children:"L"}),f(s)]}),r.jsxs("div",{className:"flex items-center gap-0.5",children:[r.jsx("span",{className:"text-slate-400",children:"O"}),f(o)]}),r.jsxs("div",{className:"flex items-center gap-0.5",children:[r.jsx("span",{className:"text-slate-400",children:"R"}),f(i)]})]})}function rj({state:n}){if(!n)return null;const s=o=>{const f=[];return o?.red&&f.push("R"),o?.green&&f.push("G"),o?.force&&f.push("F"),f.length?f.join(""):"none"},i=o=>o?.age!=null?`${o.age}ms`:"--";return r.jsxs("div",{className:"text-[0.7rem] text-slate-400",children:[r.jsx("div",{children:`Left: ${n.left.code??"--"} (${s(n.left)}) · age ${i(n.left)}`}),r.jsx("div",{children:`Omni: ${n.omni.code??"--"} (${s(n.omni)}) · age ${i(n.omni)}`}),r.jsx("div",{children:`Right: ${n.right.code??"--"} (${s(n.right)}) · age ${i(n.right)}`})]})}const ug=m.createContext(null);function oj({children:n}){const[s,i]=m.useState(()=>({status:"loading",data:{}}));m.useEffect(()=>{const p=Tf();i({status:"ready",data:p??{}})},[]);const o=m.useCallback(()=>{const p=Tf();i({status:"ready",data:p??{}})},[]),f=m.useCallback(p=>{const x=L0(p??{});return i(x?{status:"ready",data:p??{}}:g=>({...g,status:"error"})),x},[]),d=m.useCallback((p,x)=>{i(g=>{const v=g.data[p]||{},y=typeof x=="function"?x(v):{...v,...x??{}},S={...g.data,[p]:y};return L0(S)?{status:"ready",data:S}:{...g,status:"error"}})},[]),h=m.useMemo(()=>({data:s.data,status:s.status,reload:o,saveAll:f,setNamespace:d}),[s,o,f,d]);return r.jsx(ug.Provider,{value:h,children:n})}function cj(){const n=m.useContext(ug);if(!n)throw new Error("useSettings must be used within SettingsProvider");return n}function He(n,s={}){const{data:i,status:o,setNamespace:f}=cj(),d=i[n]??s??{},h=m.useCallback(g=>{f(n,v=>{const y=v??{};return typeof g=="function"?g(y):{...y,...g??{}}})},[n,f]),p=m.useCallback(g=>{f(n,()=>g??{})},[n,f]),x=m.useCallback(()=>{const g=typeof s=="object"?{...s}:s;f(n,()=>g??{})},[s,n,f]);return{value:d,status:o,save:h,replace:p,reset:x}}const uj=/^#[0-9A-Fa-f]{6}$/;function ad(n){const s=typeof n=="string"?n.trim():"";return!s||!uj.test(s)?null:s.toUpperCase()}function ca(n,s=.2){const i=ad(n);if(!i)return;const o=Number.isFinite(s)?Math.max(0,Math.min(1,s)):.2,f=fg(i);if(f)return{borderColor:`rgba(${f.r}, ${f.g}, ${f.b}, 0.65)`,backgroundColor:`rgba(${f.r}, ${f.g}, ${f.b}, ${o})`}}function fj(n,s=.2){const i=ad(n);if(!i)return;const o=Number.isFinite(s)?Math.max(0,Math.min(1,s)):.2,f=fg(i);if(f)return{borderColor:`rgba(${f.r}, ${f.g}, ${f.b}, 0.55)`,backgroundColor:`rgba(${f.r}, ${f.g}, ${f.b}, ${o})`}}function fg(n){const s=ad(n);return s?{r:parseInt(s.slice(1,3),16),g:parseInt(s.slice(3,5),16),b:parseInt(s.slice(5,7),16)}:null}function dj(n=[]){return n.map(s=>!s?.type||!s?.id?null:{type:s.type,id:String(s.id),label:s.label||String(s.id),color:s.color||null,key:`${s.type}:${s.id}`}).filter(Boolean)}function sd({panelId:n="replay-sources",fillHeight:s=!1}){const{session:i,triggerReplay:o}=nn(),f=dj(i?.replaySources||[]),{value:d,save:h}=He("replaySources",{}),[p,x]=m.useState([]),[g,v]=m.useState(!1),[y,S]=m.useState(null),[E,C]=m.useState(null),k=i?.replay||null,[w,j]=m.useState(0),N=m.useMemo(()=>{const z=i?.assignment?.roverId;return z?[`rover:${z}`]:[]},[i?.assignment?.roverId]);m.useEffect(()=>{const z=d?.[n];if(Array.isArray(z)&&z.length){x(z);return}x(N)},[d?.[n],N,n]),m.useEffect(()=>{const z=new Set(f.map(H=>H.key));x(H=>H.filter(V=>z.has(V)))},[f]);const q=m.useMemo(()=>({rovers:f.filter(z=>z.type==="rover"),rooms:f.filter(z=>z.type==="room")}),[f]);m.useEffect(()=>{if(!k?.lastTriggeredAt||!k?.cooldownMs){j(0);return}const z=()=>{const V=k.lastTriggeredAt+k.cooldownMs-Date.now();j(Math.max(0,V))};z();const H=setInterval(z,250);return()=>clearInterval(H)},[k?.lastTriggeredAt,k?.cooldownMs,k?.remainingMs]);const M=g||i?.mode==="lockdown"||w>0||!p.length,O=z=>{x(H=>{const V=H.includes(z)?H.filter(W=>W!==z):[...H,z];return h(W=>({...W||{},[n]:V})),V}),C(null)},K=async()=>{if(!M){v(!0),S(null),C(null);try{const z=p.map(H=>{const[V,W]=H.split(":");return{type:V,id:W}});await o(z),C("Replay sent. Check the Discord replay channel.")}catch(z){S(z.message)}finally{v(!1)}}},_=s?"h-full flex flex-col":"",U=s?"flex-1 min-h-0 overflow-y-auto":"";return r.jsxs("section",{className:`panel-section p-0.75 text-sm ${_}`,children:[r.jsxs("header",{className:"panel-muted flex items-center justify-between text-xs",children:[r.jsx("span",{children:"Replay Sources"}),r.jsx("span",{children:f.length})]}),r.jsxs("div",{className:`grid gap-0.5 md:grid-cols-2 ${U}`,children:[r.jsx(z0,{title:"Rovers",items:q.rovers,selected:p,onToggle:O}),r.jsx(z0,{title:"Room Cams",items:q.rooms,selected:p,onToggle:O})]}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("button",{type:"button",className:"button-dark w-full text-xs disabled:opacity-40",onClick:K,disabled:M,children:w>0?`Replay (${Math.ceil(w/1e3)}s)`:g?"Replay…":"Replay"}),y?r.jsx("div",{className:"text-xs text-amber-400",children:y}):null,E?r.jsx("div",{className:"text-xs text-emerald-300",children:E}):null]})]})}function z0({title:n,items:s,selected:i,onToggle:o}){return s.length?r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("div",{className:"panel-muted text-xs",children:n}),r.jsx("div",{className:"space-y-0.5",children:s.map(f=>r.jsxs("label",{className:"surface flex items-center gap-0.5 text-xs",children:[r.jsx("input",{type:"checkbox",checked:i.includes(f.key),onChange:()=>o(f.key),className:"accent-emerald-400"}),r.jsx("span",{className:`truncate ${f.type==="rover"?"rounded px-1 py-[1px] border border-transparent":""}`,style:f.type==="rover"?ca(f.color,.16):void 0,children:f.label})]},f.key))})]}):null}var dg={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},U0=us.createContext&&us.createContext(dg),mj=["attr","size","title"];function hj(n,s){if(n==null)return{};var i=pj(n,s),o,f;if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(n);for(f=0;f=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(i[o]=n[o])}return i}function pj(n,s){if(n==null)return{};var i={};for(var o in n)if(Object.prototype.hasOwnProperty.call(n,o)){if(s.indexOf(o)>=0)continue;i[o]=n[o]}return i}function ho(){return ho=Object.assign?Object.assign.bind():function(n){for(var s=1;sus.createElement(s.tag,po({key:i},s.attr),mg(s.child)))}function qi(n){return s=>us.createElement(bj,ho({attr:po({},n.attr)},s),mg(n.child))}function bj(n){var s=i=>{var{attr:o,size:f,title:d}=n,h=hj(n,mj),p=f||i.size||"1em",x;return i.className&&(x=i.className),n.className&&(x=(x?x+" ":"")+n.className),us.createElement("svg",ho({stroke:"currentColor",fill:"currentColor",strokeWidth:"0"},i.attr,o,h,{className:x,style:po(po({color:n.color||i.color},i.style),n.style),height:p,width:p,xmlns:"http://www.w3.org/2000/svg"}),d&&us.createElement("title",null,d),n.children)};return U0!==void 0?us.createElement(U0.Consumer,null,i=>s(i)):s(dg)}function hg(n){return qi({attr:{viewBox:"0 0 640 512"},child:[{tag:"path",attr:{d:"M524.531,69.836a1.5,1.5,0,0,0-.764-.7A485.065,485.065,0,0,0,404.081,32.03a1.816,1.816,0,0,0-1.923.91,337.461,337.461,0,0,0-14.9,30.6,447.848,447.848,0,0,0-134.426,0,309.541,309.541,0,0,0-15.135-30.6,1.89,1.89,0,0,0-1.924-.91A483.689,483.689,0,0,0,116.085,69.137a1.712,1.712,0,0,0-.788.676C39.068,183.651,18.186,294.69,28.43,404.354a2.016,2.016,0,0,0,.765,1.375A487.666,487.666,0,0,0,176.02,479.918a1.9,1.9,0,0,0,2.063-.676A348.2,348.2,0,0,0,208.12,430.4a1.86,1.86,0,0,0-1.019-2.588,321.173,321.173,0,0,1-45.868-21.853,1.885,1.885,0,0,1-.185-3.126c3.082-2.309,6.166-4.711,9.109-7.137a1.819,1.819,0,0,1,1.9-.256c96.229,43.917,200.41,43.917,295.5,0a1.812,1.812,0,0,1,1.924.233c2.944,2.426,6.027,4.851,9.132,7.16a1.884,1.884,0,0,1-.162,3.126,301.407,301.407,0,0,1-45.89,21.83,1.875,1.875,0,0,0-1,2.611,391.055,391.055,0,0,0,30.014,48.815,1.864,1.864,0,0,0,2.063.7A486.048,486.048,0,0,0,610.7,405.729a1.882,1.882,0,0,0,.765-1.352C623.729,277.594,590.933,167.465,524.531,69.836ZM222.491,337.58c-28.972,0-52.844-26.587-52.844-59.239S193.056,219.1,222.491,219.1c29.665,0,53.306,26.82,52.843,59.239C275.334,310.993,251.924,337.58,222.491,337.58Zm195.38,0c-28.971,0-52.843-26.587-52.843-59.239S388.437,219.1,417.871,219.1c29.667,0,53.307,26.82,52.844,59.239C470.715,310.993,447.538,337.58,417.871,337.58Z"},child:[]}]})(n)}function yj(n){return qi({attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M448 360V24c0-13.3-10.7-24-24-24H96C43 0 0 43 0 96v320c0 53 43 96 96 96h328c13.3 0 24-10.7 24-24v-16c0-7.5-3.5-14.3-8.9-18.7-4.2-15.4-4.2-59.3 0-74.7 5.4-4.3 8.9-11.1 8.9-18.6zM128 134c0-3.3 2.7-6 6-6h212c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H134c-3.3 0-6-2.7-6-6v-20zm0 64c0-3.3 2.7-6 6-6h212c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H134c-3.3 0-6-2.7-6-6v-20zm253.4 250H96c-17.7 0-32-14.3-32-32 0-17.6 14.4-32 32-32h285.4c-1.9 17.1-1.9 46.9 0 64z"},child:[]}]})(n)}function V0(n){return qi({attr:{viewBox:"0 0 640 512"},child:[{tag:"path",attr:{d:"M192 384h192c53 0 96-43 96-96h32c70.6 0 128-57.4 128-128S582.6 32 512 32H120c-13.3 0-24 10.7-24 24v232c0 53 43 96 96 96zM512 96c35.3 0 64 28.7 64 64s-28.7 64-64 64h-32V96h32zm47.7 384H48.3c-47.6 0-61-64-36-64h583.3c25 0 11.8 64-35.9 64z"},child:[]}]})(n)}function Sj(n){return qi({attr:{viewBox:"0 0 640 512"},child:[{tag:"path",attr:{d:"M528 448H112c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h416c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm64-320c-26.5 0-48 21.5-48 48 0 7.1 1.6 13.7 4.4 19.8L476 239.2c-15.4 9.2-35.3 4-44.2-11.6L350.3 85C361 76.2 368 63 368 48c0-26.5-21.5-48-48-48s-48 21.5-48 48c0 15 7 28.2 17.7 37l-81.5 142.6c-8.9 15.6-28.9 20.8-44.2 11.6l-72.3-43.4c2.7-6 4.4-12.7 4.4-19.8 0-26.5-21.5-48-48-48S0 149.5 0 176s21.5 48 48 48c2.6 0 5.2-.4 7.7-.8L128 416h384l72.3-192.8c2.5.4 5.1.8 7.7.8 26.5 0 48-21.5 48-48s-21.5-48-48-48z"},child:[]}]})(n)}function jj(n){return qi({attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"},child:[]}]})(n)}function Aj(n){switch(n){case"admin":case"lockdown":case"lockdown-admin":return"text-amber-300";case"spectator":return"text-slate-400";default:return"text-sky-300"}}function ld(n){return!!n?.system}function Nj(n){const s=new Date(n);return`${s.getHours().toString().padStart(2,"0")}:${s.getMinutes().toString().padStart(2,"0")}`}function $0(n){return n.nickname||n.socketId?.slice(0,6)||"unknown"}function wj({guildIconUrl:n,userAvatarUrl:s,label:i}){return!n&&!s?null:r.jsxs("span",{className:"flex h-4 w-4 overflow-hidden rounded-full border border-slate-700/80",title:i,children:[r.jsx("span",{className:`h-full w-1/2 bg-slate-700/70 ${n?"bg-cover":""}`,style:n?{backgroundImage:`url(${n})`,backgroundPosition:"left center",backgroundSize:"200% 100%"}:void 0}),r.jsx("span",{className:`h-full w-1/2 bg-slate-700/70 ${s?"bg-cover":""}`,style:s?{backgroundImage:`url(${s})`,backgroundPosition:"right center",backgroundSize:"200% 100%"}:void 0})]})}function pg({message:n}){const s=n.fromDiscord?`${n.discordGuildName||"Discord"} · ${$0(n)}`:null,i=ld(n),o=i?"text-emerald-300":Aj(n.role);return r.jsxs(r.Fragment,{children:[n.fromDiscord?r.jsxs(r.Fragment,{children:[r.jsx(hg,{className:"h-3.5 w-3.5 text-indigo-200"}),r.jsx(wj,{guildIconUrl:n.discordGuildIconUrl,userAvatarUrl:n.discordUserAvatarUrl,label:s})]}):null,r.jsx("span",{className:`font-semibold text-[0.85rem] ${o}`,children:$0(n)}),i?r.jsx("span",{className:"rounded bg-emerald-900/60 px-1 text-[0.65rem] font-semibold uppercase tracking-wide text-white",children:"bot"}):null,n.roverId&&r.jsx("span",{className:"rounded bg-slate-800 px-1 text-[0.7rem]",style:fj(n.roverColor,.14),children:n.roverId})]})}function xg(n){return ld(n)?"surface-muted relative flex flex-wrap items-start gap-0.5 border border-emerald-500/40 bg-emerald-900/15 text-sm":`surface-muted relative flex flex-wrap items-start gap-0.5 text-sm ${n.role==="admin"||n.role==="lockdown"||n.role==="lockdown-admin"?"border border-amber-400/30":n.fromDiscord?"border border-indigo-400/30 bg-indigo-900/20":""}`}function id({message:n}){const s=ld(n);return r.jsxs("div",{className:xg(n),children:[r.jsx(pg,{message:n}),r.jsx("span",{className:`break-words leading-tight whitespace-pre-wrap ${s?"text-emerald-100":"text-slate-100"}`,children:n.text}),r.jsx("span",{className:"absolute bottom-0.5 right-1 text-[0.65rem] text-slate-400/60",children:Nj(n.ts)})]})}function gg({message:n}){return r.jsxs("div",{className:`${xg(n)} italic opacity-80 border-slate-600/40 bg-slate-900/40`,children:[r.jsx(pg,{message:n}),r.jsx("span",{className:"text-slate-300",children:"typing..."})]})}function vg({buttonId:n,count:s,goal:i,rewardNumber:o,rewardName:f,className:d=""}){return r.jsxs("article",{className:["surface px-0.5 py-0.5 text-center",d].filter(Boolean).join(" "),children:[r.jsxs("p",{className:"text-xs text-slate-400",children:["Button ",n]}),r.jsxs("p",{className:"text-sm font-semibold text-white",children:[s," / ",i]}),r.jsxs("p",{className:"truncate text-[0.7rem] text-slate-300",children:["#",o," ",f]})]})}const Cj=3e3,Ej=3500,kj="#2196f3";function Mj(n){return n.id?n.id:n.timestamp?`${n.timestamp}-${n.message}`:`${n.title||"alert"}-${n.message}`}function rd({scale:n=1}){const s=ft(S=>S.alerts),i=ft(S=>S.session),{pushAlert:o}=wn(),f=tn(),[d,h]=m.useState(()=>Date.now());m.useEffect(()=>{function S(E={}){const C=Number(E.buttonId);if(!Number.isFinite(C)||C<1||C>4)return;const w=(Array.isArray(i?.buttonBox?.buttons)?i.buttonBox.buttons:[]).find(O=>Number(O?.id)===C)||{},j=Number.isFinite(E.count)?E.count:Number(w.count)||0,N=Number.isFinite(w.goal)?w.goal:0,q=Number.isFinite(w.rewardNumber)?w.rewardNumber:"?",M=typeof w.rewardName=="string"&&w.rewardName.trim()?w.rewardName.trim():"Unassigned";o({id:`buttonbox-active-${C}`,kind:"buttonbox-active",lifetimeMs:Ej,payload:{buttonId:C,count:j,goal:N,rewardNumber:q,rewardName:M}})}return f.on("buttonBox:increment",S),()=>{f.off("buttonBox:increment",S)}},[o,i?.buttonBox?.buttons,f]);const p=m.useMemo(()=>s.slice(-12).map(S=>({alert:S,key:Mj(S)})),[s]);m.useEffect(()=>{if(!p.length)return;const S=setInterval(()=>h(Date.now()),200);return()=>clearInterval(S)},[p.length]);const x=new Map;p.forEach(S=>{const E=d-(S.alert.receivedAt??S.alert.timestamp??0),C=Number.isFinite(S.alert.lifetimeMs)?S.alert.lifetimeMs:Cj;E<=C&&x.set(S.key,{...S,age:E})});const g=Array.from(x.values()).slice(-3);if(!g.length)return null;const v=n===1?void 0:{transform:`translateX(-50%) scale(${n})`,transformOrigin:"top center"},y=n===1?"pointer-events-none fixed top-0.5 left-1/2 z-50 flex -translate-x-1/2 flex-col gap-0.5":"pointer-events-none fixed top-0.5 left-1/2 z-50 flex flex-col gap-0.5";return r.jsx("div",{className:y,style:v,children:g.map(S=>r.jsx(Rj,{alert:S.alert},S.key))})}function G0(n){const s=typeof n=="string"?n.trim():"",i=/^#?([0-9a-fA-F]{6})$/.exec(s);if(!i)return null;const o=i[1];return{r:parseInt(o.slice(0,2),16),g:parseInt(o.slice(2,4),16),b:parseInt(o.slice(4,6),16)}}function Rj({alert:n}){if(n.kind==="buttonbox-active"&&n.payload){const f=n.payload;return r.jsx("div",{className:"pointer-events-none w-[12.5rem]",children:r.jsx(vg,{buttonId:f.buttonId,count:f.count,goal:f.goal,rewardNumber:f.rewardNumber,rewardName:f.rewardName,className:"bg-cyan-900/45"})})}if(n.kind==="chat"&&n.payload)return r.jsx(id,{message:n.payload});if(n.kind==="chat-typing"&&n.payload)return r.jsx(gg,{message:n.payload});const s=G0(n.color)||G0(kj),i=s?`rgba(${s.r}, ${s.g}, ${s.b}, 0.18)`:"rgba(33, 150, 243, 0.18)",o=s?`rgba(${s.r}, ${s.g}, ${s.b}, 0.45)`:"rgba(33, 150, 243, 0.45)";return r.jsx("div",{className:"pointer-events-auto max-w-[80vw] rounded-full border px-2 py-0.5 text-[0.7rem] leading-tight text-slate-100 shadow-sm shadow-black/30",style:{backgroundColor:i,border:`1px solid ${o}`},children:r.jsxs("p",{className:"truncate text-slate-100",children:[r.jsx("span",{className:"text-slate-300",children:n.title||"Alert"}),r.jsx("span",{className:"text-slate-500",children:" · "}),r.jsx("span",{className:"text-white",children:n.message})]})})}const el={main:[-127,127],side:[-127,127],vacuum:[0,127]},sf={maxSpeed:500,baseSpeed:250,boostSpeed:400},Df=100,od=[31,127],ll=60,_f=8,qj=250,Tj=4e3,Kr=.4,Y0=.2,F0=.8,Dj={start:[128],safe:[131],full:[132],passive:[128],dock:[143]},xi={driveForward:["w"],driveBackward:["s"],driveLeft:["a"],driveRight:["d"],boostModifier:["\\"],slowModifier:["shift"],auxMainForward:["i"],auxMainReverse:["k"],auxSideForward:["o"],auxSideReverse:["l"],auxVacuumFast:["p"],auxVacuumSlow:[";"],auxAllForward:[","],cameraUp:["u"],cameraDown:["j"],nightVisionToggle:["e"],hornHonk:["h"],micPtt:["m"],driveMacro:["f"],dockMacro:["g"],chatFocus:["enter"],songNoteUp:["ArrowUp"],songNoteDown:["ArrowDown"],homeAssistantOn:["ArrowRight"],homeAssistantOff:["ArrowLeft"]},bg=[{id:"drive-sequence",label:"Drive",description:"Start, undock, and full command sequence used by the drive button.",steps:[{type:"servo",angle:0},{type:"oi",command:"start"},{type:"pause",duration:Df},{type:"oi",command:"dock"},{type:"pause",duration:Df},{type:"oi",command:"full"},{type:"pause",duration:300},{type:"drive",speeds:{left:-300,right:-300}},{type:"pause",duration:600},{type:"drive",speeds:{left:0,right:0}}]},{id:"seek-dock",label:"Dock",description:"Send the seek dock command.",steps:[{type:"oi",command:"dock"}]}];function Bf(){return{vector:{x:0,y:0,boost:!1},speeds:{left:0,right:0},source:null,lastUpdatedAt:0}}function Of(){return{main:0,side:0,vacuum:0}}function _j(){return{enabled:!1,angle:null,config:null}}function co(){return{note:ll}}function hi(){return{active:!1,heat:0,overheated:!1}}function uo(){return{pttActive:!1}}const X0={roverId:null,mode:"drive",drive:Bf(),aux:Of(),camera:_j(),song:co(),horn:hi(),mic:uo(),lastControlIntentAt:0,macros:bg,keymap:xi,inputs:{}};function Bj(n,s){switch(s.type){case"control/set-rover":return{...n,roverId:s.payload??null,drive:s.payload?n.drive:Bf(),aux:s.payload?n.aux:Of(),song:s.payload?n.song:co(),horn:s.payload?n.horn:hi(),mic:s.payload?n.mic:uo(),lastControlIntentAt:s.payload?n.lastControlIntentAt:0};case"control/set-mode":return n.mode===s.payload?n:{...n,mode:s.payload==="dock"?"dock":"drive"};case"control/update-drive":{const{vector:i,speeds:o,source:f}=s.payload;return{...n,drive:{vector:i??n.drive.vector,speeds:o??n.drive.speeds,source:f??n.drive.source,lastUpdatedAt:Date.now()}}}case"control/set-aux-motors":return{...n,aux:{...n.aux,...s.payload}};case"control/set-camera-config":return{...n,camera:{...n.camera,enabled:!!s.payload?.config,config:s.payload?.config??null,angle:typeof s.payload?.angle=="number"?s.payload.angle:s.payload?.config?s.payload.config.homeAngle??n.camera.angle:null}};case"control/set-camera-angle":return{...n,camera:{...n.camera,angle:s.payload}};case"control/register-input-state":{const i=s.payload?.source||"unknown";return{...n,inputs:{...n.inputs,[i]:{...n.inputs[i]??{},...s.payload?.state,updatedAt:Date.now()}}}}case"control/set-keymap":return{...n,keymap:{...n.keymap,...s.payload??{}}};case"control/set-macros":return{...n,macros:Array.isArray(s.payload)?s.payload:n.macros};case"control/reset":return{...n,drive:Bf(),aux:Of(),song:co(),horn:hi(),mic:uo(),lastControlIntentAt:0};case"control/set-horn-active":return{...n,horn:{...n.horn||hi(),active:!!s.payload}};case"control/set-horn-heat":return{...n,horn:{...n.horn||hi(),heat:typeof s.payload?.heat=="number"?s.payload.heat:0,overheated:!!s.payload?.overheated}};case"control/record-intent":return{...n,lastControlIntentAt:Date.now()};case"control/set-song-note":return{...n,song:{...n.song||co(),note:s.payload??ll}};case"control/set-mic-ptt":return{...n,mic:{...n.mic||uo(),pttActive:!!s.payload}};default:return n}}function il(n,s,i){return typeof n!="number"||Number.isNaN(n)?s:Math.max(s,Math.min(i,n))}function rl(n){return typeof n!="number"||Number.isNaN(n)?0:Math.max(-1,Math.min(1,n))}function pn(n,s){return!Array.isArray(s)||s.length!==2?n:il(n,s[0],s[1])}function Oj(n={}){const s=rl(n.x??0),i=rl(n.y??0);return{x:s,y:i,boost:!!n.boost}}function Lj(n={},s={}){const i=Oj(n),o=typeof s.maxSpeed=="number"?s.maxSpeed:sf.maxSpeed,f=typeof s.baseSpeed=="number"?s.baseSpeed:sf.baseSpeed,d=typeof s.boostSpeed=="number"?s.boostSpeed:sf.boostSpeed,h=i.boost?d:f,p=i.y*h,x=i.x*h;return{vector:i,speeds:{left:il(Math.round(p+x),-o,o),right:il(Math.round(p-x),-o,o)}}}function zj(n){const s=Array.isArray(n)?n:[],i=String.fromCharCode(...s);if(typeof btoa=="function")return btoa(i);if(typeof Buffer<"u")return Buffer.from(s).toString("base64");throw new Error("No base64 encoder available")}function Q0(n){return new Promise(s=>setTimeout(s,n))}function Uj(n={}){const{driveTransform:s,auxTransform:i}=n,o=tn(),f=ft(O=>O.session),d=f?.assignment?.roverId,h=m.useMemo(()=>!d||!Array.isArray(f?.roster)?null:f.roster.find(O=>String(O.id)===String(d))||null,[d,f?.roster]),p=m.useMemo(()=>!h?.cameraServo||!h.cameraServo.enabled?null:h.cameraServo,[h]),x=m.useMemo(()=>!h?.nightVision||!h.nightVision.enabled?null:h.nightVision,[h]),g=m.useMemo(()=>!h?.horn||!h.horn.enabled?null:h.horn,[h]),v=m.useMemo(()=>h?.nightVision?.state??null,[h]),y=m.useCallback((O,K)=>{d&&o.emit("command",{roverId:d,...O},K)},[o,d]),S=m.useCallback(()=>{d&&y({type:"sensorStream",data:{sensorStream:{enable:!0}}})},[y,d]),E=m.useCallback(O=>{if(!d)return null;const K={left:pn(O?.left??0,[-500,500]),right:pn(O?.right??0,[-500,500])},_=s?s(K):K,U={left:pn(_?.left??0,[-500,500]),right:pn(_?.right??0,[-500,500])};return y({type:"drive",data:{driveDirect:U}}),U},[s,y,d]),C=m.useCallback(({main:O=0,side:K=0,vacuum:_=0}={})=>{if(!d)return null;const U={main:pn(O,el.main),side:pn(K,el.side),vacuum:pn(_,el.vacuum)},z=i?i(U):U,H={main:pn(z?.main??0,el.main),side:pn(z?.side??0,el.side),vacuum:pn(z?.vacuum??0,el.vacuum)};return y({type:"motors",data:{motorPwm:H}}),H},[i,y,d]),k=m.useCallback(O=>!d||!p?null:(y({type:"servo",data:{servo:{angle:O}}}),O),[y,d,p]),w=m.useCallback(O=>{if(!d)return!1;const K=Array.isArray(O)?O:typeof O=="string"?Dj[O]:null;return K?(y({type:"raw",data:{raw:zj(K)}}),S(),!0):!1},[y,S,d]),j=m.useCallback(async O=>{if(!(!O||!Array.isArray(O.steps)||!d))for(const K of O.steps){if(!d)break;switch(K.type){case"oi":w(K.command);break;case"drive":E(K.speeds??{left:0,right:0});break;case"motors":C(K.values??{});break;case"servo":k(K.angle);break;case"pause":await Q0(K.duration??Df);break}if(K.delay||K.delayMs){const _=K.delayMs??K.delay;typeof _=="number"&&_>0&&await Q0(_)}}},[d,w,E,C,k]),N=m.useCallback((O="toggle")=>!d||!x?null:(y({type:"nightVision",data:{nightVision:{action:O}}}),O),[y,x,d]),q=m.useCallback(O=>d?(y({type:"horn",data:{horn:O}}),O):null,[y,d]),M=m.useCallback((O=[],K={})=>{if(!d)return null;const U=(Array.isArray(O)&&O.length>0?O:[{note:ll,duration:_f}]).slice(0,16).map(z=>({note:pn(Math.round(z?.note??ll),od),duration:pn(Math.round(z?.duration??_f),[1,255])}));return y({type:"song",data:{song:{notes:U,slot:K.slot,loop:K.loop}}}),U},[y,d]);return m.useMemo(()=>({roverId:d,rosterEntry:h,servoConfig:p,nightVision:x,nightVisionState:v,horn:g,emitCommand:y,enableSensorStream:S,sendDriveDirect:E,sendAuxMotors:C,sendServoAngle:k,sendOiCommand:w,sendNightVision:N,sendHorn:q,sendSong:M,runMacroSteps:j}),[d,h,p,x,v,g,y,S,E,C,k,w,N,q,j])}const Hj={"{":"[","}":"]",":":";",'"':"'","<":",",">":".","?":"/","|":"\\",_:"-","+":"="},K0={"[":"BracketLeft","]":"BracketRight","\\":"Backslash",";":"Semicolon","'":"Quote",",":"Comma",".":"Period","/":"Slash","-":"Minus","=":"Equal","`":"Backquote"};function Ti(n){if(typeof n!="string")return"";const s=n.toLowerCase();return Hj[s]??s}function Vj(n){const s=Ti(n);if(!s)return null;if(K0[s])return K0[s];if(s.length===1){if(/[a-z]/.test(s))return`Key${s.toUpperCase()}`;if(/[0-9]/.test(s))return`Digit${s}`}return null}function yg(n){const s=Ti(n);return s?`key:${s}`:null}function $j(n){const s=Vj(n);return s?`code:${s}`:null}function Z0(n){const s=new Set,i=yg(n?.key??"");i&&s.add(i);const o=n?.code?`code:${n.code}`:null;return o&&s.add(o),Array.from(s)}function Gj(n={}){return Object.fromEntries(Object.entries(n).map(([s,i])=>{const o=Array.isArray(i)?i:[i],f=new Set;return o.forEach(d=>{const h=yg(String(d));h&&f.add(h);const p=$j(String(d));p&&f.add(p)}),[s,f]}))}function An(n){const s=Ti(n);return s?s===" "?"Space":s==="\\"?"Backslash":s==="`"?"Backtick":s==="["?"[ or {":s==="]"?"] or }":s===";"?"; or :":s==="'"?`' or "`:s===","?", or <":s==="."?". or >":s==="/"?"/ or ?":s==="-"?"- or _":s==="="?"= or +":s==="arrowup"?"Arrow Up":s==="arrowdown"?"Arrow Down":s==="arrowleft"?"Arrow Left":s==="arrowright"?"Arrow Right":s.length===1?s.toUpperCase():s:"—"}const qn={keyboard:{baseSpeed:250,turboSpeed:400,precisionSpeed:125,tiltSpeed:90,tiltIntervalMs:110}},ia={label:"Default",calibration:{driveDeadzone:.18,cameraDeadzone:.08,auxDeadzone:.05,driveCurve:"linear",cameraCurve:"linear",auxCurve:"linear",cameraMode:"absolute",cameraSensitivity:60,auxSideScale:.55},bindings:{drive:{kind:"axisPair",sources:[{kind:"axisPair",x:0,y:1,invertX:!1,invertY:!0}]},cameraTilt:{kind:"axis",sources:[{kind:"axis",index:3,invert:!0},{kind:"axis",index:1,invert:!0}]},mainBrush:{kind:"axis",sources:[{kind:"buttonAxis",index:6},{kind:"axis",index:2,invert:!1}]},sideBrush:{kind:"axis",sources:[{kind:"buttonAxis",index:7},{kind:"axis",index:5,invert:!1}]},vacuum:{kind:"button",sources:[{kind:"button",index:0}]},allAux:{kind:"button",sources:[{kind:"button",index:1}]},mainReverse:{kind:"button",sources:[{kind:"button",index:4}]},sideReverse:{kind:"button",sources:[{kind:"button",index:5}]},driveMacro:{kind:"button",sources:[{kind:"button",index:2}]},dockMacro:{kind:"button",sources:[{kind:"button",index:3}]},nightVisionToggle:{kind:"button",sources:[{kind:"button",index:9}]}}},Ba={activeSignature:null,profiles:{},defaults:{profile:ia}},cs={waveform:"saw",freqs:[440,550,660,0]},ct={masterVolume:1,alertVolume:.5,roverVolume:1,mainBrushDuckEnabled:!0,mainBrushDuckAmount:.75},rs=[{key:"drive",motors:["leftWheel","rightWheel"]},{key:"aux",motors:["mainBrush","sideBrush"]}],Yj={downRatePerSec:.15,upRatePerSec:.7,releaseDelaySec:1,outputRateMs:250};function I0(){return rs.reduce((n,s)=>(n[s.key]={cap:1,clearSec:0},n),{})}function J0(n){return Number.isFinite(n)?Math.max(0,Math.min(1,n)):0}function Fj(n,s={}){const i=ft(j=>j.session),d=(dl(n)?.sensors||{})?.wheelOvercurrents||{},h=m.useMemo(()=>({...Yj,...s.config||{}}),[s.config]),[p,x]=m.useState(()=>I0()),g=m.useRef(0),v=m.useRef(d);m.useEffect(()=>{v.current=d||{}},[d]),m.useEffect(()=>{x(I0()),g.current=0},[n]);const y=m.useMemo(()=>rs.some(j=>j.motors.some(N=>!!d?.[N])),[d]),S=m.useMemo(()=>Object.values(p||{}).some(j=>(Number.isFinite(j?.cap)?j.cap:1)<.999),[p]),E=!!n&&(y||S);m.useEffect(()=>{if(!E)return;g.current=typeof performance<"u"?performance.now():Date.now();const j=setInterval(()=>{const N=typeof performance<"u"?performance.now():Date.now(),q=Math.max(0,N-g.current);g.current=N;const M=Math.min(.25,q/1e3);M<=0||x(O=>{let K=!1;const _={},U=Number.isFinite(h.downRatePerSec)?Math.max(0,h.downRatePerSec):0,z=Number.isFinite(h.upRatePerSec)?Math.max(0,h.upRatePerSec):0,H=Number.isFinite(h.releaseDelaySec)?Math.max(0,h.releaseDelaySec):0;return rs.forEach(V=>{const W=O[V.key]||{cap:1,clearSec:0},oe=Number.isFinite(W.cap)?W.cap:1,ce=Number.isFinite(W.clearSec)?W.clearSec:0,Y=V.motors.some(ie=>!!v.current?.[ie]),T=Y?0:ce+M,G=!Y&&T>=H,I=J0(Y?oe-U*M:G?oe+z*M:oe);(Math.abs(I-oe)>1e-4||Math.abs(T-ce)>1e-4)&&(K=!0),_[V.key]={cap:I,clearSec:T}}),K?_:O})},100);return()=>clearInterval(j)},[h.downRatePerSec,h.releaseDelaySec,h.upRatePerSec,n,E]);const C=m.useMemo(()=>{const j=rs.reduce((N,q)=>{const M=p?.[q.key],O=Number.isFinite(M?.cap)?M.cap:1;return N[q.key]=J0(O),N},{});return{perGroup:j,drive:{left:j.drive??1,right:j.drive??1},aux:{main:j.aux??1,side:j.aux??1,vacuum:1}}},[p]),k=m.useMemo(()=>{const j={};rs.forEach(q=>{q.motors.forEach(M=>{j[M]=!!d?.[M]})});const N=rs.reduce((q,M)=>(q[M.key]=M.motors.some(O=>!!d?.[O]),q),{});return{motors:j,groups:N}},[d]),w=i?.role==="admin"||i?.role==="lockdown"||i?.role==="lockdown-admin";return m.useMemo(()=>({caps:p,overcurrent:k,scales:C,isActive:(C?.drive?.left??1)<1||(C?.drive?.right??1)<1||(C?.aux?.main??1)<1||(C?.aux?.side??1)<1,config:h,adminImmune:w}),[p,k,C,h,w])}function Xj(n={},s,i=!1){if(i||!s?.drive)return n;const o=typeof s.drive.left=="number"?s.drive.left:1,f=typeof s.drive.right=="number"?s.drive.right:1;return o>=.999&&f>=.999?n:{left:Math.round((n.left??0)*o),right:Math.round((n.right??0)*f)}}function Qj(n={},s,i=!1){if(i||!s?.aux)return n;const o=typeof s.aux.main=="number"?s.aux.main:1,f=typeof s.aux.side=="number"?s.aux.side:1,d=typeof s.aux.vacuum=="number"?s.aux.vacuum:1;return o>=.999&&f>=.999&&d>=.999?n:{main:Math.round((n.main??0)*o),side:Math.round((n.side??0)*f),vacuum:Math.round((n.vacuum??0)*d)}}const Sg=m.createContext(null);function P0(n){return Object.fromEntries(Object.entries(n||{}).map(([s,i])=>[s,Array.isArray(i)?[...i]:[]]))}function Kj(n,s){if(!n)return s;const i=typeof n.minAngle=="number"?n.minAngle:-45,o=typeof n.maxAngle=="number"?n.maxAngle:45;return il(s,i,o)}function Zj(n=[]){if(!Array.isArray(n)||n.length<3)return n;const s=n.slice(-3),[i,o,f]=s,d=i?.type==="drive"&&Number(i?.speeds?.left)===-300&&Number(i?.speeds?.right)===-300,h=o?.type==="pause"&&Number(o?.duration)===600,p=f?.type==="drive"&&Number(f?.speeds?.left)===0&&Number(f?.speeds?.right)===0;return!d||!h||!p?n:n.slice(0,-3)}function Ij({children:n}){const[s,i]=m.useReducer(Bj,X0),o=m.useRef(null),f=m.useRef(!1),d=m.useRef(X0.camera.angle),h=m.useRef(null),p=m.useRef(0),x=m.useRef(0),{value:g,save:v}=He("controls",{keymap:xi,macros:bg}),{value:y}=He("page",{driveMacroBackoffEnabled:!0}),{value:S}=He("horn",cs),E=typeof y?.driveMacroBackoffEnabled=="boolean"?y.driveMacroBackoffEnabled:!0,C=ft(le=>le.session),{homeAssistantSetState:k}=wn(),w=C?.assignment?.roverId??null,j=Fj(w),N=m.useCallback(le=>Xj(le,j.scales,j.adminImmune),[j.adminImmune,j.scales]),q=m.useCallback(le=>Qj(le,j.scales,j.adminImmune),[j.adminImmune,j.scales]),M=Uj({driveTransform:N,auxTransform:q}),O=m.useCallback(()=>{const he=(C?.homeAssistant?.entities||[]).filter(se=>(se.type==="light"||se.type==="switch")&&se.available!==!1&&se.state!=="on");if(he.length===0){f.current=!1;return}f.current=!0,he.forEach(se=>{k(se.id,"on").catch(()=>{})}),f.current=!1},[C?.homeAssistant?.entities,k]);m.useEffect(()=>{i({type:"control/set-rover",payload:M.roverId})},[M.roverId]),m.useEffect(()=>{const le=o.current;o.current=s.mode,le!=="drive"&&s.mode==="drive"&&C?.homeAssistant?.entities?O():le!=="drive"&&s.mode==="drive"&&(f.current=!0)},[s.mode,C?.homeAssistant?.entities,O]),m.useEffect(()=>{f.current&&C?.homeAssistant?.entities&&O()},[C?.homeAssistant?.entities,O]),m.useEffect(()=>{const le={...xi,...g?.keymap||{}};i({type:"control/set-keymap",payload:le}),g?.macros&&i({type:"control/set-macros",payload:g.macros})},[g?.keymap,g?.macros]),m.useEffect(()=>{const le=M.servoConfig;if(!le){i({type:"control/set-camera-config",payload:{config:null}}),d.current=null;return}const he=typeof le.minAngle=="number"?le.minAngle:-45,se=typeof le.maxAngle=="number"?le.maxAngle:45,P=typeof le.homeAngle=="number"?le.homeAngle:(he+se)/2,fe=typeof d.current=="number"?il(d.current,he,se):null,Ne=fe??il(P,he,se);i({type:"control/set-camera-config",payload:{config:le,angle:Ne}}),d.current=Ne},[M.servoConfig]),m.useEffect(()=>{d.current=typeof s.camera.angle=="number"?s.camera.angle:d.current},[s.camera.angle]),m.useEffect(()=>{M.roverId&&M.enableSensorStream()},[M.roverId,M.enableSensorStream]);const K=m.useCallback(le=>{i({type:"control/set-mode",payload:le})},[]),_=m.useCallback(()=>{i({type:"control/record-intent"})},[]),U=m.useRef(s.drive.speeds),z=m.useRef(s.aux),H=m.useMemo(()=>JSON.stringify(j.scales),[j.scales]),V=m.useRef(0),W=m.useRef(0);m.useEffect(()=>{U.current=s.drive.speeds},[s.drive.speeds]),m.useEffect(()=>{z.current=s.aux},[s.aux]),m.useEffect(()=>{if(!M.roverId||j.adminImmune||!j.isActive)return;const le=Math.max(0,Number(j?.config?.outputRateMs)||0),he=typeof performance<"u"?performance.now():Date.now(),se=U.current||{left:0,right:0},P=z.current||{main:0,side:0,vacuum:0},fe=!!(se.left||se.right),Ne=!!(P.main||P.side||P.vacuum);!fe&&!Ne||(fe&&he-V.current>=le&&(V.current=he,M.sendDriveDirect(se)),Ne&&he-W.current>=le&&(W.current=he,M.sendAuxMotors(P)))},[H,j.adminImmune,j.config,j.isActive,M]);const oe=m.useCallback((le,he={})=>{const se=Lj(le,he.speedOptions);i({type:"control/update-drive",payload:{...se,source:he.source??null}}),_(),M.sendDriveDirect(se.speeds)},[M,_]),ce=m.useCallback((le={})=>{const he=M.sendAuxMotors(le)??le;i({type:"control/set-aux-motors",payload:he}),_()},[M,_]),Y=m.useCallback((le,he)=>{if(!le)return!1;const se=Ti(he);if(!se)return!1;const P=P0(s.keymap);return P[le]=[se],i({type:"control/set-keymap",payload:P}),v(fe=>({...fe??{},keymap:P})),!0},[s.keymap,v]),T=m.useCallback(()=>{const le=P0(xi);i({type:"control/set-keymap",payload:le}),v(he=>({...he??{},keymap:le}))},[v]),G=m.useCallback(le=>{if(!M.servoConfig)return;const he=Kj(M.servoConfig,le);i({type:"control/set-camera-angle",payload:he}),M.sendServoAngle(he),d.current=he,_()},[M,_]),I=m.useCallback((le=0)=>{const he=M.servoConfig;if(!he)return;const se=typeof le=="number"&&le!==0?le:he.nudgeDegrees||1,P=typeof d.current=="number"?d.current:typeof he.homeAngle=="number"?he.homeAngle:0;G(P+se)},[M.servoConfig,G]),ie=m.useCallback(()=>{const le=M.servoConfig;if(!le)return;const he=typeof le.homeAngle=="number"?le.homeAngle:typeof le.minAngle=="number"&&typeof le.maxAngle=="number"?(le.minAngle+le.maxAngle)/2:0;G(he)},[M.servoConfig,G]),de=m.useCallback(async le=>{const he=s.macros.find(P=>P.id===le)||null;if(!he)return;let se=he;le==="drive-sequence"?(O(),C?.homeAssistant?.entities||(f.current=!0),_(),E||(se={...he,steps:Zj(he.steps)})):le==="seek-dock"&&_(),await M.runMacroSteps(se)},[E,M,_,C?.homeAssistant?.entities,s.macros,O]),R=m.useCallback(()=>{i({type:"control/update-drive",payload:{vector:{x:0,y:0,boost:!1},speeds:{left:0,right:0},source:"system-stop"}}),M.sendDriveDirect({left:0,right:0}),M.sendAuxMotors({main:0,side:0,vacuum:0})},[M]),$=m.useCallback(le=>{M.sendOiCommand(le)},[M]),ee=m.useCallback(le=>{M.roverId&&M.emitCommand({type:"sensorStream",data:{sensorStream:{enable:le}}})},[M]),ae=m.useCallback(le=>{if(M.nightVision){if(typeof le=="boolean"){const he=le?"off":"on";M.sendNightVision(he)}else M.sendNightVision("toggle");_()}},[M,_]),me=m.useCallback(()=>{ae()},[ae]),re=m.useCallback(le=>{const he=typeof le=="number"?le:ll;return i({type:"control/set-song-note",payload:he}),he},[]),ue=m.useCallback((le,he)=>M.sendSong(le,he),[M]),ve=m.useMemo(()=>{const le=S??cs,he=le.waveform==="sine"?"sine":"saw",P=[...Array.isArray(le.freqs)?le.freqs:cs.freqs,0,0,0,0].slice(0,4).map(fe=>{const Ne=Number(fe);return Number.isFinite(Ne)?Ne<=0?0:Math.min(5e3,Math.round(Ne)):0});return{waveform:he,freqs:P}},[S]),be=m.useCallback(()=>{if(!M.horn)return;if(s.horn?.overheated||(s.horn?.heat??0)>=1||s.horn?.active)return!1;const le=Date.now();return M.sendHorn({action:"start",...ve}),i({type:"control/set-horn-active",payload:!0}),p.current=le,x.current=le,h.current&&(clearTimeout(h.current),h.current=null),h.current=setTimeout(()=>{xe()},Tj),_(),!0},[i,ve,M,_,s.horn?.active,s.horn?.heat,s.horn?.overheated]),xe=m.useCallback(()=>{if(!M.horn)return;M.sendHorn({action:"stop"}),i({type:"control/set-horn-active",payload:!1}),h.current&&(clearTimeout(h.current),h.current=null);const le=Date.now(),he=p.current||le,se=Math.max(0,le-he);if(p.current=0,se>0){const P=s.horn?.heat??0,fe=se/1e3*Kr;let Ne=Math.max(0,Math.min(1,P+fe)),pt=s.horn?.overheated??!1;Ne>=1&&(Ne=1,pt=!0),i({type:"control/set-horn-heat",payload:{heat:Ne,overheated:pt}})}},[i,M,s.horn?.heat,s.horn?.overheated,Kr]),Be=m.useRef({active:!!s.horn?.active,heat:s.horn?.heat??0,overheated:!!s.horn?.overheated}),ze=m.useRef(xe);m.useEffect(()=>{Be.current={active:!!s.horn?.active,heat:s.horn?.heat??0,overheated:!!s.horn?.overheated}},[s.horn?.active,s.horn?.heat,s.horn?.overheated]),m.useEffect(()=>{ze.current=xe},[xe]);const Ae=!!s.horn?.active||(s.horn?.heat??0)>0||!!s.horn?.overheated;m.useEffect(()=>{if(!Ae)return;const he=setInterval(()=>{const se=Date.now(),P=x.current||se;x.current=se;const fe=Math.min(1e3,Math.max(0,se-P))/1e3,Ne=Be.current,pt=Ne.heat??0,Ve=!!Ne.active,st=!!Ne.overheated,lt=fe*(Ve?Kr:-Y0);let Ot=Math.max(0,Math.min(1,pt+lt)),it=st;Ot>=1?(Ot=1,it=!0,Ve&&ze.current()):it&&Ot<=F0&&(it=!1),(Ot!==pt||it!==st)&&i({type:"control/set-horn-heat",payload:{heat:Ot,overheated:it}})},100);return()=>clearInterval(he)},[i,Ae,Y0,F0,Kr]);const tt=m.useCallback((le,he)=>{i({type:"control/register-input-state",payload:{source:le,state:he}})},[]),Je=m.useCallback(le=>{i({type:"control/set-mic-ptt",payload:!!le})},[]),vt=m.useMemo(()=>({state:s,dispatch:i,pipeline:M,overcurrentLimiter:j,actions:{setMode:K,setDriveVector:oe,setAuxMotors:ce,setServoAngle:G,nudgeServo:I,goServoHome:ie,runMacro:de,stopAllMotion:R,sendOiCommand:$,setSensorStream:ee,setNightVision:ae,toggleNightVision:me,updateKeyBinding:Y,resetKeyBindings:T,registerInputState:tt,setSongNote:re,sendSong:ue,startHorn:be,stopHorn:xe,setMicPttActive:Je}}),[s,M,j,K,oe,ce,G,I,ie,de,R,$,ee,ae,me,Y,T,tt,re,ue,be,xe,Je]);return r.jsx(Sg.Provider,{value:vt,children:n})}function _t(){const n=m.useContext(Sg);if(!n)throw new Error("useControlSystem must be used within ControlSystemProvider");return n}const Jj="data:audio/mpeg;base64,//uQxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAANAAAIpQBKSkpKSkpKXFxcXFxcXFxra2tra2tra3p6enp6enqJiYmJiYmJiZiYmJiYmJiYpqampqamprW1tbW1tbW1xMTExMTExMTT09PT09PT4uLi4uLi4uLx8fHx8fHx8f////////8AAABQTEFNRTMuMTAwBLkAAAAAAAAAABUgJAUYQQAB4AAACKVpqtMZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//ugxAAAwqQPR8CIwCh0BCj5jDwlIAAjW87wAACcOsAKPMk8ARj8w9OAWwNlV/gCgQMHEhAOVnFaNzWWAPI2zyjHjd8FAoKqyAa88AAAAABNjEd9CQOglIY9dtC+a51bGZrZgTewD3c+AAYx5hxIMheIcudKAyaykG1/h5EsPB0iTEFNRTMuMTAwqqqqqqrIBZqvAAAAAC9JXFIAHrCgAp0D0hUYOInIluqg1TNdKCzMeAAFQCKKsxUmVfireKILLBgSVgb4qBVtPWpMQU1FMy4xMDCqqqqqqqqqqqqqqqqpApm/AAAAAC7QYaHPHoCjkCysmc+QY9NNWRbKE+mqowNobwAAoSQQMLGChDlOrKMqVMC/6xy/CXbFaL7AZUxBTUUzLjEwMFVVVVVVVVVVVacDqZ8AAAAAMgzaYFBPNgIOnVCQfFfwmBBhLVNJQSdxdQRofwAGxF9xAAYs4AZDuE87li0YCASIBwaCiXUj+2BqTEFNRTMuMTAwqqqqqqqqlwOonwAAAAAtkABQSEZ1INNDgx8HeaaLCXiu5dqSciylQNXjv8GdmACQ5ogYKbnsmxkoChog+w9IhU6GsgzCIQBSxFpMQQAAMBiHjgAAAAv6FQQILmJmGLltnax9HszIVEAoEq1p8olpcPLlGpXFastuWosKNFlmlqADJbwAEFRI4iJJy0oDumUW//sgxOEAw5wfU8fnAGBvg6n5nDxUh7QuwcEzkK5Ztz7AZUxBTUUzLjEwMFVVVVVVVZUAhd8AAAAALZAAamQMWKtC7Avib0WLplt2IAp0SKV0pFFxCADLX6AIPFrWJIBQqPGW/x0QDTRLGaQYCRAZzKeoU6uqTEFN6AB3n/7wAAAxq//7EMT0AMPUHU/MawJgc4PpuYy8VQZjocBw2OgQQyQyECnbABEUC/ZoM0J56Jm0tqzNJaq8KospqUAQ5/QBghnCqQAhR4Mz1D1gJPstYsI1sYIg079I5cYjY6pMQU1FMy4xMDCqqqqq//sQxPUAw+AdT8zvAih6hCk5nWBFqqqWAFOf4AAAAEAIQZPkMcwUzFVE51cSBjIHpJRIEIjWgGar9VhgCUvwAFAUMk0RCpMkwXjPQDcoLBU+n5RuR4ZrPQLPckxBTUUzLjEwMKqqqqr/+xDE9oDEAB1NzG8CKIGEKPmd5EWqxgBWn9AAAAAKIiC5GcLJIczCEvNbWsF31jo4Bw0rXktvJF5YRyABlj+ABIQ2RGsHgdc0XsPntoEDUzaQOjTBqblFPUE1TEFNRckAt68AAAAALv/7EMT4AMQIHU3M7wIojwUo+Y2MZfAgKcwITAQIYN1TosJeLtDA0ubWNrFSADJoln4AC0hVaLiIIUChs+4HST4BgCpQHITPMBQkEnj73ORZfylh+sRLEGUiNIpMQU1FMy4xMDCqqqqq//sQxP6AxlgtK+13Yih3hCj5neBNqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrIkT7UNAZ7NS7yMqcihSKLMn8DlKYq8ZdPCVEoJBuWqkxBTUUzLjEwMKqqqqr/+xDE+ADEXCVHzGjDIIQEqLm9PIWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7EMT+AMWoL0XNcwJoiASoeY3gVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sQxPgAxHAnRcxvAmiBBKj5jehEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+xDE+IDEmCVDzPMCKH6EqLmNYE2qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7EMT9gEPgI0vMZwQgvYWlPY5gFaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sQxOYDw+gpIIfgwWgAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=",jg=m.createContext({messages:[],typing:[],sendMessage:async()=>{},focusChat:()=>{},blurChat:()=>{},registerInputRef:()=>{},onInputFocus:()=>{},onInputBlur:()=>{},setTypingActive:()=>{},isChatFocused:!1});function Pj({children:n}){const s=tn(),i=ft(Y=>Y.session),{pushAlert:o}=wn(),{value:f}=He("audio",ct),[d,h]=m.useState([]),[p,x]=m.useState([]),[g,v]=m.useState(!1),y=m.useRef(null),S=m.useRef(null),E=m.useRef(null),C=m.useRef(new Map),k=m.useRef(new Map),w=m.useRef({isTyping:!1,lastSent:0}),j=Number.isFinite(f?.masterVolume)?f.masterVolume:ct.masterVolume,N=Number.isFinite(f?.alertVolume)?f.alertVolume:ct.alertVolume,q=Math.max(0,Math.min(1,j*N)),M=m.useCallback(()=>{const Y=Array.from(C.current.values()).sort((T,G)=>T.lastUpdate-G.lastUpdate).map(T=>T.payload);x(Y)},[]),O=m.useCallback(Y=>!Y||typeof Y!="object"?null:Y.typingId?Y.typingId:Y.fromDiscord?`discord:${Y.discordUserId||Y.discordUserName||Y.nickname||"unknown"}`:`socket:${Y.socketId||Y.nickname||"unknown"}`,[]);m.useEffect(()=>{E.current=new Audio(Jj),E.current.volume=q,E.current.load()},[q]);const K=m.useCallback(()=>{const Y=E.current;Y&&(Y.volume=q,Y.currentTime=0,Y.play().catch(()=>{}))},[q]);m.useEffect(()=>{function Y(T={}){h(G=>[...G.slice(-99),T]),!(T?.socketId&&i?.socketId&&T.socketId===i.socketId)&&(K(),o?.({kind:"chat",payload:T,id:`chat-${T.id||Math.random().toString(36).slice(2)}`,receivedAt:Date.now()}))}return s.on("chat:message",Y),()=>{s.off("chat:message",Y)}},[K,i?.socketId,s]),m.useEffect(()=>{function Y(T={}){const G=O(T);if(!G)return;const I=Date.now();if(T?.socketId&&i?.socketId&&T.socketId===i.socketId){T.isTyping||(C.current.delete(G),M());return}if(T.isTyping){C.current.set(G,{payload:T,expiresAt:I+6e3,lastUpdate:I});const ie=k.current.get(G)||0;I-ie>=2500&&(k.current.set(G,I),o?.({kind:"chat-typing",payload:T,id:`chat-typing-${G}-${T.id||Math.random().toString(36).slice(2)}`,receivedAt:I}))}else C.current.delete(G);M()}return s.on("chat:typing",Y),()=>{s.off("chat:typing",Y)}},[o,M,O,i?.socketId,s]),m.useEffect(()=>{const Y=setInterval(()=>{const T=Date.now();let G=!1;C.current.forEach((I,ie)=>{I.expiresAt<=T&&(C.current.delete(ie),G=!0)}),G&&M()},2e3);return()=>clearInterval(Y)},[M]),m.useEffect(()=>{function Y(T=[]){Array.isArray(T)&&h(G=>{if(G.length===0)return T.slice(-100);const I=new Set(T.map(de=>de?.id));return[...T,...G.filter(de=>de?.id&&!I.has(de.id))].slice(-100)})}return s.on("chat:init",Y),()=>{s.off("chat:init",Y)}},[s]);const _=m.useCallback(Y=>{const T=!!Y,G=Date.now(),I=w.current,ie=!T&&I.isTyping;!(T&&(!I.isTyping||G-I.lastSent>=3500))&&!ie||(w.current={isTyping:T,lastSent:G},s.emit("chat:typing",{isTyping:T}))},[s]),U=m.useCallback((Y,T=null)=>new Promise((G,I)=>{s.emit("chat:send",{text:Y,tts:T},(ie={})=>{ie.error?I(new Error(ie.error)):G(ie)})}),[s]),z=m.useCallback((Y,T={})=>{(T?.target==="hud"?"hud":"panel")==="hud"?S.current=Y:y.current=Y},[]),H=m.useCallback(()=>{v(!0),(S.current||y.current)?.focus()},[]),V=m.useCallback(()=>{v(!1),S.current?.blur(),y.current?.blur()},[]),W=m.useCallback(()=>v(!0),[]),oe=m.useCallback(()=>v(!1),[]),ce=m.useMemo(()=>({messages:d,sendMessage:U,focusChat:H,blurChat:V,registerInputRef:z,onInputFocus:W,onInputBlur:oe,setTypingActive:_,typing:p,isChatFocused:g,selfSocketId:i?.socketId||null}),[V,H,g,d,oe,W,z,U,i?.socketId,_,p]);return r.jsx(jg.Provider,{value:ce,children:n})}function cd(){const n=m.useContext(jg);if(!n)throw new Error("useChat must be used inside ChatProvider");return n}let Ag=!1;function lf(n){Ag=!!n}function W0(){return Ag}const Wj=new Set(["","text","search","email","password","url","tel","number","date","datetime-local","month","time","week"]);function Ng(n){if(!n||n.nodeType!==1)return!1;const s=n.tagName;if(s==="TEXTAREA"||n.isContentEditable)return!0;if(s!=="INPUT")return!1;const i=n.type?n.type.toLowerCase():"";return Wj.has(i)}function eA(){return typeof document>"u"?!1:Ng(document.activeElement)}const rf="keyboard",of={x:0,y:0,boost:!1},cf={main:0,side:0,vacuum:0},ex=od[0],tx=od[1],ud=5,yi=500,Si=1,fd=100;function uf(n,s){const i=Number(n);return Number.isFinite(i)?Math.max(0,Math.min(500,i)):s}function tA(n,s){const i=Number(n);return Number.isFinite(i)?Math.max(ud,Math.min(yi,i)):s}function wg(n,s){const i=Number(n);return Number.isFinite(i)?Math.max(Si,Math.min(fd,i)):s}function nA(n){const i=(wg(n,n)-Si)/(fd-Si),o=yi-i*(yi-ud);return Math.round(o)}function aA(n){const s=tA(n,n),i=(yi-s)/(yi-ud),o=Si+i*(fd-Si);return Math.round(o)}function sA(n){return Ng(n?.target)}function ht(n,s){if(!n||n.size===0)return!1;for(const i of s)if(n.has(i))return!0;return!1}function lA(n,s){const i=ht(s.driveForward,n),o=ht(s.driveBackward,n),f=ht(s.driveLeft,n),d=ht(s.driveRight,n),h=ht(s.boostModifier,n),p=ht(s.slowModifier,n);let x=0;i&&!o?x=1:o&&!i&&(x=-1);let g=0;f&&!d?g=-1:d&&!f&&(g=1);const v=p?.4:1;return{x:g*v,y:x*v,boost:h&&!p}}function iA(n,s){if(ht(s.auxAllForward,n))return{main:127,side:127,vacuum:127};const o=ht(s.auxMainForward,n)?127:ht(s.auxMainReverse,n)?-127:0,f=ht(s.auxSideForward,n)?127:ht(s.auxSideReverse,n)?-70:0,d=ht(s.auxVacuumFast,n)?127:ht(s.auxVacuumSlow,n)?50:0;return{main:o,side:f,vacuum:d}}function rA(){const{state:n,actions:{setMode:s,setDriveVector:i,setAuxMotors:o,nudgeServo:f,runMacro:d,stopAllMotion:h,registerInputState:p,toggleNightVision:x,startHorn:g,stopHorn:v,setMicPttActive:y,setSongNote:S,sendSong:E}}=_t(),C=ft(re=>re.session),{homeAssistantSetState:k}=wn(),{focusChat:w,blurChat:j,isChatFocused:N}=cd(),{value:q}=He("inputs",qn),M=m.useMemo(()=>Gj(n.keymap),[n.keymap]),O=m.useMemo(()=>{const re=new Set;return Object.values(M).forEach(ue=>{ue&&ue.forEach(ve=>re.add(ve))}),re},[M]),K=m.useMemo(()=>{const re=qn.keyboard,ue=q?.keyboard??{};return{baseSpeed:uf(ue.baseSpeed,re.baseSpeed),turboSpeed:uf(ue.turboSpeed,re.turboSpeed),precisionSpeed:uf(ue.precisionSpeed,re.precisionSpeed)}},[q?.keyboard]),_=m.useMemo(()=>{const re=qn.keyboard,ue=q?.keyboard??{},ve=wg(typeof ue.tiltSpeed=="number"?ue.tiltSpeed:typeof ue.tiltIntervalMs=="number"?aA(ue.tiltIntervalMs):re.tiltSpeed,re.tiltSpeed);return nA(ve)},[q?.keyboard]),U=m.useMemo(()=>Math.abs(n.camera?.config?.nudgeDegrees||1),[n.camera?.config?.nudgeDegrees]),z=m.useRef(new Set),H=m.useRef(of),V=m.useRef(cf),W=m.useRef(null),oe=m.useRef(null),ce=m.useRef(!1),Y=m.useCallback(()=>{const re=new Set(z.current);ht(M.boostModifier,re);const ve=ht(M.slowModifier,re)?{baseSpeed:K.precisionSpeed,boostSpeed:K.precisionSpeed}:{baseSpeed:K.baseSpeed,boostSpeed:K.turboSpeed},be=lA(re,M),xe=iA(re,M);(be.x!==H.current.x||be.y!==H.current.y||be.boost!==H.current.boost)&&(H.current=be,i(be,{source:rf,speedOptions:ve})),(xe.main!==V.current.main||xe.side!==V.current.side||xe.vacuum!==V.current.vacuum)&&(V.current=xe,o(xe)),p(rf,{keys:Array.from(re),vector:be,aux:xe})},[M,K,p,o,i]),T=m.useCallback(()=>{W.current&&(clearTimeout(W.current),W.current=null)},[]),G=m.useCallback(()=>{const re=new Set(z.current),ue=ht(M.cameraUp,re),ve=ht(M.cameraDown,re);return(ue?1:0)-(ve?1:0)},[M]),I=m.useCallback(()=>{if(G()===0){T();return}if(W.current)return;const ue=()=>{const ve=G();if(ve===0){T();return}f(ve*U),W.current=setTimeout(ue,_)};W.current=setTimeout(ue,0)},[G,f,_,U,T]),ie=m.useCallback(()=>{oe.current&&(clearTimeout(oe.current),oe.current=null)},[]),de=m.useCallback(()=>{const re=new Set(z.current),ue=ht(M.songNoteUp,re),ve=ht(M.songNoteDown,re);return(ue?1:0)-(ve?1:0)},[M]),R=m.useCallback(re=>{if(re===0)return;let ve=(typeof n.song?.note=="number"?n.song.note:ll)+re;ve>tx?ve=ex:ve{if(de()===0){ie();return}if(oe.current)return;const ue=()=>{const ve=de();if(ve===0){ie();return}R(ve),oe.current=setTimeout(ue,qj)};oe.current=setTimeout(ue,0)},[de,ie,R]),ee=m.useCallback(()=>{z.current.clear(),H.current=of,V.current=cf,T(),ie(),ce.current&&(ce.current=!1,v()),y(!1),h(),p(rf,{keys:[],vector:of,aux:cf})},[p,y,h,v,T,ie]),ae=m.useCallback(re=>{const ue=C?.homeAssistant;if(!ue?.enabled||!ue?.connected||ue?.lightPolicy?.locked||ue?.lightPolicy?.lockedOn)return;const be=(ue.entities||[]).filter(xe=>(xe.type==="light"||xe.type==="switch")&&xe.available!==!1&&xe.state!=="unavailable");if(be.length!==0){if(re==="on"){const xe=be.find(Be=>Be.state!=="on");xe&&k(xe.id,"on").catch(()=>{});return}if(re==="off")for(let xe=be.length-1;xe>=0;xe-=1){const Be=be[xe];if(Be.state==="on"){k(Be.id,"off").catch(()=>{});break}}}},[k,C?.homeAssistant]);m.useEffect(()=>{function re(be){if(W0()||sA(be))return;const xe=Z0(be);if(xe.length===0)return;const Be=new Set(xe);if(ht(M.chatFocus,Be)){be.preventDefault(),ee(),N||w();return}xe.some(Ae=>O.has(Ae))&&be.preventDefault();const ze=xe.filter(Ae=>!z.current.has(Ae));if(ze.forEach(Ae=>z.current.add(Ae)),ze.length>0)if(ze.some(Ae=>M.driveMacro?.has(Ae)))s("drive"),d("drive-sequence");else if(ze.some(Ae=>M.dockMacro?.has(Ae)))s("dock"),d("seek-dock");else if(ze.some(Ae=>M.nightVisionToggle?.has(Ae)))x();else if(ze.some(Ae=>M.hornHonk?.has(Ae))){if(!ce.current){const Ae=g();ce.current=!!Ae}}else ze.some(Ae=>M.micPtt?.has(Ae))?y(!0):ze.some(Ae=>M.homeAssistantOn?.has(Ae))?ae("on"):ze.some(Ae=>M.homeAssistantOff?.has(Ae))&&ae("off");I(),$(),Y()}function ue(be){if(W0())return;Z0(be).forEach(Be=>z.current.delete(Be)),ce.current&&!ht(M.hornHonk,z.current)&&(ce.current=!1,v()),ht(M.micPtt,z.current)||y(!1),I(),$(),Y()}function ve(){ee()}return window.addEventListener("keydown",re,{capture:!0}),window.addEventListener("keyup",ue,{capture:!0}),window.addEventListener("blur",ve),()=>{window.removeEventListener("keydown",re,{capture:!0}),window.removeEventListener("keyup",ue,{capture:!0}),window.removeEventListener("blur",ve)}},[O,j,Y,I,$,w,N,M.chatFocus,M.dockMacro,M.driveMacro,M.hornHonk,M.micPtt,ee,d,y,s,h,ie,g,v,ae]);const me=m.useRef(ee);return m.useEffect(()=>{me.current=ee},[ee]),m.useEffect(()=>{me.current()},[n.roverId]),m.useEffect(()=>{ce.current=!!n.horn?.active},[n.horn?.active]),m.useEffect(()=>()=>{T(),ie()},[T,ie]),null}const oA=1.6;function Cg(n){if(!n)return"unknown::none::0::0";const s=n.id||"unknown",i=n.mapping||"none",o=Array.isArray(n.axes)?n.axes.length:0,f=Array.isArray(n.buttons)?n.buttons.length:0;return`${s}::${i}::${o}::${f}`}function cA(n){return JSON.parse(JSON.stringify(n??{}))}function Eg(n,s){const i=cA(s);return i.meta={id:n?.id??"Unknown",mapping:n?.mapping??"none",axes:n?.axes?.length??0,buttons:n?.buttons?.length??0},i}function os(n){return Number.isFinite(n)?Math.max(-1,Math.min(1,n)):0}function fi(n,s){if(!n)return 0;const i=Math.abs(n);return s==="expo"?Math.sign(n)*Math.pow(i,oA):n}function ff(n,s){const i=Math.abs(n);if(i<=s)return 0;const o=(i-s)/(1-s);return Math.sign(n)*o}function uA(n,s,i){const o=Math.hypot(n,s);if(o<=i)return{x:0,y:0};const d=(o-i)/(1-i)/o;return{x:n*d,y:s*d}}function xo(n,s){if(!n||!Array.isArray(n.axes))return null;const i=n.axes[s];return Number.isFinite(i)?os(i):null}function Lf(n,s){if(!n||!Array.isArray(n.buttons))return null;const i=n.buttons[s];if(!i)return null;const o=typeof i.value=="number"?i.value:i.pressed?1:0;return{pressed:!!(i.pressed||o>.5),value:Math.max(0,Math.min(1,o))}}function df(n,s=[]){for(const i of s)if(i){if(i.kind==="axis"){const o=xo(n,i.index);if(o===null)continue;return{value:i.invert?-o:o,source:i}}if(i.kind==="buttonAxis"){const o=Lf(n,i.index);if(!o)continue;return{value:os(o.value),source:i}}}return{value:0,source:null}}function fA(n,s=[]){for(const i of s){if(!i||i.kind!=="axisPair")continue;const o=xo(n,i.x),f=xo(n,i.y);if(o===null||f===null)continue;const d=i.invertX?-o:o,h=i.invertY?-f:f;return{x:d,y:h,source:i}}return{x:0,y:0,source:null}}function as(n,s=[]){for(const i of s)if(i){if(i.kind==="button"){const o=Lf(n,i.index);if(!o)continue;return{pressed:o.pressed,source:i}}if(i.kind==="axisButton"){const o=xo(n,i.index);if(o===null)continue;const f=i.direction||1,d=typeof i.threshold=="number"?i.threshold:.6;return{pressed:o*f>d,source:i}}if(i.kind==="buttonAxis"){const o=Lf(n,i.index);if(!o)continue;return{pressed:o.value>.5,source:i}}}return{pressed:!1,source:null}}function kg(n,s){const i=s?.bindings??{},o=s?.calibration??{},f=i.drive??{},d=fA(n,f.sources);let h=os(d.x),p=os(d.y);const x=Math.min(Math.max(o.driveDeadzone??.18,0),.8),g=uA(h,p,x);h=fi(g.x,o.driveCurve),p=fi(g.y,o.driveCurve);const v=i.cameraTilt??{},y=df(n,v.sources),S=Math.min(Math.max(o.cameraDeadzone??.08,0),.8);let E=ff(os(y.value),S);E=fi(E,o.cameraCurve);const C=Math.min(Math.max(o.auxDeadzone??.05,0),.6),k=i.mainBrush??{},w=df(n,k.sources);let j=ff(os(w.value),C);j=fi(j,o.auxCurve);const N=i.sideBrush??{},q=df(n,N.sources);let M=ff(os(q.value),C);M=fi(M,o.auxCurve);const O=as(n,i.vacuum?.sources),K=as(n,i.allAux?.sources),_=as(n,i.mainReverse?.sources),U=as(n,i.sideReverse?.sources),z=as(n,i.driveMacro?.sources),H=as(n,i.dockMacro?.sources),V=as(n,i.nightVisionToggle?.sources);return{driveVector:{x:h,y:p,boost:!1},cameraAxis:E,auxAxis:{main:j,side:M},buttons:{vacuum:O.pressed,allAux:K.pressed,mainReverse:_.pressed,sideReverse:U.pressed,driveMacro:z.pressed,dockMacro:H.pressed,nightVisionToggle:V.pressed},sources:{drive:d.source,cameraTilt:y.source,mainBrush:w.source,sideBrush:q.source,vacuum:O.source,allAux:K.source,mainReverse:_.source,sideReverse:U.source,driveMacro:z.source,dockMacro:H.source,nightVisionToggle:V.source}}}const pi=new Set;let sl=null,ol={pads:[],timestamp:0},Zr=!1,Ir=null;function nx(){return Mg().some(n=>n?.connected!==!1)}function Mg(){if(typeof navigator>"u"||!navigator.getGamepads)return[];const n=navigator.getGamepads();return n?Array.from(n).filter(Boolean):[]}function dA(n){return{index:n.index,id:n.id,mapping:n.mapping,connected:n.connected!==!1,timestamp:n.timestamp,axes:Array.from(n.axes??[]),buttons:(n.buttons??[]).map(s=>({pressed:!!s?.pressed,value:typeof s?.value=="number"?s.value:s?.pressed?1:0})),signature:Cg(n)}}function go(){ol={pads:Mg().map(dA),timestamp:typeof performance<"u"?performance.now():Date.now()},pi.forEach(s=>s(ol))}function Rg(){if(go(),ol.pads.length===0){zf();return}sl=requestAnimationFrame(Rg)}function ax(){sl||(go(),ol.pads.length!==0&&(sl=requestAnimationFrame(Rg)))}function zf(){sl&&(cancelAnimationFrame(sl),sl=null)}function qg(n){if(pi.add(n),!Zr&&typeof window<"u"){const s=()=>{go(),pi.size!==0&&(nx()?ax():zf())};window.addEventListener("gamepadconnected",s),window.addEventListener("gamepaddisconnected",s),Ir=s,Zr=!0}return nx()?ax():go(),n(ol),()=>{pi.delete(n),pi.size===0&&(zf(),Zr&&typeof window<"u"&&(window.removeEventListener("gamepadconnected",Ir),window.removeEventListener("gamepaddisconnected",Ir),Ir=null,Zr=!1))}}function mA(){const[n,s]=m.useState(ol);return m.useEffect(()=>qg(s),[]),n}const tl="gamepad",ss={x:0,y:0,boost:!1},ls={main:0,side:0,vacuum:0},hA=100,pA=100;function mf(n,s){return n&&s&&n.x===s.x&&n.y===s.y&&n.boost===s.boost}function hf(n,s){return n&&s&&n.main===s.main&&n.side===s.side&&n.vacuum===s.vacuum}function xA(n){return n?Math.hypot(n.x||0,n.y||0):0}function gA(n){return n?!n.main&&!n.side&&!n.vacuum:!0}function vA(n,s){if(!n||n.length===0)return null;if(s){const i=n.find(o=>o.signature===s);if(i)return i}return n[0]}function bA(){const{state:n,actions:{setMode:s,setDriveVector:i,setAuxMotors:o,setServoAngle:f,runMacro:d,toggleNightVision:h,registerInputState:p}}=_t(),{value:x,save:g}=He("gamepad",Ba),v=m.useRef(new Set),y=m.useRef(ss),S=m.useRef(ls),E=m.useRef({main:!1,side:!1}),C=m.useRef(new Map),k=m.useRef(0),w=m.useRef(0),j=m.useRef(0),N=m.useRef(null),q=m.useCallback(_=>{const U=_.signature??Cg(_);x?.profiles?.[U]||v.current.has(U)||(v.current.add(U),g(z=>{const H=z??Ba;if(H.profiles?.[U])return H;const V=H?.defaults?.profile??ia,W=Eg(_,V);return{...H,profiles:{...H.profiles??{},[U]:W}}}))},[x?.profiles,g]),M=m.useCallback((_,U)=>{const z=C.current.get(_)||!1;return C.current.set(_,U),U&&!z},[]),O=m.useCallback((_,U)=>{const z=n.camera?.config;if(!z)return;const H=typeof performance<"u"?performance.now():Date.now(),V=U?.cameraMode??"absolute",W=Math.max(1,Math.min(180,U?.cameraSensitivity??60));if(V==="velocity"){const G=Math.min(50,H-j.current||16),I=_*W*(G/1e3);if(Math.abs(I)<.01)return;const de=(typeof N.current=="number"?N.current:typeof n.camera?.angle=="number"?n.camera.angle:typeof z.homeAngle=="number"?z.homeAngle:0)+I;f(de),N.current=de,j.current=H;return}const oe=typeof z.minAngle=="number"?z.minAngle:-45,ce=typeof z.maxAngle=="number"?z.maxAngle:45,Y=typeof z.homeAngle=="number"?z.homeAngle:(oe+ce)/2,T=_<0?Y+_*(Y-oe):Y+_*(ce-Y);typeof N.current=="number"&&Math.abs(N.current-T)<.35&&H-j.current<80||(j.current=H,N.current=T,f(T))},[f,n.camera?.angle,n.camera?.config]),K=m.useMemo(()=>x?.activeSignature??null,[x?.activeSignature]);return m.useEffect(()=>qg(_=>{const U=vA(_.pads,K);if(!U){mf(y.current,ss)||(y.current=ss,i(ss,{source:tl})),hf(S.current,ls)||(S.current=ls,o(ls)),C.current=new Map,E.current={main:!1,side:!1},k.current=0,w.current=0,p(tl,{connected:!1});return}if(eA()){mf(y.current,ss)||(y.current=ss,i(ss,{source:tl})),hf(S.current,ls)||(S.current=ls,o(ls)),C.current=new Map,E.current={main:!1,side:!1},p(tl,{connected:!0,blocked:!0});return}q(U);const z=U.signature,H=x?.profiles?.[z]??x?.defaults?.profile??ia,V=kg(U,H);if(!mf(V.driveVector,y.current)){const I=typeof performance<"u"?performance.now():Date.now();(xA(V.driveVector)<.02||I-k.current>=hA)&&(y.current=V.driveVector,k.current=I,i(V.driveVector,{source:tl}))}const W=H.calibration?.auxSideScale??.55,oe=Math.round(Math.min(Math.abs(V.auxAxis.main),1)*127),ce=Math.round(Math.min(Math.abs(V.auxAxis.side),1)*127),Y=E.current.main?-oe:oe,T=E.current.side?-Math.round(ce*W):Math.round(ce*W);let G={main:V.auxAxis.main!==0?Y:0,side:V.auxAxis.side!==0?T:0,vacuum:V.buttons.vacuum?127:0};if(V.buttons.allAux&&(G={main:127,side:127,vacuum:127}),!hf(G,S.current)){const I=typeof performance<"u"?performance.now():Date.now();(gA(G)||I-w.current>=pA)&&(S.current=G,w.current=I,o(G))}V.buttons.mainReverse&&M("mainReverse",!0)?E.current.main=!E.current.main:V.buttons.mainReverse||M("mainReverse",!1),V.buttons.sideReverse&&M("sideReverse",!0)?E.current.side=!E.current.side:V.buttons.sideReverse||M("sideReverse",!1),V.buttons.driveMacro&&M("driveMacro",!0)?(s("drive"),d("drive-sequence")):V.buttons.driveMacro||M("driveMacro",!1),V.buttons.dockMacro&&M("dockMacro",!0)?(s("dock"),d("seek-dock")):V.buttons.dockMacro||M("dockMacro",!1),V.buttons.nightVisionToggle&&M("nightVisionToggle",!0)?h():V.buttons.nightVisionToggle||M("nightVisionToggle",!1),Math.abs(V.cameraAxis)>.001&&O(V.cameraAxis,H.calibration),p(tl,{connected:!0,signature:z,id:U.id,index:U.index,axes:U.axes,buttons:U.buttons,drive:V.driveVector,aux:G,cameraAxis:V.cameraAxis,bindings:V.sources})}),[K,q,x?.defaults?.profile,x?.profiles,M,O,p,d,o,i,s,h]),null}function Tg(n){const s=n?.sensors||{},i=s.oiMode?.label||"Unknown",o=i.toLowerCase(),f=s.chargingState?.label||"",d=!!s.chargingSources?.homeBase,h=d&&f.toLowerCase()!=="not charging"&&f!=="";return{driving:o==="full",docked:d,charging:h,dockedNotCharging:d&&!h,dockingInProgress:!d&&!h&&o==="passive",oiLabel:i,chargingLabel:f}}function Dg(n){const s=dl(n);return m.useMemo(()=>Tg(s),[s])}function nl({label:n,value:s,tone:i="neutral"}){const o=i==="good"?"border-emerald-200 bg-emerald-600 text-white":i==="warn"?"border-amber-200 bg-amber-600 text-white":i==="bad"?"border-red-200 bg-red-600 text-white":"border-slate-200/30 bg-slate-700 text-slate-100";return r.jsx("div",{className:`flex flex-1 flex-col items-center justify-center rounded-lg border px-0.75 py-0.5 text-center ${o}`,children:r.jsx("span",{className:"text-base font-semibold md:text-lg",children:s})})}function sx({label:n}){return n?r.jsx("span",{className:"rounded border border-white/40 px-1 text-[0.7rem] text-white",children:n}):null}function pf({label:n,tone:s}){const i=s==="emerald"?"border-emerald-200/70 bg-emerald-600/70 text-emerald-50":s==="amber"?"border-amber-200/70 bg-amber-600/70 text-amber-50":"border-indigo-200/70 bg-indigo-600/70 text-indigo-50";return r.jsx("span",{className:`rounded-full border px-0.5 py-0.15 text-[0.7rem] font-semibold ${i}`,children:n})}function yA({instructions:n,onConfirm:s,onCancel:i,pending:o}){return r.jsx("div",{className:"fixed inset-0 z-40 flex items-center justify-center bg-black/70 p-1",children:r.jsxs("div",{className:"surface w-full max-w-md space-y-0.5 border border-indigo-700 bg-indigo-950/90 p-1 text-slate-100 shadow-2xl",children:[r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-lg font-semibold text-indigo-50",children:"Dock Rover"}),r.jsx("p",{className:"text-sm text-slate-200",children:n.summary}),r.jsx(Uf,{steps:n.steps,tone:"indigo"})]}),r.jsxs("div",{className:"grid grid-cols-2 gap-0.5 text-sm",children:[r.jsx("button",{type:"button",onClick:i,className:"bg-slate-700 px-0.5 py-1 font-semibold text-slate-100 transition hover:bg-slate-600",children:"Cancel"}),r.jsx("button",{type:"button",disabled:o,onClick:s,className:"bg-indigo-600 px-0.5 py-1 font-semibold text-indigo-50 transition hover:bg-indigo-500 disabled:opacity-50",children:o?"Docking…":"Confirm Dock"})]})]})})}function _g({layout:n="desktop",expand:s=!1,fill:i=!1,driveDockState:o,compactHeightClass:f=""}){const d=n==="mobile",{state:{roverId:h,keymap:p},actions:x}=_t(),g=dl(h),v=o??Tg(g),{driving:y,docked:S,charging:E,dockingInProgress:C}=v,[k,w]=m.useState(null),[j,N]=m.useState(!1),[q,M]=m.useState(!1),O=!h||k!==null,K=!h||k!==null,_=An(p?.driveMacro?.[0]),U=An(p?.dockMacro?.[0]),z={summary:"You are about to trigger an automatic docking attempt! To have a successful dock:",steps:["Line up the rover straight in front of the dock","Make sure the rover is about one foot or half a meter away from the dock","Press Confirm Dock to begin the docking process"]},H="Click this button to initate auto-dock.",V={summary:"You must enable driving mode before you can move the rover.",steps:["Press the keybind or tap this button to enable driving mode","Once ready (should be instant), this dialog will change, and you will be able to move"]},W=S?"Docked":"Undocked",oe=S?"good":"bad",ce=E?"Charging":S?"Charging in 5s":"—",Y=E?"good":S?"warn":"bad",T=async()=>{if(!(!h||k)){w("drive");try{x.setMode("drive"),await x.runMacro("drive-sequence")}catch(Je){alert(Je.message)}finally{w(null)}}},G=async()=>{if(!(!h||k)){N(!1),M(!1),w("drive");try{x.setMode("drive"),await x.runMacro("drive-sequence")}catch(Je){alert(Je.message)}finally{w(null)}}},I=async()=>{if(!(!h||k)){w("dock");try{x.setMode("dock"),await x.runMacro("seek-dock")}catch(Je){alert(Je.message)}finally{w(null),N(!1),M(!1)}}},ie=()=>{K||(M(!0),N(!0))},de="flex w-full flex-col gap-0.5 overflow-hidden rounded-xl border-2 px-0.75 py-0.75 text-slate-100 shadow-md transition hover:-translate-y-0.5 hover:shadow-xl focus-visible:outline-none focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-60 select-none no-touch-select",R="text-center",$="items-center justify-between",ee="items-center justify-center",ae=d?"text-sm font-semibold":"",me="border-emerald-300/70 bg-emerald-800 text-emerald-50 hover:bg-emerald-700 focus-visible:ring-emerald-300",re="border-amber-300/70 bg-amber-900 text-amber-50 hover:bg-amber-800 focus-visible:ring-amber-300",ue="border-indigo-300/70 bg-indigo-900 text-indigo-50 hover:bg-indigo-800 focus-visible:ring-indigo-300",ve="border-amber-300/70 bg-amber-900 text-amber-50 hover:bg-amber-800 focus-visible:ring-amber-300",xe=s||C,Be=xe?"h-full flex-1":i?"flex-1":"",ze=d&&!xe?f:"",Ae=d&&!xe?ee:$,tt=d&&!xe&&y&&S;if(!y&&!C)return r.jsxs("button",{type:"button",onClick:G,onContextMenu:Je=>Je.preventDefault(),disabled:O,className:`${de} ${Be} ${ze} ${R} ${Ae} ${ae} ${me}`,children:[r.jsxs("div",{className:"space-y-0.5 w-full",children:[r.jsxs("div",{className:"flex w-full flex-col items-center gap-0.25",children:[r.jsx("span",{className:"text-base font-semibold text-emerald-50 md:text-lg",children:"Start Driving"}),!d&&xe?r.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-0.5",children:[_?r.jsx(sx,{label:_}):null,r.jsx(pf,{label:"Click to start",tone:"emerald"})]}):null]}),xe?r.jsxs(r.Fragment,{children:[r.jsx("p",{className:"text-sm text-emerald-50/90",children:V.summary}),r.jsx(Uf,{steps:V.steps,tone:"emerald"})]}):null]}),xe?r.jsxs("div",{className:"flex w-full flex-1 flex-col gap-0.5 self-stretch",children:[r.jsx(nl,{label:"Dock",value:W,tone:oe}),r.jsx(nl,{label:"Charge",value:ce,tone:Y})]}):null]});if(C){const Je={summary:"If the rover is failing to dock, click to drive and try again.",steps:["The rover should be slowly wiggling towards the dock","If it is obviously not working, press this button to enter driving mode and try again"]};return r.jsxs("button",{type:"button",disabled:O,onClick:T,onContextMenu:vt=>vt.preventDefault(),className:`${de} ${Be} ${ze} ${R} ${Ae} ${ae} ${re}`,children:[r.jsxs("div",{className:"space-y-0.5 w-full",children:[r.jsxs("div",{className:"flex w-full flex-col items-center gap-0.25",children:[r.jsx("span",{className:"text-base font-semibold text-amber-50 md:text-lg",children:"Docking in Progress"}),xe?r.jsx("div",{className:"flex flex-wrap items-center justify-center gap-0.5",children:r.jsx(pf,{label:"Return to driving mode",tone:"emerald"})}):null]}),xe?r.jsx("p",{className:"text-sm text-amber-50/90",children:Je.summary}):null]}),xe?r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"flex w-full flex-1 flex-col gap-0.5 self-stretch",children:[r.jsx(nl,{label:"Dock",value:W,tone:oe}),r.jsx(nl,{label:"Charge",value:ce,tone:Y})]}),d?null:r.jsx(Uf,{steps:Je.steps,tone:"amber"})]}):null]})}return r.jsxs(r.Fragment,{children:[r.jsxs("button",{type:"button",disabled:K,onClick:ie,onContextMenu:Je=>Je.preventDefault(),className:d?`flex w-full ${de} ${ze} ${R} ${Ae} ${ae} ${tt?ve:ue}`:`${de} ${Be} ${R} ${$} ${ae} ${ue}`,children:[r.jsxs("div",{className:"flex w-full flex-col items-center gap-0.25",children:[r.jsx("span",{className:"text-base font-semibold text-indigo-50 md:text-lg",children:tt?"Docked!":"Dock and Charge"}),!d&&xe?r.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-0.5",children:[U?r.jsx(sx,{label:U}):null,r.jsx(pf,{label:"Click to begin docking",tone:"indigo"})]}):null]}),!d&&xe&&r.jsxs(r.Fragment,{children:[r.jsx("p",{className:"text-sm text-indigo-50/90",children:H}),r.jsxs("div",{className:"flex w-full flex-1 flex-col gap-0.5 self-stretch",children:[r.jsx(nl,{label:"Dock",value:W,tone:oe}),r.jsx(nl,{label:"Charge",value:ce,tone:Y})]}),r.jsx("div",{className:"text-xs text-indigo-100/80",children:"Line up straight, about 1 foot away, before docking."})]})]}),q||!d&&j?r.jsx(yA,{instructions:z,pending:k==="dock",onCancel:()=>{M(!1),N(!1)},onConfirm:I}):null]})}function Uf({steps:n,tone:s="emerald"}){const i=s==="emerald"?"bg-emerald-900/60 text-emerald-50/90 border-emerald-700/60":s==="amber"?"bg-amber-900/60 text-amber-50/90 border-amber-700/60":"bg-indigo-900/60 text-indigo-50/90 border-indigo-700/60",o=s==="emerald"?"text-emerald-200":s==="amber"?"text-amber-200":"text-indigo-200";return r.jsx("div",{className:`space-y-0.5 rounded border px-0.5 py-0.35 text-left ${i}`,children:n.map((f,d)=>r.jsxs("div",{className:"text-[0.85rem] leading-snug break-words",children:[r.jsxs("div",{className:"flex items-start",children:[r.jsxs("span",{className:`mr-0 align-top text-[0.75rem] font-semibold ${o}`,children:[d+1,"."]}),r.jsx("span",{className:"align-top",children:f})]}),d{xf(n)&&p(n)},[n]);const x=xf(h),g=x?h:!1,v=x?g?"On":"Off":"—",y=g?"bg-emerald-500 text-emerald-950":"bg-slate-700 text-slate-200",S=()=>{if(s)return;const C=x?!g:!0;p(C),i?.(C)},E=m.useMemo(()=>["group flex w-full flex-col items-center justify-center gap-0.35 rounded-xl border-2 px-1 py-0.75 text-center select-none no-touch-select",g?"border-emerald-300/70 bg-emerald-800 text-emerald-50 hover:bg-emerald-700":"border-amber-300/70 bg-amber-900 text-amber-50 hover:bg-amber-800","disabled:opacity-50",d,f].filter(Boolean).join(" "),[f,g,d]);return r.jsxs("button",{type:"button",onClick:S,onContextMenu:C=>C.preventDefault(),disabled:s,"aria-pressed":g,className:E,children:[r.jsxs("span",{className:"flex items-center gap-0.5",children:[r.jsx("span",{className:"text-sm font-semibold",children:"Night Vision"}),o?r.jsx("span",{className:"rounded bg-slate-800 px-1 py-0.5 text-[0.6rem] font-semibold text-slate-200",children:o}):null]}),r.jsx("span",{className:`rounded px-1 py-0.5 text-[0.7rem] font-semibold ${y}`,children:v})]})}function gf(n){const s=Number(n);return!Number.isFinite(s)||s<=0?0:Math.min(5e3,Math.round(s))}function Og({disabled:n,onStart:s,onStop:i,keyLabel:o,active:f,heat:d=0,className:h="",defaultShowSettings:p=!0,showSettingsToggle:x=!1,compactSettings:g=!1}){const[v,y]=m.useState(!1),[S,E]=m.useState(p),{value:C,save:k}=He("horn",cs),[w,j]=m.useState(C?.waveform||cs.waveform),[N,q]=m.useState(()=>[...Array.isArray(C?.freqs)?C.freqs:cs.freqs,0,0,0,0].slice(0,4).map(T=>gf(T)));m.useEffect(()=>{j(C?.waveform||cs.waveform),Array.isArray(C?.freqs)&&q([...C.freqs,0,0,0,0].slice(0,4).map(Y=>gf(Y)))},[C?.freqs,C?.waveform]);const M=!!f,O=Math.max(0,Math.min(1,Number(d)||0)),K=m.useMemo(()=>["group relative flex w-full flex-col gap-0.5 overflow-hidden rounded-xl border-2 px-1 py-1.5 text-xs font-semibold select-none no-touch-select",M?"border-fuchsia-300/70 bg-fuchsia-700 text-fuchsia-50":"border-cyan-300/70 bg-cyan-900 text-cyan-50 hover:bg-cyan-800","disabled:opacity-50",h].filter(Boolean).join(" "),[h,M]),_=()=>{n||v||(y(!0),s?.())},U=()=>{v&&(y(!1),i?.())};m.useEffect(()=>{!M&&v&&y(!1)},[M,v]);const z=w==="sine"?"sine":"saw",H=m.useCallback(Y=>{const T=Y.target.value==="sine"?"sine":"saw";j(T),k(G=>({...G??{},waveform:T}))},[k]),V=m.useCallback((Y,T)=>{q(G=>{const I=[...G];return I[Y]=gf(T),k(ie=>({...ie??{},freqs:I})),I})},[k]),W=Y=>{if(n)return;const T=Y.target?.tagName?.toLowerCase();T==="input"||T==="select"||T==="option"||T==="label"||T==="button"||(Y.preventDefault(),_())},oe=Y=>{const T=Y.target?.tagName?.toLowerCase();T==="input"||T==="select"||T==="option"||T==="label"||T==="button"||(Y.preventDefault(),U())},ce=x?r.jsx("button",{type:"button",onClick:Y=>{Y.preventDefault(),E(T=>!T)},className:"rounded bg-black/40 px-1 py-0.5 text-[0.6rem] font-semibold text-white/90 hover:text-white",children:S?"Hide":"Settings"}):null;return r.jsxs("div",{role:"button",tabIndex:0,"aria-pressed":v,onPointerDown:W,onPointerUp:oe,onPointerLeave:U,onPointerCancel:U,onContextMenu:Y=>Y.preventDefault(),onBlur:U,className:K,children:[r.jsx("div",{className:"pointer-events-none absolute inset-0 opacity-70",style:{background:`linear-gradient(90deg, rgba(14,116,144,0.7) ${O*100}%, rgba(0,0,0,0) ${O*100}%)`}}),r.jsx("div",{className:`pointer-events-none absolute inset-0 transition-opacity ${M?"opacity-40":"opacity-0"}`,style:{background:"linear-gradient(90deg, rgba(217,70,239,0.75), rgba(244,114,182,0.35))"}}),r.jsxs("div",{className:"relative z-10 flex items-center justify-between gap-0.5",children:[r.jsxs("span",{className:"flex items-center gap-0.5 text-sm font-semibold",children:[r.jsx("span",{children:"Horn"}),o?r.jsx("span",{className:"rounded bg-black/40 px-1 py-0.5 text-[0.6rem] font-semibold text-white",children:o}):null]}),ce,r.jsx("span",{className:`rounded px-1 py-0.5 text-[0.65rem] font-semibold ${M?"bg-fuchsia-200 text-fuchsia-900":"bg-slate-800 text-slate-200"}`,children:M?"Honk":"Hold"})]}),S?g?r.jsxs("div",{className:"relative z-10 flex flex-col gap-0.5 text-[0.65rem]",children:[r.jsxs("label",{className:"flex items-center justify-between gap-0.5 text-slate-200",children:[r.jsx("span",{className:"text-slate-300",children:"Wave"}),r.jsxs("select",{value:z,onChange:H,className:"rounded border border-slate-700 bg-slate-900 px-1 py-[2px] text-[0.65rem] text-slate-100",children:[r.jsx("option",{value:"saw",children:"Saw"}),r.jsx("option",{value:"sine",children:"Sine"})]})]}),r.jsx("div",{className:"grid grid-cols-2 gap-0.5",children:N.map((Y,T)=>r.jsxs("label",{className:"flex items-center gap-0.5 text-slate-200",children:[r.jsx("span",{className:"text-[0.6rem] text-slate-400",children:T+1}),r.jsx("input",{type:"number",min:0,max:5e3,step:1,value:Y,onChange:G=>V(T,G.target.value),className:"w-full rounded border border-slate-700 bg-slate-900 px-1 py-[2px] text-right text-[0.65rem] font-mono text-slate-100"})]},`horn-freq-${T}`))})]}):r.jsxs("div",{className:"relative z-10 grid grid-cols-[minmax(0,1.2fr)_repeat(4,minmax(0,1fr))] items-center gap-0.5 text-[0.65rem]",children:[r.jsxs("label",{className:"flex items-center gap-0.5 text-slate-200",children:[r.jsx("span",{className:"text-slate-300",children:"Wave"}),r.jsxs("select",{value:z,onChange:H,className:"rounded border border-slate-700 bg-slate-900 px-1 py-[2px] text-[0.65rem] text-slate-100",children:[r.jsx("option",{value:"saw",children:"Saw"}),r.jsx("option",{value:"sine",children:"Sine"})]})]}),N.map((Y,T)=>r.jsxs("label",{className:"flex items-center gap-0.5 text-slate-200",children:[r.jsx("span",{className:"text-[0.6rem] text-slate-400",children:T+1}),r.jsx("input",{type:"number",min:0,max:5e3,step:1,value:Y,onChange:G=>V(T,G.target.value),className:"w-full rounded border border-slate-700 bg-slate-900 px-1 py-[2px] text-right text-[0.65rem] font-mono text-slate-100"})]},`horn-freq-${T}`))]}):null]})}function Jr(n){return typeof n!="number"||Number.isNaN(n)?"—":`${n>0?"+":""}${n.toFixed(1)}°`}function lx({label:n}){return n?r.jsx("span",{className:"rounded border border-white/40 px-1 text-[0.7rem] text-white",children:n}):null}function Lg({value:n,min:s,max:i,step:o=.5,label:f="Camera Tilt",orientation:d="horizontal",onChange:h,onCommit:p,throttleMs:x=0,disabled:g=!1,keyDownLabel:v,keyUpLabel:y,className:S="",labelRowClass:E="",labelClass:C="",valueClass:k="",sliderClass:w="",endpointClass:j="",endpointLabelClass:N="",accentClass:q="",showValue:M=!0,showEndpoints:O}){const K=d==="vertical",U=typeof O=="boolean"?O:!K,[z,H]=m.useState(n),V=m.useRef(!1),W=m.useRef(null);m.useEffect(()=>{V.current||H(n)},[n]),m.useEffect(()=>()=>{W.current&&clearTimeout(W.current)},[]);const oe=I=>{if(h){if(x>0){W.current&&clearTimeout(W.current),W.current=setTimeout(()=>{h(I)},x);return}h(I)}},ce=I=>{const ie=Number.parseFloat(I.target.value);Number.isNaN(ie)||(V.current=!0,H(ie),oe(ie))},Y=()=>{V.current=!1,W.current&&(clearTimeout(W.current),W.current=null),p?p(z):x>0&&h?.(z)};if(typeof s!="number"||typeof i!="number")return null;const T=[K?"h-28 w-5":"w-full",q,w].filter(Boolean).join(" "),G=r.jsx("input",{type:"range",orient:K?"vertical":void 0,min:s,max:i,step:o,value:Number.isFinite(z)?z:s,onChange:ce,onMouseUp:Y,onTouchEnd:Y,onPointerUp:Y,disabled:g,className:T,style:K?{writingMode:"bt-lr",WebkitAppearance:"slider-vertical"}:void 0});return K?r.jsxs("div",{className:`flex h-full flex-col items-center gap-0.5 ${S}`.trim(),children:[M?r.jsx("div",{className:`flex flex-col items-center ${E}`.trim(),children:r.jsx("span",{className:k,children:Jr(n)})}):null,r.jsxs("div",{className:"flex min-h-0 flex-1 items-center gap-0.5",children:[r.jsx("span",{className:C,children:f}),G]})]}):r.jsxs("div",{className:`space-y-0.5 ${S}`.trim(),children:[r.jsxs("div",{className:`flex items-center justify-between ${E}`.trim(),children:[r.jsx("span",{className:C,children:f}),M?r.jsx("span",{className:k,children:Jr(n)}):null]}),r.jsxs("div",{children:[G,U?r.jsxs("div",{className:`mt-0 flex items-center justify-between ${j}`.trim(),children:[r.jsxs("span",{className:`flex items-center gap-0.5 ${N}`.trim(),children:[v?r.jsx(lx,{label:v}):null,Jr(s)]}),r.jsxs("span",{className:`flex items-center gap-0.5 ${N}`.trim(),children:[Jr(i),y?r.jsx(lx,{label:y}):null]})]}):null]})]})}const Pr="mobile-joystick",SA=80,jA=.15,AA={main:0,side:0,vacuum:0},NA={main:127,side:127,vacuum:127},wA={main:-127,side:-127,vacuum:-127};function CA({disabled:n,layout:s,radius:i,onMove:o,onStop:f}){const d=m.useRef(null),h=m.useRef(null),p=m.useRef({x:0,y:0}),[x,g]=m.useState({active:!1,base:{x:0,y:0},knob:{x:0,y:0}}),v=m.useCallback(()=>{h.current=null,g({active:!1,base:{x:0,y:0},knob:{x:0,y:0}}),f?.()},[f]),y=m.useCallback(k=>{if(n||h.current!==null)return;k.preventDefault();const w=d.current;if(!w)return;const j=w.getBoundingClientRect(),N=k.clientX-j.left,q=k.clientY-j.top;p.current={x:N,y:q},h.current=k.pointerId,w.setPointerCapture?.(k.pointerId),g({active:!0,base:{x:N,y:q},knob:{x:0,y:0}})},[n]),S=m.useCallback(k=>{if(n||h.current!==k.pointerId)return;k.preventDefault();const w=d.current;if(!w)return;const j=w.getBoundingClientRect(),N=k.clientX-j.left,q=k.clientY-j.top,M=N-p.current.x,O=q-p.current.y,K=Math.min(Math.hypot(M,O),i),_=Math.atan2(O,M),U=Math.cos(_)*K,z=Math.sin(_)*K,H={x:rl(U/i),y:rl(-z/i),boost:!1};g(V=>({...V,knob:{x:U,y:z}})),o?.(H)},[n,o]),E=m.useCallback(k=>{if(h.current!==k.pointerId)return;k.preventDefault(),d.current?.releasePointerCapture?.(k.pointerId),v()},[v]);return m.useEffect(()=>{n&&v()},[n,v]),r.jsxs("div",{ref:d,role:"presentation",className:"relative w-full h-full select-none overflow-hidden rounded-xl border-2 border-slate-700 bg-slate-900/70 text-slate-100 shadow-md",style:{touchAction:"none"},onPointerDown:y,onPointerMove:S,onPointerUp:E,onPointerLeave:E,onPointerCancel:E,onContextMenu:k=>k.preventDefault(),children:[!x.active&&r.jsxs("div",{className:"absolute inset-x-0 top-0 flex flex-col items-center gap-0 text-center pt-0.5",children:[r.jsx("span",{className:"font-semibold text-slate-200",children:"Joystick area"}),r.jsx("span",{className:"text-sm text-slate-300",children:"Touch and hold to use the joystick"})]}),x.active&&r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"pointer-events-none absolute h-28 w-28 -translate-x-1/2 -translate-y-1/2 bg-cyan-400/10 outline outline-2 outline-cyan-400/60 [clip-path:circle(50%)]",style:{left:x.base.x,top:x.base.y}}),r.jsx("div",{className:"pointer-events-none absolute h-12 w-12 -translate-x-1/2 -translate-y-1/2 bg-cyan-300/80 shadow-lg [clip-path:circle(50%)]",style:{left:x.base.x+x.knob.x,top:x.base.y+x.knob.y}})]})]})}function EA({layout:n}){const{state:{roverId:s},actions:{setDriveVector:i,registerInputState:o}}=_t(),f=Dg(s),d=f.docked&&!f.driving,h=d||f.dockingInProgress,p=!s,x=SA,g=jA,v=m.useRef({x:0,y:0,boost:!1});m.useEffect(()=>{p&&(v.current={x:0,y:0,boost:!1})},[p]);const y=m.useCallback((k={})=>{if(p)return;const w={x:rl(k.x??0),y:rl(k.y??0),boost:!!k.boost},j={x:v.current.x+(w.x-v.current.x)*(1-g),y:v.current.y+(w.y-v.current.y)*(1-g),boost:w.boost};v.current=j,i(j,{source:Pr}),o(Pr,{vector:j,lastEvent:"move"})},[p,o,i,g]),S=m.useCallback(()=>{if(p)return;const k={x:0,y:0,boost:!1};v.current=k,i(k,{source:Pr}),o(Pr,{vector:k,lastEvent:"stop"})},[p,o,i]),C=`flex h-full flex-col gap-0.5 text-slate-100 ${d?"max-h-screen self-start":""}`;return r.jsxs("div",{className:C,children:[r.jsx(_g,{layout:"mobile",expand:h,driveDockState:f,compactHeightClass:"min-h-[5rem]"}),h?null:r.jsx("div",{className:"flex-1 min-h-0",children:r.jsx(CA,{disabled:p,layout:n,radius:x,onMove:y,onStop:S})})]})}function ix({id:n,label:s,values:i,color:o,disabled:f,onPress:d,onRelease:h}){return r.jsx("button",{type:"button",disabled:f,onPointerDown:p=>{p.preventDefault(),d(n,i)},onPointerUp:()=>h(n),onPointerLeave:()=>h(n),onPointerCancel:()=>h(n),onContextMenu:p=>p.preventDefault(),className:`flex h-full w-full items-center justify-center rounded-xl border-2 px-1 py-0.75 text-center text-sm font-semibold text-white transition select-none no-touch-select ${o} hover:brightness-110 active:brightness-125 active:scale-[0.99] disabled:opacity-30`,children:s})}function kA({layout:n}){const{state:{roverId:s,camera:i,horn:o},pipeline:f,actions:{setServoAngle:d,setNightVision:h,setAuxMotors:p,startHorn:x,stopHorn:g}}=_t(),v=!s,y=m.useRef(null),S=i?.config,E=!!(s&&i?.enabled&&S),C=!!(s&&f?.nightVision),k=f?.nightVisionState,w=!!(s&&f?.horn),j=o?.overheated,N=typeof S?.minAngle=="number"?S.minAngle:-45,q=typeof S?.maxAngle=="number"?S.maxAngle:45,M=typeof i?.angle=="number"?i.angle:typeof S?.homeAngle=="number"?S.homeAngle:(N+q)/2,O=m.useCallback(U=>{C&&h(U)},[C,h]),K=m.useCallback((U,z)=>{v||(y.current=U,p(z))},[v,p]),_=m.useCallback(U=>{v||y.current===U&&(y.current=null,p(AA))},[v,p]);return r.jsxs("div",{className:"grid h-full min-h-0 w-full grid-rows-[minmax(0,1fr)_minmax(0,1fr)_minmax(0,1fr)] gap-0.5 text-slate-100",children:[r.jsxs("div",{className:"grid min-h-0 grid-rows-2 gap-0.5",children:[r.jsx(ix,{id:"aux-vac-forward",label:"Vacuum Forward",values:NA,color:"bg-fuchsia-600",disabled:v,onPress:K,onRelease:_}),r.jsx(ix,{id:"aux-vac-backward",label:"Vacuum Backward",values:wA,color:"bg-fuchsia-800",disabled:v,onPress:K,onRelease:_})]}),r.jsxs("div",{className:"flex min-h-0 items-stretch gap-0.5",children:[E?r.jsx("div",{className:"flex-1 min-h-0 rounded bg-zinc-950 p-0.25",children:r.jsx(Lg,{value:M,min:N,max:q,step:.5,onChange:d,orientation:"vertical",label:"Camera Tilt",labelClass:"text-sm font-semibold text-white [writing-mode:vertical-rl] rotate-180",labelRowClass:"text-[0.7rem] text-slate-300",valueClass:"font-mono text-slate-200",className:"h-full gap-0",sliderClass:"h-full w-7",accentClass:"accent-cyan-400",showEndpoints:!1,showValue:!1})}):null,C?r.jsx(Bg,{nightVisionOn:k?.nightVisionOn,disabled:v,onToggle:O,heightClass:"h-full"}):null]}),r.jsx("div",{className:"min-h-0",children:w?r.jsx(Og,{disabled:v||j,onStart:x,onStop:g,active:o?.active,heat:o?.heat,defaultShowSettings:!1,showSettingsToggle:!0,compactSettings:!0,className:"h-full"}):null})]})}function vo({layout:n,className:s=""}){return r.jsx("div",{className:`flex flex-col gap-0.5 ${s}`.trim(),children:r.jsx(kA,{layout:n})})}function bo({layout:n,className:s=""}){return r.jsx("div",{className:`flex flex-col gap-0.5 ${s}`.trim(),children:r.jsx(EA,{layout:n==="landscape"?"landscape":"portrait"})})}function MA({swapColumns:n=!1}){const s="h-[min(60svh,24rem)]",i=n?r.jsx(bo,{layout:"portrait",className:s}):r.jsx(vo,{layout:"portrait",className:s}),o=n?r.jsx(vo,{layout:"portrait",className:s}):r.jsx(bo,{layout:"portrait",className:s});return r.jsx("section",{className:"panel",children:r.jsxs("div",{className:"grid grid-cols-2 gap-0.5 items-stretch",children:[i,o]})})}function RA(n=[],s={}){const i=tn(),{enabled:o=!0,version:f=null}=s,[d,h]=m.useState({}),p=m.useRef(new Map),x=m.useMemo(()=>n.map(C=>typeof C=="string"?C:C.id),[n]),g=m.useMemo(()=>{const C=x.join("|");return f?`${C}|v:${f}`:C},[x,f]),v=m.useRef([]),[y,S]=m.useState(0),E=m.useRef(new Map);return m.useEffect(()=>{if(!i)return;const C=()=>S(k=>k+1);return i.on("connect",C),()=>i.off("connect",C)},[i]),m.useEffect(()=>{v.current=x},[g,x]),m.useEffect(()=>{p.current.forEach(C=>URL.revokeObjectURL(C)),p.current.clear(),h({})},[g]),m.useEffect(()=>{if(!o){p.current.forEach(N=>URL.revokeObjectURL(N)),p.current.clear(),h({});return}if(!v.current.length||!i)return;let C=!1;const k=v.current,w=(N={},q)=>{if(C||!N.id||!q)return;const M=q.byteLength??q.length??0,O=Date.now(),K=E.current.get(N.id)||{count:0,totalBytes:0,lastLogAt:0},_={count:K.count+1,totalBytes:K.totalBytes+M,lastLogAt:K.lastLogAt};if(!_.lastLogAt||O-_.lastLogAt>=1e4){const V=_.count?_.totalBytes/_.count:0;console.log("[roomCamera]",N.id,`frame=${M}B`,`avg=${Math.round(V)}B`,`count=${_.count}`),_.lastLogAt=O}E.current.set(N.id,_);const U=new Blob([q],{type:"image/jpeg"}),z=URL.createObjectURL(U),H=p.current.get(N.id);H&&URL.revokeObjectURL(H),p.current.set(N.id,z),h(V=>({...V,[N.id]:{status:"playing",ts:N.ts||Date.now(),error:null,objectUrl:z}}))},j=(N={})=>{C||!N.id||h(q=>({...q,[N.id]:{...q[N.id]||{},status:N.error?"error":q[N.id]?.status||"connecting",error:N.error||null,ts:N.ts||q[N.id]?.ts||null,objectUrl:q[N.id]?.objectUrl||null}}))};return i.on("roomCamera:frame",w),i.on("roomCamera:status",j),i.emit("roomCamera:subscribe",{ids:k},(N={})=>{N.error}),()=>{C=!0,i.emit("roomCamera:unsubscribe",{ids:k}),i.off("roomCamera:frame",w),i.off("roomCamera:status",j),p.current.forEach(N=>URL.revokeObjectURL(N)),p.current.clear()}},[i,g,o,y]),d}function qA({feed:n,label:s}){const[i,o]=m.useState(!1);m.useEffect(()=>{n&&(!n.ts&&!n.objectUrl||o(d=>!d))},[n?.ts,n?.objectUrl]);const f=m.useMemo(()=>n?n.error?`Error: ${n.error}`:n.status||"Connecting…":"Connecting…",[n]);return r.jsxs("div",{className:"relative w-full overflow-hidden rounded bg-black",style:{aspectRatio:"4 / 3"},children:[n?.objectUrl?r.jsx("img",{src:n.objectUrl,alt:s,className:"h-full w-full object-cover"}):r.jsx("div",{className:"flex h-full w-full items-center justify-center text-sm text-slate-300",children:"Waiting for frame…"}),r.jsx("div",{className:"pointer-events-none absolute left-0 top-0 bg-black/70 px-0.5 py-0.5 text-xs font-semibold text-white",children:s}),r.jsxs("div",{className:"pointer-events-none absolute bottom-0 left-0 m-0 flex items-center gap-0.5 rounded bg-black/70 px-0.5 py-0.25 text-[0.7rem] text-slate-100",children:[r.jsx("span",{className:`h-2 w-2 rounded-full ${i?"bg-emerald-400":"bg-slate-500"}`}),r.jsx("span",{children:f})]})]})}function TA(){return r.jsxs("div",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-center text-slate-400",children:"No room cameras configured."}),r.jsx("p",{className:"text-center text-slate-500",children:"Add entries to server config to populate this list."})]})}const zg=["horizontal","vertical"];function vf(n,s){return zg.includes(n)?n:s}function dd({defaultOrientation:n="horizontal",orientation:s,hideLayoutToggle:i=!1,hideHeader:o=!1,panelId:f=null}){const{session:d}=nn(),h=d?.roomCameras||[],p=RA(h.map(w=>({id:w.id}))),{value:x,save:g}=He("roomCameraPanels",{}),[v,y]=m.useState(()=>vf(f?x?.[f]:n,"horizontal"));m.useEffect(()=>{if(!f)return;const w=x?.[f];w&&y(vf(w,"horizontal"))},[f,x?.[f]]);const S=s?vf(s,"horizontal"):v,E=S==="vertical"?"flex flex-col gap-0.5":"grid gap-0.5 md:grid-cols-2",C=!i&&!s&&h.length>0,k=w=>{y(w),f&&g(j=>({...j||{},[f]:w}))};return h.length===0?r.jsx(TA,{}):r.jsxs("section",{className:"panel-section space-y-0.5 text-base",children:[!o&&r.jsxs("header",{className:"flex flex-wrap items-center justify-between gap-0.5 text-sm text-slate-400",children:[r.jsxs("div",{className:"flex items-center gap-0.5",children:[r.jsx("p",{children:"Room cameras"}),r.jsx("span",{className:"text-xs text-slate-500",children:h.length})]}),r.jsx("div",{className:"flex flex-wrap items-center gap-0.5 text-xs",children:C&&r.jsxs("div",{className:"flex items-center gap-0.5",children:[r.jsx("span",{className:"text-slate-500",children:"Layout:"}),r.jsx("div",{className:"inline-flex overflow-hidden rounded border border-slate-700",children:zg.map(w=>r.jsx("button",{type:"button",className:`px-1 py-0.5 ${S===w?"bg-slate-600 text-white":"bg-transparent text-slate-400 hover:text-white"}`,onClick:()=>k(w),children:w==="vertical"?"Vertical":"Grid"},w))})]})})]}),r.jsx("div",{className:E,children:h.map(w=>{const j=p[w.id]||null;return r.jsx("article",{className:"w-full space-y-0.5 rounded bg-zinc-950 p-0.5 shadow-inner shadow-black/40",children:r.jsx(qA,{feed:j,label:w.name||w.id})},w.id)})})]})}function md(){const n=ft(s=>s.logs);return r.jsxs("div",{className:"panel-section space-y-0.5 text-base",children:[r.jsxs("div",{className:"flex items-center justify-between text-sm text-slate-400",children:[r.jsx("span",{children:"Server logs"}),r.jsx("span",{children:n.length})]}),r.jsx("div",{className:"surface h-64 overflow-y-auto font-mono text-xs",children:n.length===0?r.jsx("p",{children:"No logs yet."}):n.slice().reverse().map(s=>r.jsxs("div",{className:"surface",children:[r.jsx("span",{className:"text-amber-400",children:s.timestamp})," ",r.jsxs("span",{className:"text-lime-400",children:["[",s.level,"]"]})," ",s.label&&r.jsxs("span",{className:"text-teal-400",children:["[",s.label,"]"]})," ",r.jsx("span",{children:s.message})]},s.id))})]})}function DA(n){if(!n)return null;if(typeof n=="string"){const s=String(n).trim();return s?{type:"rover",id:s,key:s}:null}if(typeof n=="object"){if(n.type&&n.id){const s=String(n.id);let i=n.key;return i||(i=n.type==="room"?`room:${s}`:s),{type:n.type,id:s,key:i}}if(n.roverId){const s=String(n.roverId);return{type:"rover",id:s,key:n.key||s}}if(n.roomCameraId){const s=String(n.roomCameraId);return{type:"room",id:s,key:n.key||`room:${s}`}}}return null}function _A(n=[]){const s=new Set,i=[];return n.forEach(o=>{!o?.key||s.has(o.key)||(s.add(o.key),i.push(o))}),i.sort((o,f)=>o.key.localeCompare(f.key))}function ji(n=[],s={}){const i=tn(),{enabled:o=!0,version:f=null}=s,[d,h]=m.useState({}),p=m.useMemo(()=>Array.isArray(n)?_A(n.map(DA).filter(Boolean)):[],[n]),x=m.useMemo(()=>{const E=p.map(C=>`${C.type}:${C.id}:${C.key}`).join("|");return f?`${E}|v:${f}`:E},[p,f]),g=m.useRef([]),[v,y]=m.useState(0);return m.useEffect(()=>{if(!i)return;const E=()=>y(C=>C+1);return i.on("connect",E),()=>{i.off("connect",E)}},[i]),m.useEffect(()=>{g.current=p},[p]),m.useEffect(()=>{if(!x||!o){h({});return}const E=g.current;let C=!1;function k(w){const j=w.type==="room"?{roomCameraId:w.id}:{roverId:w.id};i.emit("video:request",j,(N={})=>{C||h(q=>({...q,[w.key]:N}))})}return E.forEach(w=>{k(w)}),()=>{C=!0}},[i,x,o,v]),m.useMemo(()=>{if(!x||!o)return{};const E={};return p.forEach(C=>{d[C.key]&&(E[C.key]=d[C.key])}),E},[x,d,p])}function hd(n=[],s={}){const i=tn(),{enabled:o=!0,version:f=null}=s,[d,h]=m.useState({}),p=m.useRef(new Map),x=m.useMemo(()=>n.map(C=>typeof C=="string"?C:C.id).filter(Boolean),[n]),g=m.useMemo(()=>{const C=x.join("|");return f?`${C}|v:${f}`:C},[x,f]),v=m.useRef([]),[y,S]=m.useState(0),E=m.useRef(new Map);return m.useEffect(()=>{if(!i)return;const C=()=>S(k=>k+1);return i.on("connect",C),()=>i.off("connect",C)},[i]),m.useEffect(()=>{v.current=x},[g,x]),m.useEffect(()=>{p.current.forEach(C=>URL.revokeObjectURL(C)),p.current.clear(),h({})},[g]),m.useEffect(()=>{if(!o){p.current.forEach(N=>URL.revokeObjectURL(N)),p.current.clear(),h({});return}if(!v.current.length||!i)return;let C=!1;const k=v.current,w=(N={},q)=>{if(C||!N.id||!q)return;const M=q.byteLength??q.length??0,O=Date.now(),K=E.current.get(N.id)||{count:0,totalBytes:0,lastLogAt:0},_={count:K.count+1,totalBytes:K.totalBytes+M,lastLogAt:K.lastLogAt};if(!_.lastLogAt||O-_.lastLogAt>=1e4){const V=_.count?_.totalBytes/_.count:0;console.log("[roverSnapshot]",N.id,`frame=${M}B`,`avg=${Math.round(V)}B`,`count=${_.count}`),_.lastLogAt=O}E.current.set(N.id,_);const U=new Blob([q],{type:"image/jpeg"}),z=URL.createObjectURL(U),H=p.current.get(N.id);H&&URL.revokeObjectURL(H),p.current.set(N.id,z),h(V=>({...V,[N.id]:{status:"playing",ts:N.ts||Date.now(),error:null,objectUrl:z}}))},j=(N={})=>{C||!N.id||h(q=>({...q,[N.id]:{...q[N.id]||{},status:N.error?"error":q[N.id]?.status||"connecting",error:N.error||null,ts:N.ts||q[N.id]?.ts||null,objectUrl:q[N.id]?.objectUrl||null}}))};return i.on("roverSnapshot:frame",w),i.on("roverSnapshot:status",j),i.emit("roverSnapshot:subscribe",{ids:k},(N={})=>{N.error}),()=>{C=!0,i.emit("roverSnapshot:unsubscribe",{ids:k}),i.off("roverSnapshot:frame",w),i.off("roverSnapshot:status",j),p.current.forEach(N=>URL.revokeObjectURL(N)),p.current.clear()}},[i,g,o,y]),d}const BA={iceServers:[{urls:"stun:stun.l.google.com:19302"},{urls:"turn:your.turn.server:3478",username:"user",credential:"pass"}],bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"};function OA(n){if(typeof btoa=="function")return btoa(n);if(typeof Buffer<"u")return Buffer.from(n).toString("base64");throw new Error("No base64 encoder available")}function LA(n){if(!n)return{};const s=`${n}:${n}`;return{Authorization:`Basic ${OA(s)}`}}class rx{constructor({url:s,token:i,video:o,onStatus:f,audioOnly:d=!1,receiveAudio:h=!0}){this.url=s,this.token=i,this.video=o,this.audioOnly=d,this.receiveAudio=h,this.pc=null,this.abortController=null,this.onStatus=f}notify(s,i){typeof this.onStatus=="function"&&this.onStatus(s,i)}configureVideoElement(){this.video&&(this.video.playsInline=!0,this.video.autoplay=!0,this.video.muted=!this.audioOnly,typeof this.video.disableRemotePlayback<"u"&&(this.video.disableRemotePlayback=!0),"latencyHint"in HTMLMediaElement.prototype&&(this.video.latencyHint="interactive"))}async start(){if(!this.url||!this.video)throw new Error("Media target missing");this.stop(),this.notify("connecting"),this.configureVideoElement(),this.abortController=new AbortController;const s=new RTCPeerConnection(BA);this.pc=s;const i=new MediaStream;s.ontrack=o=>{o.streams[0]?.getTracks().forEach(f=>i.addTrack(f)),this.video.srcObject=i,o.track?.kind==="video"&&"playoutDelayHint"in o.receiver&&(o.receiver.playoutDelayHint=0)},this.audioOnly?s.addTransceiver("audio",{direction:"recvonly"}):(s.addTransceiver("video",{direction:"recvonly"}),this.receiveAudio&&s.addTransceiver("audio",{direction:"recvonly"})),s.onconnectionstatechange=()=>{this.notify(s.connectionState)},s.oniceconnectionstatechange=()=>{const o=s.iceConnectionState;(o==="failed"||o==="disconnected")&&this.notify(o)};try{const o=await s.createOffer({offerToReceiveAudio:this.audioOnly?!0:this.receiveAudio,offerToReceiveVideo:!this.audioOnly});await s.setLocalDescription(o);const f=await fetch(this.url,{method:"POST",headers:{"Content-Type":"application/sdp",...LA(this.token)},body:o.sdp,signal:this.abortController.signal});if(!f.ok)throw new Error(`WHEP request failed: ${f.status}`);const d=await f.text();await s.setRemoteDescription({type:"answer",sdp:d}),s.getReceivers().forEach(h=>{"playoutDelayHint"in h&&(h.playoutDelayHint=0)}),await this.video.play().catch(()=>{}),this.notify("playing")}catch(o){throw this.notify("error",o.message),this.stop(),o}}stop(){this.abortController&&(this.abortController.abort(),this.abortController=null),this.pc&&(this.pc.getSenders().forEach(s=>s.track?.stop()),this.pc.getReceivers().forEach(s=>s.track?.stop()),this.pc.close(),this.pc=null),this.video&&(this.video.srcObject=null),this.notify("stopped")}}function Hf({sensors:n={},variant:s="full",size:i,overlay:o=!1}){const f=i||(s==="mini"?190:260),d=f/2,h=f*.07,p=d,x=d+h,g=d*.8,v=g-4,y=g+4,S=g-14,E=g-6,C=g*.65,k=n?.bumpsAndWheelDrops||{},w=n?.wheelOvercurrents||{},j=n?.wheelLeftCurrentMa??0,N=n?.wheelRightCurrentMa??0,q=n?.sideBrushCurrentMa??0,M=n?.mainBrushCurrentMa??0,O=6,K=k.bumpLeft?O:0,_=k.bumpRight?O:0,U=YA({count:6,totalSpan:140,gap:6,startAngle:-70}),z=["L","FL","CL","CR","FR","R"],H=[n?.lightBumpLeftSignal,n?.lightBumpFrontLeftSignal,n?.lightBumpCenterLeftSignal,n?.lightBumpCenterRightSignal,n?.lightBumpFrontRightSignal,n?.lightBumpRightSignal],V=U.map((Y,T)=>({label:z[T],start:Y.start,end:Y.end,value:H[T]})),W=[{label:"Cliff L",start:-60,end:-46,value:n?.cliffLeftSignal,active:n?.cliffLeft},{label:"Cliff FL",start:-32,end:-16,value:n?.cliffFrontLeftSignal,active:n?.cliffFrontLeft},{label:"Cliff FR",start:16,end:32,value:n?.cliffFrontRightSignal,active:n?.cliffFrontRight},{label:"Cliff R",start:46,end:60,value:n?.cliffRightSignal,active:n?.cliffRight}],oe=H.filter(Y=>Y!=null),ce=oe.length?Math.max(...oe,1200):1200;return r.jsxs("div",{className:`${o?"relative":"surface relative p-1"}`,style:o?{width:`${f}px`,height:`${f}px`}:{height:"100%",width:"100%",aspectRatio:"1 / 1"},children:[o?null:r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"absolute left-1 top-1 text-xs text-slate-400",children:"Top-down"}),r.jsxs("div",{className:"absolute right-1 top-1 text-[0.65rem] text-slate-500",children:["0–",ce]})]}),r.jsxs("svg",{width:"100%",height:"100%",viewBox:`0 0 ${f} ${f}`,preserveAspectRatio:"xMidYMid meet",className:"mx-auto block",children:[r.jsx("circle",{cx:p,cy:x,r:g,fill:"#0f172a",stroke:"#334155",strokeWidth:"2"}),r.jsx(ox,{cx:p-C,cy:x,current:j,drop:k.wheelDropLeft,overcurrent:w.leftWheel,label:"L"}),r.jsx(ox,{cx:p+C,cy:x,current:N,drop:k.wheelDropRight,overcurrent:w.rightWheel,label:"R"}),r.jsx(HA,{cx:p+g*.65,cy:x-g*.55,current:q,overcurrent:w.sideBrush}),r.jsx(VA,{cx:p,cy:x,current:M,overcurrent:w.mainBrush,variant:s,dirtLeft:n?.dirtDetectLeft,dirtRight:n?.dirtDetect}),V.map(Y=>{const T=$A(Y.value,ce),G=y+4,I=G+28;return r.jsx(zA,{cx:p,cy:x,rBase:I,rTip:G,startDeg:Y.start,endDeg:Y.end,color:T,value:Y.value,max:ce},Y.label)}),W.map(Y=>{const T=GA(Y.value,Y.active);return r.jsx(bf,{cx:p,cy:x,rInner:S,rOuter:E,startDeg:Y.start,endDeg:Y.end,color:T,opacity:1,pulse:!!Y.active},Y.label)}),r.jsx(bf,{cx:p,cy:x,rInner:v-K,rOuter:y-K,startDeg:-70,endDeg:-6,color:k.bumpLeft?"#ef4444":"#475569",opacity:1,pulse:!!k.bumpLeft}),r.jsx(bf,{cx:p,cy:x,rInner:v-_,rOuter:y-_,startDeg:6,endDeg:70,color:k.bumpRight?"#ef4444":"#475569",opacity:1,pulse:!!k.bumpRight})]})]})}function bf({cx:n,cy:s,rInner:i,rOuter:o,startDeg:f,endDeg:d,color:h,pulse:p=!1,opacity:x=1}){const g=(i+o)/2,v=o-i,y=UA(n,s,g,f,d);return r.jsxs(r.Fragment,{children:[r.jsx("path",{d:y,stroke:h,strokeWidth:v,strokeLinecap:"round",fill:"none",opacity:x}),p?r.jsx("path",{d:y,stroke:"#ef4444",strokeWidth:v,strokeLinecap:"round",fill:"none",className:"animate-pulse",opacity:1}):null]})}function zA({cx:n,cy:s,rBase:i,rTip:o,startDeg:f,endDeg:d,color:h,value:p,max:x}){const g=(f+d)/2,v=gi(n,s,o,g),y=ko(p!=null?p/(x||1):0),S=Math.pow(y,.35),E=i-(i-o)*S,C=gi(n,s,E,f),k=gi(n,s,E,d),w=`M ${v.x} ${v.y} L ${C.x} ${C.y} L ${k.x} ${k.y} Z`;return r.jsx("path",{d:w,fill:h,opacity:1,stroke:"none"})}function UA(n,s,i,o,f){let d=o,h=f;h<=d&&(h+=360);const p=gi(n,s,i,d),x=gi(n,s,i,h);return["M",p.x,p.y,"A",i,i,0,0,1,x.x,x.y].join(" ")}function gi(n,s,i,o){const f=Ug(o);return{x:n+i*Math.cos(f),y:s+i*Math.sin(f)}}function Ug(n){return(n-90)*Math.PI/180}function pd(n,s){if(s)return"#ef4444";const i=Math.abs(n);return i>900?"#f59e0b":i>300?"#22c55e":"#64748b"}function ko(n){return Math.max(0,Math.min(1,n))}function ox({cx:n,cy:s,current:i,drop:o,overcurrent:f,label:d}){const h=Math.abs(i),p=ko(h/1200),x=pd(i,f),g=56,v=14,y=9,S=3,E=g*p,C=d==="L"?-1:1,k=C*(-y/2-S/2),w=C*(v/2+S/2),j=v+y+S+2,N=g+4;return r.jsxs("g",{transform:`translate(${n},${s})`,children:[r.jsx("rect",{x:-j/2,y:-N/2,width:j,height:N,rx:"4",fill:"none",stroke:"#64748b",strokeWidth:"1"}),r.jsx("rect",{x:k-v/2,y:-g/2,width:v,height:g,fill:"#0f172a",stroke:"#0f172a",strokeWidth:"1",rx:"2"}),r.jsx("rect",{x:k-v/2,y:g/2-E,width:v,height:E,fill:x,className:f?"animate-pulse":""}),r.jsx("rect",{x:w-y/2,y:-g/2,width:y,height:g,fill:o?"#ef4444":"#475569",className:o?"animate-pulse":"",rx:"2"}),r.jsx("text",{x:0,y:g/2+10,textAnchor:"middle",className:"fill-slate-200 text-[0.7rem]",children:d})]})}function HA({cx:n,cy:s,current:i,overcurrent:o}){var f=Math.abs(i);f<10&&(f=0);const d=pd(i*3,o),h=43,p=f>0?.65:null;return r.jsxs("g",{style:{transformOrigin:`${n}px ${s}px`,animation:p?`spin ${p}s linear infinite`:"none",animationDirection:p?"reverse":"normal"},children:[r.jsx("circle",{cx:n,cy:s,r:10,fill:"#64748b",stroke:"#64748b",strokeWidth:"1"}),[0,120,240].map(g=>{const v=Ug(g),y=n+h*Math.cos(v),S=s+h*Math.sin(v);return r.jsx("line",{x1:n,y1:s,x2:y,y2:S,stroke:d,strokeWidth:"4",strokeLinecap:"round"},g)}),o?r.jsx("circle",{cx:n,cy:s,r:h+8,stroke:"#ef4444",strokeWidth:"3",fill:"none",className:"animate-pulse"}):null]})}function VA({cx:n,cy:s,current:i,overcurrent:o,variant:f,dirtLeft:d,dirtRight:h}){const p=Math.abs(i),x=pd(i,o),g=1,v=96,y=12,S=`main-brush-pattern-a-${f}`,E=`main-brush-pattern-b-${f}`,C=p>0?.6:null,k=i>=0?1:-1;return r.jsxs("g",{children:[r.jsx("defs",{children:[S,E].map((w,j)=>r.jsxs("pattern",{id:w,patternUnits:"userSpaceOnUse",width:"6",height:"6",children:[r.jsx("rect",{width:"6",height:"6",fill:x,opacity:g}),r.jsx("path",{d:"M0 6 L6 0",stroke:"#0f172a",strokeWidth:"1"}),C?r.jsx("animateTransform",{attributeName:"patternTransform",type:"translate",from:"0 0",to:`0 ${k*(j===0?6:-6)}`,dur:`${C}s`,repeatCount:"indefinite"}):null]},w))}),r.jsx("rect",{x:n-v/2,y:s-14,width:v,height:y,rx:"3",fill:`url(#${S})`,stroke:"#64748b",strokeWidth:"1"}),r.jsx("rect",{x:n-v/2,y:s+4,width:v,height:y,rx:"3",fill:`url(#${E})`,stroke:"#64748b",strokeWidth:"1"}),r.jsx("circle",{cx:n-v/4,cy:s-8,r:3.5,fill:"#fbbf24"}),r.jsx("circle",{cx:n+v/4,cy:s+8,r:3.5,fill:"#fbbf24"}),o?r.jsx("rect",{x:n-v/2-4,y:s-16,width:v+8,height:y*2+16,rx:"6",stroke:"#ef4444",strokeWidth:"3",fill:"none",className:"animate-pulse"}):null]})}function $A(n,s){if(n==null||n<=0)return"hsl(200 60% 18%)";const o=ko(n/(s||1));return`hsl(${(200+Math.pow(o,.45)*360)%360} 100% 60%)`}function GA(n,s){if(s)return"#ef4444";const i=ko(n==null?0:n/4095),o=[47,55,69],f=[245,158,11],[d,h,p]=o.map((x,g)=>Math.round(x+(f[g]-x)*i));return`rgb(${d}, ${h}, ${p})`}function YA({count:n,totalSpan:s,gap:i,startAngle:o}){const d=(s-i*(n-1))/n,h=[];let p=o;for(let x=0;x{s({hudMapDesktop:!!f})}]}const FA={discord:hg,kofi:V0,"ko-fi":V0,wiki:yj,throne:Sj},XA={discord:{backgroundImage:"linear-gradient(270deg,#5865F2,#404EED,#5865F2)",backgroundSize:"600% 600%",animation:"socialGradient 180s ease infinite"},kofi:{backgroundImage:"linear-gradient(270deg,#FF6433,#E04822,#FF6433)",backgroundSize:"600% 600%",animation:"socialGradient 170s ease infinite"},"ko-fi":{backgroundImage:"linear-gradient(270deg,#FF6433,#E04822,#FF6433)",backgroundSize:"600% 600%",animation:"socialGradient 170s ease infinite"},wiki:{backgroundImage:"linear-gradient(270deg,#EE8019,#C65C08,#EE8019)",backgroundSize:"600% 600%",animation:"socialGradient 180s ease infinite"},throne:{backgroundImage:"linear-gradient(270deg,#7C3AED,#5B21B6,#7C3AED)",backgroundSize:"600% 600%",animation:"socialGradient 180s ease infinite"}};function QA(){m.useEffect(()=>{if(typeof document>"u")return;const n="social-button-keyframes";if(document.getElementById(n))return;const s=document.createElement("style");s.id=n,s.textContent=` +Please change the parent to .`)}let S=fs(),E;if(s){let N=typeof s=="string"?cl(s):s;ut(v==="/"||N.pathname?.startsWith(v),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${v}" but pathname "${N.pathname}" was given in the \`location\` prop.`),E=N}else E=S;let C=E.pathname||"/",k=C;if(v!=="/"){let N=v.replace(/^\//,"").split("/");k="/"+C.replace(/^\//,"").split("/").slice(N.length).join("/")}let w=Rx(n,{pathname:k});Nn(y||w!=null,`No routes matched location "${E.pathname}${E.search}${E.hash}" `),Nn(w==null||w[w.length-1].route.element!==void 0||w[w.length-1].route.Component!==void 0||w[w.length-1].route.lazy!==void 0,`Matched leaf route at location "${E.pathname}${E.search}${E.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let j=o1(w&&w.map(N=>Object.assign({},N,{params:Object.assign({},x,N.params),pathname:ra([v,d.encodeLocation?d.encodeLocation(N.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:N.pathname]),pathnameBase:N.pathnameBase==="/"?v:ra([v,d.encodeLocation?d.encodeLocation(N.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:N.pathnameBase])})),h,i,o,f);return s&&j?m.createElement(ki.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...E},navigationType:"POP"}},j):j}function s1(){let n=m1(),s=Iy(n)?`${n.status} ${n.statusText}`:n instanceof Error?n.message:JSON.stringify(n),i=n instanceof Error?n.stack:null,o="rgba(200,200,200, 0.5)",f={padding:"0.5rem",backgroundColor:o},d={padding:"2px 4px",backgroundColor:o},h=null;return console.error("Error handled by React Router default ErrorBoundary:",n),h=m.createElement(m.Fragment,null,m.createElement("p",null,"💿 Hey developer 👋"),m.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",m.createElement("code",{style:d},"ErrorBoundary")," or"," ",m.createElement("code",{style:d},"errorElement")," prop on your route.")),m.createElement(m.Fragment,null,m.createElement("h2",null,"Unexpected Application Error!"),m.createElement("h3",{style:{fontStyle:"italic"}},s),i?m.createElement("pre",{style:f},i):null,h)}var l1=m.createElement(s1,null),i1=class extends m.Component{constructor(n){super(n),this.state={location:n.location,revalidation:n.revalidation,error:n.error}}static getDerivedStateFromError(n){return{error:n}}static getDerivedStateFromProps(n,s){return s.location!==n.location||s.revalidation!=="idle"&&n.revalidation==="idle"?{error:n.error,location:n.location,revalidation:n.revalidation}:{error:n.error!==void 0?n.error:s.error,location:s.location,revalidation:n.revalidation||s.revalidation}}componentDidCatch(n,s){this.props.onError?this.props.onError(n,s):console.error("React Router caught the following error during render",n)}render(){return this.state.error!==void 0?m.createElement(ua.Provider,{value:this.props.routeContext},m.createElement(Yf.Provider,{value:this.state.error,children:this.props.component})):this.props.children}};function r1({routeContext:n,match:s,children:i}){let o=m.useContext(ul);return o&&o.static&&o.staticContext&&(s.route.errorElement||s.route.ErrorBoundary)&&(o.staticContext._deepestRenderedBoundaryId=s.route.id),m.createElement(ua.Provider,{value:n},i)}function o1(n,s=[],i=null,o=null,f=null){if(n==null){if(!i)return null;if(i.errors)n=i.matches;else if(s.length===0&&!i.initialized&&i.matches.length>0)n=i.matches;else return null}let d=n,h=i?.errors;if(h!=null){let v=d.findIndex(y=>y.route.id&&h?.[y.route.id]!==void 0);ut(v>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(h).join(",")}`),d=d.slice(0,Math.min(d.length,v+1))}let p=!1,x=-1;if(i)for(let v=0;v=0?d=d.slice(0,x+1):d=[d[0]];break}}}let g=i&&o?(v,y)=>{o(v,{location:i.location,params:i.matches?.[0]?.params??{},errorInfo:y})}:void 0;return d.reduceRight((v,y,S)=>{let E,C=!1,k=null,w=null;i&&(E=h&&y.route.id?h[y.route.id]:void 0,k=y.route.errorElement||l1,p&&(x<0&&S===0?(Hx("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),C=!0,w=null):x===S&&(C=!0,w=y.route.hydrateFallbackElement||null)));let j=s.concat(d.slice(0,S+1)),N=()=>{let q;return E?q=k:C?q=w:y.route.Component?q=m.createElement(y.route.Component,null):y.route.element?q=y.route.element:q=v,m.createElement(r1,{match:y,routeContext:{outlet:v,matches:j,isDataRoute:i!=null},children:q})};return i&&(y.route.ErrorBoundary||y.route.errorElement||S===0)?m.createElement(i1,{location:i.location,revalidation:i.revalidation,component:k,error:E,children:N(),routeContext:{outlet:null,matches:j,isDataRoute:!0},onError:g}):N()},null)}function Ff(n){return`${n} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function c1(n){let s=m.useContext(ul);return ut(s,Ff(n)),s}function u1(n){let s=m.useContext(No);return ut(s,Ff(n)),s}function f1(n){let s=m.useContext(ua);return ut(s,Ff(n)),s}function Xf(n){let s=f1(n),i=s.matches[s.matches.length-1];return ut(i.route.id,`${n} can only be used on routes that contain a unique "id"`),i.route.id}function d1(){return Xf("useRouteId")}function m1(){let n=m.useContext(Yf),s=u1("useRouteError"),i=Xf("useRouteError");return n!==void 0?n:s.errors?.[i]}function h1(){let{router:n}=c1("useNavigate"),s=Xf("useNavigate"),i=m.useRef(!1);return zx(()=>{i.current=!0}),m.useCallback(async(f,d={})=>{Nn(i.current,Lx),i.current&&(typeof f=="number"?n.navigate(f):await n.navigate(f,{fromRouteId:s,...d}))},[n,s])}var R0={};function Hx(n,s,i){!s&&!R0[n]&&(R0[n]=!0,Nn(!1,i))}m.memo(p1);function p1({routes:n,future:s,state:i,unstable_onError:o}){return Ux(n,void 0,i,o,s)}function no(n){ut(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function x1({basename:n="/",children:s=null,location:i,navigationType:o="POP",navigator:f,static:d=!1}){ut(!Mi(),"You cannot render a inside another . You should never have more than one in your app.");let h=n.replace(/^\/*/,"/"),p=m.useMemo(()=>({basename:h,navigator:f,static:d,future:{}}),[h,f,d]);typeof i=="string"&&(i=cl(i));let{pathname:x="/",search:g="",hash:v="",state:y=null,key:S="default"}=i,E=m.useMemo(()=>{let C=oa(x,h);return C==null?null:{location:{pathname:C,search:g,hash:v,state:y,key:S},navigationType:o}},[h,x,g,v,y,S,o]);return Nn(E!=null,` is not able to match the URL "${x}${g}${v}" because it does not start with the basename, so the won't render anything.`),E==null?null:m.createElement(_n.Provider,{value:p},m.createElement(ki.Provider,{children:s,value:E}))}function g1({children:n,location:s}){return a1(wf(n),s)}function wf(n,s=[]){let i=[];return m.Children.forEach(n,(o,f)=>{if(!m.isValidElement(o))return;let d=[...s,f];if(o.type===m.Fragment){i.push.apply(i,wf(o.props.children,d));return}ut(o.type===no,`[${typeof o.type=="string"?o.type:o.type.name}] is not a component. All component children of must be a or `),ut(!o.props.index||!o.props.children,"An index route cannot have child routes.");let h={id:o.props.id||d.join("-"),caseSensitive:o.props.caseSensitive,element:o.props.element,Component:o.props.Component,index:o.props.index,path:o.props.path,middleware:o.props.middleware,loader:o.props.loader,action:o.props.action,hydrateFallbackElement:o.props.hydrateFallbackElement,HydrateFallback:o.props.HydrateFallback,errorElement:o.props.errorElement,ErrorBoundary:o.props.ErrorBoundary,hasErrorBoundary:o.props.hasErrorBoundary===!0||o.props.ErrorBoundary!=null||o.props.errorElement!=null,shouldRevalidate:o.props.shouldRevalidate,handle:o.props.handle,lazy:o.props.lazy};o.props.children&&(h.children=wf(o.props.children,d)),i.push(h)}),i}var ao="get",so="application/x-www-form-urlencoded";function wo(n){return n!=null&&typeof n.tagName=="string"}function v1(n){return wo(n)&&n.tagName.toLowerCase()==="button"}function b1(n){return wo(n)&&n.tagName.toLowerCase()==="form"}function y1(n){return wo(n)&&n.tagName.toLowerCase()==="input"}function S1(n){return!!(n.metaKey||n.altKey||n.ctrlKey||n.shiftKey)}function j1(n,s){return n.button===0&&(!s||s==="_self")&&!S1(n)}var Fr=null;function A1(){if(Fr===null)try{new FormData(document.createElement("form"),0),Fr=!1}catch{Fr=!0}return Fr}var N1=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function Wu(n){return n!=null&&!N1.has(n)?(Nn(!1,`"${n}" is not a valid \`encType\` for \`\`/\`\` and will default to "${so}"`),null):n}function w1(n,s){let i,o,f,d,h;if(b1(n)){let p=n.getAttribute("action");o=p?oa(p,s):null,i=n.getAttribute("method")||ao,f=Wu(n.getAttribute("enctype"))||so,d=new FormData(n)}else if(v1(n)||y1(n)&&(n.type==="submit"||n.type==="image")){let p=n.form;if(p==null)throw new Error('Cannot submit a or without a ');let x=n.getAttribute("formaction")||p.getAttribute("action");if(o=x?oa(x,s):null,i=n.getAttribute("formmethod")||p.getAttribute("method")||ao,f=Wu(n.getAttribute("formenctype"))||Wu(p.getAttribute("enctype"))||so,d=new FormData(p,n),!A1()){let{name:g,type:v,value:y}=n;if(v==="image"){let S=g?`${g}.`:"";d.append(`${S}x`,"0"),d.append(`${S}y`,"0")}else g&&d.append(g,y)}}else{if(wo(n))throw new Error('Cannot submit element that is not , , or ');i=ao,o=null,f=so,h=n}return d&&f==="text/plain"&&(h=d,d=void 0),{action:o,method:i.toLowerCase(),encType:f,formData:d,body:h}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");function Qf(n,s){if(n===!1||n===null||typeof n>"u")throw new Error(s)}function C1(n,s,i){let o=typeof n=="string"?new URL(n,typeof window>"u"?"server://singlefetch/":window.location.origin):n;return o.pathname==="/"?o.pathname=`_root.${i}`:s&&oa(o.pathname,s)==="/"?o.pathname=`${s.replace(/\/$/,"")}/_root.${i}`:o.pathname=`${o.pathname.replace(/\/$/,"")}.${i}`,o}async function E1(n,s){if(n.id in s)return s[n.id];try{let i=await import(n.module);return s[n.id]=i,i}catch(i){return console.error(`Error loading route module \`${n.module}\`, reloading page...`),console.error(i),window.__reactRouterContext&&window.__reactRouterContext.isSpaMode,window.location.reload(),new Promise(()=>{})}}function k1(n){return n==null?!1:n.href==null?n.rel==="preload"&&typeof n.imageSrcSet=="string"&&typeof n.imageSizes=="string":typeof n.rel=="string"&&typeof n.href=="string"}async function M1(n,s,i){let o=await Promise.all(n.map(async f=>{let d=s.routes[f.route.id];if(d){let h=await E1(d,i);return h.links?h.links():[]}return[]}));return D1(o.flat(1).filter(k1).filter(f=>f.rel==="stylesheet"||f.rel==="preload").map(f=>f.rel==="stylesheet"?{...f,rel:"prefetch",as:"style"}:{...f,rel:"prefetch"}))}function q0(n,s,i,o,f,d){let h=(x,g)=>i[g]?x.route.id!==i[g].route.id:!0,p=(x,g)=>i[g].pathname!==x.pathname||i[g].route.path?.endsWith("*")&&i[g].params["*"]!==x.params["*"];return d==="assets"?s.filter((x,g)=>h(x,g)||p(x,g)):d==="data"?s.filter((x,g)=>{let v=o.routes[x.route.id];if(!v||!v.hasLoader)return!1;if(h(x,g)||p(x,g))return!0;if(x.route.shouldRevalidate){let y=x.route.shouldRevalidate({currentUrl:new URL(f.pathname+f.search+f.hash,window.origin),currentParams:i[0]?.params||{},nextUrl:new URL(n,window.origin),nextParams:x.params,defaultShouldRevalidate:!0});if(typeof y=="boolean")return y}return!0}):[]}function R1(n,s,{includeHydrateFallback:i}={}){return q1(n.map(o=>{let f=s.routes[o.route.id];if(!f)return[];let d=[f.module];return f.clientActionModule&&(d=d.concat(f.clientActionModule)),f.clientLoaderModule&&(d=d.concat(f.clientLoaderModule)),i&&f.hydrateFallbackModule&&(d=d.concat(f.hydrateFallbackModule)),f.imports&&(d=d.concat(f.imports)),d}).flat(1))}function q1(n){return[...new Set(n)]}function T1(n){let s={},i=Object.keys(n).sort();for(let o of i)s[o]=n[o];return s}function D1(n,s){let i=new Set;return new Set(s),n.reduce((o,f)=>{let d=JSON.stringify(T1(f));return i.has(d)||(i.add(d),o.push({key:d,link:f})),o},[])}function Vx(){let n=m.useContext(ul);return Qf(n,"You must render this element inside a element"),n}function _1(){let n=m.useContext(No);return Qf(n,"You must render this element inside a element"),n}var Kf=m.createContext(void 0);Kf.displayName="FrameworkContext";function $x(){let n=m.useContext(Kf);return Qf(n,"You must render this element inside a element"),n}function B1(n,s){let i=m.useContext(Kf),[o,f]=m.useState(!1),[d,h]=m.useState(!1),{onFocus:p,onBlur:x,onMouseEnter:g,onMouseLeave:v,onTouchStart:y}=s,S=m.useRef(null);m.useEffect(()=>{if(n==="render"&&h(!0),n==="viewport"){let k=j=>{j.forEach(N=>{h(N.isIntersecting)})},w=new IntersectionObserver(k,{threshold:.5});return S.current&&w.observe(S.current),()=>{w.disconnect()}}},[n]),m.useEffect(()=>{if(o){let k=setTimeout(()=>{h(!0)},100);return()=>{clearTimeout(k)}}},[o]);let E=()=>{f(!0)},C=()=>{f(!1),h(!1)};return i?n!=="intent"?[d,S,{}]:[d,S,{onFocus:ri(p,E),onBlur:ri(x,C),onMouseEnter:ri(g,E),onMouseLeave:ri(v,C),onTouchStart:ri(y,E)}]:[!1,S,{}]}function ri(n,s){return i=>{n&&n(i),i.defaultPrevented||s(i)}}function O1({page:n,...s}){let{router:i}=Vx(),o=m.useMemo(()=>Rx(i.routes,n,i.basename),[i.routes,n,i.basename]);return o?m.createElement(z1,{page:n,matches:o,...s}):null}function L1(n){let{manifest:s,routeModules:i}=$x(),[o,f]=m.useState([]);return m.useEffect(()=>{let d=!1;return M1(n,s,i).then(h=>{d||f(h)}),()=>{d=!0}},[n,s,i]),o}function z1({page:n,matches:s,...i}){let o=fs(),{manifest:f,routeModules:d}=$x(),{basename:h}=Vx(),{loaderData:p,matches:x}=_1(),g=m.useMemo(()=>q0(n,s,x,f,o,"data"),[n,s,x,f,o]),v=m.useMemo(()=>q0(n,s,x,f,o,"assets"),[n,s,x,f,o]),y=m.useMemo(()=>{if(n===o.pathname+o.search+o.hash)return[];let C=new Set,k=!1;if(s.forEach(j=>{let N=f.routes[j.route.id];!N||!N.hasLoader||(!g.some(q=>q.route.id===j.route.id)&&j.route.id in p&&d[j.route.id]?.shouldRevalidate||N.hasClientLoader?k=!0:C.add(j.route.id))}),C.size===0)return[];let w=C1(n,h,"data");return k&&C.size>0&&w.searchParams.set("_routes",s.filter(j=>C.has(j.route.id)).map(j=>j.route.id).join(",")),[w.pathname+w.search]},[h,p,o,f,g,s,n,d]),S=m.useMemo(()=>R1(v,f),[v,f]),E=L1(v);return m.createElement(m.Fragment,null,y.map(C=>m.createElement("link",{key:C,rel:"prefetch",as:"fetch",href:C,...i})),S.map(C=>m.createElement("link",{key:C,rel:"modulepreload",href:C,...i})),E.map(({key:C,link:k})=>m.createElement("link",{key:C,nonce:i.nonce,...k})))}function U1(...n){return s=>{n.forEach(i=>{typeof i=="function"?i(s):i!=null&&(i.current=s)})}}var Gx=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";try{Gx&&(window.__reactRouterVersion="7.9.6")}catch{}function H1({basename:n,children:s,window:i}){let o=m.useRef();o.current==null&&(o.current=Cy({window:i,v5Compat:!0}));let f=o.current,[d,h]=m.useState({action:f.action,location:f.location}),p=m.useCallback(x=>{m.startTransition(()=>h(x))},[h]);return m.useLayoutEffect(()=>f.listen(p),[f,p]),m.createElement(x1,{basename:n,children:s,location:d.location,navigationType:d.action,navigator:f})}var Yx=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Fx=m.forwardRef(function({onClick:s,discover:i="render",prefetch:o="none",relative:f,reloadDocument:d,replace:h,state:p,target:x,to:g,preventScrollReset:v,viewTransition:y,...S},E){let{basename:C}=m.useContext(_n),k=typeof g=="string"&&Yx.test(g),w,j=!1;if(typeof g=="string"&&k&&(w=g,Gx))try{let z=new URL(window.location.href),V=g.startsWith("//")?new URL(z.protocol+g):new URL(g),U=oa(V.pathname,C);V.origin===z.origin&&U!=null?g=U+V.search+V.hash:j=!0}catch{Nn(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}let N=e1(g,{relative:f}),[q,M,O]=B1(o,S),K=Y1(g,{replace:h,state:p,target:x,preventScrollReset:v,relative:f,viewTransition:y});function _(z){s&&s(z),z.defaultPrevented||K(z)}let H=m.createElement("a",{...S,...O,href:w||N,onClick:j||d?s:_,ref:U1(E,M),target:x,"data-discover":!k&&i==="render"?"true":void 0});return q&&!k?m.createElement(m.Fragment,null,H,m.createElement(O1,{page:N})):H});Fx.displayName="Link";var V1=m.forwardRef(function({"aria-current":s="page",caseSensitive:i=!1,className:o="",end:f=!1,style:d,to:h,viewTransition:p,children:x,...g},v){let y=Ri(h,{relative:g.relative}),S=fs(),E=m.useContext(No),{navigator:C,basename:k}=m.useContext(_n),w=E!=null&&Z1(y)&&p===!0,j=C.encodeLocation?C.encodeLocation(y).pathname:y.pathname,N=S.pathname,q=E&&E.navigation&&E.navigation.location?E.navigation.location.pathname:null;i||(N=N.toLowerCase(),q=q?q.toLowerCase():null,j=j.toLowerCase()),q&&k&&(q=oa(q,k)||q);const M=j!=="/"&&j.endsWith("/")?j.length-1:j.length;let O=N===j||!f&&N.startsWith(j)&&N.charAt(M)==="/",K=q!=null&&(q===j||!f&&q.startsWith(j)&&q.charAt(j.length)==="/"),_={isActive:O,isPending:K,isTransitioning:w},H=O?s:void 0,z;typeof o=="function"?z=o(_):z=[o,O?"active":null,K?"pending":null,w?"transitioning":null].filter(Boolean).join(" ");let V=typeof d=="function"?d(_):d;return m.createElement(Fx,{...g,"aria-current":H,className:z,ref:v,style:V,to:h,viewTransition:p},typeof x=="function"?x(_):x)});V1.displayName="NavLink";var $1=m.forwardRef(({discover:n="render",fetcherKey:s,navigate:i,reloadDocument:o,replace:f,state:d,method:h=ao,action:p,onSubmit:x,relative:g,preventScrollReset:v,viewTransition:y,...S},E)=>{let C=Q1(),k=K1(p,{relative:g}),w=h.toLowerCase()==="get"?"get":"post",j=typeof p=="string"&&Yx.test(p),N=q=>{if(x&&x(q),q.defaultPrevented)return;q.preventDefault();let M=q.nativeEvent.submitter,O=M?.getAttribute("formmethod")||h;C(M||q.currentTarget,{fetcherKey:s,method:O,navigate:i,replace:f,state:d,relative:g,preventScrollReset:v,viewTransition:y})};return m.createElement("form",{ref:E,method:w,action:k,onSubmit:o?x:N,...S,"data-discover":!j&&n==="render"?"true":void 0})});$1.displayName="Form";function G1(n){return`${n} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function Xx(n){let s=m.useContext(ul);return ut(s,G1(n)),s}function Y1(n,{target:s,replace:i,state:o,preventScrollReset:f,relative:d,viewTransition:h}={}){let p=t1(),x=fs(),g=Ri(n,{relative:d});return m.useCallback(v=>{if(j1(v,s)){v.preventDefault();let y=i!==void 0?i:bi(x)===bi(g);p(n,{replace:y,state:o,preventScrollReset:f,relative:d,viewTransition:h})}},[x,p,g,i,o,s,n,f,d,h])}var F1=0,X1=()=>`__${String(++F1)}__`;function Q1(){let{router:n}=Xx("useSubmit"),{basename:s}=m.useContext(_n),i=d1();return m.useCallback(async(o,f={})=>{let{action:d,method:h,encType:p,formData:x,body:g}=w1(o,s);if(f.navigate===!1){let v=f.fetcherKey||X1();await n.fetch(v,i,f.action||d,{preventScrollReset:f.preventScrollReset,formData:x,body:g,formMethod:f.method||h,formEncType:f.encType||p,flushSync:f.flushSync})}else await n.navigate(f.action||d,{preventScrollReset:f.preventScrollReset,formData:x,body:g,formMethod:f.method||h,formEncType:f.encType||p,replace:f.replace,state:f.state,fromRouteId:i,flushSync:f.flushSync,viewTransition:f.viewTransition})},[n,s,i])}function K1(n,{relative:s}={}){let{basename:i}=m.useContext(_n),o=m.useContext(ua);ut(o,"useFormAction must be used inside a RouteContext");let[f]=o.matches.slice(-1),d={...Ri(n||".",{relative:s})},h=fs();if(n==null){d.search=h.search;let p=new URLSearchParams(d.search),x=p.getAll("index");if(x.some(v=>v==="")){p.delete("index"),x.filter(y=>y).forEach(y=>p.append("index",y));let v=p.toString();d.search=v?`?${v}`:""}}return(!n||n===".")&&f.route.index&&(d.search=d.search?d.search.replace(/^\?/,"?index&"):"?index"),i!=="/"&&(d.pathname=d.pathname==="/"?i:ra([i,d.pathname])),bi(d)}function Z1(n,{relative:s}={}){let i=m.useContext(Ox);ut(i!=null,"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?");let{basename:o}=Xx("useViewTransitionState"),f=Ri(n,{relative:s});if(!i.isTransitioning)return!1;let d=oa(i.currentLocation.pathname,o)||i.currentLocation.pathname,h=oa(i.nextLocation.pathname,o)||i.nextLocation.pathname;return mo(f.pathname,h)!=null||mo(f.pathname,d)!=null}const Dn=Object.create(null);Dn.open="0";Dn.close="1";Dn.ping="2";Dn.pong="3";Dn.message="4";Dn.upgrade="5";Dn.noop="6";const lo=Object.create(null);Object.keys(Dn).forEach(n=>{lo[Dn[n]]=n});const Cf={type:"error",data:"parser error"},Qx=typeof Blob=="function"||typeof Blob<"u"&&Object.prototype.toString.call(Blob)==="[object BlobConstructor]",Kx=typeof ArrayBuffer=="function",Zx=n=>typeof ArrayBuffer.isView=="function"?ArrayBuffer.isView(n):n&&n.buffer instanceof ArrayBuffer,Zf=({type:n,data:s},i,o)=>Qx&&s instanceof Blob?i?o(s):T0(s,o):Kx&&(s instanceof ArrayBuffer||Zx(s))?i?o(s):T0(new Blob([s]),o):o(Dn[n]+(s||"")),T0=(n,s)=>{const i=new FileReader;return i.onload=function(){const o=i.result.split(",")[1];s("b"+(o||""))},i.readAsDataURL(n)};function D0(n){return n instanceof Uint8Array?n:n instanceof ArrayBuffer?new Uint8Array(n):new Uint8Array(n.buffer,n.byteOffset,n.byteLength)}let ef;function I1(n,s){if(Qx&&n.data instanceof Blob)return n.data.arrayBuffer().then(D0).then(s);if(Kx&&(n.data instanceof ArrayBuffer||Zx(n.data)))return s(D0(n.data));Zf(n,!1,i=>{ef||(ef=new TextEncoder),s(ef.encode(i))})}const _0="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",mi=typeof Uint8Array>"u"?[]:new Uint8Array(256);for(let n=0;n<_0.length;n++)mi[_0.charCodeAt(n)]=n;const J1=n=>{let s=n.length*.75,i=n.length,o,f=0,d,h,p,x;n[n.length-1]==="="&&(s--,n[n.length-2]==="="&&s--);const g=new ArrayBuffer(s),v=new Uint8Array(g);for(o=0;o>4,v[f++]=(h&15)<<4|p>>2,v[f++]=(p&3)<<6|x&63;return g},P1=typeof ArrayBuffer=="function",If=(n,s)=>{if(typeof n!="string")return{type:"message",data:Ix(n,s)};const i=n.charAt(0);return i==="b"?{type:"message",data:W1(n.substring(1),s)}:lo[i]?n.length>1?{type:lo[i],data:n.substring(1)}:{type:lo[i]}:Cf},W1=(n,s)=>{if(P1){const i=J1(n);return Ix(i,s)}else return{base64:!0,data:n}},Ix=(n,s)=>{switch(s){case"blob":return n instanceof Blob?n:new Blob([n]);case"arraybuffer":default:return n instanceof ArrayBuffer?n:n.buffer}},Jx="",eS=(n,s)=>{const i=n.length,o=new Array(i);let f=0;n.forEach((d,h)=>{Zf(d,!1,p=>{o[h]=p,++f===i&&s(o.join(Jx))})})},tS=(n,s)=>{const i=n.split(Jx),o=[];for(let f=0;f{const o=i.length;let f;if(o<126)f=new Uint8Array(1),new DataView(f.buffer).setUint8(0,o);else if(o<65536){f=new Uint8Array(3);const d=new DataView(f.buffer);d.setUint8(0,126),d.setUint16(1,o)}else{f=new Uint8Array(9);const d=new DataView(f.buffer);d.setUint8(0,127),d.setBigUint64(1,BigInt(o))}n.data&&typeof n.data!="string"&&(f[0]|=128),s.enqueue(f),s.enqueue(i)})}})}let tf;function Xr(n){return n.reduce((s,i)=>s+i.length,0)}function Qr(n,s){if(n[0].length===s)return n.shift();const i=new Uint8Array(s);let o=0;for(let f=0;fMath.pow(2,21)-1){p.enqueue(Cf);break}f=v*Math.pow(2,32)+g.getUint32(4),o=3}else{if(Xr(i)n){p.enqueue(Cf);break}}}})}const Px=4;function At(n){if(n)return sS(n)}function sS(n){for(var s in At.prototype)n[s]=At.prototype[s];return n}At.prototype.on=At.prototype.addEventListener=function(n,s){return this._callbacks=this._callbacks||{},(this._callbacks["$"+n]=this._callbacks["$"+n]||[]).push(s),this};At.prototype.once=function(n,s){function i(){this.off(n,i),s.apply(this,arguments)}return i.fn=s,this.on(n,i),this};At.prototype.off=At.prototype.removeListener=At.prototype.removeAllListeners=At.prototype.removeEventListener=function(n,s){if(this._callbacks=this._callbacks||{},arguments.length==0)return this._callbacks={},this;var i=this._callbacks["$"+n];if(!i)return this;if(arguments.length==1)return delete this._callbacks["$"+n],this;for(var o,f=0;fPromise.resolve().then(s):(s,i)=>i(s,0),gn=typeof self<"u"?self:typeof window<"u"?window:Function("return this")(),lS="arraybuffer";function Wx(n,...s){return s.reduce((i,o)=>(n.hasOwnProperty(o)&&(i[o]=n[o]),i),{})}const iS=gn.setTimeout,rS=gn.clearTimeout;function Eo(n,s){s.useNativeTimers?(n.setTimeoutFn=iS.bind(gn),n.clearTimeoutFn=rS.bind(gn)):(n.setTimeoutFn=gn.setTimeout.bind(gn),n.clearTimeoutFn=gn.clearTimeout.bind(gn))}const oS=1.33;function cS(n){return typeof n=="string"?uS(n):Math.ceil((n.byteLength||n.size)*oS)}function uS(n){let s=0,i=0;for(let o=0,f=n.length;o=57344?i+=3:(o++,i+=4);return i}function eg(){return Date.now().toString(36).substring(3)+Math.random().toString(36).substring(2,5)}function fS(n){let s="";for(let i in n)n.hasOwnProperty(i)&&(s.length&&(s+="&"),s+=encodeURIComponent(i)+"="+encodeURIComponent(n[i]));return s}function dS(n){let s={},i=n.split("&");for(let o=0,f=i.length;o{this.readyState="paused",s()};if(this._polling||!this.writable){let o=0;this._polling&&(o++,this.once("pollComplete",function(){--o||i()})),this.writable||(o++,this.once("drain",function(){--o||i()}))}else i()}_poll(){this._polling=!0,this.doPoll(),this.emitReserved("poll")}onData(s){const i=o=>{if(this.readyState==="opening"&&o.type==="open"&&this.onOpen(),o.type==="close")return this.onClose({description:"transport closed by the server"}),!1;this.onPacket(o)};tS(s,this.socket.binaryType).forEach(i),this.readyState!=="closed"&&(this._polling=!1,this.emitReserved("pollComplete"),this.readyState==="open"&&this._poll())}doClose(){const s=()=>{this.write([{type:"close"}])};this.readyState==="open"?s():this.once("open",s)}write(s){this.writable=!1,eS(s,i=>{this.doWrite(i,()=>{this.writable=!0,this.emitReserved("drain")})})}uri(){const s=this.opts.secure?"https":"http",i=this.query||{};return this.opts.timestampRequests!==!1&&(i[this.opts.timestampParam]=eg()),!this.supportsBinary&&!i.sid&&(i.b64=1),this.createUri(s,i)}}let tg=!1;try{tg=typeof XMLHttpRequest<"u"&&"withCredentials"in new XMLHttpRequest}catch{}const pS=tg;function xS(){}class gS extends hS{constructor(s){if(super(s),typeof location<"u"){const i=location.protocol==="https:";let o=location.port;o||(o=i?"443":"80"),this.xd=typeof location<"u"&&s.hostname!==location.hostname||o!==s.port}}doWrite(s,i){const o=this.request({method:"POST",data:s});o.on("success",i),o.on("error",(f,d)=>{this.onError("xhr post error",f,d)})}doPoll(){const s=this.request();s.on("data",this.onData.bind(this)),s.on("error",(i,o)=>{this.onError("xhr poll error",i,o)}),this.pollXhr=s}}class Tn extends At{constructor(s,i,o){super(),this.createRequest=s,Eo(this,o),this._opts=o,this._method=o.method||"GET",this._uri=i,this._data=o.data!==void 0?o.data:null,this._create()}_create(){var s;const i=Wx(this._opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");i.xdomain=!!this._opts.xd;const o=this._xhr=this.createRequest(i);try{o.open(this._method,this._uri,!0);try{if(this._opts.extraHeaders){o.setDisableHeaderCheck&&o.setDisableHeaderCheck(!0);for(let f in this._opts.extraHeaders)this._opts.extraHeaders.hasOwnProperty(f)&&o.setRequestHeader(f,this._opts.extraHeaders[f])}}catch{}if(this._method==="POST")try{o.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch{}try{o.setRequestHeader("Accept","*/*")}catch{}(s=this._opts.cookieJar)===null||s===void 0||s.addCookies(o),"withCredentials"in o&&(o.withCredentials=this._opts.withCredentials),this._opts.requestTimeout&&(o.timeout=this._opts.requestTimeout),o.onreadystatechange=()=>{var f;o.readyState===3&&((f=this._opts.cookieJar)===null||f===void 0||f.parseCookies(o.getResponseHeader("set-cookie"))),o.readyState===4&&(o.status===200||o.status===1223?this._onLoad():this.setTimeoutFn(()=>{this._onError(typeof o.status=="number"?o.status:0)},0))},o.send(this._data)}catch(f){this.setTimeoutFn(()=>{this._onError(f)},0);return}typeof document<"u"&&(this._index=Tn.requestsCount++,Tn.requests[this._index]=this)}_onError(s){this.emitReserved("error",s,this._xhr),this._cleanup(!0)}_cleanup(s){if(!(typeof this._xhr>"u"||this._xhr===null)){if(this._xhr.onreadystatechange=xS,s)try{this._xhr.abort()}catch{}typeof document<"u"&&delete Tn.requests[this._index],this._xhr=null}}_onLoad(){const s=this._xhr.responseText;s!==null&&(this.emitReserved("data",s),this.emitReserved("success"),this._cleanup())}abort(){this._cleanup()}}Tn.requestsCount=0;Tn.requests={};if(typeof document<"u"){if(typeof attachEvent=="function")attachEvent("onunload",B0);else if(typeof addEventListener=="function"){const n="onpagehide"in gn?"pagehide":"unload";addEventListener(n,B0,!1)}}function B0(){for(let n in Tn.requests)Tn.requests.hasOwnProperty(n)&&Tn.requests[n].abort()}const vS=(function(){const n=ng({xdomain:!1});return n&&n.responseType!==null})();class bS extends gS{constructor(s){super(s);const i=s&&s.forceBase64;this.supportsBinary=vS&&!i}request(s={}){return Object.assign(s,{xd:this.xd},this.opts),new Tn(ng,this.uri(),s)}}function ng(n){const s=n.xdomain;try{if(typeof XMLHttpRequest<"u"&&(!s||pS))return new XMLHttpRequest}catch{}if(!s)try{return new gn[["Active"].concat("Object").join("X")]("Microsoft.XMLHTTP")}catch{}}const ag=typeof navigator<"u"&&typeof navigator.product=="string"&&navigator.product.toLowerCase()==="reactnative";class yS extends Jf{get name(){return"websocket"}doOpen(){const s=this.uri(),i=this.opts.protocols,o=ag?{}:Wx(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(o.headers=this.opts.extraHeaders);try{this.ws=this.createSocket(s,i,o)}catch(f){return this.emitReserved("error",f)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=s=>this.onClose({description:"websocket connection closed",context:s}),this.ws.onmessage=s=>this.onData(s.data),this.ws.onerror=s=>this.onError("websocket error",s)}write(s){this.writable=!1;for(let i=0;i{try{this.doWrite(o,d)}catch{}f&&Co(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){typeof this.ws<"u"&&(this.ws.onerror=()=>{},this.ws.close(),this.ws=null)}uri(){const s=this.opts.secure?"wss":"ws",i=this.query||{};return this.opts.timestampRequests&&(i[this.opts.timestampParam]=eg()),this.supportsBinary||(i.b64=1),this.createUri(s,i)}}const nf=gn.WebSocket||gn.MozWebSocket;class SS extends yS{createSocket(s,i,o){return ag?new nf(s,i,o):i?new nf(s,i):new nf(s)}doWrite(s,i){this.ws.send(i)}}class jS extends Jf{get name(){return"webtransport"}doOpen(){try{this._transport=new WebTransport(this.createUri("https"),this.opts.transportOptions[this.name])}catch(s){return this.emitReserved("error",s)}this._transport.closed.then(()=>{this.onClose()}).catch(s=>{this.onError("webtransport error",s)}),this._transport.ready.then(()=>{this._transport.createBidirectionalStream().then(s=>{const i=aS(Number.MAX_SAFE_INTEGER,this.socket.binaryType),o=s.readable.pipeThrough(i).getReader(),f=nS();f.readable.pipeTo(s.writable),this._writer=f.writable.getWriter();const d=()=>{o.read().then(({done:p,value:x})=>{p||(this.onPacket(x),d())}).catch(p=>{})};d();const h={type:"open"};this.query.sid&&(h.data=`{"sid":"${this.query.sid}"}`),this._writer.write(h).then(()=>this.onOpen())})})}write(s){this.writable=!1;for(let i=0;i{f&&Co(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){var s;(s=this._transport)===null||s===void 0||s.close()}}const AS={websocket:SS,webtransport:jS,polling:bS},NS=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,wS=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];function Ef(n){if(n.length>8e3)throw"URI too long";const s=n,i=n.indexOf("["),o=n.indexOf("]");i!=-1&&o!=-1&&(n=n.substring(0,i)+n.substring(i,o).replace(/:/g,";")+n.substring(o,n.length));let f=NS.exec(n||""),d={},h=14;for(;h--;)d[wS[h]]=f[h]||"";return i!=-1&&o!=-1&&(d.source=s,d.host=d.host.substring(1,d.host.length-1).replace(/;/g,":"),d.authority=d.authority.replace("[","").replace("]","").replace(/;/g,":"),d.ipv6uri=!0),d.pathNames=CS(d,d.path),d.queryKey=ES(d,d.query),d}function CS(n,s){const i=/\/{2,9}/g,o=s.replace(i,"/").split("/");return(s.slice(0,1)=="/"||s.length===0)&&o.splice(0,1),s.slice(-1)=="/"&&o.splice(o.length-1,1),o}function ES(n,s){const i={};return s.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,function(o,f,d){f&&(i[f]=d)}),i}const kf=typeof addEventListener=="function"&&typeof removeEventListener=="function",io=[];kf&&addEventListener("offline",()=>{io.forEach(n=>n())},!1);class Oa extends At{constructor(s,i){if(super(),this.binaryType=lS,this.writeBuffer=[],this._prevBufferLen=0,this._pingInterval=-1,this._pingTimeout=-1,this._maxPayload=-1,this._pingTimeoutTime=1/0,s&&typeof s=="object"&&(i=s,s=null),s){const o=Ef(s);i.hostname=o.host,i.secure=o.protocol==="https"||o.protocol==="wss",i.port=o.port,o.query&&(i.query=o.query)}else i.host&&(i.hostname=Ef(i.host).host);Eo(this,i),this.secure=i.secure!=null?i.secure:typeof location<"u"&&location.protocol==="https:",i.hostname&&!i.port&&(i.port=this.secure?"443":"80"),this.hostname=i.hostname||(typeof location<"u"?location.hostname:"localhost"),this.port=i.port||(typeof location<"u"&&location.port?location.port:this.secure?"443":"80"),this.transports=[],this._transportsByName={},i.transports.forEach(o=>{const f=o.prototype.name;this.transports.push(f),this._transportsByName[f]=o}),this.opts=Object.assign({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},i),this.opts.path=this.opts.path.replace(/\/$/,"")+(this.opts.addTrailingSlash?"/":""),typeof this.opts.query=="string"&&(this.opts.query=dS(this.opts.query)),kf&&(this.opts.closeOnBeforeunload&&(this._beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener("beforeunload",this._beforeunloadEventListener,!1)),this.hostname!=="localhost"&&(this._offlineEventListener=()=>{this._onClose("transport close",{description:"network connection lost"})},io.push(this._offlineEventListener))),this.opts.withCredentials&&(this._cookieJar=void 0),this._open()}createTransport(s){const i=Object.assign({},this.opts.query);i.EIO=Px,i.transport=s,this.id&&(i.sid=this.id);const o=Object.assign({},this.opts,{query:i,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[s]);return new this._transportsByName[s](o)}_open(){if(this.transports.length===0){this.setTimeoutFn(()=>{this.emitReserved("error","No transports available")},0);return}const s=this.opts.rememberUpgrade&&Oa.priorWebsocketSuccess&&this.transports.indexOf("websocket")!==-1?"websocket":this.transports[0];this.readyState="opening";const i=this.createTransport(s);i.open(),this.setTransport(i)}setTransport(s){this.transport&&this.transport.removeAllListeners(),this.transport=s,s.on("drain",this._onDrain.bind(this)).on("packet",this._onPacket.bind(this)).on("error",this._onError.bind(this)).on("close",i=>this._onClose("transport close",i))}onOpen(){this.readyState="open",Oa.priorWebsocketSuccess=this.transport.name==="websocket",this.emitReserved("open"),this.flush()}_onPacket(s){if(this.readyState==="opening"||this.readyState==="open"||this.readyState==="closing")switch(this.emitReserved("packet",s),this.emitReserved("heartbeat"),s.type){case"open":this.onHandshake(JSON.parse(s.data));break;case"ping":this._sendPacket("pong"),this.emitReserved("ping"),this.emitReserved("pong"),this._resetPingTimeout();break;case"error":const i=new Error("server error");i.code=s.data,this._onError(i);break;case"message":this.emitReserved("data",s.data),this.emitReserved("message",s.data);break}}onHandshake(s){this.emitReserved("handshake",s),this.id=s.sid,this.transport.query.sid=s.sid,this._pingInterval=s.pingInterval,this._pingTimeout=s.pingTimeout,this._maxPayload=s.maxPayload,this.onOpen(),this.readyState!=="closed"&&this._resetPingTimeout()}_resetPingTimeout(){this.clearTimeoutFn(this._pingTimeoutTimer);const s=this._pingInterval+this._pingTimeout;this._pingTimeoutTime=Date.now()+s,this._pingTimeoutTimer=this.setTimeoutFn(()=>{this._onClose("ping timeout")},s),this.opts.autoUnref&&this._pingTimeoutTimer.unref()}_onDrain(){this.writeBuffer.splice(0,this._prevBufferLen),this._prevBufferLen=0,this.writeBuffer.length===0?this.emitReserved("drain"):this.flush()}flush(){if(this.readyState!=="closed"&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){const s=this._getWritablePackets();this.transport.send(s),this._prevBufferLen=s.length,this.emitReserved("flush")}}_getWritablePackets(){if(!(this._maxPayload&&this.transport.name==="polling"&&this.writeBuffer.length>1))return this.writeBuffer;let i=1;for(let o=0;o0&&i>this._maxPayload)return this.writeBuffer.slice(0,o);i+=2}return this.writeBuffer}_hasPingExpired(){if(!this._pingTimeoutTime)return!0;const s=Date.now()>this._pingTimeoutTime;return s&&(this._pingTimeoutTime=0,Co(()=>{this._onClose("ping timeout")},this.setTimeoutFn)),s}write(s,i,o){return this._sendPacket("message",s,i,o),this}send(s,i,o){return this._sendPacket("message",s,i,o),this}_sendPacket(s,i,o,f){if(typeof i=="function"&&(f=i,i=void 0),typeof o=="function"&&(f=o,o=null),this.readyState==="closing"||this.readyState==="closed")return;o=o||{},o.compress=o.compress!==!1;const d={type:s,data:i,options:o};this.emitReserved("packetCreate",d),this.writeBuffer.push(d),f&&this.once("flush",f),this.flush()}close(){const s=()=>{this._onClose("forced close"),this.transport.close()},i=()=>{this.off("upgrade",i),this.off("upgradeError",i),s()},o=()=>{this.once("upgrade",i),this.once("upgradeError",i)};return(this.readyState==="opening"||this.readyState==="open")&&(this.readyState="closing",this.writeBuffer.length?this.once("drain",()=>{this.upgrading?o():s()}):this.upgrading?o():s()),this}_onError(s){if(Oa.priorWebsocketSuccess=!1,this.opts.tryAllTransports&&this.transports.length>1&&this.readyState==="opening")return this.transports.shift(),this._open();this.emitReserved("error",s),this._onClose("transport error",s)}_onClose(s,i){if(this.readyState==="opening"||this.readyState==="open"||this.readyState==="closing"){if(this.clearTimeoutFn(this._pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),kf&&(this._beforeunloadEventListener&&removeEventListener("beforeunload",this._beforeunloadEventListener,!1),this._offlineEventListener)){const o=io.indexOf(this._offlineEventListener);o!==-1&&io.splice(o,1)}this.readyState="closed",this.id=null,this.emitReserved("close",s,i),this.writeBuffer=[],this._prevBufferLen=0}}}Oa.protocol=Px;class kS extends Oa{constructor(){super(...arguments),this._upgrades=[]}onOpen(){if(super.onOpen(),this.readyState==="open"&&this.opts.upgrade)for(let s=0;s{o||(i.send([{type:"ping",data:"probe"}]),i.once("packet",y=>{if(!o)if(y.type==="pong"&&y.data==="probe"){if(this.upgrading=!0,this.emitReserved("upgrading",i),!i)return;Oa.priorWebsocketSuccess=i.name==="websocket",this.transport.pause(()=>{o||this.readyState!=="closed"&&(v(),this.setTransport(i),i.send([{type:"upgrade"}]),this.emitReserved("upgrade",i),i=null,this.upgrading=!1,this.flush())})}else{const S=new Error("probe error");S.transport=i.name,this.emitReserved("upgradeError",S)}}))};function d(){o||(o=!0,v(),i.close(),i=null)}const h=y=>{const S=new Error("probe error: "+y);S.transport=i.name,d(),this.emitReserved("upgradeError",S)};function p(){h("transport closed")}function x(){h("socket closed")}function g(y){i&&y.name!==i.name&&d()}const v=()=>{i.removeListener("open",f),i.removeListener("error",h),i.removeListener("close",p),this.off("close",x),this.off("upgrading",g)};i.once("open",f),i.once("error",h),i.once("close",p),this.once("close",x),this.once("upgrading",g),this._upgrades.indexOf("webtransport")!==-1&&s!=="webtransport"?this.setTimeoutFn(()=>{o||i.open()},200):i.open()}onHandshake(s){this._upgrades=this._filterUpgrades(s.upgrades),super.onHandshake(s)}_filterUpgrades(s){const i=[];for(let o=0;oAS[f]).filter(f=>!!f)),super(s,o)}};function RS(n,s="",i){let o=n;i=i||typeof location<"u"&&location,n==null&&(n=i.protocol+"//"+i.host),typeof n=="string"&&(n.charAt(0)==="/"&&(n.charAt(1)==="/"?n=i.protocol+n:n=i.host+n),/^(https?|wss?):\/\//.test(n)||(typeof i<"u"?n=i.protocol+"//"+n:n="https://"+n),o=Ef(n)),o.port||(/^(http|ws)$/.test(o.protocol)?o.port="80":/^(http|ws)s$/.test(o.protocol)&&(o.port="443")),o.path=o.path||"/";const d=o.host.indexOf(":")!==-1?"["+o.host+"]":o.host;return o.id=o.protocol+"://"+d+":"+o.port+s,o.href=o.protocol+"://"+d+(i&&i.port===o.port?"":":"+o.port),o}const qS=typeof ArrayBuffer=="function",TS=n=>typeof ArrayBuffer.isView=="function"?ArrayBuffer.isView(n):n.buffer instanceof ArrayBuffer,sg=Object.prototype.toString,DS=typeof Blob=="function"||typeof Blob<"u"&&sg.call(Blob)==="[object BlobConstructor]",_S=typeof File=="function"||typeof File<"u"&&sg.call(File)==="[object FileConstructor]";function Pf(n){return qS&&(n instanceof ArrayBuffer||TS(n))||DS&&n instanceof Blob||_S&&n instanceof File}function ro(n,s){if(!n||typeof n!="object")return!1;if(Array.isArray(n)){for(let i=0,o=n.length;i=0&&n.num{delete this.acks[s];for(let p=0;p{this.io.clearTimeoutFn(d),i.apply(this,p)};h.withError=!0,this.acks[s]=h}emitWithAck(s,...i){return new Promise((o,f)=>{const d=(h,p)=>h?f(h):o(p);d.withError=!0,i.push(d),this.emit(s,...i)})}_addToQueue(s){let i;typeof s[s.length-1]=="function"&&(i=s.pop());const o={id:this._queueSeq++,tryCount:0,pending:!1,args:s,flags:Object.assign({fromQueue:!0},this.flags)};s.push((f,...d)=>o!==this._queue[0]?void 0:(f!==null?o.tryCount>this._opts.retries&&(this._queue.shift(),i&&i(f)):(this._queue.shift(),i&&i(null,...d)),o.pending=!1,this._drainQueue())),this._queue.push(o),this._drainQueue()}_drainQueue(s=!1){if(!this.connected||this._queue.length===0)return;const i=this._queue[0];i.pending&&!s||(i.pending=!0,i.tryCount++,this.flags=i.flags,this.emit.apply(this,i.args))}packet(s){s.nsp=this.nsp,this.io._packet(s)}onopen(){typeof this.auth=="function"?this.auth(s=>{this._sendConnectPacket(s)}):this._sendConnectPacket(this.auth)}_sendConnectPacket(s){this.packet({type:_e.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},s):s})}onerror(s){this.connected||this.emitReserved("connect_error",s)}onclose(s,i){this.connected=!1,delete this.id,this.emitReserved("disconnect",s,i),this._clearAcks()}_clearAcks(){Object.keys(this.acks).forEach(s=>{if(!this.sendBuffer.some(o=>String(o.id)===s)){const o=this.acks[s];delete this.acks[s],o.withError&&o.call(this,new Error("socket has been disconnected"))}})}onpacket(s){if(s.nsp===this.nsp)switch(s.type){case _e.CONNECT:s.data&&s.data.sid?this.onconnect(s.data.sid,s.data.pid):this.emitReserved("connect_error",new Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));break;case _e.EVENT:case _e.BINARY_EVENT:this.onevent(s);break;case _e.ACK:case _e.BINARY_ACK:this.onack(s);break;case _e.DISCONNECT:this.ondisconnect();break;case _e.CONNECT_ERROR:this.destroy();const o=new Error(s.data.message);o.data=s.data.data,this.emitReserved("connect_error",o);break}}onevent(s){const i=s.data||[];s.id!=null&&i.push(this.ack(s.id)),this.connected?this.emitEvent(i):this.receiveBuffer.push(Object.freeze(i))}emitEvent(s){if(this._anyListeners&&this._anyListeners.length){const i=this._anyListeners.slice();for(const o of i)o.apply(this,s)}super.emit.apply(this,s),this._pid&&s.length&&typeof s[s.length-1]=="string"&&(this._lastOffset=s[s.length-1])}ack(s){const i=this;let o=!1;return function(...f){o||(o=!0,i.packet({type:_e.ACK,id:s,data:f}))}}onack(s){const i=this.acks[s.id];typeof i=="function"&&(delete this.acks[s.id],i.withError&&s.data.unshift(null),i.apply(this,s.data))}onconnect(s,i){this.id=s,this.recovered=i&&this._pid===i,this._pid=i,this.connected=!0,this.emitBuffered(),this.emitReserved("connect"),this._drainQueue(!0)}emitBuffered(){this.receiveBuffer.forEach(s=>this.emitEvent(s)),this.receiveBuffer=[],this.sendBuffer.forEach(s=>{this.notifyOutgoingListeners(s),this.packet(s)}),this.sendBuffer=[]}ondisconnect(){this.destroy(),this.onclose("io server disconnect")}destroy(){this.subs&&(this.subs.forEach(s=>s()),this.subs=void 0),this.io._destroy(this)}disconnect(){return this.connected&&this.packet({type:_e.DISCONNECT}),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}close(){return this.disconnect()}compress(s){return this.flags.compress=s,this}get volatile(){return this.flags.volatile=!0,this}timeout(s){return this.flags.timeout=s,this}onAny(s){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(s),this}prependAny(s){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(s),this}offAny(s){if(!this._anyListeners)return this;if(s){const i=this._anyListeners;for(let o=0;o0&&n.jitter<=1?n.jitter:0,this.attempts=0}fl.prototype.duration=function(){var n=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var s=Math.random(),i=Math.floor(s*this.jitter*n);n=(Math.floor(s*10)&1)==0?n-i:n+i}return Math.min(n,this.max)|0};fl.prototype.reset=function(){this.attempts=0};fl.prototype.setMin=function(n){this.ms=n};fl.prototype.setMax=function(n){this.max=n};fl.prototype.setJitter=function(n){this.jitter=n};class qf extends At{constructor(s,i){var o;super(),this.nsps={},this.subs=[],s&&typeof s=="object"&&(i=s,s=void 0),i=i||{},i.path=i.path||"/socket.io",this.opts=i,Eo(this,i),this.reconnection(i.reconnection!==!1),this.reconnectionAttempts(i.reconnectionAttempts||1/0),this.reconnectionDelay(i.reconnectionDelay||1e3),this.reconnectionDelayMax(i.reconnectionDelayMax||5e3),this.randomizationFactor((o=i.randomizationFactor)!==null&&o!==void 0?o:.5),this.backoff=new fl({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(i.timeout==null?2e4:i.timeout),this._readyState="closed",this.uri=s;const f=i.parser||VS;this.encoder=new f.Encoder,this.decoder=new f.Decoder,this._autoConnect=i.autoConnect!==!1,this._autoConnect&&this.open()}reconnection(s){return arguments.length?(this._reconnection=!!s,s||(this.skipReconnect=!0),this):this._reconnection}reconnectionAttempts(s){return s===void 0?this._reconnectionAttempts:(this._reconnectionAttempts=s,this)}reconnectionDelay(s){var i;return s===void 0?this._reconnectionDelay:(this._reconnectionDelay=s,(i=this.backoff)===null||i===void 0||i.setMin(s),this)}randomizationFactor(s){var i;return s===void 0?this._randomizationFactor:(this._randomizationFactor=s,(i=this.backoff)===null||i===void 0||i.setJitter(s),this)}reconnectionDelayMax(s){var i;return s===void 0?this._reconnectionDelayMax:(this._reconnectionDelayMax=s,(i=this.backoff)===null||i===void 0||i.setMax(s),this)}timeout(s){return arguments.length?(this._timeout=s,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&this.backoff.attempts===0&&this.reconnect()}open(s){if(~this._readyState.indexOf("open"))return this;this.engine=new MS(this.uri,this.opts);const i=this.engine,o=this;this._readyState="opening",this.skipReconnect=!1;const f=jn(i,"open",function(){o.onopen(),s&&s()}),d=p=>{this.cleanup(),this._readyState="closed",this.emitReserved("error",p),s?s(p):this.maybeReconnectOnOpen()},h=jn(i,"error",d);if(this._timeout!==!1){const p=this._timeout,x=this.setTimeoutFn(()=>{f(),d(new Error("timeout")),i.close()},p);this.opts.autoUnref&&x.unref(),this.subs.push(()=>{this.clearTimeoutFn(x)})}return this.subs.push(f),this.subs.push(h),this}connect(s){return this.open(s)}onopen(){this.cleanup(),this._readyState="open",this.emitReserved("open");const s=this.engine;this.subs.push(jn(s,"ping",this.onping.bind(this)),jn(s,"data",this.ondata.bind(this)),jn(s,"error",this.onerror.bind(this)),jn(s,"close",this.onclose.bind(this)),jn(this.decoder,"decoded",this.ondecoded.bind(this)))}onping(){this.emitReserved("ping")}ondata(s){try{this.decoder.add(s)}catch(i){this.onclose("parse error",i)}}ondecoded(s){Co(()=>{this.emitReserved("packet",s)},this.setTimeoutFn)}onerror(s){this.emitReserved("error",s)}socket(s,i){let o=this.nsps[s];return o?this._autoConnect&&!o.active&&o.connect():(o=new lg(this,s,i),this.nsps[s]=o),o}_destroy(s){const i=Object.keys(this.nsps);for(const o of i)if(this.nsps[o].active)return;this._close()}_packet(s){const i=this.encoder.encode(s);for(let o=0;os()),this.subs.length=0,this.decoder.destroy()}_close(){this.skipReconnect=!0,this._reconnecting=!1,this.onclose("forced close")}disconnect(){return this._close()}onclose(s,i){var o;this.cleanup(),(o=this.engine)===null||o===void 0||o.close(),this.backoff.reset(),this._readyState="closed",this.emitReserved("close",s,i),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;const s=this;if(this.backoff.attempts>=this._reconnectionAttempts)this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{const i=this.backoff.duration();this._reconnecting=!0;const o=this.setTimeoutFn(()=>{s.skipReconnect||(this.emitReserved("reconnect_attempt",s.backoff.attempts),!s.skipReconnect&&s.open(f=>{f?(s._reconnecting=!1,s.reconnect(),this.emitReserved("reconnect_error",f)):s.onreconnect()}))},i);this.opts.autoUnref&&o.unref(),this.subs.push(()=>{this.clearTimeoutFn(o)})}}onreconnect(){const s=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",s)}}const oi={};function oo(n,s){typeof n=="object"&&(s=n,n=void 0),s=s||{};const i=RS(n,s.path||"/socket.io"),o=i.source,f=i.id,d=i.path,h=oi[f]&&d in oi[f].nsps,p=s.forceNew||s["force new connection"]||s.multiplex===!1||h;let x;return p?x=new qf(o,s):(oi[f]||(oi[f]=new qf(o,s)),x=oi[f]),i.query&&!s.query&&(s.query=i.queryKey),x.socket(i.path,s)}Object.assign(oo,{Manager:qf,Socket:lg,io:oo,connect:oo});const ig="roverSettings",GS=3600*24*365;function YS(n){try{const s=decodeURIComponent(n??"");return JSON.parse(s)}catch(s){return console.warn("Failed to parse settings cookie",s),null}}function Tf(){if(typeof document>"u")return{};const n=`${ig}=`,s=document.cookie.split(";").map(o=>o.trim()).find(o=>o.startsWith(n));if(!s)return{};const i=s.substring(n.length);return YS(i)??{}}function L0(n){if(typeof document>"u")return!1;try{const s=encodeURIComponent(JSON.stringify(n??{})),i=`${ig}=${s}; path=/; max-age=${GS}; samesite=strict`;return document.cookie=i,!0}catch(s){return console.warn("Failed to write settings cookie",s),!1}}const rg=window.location.origin;console.info("[socket] connecting to",rg);const FS=Tf(),XS=FS?.page?.connectionTransport||"websocket",QS=XS==="polling"?["polling"]:["websocket","polling"],ed=oo(rg,{transports:QS,timeout:15e3});ed.on("connect_error",n=>console.error("connect_error",n.code,n.message,n.data));const og=m.createContext(ed),KS=({children:n})=>r.jsx(og.Provider,{value:ed,children:n}),tn=()=>m.useContext(og),ZS={connected:!1,session:null,logs:[],adminLogs:[],llmCommentaryState:null,llmCommentaryStatus:null,alerts:[]},td=m.createContext(null);function IS(n){return m.useCallback((s,i={})=>new Promise((o,f)=>{n.emit(s,i,(d={})=>{d.error?f(new Error(d.error)):o(d)})}),[n])}function JS(n){return typeof n=="function"?n:s=>s}function PS({children:n}){const s=tn(),i=IS(s),o=m.useRef({...ZS,connected:s.connected}),f=m.useRef(new Set),d=m.useCallback(()=>o.current,[]),h=m.useCallback(v=>{const y=o.current,S=typeof v=="function"?v(y):{...y,...v||{}};S!==y&&(o.current=S,f.current.forEach(E=>{const C=E.selector(S);E.equalityFn(E.current,C)||(E.current=C,E.listener(C))}))},[]),p=m.useCallback((v,y,S=Object.is)=>{const E=JS(v),C={selector:E,equalityFn:S,listener:y,current:E(o.current)};return f.current.add(C),()=>{f.current.delete(C)}},[]);m.useEffect(()=>{const v=()=>{h(S=>S.connected?S:{...S,connected:!0})},y=()=>{h(S=>S.connected?{...S,connected:!1}:S)};return s.on("connect",v),s.on("disconnect",y),()=>{s.off("connect",v),s.off("disconnect",y)}},[h,s]),m.useEffect(()=>{function v(j){h(N=>({...N,session:j}))}function y(j=[]){h(N=>({...N,logs:j}))}function S(j){h(N=>({...N,logs:[...N.logs.slice(-199),j]}))}function E(j=[]){h(N=>({...N,adminLogs:j}))}function C(j){h(N=>({...N,adminLogs:[...N.adminLogs.slice(-199),j]}))}function k(j=null){const N=j&&typeof j=="object"?j:null,q=N?.debug?.status&&typeof N.debug.status=="object"?N.debug.status:null;h(M=>({...M,llmCommentaryState:N,llmCommentaryStatus:q}))}function w(j={}){h(N=>({...N,alerts:[...N.alerts.slice(-49),{...j,receivedAt:Date.now()}]}))}return s.on("session:sync",v),s.on("log:init",y),s.on("log:entry",S),s.on("adminlog:init",E),s.on("adminlog:entry",C),s.on("llm:state",k),s.on("alert:new",w),()=>{s.off("session:sync",v),s.off("log:init",y),s.off("log:entry",S),s.off("adminlog:init",E),s.off("adminlog:entry",C),s.off("llm:state",k),s.off("alert:new",w)}},[h,s]);const x=m.useMemo(()=>({login:(v,y)=>i("auth:login",{username:v,password:y}),identifySession:({cookieUserId:v,nickname:y}={})=>i("session:identify",{cookieUserId:v,nickname:y}),setRole:v=>i("session:setRole",{role:v}),requestControl:(v,y={})=>i("session:requestControl",{roverId:v,...y}),releaseControl:v=>i("session:releaseControl",{roverId:v}),subscribeAll:()=>i("session:subscribeAll"),lockRover:(v,y)=>i("session:lockRover",{roverId:v,locked:y}),setMode:v=>i("setMode",{mode:v}),homeAssistantToggle:v=>i("homeAssistant:toggle",{entityId:v}),homeAssistantSetState:(v,y)=>i("homeAssistant:setState",{entityId:v,state:y}),homeAssistantSetLightColor:(v,y)=>i("homeAssistant:lightColor",{entityId:v,rgbColor:y}),homeAssistantSetLightWhite:v=>i("homeAssistant:lightWhite",{entityId:v}),neatoStart:()=>i("neato:start"),neatoSendHome:()=>i("neato:sendHome"),neatoLocate:()=>i("neato:locate"),neatoClearErrors:()=>i("neato:clearErrors"),setNickname:v=>i("nickname:set",{nickname:v}),requestVerification:()=>i("verification:request"),requestPrivateRoverAccess:v=>i("session:privateRover:requestAccess",{roverId:v}),triggerReplay:(v=[])=>i("replay:trigger",{sources:v}),setCommunityGoal:v=>i("communityGoal:set",{text:v}),setAdminReason:v=>i("adminReason:set",{text:v}),rebootRover:v=>i("command",{roverId:v,type:"reboot",data:{reboot:{}}}),rebootServer:()=>i("server:reboot"),playUploadedAudio:({roverId:v,name:y,mime:S,dataBase64:E})=>i("audio:uploadPlay",{roverId:v,name:y,mime:S,dataBase64:E}),stopUploadedAudio:v=>i("audio:uploadStop",{roverId:v}),startMicWhip:v=>i("audio:micWhipStart",{roverId:v}),readyMicWhip:v=>i("audio:micWhipReady",{roverId:v}),stopMicWhip:v=>i("audio:micWhipStop",{roverId:v}),setAudioLevels:(v={})=>i("audioLevels:set",v),setPrivateSafety:(v,y={})=>i("session:privateSafety:set",{roverId:v,safety:y}),llmControl:(v,y={})=>i("llm:control",{controls:{action:v,...y}}),pushAlert:v=>h(y=>({...y,alerts:[...y.alerts.slice(-49),{...v,receivedAt:Date.now(),id:v.id||Math.random().toString(36).slice(2)}]}))}),[i,h]),g=m.useMemo(()=>({getState:d,subscribe:p,actions:x}),[x,d,p]);return r.jsx(td.Provider,{value:g,children:n})}function ft(n,s=Object.is){const i=m.useContext(td);if(!i)throw new Error("useSessionSelector must be used within SessionProvider");const o=m.useRef(n);o.current=n;const f=m.useRef(s);f.current=s;const[d,h]=m.useState(()=>n(i.getState()));return m.useEffect(()=>(h(p=>{const x=o.current(i.getState());return f.current(p,x)?p:x}),i.subscribe(p=>o.current(p),p=>{h(x=>f.current(x,p)?x:p)},(p,x)=>f.current(p,x))),[i]),d}function wn(){const n=m.useContext(td);if(!n)throw new Error("useSessionActions must be used within SessionProvider");return n.actions}function nn(){const n=ft(i=>i),s=wn();return m.useMemo(()=>({...n,...s}),[s,n])}const cg=m.createContext({frames:{}});function WS({children:n}){const s=tn(),[i,o]=m.useState({});m.useEffect(()=>{function d({roverId:h,sensors:p={},frame:x={}}){h&&o(g=>({...g,[h]:{roverId:h,sensors:p,raw:x?.data||null,receivedAt:Date.now()}}))}return s.on("sensorFrame",d),()=>{s.off("sensorFrame",d)}},[s]);const f=m.useMemo(()=>({frames:i}),[i]);return r.jsx(cg.Provider,{value:f,children:n})}function nd(){return m.useContext(cg).frames}function dl(n){const s=nd();return n?s[n]??null:null}const ej=650,tj={161:{red:!0},164:{green:!0},165:{force:!0},168:{red:!0,green:!0},169:{red:!0,force:!0},172:{green:!0,force:!0},173:{red:!0,green:!0,force:!0}};function af(n){if(typeof n!="number"||n<=0)return null;const s=tj[n];return s?{code:n,...s}:null}function nj(n,s={}){const i=s.holdMs||ej,[o,f]=m.useState({left:null,right:null,omni:null}),[d,h]=m.useState(0);return m.useEffect(()=>{const p=setInterval(()=>h(Date.now()),Math.max(i/2,100));return()=>clearInterval(p)},[i]),m.useEffect(()=>{const p=Date.now(),x=af(n?.infraredCharacterLeft),g=af(n?.infraredCharacterRight),v=af(n?.infraredCharacterOmni);!x&&!g&&!v||f(y=>({left:x?{...x,ts:p}:y.left,right:g?{...g,ts:p}:y.right,omni:v?{...v,ts:p}:y.omni}))},[n?.infraredCharacterLeft,n?.infraredCharacterRight,n?.infraredCharacterOmni]),m.useEffect(()=>{const{left:p,right:x,omni:g}=o;if(!(p?.ts||x?.ts||g?.ts))return;const y=new Date().toISOString();console.debug("[DockIR]",y,{left:p?.code??0,omni:g?.code??0,right:x?.code??0})},[o.left?.code,o.right?.code,o.omni?.code]),m.useMemo(()=>{const p=Date.now(),x=w=>{if(!w)return{active:!1,red:!1,green:!1,force:!1,age:null,code:null};const j=p-w.ts,N=j<=i;return{active:N,age:j,code:w.code,red:!!(w.red&&N),green:!!(w.green&&N),force:!!(w.force&&N)}},g=x(o.left),v=x(o.right),y=x(o.omni),S=g.force||v.force||y.force,E=g.active||v.active||y.active,C=g.active&&!v.active?"right":v.active&&!g.active?"left":"center",k=(v.active?1:0)-(g.active?1:0);return{visible:E,forceDetected:S,left:g,right:v,omni:y,bias:C,balance:Math.max(-1,Math.min(1,k))}},[o.left,o.right,o.omni,i,d])}function aj(){ft(S=>S.connected);const n=ft(S=>S.session),s=n?.assignment?.roverId,i=dl(s),o=i?.sensors||{},f=nj(o),d=o.voltageMv!=null?`${(o.voltageMv/1e3).toFixed(2)} V`:null,h=o.currentMa!=null?`${o.currentMa} mA`:null,p=o.batteryTemperatureC!=null?`${o.batteryTemperatureC} °C`:null,x=o.batteryChargeMah,g=o.batteryCapacityMah;i?.receivedAt&&new Date(i.receivedAt).toLocaleTimeString();const v=i?.raw?i.raw:null,y=s?n?.activeDrivers?.[s]:null;return m.useMemo(()=>s?y?y===n?.socketId?"You":(n?.users||[]).find(E=>E.socketId===y)?.nickname||y.slice(0,6):"Available":"n/a",[y,s,n?.socketId,n?.users]),r.jsxs("section",{className:"panel-section space-y-0.5 text-base text-slate-100",children:[s?i?r.jsxs(r.Fragment,{children:[r.jsx(sj,{sensors:o,voltage:d,current:h,batteryTemp:p,charge:x,capacity:g}),r.jsx(lj,{sensors:o,dockState:f})]}):r.jsx("p",{className:"text-sm text-slate-500",children:"Waiting for sensor frames…"}):r.jsx("p",{className:"text-sm text-slate-500",children:"Assign a rover to view sensors."}),v&&r.jsx("pre",{className:"surface whitespace-pre-wrap break-words text-xs text-lime-300",children:v})]})}function sj({sensors:n,voltage:s,current:i,batteryTemp:o,charge:f,capacity:d}){const h=f!=null&&d?`${Math.round(f/d*100)}`:"--",p=n?.oiMode?.label||"--",x=n?.chargingSources?.homeBase?"Yes":"No",g=n?.chargingState?.label||"--";return r.jsxs("div",{className:"grid grid-cols-2 gap-0.5 md:grid-cols-3",children:[r.jsx(aa,{label:"Voltage",value:s??"--"}),r.jsx(aa,{label:"Current",value:i??"--"}),r.jsx(aa,{label:"Battery temp",value:o??"--"}),r.jsx(aa,{label:"Charge",value:f!=null?`${f} mAh`:"--"}),r.jsx(aa,{label:"Capacity",value:d!=null?`${d} mAh`:"--"}),r.jsx(aa,{label:"Charge",value:h}),r.jsx(aa,{label:"OI mode",value:p}),r.jsx(aa,{label:"Docked",value:x}),r.jsx(aa,{label:"Charging state",value:g})]})}function aa({label:n,value:s}){return r.jsxs("div",{className:"surface flex items-center justify-between gap-0.5 px-1 py-0.5 text-sm",children:[r.jsx("span",{className:"text-slate-400",children:n}),r.jsx("span",{className:"text-slate-100",children:s})]})}function lj({sensors:n,dockState:s}){const i=n?.bumpsAndWheelDrops||{},o=n?.wheelOvercurrents||{},f=[{label:"Left",value:n?.lightBumpLeftSignal},{label:"Front Left",value:n?.lightBumpFrontLeftSignal},{label:"Center Left",value:n?.lightBumpCenterLeftSignal},{label:"Center Right",value:n?.lightBumpCenterRightSignal},{label:"Front Right",value:n?.lightBumpFrontRightSignal},{label:"Right",value:n?.lightBumpRightSignal}],d=[{label:"Left",value:n?.cliffLeftSignal,active:n?.cliffLeft},{label:"Front Left",value:n?.cliffFrontLeftSignal,active:n?.cliffFrontLeft},{label:"Front Right",value:n?.cliffFrontRightSignal,active:n?.cliffFrontRight},{label:"Right",value:n?.cliffRightSignal,active:n?.cliffRight}],h=[{label:"Wheel L",value:n?.wheelLeftCurrentMa,over:o.leftWheel},{label:"Wheel R",value:n?.wheelRightCurrentMa,over:o.rightWheel},{label:"Side brush",value:n?.sideBrushCurrentMa,over:o.sideBrush},{label:"Main brush",value:n?.mainBrushCurrentMa,over:o.mainBrush}];return r.jsxs("div",{className:"grid gap-0.5 md:grid-cols-2",children:[r.jsxs(Ws,{title:"Dock IR",children:[r.jsx(ij,{sensors:n}),r.jsx(rj,{state:s})]}),r.jsxs(Ws,{title:"Bumps & drops",children:[r.jsx(sa,{label:"Bump L",value:r.jsx(ci,{active:i.bumpLeft})}),r.jsx(sa,{label:"Bump R",value:r.jsx(ci,{active:i.bumpRight})}),r.jsx(sa,{label:"Wheel drop L",value:r.jsx(ci,{active:i.wheelDropLeft,tone:"amber"})}),r.jsx(sa,{label:"Wheel drop R",value:r.jsx(ci,{active:i.wheelDropRight,tone:"amber"})})]}),r.jsx(Ws,{title:"Light bumps (raw)",children:f.map(p=>r.jsx(sa,{label:p.label,value:ui(p.value)},p.label))}),r.jsx(Ws,{title:"Cliff sensors",children:d.map(p=>r.jsx(sa,{label:p.label,value:`${ui(p.value)} · ${p.active?"bool: true":"bool: false"}`},p.label))}),r.jsx(Ws,{title:"Currents",children:h.map(p=>r.jsx(sa,{label:p.label,value:r.jsxs("span",{className:"flex items-center gap-0.5",children:[r.jsx("span",{children:ui(p.value,"mA")}),p.over?r.jsx(ci,{active:!0,tone:"red",label:"over"}):null]})},p.label))}),r.jsxs(Ws,{title:"Dirt detect",children:[r.jsx(sa,{label:"Left",value:ui(n?.dirtDetectLeft)}),r.jsx(sa,{label:"Right",value:ui(n?.dirtDetect)})]})]})}function Ws({title:n,children:s}){return r.jsxs("div",{className:"surface space-y-0.5 p-1 text-sm",children:[r.jsx("div",{className:"text-[0.8rem] uppercase tracking-wide text-slate-400",children:n}),r.jsx("div",{className:"space-y-0.5",children:s})]})}function sa({label:n,value:s}){return r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{className:"text-slate-300",children:n}),r.jsx("span",{className:"text-slate-100",children:s})]})}function ci({active:n,tone:s="green",label:i}){const o="rounded px-1.5 py-0.5 text-[0.7rem] font-semibold",f=s==="red"?n?"bg-red-600 text-white":"bg-slate-700 text-slate-300":s==="amber"?n?"bg-amber-500 text-slate-900":"bg-slate-700 text-slate-300":n?"bg-emerald-600 text-white":"bg-slate-700 text-slate-300";return r.jsx("span",{className:`${o} ${f}`,children:i||(n?"true":"false")})}function ui(n,s){return n==null||Number.isNaN(n)?"--":s?`${n} ${s}`:n}function ij({sensors:n}){const s=n?.infraredCharacterLeft,i=n?.infraredCharacterRight,o=n?.infraredCharacterOmni,f=d=>r.jsx("span",{className:`rounded px-1 py-0.25 text-[0.7rem] font-semibold ${d?"bg-emerald-600 text-white":"bg-slate-700 text-slate-300"}`,children:d||"--"});return r.jsxs("div",{className:"flex items-center justify-between gap-0.5 text-xs text-slate-200",children:[r.jsxs("div",{className:"flex items-center gap-0.5",children:[r.jsx("span",{className:"text-slate-400",children:"L"}),f(s)]}),r.jsxs("div",{className:"flex items-center gap-0.5",children:[r.jsx("span",{className:"text-slate-400",children:"O"}),f(o)]}),r.jsxs("div",{className:"flex items-center gap-0.5",children:[r.jsx("span",{className:"text-slate-400",children:"R"}),f(i)]})]})}function rj({state:n}){if(!n)return null;const s=o=>{const f=[];return o?.red&&f.push("R"),o?.green&&f.push("G"),o?.force&&f.push("F"),f.length?f.join(""):"none"},i=o=>o?.age!=null?`${o.age}ms`:"--";return r.jsxs("div",{className:"text-[0.7rem] text-slate-400",children:[r.jsx("div",{children:`Left: ${n.left.code??"--"} (${s(n.left)}) · age ${i(n.left)}`}),r.jsx("div",{children:`Omni: ${n.omni.code??"--"} (${s(n.omni)}) · age ${i(n.omni)}`}),r.jsx("div",{children:`Right: ${n.right.code??"--"} (${s(n.right)}) · age ${i(n.right)}`})]})}const ug=m.createContext(null);function oj({children:n}){const[s,i]=m.useState(()=>({status:"loading",data:{}}));m.useEffect(()=>{const p=Tf();i({status:"ready",data:p??{}})},[]);const o=m.useCallback(()=>{const p=Tf();i({status:"ready",data:p??{}})},[]),f=m.useCallback(p=>{const x=L0(p??{});return i(x?{status:"ready",data:p??{}}:g=>({...g,status:"error"})),x},[]),d=m.useCallback((p,x)=>{i(g=>{const v=g.data[p]||{},y=typeof x=="function"?x(v):{...v,...x??{}},S={...g.data,[p]:y};return L0(S)?{status:"ready",data:S}:{...g,status:"error"}})},[]),h=m.useMemo(()=>({data:s.data,status:s.status,reload:o,saveAll:f,setNamespace:d}),[s,o,f,d]);return r.jsx(ug.Provider,{value:h,children:n})}function cj(){const n=m.useContext(ug);if(!n)throw new Error("useSettings must be used within SettingsProvider");return n}function He(n,s={}){const{data:i,status:o,setNamespace:f}=cj(),d=i[n]??s??{},h=m.useCallback(g=>{f(n,v=>{const y=v??{};return typeof g=="function"?g(y):{...y,...g??{}}})},[n,f]),p=m.useCallback(g=>{f(n,()=>g??{})},[n,f]),x=m.useCallback(()=>{const g=typeof s=="object"?{...s}:s;f(n,()=>g??{})},[s,n,f]);return{value:d,status:o,save:h,replace:p,reset:x}}const uj=/^#[0-9A-Fa-f]{6}$/;function ad(n){const s=typeof n=="string"?n.trim():"";return!s||!uj.test(s)?null:s.toUpperCase()}function ca(n,s=.2){const i=ad(n);if(!i)return;const o=Number.isFinite(s)?Math.max(0,Math.min(1,s)):.2,f=fg(i);if(f)return{borderColor:`rgba(${f.r}, ${f.g}, ${f.b}, 0.65)`,backgroundColor:`rgba(${f.r}, ${f.g}, ${f.b}, ${o})`}}function fj(n,s=.2){const i=ad(n);if(!i)return;const o=Number.isFinite(s)?Math.max(0,Math.min(1,s)):.2,f=fg(i);if(f)return{borderColor:`rgba(${f.r}, ${f.g}, ${f.b}, 0.55)`,backgroundColor:`rgba(${f.r}, ${f.g}, ${f.b}, ${o})`}}function fg(n){const s=ad(n);return s?{r:parseInt(s.slice(1,3),16),g:parseInt(s.slice(3,5),16),b:parseInt(s.slice(5,7),16)}:null}function dj(n=[]){return n.map(s=>!s?.type||!s?.id?null:{type:s.type,id:String(s.id),label:s.label||String(s.id),color:s.color||null,key:`${s.type}:${s.id}`}).filter(Boolean)}function sd({panelId:n="replay-sources",fillHeight:s=!1}){const{session:i,triggerReplay:o}=nn(),f=dj(i?.replaySources||[]),{value:d,save:h}=He("replaySources",{}),[p,x]=m.useState([]),[g,v]=m.useState(!1),[y,S]=m.useState(null),[E,C]=m.useState(null),k=i?.replay||null,[w,j]=m.useState(0),N=m.useMemo(()=>{const z=i?.assignment?.roverId;return z?[`rover:${z}`]:[]},[i?.assignment?.roverId]);m.useEffect(()=>{const z=d?.[n];if(Array.isArray(z)&&z.length){x(z);return}x(N)},[d?.[n],N,n]),m.useEffect(()=>{const z=new Set(f.map(V=>V.key));x(V=>V.filter(U=>z.has(U)))},[f]);const q=m.useMemo(()=>({rovers:f.filter(z=>z.type==="rover"),rooms:f.filter(z=>z.type==="room")}),[f]);m.useEffect(()=>{if(!k?.lastTriggeredAt||!k?.cooldownMs){j(0);return}const z=()=>{const U=k.lastTriggeredAt+k.cooldownMs-Date.now();j(Math.max(0,U))};z();const V=setInterval(z,250);return()=>clearInterval(V)},[k?.lastTriggeredAt,k?.cooldownMs,k?.remainingMs]);const M=g||i?.mode==="lockdown"||w>0||!p.length,O=z=>{x(V=>{const U=V.includes(z)?V.filter(W=>W!==z):[...V,z];return h(W=>({...W||{},[n]:U})),U}),C(null)},K=async()=>{if(!M){v(!0),S(null),C(null);try{const z=p.map(V=>{const[U,W]=V.split(":");return{type:U,id:W}});await o(z),C("Replay sent. Check the Discord replay channel.")}catch(z){S(z.message)}finally{v(!1)}}},_=s?"h-full flex flex-col":"",H=s?"flex-1 min-h-0 overflow-y-auto":"";return r.jsxs("section",{className:`panel-section p-0.75 text-sm ${_}`,children:[r.jsxs("header",{className:"panel-muted flex items-center justify-between text-xs",children:[r.jsx("span",{children:"Replay Sources"}),r.jsx("span",{children:f.length})]}),r.jsxs("div",{className:`grid gap-0.5 md:grid-cols-2 ${H}`,children:[r.jsx(z0,{title:"Rovers",items:q.rovers,selected:p,onToggle:O}),r.jsx(z0,{title:"Room Cams",items:q.rooms,selected:p,onToggle:O})]}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("button",{type:"button",className:"button-dark w-full text-xs disabled:opacity-40",onClick:K,disabled:M,children:w>0?`Replay (${Math.ceil(w/1e3)}s)`:g?"Replay…":"Replay"}),y?r.jsx("div",{className:"text-xs text-amber-400",children:y}):null,E?r.jsx("div",{className:"text-xs text-emerald-300",children:E}):null]})]})}function z0({title:n,items:s,selected:i,onToggle:o}){return s.length?r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("div",{className:"panel-muted text-xs",children:n}),r.jsx("div",{className:"space-y-0.5",children:s.map(f=>r.jsxs("label",{className:"surface flex items-center gap-0.5 text-xs",children:[r.jsx("input",{type:"checkbox",checked:i.includes(f.key),onChange:()=>o(f.key),className:"accent-emerald-400"}),r.jsx("span",{className:`truncate ${f.type==="rover"?"rounded px-1 py-[1px] border border-transparent":""}`,style:f.type==="rover"?ca(f.color,.16):void 0,children:f.label})]},f.key))})]}):null}var dg={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},U0=us.createContext&&us.createContext(dg),mj=["attr","size","title"];function hj(n,s){if(n==null)return{};var i=pj(n,s),o,f;if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(n);for(f=0;f=0)&&Object.prototype.propertyIsEnumerable.call(n,o)&&(i[o]=n[o])}return i}function pj(n,s){if(n==null)return{};var i={};for(var o in n)if(Object.prototype.hasOwnProperty.call(n,o)){if(s.indexOf(o)>=0)continue;i[o]=n[o]}return i}function ho(){return ho=Object.assign?Object.assign.bind():function(n){for(var s=1;sus.createElement(s.tag,po({key:i},s.attr),mg(s.child)))}function qi(n){return s=>us.createElement(bj,ho({attr:po({},n.attr)},s),mg(n.child))}function bj(n){var s=i=>{var{attr:o,size:f,title:d}=n,h=hj(n,mj),p=f||i.size||"1em",x;return i.className&&(x=i.className),n.className&&(x=(x?x+" ":"")+n.className),us.createElement("svg",ho({stroke:"currentColor",fill:"currentColor",strokeWidth:"0"},i.attr,o,h,{className:x,style:po(po({color:n.color||i.color},i.style),n.style),height:p,width:p,xmlns:"http://www.w3.org/2000/svg"}),d&&us.createElement("title",null,d),n.children)};return U0!==void 0?us.createElement(U0.Consumer,null,i=>s(i)):s(dg)}function hg(n){return qi({attr:{viewBox:"0 0 640 512"},child:[{tag:"path",attr:{d:"M524.531,69.836a1.5,1.5,0,0,0-.764-.7A485.065,485.065,0,0,0,404.081,32.03a1.816,1.816,0,0,0-1.923.91,337.461,337.461,0,0,0-14.9,30.6,447.848,447.848,0,0,0-134.426,0,309.541,309.541,0,0,0-15.135-30.6,1.89,1.89,0,0,0-1.924-.91A483.689,483.689,0,0,0,116.085,69.137a1.712,1.712,0,0,0-.788.676C39.068,183.651,18.186,294.69,28.43,404.354a2.016,2.016,0,0,0,.765,1.375A487.666,487.666,0,0,0,176.02,479.918a1.9,1.9,0,0,0,2.063-.676A348.2,348.2,0,0,0,208.12,430.4a1.86,1.86,0,0,0-1.019-2.588,321.173,321.173,0,0,1-45.868-21.853,1.885,1.885,0,0,1-.185-3.126c3.082-2.309,6.166-4.711,9.109-7.137a1.819,1.819,0,0,1,1.9-.256c96.229,43.917,200.41,43.917,295.5,0a1.812,1.812,0,0,1,1.924.233c2.944,2.426,6.027,4.851,9.132,7.16a1.884,1.884,0,0,1-.162,3.126,301.407,301.407,0,0,1-45.89,21.83,1.875,1.875,0,0,0-1,2.611,391.055,391.055,0,0,0,30.014,48.815,1.864,1.864,0,0,0,2.063.7A486.048,486.048,0,0,0,610.7,405.729a1.882,1.882,0,0,0,.765-1.352C623.729,277.594,590.933,167.465,524.531,69.836ZM222.491,337.58c-28.972,0-52.844-26.587-52.844-59.239S193.056,219.1,222.491,219.1c29.665,0,53.306,26.82,52.843,59.239C275.334,310.993,251.924,337.58,222.491,337.58Zm195.38,0c-28.971,0-52.843-26.587-52.843-59.239S388.437,219.1,417.871,219.1c29.667,0,53.307,26.82,52.844,59.239C470.715,310.993,447.538,337.58,417.871,337.58Z"},child:[]}]})(n)}function yj(n){return qi({attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M448 360V24c0-13.3-10.7-24-24-24H96C43 0 0 43 0 96v320c0 53 43 96 96 96h328c13.3 0 24-10.7 24-24v-16c0-7.5-3.5-14.3-8.9-18.7-4.2-15.4-4.2-59.3 0-74.7 5.4-4.3 8.9-11.1 8.9-18.6zM128 134c0-3.3 2.7-6 6-6h212c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H134c-3.3 0-6-2.7-6-6v-20zm0 64c0-3.3 2.7-6 6-6h212c3.3 0 6 2.7 6 6v20c0 3.3-2.7 6-6 6H134c-3.3 0-6-2.7-6-6v-20zm253.4 250H96c-17.7 0-32-14.3-32-32 0-17.6 14.4-32 32-32h285.4c-1.9 17.1-1.9 46.9 0 64z"},child:[]}]})(n)}function V0(n){return qi({attr:{viewBox:"0 0 640 512"},child:[{tag:"path",attr:{d:"M192 384h192c53 0 96-43 96-96h32c70.6 0 128-57.4 128-128S582.6 32 512 32H120c-13.3 0-24 10.7-24 24v232c0 53 43 96 96 96zM512 96c35.3 0 64 28.7 64 64s-28.7 64-64 64h-32V96h32zm47.7 384H48.3c-47.6 0-61-64-36-64h583.3c25 0 11.8 64-35.9 64z"},child:[]}]})(n)}function Sj(n){return qi({attr:{viewBox:"0 0 640 512"},child:[{tag:"path",attr:{d:"M528 448H112c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h416c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm64-320c-26.5 0-48 21.5-48 48 0 7.1 1.6 13.7 4.4 19.8L476 239.2c-15.4 9.2-35.3 4-44.2-11.6L350.3 85C361 76.2 368 63 368 48c0-26.5-21.5-48-48-48s-48 21.5-48 48c0 15 7 28.2 17.7 37l-81.5 142.6c-8.9 15.6-28.9 20.8-44.2 11.6l-72.3-43.4c2.7-6 4.4-12.7 4.4-19.8 0-26.5-21.5-48-48-48S0 149.5 0 176s21.5 48 48 48c2.6 0 5.2-.4 7.7-.8L128 416h384l72.3-192.8c2.5.4 5.1.8 7.7.8 26.5 0 48-21.5 48-48s-21.5-48-48-48z"},child:[]}]})(n)}function jj(n){return qi({attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M326.612 185.391c59.747 59.809 58.927 155.698.36 214.59-.11.12-.24.25-.36.37l-67.2 67.2c-59.27 59.27-155.699 59.262-214.96 0-59.27-59.26-59.27-155.7 0-214.96l37.106-37.106c9.84-9.84 26.786-3.3 27.294 10.606.648 17.722 3.826 35.527 9.69 52.721 1.986 5.822.567 12.262-3.783 16.612l-13.087 13.087c-28.026 28.026-28.905 73.66-1.155 101.96 28.024 28.579 74.086 28.749 102.325.51l67.2-67.19c28.191-28.191 28.073-73.757 0-101.83-3.701-3.694-7.429-6.564-10.341-8.569a16.037 16.037 0 0 1-6.947-12.606c-.396-10.567 3.348-21.456 11.698-29.806l21.054-21.055c5.521-5.521 14.182-6.199 20.584-1.731a152.482 152.482 0 0 1 20.522 17.197zM467.547 44.449c-59.261-59.262-155.69-59.27-214.96 0l-67.2 67.2c-.12.12-.25.25-.36.37-58.566 58.892-59.387 154.781.36 214.59a152.454 152.454 0 0 0 20.521 17.196c6.402 4.468 15.064 3.789 20.584-1.731l21.054-21.055c8.35-8.35 12.094-19.239 11.698-29.806a16.037 16.037 0 0 0-6.947-12.606c-2.912-2.005-6.64-4.875-10.341-8.569-28.073-28.073-28.191-73.639 0-101.83l67.2-67.19c28.239-28.239 74.3-28.069 102.325.51 27.75 28.3 26.872 73.934-1.155 101.96l-13.087 13.087c-4.35 4.35-5.769 10.79-3.783 16.612 5.864 17.194 9.042 34.999 9.69 52.721.509 13.906 17.454 20.446 27.294 10.606l37.106-37.106c59.271-59.259 59.271-155.699.001-214.959z"},child:[]}]})(n)}function Aj(n){switch(n){case"admin":case"lockdown":case"lockdown-admin":return"text-amber-300";case"spectator":return"text-slate-400";default:return"text-sky-300"}}function ld(n){return!!n?.system}function Nj(n){const s=new Date(n);return`${s.getHours().toString().padStart(2,"0")}:${s.getMinutes().toString().padStart(2,"0")}`}function $0(n){return n.nickname||n.socketId?.slice(0,6)||"unknown"}function wj({guildIconUrl:n,userAvatarUrl:s,label:i}){return!n&&!s?null:r.jsxs("span",{className:"flex h-4 w-4 overflow-hidden rounded-full border border-slate-700/80",title:i,children:[r.jsx("span",{className:`h-full w-1/2 bg-slate-700/70 ${n?"bg-cover":""}`,style:n?{backgroundImage:`url(${n})`,backgroundPosition:"left center",backgroundSize:"200% 100%"}:void 0}),r.jsx("span",{className:`h-full w-1/2 bg-slate-700/70 ${s?"bg-cover":""}`,style:s?{backgroundImage:`url(${s})`,backgroundPosition:"right center",backgroundSize:"200% 100%"}:void 0})]})}function pg({message:n}){const s=n.fromDiscord?`${n.discordGuildName||"Discord"} · ${$0(n)}`:null,i=ld(n),o=i?"text-emerald-300":Aj(n.role);return r.jsxs(r.Fragment,{children:[n.fromDiscord?r.jsxs(r.Fragment,{children:[r.jsx(hg,{className:"h-3.5 w-3.5 text-indigo-200"}),r.jsx(wj,{guildIconUrl:n.discordGuildIconUrl,userAvatarUrl:n.discordUserAvatarUrl,label:s})]}):null,r.jsx("span",{className:`font-semibold text-[0.85rem] ${o}`,children:$0(n)}),i?r.jsx("span",{className:"rounded bg-emerald-900/60 px-1 text-[0.65rem] font-semibold uppercase tracking-wide text-white",children:"bot"}):null,n.roverId&&r.jsx("span",{className:"rounded bg-slate-800 px-1 text-[0.7rem]",style:fj(n.roverColor,.14),children:n.roverId})]})}function xg(n){return ld(n)?"surface-muted relative flex flex-wrap items-start gap-0.5 border border-emerald-500/40 bg-emerald-900/15 text-sm":`surface-muted relative flex flex-wrap items-start gap-0.5 text-sm ${n.role==="admin"||n.role==="lockdown"||n.role==="lockdown-admin"?"border border-amber-400/30":n.fromDiscord?"border border-indigo-400/30 bg-indigo-900/20":""}`}function id({message:n}){const s=ld(n);return r.jsxs("div",{className:xg(n),children:[r.jsx(pg,{message:n}),r.jsx("span",{className:`break-words leading-tight whitespace-pre-wrap ${s?"text-emerald-100":"text-slate-100"}`,children:n.text}),r.jsx("span",{className:"absolute bottom-0.5 right-1 text-[0.65rem] text-slate-400/60",children:Nj(n.ts)})]})}function gg({message:n}){return r.jsxs("div",{className:`${xg(n)} italic opacity-80 border-slate-600/40 bg-slate-900/40`,children:[r.jsx(pg,{message:n}),r.jsx("span",{className:"text-slate-300",children:"typing..."})]})}function vg({buttonId:n,count:s,goal:i,rewardNumber:o,rewardName:f,className:d=""}){return r.jsxs("article",{className:["surface px-0.5 py-0.5 text-center",d].filter(Boolean).join(" "),children:[r.jsxs("p",{className:"text-xs text-slate-400",children:["Button ",n]}),r.jsxs("p",{className:"text-sm font-semibold text-white",children:[s," / ",i]}),r.jsxs("p",{className:"truncate text-[0.7rem] text-slate-300",children:["#",o," ",f]})]})}const Cj=3e3,Ej=3500,kj="#2196f3";function Mj(n){return n.id?n.id:n.timestamp?`${n.timestamp}-${n.message}`:`${n.title||"alert"}-${n.message}`}function rd({scale:n=1}){const s=ft(S=>S.alerts),i=ft(S=>S.session),{pushAlert:o}=wn(),f=tn(),[d,h]=m.useState(()=>Date.now());m.useEffect(()=>{function S(E={}){const C=Number(E.buttonId);if(!Number.isFinite(C)||C<1||C>4)return;const w=(Array.isArray(i?.buttonBox?.buttons)?i.buttonBox.buttons:[]).find(O=>Number(O?.id)===C)||{},j=Number.isFinite(E.count)?E.count:Number(w.count)||0,N=Number.isFinite(w.goal)?w.goal:0,q=Number.isFinite(w.rewardNumber)?w.rewardNumber:"?",M=typeof w.rewardName=="string"&&w.rewardName.trim()?w.rewardName.trim():"Unassigned";o({id:`buttonbox-active-${C}`,kind:"buttonbox-active",lifetimeMs:Ej,payload:{buttonId:C,count:j,goal:N,rewardNumber:q,rewardName:M}})}return f.on("buttonBox:increment",S),()=>{f.off("buttonBox:increment",S)}},[o,i?.buttonBox?.buttons,f]);const p=m.useMemo(()=>s.slice(-12).map(S=>({alert:S,key:Mj(S)})),[s]);m.useEffect(()=>{if(!p.length)return;const S=setInterval(()=>h(Date.now()),200);return()=>clearInterval(S)},[p.length]);const x=new Map;p.forEach(S=>{const E=d-(S.alert.receivedAt??S.alert.timestamp??0),C=Number.isFinite(S.alert.lifetimeMs)?S.alert.lifetimeMs:Cj;E<=C&&x.set(S.key,{...S,age:E})});const g=Array.from(x.values()).slice(-3);if(!g.length)return null;const v=n===1?void 0:{transform:`translateX(-50%) scale(${n})`,transformOrigin:"top center"},y=n===1?"pointer-events-none fixed top-0.5 left-1/2 z-50 flex -translate-x-1/2 flex-col gap-0.5":"pointer-events-none fixed top-0.5 left-1/2 z-50 flex flex-col gap-0.5";return r.jsx("div",{className:y,style:v,children:g.map(S=>r.jsx(Rj,{alert:S.alert},S.key))})}function G0(n){const s=typeof n=="string"?n.trim():"",i=/^#?([0-9a-fA-F]{6})$/.exec(s);if(!i)return null;const o=i[1];return{r:parseInt(o.slice(0,2),16),g:parseInt(o.slice(2,4),16),b:parseInt(o.slice(4,6),16)}}function Rj({alert:n}){if(n.kind==="buttonbox-active"&&n.payload){const f=n.payload;return r.jsx("div",{className:"pointer-events-none w-[12.5rem]",children:r.jsx(vg,{buttonId:f.buttonId,count:f.count,goal:f.goal,rewardNumber:f.rewardNumber,rewardName:f.rewardName,className:"bg-cyan-900/45"})})}if(n.kind==="chat"&&n.payload)return r.jsx(id,{message:n.payload});if(n.kind==="chat-typing"&&n.payload)return r.jsx(gg,{message:n.payload});const s=G0(n.color)||G0(kj),i=s?`rgba(${s.r}, ${s.g}, ${s.b}, 0.18)`:"rgba(33, 150, 243, 0.18)",o=s?`rgba(${s.r}, ${s.g}, ${s.b}, 0.45)`:"rgba(33, 150, 243, 0.45)";return r.jsx("div",{className:"pointer-events-auto max-w-[80vw] rounded-full border px-2 py-0.5 text-[0.7rem] leading-tight text-slate-100 shadow-sm shadow-black/30",style:{backgroundColor:i,border:`1px solid ${o}`},children:r.jsxs("p",{className:"truncate text-slate-100",children:[r.jsx("span",{className:"text-slate-300",children:n.title||"Alert"}),r.jsx("span",{className:"text-slate-500",children:" · "}),r.jsx("span",{className:"text-white",children:n.message})]})})}const el={main:[-127,127],side:[-127,127],vacuum:[0,127]},sf={maxSpeed:500,baseSpeed:250,boostSpeed:400},Df=100,od=[31,127],ll=60,_f=8,qj=250,Tj=4e3,Kr=.4,Y0=.2,F0=.8,Dj={start:[128],safe:[131],full:[132],passive:[128],dock:[143]},xi={driveForward:["w"],driveBackward:["s"],driveLeft:["a"],driveRight:["d"],boostModifier:["\\"],slowModifier:["shift"],auxMainForward:["i"],auxMainReverse:["k"],auxSideForward:["o"],auxSideReverse:["l"],auxVacuumFast:["p"],auxVacuumSlow:[";"],auxAllForward:[","],cameraUp:["u"],cameraDown:["j"],nightVisionToggle:["e"],hornHonk:["h"],micPtt:["m"],driveMacro:["f"],dockMacro:["g"],chatFocus:["enter"],songNoteUp:["ArrowUp"],songNoteDown:["ArrowDown"],homeAssistantOn:["ArrowRight"],homeAssistantOff:["ArrowLeft"]},bg=[{id:"drive-sequence",label:"Drive",description:"Start, undock, and full command sequence used by the drive button.",steps:[{type:"servo",angle:0},{type:"oi",command:"start"},{type:"pause",duration:Df},{type:"oi",command:"dock"},{type:"pause",duration:Df},{type:"oi",command:"full"},{type:"pause",duration:300},{type:"drive",speeds:{left:-300,right:-300}},{type:"pause",duration:600},{type:"drive",speeds:{left:0,right:0}}]},{id:"seek-dock",label:"Dock",description:"Send the seek dock command.",steps:[{type:"oi",command:"dock"}]}];function Bf(){return{vector:{x:0,y:0,boost:!1},speeds:{left:0,right:0},source:null,lastUpdatedAt:0}}function Of(){return{main:0,side:0,vacuum:0}}function _j(){return{enabled:!1,angle:null,config:null}}function co(){return{note:ll}}function hi(){return{active:!1,heat:0,overheated:!1}}function uo(){return{pttActive:!1}}const X0={roverId:null,mode:"drive",drive:Bf(),aux:Of(),camera:_j(),song:co(),horn:hi(),mic:uo(),lastControlIntentAt:0,macros:bg,keymap:xi,inputs:{}};function Bj(n,s){switch(s.type){case"control/set-rover":return{...n,roverId:s.payload??null,drive:s.payload?n.drive:Bf(),aux:s.payload?n.aux:Of(),song:s.payload?n.song:co(),horn:s.payload?n.horn:hi(),mic:s.payload?n.mic:uo(),lastControlIntentAt:s.payload?n.lastControlIntentAt:0};case"control/set-mode":return n.mode===s.payload?n:{...n,mode:s.payload==="dock"?"dock":"drive"};case"control/update-drive":{const{vector:i,speeds:o,source:f}=s.payload;return{...n,drive:{vector:i??n.drive.vector,speeds:o??n.drive.speeds,source:f??n.drive.source,lastUpdatedAt:Date.now()}}}case"control/set-aux-motors":return{...n,aux:{...n.aux,...s.payload}};case"control/set-camera-config":return{...n,camera:{...n.camera,enabled:!!s.payload?.config,config:s.payload?.config??null,angle:typeof s.payload?.angle=="number"?s.payload.angle:s.payload?.config?s.payload.config.homeAngle??n.camera.angle:null}};case"control/set-camera-angle":return{...n,camera:{...n.camera,angle:s.payload}};case"control/register-input-state":{const i=s.payload?.source||"unknown";return{...n,inputs:{...n.inputs,[i]:{...n.inputs[i]??{},...s.payload?.state,updatedAt:Date.now()}}}}case"control/set-keymap":return{...n,keymap:{...n.keymap,...s.payload??{}}};case"control/set-macros":return{...n,macros:Array.isArray(s.payload)?s.payload:n.macros};case"control/reset":return{...n,drive:Bf(),aux:Of(),song:co(),horn:hi(),mic:uo(),lastControlIntentAt:0};case"control/set-horn-active":return{...n,horn:{...n.horn||hi(),active:!!s.payload}};case"control/set-horn-heat":return{...n,horn:{...n.horn||hi(),heat:typeof s.payload?.heat=="number"?s.payload.heat:0,overheated:!!s.payload?.overheated}};case"control/record-intent":return{...n,lastControlIntentAt:Date.now()};case"control/set-song-note":return{...n,song:{...n.song||co(),note:s.payload??ll}};case"control/set-mic-ptt":return{...n,mic:{...n.mic||uo(),pttActive:!!s.payload}};default:return n}}function il(n,s,i){return typeof n!="number"||Number.isNaN(n)?s:Math.max(s,Math.min(i,n))}function rl(n){return typeof n!="number"||Number.isNaN(n)?0:Math.max(-1,Math.min(1,n))}function pn(n,s){return!Array.isArray(s)||s.length!==2?n:il(n,s[0],s[1])}function Oj(n={}){const s=rl(n.x??0),i=rl(n.y??0);return{x:s,y:i,boost:!!n.boost}}function Lj(n={},s={}){const i=Oj(n),o=typeof s.maxSpeed=="number"?s.maxSpeed:sf.maxSpeed,f=typeof s.baseSpeed=="number"?s.baseSpeed:sf.baseSpeed,d=typeof s.boostSpeed=="number"?s.boostSpeed:sf.boostSpeed,h=i.boost?d:f,p=i.y*h,x=i.x*h;return{vector:i,speeds:{left:il(Math.round(p+x),-o,o),right:il(Math.round(p-x),-o,o)}}}function zj(n){const s=Array.isArray(n)?n:[],i=String.fromCharCode(...s);if(typeof btoa=="function")return btoa(i);if(typeof Buffer<"u")return Buffer.from(s).toString("base64");throw new Error("No base64 encoder available")}function Q0(n){return new Promise(s=>setTimeout(s,n))}function Uj(n={}){const{driveTransform:s,auxTransform:i}=n,o=tn(),f=ft(O=>O.session),d=f?.assignment?.roverId,h=m.useMemo(()=>!d||!Array.isArray(f?.roster)?null:f.roster.find(O=>String(O.id)===String(d))||null,[d,f?.roster]),p=m.useMemo(()=>!h?.cameraServo||!h.cameraServo.enabled?null:h.cameraServo,[h]),x=m.useMemo(()=>!h?.nightVision||!h.nightVision.enabled?null:h.nightVision,[h]),g=m.useMemo(()=>!h?.horn||!h.horn.enabled?null:h.horn,[h]),v=m.useMemo(()=>h?.nightVision?.state??null,[h]),y=m.useCallback((O,K)=>{d&&o.emit("command",{roverId:d,...O},K)},[o,d]),S=m.useCallback(()=>{d&&y({type:"sensorStream",data:{sensorStream:{enable:!0}}})},[y,d]),E=m.useCallback(O=>{if(!d)return null;const K={left:pn(O?.left??0,[-500,500]),right:pn(O?.right??0,[-500,500])},_=s?s(K):K,H={left:pn(_?.left??0,[-500,500]),right:pn(_?.right??0,[-500,500])};return y({type:"drive",data:{driveDirect:H}}),H},[s,y,d]),C=m.useCallback(({main:O=0,side:K=0,vacuum:_=0}={})=>{if(!d)return null;const H={main:pn(O,el.main),side:pn(K,el.side),vacuum:pn(_,el.vacuum)},z=i?i(H):H,V={main:pn(z?.main??0,el.main),side:pn(z?.side??0,el.side),vacuum:pn(z?.vacuum??0,el.vacuum)};return y({type:"motors",data:{motorPwm:V}}),V},[i,y,d]),k=m.useCallback(O=>!d||!p?null:(y({type:"servo",data:{servo:{angle:O}}}),O),[y,d,p]),w=m.useCallback(O=>{if(!d)return!1;const K=Array.isArray(O)?O:typeof O=="string"?Dj[O]:null;return K?(y({type:"raw",data:{raw:zj(K)}}),S(),!0):!1},[y,S,d]),j=m.useCallback(async O=>{if(!(!O||!Array.isArray(O.steps)||!d))for(const K of O.steps){if(!d)break;switch(K.type){case"oi":w(K.command);break;case"drive":E(K.speeds??{left:0,right:0});break;case"motors":C(K.values??{});break;case"servo":k(K.angle);break;case"pause":await Q0(K.duration??Df);break}if(K.delay||K.delayMs){const _=K.delayMs??K.delay;typeof _=="number"&&_>0&&await Q0(_)}}},[d,w,E,C,k]),N=m.useCallback((O="toggle")=>!d||!x?null:(y({type:"nightVision",data:{nightVision:{action:O}}}),O),[y,x,d]),q=m.useCallback(O=>d?(y({type:"horn",data:{horn:O}}),O):null,[y,d]),M=m.useCallback((O=[],K={})=>{if(!d)return null;const H=(Array.isArray(O)&&O.length>0?O:[{note:ll,duration:_f}]).slice(0,16).map(z=>({note:pn(Math.round(z?.note??ll),od),duration:pn(Math.round(z?.duration??_f),[1,255])}));return y({type:"song",data:{song:{notes:H,slot:K.slot,loop:K.loop}}}),H},[y,d]);return m.useMemo(()=>({roverId:d,rosterEntry:h,servoConfig:p,nightVision:x,nightVisionState:v,horn:g,emitCommand:y,enableSensorStream:S,sendDriveDirect:E,sendAuxMotors:C,sendServoAngle:k,sendOiCommand:w,sendNightVision:N,sendHorn:q,sendSong:M,runMacroSteps:j}),[d,h,p,x,v,g,y,S,E,C,k,w,N,q,j])}const Hj={"{":"[","}":"]",":":";",'"':"'","<":",",">":".","?":"/","|":"\\",_:"-","+":"="},K0={"[":"BracketLeft","]":"BracketRight","\\":"Backslash",";":"Semicolon","'":"Quote",",":"Comma",".":"Period","/":"Slash","-":"Minus","=":"Equal","`":"Backquote"};function Ti(n){if(typeof n!="string")return"";const s=n.toLowerCase();return Hj[s]??s}function Vj(n){const s=Ti(n);if(!s)return null;if(K0[s])return K0[s];if(s.length===1){if(/[a-z]/.test(s))return`Key${s.toUpperCase()}`;if(/[0-9]/.test(s))return`Digit${s}`}return null}function yg(n){const s=Ti(n);return s?`key:${s}`:null}function $j(n){const s=Vj(n);return s?`code:${s}`:null}function Z0(n){const s=new Set,i=yg(n?.key??"");i&&s.add(i);const o=n?.code?`code:${n.code}`:null;return o&&s.add(o),Array.from(s)}function Gj(n={}){return Object.fromEntries(Object.entries(n).map(([s,i])=>{const o=Array.isArray(i)?i:[i],f=new Set;return o.forEach(d=>{const h=yg(String(d));h&&f.add(h);const p=$j(String(d));p&&f.add(p)}),[s,f]}))}function An(n){const s=Ti(n);return s?s===" "?"Space":s==="\\"?"Backslash":s==="`"?"Backtick":s==="["?"[ or {":s==="]"?"] or }":s===";"?"; or :":s==="'"?`' or "`:s===","?", or <":s==="."?". or >":s==="/"?"/ or ?":s==="-"?"- or _":s==="="?"= or +":s==="arrowup"?"Arrow Up":s==="arrowdown"?"Arrow Down":s==="arrowleft"?"Arrow Left":s==="arrowright"?"Arrow Right":s.length===1?s.toUpperCase():s:"—"}const qn={keyboard:{baseSpeed:250,turboSpeed:400,precisionSpeed:125,tiltSpeed:90,tiltIntervalMs:110}},ia={label:"Default",calibration:{driveDeadzone:.18,cameraDeadzone:.08,auxDeadzone:.05,driveCurve:"linear",cameraCurve:"linear",auxCurve:"linear",cameraMode:"absolute",cameraSensitivity:60,auxSideScale:.55},bindings:{drive:{kind:"axisPair",sources:[{kind:"axisPair",x:0,y:1,invertX:!1,invertY:!0}]},cameraTilt:{kind:"axis",sources:[{kind:"axis",index:3,invert:!0},{kind:"axis",index:1,invert:!0}]},mainBrush:{kind:"axis",sources:[{kind:"buttonAxis",index:6},{kind:"axis",index:2,invert:!1}]},sideBrush:{kind:"axis",sources:[{kind:"buttonAxis",index:7},{kind:"axis",index:5,invert:!1}]},vacuum:{kind:"button",sources:[{kind:"button",index:0}]},allAux:{kind:"button",sources:[{kind:"button",index:1}]},mainReverse:{kind:"button",sources:[{kind:"button",index:4}]},sideReverse:{kind:"button",sources:[{kind:"button",index:5}]},driveMacro:{kind:"button",sources:[{kind:"button",index:2}]},dockMacro:{kind:"button",sources:[{kind:"button",index:3}]},nightVisionToggle:{kind:"button",sources:[{kind:"button",index:9}]}}},Ba={activeSignature:null,profiles:{},defaults:{profile:ia}},cs={waveform:"saw",freqs:[440,550,660,0]},ct={masterVolume:1,alertVolume:.5,roverVolume:1,mainBrushDuckEnabled:!0,mainBrushDuckAmount:.75},rs=[{key:"drive",motors:["leftWheel","rightWheel"]},{key:"aux",motors:["mainBrush","sideBrush"]}],Yj={downRatePerSec:.15,upRatePerSec:.7,releaseDelaySec:1,outputRateMs:250};function I0(){return rs.reduce((n,s)=>(n[s.key]={cap:1,clearSec:0},n),{})}function J0(n){return Number.isFinite(n)?Math.max(0,Math.min(1,n)):0}function Fj(n,s={}){const i=ft(j=>j.session),d=(dl(n)?.sensors||{})?.wheelOvercurrents||{},h=m.useMemo(()=>({...Yj,...s.config||{}}),[s.config]),[p,x]=m.useState(()=>I0()),g=m.useRef(0),v=m.useRef(d);m.useEffect(()=>{v.current=d||{}},[d]),m.useEffect(()=>{x(I0()),g.current=0},[n]);const y=m.useMemo(()=>rs.some(j=>j.motors.some(N=>!!d?.[N])),[d]),S=m.useMemo(()=>Object.values(p||{}).some(j=>(Number.isFinite(j?.cap)?j.cap:1)<.999),[p]),E=!!n&&(y||S);m.useEffect(()=>{if(!E)return;g.current=typeof performance<"u"?performance.now():Date.now();const j=setInterval(()=>{const N=typeof performance<"u"?performance.now():Date.now(),q=Math.max(0,N-g.current);g.current=N;const M=Math.min(.25,q/1e3);M<=0||x(O=>{let K=!1;const _={},H=Number.isFinite(h.downRatePerSec)?Math.max(0,h.downRatePerSec):0,z=Number.isFinite(h.upRatePerSec)?Math.max(0,h.upRatePerSec):0,V=Number.isFinite(h.releaseDelaySec)?Math.max(0,h.releaseDelaySec):0;return rs.forEach(U=>{const W=O[U.key]||{cap:1,clearSec:0},ce=Number.isFinite(W.cap)?W.cap:1,oe=Number.isFinite(W.clearSec)?W.clearSec:0,$=U.motors.some(ie=>!!v.current?.[ie]),T=$?0:oe+M,Y=!$&&T>=V,I=J0($?ce-H*M:Y?ce+z*M:ce);(Math.abs(I-ce)>1e-4||Math.abs(T-oe)>1e-4)&&(K=!0),_[U.key]={cap:I,clearSec:T}}),K?_:O})},100);return()=>clearInterval(j)},[h.downRatePerSec,h.releaseDelaySec,h.upRatePerSec,n,E]);const C=m.useMemo(()=>{const j=rs.reduce((N,q)=>{const M=p?.[q.key],O=Number.isFinite(M?.cap)?M.cap:1;return N[q.key]=J0(O),N},{});return{perGroup:j,drive:{left:j.drive??1,right:j.drive??1},aux:{main:j.aux??1,side:j.aux??1,vacuum:1}}},[p]),k=m.useMemo(()=>{const j={};rs.forEach(q=>{q.motors.forEach(M=>{j[M]=!!d?.[M]})});const N=rs.reduce((q,M)=>(q[M.key]=M.motors.some(O=>!!d?.[O]),q),{});return{motors:j,groups:N}},[d]),w=i?.role==="admin"||i?.role==="lockdown"||i?.role==="lockdown-admin";return m.useMemo(()=>({caps:p,overcurrent:k,scales:C,isActive:(C?.drive?.left??1)<1||(C?.drive?.right??1)<1||(C?.aux?.main??1)<1||(C?.aux?.side??1)<1,config:h,adminImmune:w}),[p,k,C,h,w])}function Xj(n={},s,i=!1){if(i||!s?.drive)return n;const o=typeof s.drive.left=="number"?s.drive.left:1,f=typeof s.drive.right=="number"?s.drive.right:1;return o>=.999&&f>=.999?n:{left:Math.round((n.left??0)*o),right:Math.round((n.right??0)*f)}}function Qj(n={},s,i=!1){if(i||!s?.aux)return n;const o=typeof s.aux.main=="number"?s.aux.main:1,f=typeof s.aux.side=="number"?s.aux.side:1,d=typeof s.aux.vacuum=="number"?s.aux.vacuum:1;return o>=.999&&f>=.999&&d>=.999?n:{main:Math.round((n.main??0)*o),side:Math.round((n.side??0)*f),vacuum:Math.round((n.vacuum??0)*d)}}const Sg=m.createContext(null);function P0(n){return Object.fromEntries(Object.entries(n||{}).map(([s,i])=>[s,Array.isArray(i)?[...i]:[]]))}function Kj(n,s){if(!n)return s;const i=typeof n.minAngle=="number"?n.minAngle:-45,o=typeof n.maxAngle=="number"?n.maxAngle:45;return il(s,i,o)}function Zj(n=[]){if(!Array.isArray(n)||n.length<3)return n;const s=n.slice(-3),[i,o,f]=s,d=i?.type==="drive"&&Number(i?.speeds?.left)===-300&&Number(i?.speeds?.right)===-300,h=o?.type==="pause"&&Number(o?.duration)===600,p=f?.type==="drive"&&Number(f?.speeds?.left)===0&&Number(f?.speeds?.right)===0;return!d||!h||!p?n:n.slice(0,-3)}function Ij({children:n}){const[s,i]=m.useReducer(Bj,X0),o=m.useRef(null),f=m.useRef(!1),d=m.useRef(X0.camera.angle),h=m.useRef(null),p=m.useRef(0),x=m.useRef(0),{value:g,save:v}=He("controls",{keymap:xi,macros:bg}),{value:y}=He("page",{driveMacroBackoffEnabled:!0}),{value:S}=He("horn",cs),E=typeof y?.driveMacroBackoffEnabled=="boolean"?y.driveMacroBackoffEnabled:!0,C=ft(le=>le.session),{homeAssistantSetState:k}=wn(),w=C?.assignment?.roverId??null,j=Fj(w),N=m.useCallback(le=>Xj(le,j.scales,j.adminImmune),[j.adminImmune,j.scales]),q=m.useCallback(le=>Qj(le,j.scales,j.adminImmune),[j.adminImmune,j.scales]),M=Uj({driveTransform:N,auxTransform:q}),O=m.useCallback(()=>{const me=(C?.homeAssistant?.entities||[]).filter(se=>(se.type==="light"||se.type==="switch")&&se.available!==!1&&se.state!=="on");if(me.length===0){f.current=!1;return}f.current=!0,me.forEach(se=>{k(se.id,"on").catch(()=>{})}),f.current=!1},[C?.homeAssistant?.entities,k]);m.useEffect(()=>{i({type:"control/set-rover",payload:M.roverId})},[M.roverId]),m.useEffect(()=>{const le=o.current;o.current=s.mode,le!=="drive"&&s.mode==="drive"&&C?.homeAssistant?.entities?O():le!=="drive"&&s.mode==="drive"&&(f.current=!0)},[s.mode,C?.homeAssistant?.entities,O]),m.useEffect(()=>{f.current&&C?.homeAssistant?.entities&&O()},[C?.homeAssistant?.entities,O]),m.useEffect(()=>{const le={...xi,...g?.keymap||{}};i({type:"control/set-keymap",payload:le}),g?.macros&&i({type:"control/set-macros",payload:g.macros})},[g?.keymap,g?.macros]),m.useEffect(()=>{const le=M.servoConfig;if(!le){i({type:"control/set-camera-config",payload:{config:null}}),d.current=null;return}const me=typeof le.minAngle=="number"?le.minAngle:-45,se=typeof le.maxAngle=="number"?le.maxAngle:45,P=typeof le.homeAngle=="number"?le.homeAngle:(me+se)/2,fe=typeof d.current=="number"?il(d.current,me,se):null,Ne=fe??il(P,me,se);i({type:"control/set-camera-config",payload:{config:le,angle:Ne}}),d.current=Ne},[M.servoConfig]),m.useEffect(()=>{d.current=typeof s.camera.angle=="number"?s.camera.angle:d.current},[s.camera.angle]),m.useEffect(()=>{M.roverId&&M.enableSensorStream()},[M.roverId,M.enableSensorStream]);const K=m.useCallback(le=>{i({type:"control/set-mode",payload:le})},[]),_=m.useCallback(()=>{i({type:"control/record-intent"})},[]),H=m.useRef(s.drive.speeds),z=m.useRef(s.aux),V=m.useMemo(()=>JSON.stringify(j.scales),[j.scales]),U=m.useRef(0),W=m.useRef(0);m.useEffect(()=>{H.current=s.drive.speeds},[s.drive.speeds]),m.useEffect(()=>{z.current=s.aux},[s.aux]),m.useEffect(()=>{if(!M.roverId||j.adminImmune||!j.isActive)return;const le=Math.max(0,Number(j?.config?.outputRateMs)||0),me=typeof performance<"u"?performance.now():Date.now(),se=H.current||{left:0,right:0},P=z.current||{main:0,side:0,vacuum:0},fe=!!(se.left||se.right),Ne=!!(P.main||P.side||P.vacuum);!fe&&!Ne||(fe&&me-U.current>=le&&(U.current=me,M.sendDriveDirect(se)),Ne&&me-W.current>=le&&(W.current=me,M.sendAuxMotors(P)))},[V,j.adminImmune,j.config,j.isActive,M]);const ce=m.useCallback((le,me={})=>{const se=Lj(le,me.speedOptions);i({type:"control/update-drive",payload:{...se,source:me.source??null}}),_(),M.sendDriveDirect(se.speeds)},[M,_]),oe=m.useCallback((le={})=>{const me=M.sendAuxMotors(le)??le;i({type:"control/set-aux-motors",payload:me}),_()},[M,_]),$=m.useCallback((le,me)=>{if(!le)return!1;const se=Ti(me);if(!se)return!1;const P=P0(s.keymap);return P[le]=[se],i({type:"control/set-keymap",payload:P}),v(fe=>({...fe??{},keymap:P})),!0},[s.keymap,v]),T=m.useCallback(()=>{const le=P0(xi);i({type:"control/set-keymap",payload:le}),v(me=>({...me??{},keymap:le}))},[v]),Y=m.useCallback(le=>{if(!M.servoConfig)return;const me=Kj(M.servoConfig,le);i({type:"control/set-camera-angle",payload:me}),M.sendServoAngle(me),d.current=me,_()},[M,_]),I=m.useCallback((le=0)=>{const me=M.servoConfig;if(!me)return;const se=typeof le=="number"&&le!==0?le:me.nudgeDegrees||1,P=typeof d.current=="number"?d.current:typeof me.homeAngle=="number"?me.homeAngle:0;Y(P+se)},[M.servoConfig,Y]),ie=m.useCallback(()=>{const le=M.servoConfig;if(!le)return;const me=typeof le.homeAngle=="number"?le.homeAngle:typeof le.minAngle=="number"&&typeof le.maxAngle=="number"?(le.minAngle+le.maxAngle)/2:0;Y(me)},[M.servoConfig,Y]),de=m.useCallback(async le=>{const me=s.macros.find(P=>P.id===le)||null;if(!me)return;let se=me;le==="drive-sequence"?(O(),C?.homeAssistant?.entities||(f.current=!0),_(),E||(se={...me,steps:Zj(me.steps)})):le==="seek-dock"&&_(),await M.runMacroSteps(se)},[E,M,_,C?.homeAssistant?.entities,s.macros,O]),R=m.useCallback(()=>{i({type:"control/update-drive",payload:{vector:{x:0,y:0,boost:!1},speeds:{left:0,right:0},source:"system-stop"}}),M.sendDriveDirect({left:0,right:0}),M.sendAuxMotors({main:0,side:0,vacuum:0})},[M]),G=m.useCallback(le=>{M.sendOiCommand(le)},[M]),te=m.useCallback(le=>{M.roverId&&M.emitCommand({type:"sensorStream",data:{sensorStream:{enable:le}}})},[M]),ae=m.useCallback(le=>{if(M.nightVision){if(typeof le=="boolean"){const me=le?"off":"on";M.sendNightVision(me)}else M.sendNightVision("toggle");_()}},[M,_]),pe=m.useCallback(()=>{ae()},[ae]),re=m.useCallback(le=>{const me=typeof le=="number"?le:ll;return i({type:"control/set-song-note",payload:me}),me},[]),ue=m.useCallback((le,me)=>M.sendSong(le,me),[M]),ve=m.useMemo(()=>{const le=S??cs,me=le.waveform==="sine"?"sine":"saw",P=[...Array.isArray(le.freqs)?le.freqs:cs.freqs,0,0,0,0].slice(0,4).map(fe=>{const Ne=Number(fe);return Number.isFinite(Ne)?Ne<=0?0:Math.min(5e3,Math.round(Ne)):0});return{waveform:me,freqs:P}},[S]),be=m.useCallback(()=>{if(!M.horn)return;if(s.horn?.overheated||(s.horn?.heat??0)>=1||s.horn?.active)return!1;const le=Date.now();return M.sendHorn({action:"start",...ve}),i({type:"control/set-horn-active",payload:!0}),p.current=le,x.current=le,h.current&&(clearTimeout(h.current),h.current=null),h.current=setTimeout(()=>{xe()},Tj),_(),!0},[i,ve,M,_,s.horn?.active,s.horn?.heat,s.horn?.overheated]),xe=m.useCallback(()=>{if(!M.horn)return;M.sendHorn({action:"stop"}),i({type:"control/set-horn-active",payload:!1}),h.current&&(clearTimeout(h.current),h.current=null);const le=Date.now(),me=p.current||le,se=Math.max(0,le-me);if(p.current=0,se>0){const P=s.horn?.heat??0,fe=se/1e3*Kr;let Ne=Math.max(0,Math.min(1,P+fe)),pt=s.horn?.overheated??!1;Ne>=1&&(Ne=1,pt=!0),i({type:"control/set-horn-heat",payload:{heat:Ne,overheated:pt}})}},[i,M,s.horn?.heat,s.horn?.overheated,Kr]),Be=m.useRef({active:!!s.horn?.active,heat:s.horn?.heat??0,overheated:!!s.horn?.overheated}),ze=m.useRef(xe);m.useEffect(()=>{Be.current={active:!!s.horn?.active,heat:s.horn?.heat??0,overheated:!!s.horn?.overheated}},[s.horn?.active,s.horn?.heat,s.horn?.overheated]),m.useEffect(()=>{ze.current=xe},[xe]);const Ae=!!s.horn?.active||(s.horn?.heat??0)>0||!!s.horn?.overheated;m.useEffect(()=>{if(!Ae)return;const me=setInterval(()=>{const se=Date.now(),P=x.current||se;x.current=se;const fe=Math.min(1e3,Math.max(0,se-P))/1e3,Ne=Be.current,pt=Ne.heat??0,Ve=!!Ne.active,st=!!Ne.overheated,lt=fe*(Ve?Kr:-Y0);let Ot=Math.max(0,Math.min(1,pt+lt)),it=st;Ot>=1?(Ot=1,it=!0,Ve&&ze.current()):it&&Ot<=F0&&(it=!1),(Ot!==pt||it!==st)&&i({type:"control/set-horn-heat",payload:{heat:Ot,overheated:it}})},100);return()=>clearInterval(me)},[i,Ae,Y0,F0,Kr]);const tt=m.useCallback((le,me)=>{i({type:"control/register-input-state",payload:{source:le,state:me}})},[]),Je=m.useCallback(le=>{i({type:"control/set-mic-ptt",payload:!!le})},[]),vt=m.useMemo(()=>({state:s,dispatch:i,pipeline:M,overcurrentLimiter:j,actions:{setMode:K,setDriveVector:ce,setAuxMotors:oe,setServoAngle:Y,nudgeServo:I,goServoHome:ie,runMacro:de,stopAllMotion:R,sendOiCommand:G,setSensorStream:te,setNightVision:ae,toggleNightVision:pe,updateKeyBinding:$,resetKeyBindings:T,registerInputState:tt,setSongNote:re,sendSong:ue,startHorn:be,stopHorn:xe,setMicPttActive:Je}}),[s,M,j,K,ce,oe,Y,I,ie,de,R,G,te,ae,pe,$,T,tt,re,ue,be,xe,Je]);return r.jsx(Sg.Provider,{value:vt,children:n})}function _t(){const n=m.useContext(Sg);if(!n)throw new Error("useControlSystem must be used within ControlSystemProvider");return n}const Jj="data:audio/mpeg;base64,//uQxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAANAAAIpQBKSkpKSkpKXFxcXFxcXFxra2tra2tra3p6enp6enqJiYmJiYmJiZiYmJiYmJiYpqampqamprW1tbW1tbW1xMTExMTExMTT09PT09PT4uLi4uLi4uLx8fHx8fHx8f////////8AAABQTEFNRTMuMTAwBLkAAAAAAAAAABUgJAUYQQAB4AAACKVpqtMZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//ugxAAAwqQPR8CIwCh0BCj5jDwlIAAjW87wAACcOsAKPMk8ARj8w9OAWwNlV/gCgQMHEhAOVnFaNzWWAPI2zyjHjd8FAoKqyAa88AAAAABNjEd9CQOglIY9dtC+a51bGZrZgTewD3c+AAYx5hxIMheIcudKAyaykG1/h5EsPB0iTEFNRTMuMTAwqqqqqqrIBZqvAAAAAC9JXFIAHrCgAp0D0hUYOInIluqg1TNdKCzMeAAFQCKKsxUmVfireKILLBgSVgb4qBVtPWpMQU1FMy4xMDCqqqqqqqqqqqqqqqqpApm/AAAAAC7QYaHPHoCjkCysmc+QY9NNWRbKE+mqowNobwAAoSQQMLGChDlOrKMqVMC/6xy/CXbFaL7AZUxBTUUzLjEwMFVVVVVVVVVVVacDqZ8AAAAAMgzaYFBPNgIOnVCQfFfwmBBhLVNJQSdxdQRofwAGxF9xAAYs4AZDuE87li0YCASIBwaCiXUj+2BqTEFNRTMuMTAwqqqqqqqqlwOonwAAAAAtkABQSEZ1INNDgx8HeaaLCXiu5dqSciylQNXjv8GdmACQ5ogYKbnsmxkoChog+w9IhU6GsgzCIQBSxFpMQQAAMBiHjgAAAAv6FQQILmJmGLltnax9HszIVEAoEq1p8olpcPLlGpXFastuWosKNFlmlqADJbwAEFRI4iJJy0oDumUW//sgxOEAw5wfU8fnAGBvg6n5nDxUh7QuwcEzkK5Ztz7AZUxBTUUzLjEwMFVVVVVVVZUAhd8AAAAALZAAamQMWKtC7Avib0WLplt2IAp0SKV0pFFxCADLX6AIPFrWJIBQqPGW/x0QDTRLGaQYCRAZzKeoU6uqTEFN6AB3n/7wAAAxq//7EMT0AMPUHU/MawJgc4PpuYy8VQZjocBw2OgQQyQyECnbABEUC/ZoM0J56Jm0tqzNJaq8KospqUAQ5/QBghnCqQAhR4Mz1D1gJPstYsI1sYIg079I5cYjY6pMQU1FMy4xMDCqqqqq//sQxPUAw+AdT8zvAih6hCk5nWBFqqqWAFOf4AAAAEAIQZPkMcwUzFVE51cSBjIHpJRIEIjWgGar9VhgCUvwAFAUMk0RCpMkwXjPQDcoLBU+n5RuR4ZrPQLPckxBTUUzLjEwMKqqqqr/+xDE9oDEAB1NzG8CKIGEKPmd5EWqxgBWn9AAAAAKIiC5GcLJIczCEvNbWsF31jo4Bw0rXktvJF5YRyABlj+ABIQ2RGsHgdc0XsPntoEDUzaQOjTBqblFPUE1TEFNRckAt68AAAAALv/7EMT4AMQIHU3M7wIojwUo+Y2MZfAgKcwITAQIYN1TosJeLtDA0ubWNrFSADJoln4AC0hVaLiIIUChs+4HST4BgCpQHITPMBQkEnj73ORZfylh+sRLEGUiNIpMQU1FMy4xMDCqqqqq//sQxP6AxlgtK+13Yih3hCj5neBNqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrIkT7UNAZ7NS7yMqcihSKLMn8DlKYq8ZdPCVEoJBuWqkxBTUUzLjEwMKqqqqr/+xDE+ADEXCVHzGjDIIQEqLm9PIWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7EMT+AMWoL0XNcwJoiASoeY3gVaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sQxPgAxHAnRcxvAmiBBKj5jehEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+xDE+IDEmCVDzPMCKH6EqLmNYE2qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7EMT9gEPgI0vMZwQgvYWlPY5gFaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sQxOYDw+gpIIfgwWgAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=",jg=m.createContext({messages:[],typing:[],sendMessage:async()=>{},focusChat:()=>{},blurChat:()=>{},registerInputRef:()=>{},onInputFocus:()=>{},onInputBlur:()=>{},setTypingActive:()=>{},isChatFocused:!1});function Pj({children:n}){const s=tn(),i=ft($=>$.session),{pushAlert:o}=wn(),{value:f}=He("audio",ct),[d,h]=m.useState([]),[p,x]=m.useState([]),[g,v]=m.useState(!1),y=m.useRef(null),S=m.useRef(null),E=m.useRef(null),C=m.useRef(new Map),k=m.useRef(new Map),w=m.useRef({isTyping:!1,lastSent:0}),j=Number.isFinite(f?.masterVolume)?f.masterVolume:ct.masterVolume,N=Number.isFinite(f?.alertVolume)?f.alertVolume:ct.alertVolume,q=Math.max(0,Math.min(1,j*N)),M=m.useCallback(()=>{const $=Array.from(C.current.values()).sort((T,Y)=>T.lastUpdate-Y.lastUpdate).map(T=>T.payload);x($)},[]),O=m.useCallback($=>!$||typeof $!="object"?null:$.typingId?$.typingId:$.fromDiscord?`discord:${$.discordUserId||$.discordUserName||$.nickname||"unknown"}`:`socket:${$.socketId||$.nickname||"unknown"}`,[]);m.useEffect(()=>{E.current=new Audio(Jj),E.current.volume=q,E.current.load()},[q]);const K=m.useCallback(()=>{const $=E.current;$&&($.volume=q,$.currentTime=0,$.play().catch(()=>{}))},[q]);m.useEffect(()=>{function $(T={}){h(Y=>[...Y.slice(-99),T]),!(T?.socketId&&i?.socketId&&T.socketId===i.socketId)&&(K(),o?.({kind:"chat",payload:T,id:`chat-${T.id||Math.random().toString(36).slice(2)}`,receivedAt:Date.now()}))}return s.on("chat:message",$),()=>{s.off("chat:message",$)}},[K,i?.socketId,s]),m.useEffect(()=>{function $(T={}){const Y=O(T);if(!Y)return;const I=Date.now();if(T?.socketId&&i?.socketId&&T.socketId===i.socketId){T.isTyping||(C.current.delete(Y),M());return}if(T.isTyping){C.current.set(Y,{payload:T,expiresAt:I+6e3,lastUpdate:I});const ie=k.current.get(Y)||0;I-ie>=2500&&(k.current.set(Y,I),o?.({kind:"chat-typing",payload:T,id:`chat-typing-${Y}-${T.id||Math.random().toString(36).slice(2)}`,receivedAt:I}))}else C.current.delete(Y);M()}return s.on("chat:typing",$),()=>{s.off("chat:typing",$)}},[o,M,O,i?.socketId,s]),m.useEffect(()=>{const $=setInterval(()=>{const T=Date.now();let Y=!1;C.current.forEach((I,ie)=>{I.expiresAt<=T&&(C.current.delete(ie),Y=!0)}),Y&&M()},2e3);return()=>clearInterval($)},[M]),m.useEffect(()=>{function $(T=[]){Array.isArray(T)&&h(Y=>{if(Y.length===0)return T.slice(-100);const I=new Set(T.map(de=>de?.id));return[...T,...Y.filter(de=>de?.id&&!I.has(de.id))].slice(-100)})}return s.on("chat:init",$),()=>{s.off("chat:init",$)}},[s]);const _=m.useCallback($=>{const T=!!$,Y=Date.now(),I=w.current,ie=!T&&I.isTyping;!(T&&(!I.isTyping||Y-I.lastSent>=3500))&&!ie||(w.current={isTyping:T,lastSent:Y},s.emit("chat:typing",{isTyping:T}))},[s]),H=m.useCallback(($,T=null)=>new Promise((Y,I)=>{s.emit("chat:send",{text:$,tts:T},(ie={})=>{ie.error?I(new Error(ie.error)):Y(ie)})}),[s]),z=m.useCallback(($,T={})=>{(T?.target==="hud"?"hud":"panel")==="hud"?S.current=$:y.current=$},[]),V=m.useCallback(()=>{v(!0),(S.current||y.current)?.focus()},[]),U=m.useCallback(()=>{v(!1),S.current?.blur(),y.current?.blur()},[]),W=m.useCallback(()=>v(!0),[]),ce=m.useCallback(()=>v(!1),[]),oe=m.useMemo(()=>({messages:d,sendMessage:H,focusChat:V,blurChat:U,registerInputRef:z,onInputFocus:W,onInputBlur:ce,setTypingActive:_,typing:p,isChatFocused:g,selfSocketId:i?.socketId||null}),[U,V,g,d,ce,W,z,H,i?.socketId,_,p]);return r.jsx(jg.Provider,{value:oe,children:n})}function cd(){const n=m.useContext(jg);if(!n)throw new Error("useChat must be used inside ChatProvider");return n}let Ag=!1;function lf(n){Ag=!!n}function W0(){return Ag}const Wj=new Set(["","text","search","email","password","url","tel","number","date","datetime-local","month","time","week"]);function Ng(n){if(!n||n.nodeType!==1)return!1;const s=n.tagName;if(s==="TEXTAREA"||n.isContentEditable)return!0;if(s!=="INPUT")return!1;const i=n.type?n.type.toLowerCase():"";return Wj.has(i)}function eA(){return typeof document>"u"?!1:Ng(document.activeElement)}const rf="keyboard",of={x:0,y:0,boost:!1},cf={main:0,side:0,vacuum:0},ex=od[0],tx=od[1],ud=5,yi=500,Si=1,fd=100;function uf(n,s){const i=Number(n);return Number.isFinite(i)?Math.max(0,Math.min(500,i)):s}function tA(n,s){const i=Number(n);return Number.isFinite(i)?Math.max(ud,Math.min(yi,i)):s}function wg(n,s){const i=Number(n);return Number.isFinite(i)?Math.max(Si,Math.min(fd,i)):s}function nA(n){const i=(wg(n,n)-Si)/(fd-Si),o=yi-i*(yi-ud);return Math.round(o)}function aA(n){const s=tA(n,n),i=(yi-s)/(yi-ud),o=Si+i*(fd-Si);return Math.round(o)}function sA(n){return Ng(n?.target)}function ht(n,s){if(!n||n.size===0)return!1;for(const i of s)if(n.has(i))return!0;return!1}function lA(n,s){const i=ht(s.driveForward,n),o=ht(s.driveBackward,n),f=ht(s.driveLeft,n),d=ht(s.driveRight,n),h=ht(s.boostModifier,n),p=ht(s.slowModifier,n);let x=0;i&&!o?x=1:o&&!i&&(x=-1);let g=0;f&&!d?g=-1:d&&!f&&(g=1);const v=p?.4:1;return{x:g*v,y:x*v,boost:h&&!p}}function iA(n,s){if(ht(s.auxAllForward,n))return{main:127,side:127,vacuum:127};const o=ht(s.auxMainForward,n)?127:ht(s.auxMainReverse,n)?-127:0,f=ht(s.auxSideForward,n)?127:ht(s.auxSideReverse,n)?-70:0,d=ht(s.auxVacuumFast,n)?127:ht(s.auxVacuumSlow,n)?50:0;return{main:o,side:f,vacuum:d}}function rA(){const{state:n,actions:{setMode:s,setDriveVector:i,setAuxMotors:o,nudgeServo:f,runMacro:d,stopAllMotion:h,registerInputState:p,toggleNightVision:x,startHorn:g,stopHorn:v,setMicPttActive:y,setSongNote:S,sendSong:E}}=_t(),C=ft(re=>re.session),{homeAssistantSetState:k}=wn(),{focusChat:w,blurChat:j,isChatFocused:N}=cd(),{value:q}=He("inputs",qn),M=m.useMemo(()=>Gj(n.keymap),[n.keymap]),O=m.useMemo(()=>{const re=new Set;return Object.values(M).forEach(ue=>{ue&&ue.forEach(ve=>re.add(ve))}),re},[M]),K=m.useMemo(()=>{const re=qn.keyboard,ue=q?.keyboard??{};return{baseSpeed:uf(ue.baseSpeed,re.baseSpeed),turboSpeed:uf(ue.turboSpeed,re.turboSpeed),precisionSpeed:uf(ue.precisionSpeed,re.precisionSpeed)}},[q?.keyboard]),_=m.useMemo(()=>{const re=qn.keyboard,ue=q?.keyboard??{},ve=wg(typeof ue.tiltSpeed=="number"?ue.tiltSpeed:typeof ue.tiltIntervalMs=="number"?aA(ue.tiltIntervalMs):re.tiltSpeed,re.tiltSpeed);return nA(ve)},[q?.keyboard]),H=m.useMemo(()=>Math.abs(n.camera?.config?.nudgeDegrees||1),[n.camera?.config?.nudgeDegrees]),z=m.useRef(new Set),V=m.useRef(of),U=m.useRef(cf),W=m.useRef(null),ce=m.useRef(null),oe=m.useRef(!1),$=m.useCallback(()=>{const re=new Set(z.current);ht(M.boostModifier,re);const ve=ht(M.slowModifier,re)?{baseSpeed:K.precisionSpeed,boostSpeed:K.precisionSpeed}:{baseSpeed:K.baseSpeed,boostSpeed:K.turboSpeed},be=lA(re,M),xe=iA(re,M);(be.x!==V.current.x||be.y!==V.current.y||be.boost!==V.current.boost)&&(V.current=be,i(be,{source:rf,speedOptions:ve})),(xe.main!==U.current.main||xe.side!==U.current.side||xe.vacuum!==U.current.vacuum)&&(U.current=xe,o(xe)),p(rf,{keys:Array.from(re),vector:be,aux:xe})},[M,K,p,o,i]),T=m.useCallback(()=>{W.current&&(clearTimeout(W.current),W.current=null)},[]),Y=m.useCallback(()=>{const re=new Set(z.current),ue=ht(M.cameraUp,re),ve=ht(M.cameraDown,re);return(ue?1:0)-(ve?1:0)},[M]),I=m.useCallback(()=>{if(Y()===0){T();return}if(W.current)return;const ue=()=>{const ve=Y();if(ve===0){T();return}f(ve*H),W.current=setTimeout(ue,_)};W.current=setTimeout(ue,0)},[Y,f,_,H,T]),ie=m.useCallback(()=>{ce.current&&(clearTimeout(ce.current),ce.current=null)},[]),de=m.useCallback(()=>{const re=new Set(z.current),ue=ht(M.songNoteUp,re),ve=ht(M.songNoteDown,re);return(ue?1:0)-(ve?1:0)},[M]),R=m.useCallback(re=>{if(re===0)return;let ve=(typeof n.song?.note=="number"?n.song.note:ll)+re;ve>tx?ve=ex:ve{if(de()===0){ie();return}if(ce.current)return;const ue=()=>{const ve=de();if(ve===0){ie();return}R(ve),ce.current=setTimeout(ue,qj)};ce.current=setTimeout(ue,0)},[de,ie,R]),te=m.useCallback(()=>{z.current.clear(),V.current=of,U.current=cf,T(),ie(),oe.current&&(oe.current=!1,v()),y(!1),h(),p(rf,{keys:[],vector:of,aux:cf})},[p,y,h,v,T,ie]),ae=m.useCallback(re=>{const ue=C?.homeAssistant;if(!ue?.enabled||!ue?.connected||ue?.lightPolicy?.locked||ue?.lightPolicy?.lockedOn)return;const be=(ue.entities||[]).filter(xe=>(xe.type==="light"||xe.type==="switch")&&xe.available!==!1&&xe.state!=="unavailable");if(be.length!==0){if(re==="on"){const xe=be.find(Be=>Be.state!=="on");xe&&k(xe.id,"on").catch(()=>{});return}if(re==="off")for(let xe=be.length-1;xe>=0;xe-=1){const Be=be[xe];if(Be.state==="on"){k(Be.id,"off").catch(()=>{});break}}}},[k,C?.homeAssistant]);m.useEffect(()=>{function re(be){if(W0()||sA(be))return;const xe=Z0(be);if(xe.length===0)return;const Be=new Set(xe);if(ht(M.chatFocus,Be)){be.preventDefault(),te(),N||w();return}xe.some(Ae=>O.has(Ae))&&be.preventDefault();const ze=xe.filter(Ae=>!z.current.has(Ae));if(ze.forEach(Ae=>z.current.add(Ae)),ze.length>0)if(ze.some(Ae=>M.driveMacro?.has(Ae)))s("drive"),d("drive-sequence");else if(ze.some(Ae=>M.dockMacro?.has(Ae)))s("dock"),d("seek-dock");else if(ze.some(Ae=>M.nightVisionToggle?.has(Ae)))x();else if(ze.some(Ae=>M.hornHonk?.has(Ae))){if(!oe.current){const Ae=g();oe.current=!!Ae}}else ze.some(Ae=>M.micPtt?.has(Ae))?y(!0):ze.some(Ae=>M.homeAssistantOn?.has(Ae))?ae("on"):ze.some(Ae=>M.homeAssistantOff?.has(Ae))&&ae("off");I(),G(),$()}function ue(be){if(W0())return;Z0(be).forEach(Be=>z.current.delete(Be)),oe.current&&!ht(M.hornHonk,z.current)&&(oe.current=!1,v()),ht(M.micPtt,z.current)||y(!1),I(),G(),$()}function ve(){te()}return window.addEventListener("keydown",re,{capture:!0}),window.addEventListener("keyup",ue,{capture:!0}),window.addEventListener("blur",ve),()=>{window.removeEventListener("keydown",re,{capture:!0}),window.removeEventListener("keyup",ue,{capture:!0}),window.removeEventListener("blur",ve)}},[O,j,$,I,G,w,N,M.chatFocus,M.dockMacro,M.driveMacro,M.hornHonk,M.micPtt,te,d,y,s,h,ie,g,v,ae]);const pe=m.useRef(te);return m.useEffect(()=>{pe.current=te},[te]),m.useEffect(()=>{pe.current()},[n.roverId]),m.useEffect(()=>{oe.current=!!n.horn?.active},[n.horn?.active]),m.useEffect(()=>()=>{T(),ie()},[T,ie]),null}const oA=1.6;function Cg(n){if(!n)return"unknown::none::0::0";const s=n.id||"unknown",i=n.mapping||"none",o=Array.isArray(n.axes)?n.axes.length:0,f=Array.isArray(n.buttons)?n.buttons.length:0;return`${s}::${i}::${o}::${f}`}function cA(n){return JSON.parse(JSON.stringify(n??{}))}function Eg(n,s){const i=cA(s);return i.meta={id:n?.id??"Unknown",mapping:n?.mapping??"none",axes:n?.axes?.length??0,buttons:n?.buttons?.length??0},i}function os(n){return Number.isFinite(n)?Math.max(-1,Math.min(1,n)):0}function fi(n,s){if(!n)return 0;const i=Math.abs(n);return s==="expo"?Math.sign(n)*Math.pow(i,oA):n}function ff(n,s){const i=Math.abs(n);if(i<=s)return 0;const o=(i-s)/(1-s);return Math.sign(n)*o}function uA(n,s,i){const o=Math.hypot(n,s);if(o<=i)return{x:0,y:0};const d=(o-i)/(1-i)/o;return{x:n*d,y:s*d}}function xo(n,s){if(!n||!Array.isArray(n.axes))return null;const i=n.axes[s];return Number.isFinite(i)?os(i):null}function Lf(n,s){if(!n||!Array.isArray(n.buttons))return null;const i=n.buttons[s];if(!i)return null;const o=typeof i.value=="number"?i.value:i.pressed?1:0;return{pressed:!!(i.pressed||o>.5),value:Math.max(0,Math.min(1,o))}}function df(n,s=[]){for(const i of s)if(i){if(i.kind==="axis"){const o=xo(n,i.index);if(o===null)continue;return{value:i.invert?-o:o,source:i}}if(i.kind==="buttonAxis"){const o=Lf(n,i.index);if(!o)continue;return{value:os(o.value),source:i}}}return{value:0,source:null}}function fA(n,s=[]){for(const i of s){if(!i||i.kind!=="axisPair")continue;const o=xo(n,i.x),f=xo(n,i.y);if(o===null||f===null)continue;const d=i.invertX?-o:o,h=i.invertY?-f:f;return{x:d,y:h,source:i}}return{x:0,y:0,source:null}}function as(n,s=[]){for(const i of s)if(i){if(i.kind==="button"){const o=Lf(n,i.index);if(!o)continue;return{pressed:o.pressed,source:i}}if(i.kind==="axisButton"){const o=xo(n,i.index);if(o===null)continue;const f=i.direction||1,d=typeof i.threshold=="number"?i.threshold:.6;return{pressed:o*f>d,source:i}}if(i.kind==="buttonAxis"){const o=Lf(n,i.index);if(!o)continue;return{pressed:o.value>.5,source:i}}}return{pressed:!1,source:null}}function kg(n,s){const i=s?.bindings??{},o=s?.calibration??{},f=i.drive??{},d=fA(n,f.sources);let h=os(d.x),p=os(d.y);const x=Math.min(Math.max(o.driveDeadzone??.18,0),.8),g=uA(h,p,x);h=fi(g.x,o.driveCurve),p=fi(g.y,o.driveCurve);const v=i.cameraTilt??{},y=df(n,v.sources),S=Math.min(Math.max(o.cameraDeadzone??.08,0),.8);let E=ff(os(y.value),S);E=fi(E,o.cameraCurve);const C=Math.min(Math.max(o.auxDeadzone??.05,0),.6),k=i.mainBrush??{},w=df(n,k.sources);let j=ff(os(w.value),C);j=fi(j,o.auxCurve);const N=i.sideBrush??{},q=df(n,N.sources);let M=ff(os(q.value),C);M=fi(M,o.auxCurve);const O=as(n,i.vacuum?.sources),K=as(n,i.allAux?.sources),_=as(n,i.mainReverse?.sources),H=as(n,i.sideReverse?.sources),z=as(n,i.driveMacro?.sources),V=as(n,i.dockMacro?.sources),U=as(n,i.nightVisionToggle?.sources);return{driveVector:{x:h,y:p,boost:!1},cameraAxis:E,auxAxis:{main:j,side:M},buttons:{vacuum:O.pressed,allAux:K.pressed,mainReverse:_.pressed,sideReverse:H.pressed,driveMacro:z.pressed,dockMacro:V.pressed,nightVisionToggle:U.pressed},sources:{drive:d.source,cameraTilt:y.source,mainBrush:w.source,sideBrush:q.source,vacuum:O.source,allAux:K.source,mainReverse:_.source,sideReverse:H.source,driveMacro:z.source,dockMacro:V.source,nightVisionToggle:U.source}}}const pi=new Set;let sl=null,ol={pads:[],timestamp:0},Zr=!1,Ir=null;function nx(){return Mg().some(n=>n?.connected!==!1)}function Mg(){if(typeof navigator>"u"||!navigator.getGamepads)return[];const n=navigator.getGamepads();return n?Array.from(n).filter(Boolean):[]}function dA(n){return{index:n.index,id:n.id,mapping:n.mapping,connected:n.connected!==!1,timestamp:n.timestamp,axes:Array.from(n.axes??[]),buttons:(n.buttons??[]).map(s=>({pressed:!!s?.pressed,value:typeof s?.value=="number"?s.value:s?.pressed?1:0})),signature:Cg(n)}}function go(){ol={pads:Mg().map(dA),timestamp:typeof performance<"u"?performance.now():Date.now()},pi.forEach(s=>s(ol))}function Rg(){if(go(),ol.pads.length===0){zf();return}sl=requestAnimationFrame(Rg)}function ax(){sl||(go(),ol.pads.length!==0&&(sl=requestAnimationFrame(Rg)))}function zf(){sl&&(cancelAnimationFrame(sl),sl=null)}function qg(n){if(pi.add(n),!Zr&&typeof window<"u"){const s=()=>{go(),pi.size!==0&&(nx()?ax():zf())};window.addEventListener("gamepadconnected",s),window.addEventListener("gamepaddisconnected",s),Ir=s,Zr=!0}return nx()?ax():go(),n(ol),()=>{pi.delete(n),pi.size===0&&(zf(),Zr&&typeof window<"u"&&(window.removeEventListener("gamepadconnected",Ir),window.removeEventListener("gamepaddisconnected",Ir),Ir=null,Zr=!1))}}function mA(){const[n,s]=m.useState(ol);return m.useEffect(()=>qg(s),[]),n}const tl="gamepad",ss={x:0,y:0,boost:!1},ls={main:0,side:0,vacuum:0},hA=100,pA=100;function mf(n,s){return n&&s&&n.x===s.x&&n.y===s.y&&n.boost===s.boost}function hf(n,s){return n&&s&&n.main===s.main&&n.side===s.side&&n.vacuum===s.vacuum}function xA(n){return n?Math.hypot(n.x||0,n.y||0):0}function gA(n){return n?!n.main&&!n.side&&!n.vacuum:!0}function vA(n,s){if(!n||n.length===0)return null;if(s){const i=n.find(o=>o.signature===s);if(i)return i}return n[0]}function bA(){const{state:n,actions:{setMode:s,setDriveVector:i,setAuxMotors:o,setServoAngle:f,runMacro:d,toggleNightVision:h,registerInputState:p}}=_t(),{value:x,save:g}=He("gamepad",Ba),v=m.useRef(new Set),y=m.useRef(ss),S=m.useRef(ls),E=m.useRef({main:!1,side:!1}),C=m.useRef(new Map),k=m.useRef(0),w=m.useRef(0),j=m.useRef(0),N=m.useRef(null),q=m.useCallback(_=>{const H=_.signature??Cg(_);x?.profiles?.[H]||v.current.has(H)||(v.current.add(H),g(z=>{const V=z??Ba;if(V.profiles?.[H])return V;const U=V?.defaults?.profile??ia,W=Eg(_,U);return{...V,profiles:{...V.profiles??{},[H]:W}}}))},[x?.profiles,g]),M=m.useCallback((_,H)=>{const z=C.current.get(_)||!1;return C.current.set(_,H),H&&!z},[]),O=m.useCallback((_,H)=>{const z=n.camera?.config;if(!z)return;const V=typeof performance<"u"?performance.now():Date.now(),U=H?.cameraMode??"absolute",W=Math.max(1,Math.min(180,H?.cameraSensitivity??60));if(U==="velocity"){const Y=Math.min(50,V-j.current||16),I=_*W*(Y/1e3);if(Math.abs(I)<.01)return;const de=(typeof N.current=="number"?N.current:typeof n.camera?.angle=="number"?n.camera.angle:typeof z.homeAngle=="number"?z.homeAngle:0)+I;f(de),N.current=de,j.current=V;return}const ce=typeof z.minAngle=="number"?z.minAngle:-45,oe=typeof z.maxAngle=="number"?z.maxAngle:45,$=typeof z.homeAngle=="number"?z.homeAngle:(ce+oe)/2,T=_<0?$+_*($-ce):$+_*(oe-$);typeof N.current=="number"&&Math.abs(N.current-T)<.35&&V-j.current<80||(j.current=V,N.current=T,f(T))},[f,n.camera?.angle,n.camera?.config]),K=m.useMemo(()=>x?.activeSignature??null,[x?.activeSignature]);return m.useEffect(()=>qg(_=>{const H=vA(_.pads,K);if(!H){mf(y.current,ss)||(y.current=ss,i(ss,{source:tl})),hf(S.current,ls)||(S.current=ls,o(ls)),C.current=new Map,E.current={main:!1,side:!1},k.current=0,w.current=0,p(tl,{connected:!1});return}if(eA()){mf(y.current,ss)||(y.current=ss,i(ss,{source:tl})),hf(S.current,ls)||(S.current=ls,o(ls)),C.current=new Map,E.current={main:!1,side:!1},p(tl,{connected:!0,blocked:!0});return}q(H);const z=H.signature,V=x?.profiles?.[z]??x?.defaults?.profile??ia,U=kg(H,V);if(!mf(U.driveVector,y.current)){const I=typeof performance<"u"?performance.now():Date.now();(xA(U.driveVector)<.02||I-k.current>=hA)&&(y.current=U.driveVector,k.current=I,i(U.driveVector,{source:tl}))}const W=V.calibration?.auxSideScale??.55,ce=Math.round(Math.min(Math.abs(U.auxAxis.main),1)*127),oe=Math.round(Math.min(Math.abs(U.auxAxis.side),1)*127),$=E.current.main?-ce:ce,T=E.current.side?-Math.round(oe*W):Math.round(oe*W);let Y={main:U.auxAxis.main!==0?$:0,side:U.auxAxis.side!==0?T:0,vacuum:U.buttons.vacuum?127:0};if(U.buttons.allAux&&(Y={main:127,side:127,vacuum:127}),!hf(Y,S.current)){const I=typeof performance<"u"?performance.now():Date.now();(gA(Y)||I-w.current>=pA)&&(S.current=Y,w.current=I,o(Y))}U.buttons.mainReverse&&M("mainReverse",!0)?E.current.main=!E.current.main:U.buttons.mainReverse||M("mainReverse",!1),U.buttons.sideReverse&&M("sideReverse",!0)?E.current.side=!E.current.side:U.buttons.sideReverse||M("sideReverse",!1),U.buttons.driveMacro&&M("driveMacro",!0)?(s("drive"),d("drive-sequence")):U.buttons.driveMacro||M("driveMacro",!1),U.buttons.dockMacro&&M("dockMacro",!0)?(s("dock"),d("seek-dock")):U.buttons.dockMacro||M("dockMacro",!1),U.buttons.nightVisionToggle&&M("nightVisionToggle",!0)?h():U.buttons.nightVisionToggle||M("nightVisionToggle",!1),Math.abs(U.cameraAxis)>.001&&O(U.cameraAxis,V.calibration),p(tl,{connected:!0,signature:z,id:H.id,index:H.index,axes:H.axes,buttons:H.buttons,drive:U.driveVector,aux:Y,cameraAxis:U.cameraAxis,bindings:U.sources})}),[K,q,x?.defaults?.profile,x?.profiles,M,O,p,d,o,i,s,h]),null}function Tg(n){const s=n?.sensors||{},i=s.oiMode?.label||"Unknown",o=i.toLowerCase(),f=s.chargingState?.label||"",d=!!s.chargingSources?.homeBase,h=d&&f.toLowerCase()!=="not charging"&&f!=="";return{driving:o==="full",docked:d,charging:h,dockedNotCharging:d&&!h,dockingInProgress:!d&&!h&&o==="passive",oiLabel:i,chargingLabel:f}}function Dg(n){const s=dl(n);return m.useMemo(()=>Tg(s),[s])}function nl({label:n,value:s,tone:i="neutral"}){const o=i==="good"?"border-emerald-200 bg-emerald-600 text-white":i==="warn"?"border-amber-200 bg-amber-600 text-white":i==="bad"?"border-red-200 bg-red-600 text-white":"border-slate-200/30 bg-slate-700 text-slate-100";return r.jsx("div",{className:`flex flex-1 flex-col items-center justify-center rounded-lg border px-0.75 py-0.5 text-center ${o}`,children:r.jsx("span",{className:"text-base font-semibold md:text-lg",children:s})})}function sx({label:n}){return n?r.jsx("span",{className:"rounded border border-white/40 px-1 text-[0.7rem] text-white",children:n}):null}function pf({label:n,tone:s}){const i=s==="emerald"?"border-emerald-200/70 bg-emerald-600/70 text-emerald-50":s==="amber"?"border-amber-200/70 bg-amber-600/70 text-amber-50":"border-indigo-200/70 bg-indigo-600/70 text-indigo-50";return r.jsx("span",{className:`rounded-full border px-0.5 py-0.15 text-[0.7rem] font-semibold ${i}`,children:n})}function yA({instructions:n,onConfirm:s,onCancel:i,pending:o}){return r.jsx("div",{className:"fixed inset-0 z-40 flex items-center justify-center bg-black/70 p-1",children:r.jsxs("div",{className:"surface w-full max-w-md space-y-0.5 border border-indigo-700 bg-indigo-950/90 p-1 text-slate-100 shadow-2xl",children:[r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-lg font-semibold text-indigo-50",children:"Dock Rover"}),r.jsx("p",{className:"text-sm text-slate-200",children:n.summary}),r.jsx(Uf,{steps:n.steps,tone:"indigo"})]}),r.jsxs("div",{className:"grid grid-cols-2 gap-0.5 text-sm",children:[r.jsx("button",{type:"button",onClick:i,className:"bg-slate-700 px-0.5 py-1 font-semibold text-slate-100 transition hover:bg-slate-600",children:"Cancel"}),r.jsx("button",{type:"button",disabled:o,onClick:s,className:"bg-indigo-600 px-0.5 py-1 font-semibold text-indigo-50 transition hover:bg-indigo-500 disabled:opacity-50",children:o?"Docking…":"Confirm Dock"})]})]})})}function _g({layout:n="desktop",expand:s=!1,fill:i=!1,driveDockState:o,compactHeightClass:f=""}){const d=n==="mobile",{state:{roverId:h,keymap:p},actions:x}=_t(),g=dl(h),v=o??Tg(g),{driving:y,docked:S,charging:E,dockingInProgress:C}=v,[k,w]=m.useState(null),[j,N]=m.useState(!1),[q,M]=m.useState(!1),O=!h||k!==null,K=!h||k!==null,_=An(p?.driveMacro?.[0]),H=An(p?.dockMacro?.[0]),z={summary:"You are about to trigger an automatic docking attempt! To have a successful dock:",steps:["Line up the rover straight in front of the dock","Make sure the rover is about one foot or half a meter away from the dock","Press Confirm Dock to begin the docking process"]},V="Click this button to initate auto-dock.",U={summary:"You must enable driving mode before you can move the rover.",steps:["Press the keybind or tap this button to enable driving mode","Once ready (should be instant), this dialog will change, and you will be able to move"]},W=S?"Docked":"Undocked",ce=S?"good":"bad",oe=E?"Charging":S?"Charging in 5s":"—",$=E?"good":S?"warn":"bad",T=async()=>{if(!(!h||k)){w("drive");try{x.setMode("drive"),await x.runMacro("drive-sequence")}catch(Je){alert(Je.message)}finally{w(null)}}},Y=async()=>{if(!(!h||k)){N(!1),M(!1),w("drive");try{x.setMode("drive"),await x.runMacro("drive-sequence")}catch(Je){alert(Je.message)}finally{w(null)}}},I=async()=>{if(!(!h||k)){w("dock");try{x.setMode("dock"),await x.runMacro("seek-dock")}catch(Je){alert(Je.message)}finally{w(null),N(!1),M(!1)}}},ie=()=>{K||(M(!0),N(!0))},de="flex w-full flex-col gap-0.5 overflow-hidden rounded-xl border-2 px-0.75 py-0.75 text-slate-100 shadow-md transition hover:-translate-y-0.5 hover:shadow-xl focus-visible:outline-none focus-visible:ring-2 disabled:cursor-not-allowed disabled:opacity-60 select-none no-touch-select",R="text-center",G="items-center justify-between",te="items-center justify-center",ae=d?"text-sm font-semibold":"",pe="border-emerald-300/70 bg-emerald-800 text-emerald-50 hover:bg-emerald-700 focus-visible:ring-emerald-300",re="border-amber-300/70 bg-amber-900 text-amber-50 hover:bg-amber-800 focus-visible:ring-amber-300",ue="border-indigo-300/70 bg-indigo-900 text-indigo-50 hover:bg-indigo-800 focus-visible:ring-indigo-300",ve="border-amber-300/70 bg-amber-900 text-amber-50 hover:bg-amber-800 focus-visible:ring-amber-300",xe=s||C,Be=xe?"h-full flex-1":i?"flex-1":"",ze=d&&!xe?f:"",Ae=d&&!xe?te:G,tt=d&&!xe&&y&&S;if(!y&&!C)return r.jsxs("button",{type:"button",onClick:Y,onContextMenu:Je=>Je.preventDefault(),disabled:O,className:`${de} ${Be} ${ze} ${R} ${Ae} ${ae} ${pe}`,children:[r.jsxs("div",{className:"space-y-0.5 w-full",children:[r.jsxs("div",{className:"flex w-full flex-col items-center gap-0.25",children:[r.jsx("span",{className:"text-base font-semibold text-emerald-50 md:text-lg",children:"Start Driving"}),!d&&xe?r.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-0.5",children:[_?r.jsx(sx,{label:_}):null,r.jsx(pf,{label:"Click to start",tone:"emerald"})]}):null]}),xe?r.jsxs(r.Fragment,{children:[r.jsx("p",{className:"text-sm text-emerald-50/90",children:U.summary}),r.jsx(Uf,{steps:U.steps,tone:"emerald"})]}):null]}),xe?r.jsxs("div",{className:"flex w-full flex-1 flex-col gap-0.5 self-stretch",children:[r.jsx(nl,{label:"Dock",value:W,tone:ce}),r.jsx(nl,{label:"Charge",value:oe,tone:$})]}):null]});if(C){const Je={summary:"If the rover is failing to dock, click to drive and try again.",steps:["The rover should be slowly wiggling towards the dock","If it is obviously not working, press this button to enter driving mode and try again"]};return r.jsxs("button",{type:"button",disabled:O,onClick:T,onContextMenu:vt=>vt.preventDefault(),className:`${de} ${Be} ${ze} ${R} ${Ae} ${ae} ${re}`,children:[r.jsxs("div",{className:"space-y-0.5 w-full",children:[r.jsxs("div",{className:"flex w-full flex-col items-center gap-0.25",children:[r.jsx("span",{className:"text-base font-semibold text-amber-50 md:text-lg",children:"Docking in Progress"}),xe?r.jsx("div",{className:"flex flex-wrap items-center justify-center gap-0.5",children:r.jsx(pf,{label:"Return to driving mode",tone:"emerald"})}):null]}),xe?r.jsx("p",{className:"text-sm text-amber-50/90",children:Je.summary}):null]}),xe?r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"flex w-full flex-1 flex-col gap-0.5 self-stretch",children:[r.jsx(nl,{label:"Dock",value:W,tone:ce}),r.jsx(nl,{label:"Charge",value:oe,tone:$})]}),d?null:r.jsx(Uf,{steps:Je.steps,tone:"amber"})]}):null]})}return r.jsxs(r.Fragment,{children:[r.jsxs("button",{type:"button",disabled:K,onClick:ie,onContextMenu:Je=>Je.preventDefault(),className:d?`flex w-full ${de} ${ze} ${R} ${Ae} ${ae} ${tt?ve:ue}`:`${de} ${Be} ${R} ${G} ${ae} ${ue}`,children:[r.jsxs("div",{className:"flex w-full flex-col items-center gap-0.25",children:[r.jsx("span",{className:"text-base font-semibold text-indigo-50 md:text-lg",children:tt?"Docked!":"Dock and Charge"}),!d&&xe?r.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-0.5",children:[H?r.jsx(sx,{label:H}):null,r.jsx(pf,{label:"Click to begin docking",tone:"indigo"})]}):null]}),!d&&xe&&r.jsxs(r.Fragment,{children:[r.jsx("p",{className:"text-sm text-indigo-50/90",children:V}),r.jsxs("div",{className:"flex w-full flex-1 flex-col gap-0.5 self-stretch",children:[r.jsx(nl,{label:"Dock",value:W,tone:ce}),r.jsx(nl,{label:"Charge",value:oe,tone:$})]}),r.jsx("div",{className:"text-xs text-indigo-100/80",children:"Line up straight, about 1 foot away, before docking."})]})]}),q||!d&&j?r.jsx(yA,{instructions:z,pending:k==="dock",onCancel:()=>{M(!1),N(!1)},onConfirm:I}):null]})}function Uf({steps:n,tone:s="emerald"}){const i=s==="emerald"?"bg-emerald-900/60 text-emerald-50/90 border-emerald-700/60":s==="amber"?"bg-amber-900/60 text-amber-50/90 border-amber-700/60":"bg-indigo-900/60 text-indigo-50/90 border-indigo-700/60",o=s==="emerald"?"text-emerald-200":s==="amber"?"text-amber-200":"text-indigo-200";return r.jsx("div",{className:`space-y-0.5 rounded border px-0.5 py-0.35 text-left ${i}`,children:n.map((f,d)=>r.jsxs("div",{className:"text-[0.85rem] leading-snug break-words",children:[r.jsxs("div",{className:"flex items-start",children:[r.jsxs("span",{className:`mr-0 align-top text-[0.75rem] font-semibold ${o}`,children:[d+1,"."]}),r.jsx("span",{className:"align-top",children:f})]}),d{xf(n)&&p(n)},[n]);const x=xf(h),g=x?h:!1,v=x?g?"On":"Off":"—",y=g?"bg-emerald-500 text-emerald-950":"bg-slate-700 text-slate-200",S=()=>{if(s)return;const C=x?!g:!0;p(C),i?.(C)},E=m.useMemo(()=>["group flex w-full flex-col items-center justify-center gap-0.35 rounded-xl border-2 px-1 py-0.75 text-center select-none no-touch-select",g?"border-emerald-300/70 bg-emerald-800 text-emerald-50 hover:bg-emerald-700":"border-amber-300/70 bg-amber-900 text-amber-50 hover:bg-amber-800","disabled:opacity-50",d,f].filter(Boolean).join(" "),[f,g,d]);return r.jsxs("button",{type:"button",onClick:S,onContextMenu:C=>C.preventDefault(),disabled:s,"aria-pressed":g,className:E,children:[r.jsxs("span",{className:"flex items-center gap-0.5",children:[r.jsx("span",{className:"text-sm font-semibold",children:"Night Vision"}),o?r.jsx("span",{className:"rounded bg-slate-800 px-1 py-0.5 text-[0.6rem] font-semibold text-slate-200",children:o}):null]}),r.jsx("span",{className:`rounded px-1 py-0.5 text-[0.7rem] font-semibold ${y}`,children:v})]})}function gf(n){const s=Number(n);return!Number.isFinite(s)||s<=0?0:Math.min(5e3,Math.round(s))}function Og({disabled:n,onStart:s,onStop:i,keyLabel:o,active:f,heat:d=0,className:h="",defaultShowSettings:p=!0,showSettingsToggle:x=!1,compactSettings:g=!1}){const[v,y]=m.useState(!1),[S,E]=m.useState(p),{value:C,save:k}=He("horn",cs),[w,j]=m.useState(C?.waveform||cs.waveform),[N,q]=m.useState(()=>[...Array.isArray(C?.freqs)?C.freqs:cs.freqs,0,0,0,0].slice(0,4).map(T=>gf(T)));m.useEffect(()=>{j(C?.waveform||cs.waveform),Array.isArray(C?.freqs)&&q([...C.freqs,0,0,0,0].slice(0,4).map($=>gf($)))},[C?.freqs,C?.waveform]);const M=!!f,O=Math.max(0,Math.min(1,Number(d)||0)),K=m.useMemo(()=>["group relative flex w-full flex-col gap-0.5 overflow-hidden rounded-xl border-2 px-1 py-1.5 text-xs font-semibold select-none no-touch-select",M?"border-fuchsia-300/70 bg-fuchsia-700 text-fuchsia-50":"border-cyan-300/70 bg-cyan-900 text-cyan-50 hover:bg-cyan-800","disabled:opacity-50",h].filter(Boolean).join(" "),[h,M]),_=()=>{n||v||(y(!0),s?.())},H=()=>{v&&(y(!1),i?.())};m.useEffect(()=>{!M&&v&&y(!1)},[M,v]);const z=w==="sine"?"sine":"saw",V=m.useCallback($=>{const T=$.target.value==="sine"?"sine":"saw";j(T),k(Y=>({...Y??{},waveform:T}))},[k]),U=m.useCallback(($,T)=>{q(Y=>{const I=[...Y];return I[$]=gf(T),k(ie=>({...ie??{},freqs:I})),I})},[k]),W=$=>{if(n)return;const T=$.target?.tagName?.toLowerCase();T==="input"||T==="select"||T==="option"||T==="label"||T==="button"||($.preventDefault(),_())},ce=$=>{const T=$.target?.tagName?.toLowerCase();T==="input"||T==="select"||T==="option"||T==="label"||T==="button"||($.preventDefault(),H())},oe=x?r.jsx("button",{type:"button",onClick:$=>{$.preventDefault(),E(T=>!T)},className:"rounded bg-black/40 px-1 py-0.5 text-[0.6rem] font-semibold text-white/90 hover:text-white",children:S?"Hide":"Settings"}):null;return r.jsxs("div",{role:"button",tabIndex:0,"aria-pressed":v,onPointerDown:W,onPointerUp:ce,onPointerLeave:H,onPointerCancel:H,onContextMenu:$=>$.preventDefault(),onBlur:H,className:K,children:[r.jsx("div",{className:"pointer-events-none absolute inset-0 opacity-70",style:{background:`linear-gradient(90deg, rgba(14,116,144,0.7) ${O*100}%, rgba(0,0,0,0) ${O*100}%)`}}),r.jsx("div",{className:`pointer-events-none absolute inset-0 transition-opacity ${M?"opacity-40":"opacity-0"}`,style:{background:"linear-gradient(90deg, rgba(217,70,239,0.75), rgba(244,114,182,0.35))"}}),r.jsxs("div",{className:"relative z-10 flex items-center justify-between gap-0.5",children:[r.jsxs("span",{className:"flex items-center gap-0.5 text-sm font-semibold",children:[r.jsx("span",{children:"Horn"}),o?r.jsx("span",{className:"rounded bg-black/40 px-1 py-0.5 text-[0.6rem] font-semibold text-white",children:o}):null]}),oe,r.jsx("span",{className:`rounded px-1 py-0.5 text-[0.65rem] font-semibold ${M?"bg-fuchsia-200 text-fuchsia-900":"bg-slate-800 text-slate-200"}`,children:M?"Honk":"Hold"})]}),S?g?r.jsxs("div",{className:"relative z-10 flex flex-col gap-0.5 text-[0.65rem]",children:[r.jsxs("label",{className:"flex items-center justify-between gap-0.5 text-slate-200",children:[r.jsx("span",{className:"text-slate-300",children:"Wave"}),r.jsxs("select",{value:z,onChange:V,className:"rounded border border-slate-700 bg-slate-900 px-1 py-[2px] text-[0.65rem] text-slate-100",children:[r.jsx("option",{value:"saw",children:"Saw"}),r.jsx("option",{value:"sine",children:"Sine"})]})]}),r.jsx("div",{className:"grid grid-cols-2 gap-0.5",children:N.map(($,T)=>r.jsxs("label",{className:"flex items-center gap-0.5 text-slate-200",children:[r.jsx("span",{className:"text-[0.6rem] text-slate-400",children:T+1}),r.jsx("input",{type:"number",min:0,max:5e3,step:1,value:$,onChange:Y=>U(T,Y.target.value),className:"w-full rounded border border-slate-700 bg-slate-900 px-1 py-[2px] text-right text-[0.65rem] font-mono text-slate-100"})]},`horn-freq-${T}`))})]}):r.jsxs("div",{className:"relative z-10 grid grid-cols-[minmax(0,1.2fr)_repeat(4,minmax(0,1fr))] items-center gap-0.5 text-[0.65rem]",children:[r.jsxs("label",{className:"flex items-center gap-0.5 text-slate-200",children:[r.jsx("span",{className:"text-slate-300",children:"Wave"}),r.jsxs("select",{value:z,onChange:V,className:"rounded border border-slate-700 bg-slate-900 px-1 py-[2px] text-[0.65rem] text-slate-100",children:[r.jsx("option",{value:"saw",children:"Saw"}),r.jsx("option",{value:"sine",children:"Sine"})]})]}),N.map(($,T)=>r.jsxs("label",{className:"flex items-center gap-0.5 text-slate-200",children:[r.jsx("span",{className:"text-[0.6rem] text-slate-400",children:T+1}),r.jsx("input",{type:"number",min:0,max:5e3,step:1,value:$,onChange:Y=>U(T,Y.target.value),className:"w-full rounded border border-slate-700 bg-slate-900 px-1 py-[2px] text-right text-[0.65rem] font-mono text-slate-100"})]},`horn-freq-${T}`))]}):null]})}function Jr(n){return typeof n!="number"||Number.isNaN(n)?"—":`${n>0?"+":""}${n.toFixed(1)}°`}function lx({label:n}){return n?r.jsx("span",{className:"rounded border border-white/40 px-1 text-[0.7rem] text-white",children:n}):null}function Lg({value:n,min:s,max:i,step:o=.5,label:f="Camera Tilt",orientation:d="horizontal",onChange:h,onCommit:p,throttleMs:x=0,disabled:g=!1,keyDownLabel:v,keyUpLabel:y,className:S="",labelRowClass:E="",labelClass:C="",valueClass:k="",sliderClass:w="",endpointClass:j="",endpointLabelClass:N="",accentClass:q="",showValue:M=!0,showEndpoints:O}){const K=d==="vertical",H=typeof O=="boolean"?O:!K,[z,V]=m.useState(n),U=m.useRef(!1),W=m.useRef(null);m.useEffect(()=>{U.current||V(n)},[n]),m.useEffect(()=>()=>{W.current&&clearTimeout(W.current)},[]);const ce=I=>{if(h){if(x>0){W.current&&clearTimeout(W.current),W.current=setTimeout(()=>{h(I)},x);return}h(I)}},oe=I=>{const ie=Number.parseFloat(I.target.value);Number.isNaN(ie)||(U.current=!0,V(ie),ce(ie))},$=()=>{U.current=!1,W.current&&(clearTimeout(W.current),W.current=null),p?p(z):x>0&&h?.(z)};if(typeof s!="number"||typeof i!="number")return null;const T=[K?"h-28 w-5":"w-full",q,w].filter(Boolean).join(" "),Y=r.jsx("input",{type:"range",orient:K?"vertical":void 0,min:s,max:i,step:o,value:Number.isFinite(z)?z:s,onChange:oe,onMouseUp:$,onTouchEnd:$,onPointerUp:$,disabled:g,className:T,style:K?{writingMode:"bt-lr",WebkitAppearance:"slider-vertical"}:void 0});return K?r.jsxs("div",{className:`flex h-full flex-col items-center gap-0.5 ${S}`.trim(),children:[M?r.jsx("div",{className:`flex flex-col items-center ${E}`.trim(),children:r.jsx("span",{className:k,children:Jr(n)})}):null,r.jsxs("div",{className:"flex min-h-0 flex-1 items-center gap-0.5",children:[r.jsx("span",{className:C,children:f}),Y]})]}):r.jsxs("div",{className:`space-y-0.5 ${S}`.trim(),children:[r.jsxs("div",{className:`flex items-center justify-between ${E}`.trim(),children:[r.jsx("span",{className:C,children:f}),M?r.jsx("span",{className:k,children:Jr(n)}):null]}),r.jsxs("div",{children:[Y,H?r.jsxs("div",{className:`mt-0 flex items-center justify-between ${j}`.trim(),children:[r.jsxs("span",{className:`flex items-center gap-0.5 ${N}`.trim(),children:[v?r.jsx(lx,{label:v}):null,Jr(s)]}),r.jsxs("span",{className:`flex items-center gap-0.5 ${N}`.trim(),children:[Jr(i),y?r.jsx(lx,{label:y}):null]})]}):null]})]})}const Pr="mobile-joystick",SA=80,jA=.15,AA={main:0,side:0,vacuum:0},NA={main:127,side:127,vacuum:127},wA={main:-127,side:-127,vacuum:-127};function CA({disabled:n,layout:s,radius:i,onMove:o,onStop:f}){const d=m.useRef(null),h=m.useRef(null),p=m.useRef({x:0,y:0}),[x,g]=m.useState({active:!1,base:{x:0,y:0},knob:{x:0,y:0}}),v=m.useCallback(()=>{h.current=null,g({active:!1,base:{x:0,y:0},knob:{x:0,y:0}}),f?.()},[f]),y=m.useCallback(k=>{if(n||h.current!==null)return;k.preventDefault();const w=d.current;if(!w)return;const j=w.getBoundingClientRect(),N=k.clientX-j.left,q=k.clientY-j.top;p.current={x:N,y:q},h.current=k.pointerId,w.setPointerCapture?.(k.pointerId),g({active:!0,base:{x:N,y:q},knob:{x:0,y:0}})},[n]),S=m.useCallback(k=>{if(n||h.current!==k.pointerId)return;k.preventDefault();const w=d.current;if(!w)return;const j=w.getBoundingClientRect(),N=k.clientX-j.left,q=k.clientY-j.top,M=N-p.current.x,O=q-p.current.y,K=Math.min(Math.hypot(M,O),i),_=Math.atan2(O,M),H=Math.cos(_)*K,z=Math.sin(_)*K,V={x:rl(H/i),y:rl(-z/i),boost:!1};g(U=>({...U,knob:{x:H,y:z}})),o?.(V)},[n,o]),E=m.useCallback(k=>{if(h.current!==k.pointerId)return;k.preventDefault(),d.current?.releasePointerCapture?.(k.pointerId),v()},[v]);return m.useEffect(()=>{n&&v()},[n,v]),r.jsxs("div",{ref:d,role:"presentation",className:"relative w-full h-full select-none overflow-hidden rounded-xl border-2 border-slate-700 bg-slate-900/70 text-slate-100 shadow-md",style:{touchAction:"none"},onPointerDown:y,onPointerMove:S,onPointerUp:E,onPointerLeave:E,onPointerCancel:E,onContextMenu:k=>k.preventDefault(),children:[!x.active&&r.jsxs("div",{className:"absolute inset-x-0 top-0 flex flex-col items-center gap-0 text-center pt-0.5",children:[r.jsx("span",{className:"font-semibold text-slate-200",children:"Joystick area"}),r.jsx("span",{className:"text-sm text-slate-300",children:"Touch and hold to use the joystick"})]}),x.active&&r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"pointer-events-none absolute h-28 w-28 -translate-x-1/2 -translate-y-1/2 bg-cyan-400/10 outline outline-2 outline-cyan-400/60 [clip-path:circle(50%)]",style:{left:x.base.x,top:x.base.y}}),r.jsx("div",{className:"pointer-events-none absolute h-12 w-12 -translate-x-1/2 -translate-y-1/2 bg-cyan-300/80 shadow-lg [clip-path:circle(50%)]",style:{left:x.base.x+x.knob.x,top:x.base.y+x.knob.y}})]})]})}function EA({layout:n}){const{state:{roverId:s},actions:{setDriveVector:i,registerInputState:o}}=_t(),f=Dg(s),d=f.docked&&!f.driving,h=d||f.dockingInProgress,p=!s,x=SA,g=jA,v=m.useRef({x:0,y:0,boost:!1});m.useEffect(()=>{p&&(v.current={x:0,y:0,boost:!1})},[p]);const y=m.useCallback((k={})=>{if(p)return;const w={x:rl(k.x??0),y:rl(k.y??0),boost:!!k.boost},j={x:v.current.x+(w.x-v.current.x)*(1-g),y:v.current.y+(w.y-v.current.y)*(1-g),boost:w.boost};v.current=j,i(j,{source:Pr}),o(Pr,{vector:j,lastEvent:"move"})},[p,o,i,g]),S=m.useCallback(()=>{if(p)return;const k={x:0,y:0,boost:!1};v.current=k,i(k,{source:Pr}),o(Pr,{vector:k,lastEvent:"stop"})},[p,o,i]),C=`flex h-full flex-col gap-0.5 text-slate-100 ${d?"max-h-screen self-start":""}`;return r.jsxs("div",{className:C,children:[r.jsx(_g,{layout:"mobile",expand:h,driveDockState:f,compactHeightClass:"min-h-[5rem]"}),h?null:r.jsx("div",{className:"flex-1 min-h-0",children:r.jsx(CA,{disabled:p,layout:n,radius:x,onMove:y,onStop:S})})]})}function ix({id:n,label:s,values:i,color:o,disabled:f,onPress:d,onRelease:h}){return r.jsx("button",{type:"button",disabled:f,onPointerDown:p=>{p.preventDefault(),d(n,i)},onPointerUp:()=>h(n),onPointerLeave:()=>h(n),onPointerCancel:()=>h(n),onContextMenu:p=>p.preventDefault(),className:`flex h-full w-full items-center justify-center rounded-xl border-2 px-1 py-0.75 text-center text-sm font-semibold text-white transition select-none no-touch-select ${o} hover:brightness-110 active:brightness-125 active:scale-[0.99] disabled:opacity-30`,children:s})}function kA({layout:n}){const{state:{roverId:s,camera:i,horn:o},pipeline:f,actions:{setServoAngle:d,setNightVision:h,setAuxMotors:p,startHorn:x,stopHorn:g}}=_t(),v=!s,y=m.useRef(null),S=i?.config,E=!!(s&&i?.enabled&&S),C=!!(s&&f?.nightVision),k=f?.nightVisionState,w=!!(s&&f?.horn),j=o?.overheated,N=typeof S?.minAngle=="number"?S.minAngle:-45,q=typeof S?.maxAngle=="number"?S.maxAngle:45,M=typeof i?.angle=="number"?i.angle:typeof S?.homeAngle=="number"?S.homeAngle:(N+q)/2,O=m.useCallback(H=>{C&&h(H)},[C,h]),K=m.useCallback((H,z)=>{v||(y.current=H,p(z))},[v,p]),_=m.useCallback(H=>{v||y.current===H&&(y.current=null,p(AA))},[v,p]);return r.jsxs("div",{className:"grid h-full min-h-0 w-full grid-rows-[minmax(0,1fr)_minmax(0,1fr)_minmax(0,1fr)] gap-0.5 text-slate-100",children:[r.jsxs("div",{className:"grid min-h-0 grid-rows-2 gap-0.5",children:[r.jsx(ix,{id:"aux-vac-forward",label:"Vacuum Forward",values:NA,color:"bg-fuchsia-600",disabled:v,onPress:K,onRelease:_}),r.jsx(ix,{id:"aux-vac-backward",label:"Vacuum Backward",values:wA,color:"bg-fuchsia-800",disabled:v,onPress:K,onRelease:_})]}),r.jsxs("div",{className:"flex min-h-0 items-stretch gap-0.5",children:[E?r.jsx("div",{className:"flex-1 min-h-0 rounded bg-zinc-950 p-0.25",children:r.jsx(Lg,{value:M,min:N,max:q,step:.5,onChange:d,orientation:"vertical",label:"Camera Tilt",labelClass:"text-sm font-semibold text-white [writing-mode:vertical-rl] rotate-180",labelRowClass:"text-[0.7rem] text-slate-300",valueClass:"font-mono text-slate-200",className:"h-full gap-0",sliderClass:"h-full w-7",accentClass:"accent-cyan-400",showEndpoints:!1,showValue:!1})}):null,C?r.jsx(Bg,{nightVisionOn:k?.nightVisionOn,disabled:v,onToggle:O,heightClass:"h-full"}):null]}),r.jsx("div",{className:"min-h-0",children:w?r.jsx(Og,{disabled:v||j,onStart:x,onStop:g,active:o?.active,heat:o?.heat,defaultShowSettings:!1,showSettingsToggle:!0,compactSettings:!0,className:"h-full"}):null})]})}function vo({layout:n,className:s=""}){return r.jsx("div",{className:`flex flex-col gap-0.5 ${s}`.trim(),children:r.jsx(kA,{layout:n})})}function bo({layout:n,className:s=""}){return r.jsx("div",{className:`flex flex-col gap-0.5 ${s}`.trim(),children:r.jsx(EA,{layout:n==="landscape"?"landscape":"portrait"})})}function MA({swapColumns:n=!1}){const s="h-[min(60svh,24rem)]",i=n?r.jsx(bo,{layout:"portrait",className:s}):r.jsx(vo,{layout:"portrait",className:s}),o=n?r.jsx(vo,{layout:"portrait",className:s}):r.jsx(bo,{layout:"portrait",className:s});return r.jsx("section",{className:"panel",children:r.jsxs("div",{className:"grid grid-cols-2 gap-0.5 items-stretch",children:[i,o]})})}function RA(n=[],s={}){const i=tn(),{enabled:o=!0,version:f=null}=s,[d,h]=m.useState({}),p=m.useRef(new Map),x=m.useMemo(()=>n.map(C=>typeof C=="string"?C:C.id),[n]),g=m.useMemo(()=>{const C=x.join("|");return f?`${C}|v:${f}`:C},[x,f]),v=m.useRef([]),[y,S]=m.useState(0),E=m.useRef(new Map);return m.useEffect(()=>{if(!i)return;const C=()=>S(k=>k+1);return i.on("connect",C),()=>i.off("connect",C)},[i]),m.useEffect(()=>{v.current=x},[g,x]),m.useEffect(()=>{p.current.forEach(C=>URL.revokeObjectURL(C)),p.current.clear(),h({})},[g]),m.useEffect(()=>{if(!o){p.current.forEach(N=>URL.revokeObjectURL(N)),p.current.clear(),h({});return}if(!v.current.length||!i)return;let C=!1;const k=v.current,w=(N={},q)=>{if(C||!N.id||!q)return;const M=q.byteLength??q.length??0,O=Date.now(),K=E.current.get(N.id)||{count:0,totalBytes:0,lastLogAt:0},_={count:K.count+1,totalBytes:K.totalBytes+M,lastLogAt:K.lastLogAt};if(!_.lastLogAt||O-_.lastLogAt>=1e4){const U=_.count?_.totalBytes/_.count:0;console.log("[roomCamera]",N.id,`frame=${M}B`,`avg=${Math.round(U)}B`,`count=${_.count}`),_.lastLogAt=O}E.current.set(N.id,_);const H=new Blob([q],{type:"image/jpeg"}),z=URL.createObjectURL(H),V=p.current.get(N.id);V&&URL.revokeObjectURL(V),p.current.set(N.id,z),h(U=>({...U,[N.id]:{status:"playing",ts:N.ts||Date.now(),error:null,objectUrl:z}}))},j=(N={})=>{C||!N.id||h(q=>({...q,[N.id]:{...q[N.id]||{},status:N.error?"error":q[N.id]?.status||"connecting",error:N.error||null,ts:N.ts||q[N.id]?.ts||null,objectUrl:q[N.id]?.objectUrl||null}}))};return i.on("roomCamera:frame",w),i.on("roomCamera:status",j),i.emit("roomCamera:subscribe",{ids:k},(N={})=>{N.error}),()=>{C=!0,i.emit("roomCamera:unsubscribe",{ids:k}),i.off("roomCamera:frame",w),i.off("roomCamera:status",j),p.current.forEach(N=>URL.revokeObjectURL(N)),p.current.clear()}},[i,g,o,y]),d}function qA({feed:n,label:s}){const[i,o]=m.useState(!1);m.useEffect(()=>{n&&(!n.ts&&!n.objectUrl||o(d=>!d))},[n?.ts,n?.objectUrl]);const f=m.useMemo(()=>n?n.error?`Error: ${n.error}`:n.status||"Connecting…":"Connecting…",[n]);return r.jsxs("div",{className:"relative w-full overflow-hidden rounded bg-black",style:{aspectRatio:"4 / 3"},children:[n?.objectUrl?r.jsx("img",{src:n.objectUrl,alt:s,className:"h-full w-full object-cover"}):r.jsx("div",{className:"flex h-full w-full items-center justify-center text-sm text-slate-300",children:"Waiting for frame…"}),r.jsx("div",{className:"pointer-events-none absolute left-0 top-0 bg-black/70 px-0.5 py-0.5 text-xs font-semibold text-white",children:s}),r.jsxs("div",{className:"pointer-events-none absolute bottom-0 left-0 m-0 flex items-center gap-0.5 rounded bg-black/70 px-0.5 py-0.25 text-[0.7rem] text-slate-100",children:[r.jsx("span",{className:`h-2 w-2 rounded-full ${i?"bg-emerald-400":"bg-slate-500"}`}),r.jsx("span",{children:f})]})]})}function TA(){return r.jsxs("div",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-center text-slate-400",children:"No room cameras configured."}),r.jsx("p",{className:"text-center text-slate-500",children:"Add entries to server config to populate this list."})]})}const zg=["horizontal","vertical"];function vf(n,s){return zg.includes(n)?n:s}function dd({defaultOrientation:n="horizontal",orientation:s,hideLayoutToggle:i=!1,hideHeader:o=!1,panelId:f=null}){const{session:d}=nn(),h=d?.roomCameras||[],p=RA(h.map(w=>({id:w.id}))),{value:x,save:g}=He("roomCameraPanels",{}),[v,y]=m.useState(()=>vf(f?x?.[f]:n,"horizontal"));m.useEffect(()=>{if(!f)return;const w=x?.[f];w&&y(vf(w,"horizontal"))},[f,x?.[f]]);const S=s?vf(s,"horizontal"):v,E=S==="vertical"?"flex flex-col gap-0.5":"grid gap-0.5 md:grid-cols-2",C=!i&&!s&&h.length>0,k=w=>{y(w),f&&g(j=>({...j||{},[f]:w}))};return h.length===0?r.jsx(TA,{}):r.jsxs("section",{className:"panel-section space-y-0.5 text-base",children:[!o&&r.jsxs("header",{className:"flex flex-wrap items-center justify-between gap-0.5 text-sm text-slate-400",children:[r.jsxs("div",{className:"flex items-center gap-0.5",children:[r.jsx("p",{children:"Room cameras"}),r.jsx("span",{className:"text-xs text-slate-500",children:h.length})]}),r.jsx("div",{className:"flex flex-wrap items-center gap-0.5 text-xs",children:C&&r.jsxs("div",{className:"flex items-center gap-0.5",children:[r.jsx("span",{className:"text-slate-500",children:"Layout:"}),r.jsx("div",{className:"inline-flex overflow-hidden rounded border border-slate-700",children:zg.map(w=>r.jsx("button",{type:"button",className:`px-1 py-0.5 ${S===w?"bg-slate-600 text-white":"bg-transparent text-slate-400 hover:text-white"}`,onClick:()=>k(w),children:w==="vertical"?"Vertical":"Grid"},w))})]})})]}),r.jsx("div",{className:E,children:h.map(w=>{const j=p[w.id]||null;return r.jsx("article",{className:"w-full space-y-0.5 rounded bg-zinc-950 p-0.5 shadow-inner shadow-black/40",children:r.jsx(qA,{feed:j,label:w.name||w.id})},w.id)})})]})}function md(){const n=ft(s=>s.logs);return r.jsxs("div",{className:"panel-section space-y-0.5 text-base",children:[r.jsxs("div",{className:"flex items-center justify-between text-sm text-slate-400",children:[r.jsx("span",{children:"Server logs"}),r.jsx("span",{children:n.length})]}),r.jsx("div",{className:"surface h-64 overflow-y-auto font-mono text-xs",children:n.length===0?r.jsx("p",{children:"No logs yet."}):n.slice().reverse().map(s=>r.jsxs("div",{className:"surface",children:[r.jsx("span",{className:"text-amber-400",children:s.timestamp})," ",r.jsxs("span",{className:"text-lime-400",children:["[",s.level,"]"]})," ",s.label&&r.jsxs("span",{className:"text-teal-400",children:["[",s.label,"]"]})," ",r.jsx("span",{children:s.message})]},s.id))})]})}function DA(n){if(!n)return null;if(typeof n=="string"){const s=String(n).trim();return s?{type:"rover",id:s,key:s}:null}if(typeof n=="object"){if(n.type&&n.id){const s=String(n.id);let i=n.key;return i||(i=n.type==="room"?`room:${s}`:s),{type:n.type,id:s,key:i}}if(n.roverId){const s=String(n.roverId);return{type:"rover",id:s,key:n.key||s}}if(n.roomCameraId){const s=String(n.roomCameraId);return{type:"room",id:s,key:n.key||`room:${s}`}}}return null}function _A(n=[]){const s=new Set,i=[];return n.forEach(o=>{!o?.key||s.has(o.key)||(s.add(o.key),i.push(o))}),i.sort((o,f)=>o.key.localeCompare(f.key))}function ji(n=[],s={}){const i=tn(),{enabled:o=!0,version:f=null}=s,[d,h]=m.useState({}),p=m.useMemo(()=>Array.isArray(n)?_A(n.map(DA).filter(Boolean)):[],[n]),x=m.useMemo(()=>{const E=p.map(C=>`${C.type}:${C.id}:${C.key}`).join("|");return f?`${E}|v:${f}`:E},[p,f]),g=m.useRef([]),[v,y]=m.useState(0);return m.useEffect(()=>{if(!i)return;const E=()=>y(C=>C+1);return i.on("connect",E),()=>{i.off("connect",E)}},[i]),m.useEffect(()=>{g.current=p},[p]),m.useEffect(()=>{if(!x||!o){h({});return}const E=g.current;let C=!1;function k(w){const j=w.type==="room"?{roomCameraId:w.id}:{roverId:w.id};i.emit("video:request",j,(N={})=>{C||h(q=>({...q,[w.key]:N}))})}return E.forEach(w=>{k(w)}),()=>{C=!0}},[i,x,o,v]),m.useMemo(()=>{if(!x||!o)return{};const E={};return p.forEach(C=>{d[C.key]&&(E[C.key]=d[C.key])}),E},[x,d,p])}function hd(n=[],s={}){const i=tn(),{enabled:o=!0,version:f=null}=s,[d,h]=m.useState({}),p=m.useRef(new Map),x=m.useMemo(()=>n.map(C=>typeof C=="string"?C:C.id).filter(Boolean),[n]),g=m.useMemo(()=>{const C=x.join("|");return f?`${C}|v:${f}`:C},[x,f]),v=m.useRef([]),[y,S]=m.useState(0),E=m.useRef(new Map);return m.useEffect(()=>{if(!i)return;const C=()=>S(k=>k+1);return i.on("connect",C),()=>i.off("connect",C)},[i]),m.useEffect(()=>{v.current=x},[g,x]),m.useEffect(()=>{p.current.forEach(C=>URL.revokeObjectURL(C)),p.current.clear(),h({})},[g]),m.useEffect(()=>{if(!o){p.current.forEach(N=>URL.revokeObjectURL(N)),p.current.clear(),h({});return}if(!v.current.length||!i)return;let C=!1;const k=v.current,w=(N={},q)=>{if(C||!N.id||!q)return;const M=q.byteLength??q.length??0,O=Date.now(),K=E.current.get(N.id)||{count:0,totalBytes:0,lastLogAt:0},_={count:K.count+1,totalBytes:K.totalBytes+M,lastLogAt:K.lastLogAt};if(!_.lastLogAt||O-_.lastLogAt>=1e4){const U=_.count?_.totalBytes/_.count:0;console.log("[roverSnapshot]",N.id,`frame=${M}B`,`avg=${Math.round(U)}B`,`count=${_.count}`),_.lastLogAt=O}E.current.set(N.id,_);const H=new Blob([q],{type:"image/jpeg"}),z=URL.createObjectURL(H),V=p.current.get(N.id);V&&URL.revokeObjectURL(V),p.current.set(N.id,z),h(U=>({...U,[N.id]:{status:"playing",ts:N.ts||Date.now(),error:null,objectUrl:z}}))},j=(N={})=>{C||!N.id||h(q=>({...q,[N.id]:{...q[N.id]||{},status:N.error?"error":q[N.id]?.status||"connecting",error:N.error||null,ts:N.ts||q[N.id]?.ts||null,objectUrl:q[N.id]?.objectUrl||null}}))};return i.on("roverSnapshot:frame",w),i.on("roverSnapshot:status",j),i.emit("roverSnapshot:subscribe",{ids:k},(N={})=>{N.error}),()=>{C=!0,i.emit("roverSnapshot:unsubscribe",{ids:k}),i.off("roverSnapshot:frame",w),i.off("roverSnapshot:status",j),p.current.forEach(N=>URL.revokeObjectURL(N)),p.current.clear()}},[i,g,o,y]),d}const BA={iceServers:[{urls:"stun:stun.l.google.com:19302"},{urls:"turn:your.turn.server:3478",username:"user",credential:"pass"}],bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"};function OA(n){if(typeof btoa=="function")return btoa(n);if(typeof Buffer<"u")return Buffer.from(n).toString("base64");throw new Error("No base64 encoder available")}function LA(n){if(!n)return{};const s=`${n}:${n}`;return{Authorization:`Basic ${OA(s)}`}}class rx{constructor({url:s,token:i,video:o,onStatus:f,audioOnly:d=!1,receiveAudio:h=!0}){this.url=s,this.token=i,this.video=o,this.audioOnly=d,this.receiveAudio=h,this.pc=null,this.abortController=null,this.onStatus=f}notify(s,i){typeof this.onStatus=="function"&&this.onStatus(s,i)}configureVideoElement(){this.video&&(this.video.playsInline=!0,this.video.autoplay=!0,this.video.muted=!this.audioOnly,typeof this.video.disableRemotePlayback<"u"&&(this.video.disableRemotePlayback=!0),"latencyHint"in HTMLMediaElement.prototype&&(this.video.latencyHint="interactive"))}async start(){if(!this.url||!this.video)throw new Error("Media target missing");this.stop(),this.notify("connecting"),this.configureVideoElement(),this.abortController=new AbortController;const s=new RTCPeerConnection(BA);this.pc=s;const i=new MediaStream;s.ontrack=o=>{o.streams[0]?.getTracks().forEach(f=>i.addTrack(f)),this.video.srcObject=i,o.track?.kind==="video"&&"playoutDelayHint"in o.receiver&&(o.receiver.playoutDelayHint=0)},this.audioOnly?s.addTransceiver("audio",{direction:"recvonly"}):(s.addTransceiver("video",{direction:"recvonly"}),this.receiveAudio&&s.addTransceiver("audio",{direction:"recvonly"})),s.onconnectionstatechange=()=>{this.notify(s.connectionState)},s.oniceconnectionstatechange=()=>{const o=s.iceConnectionState;(o==="failed"||o==="disconnected")&&this.notify(o)};try{const o=await s.createOffer({offerToReceiveAudio:this.audioOnly?!0:this.receiveAudio,offerToReceiveVideo:!this.audioOnly});await s.setLocalDescription(o);const f=await fetch(this.url,{method:"POST",headers:{"Content-Type":"application/sdp",...LA(this.token)},body:o.sdp,signal:this.abortController.signal});if(!f.ok)throw new Error(`WHEP request failed: ${f.status}`);const d=await f.text();await s.setRemoteDescription({type:"answer",sdp:d}),s.getReceivers().forEach(h=>{"playoutDelayHint"in h&&(h.playoutDelayHint=0)}),await this.video.play().catch(()=>{}),this.notify("playing")}catch(o){throw this.notify("error",o.message),this.stop(),o}}stop(){this.abortController&&(this.abortController.abort(),this.abortController=null),this.pc&&(this.pc.getSenders().forEach(s=>s.track?.stop()),this.pc.getReceivers().forEach(s=>s.track?.stop()),this.pc.close(),this.pc=null),this.video&&(this.video.srcObject=null),this.notify("stopped")}}function Hf({sensors:n={},variant:s="full",size:i,overlay:o=!1}){const f=i||(s==="mini"?190:260),d=f/2,h=f*.07,p=d,x=d+h,g=d*.8,v=g-4,y=g+4,S=g-14,E=g-6,C=g*.65,k=n?.bumpsAndWheelDrops||{},w=n?.wheelOvercurrents||{},j=n?.wheelLeftCurrentMa??0,N=n?.wheelRightCurrentMa??0,q=n?.sideBrushCurrentMa??0,M=n?.mainBrushCurrentMa??0,O=6,K=k.bumpLeft?O:0,_=k.bumpRight?O:0,H=YA({count:6,totalSpan:140,gap:6,startAngle:-70}),z=["L","FL","CL","CR","FR","R"],V=[n?.lightBumpLeftSignal,n?.lightBumpFrontLeftSignal,n?.lightBumpCenterLeftSignal,n?.lightBumpCenterRightSignal,n?.lightBumpFrontRightSignal,n?.lightBumpRightSignal],U=H.map(($,T)=>({label:z[T],start:$.start,end:$.end,value:V[T]})),W=[{label:"Cliff L",start:-60,end:-46,value:n?.cliffLeftSignal,active:n?.cliffLeft},{label:"Cliff FL",start:-32,end:-16,value:n?.cliffFrontLeftSignal,active:n?.cliffFrontLeft},{label:"Cliff FR",start:16,end:32,value:n?.cliffFrontRightSignal,active:n?.cliffFrontRight},{label:"Cliff R",start:46,end:60,value:n?.cliffRightSignal,active:n?.cliffRight}],ce=V.filter($=>$!=null),oe=ce.length?Math.max(...ce,1200):1200;return r.jsxs("div",{className:`${o?"relative":"surface relative p-1"}`,style:o?{width:`${f}px`,height:`${f}px`}:{height:"100%",width:"100%",aspectRatio:"1 / 1"},children:[o?null:r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"absolute left-1 top-1 text-xs text-slate-400",children:"Top-down"}),r.jsxs("div",{className:"absolute right-1 top-1 text-[0.65rem] text-slate-500",children:["0–",oe]})]}),r.jsxs("svg",{width:"100%",height:"100%",viewBox:`0 0 ${f} ${f}`,preserveAspectRatio:"xMidYMid meet",className:"mx-auto block",children:[r.jsx("circle",{cx:p,cy:x,r:g,fill:"#0f172a",stroke:"#334155",strokeWidth:"2"}),r.jsx(ox,{cx:p-C,cy:x,current:j,drop:k.wheelDropLeft,overcurrent:w.leftWheel,label:"L"}),r.jsx(ox,{cx:p+C,cy:x,current:N,drop:k.wheelDropRight,overcurrent:w.rightWheel,label:"R"}),r.jsx(HA,{cx:p+g*.65,cy:x-g*.55,current:q,overcurrent:w.sideBrush}),r.jsx(VA,{cx:p,cy:x,current:M,overcurrent:w.mainBrush,variant:s,dirtLeft:n?.dirtDetectLeft,dirtRight:n?.dirtDetect}),U.map($=>{const T=$A($.value,oe),Y=y+4,I=Y+28;return r.jsx(zA,{cx:p,cy:x,rBase:I,rTip:Y,startDeg:$.start,endDeg:$.end,color:T,value:$.value,max:oe},$.label)}),W.map($=>{const T=GA($.value,$.active);return r.jsx(bf,{cx:p,cy:x,rInner:S,rOuter:E,startDeg:$.start,endDeg:$.end,color:T,opacity:1,pulse:!!$.active},$.label)}),r.jsx(bf,{cx:p,cy:x,rInner:v-K,rOuter:y-K,startDeg:-70,endDeg:-6,color:k.bumpLeft?"#ef4444":"#475569",opacity:1,pulse:!!k.bumpLeft}),r.jsx(bf,{cx:p,cy:x,rInner:v-_,rOuter:y-_,startDeg:6,endDeg:70,color:k.bumpRight?"#ef4444":"#475569",opacity:1,pulse:!!k.bumpRight})]})]})}function bf({cx:n,cy:s,rInner:i,rOuter:o,startDeg:f,endDeg:d,color:h,pulse:p=!1,opacity:x=1}){const g=(i+o)/2,v=o-i,y=UA(n,s,g,f,d);return r.jsxs(r.Fragment,{children:[r.jsx("path",{d:y,stroke:h,strokeWidth:v,strokeLinecap:"round",fill:"none",opacity:x}),p?r.jsx("path",{d:y,stroke:"#ef4444",strokeWidth:v,strokeLinecap:"round",fill:"none",className:"animate-pulse",opacity:1}):null]})}function zA({cx:n,cy:s,rBase:i,rTip:o,startDeg:f,endDeg:d,color:h,value:p,max:x}){const g=(f+d)/2,v=gi(n,s,o,g),y=ko(p!=null?p/(x||1):0),S=Math.pow(y,.35),E=i-(i-o)*S,C=gi(n,s,E,f),k=gi(n,s,E,d),w=`M ${v.x} ${v.y} L ${C.x} ${C.y} L ${k.x} ${k.y} Z`;return r.jsx("path",{d:w,fill:h,opacity:1,stroke:"none"})}function UA(n,s,i,o,f){let d=o,h=f;h<=d&&(h+=360);const p=gi(n,s,i,d),x=gi(n,s,i,h);return["M",p.x,p.y,"A",i,i,0,0,1,x.x,x.y].join(" ")}function gi(n,s,i,o){const f=Ug(o);return{x:n+i*Math.cos(f),y:s+i*Math.sin(f)}}function Ug(n){return(n-90)*Math.PI/180}function pd(n,s){if(s)return"#ef4444";const i=Math.abs(n);return i>900?"#f59e0b":i>300?"#22c55e":"#64748b"}function ko(n){return Math.max(0,Math.min(1,n))}function ox({cx:n,cy:s,current:i,drop:o,overcurrent:f,label:d}){const h=Math.abs(i),p=ko(h/1200),x=pd(i,f),g=56,v=14,y=9,S=3,E=g*p,C=d==="L"?-1:1,k=C*(-y/2-S/2),w=C*(v/2+S/2),j=v+y+S+2,N=g+4;return r.jsxs("g",{transform:`translate(${n},${s})`,children:[r.jsx("rect",{x:-j/2,y:-N/2,width:j,height:N,rx:"4",fill:"none",stroke:"#64748b",strokeWidth:"1"}),r.jsx("rect",{x:k-v/2,y:-g/2,width:v,height:g,fill:"#0f172a",stroke:"#0f172a",strokeWidth:"1",rx:"2"}),r.jsx("rect",{x:k-v/2,y:g/2-E,width:v,height:E,fill:x,className:f?"animate-pulse":""}),r.jsx("rect",{x:w-y/2,y:-g/2,width:y,height:g,fill:o?"#ef4444":"#475569",className:o?"animate-pulse":"",rx:"2"}),r.jsx("text",{x:0,y:g/2+10,textAnchor:"middle",className:"fill-slate-200 text-[0.7rem]",children:d})]})}function HA({cx:n,cy:s,current:i,overcurrent:o}){var f=Math.abs(i);f<10&&(f=0);const d=pd(i*3,o),h=43,p=f>0?.65:null;return r.jsxs("g",{style:{transformOrigin:`${n}px ${s}px`,animation:p?`spin ${p}s linear infinite`:"none",animationDirection:p?"reverse":"normal"},children:[r.jsx("circle",{cx:n,cy:s,r:10,fill:"#64748b",stroke:"#64748b",strokeWidth:"1"}),[0,120,240].map(g=>{const v=Ug(g),y=n+h*Math.cos(v),S=s+h*Math.sin(v);return r.jsx("line",{x1:n,y1:s,x2:y,y2:S,stroke:d,strokeWidth:"4",strokeLinecap:"round"},g)}),o?r.jsx("circle",{cx:n,cy:s,r:h+8,stroke:"#ef4444",strokeWidth:"3",fill:"none",className:"animate-pulse"}):null]})}function VA({cx:n,cy:s,current:i,overcurrent:o,variant:f,dirtLeft:d,dirtRight:h}){const p=Math.abs(i),x=pd(i,o),g=1,v=96,y=12,S=`main-brush-pattern-a-${f}`,E=`main-brush-pattern-b-${f}`,C=p>0?.6:null,k=i>=0?1:-1;return r.jsxs("g",{children:[r.jsx("defs",{children:[S,E].map((w,j)=>r.jsxs("pattern",{id:w,patternUnits:"userSpaceOnUse",width:"6",height:"6",children:[r.jsx("rect",{width:"6",height:"6",fill:x,opacity:g}),r.jsx("path",{d:"M0 6 L6 0",stroke:"#0f172a",strokeWidth:"1"}),C?r.jsx("animateTransform",{attributeName:"patternTransform",type:"translate",from:"0 0",to:`0 ${k*(j===0?6:-6)}`,dur:`${C}s`,repeatCount:"indefinite"}):null]},w))}),r.jsx("rect",{x:n-v/2,y:s-14,width:v,height:y,rx:"3",fill:`url(#${S})`,stroke:"#64748b",strokeWidth:"1"}),r.jsx("rect",{x:n-v/2,y:s+4,width:v,height:y,rx:"3",fill:`url(#${E})`,stroke:"#64748b",strokeWidth:"1"}),r.jsx("circle",{cx:n-v/4,cy:s-8,r:3.5,fill:"#fbbf24"}),r.jsx("circle",{cx:n+v/4,cy:s+8,r:3.5,fill:"#fbbf24"}),o?r.jsx("rect",{x:n-v/2-4,y:s-16,width:v+8,height:y*2+16,rx:"6",stroke:"#ef4444",strokeWidth:"3",fill:"none",className:"animate-pulse"}):null]})}function $A(n,s){if(n==null||n<=0)return"hsl(200 60% 18%)";const o=ko(n/(s||1));return`hsl(${(200+Math.pow(o,.45)*360)%360} 100% 60%)`}function GA(n,s){if(s)return"#ef4444";const i=ko(n==null?0:n/4095),o=[47,55,69],f=[245,158,11],[d,h,p]=o.map((x,g)=>Math.round(x+(f[g]-x)*i));return`rgb(${d}, ${h}, ${p})`}function YA({count:n,totalSpan:s,gap:i,startAngle:o}){const d=(s-i*(n-1))/n,h=[];let p=o;for(let x=0;x{s({hudMapDesktop:!!f})}]}const FA={discord:hg,kofi:V0,"ko-fi":V0,wiki:yj,throne:Sj},XA={discord:{backgroundImage:"linear-gradient(270deg,#5865F2,#404EED,#5865F2)",backgroundSize:"600% 600%",animation:"socialGradient 180s ease infinite"},kofi:{backgroundImage:"linear-gradient(270deg,#FF6433,#E04822,#FF6433)",backgroundSize:"600% 600%",animation:"socialGradient 170s ease infinite"},"ko-fi":{backgroundImage:"linear-gradient(270deg,#FF6433,#E04822,#FF6433)",backgroundSize:"600% 600%",animation:"socialGradient 170s ease infinite"},wiki:{backgroundImage:"linear-gradient(270deg,#EE8019,#C65C08,#EE8019)",backgroundSize:"600% 600%",animation:"socialGradient 180s ease infinite"},throne:{backgroundImage:"linear-gradient(270deg,#7C3AED,#5B21B6,#7C3AED)",backgroundSize:"600% 600%",animation:"socialGradient 180s ease infinite"}};function QA(){m.useEffect(()=>{if(typeof document>"u")return;const n="social-button-keyframes";if(document.getElementById(n))return;const s=document.createElement("style");s.id=n,s.textContent=` @keyframes socialGradient { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } - `,document.head.appendChild(s)},[])}function KA(n,s){return typeof n=="string"&&n.trim()?n.trim().toLowerCase():typeof s=="string"&&s.trim()?s.trim().toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,""):""}function xd({id:n,label:s,url:i,className:o=""}){if(!i)return null;QA();const f=KA(n,s),d=FA[f]||jj,h=XA[f]||null,p=s||n||"Link";return r.jsxs("a",{href:i,target:"_blank",rel:"noopener noreferrer","aria-label":p,className:`inline-flex items-center w-full px-0.5 py-0.5 text-sm font-medium text-white transition justify-center gap-1 rounded-md ${h?"":"bg-slate-700 hover:bg-slate-600"} ${o}`,style:h||void 0,children:[r.jsx(d,{className:"mr-0"}),p]})}const Ai=10;function Vg({batteryState:n=null,charge:s=null,config:i=null}){const o=n?.percentDisplay!=null&&Number.isFinite(n.percentDisplay)?Math.round(n.percentDisplay):null,f=n?.warnActive??null,d=n?.urgentActive??null,h=i?.Full??null,p=i?.Warn??null,x=i?.Urgent??null,g=s??n?.charge??null;let v=o;if(v==null&&(v=ZA({charge:g,full:h,warn:p,urgent:x})),v==null)return{available:!1};const y=Math.max(0,Math.min(1,v/100)),S=f??(p!=null&&g!=null&&g<=p),E=d??(x!=null&&g!=null&&g<=x);return{available:!0,percent:y,percentDisplay:v,warnActive:S,urgentActive:E,warnDisplayPercent:Ai}}function ZA({charge:n,full:s,warn:i,urgent:o}){if(n!=null&&s!=null&&i!=null&&o!=null&&s>i&&i>o){const f=Ai/100,d=1-f;if(n<=o)return 0;if(n<=i){const p=(n-o)/(i-o);return Math.round(Math.max(0,Math.min(1,p))*Ai)}if(n>=s)return 100;const h=(n-i)/(s-i);return Math.round((f+Math.max(0,Math.min(1,h))*d)*100)}return null}const IA=1600,JA=800;function Sn(...n){return n.filter(Boolean).join(" ")}function Vf({visual:n,orientation:s="horizontal",variant:i="inline",compact:o=!1,showLabel:f,className:d=""}){const h=i==="background",p=s==="vertical",x=f??!h;if(!n?.available){if(h){const W=Ai,oe=Sn("absolute z-10",p?"left-0 right-0 h-[2px]":"top-0 bottom-0 w-[2px]","bg-black/70",E&&!S&&"battery-tick-warn"),ce=p?{bottom:`${W}%`}:{left:`${W}%`},Y=Sn("absolute inset-0 pointer-events-none",d);return r.jsxs("div",{className:Y,children:[r.jsx("div",{className:"absolute inset-0 bg-slate-900/35"}),r.jsx("div",{className:oe,style:ce})]})}return p?null:r.jsx("p",{className:"text-xs text-slate-500",children:"Battery telemetry unavailable"})}const g=n.percentDisplay??0,v=Math.max(0,Math.min(100,g)),y=n.warnDisplayPercent??Ai,S=!!n.urgentActive,E=!!n.warnActive,C=S?`${JA}ms`:E?`${IA}ms`:void 0,w=h?S||E?"bg-red-500/45":"bg-emerald-500/45":S||E?"bg-red-500":"bg-emerald-500",j=S||E?"bg-red-900/35":"bg-slate-900/35",N=S||E?"bg-red-900/45":"bg-slate-900/35",q=Sn(h?"absolute inset-0 pointer-events-none":"relative pointer-events-auto",p&&!h?"flex flex-col items-center justify-center":"w-full",d);if(h){const W=p?{height:`${v}%`}:{width:`${v}%`},oe=Sn("absolute",p?"bottom-0 left-0 right-0":"left-0 top-0 bottom-0",w,"transition-[width,height]",S&&"battery-urgent-flash"),ce=Sn("absolute z-10",p?"left-0 right-0 h-[2px]":"top-0 bottom-0 w-[2px]","bg-black/70",E&&!S&&"battery-tick-warn"),Y=p?{bottom:`${y}%`}:{left:`${y}%`};return r.jsxs("div",{className:q,children:[r.jsx("div",{className:Sn("absolute inset-0",j,S&&"battery-urgent-flash")}),r.jsx("div",{className:oe,style:{...W,animationDuration:C}}),r.jsx("div",{className:ce,style:Y})]})}const M=Sn("relative overflow-hidden rounded-sm border border-slate-800",S||E?N:"bg-zinc-900/90",S&&"battery-urgent-flash",p?"w-full flex-1":o?"h-4":"h-5"),O=p?{height:`${v}%`}:{width:`${v}%`},K=Sn("absolute",p?"bottom-0 left-0 right-0":"left-0 top-0 bottom-0",w,"transition-[width,height]",S&&"battery-urgent-flash"),_=Sn("absolute z-10",p?"left-0 right-0 h-[2px]":"top-0 bottom-0 w-[2px]","bg-black/70",E&&!S&&"battery-tick-warn"),U=p?{bottom:`${y}%`}:{left:`${y}%`},z=`Battery ${g}%`,H=Sn("pointer-events-none absolute inset-0 flex items-center justify-center text-center font-semibold",p?o?"text-[0.55rem]":"text-[0.65rem]":"text-xs"),V=Sn("rounded px-1.5 py-0.5",h?"bg-black/30 text-slate-100":"bg-black/50 text-slate-100");return r.jsxs("div",{className:q,children:[r.jsxs("div",{className:M,children:[r.jsx("div",{className:K,style:{...O,animationDuration:C}}),r.jsx("div",{className:_,style:U})]}),x&&!p?r.jsx("div",{className:H,children:r.jsx("span",{className:V,children:z})}):null,x&&p?r.jsx("div",{className:"mt-0.5 text-[0.65rem] font-semibold text-slate-100",children:r.jsxs("span",{className:V,children:[g,"%"]})}):null]})}const cx=2e3,PA=3e3,WA=3e3,eN=40,tN=1e3;function Ni({sessionInfo:n,audioSessionInfo:s,videoMode:i="whep",snapshotFeed:o=null,qualityNotice:f=null,label:d,roverColor:h=null,forceMute:p=!1,telemetryFrame:x,batteryConfig:g,layoutFormat:v="desktop",hudVariant:y="default",driverLabel:S=null,hudForceMap:E=!1,hudMapPosition:C="top-center",hudLabelScale:k=1,fitParent:w=!1,overcurrentLimiter:j=null,showTurnCue:N=!1,turnTimerText:q=null,turnSeconds:M=null,isActiveDriver:O=!1,idleSkipSeconds:K=null}){const _=ft(ye=>ye.session),U=m.useRef(null),z=m.useRef(null),H=m.useRef(null),V=m.useRef(null),W=m.useRef(null),oe=m.useRef(null),ce=m.useRef(null),Y=m.useRef(null),[T,G]=m.useState("idle"),[I,ie]=m.useState(null),[de,R]=m.useState("idle"),[$,ee]=m.useState(null),[ae,me]=m.useState(0),[re,ue]=m.useState(0),[ve,be]=m.useState(!0),xe=!!s?.url,Be=i==="snapshot",ze=x?.sensors,{value:Ae}=He("audio",ct),tt=Number.isFinite(Ae?.masterVolume)?Ae.masterVolume:ct.masterVolume,Je=Number.isFinite(Ae?.roverVolume)?Ae.roverVolume:ct.roverVolume,vt=typeof Ae?.mainBrushDuckEnabled=="boolean"?Ae.mainBrushDuckEnabled:typeof Ae?.autoLevelEnabled=="boolean"?Ae.autoLevelEnabled:ct.mainBrushDuckEnabled,le=Number.isFinite(Ae?.mainBrushDuckAmount)?Math.max(0,Math.min(1,Ae.mainBrushDuckAmount)):ct.mainBrushDuckAmount,he=Math.max(0,Math.min(1,tt*Je)),se=ze?.batteryChargeMah??null,P=v==="desktop",fe=!P,Ne=fe?"top-right":C,[pt]=Hg(),Ve=E||fe?!0:pt,st=Vg({charge:se,config:g}),lt=ze?.wheelOvercurrents||null,Ot=lt==null?[]:Object.entries(lt).filter(([,ye])=>!!ye).map(([ye])=>ye),it=j?.caps||null,ds=j?.overcurrent?.groups||null,Yt=typeof window<"u"&&new URLSearchParams(window.location.search).has("debugAudio"),La=typeof window<"u"&&new URLSearchParams(window.location.search).has("debugHud"),Bo=m.useMemo(()=>{if(!it)return null;const ye=Number.isFinite(it?.drive?.cap)?it.drive.cap:1,Fe=Number.isFinite(it?.aux?.cap)?it.aux.cap:1;return Math.max(0,Math.min(1,1-Math.min(ye,Fe)))},[it]),Bn=!!j?.isActive,Nt=Ot.length?Ot:Bn?["limiter"]:[],Ft=Bo??(Ot.length?1:0),Mt=!!Nt.length,fa=!!((Number(ze?.mainBrushCurrentMa)||0)>eN||ze?.wheelOvercurrents?.mainBrush),Oo=vt&&fa?1-le:1,ms=Math.max(0,Math.min(1,he*Oo)),hs=vt&&fa&&le>0?`Volume decreased ${Math.round(le*1e3)/10}%`:null,za=m.useRef({hasDedicatedAudio:!1,audioUrl:null,mainBrushDuckEnabled:!1,mainBrushDuckAmount:0,mainBrushActive:!1,baseRoverGain:0,effectiveRoverGain:0});m.useEffect(()=>{za.current={hasDedicatedAudio:xe,audioUrl:s?.url||null,mainBrushDuckEnabled:vt,mainBrushDuckAmount:le,mainBrushActive:fa,baseRoverGain:he,effectiveRoverGain:ms}},[xe,s?.url,vt,le,fa,he,ms]);const Pe=m.useCallback((ye,Fe={})=>{if(!Yt)return;const Ze=z.current,ke=za.current,$e={event:ye,ts:Date.now(),roverLabel:d||null,hasDedicatedAudio:ke.hasDedicatedAudio,audioUrl:ke.audioUrl,mainBrushDuckEnabled:ke.mainBrushDuckEnabled,mainBrushDuckAmount:ke.mainBrushDuckAmount,mainBrushActive:ke.mainBrushActive,baseRoverGain:ke.baseRoverGain,effectiveRoverGain:ke.effectiveRoverGain,element:Ze?{muted:Ze.muted,volume:Ze.volume,paused:Ze.paused,ended:Ze.ended,readyState:Ze.readyState,networkState:Ze.networkState}:null,...Fe};try{console.log(`[AudioDebug] ${ye} ${JSON.stringify($e)}`)}catch{console.log("[AudioDebug]",ye,$e)}},[Yt,d]),On=_?.socials?.find(ye=>String(ye?.id||ye?.label||"").toLowerCase()==="discord")?.url||_?.discord?.invite||null;m.useEffect(()=>{La&&console.log("[OvercurrentHUD]",{overlayVisible:Mt,overlayMotors:Nt,overlayFill:Ft,limiterActive:Bn,limiterCaps:it,limiterGroups:ds,wheelOvercurrents:lt})},[La,Ft,Nt,Mt,Bn,it,ds,lt]),m.useEffect(()=>{Pe("settings/update")},[Pe]);const Cn=m.useCallback(()=>{clearTimeout(H.current),H.current=setTimeout(()=>me(Date.now()),cx)},[]),Ln=m.useCallback(()=>{clearTimeout(V.current),V.current=setTimeout(()=>ue(Date.now()),cx)},[]),ps=m.useCallback(async()=>{const ye=U.current;if(ye)try{ye.muted=!0,await ye.play()}catch{}},[]),ml=m.useCallback((ye=0)=>{if(p||xe)return;clearTimeout(oe.current);const Fe=()=>{clearTimeout(oe.current),oe.current=setTimeout(()=>{p||Ze()},PA)},Ze=async()=>{const ke=U.current;if(ke)try{await ps(),ke.muted=!1,await ke.play(),be(!1)}catch{ke.muted=!0,be(!0),Fe()}};oe.current=setTimeout(Ze,ye)},[ps,p,xe]);m.useEffect(()=>()=>{clearTimeout(H.current),clearTimeout(V.current),clearTimeout(oe.current),clearInterval(W.current),ce.current&&(cancelAnimationFrame(ce.current),ce.current=null)},[]),m.useEffect(()=>{T==="playing"&&ml(0)},[T,ml]),m.useEffect(()=>{Be&&(G("snapshot"),ie(null))},[Be]),m.useEffect(()=>{if(Be||!n?.url||!U.current)return;let ye=!0,Fe;const Ze=setTimeout(()=>be(!0),0),ke=($e,rt)=>{ye&&(Pe("video/status",{nextStatus:$e,info:rt||null}),G($e),ie(rt||null),$e==="playing"&&ps(),["error","failed","disconnected","closed"].includes($e)&&Cn())};return Fe=new rx({url:n.url,token:n.token,video:U.current,receiveAudio:!xe,onStatus:ke}),Fe.start().catch($e=>{ye&&(G("error"),ie($e.message),Cn())}),()=>{ye=!1,clearTimeout(Ze),Fe?.stop()}},[Be,n?.url,n?.token,ae,Cn,ps,xe,Pe]),m.useEffect(()=>{T==="stopped"&&n?.url&&Cn()},[T,n?.url,Cn]),m.useEffect(()=>{const ye=z.current;if(!ye||!s?.url){Pe("route/no-audio-url"),Y.current=null;return}const Fe=Math.max(0,Math.min(1,ms)),Ze=Y.current==null?Math.max(0,Math.min(1,ye.volume)):Y.current;if(ce.current&&(cancelAnimationFrame(ce.current),ce.current=null),Fe>Ze){const ke=performance.now(),$e=Ze,rt=Fe-$e,ot=wt=>{const nt=Math.min(1,(wt-ke)/tN),zn=$e+rt*nt;ye.volume=zn,Y.current=zn,nt<1?ce.current=requestAnimationFrame(ot):ce.current=null};ce.current=requestAnimationFrame(ot)}else ye.volume=Fe,Y.current=Fe;Pe("route/direct",{elementVolume:Fe,duckEnabled:vt,mainBrushActive:fa,duckAmount:le})},[s?.url,ms,vt,fa,le,Pe]),m.useEffect(()=>{if(!s?.url||!z.current)return;let ye=!0,Fe;const Ze=(ke,$e)=>{ye&&(Pe("audio/status",{nextStatus:ke,info:$e||null}),ee($e||(ke==="connected"?"connected":null)),R(rt=>ke==="connected"&&(rt==="playing"||rt==="connecting")||ke==="new"?rt:ke),["error","failed"].includes(ke)&&Ln())};return Fe=new rx({url:s.url,token:s.token,video:z.current,audioOnly:!0,onStatus:Ze}),Fe.start().catch(ke=>{ye&&(R("error"),ee(ke.message),Ln())}),()=>{ye=!1,Fe?.stop()}},[s?.url,s?.token,re,Ln,Pe]),m.useEffect(()=>{const ye=z.current;if(!s?.url||!ye){clearInterval(W.current);return}if(!["connecting","connected","playing","paused"].includes(de)){clearInterval(W.current);return}const Ze=async()=>{const ke=z.current;ke&&(ke.muted=!1,!(!ke.paused&&!ke.ended)&&(Pe("retry/play-attempt"),ke.play().then(()=>{Pe("retry/play-ok"),R($e=>$e==="connected"?"playing":$e),ee($e=>$e==="paused"?null:$e)}).catch($e=>{Pe("retry/play-fail",{error:$e?.message}),ee(rt=>rt||$e?.message||"autoplay blocked")})))};return Ze(),W.current=setInterval(Ze,WA),()=>clearInterval(W.current)},[s?.url,de,Pe]),m.useEffect(()=>{const ye=z.current;if(!ye)return;const Fe=()=>{Pe("element/play"),R(nt=>nt==="error"?nt:"playing"),ee(null)},Ze=()=>{Pe("element/pause"),R(nt=>["error","failed","disconnected","closed","stopped"].includes(nt)?nt:"paused"),ee(nt=>nt||"paused")},ke=()=>{Pe("element/ended"),R(nt=>nt==="error"?nt:"stopped"),ee(nt=>nt||"ended")},$e=()=>{const{error:nt}=ye,zn=nt?.message||"audio error";Pe("element/error",{error:zn}),R("error"),ee(zn)},rt=()=>Pe("element/waiting"),ot=()=>Pe("element/canplay"),wt=()=>Pe("element/stalled");return ye.addEventListener("play",Fe),ye.addEventListener("pause",Ze),ye.addEventListener("ended",ke),ye.addEventListener("error",$e),ye.addEventListener("waiting",rt),ye.addEventListener("canplay",ot),ye.addEventListener("stalled",wt),()=>{ye.removeEventListener("play",Fe),ye.removeEventListener("pause",Ze),ye.removeEventListener("ended",ke),ye.removeEventListener("error",$e),ye.removeEventListener("waiting",rt),ye.removeEventListener("canplay",ot),ye.removeEventListener("stalled",wt)}},[s?.url,Pe]);const hl=o?.error?`Error: ${o.error}`:o?.objectUrl?"snapshot":o?.status||"waiting",Ua=Be?hl:n?.url?T==="error"?`Error: ${I||"unknown"}`:I?`${T} (${I})`:T:"waiting",Lo=s?.error?`Error: ${s.error}`:s?.url?de==="error"?`Error: ${$||"unknown"}`:$?`${de} (${$})`:de:null,pl=y==="spectator",an=y==="none";return r.jsxs("div",{className:`flex flex-col gap-0.5 ${w?"h-full":""}`,children:[r.jsxs("div",{className:`relative w-full overflow-hidden bg-black ${w?"h-full flex-1":"aspect-[4/3]"}`,children:[Be?o?.objectUrl?r.jsx("img",{src:o.objectUrl,alt:d,className:"h-full w-full object-contain",draggable:!1}):r.jsx("div",{className:"flex h-full w-full items-center justify-center text-sm text-slate-300",children:"Waiting for frame…"}):r.jsx("video",{ref:U,muted:p||ve||xe,playsInline:!0,autoPlay:!0,controls:!1,className:"h-full w-full object-contain"}),r.jsx("audio",{ref:z,autoPlay:!0,hidden:!0}),!an&&N?r.jsx(sN,{mobileHud:fe,turnSeconds:M,isActiveDriver:O,idleSkipSeconds:K}):null,an?null:r.jsx(aN,{frame:x,sensors:ze,label:d,roverColor:h,status:Ua,audioStatus:Lo,levelStatus:hs,desktopLayout:P,layoutFormat:v,variant:y,driverLabel:S,battery:st,showTopDown:Ve,mobileHud:fe,mapPosition:Ne,turnTimerText:q,labelScale:k}),an?null:r.jsx(oN,{compact:fe}),!an&&La?r.jsx("div",{className:"pointer-events-none absolute left-1 top-1 z-40 rounded bg-black/80 px-1 py-0.5 text-[0.6rem] text-lime-200",children:`OC vis:${Mt?1:0} motors:${Nt.length} fill:${Math.round(Ft*100)}%`}):null,an?null:r.jsx(iN,{motors:Nt,fill:Ft,compact:fe}),an?null:r.jsx(rN,{battery:st,compact:fe}),!an&&pl&&st.available?r.jsx("div",{className:"pointer-events-none absolute right-1 top-1/2 flex h-[70%] -translate-y-1/2 flex-col items-center justify-center rounded bg-black/60 px-0.5 pb-1 pt-1",children:r.jsx(Vf,{visual:st,orientation:"vertical",variant:"inline",compact:fe,className:"h-full w-4"})}):null,!an&&f?r.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-1/2 -translate-y-1/2",children:r.jsxs("div",{className:`mx-auto w-fit rounded border border-amber-300/80 bg-black/75 text-amber-200 ${fe?"px-2 py-1 text-[0.6rem]":"px-3 py-1.5 text-sm"}`,children:[r.jsx("div",{className:"text-center",children:f}),r.jsx("div",{className:"pointer-events-auto mt-0",children:r.jsx(xd,{id:"discord",label:"Join our Discord server while you wait!",url:On})})]})}):null]}),!an&&!pl&&r.jsxs("div",{className:"space-y-0.5",children:[r.jsx(nN,{sensors:ze}),r.jsx("div",{className:"panel-section space-y-0.5 text-sm",children:r.jsx(Vf,{visual:st,compact:fe})})]})]})}function nN({sensors:n}){const s=[n?.lightBumpLeftSignal,n?.lightBumpFrontLeftSignal,n?.lightBumpCenterLeftSignal,n?.lightBumpCenterRightSignal,n?.lightBumpFrontRightSignal,n?.lightBumpRightSignal],i=s.filter(p=>p!=null).reduce((p,x)=>Math.max(p,x),1200),o=p=>Math.pow(Math.max(0,Math.min(1,(p??0)/i)),.35),f=p=>p==null||p<=0?"hsl(200 60% 18%)":`hsl(${(200+o(p)*360)%360} 100% 60%)`,d=6,h=12;return r.jsx("div",{className:"flex w-full items-center justify-center gap-0.5",children:s.map((p,x)=>{const g=o(p),v=xr.jsxs("span",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{className:"text-slate-400",children:re}),r.jsx("span",{className:"font-semibold text-white",children:ue})]},re))]})}),r.jsx("div",{className:`absolute ${V} left-1/2`,style:W,children:r.jsxs("div",{className:`flex items-center gap-0.5 bg-black/80 text-slate-100 ${O} ${K}`,children:[r.jsx("span",{className:"font-semibold text-white rounded px-1 py-[1px] border border-transparent",style:ca(o,.18),children:i||"Unnamed Rover"}),v?r.jsxs("span",{className:"text-slate-300",children:["• ",v]}):null]})})]}),S?r.jsx("div",{className:"pointer-events-none absolute rounded",style:{...T},children:r.jsx(Hf,{sensors:s,size:240,overlay:!0})}):null]})}return r.jsxs("div",{className:"pointer-events-none absolute inset-0 flex items-center justify-center",children:[r.jsx("div",{className:`absolute ${_} font-medium text-slate-100 ${q}`,children:r.jsxs("div",{className:"flex flex-col gap-0.5 leading-none",children:[r.jsxs("span",{children:["Status: ",f]}),d?r.jsxs("span",{children:["Audio: ",d]}):null,h?r.jsx("span",{className:"text-cyan-300",children:h}):null]})}),k?r.jsx("div",{className:`absolute left-1/2 top-0.5 -translate-x-1/2 rounded bg-black/70 text-slate-100 ${z} ${U}`,children:k}):null,r.jsx("div",{className:`absolute ${V} left-1/2`,style:W,children:r.jsx("div",{className:`flex gap-0.5 bg-black/80 text-slate-100 ${O} ${K}`,children:r.jsxs("span",{children:["Rover:"," ",r.jsxs("span",{className:"rounded px-1 py-[1px] border border-transparent",style:ca(o,.18),children:['"',i||"Unnamed Rover",'"']})]})})}),S&&g!=="spectator"?r.jsx("div",{className:"pointer-events-none absolute rounded",style:{...T},children:r.jsx(Hf,{sensors:s,size:240,overlay:!0})}):null]})}function sN({mobileHud:n=!1,turnSeconds:s=null,isActiveDriver:i=!1,idleSkipSeconds:o=null}){const f=n?"text-3xl":"text-5xl",d=n?"text-xs":"text-sm",h=n?"text-[0.55rem]":"text-[0.75rem]",p=n?"px-4 py-3":"px-6 py-4",x=i&&typeof o=="number";return r.jsx("div",{className:"pointer-events-none absolute inset-0 z-30 flex items-center justify-center bg-black/55",children:r.jsxs("div",{className:`flex flex-col items-center gap-0.5 rounded border border-amber-300/80 bg-black/70 ${p}`,children:[r.jsx("div",{className:`font-semibold text-amber-200 ${f}`,children:"IT IS YOUR TURN!"}),r.jsx("div",{className:`text-amber-200/80 ${d}`,children:"Start driving!"}),x?r.jsxs("div",{className:`text-red-100/90 ${h}`,children:["Idle skip in ",o,"s"]}):null]})})}const lN={leftWheel:"Left wheel",rightWheel:"Right wheel",mainBrush:"Main brush",sideBrush:"Side brush",limiter:"Overcurrent limit"};function iN({motors:n,fill:s=0,compact:i=!1}){if(!n?.length)return null;const o=n.map(v=>lN[v]||v),f=i?"w-[12rem] h-[3.5rem]":"w-[20rem] h-[7rem]",d=i?"px-2 py-1":"px-4 py-2",h=i?"text-lg":"text-4xl",p=i?"text-xs":"text-xl",x=Math.max(0,Math.min(1,s)),g=`${Math.round(x*100)}%`;return r.jsx("div",{className:`pointer-events-none absolute flex items-center justify-center bg-red-900/50 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 ${f}`,children:r.jsxs("div",{className:"relative h-full w-full",children:[r.jsx("div",{className:"absolute inset-0 overflow-hidden",children:r.jsx("div",{className:"h-full bg-red-700/60",style:{width:g}})}),r.jsxs("div",{className:`relative z-10 flex h-full w-full flex-col items-center justify-center text-center font-semibold text-white animate-pulse ${h} ${d}`,children:[r.jsx("div",{children:"OVERCURRENT"}),r.jsx("div",{className:`mt-0 font-medium text-white ${p}`,children:o.join(", ")})]})]})})}function rN({battery:n,compact:s=!1}){if(!n?.available||!n.warnActive&&!n.urgentActive)return null;const i=n.urgentActive?"BATTERY VERY LOW, DOCK THE ROVER AND CHARGE IMMEDIATELY!!":"Battery low! please dock and charge the rover soon.",o=s?"p-2 top-6":"p-4 top-10",f=s?"text-sm":"text-2xl";return r.jsx("div",{className:`pointer-events-none absolute flex items-center justify-center bg-amber-900/60 left-1/2 -translate-x-1/2 ${o}`,children:r.jsx("div",{className:`text-center font-semibold text-white animate-pulse ${f}`,children:r.jsx("div",{children:i})})})}function oN({compact:n=!1}){const s=ft(_=>_.session),{sendMessage:i,onInputFocus:o,onInputBlur:f,blurChat:d,registerInputRef:h,setTypingActive:p}=cd(),{value:x}=He("tts",{engine:"flite",voice:"rms",pitch:50}),[g,v]=m.useState(""),[y,S]=m.useState(!1),E=s?.role!=="spectator",C=s?.role==="spectator",k=s?.assignment?.roverId||null,j=!!m.useMemo(()=>s?.roster?.find(_=>String(_.id)===String(k))||null,[k,s?.roster])?.audio?.ttsEnabled,N=m.useMemo(()=>{if(!j)return null;const _=x?.engine==="espeak"?"espeak":"flite";if(_==="espeak"){let z=Number.isFinite(x?.pitch)?Math.round(x.pitch):void 0;return typeof z=="number"&&(z=Math.max(0,Math.min(99,z))),{speak:!0,engine:_,pitch:z}}const U=typeof x?.voice=="string"?x.voice:void 0;return{speak:!0,engine:_,voice:U}},[x?.engine,x?.pitch,x?.voice,j]),q=n?"pointer-events-auto absolute bottom-0.5 right-0.5 flex w-[9rem] max-w-[70vw] items-center gap-0.5 rounded bg-black/70 px-0.4 py-0.2":"pointer-events-auto absolute bottom-1 right-1 flex w-[12rem] max-w-[70vw] items-center gap-0.5 rounded bg-black/70 px-0.5 py-0.25",M=n?"min-w-0 flex-1 bg-transparent text-[0.55rem] text-slate-100 placeholder:text-slate-400 focus:outline-none":"min-w-0 flex-1 bg-transparent text-[0.7rem] text-slate-100 placeholder:text-slate-400 focus:outline-none",O=n?"rounded bg-cyan-500/80 px-0.35 py-0.2 text-[0.55rem] font-semibold text-black disabled:opacity-50":"rounded bg-cyan-500/80 px-0.5 py-0.25 text-[0.7rem] font-semibold text-black disabled:opacity-50";async function K(_){if(_.preventDefault(),!E)return;const U=g.trim();if(U){S(!0);try{await i(U,N),v(""),d(),p(!1)}catch(z){alert(z.message)}finally{S(!1)}}}return C?null:r.jsxs("form",{onSubmit:K,className:q,children:[r.jsx("input",{className:M,value:g,onChange:_=>{const U=_.target.value;v(U),p(!!U.trim())},onFocus:_=>{o(_),p(!!g.trim())},onBlur:_=>{f(_),p(!1)},onKeyDown:_=>{_.key==="Enter"&&!g.trim()&&(_.preventDefault(),d(),p(!1))},ref:_=>h(_,{target:"hud"}),placeholder:E?"Chat (TTS)":"Spectator",disabled:!E}),r.jsx("button",{type:"submit",disabled:!E||y,className:O,children:"Speak"})]})}function gd({layoutFormat:n="desktop"}){const s=ft(ae=>ae.session),{state:{song:i,lastControlIntentAt:o},overcurrentLimiter:f}=_t(),[d,h]=m.useState(()=>Date.now()),[p,x]=m.useState(!1),[g,v]=m.useState(null),y=m.useRef({active:!1,roverId:null});m.useEffect(()=>{if(s?.mode!=="turns")return;const ae=setInterval(()=>h(Date.now()),250);return()=>clearInterval(ae)},[s?.mode]);const S=s?.assignment?.roverId,C=!!(S&&s?.roster?s.roster.find(ae=>String(ae.id)===String(S)):null)?.media?.audioPublishUrl,k=S?s?.turnQueues?.[S]:null,w=s?.socketId||null,j=S?s?.activeDrivers?.[S]:null,N=!!(w&&j===w),q=m.useMemo(()=>{const ae=k?.queue||[];if(!ae.length||!k?.current||ae.length<=1)return null;const me=ae.findIndex(re=>re===k.current);return me===-1?ae[0]||null:ae[(me+1)%ae.length]||null},[k?.queue,k?.current]),M=!!(w&&q===w),O=k?.deadline||null,K=k?.idleDeadline||null,_=O?O-d:null,U=K?K-d:null,z=s?.mode==="turns"&&M&&_!=null&&_<=5e3&&_>0,H=s?.mode!=="turns"||N||z,V=_!=null&&Number.isFinite(_)?Math.max(0,Math.ceil(_/1e3)):null,W=U!=null&&Number.isFinite(U)?Math.max(0,Math.ceil(U/1e3)):null,oe=N?V!=null?`${V}s left`:null:M&&V!=null?`Your turn in ${V}s`:null,ce=S?[...H?[{type:"rover",id:S,key:S}]:[],...C?[{type:"rover",id:`${S}-audio`,key:`${S}-audio`}]:[]]:[],Y=ji(ce),T=S&&H?Y[S]:null,G=S&&C?Y[`${S}-audio`]:null,I=hd(S?[S]:[],{enabled:!!S,version:s?.mode}),ie=S&&I[S]||null,de=dl(S),R=S&&s?.roster?s.roster.find(ae=>String(ae.id)===String(S)):null,$=R?.battery??null,ee=R?.name||(S?`Rover ${S}`:"");return m.useEffect(()=>{if(s?.mode!=="turns"){x(!1),v(null),y.current={active:!1,roverId:null};return}const ae=y.current,me=N&&!ae.active,re=N&&S&&S!==ae.roverId;me||re?(x(!0),v(Date.now())):!N&&ae.active&&(x(!1),v(null)),y.current={active:N,roverId:S}},[N,S,s?.mode]),m.useEffect(()=>{!p||!g||o>g&&x(!1)},[o,g,p]),r.jsx("section",{className:"panel",children:S?r.jsx(Ni,{sessionInfo:T,videoMode:H?"whep":"snapshot",snapshotFeed:ie,audioSessionInfo:G,label:ee,roverColor:R?.color||null,telemetryFrame:de,batteryConfig:$,layoutFormat:n,overcurrentLimiter:f,songNote:i?.note,qualityNotice:H?null:"Preview feed (low FPS) until your turn.",showTurnCue:p,turnTimerText:oe,turnSeconds:V,isActiveDriver:N,idleSkipSeconds:W}):r.jsxs("div",{className:"panel-muted content-center text-center text-sm text-slate-400 aspect-[4/3]",children:[r.jsx("p",{children:"You are not assigned to a rover."}),r.jsx("p",{className:"mt-0",children:r.jsx("a",{href:"/spectate",className:"text-blue-400 underline hover:text-blue-500",children:"Click here to visit the spectator page."})})]})})}function yo({label:n,tone:s="muted"}){const i=s==="success"?"bg-emerald-900 text-emerald-100":s==="warn"?"bg-amber-900 text-amber-100":"bg-slate-800 text-slate-200";return r.jsx("span",{className:`rounded px-1 py-0.5 text-xs font-semibold leading-none ${i}`,children:n})}function Mo(n){if(!Number.isFinite(n))return 0;const s=n%360;return s<0?s+360:s}function cN(n){if(!Array.isArray(n)||n.length<3)return 0;const[s,i,o]=n,f=Math.max(0,Math.min(255,Number(s)))/255,d=Math.max(0,Math.min(255,Number(i)))/255,h=Math.max(0,Math.min(255,Number(o)))/255,p=Math.max(f,d,h),x=Math.min(f,d,h),g=p-x;if(g===0)return 0;let v=0;return p===f?v=(d-h)/g%6:p===d?v=(h-f)/g+2:v=(f-d)/g+4,Mo(Math.round(v*60))}function ux(n){const s=Mo(n),i=1,o=1-Math.abs(s/60%2-1);let f=0,d=0,h=0;return s<60?(f=i,d=o):s<120?(f=o,d=i):s<180?(d=i,h=o):s<240?(d=o,h=i):s<300?(f=o,h=i):(f=i,h=o),[Math.round(f*255),Math.round(d*255),Math.round(h*255)]}function fx(n){return n?Array.isArray(n.hsColor)?Mo(Number(n.hsColor[0])):Array.isArray(n.rgbColor)?cN(n.rgbColor):0:0}function uN({entity:n,connected:s,controlsLocked:i,onToggle:o,onSetColor:f,onSetWhite:d}){const h=n.state==="unavailable"||!n.available,p=n.state==="on",x=n.type==="light"&&n.supportsColor,g=h?"warn":p?"success":"muted",v=h?"Unavailable":p?"On":"Off",y=i||!s||h,S=y||!x,[E,C]=m.useState(()=>fx(n)),k=m.useRef(E),w=m.useRef(!1),j=h?"border-slate-800 bg-slate-900 text-slate-400 cursor-not-allowed":i?"border-slate-800 bg-slate-900 text-slate-300 cursor-not-allowed":p?"border-emerald-700 bg-emerald-900/80 text-emerald-50 hover:bg-emerald-800":"border-rose-800 bg-rose-900/80 text-rose-50 hover:bg-rose-800";m.useEffect(()=>{if(!x||w.current)return;const U=fx(n);k.current=U,C(U)},[n.rgbColor,n.hsColor,x]);const N=U=>{const z=Mo(Number(U.target.value));k.current=z,C(z)},q=()=>{S||!f||f(n.id,ux(k.current))},M=U=>{U.stopPropagation()},O=U=>{M(U),!(S||!d)&&d(n.id)},_=`rgb(${(x?ux(k.current):[255,255,255]).join(",")})`;return r.jsxs("button",{type:"button",onClick:()=>o(n.id),disabled:y,className:`relative flex min-w-[12rem] flex-[1_1_12rem] items-start justify-between gap-0.5 rounded px-1 py-0.5 text-left transition-colors ${j} disabled:opacity-60 disabled:hover:bg-inherit`,children:[r.jsxs("div",{className:"min-w-0 flex-1",children:[r.jsxs("div",{className:"flex items-center gap-0.5 text-sm leading-normal",children:[r.jsx("span",{className:"truncate font-semibold text-white",children:n.name||n.id}),x&&r.jsxs(r.Fragment,{children:[r.jsx(yo,{label:v,tone:g}),!s&&r.jsx("span",{className:"text-xs text-amber-200",children:"Offline"})]})]}),x?r.jsx("div",{className:"-mt-0.5 w-full",onClick:M,onPointerDown:U=>{M(U),w.current=!0},onPointerUp:U=>{M(U),w.current=!1,q()},onPointerCancel:U=>{M(U),w.current=!1,q()},onKeyUp:U=>{M(U),q()},onBlur:q,children:r.jsx("div",{className:"relative w-full",children:r.jsx("input",{type:"range",min:"0",max:"360",step:"1",value:E,onChange:N,disabled:S,"aria-label":`Set color for ${n.name||n.id}`,className:"ha-hue-slider w-full"})})}):r.jsxs("div",{className:"flex items-center gap-0.5 text-xs text-slate-400",children:[r.jsx(yo,{label:v,tone:g}),!s&&r.jsx("span",{className:"text-amber-200",children:" · Offline"})]})]}),x&&r.jsxs("div",{className:"absolute right-1 top-1 flex items-center gap-0.5",children:[r.jsx("span",{role:"button",tabIndex:S?-1:0,onClick:O,onPointerDown:M,onKeyDown:U=>{S||(U.key==="Enter"||U.key===" ")&&(U.preventDefault(),O(U))},title:"Set white color temperature","aria-label":`Set ${n.name||n.id} to white`,"aria-disabled":S,className:`inline-flex items-center justify-center rounded border border-slate-200 bg-white px-1 py-0.5 text-xs font-semibold leading-none text-slate-900 ${S?"cursor-not-allowed opacity-60":"cursor-pointer hover:bg-slate-100"}`,children:"white"}),r.jsx("span",{className:"pointer-events-none h-2.5 w-2.5 rounded-full border border-white/60",style:{backgroundColor:_}})]}),!x&&r.jsx("div",{className:"self-center text-xs font-semibold text-white/90",children:p?"Turn off":"Turn on"})]})}function $g(){const{state:{keymap:n}}=_t(),s=ft(E=>E.session),{homeAssistantToggle:i,homeAssistantSetLightColor:o,homeAssistantSetLightWhite:f}=wn(),d=s?.homeAssistant,h=m.useMemo(()=>d?.entities||[],[d?.entities]),p=d?.lightPolicy||null,x=!!(p?.locked||p?.lockedOn),g=p?.lockState||(p?.lockedOn?"on":null),v=An(n?.homeAssistantOn?.[0]),y=An(n?.homeAssistantOff?.[0]);if(!d?.enabled)return r.jsxs("section",{className:"panel-section space-y-0.5 text-sm text-slate-400",children:[r.jsx("p",{className:"text-slate-300",children:"Room Controls"}),r.jsx("p",{className:"text-slate-500",children:"Not configured on the server."})]});if(h.length===0)return r.jsxs("section",{className:"panel-section space-y-0.5 text-sm text-slate-400",children:[r.jsx("p",{className:"text-slate-300",children:"Room Controls"}),r.jsx("p",{className:"text-slate-500",children:"No lights or switches configured."})]});const S=!!d?.connected;return r.jsxs("section",{className:"panel-section space-y-0.5 text-base",children:[r.jsxs("header",{className:"flex items-center justify-between gap-0.5 text-sm text-slate-400",children:[r.jsxs("div",{className:"flex items-center gap-0.5",children:[r.jsx("p",{children:"Room Controls"}),r.jsx("span",{className:"text-xs text-slate-500",children:h.length}),x?r.jsx(yo,{label:g==="off"?"Locked Off":"Locked On",tone:"warn"}):null,r.jsxs("div",{className:"flex items-center gap-0.5 text-xs text-slate-300 background-black",children:[r.jsxs("span",{className:"flex items-center gap-0.5",children:[r.jsx("span",{children:"On"}),v?r.jsx(dx,{label:v}):null]}),r.jsxs("span",{className:"flex items-center gap-0.5",children:[r.jsx("span",{children:"Off"}),y?r.jsx(dx,{label:y}):null]})]})]}),r.jsx(yo,{label:S?"Connected":"Offline",tone:S?"success":"warn"})]}),x?r.jsx("p",{className:"rounded border border-amber-600/60 bg-amber-900/40 px-1 py-0.5 text-xs text-amber-100",children:g==="off"?"Lights are locked off. Room controls are disabled.":"Lights are locked on. Room controls are disabled."}):null,r.jsx("div",{className:"flex flex-wrap gap-0.5",children:h.map(E=>r.jsx(uN,{entity:E,connected:S,controlsLocked:x,onToggle:i,onSetColor:o,onSetWhite:f},E.id))})]})}function dx({label:n}){return n?r.jsx("span",{className:"rounded border border-white/40 px-1 text-[0.7rem] text-white",children:n}):null}function Gg(){const{login:n,setRole:s}=wn(),[i,o]=m.useState(""),[f,d]=m.useState(""),[h,p]=m.useState(!1);async function x(g){g.preventDefault(),p(!0);try{await n(i,f),o(""),d("")}catch(v){alert(v.message)}finally{p(!1)}}return r.jsxs("div",{className:"panel-section space-y-0.5 text-base",children:[r.jsx("p",{className:"text-sm text-slate-400",children:"Admin login"}),r.jsxs("form",{className:"flex flex-col gap-0.5",onSubmit:x,children:[r.jsx("input",{className:"field-input",placeholder:"Username",value:i,onChange:g=>o(g.target.value)}),r.jsx("input",{className:"field-input",placeholder:"Password",type:"password",value:f,onChange:g=>d(g.target.value)}),r.jsx("button",{type:"submit",disabled:h,className:"button-dark w-full disabled:opacity-50",children:h?"Logging in…":"Login"})]})]})}function mx(...n){return n.filter(Boolean).join(" ")}function fN(n){const s=n?.batteryState?.percentDisplay;return s==null?"--":`${s}%`}function dN(n){return n?.batteryState?n.batteryState.urgentActive?"text-red-400":n.batteryState.warnActive?"text-amber-300":"text-emerald-300":"text-slate-400"}function mN({title:n,roster:s=[],emptyText:i="No roster data.",renderActions:o=null}){return r.jsxs("div",{className:"space-y-0.5 text-sm",children:[n&&r.jsx("p",{className:"text-sm text-slate-400",children:n}),s.length===0?r.jsx("p",{className:"text-sm text-slate-500",children:i}):r.jsx("ul",{className:"space-y-0.5 text-sm",children:s.map(f=>{const d=!!(f?.private?.enabled&&f?.private?.open),h=!!f?.locked;return r.jsxs("li",{className:mx("surface flex flex-wrap items-center justify-between gap-0.5",h?"bg-red-900/40":d?"bg-amber-700/35 border border-amber-200/30":null),children:[r.jsxs("div",{children:[r.jsx("p",{className:"text-slate-200",children:r.jsx("span",{className:"rounded px-1 py-[1px] border border-transparent",style:ca(f.color,.16),children:f.name})}),r.jsxs("p",{className:"text-xs text-slate-500 flex flex-wrap items-center gap-0.5",children:[r.jsx("span",{children:f.locked?"locked":"free"}),f.lockReason&&r.jsx("span",{className:"rounded bg-black/30 px-1",children:f.lockReason}),r.jsxs("span",{className:mx("font-semibold",dN(f)),children:["Battery ",fN(f)]})]})]}),o?o(f):null]},f.id)})})]})}const hN=[{key:"open",label:"Open"},{key:"turns",label:"Turns"},{key:"admin",label:"Admin"},{key:"lockdown",label:"Lockdown"}];function pN(){const{session:n,lockRover:s,setMode:i,requestControl:o,setCommunityGoal:f,setAdminReason:d,rebootRover:h,rebootServer:p,setAudioLevels:x,setPrivateSafety:g,llmControl:v,adminLogs:y,llmCommentaryState:S}=nn(),E=m.useMemo(()=>n?.roster??[],[n?.roster]),[C,k]=m.useState({}),[w,j]=m.useState({}),[N,q]=m.useState(!1),[M,O]=m.useState(!1),K=n?.health||null,_=n?.communityGoal?.text||"",U=n?.communityGoal?.updatedAt||null,[z,H]=m.useState(_),V=n?.adminReason?.text||"",W=n?.adminReason?.updatedAt||null,[oe,ce]=m.useState(V),Y=n?.audioLevels||{},[T,G]=m.useState({hornGain:Number.isFinite(Y.hornGain)?Y.hornGain:1,ttsGain:Number.isFinite(Y.ttsGain)?Y.ttsGain:1,forwardGain:Number.isFinite(Y.forwardGain)?Y.forwardGain:1}),[I,ie]=m.useState({}),de=n?.role==="admin"||n?.role==="lockdown"||n?.role==="lockdown-admin",R=n?.role==="lockdown"||n?.role==="lockdown-admin",$=n?.mode??"open",ee=async(se,P)=>{try{await s(se,P),k(fe=>({...fe,[se]:P}))}catch(fe){alert(fe.message)}},ae=async se=>{const P=se.target.value;try{await i(P)}catch(fe){alert(fe.message)}},me=async se=>{try{await o(se,{force:!0})}catch(P){alert(P.message)}},re=async se=>{if(!(!se?.id||!window.confirm(`Reboot rover "${se.name||se.id}" now?`))){j(fe=>({...fe,[se.id]:!0}));try{await h(se.id)}catch(fe){alert(fe.message)}finally{j(fe=>({...fe,[se.id]:!1}))}}},ue=async()=>{if(window.confirm("Reboot the server host now? This will disconnect all users.")){q(!0);try{await p()}catch(P){alert(P.message),q(!1)}}},ve=async()=>{if(window.confirm("Clear LLM commentary history now? This resets chat context, bot memory, and rover activity metrics for narration.")){O(!0);try{await v("clearHistory")}catch(P){alert(P.message)}finally{O(!1)}}},be=async()=>{try{await f(z)}catch(se){alert(se.message)}},xe=async()=>{try{await f(null)}catch(se){alert(se.message)}},Be=async()=>{try{await d(oe)}catch(se){alert(se.message)}},ze=async()=>{try{await d(null)}catch(se){alert(se.message)}},Ae=se=>P=>{const fe=Number(P.target.value);G(Ne=>({...Ne||{},[se]:Number.isFinite(fe)?fe:1}))},tt=async()=>{try{await x(T)}catch(se){alert(se.message)}},Je=async()=>{window.dispatchEvent(new CustomEvent("buttonBox:rewardRunLocalTest",{detail:{rewardName:"Admin Mode",count:1e3,goal:1e3}}))};m.useEffect(()=>{H(_)},[_]),m.useEffect(()=>{ce(V)},[V]),m.useEffect(()=>{G({hornGain:Number.isFinite(Y.hornGain)?Y.hornGain:1,ttsGain:Number.isFinite(Y.ttsGain)?Y.ttsGain:1,forwardGain:Number.isFinite(Y.forwardGain)?Y.forwardGain:1})},[Y.forwardGain,Y.hornGain,Y.ttsGain]),m.useEffect(()=>{const se={};(E||[]).forEach(P=>{P?.private?.enabled&&(se[P.id]={speedLimitEnabled:!!P?.private?.safety?.speedLimitEnabled,speedLimitMaxWheelSpeed:Number.isFinite(P?.private?.safety?.speedLimitMaxWheelSpeed)?P.private.safety.speedLimitMaxWheelSpeed:250,hardOvercurrentEnabled:!!P?.private?.safety?.hardOvercurrentEnabled,overcurrentStopMs:Number.isFinite(P?.private?.safety?.overcurrentStopMs)?P.private.safety.overcurrentStopMs:300,hardBumpEnabled:!!P?.private?.safety?.hardBumpEnabled,bumpBackoffSpeed:Number.isFinite(P?.private?.safety?.bumpBackoffSpeed)?P.private.safety.bumpBackoffSpeed:250,bumpBackoffMs:Number.isFinite(P?.private?.safety?.bumpBackoffMs)?P.private.safety.bumpBackoffMs:350,cliffEnabled:!!P?.private?.safety?.cliffEnabled,cliffBackoffSpeed:Number.isFinite(P?.private?.safety?.cliffBackoffSpeed)?P.private.safety.cliffBackoffSpeed:250,cliffBackoffMs:Number.isFinite(P?.private?.safety?.cliffBackoffMs)?P.private.safety.cliffBackoffMs:500,triggerCooldownMs:Number.isFinite(P?.private?.safety?.triggerCooldownMs)?P.private.safety.triggerCooldownMs:800})}),ie(se)},[E]);const vt=m.useMemo(()=>{const se={};return E.forEach(P=>{se[P.id]=C[P.id]??P.locked}),se},[E,C]),le=(se,P={})=>{ie(fe=>({...fe||{},[se]:{...fe?.[se]||{},...P||{}}}))},he=async se=>{try{const P=I?.[se];if(!P)return;await g(se,P)}catch(P){alert(P.message)}};return de?r.jsxs("section",{className:"panel-section space-y-0.5 text-base",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5 text-sm",children:[r.jsx("span",{children:"Admin controls"}),r.jsx("select",{value:$,onChange:ae,className:"field-input text-sm",children:hN.map(se=>r.jsx("option",{value:se.key,children:se.label},se.key))})]}),r.jsxs("div",{className:"flex gap-0.5 text-xs",children:[r.jsx("button",{type:"button",onClick:ue,disabled:N,className:"button-danger disabled:cursor-not-allowed disabled:opacity-60",children:N?"Server rebooting...":"Reboot Server"}),r.jsx("button",{type:"button",onClick:Je,className:"button-dark",children:"Test Reward Popup"})]}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-400",children:[r.jsx("span",{children:"Global audio levels"}),n?.audioLevels?.updatedAt?r.jsxs("span",{children:["Updated ",new Date(n.audioLevels.updatedAt).toLocaleString()]}):null]}),r.jsxs("label",{className:"grid gap-0.5 text-xs text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{children:"Horn gain"}),r.jsxs("span",{children:[T.hornGain.toFixed(2),"x"]})]}),r.jsx("input",{type:"range",min:"0",max:"4",step:"0.01",value:T.hornGain,onChange:Ae("hornGain"),className:"w-full accent-emerald-500"})]}),r.jsxs("label",{className:"grid gap-0.5 text-xs text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{children:"TTS gain"}),r.jsxs("span",{children:[T.ttsGain.toFixed(2),"x"]})]}),r.jsx("input",{type:"range",min:"0",max:"4",step:"0.01",value:T.ttsGain,onChange:Ae("ttsGain"),className:"w-full accent-emerald-500"})]}),r.jsxs("label",{className:"grid gap-0.5 text-xs text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{children:"Forward gain"}),r.jsxs("span",{children:[T.forwardGain.toFixed(2),"x"]})]}),r.jsx("input",{type:"range",min:"0",max:"4",step:"0.01",value:T.forwardGain,onChange:Ae("forwardGain"),className:"w-full accent-emerald-500"})]}),r.jsx("div",{className:"flex gap-0.5 text-xs",children:r.jsx("button",{type:"button",onClick:tt,className:"button-dark",children:"Apply audio levels"})})]}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-400",children:[r.jsx("span",{children:"Community goal"}),U?r.jsxs("span",{children:["Updated ",new Date(U).toLocaleString()]}):null]}),r.jsx("input",{type:"text",value:z,onChange:se=>H(se.target.value),placeholder:"Set a community goal",className:"field-input text-sm"}),r.jsxs("div",{className:"flex gap-0.5 text-xs",children:[r.jsx("button",{type:"button",onClick:be,className:"button-dark",children:"Set goal"}),r.jsx("button",{type:"button",onClick:xe,className:"button-danger",children:"Clear"})]})]}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-400",children:[r.jsx("span",{children:"Admin mode reason"}),W?r.jsxs("span",{children:["Updated ",new Date(W).toLocaleString()]}):null]}),r.jsx("textarea",{value:oe,onChange:se=>ce(se.target.value),placeholder:"Set an admin mode reason",className:"field-input text-sm min-h-[3.5rem]"}),r.jsxs("div",{className:"flex gap-0.5 text-xs",children:[r.jsx("button",{type:"button",onClick:Be,className:"button-dark",children:"Set reason"}),r.jsx("button",{type:"button",onClick:ze,className:"button-danger",children:"Clear"})]})]}),r.jsx(mN,{roster:E,renderActions:se=>r.jsxs("div",{className:"flex flex-wrap items-center gap-0.5 text-xs",children:[r.jsx("button",{type:"button",onClick:()=>ee(se.id,!vt[se.id]),className:"button-dark",children:vt[se.id]?"Unlock":"Lock"}),r.jsx("button",{type:"button",onClick:()=>me(se.id),className:"button-dark",children:"Force"}),r.jsx("button",{type:"button",onClick:()=>re(se),disabled:!!w[se.id],className:"button-danger disabled:cursor-not-allowed disabled:opacity-60",children:w[se.id]?"Rebooting...":"Reboot"}),se?.private?.enabled?r.jsxs("div",{className:"w-full rounded border border-slate-700/70 p-0.5 space-y-0.5 text-[0.7rem]",children:[r.jsx("div",{className:"text-slate-300",children:"Private safety"}),r.jsxs("label",{className:"flex items-center gap-0.5",children:[r.jsx("input",{type:"checkbox",checked:!!I?.[se.id]?.speedLimitEnabled,disabled:!R,onChange:P=>le(se.id,{speedLimitEnabled:!!P.target.checked})}),r.jsx("span",{children:"Speed limit"})]}),r.jsx("input",{type:"number",min:"1",max:"500",className:"field-input text-xs w-20",disabled:!R,value:I?.[se.id]?.speedLimitMaxWheelSpeed??250,onChange:P=>le(se.id,{speedLimitMaxWheelSpeed:Number(P.target.value)||250})}),r.jsxs("label",{className:"flex items-center gap-0.5",children:[r.jsx("input",{type:"checkbox",checked:!!I?.[se.id]?.hardOvercurrentEnabled,disabled:!R,onChange:P=>le(se.id,{hardOvercurrentEnabled:!!P.target.checked})}),r.jsx("span",{children:"Hard overcurrent"})]}),r.jsxs("label",{className:"flex items-center gap-0.5",children:[r.jsx("input",{type:"checkbox",checked:!!I?.[se.id]?.hardBumpEnabled,disabled:!R,onChange:P=>le(se.id,{hardBumpEnabled:!!P.target.checked})}),r.jsx("span",{children:"Hard bump"})]}),r.jsxs("label",{className:"flex items-center gap-0.5",children:[r.jsx("input",{type:"checkbox",checked:!!I?.[se.id]?.cliffEnabled,disabled:!R,onChange:P=>le(se.id,{cliffEnabled:!!P.target.checked})}),r.jsx("span",{children:"Cliff safety"})]}),r.jsx("button",{type:"button",disabled:!R,onClick:()=>he(se.id),className:"button-dark disabled:opacity-50",children:"Apply Safety"})]}):null]})}),r.jsx(bN,{health:K,roster:E}),r.jsx(xN,{state:S,onClearHistory:ve,clearingHistory:M}),r.jsx(yN,{entries:y})]}):null}function xN({state:n,onClearHistory:s,clearingHistory:i}){const[o,f]=m.useState(null);if(!n)return r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("div",{className:"panel-muted text-xs uppercase",children:"LLM Commentary"}),r.jsx("div",{className:"surface text-xs text-slate-300",children:"No status received yet."})]});const d=n.runtime||{},h=n.counters||{},p=n.timings||{},x=n.input||{},g=n.output||{},v=n.errors||{},y=Array.isArray(n.history)?n.history:[],S=y.find(w=>w.runId===o)||(y.length?y[y.length-1]:null),E=gN(n),C=vN(x.modelMessages,g.raw),k=[{label:"running",value:d.running?"yes":"no"},{label:"in flight",value:d.inFlight?"yes":"no"},{label:"phase",value:d.phase||"--"},{label:"run id",value:d.currentRunId??"--"},{label:"tick count",value:d.tickCount??0},{label:"last tick",value:d.lastTickAt?new Date(d.lastTickAt).toLocaleString():"never"},{label:"next run",value:d.nextRunAt?new Date(d.nextRunAt).toLocaleString():"n/a"},{label:"outcome",value:d.outcome||"--"},{label:"reason",value:d.reason||"--"},{label:"skip streak",value:h.skipStreak??0},{label:"clear count",value:h.clearCount??0},{label:"last gen",value:p.lastGenerationMs!=null?`${p.lastGenerationMs} ms`:"--"},{label:"avg gen",value:p.avgGenerationMs!=null?`${p.avgGenerationMs} ms`:"--"},{label:"gen count",value:p.generationCount??0},{label:"prompt chars",value:h.promptChars??0},{label:"active drivers",value:h.snapshotSummary?.activeDrivers??0},{label:"snapshot rovers",value:h.snapshotSummary?.rovers??0},{label:"snapshot chat",value:h.snapshotSummary?.chatMessages??0}];return r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("div",{className:"panel-muted text-xs uppercase",children:"LLM Commentary"}),r.jsx("div",{className:"flex gap-0.5 text-xs",children:r.jsx("button",{type:"button",onClick:s,disabled:!!i,className:"button-danger disabled:cursor-not-allowed disabled:opacity-60",children:i?"Clearing...":"Clear LLM History"})}),r.jsxs("div",{className:`surface border text-center ${E.className}`,children:[r.jsx("div",{className:"text-[1.1rem] font-bold tracking-wide",children:E.label}),r.jsx("div",{className:"text-xs text-slate-200",children:E.detail})]}),r.jsx("div",{className:"surface flex flex-wrap gap-0.5 text-xs",children:k.map(w=>r.jsxs("span",{className:"rounded border border-slate-600/60 bg-slate-800/70 px-0.5 py-0.25 text-[0.72rem] leading-tight text-slate-200",children:[w.label,": ",w.value]},w.label))}),v.message?r.jsxs("div",{className:"surface text-xs text-red-300 break-words",children:["Error: ",v.message]}):null,v.details?r.jsxs("details",{className:"surface text-xs text-red-200",children:[r.jsx("summary",{className:"cursor-pointer select-none text-red-300",children:"Failure details"}),r.jsx("pre",{className:"mt-0.5 whitespace-pre-wrap break-words text-[0.72rem] text-red-200",children:JSON.stringify(v.details,null,2)})]}):null,g.generated?r.jsxs("div",{className:"surface text-xs text-slate-200 break-words",children:["Generated: ",g.generated]}):null,g.posted?r.jsxs("div",{className:"surface text-xs text-emerald-200 break-words",children:["Posted: ",g.posted]}):null,r.jsxs("div",{className:"grid gap-0.5 md:grid-cols-2",children:[r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("div",{className:"panel-muted text-xs uppercase",children:"Live Input Conversation"}),r.jsx("div",{className:"surface max-h-72 space-y-0.5 overflow-y-auto",children:C.length?C.map(w=>r.jsx(id,{message:w.message},w.id)):r.jsx("div",{className:"text-xs text-slate-300",children:"No model conversation captured yet."})})]}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("div",{className:"panel-muted text-xs uppercase",children:"Output + Error"}),r.jsxs("div",{className:"surface space-y-0.5 text-xs text-slate-200",children:[r.jsxs("div",{children:["Raw output: ",g.raw?.trim()?g.raw:""]}),r.jsxs("div",{children:["Posted: ",g.posted||""]}),r.jsxs("div",{children:["Output at:"," ",g.modelOutputAt?new Date(g.modelOutputAt).toLocaleString():"n/a"]}),r.jsxs("div",{children:["Failed at: ",v.failedAt?new Date(v.failedAt).toLocaleString():"n/a"]})]})]})]}),r.jsxs("details",{className:"surface text-xs text-slate-200",children:[r.jsx("summary",{className:"cursor-pointer select-none text-slate-300",children:"Full Monitor Payload"}),r.jsx("pre",{className:"mt-0.5 whitespace-pre-wrap break-words text-[0.72rem] text-slate-200",children:JSON.stringify(n,null,2)})]}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("div",{className:"panel-muted text-xs uppercase",children:"Recent Runs"}),r.jsx("div",{className:"surface max-h-52 space-y-0.5 overflow-y-auto text-xs",children:y.length?y.slice().reverse().map(w=>r.jsxs("button",{type:"button",onClick:()=>f(w.runId),className:`w-full text-left surface ${S?.runId===w.runId?"border border-sky-400/50":""}`,children:[r.jsxs("span",{className:"text-slate-300",children:["#",w.runId]})," ",r.jsx("span",{className:"text-slate-200",children:w.outcome||w.phase||"--"})," ",r.jsx("span",{className:"text-slate-400",children:w.durationMs!=null?`${w.durationMs}ms`:"--"})," ",r.jsx("span",{className:"text-slate-500",children:w.reason||""})]},w.runId)):r.jsx("div",{className:"text-slate-300",children:"No runs recorded yet."})})]}),S?r.jsxs("details",{className:"surface text-xs text-slate-200",open:!0,children:[r.jsxs("summary",{className:"cursor-pointer select-none text-slate-300",children:["Run #",S.runId," details"]}),r.jsx("pre",{className:"mt-0.5 whitespace-pre-wrap break-words text-[0.72rem] text-slate-200",children:JSON.stringify(S,null,2)})]}):null]})}function gN(n){const s=n?.runtime||{},i=n?.output||{},o=n?.errors||{};return s.inFlight?{label:"IN FLIGHT",detail:s.reason||"Generating commentary now",className:"border-amber-400/60 bg-amber-700/20 text-amber-200"}:s.outcome==="posted"?{label:"POSTED",detail:i.posted?`Last: ${i.posted}`:"Commentary posted",className:"border-emerald-400/60 bg-emerald-700/20 text-emerald-200"}:s.outcome==="skipped"?{label:"SKIPPED",detail:s.reason||"Model chose to skip",className:"border-slate-400/60 bg-slate-700/30 text-slate-200"}:s.outcome==="failed"?{label:"FAILED",detail:o.message||s.reason||"Tick failed",className:"border-red-400/60 bg-red-700/20 text-red-200"}:{label:s.running?"IDLE":"STOPPED",detail:s.reason||"Waiting for next tick",className:"border-sky-400/50 bg-sky-700/20 text-sky-200"}}function vN(n,s){const i=Date.now(),f=(Array.isArray(n)?n:[]).map((d,h)=>{const p=String(d?.role||"").toLowerCase(),x=typeof d?.content=="string"?d.content:JSON.stringify(d?.content??null,null,2),g=p==="system"?"LLM System":p==="assistant"?"LLM Context":p==="user"?"LLM Input":"LLM Message";return{id:`llm-msg-${h}`,message:{ts:i+h,nickname:g,text:x,role:"spectator",system:p==="system"}}});if(s!=null){const d=String(s);f.push({id:"llm-output",message:{ts:i+f.length+1,nickname:"LLM Output",text:d.trim()?d:"",role:"spectator",system:!0}})}return f}function bN({health:n,roster:s=[]}){if(!n)return null;const i=n.replay||{sources:[],readyCount:0,totalCount:0},o=n.snapshots||{rovers:[],rooms:[]},f=x=>s.find(g=>String(g.id)===String(x))?.color||null,d=`${i.readyCount}/${i.totalCount} sources ready`,h=o.rovers.filter(x=>x.stale).length,p=o.rooms.filter(x=>x.stale).length;return r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("div",{className:"panel-muted text-xs uppercase",children:"Health"}),r.jsxs("div",{className:"surface space-y-0.5 text-xs text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{children:"Replay segments"}),r.jsx("span",{className:"text-slate-400",children:d})]}),r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{children:"Rover snapshots"}),r.jsxs("span",{className:h?"text-amber-300":"text-emerald-300",children:[o.rovers.length-h,"/",o.rovers.length," ok"]})]}),r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{children:"Room cameras"}),r.jsxs("span",{className:p?"text-amber-300":"text-emerald-300",children:[o.rooms.length-p,"/",o.rooms.length," ok"]})]})]}),r.jsx("div",{className:"space-y-0.5 text-xs text-slate-300",children:i.sources.map(x=>r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{className:`${x.type==="rover"?"rounded px-1 py-[1px] border border-transparent":""}`,style:x.type==="rover"?ca(f(x.id),.16):void 0,children:x.label}),r.jsxs("span",{className:x.ready?"text-emerald-300":"text-amber-300",children:[x.recentCount,"/",x.neededCount]})]},`${x.type}:${x.id}`))}),r.jsx("div",{className:"space-y-0.5 text-xs text-slate-300",children:o.rovers.map(x=>r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{className:"rounded px-1 py-[1px] border border-transparent",style:ca(f(x.id),.16),children:x.name}),r.jsx("span",{className:x.stale?"text-amber-300":"text-emerald-300",children:x.stale?"stale":"ok"})]},`rover:${x.id}`))}),r.jsx("div",{className:"space-y-0.5 text-xs text-slate-300",children:o.rooms.map(x=>r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{children:x.name}),r.jsx("span",{className:x.stale?"text-amber-300":"text-emerald-300",children:x.error?"error":x.stale?"stale":"ok"})]},`room:${x.id}`))})]})}function yN({entries:n}){const s=n||[];return r.jsxs("div",{className:"panel-section space-y-0.5 text-base",children:[r.jsxs("div",{className:"flex items-center justify-between text-sm text-slate-400",children:[r.jsx("span",{children:"Admin IP log"}),r.jsx("span",{children:s.length})]}),r.jsx("div",{className:"surface h-64 overflow-y-auto font-mono text-xs",children:s.length===0?r.jsx("p",{children:"No admin log entries yet."}):s.slice().reverse().map(i=>r.jsxs("div",{className:"surface",children:[r.jsx("span",{className:"text-amber-400",children:i.ts?new Date(i.ts).toLocaleTimeString():"--"})," ",i.label&&r.jsxs("span",{className:"text-teal-400",children:["[",i.label,"]"]})," ",r.jsx("span",{className:"text-slate-200",children:i.message})," ",i.ip&&r.jsx("span",{className:"text-cyan-300",children:i.ip})," ",i.meta&&r.jsx("span",{className:"text-slate-500",children:JSON.stringify(i.meta)})]},i.id))}),r.jsx("p",{className:"text-xs text-slate-500",children:"Admin-only log stream; IPs never appear in user data."})]})}const SN=[{id:"driveForward",label:"Drive Forward",group:"Driving"},{id:"driveBackward",label:"Drive Backward",group:"Driving"},{id:"driveLeft",label:"Turn Left",group:"Driving"},{id:"driveRight",label:"Turn Right",group:"Driving"},{id:"boostModifier",label:"Boost Modifier",group:"Driving"},{id:"slowModifier",label:"Slow Modifier",group:"Driving"},{id:"auxMainForward",label:"Main Brush Forward",group:"Aux Motors"},{id:"auxMainReverse",label:"Main Brush Reverse",group:"Aux Motors"},{id:"auxSideForward",label:"Side Brush Forward",group:"Aux Motors"},{id:"auxSideReverse",label:"Side Brush Reverse",group:"Aux Motors"},{id:"auxVacuumFast",label:"Vacuum Max",group:"Aux Motors"},{id:"auxVacuumSlow",label:"Vacuum Low",group:"Aux Motors"},{id:"auxAllForward",label:"All Aux Forward",group:"Aux Motors"},{id:"cameraUp",label:"Camera Up",group:"Camera"},{id:"cameraDown",label:"Camera Down",group:"Camera"},{id:"nightVisionToggle",label:"Toggle Night Vision",group:"Camera"},{id:"hornHonk",label:"Horn (Hold)",group:"Audio"},{id:"micPtt",label:"Mic Push To Talk",group:"Audio"},{id:"driveMacro",label:"Drive Macro",group:"Macros"},{id:"dockMacro",label:"Dock Macro",group:"Macros"},{id:"chatFocus",label:"Toggle Chat",group:"Chat"},{id:"songNoteUp",label:"Song Note Up",group:"Audio"},{id:"songNoteDown",label:"Song Note Down",group:"Audio"},{id:"homeAssistantOn",label:"Room Controls On (Cycle)",group:"Room Controls"},{id:"homeAssistantOff",label:"Room Controls Off (Cycle)",group:"Room Controls"}];function jN(n){return n.reduce((s,i)=>((s[i.group]||(s[i.group]=[])).push(i),s),{})}function AN(n,s){const i=Number(n);return Number.isFinite(i)?Math.max(0,Math.min(500,i)):s}const vd=5,wi=500,Ci=1,bd=100;function NN(n,s){const i=Number(n);return Number.isFinite(i)?Math.max(vd,Math.min(wi,i)):s}function fo(n,s){const i=Number(n);return Number.isFinite(i)?Math.max(Ci,Math.min(bd,i)):s}function wN(n){const i=(fo(n,n)-Ci)/(bd-Ci),o=wi-i*(wi-vd);return Math.round(o)}function CN(n){const s=NN(n,n),i=(wi-s)/(wi-vd),o=Ci+i*(bd-Ci);return Math.round(o)}function EN(n){const[s,i]=m.useState(null),o=m.useCallback(h=>{lf(!0),i(h)},[]),f=m.useCallback(()=>{lf(!1),i(null)},[]),d=m.useCallback((h,p)=>{if(p.preventDefault(),p.stopPropagation(),p.key==="Escape"){f();return}const x=Ti(p.key??"");x&&(n(h,x,p),f())},[f,n]);return m.useEffect(()=>()=>lf(!1),[]),{active:s,startCapture:o,cancel:f,captureFromEvent:d}}function Wr({label:n,description:s,value:i,onChange:o,min:f=0,max:d=500,step:h=5}){return r.jsxs("label",{className:"surface-muted block p-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-300",children:[r.jsx("span",{className:"font-semibold text-slate-100",children:n}),r.jsx("input",{type:"number",min:f,max:d,value:i,onChange:p=>o(p.target.value),className:"w-16 rounded border border-slate-700 bg-slate-900 px-1 py-[2px] text-right text-[0.75rem] font-mono text-slate-100"})]}),s&&r.jsx("p",{className:"text-[0.65rem] text-slate-500",children:s}),r.jsxs("div",{className:"mt-0 flex items-center gap-0.5",children:[r.jsx("input",{type:"range",min:f,max:d,step:h,value:i,onChange:p=>o(p.target.value),className:"h-2 flex-1 accent-emerald-400"}),r.jsx("span",{className:"w-12 text-right text-[0.75rem] font-mono text-slate-400",children:i})]})]})}function kN(){const{state:{keymap:n},actions:{updateKeyBinding:s,resetKeyBindings:i}}=_t(),{value:o,save:f}=He("inputs",qn),d={...qn.keyboard,...o.keyboard??{}},h=m.useMemo(()=>typeof d.tiltSpeed=="number"?fo(d.tiltSpeed,qn.keyboard.tiltSpeed):typeof d.tiltIntervalMs=="number"?fo(CN(d.tiltIntervalMs),qn.keyboard.tiltSpeed):qn.keyboard.tiltSpeed,[d.tiltIntervalMs,d.tiltSpeed]),p=m.useMemo(()=>jN(SN),[]),{active:x,startCapture:g,cancel:v,captureFromEvent:y}=EN((k,w)=>{s(k,w)}),S=m.useCallback(k=>n?.[k]?.[0]||xi[k]?.[0]||"",[n]),E=m.useCallback((k,w)=>{const j=qn.keyboard,N=AN(w,j[k]);f(q=>({...q??{},keyboard:{...q?.keyboard??j,[k]:N}}))},[f]),C=m.useCallback(k=>{const w=qn.keyboard,j=fo(k,w.tiltSpeed),N=wN(j);f(q=>({...q??{},keyboard:{...q?.keyboard??w,tiltSpeed:j,tiltIntervalMs:N}}))},[f]);return r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsxs("div",{children:[r.jsx("p",{className:"text-xs text-slate-400",children:"Keyboard layout"}),r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:"Per-browser · click to change a binding"})]}),r.jsx("button",{type:"button",onClick:()=>i(),className:"button-dark text-xs",children:"Reset defaults"})]}),r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:"Keyboard speeds"}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsx(Wr,{label:"Base speed",description:"Normal driving speed",value:d.baseSpeed,onChange:k=>E("baseSpeed",k)}),r.jsx(Wr,{label:"Turbo speed",description:"Used when holding the boost modifier",value:d.turboSpeed,onChange:k=>E("turboSpeed",k)}),r.jsx(Wr,{label:"Precision speed",description:"Used when holding the precision modifier",value:d.precisionSpeed,onChange:k=>E("precisionSpeed",k)})]})]}),r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:"Camera tilt"}),r.jsx(Wr,{label:"Tilt speed",description:"Higher = faster when holding tilt keys",value:h,onChange:C,min:1,max:100,step:1})]}),r.jsx("div",{className:"space-y-0.5",children:Object.entries(p).map(([k,w])=>r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"text-[0.75rem] text-slate-400",children:k}),r.jsx("div",{className:"space-y-0.5",children:w.map(j=>{const N=S(j.id),q=x===j.id;return r.jsxs("div",{className:"surface-muted flex items-center justify-between text-xs",children:[r.jsxs("div",{children:[r.jsx("p",{className:"font-semibold text-slate-100",children:j.label}),r.jsx("p",{className:"text-[0.65rem] text-slate-400",children:An(N)})]}),r.jsxs("div",{className:"flex items-center gap-0.5",children:[q&&r.jsx("button",{type:"button",onClick:()=>v(),className:"button-danger text-[0.7rem]",children:"Cancel"}),r.jsx("button",{type:"button",onClick:()=>g(j.id),onKeyDown:q?M=>y(j.id,M):void 0,autoFocus:q,className:`${q?"px-0.5 py-0.5 bg-emerald-500 text-emerald-950 hover:bg-emerald-400":"button-dark"} text-[0.7rem] font-medium transition-colors`,children:q?"Press a key…":"Change"})]})]},j.id)})})]},k))})]})}const la=new Intl.NumberFormat(void 0,{maximumFractionDigits:2}),MN=[{id:"drive",label:"Drive stick",kind:"axisPair",section:"Driving",invertDefaults:{invertX:!1,invertY:!0}},{id:"cameraTilt",label:"Camera tilt",kind:"axis",section:"Camera",invertDefaults:{invert:!0}},{id:"mainBrush",label:"Main brush",kind:"axis",section:"Brushes",invertDefaults:{invert:!1}},{id:"sideBrush",label:"Side brush",kind:"axis",section:"Brushes",invertDefaults:{invert:!1}},{id:"vacuum",label:"Vacuum",kind:"button",section:"Aux buttons"},{id:"allAux",label:"All aux",kind:"button",section:"Aux buttons"},{id:"mainReverse",label:"Main reverse toggle",kind:"button",section:"Brush toggles"},{id:"sideReverse",label:"Side reverse toggle",kind:"button",section:"Brush toggles"},{id:"driveMacro",label:"Drive macro",kind:"button",section:"Mode macros"},{id:"dockMacro",label:"Dock macro",kind:"button",section:"Mode macros"},{id:"nightVisionToggle",label:"Night vision toggle",kind:"button",section:"Camera"}],hx=.45,RN=.6;function di({label:n,description:s,min:i,max:o,step:f,value:d,onChange:h}){return r.jsxs("label",{className:"surface-muted block p-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-300",children:[r.jsx("span",{className:"font-semibold text-slate-100",children:n}),r.jsx("span",{className:"font-mono text-slate-400",children:la.format(d)})]}),s&&r.jsx("p",{className:"text-[0.65rem] text-slate-500",children:s}),r.jsx("input",{type:"range",min:i,max:o,step:f,value:d,onChange:p=>h(Number(p.target.value)),className:"mt-0 w-full accent-emerald-400"})]})}function qN(n){if(!n)return"Unassigned";if(n.kind==="axisPair"){const s=`${n.invertX?"X inv ":""}${n.invertY?"Y inv":""}`.trim();return`Axes ${n.x}/${n.y}${s?` (${s})`:""}`}if(n.kind==="axis")return`Axis ${n.index}${n.invert?" (inv)":""}`;if(n.kind==="button")return`Button ${n.index}`;if(n.kind==="buttonAxis")return`Button ${n.index} (analog)`;if(n.kind==="axisButton"){const s=n.direction<0?"<":">";return`Axis ${n.index} ${s} ${la.format(n.threshold??.6)}`}return"Unassigned"}function TN(n){return n.reduce((s,i)=>((s[i.section]||(s[i.section]=[])).push(i),s),{})}function DN(n,s){if(!n||n.length===0)return null;if(s){const i=n.find(o=>o.signature===s);if(i)return i}return n[0]}function _N(n){return{axes:Array.from(n.axes??[]),buttons:(n.buttons??[]).map(s=>({pressed:!!s?.pressed,value:typeof s?.value=="number"?s.value:s?.pressed?1:0}))}}function BN(n,s,i){const o=(n.axes??[]).map((d,h)=>({index:h,delta:Math.abs((d??0)-(s.axes?.[h]??0)),value:d}));if(o.sort((d,h)=>h.delta-d.delta),i.kind==="axisPair"){const d=o.filter(h=>h.delta>hx).slice(0,2);return d.length<2?null:{kind:"axisPair",x:d[0].index,y:d[1].index,...i.invertDefaults??{}}}const f=o.find(d=>d.delta>hx);return f?{kind:"axis",index:f.index,...i.invertDefaults??{}}:null}function ON(n,s,i){const o=n.buttons??[];for(let d=0;dRN)return i.kind==="axis"?{kind:"buttonAxis",index:d}:{kind:"button",index:d}}const f=n.axes??[];for(let d=0;d.7&&p>.5)return i.kind==="axis"?{kind:"axis",index:d,...i.invertDefaults??{}}:{kind:"axisButton",index:d,direction:h>=0?1:-1,threshold:.6}}return null}function LN(n,s,i){if(!n)return null;if(i.kind==="axis"||i.kind==="axisPair"){const o=BN(n,s,i);if(o)return o}return ON(n,s,i)}function zN(){const n=mA(),{value:s,save:i}=He("gamepad",Ba),[o,f]=m.useState(null),d=m.useRef(null),h=m.useMemo(()=>TN(MN),[]),p=m.useMemo(()=>DN(n.pads,s.activeSignature),[n.pads,s.activeSignature]),x=p?.signature??null,g=m.useMemo(()=>x?s?.profiles?.[x]??s?.defaults?.profile??ia:s?.defaults?.profile??ia,[x,s?.defaults?.profile,s?.profiles]);m.useEffect(()=>{!p||!x||s?.profiles?.[x]||i(w=>{const j=w??Ba;if(j.profiles?.[x])return j;const N=j?.defaults?.profile??ia,q=Eg(p,N);return{...j,profiles:{...j.profiles??{},[x]:q}}})},[p,x,s?.profiles,i]),m.useEffect(()=>{d.current=null},[o,x]),m.useEffect(()=>{if(!o||!p)return;if(!d.current){d.current=_N(p);return}const w=LN(p,d.current,o);w&&(i(j=>{const N=j??Ba,q=N.profiles?.[x]??N?.defaults?.profile??ia,M={...q,bindings:{...q.bindings??{},[o.id]:{...q.bindings?.[o.id]??{},kind:o.kind,sources:[w]}}};return{...N,profiles:{...N.profiles??{},[x]:M}}}),f(null))},[p,x,o,i]);const v=m.useCallback(w=>{i(j=>({...j??Ba,activeSignature:w||null}))},[i]),y=m.useCallback(w=>{i(j=>{const N=j??Ba,q=(x&&N.profiles?.[x])??N?.defaults?.profile??ia,M={...q,calibration:{...q.calibration??{},...w}};return x?{...N,profiles:{...N.profiles??{},[x]:M}}:{...N,defaults:{...N.defaults??{},profile:M}}})},[x,i]),S=m.useCallback((w,j)=>{i(N=>{const q=N??Ba,M=(x&&q.profiles?.[x])??q?.defaults?.profile??ia,O=j(M.bindings?.[w]??{}),K={...M,bindings:{...M.bindings??{},[w]:O}};return x?{...q,profiles:{...q.profiles??{},[x]:K}}:{...q,defaults:{...q.defaults??{},profile:K}}})},[x,i]),E=m.useCallback(w=>{S(w.id,j=>({...j,sources:[]}))},[S]),C=m.useCallback((w,j)=>{S(w.id,N=>{const q=Array.isArray(N.sources)?[...N.sources]:[];if(!q[0])return N;const M={...q[0]};return j==="invertX"?M.invertX=!M.invertX:j==="invertY"?M.invertY=!M.invertY:M.invert=!M.invert,q[0]=M,{...N,sources:q}})},[S]),k=m.useMemo(()=>p?{outputs:kg(p,g)}:null,[p,g]);return r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("div",{className:"flex items-center justify-between",children:r.jsxs("div",{children:[r.jsx("p",{className:"text-xs text-slate-400",children:"Controller"}),r.jsx("p",{className:"text-[0.65rem] text-slate-500",children:p?"Move sticks or press buttons to bind":"Connect a controller to configure."}),o&&r.jsxs("p",{className:"mt-0 text-[0.7rem] text-emerald-400",children:["Capturing ",o.label,"…"]})]})}),r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:"Connected controller"}),n.pads.length===0?r.jsx("p",{className:"text-[0.7rem] text-slate-400",children:"No controller detected."}):r.jsxs("div",{className:"flex items-center justify-between gap-0.5 text-xs",children:[r.jsx("select",{value:x??"",onChange:w=>v(w.target.value),className:"flex-1 rounded border border-slate-700 bg-slate-900 px-1 py-[2px] text-[0.75rem] text-slate-100",children:n.pads.map(w=>r.jsx("option",{value:w.signature,children:w.id||"Unknown controller"},w.signature))}),r.jsx("span",{className:"text-[0.7rem] text-slate-400",children:p?.mapping??"unknown"})]})]}),r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:"Calibration"}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsx(di,{label:"Drive deadzone",description:"Ignore small drive stick drift",min:0,max:.6,step:.01,value:g.calibration?.driveDeadzone??.18,onChange:w=>y({driveDeadzone:w})}),r.jsx(di,{label:"Camera deadzone",description:"Ignore small camera tilt drift",min:0,max:.4,step:.01,value:g.calibration?.cameraDeadzone??.08,onChange:w=>y({cameraDeadzone:w})}),r.jsx(di,{label:"Aux deadzone",description:"Ignore small trigger noise",min:0,max:.4,step:.01,value:g.calibration?.auxDeadzone??.05,onChange:w=>y({auxDeadzone:w})}),r.jsx(di,{label:"Side brush scale",description:"Scale side brush output",min:.3,max:1,step:.05,value:g.calibration?.auxSideScale??.55,onChange:w=>y({auxSideScale:w})}),r.jsxs("label",{className:"surface-muted block p-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-300",children:[r.jsx("span",{className:"font-semibold text-slate-100",children:"Camera mode"}),r.jsxs("select",{value:g.calibration?.cameraMode??"absolute",onChange:w=>y({cameraMode:w.target.value}),className:"rounded border border-slate-700 bg-slate-900 px-1 py-[2px] text-[0.75rem] text-slate-100",children:[r.jsx("option",{value:"absolute",children:"Absolute"}),r.jsx("option",{value:"velocity",children:"Velocity"})]})]}),r.jsx("p",{className:"text-[0.65rem] text-slate-500",children:"Absolute maps stick to angle; velocity moves over time."})]}),r.jsx(di,{label:"Camera sensitivity",description:"Velocity mode degrees per second",min:10,max:180,step:5,value:g.calibration?.cameraSensitivity??60,onChange:w=>y({cameraSensitivity:w})})]})]}),r.jsx("div",{className:"space-y-0.5",children:Object.entries(h).map(([w,j])=>r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:w}),r.jsx("div",{className:"space-y-0.5",children:j.map(N=>{const M=g.bindings?.[N.id]?.sources?.[0]??null;return r.jsxs("div",{className:"surface-muted flex items-center justify-between text-xs",children:[r.jsxs("div",{children:[r.jsx("p",{className:"font-semibold text-slate-100",children:N.label}),r.jsx("p",{className:"text-[0.65rem] text-slate-400",children:qN(M)})]}),r.jsxs("div",{className:"flex items-center gap-0.5",children:[N.kind==="axisPair"&&r.jsxs(r.Fragment,{children:[r.jsx("button",{type:"button",disabled:!M,onClick:()=>C(N,"invertX"),className:"button-dark text-[0.7rem] font-medium disabled:opacity-50",children:"Invert X"}),r.jsx("button",{type:"button",disabled:!M,onClick:()=>C(N,"invertY"),className:"button-dark text-[0.7rem] font-medium disabled:opacity-50",children:"Invert Y"})]}),N.kind==="axis"&&r.jsx("button",{type:"button",disabled:!M,onClick:()=>C(N),className:"button-dark text-[0.7rem] font-medium disabled:opacity-50",children:"Invert"}),r.jsx("button",{type:"button",onClick:()=>E(N),className:"button-dark text-[0.7rem]",children:"Clear"}),r.jsx("button",{type:"button",onClick:()=>f(N),className:`${o?.id===N.id?"px-0.5 py-0.5 bg-emerald-500 text-emerald-950 hover:bg-emerald-400":"button-dark"} text-[0.7rem] font-medium`,children:o?.id===N.id?"Waiting…":"Capture"})]})]},N.id)})})]},w))}),r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:"Diagnostics"}),p?r.jsxs("div",{className:"space-y-0.5 text-[0.7rem] text-slate-300",children:[r.jsx("p",{className:"text-slate-400",children:"Raw axes"}),r.jsx("div",{className:"grid grid-cols-2 gap-0.5",children:p.axes.map((w,j)=>r.jsxs("span",{className:"font-mono text-slate-300",children:["A",j,": ",la.format(w)]},`axis-${j}`))}),r.jsx("p",{className:"text-slate-400",children:"Raw buttons"}),r.jsx("div",{className:"grid grid-cols-2 gap-0.5",children:p.buttons.map((w,j)=>r.jsxs("span",{className:"font-mono text-slate-300",children:["B",j,": ",la.format(w.value)," ",w.pressed?"●":""]},`btn-${j}`))}),k?.outputs&&r.jsxs(r.Fragment,{children:[r.jsx("p",{className:"text-slate-400",children:"Mapped outputs"}),r.jsxs("div",{className:"grid grid-cols-2 gap-0.5",children:[r.jsxs("span",{className:"font-mono text-slate-300",children:["Drive: ",la.format(k.outputs.driveVector.x),","," ",la.format(k.outputs.driveVector.y)]}),r.jsxs("span",{className:"font-mono text-slate-300",children:["Camera: ",la.format(k.outputs.cameraAxis)]}),r.jsxs("span",{className:"font-mono text-slate-300",children:["Main: ",la.format(k.outputs.auxAxis.main)]}),r.jsxs("span",{className:"font-mono text-slate-300",children:["Side: ",la.format(k.outputs.auxAxis.side)]})]})]})]}):r.jsx("p",{className:"text-[0.7rem] text-slate-400",children:"No controller detected."})]})]})}const UN={drive:"Drive wheels",aux:"Aux motors"};function px(n){return Number.isFinite(n)?`${Math.round(n*100)}%`:"--"}function HN({value:n,color:s="bg-emerald-500"}){const i=`${Math.round(Math.max(0,Math.min(1,n))*100)}%`;return r.jsx("div",{className:"h-2 w-full overflow-hidden rounded bg-slate-800",children:r.jsx("div",{className:`h-full ${s}`,style:{width:i}})})}function VN(){const{state:{roverId:n},overcurrentLimiter:s}=_t(),i=m.useMemo(()=>rs.map(o=>o.key),[]);return r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-400",children:[r.jsx("span",{children:"Overcurrent limiter"}),r.jsx("span",{children:s?.adminImmune?"Admin immune":"Active"})]}),n?r.jsxs("div",{className:"space-y-0.5",children:[i.map(o=>{const f=s?.caps?.[o]?.cap??0,d=s?.overcurrent?.groups?.[o]??!1,h=s?.scales?.perGroup?.[o]??1;return r.jsxs("div",{className:"surface space-y-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs",children:[r.jsx("span",{className:"text-slate-200",children:UN[o]||o}),r.jsx("span",{className:d?"text-red-300":"text-slate-400",children:d?"overcurrent":"ok"})]}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-[0.7rem] text-slate-400",children:[r.jsx("span",{children:"Cap"}),r.jsx("span",{children:px(f)})]}),r.jsx(HN,{value:f,color:"bg-amber-500"}),r.jsxs("div",{className:"flex items-center justify-between text-[0.7rem] text-slate-400",children:[r.jsx("span",{children:"Scale"}),r.jsx("span",{children:px(h)})]})]})]},o)}),r.jsxs("div",{className:"surface text-[0.7rem] text-slate-400",children:[r.jsx("div",{children:`Down rate ${s?.config?.downRatePerSec}/s · Up rate ${s?.config?.upRatePerSec}/s`}),r.jsx("div",{children:`Release delay ${s?.config?.releaseDelaySec}s`}),r.jsx("div",{children:`Output rate ${s?.config?.outputRateMs}ms`})]})]}):r.jsx("p",{className:"text-xs text-slate-500",children:"Assign a rover to view limiter status."})]})}const Yg=m.createContext(null);function Fg(){const n=m.useContext(Yg);if(!n)throw new Error("Tabs components must be used within a provider.");return n}const xx={primary:{base:"flex-1 px-0.5 py-0.5 text-sm font-medium focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-1 focus-visible:outline-slate-500 rounded-md border border-slate-800",active:"bg-sky-600 text-white border-white",inactive:"bg-zinc-900 text-slate-300 hover:bg-sky-500 hover:text-white"}},gx={none:"",pink:"bg-pink-500 text-white border-pink-200 hover:bg-pink-400",green:"bg-emerald-500 text-white border-emerald-200 hover:bg-emerald-400"},Xg="primary";function yd(...n){return n.filter(Boolean).join(" ")}function Sd({children:n,defaultTab:s,currentTab:i,onTabChange:o,variant:f=Xg}){const[d,h]=m.useState(s??null),[p,x]=m.useState([]),g=m.useCallback(E=>E?(x(C=>C.includes(E)?C:[...C,E]),()=>x(C=>C.includes(E)?C.filter(k=>k!==E):C)):()=>{},[]),v=i??d??p[0]??null;m.useEffect(()=>{s&&i===void 0&&h(s)},[s,i]);const y=m.useCallback(E=>{E&&(i===void 0&&h(E),o&&o(E))},[i,o]),S=m.useMemo(()=>({activeTab:v,setActiveTab:y,registerTab:g,variant:f}),[v,y,g,f]);return r.jsx(Yg.Provider,{value:S,children:n})}function jd({children:n,className:s=""}){return r.jsx("div",{className:yd("flex gap-0.5",s),children:n})}function Wt({id:n,children:s,className:i="",disabled:o=!1,highlight:f="none"}){const{activeTab:d,setActiveTab:h,registerTab:p,variant:x}=Fg();m.useEffect(()=>p(n),[n,p]);const g=xx[x]??xx[Xg],v=d===n,y=gx[f]||gx.none,S=yd(g.base,y||(v?g.active:g.inactive),o?"cursor-not-allowed opacity-50":"",i);return r.jsx("button",{type:"button",className:S,onClick:()=>!o&&h(n),"aria-pressed":v,"aria-disabled":o,children:s})}function Ad({children:n,className:s=""}){return r.jsx("div",{className:yd("mt-0 space-y-0.5",s),children:n})}function en({id:n,children:s,keepMounted:i=!1}){const{activeTab:o}=Fg(),f=o===n;return!f&&!i?null:!f&&i?r.jsx("div",{hidden:!0,"aria-hidden":"true",children:s}):r.jsx(r.Fragment,{children:s})}function $N(){const{session:n}=nn(),s=m.useMemo(()=>JSON.stringify(n??{},null,2),[n]);return r.jsxs("div",{className:"panel-section flex min-h-0 flex-col gap-0.5 text-xs",children:[r.jsx("p",{className:"text-sm text-slate-400",children:"Session snapshot"}),r.jsx("pre",{className:"surface min-h-0 flex-1 overflow-y-auto font-mono text-[0.7rem] text-lime-300",children:s})]})}const vx=300,bx=240;function GN(n,s){if(n===void 0)return"undefined";if(n===null)return"null";if(typeof n=="string")return n;if(typeof n=="number"||typeof n=="boolean")return String(n);if(typeof n=="function")return"[Function]";if(n instanceof Error)return`${n.name}: ${n.message}`;if(n instanceof Date)return n.toISOString();if(s||(s=new WeakSet),typeof n=="object"){if(s.has(n))return"[Circular]";s.add(n)}try{return JSON.stringify(n,(i,o)=>typeof o=="function"?"[Function]":o instanceof Error?`${o.name}: ${o.message}`:o,0)}catch{return String(n)}}function YN(n){const i=n.map(o=>GN(o)).join(" ");return i.length>bx?`${i.slice(0,bx)}…`:i}function FN(){const n=tn(),[s,i]=m.useState([]),o=m.useMemo(()=>s.reduce((f,d)=>(d.direction==="in"&&(f.in+=1),d.direction==="out"&&(f.out+=1),f),{in:0,out:0}),[s]);return m.useEffect(()=>{const f=(x,g,v)=>{i(y=>{const S=[...y,{id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,direction:x,event:g,payload:YN(v),timestamp:new Date().toLocaleTimeString()}];return S.length>vx?S.slice(-vx):S})},d=(x,...g)=>f("in",x,g),h=(x,...g)=>f("out",x,g);n.onAny(d);let p=null;if(typeof n.onAnyOutgoing=="function")n.onAnyOutgoing(h),p=()=>n.offAnyOutgoing(h);else{const x=n.emit.bind(n);n.emit=(g,...v)=>(h(g,...v),x(g,...v)),p=()=>{n.emit=x}}return()=>{n.offAny(d),p&&p()}},[n]),r.jsxs("section",{className:"panel-section space-y-0.5 text-base",children:[r.jsxs("div",{className:"flex items-center justify-between text-sm text-slate-400",children:[r.jsx("span",{children:"Socket activity"}),r.jsxs("div",{className:"flex items-center gap-0.5 text-xs text-slate-400",children:[r.jsxs("span",{className:"surface-muted",children:["in ",o.in]}),r.jsxs("span",{className:"surface-muted",children:["out ",o.out]}),r.jsx("button",{type:"button",className:"button-dark text-xs",onClick:()=>i([]),children:"Clear"})]})]}),r.jsx("div",{className:"surface h-64 overflow-y-auto font-mono text-xs",children:s.length===0?r.jsx("p",{children:"No socket activity yet."}):s.slice().reverse().map(f=>r.jsxs("div",{className:"surface",children:[r.jsx("span",{className:"text-slate-400",children:f.timestamp})," ",r.jsxs("span",{className:f.direction==="in"?"text-emerald-400":"text-amber-400",children:["[",f.direction.toUpperCase(),"]"]})," ",r.jsx("span",{className:"text-cyan-300",children:f.event})," ",r.jsx("span",{className:"text-slate-200",children:f.payload})]},f.id))}),r.jsx("p",{className:"text-xs text-slate-500",children:"Logs are collected only while this panel is open."})]})}const XN=[{key:"start",label:"Start OI"},{key:"safe",label:"Safe"},{key:"full",label:"Full"},{key:"passive",label:"Passive"},{key:"dock",label:"Dock"}];function Qg(){const{state:{roverId:n},actions:{sendOiCommand:s,setSensorStream:i}}=_t(),o=!!n,[f,d]=Hg(),h=tn(),{value:p,save:x}=He("page",{hudMapDesktop:!1,connectionTransport:"websocket",swapMobileControlColumns:!1,driveMacroBackoffEnabled:!0}),{value:g,save:v}=He("audio",ct),y=p?.connectionTransport||"websocket",S=!!p?.swapMobileControlColumns,E=typeof p?.driveMacroBackoffEnabled=="boolean"?p.driveMacroBackoffEnabled:!0,C=Number.isFinite(g?.masterVolume)?g.masterVolume:ct.masterVolume,k=Number.isFinite(g?.alertVolume)?g.alertVolume:ct.alertVolume,w=Number.isFinite(g?.roverVolume)?g.roverVolume:ct.roverVolume,j=typeof g?.mainBrushDuckEnabled=="boolean"?g.mainBrushDuckEnabled:typeof g?.autoLevelEnabled=="boolean"?g.autoLevelEnabled:ct.mainBrushDuckEnabled,N=Number.isFinite(g?.mainBrushDuckAmount)?Math.max(0,Math.min(1,g.mainBrushDuckAmount)):ct.mainBrushDuckAmount,q=m.useMemo(()=>[{key:"start",label:"Enable stream",enable:!0},{key:"stop",label:"Disable stream",enable:!1}],[]),M=H=>{n&&i(H)},O=H=>{const V=H.target.value;x(W=>({...W??{},connectionTransport:V})),h?.io?.opts&&(h.io.opts.transports=V==="polling"?["polling"]:["websocket","polling"],h.disconnect(),h.connect())},K=H=>V=>{const W=Number(V.target.value),oe=Number.isFinite(W)?Math.max(0,Math.min(1,W)):0;v(ce=>({...ce??{},[H]:oe}))},_=H=>{const V=!!H.target.checked;v(W=>({...W??{},mainBrushDuckEnabled:V}))},U=H=>{const V=!!H.target.checked;x(W=>({...W??{},swapMobileControlColumns:V}))},z=H=>{const V=!!H.target.checked;x(W=>({...W??{},driveMacroBackoffEnabled:V}))};return r.jsxs(Sd,{defaultTab:"keybindings",children:[r.jsxs(jd,{children:[r.jsx(Wt,{id:"keybindings",children:"Keybindings"}),r.jsx(Wt,{id:"controller",children:"Controller"}),r.jsx(Wt,{id:"page",children:"Page settings"}),r.jsx(Wt,{id:"admin",children:"Admin"})]}),r.jsxs(Ad,{children:[r.jsx(en,{id:"keybindings",children:r.jsx("div",{className:"space-y-0.5",children:r.jsx(kN,{})})}),r.jsx(en,{id:"controller",children:r.jsx("div",{className:"space-y-0.5",children:r.jsx(zN,{})})}),r.jsx(en,{id:"page",children:r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-slate-400",children:"HUD"}),r.jsxs("label",{className:"flex items-center gap-0.5 text-slate-200",children:[r.jsx("input",{type:"checkbox",className:"accent-emerald-500",checked:f,onChange:H=>d(H.target.checked)}),r.jsx("span",{children:"Show top-down map in HUD (desktop)"})]}),r.jsx("p",{className:"text-xs text-slate-500",children:"Mobile HUD keeps the map on by default."})]}),r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-slate-400",children:"Mobile controls"}),r.jsxs("label",{className:"flex items-center gap-0.5 text-slate-200",children:[r.jsx("input",{type:"checkbox",className:"accent-emerald-500",checked:S,onChange:U}),r.jsx("span",{children:"Swap control columns (put joystick on the left)"})]})]}),r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-slate-400",children:"Macros"}),r.jsxs("label",{className:"flex items-center gap-0.5 text-slate-200",children:[r.jsx("input",{type:"checkbox",className:"accent-emerald-500",checked:E,onChange:z}),r.jsx("span",{children:"Enable backward bump in drive macro"})]})]}),r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-slate-400",children:"Audio"}),r.jsxs("label",{className:"grid gap-0.5 text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{children:"Master volume"}),r.jsxs("span",{className:"text-xs text-slate-400",children:[Math.round(C*100),"%"]})]}),r.jsx("input",{type:"range",min:"0",max:"1",step:"0.01",value:C,onChange:K("masterVolume"),className:"w-full accent-emerald-500"})]}),r.jsxs("label",{className:"grid gap-0.5 text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{children:"Alert/page sounds"}),r.jsxs("span",{className:"text-xs text-slate-400",children:[Math.round(k*100),"%"]})]}),r.jsx("input",{type:"range",min:"0",max:"1",step:"0.01",value:k,onChange:K("alertVolume"),className:"w-full accent-emerald-500"})]}),r.jsxs("label",{className:"grid gap-0.5 text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{children:"Rover audio"}),r.jsxs("span",{className:"text-xs text-slate-400",children:[Math.round(w*100),"%"]})]}),r.jsx("input",{type:"range",min:"0",max:"1",step:"0.01",value:w,onChange:K("roverVolume"),className:"w-full accent-emerald-500"})]}),r.jsxs("label",{className:"flex items-center justify-between gap-0.5 text-slate-200",children:[r.jsx("span",{children:"Main brush ducking"}),r.jsx("input",{type:"checkbox",className:"accent-emerald-500",checked:j,onChange:_})]}),r.jsxs("label",{className:"grid gap-0.5 text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{children:"Main brush duck amount"}),r.jsxs("span",{className:"text-xs text-slate-400",children:[Math.round(N*100),"%"]})]}),r.jsx("input",{type:"range",min:"0",max:"1",step:"0.01",value:N,onChange:K("mainBrushDuckAmount"),className:"w-full accent-emerald-500",disabled:!j})]}),r.jsx("p",{className:"text-xs text-slate-500",children:"Lowers rover audio only while the main brush is running."})]}),r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-slate-400",children:"Connection"}),r.jsxs("label",{className:"flex items-center justify-between gap-0.5 text-slate-200",children:[r.jsx("span",{children:"Transport"}),r.jsxs("select",{value:y,onChange:O,className:"field-input text-sm",children:[r.jsx("option",{value:"websocket",children:"WebSocket"}),r.jsx("option",{value:"polling",children:"Polling"})]})]}),r.jsx("p",{className:"text-xs text-slate-500",children:"Switching reconnects your session."})]})]})}),r.jsx(en,{id:"admin",children:r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-slate-400",children:"Manual OI commands"}),r.jsx("div",{className:"surface flex flex-wrap gap-0.5",children:XN.map(H=>r.jsx("button",{type:"button",onClick:()=>s(H.key),disabled:!o,className:"button-dark text-xs disabled:opacity-30",children:H.label},H.key))})]}),r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-slate-400",children:"Sensor stream"}),r.jsx("div",{className:"surface flex gap-0.5",children:q.map(H=>r.jsx("button",{type:"button",onClick:()=>M(H.enable),disabled:!o,className:"flex-1 button-dark text-xs disabled:opacity-30",children:H.label},H.key))}),!o&&r.jsx("p",{className:"text-xs text-slate-500",children:"Assign a rover to toggle streams."})]}),r.jsx(Gg,{}),r.jsx(VN,{}),r.jsx(pN,{}),r.jsx($N,{}),r.jsx(FN,{})]})})]})]})}const yx={desktop:{main:[{type:"list",title:"Chat and nicknames",items:["Set a nickname in the user list panel, on the bottom left of the page below the rover video.",{segments:["Toggle chat focus with ",{action:"chatFocus"},". Press ",{action:"chatFocus"}," again to send."]}]},{type:"list",title:"Driving the rover",items:[{segments:['Press the "Start Driving" button onscreen, or press ',{action:"driveMacro"}," on your keyboard to put the rover into driving mode."]},"Refer to the controls for the controls for the rover."]},{type:"list",title:"Docking the rover",items:["Line up the rover to the dock, about a foot away, then:",{segments:['Press the "Dock and Charge" button onscreen, or press ',{action:"dockMacro"}," on your keyboard to start docking."]},"Wait for the rover to confirm it is docked and charging before leaving it unattended."]}],aside:[{type:"keyboard",title:"Keyboard controls",footnote:"Per-browser; adjust bindings and speeds in Settings → Keybindings.",groups:[{id:"movement",title:"Movement",items:[{action:"driveForward",label:"Forward"},{action:"driveBackward",label:"Backward"},{action:"driveLeft",label:"Turn left"},{action:"driveRight",label:"Turn right"},{action:"boostModifier",label:"Boost speed"},{action:"slowModifier",label:"Precision speed"}]},{id:"macros",title:"Rover modes & chat",items:[{action:"driveMacro",label:"Drive macro"},{action:"dockMacro",label:"Dock macro"},{action:"chatFocus",label:"Chat focus"}]},{id:"camera",title:"Camera",items:[{action:"cameraUp",label:"Tilt up"},{action:"cameraDown",label:"Tilt down"},{action:"nightVisionToggle",label:"Toggle night vision"}]},{id:"motors",title:"Rover Aux Motors",items:[{action:"auxMainForward",label:"Main brush forward"},{action:"auxMainReverse",label:"Main brush reverse"},{action:"auxSideForward",label:"Side brush forward"},{action:"auxSideReverse",label:"Side brush reverse"},{action:"auxVacuumFast",label:"Vacuum max"},{action:"auxVacuumSlow",label:"Vacuum low"},{action:"auxAllForward",label:"All motors forward"}]},{id:"audio",title:"Audio / Song",items:[{action:"songNoteUp",label:"Song note up"},{action:"songNoteDown",label:"Song note down"}]},{id:"room-controls",title:"Room Controls",items:[{action:"homeAssistantOn",label:"Next room control on"},{action:"homeAssistantOff",label:"Next room control off (reverse)"}]}]},{type:"gamepad",title:"Gamepad / joystick",items:["Gamepad controls are fully configurable to handle inconsistent browser mappings.","Use Settings → Controller to bind inputs, calibrate deadzones, and view diagnostics.","If inputs behave oddly, the diagnostics panel will show raw axis/button values."]}]},"mobile-portrait":{main:[{type:"list",title:"Chat and nicknames",items:["Set a nickname in the user list panel below.","Tap in the chat box to send messages in the chat."]},{type:"list",title:"Driving the rover",items:[{segments:['Press the "Start Driving" button onscreen to put the rover into driving mode.']},"Look below the rover video. Use the joystick column to move the rover, and hold the aux buttons in the other control column."]},{type:"list",title:"Docking the rover",items:["Line up the rover to the dock, about a foot away, then:",{segments:['Press the "Dock and Charge" button onscreen to start docking.']},"Wait for the rover to confirm it is docked and charging before leaving it unattended."]}]},"mobile-landscape":{main:[{type:"list",title:"Chat and nicknames",items:["Scroll down to see more of the page.","Set a nickname in the user list panel below.","Tap in the chat box to send messages in the chat."]},{type:"list",title:"Driving the rover",items:[{segments:['Press the "Start Driving" button, or the "Drive" button to put the rover into driving mode.']},"Use the joystick column beside the video feed to move the rover, and hold the aux buttons in the other control column."]},{type:"list",title:"Docking the rover",items:["Line up the rover to the dock, about a foot away, then:",{segments:['Press the "Dock and Charge" or the "Dock" button onscreen to start docking.']},"Wait for the rover to confirm it is docked and charging before leaving it unattended."]}]}};function QN(n){return yx[n]||yx.desktop}function Kg({actionId:n,keymap:s}){const i=s?.[n]?.[0]??"";return r.jsx("span",{className:"rounded border border-slate-600 bg-slate-900/40 px-1 text-[0.7rem] text-slate-200",children:An(i)})}function Sx(n,s){return n.map((i,o)=>typeof i=="string"?r.jsx("span",{children:i},`text-${o}`):i?.action?r.jsx(Kg,{actionId:i.action,keymap:s},`pill-${i.action}-${o}`):i?.text?r.jsx("span",{children:i.text},`span-${o}`):null)}function Ro(n,s,i){if(typeof n=="string")return n;if(Array.isArray(n?.segments))return Sx(n.segments,s);if(n&&typeof n=="object"){if(typeof n.text=="string")return n.text;if(Array.isArray(n))return Sx(n,s)}return String(n??"")}function KN({hero:n,keymap:s}){return n?r.jsxs("div",{className:"surface space-y-0.5 px-0.5 py-0.5",children:[r.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-0.5",children:[r.jsxs("div",{children:[r.jsx("p",{className:"text-sm font-semibold text-white",children:n.title}),n.subtitle&&r.jsx("p",{className:"text-xs text-slate-300",children:n.subtitle})]}),n.chips&&r.jsx("div",{className:"flex flex-wrap gap-0.5 text-[0.7rem] text-slate-200",children:n.chips.map(i=>r.jsx("span",{className:"rounded border border-slate-700 px-1 py-[2px]",children:i},i))})]}),n.bullets&&r.jsx("ul",{className:"space-y-0.5 text-[0.85rem] text-slate-200",children:n.bullets.map((i,o)=>{const f=Array.isArray(i?.segments)?`hero-${o}`:`hero-${o}`;return r.jsx("li",{className:"surface-muted px-0.5 py-0.25",children:Ro(i,s)},f)})})]}):null}function ZN({block:n,keymap:s}){return r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-xs font-semibold text-slate-200",children:n.title}),r.jsx("ul",{className:"space-y-0.5 text-[0.8rem] text-slate-300",children:n.items.map((i,o)=>{const f=`item-${o}`;return r.jsx("li",{className:"surface-muted flex flex-wrap items-center gap-0.5 px-0.5 py-0.25",children:Ro(i,s)},f)})})]})}function IN({block:n}){const s=n.tone==="info"?"border-cyan-500/40":"border-slate-700";return r.jsxs("div",{className:`surface space-y-0.5 border ${s} px-0.5 py-0.5`,children:[r.jsx("p",{className:"text-xs font-semibold text-slate-100",children:n.title}),n.body&&r.jsx("ul",{className:"space-y-0.5 text-[0.8rem] text-slate-300",children:n.body.map((i,o)=>r.jsx("li",{className:"surface-muted px-0.5 py-0.25",children:Ro(i,{})},`callout-${o}`))})]})}function JN({group:n,keymap:s}){return r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"px-0.5 py-0.25 text-[0.75rem] font-semibold text-slate-200",children:n.title}),r.jsx("div",{className:"space-y-0.5 px-0.5 pb-0.25",children:n.items.map(i=>r.jsxs("div",{className:"surface-muted flex items-center justify-between gap-0.5 px-0.5 py-0.25 text-[0.8rem]",children:[r.jsx("span",{className:"text-slate-200",children:i.label}),r.jsx(Kg,{actionId:i.action,keymap:s})]},i.action))})]})}function PN({block:n,keymap:s}){return n?r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-200",children:[r.jsx("span",{className:"font-semibold",children:n.title}),n.footnote&&r.jsx("span",{className:"text-[0.7rem] text-slate-400",children:n.footnote})]}),r.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-0.5",children:n.groups?.map(i=>r.jsx(JN,{group:i,keymap:s},i.id))})]}):null}function WN({block:n}){return n?r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-xs font-semibold text-slate-200",children:n.title}),r.jsx("ul",{className:"space-y-0.5 text-[0.8rem] text-slate-300",children:n.items?.map((s,i)=>r.jsx("li",{className:"surface-muted px-0.5 py-0.25",children:Ro(s,{})},`gamepad-${i}`))})]}):null}function jx({block:n,keymap:s}){if(!n)return null;switch(n.type){case"list":return r.jsx(ZN,{block:n,keymap:s});case"callout":return r.jsx(IN,{block:n});case"keyboard":return r.jsx(PN,{block:n,keymap:s});case"gamepad":return r.jsx(WN,{block:n});default:return null}}function Zg({layout:n,keymap:s}){const i=m.useMemo(()=>QN(n),[n]),o=s||{},f=i.main||[],d=i.aside||[];return r.jsxs("div",{className:"space-y-0.5",children:[r.jsx(KN,{hero:i.hero,keymap:o}),r.jsxs("div",{className:"grid gap-0.5",style:{gridTemplateColumns:"repeat(auto-fit, minmax(360px, 1fr))"},children:[r.jsx("div",{className:"space-y-0.5",children:f.map((h,p)=>r.jsx(jx,{block:h,keymap:o},h.title||p))}),r.jsx("div",{className:"space-y-0.5",children:d.map((h,p)=>r.jsx(jx,{block:h,keymap:o},h.title||p))})]})]})}function Ig({layout:n,onOpenOverlay:s}){const{state:i}=_t();return r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-400",children:[r.jsx("span",{children:"Help"}),r.jsx("button",{type:"button",onClick:s,className:"button-dark px-1 py-0.25 text-[0.75rem]",children:"Open full help"})]}),r.jsx(Zg,{layout:n,keymap:i?.keymap||{}})]})}const ew=["kal","rms","slt","ksp","bdl"],tw=Array.from({length:10},(n,s)=>s*10);function qo({hideInput:n=!1,hideSpectatorNotice:s=!1,fillHeight:i=!1,allowSpectatorInput:o=!1}){const f=ft(R=>R.session),{messages:d,typing:h,sendMessage:p,registerInputRef:x,onInputFocus:g,onInputBlur:v,blurChat:y,setTypingActive:S}=cd(),{value:E,save:C}=He("tts",{engine:"flite",voice:"rms",pitch:50}),[k,w]=m.useState(""),[j,N]=m.useState(!1),[q,M]=m.useState(!1),[O,K]=m.useState(()=>E?.engine||"flite"),[_,U]=m.useState(()=>E?.voice||"rms"),[z,H]=m.useState(()=>Number.isFinite(E?.pitch)?E.pitch:50),V=f?.role!=="spectator"||o,W=m.useRef(null),oe=f?.assignment?.roverId||null,Y=!!m.useMemo(()=>f?.roster?.find(R=>String(R.id)===String(oe))||null,[oe,f?.roster])?.audio?.ttsEnabled,T=m.useMemo(()=>d.slice(-200),[d]),G=m.useMemo(()=>h||[],[h]);m.useEffect(()=>{W.current&&(W.current.scrollTop=W.current.scrollHeight)},[T,G]),m.useEffect(()=>{const R=E?.engine||"flite",$=E?.voice||"rms",ee=Number.isFinite(E?.pitch)?E.pitch:50;O!==R&&K(R),_!==$&&U($),z!==ee&&H(ee)},[O,z,E?.engine,E?.pitch,E?.voice,_]),m.useEffect(()=>{M(!!Y)},[Y]);const I=m.useMemo(()=>!Y||!q?null:O==="espeak"?{speak:!0,engine:O,pitch:z}:{speak:!0,engine:O,voice:_},[O,z,q,Y,_]);async function ie(R){if(R.preventDefault(),!V||n)return;const ee=k.replace(/\\n/g,` -`).trim();if(ee){N(!0);try{await p(ee,I),w(""),y(),S(!1)}catch(ae){alert(ae.message)}finally{N(!1)}}}const de=i?"flex-1 min-h-0 overflow-y-auto":"h-48 overflow-y-auto";return r.jsxs("section",{className:`panel-section space-y-0.5 text-base ${i?"flex h-full flex-col overflow-hidden":""}`,children:[r.jsxs("div",{className:`surface overflow-y-auto space-y-0.5 px-0 ${de}`,ref:W,children:[T.length===0&&G.length===0?r.jsx("p",{className:"text-sm text-slate-500",children:"No messages yet."}):T.map(R=>r.jsx(id,{message:R},R.id)),G.map(R=>r.jsx(gg,{message:R},`typing-${R.typingId||R.id}`))]}),!n&&r.jsxs("form",{className:"flex flex-wrap items-stretch gap-0.5",onSubmit:ie,children:[r.jsx("input",{className:"field-input flex-1 min-w-[10rem]",value:k,onChange:R=>{const $=R.target.value;w($),S(!!$.trim())},onFocus:R=>{g(R),S(!!k.trim())},onBlur:R=>{v(R),S(!1)},onKeyDown:R=>{R.key==="Enter"&&!k.trim()&&(R.preventDefault(),y(),S(!1))},ref:R=>x(R,{target:"panel"}),placeholder:V?"Type a message…":s?"":"Spectators cannot chat",disabled:!V}),Y&&r.jsxs("div",{className:"flex flex-wrap items-center gap-0.5 basis-full sm:basis-auto",children:[r.jsxs("label",{className:"flex items-center gap-0.5 text-xs text-slate-300",children:[r.jsx("input",{type:"checkbox",checked:q,onChange:R=>M(R.target.checked),className:"accent-cyan-500"}),r.jsx("span",{children:"Speak"})]}),r.jsxs("select",{value:O,onChange:R=>{const $=R.target.value;K($),C(ee=>({...ee||{},engine:$}))},className:"field-input text-xs",children:[r.jsx("option",{value:"flite",children:"flite"}),r.jsx("option",{value:"espeak",children:"espeak"})]}),O==="flite"?r.jsx("select",{value:_,onChange:R=>{const $=R.target.value;U($),C(ee=>({...ee||{},voice:$}))},className:"field-input text-xs",children:ew.map(R=>r.jsx("option",{value:R,children:R},R))}):r.jsx("select",{value:z,onChange:R=>{const $=Number(R.target.value);H($),C(ee=>({...ee||{},pitch:$}))},className:"field-input text-xs",children:tw.map(R=>r.jsxs("option",{value:R,children:["pitch ",R]},R))})]}),r.jsx("button",{type:"submit",disabled:!V||j,className:"button-dark h-full disabled:opacity-50 self-stretch",children:j?"...":"Send"})]})]})}function To({compact:n=!1}){const{session:s,setNickname:i}=nn(),{value:o,save:f}=He("profile",{nickname:""}),[d,h]=m.useState(o.nickname||""),[p,x]=m.useState(!1),g=s?.role!=="spectator";m.useEffect(()=>{h(o.nickname||"")},[o.nickname]);async function v(y){if(y.preventDefault(),!g)return;const S=(d||"").trim().slice(0,32);if(S){x(!0);try{await i(S),f({nickname:S})}catch(E){alert(E.message)}finally{x(!1)}}}return r.jsxs("form",{className:"grid w-full min-w-0 grid-cols-[minmax(0,1fr)_auto] items-stretch gap-0.5",onSubmit:v,children:[r.jsx("input",{className:"field-input flex-1 min-w-0",value:d,onChange:y=>h(y.target.value),maxLength:32,placeholder:"Enter a nickname",disabled:!g}),r.jsx("button",{type:"submit",disabled:!g||p,className:"button-dark h-full shrink-0 whitespace-nowrap px-0.5 py-0 disabled:opacity-50",children:p?"Saving…":n?"Set":"Save"})]})}function nw(n){const s=Array.isArray(n?.socials)?n.socials:null;if(s&&s.length)return s;const i=[];return n?.discord?.invite&&i.push({id:"discord",label:"Discord",url:n.discord.invite}),n?.kofi?.link&&i.push({id:"kofi",label:"Ko-fi",url:n.kofi.link}),i}function aw(n){if(!n||typeof n!="object")return null;const s=n.id||n.service||n.key||n.name||null,i=n.label||n.title||n.name||s||"Link",o=n.url||n.link||n.href||null;return o?{id:s,label:i,url:o}:null}function Jg({className:n=""}){const{session:s}=nn(),i=nw(s).map(aw).filter(Boolean).slice(0,4);return i.length?r.jsx("div",{className:`grid grid-cols-2 grid-rows-2 gap-0.5 ${n}`,children:i.map(o=>r.jsx(xd,{...o},`${o.id||o.label}-${o.url}`))}):null}function sw({compact:n=!1}){return r.jsx("section",{className:"panel-section flex h-full min-h-0 flex-col gap-0.5 text-base",children:r.jsx("div",{className:"surface flex w-full items-center px-0 py-0",children:r.jsx(To,{compact:n})})})}function lw(){return r.jsx("section",{className:"panel-section flex h-full min-h-0 flex-col gap-0.5 text-base",children:r.jsx(Jg,{className:"flex-1 min-h-0"})})}function yf(...n){return n.filter(Boolean).join(" ")}function iw(n){const s=n?.batteryState?.percentDisplay;return s==null?"--":`${s}%`}function rw(n){return n?.batteryState?n.batteryState.urgentActive?"text-red-400":n.batteryState.warnActive?"text-amber-300":"text-emerald-300":"text-slate-400"}function ow(n){switch(n){case"admin":case"lockdown":case"lockdown-admin":return"text-amber-300";case"spectator":return"text-slate-400";default:return"text-sky-300"}}function cw(n,s){if(!n)return"";const i=n.nickname||n.socketId?.slice(0,6)||"unknown";return n.socketId&&n.socketId===s?`${i} (you)`:i}function Do({title:n="Rovers"}){const s=ft(j=>j.session),{requestControl:i}=wn(),[o,f]=m.useState({}),[d,h]=m.useState(()=>Date.now()),p=m.useMemo(()=>s?.role&&s.role!=="spectator",[s?.role]),x=m.useMemo(()=>s?.role==="admin"||s?.role==="lockdown"||s?.role==="lockdown-admin",[s?.role]),g=s?.roster??[],v=s?.turnQueues??{},y=s?.users??[],S=s?.socketId||null,E=m.useMemo(()=>Object.values(v||{}).some(j=>j?.deadline||j?.idleDeadline),[v]);m.useEffect(()=>{if(!E)return;const j=setInterval(()=>{h(Date.now())},1e3);return()=>clearInterval(j)},[E]);const C=m.useMemo(()=>{const j=new Set(g.map(q=>String(q.id))),N=Object.keys(v||{}).filter(q=>!j.has(String(q))).map(q=>({id:q,name:q,locked:!1,batteryState:null}));return[...g,...N]},[g,v]);async function k(j){if(j){f(N=>({...N,[j]:!0}));try{await i(j)}catch(N){alert(N.message)}finally{f(N=>({...N,[j]:!1}))}}}const w=j=>y.find(N=>N.socketId===j)||{socketId:j,nickname:null,role:null};return r.jsxs("div",{className:"space-y-0.5 text-sm",children:[n&&r.jsx("p",{className:"text-sm text-slate-400",children:n}),C.length===0?r.jsx("p",{className:"text-sm text-slate-500",children:"No rovers registered."}):r.jsx("ul",{className:"space-y-0.5 text-sm",children:C.map(j=>{const N=String(j.id),q=v?.[N]||null,M=q?.queue||[],O=q?.idleDeadline||q?.deadline||null,K=O&&O>d?Math.ceil((O-d)/1e3):O?0:null,_=q?.current||null,U=_?M.findIndex(ie=>ie===_):-1,z=M.length>1?U>=0?M[(U+1)%M.length]:M[0]:null,H=!!(S&&_&&_===S),V=!!(S&&z&&z===S),W=K!=null&&(H||V),oe=!!j.locked,ce=oe&&!x,Y=!!(j?.private?.enabled&&j?.private?.open),T=j.lockReason?`locked: ${j.lockReason}`:"locked",G=oe?T:o[N]?"...":"request",I=p&&!ce&&!o[N];return r.jsxs("li",{className:yf("surface flex flex-wrap items-start justify-between gap-0.5",I&&"cursor-pointer",oe?"bg-red-900/40":Y?"bg-amber-700/35 border border-amber-200/30":null),onClick:()=>{I&&k(j.id)},children:[r.jsxs("div",{className:"flex min-w-0 flex-1 flex-col gap-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsxs("div",{className:"flex items-center gap-0.5",children:[r.jsx("p",{className:"text-slate-200",children:r.jsx("span",{className:"rounded px-1 py-[1px] border border-transparent",style:ca(j.color,.16),children:j.name})}),W?r.jsx("span",{className:"rounded bg-slate-800 px-1 text-[0.7rem] text-slate-200",children:H?`${K}s left`:`Your turn in ${K}s`}):null]}),r.jsx("span",{className:yf("text-[0.75rem] font-semibold",rw(j)),children:iw(j)})]}),M.length===0?r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:"No queue."}):r.jsx("div",{className:"flex flex-wrap items-center gap-0.5",children:M.map((ie,de)=>{const R=w(ie),$=ie===_,ee=!!(z&&ie===z&&!$),ae=$?"bg-sky-600 text-white ring-2 ring-amber-300":ee?"bg-emerald-700/60 text-emerald-100 ring-1 ring-emerald-300/70":"bg-slate-800 text-slate-200";return r.jsxs("span",{className:`flex items-center gap-0.5 rounded px-1 text-[0.7rem] ${ae}`,children:[r.jsx("span",{className:`${ow(R.role)} font-semibold`,children:cw(R,S)}),$&&r.jsx("span",{className:"text-[0.65rem] text-slate-200",children:"now"}),ee&&r.jsx("span",{className:"text-[0.65rem] text-emerald-100",children:"next"})]},`${N}-${ie}-${de}`)})})]}),p?r.jsx("button",{type:"button",onClick:ie=>{ie.stopPropagation(),k(j.id)},disabled:o[N]||ce,className:yf("button-dark disabled:opacity-40",oe&&"bg-red-600/70 text-white hover:bg-red-600"),children:G}):null]},j.id)})})]})}function uw(n){switch(n){case"admin":case"lockdown":case"lockdown-admin":return"text-amber-300";case"spectator":return"text-slate-400";default:return"text-sky-300"}}function fw(n,s){if(!n)return"";const i=n.nickname||n.socketId?.slice(0,6)||"unknown";return n.socketId&&n.socketId===s?`${i} (you)`:i}function So({hideNicknameForm:n=!1,hideHeader:s=!1,className:i="",fillHeight:o=!1,compact:f=!1}){const{session:d}=nn(),h=d?.role!=="spectator",p=d?.users??[],x=d?.socketId||null,g=m.useMemo(()=>[...p].sort((y,S)=>y.socketId===x?-1:S.socketId===x?1:(y.nickname||"").localeCompare(S.nickname||"")),[x,p]),v=o?"flex-1 min-h-0 overflow-y-auto":f?"h-28 overflow-y-auto":"h-48 overflow-y-auto";return r.jsxs("section",{className:`panel-section space-y-0.5 text-base ${o?"flex h-full min-h-0 flex-col overflow-hidden":""} ${i}`,children:[!n&&r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("div",{className:"grid gap-0.5 md:grid-cols-[minmax(0,1.4fr)_minmax(0,1fr)]",children:[r.jsx("div",{className:"min-w-0",children:r.jsx("div",{className:"surface flex w-full items-center px-0 py-0",children:r.jsx(To,{compact:f})})}),r.jsx(Jg,{})]}),!h&&r.jsx("p",{className:"text-xs text-slate-500",children:"Spectators cannot set nicknames."})]}),r.jsxs("div",{className:`space-y-0.5 ${o?"flex flex-1 min-h-0 flex-col":""}`,children:[!s&&r.jsxs("div",{className:`flex items-center justify-between text-sm text-slate-400 ${f?"text-xs":""}`,children:[r.jsx("span",{children:"Users"}),r.jsx("span",{className:"text-xs text-slate-500",children:g.length})]}),r.jsx("div",{className:`surface flex flex-wrap content-start items-start gap-0.5 px-0 pb-0 ${v} ${f?"text-[0.8rem]":""}`,children:g.length===0?r.jsx("p",{className:"text-sm text-slate-500",children:"Waiting for users…"}):g.map(y=>r.jsx("span",{className:`rounded bg-slate-800/80 px-1 py-0.25 text-[0.7rem] ${uw(y.role)}`,children:fw(y,x)},y.socketId))})]})]})}const dw=/^cu_[a-f0-9]{32}$/,Ei="field-input w-full max-w-sm text-left focus:ring-emerald-500",_o="mx-auto w-full max-w-xl flex justify-center",vi="mx-auto flex w-full max-w-md flex-col items-center space-y-0.5 text-center";function mw(n){const s=String(n||"").trim();return s?s.length<=10?`${s.slice(0,2)}***${s.slice(-2)}`:`${s.slice(0,6)}...${s.slice(-6)}`:""}const Ax=8*1024*1024,is=16e3,hw={iceServers:[{urls:"stun:stun.l.google.com:19302"}],bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"};function Nx(n){let s="";for(let o=0;o{if(!n||n.iceGatheringState==="complete"){i();return}const o=setTimeout(()=>{n.removeEventListener("icegatheringstatechange",f),i()},s);function f(){n.iceGatheringState==="complete"&&(clearTimeout(o),n.removeEventListener("icegatheringstatechange",f),i())}n.addEventListener("icegatheringstatechange",f)})}function wx(n){if(!n)return!1;const s=n.connectionState,i=n.iceConnectionState;return s==="connected"||i==="connected"||i==="completed"}function vw(n,s=1e4){return new Promise((i,o)=>{if(!n){o(new Error("Peer connection missing"));return}if(wx(n)){i();return}const f=setTimeout(()=>{h(),o(new Error("Peer connection timeout"))},s),d=()=>{wx(n)?(h(),i()):(n.connectionState==="failed"||n.connectionState==="closed"||n.iceConnectionState==="failed")&&(h(),o(new Error(`Peer connection ${n.connectionState||n.iceConnectionState}`)))};function h(){clearTimeout(f),n.removeEventListener("connectionstatechange",d),n.removeEventListener("iceconnectionstatechange",d)}n.addEventListener("connectionstatechange",d),n.addEventListener("iceconnectionstatechange",d)})}async function bw(n){if(!n?.getParameters||!n?.setParameters)return;const s=n.getParameters()||{},i=s.encodings&&s.encodings[0]||{};s.encodings=[{...i,maxBitrate:64e3,dtx:"disabled"}];try{await n.setParameters(s)}catch{}}function yw(n,s=6e3){return new Promise((i,o)=>{if(!n){o(new Error("Peer connection missing"));return}const f=Date.now();let d=-1;const h=setInterval(async()=>{if(Date.now()-f>s){clearInterval(h),o(new Error("WHIP connected but no outbound audio flow"));return}try{const p=n.getSenders().filter(x=>x.track?.kind==="audio");for(const x of p){const g=await x.getStats();for(const v of g.values()){if(v.type!=="outbound-rtp"||v.kind!=="audio")continue;const y=Number(v.bytesSent||0),S=Number(v.packetsSent||0);if(d<0)d=y;else if(y>d+200||S>5){clearInterval(h),i();return}}}}catch{}},250)})}function xn({label:n,active:s,detail:i=""}){return r.jsxs("div",{className:`rounded-md px-0.5 py-0.5 text-xs text-slate-100 ${s?"bg-emerald-500":"bg-slate-700"}`,children:[r.jsx("div",{className:"text-center font-medium",children:n}),r.jsx("div",{className:"text-center text-[0.72rem] opacity-90",children:i||(s?"active":"idle")})]})}function Cx({label:n}){return n?r.jsx("span",{className:"rounded border border-white/40 px-1 text-[0.7rem] text-white",children:n}):null}function Sw(n){const s=n.reduce((f,d)=>f+d.length,0),i=new Float32Array(s);let o=0;for(const f of n)i.set(f,o),o+=f.length;return i}function jw(n){const s=new Int16Array(n.length);for(let i=0;i{for(let v=0;vv&&s?.[v]||null,[s,v]),ee=!!($&&$.state!=="offline"&&!$.error),ae=$?.source==="upload"&&$?.state==="playing",me=$?.source==="mic-whip"&&($?.state==="starting"||$?.state==="playing"),re=!!(!j&&z.current&&(k||R)),ue=!j&&(N==="live"||N==="starting"),ve=j&&M==="recording",be=j&&M==="sending",xe=An(p?.keymap?.micPtt?.[0])||"M",Be=m.useCallback(P=>{const fe=P==="clip"?"clip":"live";g(Ne=>({...Ne||{},pttMode:fe}))},[g]),ze=async()=>{if(!v){_("Take control of your rover first.");return}if(!y){_("Select an audio file first.");return}if(y.size>Ax){_(`File too large (max ${Ax} bytes).`);return}C(!0),_("");try{const P=await y.arrayBuffer(),fe=Nx(new Uint8Array(P));await i?.({roverId:v,name:y.name,mime:y.type||"",dataBase64:fe}),_("Upload playback started.")}catch(P){_(P?.message||"Failed to play upload.")}finally{C(!1)}},Ae=async()=>{if(!v){_("Take control of your rover first.");return}C(!0),_("");try{await o?.(v),_("Upload playback stopped.")}catch(P){_(P?.message||"Failed to stop upload.")}finally{C(!1)}},tt=m.useCallback(async P=>{const fe=String(P||W.current||"").trim();if(V.current=!1,q("idle"),H.current){try{H.current.getSenders().forEach(Ne=>Ne.track?.stop())}catch{}try{H.current.close()}catch{}}if(H.current=null,U.current)try{U.current.getTracks().forEach(Ne=>Ne.stop())}catch{}if(U.current=null,z.current=null,fe)try{await h?.(fe)}catch{}W.current=""},[h]),Je=m.useCallback(async P=>{const fe=await f?.(P),Ne=String(fe?.whipUrl||"").trim(),pt=String(fe?.token||"").trim();if(!Ne||!pt)throw new Error("WHIP endpoint unavailable");const Ve=await navigator.mediaDevices.getUserMedia({audio:{channelCount:1,sampleRate:is,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1}});U.current=Ve;const st=Ve.getAudioTracks()?.[0];if(z.current=st||null,st&&(st.enabled=!!(k||R)),st?.applyConstraints)try{await st.applyConstraints({channelCount:1,sampleRate:is,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1})}catch{}const lt=new RTCPeerConnection(hw);H.current=lt,lt.onconnectionstatechange=()=>{if(!V.current)return;const Yt=lt.connectionState;if(Yt==="connected"){q("live");return}(Yt==="failed"||Yt==="disconnected"||Yt==="closed")&&(q("error"),_(`WHIP transport ${Yt}.`))},Ve.getAudioTracks().forEach(Yt=>{const La=lt.addTrack(Yt,Ve);bw(La)});const Ot=await lt.createOffer({offerToReceiveAudio:!1,offerToReceiveVideo:!1});await lt.setLocalDescription(Ot),await gw(lt,1800);const it=await fetch(Ne,{method:"POST",headers:{"Content-Type":"application/sdp",...xw(pt)},body:lt.localDescription?.sdp||Ot.sdp});if(!it.ok)throw new Error(`WHIP request failed: ${it.status}`);const ds=await it.text();await lt.setRemoteDescription({type:"answer",sdp:ds}),await vw(lt,1e4),await yw(lt,6e3),await d?.(P)},[k,R,d,f]),vt=m.useCallback(async()=>{if(ie.current=!1,T.current){try{T.current.disconnect()}catch{}T.current.onaudioprocess=null}if(Y.current)try{Y.current.disconnect()}catch{}if(G.current)try{G.current.disconnect()}catch{}if(oe.current)try{oe.current.getTracks().forEach(P=>P.stop())}catch{}if(ce.current)try{await ce.current.close()}catch{}I.current=[],T.current=null,Y.current=null,G.current=null,oe.current=null,ce.current=null,de.current=is},[]),le=m.useCallback(async()=>{if(oe.current&&ce.current&&T.current)return;O(st=>st==="recording"?st:"arming");const P=await navigator.mediaDevices.getUserMedia({audio:{channelCount:1,sampleRate:is,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1}}),fe=new AudioContext({latencyHint:"interactive"}),Ne=fe.createMediaStreamSource(P),pt=fe.createScriptProcessor(1024,1,1),Ve=fe.createGain();Ve.gain.value=0,pt.onaudioprocess=st=>{if(!ie.current)return;const lt=st.inputBuffer.getChannelData(0);I.current.push(new Float32Array(lt))},Ne.connect(pt),pt.connect(Ve),Ve.connect(fe.destination),oe.current=P,ce.current=fe,Y.current=Ne,T.current=pt,G.current=Ve,de.current=fe.sampleRate||is},[]),he=m.useCallback(async({send:P})=>{const fe=ie.current;if(ie.current=!1,!fe){P||O("idle");return}const Ne=I.current;if(I.current=[],!P){O("idle");return}if(!v){O("idle");return}if(!Ne.length){O("idle");return}O("sending");try{const pt=Sw(Ne),Ve=Aw(pt,de.current||is),st=Nx(Ve);await i?.({roverId:v,name:`ptt-${Date.now()}.wav`,mime:"audio/wav",dataBase64:st}),O("idle")}catch(pt){O("error"),_(pt?.message||"Failed to send PTT clip.")}},[i,v]),se=m.useCallback(async()=>{if(!v){_("Take control of your rover first.");return}await le(),I.current=[],ie.current=!0,O("recording")},[le,v]);return m.useEffect(()=>{let P=!1;async function fe(){if(j){await tt(W.current||v);return}if(!v){await tt(W.current);return}if(!(V.current&&W.current===v)&&!(!k&&!R))try{q("starting"),_(""),V.current=!0,W.current=v,await Je(v),P||q("live")}catch(Ne){P||(q("error"),_(Ne?.message||"Failed to start mic forwarding.")),await tt(v)}}return fe(),()=>{P=!0}},[j,k,R,v,Je,tt]),m.useEffect(()=>{const P=z.current;P&&(P.enabled=!!(!j&&(k||R)))},[j,k,R]),m.useEffect(()=>{let P=!1;async function fe(){if(!j||!v){ie.current&&await he({send:!1}),O("idle");return}try{await le(),!P&&!ie.current&&O("idle")}catch(Ne){P||(O("error"),_(Ne?.message||"Microphone access failed for clip mode."))}}return fe(),()=>{P=!0}},[j,le,he,v]),m.useEffect(()=>{let P=!1;async function fe(){if(j){if(!v){ie.current&&await he({send:!1});return}if(R){if(!ie.current)try{_(""),await se()}catch(Ne){P||(O("error"),_(Ne?.message||"Failed to start clip recording."))}}else ie.current&&await he({send:!0})}}return fe(),()=>{P=!0}},[j,he,R,v,se]),m.useEffect(()=>()=>{tt(W.current||v),vt()},[v,tt,vt]),r.jsxs("div",{className:"grid gap-0.5",children:[r.jsx("section",{className:"surface",children:r.jsxs("div",{className:"flex items-center justify-center gap-0.5 py-0.25 text-xs text-slate-300",children:[r.jsx("span",{children:"Push-to-Talk Key"}),r.jsx(Cx,{label:xe})]})}),r.jsxs("div",{className:"grid gap-0.5 grid-cols-1 lg:grid-cols-2",children:[r.jsx("section",{className:"surface h-full",children:r.jsxs("div",{className:"grid h-full gap-0.5 grid-rows-[auto_auto_1fr]",children:[r.jsx("p",{className:"text-sm text-slate-200 text-center",children:"PTT Mode"}),r.jsx("p",{className:"text-xs text-slate-400 text-center",children:"Choose how holding your PTT key behaves: live mic stream, or record-and-send clip. If the live stream doesn't work, switch to clip mode."}),r.jsxs("div",{className:"grid grid-cols-2 gap-0.5",children:[r.jsx("button",{type:"button",className:`button-dark w-full text-sm ${j?"":"bg-emerald-500 text-white hover:bg-emerald-500"}`,onClick:()=>Be("live"),children:"Live Mic (WHIP)"}),r.jsx("button",{type:"button",className:`button-dark w-full text-sm ${j?"bg-emerald-500 text-white hover:bg-emerald-500":""}`,onClick:()=>Be("clip"),children:"Record Clip"})]})]})}),r.jsx("section",{className:"surface h-full",children:r.jsxs("div",{className:"grid h-full gap-0.5 grid-rows-[auto_1fr]",children:[r.jsx("p",{className:"text-sm text-slate-200 text-center",children:"PTT Clip Status"}),r.jsxs("div",{className:"grid gap-0.5 content-start",children:[r.jsx(xn,{label:"Mode",active:j,detail:j?"record clip":"live mic"}),r.jsx(xn,{label:"PTT hold",active:R,detail:R?"held":"released"}),r.jsx(xn,{label:"Recording",active:ve,detail:ve?"capturing":"idle"}),r.jsx(xn,{label:"Playback",active:j&&ae,detail:j&&ae?"playing":"idle"})]})]})})]}),r.jsxs("div",{className:"grid gap-0.5 grid-cols-1 lg:grid-cols-2",children:[r.jsx("section",{className:"surface h-full",children:r.jsxs("div",{className:"grid h-full gap-0.5 grid-rows-[auto_auto_1fr_auto]",children:[r.jsx("p",{className:"text-sm text-slate-200 text-center",children:"Audio Upload"}),r.jsxs("label",{className:"mx-auto grid w-full max-w-sm gap-0.5 text-xs text-slate-300 text-center",children:[r.jsx("span",{children:"Audio file (mp3 / wav / ogg)"}),r.jsx("input",{className:`${Ei} text-center`,type:"file",accept:".mp3,.wav,.ogg,audio/mpeg,audio/wav,audio/ogg",disabled:E||!v,onChange:P=>S(P.target.files?.[0]||null)})]}),r.jsx("div",{className:"mx-auto w-full max-w-sm text-center",children:y?r.jsxs("div",{className:"surface-muted text-xs text-slate-300",children:[y.name," (",y.size," bytes)"]}):r.jsx("div",{className:"surface-muted text-xs text-slate-500",children:"No file selected"})}),r.jsxs("div",{className:"flex justify-center gap-0.5",children:[r.jsx("button",{type:"button",className:"button-dark text-sm",disabled:E||!v,onClick:ze,children:E?"Working...":"Play Upload"}),r.jsx("button",{type:"button",className:"button-dark text-sm",disabled:E||!v,onClick:Ae,children:"Stop"})]})]})}),r.jsx("section",{className:"surface h-full",children:r.jsxs("div",{className:"grid h-full gap-0.5 grid-rows-[auto_auto_1fr]",children:[r.jsx("p",{className:"text-sm text-slate-200 text-center",children:"Live Microphone"}),r.jsxs("label",{className:"surface-muted mx-auto flex w-full max-w-sm items-center justify-center gap-0.5 px-0.5 py-0.5 text-xs text-slate-300",children:[r.jsx("input",{type:"checkbox",checked:k,disabled:!v||j,onChange:P=>g(fe=>({...fe||{},openMicEnabled:!!P.target.checked}))}),r.jsx("span",{children:j?"Open mic (live mode only)":"Open mic"})]}),r.jsxs("div",{className:"grid gap-0.5 content-start",children:[r.jsx(xn,{label:"WHIP link",active:ue,detail:N}),r.jsx(xn,{label:"Mic hot",active:re,detail:re?"transmitting":"muted"}),r.jsxs("div",{className:"surface-muted text-center text-xs text-slate-400",children:["Hold ",r.jsx(Cx,{label:xe})," to talk"]})]})]})})]}),r.jsx("section",{className:"surface",children:r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-sm text-slate-200 text-center",children:"Audio Status"}),r.jsxs("div",{className:"grid gap-0.5 grid-cols-1 sm:grid-cols-2 lg:grid-cols-6",children:[r.jsx(xn,{label:"Forward pipe",active:ee,detail:ee?"connected":"offline"}),r.jsx(xn,{label:"Upload playback",active:ae,detail:ae?"playing":"idle"}),r.jsx(xn,{label:"Mic relay",active:me,detail:me?"active":"idle"}),r.jsx(xn,{label:"WHIP transport",active:ue,detail:N}),r.jsx(xn,{label:"Clip recording",active:ve,detail:ve?"recording":"idle"}),r.jsx(xn,{label:"Clip sending",active:be,detail:be?"sending":"idle"})]}),K?r.jsx("div",{className:"text-xs text-slate-400 text-center",children:K}):null]})})]})}function ww({pendingRequestId:n,currentStoredKey:s,nickname:i,requestVerification:o,applyIdentityKey:f,onMessage:d,fullWidth:h=!1}){const[p,x]=m.useState(0),[g,v]=m.useState(""),[y,S]=m.useState(!1),[E,C]=m.useState(!1),k=()=>{x(1),v(s),S(!1),d?.("")},w=()=>{x(0),S(!1)},j=async q=>{if(q.preventDefault(),!y){d?.("Please confirm your nickname agreement before sending.");return}if(p<3){d?.("Complete all request steps before sending.");return}C(!0),d?.("");try{const M=await f(g);await o?.(),v(M),x(0),S(!1),d?.("Verification request sent to lockdown admins.")}catch(M){d?.(M.message||"Failed to submit request.")}finally{C(!1)}},N=h?"w-full":_o;return n?r.jsx("section",{className:`surface text-sm text-slate-300 ${N}`,children:r.jsxs("div",{className:vi,children:["Verification request pending: ",n]})}):p===0?r.jsx("section",{className:`surface ${N}`,children:r.jsxs("div",{className:vi,children:[r.jsx("p",{className:"text-sm text-slate-300",children:"Verification"}),r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:k,disabled:E,children:"Request Verification"})]})}):r.jsx("form",{className:`surface ${N}`,onSubmit:j,children:r.jsxs("div",{className:vi,children:[r.jsx("p",{className:"text-sm text-slate-300",children:"Request verification"}),r.jsxs("p",{className:"text-xs text-slate-500",children:["Step ",p," of 3"]}),p===1?r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-xs text-slate-400",children:"Confirm your nickname, which is used as part of the verification process. You can edit it here before requesting."}),r.jsx("div",{className:"mx-auto w-full max-w-sm",children:r.jsx(To,{compact:!0})}),r.jsxs("div",{className:"surface-muted mx-auto w-full max-w-sm text-xs text-slate-300 text-center",children:["Current nickname: ",r.jsx("span",{className:"font-semibold",children:i||"(not set)"})]}),r.jsxs("label",{className:"flex items-center justify-center gap-0.5 text-xs text-slate-300 text-center",children:[r.jsx("input",{type:"checkbox",className:"accent-emerald-500",checked:y,onChange:q=>S(q.target.checked)}),r.jsx("span",{children:"I understand this nickname is tied to my verification."})]}),r.jsxs("div",{className:"flex justify-center gap-0.5",children:[r.jsx("button",{type:"button",className:"button-dark text-sm",disabled:!i||!y,onClick:()=>x(2),children:"Continue"}),r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:w,children:"Cancel"})]})]}):null,p===2?r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-xs text-slate-400",children:"Save your identity key in a safe place. You can use it to restore your identity in another browser."}),r.jsx("input",{className:Ei,type:"password",name:"identity_key_request",autoComplete:"current-password",maxLength:35,value:g,onChange:q=>v(q.target.value.toLowerCase()),placeholder:"Identity key for this request"}),r.jsxs("div",{className:"flex justify-center gap-0.5",children:[r.jsx("button",{type:"button",className:"button-dark text-sm",disabled:!g,onClick:()=>navigator.clipboard?.writeText(g),children:"Copy Key"}),r.jsx("button",{type:"button",className:"button-dark text-sm",disabled:!g,onClick:()=>x(3),children:"Continue"}),r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:()=>x(1),children:"Back"})]})]}):null,p===3?r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-xs text-slate-400",children:"Final step: confirm and send your verification request."}),r.jsx("input",{className:Ei,type:"password",name:"identity_key_request_final",autoComplete:"current-password",maxLength:35,value:g,onChange:q=>v(q.target.value.toLowerCase()),placeholder:"Identity key for this request"}),r.jsxs("div",{className:"flex justify-center gap-0.5",children:[r.jsx("button",{type:"submit",className:"button-dark text-sm",disabled:E||!g,children:"Confirm Request"}),r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:()=>x(2),children:"Back"})]})]}):null]})})}function Cw({currentStoredKey:n,applyIdentityKey:s,onMessage:i,fullWidth:o=!1}){const[f,d]=m.useState(0),[h,p]=m.useState(""),[x,g]=m.useState(!1),v=()=>{d(1),p(""),i?.("")},y=()=>{d(0),p("")},S=async C=>{if(C.preventDefault(),!(f<2)){g(!0),i?.("");try{await s(h),d(0),p(""),i?.("Identity key restored.")}catch(k){i?.(k.message||"Failed to restore key.")}finally{g(!1)}}},E=o?"w-full":_o;return r.jsx("section",{className:`surface ${E}`,children:r.jsxs("div",{className:vi,children:[r.jsx("p",{className:"text-sm text-slate-300",children:"Identity key"}),r.jsxs("p",{className:"text-xs text-slate-500",children:["Current: ",mw(n)||"not set yet"]}),r.jsx("input",{className:Ei,type:"password",name:"identity_key_current",autoComplete:"current-password",maxLength:35,value:n,readOnly:!0,placeholder:"Identity key"}),f===0?r.jsxs("div",{className:"flex justify-center gap-0.5",children:[r.jsx("button",{type:"button",className:"button-dark text-sm",disabled:!n,onClick:()=>navigator.clipboard?.writeText(n),children:"Copy Key"}),r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:v,disabled:x,children:"Restore Key"})]}):null,f===1?r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-xs text-slate-400",children:"Restoring your key should only be done when needed. Use this to move your identity to another browser."}),r.jsxs("div",{className:"flex justify-center gap-0.5",children:[r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:()=>d(2),children:"Continue"}),r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:y,children:"Cancel"})]})]}):null,f===2?r.jsxs("form",{className:"space-y-0.5",onSubmit:S,children:[r.jsx("input",{className:Ei,type:"password",name:"identity_key_restore",autoComplete:"current-password",maxLength:35,value:h,onChange:C=>p(C.target.value.toLowerCase()),placeholder:"Paste key to restore"}),r.jsxs("div",{className:"flex justify-center gap-0.5",children:[r.jsx("button",{type:"submit",className:"button-dark text-sm",disabled:x||!h,children:"Confirm Restore"}),r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:()=>d(1),children:"Back"})]})]}):null]})})}function Ew({requestableRovers:n=[],pendingRequests:s=[],requestPrivateRoverAccess:i,onMessage:o,fullWidth:f=!1}){const[d,h]=m.useState({}),p=m.useMemo(()=>{const v=new Map;return(s||[]).forEach(y=>{y?.roverId&&v.set(String(y.roverId),y)}),v},[s]),x=f?"w-full":_o,g=async v=>{if(v){h(y=>({...y,[v]:!0})),o?.("");try{(await i?.(v))?.existing?o?.("You already have a pending request for that rover."):o?.("Private rover access request sent to lockdown admins.")}catch(y){o?.(y.message||"Failed to send request.")}finally{h(y=>({...y,[v]:!1}))}}};return r.jsx("section",{className:`surface text-sm text-slate-300 ${x}`,children:r.jsxs("div",{className:vi,children:[r.jsx("p",{className:"text-sm text-slate-300",children:"Private rover access requests"}),n.length===0?r.jsx("p",{className:"text-xs text-slate-500",children:"No closed private rovers are available to request right now."}):r.jsx("div",{className:"w-full space-y-0.5",children:n.map(v=>{const y=String(v.id),S=!!d[y],E=p.get(y);return r.jsxs("div",{className:"surface-muted flex items-center justify-between gap-0.5 px-1 py-0.5",children:[r.jsxs("div",{className:"min-w-0 text-left",children:[r.jsx("p",{className:"truncate text-xs font-semibold text-slate-100",children:v.name||y}),r.jsx("p",{className:"truncate text-[0.7rem] text-slate-500",children:y})]}),E?r.jsx("span",{className:"rounded bg-amber-700/30 px-1 py-0.5 text-[0.7rem] text-amber-200",children:"Pending"}):r.jsx("button",{type:"button",onClick:()=>g(y),disabled:S,className:"button-dark text-xs disabled:opacity-50",children:S?"Sending...":"Request"})]},y)})})]})})}function $f(n){return String(n||"").trim()}function kw(n){const s=$f(n);return s?s.includes("DOCKINGRUNNING")?"Returning":s.includes("PAUSED")?"Paused":s.includes("HOUSECLEANINGRUNNING")?"Cleaning":s.includes("SPOTCLEANINGRUNNING")?"Spot cleaning":s.includes("STATE_START")?"Starting":s.includes("STATE_IDLE")||s.includes("STATE_STANDBY")?"Idle":s:"--"}function Nd(n){return n==="good"?"bg-emerald-600 text-white":n==="warn"?"bg-amber-500 text-slate-900":n==="danger"?"bg-rose-600 text-white":n==="info"?"bg-sky-600 text-white":"bg-slate-700 text-slate-100"}function eo({label:n,value:s,tone:i="muted"}){return r.jsxs("div",{className:`rounded-md px-1 py-0.75 text-center ${Nd(i)}`,children:[r.jsx("div",{className:"text-[0.72rem] opacity-90",children:n}),r.jsx("div",{className:"text-sm font-semibold",children:s})]})}function Sf({label:n,value:s,tone:i="muted"}){return r.jsxs("div",{className:`flex items-center justify-between rounded-md px-1 py-0.5 text-xs ${Nd(i)}`,children:[r.jsx("span",{children:n}),r.jsx("span",{className:"font-semibold truncate pl-1",title:String(s||""),children:s})]})}function Mw({neato:n,onStart:s,onSendHome:i,onLocate:o,onClearErrors:f,fullWidth:d=!1}){const[h,p]=m.useState(""),[x,g]=m.useState(""),v=d?"w-full":"w-full max-w-xl",y=!!n?.configured,S=!!(n?.enabled&&n?.connected),E=!!n?.telemetry?.extPowerPresent,C=!!n?.telemetry?.chargingActive,k=kw(n?.telemetry?.uiState),w=n?.telemetry?.batteryPercent,j=Number.isFinite(w)?`${w}%`:"--",N=n?.telemetry?.batteryVoltage,q=Number.isFinite(N)?`${N.toFixed(2)} V`:"--",M=$f(n?.telemetry?.robotError)||"--",O=$f(n?.telemetry?.robotAlert)||"--",K=M!=="--"&&!/^no errors$/i.test(M)&&!/^200/.test(M),_=O!=="--"&&!/^200/.test(O),U=n?.controls||{},z=!!U?.start?.available,H=!!U?.sendHome?.available,V=!!U?.locate?.available,W=!!U?.clearErrors?.available,oe=m.useMemo(()=>E?{key:"start",label:"Start cleaning",pending:"Starting...",toneClass:"bg-emerald-600 hover:bg-emerald-500 text-white",canRun:z,fn:s,successMessage:"Start cleaning command sent."}:{key:"home",label:"Send to dock",pending:"Sending...",toneClass:"bg-sky-600 hover:bg-sky-500 text-white",canRun:H,fn:i,successMessage:"Send to dock command sent."},[E,z,s,H,i]),ce=y&&S&&oe.canRun,Y=y&&S&&V,T=y&&S&&W,G=async($,ee,ae)=>{if(ee){p($),g("");try{await ee(),g(ae)}catch(me){g(me?.message||"Action failed.")}finally{p("")}}},I=y?S?"Online":"Offline":"Not configured",ie=y?S?"good":"danger":"warn",de=w==null?"muted":w>=60?"good":w>=25?"warn":"danger",R=E?"Docked":k!=="--"?k:"Away from dock";return r.jsx("section",{className:`surface text-sm text-slate-200 ${v}`,children:r.jsxs("div",{className:"grid gap-0.5",children:[r.jsxs("div",{className:"relative flex items-center justify-center min-h-[1.5rem]",children:[r.jsx("p",{className:"text-sm text-slate-100 text-center",children:"Neato Controls"}),r.jsx("span",{className:`absolute right-0 inline-flex w-auto rounded px-1 py-0.25 text-xs font-semibold ${Nd(ie)}`,children:I})]}),r.jsxs("div",{className:"grid gap-0.5 grid-cols-1 lg:grid-cols-[minmax(0,1.2fr)_minmax(0,0.8fr)]",children:[r.jsx("section",{className:"surface-muted px-0.5 py-0.5",children:r.jsxs("div",{className:"grid gap-0.5",children:[r.jsxs("div",{className:"rounded-md bg-slate-800 px-1 py-0.75 text-center",children:[r.jsx("div",{className:"text-xs text-slate-300",children:"State"}),r.jsx("div",{className:"text-base font-semibold text-slate-100",children:R})]}),r.jsxs("div",{className:"grid grid-cols-2 gap-0.5",children:[r.jsx("button",{type:"button",disabled:!ce||!!h,onClick:()=>G(oe.key,oe.fn,oe.successMessage),className:`rounded-md px-1 py-1 text-base font-semibold transition disabled:opacity-50 ${oe.toneClass}`,children:h===oe.key?oe.pending:oe.label}),r.jsxs("div",{className:"grid grid-cols-2 gap-0.5",children:[r.jsx("button",{type:"button",disabled:!Y||!!h,onClick:()=>G("locate",o,"Play sound command sent."),className:"rounded-md bg-fuchsia-600 px-1 py-0.75 text-sm font-semibold text-white transition hover:bg-fuchsia-500 disabled:opacity-50",children:h==="locate"?"Playing...":"Play sound"}),r.jsx("button",{type:"button",disabled:!T||!!h,onClick:()=>G("clearErrors",f,"Clear errors command sent."),className:"rounded-md bg-amber-500 px-1 py-0.75 text-sm font-semibold text-slate-900 transition hover:bg-amber-400 disabled:opacity-50",children:h==="clearErrors"?"Clearing...":"Clear errors"})]})]})]})}),r.jsx("section",{className:"surface-muted px-0.5 py-0.5",children:r.jsxs("div",{className:"grid gap-0.5 grid-cols-2",children:[r.jsx(eo,{label:"Battery",value:j,tone:de}),r.jsx(eo,{label:"Voltage",value:q,tone:N==null?"muted":"info"}),r.jsx(eo,{label:"Docked",value:E?"Yes":"No",tone:E?"info":"muted"}),r.jsx(eo,{label:"Charging",value:C?"Yes":"No",tone:C?"info":"muted"})]})})]}),r.jsx("section",{className:"surface-muted px-0.5 py-0.5",children:r.jsxs("div",{className:"grid gap-0.5 grid-cols-1 md:grid-cols-3",children:[r.jsx(Sf,{label:"UI state",value:k,tone:"muted"}),r.jsx(Sf,{label:"Robot error",value:M,tone:K?"danger":"muted"}),r.jsx(Sf,{label:"Robot alert",value:O,tone:_?"warn":"muted"})]})}),!y||!S||!oe.canRun||!V||!W?r.jsx("p",{className:"text-xs text-slate-400 text-center",children:y?S?"Waiting for required Neato entities in Home Assistant.":"Home Assistant is offline.":"Set homeAssistant.neato.device in server config to enable Neato controls."}):null,x?r.jsx("div",{className:"text-xs text-slate-300 text-center",children:x}):null]})})}function Pg(){const{session:n,identifySession:s,requestVerification:i,requestPrivateRoverAccess:o,playUploadedAudio:f,stopUploadedAudio:d,startMicWhip:h,readyMicWhip:p,stopMicWhip:x,neatoStart:g,neatoSendHome:v,neatoLocate:y,neatoClearErrors:S}=nn(),{value:E,save:C}=He("identity",{cookieUserId:""}),{value:k}=He("profile",{nickname:""}),w=m.useMemo(()=>(E?.cookieUserId||"").trim(),[E?.cookieUserId]),j=(k?.nickname||"").trim(),N=!!n?.isVerified,q=n?.verification?.pendingRequestId||null,M=n?.privateRoverAccess?.requestableRovers||[],O=n?.privateRoverAccess?.pendingRequests||[],K=String(n?.assignment?.roverId||"").trim(),[_,U]=m.useState(""),z=async H=>{const V=String(H||"").trim().toLowerCase();if(!V)throw new Error("Identity key required.");if(!dw.test(V))throw new Error("Identity key must match format: cu_ + 32 lowercase hex chars.");return C(W=>({...W||{},cookieUserId:V})),await s({cookieUserId:V,nickname:j}),V};return r.jsxs("section",{className:"panel-section space-y-0.5 text-base",children:[r.jsxs("div",{className:"grid gap-0.5 grid-cols-1 lg:grid-cols-[minmax(0,1.25fr)_minmax(0,0.9fr)]",children:[r.jsx("div",{className:"lg:col-span-2",children:N?r.jsx("section",{className:"surface w-full",children:r.jsxs("div",{className:"mx-auto flex w-full max-w-md flex-col items-center space-y-0.5 text-center",children:[r.jsx("p",{className:"text-sm text-emerald-300",children:"Verification complete"}),r.jsx("p",{className:"text-xs text-slate-400",children:"VIP controls are unlocked for your assigned rover."})]})}):r.jsx(ww,{pendingRequestId:q,currentStoredKey:w,nickname:j,requestVerification:i,applyIdentityKey:z,onMessage:U,fullWidth:!0})}),r.jsx("div",{className:"lg:col-span-2",children:N?r.jsxs("div",{className:"space-y-0.5",children:[r.jsx(Mw,{neato:n?.neato||null,onStart:g,onSendHome:v,onLocate:y,onClearErrors:S,fullWidth:!0}),r.jsx(Nw,{ownRoverId:K,audioForwardByRover:n?.audioForward||{},playUploadedAudio:f,stopUploadedAudio:d,startMicWhip:h,readyMicWhip:p,stopMicWhip:x})]}):r.jsx("section",{className:"surface h-full",children:r.jsx("div",{className:"flex h-full flex-col items-center justify-center text-center text-xs text-slate-400",children:"Verify your account to unlock VIP controls."})})}),r.jsx("div",{className:"lg:col-span-2",children:r.jsx(Ew,{requestableRovers:M,pendingRequests:O,requestPrivateRoverAccess:o,onMessage:U,fullWidth:!0})}),r.jsx("div",{className:"lg:col-span-2",children:r.jsx(Cw,{currentStoredKey:w,applyIdentityKey:z,onMessage:U,fullWidth:!0})})]}),_?r.jsx("div",{className:_o,children:r.jsx("p",{className:"text-xs text-slate-400 text-center",children:_})}):null]})}const Rw=420,qw=1200,Tw={1:262,2:330,3:392,4:523};function jo(){const{session:n}=nn(),s=tn(),{value:i}=He("audio",ct),o=Number.isFinite(i?.masterVolume)?i.masterVolume:ct.masterVolume,f=Number.isFinite(i?.alertVolume)?i.alertVolume:ct.alertVolume,d=Math.max(0,Math.min(1,o*f)),h=m.useMemo(()=>{const k=Array.isArray(n?.buttonBox?.buttons)?n.buttonBox.buttons:[];return k.length===4?k:[1,2,3,4].map(w=>k.find(j=>Number(j?.id)===w)||{id:w,count:0,goal:0,rewardName:null,rewardId:null,rewardNumber:null,lastRewardAt:null})},[n?.buttonBox?.buttons]),[p,x]=m.useState({}),[g,v]=m.useState({}),y=m.useRef(new Map),S=m.useRef(new Map),E=m.useRef({}),C=m.useRef(null);return m.useEffect(()=>{const k={};h.forEach(j=>{k[j.id]=Number(j.lastRewardAt||0)});const w=E.current||{};h.forEach(j=>{const N=Number(j.id),q=k[N]||0,M=Number(w[N]||0);if(q>0&&q!==M){v(_=>({..._,[N]:!0}));const O=S.current.get(N);O&&clearTimeout(O);const K=setTimeout(()=>{v(_=>({..._,[N]:!1})),S.current.delete(N)},qw);S.current.set(N,K)}}),E.current=k},[h]),m.useEffect(()=>{function k(j){const N=Tw[j];if(!N||d<=0)return;let q=C.current;if(!q){const _=window.AudioContext||window.webkitAudioContext;if(!_)return;q=new _,C.current=q}const M=q.createOscillator(),O=q.createGain();M.type="square",M.frequency.value=N;const K=.14*d;O.gain.setValueAtTime(1e-4,q.currentTime),O.gain.exponentialRampToValueAtTime(Math.max(1e-4,K),q.currentTime+.01),O.gain.exponentialRampToValueAtTime(1e-4,q.currentTime+.2),M.connect(O),O.connect(q.destination),M.start(),M.stop(q.currentTime+.21)}function w(j={}){const N=Number(j.buttonId);if(!Number.isFinite(N)||N<1||N>4)return;x(O=>({...O,[N]:!0}));const q=y.current.get(N);q&&clearTimeout(q);const M=setTimeout(()=>{x(O=>({...O,[N]:!1})),y.current.delete(N)},Rw);y.current.set(N,M),k(N)}return s.on("buttonBox:increment",w),()=>{s.off("buttonBox:increment",w)}},[d,s]),r.jsxs("section",{className:"panel-section space-y-0.5 text-base",children:[r.jsx("header",{className:"panel-muted text-center text-sm",children:r.jsx("p",{children:"Button Box"})}),r.jsx("div",{className:"grid grid-cols-4 gap-0.5",children:h.map(k=>{const w=Number(k.id),j=Number.isFinite(k.count)?k.count:0,N=Number.isFinite(k.goal)?k.goal:0,q=typeof k.rewardName=="string"&&k.rewardName.trim()?k.rewardName.trim():"Unassigned",M=Number.isFinite(k.rewardNumber)?k.rewardNumber:"?",O=!!p[w],K=!!g[w];return r.jsx(vg,{buttonId:w,count:j,goal:N,rewardNumber:M,rewardName:q,className:[O?"bg-cyan-900/45":"",K?"bg-fuchsia-900/45":""].filter(Boolean).join(" ")},w)})})]})}function Dw(){const{state:{roverId:n}}=_t(),i=dl(n)?.sensors||{};return r.jsx("section",{className:"panel-section",children:r.jsx("div",{className:"aspect-square w-full",children:r.jsx(Hf,{sensors:i})})})}function _w(){const{state:{roverId:n,keymap:s,camera:i,horn:o},pipeline:f,actions:{setServoAngle:d,setNightVision:h,startHorn:p,stopHorn:x}}=_t(),g=Dg(n),v=g.docked&&!g.driving,y=i?.config,S=!!(n&&i?.enabled&&y),E=!!(n&&f?.nightVision),C=f?.nightVisionState,k=!!(n&&f?.horn),w=o?.overheated,j=typeof y?.minAngle=="number"?y.minAngle:-30,N=typeof y?.maxAngle=="number"?y.maxAngle:30,q=typeof i?.angle=="number"?i.angle:typeof y?.homeAngle=="number"?y.homeAngle:(j+N)/2,M=An(s?.nightVisionToggle?.[0]),O=An(s?.hornHonk?.[0]),K=An(s?.cameraUp?.[0]),_=An(s?.cameraDown?.[0]);return r.jsxs("section",{className:"panel-section grid h-full min-h-0 grid-rows-[minmax(0,1fr)_auto] gap-0.5",children:[r.jsx(_g,{layout:"desktop",expand:!0,driveDockState:g}),v?null:r.jsxs("div",{className:"surface space-y-0.5 p-0 text-sm text-slate-200",children:[E&&r.jsx(Bg,{nightVisionOn:C?.nightVisionOn,disabled:!n,onToggle:h,keyLabel:M}),k&&r.jsx(Og,{disabled:!n||w,onStart:p,onStop:x,keyLabel:O,active:o?.active,heat:o?.heat}),S&&r.jsx(Lg,{value:q,min:j,max:N,onChange:d,keyDownLabel:_,keyUpLabel:K,className:"space-y-0.5 px-1 py-1",labelRowClass:"text-xs text-slate-300",labelClass:"",valueClass:"font-mono text-slate-100",sliderClass:"w-full",accentClass:"accent-emerald-400",endpointClass:"text-[0.7rem] text-slate-400"})]})]})}function Bw({layout:n,onOpenHelpOverlay:s}){const i=ft(E=>E.session),{state:o}=_t(),{value:f}=He("vipAudio",{openMicEnabled:!1,pttMode:"live"}),d=i?.isVerified?"bg-emerald-400":"bg-red-600",h=String(i?.assignment?.roverId||"").trim(),p=h?i?.audioForward?.[h]:null,x=!!o?.mic?.pttActive,g=!!f?.openMicEnabled,v=f?.pttMode==="clip"?"clip":"live",y=!!(h&&i?.isVerified&&(v==="clip"?x:g||x)),S=!!(h&&i?.isVerified&&v==="clip"&&p?.source==="upload"&&p?.state==="playing");return r.jsx("section",{className:"panel text-base",children:r.jsxs(Sd,{defaultTab:"telemetry",children:[r.jsxs(jd,{children:[r.jsx(Wt,{id:"telemetry",children:"Controls"}),r.jsx(Wt,{id:"vip",highlight:S?"green":y?"pink":"none",children:r.jsxs("span",{className:"inline-flex items-center gap-2",children:[r.jsx("span",{children:"VIP"}),r.jsx("span",{className:`inline-block h-3 w-3 rounded-full ${d}`,"aria-hidden":"true",title:i?.isVerified?"Verified":"Not verified"})]})}),r.jsx(Wt,{id:"help",children:"Help"}),r.jsx(Wt,{id:"settings",children:"Settings"})]}),r.jsxs(Ad,{children:[r.jsx(en,{id:"telemetry",children:r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("div",{className:"grid items-stretch gap-0.5 grid-cols-[minmax(0,1.35fr)_minmax(0,0.95fr)]",children:[r.jsx(Dw,{}),r.jsx(_w,{})]}),r.jsxs("div",{className:"grid gap-0.5 grid-cols-[minmax(0,1fr)_minmax(0,0.9fr)_minmax(0,0.75fr)]",children:[r.jsx(Do,{}),r.jsx(sd,{panelId:"replay-sources-desktop",fillHeight:!0}),r.jsx(lw,{})]}),r.jsxs("div",{className:"grid items-stretch gap-0.5 grid-cols-[minmax(0,1.3fr)_minmax(0,0.22fr)] h-[14rem]",children:[r.jsx(qo,{fillHeight:!0}),r.jsxs("div",{className:"grid min-h-0 gap-0.5 grid-rows-[minmax(0,1fr)_auto]",children:[r.jsx(So,{compact:!0,hideNicknameForm:!0,fillHeight:!0}),r.jsx(sw,{compact:!0})]})]}),r.jsx($g,{}),r.jsx(jo,{}),r.jsx(dd,{defaultOrientation:"horizontal",panelId:"rightpane-telemetry"})]})}),r.jsx(en,{id:"vip",keepMounted:!0,children:r.jsx(Pg,{})}),r.jsx(en,{id:"help",children:r.jsx(Ig,{layout:n,onOpenOverlay:s})}),r.jsx(en,{id:"settings",children:r.jsx(Qg,{})})]})]})})}const Ow=new Set(["admin","lockdown","lockdown-admin"]),Lw=new Set(["lockdown","lockdown-admin"]),zw=new Set(["admin","lockdown"]);function Uw(n="admin"){return n==="lockdown"?{title:"Lockdown mode active",description:"Only the server owners can access the interface at this time."}:{title:"Admin mode active"}}function Hw(){const n=ft(S=>S.session),s=n?.mode,i=n?.role,o=n?.adminReason?.text||"";n?.adminReason?.updatedAt;const f=n?.timezone||"UTC",d=n?.socials?.find(S=>String(S?.id||S?.label||"").toLowerCase()==="discord")?.url||n?.discord?.invite||null,h=zw.has(s),p=s==="lockdown"?Lw.has(i):Ow.has(i),[x,g]=m.useState(()=>new Date),v=m.useMemo(()=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:f,hour:"numeric",minute:"2-digit",second:"2-digit"}).format(x)}catch{return x.toLocaleTimeString()}},[x,f]);if(m.useEffect(()=>{const S=setInterval(()=>g(new Date),1e3);return()=>clearInterval(S)},[]),!h||p)return null;const y=Uw(s);return r.jsx("div",{className:"pointer-events-auto fixed inset-0 z-50 flex items-center justify-center bg-black/85 px-0.5 py-0.5",children:r.jsxs("div",{className:"surface w-full max-w-md space-y-0.5 text-slate-100 shadow-2xl",children:[r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-lg font-semibold",children:y.title}),r.jsx("p",{className:"text-sm text-slate-300",children:y.description})]}),r.jsxs("div",{className:"surface-muted space-y-0.5",children:[r.jsx("p",{className:"text-[0.7rem] tracking-wide text-slate-400",children:"Reason for locking:"}),r.jsx("p",{className:"text-lg font-semibold text-slate-100",children:o||"No reason set."}),r.jsxs("p",{className:"text-center text-sm text-slate-300",children:["Server time: ",v]})]}),r.jsx("div",{className:"surface-muted",children:r.jsx(Gg,{})}),r.jsx("div",{className:"w-full justify-center items-center",children:r.jsx(xd,{id:"discord",label:"Join our Discord server for updates!",url:d})}),"You can still use the chat while the server is locked:",r.jsxs("div",{className:"max-h-80 overflow-y-auto",children:[r.jsx(qo,{}),r.jsx(To,{})]})]})})}const Vw="/assets/turn_alert-DVO8EZJa.mp3";function $w(n,s=1){const i=m.useRef(null);return m.useEffect(()=>{i.current=new Audio(n),i.current.volume=s,i.current.load()},[n,s]),()=>{i.current&&(i.current.volume=s,i.current.currentTime=0,i.current.play().catch(()=>{}))}}function Gw(){const n=ft(v=>v.session),{pushAlert:s}=wn(),{value:i}=He("audio",ct),o=Number.isFinite(i?.masterVolume)?i.masterVolume:ct.masterVolume,f=Number.isFinite(i?.alertVolume)?i.alertVolume:ct.alertVolume,d=Math.max(0,Math.min(1,o*f)),h=$w(Vw,d),p=m.useRef(new Set),x=m.useMemo(()=>n?.turnQueues||{},[n?.turnQueues]),g=n?.socketId||null;return m.useEffect(()=>{if(!g)return;const v=[];Object.entries(x).forEach(([y,S])=>{!S||!S.current||S.current!==g||p.current.has(y)||(v.push(y),p.current.add(y))}),Object.keys(x).forEach(y=>{(!x[y]||x[y].current!==g)&&p.current.delete(y)}),v.length!==0&&(v.forEach(y=>{const S=n?.roster?.find(E=>String(E.id)===String(y))?.name||y;s({title:"Your turn!",message:`You now control ${S}.`,color:"#ff5722"})}),h())},[x,h,s,n?.roster,g]),null}function Yw({visible:n,mode:s,onEnterFullscreen:i,onDismiss:o}){if(!n)return null;const f=s==="pwa-hint";return r.jsx("div",{className:"fixed inset-0 z-40 flex items-end justify-center p-2 pointer-events-none sm:items-center",children:r.jsx("div",{className:"pointer-events-auto w-full max-w-sm rounded-lg border border-cyan-500/40 bg-zinc-950/95 shadow-xl",children:r.jsxs("div",{className:"space-y-0.5 p-4 text-sm text-slate-100",children:[r.jsx("h2",{className:"text-base font-semibold text-white",children:"Better in fullscreen"}),f?r.jsxs("p",{className:"text-slate-300",children:["For fullscreen on iOS, open Safari's share menu and pick ",r.jsx("strong",{children:"Add to Home Screen"}),". Launching from the home screen removes the browser chrome."]}):r.jsx("p",{className:"text-slate-300",children:"Enable fullscreen to free up more space for the video feed and controls. You can exit fullscreen at any time via the system back or home gesture."}),r.jsxs("div",{className:"flex justify-end gap-0.5 pt-1 text-sm",children:[r.jsx("button",{type:"button",className:"rounded border border-slate-600 px-3 py-1 text-slate-200",onClick:o,children:f?"Got it":"Not now"}),!f&&r.jsx("button",{type:"button",className:"rounded bg-cyan-500 px-3 py-1 font-semibold text-black hover:bg-cyan-400",onClick:i,children:"Enter fullscreen"})]})]})})})}function Fw({side:n="right",onClick:s}){const i=n==="left"?"left-2":"right-2";return r.jsx("button",{type:"button",onClick:s,className:`fixed bottom-2 ${i} z-30 flex h-10 w-10 items-center justify-center rounded-full border border-cyan-200/50 bg-slate-900/70 text-cyan-100 shadow-lg backdrop-blur-sm transition hover:bg-slate-800/80 active:scale-95`,"aria-label":"Enter fullscreen",title:"Enter fullscreen",children:r.jsx("svg",{viewBox:"0 0 24 24",width:"18",height:"18","aria-hidden":"true",className:"pointer-events-none",children:r.jsx("path",{d:"M4 9V4h5M15 4h5v5M20 15v5h-5M9 20H4v-5",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})})}const Wg="fullscreenPromptDismissed",Xw=new Set(["mobile-portrait","mobile-landscape"]),ev=()=>{if(typeof window>"u")return null;try{return window.sessionStorage}catch{return null}},Qw=()=>{const n=ev();if(!n)return!1;try{return n.getItem(Wg)==="1"}catch{return!1}},Ex=()=>{const n=ev();if(n)try{n.setItem(Wg,"1")}catch{}},Kw=()=>{if(typeof navigator>"u")return!1;const n=navigator.userAgent||navigator.platform||"";return/iphone|ipad|ipod/i.test(n)},kx=()=>{if(typeof document>"u")return!1;const n=document;return!!(n.fullscreenEnabled||n.webkitFullscreenEnabled||n.mozFullScreenEnabled||n.msFullscreenEnabled)};function Zw(n){const s=Xw.has(n),[i,o]=m.useState(!1),[f,d]=m.useState("native"),[h,p]=m.useState(!1),x=m.useMemo(()=>Kw(),[]),g=m.useMemo(()=>kx(),[]),v=m.useCallback(()=>{if(!s){o(!1),p(!1);return}if(!h&&Qw()){o(!1);return}if(x){d("pwa-hint"),o(!0);return}if(!kx()){o(!1);return}if(typeof document<"u"&&document.fullscreenElement){o(!1);return}d("native"),o(!0)},[h,x,s]);m.useEffect(()=>{v()},[v]),m.useEffect(()=>{if(typeof document>"u")return;const C=()=>{if(document.fullscreenElement){p(!1),o(!1);return}v()};return document.addEventListener("fullscreenchange",C),document.addEventListener("webkitfullscreenchange",C),()=>{document.removeEventListener("fullscreenchange",C),document.removeEventListener("webkitfullscreenchange",C)}},[v]);const y=m.useCallback(()=>{Ex(),p(!1),o(!1)},[]),S=m.useCallback(async()=>{if(!s||x||typeof document>"u")return!1;if(document.fullscreenElement)return!0;const C=document.documentElement;if(!C)return!1;const k=C.requestFullscreen||C.webkitRequestFullscreen||C.mozRequestFullScreen||C.msRequestFullscreen;if(!k)return!1;try{const w=k.call(C);return w&&typeof w.then=="function"&&await w,Ex(),p(!1),o(!1),!0}catch(w){return console.warn("Failed to enter fullscreen",w),!1}},[x,s]),E=m.useCallback(()=>{s&&(p(!0),d(x?"pwa-hint":"native"),o(!0))},[x,s]);return m.useEffect(()=>{s||(p(!1),o(!1))},[s]),{visible:i,mode:f,isIOS:x,nativeSupported:g,enterFullscreen:S,dismiss:y,showPrompt:E}}function Iw({visible:n,layout:s,onClose:i,showOnLoad:o,onToggleShowOnLoad:f}){if(!n)return null;const{state:d}=_t(),h=p=>{const x=!p.target.checked;f?.(x)};return r.jsx("div",{className:"fixed inset-0 z-30 flex items-center justify-center bg-black/80 px-0.5 py-0.5",children:r.jsxs("div",{className:"pointer-events-auto surface w-full max-w-4xl max-h-[90vh] overflow-hidden shadow-2xl",children:[r.jsxs("div",{className:"flex items-center justify-between border-b border-slate-700 px-0.5 py-0.25 text-sm text-slate-200",children:[r.jsx("span",{className:"font-semibold",children:"Help & controls"}),r.jsxs("div",{className:"flex items-center gap-0.5 text-[0.8rem] text-slate-300",children:[r.jsxs("label",{className:"flex items-center gap-0.5",children:[r.jsx("input",{type:"checkbox",checked:!o,onChange:h,className:"accent-cyan-500"}),r.jsx("span",{children:"Don't show again"})]}),r.jsx("button",{type:"button",onClick:i,className:"button-dark px-2 py-0.25 text-[0.8rem]",children:"Close"})]})]}),r.jsx("div",{className:"max-h-[85vh] overflow-y-auto p-0.5",children:r.jsx(Zg,{layout:s,keymap:d?.keymap||{}})})]})})}const Jw=`aroma + `,document.head.appendChild(s)},[])}function KA(n,s){return typeof n=="string"&&n.trim()?n.trim().toLowerCase():typeof s=="string"&&s.trim()?s.trim().toLowerCase().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,""):""}function xd({id:n,label:s,url:i,className:o=""}){if(!i)return null;QA();const f=KA(n,s),d=FA[f]||jj,h=XA[f]||null,p=s||n||"Link";return r.jsxs("a",{href:i,target:"_blank",rel:"noopener noreferrer","aria-label":p,className:`inline-flex items-center w-full px-0.5 py-0.5 text-sm font-medium text-white transition justify-center gap-1 rounded-md ${h?"":"bg-slate-700 hover:bg-slate-600"} ${o}`,style:h||void 0,children:[r.jsx(d,{className:"mr-0"}),p]})}const Ai=10;function Vg({batteryState:n=null,charge:s=null,config:i=null}){const o=n?.percentDisplay!=null&&Number.isFinite(n.percentDisplay)?Math.round(n.percentDisplay):null,f=n?.warnActive??null,d=n?.urgentActive??null,h=i?.Full??null,p=i?.Warn??null,x=i?.Urgent??null,g=s??n?.charge??null;let v=o;if(v==null&&(v=ZA({charge:g,full:h,warn:p,urgent:x})),v==null)return{available:!1};const y=Math.max(0,Math.min(1,v/100)),S=f??(p!=null&&g!=null&&g<=p),E=d??(x!=null&&g!=null&&g<=x);return{available:!0,percent:y,percentDisplay:v,warnActive:S,urgentActive:E,warnDisplayPercent:Ai}}function ZA({charge:n,full:s,warn:i,urgent:o}){if(n!=null&&s!=null&&i!=null&&o!=null&&s>i&&i>o){const f=Ai/100,d=1-f;if(n<=o)return 0;if(n<=i){const p=(n-o)/(i-o);return Math.round(Math.max(0,Math.min(1,p))*Ai)}if(n>=s)return 100;const h=(n-i)/(s-i);return Math.round((f+Math.max(0,Math.min(1,h))*d)*100)}return null}const IA=1600,JA=800;function Sn(...n){return n.filter(Boolean).join(" ")}function Vf({visual:n,orientation:s="horizontal",variant:i="inline",compact:o=!1,showLabel:f,className:d=""}){const h=i==="background",p=s==="vertical",x=f??!h;if(!n?.available){if(h){const W=Ai,ce=Sn("absolute z-10",p?"left-0 right-0 h-[2px]":"top-0 bottom-0 w-[2px]","bg-black/70",E&&!S&&"battery-tick-warn"),oe=p?{bottom:`${W}%`}:{left:`${W}%`},$=Sn("absolute inset-0 pointer-events-none",d);return r.jsxs("div",{className:$,children:[r.jsx("div",{className:"absolute inset-0 bg-slate-900/35"}),r.jsx("div",{className:ce,style:oe})]})}return p?null:r.jsx("p",{className:"text-xs text-slate-500",children:"Battery telemetry unavailable"})}const g=n.percentDisplay??0,v=Math.max(0,Math.min(100,g)),y=n.warnDisplayPercent??Ai,S=!!n.urgentActive,E=!!n.warnActive,C=S?`${JA}ms`:E?`${IA}ms`:void 0,w=h?S||E?"bg-red-500/45":"bg-emerald-500/45":S||E?"bg-red-500":"bg-emerald-500",j=S||E?"bg-red-900/35":"bg-slate-900/35",N=S||E?"bg-red-900/45":"bg-slate-900/35",q=Sn(h?"absolute inset-0 pointer-events-none":"relative pointer-events-auto",p&&!h?"flex flex-col items-center justify-center":"w-full",d);if(h){const W=p?{height:`${v}%`}:{width:`${v}%`},ce=Sn("absolute",p?"bottom-0 left-0 right-0":"left-0 top-0 bottom-0",w,"transition-[width,height]",S&&"battery-urgent-flash"),oe=Sn("absolute z-10",p?"left-0 right-0 h-[2px]":"top-0 bottom-0 w-[2px]","bg-black/70",E&&!S&&"battery-tick-warn"),$=p?{bottom:`${y}%`}:{left:`${y}%`};return r.jsxs("div",{className:q,children:[r.jsx("div",{className:Sn("absolute inset-0",j,S&&"battery-urgent-flash")}),r.jsx("div",{className:ce,style:{...W,animationDuration:C}}),r.jsx("div",{className:oe,style:$})]})}const M=Sn("relative overflow-hidden rounded-sm border border-slate-800",S||E?N:"bg-zinc-900/90",S&&"battery-urgent-flash",p?"w-full flex-1":o?"h-4":"h-5"),O=p?{height:`${v}%`}:{width:`${v}%`},K=Sn("absolute",p?"bottom-0 left-0 right-0":"left-0 top-0 bottom-0",w,"transition-[width,height]",S&&"battery-urgent-flash"),_=Sn("absolute z-10",p?"left-0 right-0 h-[2px]":"top-0 bottom-0 w-[2px]","bg-black/70",E&&!S&&"battery-tick-warn"),H=p?{bottom:`${y}%`}:{left:`${y}%`},z=`Battery ${g}%`,V=Sn("pointer-events-none absolute inset-0 flex items-center justify-center text-center font-semibold",p?o?"text-[0.55rem]":"text-[0.65rem]":"text-xs"),U=Sn("rounded px-1.5 py-0.5",h?"bg-black/30 text-slate-100":"bg-black/50 text-slate-100");return r.jsxs("div",{className:q,children:[r.jsxs("div",{className:M,children:[r.jsx("div",{className:K,style:{...O,animationDuration:C}}),r.jsx("div",{className:_,style:H})]}),x&&!p?r.jsx("div",{className:V,children:r.jsx("span",{className:U,children:z})}):null,x&&p?r.jsx("div",{className:"mt-0.5 text-[0.65rem] font-semibold text-slate-100",children:r.jsxs("span",{className:U,children:[g,"%"]})}):null]})}const cx=2e3,PA=3e3,WA=3e3,eN=40,tN=1e3;function Ni({sessionInfo:n,audioSessionInfo:s,videoMode:i="whep",snapshotFeed:o=null,qualityNotice:f=null,label:d,roverColor:h=null,forceMute:p=!1,telemetryFrame:x,batteryConfig:g,layoutFormat:v="desktop",hudVariant:y="default",driverLabel:S=null,hudForceMap:E=!1,hudMapPosition:C="top-center",hudLabelScale:k=1,fitParent:w=!1,overcurrentLimiter:j=null,showTurnCue:N=!1,turnTimerText:q=null,turnSeconds:M=null,isActiveDriver:O=!1,idleSkipSeconds:K=null}){const _=ft(ye=>ye.session),H=m.useRef(null),z=m.useRef(null),V=m.useRef(null),U=m.useRef(null),W=m.useRef(null),ce=m.useRef(null),oe=m.useRef(null),$=m.useRef(null),[T,Y]=m.useState("idle"),[I,ie]=m.useState(null),[de,R]=m.useState("idle"),[G,te]=m.useState(null),[ae,pe]=m.useState(0),[re,ue]=m.useState(0),[ve,be]=m.useState(!0),xe=!!s?.url,Be=i==="snapshot",ze=x?.sensors,{value:Ae}=He("audio",ct),tt=Number.isFinite(Ae?.masterVolume)?Ae.masterVolume:ct.masterVolume,Je=Number.isFinite(Ae?.roverVolume)?Ae.roverVolume:ct.roverVolume,vt=typeof Ae?.mainBrushDuckEnabled=="boolean"?Ae.mainBrushDuckEnabled:typeof Ae?.autoLevelEnabled=="boolean"?Ae.autoLevelEnabled:ct.mainBrushDuckEnabled,le=Number.isFinite(Ae?.mainBrushDuckAmount)?Math.max(0,Math.min(1,Ae.mainBrushDuckAmount)):ct.mainBrushDuckAmount,me=Math.max(0,Math.min(1,tt*Je)),se=ze?.batteryChargeMah??null,P=v==="desktop",fe=!P,Ne=fe?"top-right":C,[pt]=Hg(),Ve=E||fe?!0:pt,st=Vg({charge:se,config:g}),lt=ze?.wheelOvercurrents||null,Ot=lt==null?[]:Object.entries(lt).filter(([,ye])=>!!ye).map(([ye])=>ye),it=j?.caps||null,ds=j?.overcurrent?.groups||null,Yt=typeof window<"u"&&new URLSearchParams(window.location.search).has("debugAudio"),La=typeof window<"u"&&new URLSearchParams(window.location.search).has("debugHud"),Bo=m.useMemo(()=>{if(!it)return null;const ye=Number.isFinite(it?.drive?.cap)?it.drive.cap:1,Fe=Number.isFinite(it?.aux?.cap)?it.aux.cap:1;return Math.max(0,Math.min(1,1-Math.min(ye,Fe)))},[it]),Bn=!!j?.isActive,Nt=Ot.length?Ot:Bn?["limiter"]:[],Ft=Bo??(Ot.length?1:0),Mt=!!Nt.length,fa=!!((Number(ze?.mainBrushCurrentMa)||0)>eN||ze?.wheelOvercurrents?.mainBrush),Oo=vt&&fa?1-le:1,ms=Math.max(0,Math.min(1,me*Oo)),hs=vt&&fa&&le>0?`Volume decreased ${Math.round(le*1e3)/10}%`:null,za=m.useRef({hasDedicatedAudio:!1,audioUrl:null,mainBrushDuckEnabled:!1,mainBrushDuckAmount:0,mainBrushActive:!1,baseRoverGain:0,effectiveRoverGain:0});m.useEffect(()=>{za.current={hasDedicatedAudio:xe,audioUrl:s?.url||null,mainBrushDuckEnabled:vt,mainBrushDuckAmount:le,mainBrushActive:fa,baseRoverGain:me,effectiveRoverGain:ms}},[xe,s?.url,vt,le,fa,me,ms]);const Pe=m.useCallback((ye,Fe={})=>{if(!Yt)return;const Ze=z.current,ke=za.current,$e={event:ye,ts:Date.now(),roverLabel:d||null,hasDedicatedAudio:ke.hasDedicatedAudio,audioUrl:ke.audioUrl,mainBrushDuckEnabled:ke.mainBrushDuckEnabled,mainBrushDuckAmount:ke.mainBrushDuckAmount,mainBrushActive:ke.mainBrushActive,baseRoverGain:ke.baseRoverGain,effectiveRoverGain:ke.effectiveRoverGain,element:Ze?{muted:Ze.muted,volume:Ze.volume,paused:Ze.paused,ended:Ze.ended,readyState:Ze.readyState,networkState:Ze.networkState}:null,...Fe};try{console.log(`[AudioDebug] ${ye} ${JSON.stringify($e)}`)}catch{console.log("[AudioDebug]",ye,$e)}},[Yt,d]),On=_?.socials?.find(ye=>String(ye?.id||ye?.label||"").toLowerCase()==="discord")?.url||_?.discord?.invite||null;m.useEffect(()=>{La&&console.log("[OvercurrentHUD]",{overlayVisible:Mt,overlayMotors:Nt,overlayFill:Ft,limiterActive:Bn,limiterCaps:it,limiterGroups:ds,wheelOvercurrents:lt})},[La,Ft,Nt,Mt,Bn,it,ds,lt]),m.useEffect(()=>{Pe("settings/update")},[Pe]);const Cn=m.useCallback(()=>{clearTimeout(V.current),V.current=setTimeout(()=>pe(Date.now()),cx)},[]),Ln=m.useCallback(()=>{clearTimeout(U.current),U.current=setTimeout(()=>ue(Date.now()),cx)},[]),ps=m.useCallback(async()=>{const ye=H.current;if(ye)try{ye.muted=!0,await ye.play()}catch{}},[]),ml=m.useCallback((ye=0)=>{if(p||xe)return;clearTimeout(ce.current);const Fe=()=>{clearTimeout(ce.current),ce.current=setTimeout(()=>{p||Ze()},PA)},Ze=async()=>{const ke=H.current;if(ke)try{await ps(),ke.muted=!1,await ke.play(),be(!1)}catch{ke.muted=!0,be(!0),Fe()}};ce.current=setTimeout(Ze,ye)},[ps,p,xe]);m.useEffect(()=>()=>{clearTimeout(V.current),clearTimeout(U.current),clearTimeout(ce.current),clearInterval(W.current),oe.current&&(cancelAnimationFrame(oe.current),oe.current=null)},[]),m.useEffect(()=>{T==="playing"&&ml(0)},[T,ml]),m.useEffect(()=>{Be&&(Y("snapshot"),ie(null))},[Be]),m.useEffect(()=>{if(Be||!n?.url||!H.current)return;let ye=!0,Fe;const Ze=setTimeout(()=>be(!0),0),ke=($e,rt)=>{ye&&(Pe("video/status",{nextStatus:$e,info:rt||null}),Y($e),ie(rt||null),$e==="playing"&&ps(),["error","failed","disconnected","closed"].includes($e)&&Cn())};return Fe=new rx({url:n.url,token:n.token,video:H.current,receiveAudio:!xe,onStatus:ke}),Fe.start().catch($e=>{ye&&(Y("error"),ie($e.message),Cn())}),()=>{ye=!1,clearTimeout(Ze),Fe?.stop()}},[Be,n?.url,n?.token,ae,Cn,ps,xe,Pe]),m.useEffect(()=>{T==="stopped"&&n?.url&&Cn()},[T,n?.url,Cn]),m.useEffect(()=>{const ye=z.current;if(!ye||!s?.url){Pe("route/no-audio-url"),$.current=null;return}const Fe=Math.max(0,Math.min(1,ms)),Ze=$.current==null?Math.max(0,Math.min(1,ye.volume)):$.current;if(oe.current&&(cancelAnimationFrame(oe.current),oe.current=null),Fe>Ze){const ke=performance.now(),$e=Ze,rt=Fe-$e,ot=wt=>{const nt=Math.min(1,(wt-ke)/tN),zn=$e+rt*nt;ye.volume=zn,$.current=zn,nt<1?oe.current=requestAnimationFrame(ot):oe.current=null};oe.current=requestAnimationFrame(ot)}else ye.volume=Fe,$.current=Fe;Pe("route/direct",{elementVolume:Fe,duckEnabled:vt,mainBrushActive:fa,duckAmount:le})},[s?.url,ms,vt,fa,le,Pe]),m.useEffect(()=>{if(!s?.url||!z.current)return;let ye=!0,Fe;const Ze=(ke,$e)=>{ye&&(Pe("audio/status",{nextStatus:ke,info:$e||null}),te($e||(ke==="connected"?"connected":null)),R(rt=>ke==="connected"&&(rt==="playing"||rt==="connecting")||ke==="new"?rt:ke),["error","failed"].includes(ke)&&Ln())};return Fe=new rx({url:s.url,token:s.token,video:z.current,audioOnly:!0,onStatus:Ze}),Fe.start().catch(ke=>{ye&&(R("error"),te(ke.message),Ln())}),()=>{ye=!1,Fe?.stop()}},[s?.url,s?.token,re,Ln,Pe]),m.useEffect(()=>{const ye=z.current;if(!s?.url||!ye){clearInterval(W.current);return}if(!["connecting","connected","playing","paused"].includes(de)){clearInterval(W.current);return}const Ze=async()=>{const ke=z.current;ke&&(ke.muted=!1,!(!ke.paused&&!ke.ended)&&(Pe("retry/play-attempt"),ke.play().then(()=>{Pe("retry/play-ok"),R($e=>$e==="connected"?"playing":$e),te($e=>$e==="paused"?null:$e)}).catch($e=>{Pe("retry/play-fail",{error:$e?.message}),te(rt=>rt||$e?.message||"autoplay blocked")})))};return Ze(),W.current=setInterval(Ze,WA),()=>clearInterval(W.current)},[s?.url,de,Pe]),m.useEffect(()=>{const ye=z.current;if(!ye)return;const Fe=()=>{Pe("element/play"),R(nt=>nt==="error"?nt:"playing"),te(null)},Ze=()=>{Pe("element/pause"),R(nt=>["error","failed","disconnected","closed","stopped"].includes(nt)?nt:"paused"),te(nt=>nt||"paused")},ke=()=>{Pe("element/ended"),R(nt=>nt==="error"?nt:"stopped"),te(nt=>nt||"ended")},$e=()=>{const{error:nt}=ye,zn=nt?.message||"audio error";Pe("element/error",{error:zn}),R("error"),te(zn)},rt=()=>Pe("element/waiting"),ot=()=>Pe("element/canplay"),wt=()=>Pe("element/stalled");return ye.addEventListener("play",Fe),ye.addEventListener("pause",Ze),ye.addEventListener("ended",ke),ye.addEventListener("error",$e),ye.addEventListener("waiting",rt),ye.addEventListener("canplay",ot),ye.addEventListener("stalled",wt),()=>{ye.removeEventListener("play",Fe),ye.removeEventListener("pause",Ze),ye.removeEventListener("ended",ke),ye.removeEventListener("error",$e),ye.removeEventListener("waiting",rt),ye.removeEventListener("canplay",ot),ye.removeEventListener("stalled",wt)}},[s?.url,Pe]);const hl=o?.error?`Error: ${o.error}`:o?.objectUrl?"snapshot":o?.status||"waiting",Ua=Be?hl:n?.url?T==="error"?`Error: ${I||"unknown"}`:I?`${T} (${I})`:T:"waiting",Lo=s?.error?`Error: ${s.error}`:s?.url?de==="error"?`Error: ${G||"unknown"}`:G?`${de} (${G})`:de:null,pl=y==="spectator",an=y==="none";return r.jsxs("div",{className:`flex flex-col gap-0.5 ${w?"h-full":""}`,children:[r.jsxs("div",{className:`relative w-full overflow-hidden bg-black ${w?"h-full flex-1":"aspect-[4/3]"}`,children:[Be?o?.objectUrl?r.jsx("img",{src:o.objectUrl,alt:d,className:"h-full w-full object-contain",draggable:!1}):r.jsx("div",{className:"flex h-full w-full items-center justify-center text-sm text-slate-300",children:"Waiting for frame…"}):r.jsx("video",{ref:H,muted:p||ve||xe,playsInline:!0,autoPlay:!0,controls:!1,className:"h-full w-full object-contain"}),r.jsx("audio",{ref:z,autoPlay:!0,hidden:!0}),!an&&N?r.jsx(sN,{mobileHud:fe,turnSeconds:M,isActiveDriver:O,idleSkipSeconds:K}):null,an?null:r.jsx(aN,{frame:x,sensors:ze,label:d,roverColor:h,status:Ua,audioStatus:Lo,levelStatus:hs,desktopLayout:P,layoutFormat:v,variant:y,driverLabel:S,battery:st,showTopDown:Ve,mobileHud:fe,mapPosition:Ne,turnTimerText:q,labelScale:k}),an?null:r.jsx(oN,{compact:fe}),!an&&La?r.jsx("div",{className:"pointer-events-none absolute left-1 top-1 z-40 rounded bg-black/80 px-1 py-0.5 text-[0.6rem] text-lime-200",children:`OC vis:${Mt?1:0} motors:${Nt.length} fill:${Math.round(Ft*100)}%`}):null,an?null:r.jsx(iN,{motors:Nt,fill:Ft,compact:fe}),an?null:r.jsx(rN,{battery:st,compact:fe}),!an&&pl&&st.available?r.jsx("div",{className:"pointer-events-none absolute right-1 top-1/2 flex h-[70%] -translate-y-1/2 flex-col items-center justify-center rounded bg-black/60 px-0.5 pb-1 pt-1",children:r.jsx(Vf,{visual:st,orientation:"vertical",variant:"inline",compact:fe,className:"h-full w-4"})}):null,!an&&f?r.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-1/2 -translate-y-1/2",children:r.jsxs("div",{className:`mx-auto w-fit rounded border border-amber-300/80 bg-black/75 text-amber-200 ${fe?"px-2 py-1 text-[0.6rem]":"px-3 py-1.5 text-sm"}`,children:[r.jsx("div",{className:"text-center",children:f}),r.jsx("div",{className:"pointer-events-auto mt-0",children:r.jsx(xd,{id:"discord",label:"Join our Discord server while you wait!",url:On})})]})}):null]}),!an&&!pl&&r.jsxs("div",{className:"space-y-0.5",children:[r.jsx(nN,{sensors:ze}),r.jsx("div",{className:"panel-section space-y-0.5 text-sm",children:r.jsx(Vf,{visual:st,compact:fe})})]})]})}function nN({sensors:n}){const s=[n?.lightBumpLeftSignal,n?.lightBumpFrontLeftSignal,n?.lightBumpCenterLeftSignal,n?.lightBumpCenterRightSignal,n?.lightBumpFrontRightSignal,n?.lightBumpRightSignal],i=s.filter(p=>p!=null).reduce((p,x)=>Math.max(p,x),1200),o=p=>Math.pow(Math.max(0,Math.min(1,(p??0)/i)),.35),f=p=>p==null||p<=0?"hsl(200 60% 18%)":`hsl(${(200+o(p)*360)%360} 100% 60%)`,d=6,h=12;return r.jsx("div",{className:"flex w-full items-center justify-center gap-0.5",children:s.map((p,x)=>{const g=o(p),v=xr.jsxs("span",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{className:"text-slate-400",children:re}),r.jsx("span",{className:"font-semibold text-white",children:ue})]},re))]})}),r.jsx("div",{className:`absolute ${U} left-1/2`,style:W,children:r.jsxs("div",{className:`flex items-center gap-0.5 bg-black/80 text-slate-100 ${O} ${K}`,children:[r.jsx("span",{className:"font-semibold text-white rounded px-1 py-[1px] border border-transparent",style:ca(o,.18),children:i||"Unnamed Rover"}),v?r.jsxs("span",{className:"text-slate-300",children:["• ",v]}):null]})})]}),S?r.jsx("div",{className:"pointer-events-none absolute rounded",style:{...T},children:r.jsx(Hf,{sensors:s,size:240,overlay:!0})}):null]})}return r.jsxs("div",{className:"pointer-events-none absolute inset-0 flex items-center justify-center",children:[r.jsx("div",{className:`absolute ${_} font-medium text-slate-100 ${q}`,children:r.jsxs("div",{className:"flex flex-col gap-0.5 leading-none",children:[r.jsxs("span",{children:["Status: ",f]}),d?r.jsxs("span",{children:["Audio: ",d]}):null,h?r.jsx("span",{className:"text-cyan-300",children:h}):null]})}),k?r.jsx("div",{className:`absolute left-1/2 top-0.5 -translate-x-1/2 rounded bg-black/70 text-slate-100 ${z} ${H}`,children:k}):null,r.jsx("div",{className:`absolute ${U} left-1/2`,style:W,children:r.jsx("div",{className:`flex gap-0.5 bg-black/80 text-slate-100 ${O} ${K}`,children:r.jsxs("span",{children:["Rover:"," ",r.jsxs("span",{className:"rounded px-1 py-[1px] border border-transparent",style:ca(o,.18),children:['"',i||"Unnamed Rover",'"']})]})})}),S&&g!=="spectator"?r.jsx("div",{className:"pointer-events-none absolute rounded",style:{...T},children:r.jsx(Hf,{sensors:s,size:240,overlay:!0})}):null]})}function sN({mobileHud:n=!1,turnSeconds:s=null,isActiveDriver:i=!1,idleSkipSeconds:o=null}){const f=n?"text-3xl":"text-5xl",d=n?"text-xs":"text-sm",h=n?"text-[0.55rem]":"text-[0.75rem]",p=n?"px-4 py-3":"px-6 py-4",x=i&&typeof o=="number";return r.jsx("div",{className:"pointer-events-none absolute inset-0 z-30 flex items-center justify-center bg-black/55",children:r.jsxs("div",{className:`flex flex-col items-center gap-0.5 rounded border border-amber-300/80 bg-black/70 ${p}`,children:[r.jsx("div",{className:`font-semibold text-amber-200 ${f}`,children:"IT IS YOUR TURN!"}),r.jsx("div",{className:`text-amber-200/80 ${d}`,children:"Start driving!"}),x?r.jsxs("div",{className:`text-red-100/90 ${h}`,children:["Idle skip in ",o,"s"]}):null]})})}const lN={leftWheel:"Left wheel",rightWheel:"Right wheel",mainBrush:"Main brush",sideBrush:"Side brush",limiter:"Overcurrent limit"};function iN({motors:n,fill:s=0,compact:i=!1}){if(!n?.length)return null;const o=n.map(v=>lN[v]||v),f=i?"w-[12rem] h-[3.5rem]":"w-[20rem] h-[7rem]",d=i?"px-2 py-1":"px-4 py-2",h=i?"text-lg":"text-4xl",p=i?"text-xs":"text-xl",x=Math.max(0,Math.min(1,s)),g=`${Math.round(x*100)}%`;return r.jsx("div",{className:`pointer-events-none absolute flex items-center justify-center bg-red-900/50 top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 ${f}`,children:r.jsxs("div",{className:"relative h-full w-full",children:[r.jsx("div",{className:"absolute inset-0 overflow-hidden",children:r.jsx("div",{className:"h-full bg-red-700/60",style:{width:g}})}),r.jsxs("div",{className:`relative z-10 flex h-full w-full flex-col items-center justify-center text-center font-semibold text-white animate-pulse ${h} ${d}`,children:[r.jsx("div",{children:"OVERCURRENT"}),r.jsx("div",{className:`mt-0 font-medium text-white ${p}`,children:o.join(", ")})]})]})})}function rN({battery:n,compact:s=!1}){if(!n?.available||!n.warnActive&&!n.urgentActive)return null;const i=n.urgentActive?"BATTERY VERY LOW, DOCK THE ROVER AND CHARGE IMMEDIATELY!!":"Battery low! please dock and charge the rover soon.",o=s?"p-2 top-6":"p-4 top-10",f=s?"text-sm":"text-2xl";return r.jsx("div",{className:`pointer-events-none absolute flex items-center justify-center bg-amber-900/60 left-1/2 -translate-x-1/2 ${o}`,children:r.jsx("div",{className:`text-center font-semibold text-white animate-pulse ${f}`,children:r.jsx("div",{children:i})})})}function oN({compact:n=!1}){const s=ft(_=>_.session),{sendMessage:i,onInputFocus:o,onInputBlur:f,blurChat:d,registerInputRef:h,setTypingActive:p}=cd(),{value:x}=He("tts",{engine:"flite",voice:"rms",pitch:50}),[g,v]=m.useState(""),[y,S]=m.useState(!1),E=s?.role!=="spectator",C=s?.role==="spectator",k=s?.assignment?.roverId||null,j=!!m.useMemo(()=>s?.roster?.find(_=>String(_.id)===String(k))||null,[k,s?.roster])?.audio?.ttsEnabled,N=m.useMemo(()=>{if(!j)return null;const _=x?.engine==="espeak"?"espeak":"flite";if(_==="espeak"){let z=Number.isFinite(x?.pitch)?Math.round(x.pitch):void 0;return typeof z=="number"&&(z=Math.max(0,Math.min(99,z))),{speak:!0,engine:_,pitch:z}}const H=typeof x?.voice=="string"?x.voice:void 0;return{speak:!0,engine:_,voice:H}},[x?.engine,x?.pitch,x?.voice,j]),q=n?"pointer-events-auto absolute bottom-0.5 right-0.5 flex w-[9rem] max-w-[70vw] items-center gap-0.5 rounded bg-black/70 px-0.4 py-0.2":"pointer-events-auto absolute bottom-1 right-1 flex w-[12rem] max-w-[70vw] items-center gap-0.5 rounded bg-black/70 px-0.5 py-0.25",M=n?"min-w-0 flex-1 bg-transparent text-[0.55rem] text-slate-100 placeholder:text-slate-400 focus:outline-none":"min-w-0 flex-1 bg-transparent text-[0.7rem] text-slate-100 placeholder:text-slate-400 focus:outline-none",O=n?"rounded bg-cyan-500/80 px-0.35 py-0.2 text-[0.55rem] font-semibold text-black disabled:opacity-50":"rounded bg-cyan-500/80 px-0.5 py-0.25 text-[0.7rem] font-semibold text-black disabled:opacity-50";async function K(_){if(_.preventDefault(),!E)return;const H=g.trim();if(H){S(!0);try{await i(H,N),v(""),d(),p(!1)}catch(z){alert(z.message)}finally{S(!1)}}}return C?null:r.jsxs("form",{onSubmit:K,className:q,children:[r.jsx("input",{className:M,value:g,onChange:_=>{const H=_.target.value;v(H),p(!!H.trim())},onFocus:_=>{o(_),p(!!g.trim())},onBlur:_=>{f(_),p(!1)},onKeyDown:_=>{_.key==="Enter"&&!g.trim()&&(_.preventDefault(),d(),p(!1))},ref:_=>h(_,{target:"hud"}),placeholder:E?"Chat (TTS)":"Spectator",disabled:!E}),r.jsx("button",{type:"submit",disabled:!E||y,className:O,children:"Speak"})]})}function gd({layoutFormat:n="desktop"}){const s=ft(ae=>ae.session),{state:{song:i,lastControlIntentAt:o},overcurrentLimiter:f}=_t(),[d,h]=m.useState(()=>Date.now()),[p,x]=m.useState(!1),[g,v]=m.useState(null),y=m.useRef({active:!1,roverId:null});m.useEffect(()=>{if(s?.mode!=="turns")return;const ae=setInterval(()=>h(Date.now()),250);return()=>clearInterval(ae)},[s?.mode]);const S=s?.assignment?.roverId,C=!!(S&&s?.roster?s.roster.find(ae=>String(ae.id)===String(S)):null)?.media?.audioPublishUrl,k=S?s?.turnQueues?.[S]:null,w=s?.socketId||null,j=S?s?.activeDrivers?.[S]:null,N=!!(w&&j===w),q=m.useMemo(()=>{const ae=k?.queue||[];if(!ae.length||!k?.current||ae.length<=1)return null;const pe=ae.findIndex(re=>re===k.current);return pe===-1?ae[0]||null:ae[(pe+1)%ae.length]||null},[k?.queue,k?.current]),M=!!(w&&q===w),O=k?.deadline||null,K=k?.idleDeadline||null,_=O?O-d:null,H=K?K-d:null,z=s?.mode==="turns"&&M&&_!=null&&_<=5e3&&_>0,V=s?.mode!=="turns"||N||z,U=_!=null&&Number.isFinite(_)?Math.max(0,Math.ceil(_/1e3)):null,W=H!=null&&Number.isFinite(H)?Math.max(0,Math.ceil(H/1e3)):null,ce=N?U!=null?`${U}s left`:null:M&&U!=null?`Your turn in ${U}s`:null,oe=S?[...V?[{type:"rover",id:S,key:S}]:[],...C?[{type:"rover",id:`${S}-audio`,key:`${S}-audio`}]:[]]:[],$=ji(oe),T=S&&V?$[S]:null,Y=S&&C?$[`${S}-audio`]:null,I=hd(S?[S]:[],{enabled:!!S,version:s?.mode}),ie=S&&I[S]||null,de=dl(S),R=S&&s?.roster?s.roster.find(ae=>String(ae.id)===String(S)):null,G=R?.battery??null,te=R?.name||(S?`Rover ${S}`:"");return m.useEffect(()=>{if(s?.mode!=="turns"){x(!1),v(null),y.current={active:!1,roverId:null};return}const ae=y.current,pe=N&&!ae.active,re=N&&S&&S!==ae.roverId;pe||re?(x(!0),v(Date.now())):!N&&ae.active&&(x(!1),v(null)),y.current={active:N,roverId:S}},[N,S,s?.mode]),m.useEffect(()=>{!p||!g||o>g&&x(!1)},[o,g,p]),r.jsx("section",{className:"panel",children:S?r.jsx(Ni,{sessionInfo:T,videoMode:V?"whep":"snapshot",snapshotFeed:ie,audioSessionInfo:Y,label:te,roverColor:R?.color||null,telemetryFrame:de,batteryConfig:G,layoutFormat:n,overcurrentLimiter:f,songNote:i?.note,qualityNotice:V?null:"Preview feed (low FPS) until your turn.",showTurnCue:p,turnTimerText:ce,turnSeconds:U,isActiveDriver:N,idleSkipSeconds:W}):r.jsxs("div",{className:"panel-muted content-center text-center text-sm text-slate-400 aspect-[4/3]",children:[r.jsx("p",{children:"You are not assigned to a rover."}),r.jsx("p",{className:"mt-0",children:r.jsx("a",{href:"/spectate",className:"text-blue-400 underline hover:text-blue-500",children:"Click here to visit the spectator page."})})]})})}function yo({label:n,tone:s="muted"}){const i=s==="success"?"bg-emerald-900 text-emerald-100":s==="warn"?"bg-amber-900 text-amber-100":"bg-slate-800 text-slate-200";return r.jsx("span",{className:`rounded px-1 py-0.5 text-xs font-semibold leading-none ${i}`,children:n})}function Mo(n){if(!Number.isFinite(n))return 0;const s=n%360;return s<0?s+360:s}function cN(n){if(!Array.isArray(n)||n.length<3)return 0;const[s,i,o]=n,f=Math.max(0,Math.min(255,Number(s)))/255,d=Math.max(0,Math.min(255,Number(i)))/255,h=Math.max(0,Math.min(255,Number(o)))/255,p=Math.max(f,d,h),x=Math.min(f,d,h),g=p-x;if(g===0)return 0;let v=0;return p===f?v=(d-h)/g%6:p===d?v=(h-f)/g+2:v=(f-d)/g+4,Mo(Math.round(v*60))}function ux(n){const s=Mo(n),i=1,o=1-Math.abs(s/60%2-1);let f=0,d=0,h=0;return s<60?(f=i,d=o):s<120?(f=o,d=i):s<180?(d=i,h=o):s<240?(d=o,h=i):s<300?(f=o,h=i):(f=i,h=o),[Math.round(f*255),Math.round(d*255),Math.round(h*255)]}function fx(n){return n?Array.isArray(n.hsColor)?Mo(Number(n.hsColor[0])):Array.isArray(n.rgbColor)?cN(n.rgbColor):0:0}function uN({entity:n,connected:s,controlsLocked:i,onToggle:o,onSetColor:f,onSetWhite:d}){const h=n.state==="unavailable"||!n.available,p=n.state==="on",x=n.type==="light"&&n.supportsColor,g=h?"warn":p?"success":"muted",v=h?"Unavailable":p?"On":"Off",y=i||!s||h,S=y||!x,[E,C]=m.useState(()=>fx(n)),k=m.useRef(E),w=m.useRef(!1),j=h?"border-slate-800 bg-slate-900 text-slate-400 cursor-not-allowed":i?"border-slate-800 bg-slate-900 text-slate-300 cursor-not-allowed":p?"border-emerald-700 bg-emerald-900/80 text-emerald-50 hover:bg-emerald-800":"border-rose-800 bg-rose-900/80 text-rose-50 hover:bg-rose-800";m.useEffect(()=>{if(!x||w.current)return;const H=fx(n);k.current=H,C(H)},[n.rgbColor,n.hsColor,x]);const N=H=>{const z=Mo(Number(H.target.value));k.current=z,C(z)},q=()=>{S||!f||f(n.id,ux(k.current))},M=H=>{H.stopPropagation()},O=H=>{M(H),!(S||!d)&&d(n.id)},_=`rgb(${(x?ux(k.current):[255,255,255]).join(",")})`;return r.jsxs("button",{type:"button",onClick:()=>o(n.id),disabled:y,className:`relative flex min-w-[12rem] flex-[1_1_12rem] items-start justify-between gap-0.5 rounded px-1 py-0.5 text-left transition-colors ${j} disabled:opacity-60 disabled:hover:bg-inherit`,children:[r.jsxs("div",{className:"min-w-0 flex-1",children:[r.jsxs("div",{className:"flex items-center gap-0.5 text-sm leading-normal",children:[r.jsx("span",{className:"truncate font-semibold text-white",children:n.name||n.id}),x&&r.jsxs(r.Fragment,{children:[r.jsx(yo,{label:v,tone:g}),!s&&r.jsx("span",{className:"text-xs text-amber-200",children:"Offline"})]})]}),x?r.jsx("div",{className:"-mt-0.5 w-full",onClick:M,onPointerDown:H=>{M(H),w.current=!0},onPointerUp:H=>{M(H),w.current=!1,q()},onPointerCancel:H=>{M(H),w.current=!1,q()},onKeyUp:H=>{M(H),q()},onBlur:q,children:r.jsx("div",{className:"relative w-full",children:r.jsx("input",{type:"range",min:"0",max:"360",step:"1",value:E,onChange:N,disabled:S,"aria-label":`Set color for ${n.name||n.id}`,className:"ha-hue-slider w-full"})})}):r.jsxs("div",{className:"flex items-center gap-0.5 text-xs text-slate-400",children:[r.jsx(yo,{label:v,tone:g}),!s&&r.jsx("span",{className:"text-amber-200",children:" · Offline"})]})]}),x&&r.jsxs("div",{className:"absolute right-1 top-1 flex items-center gap-0.5",children:[r.jsx("span",{role:"button",tabIndex:S?-1:0,onClick:O,onPointerDown:M,onKeyDown:H=>{S||(H.key==="Enter"||H.key===" ")&&(H.preventDefault(),O(H))},title:"Set white color temperature","aria-label":`Set ${n.name||n.id} to white`,"aria-disabled":S,className:`inline-flex items-center justify-center rounded border border-slate-200 bg-white px-1 py-0.5 text-xs font-semibold leading-none text-slate-900 ${S?"cursor-not-allowed opacity-60":"cursor-pointer hover:bg-slate-100"}`,children:"white"}),r.jsx("span",{className:"pointer-events-none h-2.5 w-2.5 rounded-full border border-white/60",style:{backgroundColor:_}})]}),!x&&r.jsx("div",{className:"self-center text-xs font-semibold text-white/90",children:p?"Turn off":"Turn on"})]})}function $g(){const{state:{keymap:n}}=_t(),s=ft(E=>E.session),{homeAssistantToggle:i,homeAssistantSetLightColor:o,homeAssistantSetLightWhite:f}=wn(),d=s?.homeAssistant,h=m.useMemo(()=>d?.entities||[],[d?.entities]),p=d?.lightPolicy||null,x=!!(p?.locked||p?.lockedOn),g=p?.lockState||(p?.lockedOn?"on":null),v=An(n?.homeAssistantOn?.[0]),y=An(n?.homeAssistantOff?.[0]);if(!d?.enabled)return r.jsxs("section",{className:"panel-section space-y-0.5 text-sm text-slate-400",children:[r.jsx("p",{className:"text-slate-300",children:"Room Controls"}),r.jsx("p",{className:"text-slate-500",children:"Not configured on the server."})]});if(h.length===0)return r.jsxs("section",{className:"panel-section space-y-0.5 text-sm text-slate-400",children:[r.jsx("p",{className:"text-slate-300",children:"Room Controls"}),r.jsx("p",{className:"text-slate-500",children:"No lights or switches configured."})]});const S=!!d?.connected;return r.jsxs("section",{className:"panel-section space-y-0.5 text-base",children:[r.jsxs("header",{className:"flex items-center justify-between gap-0.5 text-sm text-slate-400",children:[r.jsxs("div",{className:"flex items-center gap-0.5",children:[r.jsx("p",{children:"Room Controls"}),r.jsx("span",{className:"text-xs text-slate-500",children:h.length}),x?r.jsx(yo,{label:g==="off"?"Locked Off":"Locked On",tone:"warn"}):null,r.jsxs("div",{className:"flex items-center gap-0.5 text-xs text-slate-300 background-black",children:[r.jsxs("span",{className:"flex items-center gap-0.5",children:[r.jsx("span",{children:"On"}),v?r.jsx(dx,{label:v}):null]}),r.jsxs("span",{className:"flex items-center gap-0.5",children:[r.jsx("span",{children:"Off"}),y?r.jsx(dx,{label:y}):null]})]})]}),r.jsx(yo,{label:S?"Connected":"Offline",tone:S?"success":"warn"})]}),x?r.jsx("p",{className:"rounded border border-amber-600/60 bg-amber-900/40 px-1 py-0.5 text-xs text-amber-100",children:g==="off"?"Lights are locked off. Room controls are disabled.":"Lights are locked on. Room controls are disabled."}):null,r.jsx("div",{className:"flex flex-wrap gap-0.5",children:h.map(E=>r.jsx(uN,{entity:E,connected:S,controlsLocked:x,onToggle:i,onSetColor:o,onSetWhite:f},E.id))})]})}function dx({label:n}){return n?r.jsx("span",{className:"rounded border border-white/40 px-1 text-[0.7rem] text-white",children:n}):null}function Gg(){const{login:n,setRole:s}=wn(),[i,o]=m.useState(""),[f,d]=m.useState(""),[h,p]=m.useState(!1);async function x(g){g.preventDefault(),p(!0);try{await n(i,f),o(""),d("")}catch(v){alert(v.message)}finally{p(!1)}}return r.jsxs("div",{className:"panel-section space-y-0.5 text-base",children:[r.jsx("p",{className:"text-sm text-slate-400",children:"Admin login"}),r.jsxs("form",{className:"flex flex-col gap-0.5",onSubmit:x,children:[r.jsx("input",{className:"field-input",placeholder:"Username",value:i,onChange:g=>o(g.target.value)}),r.jsx("input",{className:"field-input",placeholder:"Password",type:"password",value:f,onChange:g=>d(g.target.value)}),r.jsx("button",{type:"submit",disabled:h,className:"button-dark w-full disabled:opacity-50",children:h?"Logging in…":"Login"})]})]})}function mx(...n){return n.filter(Boolean).join(" ")}function fN(n){const s=n?.batteryState?.percentDisplay;return s==null?"--":`${s}%`}function dN(n){return n?.batteryState?n.batteryState.urgentActive?"text-red-400":n.batteryState.warnActive?"text-amber-300":"text-emerald-300":"text-slate-400"}function mN({title:n,roster:s=[],emptyText:i="No roster data.",renderActions:o=null}){return r.jsxs("div",{className:"space-y-0.5 text-sm",children:[n&&r.jsx("p",{className:"text-sm text-slate-400",children:n}),s.length===0?r.jsx("p",{className:"text-sm text-slate-500",children:i}):r.jsx("ul",{className:"space-y-0.5 text-sm",children:s.map(f=>{const d=!!(f?.private?.enabled&&f?.private?.open),h=!!f?.locked;return r.jsxs("li",{className:mx("surface flex flex-wrap items-center justify-between gap-0.5",h?"bg-red-900/40":d?"bg-amber-700/35 border border-amber-200/30":null),children:[r.jsxs("div",{children:[r.jsx("p",{className:"text-slate-200",children:r.jsx("span",{className:"rounded px-1 py-[1px] border border-transparent",style:ca(f.color,.16),children:f.name})}),r.jsxs("p",{className:"text-xs text-slate-500 flex flex-wrap items-center gap-0.5",children:[r.jsx("span",{children:f.locked?"locked":"free"}),f.lockReason&&r.jsx("span",{className:"rounded bg-black/30 px-1",children:f.lockReason}),r.jsxs("span",{className:mx("font-semibold",dN(f)),children:["Battery ",fN(f)]})]})]}),o?o(f):null]},f.id)})})]})}const hN=[{key:"open",label:"Open"},{key:"turns",label:"Turns"},{key:"admin",label:"Admin"},{key:"lockdown",label:"Lockdown"}];function pN(){const{session:n,lockRover:s,setMode:i,requestControl:o,setCommunityGoal:f,setAdminReason:d,rebootRover:h,rebootServer:p,setAudioLevels:x,setPrivateSafety:g,llmControl:v,adminLogs:y,llmCommentaryState:S}=nn(),E=m.useMemo(()=>n?.roster??[],[n?.roster]),[C,k]=m.useState({}),[w,j]=m.useState({}),[N,q]=m.useState(!1),[M,O]=m.useState(!1),K=n?.health||null,_=n?.communityGoal?.text||"",H=n?.communityGoal?.updatedAt||null,[z,V]=m.useState(_),U=n?.adminReason?.text||"",W=n?.adminReason?.updatedAt||null,[ce,oe]=m.useState(U),$=n?.audioLevels||{},[T,Y]=m.useState({hornGain:Number.isFinite($.hornGain)?$.hornGain:1,ttsGain:Number.isFinite($.ttsGain)?$.ttsGain:1,forwardGain:Number.isFinite($.forwardGain)?$.forwardGain:1}),[I,ie]=m.useState({}),de=n?.role==="admin"||n?.role==="lockdown"||n?.role==="lockdown-admin",R=n?.role==="lockdown"||n?.role==="lockdown-admin",G=n?.mode??"open",te=async(se,P)=>{try{await s(se,P),k(fe=>({...fe,[se]:P}))}catch(fe){alert(fe.message)}},ae=async se=>{const P=se.target.value;try{await i(P)}catch(fe){alert(fe.message)}},pe=async se=>{try{await o(se,{force:!0})}catch(P){alert(P.message)}},re=async se=>{if(!(!se?.id||!window.confirm(`Reboot rover "${se.name||se.id}" now?`))){j(fe=>({...fe,[se.id]:!0}));try{await h(se.id)}catch(fe){alert(fe.message)}finally{j(fe=>({...fe,[se.id]:!1}))}}},ue=async()=>{if(window.confirm("Reboot the server host now? This will disconnect all users.")){q(!0);try{await p()}catch(P){alert(P.message),q(!1)}}},ve=async()=>{if(window.confirm("Clear LLM commentary history now? This resets chat context, bot memory, and rover activity metrics for narration.")){O(!0);try{await v("clearHistory")}catch(P){alert(P.message)}finally{O(!1)}}},be=async()=>{try{await f(z)}catch(se){alert(se.message)}},xe=async()=>{try{await f(null)}catch(se){alert(se.message)}},Be=async()=>{try{await d(ce)}catch(se){alert(se.message)}},ze=async()=>{try{await d(null)}catch(se){alert(se.message)}},Ae=se=>P=>{const fe=Number(P.target.value);Y(Ne=>({...Ne||{},[se]:Number.isFinite(fe)?fe:1}))},tt=async()=>{try{await x(T)}catch(se){alert(se.message)}},Je=async()=>{window.dispatchEvent(new CustomEvent("buttonBox:rewardRunLocalTest",{detail:{rewardName:"Admin Mode",count:1e3,goal:1e3}}))};m.useEffect(()=>{V(_)},[_]),m.useEffect(()=>{oe(U)},[U]),m.useEffect(()=>{Y({hornGain:Number.isFinite($.hornGain)?$.hornGain:1,ttsGain:Number.isFinite($.ttsGain)?$.ttsGain:1,forwardGain:Number.isFinite($.forwardGain)?$.forwardGain:1})},[$.forwardGain,$.hornGain,$.ttsGain]),m.useEffect(()=>{const se={};(E||[]).forEach(P=>{P?.private?.enabled&&(se[P.id]={speedLimitEnabled:!!P?.private?.safety?.speedLimitEnabled,speedLimitMaxWheelSpeed:Number.isFinite(P?.private?.safety?.speedLimitMaxWheelSpeed)?P.private.safety.speedLimitMaxWheelSpeed:250,hardOvercurrentEnabled:!!P?.private?.safety?.hardOvercurrentEnabled,overcurrentStopMs:Number.isFinite(P?.private?.safety?.overcurrentStopMs)?P.private.safety.overcurrentStopMs:300,hardBumpEnabled:!!P?.private?.safety?.hardBumpEnabled,bumpBackoffSpeed:Number.isFinite(P?.private?.safety?.bumpBackoffSpeed)?P.private.safety.bumpBackoffSpeed:250,bumpBackoffMs:Number.isFinite(P?.private?.safety?.bumpBackoffMs)?P.private.safety.bumpBackoffMs:350,cliffEnabled:!!P?.private?.safety?.cliffEnabled,cliffBackoffSpeed:Number.isFinite(P?.private?.safety?.cliffBackoffSpeed)?P.private.safety.cliffBackoffSpeed:250,cliffBackoffMs:Number.isFinite(P?.private?.safety?.cliffBackoffMs)?P.private.safety.cliffBackoffMs:500,triggerCooldownMs:Number.isFinite(P?.private?.safety?.triggerCooldownMs)?P.private.safety.triggerCooldownMs:800})}),ie(se)},[E]);const vt=m.useMemo(()=>{const se={};return E.forEach(P=>{se[P.id]=C[P.id]??P.locked}),se},[E,C]),le=(se,P={})=>{ie(fe=>({...fe||{},[se]:{...fe?.[se]||{},...P||{}}}))},me=async se=>{try{const P=I?.[se];if(!P)return;await g(se,P)}catch(P){alert(P.message)}};return de?r.jsxs("section",{className:"panel-section space-y-0.5 text-base",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5 text-sm",children:[r.jsx("span",{children:"Admin controls"}),r.jsx("select",{value:G,onChange:ae,className:"field-input text-sm",children:hN.map(se=>r.jsx("option",{value:se.key,children:se.label},se.key))})]}),r.jsxs("div",{className:"flex gap-0.5 text-xs",children:[r.jsx("button",{type:"button",onClick:ue,disabled:N,className:"button-danger disabled:cursor-not-allowed disabled:opacity-60",children:N?"Server rebooting...":"Reboot Server"}),r.jsx("button",{type:"button",onClick:Je,className:"button-dark",children:"Test Reward Popup"})]}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-400",children:[r.jsx("span",{children:"Global audio levels"}),n?.audioLevels?.updatedAt?r.jsxs("span",{children:["Updated ",new Date(n.audioLevels.updatedAt).toLocaleString()]}):null]}),r.jsxs("label",{className:"grid gap-0.5 text-xs text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{children:"Horn gain"}),r.jsxs("span",{children:[T.hornGain.toFixed(2),"x"]})]}),r.jsx("input",{type:"range",min:"0",max:"4",step:"0.01",value:T.hornGain,onChange:Ae("hornGain"),className:"w-full accent-emerald-500"})]}),r.jsxs("label",{className:"grid gap-0.5 text-xs text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{children:"TTS gain"}),r.jsxs("span",{children:[T.ttsGain.toFixed(2),"x"]})]}),r.jsx("input",{type:"range",min:"0",max:"4",step:"0.01",value:T.ttsGain,onChange:Ae("ttsGain"),className:"w-full accent-emerald-500"})]}),r.jsxs("label",{className:"grid gap-0.5 text-xs text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{children:"Forward gain"}),r.jsxs("span",{children:[T.forwardGain.toFixed(2),"x"]})]}),r.jsx("input",{type:"range",min:"0",max:"4",step:"0.01",value:T.forwardGain,onChange:Ae("forwardGain"),className:"w-full accent-emerald-500"})]}),r.jsx("div",{className:"flex gap-0.5 text-xs",children:r.jsx("button",{type:"button",onClick:tt,className:"button-dark",children:"Apply audio levels"})})]}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-400",children:[r.jsx("span",{children:"Community goal"}),H?r.jsxs("span",{children:["Updated ",new Date(H).toLocaleString()]}):null]}),r.jsx("input",{type:"text",value:z,onChange:se=>V(se.target.value),placeholder:"Set a community goal",className:"field-input text-sm"}),r.jsxs("div",{className:"flex gap-0.5 text-xs",children:[r.jsx("button",{type:"button",onClick:be,className:"button-dark",children:"Set goal"}),r.jsx("button",{type:"button",onClick:xe,className:"button-danger",children:"Clear"})]})]}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-400",children:[r.jsx("span",{children:"Admin mode reason"}),W?r.jsxs("span",{children:["Updated ",new Date(W).toLocaleString()]}):null]}),r.jsx("textarea",{value:ce,onChange:se=>oe(se.target.value),placeholder:"Set an admin mode reason",className:"field-input text-sm min-h-[3.5rem]"}),r.jsxs("div",{className:"flex gap-0.5 text-xs",children:[r.jsx("button",{type:"button",onClick:Be,className:"button-dark",children:"Set reason"}),r.jsx("button",{type:"button",onClick:ze,className:"button-danger",children:"Clear"})]})]}),r.jsx(mN,{roster:E,renderActions:se=>r.jsxs("div",{className:"flex flex-wrap items-center gap-0.5 text-xs",children:[r.jsx("button",{type:"button",onClick:()=>te(se.id,!vt[se.id]),className:"button-dark",children:vt[se.id]?"Unlock":"Lock"}),r.jsx("button",{type:"button",onClick:()=>pe(se.id),className:"button-dark",children:"Force"}),r.jsx("button",{type:"button",onClick:()=>re(se),disabled:!!w[se.id],className:"button-danger disabled:cursor-not-allowed disabled:opacity-60",children:w[se.id]?"Rebooting...":"Reboot"}),se?.private?.enabled?r.jsxs("div",{className:"w-full rounded border border-slate-700/70 p-0.5 space-y-0.5 text-[0.7rem]",children:[r.jsx("div",{className:"text-slate-300",children:"Private safety"}),r.jsxs("label",{className:"flex items-center gap-0.5",children:[r.jsx("input",{type:"checkbox",checked:!!I?.[se.id]?.speedLimitEnabled,disabled:!R,onChange:P=>le(se.id,{speedLimitEnabled:!!P.target.checked})}),r.jsx("span",{children:"Speed limit"})]}),r.jsx("input",{type:"number",min:"1",max:"500",className:"field-input text-xs w-20",disabled:!R,value:I?.[se.id]?.speedLimitMaxWheelSpeed??250,onChange:P=>le(se.id,{speedLimitMaxWheelSpeed:Number(P.target.value)||250})}),r.jsxs("label",{className:"flex items-center gap-0.5",children:[r.jsx("input",{type:"checkbox",checked:!!I?.[se.id]?.hardOvercurrentEnabled,disabled:!R,onChange:P=>le(se.id,{hardOvercurrentEnabled:!!P.target.checked})}),r.jsx("span",{children:"Hard overcurrent"})]}),r.jsxs("label",{className:"flex items-center gap-0.5",children:[r.jsx("input",{type:"checkbox",checked:!!I?.[se.id]?.hardBumpEnabled,disabled:!R,onChange:P=>le(se.id,{hardBumpEnabled:!!P.target.checked})}),r.jsx("span",{children:"Hard bump"})]}),r.jsxs("label",{className:"flex items-center gap-0.5",children:[r.jsx("input",{type:"checkbox",checked:!!I?.[se.id]?.cliffEnabled,disabled:!R,onChange:P=>le(se.id,{cliffEnabled:!!P.target.checked})}),r.jsx("span",{children:"Cliff safety"})]}),r.jsx("button",{type:"button",disabled:!R,onClick:()=>me(se.id),className:"button-dark disabled:opacity-50",children:"Apply Safety"})]}):null]})}),r.jsx(bN,{health:K,roster:E}),r.jsx(xN,{state:S,onClearHistory:ve,clearingHistory:M}),r.jsx(yN,{entries:y})]}):null}function xN({state:n,onClearHistory:s,clearingHistory:i}){const[o,f]=m.useState(null);if(!n)return r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("div",{className:"panel-muted text-xs uppercase",children:"LLM Commentary"}),r.jsx("div",{className:"surface text-xs text-slate-300",children:"No status received yet."})]});const d=n.runtime||{},h=n.counters||{},p=n.timings||{},x=n.input||{},g=n.output||{},v=n.errors||{},y=Array.isArray(n.history)?n.history:[],S=y.find(w=>w.runId===o)||(y.length?y[y.length-1]:null),E=gN(n),C=vN(x.modelMessages,g.raw),k=[{label:"running",value:d.running?"yes":"no"},{label:"in flight",value:d.inFlight?"yes":"no"},{label:"phase",value:d.phase||"--"},{label:"run id",value:d.currentRunId??"--"},{label:"tick count",value:d.tickCount??0},{label:"last tick",value:d.lastTickAt?new Date(d.lastTickAt).toLocaleString():"never"},{label:"next run",value:d.nextRunAt?new Date(d.nextRunAt).toLocaleString():"n/a"},{label:"outcome",value:d.outcome||"--"},{label:"reason",value:d.reason||"--"},{label:"skip streak",value:h.skipStreak??0},{label:"clear count",value:h.clearCount??0},{label:"last gen",value:p.lastGenerationMs!=null?`${p.lastGenerationMs} ms`:"--"},{label:"avg gen",value:p.avgGenerationMs!=null?`${p.avgGenerationMs} ms`:"--"},{label:"gen count",value:p.generationCount??0},{label:"prompt chars",value:h.promptChars??0},{label:"active drivers",value:h.snapshotSummary?.activeDrivers??0},{label:"snapshot rovers",value:h.snapshotSummary?.rovers??0},{label:"snapshot chat",value:h.snapshotSummary?.chatMessages??0}];return r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("div",{className:"panel-muted text-xs uppercase",children:"LLM Commentary"}),r.jsx("div",{className:"flex gap-0.5 text-xs",children:r.jsx("button",{type:"button",onClick:s,disabled:!!i,className:"button-danger disabled:cursor-not-allowed disabled:opacity-60",children:i?"Clearing...":"Clear LLM History"})}),r.jsxs("div",{className:`surface border text-center ${E.className}`,children:[r.jsx("div",{className:"text-[1.1rem] font-bold tracking-wide",children:E.label}),r.jsx("div",{className:"text-xs text-slate-200",children:E.detail})]}),r.jsx("div",{className:"surface flex flex-wrap gap-0.5 text-xs",children:k.map(w=>r.jsxs("span",{className:"rounded border border-slate-600/60 bg-slate-800/70 px-0.5 py-0.25 text-[0.72rem] leading-tight text-slate-200",children:[w.label,": ",w.value]},w.label))}),v.message?r.jsxs("div",{className:"surface text-xs text-red-300 break-words",children:["Error: ",v.message]}):null,v.details?r.jsxs("details",{className:"surface text-xs text-red-200",children:[r.jsx("summary",{className:"cursor-pointer select-none text-red-300",children:"Failure details"}),r.jsx("pre",{className:"mt-0.5 whitespace-pre-wrap break-words text-[0.72rem] text-red-200",children:JSON.stringify(v.details,null,2)})]}):null,g.generated?r.jsxs("div",{className:"surface text-xs text-slate-200 break-words",children:["Generated: ",g.generated]}):null,g.posted?r.jsxs("div",{className:"surface text-xs text-emerald-200 break-words",children:["Posted: ",g.posted]}):null,r.jsxs("div",{className:"grid gap-0.5 md:grid-cols-2",children:[r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("div",{className:"panel-muted text-xs uppercase",children:"Live Input Conversation"}),r.jsx("div",{className:"surface max-h-72 space-y-0.5 overflow-y-auto",children:C.length?C.map(w=>r.jsx(id,{message:w.message},w.id)):r.jsx("div",{className:"text-xs text-slate-300",children:"No model conversation captured yet."})})]}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("div",{className:"panel-muted text-xs uppercase",children:"Output + Error"}),r.jsxs("div",{className:"surface space-y-0.5 text-xs text-slate-200",children:[r.jsxs("div",{children:["Raw output: ",g.raw?.trim()?g.raw:""]}),r.jsxs("div",{children:["Posted: ",g.posted||""]}),r.jsxs("div",{children:["Output at:"," ",g.modelOutputAt?new Date(g.modelOutputAt).toLocaleString():"n/a"]}),r.jsxs("div",{children:["Failed at: ",v.failedAt?new Date(v.failedAt).toLocaleString():"n/a"]})]})]})]}),r.jsxs("details",{className:"surface text-xs text-slate-200",children:[r.jsx("summary",{className:"cursor-pointer select-none text-slate-300",children:"Full Monitor Payload"}),r.jsx("pre",{className:"mt-0.5 whitespace-pre-wrap break-words text-[0.72rem] text-slate-200",children:JSON.stringify(n,null,2)})]}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("div",{className:"panel-muted text-xs uppercase",children:"Recent Runs"}),r.jsx("div",{className:"surface max-h-52 space-y-0.5 overflow-y-auto text-xs",children:y.length?y.slice().reverse().map(w=>r.jsxs("button",{type:"button",onClick:()=>f(w.runId),className:`w-full text-left surface ${S?.runId===w.runId?"border border-sky-400/50":""}`,children:[r.jsxs("span",{className:"text-slate-300",children:["#",w.runId]})," ",r.jsx("span",{className:"text-slate-200",children:w.outcome||w.phase||"--"})," ",r.jsx("span",{className:"text-slate-400",children:w.durationMs!=null?`${w.durationMs}ms`:"--"})," ",r.jsx("span",{className:"text-slate-500",children:w.reason||""})]},w.runId)):r.jsx("div",{className:"text-slate-300",children:"No runs recorded yet."})})]}),S?r.jsxs("details",{className:"surface text-xs text-slate-200",open:!0,children:[r.jsxs("summary",{className:"cursor-pointer select-none text-slate-300",children:["Run #",S.runId," details"]}),r.jsx("pre",{className:"mt-0.5 whitespace-pre-wrap break-words text-[0.72rem] text-slate-200",children:JSON.stringify(S,null,2)})]}):null]})}function gN(n){const s=n?.runtime||{},i=n?.output||{},o=n?.errors||{};return s.inFlight?{label:"IN FLIGHT",detail:s.reason||"Generating commentary now",className:"border-amber-400/60 bg-amber-700/20 text-amber-200"}:s.outcome==="posted"?{label:"POSTED",detail:i.posted?`Last: ${i.posted}`:"Commentary posted",className:"border-emerald-400/60 bg-emerald-700/20 text-emerald-200"}:s.outcome==="skipped"?{label:"SKIPPED",detail:s.reason||"Model chose to skip",className:"border-slate-400/60 bg-slate-700/30 text-slate-200"}:s.outcome==="failed"?{label:"FAILED",detail:o.message||s.reason||"Tick failed",className:"border-red-400/60 bg-red-700/20 text-red-200"}:{label:s.running?"IDLE":"STOPPED",detail:s.reason||"Waiting for next tick",className:"border-sky-400/50 bg-sky-700/20 text-sky-200"}}function vN(n,s){const i=Date.now(),f=(Array.isArray(n)?n:[]).map((d,h)=>{const p=String(d?.role||"").toLowerCase(),x=typeof d?.content=="string"?d.content:JSON.stringify(d?.content??null,null,2),g=p==="system"?"LLM System":p==="assistant"?"LLM Context":p==="user"?"LLM Input":"LLM Message";return{id:`llm-msg-${h}`,message:{ts:i+h,nickname:g,text:x,role:"spectator",system:p==="system"}}});if(s!=null){const d=String(s);f.push({id:"llm-output",message:{ts:i+f.length+1,nickname:"LLM Output",text:d.trim()?d:"",role:"spectator",system:!0}})}return f}function bN({health:n,roster:s=[]}){if(!n)return null;const i=n.replay||{sources:[],readyCount:0,totalCount:0},o=n.snapshots||{rovers:[],rooms:[]},f=x=>s.find(g=>String(g.id)===String(x))?.color||null,d=`${i.readyCount}/${i.totalCount} sources ready`,h=o.rovers.filter(x=>x.stale).length,p=o.rooms.filter(x=>x.stale).length;return r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("div",{className:"panel-muted text-xs uppercase",children:"Health"}),r.jsxs("div",{className:"surface space-y-0.5 text-xs text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{children:"Replay segments"}),r.jsx("span",{className:"text-slate-400",children:d})]}),r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{children:"Rover snapshots"}),r.jsxs("span",{className:h?"text-amber-300":"text-emerald-300",children:[o.rovers.length-h,"/",o.rovers.length," ok"]})]}),r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{children:"Room cameras"}),r.jsxs("span",{className:p?"text-amber-300":"text-emerald-300",children:[o.rooms.length-p,"/",o.rooms.length," ok"]})]})]}),r.jsx("div",{className:"space-y-0.5 text-xs text-slate-300",children:i.sources.map(x=>r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{className:`${x.type==="rover"?"rounded px-1 py-[1px] border border-transparent":""}`,style:x.type==="rover"?ca(f(x.id),.16):void 0,children:x.label}),r.jsxs("span",{className:x.ready?"text-emerald-300":"text-amber-300",children:[x.recentCount,"/",x.neededCount]})]},`${x.type}:${x.id}`))}),r.jsx("div",{className:"space-y-0.5 text-xs text-slate-300",children:o.rovers.map(x=>r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{className:"rounded px-1 py-[1px] border border-transparent",style:ca(f(x.id),.16),children:x.name}),r.jsx("span",{className:x.stale?"text-amber-300":"text-emerald-300",children:x.stale?"stale":"ok"})]},`rover:${x.id}`))}),r.jsx("div",{className:"space-y-0.5 text-xs text-slate-300",children:o.rooms.map(x=>r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsx("span",{children:x.name}),r.jsx("span",{className:x.stale?"text-amber-300":"text-emerald-300",children:x.error?"error":x.stale?"stale":"ok"})]},`room:${x.id}`))})]})}function yN({entries:n}){const s=n||[];return r.jsxs("div",{className:"panel-section space-y-0.5 text-base",children:[r.jsxs("div",{className:"flex items-center justify-between text-sm text-slate-400",children:[r.jsx("span",{children:"Admin IP log"}),r.jsx("span",{children:s.length})]}),r.jsx("div",{className:"surface h-64 overflow-y-auto font-mono text-xs",children:s.length===0?r.jsx("p",{children:"No admin log entries yet."}):s.slice().reverse().map(i=>r.jsxs("div",{className:"surface",children:[r.jsx("span",{className:"text-amber-400",children:i.ts?new Date(i.ts).toLocaleTimeString():"--"})," ",i.label&&r.jsxs("span",{className:"text-teal-400",children:["[",i.label,"]"]})," ",r.jsx("span",{className:"text-slate-200",children:i.message})," ",i.ip&&r.jsx("span",{className:"text-cyan-300",children:i.ip})," ",i.meta&&r.jsx("span",{className:"text-slate-500",children:JSON.stringify(i.meta)})]},i.id))}),r.jsx("p",{className:"text-xs text-slate-500",children:"Admin-only log stream; IPs never appear in user data."})]})}const SN=[{id:"driveForward",label:"Drive Forward",group:"Driving"},{id:"driveBackward",label:"Drive Backward",group:"Driving"},{id:"driveLeft",label:"Turn Left",group:"Driving"},{id:"driveRight",label:"Turn Right",group:"Driving"},{id:"boostModifier",label:"Boost Modifier",group:"Driving"},{id:"slowModifier",label:"Slow Modifier",group:"Driving"},{id:"auxMainForward",label:"Main Brush Forward",group:"Aux Motors"},{id:"auxMainReverse",label:"Main Brush Reverse",group:"Aux Motors"},{id:"auxSideForward",label:"Side Brush Forward",group:"Aux Motors"},{id:"auxSideReverse",label:"Side Brush Reverse",group:"Aux Motors"},{id:"auxVacuumFast",label:"Vacuum Max",group:"Aux Motors"},{id:"auxVacuumSlow",label:"Vacuum Low",group:"Aux Motors"},{id:"auxAllForward",label:"All Aux Forward",group:"Aux Motors"},{id:"cameraUp",label:"Camera Up",group:"Camera"},{id:"cameraDown",label:"Camera Down",group:"Camera"},{id:"nightVisionToggle",label:"Toggle Night Vision",group:"Camera"},{id:"hornHonk",label:"Horn (Hold)",group:"Audio"},{id:"micPtt",label:"Mic Push To Talk",group:"Audio"},{id:"driveMacro",label:"Drive Macro",group:"Macros"},{id:"dockMacro",label:"Dock Macro",group:"Macros"},{id:"chatFocus",label:"Toggle Chat",group:"Chat"},{id:"songNoteUp",label:"Song Note Up",group:"Audio"},{id:"songNoteDown",label:"Song Note Down",group:"Audio"},{id:"homeAssistantOn",label:"Room Controls On (Cycle)",group:"Room Controls"},{id:"homeAssistantOff",label:"Room Controls Off (Cycle)",group:"Room Controls"}];function jN(n){return n.reduce((s,i)=>((s[i.group]||(s[i.group]=[])).push(i),s),{})}function AN(n,s){const i=Number(n);return Number.isFinite(i)?Math.max(0,Math.min(500,i)):s}const vd=5,wi=500,Ci=1,bd=100;function NN(n,s){const i=Number(n);return Number.isFinite(i)?Math.max(vd,Math.min(wi,i)):s}function fo(n,s){const i=Number(n);return Number.isFinite(i)?Math.max(Ci,Math.min(bd,i)):s}function wN(n){const i=(fo(n,n)-Ci)/(bd-Ci),o=wi-i*(wi-vd);return Math.round(o)}function CN(n){const s=NN(n,n),i=(wi-s)/(wi-vd),o=Ci+i*(bd-Ci);return Math.round(o)}function EN(n){const[s,i]=m.useState(null),o=m.useCallback(h=>{lf(!0),i(h)},[]),f=m.useCallback(()=>{lf(!1),i(null)},[]),d=m.useCallback((h,p)=>{if(p.preventDefault(),p.stopPropagation(),p.key==="Escape"){f();return}const x=Ti(p.key??"");x&&(n(h,x,p),f())},[f,n]);return m.useEffect(()=>()=>lf(!1),[]),{active:s,startCapture:o,cancel:f,captureFromEvent:d}}function Wr({label:n,description:s,value:i,onChange:o,min:f=0,max:d=500,step:h=5}){return r.jsxs("label",{className:"surface-muted block p-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-300",children:[r.jsx("span",{className:"font-semibold text-slate-100",children:n}),r.jsx("input",{type:"number",min:f,max:d,value:i,onChange:p=>o(p.target.value),className:"w-16 rounded border border-slate-700 bg-slate-900 px-1 py-[2px] text-right text-[0.75rem] font-mono text-slate-100"})]}),s&&r.jsx("p",{className:"text-[0.65rem] text-slate-500",children:s}),r.jsxs("div",{className:"mt-0 flex items-center gap-0.5",children:[r.jsx("input",{type:"range",min:f,max:d,step:h,value:i,onChange:p=>o(p.target.value),className:"h-2 flex-1 accent-emerald-400"}),r.jsx("span",{className:"w-12 text-right text-[0.75rem] font-mono text-slate-400",children:i})]})]})}function kN(){const{state:{keymap:n},actions:{updateKeyBinding:s,resetKeyBindings:i}}=_t(),{value:o,save:f}=He("inputs",qn),d={...qn.keyboard,...o.keyboard??{}},h=m.useMemo(()=>typeof d.tiltSpeed=="number"?fo(d.tiltSpeed,qn.keyboard.tiltSpeed):typeof d.tiltIntervalMs=="number"?fo(CN(d.tiltIntervalMs),qn.keyboard.tiltSpeed):qn.keyboard.tiltSpeed,[d.tiltIntervalMs,d.tiltSpeed]),p=m.useMemo(()=>jN(SN),[]),{active:x,startCapture:g,cancel:v,captureFromEvent:y}=EN((k,w)=>{s(k,w)}),S=m.useCallback(k=>n?.[k]?.[0]||xi[k]?.[0]||"",[n]),E=m.useCallback((k,w)=>{const j=qn.keyboard,N=AN(w,j[k]);f(q=>({...q??{},keyboard:{...q?.keyboard??j,[k]:N}}))},[f]),C=m.useCallback(k=>{const w=qn.keyboard,j=fo(k,w.tiltSpeed),N=wN(j);f(q=>({...q??{},keyboard:{...q?.keyboard??w,tiltSpeed:j,tiltIntervalMs:N}}))},[f]);return r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsxs("div",{className:"flex items-center justify-between",children:[r.jsxs("div",{children:[r.jsx("p",{className:"text-xs text-slate-400",children:"Keyboard layout"}),r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:"Per-browser · click to change a binding"})]}),r.jsx("button",{type:"button",onClick:()=>i(),className:"button-dark text-xs",children:"Reset defaults"})]}),r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:"Keyboard speeds"}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsx(Wr,{label:"Base speed",description:"Normal driving speed",value:d.baseSpeed,onChange:k=>E("baseSpeed",k)}),r.jsx(Wr,{label:"Turbo speed",description:"Used when holding the boost modifier",value:d.turboSpeed,onChange:k=>E("turboSpeed",k)}),r.jsx(Wr,{label:"Precision speed",description:"Used when holding the precision modifier",value:d.precisionSpeed,onChange:k=>E("precisionSpeed",k)})]})]}),r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:"Camera tilt"}),r.jsx(Wr,{label:"Tilt speed",description:"Higher = faster when holding tilt keys",value:h,onChange:C,min:1,max:100,step:1})]}),r.jsx("div",{className:"space-y-0.5",children:Object.entries(p).map(([k,w])=>r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"text-[0.75rem] text-slate-400",children:k}),r.jsx("div",{className:"space-y-0.5",children:w.map(j=>{const N=S(j.id),q=x===j.id;return r.jsxs("div",{className:"surface-muted flex items-center justify-between text-xs",children:[r.jsxs("div",{children:[r.jsx("p",{className:"font-semibold text-slate-100",children:j.label}),r.jsx("p",{className:"text-[0.65rem] text-slate-400",children:An(N)})]}),r.jsxs("div",{className:"flex items-center gap-0.5",children:[q&&r.jsx("button",{type:"button",onClick:()=>v(),className:"button-danger text-[0.7rem]",children:"Cancel"}),r.jsx("button",{type:"button",onClick:()=>g(j.id),onKeyDown:q?M=>y(j.id,M):void 0,autoFocus:q,className:`${q?"px-0.5 py-0.5 bg-emerald-500 text-emerald-950 hover:bg-emerald-400":"button-dark"} text-[0.7rem] font-medium transition-colors`,children:q?"Press a key…":"Change"})]})]},j.id)})})]},k))})]})}const la=new Intl.NumberFormat(void 0,{maximumFractionDigits:2}),MN=[{id:"drive",label:"Drive stick",kind:"axisPair",section:"Driving",invertDefaults:{invertX:!1,invertY:!0}},{id:"cameraTilt",label:"Camera tilt",kind:"axis",section:"Camera",invertDefaults:{invert:!0}},{id:"mainBrush",label:"Main brush",kind:"axis",section:"Brushes",invertDefaults:{invert:!1}},{id:"sideBrush",label:"Side brush",kind:"axis",section:"Brushes",invertDefaults:{invert:!1}},{id:"vacuum",label:"Vacuum",kind:"button",section:"Aux buttons"},{id:"allAux",label:"All aux",kind:"button",section:"Aux buttons"},{id:"mainReverse",label:"Main reverse toggle",kind:"button",section:"Brush toggles"},{id:"sideReverse",label:"Side reverse toggle",kind:"button",section:"Brush toggles"},{id:"driveMacro",label:"Drive macro",kind:"button",section:"Mode macros"},{id:"dockMacro",label:"Dock macro",kind:"button",section:"Mode macros"},{id:"nightVisionToggle",label:"Night vision toggle",kind:"button",section:"Camera"}],hx=.45,RN=.6;function di({label:n,description:s,min:i,max:o,step:f,value:d,onChange:h}){return r.jsxs("label",{className:"surface-muted block p-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-300",children:[r.jsx("span",{className:"font-semibold text-slate-100",children:n}),r.jsx("span",{className:"font-mono text-slate-400",children:la.format(d)})]}),s&&r.jsx("p",{className:"text-[0.65rem] text-slate-500",children:s}),r.jsx("input",{type:"range",min:i,max:o,step:f,value:d,onChange:p=>h(Number(p.target.value)),className:"mt-0 w-full accent-emerald-400"})]})}function qN(n){if(!n)return"Unassigned";if(n.kind==="axisPair"){const s=`${n.invertX?"X inv ":""}${n.invertY?"Y inv":""}`.trim();return`Axes ${n.x}/${n.y}${s?` (${s})`:""}`}if(n.kind==="axis")return`Axis ${n.index}${n.invert?" (inv)":""}`;if(n.kind==="button")return`Button ${n.index}`;if(n.kind==="buttonAxis")return`Button ${n.index} (analog)`;if(n.kind==="axisButton"){const s=n.direction<0?"<":">";return`Axis ${n.index} ${s} ${la.format(n.threshold??.6)}`}return"Unassigned"}function TN(n){return n.reduce((s,i)=>((s[i.section]||(s[i.section]=[])).push(i),s),{})}function DN(n,s){if(!n||n.length===0)return null;if(s){const i=n.find(o=>o.signature===s);if(i)return i}return n[0]}function _N(n){return{axes:Array.from(n.axes??[]),buttons:(n.buttons??[]).map(s=>({pressed:!!s?.pressed,value:typeof s?.value=="number"?s.value:s?.pressed?1:0}))}}function BN(n,s,i){const o=(n.axes??[]).map((d,h)=>({index:h,delta:Math.abs((d??0)-(s.axes?.[h]??0)),value:d}));if(o.sort((d,h)=>h.delta-d.delta),i.kind==="axisPair"){const d=o.filter(h=>h.delta>hx).slice(0,2);return d.length<2?null:{kind:"axisPair",x:d[0].index,y:d[1].index,...i.invertDefaults??{}}}const f=o.find(d=>d.delta>hx);return f?{kind:"axis",index:f.index,...i.invertDefaults??{}}:null}function ON(n,s,i){const o=n.buttons??[];for(let d=0;dRN)return i.kind==="axis"?{kind:"buttonAxis",index:d}:{kind:"button",index:d}}const f=n.axes??[];for(let d=0;d.7&&p>.5)return i.kind==="axis"?{kind:"axis",index:d,...i.invertDefaults??{}}:{kind:"axisButton",index:d,direction:h>=0?1:-1,threshold:.6}}return null}function LN(n,s,i){if(!n)return null;if(i.kind==="axis"||i.kind==="axisPair"){const o=BN(n,s,i);if(o)return o}return ON(n,s,i)}function zN(){const n=mA(),{value:s,save:i}=He("gamepad",Ba),[o,f]=m.useState(null),d=m.useRef(null),h=m.useMemo(()=>TN(MN),[]),p=m.useMemo(()=>DN(n.pads,s.activeSignature),[n.pads,s.activeSignature]),x=p?.signature??null,g=m.useMemo(()=>x?s?.profiles?.[x]??s?.defaults?.profile??ia:s?.defaults?.profile??ia,[x,s?.defaults?.profile,s?.profiles]);m.useEffect(()=>{!p||!x||s?.profiles?.[x]||i(w=>{const j=w??Ba;if(j.profiles?.[x])return j;const N=j?.defaults?.profile??ia,q=Eg(p,N);return{...j,profiles:{...j.profiles??{},[x]:q}}})},[p,x,s?.profiles,i]),m.useEffect(()=>{d.current=null},[o,x]),m.useEffect(()=>{if(!o||!p)return;if(!d.current){d.current=_N(p);return}const w=LN(p,d.current,o);w&&(i(j=>{const N=j??Ba,q=N.profiles?.[x]??N?.defaults?.profile??ia,M={...q,bindings:{...q.bindings??{},[o.id]:{...q.bindings?.[o.id]??{},kind:o.kind,sources:[w]}}};return{...N,profiles:{...N.profiles??{},[x]:M}}}),f(null))},[p,x,o,i]);const v=m.useCallback(w=>{i(j=>({...j??Ba,activeSignature:w||null}))},[i]),y=m.useCallback(w=>{i(j=>{const N=j??Ba,q=(x&&N.profiles?.[x])??N?.defaults?.profile??ia,M={...q,calibration:{...q.calibration??{},...w}};return x?{...N,profiles:{...N.profiles??{},[x]:M}}:{...N,defaults:{...N.defaults??{},profile:M}}})},[x,i]),S=m.useCallback((w,j)=>{i(N=>{const q=N??Ba,M=(x&&q.profiles?.[x])??q?.defaults?.profile??ia,O=j(M.bindings?.[w]??{}),K={...M,bindings:{...M.bindings??{},[w]:O}};return x?{...q,profiles:{...q.profiles??{},[x]:K}}:{...q,defaults:{...q.defaults??{},profile:K}}})},[x,i]),E=m.useCallback(w=>{S(w.id,j=>({...j,sources:[]}))},[S]),C=m.useCallback((w,j)=>{S(w.id,N=>{const q=Array.isArray(N.sources)?[...N.sources]:[];if(!q[0])return N;const M={...q[0]};return j==="invertX"?M.invertX=!M.invertX:j==="invertY"?M.invertY=!M.invertY:M.invert=!M.invert,q[0]=M,{...N,sources:q}})},[S]),k=m.useMemo(()=>p?{outputs:kg(p,g)}:null,[p,g]);return r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("div",{className:"flex items-center justify-between",children:r.jsxs("div",{children:[r.jsx("p",{className:"text-xs text-slate-400",children:"Controller"}),r.jsx("p",{className:"text-[0.65rem] text-slate-500",children:p?"Move sticks or press buttons to bind":"Connect a controller to configure."}),o&&r.jsxs("p",{className:"mt-0 text-[0.7rem] text-emerald-400",children:["Capturing ",o.label,"…"]})]})}),r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:"Connected controller"}),n.pads.length===0?r.jsx("p",{className:"text-[0.7rem] text-slate-400",children:"No controller detected."}):r.jsxs("div",{className:"flex items-center justify-between gap-0.5 text-xs",children:[r.jsx("select",{value:x??"",onChange:w=>v(w.target.value),className:"flex-1 rounded border border-slate-700 bg-slate-900 px-1 py-[2px] text-[0.75rem] text-slate-100",children:n.pads.map(w=>r.jsx("option",{value:w.signature,children:w.id||"Unknown controller"},w.signature))}),r.jsx("span",{className:"text-[0.7rem] text-slate-400",children:p?.mapping??"unknown"})]})]}),r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:"Calibration"}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsx(di,{label:"Drive deadzone",description:"Ignore small drive stick drift",min:0,max:.6,step:.01,value:g.calibration?.driveDeadzone??.18,onChange:w=>y({driveDeadzone:w})}),r.jsx(di,{label:"Camera deadzone",description:"Ignore small camera tilt drift",min:0,max:.4,step:.01,value:g.calibration?.cameraDeadzone??.08,onChange:w=>y({cameraDeadzone:w})}),r.jsx(di,{label:"Aux deadzone",description:"Ignore small trigger noise",min:0,max:.4,step:.01,value:g.calibration?.auxDeadzone??.05,onChange:w=>y({auxDeadzone:w})}),r.jsx(di,{label:"Side brush scale",description:"Scale side brush output",min:.3,max:1,step:.05,value:g.calibration?.auxSideScale??.55,onChange:w=>y({auxSideScale:w})}),r.jsxs("label",{className:"surface-muted block p-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-300",children:[r.jsx("span",{className:"font-semibold text-slate-100",children:"Camera mode"}),r.jsxs("select",{value:g.calibration?.cameraMode??"absolute",onChange:w=>y({cameraMode:w.target.value}),className:"rounded border border-slate-700 bg-slate-900 px-1 py-[2px] text-[0.75rem] text-slate-100",children:[r.jsx("option",{value:"absolute",children:"Absolute"}),r.jsx("option",{value:"velocity",children:"Velocity"})]})]}),r.jsx("p",{className:"text-[0.65rem] text-slate-500",children:"Absolute maps stick to angle; velocity moves over time."})]}),r.jsx(di,{label:"Camera sensitivity",description:"Velocity mode degrees per second",min:10,max:180,step:5,value:g.calibration?.cameraSensitivity??60,onChange:w=>y({cameraSensitivity:w})})]})]}),r.jsx("div",{className:"space-y-0.5",children:Object.entries(h).map(([w,j])=>r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:w}),r.jsx("div",{className:"space-y-0.5",children:j.map(N=>{const M=g.bindings?.[N.id]?.sources?.[0]??null;return r.jsxs("div",{className:"surface-muted flex items-center justify-between text-xs",children:[r.jsxs("div",{children:[r.jsx("p",{className:"font-semibold text-slate-100",children:N.label}),r.jsx("p",{className:"text-[0.65rem] text-slate-400",children:qN(M)})]}),r.jsxs("div",{className:"flex items-center gap-0.5",children:[N.kind==="axisPair"&&r.jsxs(r.Fragment,{children:[r.jsx("button",{type:"button",disabled:!M,onClick:()=>C(N,"invertX"),className:"button-dark text-[0.7rem] font-medium disabled:opacity-50",children:"Invert X"}),r.jsx("button",{type:"button",disabled:!M,onClick:()=>C(N,"invertY"),className:"button-dark text-[0.7rem] font-medium disabled:opacity-50",children:"Invert Y"})]}),N.kind==="axis"&&r.jsx("button",{type:"button",disabled:!M,onClick:()=>C(N),className:"button-dark text-[0.7rem] font-medium disabled:opacity-50",children:"Invert"}),r.jsx("button",{type:"button",onClick:()=>E(N),className:"button-dark text-[0.7rem]",children:"Clear"}),r.jsx("button",{type:"button",onClick:()=>f(N),className:`${o?.id===N.id?"px-0.5 py-0.5 bg-emerald-500 text-emerald-950 hover:bg-emerald-400":"button-dark"} text-[0.7rem] font-medium`,children:o?.id===N.id?"Waiting…":"Capture"})]})]},N.id)})})]},w))}),r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:"Diagnostics"}),p?r.jsxs("div",{className:"space-y-0.5 text-[0.7rem] text-slate-300",children:[r.jsx("p",{className:"text-slate-400",children:"Raw axes"}),r.jsx("div",{className:"grid grid-cols-2 gap-0.5",children:p.axes.map((w,j)=>r.jsxs("span",{className:"font-mono text-slate-300",children:["A",j,": ",la.format(w)]},`axis-${j}`))}),r.jsx("p",{className:"text-slate-400",children:"Raw buttons"}),r.jsx("div",{className:"grid grid-cols-2 gap-0.5",children:p.buttons.map((w,j)=>r.jsxs("span",{className:"font-mono text-slate-300",children:["B",j,": ",la.format(w.value)," ",w.pressed?"●":""]},`btn-${j}`))}),k?.outputs&&r.jsxs(r.Fragment,{children:[r.jsx("p",{className:"text-slate-400",children:"Mapped outputs"}),r.jsxs("div",{className:"grid grid-cols-2 gap-0.5",children:[r.jsxs("span",{className:"font-mono text-slate-300",children:["Drive: ",la.format(k.outputs.driveVector.x),","," ",la.format(k.outputs.driveVector.y)]}),r.jsxs("span",{className:"font-mono text-slate-300",children:["Camera: ",la.format(k.outputs.cameraAxis)]}),r.jsxs("span",{className:"font-mono text-slate-300",children:["Main: ",la.format(k.outputs.auxAxis.main)]}),r.jsxs("span",{className:"font-mono text-slate-300",children:["Side: ",la.format(k.outputs.auxAxis.side)]})]})]})]}):r.jsx("p",{className:"text-[0.7rem] text-slate-400",children:"No controller detected."})]})]})}const UN={drive:"Drive wheels",aux:"Aux motors"};function px(n){return Number.isFinite(n)?`${Math.round(n*100)}%`:"--"}function HN({value:n,color:s="bg-emerald-500"}){const i=`${Math.round(Math.max(0,Math.min(1,n))*100)}%`;return r.jsx("div",{className:"h-2 w-full overflow-hidden rounded bg-slate-800",children:r.jsx("div",{className:`h-full ${s}`,style:{width:i}})})}function VN(){const{state:{roverId:n},overcurrentLimiter:s}=_t(),i=m.useMemo(()=>rs.map(o=>o.key),[]);return r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-400",children:[r.jsx("span",{children:"Overcurrent limiter"}),r.jsx("span",{children:s?.adminImmune?"Admin immune":"Active"})]}),n?r.jsxs("div",{className:"space-y-0.5",children:[i.map(o=>{const f=s?.caps?.[o]?.cap??0,d=s?.overcurrent?.groups?.[o]??!1,h=s?.scales?.perGroup?.[o]??1;return r.jsxs("div",{className:"surface space-y-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs",children:[r.jsx("span",{className:"text-slate-200",children:UN[o]||o}),r.jsx("span",{className:d?"text-red-300":"text-slate-400",children:d?"overcurrent":"ok"})]}),r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-[0.7rem] text-slate-400",children:[r.jsx("span",{children:"Cap"}),r.jsx("span",{children:px(f)})]}),r.jsx(HN,{value:f,color:"bg-amber-500"}),r.jsxs("div",{className:"flex items-center justify-between text-[0.7rem] text-slate-400",children:[r.jsx("span",{children:"Scale"}),r.jsx("span",{children:px(h)})]})]})]},o)}),r.jsxs("div",{className:"surface text-[0.7rem] text-slate-400",children:[r.jsx("div",{children:`Down rate ${s?.config?.downRatePerSec}/s · Up rate ${s?.config?.upRatePerSec}/s`}),r.jsx("div",{children:`Release delay ${s?.config?.releaseDelaySec}s`}),r.jsx("div",{children:`Output rate ${s?.config?.outputRateMs}ms`})]})]}):r.jsx("p",{className:"text-xs text-slate-500",children:"Assign a rover to view limiter status."})]})}const Yg=m.createContext(null);function Fg(){const n=m.useContext(Yg);if(!n)throw new Error("Tabs components must be used within a provider.");return n}const xx={primary:{base:"flex-1 px-0.5 py-0.5 text-sm font-medium focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-1 focus-visible:outline-slate-500 rounded-md border border-slate-800",active:"bg-sky-600 text-white border-white",inactive:"bg-zinc-900 text-slate-300 hover:bg-sky-500 hover:text-white"}},gx={none:"",pink:"bg-pink-500 text-white border-pink-200 hover:bg-pink-400",green:"bg-emerald-500 text-white border-emerald-200 hover:bg-emerald-400"},Xg="primary";function yd(...n){return n.filter(Boolean).join(" ")}function Sd({children:n,defaultTab:s,currentTab:i,onTabChange:o,variant:f=Xg}){const[d,h]=m.useState(s??null),[p,x]=m.useState([]),g=m.useCallback(E=>E?(x(C=>C.includes(E)?C:[...C,E]),()=>x(C=>C.includes(E)?C.filter(k=>k!==E):C)):()=>{},[]),v=i??d??p[0]??null;m.useEffect(()=>{s&&i===void 0&&h(s)},[s,i]);const y=m.useCallback(E=>{E&&(i===void 0&&h(E),o&&o(E))},[i,o]),S=m.useMemo(()=>({activeTab:v,setActiveTab:y,registerTab:g,variant:f}),[v,y,g,f]);return r.jsx(Yg.Provider,{value:S,children:n})}function jd({children:n,className:s=""}){return r.jsx("div",{className:yd("flex gap-0.5",s),children:n})}function Wt({id:n,children:s,className:i="",disabled:o=!1,highlight:f="none"}){const{activeTab:d,setActiveTab:h,registerTab:p,variant:x}=Fg();m.useEffect(()=>p(n),[n,p]);const g=xx[x]??xx[Xg],v=d===n,y=gx[f]||gx.none,S=yd(g.base,y||(v?g.active:g.inactive),o?"cursor-not-allowed opacity-50":"",i);return r.jsx("button",{type:"button",className:S,onClick:()=>!o&&h(n),"aria-pressed":v,"aria-disabled":o,children:s})}function Ad({children:n,className:s=""}){return r.jsx("div",{className:yd("mt-0 space-y-0.5",s),children:n})}function en({id:n,children:s,keepMounted:i=!1}){const{activeTab:o}=Fg(),f=o===n;return!f&&!i?null:!f&&i?r.jsx("div",{hidden:!0,"aria-hidden":"true",children:s}):r.jsx(r.Fragment,{children:s})}function $N(){const{session:n}=nn(),s=m.useMemo(()=>JSON.stringify(n??{},null,2),[n]);return r.jsxs("div",{className:"panel-section flex min-h-0 flex-col gap-0.5 text-xs",children:[r.jsx("p",{className:"text-sm text-slate-400",children:"Session snapshot"}),r.jsx("pre",{className:"surface min-h-0 flex-1 overflow-y-auto font-mono text-[0.7rem] text-lime-300",children:s})]})}const vx=300,bx=240;function GN(n,s){if(n===void 0)return"undefined";if(n===null)return"null";if(typeof n=="string")return n;if(typeof n=="number"||typeof n=="boolean")return String(n);if(typeof n=="function")return"[Function]";if(n instanceof Error)return`${n.name}: ${n.message}`;if(n instanceof Date)return n.toISOString();if(s||(s=new WeakSet),typeof n=="object"){if(s.has(n))return"[Circular]";s.add(n)}try{return JSON.stringify(n,(i,o)=>typeof o=="function"?"[Function]":o instanceof Error?`${o.name}: ${o.message}`:o,0)}catch{return String(n)}}function YN(n){const i=n.map(o=>GN(o)).join(" ");return i.length>bx?`${i.slice(0,bx)}…`:i}function FN(){const n=tn(),[s,i]=m.useState([]),o=m.useMemo(()=>s.reduce((f,d)=>(d.direction==="in"&&(f.in+=1),d.direction==="out"&&(f.out+=1),f),{in:0,out:0}),[s]);return m.useEffect(()=>{const f=(x,g,v)=>{i(y=>{const S=[...y,{id:`${Date.now()}-${Math.random().toString(16).slice(2)}`,direction:x,event:g,payload:YN(v),timestamp:new Date().toLocaleTimeString()}];return S.length>vx?S.slice(-vx):S})},d=(x,...g)=>f("in",x,g),h=(x,...g)=>f("out",x,g);n.onAny(d);let p=null;if(typeof n.onAnyOutgoing=="function")n.onAnyOutgoing(h),p=()=>n.offAnyOutgoing(h);else{const x=n.emit.bind(n);n.emit=(g,...v)=>(h(g,...v),x(g,...v)),p=()=>{n.emit=x}}return()=>{n.offAny(d),p&&p()}},[n]),r.jsxs("section",{className:"panel-section space-y-0.5 text-base",children:[r.jsxs("div",{className:"flex items-center justify-between text-sm text-slate-400",children:[r.jsx("span",{children:"Socket activity"}),r.jsxs("div",{className:"flex items-center gap-0.5 text-xs text-slate-400",children:[r.jsxs("span",{className:"surface-muted",children:["in ",o.in]}),r.jsxs("span",{className:"surface-muted",children:["out ",o.out]}),r.jsx("button",{type:"button",className:"button-dark text-xs",onClick:()=>i([]),children:"Clear"})]})]}),r.jsx("div",{className:"surface h-64 overflow-y-auto font-mono text-xs",children:s.length===0?r.jsx("p",{children:"No socket activity yet."}):s.slice().reverse().map(f=>r.jsxs("div",{className:"surface",children:[r.jsx("span",{className:"text-slate-400",children:f.timestamp})," ",r.jsxs("span",{className:f.direction==="in"?"text-emerald-400":"text-amber-400",children:["[",f.direction.toUpperCase(),"]"]})," ",r.jsx("span",{className:"text-cyan-300",children:f.event})," ",r.jsx("span",{className:"text-slate-200",children:f.payload})]},f.id))}),r.jsx("p",{className:"text-xs text-slate-500",children:"Logs are collected only while this panel is open."})]})}const XN=[{key:"start",label:"Start OI"},{key:"safe",label:"Safe"},{key:"full",label:"Full"},{key:"passive",label:"Passive"},{key:"dock",label:"Dock"}];function Qg(){const{state:{roverId:n},actions:{sendOiCommand:s,setSensorStream:i}}=_t(),o=!!n,[f,d]=Hg(),h=tn(),{value:p,save:x}=He("page",{hudMapDesktop:!1,connectionTransport:"websocket",swapMobileControlColumns:!1,driveMacroBackoffEnabled:!0}),{value:g,save:v}=He("audio",ct),y=p?.connectionTransport||"websocket",S=!!p?.swapMobileControlColumns,E=typeof p?.driveMacroBackoffEnabled=="boolean"?p.driveMacroBackoffEnabled:!0,C=Number.isFinite(g?.masterVolume)?g.masterVolume:ct.masterVolume,k=Number.isFinite(g?.alertVolume)?g.alertVolume:ct.alertVolume,w=Number.isFinite(g?.roverVolume)?g.roverVolume:ct.roverVolume,j=typeof g?.mainBrushDuckEnabled=="boolean"?g.mainBrushDuckEnabled:typeof g?.autoLevelEnabled=="boolean"?g.autoLevelEnabled:ct.mainBrushDuckEnabled,N=Number.isFinite(g?.mainBrushDuckAmount)?Math.max(0,Math.min(1,g.mainBrushDuckAmount)):ct.mainBrushDuckAmount,q=m.useMemo(()=>[{key:"start",label:"Enable stream",enable:!0},{key:"stop",label:"Disable stream",enable:!1}],[]),M=V=>{n&&i(V)},O=V=>{const U=V.target.value;x(W=>({...W??{},connectionTransport:U})),h?.io?.opts&&(h.io.opts.transports=U==="polling"?["polling"]:["websocket","polling"],h.disconnect(),h.connect())},K=V=>U=>{const W=Number(U.target.value),ce=Number.isFinite(W)?Math.max(0,Math.min(1,W)):0;v(oe=>({...oe??{},[V]:ce}))},_=V=>{const U=!!V.target.checked;v(W=>({...W??{},mainBrushDuckEnabled:U}))},H=V=>{const U=!!V.target.checked;x(W=>({...W??{},swapMobileControlColumns:U}))},z=V=>{const U=!!V.target.checked;x(W=>({...W??{},driveMacroBackoffEnabled:U}))};return r.jsxs(Sd,{defaultTab:"keybindings",children:[r.jsxs(jd,{children:[r.jsx(Wt,{id:"keybindings",children:"Keybindings"}),r.jsx(Wt,{id:"controller",children:"Controller"}),r.jsx(Wt,{id:"page",children:"Page settings"}),r.jsx(Wt,{id:"admin",children:"Admin"})]}),r.jsxs(Ad,{children:[r.jsx(en,{id:"keybindings",children:r.jsx("div",{className:"space-y-0.5",children:r.jsx(kN,{})})}),r.jsx(en,{id:"controller",children:r.jsx("div",{className:"space-y-0.5",children:r.jsx(zN,{})})}),r.jsx(en,{id:"page",children:r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-slate-400",children:"HUD"}),r.jsxs("label",{className:"flex items-center gap-0.5 text-slate-200",children:[r.jsx("input",{type:"checkbox",className:"accent-emerald-500",checked:f,onChange:V=>d(V.target.checked)}),r.jsx("span",{children:"Show top-down map in HUD (desktop)"})]}),r.jsx("p",{className:"text-xs text-slate-500",children:"Mobile HUD keeps the map on by default."})]}),r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-slate-400",children:"Mobile controls"}),r.jsxs("label",{className:"flex items-center gap-0.5 text-slate-200",children:[r.jsx("input",{type:"checkbox",className:"accent-emerald-500",checked:S,onChange:H}),r.jsx("span",{children:"Swap control columns (put joystick on the left)"})]})]}),r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-slate-400",children:"Macros"}),r.jsxs("label",{className:"flex items-center gap-0.5 text-slate-200",children:[r.jsx("input",{type:"checkbox",className:"accent-emerald-500",checked:E,onChange:z}),r.jsx("span",{children:"Enable backward bump in drive macro"})]})]}),r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-slate-400",children:"Audio"}),r.jsxs("label",{className:"grid gap-0.5 text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{children:"Master volume"}),r.jsxs("span",{className:"text-xs text-slate-400",children:[Math.round(C*100),"%"]})]}),r.jsx("input",{type:"range",min:"0",max:"1",step:"0.01",value:C,onChange:K("masterVolume"),className:"w-full accent-emerald-500"})]}),r.jsxs("label",{className:"grid gap-0.5 text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{children:"Alert/page sounds"}),r.jsxs("span",{className:"text-xs text-slate-400",children:[Math.round(k*100),"%"]})]}),r.jsx("input",{type:"range",min:"0",max:"1",step:"0.01",value:k,onChange:K("alertVolume"),className:"w-full accent-emerald-500"})]}),r.jsxs("label",{className:"grid gap-0.5 text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{children:"Rover audio"}),r.jsxs("span",{className:"text-xs text-slate-400",children:[Math.round(w*100),"%"]})]}),r.jsx("input",{type:"range",min:"0",max:"1",step:"0.01",value:w,onChange:K("roverVolume"),className:"w-full accent-emerald-500"})]}),r.jsxs("label",{className:"flex items-center justify-between gap-0.5 text-slate-200",children:[r.jsx("span",{children:"Main brush ducking"}),r.jsx("input",{type:"checkbox",className:"accent-emerald-500",checked:j,onChange:_})]}),r.jsxs("label",{className:"grid gap-0.5 text-slate-200",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsx("span",{children:"Main brush duck amount"}),r.jsxs("span",{className:"text-xs text-slate-400",children:[Math.round(N*100),"%"]})]}),r.jsx("input",{type:"range",min:"0",max:"1",step:"0.01",value:N,onChange:K("mainBrushDuckAmount"),className:"w-full accent-emerald-500",disabled:!j})]}),r.jsx("p",{className:"text-xs text-slate-500",children:"Lowers rover audio only while the main brush is running."})]}),r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-slate-400",children:"Connection"}),r.jsxs("label",{className:"flex items-center justify-between gap-0.5 text-slate-200",children:[r.jsx("span",{children:"Transport"}),r.jsxs("select",{value:y,onChange:O,className:"field-input text-sm",children:[r.jsx("option",{value:"websocket",children:"WebSocket"}),r.jsx("option",{value:"polling",children:"Polling"})]})]}),r.jsx("p",{className:"text-xs text-slate-500",children:"Switching reconnects your session."})]})]})}),r.jsx(en,{id:"admin",children:r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-slate-400",children:"Manual OI commands"}),r.jsx("div",{className:"surface flex flex-wrap gap-0.5",children:XN.map(V=>r.jsx("button",{type:"button",onClick:()=>s(V.key),disabled:!o,className:"button-dark text-xs disabled:opacity-30",children:V.label},V.key))})]}),r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsx("p",{className:"text-slate-400",children:"Sensor stream"}),r.jsx("div",{className:"surface flex gap-0.5",children:q.map(V=>r.jsx("button",{type:"button",onClick:()=>M(V.enable),disabled:!o,className:"flex-1 button-dark text-xs disabled:opacity-30",children:V.label},V.key))}),!o&&r.jsx("p",{className:"text-xs text-slate-500",children:"Assign a rover to toggle streams."})]}),r.jsx(Gg,{}),r.jsx(VN,{}),r.jsx(pN,{}),r.jsx($N,{}),r.jsx(FN,{})]})})]})]})}const yx={desktop:{main:[{type:"list",title:"Chat and nicknames",items:["Set a nickname in the user list panel, on the bottom left of the page below the rover video.",{segments:["Toggle chat focus with ",{action:"chatFocus"},". Press ",{action:"chatFocus"}," again to send."]}]},{type:"list",title:"Driving the rover",items:[{segments:['Press the "Start Driving" button onscreen, or press ',{action:"driveMacro"}," on your keyboard to put the rover into driving mode."]},"Refer to the controls for the controls for the rover."]},{type:"list",title:"Docking the rover",items:["Line up the rover to the dock, about a foot away, then:",{segments:['Press the "Dock and Charge" button onscreen, or press ',{action:"dockMacro"}," on your keyboard to start docking."]},"Wait for the rover to confirm it is docked and charging before leaving it unattended."]}],aside:[{type:"keyboard",title:"Keyboard controls",footnote:"Per-browser; adjust bindings and speeds in Settings → Keybindings.",groups:[{id:"movement",title:"Movement",items:[{action:"driveForward",label:"Forward"},{action:"driveBackward",label:"Backward"},{action:"driveLeft",label:"Turn left"},{action:"driveRight",label:"Turn right"},{action:"boostModifier",label:"Boost speed"},{action:"slowModifier",label:"Precision speed"}]},{id:"macros",title:"Rover modes & chat",items:[{action:"driveMacro",label:"Drive macro"},{action:"dockMacro",label:"Dock macro"},{action:"chatFocus",label:"Chat focus"}]},{id:"camera",title:"Camera",items:[{action:"cameraUp",label:"Tilt up"},{action:"cameraDown",label:"Tilt down"},{action:"nightVisionToggle",label:"Toggle night vision"}]},{id:"motors",title:"Rover Aux Motors",items:[{action:"auxMainForward",label:"Main brush forward"},{action:"auxMainReverse",label:"Main brush reverse"},{action:"auxSideForward",label:"Side brush forward"},{action:"auxSideReverse",label:"Side brush reverse"},{action:"auxVacuumFast",label:"Vacuum max"},{action:"auxVacuumSlow",label:"Vacuum low"},{action:"auxAllForward",label:"All motors forward"}]},{id:"audio",title:"Audio / Song",items:[{action:"songNoteUp",label:"Song note up"},{action:"songNoteDown",label:"Song note down"}]},{id:"room-controls",title:"Room Controls",items:[{action:"homeAssistantOn",label:"Next room control on"},{action:"homeAssistantOff",label:"Next room control off (reverse)"}]}]},{type:"gamepad",title:"Gamepad / joystick",items:["Gamepad controls are fully configurable to handle inconsistent browser mappings.","Use Settings → Controller to bind inputs, calibrate deadzones, and view diagnostics.","If inputs behave oddly, the diagnostics panel will show raw axis/button values."]}]},"mobile-portrait":{main:[{type:"list",title:"Chat and nicknames",items:["Set a nickname in the user list panel below.","Tap in the chat box to send messages in the chat."]},{type:"list",title:"Driving the rover",items:[{segments:['Press the "Start Driving" button onscreen to put the rover into driving mode.']},"Look below the rover video. Use the joystick column to move the rover, and hold the aux buttons in the other control column."]},{type:"list",title:"Docking the rover",items:["Line up the rover to the dock, about a foot away, then:",{segments:['Press the "Dock and Charge" button onscreen to start docking.']},"Wait for the rover to confirm it is docked and charging before leaving it unattended."]}]},"mobile-landscape":{main:[{type:"list",title:"Chat and nicknames",items:["Scroll down to see more of the page.","Set a nickname in the user list panel below.","Tap in the chat box to send messages in the chat."]},{type:"list",title:"Driving the rover",items:[{segments:['Press the "Start Driving" button, or the "Drive" button to put the rover into driving mode.']},"Use the joystick column beside the video feed to move the rover, and hold the aux buttons in the other control column."]},{type:"list",title:"Docking the rover",items:["Line up the rover to the dock, about a foot away, then:",{segments:['Press the "Dock and Charge" or the "Dock" button onscreen to start docking.']},"Wait for the rover to confirm it is docked and charging before leaving it unattended."]}]}};function QN(n){return yx[n]||yx.desktop}function Kg({actionId:n,keymap:s}){const i=s?.[n]?.[0]??"";return r.jsx("span",{className:"rounded border border-slate-600 bg-slate-900/40 px-1 text-[0.7rem] text-slate-200",children:An(i)})}function Sx(n,s){return n.map((i,o)=>typeof i=="string"?r.jsx("span",{children:i},`text-${o}`):i?.action?r.jsx(Kg,{actionId:i.action,keymap:s},`pill-${i.action}-${o}`):i?.text?r.jsx("span",{children:i.text},`span-${o}`):null)}function Ro(n,s,i){if(typeof n=="string")return n;if(Array.isArray(n?.segments))return Sx(n.segments,s);if(n&&typeof n=="object"){if(typeof n.text=="string")return n.text;if(Array.isArray(n))return Sx(n,s)}return String(n??"")}function KN({hero:n,keymap:s}){return n?r.jsxs("div",{className:"surface space-y-0.5 px-0.5 py-0.5",children:[r.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-0.5",children:[r.jsxs("div",{children:[r.jsx("p",{className:"text-sm font-semibold text-white",children:n.title}),n.subtitle&&r.jsx("p",{className:"text-xs text-slate-300",children:n.subtitle})]}),n.chips&&r.jsx("div",{className:"flex flex-wrap gap-0.5 text-[0.7rem] text-slate-200",children:n.chips.map(i=>r.jsx("span",{className:"rounded border border-slate-700 px-1 py-[2px]",children:i},i))})]}),n.bullets&&r.jsx("ul",{className:"space-y-0.5 text-[0.85rem] text-slate-200",children:n.bullets.map((i,o)=>{const f=Array.isArray(i?.segments)?`hero-${o}`:`hero-${o}`;return r.jsx("li",{className:"surface-muted px-0.5 py-0.25",children:Ro(i,s)},f)})})]}):null}function ZN({block:n,keymap:s}){return r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-xs font-semibold text-slate-200",children:n.title}),r.jsx("ul",{className:"space-y-0.5 text-[0.8rem] text-slate-300",children:n.items.map((i,o)=>{const f=`item-${o}`;return r.jsx("li",{className:"surface-muted flex flex-wrap items-center gap-0.5 px-0.5 py-0.25",children:Ro(i,s)},f)})})]})}function IN({block:n}){const s=n.tone==="info"?"border-cyan-500/40":"border-slate-700";return r.jsxs("div",{className:`surface space-y-0.5 border ${s} px-0.5 py-0.5`,children:[r.jsx("p",{className:"text-xs font-semibold text-slate-100",children:n.title}),n.body&&r.jsx("ul",{className:"space-y-0.5 text-[0.8rem] text-slate-300",children:n.body.map((i,o)=>r.jsx("li",{className:"surface-muted px-0.5 py-0.25",children:Ro(i,{})},`callout-${o}`))})]})}function JN({group:n,keymap:s}){return r.jsxs("div",{className:"space-y-0.5 surface",children:[r.jsx("p",{className:"px-0.5 py-0.25 text-[0.75rem] font-semibold text-slate-200",children:n.title}),r.jsx("div",{className:"space-y-0.5 px-0.5 pb-0.25",children:n.items.map(i=>r.jsxs("div",{className:"surface-muted flex items-center justify-between gap-0.5 px-0.5 py-0.25 text-[0.8rem]",children:[r.jsx("span",{className:"text-slate-200",children:i.label}),r.jsx(Kg,{actionId:i.action,keymap:s})]},i.action))})]})}function PN({block:n,keymap:s}){return n?r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-200",children:[r.jsx("span",{className:"font-semibold",children:n.title}),n.footnote&&r.jsx("span",{className:"text-[0.7rem] text-slate-400",children:n.footnote})]}),r.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-0.5",children:n.groups?.map(i=>r.jsx(JN,{group:i,keymap:s},i.id))})]}):null}function WN({block:n}){return n?r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-xs font-semibold text-slate-200",children:n.title}),r.jsx("ul",{className:"space-y-0.5 text-[0.8rem] text-slate-300",children:n.items?.map((s,i)=>r.jsx("li",{className:"surface-muted px-0.5 py-0.25",children:Ro(s,{})},`gamepad-${i}`))})]}):null}function jx({block:n,keymap:s}){if(!n)return null;switch(n.type){case"list":return r.jsx(ZN,{block:n,keymap:s});case"callout":return r.jsx(IN,{block:n});case"keyboard":return r.jsx(PN,{block:n,keymap:s});case"gamepad":return r.jsx(WN,{block:n});default:return null}}function Zg({layout:n,keymap:s}){const i=m.useMemo(()=>QN(n),[n]),o=s||{},f=i.main||[],d=i.aside||[];return r.jsxs("div",{className:"space-y-0.5",children:[r.jsx(KN,{hero:i.hero,keymap:o}),r.jsxs("div",{className:"grid gap-0.5",style:{gridTemplateColumns:"repeat(auto-fit, minmax(360px, 1fr))"},children:[r.jsx("div",{className:"space-y-0.5",children:f.map((h,p)=>r.jsx(jx,{block:h,keymap:o},h.title||p))}),r.jsx("div",{className:"space-y-0.5",children:d.map((h,p)=>r.jsx(jx,{block:h,keymap:o},h.title||p))})]})]})}function Ig({layout:n,onOpenOverlay:s}){const{state:i}=_t();return r.jsxs("section",{className:"panel-section space-y-0.5 text-sm",children:[r.jsxs("div",{className:"flex items-center justify-between text-xs text-slate-400",children:[r.jsx("span",{children:"Help"}),r.jsx("button",{type:"button",onClick:s,className:"button-dark px-1 py-0.25 text-[0.75rem]",children:"Open full help"})]}),r.jsx(Zg,{layout:n,keymap:i?.keymap||{}})]})}const ew=["kal","rms","slt","ksp","bdl"],tw=Array.from({length:10},(n,s)=>s*10);function qo({hideInput:n=!1,hideSpectatorNotice:s=!1,fillHeight:i=!1,allowSpectatorInput:o=!1}){const f=ft(R=>R.session),{messages:d,typing:h,sendMessage:p,registerInputRef:x,onInputFocus:g,onInputBlur:v,blurChat:y,setTypingActive:S}=cd(),{value:E,save:C}=He("tts",{engine:"flite",voice:"rms",pitch:50}),[k,w]=m.useState(""),[j,N]=m.useState(!1),[q,M]=m.useState(!1),[O,K]=m.useState(()=>E?.engine||"flite"),[_,H]=m.useState(()=>E?.voice||"rms"),[z,V]=m.useState(()=>Number.isFinite(E?.pitch)?E.pitch:50),U=f?.role!=="spectator"||o,W=m.useRef(null),ce=f?.assignment?.roverId||null,$=!!m.useMemo(()=>f?.roster?.find(R=>String(R.id)===String(ce))||null,[ce,f?.roster])?.audio?.ttsEnabled,T=m.useMemo(()=>d.slice(-200),[d]),Y=m.useMemo(()=>h||[],[h]);m.useEffect(()=>{W.current&&(W.current.scrollTop=W.current.scrollHeight)},[T,Y]),m.useEffect(()=>{const R=E?.engine||"flite",G=E?.voice||"rms",te=Number.isFinite(E?.pitch)?E.pitch:50;O!==R&&K(R),_!==G&&H(G),z!==te&&V(te)},[O,z,E?.engine,E?.pitch,E?.voice,_]),m.useEffect(()=>{M(!!$)},[$]);const I=m.useMemo(()=>!$||!q?null:O==="espeak"?{speak:!0,engine:O,pitch:z}:{speak:!0,engine:O,voice:_},[O,z,q,$,_]);async function ie(R){if(R.preventDefault(),!U||n)return;const te=k.replace(/\\n/g,` +`).trim();if(te){N(!0);try{await p(te,I),w(""),y(),S(!1)}catch(ae){alert(ae.message)}finally{N(!1)}}}const de=i?"flex-1 min-h-0 overflow-y-auto":"h-48 overflow-y-auto";return r.jsxs("section",{className:`panel-section space-y-0.5 text-base ${i?"flex h-full flex-col overflow-hidden":""}`,children:[r.jsxs("div",{className:`surface overflow-y-auto space-y-0.5 px-0 ${de}`,ref:W,children:[T.length===0&&Y.length===0?r.jsx("p",{className:"text-sm text-slate-500",children:"No messages yet."}):T.map(R=>r.jsx(id,{message:R},R.id)),Y.map(R=>r.jsx(gg,{message:R},`typing-${R.typingId||R.id}`))]}),!n&&r.jsxs("form",{className:"flex flex-wrap items-stretch gap-0.5",onSubmit:ie,children:[r.jsx("input",{className:"field-input flex-1 min-w-[10rem]",value:k,onChange:R=>{const G=R.target.value;w(G),S(!!G.trim())},onFocus:R=>{g(R),S(!!k.trim())},onBlur:R=>{v(R),S(!1)},onKeyDown:R=>{R.key==="Enter"&&!k.trim()&&(R.preventDefault(),y(),S(!1))},ref:R=>x(R,{target:"panel"}),placeholder:U?"Type a message…":s?"":"Spectators cannot chat",disabled:!U}),$&&r.jsxs("div",{className:"flex flex-wrap items-center gap-0.5 basis-full sm:basis-auto",children:[r.jsxs("label",{className:"flex items-center gap-0.5 text-xs text-slate-300",children:[r.jsx("input",{type:"checkbox",checked:q,onChange:R=>M(R.target.checked),className:"accent-cyan-500"}),r.jsx("span",{children:"Speak"})]}),r.jsxs("select",{value:O,onChange:R=>{const G=R.target.value;K(G),C(te=>({...te||{},engine:G}))},className:"field-input text-xs",children:[r.jsx("option",{value:"flite",children:"flite"}),r.jsx("option",{value:"espeak",children:"espeak"})]}),O==="flite"?r.jsx("select",{value:_,onChange:R=>{const G=R.target.value;H(G),C(te=>({...te||{},voice:G}))},className:"field-input text-xs",children:ew.map(R=>r.jsx("option",{value:R,children:R},R))}):r.jsx("select",{value:z,onChange:R=>{const G=Number(R.target.value);V(G),C(te=>({...te||{},pitch:G}))},className:"field-input text-xs",children:tw.map(R=>r.jsxs("option",{value:R,children:["pitch ",R]},R))})]}),r.jsx("button",{type:"submit",disabled:!U||j,className:"button-dark h-full disabled:opacity-50 self-stretch",children:j?"...":"Send"})]})]})}function To({compact:n=!1}){const{session:s,setNickname:i}=nn(),{value:o,save:f}=He("profile",{nickname:""}),[d,h]=m.useState(o.nickname||""),[p,x]=m.useState(!1),g=s?.role!=="spectator";m.useEffect(()=>{h(o.nickname||"")},[o.nickname]);async function v(y){if(y.preventDefault(),!g)return;const S=(d||"").trim().slice(0,32);if(S){x(!0);try{await i(S),f({nickname:S})}catch(E){alert(E.message)}finally{x(!1)}}}return r.jsxs("form",{className:"grid w-full min-w-0 grid-cols-[minmax(0,1fr)_auto] items-stretch gap-0.5",onSubmit:v,children:[r.jsx("input",{className:"field-input flex-1 min-w-0",value:d,onChange:y=>h(y.target.value),maxLength:32,placeholder:"Enter a nickname",disabled:!g}),r.jsx("button",{type:"submit",disabled:!g||p,className:"button-dark h-full shrink-0 whitespace-nowrap px-0.5 py-0 disabled:opacity-50",children:p?"Saving…":n?"Set":"Save"})]})}function nw(n){const s=Array.isArray(n?.socials)?n.socials:null;if(s&&s.length)return s;const i=[];return n?.discord?.invite&&i.push({id:"discord",label:"Discord",url:n.discord.invite}),n?.kofi?.link&&i.push({id:"kofi",label:"Ko-fi",url:n.kofi.link}),i}function aw(n){if(!n||typeof n!="object")return null;const s=n.id||n.service||n.key||n.name||null,i=n.label||n.title||n.name||s||"Link",o=n.url||n.link||n.href||null;return o?{id:s,label:i,url:o}:null}function Jg({className:n=""}){const{session:s}=nn(),i=nw(s).map(aw).filter(Boolean).slice(0,4);return i.length?r.jsx("div",{className:`grid grid-cols-2 grid-rows-2 gap-0.5 ${n}`,children:i.map(o=>r.jsx(xd,{...o},`${o.id||o.label}-${o.url}`))}):null}function sw({compact:n=!1}){return r.jsx("section",{className:"panel-section flex h-full min-h-0 flex-col gap-0.5 text-base",children:r.jsx("div",{className:"surface flex w-full items-center px-0 py-0",children:r.jsx(To,{compact:n})})})}function lw(){return r.jsx("section",{className:"panel-section flex h-full min-h-0 flex-col gap-0.5 text-base",children:r.jsx(Jg,{className:"flex-1 min-h-0"})})}function yf(...n){return n.filter(Boolean).join(" ")}function iw(n){const s=n?.batteryState?.percentDisplay;return s==null?"--":`${s}%`}function rw(n){return n?.batteryState?n.batteryState.urgentActive?"text-red-400":n.batteryState.warnActive?"text-amber-300":"text-emerald-300":"text-slate-400"}function ow(n){switch(n){case"admin":case"lockdown":case"lockdown-admin":return"text-amber-300";case"spectator":return"text-slate-400";default:return"text-sky-300"}}function cw(n,s){if(!n)return"";const i=n.nickname||n.socketId?.slice(0,6)||"unknown";return n.socketId&&n.socketId===s?`${i} (you)`:i}function Do({title:n="Rovers"}){const s=ft(j=>j.session),{requestControl:i}=wn(),[o,f]=m.useState({}),[d,h]=m.useState(()=>Date.now()),p=m.useMemo(()=>s?.role&&s.role!=="spectator",[s?.role]),x=m.useMemo(()=>s?.role==="admin"||s?.role==="lockdown"||s?.role==="lockdown-admin",[s?.role]),g=s?.roster??[],v=s?.turnQueues??{},y=s?.users??[],S=s?.socketId||null,E=m.useMemo(()=>Object.values(v||{}).some(j=>j?.deadline||j?.idleDeadline),[v]);m.useEffect(()=>{if(!E)return;const j=setInterval(()=>{h(Date.now())},1e3);return()=>clearInterval(j)},[E]);const C=m.useMemo(()=>{const j=new Set(g.map(q=>String(q.id))),N=Object.keys(v||{}).filter(q=>!j.has(String(q))).map(q=>({id:q,name:q,locked:!1,batteryState:null}));return[...g,...N]},[g,v]);async function k(j){if(j){f(N=>({...N,[j]:!0}));try{await i(j)}catch(N){alert(N.message)}finally{f(N=>({...N,[j]:!1}))}}}const w=j=>y.find(N=>N.socketId===j)||{socketId:j,nickname:null,role:null};return r.jsxs("div",{className:"space-y-0.5 text-sm",children:[n&&r.jsx("p",{className:"text-sm text-slate-400",children:n}),C.length===0?r.jsx("p",{className:"text-sm text-slate-500",children:"No rovers registered."}):r.jsx("ul",{className:"space-y-0.5 text-sm",children:C.map(j=>{const N=String(j.id),q=v?.[N]||null,M=q?.queue||[],O=q?.idleDeadline||q?.deadline||null,K=O&&O>d?Math.ceil((O-d)/1e3):O?0:null,_=q?.current||null,H=_?M.findIndex(ie=>ie===_):-1,z=M.length>1?H>=0?M[(H+1)%M.length]:M[0]:null,V=!!(S&&_&&_===S),U=!!(S&&z&&z===S),W=K!=null&&(V||U),ce=!!j.locked,oe=ce&&!x,$=!!(j?.private?.enabled&&j?.private?.open),T=j.lockReason?`locked: ${j.lockReason}`:"locked",Y=ce?T:o[N]?"...":"request",I=p&&!oe&&!o[N];return r.jsxs("li",{className:yf("surface flex flex-wrap items-start justify-between gap-0.5",I&&"cursor-pointer",ce?"bg-red-900/40":$?"bg-amber-700/35 border border-amber-200/30":null),onClick:()=>{I&&k(j.id)},children:[r.jsxs("div",{className:"flex min-w-0 flex-1 flex-col gap-0.5",children:[r.jsxs("div",{className:"flex items-center justify-between gap-0.5",children:[r.jsxs("div",{className:"flex items-center gap-0.5",children:[r.jsx("p",{className:"text-slate-200",children:r.jsx("span",{className:"rounded px-1 py-[1px] border border-transparent",style:ca(j.color,.16),children:j.name})}),W?r.jsx("span",{className:"rounded bg-slate-800 px-1 text-[0.7rem] text-slate-200",children:V?`${K}s left`:`Your turn in ${K}s`}):null]}),r.jsx("span",{className:yf("text-[0.75rem] font-semibold",rw(j)),children:iw(j)})]}),M.length===0?r.jsx("p",{className:"text-[0.7rem] text-slate-500",children:"No queue."}):r.jsx("div",{className:"flex flex-wrap items-center gap-0.5",children:M.map((ie,de)=>{const R=w(ie),G=ie===_,te=!!(z&&ie===z&&!G),ae=G?"bg-sky-600 text-white ring-2 ring-amber-300":te?"bg-emerald-700/60 text-emerald-100 ring-1 ring-emerald-300/70":"bg-slate-800 text-slate-200";return r.jsxs("span",{className:`flex items-center gap-0.5 rounded px-1 text-[0.7rem] ${ae}`,children:[r.jsx("span",{className:`${ow(R.role)} font-semibold`,children:cw(R,S)}),G&&r.jsx("span",{className:"text-[0.65rem] text-slate-200",children:"now"}),te&&r.jsx("span",{className:"text-[0.65rem] text-emerald-100",children:"next"})]},`${N}-${ie}-${de}`)})})]}),p?r.jsx("button",{type:"button",onClick:ie=>{ie.stopPropagation(),k(j.id)},disabled:o[N]||oe,className:yf("button-dark disabled:opacity-40",ce&&"bg-red-600/70 text-white hover:bg-red-600"),children:Y}):null]},j.id)})})]})}function uw(n){switch(n){case"admin":case"lockdown":case"lockdown-admin":return"text-amber-300";case"spectator":return"text-slate-400";default:return"text-sky-300"}}function fw(n,s){if(!n)return"";const i=n.nickname||n.socketId?.slice(0,6)||"unknown";return n.socketId&&n.socketId===s?`${i} (you)`:i}function So({hideNicknameForm:n=!1,hideHeader:s=!1,className:i="",fillHeight:o=!1,compact:f=!1}){const{session:d}=nn(),h=d?.role!=="spectator",p=d?.users??[],x=d?.socketId||null,g=m.useMemo(()=>[...p].sort((y,S)=>y.socketId===x?-1:S.socketId===x?1:(y.nickname||"").localeCompare(S.nickname||"")),[x,p]),v=o?"flex-1 min-h-0 overflow-y-auto":f?"h-28 overflow-y-auto":"h-48 overflow-y-auto";return r.jsxs("section",{className:`panel-section space-y-0.5 text-base ${o?"flex h-full min-h-0 flex-col overflow-hidden":""} ${i}`,children:[!n&&r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("div",{className:"grid gap-0.5 md:grid-cols-[minmax(0,1.4fr)_minmax(0,1fr)]",children:[r.jsx("div",{className:"min-w-0",children:r.jsx("div",{className:"surface flex w-full items-center px-0 py-0",children:r.jsx(To,{compact:f})})}),r.jsx(Jg,{})]}),!h&&r.jsx("p",{className:"text-xs text-slate-500",children:"Spectators cannot set nicknames."})]}),r.jsxs("div",{className:`space-y-0.5 ${o?"flex flex-1 min-h-0 flex-col":""}`,children:[!s&&r.jsxs("div",{className:`flex items-center justify-between text-sm text-slate-400 ${f?"text-xs":""}`,children:[r.jsx("span",{children:"Users"}),r.jsx("span",{className:"text-xs text-slate-500",children:g.length})]}),r.jsx("div",{className:`surface flex flex-wrap content-start items-start gap-0.5 px-0 pb-0 ${v} ${f?"text-[0.8rem]":""}`,children:g.length===0?r.jsx("p",{className:"text-sm text-slate-500",children:"Waiting for users…"}):g.map(y=>r.jsx("span",{className:`rounded bg-slate-800/80 px-1 py-0.25 text-[0.7rem] ${uw(y.role)}`,children:fw(y,x)},y.socketId))})]})]})}const dw=/^cu_[a-f0-9]{32}$/,Ei="field-input w-full max-w-sm text-left focus:ring-emerald-500",_o="mx-auto w-full max-w-xl flex justify-center",vi="mx-auto flex w-full max-w-md flex-col items-center space-y-0.5 text-center";function mw(n){const s=String(n||"").trim();return s?s.length<=10?`${s.slice(0,2)}***${s.slice(-2)}`:`${s.slice(0,6)}...${s.slice(-6)}`:""}const Ax=8*1024*1024,is=16e3,hw={iceServers:[{urls:"stun:stun.l.google.com:19302"}],bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"};function Nx(n){let s="";for(let o=0;o{if(!n||n.iceGatheringState==="complete"){i();return}const o=setTimeout(()=>{n.removeEventListener("icegatheringstatechange",f),i()},s);function f(){n.iceGatheringState==="complete"&&(clearTimeout(o),n.removeEventListener("icegatheringstatechange",f),i())}n.addEventListener("icegatheringstatechange",f)})}function wx(n){if(!n)return!1;const s=n.connectionState,i=n.iceConnectionState;return s==="connected"||i==="connected"||i==="completed"}function vw(n,s=1e4){return new Promise((i,o)=>{if(!n){o(new Error("Peer connection missing"));return}if(wx(n)){i();return}const f=setTimeout(()=>{h(),o(new Error("Peer connection timeout"))},s),d=()=>{wx(n)?(h(),i()):(n.connectionState==="failed"||n.connectionState==="closed"||n.iceConnectionState==="failed")&&(h(),o(new Error(`Peer connection ${n.connectionState||n.iceConnectionState}`)))};function h(){clearTimeout(f),n.removeEventListener("connectionstatechange",d),n.removeEventListener("iceconnectionstatechange",d)}n.addEventListener("connectionstatechange",d),n.addEventListener("iceconnectionstatechange",d)})}async function bw(n){if(!n?.getParameters||!n?.setParameters)return;const s=n.getParameters()||{},i=s.encodings&&s.encodings[0]||{};s.encodings=[{...i,maxBitrate:64e3,dtx:"disabled"}];try{await n.setParameters(s)}catch{}}function yw(n,s=6e3){return new Promise((i,o)=>{if(!n){o(new Error("Peer connection missing"));return}const f=Date.now();let d=-1;const h=setInterval(async()=>{if(Date.now()-f>s){clearInterval(h),o(new Error("WHIP connected but no outbound audio flow"));return}try{const p=n.getSenders().filter(x=>x.track?.kind==="audio");for(const x of p){const g=await x.getStats();for(const v of g.values()){if(v.type!=="outbound-rtp"||v.kind!=="audio")continue;const y=Number(v.bytesSent||0),S=Number(v.packetsSent||0);if(d<0)d=y;else if(y>d+200||S>5){clearInterval(h),i();return}}}}catch{}},250)})}function xn({label:n,active:s,detail:i=""}){return r.jsxs("div",{className:`rounded-md px-0.5 py-0.5 text-xs text-slate-100 ${s?"bg-emerald-500":"bg-slate-700"}`,children:[r.jsx("div",{className:"text-center font-medium",children:n}),r.jsx("div",{className:"text-center text-[0.72rem] opacity-90",children:i||(s?"active":"idle")})]})}function Cx({label:n}){return n?r.jsx("span",{className:"rounded border border-white/40 px-1 text-[0.7rem] text-white",children:n}):null}function Sw(n){const s=n.reduce((f,d)=>f+d.length,0),i=new Float32Array(s);let o=0;for(const f of n)i.set(f,o),o+=f.length;return i}function jw(n){const s=new Int16Array(n.length);for(let i=0;i{for(let v=0;vv&&s?.[v]||null,[s,v]),te=!!(G&&G.state!=="offline"&&!G.error),ae=G?.source==="upload"&&G?.state==="playing",pe=G?.source==="mic-whip"&&(G?.state==="starting"||G?.state==="playing"),re=!!(!j&&z.current&&(k||R)),ue=!j&&(N==="live"||N==="starting"),ve=j&&M==="recording",be=j&&M==="sending",xe=An(p?.keymap?.micPtt?.[0])||"M",Be=m.useCallback(P=>{const fe=P==="clip"?"clip":"live";g(Ne=>({...Ne||{},pttMode:fe}))},[g]),ze=async()=>{if(!v){_("Take control of your rover first.");return}if(!y){_("Select an audio file first.");return}if(y.size>Ax){_(`File too large (max ${Ax} bytes).`);return}C(!0),_("");try{const P=await y.arrayBuffer(),fe=Nx(new Uint8Array(P));await i?.({roverId:v,name:y.name,mime:y.type||"",dataBase64:fe}),_("Upload playback started.")}catch(P){_(P?.message||"Failed to play upload.")}finally{C(!1)}},Ae=async()=>{if(!v){_("Take control of your rover first.");return}C(!0),_("");try{await o?.(v),_("Upload playback stopped.")}catch(P){_(P?.message||"Failed to stop upload.")}finally{C(!1)}},tt=m.useCallback(async P=>{const fe=String(P||W.current||"").trim();if(U.current=!1,q("idle"),V.current){try{V.current.getSenders().forEach(Ne=>Ne.track?.stop())}catch{}try{V.current.close()}catch{}}if(V.current=null,H.current)try{H.current.getTracks().forEach(Ne=>Ne.stop())}catch{}if(H.current=null,z.current=null,fe)try{await h?.(fe)}catch{}W.current=""},[h]),Je=m.useCallback(async P=>{const fe=await f?.(P),Ne=String(fe?.whipUrl||"").trim(),pt=String(fe?.token||"").trim();if(!Ne||!pt)throw new Error("WHIP endpoint unavailable");const Ve=await navigator.mediaDevices.getUserMedia({audio:{channelCount:1,sampleRate:is,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1}});H.current=Ve;const st=Ve.getAudioTracks()?.[0];if(z.current=st||null,st&&(st.enabled=!!(k||R)),st?.applyConstraints)try{await st.applyConstraints({channelCount:1,sampleRate:is,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1})}catch{}const lt=new RTCPeerConnection(hw);V.current=lt,lt.onconnectionstatechange=()=>{if(!U.current)return;const Yt=lt.connectionState;if(Yt==="connected"){q("live");return}(Yt==="failed"||Yt==="disconnected"||Yt==="closed")&&(q("error"),_(`WHIP transport ${Yt}.`))},Ve.getAudioTracks().forEach(Yt=>{const La=lt.addTrack(Yt,Ve);bw(La)});const Ot=await lt.createOffer({offerToReceiveAudio:!1,offerToReceiveVideo:!1});await lt.setLocalDescription(Ot),await gw(lt,1800);const it=await fetch(Ne,{method:"POST",headers:{"Content-Type":"application/sdp",...xw(pt)},body:lt.localDescription?.sdp||Ot.sdp});if(!it.ok)throw new Error(`WHIP request failed: ${it.status}`);const ds=await it.text();await lt.setRemoteDescription({type:"answer",sdp:ds}),await vw(lt,1e4),await yw(lt,6e3),await d?.(P)},[k,R,d,f]),vt=m.useCallback(async()=>{if(ie.current=!1,T.current){try{T.current.disconnect()}catch{}T.current.onaudioprocess=null}if($.current)try{$.current.disconnect()}catch{}if(Y.current)try{Y.current.disconnect()}catch{}if(ce.current)try{ce.current.getTracks().forEach(P=>P.stop())}catch{}if(oe.current)try{await oe.current.close()}catch{}I.current=[],T.current=null,$.current=null,Y.current=null,ce.current=null,oe.current=null,de.current=is},[]),le=m.useCallback(async()=>{if(ce.current&&oe.current&&T.current)return;O(st=>st==="recording"?st:"arming");const P=await navigator.mediaDevices.getUserMedia({audio:{channelCount:1,sampleRate:is,echoCancellation:!1,noiseSuppression:!1,autoGainControl:!1}}),fe=new AudioContext({latencyHint:"interactive"}),Ne=fe.createMediaStreamSource(P),pt=fe.createScriptProcessor(1024,1,1),Ve=fe.createGain();Ve.gain.value=0,pt.onaudioprocess=st=>{if(!ie.current)return;const lt=st.inputBuffer.getChannelData(0);I.current.push(new Float32Array(lt))},Ne.connect(pt),pt.connect(Ve),Ve.connect(fe.destination),ce.current=P,oe.current=fe,$.current=Ne,T.current=pt,Y.current=Ve,de.current=fe.sampleRate||is},[]),me=m.useCallback(async({send:P})=>{const fe=ie.current;if(ie.current=!1,!fe){P||O("idle");return}const Ne=I.current;if(I.current=[],!P){O("idle");return}if(!v){O("idle");return}if(!Ne.length){O("idle");return}O("sending");try{const pt=Sw(Ne),Ve=Aw(pt,de.current||is),st=Nx(Ve);await i?.({roverId:v,name:`ptt-${Date.now()}.wav`,mime:"audio/wav",dataBase64:st}),O("idle")}catch(pt){O("error"),_(pt?.message||"Failed to send PTT clip.")}},[i,v]),se=m.useCallback(async()=>{if(!v){_("Take control of your rover first.");return}await le(),I.current=[],ie.current=!0,O("recording")},[le,v]);return m.useEffect(()=>{let P=!1;async function fe(){if(j){await tt(W.current||v);return}if(!v){await tt(W.current);return}if(!(U.current&&W.current===v)&&!(!k&&!R))try{q("starting"),_(""),U.current=!0,W.current=v,await Je(v),P||q("live")}catch(Ne){P||(q("error"),_(Ne?.message||"Failed to start mic forwarding.")),await tt(v)}}return fe(),()=>{P=!0}},[j,k,R,v,Je,tt]),m.useEffect(()=>{const P=z.current;P&&(P.enabled=!!(!j&&(k||R)))},[j,k,R]),m.useEffect(()=>{let P=!1;async function fe(){if(!j||!v){ie.current&&await me({send:!1}),O("idle");return}try{await le(),!P&&!ie.current&&O("idle")}catch(Ne){P||(O("error"),_(Ne?.message||"Microphone access failed for clip mode."))}}return fe(),()=>{P=!0}},[j,le,me,v]),m.useEffect(()=>{let P=!1;async function fe(){if(j){if(!v){ie.current&&await me({send:!1});return}if(R){if(!ie.current)try{_(""),await se()}catch(Ne){P||(O("error"),_(Ne?.message||"Failed to start clip recording."))}}else ie.current&&await me({send:!0})}}return fe(),()=>{P=!0}},[j,me,R,v,se]),m.useEffect(()=>()=>{tt(W.current||v),vt()},[v,tt,vt]),r.jsxs("div",{className:"grid gap-0.5",children:[r.jsx("section",{className:"surface",children:r.jsxs("div",{className:"flex items-center justify-center gap-0.5 py-0.25 text-xs text-slate-300",children:[r.jsx("span",{children:"Push-to-Talk Key"}),r.jsx(Cx,{label:xe})]})}),r.jsxs("div",{className:"grid gap-0.5 grid-cols-1 lg:grid-cols-2",children:[r.jsx("section",{className:"surface h-full",children:r.jsxs("div",{className:"grid h-full gap-0.5 grid-rows-[auto_auto_1fr]",children:[r.jsx("p",{className:"text-sm text-slate-200 text-center",children:"PTT Mode"}),r.jsx("p",{className:"text-xs text-slate-400 text-center",children:"Choose how holding your PTT key behaves: live mic stream, or record-and-send clip. If the live stream doesn't work, switch to clip mode."}),r.jsxs("div",{className:"grid grid-cols-2 gap-0.5",children:[r.jsx("button",{type:"button",className:`button-dark w-full text-sm ${j?"":"bg-emerald-500 text-white hover:bg-emerald-500"}`,onClick:()=>Be("live"),children:"Live Mic (WHIP)"}),r.jsx("button",{type:"button",className:`button-dark w-full text-sm ${j?"bg-emerald-500 text-white hover:bg-emerald-500":""}`,onClick:()=>Be("clip"),children:"Record Clip"})]})]})}),r.jsx("section",{className:"surface h-full",children:r.jsxs("div",{className:"grid h-full gap-0.5 grid-rows-[auto_1fr]",children:[r.jsx("p",{className:"text-sm text-slate-200 text-center",children:"PTT Clip Status"}),r.jsxs("div",{className:"grid gap-0.5 content-start",children:[r.jsx(xn,{label:"Mode",active:j,detail:j?"record clip":"live mic"}),r.jsx(xn,{label:"PTT hold",active:R,detail:R?"held":"released"}),r.jsx(xn,{label:"Recording",active:ve,detail:ve?"capturing":"idle"}),r.jsx(xn,{label:"Playback",active:j&&ae,detail:j&&ae?"playing":"idle"})]})]})})]}),r.jsxs("div",{className:"grid gap-0.5 grid-cols-1 lg:grid-cols-2",children:[r.jsx("section",{className:"surface h-full",children:r.jsxs("div",{className:"grid h-full gap-0.5 grid-rows-[auto_auto_1fr_auto]",children:[r.jsx("p",{className:"text-sm text-slate-200 text-center",children:"Audio Upload"}),r.jsxs("label",{className:"mx-auto grid w-full max-w-sm gap-0.5 text-xs text-slate-300 text-center",children:[r.jsx("span",{children:"Audio file (mp3 / wav / ogg)"}),r.jsx("input",{className:`${Ei} text-center`,type:"file",accept:".mp3,.wav,.ogg,audio/mpeg,audio/wav,audio/ogg",disabled:E||!v,onChange:P=>S(P.target.files?.[0]||null)})]}),r.jsx("div",{className:"mx-auto w-full max-w-sm text-center",children:y?r.jsxs("div",{className:"surface-muted text-xs text-slate-300",children:[y.name," (",y.size," bytes)"]}):r.jsx("div",{className:"surface-muted text-xs text-slate-500",children:"No file selected"})}),r.jsxs("div",{className:"flex justify-center gap-0.5",children:[r.jsx("button",{type:"button",className:"button-dark text-sm",disabled:E||!v,onClick:ze,children:E?"Working...":"Play Upload"}),r.jsx("button",{type:"button",className:"button-dark text-sm",disabled:E||!v,onClick:Ae,children:"Stop"})]})]})}),r.jsx("section",{className:"surface h-full",children:r.jsxs("div",{className:"grid h-full gap-0.5 grid-rows-[auto_auto_1fr]",children:[r.jsx("p",{className:"text-sm text-slate-200 text-center",children:"Live Microphone"}),r.jsxs("label",{className:"surface-muted mx-auto flex w-full max-w-sm items-center justify-center gap-0.5 px-0.5 py-0.5 text-xs text-slate-300",children:[r.jsx("input",{type:"checkbox",checked:k,disabled:!v||j,onChange:P=>g(fe=>({...fe||{},openMicEnabled:!!P.target.checked}))}),r.jsx("span",{children:j?"Open mic (live mode only)":"Open mic"})]}),r.jsxs("div",{className:"grid gap-0.5 content-start",children:[r.jsx(xn,{label:"WHIP link",active:ue,detail:N}),r.jsx(xn,{label:"Mic hot",active:re,detail:re?"transmitting":"muted"}),r.jsxs("div",{className:"surface-muted text-center text-xs text-slate-400",children:["Hold ",r.jsx(Cx,{label:xe})," to talk"]})]})]})})]}),r.jsx("section",{className:"surface",children:r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-sm text-slate-200 text-center",children:"Audio Status"}),r.jsxs("div",{className:"grid gap-0.5 grid-cols-1 sm:grid-cols-2 lg:grid-cols-6",children:[r.jsx(xn,{label:"Forward pipe",active:te,detail:te?"connected":"offline"}),r.jsx(xn,{label:"Upload playback",active:ae,detail:ae?"playing":"idle"}),r.jsx(xn,{label:"Mic relay",active:pe,detail:pe?"active":"idle"}),r.jsx(xn,{label:"WHIP transport",active:ue,detail:N}),r.jsx(xn,{label:"Clip recording",active:ve,detail:ve?"recording":"idle"}),r.jsx(xn,{label:"Clip sending",active:be,detail:be?"sending":"idle"})]}),K?r.jsx("div",{className:"text-xs text-slate-400 text-center",children:K}):null]})})]})}function ww({pendingRequestId:n,currentStoredKey:s,nickname:i,requestVerification:o,applyIdentityKey:f,onMessage:d,fullWidth:h=!1}){const[p,x]=m.useState(0),[g,v]=m.useState(""),[y,S]=m.useState(!1),[E,C]=m.useState(!1),k=()=>{x(1),v(s),S(!1),d?.("")},w=()=>{x(0),S(!1)},j=async q=>{if(q.preventDefault(),!y){d?.("Please confirm your nickname agreement before sending.");return}if(p<3){d?.("Complete all request steps before sending.");return}C(!0),d?.("");try{const M=await f(g);await o?.(),v(M),x(0),S(!1),d?.("Verification request sent to lockdown admins.")}catch(M){d?.(M.message||"Failed to submit request.")}finally{C(!1)}},N=h?"w-full":_o;return n?r.jsx("section",{className:`surface text-sm text-slate-300 ${N}`,children:r.jsxs("div",{className:vi,children:["Verification request pending: ",n]})}):p===0?r.jsx("section",{className:`surface ${N}`,children:r.jsxs("div",{className:vi,children:[r.jsx("p",{className:"text-sm text-slate-300",children:"Verification"}),r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:k,disabled:E,children:"Request Verification"})]})}):r.jsx("form",{className:`surface ${N}`,onSubmit:j,children:r.jsxs("div",{className:vi,children:[r.jsx("p",{className:"text-sm text-slate-300",children:"Request verification"}),r.jsxs("p",{className:"text-xs text-slate-500",children:["Step ",p," of 3"]}),p===1?r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-xs text-slate-400",children:"Confirm your nickname, which is used as part of the verification process. You can edit it here before requesting."}),r.jsx("div",{className:"mx-auto w-full max-w-sm",children:r.jsx(To,{compact:!0})}),r.jsxs("div",{className:"surface-muted mx-auto w-full max-w-sm text-xs text-slate-300 text-center",children:["Current nickname: ",r.jsx("span",{className:"font-semibold",children:i||"(not set)"})]}),r.jsxs("label",{className:"flex items-center justify-center gap-0.5 text-xs text-slate-300 text-center",children:[r.jsx("input",{type:"checkbox",className:"accent-emerald-500",checked:y,onChange:q=>S(q.target.checked)}),r.jsx("span",{children:"I understand this nickname is tied to my verification."})]}),r.jsxs("div",{className:"flex justify-center gap-0.5",children:[r.jsx("button",{type:"button",className:"button-dark text-sm",disabled:!i||!y,onClick:()=>x(2),children:"Continue"}),r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:w,children:"Cancel"})]})]}):null,p===2?r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-xs text-slate-400",children:"Save your identity key in a safe place. You can use it to restore your identity in another browser."}),r.jsx("input",{className:Ei,type:"password",name:"identity_key_request",autoComplete:"current-password",maxLength:35,value:g,onChange:q=>v(q.target.value.toLowerCase()),placeholder:"Identity key for this request"}),r.jsxs("div",{className:"flex justify-center gap-0.5",children:[r.jsx("button",{type:"button",className:"button-dark text-sm",disabled:!g,onClick:()=>navigator.clipboard?.writeText(g),children:"Copy Key"}),r.jsx("button",{type:"button",className:"button-dark text-sm",disabled:!g,onClick:()=>x(3),children:"Continue"}),r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:()=>x(1),children:"Back"})]})]}):null,p===3?r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-xs text-slate-400",children:"Final step: confirm and send your verification request."}),r.jsx("input",{className:Ei,type:"password",name:"identity_key_request_final",autoComplete:"current-password",maxLength:35,value:g,onChange:q=>v(q.target.value.toLowerCase()),placeholder:"Identity key for this request"}),r.jsxs("div",{className:"flex justify-center gap-0.5",children:[r.jsx("button",{type:"submit",className:"button-dark text-sm",disabled:E||!g,children:"Confirm Request"}),r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:()=>x(2),children:"Back"})]})]}):null]})})}function Cw({currentStoredKey:n,applyIdentityKey:s,onMessage:i,fullWidth:o=!1}){const[f,d]=m.useState(0),[h,p]=m.useState(""),[x,g]=m.useState(!1),v=()=>{d(1),p(""),i?.("")},y=()=>{d(0),p("")},S=async C=>{if(C.preventDefault(),!(f<2)){g(!0),i?.("");try{await s(h),d(0),p(""),i?.("Identity key restored.")}catch(k){i?.(k.message||"Failed to restore key.")}finally{g(!1)}}},E=o?"w-full":_o;return r.jsx("section",{className:`surface ${E}`,children:r.jsxs("div",{className:vi,children:[r.jsx("p",{className:"text-sm text-slate-300",children:"Identity key"}),r.jsxs("p",{className:"text-xs text-slate-500",children:["Current: ",mw(n)||"not set yet"]}),r.jsx("input",{className:Ei,type:"password",name:"identity_key_current",autoComplete:"current-password",maxLength:35,value:n,readOnly:!0,placeholder:"Identity key"}),f===0?r.jsxs("div",{className:"flex justify-center gap-0.5",children:[r.jsx("button",{type:"button",className:"button-dark text-sm",disabled:!n,onClick:()=>navigator.clipboard?.writeText(n),children:"Copy Key"}),r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:v,disabled:x,children:"Restore Key"})]}):null,f===1?r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-xs text-slate-400",children:"Restoring your key should only be done when needed. Use this to move your identity to another browser."}),r.jsxs("div",{className:"flex justify-center gap-0.5",children:[r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:()=>d(2),children:"Continue"}),r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:y,children:"Cancel"})]})]}):null,f===2?r.jsxs("form",{className:"space-y-0.5",onSubmit:S,children:[r.jsx("input",{className:Ei,type:"password",name:"identity_key_restore",autoComplete:"current-password",maxLength:35,value:h,onChange:C=>p(C.target.value.toLowerCase()),placeholder:"Paste key to restore"}),r.jsxs("div",{className:"flex justify-center gap-0.5",children:[r.jsx("button",{type:"submit",className:"button-dark text-sm",disabled:x||!h,children:"Confirm Restore"}),r.jsx("button",{type:"button",className:"button-dark text-sm",onClick:()=>d(1),children:"Back"})]})]}):null]})})}function Ew({requestableRovers:n=[],pendingRequests:s=[],requestPrivateRoverAccess:i,onMessage:o,fullWidth:f=!1}){const[d,h]=m.useState({}),p=m.useMemo(()=>{const v=new Map;return(s||[]).forEach(y=>{y?.roverId&&v.set(String(y.roverId),y)}),v},[s]),x=f?"w-full":_o,g=async v=>{if(v){h(y=>({...y,[v]:!0})),o?.("");try{(await i?.(v))?.existing?o?.("You already have a pending request for that rover."):o?.("Private rover access request sent to lockdown admins.")}catch(y){o?.(y.message||"Failed to send request.")}finally{h(y=>({...y,[v]:!1}))}}};return r.jsx("section",{className:`surface text-sm text-slate-300 ${x}`,children:r.jsxs("div",{className:vi,children:[r.jsx("p",{className:"text-sm text-slate-300",children:"Private rover access requests"}),n.length===0?r.jsx("p",{className:"text-xs text-slate-500",children:"No closed private rovers are available to request right now."}):r.jsx("div",{className:"w-full space-y-0.5",children:n.map(v=>{const y=String(v.id),S=!!d[y],E=p.get(y);return r.jsxs("div",{className:"surface-muted flex items-center justify-between gap-0.5 px-1 py-0.5",children:[r.jsxs("div",{className:"min-w-0 text-left",children:[r.jsx("p",{className:"truncate text-xs font-semibold text-slate-100",children:v.name||y}),r.jsx("p",{className:"truncate text-[0.7rem] text-slate-500",children:y})]}),E?r.jsx("span",{className:"rounded bg-amber-700/30 px-1 py-0.5 text-[0.7rem] text-amber-200",children:"Pending"}):r.jsx("button",{type:"button",onClick:()=>g(y),disabled:S,className:"button-dark text-xs disabled:opacity-50",children:S?"Sending...":"Request"})]},y)})})]})})}function $f(n){return String(n||"").trim()}function kw(n){const s=$f(n);return s?s.includes("DOCKINGRUNNING")?"Returning":s.includes("PAUSED")?"Paused":s.includes("HOUSECLEANINGRUNNING")?"Cleaning":s.includes("SPOTCLEANINGRUNNING")?"Spot cleaning":s.includes("STATE_START")?"Starting":s.includes("STATE_IDLE")||s.includes("STATE_STANDBY")?"Idle":s:"--"}function Nd(n){return n==="good"?"bg-emerald-600 text-white":n==="warn"?"bg-amber-500 text-slate-900":n==="danger"?"bg-rose-600 text-white":n==="info"?"bg-sky-600 text-white":"bg-slate-700 text-slate-100"}function eo({label:n,value:s,tone:i="muted"}){return r.jsxs("div",{className:`rounded-md px-1 py-0.75 text-center ${Nd(i)}`,children:[r.jsx("div",{className:"text-[0.72rem] opacity-90",children:n}),r.jsx("div",{className:"text-sm font-semibold",children:s})]})}function Sf({label:n,value:s,tone:i="muted"}){return r.jsxs("div",{className:`flex items-center justify-between rounded-md px-1 py-0.5 text-xs ${Nd(i)}`,children:[r.jsx("span",{children:n}),r.jsx("span",{className:"font-semibold truncate pl-1",title:String(s||""),children:s})]})}function Mw({neato:n,onStart:s,onSendHome:i,onLocate:o,onClearErrors:f,fullWidth:d=!1}){const[h,p]=m.useState(""),x=d?"w-full":"w-full max-w-xl",g=!!n?.configured,v=!!(n?.enabled&&n?.connected),y=!!n?.telemetry?.extPowerPresent,S=!!n?.telemetry?.chargingActive,E=kw(n?.telemetry?.uiState),C=n?.telemetry?.batteryPercent,k=Number.isFinite(C)?`${C}%`:"--",w=n?.telemetry?.batteryVoltage,j=Number.isFinite(w)?`${w.toFixed(2)} V`:"--",N=$f(n?.telemetry?.robotError)||"--",q=$f(n?.telemetry?.robotAlert)||"--",M=N!=="--"&&!/^no errors$/i.test(N)&&!/^200/.test(N),O=q!=="--"&&!/^200/.test(q),K=n?.controls||{},_=!!K?.start?.available,H=!!K?.sendHome?.available,z=!!K?.locate?.available,V=!!K?.clearErrors?.available,U=m.useMemo(()=>y?{key:"start",label:"Start cleaning",pending:"Starting...",toneClass:"bg-emerald-600 hover:bg-emerald-500 text-white",canRun:_,fn:s}:{key:"home",label:"Send to dock",pending:"Sending...",toneClass:"bg-sky-600 hover:bg-sky-500 text-white",canRun:H,fn:i},[y,_,s,H,i]),W=g&&v&&U.canRun,ce=g&&v&&z,oe=g&&v&&V,$=async(de,R)=>{if(R){p(de);try{await R()}catch{}finally{p("")}}},T=g?v?"Online":"Offline":"Not configured",Y=g?v?"good":"danger":"warn",I=C==null?"muted":C>=60?"good":C>=25?"warn":"danger",ie=y?"Docked":E!=="--"?E:"Away from dock";return r.jsx("section",{className:`surface text-sm text-slate-200 ${x}`,children:r.jsxs("div",{className:"grid gap-0.5",children:[r.jsxs("div",{className:"relative flex items-center justify-center min-h-[1.5rem]",children:[r.jsx("p",{className:"text-sm text-slate-100 text-center",children:"Neato Controls"}),r.jsx("span",{className:`absolute right-0 inline-flex w-auto rounded px-1 py-0.25 text-xs font-semibold ${Nd(Y)}`,children:T})]}),r.jsxs("div",{className:"grid gap-0.5 grid-cols-1 lg:grid-cols-[minmax(0,1.2fr)_minmax(0,0.8fr)]",children:[r.jsx("section",{className:"surface-muted px-0.5 py-0.5",children:r.jsxs("div",{className:"grid gap-0.5",children:[r.jsxs("div",{className:"rounded-md bg-slate-800 px-1 py-0.75 text-center",children:[r.jsx("div",{className:"text-xs text-slate-300",children:"State"}),r.jsx("div",{className:"text-base font-semibold text-slate-100",children:ie})]}),r.jsxs("div",{className:"grid grid-cols-2 gap-0.5",children:[r.jsx("button",{type:"button",disabled:!W||!!h,onClick:()=>$(U.key,U.fn),className:`rounded-md px-1 py-1 text-base font-semibold transition disabled:opacity-50 ${U.toneClass}`,children:h===U.key?U.pending:U.label}),r.jsxs("div",{className:"grid grid-cols-2 gap-0.5",children:[r.jsx("button",{type:"button",disabled:!ce||!!h,onClick:()=>$("locate",o),className:"rounded-md bg-fuchsia-600 px-1 py-0.75 text-sm font-semibold text-white transition hover:bg-fuchsia-500 disabled:opacity-50",children:h==="locate"?"Playing...":"Play sound"}),r.jsx("button",{type:"button",disabled:!oe||!!h,onClick:()=>$("clearErrors",f),className:"rounded-md bg-amber-500 px-1 py-0.75 text-sm font-semibold text-slate-900 transition hover:bg-amber-400 disabled:opacity-50",children:h==="clearErrors"?"Clearing...":"Clear errors"})]})]})]})}),r.jsx("section",{className:"surface-muted px-0.5 py-0.5",children:r.jsxs("div",{className:"grid gap-0.5 grid-cols-2",children:[r.jsx(eo,{label:"Battery",value:k,tone:I}),r.jsx(eo,{label:"Voltage",value:j,tone:w==null?"muted":"info"}),r.jsx(eo,{label:"Docked",value:y?"Yes":"No",tone:y?"info":"muted"}),r.jsx(eo,{label:"Charging",value:S?"Yes":"No",tone:S?"info":"muted"})]})})]}),r.jsx("section",{className:"surface-muted px-0.5 py-0.5",children:r.jsxs("div",{className:"grid gap-0.5 grid-cols-1 md:grid-cols-3",children:[r.jsx(Sf,{label:"UI state",value:E,tone:"muted"}),r.jsx(Sf,{label:"Robot error",value:N,tone:M?"danger":"muted"}),r.jsx(Sf,{label:"Robot alert",value:q,tone:O?"warn":"muted"})]})}),!g||!v||!U.canRun||!z||!V?r.jsx("p",{className:"text-xs text-slate-400 text-center",children:g?v?"Waiting for required Neato entities in Home Assistant.":"Home Assistant is offline.":"Set homeAssistant.neato.device in server config to enable Neato controls."}):null]})})}function Pg(){const{session:n,identifySession:s,requestVerification:i,requestPrivateRoverAccess:o,playUploadedAudio:f,stopUploadedAudio:d,startMicWhip:h,readyMicWhip:p,stopMicWhip:x,neatoStart:g,neatoSendHome:v,neatoLocate:y,neatoClearErrors:S}=nn(),{value:E,save:C}=He("identity",{cookieUserId:""}),{value:k}=He("profile",{nickname:""}),w=m.useMemo(()=>(E?.cookieUserId||"").trim(),[E?.cookieUserId]),j=(k?.nickname||"").trim(),N=!!n?.isVerified,q=n?.verification?.pendingRequestId||null,M=n?.privateRoverAccess?.requestableRovers||[],O=n?.privateRoverAccess?.pendingRequests||[],K=String(n?.assignment?.roverId||"").trim(),[_,H]=m.useState(""),z=async V=>{const U=String(V||"").trim().toLowerCase();if(!U)throw new Error("Identity key required.");if(!dw.test(U))throw new Error("Identity key must match format: cu_ + 32 lowercase hex chars.");return C(W=>({...W||{},cookieUserId:U})),await s({cookieUserId:U,nickname:j}),U};return r.jsxs("section",{className:"panel-section space-y-0.5 text-base",children:[r.jsxs("div",{className:"grid gap-0.5 grid-cols-1 lg:grid-cols-[minmax(0,1.25fr)_minmax(0,0.9fr)]",children:[r.jsx("div",{className:"lg:col-span-2",children:N?r.jsx("section",{className:"surface w-full",children:r.jsxs("div",{className:"mx-auto flex w-full max-w-md flex-col items-center space-y-0.5 text-center",children:[r.jsx("p",{className:"text-sm text-emerald-300",children:"Verification complete"}),r.jsx("p",{className:"text-xs text-slate-400",children:"VIP controls are unlocked for your assigned rover."})]})}):r.jsx(ww,{pendingRequestId:q,currentStoredKey:w,nickname:j,requestVerification:i,applyIdentityKey:z,onMessage:H,fullWidth:!0})}),r.jsx("div",{className:"lg:col-span-2",children:N?r.jsxs("div",{className:"space-y-0.5",children:[r.jsx(Mw,{neato:n?.neato||null,onStart:g,onSendHome:v,onLocate:y,onClearErrors:S,fullWidth:!0}),r.jsx(Nw,{ownRoverId:K,audioForwardByRover:n?.audioForward||{},playUploadedAudio:f,stopUploadedAudio:d,startMicWhip:h,readyMicWhip:p,stopMicWhip:x})]}):r.jsx("section",{className:"surface h-full",children:r.jsx("div",{className:"flex h-full flex-col items-center justify-center text-center text-xs text-slate-400",children:"Verify your account to unlock VIP controls."})})}),r.jsx("div",{className:"lg:col-span-2",children:r.jsx(Ew,{requestableRovers:M,pendingRequests:O,requestPrivateRoverAccess:o,onMessage:H,fullWidth:!0})}),r.jsx("div",{className:"lg:col-span-2",children:r.jsx(Cw,{currentStoredKey:w,applyIdentityKey:z,onMessage:H,fullWidth:!0})})]}),_?r.jsx("div",{className:_o,children:r.jsx("p",{className:"text-xs text-slate-400 text-center",children:_})}):null]})}const Rw=420,qw=1200,Tw={1:262,2:330,3:392,4:523};function jo(){const{session:n}=nn(),s=tn(),{value:i}=He("audio",ct),o=Number.isFinite(i?.masterVolume)?i.masterVolume:ct.masterVolume,f=Number.isFinite(i?.alertVolume)?i.alertVolume:ct.alertVolume,d=Math.max(0,Math.min(1,o*f)),h=m.useMemo(()=>{const k=Array.isArray(n?.buttonBox?.buttons)?n.buttonBox.buttons:[];return k.length===4?k:[1,2,3,4].map(w=>k.find(j=>Number(j?.id)===w)||{id:w,count:0,goal:0,rewardName:null,rewardId:null,rewardNumber:null,lastRewardAt:null})},[n?.buttonBox?.buttons]),[p,x]=m.useState({}),[g,v]=m.useState({}),y=m.useRef(new Map),S=m.useRef(new Map),E=m.useRef({}),C=m.useRef(null);return m.useEffect(()=>{const k={};h.forEach(j=>{k[j.id]=Number(j.lastRewardAt||0)});const w=E.current||{};h.forEach(j=>{const N=Number(j.id),q=k[N]||0,M=Number(w[N]||0);if(q>0&&q!==M){v(_=>({..._,[N]:!0}));const O=S.current.get(N);O&&clearTimeout(O);const K=setTimeout(()=>{v(_=>({..._,[N]:!1})),S.current.delete(N)},qw);S.current.set(N,K)}}),E.current=k},[h]),m.useEffect(()=>{function k(j){const N=Tw[j];if(!N||d<=0)return;let q=C.current;if(!q){const _=window.AudioContext||window.webkitAudioContext;if(!_)return;q=new _,C.current=q}const M=q.createOscillator(),O=q.createGain();M.type="square",M.frequency.value=N;const K=.14*d;O.gain.setValueAtTime(1e-4,q.currentTime),O.gain.exponentialRampToValueAtTime(Math.max(1e-4,K),q.currentTime+.01),O.gain.exponentialRampToValueAtTime(1e-4,q.currentTime+.2),M.connect(O),O.connect(q.destination),M.start(),M.stop(q.currentTime+.21)}function w(j={}){const N=Number(j.buttonId);if(!Number.isFinite(N)||N<1||N>4)return;x(O=>({...O,[N]:!0}));const q=y.current.get(N);q&&clearTimeout(q);const M=setTimeout(()=>{x(O=>({...O,[N]:!1})),y.current.delete(N)},Rw);y.current.set(N,M),k(N)}return s.on("buttonBox:increment",w),()=>{s.off("buttonBox:increment",w)}},[d,s]),r.jsxs("section",{className:"panel-section space-y-0.5 text-base",children:[r.jsx("header",{className:"panel-muted text-center text-sm",children:r.jsx("p",{children:"Button Box"})}),r.jsx("div",{className:"grid grid-cols-4 gap-0.5",children:h.map(k=>{const w=Number(k.id),j=Number.isFinite(k.count)?k.count:0,N=Number.isFinite(k.goal)?k.goal:0,q=typeof k.rewardName=="string"&&k.rewardName.trim()?k.rewardName.trim():"Unassigned",M=Number.isFinite(k.rewardNumber)?k.rewardNumber:"?",O=!!p[w],K=!!g[w];return r.jsx(vg,{buttonId:w,count:j,goal:N,rewardNumber:M,rewardName:q,className:[O?"bg-cyan-900/45":"",K?"bg-fuchsia-900/45":""].filter(Boolean).join(" ")},w)})})]})}function Dw(){const{state:{roverId:n}}=_t(),i=dl(n)?.sensors||{};return r.jsx("section",{className:"panel-section",children:r.jsx("div",{className:"aspect-square w-full",children:r.jsx(Hf,{sensors:i})})})}function _w(){const{state:{roverId:n,keymap:s,camera:i,horn:o},pipeline:f,actions:{setServoAngle:d,setNightVision:h,startHorn:p,stopHorn:x}}=_t(),g=Dg(n),v=g.docked&&!g.driving,y=i?.config,S=!!(n&&i?.enabled&&y),E=!!(n&&f?.nightVision),C=f?.nightVisionState,k=!!(n&&f?.horn),w=o?.overheated,j=typeof y?.minAngle=="number"?y.minAngle:-30,N=typeof y?.maxAngle=="number"?y.maxAngle:30,q=typeof i?.angle=="number"?i.angle:typeof y?.homeAngle=="number"?y.homeAngle:(j+N)/2,M=An(s?.nightVisionToggle?.[0]),O=An(s?.hornHonk?.[0]),K=An(s?.cameraUp?.[0]),_=An(s?.cameraDown?.[0]);return r.jsxs("section",{className:"panel-section grid h-full min-h-0 grid-rows-[minmax(0,1fr)_auto] gap-0.5",children:[r.jsx(_g,{layout:"desktop",expand:!0,driveDockState:g}),v?null:r.jsxs("div",{className:"surface space-y-0.5 p-0 text-sm text-slate-200",children:[E&&r.jsx(Bg,{nightVisionOn:C?.nightVisionOn,disabled:!n,onToggle:h,keyLabel:M}),k&&r.jsx(Og,{disabled:!n||w,onStart:p,onStop:x,keyLabel:O,active:o?.active,heat:o?.heat}),S&&r.jsx(Lg,{value:q,min:j,max:N,onChange:d,keyDownLabel:_,keyUpLabel:K,className:"space-y-0.5 px-1 py-1",labelRowClass:"text-xs text-slate-300",labelClass:"",valueClass:"font-mono text-slate-100",sliderClass:"w-full",accentClass:"accent-emerald-400",endpointClass:"text-[0.7rem] text-slate-400"})]})]})}function Bw({layout:n,onOpenHelpOverlay:s}){const i=ft(E=>E.session),{state:o}=_t(),{value:f}=He("vipAudio",{openMicEnabled:!1,pttMode:"live"}),d=i?.isVerified?"bg-emerald-400":"bg-red-600",h=String(i?.assignment?.roverId||"").trim(),p=h?i?.audioForward?.[h]:null,x=!!o?.mic?.pttActive,g=!!f?.openMicEnabled,v=f?.pttMode==="clip"?"clip":"live",y=!!(h&&i?.isVerified&&(v==="clip"?x:g||x)),S=!!(h&&i?.isVerified&&v==="clip"&&p?.source==="upload"&&p?.state==="playing");return r.jsx("section",{className:"panel text-base",children:r.jsxs(Sd,{defaultTab:"telemetry",children:[r.jsxs(jd,{children:[r.jsx(Wt,{id:"telemetry",children:"Controls"}),r.jsx(Wt,{id:"vip",highlight:S?"green":y?"pink":"none",children:r.jsxs("span",{className:"inline-flex items-center gap-2",children:[r.jsx("span",{children:"VIP"}),r.jsx("span",{className:`inline-block h-3 w-3 rounded-full ${d}`,"aria-hidden":"true",title:i?.isVerified?"Verified":"Not verified"})]})}),r.jsx(Wt,{id:"help",children:"Help"}),r.jsx(Wt,{id:"settings",children:"Settings"})]}),r.jsxs(Ad,{children:[r.jsx(en,{id:"telemetry",children:r.jsxs("div",{className:"space-y-0.5",children:[r.jsxs("div",{className:"grid items-stretch gap-0.5 grid-cols-[minmax(0,1.35fr)_minmax(0,0.95fr)]",children:[r.jsx(Dw,{}),r.jsx(_w,{})]}),r.jsxs("div",{className:"grid gap-0.5 grid-cols-[minmax(0,1fr)_minmax(0,0.9fr)_minmax(0,0.75fr)]",children:[r.jsx(Do,{}),r.jsx(sd,{panelId:"replay-sources-desktop",fillHeight:!0}),r.jsx(lw,{})]}),r.jsxs("div",{className:"grid items-stretch gap-0.5 grid-cols-[minmax(0,1.3fr)_minmax(0,0.22fr)] h-[14rem]",children:[r.jsx(qo,{fillHeight:!0}),r.jsxs("div",{className:"grid min-h-0 gap-0.5 grid-rows-[minmax(0,1fr)_auto]",children:[r.jsx(So,{compact:!0,hideNicknameForm:!0,fillHeight:!0}),r.jsx(sw,{compact:!0})]})]}),r.jsx($g,{}),r.jsx(jo,{}),r.jsx(dd,{defaultOrientation:"horizontal",panelId:"rightpane-telemetry"})]})}),r.jsx(en,{id:"vip",keepMounted:!0,children:r.jsx(Pg,{})}),r.jsx(en,{id:"help",children:r.jsx(Ig,{layout:n,onOpenOverlay:s})}),r.jsx(en,{id:"settings",children:r.jsx(Qg,{})})]})]})})}const Ow=new Set(["admin","lockdown","lockdown-admin"]),Lw=new Set(["lockdown","lockdown-admin"]),zw=new Set(["admin","lockdown"]);function Uw(n="admin"){return n==="lockdown"?{title:"Lockdown mode active",description:"Only the server owners can access the interface at this time."}:{title:"Admin mode active"}}function Hw(){const n=ft(S=>S.session),s=n?.mode,i=n?.role,o=n?.adminReason?.text||"";n?.adminReason?.updatedAt;const f=n?.timezone||"UTC",d=n?.socials?.find(S=>String(S?.id||S?.label||"").toLowerCase()==="discord")?.url||n?.discord?.invite||null,h=zw.has(s),p=s==="lockdown"?Lw.has(i):Ow.has(i),[x,g]=m.useState(()=>new Date),v=m.useMemo(()=>{try{return new Intl.DateTimeFormat("en-US",{timeZone:f,hour:"numeric",minute:"2-digit",second:"2-digit"}).format(x)}catch{return x.toLocaleTimeString()}},[x,f]);if(m.useEffect(()=>{const S=setInterval(()=>g(new Date),1e3);return()=>clearInterval(S)},[]),!h||p)return null;const y=Uw(s);return r.jsx("div",{className:"pointer-events-auto fixed inset-0 z-50 flex items-center justify-center bg-black/85 px-0.5 py-0.5",children:r.jsxs("div",{className:"surface w-full max-w-md space-y-0.5 text-slate-100 shadow-2xl",children:[r.jsxs("div",{className:"space-y-0.5",children:[r.jsx("p",{className:"text-lg font-semibold",children:y.title}),r.jsx("p",{className:"text-sm text-slate-300",children:y.description})]}),r.jsxs("div",{className:"surface-muted space-y-0.5",children:[r.jsx("p",{className:"text-[0.7rem] tracking-wide text-slate-400",children:"Reason for locking:"}),r.jsx("p",{className:"text-lg font-semibold text-slate-100",children:o||"No reason set."}),r.jsxs("p",{className:"text-center text-sm text-slate-300",children:["Server time: ",v]})]}),r.jsx("div",{className:"surface-muted",children:r.jsx(Gg,{})}),r.jsx("div",{className:"w-full justify-center items-center",children:r.jsx(xd,{id:"discord",label:"Join our Discord server for updates!",url:d})}),"You can still use the chat while the server is locked:",r.jsxs("div",{className:"max-h-80 overflow-y-auto",children:[r.jsx(qo,{}),r.jsx(To,{})]})]})})}const Vw="/assets/turn_alert-DVO8EZJa.mp3";function $w(n,s=1){const i=m.useRef(null);return m.useEffect(()=>{i.current=new Audio(n),i.current.volume=s,i.current.load()},[n,s]),()=>{i.current&&(i.current.volume=s,i.current.currentTime=0,i.current.play().catch(()=>{}))}}function Gw(){const n=ft(v=>v.session),{pushAlert:s}=wn(),{value:i}=He("audio",ct),o=Number.isFinite(i?.masterVolume)?i.masterVolume:ct.masterVolume,f=Number.isFinite(i?.alertVolume)?i.alertVolume:ct.alertVolume,d=Math.max(0,Math.min(1,o*f)),h=$w(Vw,d),p=m.useRef(new Set),x=m.useMemo(()=>n?.turnQueues||{},[n?.turnQueues]),g=n?.socketId||null;return m.useEffect(()=>{if(!g)return;const v=[];Object.entries(x).forEach(([y,S])=>{!S||!S.current||S.current!==g||p.current.has(y)||(v.push(y),p.current.add(y))}),Object.keys(x).forEach(y=>{(!x[y]||x[y].current!==g)&&p.current.delete(y)}),v.length!==0&&(v.forEach(y=>{const S=n?.roster?.find(E=>String(E.id)===String(y))?.name||y;s({title:"Your turn!",message:`You now control ${S}.`,color:"#ff5722"})}),h())},[x,h,s,n?.roster,g]),null}function Yw({visible:n,mode:s,onEnterFullscreen:i,onDismiss:o}){if(!n)return null;const f=s==="pwa-hint";return r.jsx("div",{className:"fixed inset-0 z-40 flex items-end justify-center p-2 pointer-events-none sm:items-center",children:r.jsx("div",{className:"pointer-events-auto w-full max-w-sm rounded-lg border border-cyan-500/40 bg-zinc-950/95 shadow-xl",children:r.jsxs("div",{className:"space-y-0.5 p-4 text-sm text-slate-100",children:[r.jsx("h2",{className:"text-base font-semibold text-white",children:"Better in fullscreen"}),f?r.jsxs("p",{className:"text-slate-300",children:["For fullscreen on iOS, open Safari's share menu and pick ",r.jsx("strong",{children:"Add to Home Screen"}),". Launching from the home screen removes the browser chrome."]}):r.jsx("p",{className:"text-slate-300",children:"Enable fullscreen to free up more space for the video feed and controls. You can exit fullscreen at any time via the system back or home gesture."}),r.jsxs("div",{className:"flex justify-end gap-0.5 pt-1 text-sm",children:[r.jsx("button",{type:"button",className:"rounded border border-slate-600 px-3 py-1 text-slate-200",onClick:o,children:f?"Got it":"Not now"}),!f&&r.jsx("button",{type:"button",className:"rounded bg-cyan-500 px-3 py-1 font-semibold text-black hover:bg-cyan-400",onClick:i,children:"Enter fullscreen"})]})]})})})}function Fw({side:n="right",onClick:s}){const i=n==="left"?"left-2":"right-2";return r.jsx("button",{type:"button",onClick:s,className:`fixed bottom-2 ${i} z-30 flex h-10 w-10 items-center justify-center rounded-full border border-cyan-200/50 bg-slate-900/70 text-cyan-100 shadow-lg backdrop-blur-sm transition hover:bg-slate-800/80 active:scale-95`,"aria-label":"Enter fullscreen",title:"Enter fullscreen",children:r.jsx("svg",{viewBox:"0 0 24 24",width:"18",height:"18","aria-hidden":"true",className:"pointer-events-none",children:r.jsx("path",{d:"M4 9V4h5M15 4h5v5M20 15v5h-5M9 20H4v-5",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})})}const Wg="fullscreenPromptDismissed",Xw=new Set(["mobile-portrait","mobile-landscape"]),ev=()=>{if(typeof window>"u")return null;try{return window.sessionStorage}catch{return null}},Qw=()=>{const n=ev();if(!n)return!1;try{return n.getItem(Wg)==="1"}catch{return!1}},Ex=()=>{const n=ev();if(n)try{n.setItem(Wg,"1")}catch{}},Kw=()=>{if(typeof navigator>"u")return!1;const n=navigator.userAgent||navigator.platform||"";return/iphone|ipad|ipod/i.test(n)},kx=()=>{if(typeof document>"u")return!1;const n=document;return!!(n.fullscreenEnabled||n.webkitFullscreenEnabled||n.mozFullScreenEnabled||n.msFullscreenEnabled)};function Zw(n){const s=Xw.has(n),[i,o]=m.useState(!1),[f,d]=m.useState("native"),[h,p]=m.useState(!1),x=m.useMemo(()=>Kw(),[]),g=m.useMemo(()=>kx(),[]),v=m.useCallback(()=>{if(!s){o(!1),p(!1);return}if(!h&&Qw()){o(!1);return}if(x){d("pwa-hint"),o(!0);return}if(!kx()){o(!1);return}if(typeof document<"u"&&document.fullscreenElement){o(!1);return}d("native"),o(!0)},[h,x,s]);m.useEffect(()=>{v()},[v]),m.useEffect(()=>{if(typeof document>"u")return;const C=()=>{if(document.fullscreenElement){p(!1),o(!1);return}v()};return document.addEventListener("fullscreenchange",C),document.addEventListener("webkitfullscreenchange",C),()=>{document.removeEventListener("fullscreenchange",C),document.removeEventListener("webkitfullscreenchange",C)}},[v]);const y=m.useCallback(()=>{Ex(),p(!1),o(!1)},[]),S=m.useCallback(async()=>{if(!s||x||typeof document>"u")return!1;if(document.fullscreenElement)return!0;const C=document.documentElement;if(!C)return!1;const k=C.requestFullscreen||C.webkitRequestFullscreen||C.mozRequestFullScreen||C.msRequestFullscreen;if(!k)return!1;try{const w=k.call(C);return w&&typeof w.then=="function"&&await w,Ex(),p(!1),o(!1),!0}catch(w){return console.warn("Failed to enter fullscreen",w),!1}},[x,s]),E=m.useCallback(()=>{s&&(p(!0),d(x?"pwa-hint":"native"),o(!0))},[x,s]);return m.useEffect(()=>{s||(p(!1),o(!1))},[s]),{visible:i,mode:f,isIOS:x,nativeSupported:g,enterFullscreen:S,dismiss:y,showPrompt:E}}function Iw({visible:n,layout:s,onClose:i,showOnLoad:o,onToggleShowOnLoad:f}){if(!n)return null;const{state:d}=_t(),h=p=>{const x=!p.target.checked;f?.(x)};return r.jsx("div",{className:"fixed inset-0 z-30 flex items-center justify-center bg-black/80 px-0.5 py-0.5",children:r.jsxs("div",{className:"pointer-events-auto surface w-full max-w-4xl max-h-[90vh] overflow-hidden shadow-2xl",children:[r.jsxs("div",{className:"flex items-center justify-between border-b border-slate-700 px-0.5 py-0.25 text-sm text-slate-200",children:[r.jsx("span",{className:"font-semibold",children:"Help & controls"}),r.jsxs("div",{className:"flex items-center gap-0.5 text-[0.8rem] text-slate-300",children:[r.jsxs("label",{className:"flex items-center gap-0.5",children:[r.jsx("input",{type:"checkbox",checked:!o,onChange:h,className:"accent-cyan-500"}),r.jsx("span",{children:"Don't show again"})]}),r.jsx("button",{type:"button",onClick:i,className:"button-dark px-2 py-0.25 text-[0.8rem]",children:"Close"})]})]}),r.jsx("div",{className:"max-h-[85vh] overflow-y-auto p-0.5",children:r.jsx(Zg,{layout:s,keymap:d?.keymap||{}})})]})})}const Jw=`aroma bagel batter beans @@ -122,4 +122,4 @@ wine wok yeast yogurt -`;function Pw(n){return n?n.charAt(0).toUpperCase()+n.slice(1):""}function Ww(){const n=String(Jw).split(/\r?\n/).map(i=>i.trim()).filter(Boolean);return n.length?(n[Math.floor(Math.random()*n.length)]||"").trim():""}function wd(){const{setNickname:n}=wn(),{value:s,status:i,save:o}=He("profile",{nickname:""}),f=m.useRef(!1);m.useEffect(()=>{if(i!=="ready"||f.current||(s.nickname||"").trim())return;f.current=!0;const h=Pw(Ww()).slice(0,32);if(!h)return;(async()=>{try{await n(h)}catch{}finally{o({nickname:h})}})()},[o,n,i,s.nickname])}function e2(){const n=tn(),s=ft(w=>w.connected),{identifySession:i}=wn(),{value:o,status:f,save:d}=He("identity",{cookieUserId:""}),{value:h,status:p}=He("profile",{nickname:""}),x=m.useRef(!1),g=m.useRef(null),v=m.useRef(null),y=f==="ready"&&p==="ready",S=(o?.cookieUserId||"").trim(),E=(h?.nickname||"").trim(),C=m.useCallback(()=>{v.current&&(clearTimeout(v.current),v.current=null)},[]),k=m.useCallback(async()=>{if(!(!y||!s||!n?.id||x.current)){x.current=!0;try{const j=((await i({cookieUserId:S,nickname:E}))?.cookieUserId||"").trim();j&&j!==S&&d(N=>({...N||{},cookieUserId:j})),g.current=n.id,C()}catch{C(),v.current=setTimeout(()=>{k()},2e3)}finally{x.current=!1}}},[C,s,S,i,E,y,d,n?.id]);m.useEffect(()=>{!y||!s||!n?.id||g.current!==n.id&&k()},[s,y,k,n?.id]),m.useEffect(()=>{!y||!s||!n?.id||k()},[y,s,n?.id,S,E,k]),m.useEffect(()=>{const w=()=>{n?.connected&&k()},j=()=>{typeof document>"u"||document.visibilityState!=="visible"||n?.connected&&k()};return window.addEventListener("online",w),document.addEventListener("visibilitychange",j),()=>{window.removeEventListener("online",w),document.removeEventListener("visibilitychange",j)}},[k,n?.connected]),m.useEffect(()=>()=>C(),[C])}const jf=1e4,Af=28,t2=14;function Ao({layout:n="desktop",className:s="",dismissable:i=!0}){const{session:o}=nn(),f=o?.communityGoal?.text?String(o.communityGoal.text).trim():"",d=n==="mobile-portrait"||n==="mobile-landscape"||n==="mobile",[h,p]=m.useState(!1),[x,g]=m.useState(Af),[v,y]=m.useState(0),S=m.useRef(null),E=m.useRef(null),C=m.useRef(null);m.useEffect(()=>{if(!f){p(!1);return}if(p(!0),!d||!i)return;const N=Date.now();y(jf);const q=setTimeout(()=>p(!1),jf),M=setInterval(()=>{const O=Date.now()-N;y(Math.max(0,jf-O))},250);return()=>{clearTimeout(q),clearInterval(M)}},[f,d]),m.useEffect(()=>{if(!f)return;g(Af);let N=0;const q=()=>{const O=C.current,K=E.current;if(!O||!K)return;const _=O.clientWidth;if(!_)return;const U=K.scrollWidth;if(!U)return;const z=Math.min(1,_/U),H=Math.max(t2,Math.floor(Af*z));g(H)};N=window.requestAnimationFrame(q);const M=new ResizeObserver(()=>{window.cancelAnimationFrame(N),N=window.requestAnimationFrame(q)});return S.current&&M.observe(S.current),()=>{window.cancelAnimationFrame(N),M.disconnect()}},[f]);const k=m.useMemo(()=>["panel-section flex w-full items-center justify-center",d?"rounded-none":"rounded","px-1 py-1 text-center font-semibold tracking-tight",s].filter(Boolean).join(" "),[s,d]);if(!f||!h)return null;const w=d?Math.ceil(v/1e3):null,j=i?{onClick:()=>p(!1),role:"button",tabIndex:0}:{};return r.jsx("div",{ref:S,className:k,style:{fontSize:`${x}px`,lineHeight:1.1},...j,children:r.jsxs("span",{className:"flex w-full items-stretch gap-0.5 whitespace-nowrap rounded-md",children:[r.jsxs("span",{className:"flex flex-col justify-center border-r border-slate-700/60 px-0.5 text-[0.55em] font-semibold leading-tight text-slate-400",children:[r.jsx("span",{children:"Community"}),r.jsx("span",{children:"Goal"})]}),r.jsx("span",{ref:C,className:"flex-1 overflow-hidden text-slate-100",children:r.jsx("span",{ref:E,className:"block",children:f})}),d?r.jsxs("span",{className:"flex items-center border-l border-slate-700/60 px-0.5 text-[0.55em] font-semibold uppercase tracking-wide text-slate-400",children:[w,"s"]}):null]})})}const n2=3200;function a2(n={}){const s=typeof n.rewardName=="string"&&n.rewardName.trim()?n.rewardName.trim():"Unknown Event",i=Number.isFinite(Number(n.goal))?Math.max(1,Math.floor(Number(n.goal))):0,o=Number.isFinite(Number(n.count))?Math.max(0,Math.floor(Number(n.count))):i;return{rewardName:s,goal:i,count:o,ts:Date.now()}}function tv(){const n=tn(),{value:s}=He("audio",ct),i=Number.isFinite(s?.masterVolume)?s.masterVolume:ct.masterVolume,o=Number.isFinite(s?.alertVolume)?s.alertVolume:ct.alertVolume,f=Math.max(0,Math.min(1,i*o)),[d,h]=m.useState(null),p=m.useRef(null);return m.useEffect(()=>{p.current=new Audio("/tada.mp3"),p.current.volume=f,p.current.load()},[f]),m.useEffect(()=>{let x=null;function g(){const S=p.current;S&&(S.volume=f,S.currentTime=0,S.play().catch(()=>{}))}function v(S={}){const E=a2(S);h(E),g(),x&&clearTimeout(x),x=setTimeout(()=>{h(null)},n2)}function y(S){v(S?.detail||{})}return n.on("buttonBox:rewardRun",v),window.addEventListener("buttonBox:rewardRunLocalTest",y),()=>{x&&clearTimeout(x),n.off("buttonBox:rewardRun",v),window.removeEventListener("buttonBox:rewardRunLocalTest",y)}},[f,n]),d?r.jsx("div",{className:"pointer-events-none fixed inset-0 z-[120] flex items-center justify-center bg-black/75 px-1 py-1",children:r.jsx("div",{className:"pointer-events-auto w-full max-w-2xl",children:r.jsx("div",{className:"surface rounded-none border-2 border-cyan-300 bg-amber-100/95 px-1 py-1 text-center text-black shadow-2xl",children:r.jsxs("div",{className:"flex items-center justify-center gap-1 border-2 border-blue-600 bg-yellow-100 px-0.5 py-1",children:[r.jsx("img",{src:"/party1.gif",alt:"",className:"hidden shrink-0 sm:block"}),r.jsxs("div",{children:[r.jsxs("p",{className:"font-mono text-2xl font-bold text-red-700 sm:text-3xl",children:["Running event: ",d.rewardName,"!"]}),r.jsxs("p",{className:"font-mono text-xl font-bold text-blue-800 sm:text-2xl",children:[d.count,"/",d.goal]})]}),r.jsx("img",{src:"/party2.gif",alt:"",className:"hidden shrink-0 sm:block"})]})})})}):null}function s2(){const[n,s]=m.useState(()=>typeof window>"u"||window.innerWidth>=1024?"desktop":window.innerWidth>window.innerHeight?"mobile-landscape":"mobile-portrait");return m.useEffect(()=>{function i(){if(typeof window>"u")return;const{innerWidth:o,innerHeight:f}=window;o>=1024?s("desktop"):o>f?s("mobile-landscape"):s("mobile-portrait")}return i(),window.addEventListener("resize",i),()=>window.removeEventListener("resize",i)},[]),n}function l2({layout:n,onOpenHelpOverlay:s}){return r.jsxs("div",{className:"flex h-full gap-0.5 overflow-hidden",children:[r.jsxs("div",{className:"flex min-w-0 flex-[1.22] flex-col gap-0.5 overflow-y-auto pr-0",children:[r.jsx(gd,{}),r.jsx(aj,{}),r.jsx(md,{})]}),r.jsxs("div",{className:"flex min-w-0 flex-1 flex-col gap-0.5 overflow-y-auto",children:[r.jsx(Ao,{layout:n}),r.jsx(Bw,{layout:n,onOpenHelpOverlay:s})]})]})}function nv({layout:n,onOpenHelpOverlay:s,roomPanelId:i,showTelemetry:o=!0}){const f=ft(k=>k.session),{state:d}=_t(),{value:h}=He("vipAudio",{openMicEnabled:!1,pttMode:"live"}),p=f?.isVerified?"bg-emerald-400":"bg-amber-400",x=String(f?.assignment?.roverId||"").trim(),g=x?f?.audioForward?.[x]:null,v=!!d?.mic?.pttActive,y=!!h?.openMicEnabled,S=h?.pttMode==="clip"?"clip":"live",E=!!(x&&f?.isVerified&&(S==="clip"?v:y||v)),C=!!(x&&f?.isVerified&&S==="clip"&&g?.source==="upload"&&g?.state==="playing");return r.jsx("section",{className:"panel text-base",children:r.jsxs(Sd,{defaultTab:"chat",children:[r.jsxs(jd,{children:[r.jsx(Wt,{id:"chat",children:"Chat"}),r.jsx(Wt,{id:"vip",highlight:C?"green":E?"pink":"none",children:r.jsxs("span",{className:"inline-flex items-center gap-0.5",children:[r.jsx("span",{children:"VIP"}),r.jsx("span",{className:`inline-block h-1.5 w-1.5 rounded-full ${p}`,"aria-hidden":"true",title:f?.isVerified?"Verified":"Not verified"})]})}),r.jsx(Wt,{id:"roomcontrols",children:"Room Controls"}),r.jsx(Wt,{id:"help",children:"Help"}),r.jsx(Wt,{id:"settings",children:"Settings"})]}),r.jsxs(Ad,{children:[r.jsx(en,{id:"chat",children:r.jsxs("div",{className:"space-y-0.5",children:[r.jsx(qo,{}),r.jsx(So,{})]})}),r.jsx(en,{id:"vip",keepMounted:!0,children:r.jsx(Pg,{})}),r.jsx(en,{id:"roomcontrols",children:r.jsxs("div",{className:"space-y-0.5",children:[r.jsx($g,{}),r.jsx(jo,{}),r.jsx(dd,{panelId:i})]})}),r.jsx(en,{id:"help",children:r.jsx(Ig,{layout:n,onOpenOverlay:s})}),r.jsx(en,{id:"settings",children:r.jsxs("div",{className:"space-y-0.5",children:[r.jsx(Qg,{}),r.jsx(md,{})]})})]})]})})}function i2({onOpenHelpOverlay:n,swapMobileControlColumns:s=!1}){return r.jsxs("div",{className:"flex flex-col gap-0.5",children:[r.jsx(gd,{layoutFormat:"mobile-portrait"}),r.jsx(MA,{swapColumns:s}),r.jsxs("div",{className:"grid gap-0.5 grid-cols-[minmax(0,1fr)_minmax(0,1.4fr)]",children:[r.jsx(sd,{panelId:"replay-sources-mobile-portrait"}),r.jsx(Do,{})]}),r.jsx(nv,{layout:"mobile-portrait",onOpenHelpOverlay:n,roomPanelId:"mobile-portrait-room"})]})}function r2({onOpenHelpOverlay:n,swapMobileControlColumns:s=!1}){const i="self-start h-[min(100svh,32rem)]",o=s?r.jsx(bo,{layout:"landscape",className:i}):r.jsx(vo,{layout:"landscape",className:i}),f=s?r.jsx(vo,{layout:"landscape",className:i}):r.jsx(bo,{layout:"landscape",className:i});return r.jsxs("div",{className:"flex flex-col gap-0.5",children:[r.jsxs("section",{className:"grid min-h-screen grid-cols-[minmax(0,0.7fr)_minmax(0,2.1fr)_minmax(0,0.7fr)] gap-0.5",children:[o,r.jsxs("div",{children:[r.jsx(gd,{layoutFormat:"mobile-landscape"}),r.jsxs("div",{className:"grid gap-0.5 grid-cols-[minmax(0,1fr)_minmax(0,1.4fr)]",children:[r.jsx(sd,{panelId:"replay-sources-mobile-landscape"}),r.jsx(Do,{})]})]}),f]}),r.jsx("div",{className:"flex flex-col gap-0.5 pb-0",children:r.jsx(nv,{layout:"mobile-landscape",onOpenHelpOverlay:n,roomPanelId:"mobile-landscape-room",showTelemetry:!1})})]})}function o2(){const n=s2(),s=n==="desktop",i=Zw(n);return r.jsx("div",{className:`bg-black text-slate-100 ${s?"h-screen overflow-hidden":"min-h-screen"}`,children:r.jsx(c2,{layout:n,isDesktop:s,fullscreen:i})})}function c2({layout:n,isDesktop:s,fullscreen:i}){wd(),e2();const{visible:o,mode:f,isIOS:d,nativeSupported:h,enterFullscreen:p,dismiss:x,showPrompt:g}=i,{value:v,status:y,save:S}=He("help",{showOnLoad:!0}),{value:E}=He("page",{swapMobileControlColumns:!1}),C=!!E?.swapMobileControlColumns,k=C?"left":"right",w=!s&&(d||h),[j,N]=m.useState(!1);m.useEffect(()=>{y==="ready"&&N(v?.showOnLoad!==!1)},[y,v?.showOnLoad]);const q=m.useCallback(()=>N(!0),[]),M=m.useCallback(()=>N(!1),[]),O=m.useCallback(async()=>{if(d){g();return}await p()||g()},[p,d,g]),K=m.useCallback(U=>{const z=!!U;S(H=>({...H??{},showOnLoad:z})),z||N(!1)},[S]),_=m.useMemo(()=>s?r.jsx(l2,{layout:n,onOpenHelpOverlay:q}):n==="mobile-landscape"?r.jsx(r2,{onOpenHelpOverlay:q,swapMobileControlColumns:C}):r.jsx(i2,{onOpenHelpOverlay:q,swapMobileControlColumns:C}),[s,n,q,C]);return r.jsxs(Ij,{children:[r.jsx(rA,{}),r.jsx(bA,{}),r.jsxs("main",{className:`flex w-full flex-col gap-0.5 text-base ${s?"h-full overflow-hidden":""}`,children:[s?null:r.jsx(Ao,{layout:n}),_]}),r.jsx(rd,{}),r.jsx(tv,{}),r.jsx(Gw,{}),r.jsx(Hw,{}),r.jsx(Iw,{visible:j,layout:n,onClose:M,showOnLoad:v?.showOnLoad!==!1,onToggleShowOnLoad:K}),r.jsx(Yw,{visible:o,mode:f,onEnterFullscreen:p,onDismiss:x}),w?r.jsx(Fw,{side:k,onClick:O}):null]})}function av(){const{session:n,setRole:s,subscribeAll:i,connected:o}=nn(),[f,d]=m.useState(!1);return m.useEffect(()=>{let h=!1;async function p(){if(n?.mode==="lockdown"){d(!1);return}try{n?.role!=="spectator"&&await s("spectator"),await i(),h||d(!0)}catch(x){console.error("Failed to enter spectator mode",x),h||d(!1)}}return p(),()=>{h=!0}},[o,n?.mode,n?.role,s,i]),f}function u2(){const[n,s]=m.useState(()=>typeof window>"u"?!1:window.matchMedia("(max-aspect-ratio: 4/3)").matches);return m.useEffect(()=>{if(typeof window>"u")return;const i=window.matchMedia("(max-aspect-ratio: 4/3)"),o=f=>s(f.matches);return i.addEventListener?i.addEventListener("change",o):i.addListener(o),()=>{i.removeEventListener?i.removeEventListener("change",o):i.removeListener(o)}},[]),n}function f2({roverId:n,session:s}){const i=s?.activeDrivers?.[n]||null,f=(s?.users||[]).find(x=>x.socketId===i)?.nickname||(i?i.slice(0,6):"No driver"),d=s?.mode,h=s?.turnQueues?.[n];return d==="turns"&&h?.current?`${f} (turns)`:f}function d2({rover:n,frame:s,sessionInfo:i,videoMode:o,snapshotFeed:f,audioInfo:d,session:h}){const p=f2({roverId:n.id,session:h});return r.jsx("article",{className:"min-h-[16rem] rounded bg-zinc-900 p-0 sm:min-h-[18rem]",children:r.jsx("div",{className:"min-h-0 overflow-hidden rounded bg-black/20",children:r.jsx(Ni,{sessionInfo:i,videoMode:o,snapshotFeed:f,audioSessionInfo:d,label:n.name,roverColor:n.color||null,telemetryFrame:s,batteryConfig:n.battery,hudVariant:"spectator",driverLabel:p,hudForceMap:!0,hudMapPosition:"top-center"})})})}function m2({roster:n,frames:s,videoSources:i,snapshotFeeds:o,audioSources:f,session:d,canSpectateVideo:h}){return n.length===0?r.jsx("p",{className:"col-span-full text-slate-400",children:"No rovers registered."}):r.jsx("section",{className:"grid grid-cols-1 gap-0.5 md:grid-cols-2",children:n.map(p=>r.jsx(d2,{rover:p,frame:s[p.id],sessionInfo:h&&i[p.id]||null,videoMode:h?"whep":"snapshot",snapshotFeed:h?null:o[p.id],audioInfo:f[`${p.id}-audio`],session:d,showHudMap:!0,hudMapPosition:"bottom-left"},p.id))})}function h2(){return r.jsx("section",{className:"min-h-0",children:r.jsx("div",{className:"surface min-h-[14rem] overflow-hidden",children:r.jsx(dd,{defaultOrientation:"horizontal",hideLayoutToggle:!0,hideHeader:!0,panelId:"spectator-secondary"})})})}function p2({className:n=""}){return r.jsx("div",{className:`panel ${n}`,children:r.jsx(md,{})})}function x2(){const{session:n}=nn(),s=n?.mode==="lockdown",i=!!n?.isLocalNetwork;wd(),av();const o=u2(),f=nd(),d=n?.roster??[],h=hd(d.map(w=>w.id),{enabled:!s&&!i,version:n?.mode}),p=i?d.map(w=>({type:"rover",id:w.id,key:w.id})):[],x=ji(p,{enabled:!s&&i,version:n?.mode}),g=d.flatMap(w=>w.media?.audioPublishUrl?[{type:"rover",id:`${w.id}-audio`,key:`${w.id}-audio`}]:[]),v=ji(g,{enabled:!s,version:n?.mode});if(s)return r.jsx("div",{className:"flex min-h-screen items-center justify-center bg-black text-slate-200",children:r.jsxs("div",{className:"surface max-w-md space-y-0.5 p-1 text-center text-sm",children:[r.jsx("p",{className:"text-lg font-semibold text-white",children:"Spectate disabled during lockdown."}),r.jsx("p",{className:"text-slate-300",children:"Please wait until the server leaves lockdown to view streams."})]})});const y=o?"flex min-h-screen flex-col bg-black text-slate-100 md:h-screen md:overflow-hidden":"grid min-h-screen grid-cols-1 gap-0.5 bg-black text-slate-100 md:h-full md:min-h-0 md:grid-cols-[minmax(0,1fr)_18rem] lg:grid-cols-[minmax(0,1fr)_20rem]",S=o?"order-2 flex min-h-0 min-w-0 flex-1 flex-col gap-0.5 overflow-y-auto":"order-1 flex min-h-0 min-w-0 flex-col gap-0.5 md:overflow-y-auto",E=o?"order-1 grid w-full min-h-0 items-stretch gap-0.5 border-b border-slate-800/60 bg-slate-950/90 p-0.5 grid-cols-[minmax(0,1fr)_minmax(0,0.7fr)_minmax(0,1.9fr)_minmax(0,0.7fr)]":"order-2 flex min-h-0 min-w-0 flex-col gap-0.5 border-l border-slate-800/60 bg-slate-950/90 md:h-full md:overflow-y-auto",C="",k=o?"h-64":"";return r.jsxs("div",{className:"min-h-screen bg-black text-slate-100 md:h-screen md:overflow-hidden",children:[r.jsxs("main",{className:y,children:[r.jsxs("section",{className:E,children:[o?r.jsxs("div",{className:`${C} ${k} flex flex-col gap-0.5`,children:[r.jsx(Ao,{layout:"desktop",dismissable:!1,className:"text-sm"}),r.jsx(jo,{}),r.jsx("div",{className:"min-h-0 flex-1",children:r.jsx(So,{hideNicknameForm:!0,hideHeader:!0,compact:!0,fillHeight:!0,className:"h-full"})})]}):r.jsxs("div",{className:C,children:[r.jsx(Ao,{layout:"desktop",dismissable:!1,className:"text-sm"}),r.jsx(jo,{})]}),r.jsx("div",{className:`${C} ${o?`${k} overflow-y-auto`:""}`,children:r.jsx("div",{className:"panel h-full",children:r.jsx(Do,{title:"Rovers"})})}),o?null:r.jsx("div",{className:`${C} flex-1 min-h-0`,children:r.jsx(So,{hideNicknameForm:!0,hideHeader:!0,compact:!0,fillHeight:!0,className:"h-full"})}),r.jsx("div",{className:`${C} ${o?k:"flex-[1.1] min-h-0"}`,children:r.jsx(qo,{allowSpectatorInput:!0,hideSpectatorNotice:!0,fillHeight:!0})}),r.jsx("div",{className:`${C} ${o?k:""}`,children:r.jsx(p2,{className:`${o?"h-full":"h-40"} overflow-hidden`})})]}),r.jsxs("section",{className:S,children:[r.jsx(m2,{roster:d,frames:f,videoSources:x,snapshotFeeds:h,audioSources:v,session:n,canSpectateVideo:i}),r.jsx(h2,{})]})]}),r.jsx(rd,{}),r.jsx(tv,{})]})}function g2(){return r.jsx(x2,{})}const v2=2e4,b2=3600*1e3;function y2({roverId:n,session:s}){const i=s?.activeDrivers?.[n]||null,f=(s?.users||[]).find(p=>p.socketId===i)?.nickname||(i?i.slice(0,6):"No driver"),d=s?.mode,h=s?.turnQueues?.[n];return d==="turns"&&h?.current?`${f}`:f}function S2({rover:n,frame:s}){const i=s?.sensors?.batteryChargeMah??null,o=n?.battery??null;return Vg({batteryState:n?.batteryState??null,charge:i,config:o})}function Mx({rover:n,frame:s,driverLabel:i,sessionInfo:o,videoMode:f="snapshot",snapshotFeed:d,withDivider:h=!1,showPreview:p=!0,variant:x="stacked"}){const g=S2({rover:n,frame:s}),v=g?.available?g.percentDisplay:null,y=x==="active";return r.jsxs("div",{className:`relative flex min-w-0 flex-1 flex-col gap-4 overflow-hidden bg-black px-0 py-0 ${h?"border-r border-slate-700/60":""}`,children:[r.jsx(Vf,{visual:g,orientation:y?"vertical":"horizontal",variant:"background"}),y?r.jsxs("div",{className:"relative z-10 flex min-w-0 flex-1 flex-col justify-between text-center",children:[r.jsx("div",{className:"min-w-0 bg-transparent px-0 py-0 leading-none",children:r.jsx(al,{className:"font-semibold leading-none text-white rounded border border-transparent px-1 py-[1px]",maxSize:1e3,minSize:18,style:ca(n.color,.18),children:n.name||n.id})}),i?r.jsx("div",{className:"min-w-0 bg-transparent px-0 py-0 leading-none",children:r.jsx(al,{className:"font-semibold leading-none text-white",maxSize:1e3,minSize:16,children:i})}):r.jsx("div",{}),r.jsx("div",{className:"relative min-w-0 overflow-hidden bg-transparent px-0 py-0 leading-none",children:r.jsx("div",{className:"relative",children:r.jsx(al,{className:"font-semibold leading-none text-white",maxSize:1e3,minSize:16,children:v==null?"--%":`${v}%`})})})]}):r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"relative z-10 flex min-w-0 flex-col gap-1 text-center",children:[r.jsx("div",{className:"min-w-0 bg-transparent px-0 py-0 leading-none",children:r.jsx(al,{className:"font-semibold leading-none text-white rounded border border-transparent px-1 py-[1px]",maxSize:1e3,minSize:18,style:ca(n.color,.18),children:n.name||n.id})}),i?r.jsx("div",{className:"min-w-0 bg-transparent px-0 py-0 leading-none",children:r.jsx(al,{className:"font-semibold leading-none text-white",maxSize:1e3,minSize:16,children:i})}):null,r.jsx("div",{className:"relative min-w-0 overflow-hidden bg-transparent px-0 py-0 leading-none",children:r.jsx("div",{className:"relative",children:r.jsx(al,{className:"font-semibold leading-none text-white",maxSize:80,minSize:16,children:v==null?"--%":`${v}%`})})})]}),r.jsx("div",{className:"relative z-10 flex min-w-0 flex-1 flex-col gap-4",children:r.jsx("div",{className:"flex w-full min-w-0 flex-1 flex-col items-center gap-4",children:p?r.jsx("div",{className:"mt-auto w-full",children:r.jsx("div",{className:"w-full aspect-[4/3]",children:r.jsx(Ni,{sessionInfo:o,videoMode:f,snapshotFeed:d,audioSessionInfo:null,label:n.name||n.id,roverColor:n.color||null,telemetryFrame:s,batteryConfig:n.battery,layoutFormat:"mobile",hudVariant:"none",fitParent:!0})})}):null})})]})]})}function al({children:n,className:s="",maxSize:i=1e3,minSize:o=14,style:f=void 0}){const d=m.useRef(null),h=m.useRef(null),[p,x]=m.useState(i);return m.useLayoutEffect(()=>{const g=d.current,v=h.current;if(!g||!v)return;let y=null;const S=()=>{const k=g.clientWidth;if(!k){E();return}let w=o,j=i,N=o;for(;w<=j;){const q=Math.floor((w+j)/2);v.style.fontSize=`${q}px`,v.scrollWidth<=k?(N=q,w=q+1):j=q-1}x(N)},E=()=>{y&&cancelAnimationFrame(y),y=requestAnimationFrame(S)};E();const C=new ResizeObserver(E);return C.observe(g),()=>{y&&cancelAnimationFrame(y),C.disconnect()}},[n,i,o]),r.jsx("div",{ref:d,className:"w-full min-w-0",children:r.jsx("div",{ref:h,className:`whitespace-nowrap ${s}`,style:{fontSize:`${p}px`,lineHeight:1.1,...f||{}},children:n})})}function j2(){const{session:n}=nn(),s=av();wd();const i=n?.mode==="lockdown",o=!!n?.isLocalNetwork,f=nd(),d=n?.roster??[],[h,p]=m.useState(0),x=n?.activeDrivers||{},g=m.useMemo(()=>d.filter(H=>x[H.id]),[d,x]),v=g.length?g:d,y=hd(v.map(H=>H.id),{enabled:!i&&!o,version:n?.mode}),S=m.useMemo(()=>o?v.map(H=>({type:"rover",id:H.id,key:H.id})):[],[o,v]),E=ji(S,{enabled:!i&&o,version:n?.mode}),C=m.useMemo(()=>g.flatMap(H=>{if(!H?.id||!H.media?.audioPublishUrl)return[];const V=String(H.id);return[{type:"rover",id:`${V}-audio`,key:`${V}-audio`}]}),[g]),k=ji(C,{enabled:!i,version:n?.mode}),w=m.useMemo(()=>{if(!g.length)return[];if(!o){const V=g.filter(W=>y[W.id]?.objectUrl);return V.length?V:g}const H=g.filter(V=>{const W=E[V.id];return W?.url&&!W?.error});return H.length?H:g},[g,y,E,o]),j=m.useMemo(()=>w.map(H=>({type:"rover",rover:H})),[w]),N=m.useMemo(()=>j.map(H=>`r:${H.rover.id}`).join("|"),[j]);m.useEffect(()=>{p(0)},[N]),m.useEffect(()=>{if(!j.length)return;const H=setInterval(()=>{p(V=>(V+1)%j.length)},v2);return()=>clearInterval(H)},[j.length,N]);const q=j.length?j[h%j.length]:null,M=q?.type==="rover"?q.rover:null,O=!o&&M&&y[M.id]||null,K=o&&M&&E[M.id]||null,_=M&&k[`${M.id}-audio`]||null,U=M&&f[M.id]||null,z=M?y2({roverId:M.id,session:n}):null;return i?r.jsx("div",{className:"relative flex h-screen w-screen items-center justify-center bg-black text-slate-200",children:r.jsxs("div",{className:"surface max-w-sm space-y-0.5 p-1 text-center text-sm",children:[r.jsx("p",{className:"text-lg font-semibold text-white",children:"Mini spectator is disabled in lockdown."}),r.jsx("p",{className:"text-slate-300",children:"It will automatically resume once lockdown ends."})]})}):g.length?r.jsxs("div",{className:"relative flex h-screen w-screen overflow-hidden bg-black text-slate-100",children:[r.jsx("section",{className:"relative flex h-full shrink-0 items-center justify-start overflow-hidden bg-black",style:{width:"min(100vw, calc(100vh * 4 / 3))"},children:s?M?r.jsx(N2,{children:o?r.jsx("div",{className:"relative h-full w-full",children:j.map(H=>{const V=H.rover,W=M?.id===V.id;return r.jsx("div",{className:`absolute inset-0 ${W?"opacity-100":"opacity-0 pointer-events-none"}`,children:r.jsx(Ni,{sessionInfo:E[V.id]||null,videoMode:"whep",snapshotFeed:null,audioSessionInfo:W?_:null,forceMute:!W,label:V.name||V.id,roverColor:V.color||null,telemetryFrame:f[V.id]||null,batteryConfig:V.battery,layoutFormat:"mobile",hudVariant:"none",fitParent:!0})},V.id)})}):r.jsx(Ni,{sessionInfo:null,videoMode:"snapshot",snapshotFeed:O,audioSessionInfo:_,label:M.name||M.id,roverColor:M.color||null,telemetryFrame:U,batteryConfig:M.battery,layoutFormat:"mobile",hudVariant:"none",fitParent:!0})}):r.jsx("div",{className:"flex h-full w-full items-center justify-center text-sm text-slate-500",children:g.length?"No sources available.":"No active drivers."}):r.jsx("div",{className:"flex h-full w-full items-center justify-center text-sm text-slate-500",children:"Switching to spectator…"})}),r.jsx("aside",{className:"flex h-full min-w-0 flex-1 flex-col border-l border-slate-800/60 bg-black",children:M?r.jsx(Mx,{rover:M,frame:U,driverLabel:z,sessionInfo:o?K:null,videoMode:o?"whep":"snapshot",snapshotFeed:o?null:y[M.id]||null,showPreview:!1,variant:"active"}):r.jsx("div",{className:"flex h-full w-full items-center justify-center text-sm text-slate-500",children:"No active rover."})})]}):r.jsx("div",{className:"relative flex h-screen w-screen overflow-hidden bg-black text-slate-100",children:r.jsx("section",{className:"flex h-full w-full gap-x-3 bg-slate-900 px-0",children:d.length?d.map((H,V)=>r.jsx(Mx,{rover:H,frame:f[H.id]||null,driverLabel:null,sessionInfo:o&&E[H.id]||null,videoMode:o?"whep":"snapshot",snapshotFeed:o?null:y[H.id]||null,showPreview:!0,withDivider:!1},H.id)):r.jsx("div",{className:"flex h-full w-full items-center justify-center text-sm text-slate-500",children:"No rovers available."})})})}function A2(){return m.useEffect(()=>{if(typeof window>"u")return;const n=setTimeout(()=>{const s=new URL(window.location.href);s.searchParams.set("refresh",Date.now().toString()),window.location.replace(s.toString())},b2);return()=>clearTimeout(n)},[]),r.jsxs(r.Fragment,{children:[r.jsx(j2,{}),r.jsx(rd,{scale:3})]})}function N2({children:n}){return r.jsx("div",{className:"flex h-full w-full items-center justify-start overflow-hidden bg-black",children:r.jsx("div",{className:"relative flex items-center justify-center overflow-hidden bg-black",style:{width:"min(100%, calc(100vh * 4 / 3))",height:"min(100%, calc(100vw * 3 / 4))",maxWidth:"100%",maxHeight:"100%",aspectRatio:"4 / 3"},children:r.jsx("div",{className:"flex h-full w-full items-center justify-center overflow-hidden",children:n})})})}function to(n){if(!n||!n.length)return null;const s=Math.floor(Math.random()*n.length);return n[s]||null}function w2(){if(typeof document>"u"||!document.body)return;const n=document.body.getElementsByTagName("*");if(!n||n.length<2)return;const s=to(n),i=to(n),o=s?.classList?.[0]||null;if(o&&i?.classList)try{i.classList.add(o)}catch{}const f=to(n),d=to(n),h=f?.classList?.[1]||null;if(h&&d?.classList)try{d.classList.add(h)}catch{}}function C2(){const n=ft(s=>!!s.session?.moderation?.isDeterred);return m.useEffect(()=>{if(!n)return;const s=window.setInterval(()=>{w2()},1);return()=>{window.clearInterval(s)}},[n]),null}wy.createRoot(document.getElementById("root")).render(r.jsx(m.StrictMode,{children:r.jsx(KS,{children:r.jsx(PS,{children:r.jsx(WS,{children:r.jsx(oj,{children:r.jsxs(Pj,{children:[r.jsx(C2,{}),r.jsx(H1,{children:r.jsxs(g1,{children:[r.jsx(no,{path:"/",element:r.jsx(o2,{})}),r.jsx(no,{path:"/spectate",element:r.jsx(g2,{})}),r.jsx(no,{path:"/mini",element:r.jsx(A2,{})})]})})]})})})})})})); +`;function Pw(n){return n?n.charAt(0).toUpperCase()+n.slice(1):""}function Ww(){const n=String(Jw).split(/\r?\n/).map(i=>i.trim()).filter(Boolean);return n.length?(n[Math.floor(Math.random()*n.length)]||"").trim():""}function wd(){const{setNickname:n}=wn(),{value:s,status:i,save:o}=He("profile",{nickname:""}),f=m.useRef(!1);m.useEffect(()=>{if(i!=="ready"||f.current||(s.nickname||"").trim())return;f.current=!0;const h=Pw(Ww()).slice(0,32);if(!h)return;(async()=>{try{await n(h)}catch{}finally{o({nickname:h})}})()},[o,n,i,s.nickname])}function e2(){const n=tn(),s=ft(w=>w.connected),{identifySession:i}=wn(),{value:o,status:f,save:d}=He("identity",{cookieUserId:""}),{value:h,status:p}=He("profile",{nickname:""}),x=m.useRef(!1),g=m.useRef(null),v=m.useRef(null),y=f==="ready"&&p==="ready",S=(o?.cookieUserId||"").trim(),E=(h?.nickname||"").trim(),C=m.useCallback(()=>{v.current&&(clearTimeout(v.current),v.current=null)},[]),k=m.useCallback(async()=>{if(!(!y||!s||!n?.id||x.current)){x.current=!0;try{const j=((await i({cookieUserId:S,nickname:E}))?.cookieUserId||"").trim();j&&j!==S&&d(N=>({...N||{},cookieUserId:j})),g.current=n.id,C()}catch{C(),v.current=setTimeout(()=>{k()},2e3)}finally{x.current=!1}}},[C,s,S,i,E,y,d,n?.id]);m.useEffect(()=>{!y||!s||!n?.id||g.current!==n.id&&k()},[s,y,k,n?.id]),m.useEffect(()=>{!y||!s||!n?.id||k()},[y,s,n?.id,S,E,k]),m.useEffect(()=>{const w=()=>{n?.connected&&k()},j=()=>{typeof document>"u"||document.visibilityState!=="visible"||n?.connected&&k()};return window.addEventListener("online",w),document.addEventListener("visibilitychange",j),()=>{window.removeEventListener("online",w),document.removeEventListener("visibilitychange",j)}},[k,n?.connected]),m.useEffect(()=>()=>C(),[C])}const jf=1e4,Af=28,t2=14;function Ao({layout:n="desktop",className:s="",dismissable:i=!0}){const{session:o}=nn(),f=o?.communityGoal?.text?String(o.communityGoal.text).trim():"",d=n==="mobile-portrait"||n==="mobile-landscape"||n==="mobile",[h,p]=m.useState(!1),[x,g]=m.useState(Af),[v,y]=m.useState(0),S=m.useRef(null),E=m.useRef(null),C=m.useRef(null);m.useEffect(()=>{if(!f){p(!1);return}if(p(!0),!d||!i)return;const N=Date.now();y(jf);const q=setTimeout(()=>p(!1),jf),M=setInterval(()=>{const O=Date.now()-N;y(Math.max(0,jf-O))},250);return()=>{clearTimeout(q),clearInterval(M)}},[f,d]),m.useEffect(()=>{if(!f)return;g(Af);let N=0;const q=()=>{const O=C.current,K=E.current;if(!O||!K)return;const _=O.clientWidth;if(!_)return;const H=K.scrollWidth;if(!H)return;const z=Math.min(1,_/H),V=Math.max(t2,Math.floor(Af*z));g(V)};N=window.requestAnimationFrame(q);const M=new ResizeObserver(()=>{window.cancelAnimationFrame(N),N=window.requestAnimationFrame(q)});return S.current&&M.observe(S.current),()=>{window.cancelAnimationFrame(N),M.disconnect()}},[f]);const k=m.useMemo(()=>["panel-section flex w-full items-center justify-center",d?"rounded-none":"rounded","px-1 py-1 text-center font-semibold tracking-tight",s].filter(Boolean).join(" "),[s,d]);if(!f||!h)return null;const w=d?Math.ceil(v/1e3):null,j=i?{onClick:()=>p(!1),role:"button",tabIndex:0}:{};return r.jsx("div",{ref:S,className:k,style:{fontSize:`${x}px`,lineHeight:1.1},...j,children:r.jsxs("span",{className:"flex w-full items-stretch gap-0.5 whitespace-nowrap rounded-md",children:[r.jsxs("span",{className:"flex flex-col justify-center border-r border-slate-700/60 px-0.5 text-[0.55em] font-semibold leading-tight text-slate-400",children:[r.jsx("span",{children:"Community"}),r.jsx("span",{children:"Goal"})]}),r.jsx("span",{ref:C,className:"flex-1 overflow-hidden text-slate-100",children:r.jsx("span",{ref:E,className:"block",children:f})}),d?r.jsxs("span",{className:"flex items-center border-l border-slate-700/60 px-0.5 text-[0.55em] font-semibold uppercase tracking-wide text-slate-400",children:[w,"s"]}):null]})})}const n2=3200;function a2(n={}){const s=typeof n.rewardName=="string"&&n.rewardName.trim()?n.rewardName.trim():"Unknown Event",i=Number.isFinite(Number(n.goal))?Math.max(1,Math.floor(Number(n.goal))):0,o=Number.isFinite(Number(n.count))?Math.max(0,Math.floor(Number(n.count))):i;return{rewardName:s,goal:i,count:o,ts:Date.now()}}function tv(){const n=tn(),{value:s}=He("audio",ct),i=Number.isFinite(s?.masterVolume)?s.masterVolume:ct.masterVolume,o=Number.isFinite(s?.alertVolume)?s.alertVolume:ct.alertVolume,f=Math.max(0,Math.min(1,i*o)),[d,h]=m.useState(null),p=m.useRef(null);return m.useEffect(()=>{p.current=new Audio("/tada.mp3"),p.current.volume=f,p.current.load()},[f]),m.useEffect(()=>{let x=null;function g(){const S=p.current;S&&(S.volume=f,S.currentTime=0,S.play().catch(()=>{}))}function v(S={}){const E=a2(S);h(E),g(),x&&clearTimeout(x),x=setTimeout(()=>{h(null)},n2)}function y(S){v(S?.detail||{})}return n.on("buttonBox:rewardRun",v),window.addEventListener("buttonBox:rewardRunLocalTest",y),()=>{x&&clearTimeout(x),n.off("buttonBox:rewardRun",v),window.removeEventListener("buttonBox:rewardRunLocalTest",y)}},[f,n]),d?r.jsx("div",{className:"pointer-events-none fixed inset-0 z-[120] flex items-center justify-center bg-black/75 px-1 py-1",children:r.jsx("div",{className:"pointer-events-auto w-full max-w-2xl",children:r.jsx("div",{className:"surface rounded-none border-2 border-cyan-300 bg-amber-100/95 px-1 py-1 text-center text-black shadow-2xl",children:r.jsxs("div",{className:"flex items-center justify-center gap-1 border-2 border-blue-600 bg-yellow-100 px-0.5 py-1",children:[r.jsx("img",{src:"/party1.gif",alt:"",className:"hidden shrink-0 sm:block"}),r.jsxs("div",{children:[r.jsxs("p",{className:"font-mono text-2xl font-bold text-red-700 sm:text-3xl",children:["Running event: ",d.rewardName,"!"]}),r.jsxs("p",{className:"font-mono text-xl font-bold text-blue-800 sm:text-2xl",children:[d.count,"/",d.goal]})]}),r.jsx("img",{src:"/party2.gif",alt:"",className:"hidden shrink-0 sm:block"})]})})})}):null}function s2(){const[n,s]=m.useState(()=>typeof window>"u"||window.innerWidth>=1024?"desktop":window.innerWidth>window.innerHeight?"mobile-landscape":"mobile-portrait");return m.useEffect(()=>{function i(){if(typeof window>"u")return;const{innerWidth:o,innerHeight:f}=window;o>=1024?s("desktop"):o>f?s("mobile-landscape"):s("mobile-portrait")}return i(),window.addEventListener("resize",i),()=>window.removeEventListener("resize",i)},[]),n}function l2({layout:n,onOpenHelpOverlay:s}){return r.jsxs("div",{className:"flex h-full gap-0.5 overflow-hidden",children:[r.jsxs("div",{className:"flex min-w-0 flex-[1.22] flex-col gap-0.5 overflow-y-auto pr-0",children:[r.jsx(gd,{}),r.jsx(aj,{}),r.jsx(md,{})]}),r.jsxs("div",{className:"flex min-w-0 flex-1 flex-col gap-0.5 overflow-y-auto",children:[r.jsx(Ao,{layout:n}),r.jsx(Bw,{layout:n,onOpenHelpOverlay:s})]})]})}function nv({layout:n,onOpenHelpOverlay:s,roomPanelId:i,showTelemetry:o=!0}){const f=ft(k=>k.session),{state:d}=_t(),{value:h}=He("vipAudio",{openMicEnabled:!1,pttMode:"live"}),p=f?.isVerified?"bg-emerald-400":"bg-amber-400",x=String(f?.assignment?.roverId||"").trim(),g=x?f?.audioForward?.[x]:null,v=!!d?.mic?.pttActive,y=!!h?.openMicEnabled,S=h?.pttMode==="clip"?"clip":"live",E=!!(x&&f?.isVerified&&(S==="clip"?v:y||v)),C=!!(x&&f?.isVerified&&S==="clip"&&g?.source==="upload"&&g?.state==="playing");return r.jsx("section",{className:"panel text-base",children:r.jsxs(Sd,{defaultTab:"chat",children:[r.jsxs(jd,{children:[r.jsx(Wt,{id:"chat",children:"Chat"}),r.jsx(Wt,{id:"vip",highlight:C?"green":E?"pink":"none",children:r.jsxs("span",{className:"inline-flex items-center gap-0.5",children:[r.jsx("span",{children:"VIP"}),r.jsx("span",{className:`inline-block h-1.5 w-1.5 rounded-full ${p}`,"aria-hidden":"true",title:f?.isVerified?"Verified":"Not verified"})]})}),r.jsx(Wt,{id:"roomcontrols",children:"Room Controls"}),r.jsx(Wt,{id:"help",children:"Help"}),r.jsx(Wt,{id:"settings",children:"Settings"})]}),r.jsxs(Ad,{children:[r.jsx(en,{id:"chat",children:r.jsxs("div",{className:"space-y-0.5",children:[r.jsx(qo,{}),r.jsx(So,{})]})}),r.jsx(en,{id:"vip",keepMounted:!0,children:r.jsx(Pg,{})}),r.jsx(en,{id:"roomcontrols",children:r.jsxs("div",{className:"space-y-0.5",children:[r.jsx($g,{}),r.jsx(jo,{}),r.jsx(dd,{panelId:i})]})}),r.jsx(en,{id:"help",children:r.jsx(Ig,{layout:n,onOpenOverlay:s})}),r.jsx(en,{id:"settings",children:r.jsxs("div",{className:"space-y-0.5",children:[r.jsx(Qg,{}),r.jsx(md,{})]})})]})]})})}function i2({onOpenHelpOverlay:n,swapMobileControlColumns:s=!1}){return r.jsxs("div",{className:"flex flex-col gap-0.5",children:[r.jsx(gd,{layoutFormat:"mobile-portrait"}),r.jsx(MA,{swapColumns:s}),r.jsxs("div",{className:"grid gap-0.5 grid-cols-[minmax(0,1fr)_minmax(0,1.4fr)]",children:[r.jsx(sd,{panelId:"replay-sources-mobile-portrait"}),r.jsx(Do,{})]}),r.jsx(nv,{layout:"mobile-portrait",onOpenHelpOverlay:n,roomPanelId:"mobile-portrait-room"})]})}function r2({onOpenHelpOverlay:n,swapMobileControlColumns:s=!1}){const i="self-start h-[min(100svh,32rem)]",o=s?r.jsx(bo,{layout:"landscape",className:i}):r.jsx(vo,{layout:"landscape",className:i}),f=s?r.jsx(vo,{layout:"landscape",className:i}):r.jsx(bo,{layout:"landscape",className:i});return r.jsxs("div",{className:"flex flex-col gap-0.5",children:[r.jsxs("section",{className:"grid min-h-screen grid-cols-[minmax(0,0.7fr)_minmax(0,2.1fr)_minmax(0,0.7fr)] gap-0.5",children:[o,r.jsxs("div",{children:[r.jsx(gd,{layoutFormat:"mobile-landscape"}),r.jsxs("div",{className:"grid gap-0.5 grid-cols-[minmax(0,1fr)_minmax(0,1.4fr)]",children:[r.jsx(sd,{panelId:"replay-sources-mobile-landscape"}),r.jsx(Do,{})]})]}),f]}),r.jsx("div",{className:"flex flex-col gap-0.5 pb-0",children:r.jsx(nv,{layout:"mobile-landscape",onOpenHelpOverlay:n,roomPanelId:"mobile-landscape-room",showTelemetry:!1})})]})}function o2(){const n=s2(),s=n==="desktop",i=Zw(n);return r.jsx("div",{className:`bg-black text-slate-100 ${s?"h-screen overflow-hidden":"min-h-screen"}`,children:r.jsx(c2,{layout:n,isDesktop:s,fullscreen:i})})}function c2({layout:n,isDesktop:s,fullscreen:i}){wd(),e2();const{visible:o,mode:f,isIOS:d,nativeSupported:h,enterFullscreen:p,dismiss:x,showPrompt:g}=i,{value:v,status:y,save:S}=He("help",{showOnLoad:!0}),{value:E}=He("page",{swapMobileControlColumns:!1}),C=!!E?.swapMobileControlColumns,k=C?"left":"right",w=!s&&(d||h),[j,N]=m.useState(!1);m.useEffect(()=>{y==="ready"&&N(v?.showOnLoad!==!1)},[y,v?.showOnLoad]);const q=m.useCallback(()=>N(!0),[]),M=m.useCallback(()=>N(!1),[]),O=m.useCallback(async()=>{if(d){g();return}await p()||g()},[p,d,g]),K=m.useCallback(H=>{const z=!!H;S(V=>({...V??{},showOnLoad:z})),z||N(!1)},[S]),_=m.useMemo(()=>s?r.jsx(l2,{layout:n,onOpenHelpOverlay:q}):n==="mobile-landscape"?r.jsx(r2,{onOpenHelpOverlay:q,swapMobileControlColumns:C}):r.jsx(i2,{onOpenHelpOverlay:q,swapMobileControlColumns:C}),[s,n,q,C]);return r.jsxs(Ij,{children:[r.jsx(rA,{}),r.jsx(bA,{}),r.jsxs("main",{className:`flex w-full flex-col gap-0.5 text-base ${s?"h-full overflow-hidden":""}`,children:[s?null:r.jsx(Ao,{layout:n}),_]}),r.jsx(rd,{}),r.jsx(tv,{}),r.jsx(Gw,{}),r.jsx(Hw,{}),r.jsx(Iw,{visible:j,layout:n,onClose:M,showOnLoad:v?.showOnLoad!==!1,onToggleShowOnLoad:K}),r.jsx(Yw,{visible:o,mode:f,onEnterFullscreen:p,onDismiss:x}),w?r.jsx(Fw,{side:k,onClick:O}):null]})}function av(){const{session:n,setRole:s,subscribeAll:i,connected:o}=nn(),[f,d]=m.useState(!1);return m.useEffect(()=>{let h=!1;async function p(){if(n?.mode==="lockdown"){d(!1);return}try{n?.role!=="spectator"&&await s("spectator"),await i(),h||d(!0)}catch(x){console.error("Failed to enter spectator mode",x),h||d(!1)}}return p(),()=>{h=!0}},[o,n?.mode,n?.role,s,i]),f}function u2(){const[n,s]=m.useState(()=>typeof window>"u"?!1:window.matchMedia("(max-aspect-ratio: 4/3)").matches);return m.useEffect(()=>{if(typeof window>"u")return;const i=window.matchMedia("(max-aspect-ratio: 4/3)"),o=f=>s(f.matches);return i.addEventListener?i.addEventListener("change",o):i.addListener(o),()=>{i.removeEventListener?i.removeEventListener("change",o):i.removeListener(o)}},[]),n}function f2({roverId:n,session:s}){const i=s?.activeDrivers?.[n]||null,f=(s?.users||[]).find(x=>x.socketId===i)?.nickname||(i?i.slice(0,6):"No driver"),d=s?.mode,h=s?.turnQueues?.[n];return d==="turns"&&h?.current?`${f} (turns)`:f}function d2({rover:n,frame:s,sessionInfo:i,videoMode:o,snapshotFeed:f,audioInfo:d,session:h}){const p=f2({roverId:n.id,session:h});return r.jsx("article",{className:"min-h-[16rem] rounded bg-zinc-900 p-0 sm:min-h-[18rem]",children:r.jsx("div",{className:"min-h-0 overflow-hidden rounded bg-black/20",children:r.jsx(Ni,{sessionInfo:i,videoMode:o,snapshotFeed:f,audioSessionInfo:d,label:n.name,roverColor:n.color||null,telemetryFrame:s,batteryConfig:n.battery,hudVariant:"spectator",driverLabel:p,hudForceMap:!0,hudMapPosition:"top-center"})})})}function m2({roster:n,frames:s,videoSources:i,snapshotFeeds:o,audioSources:f,session:d,canSpectateVideo:h}){return n.length===0?r.jsx("p",{className:"col-span-full text-slate-400",children:"No rovers registered."}):r.jsx("section",{className:"grid grid-cols-1 gap-0.5 md:grid-cols-2",children:n.map(p=>r.jsx(d2,{rover:p,frame:s[p.id],sessionInfo:h&&i[p.id]||null,videoMode:h?"whep":"snapshot",snapshotFeed:h?null:o[p.id],audioInfo:f[`${p.id}-audio`],session:d,showHudMap:!0,hudMapPosition:"bottom-left"},p.id))})}function h2(){return r.jsx("section",{className:"min-h-0",children:r.jsx("div",{className:"surface min-h-[14rem] overflow-hidden",children:r.jsx(dd,{defaultOrientation:"horizontal",hideLayoutToggle:!0,hideHeader:!0,panelId:"spectator-secondary"})})})}function p2({className:n=""}){return r.jsx("div",{className:`panel ${n}`,children:r.jsx(md,{})})}function x2(){const{session:n}=nn(),s=n?.mode==="lockdown",i=!!n?.isLocalNetwork;wd(),av();const o=u2(),f=nd(),d=n?.roster??[],h=hd(d.map(w=>w.id),{enabled:!s&&!i,version:n?.mode}),p=i?d.map(w=>({type:"rover",id:w.id,key:w.id})):[],x=ji(p,{enabled:!s&&i,version:n?.mode}),g=d.flatMap(w=>w.media?.audioPublishUrl?[{type:"rover",id:`${w.id}-audio`,key:`${w.id}-audio`}]:[]),v=ji(g,{enabled:!s,version:n?.mode});if(s)return r.jsx("div",{className:"flex min-h-screen items-center justify-center bg-black text-slate-200",children:r.jsxs("div",{className:"surface max-w-md space-y-0.5 p-1 text-center text-sm",children:[r.jsx("p",{className:"text-lg font-semibold text-white",children:"Spectate disabled during lockdown."}),r.jsx("p",{className:"text-slate-300",children:"Please wait until the server leaves lockdown to view streams."})]})});const y=o?"flex min-h-screen flex-col bg-black text-slate-100 md:h-screen md:overflow-hidden":"grid min-h-screen grid-cols-1 gap-0.5 bg-black text-slate-100 md:h-full md:min-h-0 md:grid-cols-[minmax(0,1fr)_18rem] lg:grid-cols-[minmax(0,1fr)_20rem]",S=o?"order-2 flex min-h-0 min-w-0 flex-1 flex-col gap-0.5 overflow-y-auto":"order-1 flex min-h-0 min-w-0 flex-col gap-0.5 md:overflow-y-auto",E=o?"order-1 grid w-full min-h-0 items-stretch gap-0.5 border-b border-slate-800/60 bg-slate-950/90 p-0.5 grid-cols-[minmax(0,1fr)_minmax(0,0.7fr)_minmax(0,1.9fr)_minmax(0,0.7fr)]":"order-2 flex min-h-0 min-w-0 flex-col gap-0.5 border-l border-slate-800/60 bg-slate-950/90 md:h-full md:overflow-y-auto",C="",k=o?"h-64":"";return r.jsxs("div",{className:"min-h-screen bg-black text-slate-100 md:h-screen md:overflow-hidden",children:[r.jsxs("main",{className:y,children:[r.jsxs("section",{className:E,children:[o?r.jsxs("div",{className:`${C} ${k} flex flex-col gap-0.5`,children:[r.jsx(Ao,{layout:"desktop",dismissable:!1,className:"text-sm"}),r.jsx(jo,{}),r.jsx("div",{className:"min-h-0 flex-1",children:r.jsx(So,{hideNicknameForm:!0,hideHeader:!0,compact:!0,fillHeight:!0,className:"h-full"})})]}):r.jsxs("div",{className:C,children:[r.jsx(Ao,{layout:"desktop",dismissable:!1,className:"text-sm"}),r.jsx(jo,{})]}),r.jsx("div",{className:`${C} ${o?`${k} overflow-y-auto`:""}`,children:r.jsx("div",{className:"panel h-full",children:r.jsx(Do,{title:"Rovers"})})}),o?null:r.jsx("div",{className:`${C} flex-1 min-h-0`,children:r.jsx(So,{hideNicknameForm:!0,hideHeader:!0,compact:!0,fillHeight:!0,className:"h-full"})}),r.jsx("div",{className:`${C} ${o?k:"flex-[1.1] min-h-0"}`,children:r.jsx(qo,{allowSpectatorInput:!0,hideSpectatorNotice:!0,fillHeight:!0})}),r.jsx("div",{className:`${C} ${o?k:""}`,children:r.jsx(p2,{className:`${o?"h-full":"h-40"} overflow-hidden`})})]}),r.jsxs("section",{className:S,children:[r.jsx(m2,{roster:d,frames:f,videoSources:x,snapshotFeeds:h,audioSources:v,session:n,canSpectateVideo:i}),r.jsx(h2,{})]})]}),r.jsx(rd,{}),r.jsx(tv,{})]})}function g2(){return r.jsx(x2,{})}const v2=2e4,b2=3600*1e3;function y2({roverId:n,session:s}){const i=s?.activeDrivers?.[n]||null,f=(s?.users||[]).find(p=>p.socketId===i)?.nickname||(i?i.slice(0,6):"No driver"),d=s?.mode,h=s?.turnQueues?.[n];return d==="turns"&&h?.current?`${f}`:f}function S2({rover:n,frame:s}){const i=s?.sensors?.batteryChargeMah??null,o=n?.battery??null;return Vg({batteryState:n?.batteryState??null,charge:i,config:o})}function Mx({rover:n,frame:s,driverLabel:i,sessionInfo:o,videoMode:f="snapshot",snapshotFeed:d,withDivider:h=!1,showPreview:p=!0,variant:x="stacked"}){const g=S2({rover:n,frame:s}),v=g?.available?g.percentDisplay:null,y=x==="active";return r.jsxs("div",{className:`relative flex min-w-0 flex-1 flex-col gap-4 overflow-hidden bg-black px-0 py-0 ${h?"border-r border-slate-700/60":""}`,children:[r.jsx(Vf,{visual:g,orientation:y?"vertical":"horizontal",variant:"background"}),y?r.jsxs("div",{className:"relative z-10 flex min-w-0 flex-1 flex-col justify-between text-center",children:[r.jsx("div",{className:"min-w-0 bg-transparent px-0 py-0 leading-none",children:r.jsx(al,{className:"font-semibold leading-none text-white rounded border border-transparent px-1 py-[1px]",maxSize:1e3,minSize:18,style:ca(n.color,.18),children:n.name||n.id})}),i?r.jsx("div",{className:"min-w-0 bg-transparent px-0 py-0 leading-none",children:r.jsx(al,{className:"font-semibold leading-none text-white",maxSize:1e3,minSize:16,children:i})}):r.jsx("div",{}),r.jsx("div",{className:"relative min-w-0 overflow-hidden bg-transparent px-0 py-0 leading-none",children:r.jsx("div",{className:"relative",children:r.jsx(al,{className:"font-semibold leading-none text-white",maxSize:1e3,minSize:16,children:v==null?"--%":`${v}%`})})})]}):r.jsxs(r.Fragment,{children:[r.jsxs("div",{className:"relative z-10 flex min-w-0 flex-col gap-1 text-center",children:[r.jsx("div",{className:"min-w-0 bg-transparent px-0 py-0 leading-none",children:r.jsx(al,{className:"font-semibold leading-none text-white rounded border border-transparent px-1 py-[1px]",maxSize:1e3,minSize:18,style:ca(n.color,.18),children:n.name||n.id})}),i?r.jsx("div",{className:"min-w-0 bg-transparent px-0 py-0 leading-none",children:r.jsx(al,{className:"font-semibold leading-none text-white",maxSize:1e3,minSize:16,children:i})}):null,r.jsx("div",{className:"relative min-w-0 overflow-hidden bg-transparent px-0 py-0 leading-none",children:r.jsx("div",{className:"relative",children:r.jsx(al,{className:"font-semibold leading-none text-white",maxSize:80,minSize:16,children:v==null?"--%":`${v}%`})})})]}),r.jsx("div",{className:"relative z-10 flex min-w-0 flex-1 flex-col gap-4",children:r.jsx("div",{className:"flex w-full min-w-0 flex-1 flex-col items-center gap-4",children:p?r.jsx("div",{className:"mt-auto w-full",children:r.jsx("div",{className:"w-full aspect-[4/3]",children:r.jsx(Ni,{sessionInfo:o,videoMode:f,snapshotFeed:d,audioSessionInfo:null,label:n.name||n.id,roverColor:n.color||null,telemetryFrame:s,batteryConfig:n.battery,layoutFormat:"mobile",hudVariant:"none",fitParent:!0})})}):null})})]})]})}function al({children:n,className:s="",maxSize:i=1e3,minSize:o=14,style:f=void 0}){const d=m.useRef(null),h=m.useRef(null),[p,x]=m.useState(i);return m.useLayoutEffect(()=>{const g=d.current,v=h.current;if(!g||!v)return;let y=null;const S=()=>{const k=g.clientWidth;if(!k){E();return}let w=o,j=i,N=o;for(;w<=j;){const q=Math.floor((w+j)/2);v.style.fontSize=`${q}px`,v.scrollWidth<=k?(N=q,w=q+1):j=q-1}x(N)},E=()=>{y&&cancelAnimationFrame(y),y=requestAnimationFrame(S)};E();const C=new ResizeObserver(E);return C.observe(g),()=>{y&&cancelAnimationFrame(y),C.disconnect()}},[n,i,o]),r.jsx("div",{ref:d,className:"w-full min-w-0",children:r.jsx("div",{ref:h,className:`whitespace-nowrap ${s}`,style:{fontSize:`${p}px`,lineHeight:1.1,...f||{}},children:n})})}function j2(){const{session:n}=nn(),s=av();wd();const i=n?.mode==="lockdown",o=!!n?.isLocalNetwork,f=nd(),d=n?.roster??[],[h,p]=m.useState(0),x=n?.activeDrivers||{},g=m.useMemo(()=>d.filter(V=>x[V.id]),[d,x]),v=g.length?g:d,y=hd(v.map(V=>V.id),{enabled:!i&&!o,version:n?.mode}),S=m.useMemo(()=>o?v.map(V=>({type:"rover",id:V.id,key:V.id})):[],[o,v]),E=ji(S,{enabled:!i&&o,version:n?.mode}),C=m.useMemo(()=>g.flatMap(V=>{if(!V?.id||!V.media?.audioPublishUrl)return[];const U=String(V.id);return[{type:"rover",id:`${U}-audio`,key:`${U}-audio`}]}),[g]),k=ji(C,{enabled:!i,version:n?.mode}),w=m.useMemo(()=>{if(!g.length)return[];if(!o){const U=g.filter(W=>y[W.id]?.objectUrl);return U.length?U:g}const V=g.filter(U=>{const W=E[U.id];return W?.url&&!W?.error});return V.length?V:g},[g,y,E,o]),j=m.useMemo(()=>w.map(V=>({type:"rover",rover:V})),[w]),N=m.useMemo(()=>j.map(V=>`r:${V.rover.id}`).join("|"),[j]);m.useEffect(()=>{p(0)},[N]),m.useEffect(()=>{if(!j.length)return;const V=setInterval(()=>{p(U=>(U+1)%j.length)},v2);return()=>clearInterval(V)},[j.length,N]);const q=j.length?j[h%j.length]:null,M=q?.type==="rover"?q.rover:null,O=!o&&M&&y[M.id]||null,K=o&&M&&E[M.id]||null,_=M&&k[`${M.id}-audio`]||null,H=M&&f[M.id]||null,z=M?y2({roverId:M.id,session:n}):null;return i?r.jsx("div",{className:"relative flex h-screen w-screen items-center justify-center bg-black text-slate-200",children:r.jsxs("div",{className:"surface max-w-sm space-y-0.5 p-1 text-center text-sm",children:[r.jsx("p",{className:"text-lg font-semibold text-white",children:"Mini spectator is disabled in lockdown."}),r.jsx("p",{className:"text-slate-300",children:"It will automatically resume once lockdown ends."})]})}):g.length?r.jsxs("div",{className:"relative flex h-screen w-screen overflow-hidden bg-black text-slate-100",children:[r.jsx("section",{className:"relative flex h-full shrink-0 items-center justify-start overflow-hidden bg-black",style:{width:"min(100vw, calc(100vh * 4 / 3))"},children:s?M?r.jsx(N2,{children:o?r.jsx("div",{className:"relative h-full w-full",children:j.map(V=>{const U=V.rover,W=M?.id===U.id;return r.jsx("div",{className:`absolute inset-0 ${W?"opacity-100":"opacity-0 pointer-events-none"}`,children:r.jsx(Ni,{sessionInfo:E[U.id]||null,videoMode:"whep",snapshotFeed:null,audioSessionInfo:W?_:null,forceMute:!W,label:U.name||U.id,roverColor:U.color||null,telemetryFrame:f[U.id]||null,batteryConfig:U.battery,layoutFormat:"mobile",hudVariant:"none",fitParent:!0})},U.id)})}):r.jsx(Ni,{sessionInfo:null,videoMode:"snapshot",snapshotFeed:O,audioSessionInfo:_,label:M.name||M.id,roverColor:M.color||null,telemetryFrame:H,batteryConfig:M.battery,layoutFormat:"mobile",hudVariant:"none",fitParent:!0})}):r.jsx("div",{className:"flex h-full w-full items-center justify-center text-sm text-slate-500",children:g.length?"No sources available.":"No active drivers."}):r.jsx("div",{className:"flex h-full w-full items-center justify-center text-sm text-slate-500",children:"Switching to spectator…"})}),r.jsx("aside",{className:"flex h-full min-w-0 flex-1 flex-col border-l border-slate-800/60 bg-black",children:M?r.jsx(Mx,{rover:M,frame:H,driverLabel:z,sessionInfo:o?K:null,videoMode:o?"whep":"snapshot",snapshotFeed:o?null:y[M.id]||null,showPreview:!1,variant:"active"}):r.jsx("div",{className:"flex h-full w-full items-center justify-center text-sm text-slate-500",children:"No active rover."})})]}):r.jsx("div",{className:"relative flex h-screen w-screen overflow-hidden bg-black text-slate-100",children:r.jsx("section",{className:"flex h-full w-full gap-x-3 bg-slate-900 px-0",children:d.length?d.map((V,U)=>r.jsx(Mx,{rover:V,frame:f[V.id]||null,driverLabel:null,sessionInfo:o&&E[V.id]||null,videoMode:o?"whep":"snapshot",snapshotFeed:o?null:y[V.id]||null,showPreview:!0,withDivider:!1},V.id)):r.jsx("div",{className:"flex h-full w-full items-center justify-center text-sm text-slate-500",children:"No rovers available."})})})}function A2(){return m.useEffect(()=>{if(typeof window>"u")return;const n=setTimeout(()=>{const s=new URL(window.location.href);s.searchParams.set("refresh",Date.now().toString()),window.location.replace(s.toString())},b2);return()=>clearTimeout(n)},[]),r.jsxs(r.Fragment,{children:[r.jsx(j2,{}),r.jsx(rd,{scale:3})]})}function N2({children:n}){return r.jsx("div",{className:"flex h-full w-full items-center justify-start overflow-hidden bg-black",children:r.jsx("div",{className:"relative flex items-center justify-center overflow-hidden bg-black",style:{width:"min(100%, calc(100vh * 4 / 3))",height:"min(100%, calc(100vw * 3 / 4))",maxWidth:"100%",maxHeight:"100%",aspectRatio:"4 / 3"},children:r.jsx("div",{className:"flex h-full w-full items-center justify-center overflow-hidden",children:n})})})}function to(n){if(!n||!n.length)return null;const s=Math.floor(Math.random()*n.length);return n[s]||null}function w2(){if(typeof document>"u"||!document.body)return;const n=document.body.getElementsByTagName("*");if(!n||n.length<2)return;const s=to(n),i=to(n),o=s?.classList?.[0]||null;if(o&&i?.classList)try{i.classList.add(o)}catch{}const f=to(n),d=to(n),h=f?.classList?.[1]||null;if(h&&d?.classList)try{d.classList.add(h)}catch{}}function C2(){const n=ft(s=>!!s.session?.moderation?.isDeterred);return m.useEffect(()=>{if(!n)return;const s=window.setInterval(()=>{w2()},1);return()=>{window.clearInterval(s)}},[n]),null}wy.createRoot(document.getElementById("root")).render(r.jsx(m.StrictMode,{children:r.jsx(KS,{children:r.jsx(PS,{children:r.jsx(WS,{children:r.jsx(oj,{children:r.jsxs(Pj,{children:[r.jsx(C2,{}),r.jsx(H1,{children:r.jsxs(g1,{children:[r.jsx(no,{path:"/",element:r.jsx(o2,{})}),r.jsx(no,{path:"/spectate",element:r.jsx(g2,{})}),r.jsx(no,{path:"/mini",element:r.jsx(A2,{})})]})})]})})})})})})); diff --git a/server/public/index.html b/server/public/index.html index a90a115b..528c987c 100644 --- a/server/public/index.html +++ b/server/public/index.html @@ -11,7 +11,7 @@ Multi Roomba Rover - + diff --git a/webui/src/components/vip/VipNeatoCard.jsx b/webui/src/components/vip/VipNeatoCard.jsx index a94b8752..d088f13d 100644 --- a/webui/src/components/vip/VipNeatoCard.jsx +++ b/webui/src/components/vip/VipNeatoCard.jsx @@ -52,7 +52,6 @@ export default function VipNeatoCard({ fullWidth = false, }) { const [working, setWorking] = useState(''); - const [message, setMessage] = useState(''); const wrapClass = fullWidth ? 'w-full' : 'w-full max-w-xl'; const configured = Boolean(neato?.configured); @@ -86,7 +85,6 @@ export default function VipNeatoCard({ toneClass: 'bg-emerald-600 hover:bg-emerald-500 text-white', canRun: canStart, fn: onStart, - successMessage: 'Start cleaning command sent.', }; } return { @@ -96,7 +94,6 @@ export default function VipNeatoCard({ toneClass: 'bg-sky-600 hover:bg-sky-500 text-white', canRun: canSendHome, fn: onSendHome, - successMessage: 'Send to dock command sent.', }; }, [docked, canStart, onStart, canSendHome, onSendHome]); @@ -104,15 +101,13 @@ export default function VipNeatoCard({ const canRunLocate = configured && connected && canLocate; const canRunClearErrors = configured && connected && canClearErrors; - const runAction = async (key, fn, successMessage) => { + const runAction = async (key, fn) => { if (!fn) return; setWorking(key); - setMessage(''); try { await fn(); - setMessage(successMessage); - } catch (err) { - setMessage(err?.message || 'Action failed.'); + } catch { + // Keep UI minimal; errors are intentionally silent in-panel. } finally { setWorking(''); } @@ -149,7 +144,7 @@ export default function VipNeatoCard({ runAction(primaryAction.key, primaryAction.fn, primaryAction.successMessage)} + onClick={() => runAction(primaryAction.key, primaryAction.fn)} className={`rounded-md px-1 py-1 text-base font-semibold transition disabled:opacity-50 ${primaryAction.toneClass}`} > {working === primaryAction.key ? primaryAction.pending : primaryAction.label} @@ -159,7 +154,7 @@ export default function VipNeatoCard({ runAction('locate', onLocate, 'Play sound command sent.')} + onClick={() => runAction('locate', onLocate)} className="rounded-md bg-fuchsia-600 px-1 py-0.75 text-sm font-semibold text-white transition hover:bg-fuchsia-500 disabled:opacity-50" > {working === 'locate' ? 'Playing...' : 'Play sound'} @@ -167,7 +162,7 @@ export default function VipNeatoCard({ runAction('clearErrors', onClearErrors, 'Clear errors command sent.')} + onClick={() => runAction('clearErrors', onClearErrors)} className="rounded-md bg-amber-500 px-1 py-0.75 text-sm font-semibold text-slate-900 transition hover:bg-amber-400 disabled:opacity-50" > {working === 'clearErrors' ? 'Clearing...' : 'Clear errors'} @@ -204,8 +199,6 @@ export default function VipNeatoCard({ : 'Waiting for required Neato entities in Home Assistant.'}