From 7a14c80eececa0b43bc534909330d57ca8cf14db Mon Sep 17 00:00:00 2001 From: karyamanswasta Date: Sun, 10 Aug 2025 19:53:38 +0700 Subject: [PATCH] feat(juragankos-app): scaffold chatbot app with Vite + Tailwind + shadcn/ui + router\n\n- Add chat-focused UI with glass effect\n- Add admin login and dashboard pages\n- Configure Tailwind + shadcn, lucide icons\n- Add routing and simple auth stub\n- Include CODEX.md project context --- juragankos-app/CODEX.md | 77 + juragankos-app/components.json | 17 + juragankos-app/dist/.gitkeep | 1 + juragankos-app/dist/assets/index-CAPPAZ3e.js | 127 + juragankos-app/dist/assets/index-zyn0Wah-.css | 1 + juragankos-app/dist/index.html | 14 + juragankos-app/index.html | 13 + juragankos-app/package-lock.json | 3086 +++++++++++++++++ juragankos-app/package.json | 32 + juragankos-app/postcss.config.js | 7 + juragankos-app/public/.gitkeep | 1 + juragankos-app/src/App.tsx | 54 + juragankos-app/src/components/ui/button.tsx | 53 + juragankos-app/src/components/ui/card.tsx | 21 + juragankos-app/src/components/ui/input.tsx | 22 + juragankos-app/src/index.css | 74 + juragankos-app/src/lib/utils.ts | 7 + juragankos-app/src/main.tsx | 26 + juragankos-app/src/pages/Chat.tsx | 91 + juragankos-app/src/pages/admin/Dashboard.tsx | 51 + juragankos-app/src/pages/admin/Login.tsx | 48 + juragankos-app/src/services/auth.ts | 21 + juragankos-app/tailwind.config.js | 71 + juragankos-app/tsconfig.json | 17 + juragankos-app/tsconfig.node.json | 12 + juragankos-app/tsconfig.tsbuildinfo | 1 + juragankos-app/vite.config.ts | 7 + 27 files changed, 3952 insertions(+) create mode 100644 juragankos-app/CODEX.md create mode 100644 juragankos-app/components.json create mode 100644 juragankos-app/dist/.gitkeep create mode 100644 juragankos-app/dist/assets/index-CAPPAZ3e.js create mode 100644 juragankos-app/dist/assets/index-zyn0Wah-.css create mode 100644 juragankos-app/dist/index.html create mode 100644 juragankos-app/index.html create mode 100644 juragankos-app/package-lock.json create mode 100644 juragankos-app/package.json create mode 100644 juragankos-app/postcss.config.js create mode 100644 juragankos-app/public/.gitkeep create mode 100644 juragankos-app/src/App.tsx create mode 100644 juragankos-app/src/components/ui/button.tsx create mode 100644 juragankos-app/src/components/ui/card.tsx create mode 100644 juragankos-app/src/components/ui/input.tsx create mode 100644 juragankos-app/src/index.css create mode 100644 juragankos-app/src/lib/utils.ts create mode 100644 juragankos-app/src/main.tsx create mode 100644 juragankos-app/src/pages/Chat.tsx create mode 100644 juragankos-app/src/pages/admin/Dashboard.tsx create mode 100644 juragankos-app/src/pages/admin/Login.tsx create mode 100644 juragankos-app/src/services/auth.ts create mode 100644 juragankos-app/tailwind.config.js create mode 100644 juragankos-app/tsconfig.json create mode 100644 juragankos-app/tsconfig.node.json create mode 100644 juragankos-app/tsconfig.tsbuildinfo create mode 100644 juragankos-app/vite.config.ts diff --git a/juragankos-app/CODEX.md b/juragankos-app/CODEX.md new file mode 100644 index 0000000..51eac26 --- /dev/null +++ b/juragankos-app/CODEX.md @@ -0,0 +1,77 @@ +# CODEX Context + +Ringkasan konteks kerja untuk meneruskan pengembangan aplikasi chatbot pengusaha kos. + +## Ringkasan Proyek +- Tujuan: Aplikasi chatbot untuk pengusaha kos-kosan. +- Fokus utama: Antarmuka chat sebagai halaman utama, login admin, dan dashboard analitik performa chatbot. + +## Stack & Tools +- Frontend: React 18 + TypeScript (Vite). +- Styling: Tailwind CSS + shadcn/ui (preset CSS vars + utilities) + tailwindcss-animate. +- Ikon: lucide-react. +- Routing: react-router-dom. + +## Struktur Halaman & Routing +- `/` → Chat (UI percakapan + input pesan, respons asisten masih disimulasikan). +- `/admin/login` → Halaman login admin (stub login di sisi klien). +- `/admin/dashboard` → Dashboard analitik sederhana (KPI dummy + daftar percakapan terbaru). + +Router didefinisikan di `src/main.tsx` dengan `createBrowserRouter`, layout root di `src/App.tsx` dan `Outlet` untuk konten halaman. + +## UI Kit & Styling (shadcn/ui) +- Tailwind dikonfigurasi untuk shadcn: `darkMode: ['class']`, warna via CSS variables, radius, dan animasi accordion. +- File penting: + - `tailwind.config.js` (termasuk `tailwindcss-animate`). + - `src/index.css` (layer base + CSS variables tema light/dark shadcn). + - `components.json` (config shadcn, alias `src/components` dan `src/lib/utils`). +- Helper util: `src/lib/utils.ts` berisi `cn()` (clsx + tailwind-merge). + +## Komponen yang Tersedia +- `Button` (`src/components/ui/button.tsx`) – berbasis CVA + Radix Slot, varian: default, destructive, outline, secondary, ghost, link; size: default, sm, lg, icon. +- `Input` (`src/components/ui/input.tsx`). +- `Card` (`src/components/ui/card.tsx`) + `CardHeader`, `CardTitle`, `CardContent`. +- Ikon: gunakan dari `lucide-react`, contoh: `Home`, `Moon`, `Send`, dsb. + +## Halaman yang Ada +- `src/pages/Chat.tsx`: daftar pesan, auto scroll, input + tombol kirim, balasan asisten disimulasikan (setTimeout). Siap dihubungkan ke backend (SSE/WebSocket/HTTP stream). +- `src/pages/admin/Login.tsx`: form email/password; menggunakan `services/auth` untuk stub login. +- `src/pages/admin/Dashboard.tsx`: guard sederhana (redirect ke login jika belum auth), KPI dummy dan list percakapan terbaru. + +## Auth (sementara) +- `src/services/auth.ts` menyimpan token dummy di `localStorage`. Fungsi: `login`, `logout`, `isAuthenticated`. +- Perlu diganti ke autentikasi riil (JWT/session) dan proteksi route yang lebih kuat. + +## Perintah NPM +- `npm run dev` — jalankan Vite dev server. +- `npm run build` — build produksi ke `dist/`. +- `npm run preview` — preview hasil build. + +## Berkas Penting +- `index.html` — entry HTML. +- `vite.config.ts` — plugin React. +- `tsconfig.json`, `tsconfig.node.json` — TypeScript config. +- `src/App.tsx` — layout + navigasi (Chat, Dashboard) + placeholder toggle tema. +- `src/main.tsx` — bootstrap React + Router. + +## Rencana Lanjutan / TODO +- [ ] Implementasi toggle dark mode (persist di `localStorage`, set class `dark` di `document.documentElement`). +- [ ] Integrasi backend chat (SSE/WebSocket/HTTP) + streaming token respons. +- [ ] Ganti stub auth dengan API riil (JWT/refresh) + guard router (loader/ProtectedRoute). +- [ ] Dashboard analitik: metrik nyata (total percakapan, CSAT, latency), grafik (mis. Recharts), filter rentang waktu. +- [ ] Persistensi percakapan (riwayat, metadata: intent, kepuasan, sumber lead). +- [ ] A11y chat: roles/aria proper, fokus kembali ke input setelah kirim, shortcut keyboard. +- [ ] ESLint + Prettier + Vitest sesuai pedoman repo; tambahkan test dasar untuk komponen UI dan routing. +- [ ] ENV config (`.env.local`) untuk URL API (`VITE_API_URL`) dan kunci lain (tanpa commit rahasia). + +## Catatan Implementasi +- Tema mengikuti shadcn: gunakan kelas Tailwind yang merujuk CSS variables (`bg-background`, `text-foreground`, dll.). +- Animasi: `tailwindcss-animate` sudah aktif; siap untuk komponen seperti Accordion/Dialog apabila ditambahkan. +- Navigasi header ada di `src/App.tsx` (link ke Chat dan Dashboard), tombol tema placeholder. + +## Cara Menjalankan +1. `npm install` +2. `npm run dev` (development) atau `npm run build && npm run preview` (produksi lokal). + +--- +Jika Anda ingin saya melanjutkan, prioritas disarankan: dark mode toggle → integrasi alur chat ke backend (streaming) → auth riil → dashboard metrik & grafik → testing & linting. diff --git a/juragankos-app/components.json b/juragankos-app/components.json new file mode 100644 index 0000000..96caf19 --- /dev/null +++ b/juragankos-app/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/index.css", + "baseColor": "slate", + "cssVariables": true + }, + "aliases": { + "components": "src/components", + "utils": "src/lib/utils" + } +} + diff --git a/juragankos-app/dist/.gitkeep b/juragankos-app/dist/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/juragankos-app/dist/.gitkeep @@ -0,0 +1 @@ + diff --git a/juragankos-app/dist/assets/index-CAPPAZ3e.js b/juragankos-app/dist/assets/index-CAPPAZ3e.js new file mode 100644 index 0000000..f309e79 --- /dev/null +++ b/juragankos-app/dist/assets/index-CAPPAZ3e.js @@ -0,0 +1,127 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))n(l);new MutationObserver(l=>{for(const o of l)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&n(i)}).observe(document,{childList:!0,subtree:!0});function r(l){const o={};return l.integrity&&(o.integrity=l.integrity),l.referrerPolicy&&(o.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?o.credentials="include":l.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(l){if(l.ep)return;l.ep=!0;const o=r(l);fetch(l.href,o)}})();function yh(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var od={exports:{}},Zo={},id={exports:{}},Z={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Cl=Symbol.for("react.element"),wh=Symbol.for("react.portal"),xh=Symbol.for("react.fragment"),kh=Symbol.for("react.strict_mode"),Sh=Symbol.for("react.profiler"),Eh=Symbol.for("react.provider"),Ch=Symbol.for("react.context"),Ph=Symbol.for("react.forward_ref"),Rh=Symbol.for("react.suspense"),_h=Symbol.for("react.memo"),Nh=Symbol.for("react.lazy"),yu=Symbol.iterator;function Lh(e){return e===null||typeof e!="object"?null:(e=yu&&e[yu]||e["@@iterator"],typeof e=="function"?e:null)}var ad={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},sd=Object.assign,ud={};function Sn(e,t,r){this.props=e,this.context=t,this.refs=ud,this.updater=r||ad}Sn.prototype.isReactComponent={};Sn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Sn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function cd(){}cd.prototype=Sn.prototype;function es(e,t,r){this.props=e,this.context=t,this.refs=ud,this.updater=r||ad}var ts=es.prototype=new cd;ts.constructor=es;sd(ts,Sn.prototype);ts.isPureReactComponent=!0;var wu=Array.isArray,dd=Object.prototype.hasOwnProperty,rs={current:null},fd={key:!0,ref:!0,__self:!0,__source:!0};function pd(e,t,r){var n,l={},o=null,i=null;if(t!=null)for(n in t.ref!==void 0&&(i=t.ref),t.key!==void 0&&(o=""+t.key),t)dd.call(t,n)&&!fd.hasOwnProperty(n)&&(l[n]=t[n]);var a=arguments.length-2;if(a===1)l.children=r;else if(1>>1,re=P[q];if(0>>1;ql(tt,A))zel(de,tt)?(P[q]=de,P[ze]=A,q=ze):(P[q]=tt,P[ie]=A,q=ie);else if(zel(de,A))P[q]=de,P[ze]=A,q=ze;else break e}}return b}function l(P,b){var A=P.sortIndex-b.sortIndex;return A!==0?A:P.id-b.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var i=Date,a=i.now();e.unstable_now=function(){return i.now()-a}}var s=[],u=[],c=1,p=null,f=3,y=!1,k=!1,S=!1,M=typeof setTimeout=="function"?setTimeout:null,d=typeof clearTimeout=="function"?clearTimeout:null,h=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function m(P){for(var b=r(u);b!==null;){if(b.callback===null)n(u);else if(b.startTime<=P)n(u),b.sortIndex=b.expirationTime,t(s,b);else break;b=r(u)}}function C(P){if(S=!1,m(P),!k)if(r(s)!==null)k=!0,Y(_);else{var b=r(u);b!==null&&se(C,b.startTime-P)}}function _(P,b){k=!1,S&&(S=!1,d(R),R=-1),y=!0;var A=f;try{for(m(b),p=r(s);p!==null&&(!(p.expirationTime>b)||P&&!ue());){var q=p.callback;if(typeof q=="function"){p.callback=null,f=p.priorityLevel;var re=q(p.expirationTime<=b);b=e.unstable_now(),typeof re=="function"?p.callback=re:p===r(s)&&n(s),m(b)}else n(s);p=r(s)}if(p!==null)var ee=!0;else{var ie=r(u);ie!==null&&se(C,ie.startTime-b),ee=!1}return ee}finally{p=null,f=A,y=!1}}var g=!1,z=null,R=-1,O=5,V=-1;function ue(){return!(e.unstable_now()-VP||125q?(P.sortIndex=A,t(u,P),r(s)===null&&P===r(u)&&(S?(d(R),R=-1):S=!0,se(C,A-q))):(P.sortIndex=re,t(s,P),k||y||(k=!0,Y(_))),P},e.unstable_shouldYield=ue,e.unstable_wrapCallback=function(P){var b=f;return function(){var A=f;f=b;try{return P.apply(this,arguments)}finally{f=A}}}})(yd);gd.exports=yd;var Uh=gd.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Vh=x,it=Uh;function L(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),ta=Object.prototype.hasOwnProperty,Hh=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,ku={},Su={};function Bh(e){return ta.call(Su,e)?!0:ta.call(ku,e)?!1:Hh.test(e)?Su[e]=!0:(ku[e]=!0,!1)}function Wh(e,t,r,n){if(r!==null&&r.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return n?!1:r!==null?!r.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function Qh(e,t,r,n){if(t===null||typeof t>"u"||Wh(e,t,r,n))return!0;if(n)return!1;if(r!==null)switch(r.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function Ge(e,t,r,n,l,o,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=n,this.attributeNamespace=l,this.mustUseProperty=r,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var Ie={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Ie[e]=new Ge(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Ie[t]=new Ge(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Ie[e]=new Ge(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Ie[e]=new Ge(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Ie[e]=new Ge(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Ie[e]=new Ge(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Ie[e]=new Ge(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Ie[e]=new Ge(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Ie[e]=new Ge(e,5,!1,e.toLowerCase(),null,!1,!1)});var ls=/[\-:]([a-z])/g;function os(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(ls,os);Ie[t]=new Ge(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(ls,os);Ie[t]=new Ge(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(ls,os);Ie[t]=new Ge(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Ie[e]=new Ge(e,1,!1,e.toLowerCase(),null,!1,!1)});Ie.xlinkHref=new Ge("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Ie[e]=new Ge(e,1,!1,e.toLowerCase(),null,!0,!0)});function is(e,t,r,n){var l=Ie.hasOwnProperty(t)?Ie[t]:null;(l!==null?l.type!==0:n||!(2a||l[i]!==o[a]){var s=` +`+l[i].replace(" at new "," at ");return e.displayName&&s.includes("")&&(s=s.replace("",e.displayName)),s}while(1<=i&&0<=a);break}}}finally{Si=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?Hn(e):""}function Kh(e){switch(e.tag){case 5:return Hn(e.type);case 16:return Hn("Lazy");case 13:return Hn("Suspense");case 19:return Hn("SuspenseList");case 0:case 2:case 15:return e=Ei(e.type,!1),e;case 11:return e=Ei(e.type.render,!1),e;case 1:return e=Ei(e.type,!0),e;default:return""}}function oa(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Xr:return"Fragment";case Yr:return"Portal";case ra:return"Profiler";case as:return"StrictMode";case na:return"Suspense";case la:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case kd:return(e.displayName||"Context")+".Consumer";case xd:return(e._context.displayName||"Context")+".Provider";case ss:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case us:return t=e.displayName||null,t!==null?t:oa(e.type)||"Memo";case qt:t=e._payload,e=e._init;try{return oa(e(t))}catch{}}return null}function Gh(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return oa(t);case 8:return t===as?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function mr(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Ed(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Yh(e){var t=Ed(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),n=""+e[t];if(!e.hasOwnProperty(t)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var l=r.get,o=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(i){n=""+i,o.call(this,i)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return n},setValue:function(i){n=""+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Hl(e){e._valueTracker||(e._valueTracker=Yh(e))}function Cd(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),n="";return e&&(n=Ed(e)?e.checked?"true":"false":e.value),e=n,e!==r?(t.setValue(e),!0):!1}function Po(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function ia(e,t){var r=t.checked;return xe({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r??e._wrapperState.initialChecked})}function Cu(e,t){var r=t.defaultValue==null?"":t.defaultValue,n=t.checked!=null?t.checked:t.defaultChecked;r=mr(t.value!=null?t.value:r),e._wrapperState={initialChecked:n,initialValue:r,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Pd(e,t){t=t.checked,t!=null&&is(e,"checked",t,!1)}function aa(e,t){Pd(e,t);var r=mr(t.value),n=t.type;if(r!=null)n==="number"?(r===0&&e.value===""||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if(n==="submit"||n==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?sa(e,t.type,r):t.hasOwnProperty("defaultValue")&&sa(e,t.type,mr(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Pu(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var n=t.type;if(!(n!=="submit"&&n!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,r!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,r!==""&&(e.name=r)}function sa(e,t,r){(t!=="number"||Po(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}var Bn=Array.isArray;function sn(e,t,r,n){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=Bl.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function ol(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeType===3){r.nodeValue=t;return}}e.textContent=t}var Gn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Xh=["Webkit","ms","Moz","O"];Object.keys(Gn).forEach(function(e){Xh.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Gn[t]=Gn[e]})});function Ld(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typeof t!="number"||t===0||Gn.hasOwnProperty(e)&&Gn[e]?(""+t).trim():t+"px"}function Md(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var n=r.indexOf("--")===0,l=Ld(r,t[r],n);r==="float"&&(r="cssFloat"),n?e.setProperty(r,l):e[r]=l}}var Jh=xe({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function da(e,t){if(t){if(Jh[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(L(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(L(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(L(61))}if(t.style!=null&&typeof t.style!="object")throw Error(L(62))}}function fa(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var pa=null;function cs(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var ha=null,un=null,cn=null;function Nu(e){if(e=_l(e)){if(typeof ha!="function")throw Error(L(280));var t=e.stateNode;t&&(t=ni(t),ha(e.stateNode,e.type,t))}}function zd(e){un?cn?cn.push(e):cn=[e]:un=e}function Td(){if(un){var e=un,t=cn;if(cn=un=null,Nu(e),t)for(e=0;e>>=0,e===0?32:31-(sm(e)/um|0)|0}var Wl=64,Ql=4194304;function Wn(e){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: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 e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Lo(e,t){var r=e.pendingLanes;if(r===0)return 0;var n=0,l=e.suspendedLanes,o=e.pingedLanes,i=r&268435455;if(i!==0){var a=i&~l;a!==0?n=Wn(a):(o&=i,o!==0&&(n=Wn(o)))}else i=r&~l,i!==0?n=Wn(i):o!==0&&(n=Wn(o));if(n===0)return 0;if(t!==0&&t!==n&&!(t&l)&&(l=n&-n,o=t&-t,l>=o||l===16&&(o&4194240)!==0))return t;if(n&4&&(n|=r&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=n;0r;r++)t.push(e);return t}function Pl(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-kt(t),e[t]=r}function pm(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var n=e.eventTimes;for(e=e.expirationTimes;0=Xn),Iu=" ",bu=!1;function Zd(e,t){switch(e){case"keyup":return Um.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function qd(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Jr=!1;function Hm(e,t){switch(e){case"compositionend":return qd(t);case"keypress":return t.which!==32?null:(bu=!0,Iu);case"textInput":return e=t.data,e===Iu&&bu?null:e;default:return null}}function Bm(e,t){if(Jr)return e==="compositionend"||!ys&&Zd(e,t)?(e=Xd(),fo=ms=or=null,Jr=!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:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=Vu(r)}}function nf(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?nf(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function lf(){for(var e=window,t=Po();t instanceof e.HTMLIFrameElement;){try{var r=typeof t.contentWindow.location.href=="string"}catch{r=!1}if(r)e=t.contentWindow;else break;t=Po(e.document)}return t}function ws(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")}function qm(e){var t=lf(),r=e.focusedElem,n=e.selectionRange;if(t!==r&&r&&r.ownerDocument&&nf(r.ownerDocument.documentElement,r)){if(n!==null&&ws(r)){if(t=n.start,e=n.end,e===void 0&&(e=t),"selectionStart"in r)r.selectionStart=t,r.selectionEnd=Math.min(e,r.value.length);else if(e=(t=r.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=r.textContent.length,o=Math.min(n.start,l);n=n.end===void 0?o:Math.min(n.end,l),!e.extend&&o>n&&(l=n,n=o,o=l),l=Hu(r,o);var i=Hu(r,n);l&&i&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),o>n?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}}for(t=[],e=r;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;r=document.documentMode,Zr=null,xa=null,Zn=null,ka=!1;function Bu(e,t,r){var n=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;ka||Zr==null||Zr!==Po(n)||(n=Zr,"selectionStart"in n&&ws(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}),Zn&&dl(Zn,n)||(Zn=n,n=To(xa,"onSelect"),0tn||(e.current=_a[tn],_a[tn]=null,tn--)}function ce(e,t){tn++,_a[tn]=e.current,e.current=t}var vr={},He=wr(vr),Ze=wr(!1),Ir=vr;function vn(e,t){var r=e.type.contextTypes;if(!r)return vr;var n=e.stateNode;if(n&&n.__reactInternalMemoizedUnmaskedChildContext===t)return n.__reactInternalMemoizedMaskedChildContext;var l={},o;for(o in r)l[o]=t[o];return n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function qe(e){return e=e.childContextTypes,e!=null}function jo(){he(Ze),he(He)}function Ju(e,t,r){if(He.current!==vr)throw Error(L(168));ce(He,t),ce(Ze,r)}function hf(e,t,r){var n=e.stateNode;if(t=t.childContextTypes,typeof n.getChildContext!="function")return r;n=n.getChildContext();for(var l in n)if(!(l in t))throw Error(L(108,Gh(e)||"Unknown",l));return xe({},r,n)}function Oo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||vr,Ir=He.current,ce(He,e),ce(Ze,Ze.current),!0}function Zu(e,t,r){var n=e.stateNode;if(!n)throw Error(L(169));r?(e=hf(e,t,Ir),n.__reactInternalMemoizedMergedChildContext=e,he(Ze),he(He),ce(He,e)):he(Ze),ce(Ze,r)}var bt=null,li=!1,Ii=!1;function mf(e){bt===null?bt=[e]:bt.push(e)}function dv(e){li=!0,mf(e)}function xr(){if(!Ii&&bt!==null){Ii=!0;var e=0,t=ae;try{var r=bt;for(ae=1;e>=i,l-=i,$t=1<<32-kt(t)+l|r<R?(O=z,z=null):O=z.sibling;var V=f(d,z,m[R],C);if(V===null){z===null&&(z=O);break}e&&z&&V.alternate===null&&t(d,z),h=o(V,h,R),g===null?_=V:g.sibling=V,g=V,z=O}if(R===m.length)return r(d,z),ve&&Lr(d,R),_;if(z===null){for(;RR?(O=z,z=null):O=z.sibling;var ue=f(d,z,V.value,C);if(ue===null){z===null&&(z=O);break}e&&z&&ue.alternate===null&&t(d,z),h=o(ue,h,R),g===null?_=ue:g.sibling=ue,g=ue,z=O}if(V.done)return r(d,z),ve&&Lr(d,R),_;if(z===null){for(;!V.done;R++,V=m.next())V=p(d,V.value,C),V!==null&&(h=o(V,h,R),g===null?_=V:g.sibling=V,g=V);return ve&&Lr(d,R),_}for(z=n(d,z);!V.done;R++,V=m.next())V=y(z,d,R,V.value,C),V!==null&&(e&&V.alternate!==null&&z.delete(V.key===null?R:V.key),h=o(V,h,R),g===null?_=V:g.sibling=V,g=V);return e&&z.forEach(function(Me){return t(d,Me)}),ve&&Lr(d,R),_}function M(d,h,m,C){if(typeof m=="object"&&m!==null&&m.type===Xr&&m.key===null&&(m=m.props.children),typeof m=="object"&&m!==null){switch(m.$$typeof){case Vl:e:{for(var _=m.key,g=h;g!==null;){if(g.key===_){if(_=m.type,_===Xr){if(g.tag===7){r(d,g.sibling),h=l(g,m.props.children),h.return=d,d=h;break e}}else if(g.elementType===_||typeof _=="object"&&_!==null&&_.$$typeof===qt&&tc(_)===g.type){r(d,g.sibling),h=l(g,m.props),h.ref=Fn(d,g,m),h.return=d,d=h;break e}r(d,g);break}else t(d,g);g=g.sibling}m.type===Xr?(h=Fr(m.props.children,d.mode,C,m.key),h.return=d,d=h):(C=xo(m.type,m.key,m.props,null,d.mode,C),C.ref=Fn(d,h,m),C.return=d,d=C)}return i(d);case Yr:e:{for(g=m.key;h!==null;){if(h.key===g)if(h.tag===4&&h.stateNode.containerInfo===m.containerInfo&&h.stateNode.implementation===m.implementation){r(d,h.sibling),h=l(h,m.children||[]),h.return=d,d=h;break e}else{r(d,h);break}else t(d,h);h=h.sibling}h=Wi(m,d.mode,C),h.return=d,d=h}return i(d);case qt:return g=m._init,M(d,h,g(m._payload),C)}if(Bn(m))return k(d,h,m,C);if(zn(m))return S(d,h,m,C);ql(d,m)}return typeof m=="string"&&m!==""||typeof m=="number"?(m=""+m,h!==null&&h.tag===6?(r(d,h.sibling),h=l(h,m),h.return=d,d=h):(r(d,h),h=Bi(m,d.mode,C),h.return=d,d=h),i(d)):r(d,h)}return M}var yn=wf(!0),xf=wf(!1),bo=wr(null),$o=null,ln=null,Es=null;function Cs(){Es=ln=$o=null}function Ps(e){var t=bo.current;he(bo),e._currentValue=t}function Ma(e,t,r){for(;e!==null;){var n=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,n!==null&&(n.childLanes|=t)):n!==null&&(n.childLanes&t)!==t&&(n.childLanes|=t),e===r)break;e=e.return}}function fn(e,t){$o=e,Es=ln=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&t&&(Je=!0),e.firstContext=null)}function ht(e){var t=e._currentValue;if(Es!==e)if(e={context:e,memoizedValue:t,next:null},ln===null){if($o===null)throw Error(L(308));ln=e,$o.dependencies={lanes:0,firstContext:e}}else ln=ln.next=e;return t}var Tr=null;function Rs(e){Tr===null?Tr=[e]:Tr.push(e)}function kf(e,t,r,n){var l=t.interleaved;return l===null?(r.next=r,Rs(t)):(r.next=l.next,l.next=r),t.interleaved=r,Bt(e,n)}function Bt(e,t){e.lanes|=t;var r=e.alternate;for(r!==null&&(r.lanes|=t),r=e,e=e.return;e!==null;)e.childLanes|=t,r=e.alternate,r!==null&&(r.childLanes|=t),r=e,e=e.return;return r.tag===3?r.stateNode:null}var er=!1;function _s(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Sf(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Ut(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function dr(e,t,r){var n=e.updateQueue;if(n===null)return null;if(n=n.shared,ne&2){var l=n.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),n.pending=t,Bt(e,r)}return l=n.interleaved,l===null?(t.next=t,Rs(n)):(t.next=l.next,l.next=t),n.interleaved=t,Bt(e,r)}function ho(e,t,r){if(t=t.updateQueue,t!==null&&(t=t.shared,(r&4194240)!==0)){var n=t.lanes;n&=e.pendingLanes,r|=n,t.lanes=r,fs(e,r)}}function rc(e,t){var r=e.updateQueue,n=e.alternate;if(n!==null&&(n=n.updateQueue,r===n)){var l=null,o=null;if(r=r.firstBaseUpdate,r!==null){do{var i={eventTime:r.eventTime,lane:r.lane,tag:r.tag,payload:r.payload,callback:r.callback,next:null};o===null?l=o=i:o=o.next=i,r=r.next}while(r!==null);o===null?l=o=t:o=o.next=t}else l=o=t;r={baseState:n.baseState,firstBaseUpdate:l,lastBaseUpdate:o,shared:n.shared,effects:n.effects},e.updateQueue=r;return}e=r.lastBaseUpdate,e===null?r.firstBaseUpdate=t:e.next=t,r.lastBaseUpdate=t}function Ao(e,t,r,n){var l=e.updateQueue;er=!1;var o=l.firstBaseUpdate,i=l.lastBaseUpdate,a=l.shared.pending;if(a!==null){l.shared.pending=null;var s=a,u=s.next;s.next=null,i===null?o=u:i.next=u,i=s;var c=e.alternate;c!==null&&(c=c.updateQueue,a=c.lastBaseUpdate,a!==i&&(a===null?c.firstBaseUpdate=u:a.next=u,c.lastBaseUpdate=s))}if(o!==null){var p=l.baseState;i=0,c=u=s=null,a=o;do{var f=a.lane,y=a.eventTime;if((n&f)===f){c!==null&&(c=c.next={eventTime:y,lane:0,tag:a.tag,payload:a.payload,callback:a.callback,next:null});e:{var k=e,S=a;switch(f=t,y=r,S.tag){case 1:if(k=S.payload,typeof k=="function"){p=k.call(y,p,f);break e}p=k;break e;case 3:k.flags=k.flags&-65537|128;case 0:if(k=S.payload,f=typeof k=="function"?k.call(y,p,f):k,f==null)break e;p=xe({},p,f);break e;case 2:er=!0}}a.callback!==null&&a.lane!==0&&(e.flags|=64,f=l.effects,f===null?l.effects=[a]:f.push(a))}else y={eventTime:y,lane:f,tag:a.tag,payload:a.payload,callback:a.callback,next:null},c===null?(u=c=y,s=p):c=c.next=y,i|=f;if(a=a.next,a===null){if(a=l.shared.pending,a===null)break;f=a,a=f.next,f.next=null,l.lastBaseUpdate=f,l.shared.pending=null}}while(!0);if(c===null&&(s=p),l.baseState=s,l.firstBaseUpdate=u,l.lastBaseUpdate=c,t=l.shared.interleaved,t!==null){l=t;do i|=l.lane,l=l.next;while(l!==t)}else o===null&&(l.shared.lanes=0);Ar|=i,e.lanes=i,e.memoizedState=p}}function nc(e,t,r){if(e=t.effects,t.effects=null,e!==null)for(t=0;tr?r:4,e(!0);var n=$i.transition;$i.transition={};try{e(!1),t()}finally{ae=r,$i.transition=n}}function $f(){return mt().memoizedState}function mv(e,t,r){var n=pr(e);if(r={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null},Af(e))Uf(t,r);else if(r=kf(e,t,r,n),r!==null){var l=Qe();St(r,e,n,l),Vf(r,t,n)}}function vv(e,t,r){var n=pr(e),l={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null};if(Af(e))Uf(t,l);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var i=t.lastRenderedState,a=o(i,r);if(l.hasEagerState=!0,l.eagerState=a,Et(a,i)){var s=t.interleaved;s===null?(l.next=l,Rs(t)):(l.next=s.next,s.next=l),t.interleaved=l;return}}catch{}finally{}r=kf(e,t,l,n),r!==null&&(l=Qe(),St(r,e,n,l),Vf(r,t,n))}}function Af(e){var t=e.alternate;return e===we||t!==null&&t===we}function Uf(e,t){qn=Vo=!0;var r=e.pending;r===null?t.next=t:(t.next=r.next,r.next=t),e.pending=t}function Vf(e,t,r){if(r&4194240){var n=t.lanes;n&=e.pendingLanes,r|=n,t.lanes=r,fs(e,r)}}var Ho={readContext:ht,useCallback:Ae,useContext:Ae,useEffect:Ae,useImperativeHandle:Ae,useInsertionEffect:Ae,useLayoutEffect:Ae,useMemo:Ae,useReducer:Ae,useRef:Ae,useState:Ae,useDebugValue:Ae,useDeferredValue:Ae,useTransition:Ae,useMutableSource:Ae,useSyncExternalStore:Ae,useId:Ae,unstable_isNewReconciler:!1},gv={readContext:ht,useCallback:function(e,t){return Nt().memoizedState=[e,t===void 0?null:t],e},useContext:ht,useEffect:oc,useImperativeHandle:function(e,t,r){return r=r!=null?r.concat([e]):null,vo(4194308,4,jf.bind(null,t,e),r)},useLayoutEffect:function(e,t){return vo(4194308,4,e,t)},useInsertionEffect:function(e,t){return vo(4,2,e,t)},useMemo:function(e,t){var r=Nt();return t=t===void 0?null:t,e=e(),r.memoizedState=[e,t],e},useReducer:function(e,t,r){var n=Nt();return t=r!==void 0?r(t):t,n.memoizedState=n.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},n.queue=e,e=e.dispatch=mv.bind(null,we,e),[n.memoizedState,e]},useRef:function(e){var t=Nt();return e={current:e},t.memoizedState=e},useState:lc,useDebugValue:Os,useDeferredValue:function(e){return Nt().memoizedState=e},useTransition:function(){var e=lc(!1),t=e[0];return e=hv.bind(null,e[1]),Nt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,r){var n=we,l=Nt();if(ve){if(r===void 0)throw Error(L(407));r=r()}else{if(r=t(),De===null)throw Error(L(349));$r&30||Rf(n,t,r)}l.memoizedState=r;var o={value:r,getSnapshot:t};return l.queue=o,oc(Nf.bind(null,n,o,e),[e]),n.flags|=2048,wl(9,_f.bind(null,n,o,r,t),void 0,null),r},useId:function(){var e=Nt(),t=De.identifierPrefix;if(ve){var r=At,n=$t;r=(n&~(1<<32-kt(n)-1)).toString(32)+r,t=":"+t+"R"+r,r=gl++,0<\/script>",e=e.removeChild(e.firstChild)):typeof n.is=="string"?e=i.createElement(r,{is:n.is}):(e=i.createElement(r),r==="select"&&(i=e,n.multiple?i.multiple=!0:n.size&&(i.size=n.size))):e=i.createElementNS(e,r),e[Lt]=t,e[hl]=n,Zf(e,t,!1,!1),t.stateNode=e;e:{switch(i=fa(r,n),r){case"dialog":pe("cancel",e),pe("close",e),l=n;break;case"iframe":case"object":case"embed":pe("load",e),l=n;break;case"video":case"audio":for(l=0;lkn&&(t.flags|=128,n=!0,In(o,!1),t.lanes=4194304)}else{if(!n)if(e=Uo(i),e!==null){if(t.flags|=128,n=!0,r=e.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),In(o,!0),o.tail===null&&o.tailMode==="hidden"&&!i.alternate&&!ve)return Ue(t),null}else 2*Ee()-o.renderingStartTime>kn&&r!==1073741824&&(t.flags|=128,n=!0,In(o,!1),t.lanes=4194304);o.isBackwards?(i.sibling=t.child,t.child=i):(r=o.last,r!==null?r.sibling=i:t.child=i,o.last=i)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=Ee(),t.sibling=null,r=ye.current,ce(ye,n?r&1|2:r&1),t):(Ue(t),null);case 22:case 23:return Us(),n=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==n&&(t.flags|=8192),n&&t.mode&1?rt&1073741824&&(Ue(t),t.subtreeFlags&6&&(t.flags|=8192)):Ue(t),null;case 24:return null;case 25:return null}throw Error(L(156,t.tag))}function Pv(e,t){switch(ks(t),t.tag){case 1:return qe(t.type)&&jo(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return wn(),he(Ze),he(He),Ms(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Ls(t),null;case 13:if(he(ye),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(L(340));gn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return he(ye),null;case 4:return wn(),null;case 10:return Ps(t.type._context),null;case 22:case 23:return Us(),null;case 24:return null;default:return null}}var to=!1,Ve=!1,Rv=typeof WeakSet=="function"?WeakSet:Set,j=null;function on(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(null)}catch(n){ke(e,t,n)}else r.current=null}function $a(e,t,r){try{r()}catch(n){ke(e,t,n)}}var vc=!1;function _v(e,t){if(Sa=Mo,e=lf(),ws(e)){if("selectionStart"in e)var r={start:e.selectionStart,end:e.selectionEnd};else e:{r=(r=e.ownerDocument)&&r.defaultView||window;var n=r.getSelection&&r.getSelection();if(n&&n.rangeCount!==0){r=n.anchorNode;var l=n.anchorOffset,o=n.focusNode;n=n.focusOffset;try{r.nodeType,o.nodeType}catch{r=null;break e}var i=0,a=-1,s=-1,u=0,c=0,p=e,f=null;t:for(;;){for(var y;p!==r||l!==0&&p.nodeType!==3||(a=i+l),p!==o||n!==0&&p.nodeType!==3||(s=i+n),p.nodeType===3&&(i+=p.nodeValue.length),(y=p.firstChild)!==null;)f=p,p=y;for(;;){if(p===e)break t;if(f===r&&++u===l&&(a=i),f===o&&++c===n&&(s=i),(y=p.nextSibling)!==null)break;p=f,f=p.parentNode}p=y}r=a===-1||s===-1?null:{start:a,end:s}}else r=null}r=r||{start:0,end:0}}else r=null;for(Ea={focusedElem:e,selectionRange:r},Mo=!1,j=t;j!==null;)if(t=j,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,j=e;else for(;j!==null;){t=j;try{var k=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(k!==null){var S=k.memoizedProps,M=k.memoizedState,d=t.stateNode,h=d.getSnapshotBeforeUpdate(t.elementType===t.type?S:yt(t.type,S),M);d.__reactInternalSnapshotBeforeUpdate=h}break;case 3:var m=t.stateNode.containerInfo;m.nodeType===1?m.textContent="":m.nodeType===9&&m.documentElement&&m.removeChild(m.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(L(163))}}catch(C){ke(t,t.return,C)}if(e=t.sibling,e!==null){e.return=t.return,j=e;break}j=t.return}return k=vc,vc=!1,k}function el(e,t,r){var n=t.updateQueue;if(n=n!==null?n.lastEffect:null,n!==null){var l=n=n.next;do{if((l.tag&e)===e){var o=l.destroy;l.destroy=void 0,o!==void 0&&$a(t,r,o)}l=l.next}while(l!==n)}}function ai(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var r=t=t.next;do{if((r.tag&e)===e){var n=r.create;r.destroy=n()}r=r.next}while(r!==t)}}function Aa(e){var t=e.ref;if(t!==null){var r=e.stateNode;switch(e.tag){case 5:e=r;break;default:e=r}typeof t=="function"?t(e):t.current=e}}function tp(e){var t=e.alternate;t!==null&&(e.alternate=null,tp(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Lt],delete t[hl],delete t[Ra],delete t[uv],delete t[cv])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function rp(e){return e.tag===5||e.tag===3||e.tag===4}function gc(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||rp(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.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 Ua(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.nodeType===8?r.parentNode.insertBefore(e,t):r.insertBefore(e,t):(r.nodeType===8?(t=r.parentNode,t.insertBefore(e,r)):(t=r,t.appendChild(e)),r=r._reactRootContainer,r!=null||t.onclick!==null||(t.onclick=Do));else if(n!==4&&(e=e.child,e!==null))for(Ua(e,t,r),e=e.sibling;e!==null;)Ua(e,t,r),e=e.sibling}function Va(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.insertBefore(e,t):r.appendChild(e);else if(n!==4&&(e=e.child,e!==null))for(Va(e,t,r),e=e.sibling;e!==null;)Va(e,t,r),e=e.sibling}var Oe=null,wt=!1;function Xt(e,t,r){for(r=r.child;r!==null;)np(e,t,r),r=r.sibling}function np(e,t,r){if(Mt&&typeof Mt.onCommitFiberUnmount=="function")try{Mt.onCommitFiberUnmount(qo,r)}catch{}switch(r.tag){case 5:Ve||on(r,t);case 6:var n=Oe,l=wt;Oe=null,Xt(e,t,r),Oe=n,wt=l,Oe!==null&&(wt?(e=Oe,r=r.stateNode,e.nodeType===8?e.parentNode.removeChild(r):e.removeChild(r)):Oe.removeChild(r.stateNode));break;case 18:Oe!==null&&(wt?(e=Oe,r=r.stateNode,e.nodeType===8?Fi(e.parentNode,r):e.nodeType===1&&Fi(e,r),ul(e)):Fi(Oe,r.stateNode));break;case 4:n=Oe,l=wt,Oe=r.stateNode.containerInfo,wt=!0,Xt(e,t,r),Oe=n,wt=l;break;case 0:case 11:case 14:case 15:if(!Ve&&(n=r.updateQueue,n!==null&&(n=n.lastEffect,n!==null))){l=n=n.next;do{var o=l,i=o.destroy;o=o.tag,i!==void 0&&(o&2||o&4)&&$a(r,t,i),l=l.next}while(l!==n)}Xt(e,t,r);break;case 1:if(!Ve&&(on(r,t),n=r.stateNode,typeof n.componentWillUnmount=="function"))try{n.props=r.memoizedProps,n.state=r.memoizedState,n.componentWillUnmount()}catch(a){ke(r,t,a)}Xt(e,t,r);break;case 21:Xt(e,t,r);break;case 22:r.mode&1?(Ve=(n=Ve)||r.memoizedState!==null,Xt(e,t,r),Ve=n):Xt(e,t,r);break;default:Xt(e,t,r)}}function yc(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r=e.stateNode;r===null&&(r=e.stateNode=new Rv),t.forEach(function(n){var l=Fv.bind(null,e,n);r.has(n)||(r.add(n),n.then(l,l))})}}function gt(e,t){var r=t.deletions;if(r!==null)for(var n=0;nl&&(l=i),n&=~o}if(n=l,n=Ee()-n,n=(120>n?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*Lv(n/1960))-n,10e?16:e,ir===null)var n=!1;else{if(e=ir,ir=null,Qo=0,ne&6)throw Error(L(331));var l=ne;for(ne|=4,j=e.current;j!==null;){var o=j,i=o.child;if(j.flags&16){var a=o.deletions;if(a!==null){for(var s=0;sEe()-$s?Or(e,0):bs|=r),et(e,t)}function dp(e,t){t===0&&(e.mode&1?(t=Ql,Ql<<=1,!(Ql&130023424)&&(Ql=4194304)):t=1);var r=Qe();e=Bt(e,t),e!==null&&(Pl(e,t,r),et(e,r))}function Ov(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),dp(e,r)}function Fv(e,t){var r=0;switch(e.tag){case 13:var n=e.stateNode,l=e.memoizedState;l!==null&&(r=l.retryLane);break;case 19:n=e.stateNode;break;default:throw Error(L(314))}n!==null&&n.delete(t),dp(e,r)}var fp;fp=function(e,t,r){if(e!==null)if(e.memoizedProps!==t.pendingProps||Ze.current)Je=!0;else{if(!(e.lanes&r)&&!(t.flags&128))return Je=!1,Ev(e,t,r);Je=!!(e.flags&131072)}else Je=!1,ve&&t.flags&1048576&&vf(t,Io,t.index);switch(t.lanes=0,t.tag){case 2:var n=t.type;go(e,t),e=t.pendingProps;var l=vn(t,He.current);fn(t,r),l=Ts(null,t,n,e,l,r);var o=Ds();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,qe(n)?(o=!0,Oo(t)):o=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,_s(t),l.updater=ii,t.stateNode=l,l._reactInternals=t,Ta(t,n,e,r),t=Oa(null,t,n,!0,o,r)):(t.tag=0,ve&&o&&xs(t),We(null,t,l,r),t=t.child),t;case 16:n=t.elementType;e:{switch(go(e,t),e=t.pendingProps,l=n._init,n=l(n._payload),t.type=n,l=t.tag=bv(n),e=yt(n,e),l){case 0:t=ja(null,t,n,e,r);break e;case 1:t=pc(null,t,n,e,r);break e;case 11:t=dc(null,t,n,e,r);break e;case 14:t=fc(null,t,n,yt(n.type,e),r);break e}throw Error(L(306,n,""))}return t;case 0:return n=t.type,l=t.pendingProps,l=t.elementType===n?l:yt(n,l),ja(e,t,n,l,r);case 1:return n=t.type,l=t.pendingProps,l=t.elementType===n?l:yt(n,l),pc(e,t,n,l,r);case 3:e:{if(Yf(t),e===null)throw Error(L(387));n=t.pendingProps,o=t.memoizedState,l=o.element,Sf(e,t),Ao(t,n,null,r);var i=t.memoizedState;if(n=i.element,o.isDehydrated)if(o={element:n,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){l=xn(Error(L(423)),t),t=hc(e,t,n,r,l);break e}else if(n!==l){l=xn(Error(L(424)),t),t=hc(e,t,n,r,l);break e}else for(lt=cr(t.stateNode.containerInfo.firstChild),ot=t,ve=!0,xt=null,r=xf(t,null,n,r),t.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(gn(),n===l){t=Wt(e,t,r);break e}We(e,t,n,r)}t=t.child}return t;case 5:return Ef(t),e===null&&La(t),n=t.type,l=t.pendingProps,o=e!==null?e.memoizedProps:null,i=l.children,Ca(n,l)?i=null:o!==null&&Ca(n,o)&&(t.flags|=32),Gf(e,t),We(e,t,i,r),t.child;case 6:return e===null&&La(t),null;case 13:return Xf(e,t,r);case 4:return Ns(t,t.stateNode.containerInfo),n=t.pendingProps,e===null?t.child=yn(t,null,n,r):We(e,t,n,r),t.child;case 11:return n=t.type,l=t.pendingProps,l=t.elementType===n?l:yt(n,l),dc(e,t,n,l,r);case 7:return We(e,t,t.pendingProps,r),t.child;case 8:return We(e,t,t.pendingProps.children,r),t.child;case 12:return We(e,t,t.pendingProps.children,r),t.child;case 10:e:{if(n=t.type._context,l=t.pendingProps,o=t.memoizedProps,i=l.value,ce(bo,n._currentValue),n._currentValue=i,o!==null)if(Et(o.value,i)){if(o.children===l.children&&!Ze.current){t=Wt(e,t,r);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var a=o.dependencies;if(a!==null){i=o.child;for(var s=a.firstContext;s!==null;){if(s.context===n){if(o.tag===1){s=Ut(-1,r&-r),s.tag=2;var u=o.updateQueue;if(u!==null){u=u.shared;var c=u.pending;c===null?s.next=s:(s.next=c.next,c.next=s),u.pending=s}}o.lanes|=r,s=o.alternate,s!==null&&(s.lanes|=r),Ma(o.return,r,t),a.lanes|=r;break}s=s.next}}else if(o.tag===10)i=o.type===t.type?null:o.child;else if(o.tag===18){if(i=o.return,i===null)throw Error(L(341));i.lanes|=r,a=i.alternate,a!==null&&(a.lanes|=r),Ma(i,r,t),i=o.sibling}else i=o.child;if(i!==null)i.return=o;else for(i=o;i!==null;){if(i===t){i=null;break}if(o=i.sibling,o!==null){o.return=i.return,i=o;break}i=i.return}o=i}We(e,t,l.children,r),t=t.child}return t;case 9:return l=t.type,n=t.pendingProps.children,fn(t,r),l=ht(l),n=n(l),t.flags|=1,We(e,t,n,r),t.child;case 14:return n=t.type,l=yt(n,t.pendingProps),l=yt(n.type,l),fc(e,t,n,l,r);case 15:return Qf(e,t,t.type,t.pendingProps,r);case 17:return n=t.type,l=t.pendingProps,l=t.elementType===n?l:yt(n,l),go(e,t),t.tag=1,qe(n)?(e=!0,Oo(t)):e=!1,fn(t,r),Hf(t,n,l),Ta(t,n,l,r),Oa(null,t,n,!0,e,r);case 19:return Jf(e,t,r);case 22:return Kf(e,t,r)}throw Error(L(156,t.tag))};function pp(e,t){return $d(e,t)}function Iv(e,t,r,n){this.tag=e,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=n,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function ft(e,t,r,n){return new Iv(e,t,r,n)}function Hs(e){return e=e.prototype,!(!e||!e.isReactComponent)}function bv(e){if(typeof e=="function")return Hs(e)?1:0;if(e!=null){if(e=e.$$typeof,e===ss)return 11;if(e===us)return 14}return 2}function hr(e,t){var r=e.alternate;return r===null?(r=ft(e.tag,t,e.key,e.mode),r.elementType=e.elementType,r.type=e.type,r.stateNode=e.stateNode,r.alternate=e,e.alternate=r):(r.pendingProps=t,r.type=e.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=e.flags&14680064,r.childLanes=e.childLanes,r.lanes=e.lanes,r.child=e.child,r.memoizedProps=e.memoizedProps,r.memoizedState=e.memoizedState,r.updateQueue=e.updateQueue,t=e.dependencies,r.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},r.sibling=e.sibling,r.index=e.index,r.ref=e.ref,r}function xo(e,t,r,n,l,o){var i=2;if(n=e,typeof e=="function")Hs(e)&&(i=1);else if(typeof e=="string")i=5;else e:switch(e){case Xr:return Fr(r.children,l,o,t);case as:i=8,l|=8;break;case ra:return e=ft(12,r,t,l|2),e.elementType=ra,e.lanes=o,e;case na:return e=ft(13,r,t,l),e.elementType=na,e.lanes=o,e;case la:return e=ft(19,r,t,l),e.elementType=la,e.lanes=o,e;case Sd:return ui(r,l,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case xd:i=10;break e;case kd:i=9;break e;case ss:i=11;break e;case us:i=14;break e;case qt:i=16,n=null;break e}throw Error(L(130,e==null?e:typeof e,""))}return t=ft(i,r,t,l),t.elementType=e,t.type=n,t.lanes=o,t}function Fr(e,t,r,n){return e=ft(7,e,n,t),e.lanes=r,e}function ui(e,t,r,n){return e=ft(22,e,n,t),e.elementType=Sd,e.lanes=r,e.stateNode={isHidden:!1},e}function Bi(e,t,r){return e=ft(6,e,null,t),e.lanes=r,e}function Wi(e,t,r){return t=ft(4,e.children!==null?e.children:[],e.key,t),t.lanes=r,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function $v(e,t,r,n,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Pi(0),this.expirationTimes=Pi(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Pi(0),this.identifierPrefix=n,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function Bs(e,t,r,n,l,o,i,a,s){return e=new $v(e,t,r,a,s),t===1?(t=1,o===!0&&(t|=8)):t=0,o=ft(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:n,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},_s(o),e}function Av(e,t,r){var n=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(gp)}catch(e){console.error(e)}}gp(),vd.exports=at;var yp=vd.exports,Rc=yp;ea.createRoot=Rc.createRoot,ea.hydrateRoot=Rc.hydrateRoot;/** + * react-router v7.8.0 + * + * 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 + */var wp=e=>{throw TypeError(e)},Wv=(e,t,r)=>t.has(e)||wp("Cannot "+r),Qi=(e,t,r)=>(Wv(e,t,"read from private field"),r?r.call(e):t.get(e)),Qv=(e,t,r)=>t.has(e)?wp("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),_c="popstate";function Kv(e={}){function t(n,l){let{pathname:o,search:i,hash:a}=n.location;return kl("",{pathname:o,search:i,hash:a},l.state&&l.state.usr||null,l.state&&l.state.key||"default")}function r(n,l){return typeof l=="string"?l:gr(l)}return Yv(t,r,null,e)}function J(e,t){if(e===!1||e===null||typeof e>"u")throw new Error(t)}function Pe(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function Gv(){return Math.random().toString(36).substring(2,10)}function Nc(e,t){return{usr:e.state,key:e.key,idx:t}}function kl(e,t,r=null,n){return{pathname:typeof e=="string"?e:e.pathname,search:"",hash:"",...typeof t=="string"?kr(t):t,state:r,key:t&&t.key||n||Gv()}}function gr({pathname:e="/",search:t="",hash:r=""}){return t&&t!=="?"&&(e+=t.charAt(0)==="?"?t:"?"+t),r&&r!=="#"&&(e+=r.charAt(0)==="#"?r:"#"+r),e}function kr(e){let t={};if(e){let r=e.indexOf("#");r>=0&&(t.hash=e.substring(r),e=e.substring(0,r));let n=e.indexOf("?");n>=0&&(t.search=e.substring(n),e=e.substring(0,n)),e&&(t.pathname=e)}return t}function Yv(e,t,r,n={}){let{window:l=document.defaultView,v5Compat:o=!1}=n,i=l.history,a="POP",s=null,u=c();u==null&&(u=0,i.replaceState({...i.state,idx:u},""));function c(){return(i.state||{idx:null}).idx}function p(){a="POP";let M=c(),d=M==null?null:M-u;u=M,s&&s({action:a,location:S.location,delta:d})}function f(M,d){a="PUSH";let h=kl(S.location,M,d);u=c()+1;let m=Nc(h,u),C=S.createHref(h);try{i.pushState(m,"",C)}catch(_){if(_ instanceof DOMException&&_.name==="DataCloneError")throw _;l.location.assign(C)}o&&s&&s({action:a,location:S.location,delta:1})}function y(M,d){a="REPLACE";let h=kl(S.location,M,d);u=c();let m=Nc(h,u),C=S.createHref(h);i.replaceState(m,"",C),o&&s&&s({action:a,location:S.location,delta:0})}function k(M){return xp(M)}let S={get action(){return a},get location(){return e(l,i)},listen(M){if(s)throw new Error("A history only accepts one active listener");return l.addEventListener(_c,p),s=M,()=>{l.removeEventListener(_c,p),s=null}},createHref(M){return t(l,M)},createURL:k,encodeLocation(M){let d=k(M);return{pathname:d.pathname,search:d.search,hash:d.hash}},push:f,replace:y,go(M){return i.go(M)}};return S}function xp(e,t=!1){let r="http://localhost";typeof window<"u"&&(r=window.location.origin!=="null"?window.location.origin:window.location.href),J(r,"No window.location.(origin|href) available to create URL");let n=typeof e=="string"?e:gr(e);return n=n.replace(/ $/,"%20"),!t&&n.startsWith("//")&&(n=r+n),new URL(n,r)}var Kn,Lc=class{constructor(e){if(Qv(this,Kn,new Map),e)for(let[t,r]of e)this.set(t,r)}get(e){if(Qi(this,Kn).has(e))return Qi(this,Kn).get(e);if(e.defaultValue!==void 0)return e.defaultValue;throw new Error("No value found for context")}set(e,t){Qi(this,Kn).set(e,t)}};Kn=new WeakMap;var Xv=new Set(["lazy","caseSensitive","path","id","index","children"]);function Jv(e){return Xv.has(e)}var Zv=new Set(["lazy","caseSensitive","path","id","index","unstable_middleware","children"]);function qv(e){return Zv.has(e)}function eg(e){return e.index===!0}function Sl(e,t,r=[],n={},l=!1){return e.map((o,i)=>{let a=[...r,String(i)],s=typeof o.id=="string"?o.id:a.join("-");if(J(o.index!==!0||!o.children,"Cannot specify children on an index route"),J(l||!n[s],`Found a route id collision on id "${s}". Route id's must be globally unique within Data Router usages`),eg(o)){let u={...o,...t(o),id:s};return n[s]=u,u}else{let u={...o,...t(o),id:s,children:void 0};return n[s]=u,o.children&&(u.children=Sl(o.children,t,a,n,l)),u}})}function nr(e,t,r="/"){return ko(e,t,r,!1)}function ko(e,t,r,n){let l=typeof t=="string"?kr(t):t,o=vt(l.pathname||"/",r);if(o==null)return null;let i=kp(e);rg(i);let a=null;for(let s=0;a==null&&s{let s={relativePath:a===void 0?o.path||"":a,caseSensitive:o.caseSensitive===!0,childrenIndex:i,route:o};s.relativePath.startsWith("/")&&(J(s.relativePath.startsWith(n),`Absolute route path "${s.relativePath}" nested under path "${n}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),s.relativePath=s.relativePath.slice(n.length));let u=Tt([n,s.relativePath]),c=r.concat(s);o.children&&o.children.length>0&&(J(o.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${u}".`),kp(o.children,t,c,u)),!(o.path==null&&!o.index)&&t.push({path:u,score:ug(u,o.index),routesMeta:c})};return e.forEach((o,i)=>{var a;if(o.path===""||!((a=o.path)!=null&&a.includes("?")))l(o,i);else for(let s of Sp(o.path))l(o,i,s)}),t}function Sp(e){let t=e.split("/");if(t.length===0)return[];let[r,...n]=t,l=r.endsWith("?"),o=r.replace(/\?$/,"");if(n.length===0)return l?[o,""]:[o];let i=Sp(n.join("/")),a=[];return a.push(...i.map(s=>s===""?o:[o,s].join("/"))),l&&a.push(...i),a.map(s=>e.startsWith("/")&&s===""?"/":s)}function rg(e){e.sort((t,r)=>t.score!==r.score?r.score-t.score:cg(t.routesMeta.map(n=>n.childrenIndex),r.routesMeta.map(n=>n.childrenIndex)))}var ng=/^:[\w-]+$/,lg=3,og=2,ig=1,ag=10,sg=-2,Mc=e=>e==="*";function ug(e,t){let r=e.split("/"),n=r.length;return r.some(Mc)&&(n+=sg),t&&(n+=og),r.filter(l=>!Mc(l)).reduce((l,o)=>l+(ng.test(o)?lg:o===""?ig:ag),n)}function cg(e,t){return e.length===t.length&&e.slice(0,-1).every((n,l)=>n===t[l])?e[e.length-1]-t[t.length-1]:0}function dg(e,t,r=!1){let{routesMeta:n}=e,l={},o="/",i=[];for(let a=0;a{if(c==="*"){let k=a[f]||"";i=o.slice(0,o.length-k.length).replace(/(.)\/+$/,"$1")}const y=a[f];return p&&!y?u[c]=void 0:u[c]=(y||"").replace(/%2F/g,"/"),u},{}),pathname:o,pathnameBase:i,pattern:e}}function fg(e,t=!1,r=!0){Pe(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=[],l="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(i,a,s)=>(n.push({paramName:a,isOptional:s!=null}),s?"/?([^\\/]+)?":"/([^\\/]+)"));return e.endsWith("*")?(n.push({paramName:"*"}),l+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?l+="\\/*$":e!==""&&e!=="/"&&(l+="(?:(?=\\/|$))"),[new RegExp(l,t?void 0:"i"),n]}function pg(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return Pe(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function vt(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)||"/"}function hg({basename:e,pathname:t}){return t==="/"?e:Tt([e,t])}function mg(e,t="/"){let{pathname:r,search:n="",hash:l=""}=typeof e=="string"?kr(e):e;return{pathname:r?r.startsWith("/")?r:vg(r,t):t,search:yg(n),hash:wg(l)}}function vg(e,t){let r=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(l=>{l===".."?r.length>1&&r.pop():l!=="."&&r.push(l)}),r.length>1?r.join("/"):"/"}function Ki(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 and the router will parse it for you.`}function Ep(e){return e.filter((t,r)=>r===0||t.route.path&&t.route.path.length>0)}function Gs(e){let t=Ep(e);return t.map((r,n)=>n===t.length-1?r.pathname:r.pathnameBase)}function Ys(e,t,r,n=!1){let l;typeof e=="string"?l=kr(e):(l={...e},J(!l.pathname||!l.pathname.includes("?"),Ki("?","pathname","search",l)),J(!l.pathname||!l.pathname.includes("#"),Ki("#","pathname","hash",l)),J(!l.search||!l.search.includes("#"),Ki("#","search","hash",l)));let o=e===""||l.pathname==="",i=o?"/":l.pathname,a;if(i==null)a=r;else{let p=t.length-1;if(!n&&i.startsWith("..")){let f=i.split("/");for(;f[0]==="..";)f.shift(),p-=1;l.pathname=f.join("/")}a=p>=0?t[p]:"/"}let s=mg(l,a),u=i&&i!=="/"&&i.endsWith("/"),c=(o||i===".")&&r.endsWith("/");return!s.pathname.endsWith("/")&&(u||c)&&(s.pathname+="/"),s}var Tt=e=>e.join("/").replace(/\/\/+/g,"/"),gg=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),yg=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,wg=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e,Xo=class{constructor(e,t,r,n=!1){this.status=e,this.statusText=t||"",this.internal=n,r instanceof Error?(this.data=r.toString(),this.error=r):this.data=r}};function El(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}var Cp=["POST","PUT","PATCH","DELETE"],xg=new Set(Cp),kg=["GET",...Cp],Sg=new Set(kg),Eg=new Set([301,302,303,307,308]),Cg=new Set([307,308]),Gi={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},Pg={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},$n={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},Rg=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Xs=e=>Rg.test(e),_g=e=>({hasErrorBoundary:!!e.hasErrorBoundary}),Pp="remix-router-transitions",Rp=Symbol("ResetLoaderData");function Ng(e){const t=e.window?e.window:typeof window<"u"?window:void 0,r=typeof t<"u"&&typeof t.document<"u"&&typeof t.document.createElement<"u";J(e.routes.length>0,"You must provide a non-empty routes array to createRouter");let n=e.hydrationRouteProperties||[],l=e.mapRouteProperties||_g,o={},i=Sl(e.routes,l,void 0,o),a,s=e.basename||"/",u=e.dataStrategy||Dg,c={unstable_middleware:!1,...e.future},p=null,f=new Set,y=null,k=null,S=null,M=e.hydrationData!=null,d=nr(i,e.history.location,s),h=!1,m=null,C;if(d==null&&!e.patchRoutesOnNavigation){let v=ut(404,{pathname:e.history.location.pathname}),{matches:w,route:E}=Vc(i);C=!0,d=w,m={[E.id]:v}}else if(d&&!e.hydrationData&&Ol(d,i,e.history.location.pathname).active&&(d=null),d)if(d.some(v=>v.route.lazy))C=!1;else if(!d.some(v=>v.route.loader))C=!0;else{let v=e.hydrationData?e.hydrationData.loaderData:null,w=e.hydrationData?e.hydrationData.errors:null;if(w){let E=d.findIndex(N=>w[N.route.id]!==void 0);C=d.slice(0,E+1).every(N=>!Ga(N.route,v,w))}else C=d.every(E=>!Ga(E.route,v,w))}else{C=!1,d=[];let v=Ol(null,i,e.history.location.pathname);v.active&&v.matches&&(h=!0,d=v.matches)}let _,g={historyAction:e.history.action,location:e.history.location,matches:d,initialized:C,navigation:Gi,restoreScrollPosition:e.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:e.hydrationData&&e.hydrationData.loaderData||{},actionData:e.hydrationData&&e.hydrationData.actionData||null,errors:e.hydrationData&&e.hydrationData.errors||m,fetchers:new Map,blockers:new Map},z="POP",R=!1,O,V=!1,ue=new Map,Me=null,je=!1,te=!1,oe=new Set,Y=new Map,se=0,P=-1,b=new Map,A=new Set,q=new Map,re=new Map,ee=new Set,ie=new Map,tt,ze=null;function de(){if(p=e.history.listen(({action:v,location:w,delta:E})=>{if(tt){tt(),tt=void 0;return}Pe(ie.size===0||E!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let N=hu({currentLocation:g.location,nextLocation:w,historyAction:v});if(N&&E!=null){let D=new Promise(U=>{tt=U});e.history.go(E*-1),jl(N,{state:"blocked",location:w,proceed(){jl(N,{state:"proceeding",proceed:void 0,reset:void 0,location:w}),D.then(()=>e.history.go(E))},reset(){let U=new Map(g.blockers);U.set(N,$n),Se({blockers:U})}});return}return Cr(v,w)}),r){Bg(t,ue);let v=()=>Wg(t,ue);t.addEventListener("pagehide",v),Me=()=>t.removeEventListener("pagehide",v)}return g.initialized||Cr("POP",g.location,{initialHydration:!0}),_}function Dl(){p&&p(),Me&&Me(),f.clear(),O&&O.abort(),g.fetchers.forEach((v,w)=>gi(w)),g.blockers.forEach((v,w)=>pu(w))}function Wr(v){return f.add(v),()=>f.delete(v)}function Se(v,w={}){v.matches&&(v.matches=v.matches.map(D=>{let U=o[D.route.id],H=D.route;return H.element!==U.element||H.errorElement!==U.errorElement||H.hydrateFallbackElement!==U.hydrateFallbackElement?{...D,route:U}:D})),g={...g,...v};let E=[],N=[];g.fetchers.forEach((D,U)=>{D.state==="idle"&&(ee.has(U)?E.push(U):N.push(U))}),ee.forEach(D=>{!g.fetchers.has(D)&&!Y.has(D)&&E.push(D)}),[...f].forEach(D=>D(g,{deletedFetchers:E,viewTransitionOpts:w.viewTransitionOpts,flushSync:w.flushSync===!0})),E.forEach(D=>gi(D)),N.forEach(D=>g.fetchers.delete(D))}function Pt(v,w,{flushSync:E}={}){var Q,B;let N=g.actionData!=null&&g.navigation.formMethod!=null&&Ye(g.navigation.formMethod)&&g.navigation.state==="loading"&&((Q=v.state)==null?void 0:Q._isRedirect)!==!0,D;w.actionData?Object.keys(w.actionData).length>0?D=w.actionData:D=null:N?D=g.actionData:D=null;let U=w.loaderData?Ac(g.loaderData,w.loaderData,w.matches||[],w.errors):g.loaderData,H=g.blockers;H.size>0&&(H=new Map(H),H.forEach((G,me)=>H.set(me,$n)));let $=je?!1:vu(v,w.matches||g.matches),W=R===!0||g.navigation.formMethod!=null&&Ye(g.navigation.formMethod)&&((B=v.state)==null?void 0:B._isRedirect)!==!0;a&&(i=a,a=void 0),je||z==="POP"||(z==="PUSH"?e.history.push(v,v.state):z==="REPLACE"&&e.history.replace(v,v.state));let K;if(z==="POP"){let G=ue.get(g.location.pathname);G&&G.has(v.pathname)?K={currentLocation:g.location,nextLocation:v}:ue.has(v.pathname)&&(K={currentLocation:v,nextLocation:g.location})}else if(V){let G=ue.get(g.location.pathname);G?G.add(v.pathname):(G=new Set([v.pathname]),ue.set(g.location.pathname,G)),K={currentLocation:g.location,nextLocation:v}}Se({...w,actionData:D,loaderData:U,historyAction:z,location:v,initialized:!0,navigation:Gi,revalidation:"idle",restoreScrollPosition:$,preventScrollReset:W,blockers:H},{viewTransitionOpts:K,flushSync:E===!0}),z="POP",R=!1,V=!1,je=!1,te=!1,ze==null||ze.resolve(),ze=null}async function Er(v,w){if(typeof v=="number"){e.history.go(v);return}let E=Ka(g.location,g.matches,s,v,w==null?void 0:w.fromRouteId,w==null?void 0:w.relative),{path:N,submission:D,error:U}=zc(!1,E,w),H=g.location,$=kl(g.location,N,w&&w.state);$={...$,...e.history.encodeLocation($)};let W=w&&w.replace!=null?w.replace:void 0,K="PUSH";W===!0?K="REPLACE":W===!1||D!=null&&Ye(D.formMethod)&&D.formAction===g.location.pathname+g.location.search&&(K="REPLACE");let Q=w&&"preventScrollReset"in w?w.preventScrollReset===!0:void 0,B=(w&&w.flushSync)===!0,G=hu({currentLocation:H,nextLocation:$,historyAction:K});if(G){jl(G,{state:"blocked",location:$,proceed(){jl(G,{state:"proceeding",proceed:void 0,reset:void 0,location:$}),Er(v,w)},reset(){let me=new Map(g.blockers);me.set(G,$n),Se({blockers:me})}});return}await Cr(K,$,{submission:D,pendingError:U,preventScrollReset:Q,replace:w&&w.replace,enableViewTransition:w&&w.viewTransition,flushSync:B})}function lh(){ze||(ze=Qg()),vi(),Se({revalidation:"loading"});let v=ze.promise;return g.navigation.state==="submitting"?v:g.navigation.state==="idle"?(Cr(g.historyAction,g.location,{startUninterruptedRevalidation:!0}),v):(Cr(z||g.historyAction,g.navigation.location,{overrideNavigation:g.navigation,enableViewTransition:V===!0}),v)}async function Cr(v,w,E){O&&O.abort(),O=null,z=v,je=(E&&E.startUninterruptedRevalidation)===!0,hh(g.location,g.matches),R=(E&&E.preventScrollReset)===!0,V=(E&&E.enableViewTransition)===!0;let N=a||i,D=E&&E.overrideNavigation,U=E!=null&&E.initialHydration&&g.matches&&g.matches.length>0&&!h?g.matches:nr(N,w,s),H=(E&&E.flushSync)===!0;if(U&&g.initialized&&!te&&$g(g.location,w)&&!(E&&E.submission&&Ye(E.submission.formMethod))){Pt(w,{matches:U},{flushSync:H});return}let $=Ol(U,N,w.pathname);if($.active&&$.matches&&(U=$.matches),!U){let{error:Be,notFoundMatches:ge,route:fe}=yi(w.pathname);Pt(w,{matches:ge,loaderData:{},errors:{[fe.id]:Be}},{flushSync:H});return}O=new AbortController;let W=Gr(e.history,w,O.signal,E&&E.submission),K=e.unstable_getContext?await e.unstable_getContext():new Lc,Q;if(E&&E.pendingError)Q=[lr(U).route.id,{type:"error",error:E.pendingError}];else if(E&&E.submission&&Ye(E.submission.formMethod)){let Be=await oh(W,w,E.submission,U,K,$.active,E&&E.initialHydration===!0,{replace:E.replace,flushSync:H});if(Be.shortCircuited)return;if(Be.pendingActionResult){let[ge,fe]=Be.pendingActionResult;if(nt(fe)&&El(fe.error)&&fe.error.status===404){O=null,Pt(w,{matches:Be.matches,loaderData:{},errors:{[ge]:fe.error}});return}}U=Be.matches||U,Q=Be.pendingActionResult,D=Yi(w,E.submission),H=!1,$.active=!1,W=Gr(e.history,W.url,W.signal)}let{shortCircuited:B,matches:G,loaderData:me,errors:be}=await ih(W,w,U,K,$.active,D,E&&E.submission,E&&E.fetcherSubmission,E&&E.replace,E&&E.initialHydration===!0,H,Q);B||(O=null,Pt(w,{matches:G||U,...Uc(Q),loaderData:me,errors:be}))}async function oh(v,w,E,N,D,U,H,$={}){vi();let W=Vg(w,E);if(Se({navigation:W},{flushSync:$.flushSync===!0}),U){let B=await Fl(N,w.pathname,v.signal);if(B.type==="aborted")return{shortCircuited:!0};if(B.type==="error"){let G=lr(B.partialMatches).route.id;return{matches:B.partialMatches,pendingActionResult:[G,{type:"error",error:B.error}]}}else if(B.matches)N=B.matches;else{let{notFoundMatches:G,error:me,route:be}=yi(w.pathname);return{matches:G,pendingActionResult:[be.id,{type:"error",error:me}]}}}let K,Q=So(N,w);if(!Q.route.action&&!Q.route.lazy)K={type:"error",error:ut(405,{method:v.method,pathname:w.pathname,routeId:Q.route.id})};else{let B=hn(l,o,v,N,Q,H?[]:n,D),G=await _n(v,B,D,null);if(K=G[Q.route.id],!K){for(let me of N)if(G[me.route.id]){K=G[me.route.id];break}}if(v.signal.aborted)return{shortCircuited:!0}}if(jr(K)){let B;return $&&$.replace!=null?B=$.replace:B=Ic(K.response.headers.get("Location"),new URL(v.url),s)===g.location.pathname+g.location.search,await Pr(v,K,!0,{submission:E,replace:B}),{shortCircuited:!0}}if(nt(K)){let B=lr(N,Q.route.id);return($&&$.replace)!==!0&&(z="PUSH"),{matches:N,pendingActionResult:[B.route.id,K,Q.route.id]}}return{matches:N,pendingActionResult:[Q.route.id,K]}}async function ih(v,w,E,N,D,U,H,$,W,K,Q,B){let G=U||Yi(w,H),me=H||$||Bc(G),be=!je&&!K;if(D){if(be){let $e=au(B);Se({navigation:G,...$e!==void 0?{actionData:$e}:{}},{flushSync:Q})}let le=await Fl(E,w.pathname,v.signal);if(le.type==="aborted")return{shortCircuited:!0};if(le.type==="error"){let $e=lr(le.partialMatches).route.id;return{matches:le.partialMatches,loaderData:{},errors:{[$e]:le.error}}}else if(le.matches)E=le.matches;else{let{error:$e,notFoundMatches:$l,route:Mn}=yi(w.pathname);return{matches:$l,loaderData:{},errors:{[Mn.id]:$e}}}}let Be=a||i,{dsMatches:ge,revalidatingFetchers:fe}=Tc(v,N,l,o,e.history,g,E,me,w,K?[]:n,K===!0,te,oe,ee,q,A,Be,s,e.patchRoutesOnNavigation!=null,B);if(P=++se,!e.dataStrategy&&!ge.some(le=>le.shouldLoad)&&!ge.some(le=>le.route.unstable_middleware)&&fe.length===0){let le=du();return Pt(w,{matches:E,loaderData:{},errors:B&&nt(B[1])?{[B[0]]:B[1].error}:null,...Uc(B),...le?{fetchers:new Map(g.fetchers)}:{}},{flushSync:Q}),{shortCircuited:!0}}if(be){let le={};if(!D){le.navigation=G;let $e=au(B);$e!==void 0&&(le.actionData=$e)}fe.length>0&&(le.fetchers=ah(fe)),Se(le,{flushSync:Q})}fe.forEach(le=>{Gt(le.key),le.controller&&Y.set(le.key,le.controller)});let Rr=()=>fe.forEach(le=>Gt(le.key));O&&O.signal.addEventListener("abort",Rr);let{loaderResults:Nn,fetcherResults:Yt}=await su(ge,fe,v,N);if(v.signal.aborted)return{shortCircuited:!0};O&&O.signal.removeEventListener("abort",Rr),fe.forEach(le=>Y.delete(le.key));let Rt=lo(Nn);if(Rt)return await Pr(v,Rt.result,!0,{replace:W}),{shortCircuited:!0};if(Rt=lo(Yt),Rt)return A.add(Rt.key),await Pr(v,Rt.result,!0,{replace:W}),{shortCircuited:!0};let{loaderData:wi,errors:Ln}=$c(g,E,Nn,B,fe,Yt);K&&g.errors&&(Ln={...g.errors,...Ln});let _r=du(),Il=fu(P),bl=_r||Il||fe.length>0;return{matches:E,loaderData:wi,errors:Ln,...bl?{fetchers:new Map(g.fetchers)}:{}}}function au(v){if(v&&!nt(v[1]))return{[v[0]]:v[1].data};if(g.actionData)return Object.keys(g.actionData).length===0?null:g.actionData}function ah(v){return v.forEach(w=>{let E=g.fetchers.get(w.key),N=An(void 0,E?E.data:void 0);g.fetchers.set(w.key,N)}),new Map(g.fetchers)}async function sh(v,w,E,N){Gt(v);let D=(N&&N.flushSync)===!0,U=a||i,H=Ka(g.location,g.matches,s,E,w,N==null?void 0:N.relative),$=nr(U,H,s),W=Ol($,U,H);if(W.active&&W.matches&&($=W.matches),!$){Ot(v,w,ut(404,{pathname:H}),{flushSync:D});return}let{path:K,submission:Q,error:B}=zc(!0,H,N);if(B){Ot(v,w,B,{flushSync:D});return}let G=e.unstable_getContext?await e.unstable_getContext():new Lc,me=(N&&N.preventScrollReset)===!0;if(Q&&Ye(Q.formMethod)){await uh(v,w,K,$,G,W.active,D,me,Q);return}q.set(v,{routeId:w,path:K}),await ch(v,w,K,$,G,W.active,D,me,Q)}async function uh(v,w,E,N,D,U,H,$,W){vi(),q.delete(v);let K=g.fetchers.get(v);Kt(v,Hg(W,K),{flushSync:H});let Q=new AbortController,B=Gr(e.history,E,Q.signal,W);if(U){let Re=await Fl(N,new URL(B.url).pathname,B.signal,v);if(Re.type==="aborted")return;if(Re.type==="error"){Ot(v,w,Re.error,{flushSync:H});return}else if(Re.matches)N=Re.matches;else{Ot(v,w,ut(404,{pathname:E}),{flushSync:H});return}}let G=So(N,E);if(!G.route.action&&!G.route.lazy){let Re=ut(405,{method:W.formMethod,pathname:E,routeId:w});Ot(v,w,Re,{flushSync:H});return}Y.set(v,Q);let me=se,be=hn(l,o,B,N,G,n,D),ge=(await _n(B,be,D,v))[G.route.id];if(B.signal.aborted){Y.get(v)===Q&&Y.delete(v);return}if(ee.has(v)){if(jr(ge)||nt(ge)){Kt(v,Zt(void 0));return}}else{if(jr(ge))if(Y.delete(v),P>me){Kt(v,Zt(void 0));return}else return A.add(v),Kt(v,An(W)),Pr(B,ge,!1,{fetcherSubmission:W,preventScrollReset:$});if(nt(ge)){Ot(v,w,ge.error);return}}let fe=g.navigation.location||g.location,Rr=Gr(e.history,fe,Q.signal),Nn=a||i,Yt=g.navigation.state!=="idle"?nr(Nn,g.navigation.location,s):g.matches;J(Yt,"Didn't find any matches after fetcher action");let Rt=++se;b.set(v,Rt);let wi=An(W,ge.data);g.fetchers.set(v,wi);let{dsMatches:Ln,revalidatingFetchers:_r}=Tc(Rr,D,l,o,e.history,g,Yt,W,fe,n,!1,te,oe,ee,q,A,Nn,s,e.patchRoutesOnNavigation!=null,[G.route.id,ge]);_r.filter(Re=>Re.key!==v).forEach(Re=>{let Al=Re.key,gu=g.fetchers.get(Al),gh=An(void 0,gu?gu.data:void 0);g.fetchers.set(Al,gh),Gt(Al),Re.controller&&Y.set(Al,Re.controller)}),Se({fetchers:new Map(g.fetchers)});let Il=()=>_r.forEach(Re=>Gt(Re.key));Q.signal.addEventListener("abort",Il);let{loaderResults:bl,fetcherResults:le}=await su(Ln,_r,Rr,D);if(Q.signal.aborted)return;if(Q.signal.removeEventListener("abort",Il),b.delete(v),Y.delete(v),_r.forEach(Re=>Y.delete(Re.key)),g.fetchers.has(v)){let Re=Zt(ge.data);g.fetchers.set(v,Re)}let $e=lo(bl);if($e)return Pr(Rr,$e.result,!1,{preventScrollReset:$});if($e=lo(le),$e)return A.add($e.key),Pr(Rr,$e.result,!1,{preventScrollReset:$});let{loaderData:$l,errors:Mn}=$c(g,Yt,bl,void 0,_r,le);fu(Rt),g.navigation.state==="loading"&&Rt>P?(J(z,"Expected pending action"),O&&O.abort(),Pt(g.navigation.location,{matches:Yt,loaderData:$l,errors:Mn,fetchers:new Map(g.fetchers)})):(Se({errors:Mn,loaderData:Ac(g.loaderData,$l,Yt,Mn),fetchers:new Map(g.fetchers)}),te=!1)}async function ch(v,w,E,N,D,U,H,$,W){let K=g.fetchers.get(v);Kt(v,An(W,K?K.data:void 0),{flushSync:H});let Q=new AbortController,B=Gr(e.history,E,Q.signal);if(U){let fe=await Fl(N,new URL(B.url).pathname,B.signal,v);if(fe.type==="aborted")return;if(fe.type==="error"){Ot(v,w,fe.error,{flushSync:H});return}else if(fe.matches)N=fe.matches;else{Ot(v,w,ut(404,{pathname:E}),{flushSync:H});return}}let G=So(N,E);Y.set(v,Q);let me=se,be=hn(l,o,B,N,G,n,D),ge=(await _n(B,be,D,v))[G.route.id];if(Y.get(v)===Q&&Y.delete(v),!B.signal.aborted){if(ee.has(v)){Kt(v,Zt(void 0));return}if(jr(ge))if(P>me){Kt(v,Zt(void 0));return}else{A.add(v),await Pr(B,ge,!1,{preventScrollReset:$});return}if(nt(ge)){Ot(v,w,ge.error);return}Kt(v,Zt(ge.data))}}async function Pr(v,w,E,{submission:N,fetcherSubmission:D,preventScrollReset:U,replace:H}={}){w.response.headers.has("X-Remix-Revalidate")&&(te=!0);let $=w.response.headers.get("Location");J($,"Expected a Location header on the redirect Response"),$=Ic($,new URL(v.url),s);let W=kl(g.location,$,{_isRedirect:!0});if(r){let be=!1;if(w.response.headers.has("X-Remix-Reload-Document"))be=!0;else if(Xs($)){const Be=xp($,!0);be=Be.origin!==t.location.origin||vt(Be.pathname,s)==null}if(be){H?t.location.replace($):t.location.assign($);return}}O=null;let K=H===!0||w.response.headers.has("X-Remix-Replace")?"REPLACE":"PUSH",{formMethod:Q,formAction:B,formEncType:G}=g.navigation;!N&&!D&&Q&&B&&G&&(N=Bc(g.navigation));let me=N||D;if(Cg.has(w.response.status)&&me&&Ye(me.formMethod))await Cr(K,W,{submission:{...me,formAction:$},preventScrollReset:U||R,enableViewTransition:E?V:void 0});else{let be=Yi(W,N);await Cr(K,W,{overrideNavigation:be,fetcherSubmission:D,preventScrollReset:U||R,enableViewTransition:E?V:void 0})}}async function _n(v,w,E,N){let D,U={};try{D=await jg(u,v,w,N,E,!1)}catch(H){return w.filter($=>$.shouldLoad).forEach($=>{U[$.route.id]={type:"error",error:H}}),U}if(v.signal.aborted)return U;for(let[H,$]of Object.entries(D))if(Ag($)){let W=$.result;U[H]={type:"redirect",response:Ig(W,v,H,w,s)}}else U[H]=await Fg($);return U}async function su(v,w,E,N){let D=_n(E,v,N,null),U=Promise.all(w.map(async W=>{if(W.matches&&W.match&&W.request&&W.controller){let Q=(await _n(W.request,W.matches,N,W.key))[W.match.route.id];return{[W.key]:Q}}else return Promise.resolve({[W.key]:{type:"error",error:ut(404,{pathname:W.path})}})})),H=await D,$=(await U).reduce((W,K)=>Object.assign(W,K),{});return{loaderResults:H,fetcherResults:$}}function vi(){te=!0,q.forEach((v,w)=>{Y.has(w)&&oe.add(w),Gt(w)})}function Kt(v,w,E={}){g.fetchers.set(v,w),Se({fetchers:new Map(g.fetchers)},{flushSync:(E&&E.flushSync)===!0})}function Ot(v,w,E,N={}){let D=lr(g.matches,w);gi(v),Se({errors:{[D.route.id]:E},fetchers:new Map(g.fetchers)},{flushSync:(N&&N.flushSync)===!0})}function uu(v){return re.set(v,(re.get(v)||0)+1),ee.has(v)&&ee.delete(v),g.fetchers.get(v)||Pg}function gi(v){let w=g.fetchers.get(v);Y.has(v)&&!(w&&w.state==="loading"&&b.has(v))&&Gt(v),q.delete(v),b.delete(v),A.delete(v),ee.delete(v),oe.delete(v),g.fetchers.delete(v)}function dh(v){let w=(re.get(v)||0)-1;w<=0?(re.delete(v),ee.add(v)):re.set(v,w),Se({fetchers:new Map(g.fetchers)})}function Gt(v){let w=Y.get(v);w&&(w.abort(),Y.delete(v))}function cu(v){for(let w of v){let E=uu(w),N=Zt(E.data);g.fetchers.set(w,N)}}function du(){let v=[],w=!1;for(let E of A){let N=g.fetchers.get(E);J(N,`Expected fetcher: ${E}`),N.state==="loading"&&(A.delete(E),v.push(E),w=!0)}return cu(v),w}function fu(v){let w=[];for(let[E,N]of b)if(N0}function fh(v,w){let E=g.blockers.get(v)||$n;return ie.get(v)!==w&&ie.set(v,w),E}function pu(v){g.blockers.delete(v),ie.delete(v)}function jl(v,w){let E=g.blockers.get(v)||$n;J(E.state==="unblocked"&&w.state==="blocked"||E.state==="blocked"&&w.state==="blocked"||E.state==="blocked"&&w.state==="proceeding"||E.state==="blocked"&&w.state==="unblocked"||E.state==="proceeding"&&w.state==="unblocked",`Invalid blocker state transition: ${E.state} -> ${w.state}`);let N=new Map(g.blockers);N.set(v,w),Se({blockers:N})}function hu({currentLocation:v,nextLocation:w,historyAction:E}){if(ie.size===0)return;ie.size>1&&Pe(!1,"A router only supports one blocker at a time");let N=Array.from(ie.entries()),[D,U]=N[N.length-1],H=g.blockers.get(D);if(!(H&&H.state==="proceeding")&&U({currentLocation:v,nextLocation:w,historyAction:E}))return D}function yi(v){let w=ut(404,{pathname:v}),E=a||i,{matches:N,route:D}=Vc(E);return{notFoundMatches:N,route:D,error:w}}function ph(v,w,E){if(y=v,S=w,k=E||null,!M&&g.navigation===Gi){M=!0;let N=vu(g.location,g.matches);N!=null&&Se({restoreScrollPosition:N})}return()=>{y=null,S=null,k=null}}function mu(v,w){return k&&k(v,w.map(N=>tg(N,g.loaderData)))||v.key}function hh(v,w){if(y&&S){let E=mu(v,w);y[E]=S()}}function vu(v,w){if(y){let E=mu(v,w),N=y[E];if(typeof N=="number")return N}return null}function Ol(v,w,E){if(e.patchRoutesOnNavigation)if(v){if(Object.keys(v[0].params).length>0)return{active:!0,matches:ko(w,E,s,!0)}}else return{active:!0,matches:ko(w,E,s,!0)||[]};return{active:!1,matches:null}}async function Fl(v,w,E,N){if(!e.patchRoutesOnNavigation)return{type:"success",matches:v};let D=v;for(;;){let U=a==null,H=a||i,$=o;try{await e.patchRoutesOnNavigation({signal:E,path:w,matches:D,fetcherKey:N,patch:(Q,B)=>{E.aborted||Dc(Q,B,H,$,l,!1)}})}catch(Q){return{type:"error",error:Q,partialMatches:D}}finally{U&&!E.aborted&&(i=[...i])}if(E.aborted)return{type:"aborted"};let W=nr(H,w,s);if(W)return{type:"success",matches:W};let K=ko(H,w,s,!0);if(!K||D.length===K.length&&D.every((Q,B)=>Q.route.id===K[B].route.id))return{type:"success",matches:null};D=K}}function mh(v){o={},a=Sl(v,l,void 0,o)}function vh(v,w,E=!1){let N=a==null;Dc(v,w,a||i,o,l,E),N&&(i=[...i],Se({}))}return _={get basename(){return s},get future(){return c},get state(){return g},get routes(){return i},get window(){return t},initialize:de,subscribe:Wr,enableScrollRestoration:ph,navigate:Er,fetch:sh,revalidate:lh,createHref:v=>e.history.createHref(v),encodeLocation:v=>e.history.encodeLocation(v),getFetcher:uu,deleteFetcher:dh,dispose:Dl,getBlocker:fh,deleteBlocker:pu,patchRoutes:vh,_internalFetchControllers:Y,_internalSetRoutes:mh,_internalSetStateDoNotUseOrYouWillBreakYourApp(v){Se(v)}},_}function Lg(e){return e!=null&&("formData"in e&&e.formData!=null||"body"in e&&e.body!==void 0)}function Ka(e,t,r,n,l,o){let i,a;if(l){i=[];for(let u of t)if(i.push(u),u.route.id===l){a=u;break}}else i=t,a=t[t.length-1];let s=Ys(n||".",Gs(i),vt(e.pathname,r)||e.pathname,o==="path");if(n==null&&(s.search=e.search,s.hash=e.hash),(n==null||n===""||n===".")&&a){let u=Js(s.search);if(a.route.index&&!u)s.search=s.search?s.search.replace(/^\?/,"?index&"):"?index";else if(!a.route.index&&u){let c=new URLSearchParams(s.search),p=c.getAll("index");c.delete("index"),p.filter(y=>y).forEach(y=>c.append("index",y));let f=c.toString();s.search=f?`?${f}`:""}}return r!=="/"&&(s.pathname=hg({basename:r,pathname:s.pathname})),gr(s)}function zc(e,t,r){if(!r||!Lg(r))return{path:t};if(r.formMethod&&!Ug(r.formMethod))return{path:t,error:ut(405,{method:r.formMethod})};let n=()=>({path:t,error:ut(400,{type:"invalid-body"})}),o=(r.formMethod||"get").toUpperCase(),i=Dp(t);if(r.body!==void 0){if(r.formEncType==="text/plain"){if(!Ye(o))return n();let p=typeof r.body=="string"?r.body:r.body instanceof FormData||r.body instanceof URLSearchParams?Array.from(r.body.entries()).reduce((f,[y,k])=>`${f}${y}=${k} +`,""):String(r.body);return{path:t,submission:{formMethod:o,formAction:i,formEncType:r.formEncType,formData:void 0,json:void 0,text:p}}}else if(r.formEncType==="application/json"){if(!Ye(o))return n();try{let p=typeof r.body=="string"?JSON.parse(r.body):r.body;return{path:t,submission:{formMethod:o,formAction:i,formEncType:r.formEncType,formData:void 0,json:p,text:void 0}}}catch{return n()}}}J(typeof FormData=="function","FormData is not available in this environment");let a,s;if(r.formData)a=Xa(r.formData),s=r.formData;else if(r.body instanceof FormData)a=Xa(r.body),s=r.body;else if(r.body instanceof URLSearchParams)a=r.body,s=bc(a);else if(r.body==null)a=new URLSearchParams,s=new FormData;else try{a=new URLSearchParams(r.body),s=bc(a)}catch{return n()}let u={formMethod:o,formAction:i,formEncType:r&&r.formEncType||"application/x-www-form-urlencoded",formData:s,json:void 0,text:void 0};if(Ye(u.formMethod))return{path:t,submission:u};let c=kr(t);return e&&c.search&&Js(c.search)&&a.append("index",""),c.search=`?${a}`,{path:gr(c),submission:u}}function Tc(e,t,r,n,l,o,i,a,s,u,c,p,f,y,k,S,M,d,h,m){var je;let C=m?nt(m[1])?m[1].error:m[1].data:void 0,_=l.createURL(o.location),g=l.createURL(s),z;if(c&&o.errors){let te=Object.keys(o.errors)[0];z=i.findIndex(oe=>oe.route.id===te)}else if(m&&nt(m[1])){let te=m[0];z=i.findIndex(oe=>oe.route.id===te)-1}let R=m?m[1].statusCode:void 0,O=R&&R>=400,V={currentUrl:_,currentParams:((je=o.matches[0])==null?void 0:je.params)||{},nextUrl:g,nextParams:i[0].params,...a,actionResult:C,actionStatus:R},ue=i.map((te,oe)=>{let{route:Y}=te,se=null;if(z!=null&&oe>z?se=!1:Y.lazy?se=!0:Y.loader==null?se=!1:c?se=Ga(Y,o.loaderData,o.errors):Mg(o.loaderData,o.matches[oe],te)&&(se=!0),se!==null)return Ya(r,n,e,te,u,t,se);let P=O?!1:p||_.pathname+_.search===g.pathname+g.search||_.search!==g.search||zg(o.matches[oe],te),b={...V,defaultShouldRevalidate:P},A=Jo(te,b);return Ya(r,n,e,te,u,t,A,b)}),Me=[];return k.forEach((te,oe)=>{if(c||!i.some(ee=>ee.route.id===te.routeId)||y.has(oe))return;let Y=o.fetchers.get(oe),se=Y&&Y.state!=="idle"&&Y.data===void 0,P=nr(M,te.path,d);if(!P){if(h&&se)return;Me.push({key:oe,routeId:te.routeId,path:te.path,matches:null,match:null,request:null,controller:null});return}if(S.has(oe))return;let b=So(P,te.path),A=new AbortController,q=Gr(l,te.path,A.signal),re=null;if(f.has(oe))f.delete(oe),re=hn(r,n,q,P,b,u,t);else if(se)p&&(re=hn(r,n,q,P,b,u,t));else{let ee={...V,defaultShouldRevalidate:O?!1:p};Jo(b,ee)&&(re=hn(r,n,q,P,b,u,t,ee))}re&&Me.push({key:oe,routeId:te.routeId,path:te.path,matches:re,match:b,request:q,controller:A})}),{dsMatches:ue,revalidatingFetchers:Me}}function Ga(e,t,r){if(e.lazy)return!0;if(!e.loader)return!1;let n=t!=null&&e.id in t,l=r!=null&&r[e.id]!==void 0;return!n&&l?!1:typeof e.loader=="function"&&e.loader.hydrate===!0?!0:!n&&!l}function Mg(e,t,r){let n=!t||r.route.id!==t.route.id,l=!e.hasOwnProperty(r.route.id);return n||l}function zg(e,t){let r=e.route.path;return e.pathname!==t.pathname||r!=null&&r.endsWith("*")&&e.params["*"]!==t.params["*"]}function Jo(e,t){if(e.route.shouldRevalidate){let r=e.route.shouldRevalidate(t);if(typeof r=="boolean")return r}return t.defaultShouldRevalidate}function Dc(e,t,r,n,l,o){let i;if(e){let u=n[e];J(u,`No route found to patch children into: routeId = ${e}`),u.children||(u.children=[]),i=u.children}else i=r;let a=[],s=[];if(t.forEach(u=>{let c=i.find(p=>_p(u,p));c?s.push({existingRoute:c,newRoute:u}):a.push(u)}),a.length>0){let u=Sl(a,l,[e||"_","patch",String((i==null?void 0:i.length)||"0")],n);i.push(...u)}if(o&&s.length>0)for(let u=0;u{var l;return(l=t.children)==null?void 0:l.some(o=>_p(r,o))}):!1}var jc=new WeakMap,Np=({key:e,route:t,manifest:r,mapRouteProperties:n})=>{let l=r[t.id];if(J(l,"No route found in manifest"),!l.lazy||typeof l.lazy!="object")return;let o=l.lazy[e];if(!o)return;let i=jc.get(l);i||(i={},jc.set(l,i));let a=i[e];if(a)return a;let s=(async()=>{let u=Jv(e),p=l[e]!==void 0&&e!=="hasErrorBoundary";if(u)Pe(!u,"Route property "+e+" is not a supported lazy route property. This property will be ignored."),i[e]=Promise.resolve();else if(p)Pe(!1,`Route "${l.id}" has a static property "${e}" defined. The lazy property will be ignored.`);else{let f=await o();f!=null&&(Object.assign(l,{[e]:f}),Object.assign(l,n(l)))}typeof l.lazy=="object"&&(l.lazy[e]=void 0,Object.values(l.lazy).every(f=>f===void 0)&&(l.lazy=void 0))})();return i[e]=s,s},Oc=new WeakMap;function Tg(e,t,r,n,l){let o=r[e.id];if(J(o,"No route found in manifest"),!e.lazy)return{lazyRoutePromise:void 0,lazyHandlerPromise:void 0};if(typeof e.lazy=="function"){let c=Oc.get(o);if(c)return{lazyRoutePromise:c,lazyHandlerPromise:c};let p=(async()=>{J(typeof e.lazy=="function","No lazy route function found");let f=await e.lazy(),y={};for(let k in f){let S=f[k];if(S===void 0)continue;let M=qv(k),h=o[k]!==void 0&&k!=="hasErrorBoundary";M?Pe(!M,"Route property "+k+" is not a supported property to be returned from a lazy route function. This property will be ignored."):h?Pe(!h,`Route "${o.id}" has a static property "${k}" defined but its lazy function is also returning a value for this property. The lazy route property "${k}" will be ignored.`):y[k]=S}Object.assign(o,y),Object.assign(o,{...n(o),lazy:void 0})})();return Oc.set(o,p),p.catch(()=>{}),{lazyRoutePromise:p,lazyHandlerPromise:p}}let i=Object.keys(e.lazy),a=[],s;for(let c of i){if(l&&l.includes(c))continue;let p=Np({key:c,route:e,manifest:r,mapRouteProperties:n});p&&(a.push(p),c===t&&(s=p))}let u=a.length>0?Promise.all(a).then(()=>{}):void 0;return u==null||u.catch(()=>{}),s==null||s.catch(()=>{}),{lazyRoutePromise:u,lazyHandlerPromise:s}}async function Fc(e){let t=e.matches.filter(l=>l.shouldLoad),r={};return(await Promise.all(t.map(l=>l.resolve()))).forEach((l,o)=>{r[t[o].route.id]=l}),r}async function Dg(e){if(!e.matches.some(r=>r.route.unstable_middleware))return Fc(e);let t=!1;return Mp(e,()=>(t=!0,Fc(e)),(r,n)=>Lp(r,n,e.matches,t))}function Lp(e,t,r,n){var l;return n?{[t]:{type:"error",result:e}}:{[lr(r,((l=r.find(i=>i.route.id===t||i.route.loader))==null?void 0:l.route.id)||t).route.id]:{type:"error",result:e}}}async function Mp(e,t,r){let{matches:n,request:l,params:o,context:i}=e,a=n.flatMap(u=>u.route.unstable_middleware?u.route.unstable_middleware.map(c=>[u.route.id,c]):[]),s={};return await zp({request:l,params:o,context:i},a,t,r,s),s}async function zp(e,t,r,n,l={},o=0){let{request:i}=e;if(i.signal.aborted)throw i.signal.reason?i.signal.reason:new Error(`Request aborted without an \`AbortSignal.reason\`: ${i.method} ${i.url}`);let a=t[o];if(!a){let f=await r();Object.assign(l,f);return}let[s,u]=a,c=!1,p=async()=>{if(c)throw new Error("You may only call `next()` once per middleware");c=!0;try{let f=await zp(e,t,r,n,l,o+1);Object.assign(l,f)}catch(f){let y=await n(f,s);Object.assign(l,y)}};try{let f=await u({request:e.request,params:e.params,context:e.context},p);typeof f<"u"&&console.warn("client middlewares are not intended to return values, the value will be ignored",f),c||await p()}catch(f){let y=await n(f,s);Object.assign(l,y)}}function Tp(e,t,r,n,l){let o=Np({key:"unstable_middleware",route:n.route,manifest:t,mapRouteProperties:e}),i=Tg(n.route,Ye(r.method)?"action":"loader",t,e,l);return{middleware:o,route:i.lazyRoutePromise,handler:i.lazyHandlerPromise}}function Ya(e,t,r,n,l,o,i,a=null){let s=!1,u=Tp(e,t,r,n,l);return{...n,_lazyPromises:u,shouldLoad:i,unstable_shouldRevalidateArgs:a,unstable_shouldCallHandler(c){return s=!0,a?typeof c=="boolean"?Jo(n,{...a,defaultShouldRevalidate:c}):Jo(n,a):i},resolve(c){return s||i||c&&!Ye(r.method)&&(n.route.lazy||n.route.loader)?Og({request:r,match:n,lazyHandlerPromise:u==null?void 0:u.handler,lazyRoutePromise:u==null?void 0:u.route,handlerOverride:c,scopedContext:o}):Promise.resolve({type:"data",result:void 0})}}}function hn(e,t,r,n,l,o,i,a=null){return n.map(s=>s.route.id!==l.route.id?{...s,shouldLoad:!1,unstable_shouldRevalidateArgs:a,unstable_shouldCallHandler:()=>!1,_lazyPromises:Tp(e,t,r,s,o),resolve:()=>Promise.resolve({type:"data",result:void 0})}:Ya(e,t,r,s,o,i,!0,a))}async function jg(e,t,r,n,l,o){r.some(u=>{var c;return(c=u._lazyPromises)==null?void 0:c.middleware})&&await Promise.all(r.map(u=>{var c;return(c=u._lazyPromises)==null?void 0:c.middleware}));let i={request:t,params:r[0].params,context:l,matches:r},s=await e({...i,fetcherKey:n,unstable_runClientMiddleware:u=>{let c=i,p=!1;return Mp(c,()=>(p=!0,u({...c,fetcherKey:n,unstable_runClientMiddleware:()=>{throw new Error("Cannot call `unstable_runClientMiddleware()` from within an `unstable_runClientMiddleware` handler")}})),(f,y)=>Lp(f,y,r,p))}});try{await Promise.all(r.flatMap(u=>{var c,p;return[(c=u._lazyPromises)==null?void 0:c.handler,(p=u._lazyPromises)==null?void 0:p.route]}))}catch{}return s}async function Og({request:e,match:t,lazyHandlerPromise:r,lazyRoutePromise:n,handlerOverride:l,scopedContext:o}){let i,a,s=Ye(e.method),u=s?"action":"loader",c=p=>{let f,y=new Promise((M,d)=>f=d);a=()=>f(),e.signal.addEventListener("abort",a);let k=M=>typeof p!="function"?Promise.reject(new Error(`You cannot call the handler for a route which defines a boolean "${u}" [routeId: ${t.route.id}]`)):p({request:e,params:t.params,context:o},...M!==void 0?[M]:[]),S=(async()=>{try{return{type:"data",result:await(l?l(d=>k(d)):k())}}catch(M){return{type:"error",result:M}}})();return Promise.race([S,y])};try{let p=s?t.route.action:t.route.loader;if(r||n)if(p){let f,[y]=await Promise.all([c(p).catch(k=>{f=k}),r,n]);if(f!==void 0)throw f;i=y}else{await r;let f=s?t.route.action:t.route.loader;if(f)[i]=await Promise.all([c(f),n]);else if(u==="action"){let y=new URL(e.url),k=y.pathname+y.search;throw ut(405,{method:e.method,pathname:k,routeId:t.route.id})}else return{type:"data",result:void 0}}else if(p)i=await c(p);else{let f=new URL(e.url),y=f.pathname+f.search;throw ut(404,{pathname:y})}}catch(p){return{type:"error",result:p}}finally{a&&e.signal.removeEventListener("abort",a)}return i}async function Fg(e){var n,l,o,i,a,s;let{result:t,type:r}=e;if(jp(t)){let u;try{let c=t.headers.get("Content-Type");c&&/\bapplication\/json\b/.test(c)?t.body==null?u=null:u=await t.json():u=await t.text()}catch(c){return{type:"error",error:c}}return r==="error"?{type:"error",error:new Xo(t.status,t.statusText,u),statusCode:t.status,headers:t.headers}:{type:"data",data:u,statusCode:t.status,headers:t.headers}}return r==="error"?Hc(t)?t.data instanceof Error?{type:"error",error:t.data,statusCode:(n=t.init)==null?void 0:n.status,headers:(l=t.init)!=null&&l.headers?new Headers(t.init.headers):void 0}:{type:"error",error:new Xo(((o=t.init)==null?void 0:o.status)||500,void 0,t.data),statusCode:El(t)?t.status:void 0,headers:(i=t.init)!=null&&i.headers?new Headers(t.init.headers):void 0}:{type:"error",error:t,statusCode:El(t)?t.status:void 0}:Hc(t)?{type:"data",data:t.data,statusCode:(a=t.init)==null?void 0:a.status,headers:(s=t.init)!=null&&s.headers?new Headers(t.init.headers):void 0}:{type:"data",data:t}}function Ig(e,t,r,n,l){let o=e.headers.get("Location");if(J(o,"Redirects returned/thrown from loaders/actions must have a Location header"),!Xs(o)){let i=n.slice(0,n.findIndex(a=>a.route.id===r)+1);o=Ka(new URL(t.url),i,l,o),e.headers.set("Location",o)}return e}function Ic(e,t,r){if(Xs(e)){let n=e,l=n.startsWith("//")?new URL(t.protocol+n):new URL(n),o=vt(l.pathname,r)!=null;if(l.origin===t.origin&&o)return l.pathname+l.search+l.hash}return e}function Gr(e,t,r,n){let l=e.createURL(Dp(t)).toString(),o={signal:r};if(n&&Ye(n.formMethod)){let{formMethod:i,formEncType:a}=n;o.method=i.toUpperCase(),a==="application/json"?(o.headers=new Headers({"Content-Type":a}),o.body=JSON.stringify(n.json)):a==="text/plain"?o.body=n.text:a==="application/x-www-form-urlencoded"&&n.formData?o.body=Xa(n.formData):o.body=n.formData}return new Request(l,o)}function Xa(e){let t=new URLSearchParams;for(let[r,n]of e.entries())t.append(r,typeof n=="string"?n:n.name);return t}function bc(e){let t=new FormData;for(let[r,n]of e.entries())t.append(r,n);return t}function bg(e,t,r,n=!1,l=!1){let o={},i=null,a,s=!1,u={},c=r&&nt(r[1])?r[1].error:void 0;return e.forEach(p=>{if(!(p.route.id in t))return;let f=p.route.id,y=t[f];if(J(!jr(y),"Cannot handle redirect results in processLoaderData"),nt(y)){let k=y.error;if(c!==void 0&&(k=c,c=void 0),i=i||{},l)i[f]=k;else{let S=lr(e,f);i[S.route.id]==null&&(i[S.route.id]=k)}n||(o[f]=Rp),s||(s=!0,a=El(y.error)?y.error.status:500),y.headers&&(u[f]=y.headers)}else o[f]=y.data,y.statusCode&&y.statusCode!==200&&!s&&(a=y.statusCode),y.headers&&(u[f]=y.headers)}),c!==void 0&&r&&(i={[r[0]]:c},r[2]&&(o[r[2]]=void 0)),{loaderData:o,errors:i,statusCode:a||200,loaderHeaders:u}}function $c(e,t,r,n,l,o){let{loaderData:i,errors:a}=bg(t,r,n);return l.filter(s=>!s.matches||s.matches.some(u=>u.shouldLoad)).forEach(s=>{let{key:u,match:c,controller:p}=s;if(p&&p.signal.aborted)return;let f=o[u];if(J(f,"Did not find corresponding fetcher result"),nt(f)){let y=lr(e.matches,c==null?void 0:c.route.id);a&&a[y.route.id]||(a={...a,[y.route.id]:f.error}),e.fetchers.delete(u)}else if(jr(f))J(!1,"Unhandled fetcher revalidation redirect");else{let y=Zt(f.data);e.fetchers.set(u,y)}}),{loaderData:i,errors:a}}function Ac(e,t,r,n){let l=Object.entries(t).filter(([,o])=>o!==Rp).reduce((o,[i,a])=>(o[i]=a,o),{});for(let o of r){let i=o.route.id;if(!t.hasOwnProperty(i)&&e.hasOwnProperty(i)&&o.route.loader&&(l[i]=e[i]),n&&n.hasOwnProperty(i))break}return l}function Uc(e){return e?nt(e[1])?{actionData:{}}:{actionData:{[e[0]]:e[1].data}}:{}}function lr(e,t){return(t?e.slice(0,e.findIndex(n=>n.route.id===t)+1):[...e]).reverse().find(n=>n.route.hasErrorBoundary===!0)||e[0]}function Vc(e){let t=e.length===1?e[0]:e.find(r=>r.index||!r.path||r.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:t}],route:t}}function ut(e,{pathname:t,routeId:r,method:n,type:l,message:o}={}){let i="Unknown Server Error",a="Unknown @remix-run/router error";return e===400?(i="Bad Request",n&&t&&r?a=`You made a ${n} request to "${t}" but did not provide a \`loader\` for route "${r}", so there is no way to handle the request.`:l==="invalid-body"&&(a="Unable to encode submission body")):e===403?(i="Forbidden",a=`Route "${r}" does not match URL "${t}"`):e===404?(i="Not Found",a=`No route matches URL "${t}"`):e===405&&(i="Method Not Allowed",n&&t&&r?a=`You made a ${n.toUpperCase()} request to "${t}" but did not provide an \`action\` for route "${r}", so there is no way to handle the request.`:n&&(a=`Invalid request method "${n.toUpperCase()}"`)),new Xo(e||500,i,new Error(a),!0)}function lo(e){let t=Object.entries(e);for(let r=t.length-1;r>=0;r--){let[n,l]=t[r];if(jr(l))return{key:n,result:l}}}function Dp(e){let t=typeof e=="string"?kr(e):e;return gr({...t,hash:""})}function $g(e,t){return e.pathname!==t.pathname||e.search!==t.search?!1:e.hash===""?t.hash!=="":e.hash===t.hash?!0:t.hash!==""}function Ag(e){return jp(e.result)&&Eg.has(e.result.status)}function nt(e){return e.type==="error"}function jr(e){return(e&&e.type)==="redirect"}function Hc(e){return typeof e=="object"&&e!=null&&"type"in e&&"data"in e&&"init"in e&&e.type==="DataWithResponseInit"}function jp(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.headers=="object"&&typeof e.body<"u"}function Ug(e){return Sg.has(e.toUpperCase())}function Ye(e){return xg.has(e.toUpperCase())}function Js(e){return new URLSearchParams(e).getAll("index").some(t=>t==="")}function So(e,t){let r=typeof t=="string"?kr(t).search:t.search;if(e[e.length-1].route.index&&Js(r||""))return e[e.length-1];let n=Ep(e);return n[n.length-1]}function Bc(e){let{formMethod:t,formAction:r,formEncType:n,text:l,formData:o,json:i}=e;if(!(!t||!r||!n)){if(l!=null)return{formMethod:t,formAction:r,formEncType:n,formData:void 0,json:void 0,text:l};if(o!=null)return{formMethod:t,formAction:r,formEncType:n,formData:o,json:void 0,text:void 0};if(i!==void 0)return{formMethod:t,formAction:r,formEncType:n,formData:void 0,json:i,text:void 0}}}function Yi(e,t){return t?{state:"loading",location:e,formMethod:t.formMethod,formAction:t.formAction,formEncType:t.formEncType,formData:t.formData,json:t.json,text:t.text}:{state:"loading",location:e,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function Vg(e,t){return{state:"submitting",location:e,formMethod:t.formMethod,formAction:t.formAction,formEncType:t.formEncType,formData:t.formData,json:t.json,text:t.text}}function An(e,t){return e?{state:"loading",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:t}}function Hg(e,t){return{state:"submitting",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t?t.data:void 0}}function Zt(e){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:e}}function Bg(e,t){try{let r=e.sessionStorage.getItem(Pp);if(r){let n=JSON.parse(r);for(let[l,o]of Object.entries(n||{}))o&&Array.isArray(o)&&t.set(l,new Set(o||[]))}}catch{}}function Wg(e,t){if(t.size>0){let r={};for(let[n,l]of t)r[n]=[...l];try{e.sessionStorage.setItem(Pp,JSON.stringify(r))}catch(n){Pe(!1,`Failed to save applied view transitions in sessionStorage (${n}).`)}}}function Qg(){let e,t,r=new Promise((n,l)=>{e=async o=>{n(o);try{await r}catch{}},t=async o=>{l(o);try{await r}catch{}}});return{promise:r,resolve:e,reject:t}}var Br=x.createContext(null);Br.displayName="DataRouter";var Ll=x.createContext(null);Ll.displayName="DataRouterState";x.createContext(!1);var Zs=x.createContext({isTransitioning:!1});Zs.displayName="ViewTransition";var Op=x.createContext(new Map);Op.displayName="Fetchers";var Kg=x.createContext(null);Kg.displayName="Await";var Dt=x.createContext(null);Dt.displayName="Navigation";var hi=x.createContext(null);hi.displayName="Location";var jt=x.createContext({outlet:null,matches:[],isDataRoute:!1});jt.displayName="Route";var qs=x.createContext(null);qs.displayName="RouteError";function Gg(e,{relative:t}={}){J(Ml(),"useHref() may be used only in the context of a component.");let{basename:r,navigator:n}=x.useContext(Dt),{hash:l,pathname:o,search:i}=zl(e,{relative:t}),a=o;return r!=="/"&&(a=o==="/"?r:Tt([r,o])),n.createHref({pathname:a,search:i,hash:l})}function Ml(){return x.useContext(hi)!=null}function Sr(){return J(Ml(),"useLocation() may be used only in the context of a component."),x.useContext(hi).location}var Fp="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function Ip(e){x.useContext(Dt).static||x.useLayoutEffect(e)}function eu(){let{isDataRoute:e}=x.useContext(jt);return e?uy():Yg()}function Yg(){J(Ml(),"useNavigate() may be used only in the context of a component.");let e=x.useContext(Br),{basename:t,navigator:r}=x.useContext(Dt),{matches:n}=x.useContext(jt),{pathname:l}=Sr(),o=JSON.stringify(Gs(n)),i=x.useRef(!1);return Ip(()=>{i.current=!0}),x.useCallback((s,u={})=>{if(Pe(i.current,Fp),!i.current)return;if(typeof s=="number"){r.go(s);return}let c=Ys(s,JSON.parse(o),l,u.relative==="path");e==null&&t!=="/"&&(c.pathname=c.pathname==="/"?t:Tt([t,c.pathname])),(u.replace?r.replace:r.push)(c,u.state,u)},[t,r,o,l,e])}var Xg=x.createContext(null);function Jg(e){let t=x.useContext(jt).outlet;return t&&x.createElement(Xg.Provider,{value:e},t)}function zl(e,{relative:t}={}){let{matches:r}=x.useContext(jt),{pathname:n}=Sr(),l=JSON.stringify(Gs(r));return x.useMemo(()=>Ys(e,JSON.parse(l),n,t==="path"),[e,l,n,t])}function Zg(e,t,r,n){J(Ml(),"useRoutes() may be used only in the context of a component.");let{navigator:l}=x.useContext(Dt),{matches:o}=x.useContext(jt),i=o[o.length-1],a=i?i.params:{},s=i?i.pathname:"/",u=i?i.pathnameBase:"/",c=i&&i.route;{let d=c&&c.path||"";bp(s,!c||d.endsWith("*")||d.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${s}" (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 p=Sr(),f;f=p;let y=f.pathname||"/",k=y;if(u!=="/"){let d=u.replace(/^\//,"").split("/");k="/"+y.replace(/^\//,"").split("/").slice(d.length).join("/")}let S=nr(e,{pathname:k});return Pe(c||S!=null,`No routes matched location "${f.pathname}${f.search}${f.hash}" `),Pe(S==null||S[S.length-1].route.element!==void 0||S[S.length-1].route.Component!==void 0||S[S.length-1].route.lazy!==void 0,`Matched leaf route at location "${f.pathname}${f.search}${f.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.`),ny(S&&S.map(d=>Object.assign({},d,{params:Object.assign({},a,d.params),pathname:Tt([u,l.encodeLocation?l.encodeLocation(d.pathname).pathname:d.pathname]),pathnameBase:d.pathnameBase==="/"?u:Tt([u,l.encodeLocation?l.encodeLocation(d.pathnameBase).pathname:d.pathnameBase])})),o,r,n)}function qg(){let e=sy(),t=El(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),r=e instanceof Error?e.stack:null,n="rgba(200,200,200, 0.5)",l={padding:"0.5rem",backgroundColor:n},o={padding:"2px 4px",backgroundColor:n},i=null;return console.error("Error handled by React Router default ErrorBoundary:",e),i=x.createElement(x.Fragment,null,x.createElement("p",null,"💿 Hey developer 👋"),x.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",x.createElement("code",{style:o},"ErrorBoundary")," or"," ",x.createElement("code",{style:o},"errorElement")," prop on your route.")),x.createElement(x.Fragment,null,x.createElement("h2",null,"Unexpected Application Error!"),x.createElement("h3",{style:{fontStyle:"italic"}},t),r?x.createElement("pre",{style:l},r):null,i)}var ey=x.createElement(qg,null),ty=class extends x.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!=="idle"&&e.revalidation==="idle"?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error!==void 0?e.error:t.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){console.error("React Router caught the following error during render",e,t)}render(){return this.state.error!==void 0?x.createElement(jt.Provider,{value:this.props.routeContext},x.createElement(qs.Provider,{value:this.state.error,children:this.props.component})):this.props.children}};function ry({routeContext:e,match:t,children:r}){let n=x.useContext(Br);return n&&n.static&&n.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(n.staticContext._deepestRenderedBoundaryId=t.route.id),x.createElement(jt.Provider,{value:e},r)}function ny(e,t=[],r=null,n=null){if(e==null){if(!r)return null;if(r.errors)e=r.matches;else if(t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let l=e,o=r==null?void 0:r.errors;if(o!=null){let s=l.findIndex(u=>u.route.id&&(o==null?void 0:o[u.route.id])!==void 0);J(s>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(o).join(",")}`),l=l.slice(0,Math.min(l.length,s+1))}let i=!1,a=-1;if(r)for(let s=0;s=0?l=l.slice(0,a+1):l=[l[0]];break}}}return l.reduceRight((s,u,c)=>{let p,f=!1,y=null,k=null;r&&(p=o&&u.route.id?o[u.route.id]:void 0,y=u.route.errorElement||ey,i&&(a<0&&c===0?(bp("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),f=!0,k=null):a===c&&(f=!0,k=u.route.hydrateFallbackElement||null)));let S=t.concat(l.slice(0,c+1)),M=()=>{let d;return p?d=y:f?d=k:u.route.Component?d=x.createElement(u.route.Component,null):u.route.element?d=u.route.element:d=s,x.createElement(ry,{match:u,routeContext:{outlet:s,matches:S,isDataRoute:r!=null},children:d})};return r&&(u.route.ErrorBoundary||u.route.errorElement||c===0)?x.createElement(ty,{location:r.location,revalidation:r.revalidation,component:y,error:p,children:M(),routeContext:{outlet:null,matches:S,isDataRoute:!0}}):M()},null)}function tu(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function ly(e){let t=x.useContext(Br);return J(t,tu(e)),t}function oy(e){let t=x.useContext(Ll);return J(t,tu(e)),t}function iy(e){let t=x.useContext(jt);return J(t,tu(e)),t}function ru(e){let t=iy(e),r=t.matches[t.matches.length-1];return J(r.route.id,`${e} can only be used on routes that contain a unique "id"`),r.route.id}function ay(){return ru("useRouteId")}function sy(){var n;let e=x.useContext(qs),t=oy("useRouteError"),r=ru("useRouteError");return e!==void 0?e:(n=t.errors)==null?void 0:n[r]}function uy(){let{router:e}=ly("useNavigate"),t=ru("useNavigate"),r=x.useRef(!1);return Ip(()=>{r.current=!0}),x.useCallback(async(l,o={})=>{Pe(r.current,Fp),r.current&&(typeof l=="number"?e.navigate(l):await e.navigate(l,{fromRouteId:t,...o}))},[e,t])}var Wc={};function bp(e,t,r){!t&&!Wc[e]&&(Wc[e]=!0,Pe(!1,r))}var Qc={};function Kc(e,t){!e&&!Qc[t]&&(Qc[t]=!0,console.warn(t))}function cy(e){let t={hasErrorBoundary:e.hasErrorBoundary||e.ErrorBoundary!=null||e.errorElement!=null};return e.Component&&(e.element&&Pe(!1,"You should not include both `Component` and `element` on your route - `Component` will be used."),Object.assign(t,{element:x.createElement(e.Component),Component:void 0})),e.HydrateFallback&&(e.hydrateFallbackElement&&Pe(!1,"You should not include both `HydrateFallback` and `hydrateFallbackElement` on your route - `HydrateFallback` will be used."),Object.assign(t,{hydrateFallbackElement:x.createElement(e.HydrateFallback),HydrateFallback:void 0})),e.ErrorBoundary&&(e.errorElement&&Pe(!1,"You should not include both `ErrorBoundary` and `errorElement` on your route - `ErrorBoundary` will be used."),Object.assign(t,{errorElement:x.createElement(e.ErrorBoundary),ErrorBoundary:void 0})),t}var dy=["HydrateFallback","hydrateFallbackElement"],fy=class{constructor(){this.status="pending",this.promise=new Promise((e,t)=>{this.resolve=r=>{this.status==="pending"&&(this.status="resolved",e(r))},this.reject=r=>{this.status==="pending"&&(this.status="rejected",t(r))}})}};function py({router:e,flushSync:t}){let[r,n]=x.useState(e.state),[l,o]=x.useState(),[i,a]=x.useState({isTransitioning:!1}),[s,u]=x.useState(),[c,p]=x.useState(),[f,y]=x.useState(),k=x.useRef(new Map),S=x.useCallback((m,{deletedFetchers:C,flushSync:_,viewTransitionOpts:g})=>{m.fetchers.forEach((R,O)=>{R.data!==void 0&&k.current.set(O,R.data)}),C.forEach(R=>k.current.delete(R)),Kc(_===!1||t!=null,'You provided the `flushSync` option to a router update, but you are not using the `` from `react-router/dom` so `ReactDOM.flushSync()` is unavailable. Please update your app to `import { RouterProvider } from "react-router/dom"` and ensure you have `react-dom` installed as a dependency to use the `flushSync` option.');let z=e.window!=null&&e.window.document!=null&&typeof e.window.document.startViewTransition=="function";if(Kc(g==null||z,"You provided the `viewTransition` option to a router update, but you do not appear to be running in a DOM environment as `window.startViewTransition` is not available."),!g||!z){t&&_?t(()=>n(m)):x.startTransition(()=>n(m));return}if(t&&_){t(()=>{c&&(s&&s.resolve(),c.skipTransition()),a({isTransitioning:!0,flushSync:!0,currentLocation:g.currentLocation,nextLocation:g.nextLocation})});let R=e.window.document.startViewTransition(()=>{t(()=>n(m))});R.finished.finally(()=>{t(()=>{u(void 0),p(void 0),o(void 0),a({isTransitioning:!1})})}),t(()=>p(R));return}c?(s&&s.resolve(),c.skipTransition(),y({state:m,currentLocation:g.currentLocation,nextLocation:g.nextLocation})):(o(m),a({isTransitioning:!0,flushSync:!1,currentLocation:g.currentLocation,nextLocation:g.nextLocation}))},[e.window,t,c,s]);x.useLayoutEffect(()=>e.subscribe(S),[e,S]),x.useEffect(()=>{i.isTransitioning&&!i.flushSync&&u(new fy)},[i]),x.useEffect(()=>{if(s&&l&&e.window){let m=l,C=s.promise,_=e.window.document.startViewTransition(async()=>{x.startTransition(()=>n(m)),await C});_.finished.finally(()=>{u(void 0),p(void 0),o(void 0),a({isTransitioning:!1})}),p(_)}},[l,s,e.window]),x.useEffect(()=>{s&&l&&r.location.key===l.location.key&&s.resolve()},[s,c,r.location,l]),x.useEffect(()=>{!i.isTransitioning&&f&&(o(f.state),a({isTransitioning:!0,flushSync:!1,currentLocation:f.currentLocation,nextLocation:f.nextLocation}),y(void 0))},[i.isTransitioning,f]);let M=x.useMemo(()=>({createHref:e.createHref,encodeLocation:e.encodeLocation,go:m=>e.navigate(m),push:(m,C,_)=>e.navigate(m,{state:C,preventScrollReset:_==null?void 0:_.preventScrollReset}),replace:(m,C,_)=>e.navigate(m,{replace:!0,state:C,preventScrollReset:_==null?void 0:_.preventScrollReset})}),[e]),d=e.basename||"/",h=x.useMemo(()=>({router:e,navigator:M,static:!1,basename:d}),[e,M,d]);return x.createElement(x.Fragment,null,x.createElement(Br.Provider,{value:h},x.createElement(Ll.Provider,{value:r},x.createElement(Op.Provider,{value:k.current},x.createElement(Zs.Provider,{value:i},x.createElement(vy,{basename:d,location:r.location,navigationType:r.historyAction,navigator:M},x.createElement(hy,{routes:e.routes,future:e.future,state:r})))))),null)}var hy=x.memo(my);function my({routes:e,future:t,state:r}){return Zg(e,void 0,r,t)}function Gc(e){return Jg(e.context)}function vy({basename:e="/",children:t=null,location:r,navigationType:n="POP",navigator:l,static:o=!1}){J(!Ml(),"You cannot render a inside another . You should never have more than one in your app.");let i=e.replace(/^\/*/,"/"),a=x.useMemo(()=>({basename:i,navigator:l,static:o,future:{}}),[i,l,o]);typeof r=="string"&&(r=kr(r));let{pathname:s="/",search:u="",hash:c="",state:p=null,key:f="default"}=r,y=x.useMemo(()=>{let k=vt(s,i);return k==null?null:{location:{pathname:k,search:u,hash:c,state:p,key:f},navigationType:n}},[i,s,u,c,p,f,n]);return Pe(y!=null,` is not able to match the URL "${s}${u}${c}" because it does not start with the basename, so the won't render anything.`),y==null?null:x.createElement(Dt.Provider,{value:a},x.createElement(hi.Provider,{children:t,value:y}))}var Eo="get",Co="application/x-www-form-urlencoded";function mi(e){return e!=null&&typeof e.tagName=="string"}function gy(e){return mi(e)&&e.tagName.toLowerCase()==="button"}function yy(e){return mi(e)&&e.tagName.toLowerCase()==="form"}function wy(e){return mi(e)&&e.tagName.toLowerCase()==="input"}function xy(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function ky(e,t){return e.button===0&&(!t||t==="_self")&&!xy(e)}var oo=null;function Sy(){if(oo===null)try{new FormData(document.createElement("form"),0),oo=!1}catch{oo=!0}return oo}var Ey=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function Xi(e){return e!=null&&!Ey.has(e)?(Pe(!1,`"${e}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${Co}"`),null):e}function Cy(e,t){let r,n,l,o,i;if(yy(e)){let a=e.getAttribute("action");n=a?vt(a,t):null,r=e.getAttribute("method")||Eo,l=Xi(e.getAttribute("enctype"))||Co,o=new FormData(e)}else if(gy(e)||wy(e)&&(e.type==="submit"||e.type==="image")){let a=e.form;if(a==null)throw new Error('Cannot submit a + + + + +
+ +
+ + ) +} diff --git a/juragankos-app/src/components/ui/button.tsx b/juragankos-app/src/components/ui/button.tsx new file mode 100644 index 0000000..ea4c2a4 --- /dev/null +++ b/juragankos-app/src/components/ui/button.tsx @@ -0,0 +1,53 @@ +import * as React from 'react' +import { Slot } from '@radix-ui/react-slot' +import { cva, type VariantProps } from 'class-variance-authority' +import { cn } from '../../lib/utils' + +const buttonVariants = cva( + 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50', + { + variants: { + variant: { + default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90', + destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90', + outline: 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground', + secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80', + ghost: 'hover:bg-accent hover:text-accent-foreground', + link: 'text-primary underline-offset-4 hover:underline', + }, + size: { + default: 'h-9 px-4 py-2', + sm: 'h-8 rounded-md px-3 text-xs', + lg: 'h-10 rounded-md px-8', + icon: 'h-9 w-9', + }, + }, + defaultVariants: { + variant: 'default', + size: 'default', + }, + }, +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : 'button' + return ( + + ) + }, +) +Button.displayName = 'Button' + +export { Button, buttonVariants } + diff --git a/juragankos-app/src/components/ui/card.tsx b/juragankos-app/src/components/ui/card.tsx new file mode 100644 index 0000000..86200f2 --- /dev/null +++ b/juragankos-app/src/components/ui/card.tsx @@ -0,0 +1,21 @@ +import * as React from 'react' +import { cn } from '../../lib/utils' + +function Card({ className, ...props }: React.HTMLAttributes) { + return
+} + +function CardHeader({ className, ...props }: React.HTMLAttributes) { + return
+} + +function CardTitle({ className, ...props }: React.HTMLAttributes) { + return

+} + +function CardContent({ className, ...props }: React.HTMLAttributes) { + return
+} + +export { Card, CardHeader, CardTitle, CardContent } + diff --git a/juragankos-app/src/components/ui/input.tsx b/juragankos-app/src/components/ui/input.tsx new file mode 100644 index 0000000..02b3669 --- /dev/null +++ b/juragankos-app/src/components/ui/input.tsx @@ -0,0 +1,22 @@ +import * as React from 'react' +import { cn } from '../../lib/utils' + +export interface InputProps extends React.InputHTMLAttributes {} + +const Input = React.forwardRef(({ className, type, ...props }, ref) => { + return ( + + ) +}) +Input.displayName = 'Input' + +export { Input } + diff --git a/juragankos-app/src/index.css b/juragankos-app/src/index.css new file mode 100644 index 0000000..2e79e7c --- /dev/null +++ b/juragankos-app/src/index.css @@ -0,0 +1,74 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } + + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/juragankos-app/src/lib/utils.ts b/juragankos-app/src/lib/utils.ts new file mode 100644 index 0000000..981bda8 --- /dev/null +++ b/juragankos-app/src/lib/utils.ts @@ -0,0 +1,7 @@ +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} + diff --git a/juragankos-app/src/main.tsx b/juragankos-app/src/main.tsx new file mode 100644 index 0000000..b8fa28b --- /dev/null +++ b/juragankos-app/src/main.tsx @@ -0,0 +1,26 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import './index.css' +import { createBrowserRouter, RouterProvider } from 'react-router-dom' +import Chat from './pages/Chat' +import AdminLogin from './pages/admin/Login' +import AdminDashboard from './pages/admin/Dashboard' +import App from './App' + +const router = createBrowserRouter([ + { + path: '/', + element: , + children: [ + { index: true, element: }, + { path: 'admin/login', element: }, + { path: 'admin/dashboard', element: }, + ], + }, +]) + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/juragankos-app/src/pages/Chat.tsx b/juragankos-app/src/pages/Chat.tsx new file mode 100644 index 0000000..ca72326 --- /dev/null +++ b/juragankos-app/src/pages/Chat.tsx @@ -0,0 +1,91 @@ +import { useEffect, useRef, useState } from 'react' +import { Button } from '../components/ui/button' +import { Send, Bot, User } from 'lucide-react' + +type Message = { + id: string + role: 'user' | 'assistant' + content: string + timestamp: number +} + +export default function Chat() { + const [messages, setMessages] = useState([{ + id: crypto.randomUUID(), + role: 'assistant', + content: 'Halo! Saya asisten virtual untuk pengusaha kos. Ada yang bisa saya bantu hari ini?', + timestamp: Date.now(), + }]) + const [input, setInput] = useState('') + const scrollerRef = useRef(null) + + useEffect(() => { + scrollerRef.current?.scrollTo({ top: scrollerRef.current.scrollHeight, behavior: 'smooth' }) + }, [messages.length]) + + const sendMessage = () => { + const trimmed = input.trim() + if (!trimmed) return + const userMsg: Message = { id: crypto.randomUUID(), role: 'user', content: trimmed, timestamp: Date.now() } + setMessages((m) => [...m, userMsg]) + setInput('') + + // Simulate assistant reply + setTimeout(() => { + const reply: Message = { + id: crypto.randomUUID(), + role: 'assistant', + content: `Terima kasih! Saya catat: "${trimmed}". Fitur backend akan menjawab secara cerdas nanti.`, + timestamp: Date.now(), + } + setMessages((m) => [...m, reply]) + }, 600) + } + + return ( +
+
+
+ + +
+
+
JuraganKos Assistant
+
Online • Siap membantu kos Anda
+
+
+
+ {messages.map((msg) => { + const isUser = msg.role === 'user' + return ( +
+
+ {isUser ? : } +
+
+ {msg.content} +
+
+ ) + })} +
+ { + e.preventDefault(); + sendMessage(); + }} + className="flex items-center gap-2 border-t p-3 bg-background/30" + > + setInput(e.target.value)} + /> + + +
+ ) +} diff --git a/juragankos-app/src/pages/admin/Dashboard.tsx b/juragankos-app/src/pages/admin/Dashboard.tsx new file mode 100644 index 0000000..d15d4e8 --- /dev/null +++ b/juragankos-app/src/pages/admin/Dashboard.tsx @@ -0,0 +1,51 @@ +import { useEffect } from 'react' +import { Button } from '../../components/ui/button' +import { LogOut, MessageSquare, TrendingUp, Clock } from 'lucide-react' +import { useNavigate } from 'react-router-dom' +import { isAuthenticated, logout } from '../../services/auth' + +export default function AdminDashboard() { + const navigate = useNavigate() + useEffect(() => { + if (!isAuthenticated()) navigate('/admin/login') + }, [navigate]) + + return ( +
+
+

Dashboard

+ +
+ +
+ } label="Total Percakapan" value="124" /> + } label="CSAT (mingguan)" value="92%" /> + } label="Rata respon" value="1.8s" /> +
+ +
+

Percakapan Terbaru

+
    + {['Booking kamar putri', 'Tanya harga bulanan', 'Kebijakan tamu', 'Ketersediaan parkir'].map((t, i) => ( +
  • + {t} + {new Date().toLocaleDateString()} +
  • + ))} +
+
+
+ ) +} + +function StatCard({ icon, label, value }: { icon: React.ReactNode; label: string; value: string }) { + return ( +
+
{icon}{label}
+
{value}
+
+ ) +} + diff --git a/juragankos-app/src/pages/admin/Login.tsx b/juragankos-app/src/pages/admin/Login.tsx new file mode 100644 index 0000000..dcff664 --- /dev/null +++ b/juragankos-app/src/pages/admin/Login.tsx @@ -0,0 +1,48 @@ +import { useState } from 'react' +import { Button } from '../../components/ui/button' +import { LogIn } from 'lucide-react' +import { useNavigate } from 'react-router-dom' +import { login } from '../../services/auth' + +export default function AdminLogin() { + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + const navigate = useNavigate() + + const onSubmit = async (e: React.FormEvent) => { + e.preventDefault() + setLoading(true) + setError(null) + try { + await login(email, password) + navigate('/admin/dashboard') + } catch (err: any) { + setError(err?.message ?? 'Gagal login') + } finally { + setLoading(false) + } + } + + return ( +
+

Admin Login

+
+
+ + setEmail(e.target.value)} /> +
+
+ + setPassword(e.target.value)} /> +
+ {error &&

{error}

} + +
+
+ ) +} + diff --git a/juragankos-app/src/services/auth.ts b/juragankos-app/src/services/auth.ts new file mode 100644 index 0000000..2706cc6 --- /dev/null +++ b/juragankos-app/src/services/auth.ts @@ -0,0 +1,21 @@ +const KEY = 'jk_admin_token' + +export async function login(email: string, password: string) { + await sleep(300) + if (!email || !password) throw new Error('Email dan password wajib diisi') + // Placeholder: accept any values. Replace with real API later. + localStorage.setItem(KEY, 'ok') +} + +export function logout() { + localStorage.removeItem(KEY) +} + +export function isAuthenticated() { + return !!localStorage.getItem(KEY) +} + +function sleep(ms: number) { + return new Promise((res) => setTimeout(res, ms)) +} + diff --git a/juragankos-app/tailwind.config.js b/juragankos-app/tailwind.config.js new file mode 100644 index 0000000..8fce24e --- /dev/null +++ b/juragankos-app/tailwind.config.js @@ -0,0 +1,71 @@ +/** @type {import('tailwindcss').Config} */ +export default { + darkMode: ['class'], + content: ['./index.html', './src/**/*.{ts,tsx}'], + theme: { + container: { + center: true, + padding: '2rem', + screens: { + '2xl': '1400px', + }, + }, + extend: { + colors: { + border: 'hsl(var(--border))', + input: 'hsl(var(--input))', + ring: 'hsl(var(--ring))', + background: 'hsl(var(--background))', + foreground: 'hsl(var(--foreground))', + primary: { + DEFAULT: 'hsl(var(--primary))', + foreground: 'hsl(var(--primary-foreground))', + }, + secondary: { + DEFAULT: 'hsl(var(--secondary))', + foreground: 'hsl(var(--secondary-foreground))', + }, + destructive: { + DEFAULT: 'hsl(var(--destructive))', + foreground: 'hsl(var(--destructive-foreground))', + }, + muted: { + DEFAULT: 'hsl(var(--muted))', + foreground: 'hsl(var(--muted-foreground))', + }, + accent: { + DEFAULT: 'hsl(var(--accent))', + foreground: 'hsl(var(--accent-foreground))', + }, + popover: { + DEFAULT: 'hsl(var(--popover))', + foreground: 'hsl(var(--popover-foreground))', + }, + card: { + DEFAULT: 'hsl(var(--card))', + foreground: 'hsl(var(--card-foreground))', + }, + }, + borderRadius: { + lg: 'var(--radius)', + md: 'calc(var(--radius) - 2px)', + sm: 'calc(var(--radius) - 4px)', + }, + keyframes: { + 'accordion-down': { + from: { height: '0' }, + to: { height: 'var(--radix-accordion-content-height)' }, + }, + 'accordion-up': { + from: { height: 'var(--radix-accordion-content-height)' }, + to: { height: '0' }, + }, + }, + animation: { + 'accordion-down': 'accordion-down 0.2s ease-out', + 'accordion-up': 'accordion-up 0.2s ease-out', + }, + }, + }, + plugins: [require('tailwindcss-animate')], +} diff --git a/juragankos-app/tsconfig.json b/juragankos-app/tsconfig.json new file mode 100644 index 0000000..34b1b52 --- /dev/null +++ b/juragankos-app/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true + }, + "include": ["src"] +} + diff --git a/juragankos-app/tsconfig.node.json b/juragankos-app/tsconfig.node.json new file mode 100644 index 0000000..05eb31f --- /dev/null +++ b/juragankos-app/tsconfig.node.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "isolatedModules": true + }, + "include": ["vite.config.ts"] +} + diff --git a/juragankos-app/tsconfig.tsbuildinfo b/juragankos-app/tsconfig.tsbuildinfo new file mode 100644 index 0000000..f6a78ce --- /dev/null +++ b/juragankos-app/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./src/App.tsx","./src/main.tsx","./src/components/ui/button.tsx","./src/components/ui/card.tsx","./src/components/ui/input.tsx","./src/lib/utils.ts","./src/pages/Chat.tsx","./src/pages/admin/Dashboard.tsx","./src/pages/admin/Login.tsx","./src/services/auth.ts"],"version":"5.9.2"} \ No newline at end of file diff --git a/juragankos-app/vite.config.ts b/juragankos-app/vite.config.ts new file mode 100644 index 0000000..54164ce --- /dev/null +++ b/juragankos-app/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], +}) +