f=o.alternate;return f===null?(f=Dr(o.tag,l,o.key,o.mode),f.elementType=o.elementType,f.type=o.type,f.stateNode=o.stateNode,f.alternate=o,o.alternate=f):(f.pendingProps=l,f.type=o.type,f.flags=0,f.subtreeFlags=0,f.deletions=null),f.flags=o.flags&14680064,f.childLanes=o.childLanes,f.lanes=o.lanes,f.child=o.child,f.memoizedProps=o.memoizedProps,f.memoizedState=o.memoizedState,f.updateQueue=o.updateQueue,l=o.dependencies,f.dependencies=l===null?null:{lanes:l.lanes,firstContext:l.firstContext},f.sibling=o.sibling,f.index=o.index,f.ref=o.ref,f}function Ec(o,l,f,v,y,_){var E=2;if(v=o,typeof o=="function")rv(o)&&(E=1);else if(typeof o=="string")E=5;else e:switch(o){case M:return ha(f.children,y,_,l);case F:E=8,y|=8;break;case W:return o=Dr(12,f,l,y|2),o.elementType=W,o.lanes=_,o;case pe:return o=Dr(13,f,l,y),o.elementType=pe,o.lanes=_,o;case ie:return o=Dr(19,f,l,y),o.elementType=ie,o.lanes=_,o;case he:return Oc(f,y,_,l);default:if(typeof o=="object"&&o!==null)switch(o.$$typeof){case H:E=10;break e;case Y:E=9;break e;case B:E=11;break e;case me:E=14;break e;case _e:E=16,v=null;break e}throw Error(r(130,o==null?o:typeof o,""))}return l=Dr(E,f,l,y),l.elementType=o,l.type=v,l.lanes=_,l}function ha(o,l,f,v){return o=Dr(7,o,v,l),o.lanes=f,o}function Oc(o,l,f,v){return o=Dr(22,o,v,l),o.elementType=he,o.lanes=f,o.stateNode={isHidden:!1},o}function nv(o,l,f){return o=Dr(6,o,null,l),o.lanes=f,o}function iv(o,l,f){return l=Dr(4,o.children!==null?o.children:[],o.key,l),l.lanes=f,l.stateNode={containerInfo:o.containerInfo,pendingChildren:null,implementation:o.implementation},l}function ER(o,l,f,v,y){this.tag=l,this.containerInfo=o,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Th(0),this.expirationTimes=Th(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Th(0),this.identifierPrefix=v,this.onRecoverableError=y,this.mutableSourceEagerHydrationData=null}function av(o,l,f,v,y,_,E,T,I){return o=new ER(o,l,f,T,I),l===1?(l=1,_===!0&&(l|=8)):l=0,_=Dr(3,null,null,l),o.current=_,_.stateNode=o,_.memoizedState={element:v,isDehydrated:f,cache:null,transitions:null,pendingSuspenseBoundaries:null},yp(_),o}function OR(o,l,f){var v=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:j,key:v==null?null:""+v,children:o,containerInfo:l,implementation:f}}function Jx(o){if(!o)return ki;o=o._reactInternals;e:{if(ta(o)!==o||o.tag!==1)throw Error(r(170));var l=o;do{switch(l.tag){case 3:l=l.stateNode.context;break e;case 1:if(ur(l.type)){l=l.stateNode.__reactInternalMemoizedMergedChildContext;break e}}l=l.return}while(l!==null);throw Error(r(171))}if(o.tag===1){var f=o.type;if(ur(f))return Pb(o,f,l)}return l}function Qx(o,l,f,v,y,_,E,T,I){return o=av(f,v,!0,o,y,_,E,T,I),o.context=Jx(null),f=o.current,v=Zt(),y=Ti(f),_=Wn(v,y),_.callback=l??null,Oi(f,_,y),o.current.lanes=y,Cs(o,y,v),fr(o,v),o}function Ac(o,l,f,v){var y=l.current,_=Zt(),E=Ti(y);return f=Jx(f),l.context===null?l.context=f:l.pendingContext=f,l=Wn(_,E),l.payload={element:o},v=v===void 0?null:v,v!==null&&(l.callback=v),o=Oi(y,l,E),o!==null&&(Zr(o,y,E,_),ac(o,y,E)),E}function Cc(o){if(o=o.current,!o.child)return null;switch(o.child.tag){case 5:return o.child.stateNode;default:return o.child.stateNode}}function Zx(o,l){if(o=o.memoizedState,o!==null&&o.dehydrated!==null){var f=o.retryLane;o.retryLane=f!==0&&f<l?f:l}}function ov(o,l){Zx(o,l),(o=o.alternate)&&Zx(o,l)}function AR(){return null}var e1=typeof reportError=="function"?reportError:function(o){console.error(o)};function sv(o){this._internalRoot=o}jc.prototype.render=sv.prototype.render=function(o){var l=this._internalRoot;if(l===null)throw Error(r(409));Ac(o,l,null,null)},jc.prototype.unmount=sv.prototype.unmount=function(){var o=this._internalRoot;if(o!==null){this._internalRoot=null;var l=o.containerInfo;ca(function(){Ac(null,o,null,null)}),l[Ln]=null}};function jc(o){this._internalRoot=o}jc.prototype.unstable_scheduleHydration=function(o){if(o){var l=$w();o={blockedOn:null,target:o,priority:l};for(var f=0;f<wi.length&&l!==0&&l<wi[f].priority;f++);wi.splice(f,0,o),f===0&&Uw(o)}};function lv(o){return!(!o||o.nodeType!==1&&o.nodeType!==9&&o.nodeType!==11)}function Tc(o){return!(!o||o.nodeType!==1&&o.nodeType!==9&&o.nodeType!==11&&(o.nodeType!==8||o.nodeValue!==" react-mount-point-unstable "))}function t1(){}function CR(o,l,f,v,y){if(y){if(typeof v=="function"){var _=v;v=function(){var U=Cc(E);_.call(U)}}var E=Qx(l,v,o,0,null,!1,!1,"",t1);return o._reactRootContainer=E,o[Ln]=E.current,Ws(o.nodeType===8?o.parentNode:o),ca(),E}for(;y=o.lastChild;)o.removeChild(y);if(typeof v=="function"){var T=v;v=function(){var U=Cc(I);T.call(U)}}var I=av(o,0,!1,null,null,!1,!1,"",t1);return o._reactRootContainer=I,o[Ln]=I.current,Ws(o.nodeType===8?o.parentNode:o),ca(function(){Ac(l,I,f,v)}),I}function Nc(o,l,f,v,y){var _=f._reactRootContainer;if(_){var E=_;if(typeof y=="function"){var T=y;y=function(){var I=Cc(E);T.call(I)}}Ac(l,E,o,y)}else E=CR(f,l,o,y,v);return Cc(E)}Dw=function(o){switch(o.tag){case 3:var l=o.stateNode;if(l.current.memoizedState.isDehydrated){var f=As(l.pendingLanes);f!==0&&(Nh(l,f|1),fr(l,dt()),!(Te&6)&&(So=dt()+500,Pi()))}break;case 13:ca(function(){var v=Fn(o,1);if(v!==null){var y=Zt();Zr(v,o,1,y)}}),ov(o,1)}},Ih=function(o){if(o.tag===13){var l=Fn(o,134217728);if(l!==null){var f=Zt();Zr(l,o,134217728,f)}ov(o,134217728)}},Mw=function(o){if(o.tag===13){var l=Ti(o),f=Fn(o,l);if(f!==null){var v=Zt();Zr(f,o,l,v)}ov(o,l)}},$w=function(){return Me},Lw=function(o,l){var f=Me;try{return Me=o,l()}finally{Me=f}},Ph=function(o,l,f){switch(l){case"input":if(Kr(o,f),l=f.name,f.type==="radio"&&l!=null){for(f=o;f.parentNode;)f=f.parentNode;for(f=f.querySelectorAll("input[name="+JSON.stringify(""+l)+'][type="radio"]'),l=0;l<f.length;l++){var v=f[l];if(v!==o&&v.form===o.form){var y=Yu(v);if(!y)throw Error(r(90));Z(v),Kr(v,y)}}}break;case"textarea":hw(o,f);break;case"select":l=f.value,l!=null&&Za(o,!!f.multiple,l,!1)}},_w=Zp,Sw=ca;var jR={usingClientEntryPoint:!1,Events:[Ks,uo,Yu,bw,xw,Zp]},ol={findFiberByHostInstance:ra,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},TR={bundleType:ol.bundleType,version:ol.version,rendererPackageName:ol.rendererPackageName,rendererConfig:ol.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:C.ReactCurrentDispatcher,findHostInstanceByFiber:function(o){return o=Ow(o),o===null?null:o.stateNode},findFiberByHostInstance:ol.findFiberByHostInstance||AR,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var Ic=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!Ic.isDisabled&&Ic.supportsFiber)try{ju=Ic.inject(TR),pn=Ic}catch{}}return hr.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=jR,hr.createPortal=function(o,l){var f=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!lv(l))throw Error(r(200));return OR(o,l,null,f)},hr.createRoot=function(o,l){if(!lv(o))throw Error(r(299));var f=!1,v="",y=e1;return l!=null&&(l.unstable_strictMode===!0&&(f=!0),l.identifierPrefix!==void 0&&(v=l.identifierPrefix),l.onRecoverableError!==void 0&&(y=l.onRecoverableError)),l=av(o,1,!1,null,null,f,!1,v,y),o[Ln]=l.current,Ws(o.nodeType===8?o.parentNode:o),new sv(l)},hr.findDOMNode=function(o){if(o==null)return null;if(o.nodeType===1)return o;var l=o._reactInternals;if(l===void 0)throw typeof o.render=="function"?Error(r(188)):(o=Object.keys(o).join(","),Error(r(268,o)));return o=Ow(l),o=o===null?null:o.stateNode,o},hr.flushSync=function(o){return ca(o)},hr.hydrate=function(o,l,f){if(!Tc(l))throw Error(r(200));return Nc(null,o,l,!0,f)},hr.hydrateRoot=function(o,l,f){if(!lv(o))throw Error(r(405));var v=f!=null&&f.hydratedSources||null,y=!1,_="",E=e1;if(f!=null&&(f.unstable_strictMode===!0&&(y=!0),f.identifierPrefix!==void 0&&(_=f.identifierPrefix),f.onRecoverableError!==void 0&&(E=f.onRecoverableError)),l=Qx(l,null,o,1,f??null,y,!1,_,E),o[Ln]=l.current,Ws(o),v)for(o=0;o<v.length;o++)f=v[o],y=f._getVersion,y=y(f._source),l.mutableSourceEagerHydrationData==null?l.mutableSourceEagerHydrationData=[f,y]:l.mutableSourceEagerHydrationData.push(f,y);return new jc(l)},hr.render=function(o,l,f){if(!Tc(l))throw Error(r(200));return Nc(null,o,l,!1,f)},hr.unmountComponentAtNode=function(o){if(!Tc(o))throw Error(r(40));return o._reactRootContainer?(ca(function(){Nc(null,null,o,!1,function(){o._reactRootContainer=null,o[Ln]=null})}),!0):!1},hr.unstable_batchedUpdates=Zp,hr.unstable_renderSubtreeIntoContainer=function(o,l,f,v){if(!Tc(f))throw Error(r(200));if(o==null||o._reactInternals===void 0)throw Error(r(38));return Nc(o,l,f,!1,v)},hr.version="18.3.1-next-f1338f8080-20240426",hr}var c1;function cO(){if(c1)return dv.exports;c1=1;function e(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),dv.exports=BR(),dv.exports}var d1;function FR(){if(d1)return Rc;d1=1;var e=cO();return Rc.createRoot=e.createRoot,Rc.hydrateRoot=e.hydrateRoot,Rc}var WR=FR();const qR=ai(WR);var dO=cO();/**
 * @remix-run/router v1.23.1
 *
 * Copyright (c) Remix Software Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE.md file in the root directory of this source tree.
 *
 * @license MIT
 */function Dl(){return Dl=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Dl.apply(this,arguments)}var Wi;(function(e){e.Pop="POP",e.Push="PUSH",e.Replace="REPLACE"})(Wi||(Wi={}));const f1="popstate";function HR(e){e===void 0&&(e={});function t(i,a){let{pathname:s="/",search:u="",hash:c=""}=qa(i.location.hash.substr(1));return!s.startsWith("/")&&!s.startsWith(".")&&(s="/"+s),ag("",{pathname:s,search:u,hash:c},a.state&&a.state.usr||null,a.state&&a.state.key||"default")}function r(i,a){let s=i.document.querySelector("base"),u="";if(s&&s.getAttribute("href")){let c=i.location.href,d=c.indexOf("#");u=d===-1?c:c.slice(0,d)}return u+"#"+(typeof a=="string"?a:pd(a))}function n(i,a){bf(i.pathname.charAt(0)==="/","relative pathnames are not supported in hash history.push("+JSON.stringify(a)+")")}return VR(t,r,n,e)}function it(e,t){if(e===!1||e===null||typeof e>"u")throw new Error(t)}function bf(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function KR(){return Math.random().toString(36).substr(2,8)}function h1(e,t){return{usr:e.state,key:e.key,idx:t}}function ag(e,t,r,n){return r===void 0&&(r=null),Dl({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?qa(t):t,{state:r,key:t&&t.key||n||KR()})}function pd(e){let{pathname:t="/",search:r="",hash:n=""}=e;return r&&r!=="?"&&(t+=r.charAt(0)==="?"?r:"?"+r),n&&n!=="#"&&(t+=n.charAt(0)==="#"?n:"#"+n),t}function qa(e){let t={};if(e){let r=e.indexOf("#");r>=0&&(t.hash=e.substr(r),e=e.substr(0,r));let n=e.indexOf("?");n>=0&&(t.search=e.substr(n),e=e.substr(0,n)),e&&(t.pathname=e)}return t}function VR(e,t,r,n){n===void 0&&(n={});let{window:i=document.defaultView,v5Compat:a=!1}=n,s=i.history,u=Wi.Pop,c=null,d=h();d==null&&(d=0,s.replaceState(Dl({},s.state,{idx:d}),""));function h(){return(s.state||{idx:null}).idx}function p(){u=Wi.Pop;let S=h(),k=S==null?null:S-d;d=S,c&&c({action:u,location:w.location,delta:k})}function m(S,k){u=Wi.Push;let A=ag(w.location,S,k);r&&r(A,S),d=h()+1;let P=h1(A,d),C=w.createHref(A);try{s.pushState(P,"",C)}catch(N){if(N instanceof DOMException&&N.name==="DataCloneError")throw N;i.location.assign(C)}a&&c&&c({action:u,location:w.location,delta:1})}function g(S,k){u=Wi.Replace;let A=ag(w.location,S,k);r&&r(A,S),d=h();let P=h1(A,d),C=w.createHref(A);s.replaceState(P,"",C),a&&c&&c({action:u,location:w.location,delta:0})}function b(S){let k=i.location.origin!=="null"?i.location.origin:i.location.href,A=typeof S=="string"?S:pd(S);return A=A.replace(/ $/,"%20"),it(k,"No window.location.(origin|href) available to create URL for href: "+A),new URL(A,k)}let w={get action(){return u},get location(){return e(i,s)},listen(S){if(c)throw new Error("A history only accepts one active listener");return i.addEventListener(f1,p),c=S,()=>{i.removeEventListener(f1,p),c=null}},createHref(S){return t(i,S)},createURL:b,encodeLocation(S){let k=b(S);return{pathname:k.pathname,search:k.search,hash:k.hash}},push:m,replace:g,go(S){return s.go(S)}};return w}var p1;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(p1||(p1={}));function GR(e,t,r){return r===void 0&&(r="/"),YR(e,t,r)}function YR(e,t,r,n){let i=typeof t=="string"?qa(t):t,a=Zo(i.pathname||"/",r);if(a==null)return null;let s=fO(e);XR(s);let u=null;for(let c=0;u==null&&c<s.length;++c){let d=sD(a);u=aD(s[c],d)}return u}function fO(e,t,r,n){t===void 0&&(t=[]),r===void 0&&(r=[]),n===void 0&&(n="");let i=(a,s,u)=>{let c={relativePath:u===void 0?a.path||"":u,caseSensitive:a.caseSensitive===!0,childrenIndex:s,route:a};c.relativePath.startsWith("/")&&(it(c.relativePath.startsWith(n),'Absolute route path "'+c.relativePath+'" nested under path '+('"'+n+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),c.relativePath=c.relativePath.slice(n.length));let d=Hi([n,c.relativePath]),h=r.concat(c);a.children&&a.children.length>0&&(it(a.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+d+'".')),fO(a.children,t,h,d)),!(a.path==null&&!a.index)&&t.push({path:d,score:nD(d,a.index),routesMeta:h})};return e.forEach((a,s)=>{var u;if(a.path===""||!((u=a.path)!=null&&u.includes("?")))i(a,s);else for(let c of hO(a.path))i(a,s,c)}),t}function hO(e){let t=e.split("/");if(t.length===0)return[];let[r,...n]=t,i=r.endsWith("?"),a=r.replace(/\?$/,"");if(n.length===0)return i?[a,""]:[a];let s=hO(n.join("/")),u=[];return u.push(...s.map(c=>c===""?a:[a,c].join("/"))),i&&u.push(...s),u.map(c=>e.startsWith("/")&&c===""?"/":c)}function XR(e){e.sort((t,r)=>t.score!==r.score?r.score-t.score:iD(t.routesMeta.map(n=>n.childrenIndex),r.routesMeta.map(n=>n.childrenIndex)))}const JR=/^:[\w-]+$/,QR=3,ZR=2,eD=1,tD=10,rD=-2,v1=e=>e==="*";function nD(e,t){let r=e.split("/"),n=r.length;return r.some(v1)&&(n+=rD),t&&(n+=ZR),r.filter(i=>!v1(i)).reduce((i,a)=>i+(JR.test(a)?QR:a===""?eD:tD),n)}function iD(e,t){return e.length===t.length&&e.slice(0,-1).every((n,i)=>n===t[i])?e[e.length-1]-t[t.length-1]:0}function aD(e,t,r){let{routesMeta:n}=e,i={},a="/",s=[];for(let u=0;u<n.length;++u){let c=n[u],d=u===n.length-1,h=a==="/"?t:t.slice(a.length)||"/",p=og({path:c.relativePath,caseSensitive:c.caseSensitive,end:d},h),m=c.route;if(!p)return null;Object.assign(i,p.params),s.push({params:i,pathname:Hi([a,p.pathname]),pathnameBase:fD(Hi([a,p.pathnameBase])),route:m}),p.pathnameBase!=="/"&&(a=Hi([a,p.pathnameBase]))}return s}function og(e,t){typeof e=="string"&&(e={path:e,caseSensitive:!1,end:!0});let[r,n]=oD(e.path,e.caseSensitive,e.end),i=t.match(r);if(!i)return null;let a=i[0],s=a.replace(/(.)\/+$/,"$1"),u=i.slice(1);return{params:n.reduce((d,h,p)=>{let{paramName:m,isOptional:g}=h;if(m==="*"){let w=u[p]||"";s=a.slice(0,a.length-w.length).replace(/(.)\/+$/,"$1")}const b=u[p];return g&&!b?d[m]=void 0:d[m]=(b||"").replace(/%2F/g,"/"),d},{}),pathname:a,pathnameBase:s,pattern:e}}function oD(e,t,r){t===void 0&&(t=!1),r===void 0&&(r=!0),bf(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let n=[],i="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(s,u,c)=>(n.push({paramName:u,isOptional:c!=null}),c?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(n.push({paramName:"*"}),i+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?i+="\\/*$":e!==""&&e!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,t?void 0:"i"),n]}function sD(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return bf(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function Zo(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let r=t.endsWith("/")?t.length-1:t.length,n=e.charAt(r);return n&&n!=="/"?null:e.slice(r)||"/"}const lD=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,uD=e=>lD.test(e);function cD(e,t){t===void 0&&(t="/");let{pathname:r,search:n="",hash:i=""}=typeof e=="string"?qa(e):e,a;if(r)if(uD(r))a=r;else{if(r.includes("//")){let s=r;r=r.replace(/\/\/+/g,"/"),bf(!1,"Pathnames cannot have embedded double slashes - normalizing "+(s+" -> "+r))}r.startsWith("/")?a=m1(r.substring(1),"/"):a=m1(r,t)}else a=t;return{pathname:a,search:hD(n),hash:pD(i)}}function m1(e,t){let r=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(i=>{i===".."?r.length>1&&r.pop():i!=="."&&r.push(i)}),r.length>1?r.join("/"):"/"}function pv(e,t,r,n){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(n)+"].  Please separate it out to the ")+("`to."+r+"` field. Alternatively you may provide the full path as ")+'a string in <Link to="..."> and the router will parse it for you.'}function dD(e){return e.filter((t,r)=>r===0||t.route.path&&t.route.path.length>0)}function _y(e,t){let r=dD(e);return t?r.map((n,i)=>i===r.length-1?n.pathname:n.pathnameBase):r.map(n=>n.pathnameBase)}function Sy(e,t,r,n){n===void 0&&(n=!1);let i;typeof e=="string"?i=qa(e):(i=Dl({},e),it(!i.pathname||!i.pathname.includes("?"),pv("?","pathname","search",i)),it(!i.pathname||!i.pathname.includes("#"),pv("#","pathname","hash",i)),it(!i.search||!i.search.includes("#"),pv("#","search","hash",i)));let a=e===""||i.pathname==="",s=a?"/":i.pathname,u;if(s==null)u=r;else{let p=t.length-1;if(!n&&s.startsWith("..")){let m=s.split("/");for(;m[0]==="..";)m.shift(),p-=1;i.pathname=m.join("/")}u=p>=0?t[p]:"/"}let c=cD(i,u),d=s&&s!=="/"&&s.endsWith("/"),h=(a||s===".")&&r.endsWith("/");return!c.pathname.endsWith("/")&&(d||h)&&(c.pathname+="/"),c}const Hi=e=>e.join("/").replace(/\/\/+/g,"/"),fD=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),hD=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,pD=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;function vD(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const pO=["post","put","patch","delete"];new Set(pO);const mD=["get",...pO];new Set(mD);/**
 * React Router v6.30.2
 *
 * Copyright (c) Remix Software Inc.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE.md file in the root directory of this source tree.
 *
 * @license MIT
 */function Ml(){return Ml=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},Ml.apply(this,arguments)}const xf=x.createContext(null),vO=x.createContext(null),oi=x.createContext(null),_f=x.createContext(null),si=x.createContext({outlet:null,matches:[],isDataRoute:!1}),mO=x.createContext(null);function gD(e,t){let{relative:r}=t===void 0?{}:t;ds()||it(!1);let{basename:n,navigator:i}=x.useContext(oi),{hash:a,pathname:s,search:u}=Sf(e,{relative:r}),c=s;return n!=="/"&&(c=s==="/"?n:Hi([n,s])),i.createHref({pathname:c,search:u,hash:a})}function ds(){return x.useContext(_f)!=null}function Ha(){return ds()||it(!1),x.useContext(_f).location}function gO(e){x.useContext(oi).static||x.useLayoutEffect(e)}function ky(){let{isDataRoute:e}=x.useContext(si);return e?ND():yD()}function yD(){ds()||it(!1);let e=x.useContext(xf),{basename:t,future:r,navigator:n}=x.useContext(oi),{matches:i}=x.useContext(si),{pathname:a}=Ha(),s=JSON.stringify(_y(i,r.v7_relativeSplatPath)),u=x.useRef(!1);return gO(()=>{u.current=!0}),x.useCallback(function(d,h){if(h===void 0&&(h={}),!u.current)return;if(typeof d=="number"){n.go(d);return}let p=Sy(d,JSON.parse(s),a,h.relative==="path");e==null&&t!=="/"&&(p.pathname=p.pathname==="/"?t:Hi([t,p.pathname])),(h.replace?n.replace:n.push)(p,h.state,h)},[t,n,s,a,e])}const wD=x.createContext(null);function bD(e){let t=x.useContext(si).outlet;return t&&x.createElement(wD.Provider,{value:e},t)}function Sf(e,t){let{relative:r}=t===void 0?{}:t,{future:n}=x.useContext(oi),{matches:i}=x.useContext(si),{pathname:a}=Ha(),s=JSON.stringify(_y(i,n.v7_relativeSplatPath));return x.useMemo(()=>Sy(e,JSON.parse(s),a,r==="path"),[e,s,a,r])}function xD(e,t){return _D(e,t)}function _D(e,t,r,n){ds()||it(!1);let{navigator:i}=x.useContext(oi),{matches:a}=x.useContext(si),s=a[a.length-1],u=s?s.params:{};s&&s.pathname;let c=s?s.pathnameBase:"/";s&&s.route;let d=Ha(),h;if(t){var p;let S=typeof t=="string"?qa(t):t;c==="/"||(p=S.pathname)!=null&&p.startsWith(c)||it(!1),h=S}else h=d;let m=h.pathname||"/",g=m;if(c!=="/"){let S=c.replace(/^\//,"").split("/");g="/"+m.replace(/^\//,"").split("/").slice(S.length).join("/")}let b=GR(e,{pathname:g}),w=OD(b&&b.map(S=>Object.assign({},S,{params:Object.assign({},u,S.params),pathname:Hi([c,i.encodeLocation?i.encodeLocation(S.pathname).pathname:S.pathname]),pathnameBase:S.pathnameBase==="/"?c:Hi([c,i.encodeLocation?i.encodeLocation(S.pathnameBase).pathname:S.pathnameBase])})),a,r,n);return t&&w?x.createElement(_f.Provider,{value:{location:Ml({pathname:"/",search:"",hash:"",state:null,key:"default"},h),navigationType:Wi.Pop}},w):w}function SD(){let e=TD(),t=vD(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),r=e instanceof Error?e.stack:null,i={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return x.createElement(x.Fragment,null,x.createElement("h2",null,"Unexpected Application Error!"),x.createElement("h3",{style:{fontSt