diff --git a/apps/fabro-web/app/install-app.tsx b/apps/fabro-web/app/install-app.tsx index a6f86c0b9..35449752f 100644 --- a/apps/fabro-web/app/install-app.tsx +++ b/apps/fabro-web/app/install-app.tsx @@ -427,7 +427,11 @@ export default function InstallApp() { app_name: appName.trim(), allowed_username: allowedUsername.trim(), }); - submitGithubManifest(manifest.github_form_action, manifest.manifest); + submitGithubManifest( + manifest.github_form_action, + manifest.manifest, + manifest.state, + ); } catch (error) { setSaveError( error instanceof Error ? error.message : "Failed to start GitHub setup.", @@ -1438,18 +1442,25 @@ function describeGithubAppOwner( function submitGithubManifest( formAction: string, manifest: Record, + state: string, ): void { const form = document.createElement("form"); form.method = "post"; form.action = formAction; form.style.display = "none"; - const input = document.createElement("input"); - input.type = "hidden"; - input.name = "manifest"; - input.value = JSON.stringify(manifest); + const manifestInput = document.createElement("input"); + manifestInput.type = "hidden"; + manifestInput.name = "manifest"; + manifestInput.value = JSON.stringify(manifest); + form.appendChild(manifestInput); + + const stateInput = document.createElement("input"); + stateInput.type = "hidden"; + stateInput.name = "state"; + stateInput.value = state; + form.appendChild(stateInput); - form.appendChild(input); document.body.appendChild(form); form.submit(); } diff --git a/docs/api-reference/fabro-api.yaml b/docs/api-reference/fabro-api.yaml index 6db9b4b44..2dddbd0cb 100644 --- a/docs/api-reference/fabro-api.yaml +++ b/docs/api-reference/fabro-api.yaml @@ -2356,6 +2356,7 @@ components: required: - manifest - github_form_action + - state properties: manifest: type: object @@ -2363,6 +2364,13 @@ components: github_form_action: type: string format: uri + state: + description: | + CSRF token the browser must echo back to GitHub as a hidden + `state` form field alongside `manifest`. GitHub preserves it on + the redirect to `redirect_url` so the server can match the + callback to this pending install. + type: string InstallGithubSummary: description: Redacted summary of the GitHub install strategy selected during browser install. diff --git a/lib/crates/fabro-server/src/install.rs b/lib/crates/fabro-server/src/install.rs index 353106420..9448181df 100644 --- a/lib/crates/fabro-server/src/install.rs +++ b/lib/crates/fabro-server/src/install.rs @@ -646,40 +646,27 @@ async fn post_install_github_app_manifest( let Some(server) = pending_install.server.clone() else { return missing_step_response("server"); }; - let now = Instant::now(); - if pending_install - .pending_github_app - .as_ref() - .is_some_and(|pending| pending.expires_at > now) - { - return install_error_response( - StatusCode::CONFLICT, - "GitHub App setup is already pending; finish it or wait for it to expire.", - ); - } let state_token = generate_ephemeral_secret(); let manifest = build_github_app_manifest( input.app_name.trim(), - &format!( - "{}/install/github/app/redirect?state={state_token}", - server.canonical_url - ), + &format!("{}/install/github/app/redirect", server.canonical_url), &format!("{}/auth/callback/github", server.canonical_url), &format!("{}/setup", server.canonical_url), ); pending_install.pending_github_app = Some(PendingGithubApp { - state: state_token, + state: state_token.clone(), owner: owner.clone(), app_name: input.app_name.trim().to_string(), allowed_username: input.allowed_username.trim().to_string(), - expires_at: now + Duration::from_mins(10), + expires_at: Instant::now() + Duration::from_mins(10), }); Json(serde_json::json!({ "manifest": manifest, "github_form_action": owner.manifest_form_action(), + "state": state_token, })) .into_response() } diff --git a/lib/crates/fabro-server/tests/it/api/install.rs b/lib/crates/fabro-server/tests/it/api/install.rs index 1c1f77f53..07b074b7e 100644 --- a/lib/crates/fabro-server/tests/it/api/install.rs +++ b/lib/crates/fabro-server/tests/it/api/install.rs @@ -501,15 +501,15 @@ async fn app_install_finish_omits_dev_token_and_does_not_write_it() { "POST /install/github/app/manifest", ) .await; - let redirect_url = manifest_body["manifest"]["redirect_url"] + let state = manifest_body["state"] .as_str() - .expect("redirect_url should be present"); - let redirect_uri = fabro_http::Url::parse(redirect_url).unwrap(); - let state = redirect_uri - .query_pairs() - .find(|(key, _)| key == "state") - .map(|(_, value)| value.into_owned()) - .expect("state should be embedded in redirect_url"); + .expect("state should be present on manifest response") + .to_owned(); + assert_eq!( + manifest_body["manifest"]["redirect_url"], + "https://fabro.example.com/install/github/app/redirect", + "redirect_url must not carry a query string — GitHub rejects manifests whose redirect_url has one" + ); let callback_response = app .clone() @@ -769,15 +769,15 @@ async fn github_app_manifest_round_trip_updates_install_session() { "https://fabro.example.com/auth/callback/github" ); - let redirect_url = manifest_body["manifest"]["redirect_url"] + let state = manifest_body["state"] .as_str() - .expect("redirect_url should be present"); - let redirect_uri = fabro_http::Url::parse(redirect_url).unwrap(); - let state = redirect_uri - .query_pairs() - .find(|(key, _)| key == "state") - .map(|(_, value)| value.into_owned()) - .expect("state should be embedded in redirect_url"); + .expect("state should be present on manifest response") + .to_owned(); + assert_eq!( + manifest_body["manifest"]["redirect_url"], + "https://fabro.example.com/install/github/app/redirect", + "redirect_url must not carry a query string — GitHub rejects manifests whose redirect_url has one" + ); let callback_response = checked_response( app.clone() @@ -831,7 +831,7 @@ async fn github_app_manifest_round_trip_updates_install_session() { } #[tokio::test] -async fn github_app_manifest_rejects_retry_while_pending_and_preserves_prior_token_strategy() { +async fn github_app_manifest_retry_replaces_pending_and_preserves_prior_token_strategy() { let app = build_install_router(InstallAppState::for_test("test-install-token")).await; let server_response = app @@ -878,7 +878,7 @@ async fn github_app_manifest_rejects_retry_while_pending_and_preserves_prior_tok ) .await; - let manifest_response = app + let first_response = app .clone() .oneshot( Request::builder() @@ -893,15 +893,70 @@ async fn github_app_manifest_rejects_retry_while_pending_and_preserves_prior_tok ) .await .unwrap(); - response_status( - manifest_response, + let first_body = response_json( + first_response, StatusCode::OK, - "POST /install/github/app/manifest", + "POST /install/github/app/manifest (initial)", + ) + .await; + let first_state = first_body["state"] + .as_str() + .expect("state should be present on manifest response") + .to_owned(); + + let retry_response = app + .clone() + .oneshot( + Request::builder() + .method("POST") + .uri("/install/github/app/manifest") + .header("authorization", "Bearer test-install-token") + .header("content-type", "application/json") + .body(Body::from( + r#"{"owner":{"kind":"personal"},"app_name":"Fabro Retry","allowed_username":"octocat"}"#, + )) + .unwrap(), + ) + .await + .unwrap(); + let retry_body = response_json( + retry_response, + StatusCode::OK, + "POST /install/github/app/manifest (retry)", + ) + .await; + let retry_state = retry_body["state"] + .as_str() + .expect("state should be present on retry manifest response") + .to_owned(); + assert_ne!( + first_state, retry_state, + "retry must mint a fresh state token so the old callback is invalidated" + ); + + // A late callback using the now-discarded first-attempt state must not + // complete the install. + let stale_callback = app + .clone() + .oneshot( + Request::builder() + .method("GET") + .uri(format!( + "/install/github/app/redirect?code=stub-code&state={first_state}" + )) + .body(Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + response_status( + stale_callback, + StatusCode::FOUND, + "GET /install/github/app/redirect with stale state", ) .await; let session_response = app - .clone() .oneshot( Request::builder() .method("GET") @@ -923,31 +978,6 @@ async fn github_app_manifest_rejects_retry_while_pending_and_preserves_prior_tok .iter() .any(|value| value == "github") ); - - let retry_response = app - .oneshot( - Request::builder() - .method("POST") - .uri("/install/github/app/manifest") - .header("authorization", "Bearer test-install-token") - .header("content-type", "application/json") - .body(Body::from( - r#"{"owner":{"kind":"personal"},"app_name":"Fabro Retry","allowed_username":"octocat"}"#, - )) - .unwrap(), - ) - .await - .unwrap(); - let retry_body = response_json( - retry_response, - StatusCode::CONFLICT, - "POST /install/github/app/manifest", - ) - .await; - assert_eq!( - retry_body["errors"][0]["detail"], - "GitHub App setup is already pending; finish it or wait for it to expire." - ); } #[tokio::test] @@ -1020,15 +1050,15 @@ async fn github_app_redirect_rejects_invalid_or_missing_state_without_mutating_s "POST /install/github/app/manifest", ) .await; - let redirect_url = manifest_body["manifest"]["redirect_url"] + let state = manifest_body["state"] .as_str() - .expect("redirect_url should be present"); - let redirect_uri = fabro_http::Url::parse(redirect_url).unwrap(); - let state = redirect_uri - .query_pairs() - .find(|(key, _)| key == "state") - .map(|(_, value)| value.into_owned()) - .expect("state should be embedded in redirect_url"); + .expect("state should be present on manifest response") + .to_owned(); + assert_eq!( + manifest_body["manifest"]["redirect_url"], + "https://fabro.example.com/install/github/app/redirect", + "redirect_url must not carry a query string — GitHub rejects manifests whose redirect_url has one" + ); let wrong_state_response = checked_response( app.clone() @@ -1181,15 +1211,15 @@ async fn github_app_redirect_exchange_failure_returns_to_wizard_and_keeps_pendin "POST /install/github/app/manifest", ) .await; - let redirect_url = manifest_body["manifest"]["redirect_url"] + let state = manifest_body["state"] .as_str() - .expect("redirect_url should be present"); - let redirect_uri = fabro_http::Url::parse(redirect_url).unwrap(); - let state = redirect_uri - .query_pairs() - .find(|(key, _)| key == "state") - .map(|(_, value)| value.into_owned()) - .expect("state should be embedded in redirect_url"); + .expect("state should be present on manifest response") + .to_owned(); + assert_eq!( + manifest_body["manifest"]["redirect_url"], + "https://fabro.example.com/install/github/app/redirect", + "redirect_url must not carry a query string — GitHub rejects manifests whose redirect_url has one" + ); let callback_response = checked_response( app.clone() diff --git a/lib/crates/fabro-spa/assets/assets/app.css b/lib/crates/fabro-spa/assets/assets/app.css index 1530de026..d8e34e13c 100644 --- a/lib/crates/fabro-spa/assets/assets/app.css +++ b/lib/crates/fabro-spa/assets/assets/app.css @@ -1,2 +1,2 @@ -/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */ +/*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:"Geist", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:"JetBrains Mono", ui-monospace, monospace;--color-amber-100:oklch(96.2% .059 95.617);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-950:oklch(27.9% .077 45.635);--color-teal-300:#b5ddef;--color-teal-500:#67b2d7;--color-teal-700:#357f9e;--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-950:oklch(27.1% .105 12.094);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-navy-950:#0f1729;--color-mint:#5ac8a8;--color-amber:#f0a45b;--color-coral:#e86b6b;--color-page:#0f1729;--color-panel:#252c3d;--color-panel-alt:#1a2133;--color-overlay:#ffffff0a;--color-overlay-strong:#ffffff1a;--color-fg:#fff;--color-fg-2:#e8edf3;--color-fg-3:#a8b5c5;--color-fg-muted:#4b5768;--color-line:#ffffff0f;--color-line-strong:#ffffff1f;--color-focus:#67b2d766;--color-on-primary:#0f1729}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}a[href],button,select,summary,[role=button],[role=link],[role=option],[role=menuitem],[role=tab]{cursor:pointer}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.-inset-0\.5{inset:calc(var(--spacing) * -.5)}.-inset-1\.5{inset:calc(var(--spacing) * -1.5)}.-inset-px{inset:-1px}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.inset-x-3{inset-inline:calc(var(--spacing) * 3)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.top-6{top:calc(var(--spacing) * 6)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-4{right:calc(var(--spacing) * 4)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-6{bottom:calc(var(--spacing) * 6)}.left-3{left:calc(var(--spacing) * 3)}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-2{margin-inline:calc(var(--spacing) * -2)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-auto{margin-inline:auto}.-my-1{margin-block:calc(var(--spacing) * -1)}.-my-6{margin-block:calc(var(--spacing) * -6)}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);margin-top:1.2em;margin-bottom:1.2em;font-size:1.25em;line-height:1.6}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:decimal}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:disc}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows), 0 3px 0 var(--tw-prose-kbd-shadows);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.prose{--tw-prose-body:oklch(37.3% .034 259.733);--tw-prose-headings:oklch(21% .034 264.665);--tw-prose-lead:oklch(44.6% .03 256.802);--tw-prose-links:oklch(21% .034 264.665);--tw-prose-bold:oklch(21% .034 264.665);--tw-prose-counters:oklch(55.1% .027 264.364);--tw-prose-bullets:oklch(87.2% .01 258.338);--tw-prose-hr:oklch(92.8% .006 264.531);--tw-prose-quotes:oklch(21% .034 264.665);--tw-prose-quote-borders:oklch(92.8% .006 264.531);--tw-prose-captions:oklch(55.1% .027 264.364);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:oklab(21% -.00316127 -.0338527/.1);--tw-prose-code:oklch(21% .034 264.665);--tw-prose-pre-code:oklch(92.8% .006 264.531);--tw-prose-pre-bg:oklch(27.8% .033 256.848);--tw-prose-th-borders:oklch(87.2% .01 258.338);--tw-prose-td-borders:oklch(92.8% .006 264.531);--tw-prose-invert-body:oklch(87.2% .01 258.338);--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:oklch(70.7% .022 261.325);--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:oklch(70.7% .022 261.325);--tw-prose-invert-bullets:oklch(44.6% .03 256.802);--tw-prose-invert-hr:oklch(37.3% .034 259.733);--tw-prose-invert-quotes:oklch(96.7% .003 264.542);--tw-prose-invert-quote-borders:oklch(37.3% .034 259.733);--tw-prose-invert-captions:oklch(70.7% .022 261.325);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:#ffffff1a;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:oklch(87.2% .01 258.338);--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:oklch(44.6% .03 256.802);--tw-prose-invert-td-borders:oklch(37.3% .034 259.733);font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.71429}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.888889em;margin-bottom:.888889em;font-size:1.28571em;line-height:1.55556}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.33333em;margin-bottom:1.33333em;padding-inline-start:1.11111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:.8em;font-size:2.14286em;line-height:1.2}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.6em;margin-bottom:.8em;font-size:1.42857em;line-height:1.4}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.55556em;margin-bottom:.444444em;font-size:1.28571em;line-height:1.55556}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.42857em;margin-bottom:.571429em;line-height:1.42857}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.142857em;padding-inline-end:.357143em;padding-bottom:.142857em;border-radius:.3125rem;padding-inline-start:.357143em;font-size:.857143em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;border-radius:.25rem;margin-top:1.66667em;margin-bottom:1.66667em;padding-inline-start:1em;font-size:.857143em;line-height:1.66667}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em;padding-inline-start:1.57143em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;margin-bottom:.285714em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.428571em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.14286em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.571429em;margin-bottom:.571429em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em;margin-bottom:1.14286em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.14286em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.285714em;padding-inline-start:1.57143em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.85714em;margin-bottom:2.85714em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.857143em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.666667em;padding-inline-end:1em;padding-bottom:.666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.71429em;margin-bottom:1.71429em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.666667em;font-size:.857143em;line-height:1.33333}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.-mr-2{margin-right:calc(var(--spacing) * -2)}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.-ml-px{margin-left:-1px}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.h-1{height:calc(var(--spacing) * 1)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-8{height:calc(var(--spacing) * 8)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-32{height:calc(var(--spacing) * 32)}.h-48{height:calc(var(--spacing) * 48)}.h-64{height:calc(var(--spacing) * 64)}.h-full{height:100%}.h-px{height:1px}.max-h-64{max-height:calc(var(--spacing) * 64)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-12{min-height:calc(var(--spacing) * 12)}.min-h-28{min-height:calc(var(--spacing) * 28)}.min-h-\[7lh\]{min-height:7lh}.min-h-\[32px\]{min-height:32px}.min-h-\[44px\]{min-height:44px}.min-h-dvh{min-height:100dvh}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-12{width:calc(var(--spacing) * 12)}.w-24{width:calc(var(--spacing) * 24)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-72{width:calc(var(--spacing) * 72)}.w-\[min\(24rem\,calc\(100vw-2rem\)\)\]{width:min(24rem,100vw - 2rem)}.w-auto{width:auto}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-\[48ch\]{max-width:48ch}.max-w-\[56ch\]{max-width:56ch}.max-w-\[60ch\]{max-width:60ch}.max-w-\[120px\]{max-width:120px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-prose{max-width:65ch}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-11{min-width:calc(var(--spacing) * 11)}.min-w-\[44px\]{min-width:44px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.origin-top-right{transform-origin:100% 0}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.list-none{list-style-type:none}.appearance-none{appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-rows-\[0fr\]{grid-template-rows:0fr}.grid-rows-\[1fr\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-px>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(1px * var(--tw-space-y-reverse));margin-block-end:calc(1px * calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-line>:not(:last-child)){border-color:var(--color-line)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.rounded-r-md{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab, red, red)){.border-amber-500\/30{border-color:color-mix(in oklab, var(--color-amber-500) 30%, transparent)}}.border-amber\/20{border-color:#f0a45b33}@supports (color:color-mix(in lab, red, red)){.border-amber\/20{border-color:color-mix(in oklab, var(--color-amber) 20%, transparent)}}.border-amber\/30{border-color:#f0a45b4d}@supports (color:color-mix(in lab, red, red)){.border-amber\/30{border-color:color-mix(in oklab, var(--color-amber) 30%, transparent)}}.border-amber\/50{border-color:#f0a45b80}@supports (color:color-mix(in lab, red, red)){.border-amber\/50{border-color:color-mix(in oklab, var(--color-amber) 50%, transparent)}}.border-coral\/15{border-color:#e86b6b26}@supports (color:color-mix(in lab, red, red)){.border-coral\/15{border-color:color-mix(in oklab, var(--color-coral) 15%, transparent)}}.border-coral\/30{border-color:#e86b6b4d}@supports (color:color-mix(in lab, red, red)){.border-coral\/30{border-color:color-mix(in oklab, var(--color-coral) 30%, transparent)}}.border-coral\/40{border-color:#e86b6b66}@supports (color:color-mix(in lab, red, red)){.border-coral\/40{border-color:color-mix(in oklab, var(--color-coral) 40%, transparent)}}.border-fg-muted{border-color:var(--color-fg-muted)}.border-focus{border-color:var(--color-focus)}.border-line{border-color:var(--color-line)}.border-line-strong{border-color:var(--color-line-strong)}.border-mint\/15{border-color:#5ac8a826}@supports (color:color-mix(in lab, red, red)){.border-mint\/15{border-color:color-mix(in oklab, var(--color-mint) 15%, transparent)}}.border-mint\/20{border-color:#5ac8a833}@supports (color:color-mix(in lab, red, red)){.border-mint\/20{border-color:color-mix(in oklab, var(--color-mint) 20%, transparent)}}.border-rose-500\/30{border-color:#ff23574d}@supports (color:color-mix(in lab, red, red)){.border-rose-500\/30{border-color:color-mix(in oklab, var(--color-rose-500) 30%, transparent)}}.border-rose-500\/40{border-color:#ff235766}@supports (color:color-mix(in lab, red, red)){.border-rose-500\/40{border-color:color-mix(in oklab, var(--color-rose-500) 40%, transparent)}}.border-teal-500{border-color:var(--color-teal-500)}.border-teal-500\/20{border-color:#67b2d733}@supports (color:color-mix(in lab, red, red)){.border-teal-500\/20{border-color:color-mix(in oklab, var(--color-teal-500) 20%, transparent)}}.border-teal-500\/30{border-color:#67b2d74d}@supports (color:color-mix(in lab, red, red)){.border-teal-500\/30{border-color:color-mix(in oklab, var(--color-teal-500) 30%, transparent)}}.border-teal-500\/50{border-color:#67b2d780}@supports (color:color-mix(in lab, red, red)){.border-teal-500\/50{border-color:color-mix(in oklab, var(--color-teal-500) 50%, transparent)}}.border-transparent{border-color:#0000}.bg-amber{background-color:var(--color-amber)}.bg-amber-950\/20{background-color:#46190133}@supports (color:color-mix(in lab, red, red)){.bg-amber-950\/20{background-color:color-mix(in oklab, var(--color-amber-950) 20%, transparent)}}.bg-amber\/10{background-color:#f0a45b1a}@supports (color:color-mix(in lab, red, red)){.bg-amber\/10{background-color:color-mix(in oklab, var(--color-amber) 10%, transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab, red, red)){.bg-black\/60{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.bg-coral{background-color:var(--color-coral)}.bg-coral\/5{background-color:#e86b6b0d}@supports (color:color-mix(in lab, red, red)){.bg-coral\/5{background-color:color-mix(in oklab, var(--color-coral) 5%, transparent)}}.bg-coral\/10{background-color:#e86b6b1a}@supports (color:color-mix(in lab, red, red)){.bg-coral\/10{background-color:color-mix(in oklab, var(--color-coral) 10%, transparent)}}.bg-coral\/15{background-color:#e86b6b26}@supports (color:color-mix(in lab, red, red)){.bg-coral\/15{background-color:color-mix(in oklab, var(--color-coral) 15%, transparent)}}.bg-fg-muted{background-color:var(--color-fg-muted)}.bg-line-strong{background-color:var(--color-line-strong)}.bg-mint{background-color:var(--color-mint)}.bg-mint\/5{background-color:#5ac8a80d}@supports (color:color-mix(in lab, red, red)){.bg-mint\/5{background-color:color-mix(in oklab, var(--color-mint) 5%, transparent)}}.bg-mint\/15{background-color:#5ac8a826}@supports (color:color-mix(in lab, red, red)){.bg-mint\/15{background-color:color-mix(in oklab, var(--color-mint) 15%, transparent)}}.bg-mint\/40{background-color:#5ac8a866}@supports (color:color-mix(in lab, red, red)){.bg-mint\/40{background-color:color-mix(in oklab, var(--color-mint) 40%, transparent)}}.bg-navy-950{background-color:var(--color-navy-950)}.bg-overlay{background-color:var(--color-overlay)}.bg-overlay-strong{background-color:var(--color-overlay-strong)}.bg-page{background-color:var(--color-page)}.bg-page\/50{background-color:#0f172980}@supports (color:color-mix(in lab, red, red)){.bg-page\/50{background-color:color-mix(in oklab, var(--color-page) 50%, transparent)}}.bg-page\/60{background-color:#0f172999}@supports (color:color-mix(in lab, red, red)){.bg-page\/60{background-color:color-mix(in oklab, var(--color-page) 60%, transparent)}}.bg-page\/80{background-color:#0f1729cc}@supports (color:color-mix(in lab, red, red)){.bg-page\/80{background-color:color-mix(in oklab, var(--color-page) 80%, transparent)}}.bg-page\/85{background-color:#0f1729d9}@supports (color:color-mix(in lab, red, red)){.bg-page\/85{background-color:color-mix(in oklab, var(--color-page) 85%, transparent)}}.bg-panel{background-color:var(--color-panel)}.bg-panel-alt{background-color:var(--color-panel-alt)}.bg-panel-alt\/40{background-color:#1a213366}@supports (color:color-mix(in lab, red, red)){.bg-panel-alt\/40{background-color:color-mix(in oklab, var(--color-panel-alt) 40%, transparent)}}.bg-panel-alt\/60{background-color:#1a213399}@supports (color:color-mix(in lab, red, red)){.bg-panel-alt\/60{background-color:color-mix(in oklab, var(--color-panel-alt) 60%, transparent)}}.bg-panel-alt\/80{background-color:#1a2133cc}@supports (color:color-mix(in lab, red, red)){.bg-panel-alt\/80{background-color:color-mix(in oklab, var(--color-panel-alt) 80%, transparent)}}.bg-panel\/40{background-color:#252c3d66}@supports (color:color-mix(in lab, red, red)){.bg-panel\/40{background-color:color-mix(in oklab, var(--color-panel) 40%, transparent)}}.bg-panel\/50{background-color:#252c3d80}@supports (color:color-mix(in lab, red, red)){.bg-panel\/50{background-color:color-mix(in oklab, var(--color-panel) 50%, transparent)}}.bg-panel\/60{background-color:#252c3d99}@supports (color:color-mix(in lab, red, red)){.bg-panel\/60{background-color:color-mix(in oklab, var(--color-panel) 60%, transparent)}}.bg-panel\/80{background-color:#252c3dcc}@supports (color:color-mix(in lab, red, red)){.bg-panel\/80{background-color:color-mix(in oklab, var(--color-panel) 80%, transparent)}}.bg-panel\/90{background-color:#252c3de6}@supports (color:color-mix(in lab, red, red)){.bg-panel\/90{background-color:color-mix(in oklab, var(--color-panel) 90%, transparent)}}.bg-panel\/95{background-color:#252c3df2}@supports (color:color-mix(in lab, red, red)){.bg-panel\/95{background-color:color-mix(in oklab, var(--color-panel) 95%, transparent)}}.bg-rose-950\/20{background-color:#4d021833}@supports (color:color-mix(in lab, red, red)){.bg-rose-950\/20{background-color:color-mix(in oklab, var(--color-rose-950) 20%, transparent)}}.bg-rose-950\/40{background-color:#4d021866}@supports (color:color-mix(in lab, red, red)){.bg-rose-950\/40{background-color:color-mix(in oklab, var(--color-rose-950) 40%, transparent)}}.bg-rose-950\/90{background-color:#4d0218e6}@supports (color:color-mix(in lab, red, red)){.bg-rose-950\/90{background-color:color-mix(in oklab, var(--color-rose-950) 90%, transparent)}}.bg-teal-300{background-color:var(--color-teal-300)}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-500\/5{background-color:#67b2d70d}@supports (color:color-mix(in lab, red, red)){.bg-teal-500\/5{background-color:color-mix(in oklab, var(--color-teal-500) 5%, transparent)}}.bg-teal-500\/10{background-color:#67b2d71a}@supports (color:color-mix(in lab, red, red)){.bg-teal-500\/10{background-color:color-mix(in oklab, var(--color-teal-500) 10%, transparent)}}.bg-teal-500\/15{background-color:#67b2d726}@supports (color:color-mix(in lab, red, red)){.bg-teal-500\/15{background-color:color-mix(in oklab, var(--color-teal-500) 15%, transparent)}}.bg-transparent{background-color:#0000}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.bg-white\/10{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-teal-500\/30{--tw-gradient-from:#67b2d74d}@supports (color:color-mix(in lab, red, red)){.from-teal-500\/30{--tw-gradient-from:color-mix(in oklab, var(--color-teal-500) 30%, transparent)}}.from-teal-500\/30{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-mint\/20{--tw-gradient-to:#5ac8a833}@supports (color:color-mix(in lab, red, red)){.to-mint\/20{--tw-gradient-to:color-mix(in oklab, var(--color-mint) 20%, transparent)}}.to-mint\/20{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-24{padding-block:calc(var(--spacing) * 24)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-\[12vh\]{padding-top:12vh}.pt-\[15vh\]{padding-top:15vh}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-11{padding-right:calc(var(--spacing) * 11)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-14{padding-bottom:calc(var(--spacing) * 14)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-base\/7{font-size:var(--text-base);line-height:calc(var(--spacing) * 7)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-sm\/6{font-size:var(--text-sm);line-height:calc(var(--spacing) * 6)}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-xs\/5{font-size:var(--text-xs);line-height:calc(var(--spacing) * 5)}.text-\[2rem\]{font-size:2rem}.text-\[8rem\]{font-size:8rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[15px\]{font-size:15px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-\[1\.625rem\]{--tw-leading:1.625rem;line-height:1.625rem}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.text-balance{text-wrap:balance}.text-pretty{text-wrap:pretty}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber{color:var(--color-amber)}.text-amber-100{color:var(--color-amber-100)}.text-amber\/70{color:#f0a45bb3}@supports (color:color-mix(in lab, red, red)){.text-amber\/70{color:color-mix(in oklab, var(--color-amber) 70%, transparent)}}.text-coral{color:var(--color-coral)}.text-current,.text-current\/70{color:currentColor}@supports (color:color-mix(in lab, red, red)){.text-current\/70{color:color-mix(in oklab, currentcolor 70%, transparent)}}.text-fg{color:var(--color-fg)}.text-fg-2{color:var(--color-fg-2)}.text-fg-3{color:var(--color-fg-3)}.text-fg-muted{color:var(--color-fg-muted)}.text-fg-muted\/60{color:#4b576899}@supports (color:color-mix(in lab, red, red)){.text-fg-muted\/60{color:color-mix(in oklab, var(--color-fg-muted) 60%, transparent)}}.text-mint{color:var(--color-mint)}.text-on-primary{color:var(--color-on-primary)}.text-rose-50{color:var(--color-rose-50)}.text-rose-100{color:var(--color-rose-100)}.text-rose-200{color:var(--color-rose-200)}.text-teal-300{color:var(--color-teal-300)}.text-teal-500{color:var(--color-teal-500)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-fg-muted::placeholder{color:var(--color-fg-muted)}.scheme-only-dark{color-scheme:dark only}.opacity-0{opacity:0}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-black\/30{--tw-shadow-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.shadow-black\/30{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 30%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-black\/40{--tw-shadow-color:#0006}@supports (color:color-mix(in lab, red, red)){.shadow-black\/40{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 40%, transparent) var(--tw-shadow-alpha), transparent)}}.outline,.outline-1{outline-style:var(--tw-outline-style);outline-width:1px}.-outline-offset-1{outline-offset:calc(1px * -1)}.outline-amber\/30{outline-color:#f0a45b4d}@supports (color:color-mix(in lab, red, red)){.outline-amber\/30{outline-color:color-mix(in oklab, var(--color-amber) 30%, transparent)}}.outline-coral\/40{outline-color:#e86b6b66}@supports (color:color-mix(in lab, red, red)){.outline-coral\/40{outline-color:color-mix(in oklab, var(--color-coral) 40%, transparent)}}.outline-line-strong{outline-color:var(--color-line-strong)}.outline-teal-500{outline-color:var(--color-teal-500)}.outline-teal-500\/60{outline-color:#67b2d799}@supports (color:color-mix(in lab, red, red)){.outline-teal-500\/60{outline-color:color-mix(in oklab, var(--color-teal-500) 60%, transparent)}}.outline-white\/10{outline-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.outline-white\/10{outline-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.outline-white\/20{outline-color:#fff3}@supports (color:color-mix(in lab, red, red)){.outline-white\/20{outline-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.blur-sm{--tw-blur:blur(var(--blur-sm));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[--anchor-gap\:4px\]{--anchor-gap:4px}.group-open\:-rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:-180deg}.group-focus-within\:border-focus:is(:where(.group):focus-within *){border-color:var(--color-focus)}.group-focus-within\:opacity-100:is(:where(.group):focus-within *){opacity:1}@media (hover:hover){.group-hover\:text-fg:is(:where(.group):hover *){color:var(--color-fg)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-data-open\:block:is(:where(.group)[data-open] *){display:block}.group-data-open\:hidden:is(:where(.group)[data-open] *){display:none}.placeholder\:text-fg-muted::placeholder{color:var(--color-fg-muted)}.after\:pointer-events-none:after{content:var(--tw-content);pointer-events:none}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-x-0:after{content:var(--tw-content);inset-inline:calc(var(--spacing) * 0)}.after\:bottom-0:after{content:var(--tw-content);bottom:calc(var(--spacing) * 0)}.after\:border-b:after{content:var(--tw-content);border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.after\:border-line-strong:after{content:var(--tw-content);border-color:var(--color-line-strong)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.focus-within\:opacity-100:focus-within{opacity:1}@media (hover:hover){.hover\:border-amber\/50:hover{border-color:#f0a45b80}@supports (color:color-mix(in lab, red, red)){.hover\:border-amber\/50:hover{border-color:color-mix(in oklab, var(--color-amber) 50%, transparent)}}.hover\:border-line-strong:hover{border-color:var(--color-line-strong)}.hover\:border-mint\/50:hover{border-color:#5ac8a880}@supports (color:color-mix(in lab, red, red)){.hover\:border-mint\/50:hover{border-color:color-mix(in oklab, var(--color-mint) 50%, transparent)}}.hover\:border-teal-500\/30:hover{border-color:#67b2d74d}@supports (color:color-mix(in lab, red, red)){.hover\:border-teal-500\/30:hover{border-color:color-mix(in oklab, var(--color-teal-500) 30%, transparent)}}.hover\:border-teal-500\/40:hover{border-color:#67b2d766}@supports (color:color-mix(in lab, red, red)){.hover\:border-teal-500\/40:hover{border-color:color-mix(in oklab, var(--color-teal-500) 40%, transparent)}}.hover\:border-teal-500\/50:hover{border-color:#67b2d780}@supports (color:color-mix(in lab, red, red)){.hover\:border-teal-500\/50:hover{border-color:color-mix(in oklab, var(--color-teal-500) 50%, transparent)}}.hover\:bg-amber\/10:hover{background-color:#f0a45b1a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-amber\/10:hover{background-color:color-mix(in oklab, var(--color-amber) 10%, transparent)}}.hover\:bg-coral\/15:hover{background-color:#e86b6b26}@supports (color:color-mix(in lab, red, red)){.hover\:bg-coral\/15:hover{background-color:color-mix(in oklab, var(--color-coral) 15%, transparent)}}.hover\:bg-mint\/10:hover{background-color:#5ac8a81a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-mint\/10:hover{background-color:color-mix(in oklab, var(--color-mint) 10%, transparent)}}.hover\:bg-overlay:hover{background-color:var(--color-overlay)}.hover\:bg-overlay-strong:hover{background-color:var(--color-overlay-strong)}.hover\:bg-page\/80:hover{background-color:#0f1729cc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-page\/80:hover{background-color:color-mix(in oklab, var(--color-page) 80%, transparent)}}.hover\:bg-panel:hover{background-color:var(--color-panel)}.hover\:bg-panel\/80:hover{background-color:#252c3dcc}@supports (color:color-mix(in lab, red, red)){.hover\:bg-panel\/80:hover{background-color:color-mix(in oklab, var(--color-panel) 80%, transparent)}}.hover\:bg-rose-950\/60:hover{background-color:#4d021899}@supports (color:color-mix(in lab, red, red)){.hover\:bg-rose-950\/60:hover{background-color:color-mix(in oklab, var(--color-rose-950) 60%, transparent)}}.hover\:bg-teal-300:hover{background-color:var(--color-teal-300)}.hover\:bg-teal-500\/15:hover{background-color:#67b2d726}@supports (color:color-mix(in lab, red, red)){.hover\:bg-teal-500\/15:hover{background-color:color-mix(in oklab, var(--color-teal-500) 15%, transparent)}}.hover\:bg-teal-500\/20:hover{background-color:#67b2d733}@supports (color:color-mix(in lab, red, red)){.hover\:bg-teal-500\/20:hover{background-color:color-mix(in oklab, var(--color-teal-500) 20%, transparent)}}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.hover\:bg-white\/15:hover{background-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/15:hover{background-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.hover\:text-current:hover{color:currentColor}.hover\:text-fg:hover{color:var(--color-fg)}.hover\:text-fg-2:hover{color:var(--color-fg-2)}.hover\:text-fg-3:hover{color:var(--color-fg-3)}.hover\:text-teal-300:hover{color:var(--color-teal-300)}.hover\:text-teal-500:hover{color:var(--color-teal-500)}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:shadow-black\/20:hover{--tw-shadow-color:#0003}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-black\/20:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-black) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.hover\:outline-white\/15:hover{outline-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.hover\:outline-white\/15:hover{outline-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}}.focus\:border-focus:focus{border-color:var(--color-focus)}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:outline-2:focus{outline-style:var(--tw-outline-style);outline-width:2px}.focus\:-outline-offset-1:focus{outline-offset:calc(1px * -1)}.focus\:outline-offset-2:focus{outline-offset:2px}.focus\:outline-focus:focus{outline-color:var(--color-focus)}.focus\:outline-teal-500:focus{outline-color:var(--color-teal-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:-outline-offset-1:focus-visible{outline-offset:calc(1px * -1)}.focus-visible\:-outline-offset-2:focus-visible{outline-offset:calc(2px * -1)}.focus-visible\:outline-offset-1:focus-visible{outline-offset:1px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-offset-4:focus-visible{outline-offset:4px}.focus-visible\:outline-teal-500:focus-visible{outline-color:var(--color-teal-500)}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-line:disabled{border-color:var(--color-line)}.disabled\:text-fg-muted:disabled{color:var(--color-fg-muted)}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-60:disabled{opacity:.6}@media (hover:hover){.disabled\:hover\:border-mint\/20:disabled:hover{border-color:#5ac8a833}@supports (color:color-mix(in lab, red, red)){.disabled\:hover\:border-mint\/20:disabled:hover{border-color:color-mix(in oklab, var(--color-mint) 20%, transparent)}}.disabled\:hover\:bg-coral\/10:disabled:hover{background-color:#e86b6b1a}@supports (color:color-mix(in lab, red, red)){.disabled\:hover\:bg-coral\/10:disabled:hover{background-color:color-mix(in oklab, var(--color-coral) 10%, transparent)}}.disabled\:hover\:bg-mint\/5:disabled:hover{background-color:#5ac8a80d}@supports (color:color-mix(in lab, red, red)){.disabled\:hover\:bg-mint\/5:disabled:hover{background-color:color-mix(in oklab, var(--color-mint) 5%, transparent)}}.disabled\:hover\:bg-teal-500:disabled:hover{background-color:var(--color-teal-500)}.disabled\:hover\:bg-transparent:disabled:hover{background-color:#0000}.disabled\:hover\:text-fg-muted:disabled:hover{color:var(--color-fg-muted)}.disabled\:hover\:text-mint:disabled:hover{color:var(--color-mint)}}.data-closed\:scale-95[data-closed]{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.data-closed\:transform[data-closed]{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.data-closed\:opacity-0[data-closed]{opacity:0}.data-enter\:duration-100[data-enter]{--tw-duration:.1s;transition-duration:.1s}.data-enter\:ease-out[data-enter]{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.data-focus\:bg-overlay[data-focus]{background-color:var(--color-overlay)}.data-focus\:outline-hidden[data-focus]{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.data-focus\:outline-hidden[data-focus]{outline-offset:2px;outline:2px solid #0000}}.data-leave\:duration-75[data-leave]{--tw-duration:75ms;transition-duration:75ms}.data-leave\:ease-in[data-leave]{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.data-selected\:text-teal-300[data-selected]{color:var(--color-teal-300)}@media (prefers-reduced-motion:no-preference){.motion-safe\:animate-pulse{animation:var(--animate-pulse)}}@media (min-width:40rem){.sm\:right-6{right:calc(var(--spacing) * 6)}.sm\:-mx-6{margin-inline:calc(var(--spacing) * -6)}.sm\:mt-12{margin-top:calc(var(--spacing) * 12)}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-baseline{align-items:baseline}.sm\:justify-between{justify-content:space-between}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-16{padding-block:calc(var(--spacing) * 16)}.sm\:py-20{padding-block:calc(var(--spacing) * 20)}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-\[0\.9375rem\]\/7{font-size:.9375rem;line-height:calc(var(--spacing) * 7)}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.sm\:text-\[1\.75rem\]{font-size:1.75rem}}@media (min-width:48rem){.md\:ml-6{margin-left:calc(var(--spacing) * 6)}.md\:block{display:block}.md\:hidden{display:none}}@media (min-width:64rem){.lg\:-mx-8{margin-inline:calc(var(--spacing) * -8)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}}.prose-headings\:text-fg-2 :where(h1,h2,h3,h4,h5,h6,th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-fg-2)}.prose-a\:text-teal-500 :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-teal-500)}.prose-strong\:text-fg-2 :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-fg-2)}.prose-code\:rounded :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){border-radius:.25rem}.prose-code\:bg-overlay-strong :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--color-overlay-strong)}.prose-code\:px-1 :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline:calc(var(--spacing) * 1)}.prose-code\:py-0\.5 :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){padding-block:calc(var(--spacing) * .5)}.prose-code\:font-mono :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-family:var(--font-mono)}.prose-code\:text-\[0\.8em\] :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8em}.prose-code\:text-fg-3 :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-fg-3)}.prose-code\:before\:content-none :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose-code\:after\:content-none :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:var(--tw-content);--tw-content:none;content:none}.prose-pre\:bg-overlay-strong :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:var(--color-overlay-strong)}.prose-pre\:text-fg-3 :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-fg-3)}.\[\&_svg\]\:mx-auto svg{margin-inline:auto}.\[\&_svg\]\:block svg{display:block}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\:not\(\:first-child\)\]\:ml-1:not(:first-child){margin-left:calc(var(--spacing) * 1)}.\[\&\:not\(\:first-child\)\]\:border-l:not(:first-child){border-left-style:var(--tw-border-style);border-left-width:1px}.\[\&\:not\(\:first-child\)\]\:border-line-strong:not(:first-child){border-color:var(--color-line-strong)}.\[\&\:not\(\:first-child\)\]\:pl-1:not(:first-child){padding-left:calc(var(--spacing) * 1)}}:root{--chart-gridline:#ffffff0a;--chart-axis-label:#4b5768}.bg-atmosphere{background-color:var(--color-page);background-image:radial-gradient(120% 60% at 15% 5%,#357f9e1f 0%,#0000 50%),radial-gradient(80% 50% at 85% 90%,#5ac8a812 0%,#0000 45%);background-attachment:fixed}.bg-atmosphere:before{content:"";z-index:1;pointer-events:none;opacity:.07;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;position:fixed;inset:0}:root{--diffs-font-family:"JetBrains Mono", ui-monospace, monospace;--diffs-header-font-family:"Geist", ui-sans-serif, system-ui, sans-serif;--diffs-font-size:13px;--diffs-line-height:20px;--diffs-bg-buffer-override:#0f1729;--diffs-bg-context-override:#161d2e;--diffs-bg-hover-override:#1c2438;--diffs-bg-separator-override:#252c3d;--diffs-fg-number-override:#4b5768;--diffs-addition-color-override:#5ac8a8;--diffs-fg-number-addition-override:#5ac8a880;--diffs-deletion-color-override:#e86b6b;--diffs-fg-number-deletion-override:#e86b6b80}.graph-svg text{fill:#c6d4e0}.graph-svg [stroke=\#357f9e]{stroke:#67b2d7}.graph-svg [stroke=\#666666]{stroke:#5a7a94}.graph-svg polygon[fill=\#357f9e]{fill:#67b2d7}.graph-svg polygon[fill=\#666666]{fill:#5a7a94}.graph-svg ellipse[fill=\#ffffff],.graph-svg polygon[fill=\#ffffff]{fill:#1a2b3c}.graph-svg ellipse[stroke=\#357f9e],.graph-svg polygon[stroke=\#357f9e]{stroke:#67b2d7}.graph-svg [fill=\#1a1a1a]{fill:#c6d4e0}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} \ No newline at end of file diff --git a/lib/crates/fabro-spa/assets/assets/entry-b79sap7r.js b/lib/crates/fabro-spa/assets/assets/entry-n6nbr3z5.js similarity index 96% rename from lib/crates/fabro-spa/assets/assets/entry-b79sap7r.js rename to lib/crates/fabro-spa/assets/assets/entry-n6nbr3z5.js index 4d5c799c8..9dfd06e7d 100644 --- a/lib/crates/fabro-spa/assets/assets/entry-b79sap7r.js +++ b/lib/crates/fabro-spa/assets/assets/entry-n6nbr3z5.js @@ -240,7 +240,7 @@ React keys must be passed directly to JSX without using spread: <%s key={someKey} {...props} />`,M0,w0,l0,w0),X0[w0+M0]=!0)}if(w0=null,H0!==void 0&&(J(H0),w0=""+H0),$(q0)&&(J(q0.key),w0=""+q0.key),"key"in q0){H0={};for(var t0 in q0)t0!=="key"&&(H0[t0]=q0[t0])}else H0=q0;return w0&&W(H0,typeof f==="function"?f.displayName||f.name||"Unknown":f),M(f,w0,H0,q(),y0,i0)}function O(f){_(f)?f._store&&(f._store.validated=1):typeof f==="object"&&f!==null&&f.$$typeof===h&&(f._payload.status==="fulfilled"?_(f._payload.value)&&f._payload.value._store&&(f._payload.value._store.validated=1):f._store&&(f._store.validated=1))}function _(f){return typeof f==="object"&&f!==null&&f.$$typeof===A}var A=Symbol.for("react.transitional.element"),P=Symbol.for("react.portal"),R=Symbol.for("react.fragment"),T=Symbol.for("react.strict_mode"),v=Symbol.for("react.profiler"),L=Symbol.for("react.consumer"),C=Symbol.for("react.context"),D=Symbol.for("react.forward_ref"),I=Symbol.for("react.suspense"),S=Symbol.for("react.suspense_list"),y=Symbol.for("react.memo"),h=Symbol.for("react.lazy"),i=Symbol.for("react.activity"),x=Symbol.for("react.client.reference"),s=PQ.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,z0=Object.prototype.hasOwnProperty,$0=Array.isArray,e=console.createTask?console.createTask:function(){return null};PQ={react_stack_bottom_frame:function(f){return f()}};var c,Z0={},W0=PQ.react_stack_bottom_frame.bind(PQ,B)(),n=e(z(B)),X0={};C60.Fragment=R,C60.jsx=function(f,q0,H0){var M0=1e4>s.recentlyCreatedOwnerStacks++;return N(f,q0,H0,!1,M0?Error("react-stack-top-frame"):W0,M0?e(z(f)):n)},C60.jsxs=function(f,q0,H0){var M0=1e4>s.recentlyCreatedOwnerStacks++;return N(f,q0,H0,!0,M0?Error("react-stack-top-frame"):W0,M0?e(z(f)):n)}})()});var sh=b3((zN,rh)=>{(function(Z,Y){typeof zN=="object"&&typeof rh<"u"?Y(zN):typeof define=="function"&&define.amd?define(["exports"],Y):Y((Z=Z||self).lru_map=Z.lru_map||{})})(zN,function(Z){let Y=Symbol("newer"),J=Symbol("older");class z{constructor(U,M){typeof U!=="number"&&(M=U,U=0),this.size=0,this.limit=U,this.oldest=this.newest=void 0,this._keymap=new Map,M&&(this.assign(M),U<1&&(this.limit=this.size))}_markEntryAsUsed(U){if(U===this.newest)return;U[Y]&&(U===this.oldest&&(this.oldest=U[Y]),U[Y][J]=U[J]),U[J]&&(U[J][Y]=U[Y]),U[Y]=void 0,U[J]=this.newest,this.newest&&(this.newest[Y]=U),this.newest=U}assign(U){let M,N=this.limit||Number.MAX_VALUE;this._keymap.clear();let O=U[Symbol.iterator]();for(let _=O.next();!_.done;_=O.next()){let A=new q(_.value[0],_.value[1]);if(this._keymap.set(A.key,A),M?(M[Y]=A,A[J]=M):this.oldest=A,M=A,N--==0)throw Error("overflow")}this.newest=M,this.size=this._keymap.size}get(U){var M=this._keymap.get(U);return M?(this._markEntryAsUsed(M),M.value):void 0}set(U,M){var N=this._keymap.get(U);return N?(N.value=M,this._markEntryAsUsed(N),this):(this._keymap.set(U,N=new q(U,M)),this.newest?(this.newest[Y]=N,N[J]=this.newest):this.oldest=N,this.newest=N,++this.size,this.size>this.limit&&this.shift(),this)}shift(){var U=this.oldest;if(U)return this.oldest[Y]?(this.oldest=this.oldest[Y],this.oldest[J]=void 0):(this.oldest=void 0,this.newest=void 0),U[Y]=U[J]=void 0,this._keymap.delete(U.key),--this.size,[U.key,U.value]}find(U){let M=this._keymap.get(U);return M?M.value:void 0}has(U){return this._keymap.has(U)}delete(U){var M=this._keymap.get(U);return M?(this._keymap.delete(M.key),M[Y]&&M[J]?(M[J][Y]=M[Y],M[Y][J]=M[J]):M[Y]?(M[Y][J]=void 0,this.oldest=M[Y]):M[J]?(M[J][Y]=void 0,this.newest=M[J]):this.oldest=this.newest=void 0,this.size--,M.value):void 0}clear(){this.oldest=this.newest=void 0,this.size=0,this._keymap.clear()}keys(){return new $(this.oldest)}values(){return new W(this.oldest)}entries(){return this}[Symbol.iterator](){return new B(this.oldest)}forEach(U,M){typeof M!=="object"&&(M=this);let N=this.oldest;for(;N;)U.call(M,N.value,N.key,this),N=N[Y]}toJSON(){for(var U=Array(this.size),M=0,N=this.oldest;N;)U[M++]={key:N.key,value:N.value},N=N[Y];return U}toString(){for(var U="",M=this.oldest;M;)U+=String(M.key)+":"+M.value,M=M[Y],M&&(U+=" < ");return U}}Z.LRUMap=z;function q(U,M){this.key=U,this.value=M,this[Y]=void 0,this[J]=void 0}function B(U){this.entry=U}B.prototype[Symbol.iterator]=function(){return this},B.prototype.next=function(){let U=this.entry;return U?(this.entry=U[Y],{done:!1,value:[U.key,U.value]}):{done:!0,value:void 0}};function $(U){this.entry=U}$.prototype[Symbol.iterator]=function(){return this},$.prototype.next=function(){let U=this.entry;return U?(this.entry=U[Y],{done:!1,value:U.key}):{done:!0,value:void 0}};function W(U){this.entry=U}W.prototype[Symbol.iterator]=function(){return this},W.prototype.next=function(){let U=this.entry;return U?(this.entry=U[Y],{done:!1,value:U.value}):{done:!0,value:void 0}}})});var hc=g(Q0(),1),mc=g(cy(),1);var B4=g(Q0(),1),g0=g(Q0(),1),Z1=g(Q0(),1),$F=g(Q0(),1),nI=g(Q0(),1),Z5=g(Q0(),1),Fo=g(Q0(),1),Po=g(Q0(),1),Vo=g(Q0(),1),h0=g(Q0(),1),Uj=g(Q0(),1),_I=(Z)=>{throw TypeError(Z)},Lr=(Z,Y,J)=>Y.has(Z)||_I("Cannot "+J),uA=(Z,Y,J)=>(Lr(Z,Y,"read from private field"),J?J.call(Z):Y.get(Z)),Tr=(Z,Y,J)=>Y.has(Z)?_I("Cannot add the same private member more than once"):Y instanceof WeakSet?Y.add(Z):Y.set(Z,J);var dy="popstate";function AI(Z={}){function Y(z,q){let{pathname:B,search:$,hash:W}=z.location;return aK("",{pathname:B,search:$,hash:W},q.state&&q.state.usr||null,q.state&&q.state.key||"default")}function J(z,q){return typeof q==="string"?q:f6(q)}return br(Y,J,null,Z)}function G1(Z,Y){if(Z===!1||Z===null||typeof Z>"u")throw Error(Y)}function g5(Z,Y){if(!Z){if(typeof console<"u")console.warn(Y);try{throw Error(Y)}catch(J){}}}function Cr(){return Math.random().toString(36).substring(2,10)}function ly(Z,Y){return{usr:Z.state,key:Z.key,idx:Y}}function aK(Z,Y,J=null,z){return{pathname:typeof Z==="string"?Z:Z.pathname,search:"",hash:"",...typeof Y==="string"?I3(Y):Y,state:J,key:Y&&Y.key||z||Cr()}}function f6({pathname:Z="/",search:Y="",hash:J=""}){if(Y&&Y!=="?")Z+=Y.charAt(0)==="?"?Y:"?"+Y;if(J&&J!=="#")Z+=J.charAt(0)==="#"?J:"#"+J;return Z}function I3(Z){let Y={};if(Z){let J=Z.indexOf("#");if(J>=0)Y.hash=Z.substring(J),Z=Z.substring(0,J);let z=Z.indexOf("?");if(z>=0)Y.search=Z.substring(z),Z=Z.substring(0,z);if(Z)Y.pathname=Z}return Y}function br(Z,Y,J,z={}){let{window:q=document.defaultView,v5Compat:B=!1}=z,$=q.history,W="POP",U=null,M=N();if(M==null)M=0,$.replaceState({...$.state,idx:M},"");function N(){return($.state||{idx:null}).idx}function O(){W="POP";let T=N(),v=T==null?null:T-M;if(M=T,U)U({action:W,location:R.location,delta:v})}function _(T,v){W="PUSH";let L=aK(R.location,T,v);if(J)J(L,T);M=N()+1;let C=ly(L,M),D=R.createHref(L);try{$.pushState(C,"",D)}catch(I){if(I instanceof DOMException&&I.name==="DataCloneError")throw I;q.location.assign(D)}if(B&&U)U({action:W,location:R.location,delta:1})}function A(T,v){W="REPLACE";let L=aK(R.location,T,v);if(J)J(L,T);M=N();let C=ly(L,M),D=R.createHref(L);if($.replaceState(C,"",D),B&&U)U({action:W,location:R.location,delta:0})}function P(T){return FI(T)}let R={get action(){return W},get location(){return Z(q,$)},listen(T){if(U)throw Error("A history only accepts one active listener");return q.addEventListener(dy,O),U=T,()=>{q.removeEventListener(dy,O),U=null}},createHref(T){return Y(q,T)},createURL:P,encodeLocation(T){let v=P(T);return{pathname:v.pathname,search:v.search,hash:v.hash}},push:_,replace:A,go(T){return $.go(T)}};return R}function FI(Z,Y=!1){let J="http://localhost";if(typeof window<"u")J=window.location.origin!=="null"?window.location.origin:window.location.href;G1(J,"No window.location.(origin|href) available to create URL");let z=typeof Z==="string"?Z:f6(Z);if(z=z.replace(/ $/,"%20"),!Y&&z.startsWith("//"))z=J+z;return new URL(z,J)}var cK,aA=class{constructor(Z){if(Tr(this,cK,new Map),Z)for(let[Y,J]of Z)this.set(Y,J)}get(Z){if(uA(this,cK).has(Z))return uA(this,cK).get(Z);if(Z.defaultValue!==void 0)return Z.defaultValue;throw Error("No value found for context")}set(Z,Y){uA(this,cK).set(Z,Y)}};cK=new WeakMap;var Dr=new Set(["lazy","caseSensitive","path","id","index","children"]);function Er(Z){return Dr.has(Z)}var yr=new Set(["lazy","caseSensitive","path","id","index","middleware","children"]);function Ir(Z){return yr.has(Z)}function jr(Z){return Z.index===!0}function rK(Z,Y,J=[],z={},q=!1){return Z.map((B,$)=>{let W=[...J,String($)],U=typeof B.id==="string"?B.id:W.join("-");if(G1(B.index!==!0||!B.children,"Cannot specify children on an index route"),G1(q||!z[U],`Found a route id collision on id "${U}". Route id's must be globally unique within Data Router usages`),jr(B)){let M={...B,id:U};return z[U]=ay(M,Y(M)),M}else{let M={...B,id:U,children:void 0};if(z[U]=ay(M,Y(M)),B.children)M.children=rK(B.children,Y,W,z,q);return M}})}function ay(Z,Y){return Object.assign(Z,{...Y,...typeof Y.lazy==="object"&&Y.lazy!=null?{lazy:{...Z.lazy,...Y.lazy}}:{}})}function k8(Z,Y,J="/"){return dK(Z,Y,J,!1)}function dK(Z,Y,J,z){let q=typeof Y==="string"?I3(Y):Y,B=j4(q.pathname||"/",J);if(B==null)return null;let $=VI(Z);Sr($);let W=null;for(let U=0;W==null&&U<$.length;++U){let M=lr(B);W=cr($[U],M,z)}return W}function PI(Z,Y){let{route:J,pathname:z,params:q}=Z;return{id:J.id,pathname:z,params:q,data:Y[J.id],loaderData:Y[J.id],handle:J.handle}}function VI(Z,Y=[],J=[],z="",q=!1){let B=($,W,U=q,M)=>{let N={relativePath:M===void 0?$.path||"":M,caseSensitive:$.caseSensitive===!0,childrenIndex:W,route:$};if(N.relativePath.startsWith("/")){if(!N.relativePath.startsWith(z)&&U)return;G1(N.relativePath.startsWith(z),`Absolute route path "${N.relativePath}" nested under path "${z}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),N.relativePath=N.relativePath.slice(z.length)}let O=E3([z,N.relativePath]),_=J.concat(N);if($.children&&$.children.length>0)G1($.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${O}".`),VI($.children,Y,_,O,U);if($.path==null&&!$.index)return;Y.push({path:O,score:ur(O,$.index),routesMeta:_})};return Z.forEach(($,W)=>{if($.path===""||!$.path?.includes("?"))B($,W);else for(let U of RI($.path))B($,W,!0,U)}),Y}function RI(Z){let Y=Z.split("/");if(Y.length===0)return[];let[J,...z]=Y,q=J.endsWith("?"),B=J.replace(/\?$/,"");if(z.length===0)return q?[B,""]:[B];let $=RI(z.join("/")),W=[];if(W.push(...$.map((U)=>U===""?B:[B,U].join("/"))),q)W.push(...$);return W.map((U)=>Z.startsWith("/")&&U===""?"/":U)}function Sr(Z){Z.sort((Y,J)=>Y.score!==J.score?J.score-Y.score:pr(Y.routesMeta.map((z)=>z.childrenIndex),J.routesMeta.map((z)=>z.childrenIndex)))}var xr=/^:[\w-]+$/,kr=3,fr=2,gr=1,hr=10,mr=-2,ry=(Z)=>Z==="*";function ur(Z,Y){let J=Z.split("/"),z=J.length;if(J.some(ry))z+=mr;if(Y)z+=fr;return J.filter((q)=>!ry(q)).reduce((q,B)=>q+(xr.test(B)?kr:B===""?gr:hr),z)}function pr(Z,Y){return Z.length===Y.length&&Z.slice(0,-1).every((z,q)=>z===Y[q])?Z[Z.length-1]-Y[Y.length-1]:0}function cr(Z,Y,J=!1){let{routesMeta:z}=Z,q={},B="/",$=[];for(let W=0;W{if(N==="*"){let P=W[_]||"";$=B.slice(0,B.length-P.length).replace(/(.)\/+$/,"$1")}let A=W[_];if(O&&!A)M[N]=void 0;else M[N]=(A||"").replace(/%2F/g,"/");return M},{}),pathname:B,pathnameBase:$,pattern:Z}}function dr(Z,Y=!1,J=!0){g5(Z==="*"||!Z.endsWith("*")||Z.endsWith("/*"),`Route path "${Z}" will be treated as if it were "${Z.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${Z.replace(/\*$/,"/*")}".`);let z=[],q="^"+Z.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,($,W,U)=>{return z.push({paramName:W,isOptional:U!=null}),U?"/?([^\\/]+)?":"/([^\\/]+)"}).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");if(Z.endsWith("*"))z.push({paramName:"*"}),q+=Z==="*"||Z==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$";else if(J)q+="\\/*$";else if(Z!==""&&Z!=="/")q+="(?:(?=\\/|$))";return[new RegExp(q,Y?void 0:"i"),z]}function lr(Z){try{return Z.split("/").map((Y)=>decodeURIComponent(Y).replace(/\//g,"%2F")).join("/")}catch(Y){return g5(!1,`The URL path "${Z}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${Y}).`),Z}}function j4(Z,Y){if(Y==="/")return Z;if(!Z.toLowerCase().startsWith(Y.toLowerCase()))return null;let J=Y.endsWith("/")?Y.length-1:Y.length,z=Z.charAt(J);if(z&&z!=="/")return null;return Z.slice(J)||"/"}function ar({basename:Z,pathname:Y}){return Y==="/"?Z:E3([Z,Y])}var vI=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,WU=(Z)=>vI.test(Z);function LI(Z,Y="/"){let{pathname:J,search:z="",hash:q=""}=typeof Z==="string"?I3(Z):Z,B;if(J)if(WU(J))B=J;else{if(J.includes("//")){let $=J;J=J.replace(/\/\/+/g,"/"),g5(!1,`Pathnames cannot have embedded double slashes - normalizing ${$} -> ${J}`)}if(J.startsWith("/"))B=sy(J.substring(1),"/");else B=sy(J,Y)}else B=Y;return{pathname:B,search:sr(z),hash:or(q)}}function sy(Z,Y){let J=Y.replace(/\/+$/,"").split("/");return Z.split("/").forEach((q)=>{if(q===".."){if(J.length>1)J.pop()}else if(q!==".")J.push(q)}),J.length>1?J.join("/"):"/"}function pA(Z,Y,J,z){return`Cannot include a '${Z}' character in a manually specified \`to.${Y}\` field [${JSON.stringify(z)}]. Please separate it out to the \`to.${J}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function TI(Z){return Z.filter((Y,J)=>J===0||Y.route.path&&Y.route.path.length>0)}function GU(Z){let Y=TI(Z);return Y.map((J,z)=>z===Y.length-1?J.pathname:J.pathnameBase)}function UU(Z,Y,J,z=!1){let q;if(typeof Z==="string")q=I3(Z);else q={...Z},G1(!q.pathname||!q.pathname.includes("?"),pA("?","pathname","search",q)),G1(!q.pathname||!q.pathname.includes("#"),pA("#","pathname","hash",q)),G1(!q.search||!q.search.includes("#"),pA("#","search","hash",q));let B=Z===""||q.pathname==="",$=B?"/":q.pathname,W;if($==null)W=J;else{let O=Y.length-1;if(!z&&$.startsWith("..")){let _=$.split("/");while(_[0]==="..")_.shift(),O-=1;q.pathname=_.join("/")}W=O>=0?Y[O]:"/"}let U=LI(q,W),M=$&&$!=="/"&&$.endsWith("/"),N=(B||$===".")&&J.endsWith("/");if(!U.pathname.endsWith("/")&&(M||N))U.pathname+="/";return U}var E3=(Z)=>Z.join("/").replace(/\/\/+/g,"/"),rr=(Z)=>Z.replace(/\/+$/,"").replace(/^\/*/,"/"),sr=(Z)=>!Z||Z==="?"?"":Z.startsWith("?")?Z:"?"+Z,or=(Z)=>!Z||Z==="#"?"":Z.startsWith("#")?Z:"#"+Z;var MU=(Z,Y=302)=>{let J=Y;if(typeof J==="number")J={status:J};else if(typeof J.status>"u")J.status=302;let z=new Headers(J.headers);return z.set("Location",Z),new Response(null,{...J,headers:z})};var eJ=class{constructor(Z,Y,J,z=!1){if(this.status=Z,this.statusText=Y||"",this.internal=z,J instanceof Error)this.data=J.toString(),this.error=J;else this.data=J}};function y3(Z){return Z!=null&&typeof Z.status==="number"&&typeof Z.statusText==="string"&&typeof Z.internal==="boolean"&&"data"in Z}function oK(Z){return Z.map((Y)=>Y.route.path).filter(Boolean).join("/").replace(/\/\/*/g,"/")||"/"}var CI=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function bI(Z,Y){let J=Z;if(typeof J!=="string"||!vI.test(J))return{absoluteURL:void 0,isExternal:!1,to:J};let z=J,q=!1;if(CI)try{let B=new URL(window.location.href),$=J.startsWith("//")?new URL(B.protocol+J):new URL(J),W=j4($.pathname,Y);if($.origin===B.origin&&W!=null)J=W+$.search+$.hash;else q=!0}catch(B){g5(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:z,isExternal:q,to:J}}var zZ=Symbol("Uninstrumented");function ir(Z,Y){let J={lazy:[],"lazy.loader":[],"lazy.action":[],"lazy.middleware":[],middleware:[],loader:[],action:[]};Z.forEach((q)=>q({id:Y.id,index:Y.index,path:Y.path,instrument(B){let $=Object.keys(J);for(let W of $)if(B[W])J[W].push(B[W])}}));let z={};if(typeof Y.lazy==="function"&&J.lazy.length>0){let q=iJ(J.lazy,Y.lazy,()=>{return});if(q)z.lazy=q}if(typeof Y.lazy==="object"){let q=Y.lazy;["middleware","loader","action"].forEach((B)=>{let $=q[B],W=J[`lazy.${B}`];if(typeof $==="function"&&W.length>0){let U=iJ(W,$,()=>{return});if(U)z.lazy=Object.assign(z.lazy||{},{[B]:U})}})}if(["loader","action"].forEach((q)=>{let B=Y[q];if(typeof B==="function"&&J[q].length>0){let $=B[zZ]??B,W=iJ(J[q],$,(...U)=>oy(U[0]));if(W){if(q==="loader"&&$.hydrate===!0)W.hydrate=!0;W[zZ]=$,z[q]=W}}}),Y.middleware&&Y.middleware.length>0&&J.middleware.length>0)z.middleware=Y.middleware.map((q)=>{let B=q[zZ]??q,$=iJ(J.middleware,B,(...W)=>oy(W[0]));if($)return $[zZ]=B,$;return q});return z}function tr(Z,Y){let J={navigate:[],fetch:[]};if(Y.forEach((z)=>z({instrument(q){let B=Object.keys(q);for(let $ of B)if(q[$])J[$].push(q[$])}})),J.navigate.length>0){let z=Z.navigate[zZ]??Z.navigate,q=iJ(J.navigate,z,(...B)=>{let[$,W]=B;return{to:typeof $==="number"||typeof $==="string"?$:$?f6($):".",...iy(Z,W??{})}});if(q)q[zZ]=z,Z.navigate=q}if(J.fetch.length>0){let z=Z.fetch[zZ]??Z.fetch,q=iJ(J.fetch,z,(...B)=>{let[$,,W,U]=B;return{href:W??".",fetcherKey:$,...iy(Z,U??{})}});if(q)q[zZ]=z,Z.fetch=q}return Z}function iJ(Z,Y,J){if(Z.length===0)return null;return async(...z)=>{let q=await DI(Z,J(...z),()=>Y(...z),Z.length-1);if(q.type==="error")throw q.value;return q.value}}async function DI(Z,Y,J,z){let q=Z[z],B;if(!q)try{B={type:"success",value:await J()}}catch($){B={type:"error",value:$}}else{let $=void 0,W=async()=>{if($)console.error("You cannot call instrumented handlers more than once");else $=DI(Z,Y,J,z-1);if(B=await $,G1(B,"Expected a result"),B.type==="error"&&B.value instanceof Error)return{status:"error",error:B.value};return{status:"success",error:void 0}};try{await q(W,Y)}catch(U){console.error("An instrumentation function threw an error:",U)}if(!$)await W();await $}if(B)return B;return{type:"error",value:Error("No result assigned in instrumentation chain.")}}function oy(Z){let{request:Y,context:J,params:z,unstable_pattern:q}=Z;return{request:nr(Y),params:{...z},unstable_pattern:q,context:er(J)}}function iy(Z,Y){return{currentUrl:f6(Z.state.location),..."formMethod"in Y?{formMethod:Y.formMethod}:{},..."formEncType"in Y?{formEncType:Y.formEncType}:{},..."formData"in Y?{formData:Y.formData}:{},..."body"in Y?{body:Y.body}:{}}}function nr(Z){return{method:Z.method,url:Z.url,headers:{get:(...Y)=>Z.headers.get(...Y)}}}function er(Z){if(Ys(Z)){let Y={...Z};return Object.freeze(Y),Y}else return{get:(Y)=>Z.get(Y)}}var Zs=Object.getOwnPropertyNames(Object.prototype).sort().join("\x00");function Ys(Z){if(Z===null||typeof Z!=="object")return!1;let Y=Object.getPrototypeOf(Z);return Y===Object.prototype||Y===null||Object.getOwnPropertyNames(Y).sort().join("\x00")===Zs}var EI=["POST","PUT","PATCH","DELETE"],Qs=new Set(EI),Js=["GET",...EI],Xs=new Set(Js),yI=new Set([301,302,303,307,308]),zs=new Set([307,308]),qU={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},eA={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},sJ={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},qs=(Z)=>({hasErrorBoundary:Boolean(Z.hasErrorBoundary)}),II="remix-router-transitions",jI=Symbol("ResetLoaderData");function SI(Z){let Y=Z.window?Z.window:typeof window<"u"?window:void 0,J=typeof Y<"u"&&typeof Y.document<"u"&&typeof Y.document.createElement<"u";G1(Z.routes.length>0,"You must provide a non-empty routes array to createRouter");let z=Z.hydrationRouteProperties||[],q=Z.mapRouteProperties||qs,B=q;if(Z.unstable_instrumentations){let m=Z.unstable_instrumentations;B=(t)=>{return{...q(t),...ir(m.map((B0)=>B0.route).filter(Boolean),t)}}}let $={},W=rK(Z.routes,B,void 0,$),U,M=Z.basename||"/";if(!M.startsWith("/"))M=`/${M}`;let N=Z.dataStrategy||Gs,O={...Z.future},_=null,A=new Set,P=null,R=null,T=null,v=Z.hydrationData!=null,L=k8(W,Z.history.location,M),C=!1,D=null,I;if(L==null&&!Z.patchRoutesOnNavigation){let m=z6(404,{pathname:Z.history.location.pathname}),{matches:t,route:B0}=QU(W);I=!0,L=t,D={[B0.id]:m}}else{if(L&&!Z.hydrationData){if(_5(L,W,Z.history.location.pathname).active)L=null}if(!L){I=!1,L=[];let m=_5(null,W,Z.history.location.pathname);if(m.active&&m.matches)C=!0,L=m.matches}else if(L.some((m)=>m.route.lazy))I=!1;else if(!L.some((m)=>ZF(m.route)))I=!0;else{let m=Z.hydrationData?Z.hydrationData.loaderData:null,t=Z.hydrationData?Z.hydrationData.errors:null;if(t){let B0=L.findIndex((_0)=>t[_0.route.id]!==void 0);I=L.slice(0,B0+1).every((_0)=>!sA(_0.route,m,t))}else I=L.every((B0)=>!sA(B0.route,m,t))}}let S,y={historyAction:Z.history.action,location:Z.history.location,matches:L,initialized:I,navigation:qU,restoreScrollPosition:Z.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:Z.hydrationData&&Z.hydrationData.loaderData||{},actionData:Z.hydrationData&&Z.hydrationData.actionData||null,errors:Z.hydrationData&&Z.hydrationData.errors||D,fetchers:new Map,blockers:new Map},h="POP",i=null,x=!1,s,z0=!1,$0=new Map,e=null,c=!1,Z0=!1,W0=new Set,n=new Map,X0=0,f=-1,q0=new Map,H0=new Set,M0=new Map,y0=new Map,i0=new Set,w0=new Map,l0=void 0,t0=null;function v1(){if(_=Z.history.listen(({action:m,location:t,delta:B0})=>{if(l0){l0(),l0=void 0;return}g5(w0.size===0||B0!=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 _0=Y1({currentLocation:y.location,nextLocation:t,historyAction:m});if(_0&&B0!=null){let P0=new Promise((f0)=>{l0=f0});Z.history.go(B0*-1),x0(_0,{state:"blocked",location:t,proceed(){x0(_0,{state:"proceeding",proceed:void 0,reset:void 0,location:t}),P0.then(()=>Z.history.go(B0))},reset(){let f0=new Map(y.blockers);f0.set(_0,sJ),C1({blockers:f0})}}),i?.resolve(),i=null;return}return N1(m,t)}),J){Ds(Y,$0);let m=()=>Es(Y,$0);Y.addEventListener("pagehide",m),e=()=>Y.removeEventListener("pagehide",m)}if(!y.initialized)N1("POP",y.location,{initialHydration:!0});return S}function B1(){if(_)_();if(e)e();A.clear(),s&&s.abort(),y.fetchers.forEach((m,t)=>Z4(t)),y.blockers.forEach((m,t)=>v0(t))}function R0(m){return A.add(m),()=>A.delete(m)}function C1(m,t={}){if(m.matches)m.matches=m.matches.map((P0)=>{let f0=$[P0.route.id],j0=P0.route;if(j0.element!==f0.element||j0.errorElement!==f0.errorElement||j0.hydrateFallbackElement!==f0.hydrateFallbackElement)return{...P0,route:f0};return P0});y={...y,...m};let B0=[],_0=[];y.fetchers.forEach((P0,f0)=>{if(P0.state==="idle")if(i0.has(f0))B0.push(f0);else _0.push(f0)}),i0.forEach((P0)=>{if(!y.fetchers.has(P0)&&!n.has(P0))B0.push(P0)}),[...A].forEach((P0)=>P0(y,{deletedFetchers:B0,newErrors:m.errors??null,viewTransitionOpts:t.viewTransitionOpts,flushSync:t.flushSync===!0})),B0.forEach((P0)=>Z4(P0)),_0.forEach((P0)=>y.fetchers.delete(P0))}function J5(m,t,{flushSync:B0}={}){let _0=y.actionData!=null&&y.navigation.formMethod!=null&&P7(y.navigation.formMethod)&&y.navigation.state==="loading"&&m.state?._isRedirect!==!0,P0;if(t.actionData)if(Object.keys(t.actionData).length>0)P0=t.actionData;else P0=null;else if(_0)P0=y.actionData;else P0=null;let f0=t.loaderData?qI(y.loaderData,t.loaderData,t.matches||[],t.errors):y.loaderData,j0=y.blockers;if(j0.size>0)j0=new Map(j0),j0.forEach((Q1,d0)=>j0.set(d0,sJ));let S0=c?!1:K5(m,t.matches||y.matches),c0=x===!0||y.navigation.formMethod!=null&&P7(y.navigation.formMethod)&&m.state?._isRedirect!==!0;if(U)W=U,U=void 0;if(c);else if(h==="POP");else if(h==="PUSH")Z.history.push(m,m.state);else if(h==="REPLACE")Z.history.replace(m,m.state);let a0;if(h==="POP"){let Q1=$0.get(y.location.pathname);if(Q1&&Q1.has(m.pathname))a0={currentLocation:y.location,nextLocation:m};else if($0.has(m.pathname))a0={currentLocation:m,nextLocation:y.location}}else if(z0){let Q1=$0.get(y.location.pathname);if(Q1)Q1.add(m.pathname);else Q1=new Set([m.pathname]),$0.set(y.location.pathname,Q1);a0={currentLocation:y.location,nextLocation:m}}C1({...t,actionData:P0,loaderData:f0,historyAction:h,location:m,initialized:!0,navigation:qU,revalidation:"idle",restoreScrollPosition:S0,preventScrollReset:c0,blockers:j0},{viewTransitionOpts:a0,flushSync:B0===!0}),h="POP",x=!1,z0=!1,c=!1,Z0=!1,i?.resolve(),i=null,t0?.resolve(),t0=null}async function n5(m,t){if(i?.resolve(),i=null,typeof m==="number"){if(!i)i=WI();let c1=i.promise;return Z.history.go(m),c1}let B0=rA(y.location,y.matches,M,m,t?.fromRouteId,t?.relative),{path:_0,submission:P0,error:f0}=ty(!1,B0,t),j0=y.location,S0=aK(y.location,_0,t&&t.state);S0={...S0,...Z.history.encodeLocation(S0)};let c0=t&&t.replace!=null?t.replace:void 0,a0="PUSH";if(c0===!0)a0="REPLACE";else if(c0===!1);else if(P0!=null&&P7(P0.formMethod)&&P0.formAction===y.location.pathname+y.location.search)a0="REPLACE";let Q1=t&&"preventScrollReset"in t?t.preventScrollReset===!0:void 0,d0=(t&&t.flushSync)===!0,p1=Y1({currentLocation:j0,nextLocation:S0,historyAction:a0});if(p1){x0(p1,{state:"blocked",location:S0,proceed(){x0(p1,{state:"proceeding",proceed:void 0,reset:void 0,location:S0}),n5(m,t)},reset(){let c1=new Map(y.blockers);c1.set(p1,sJ),C1({blockers:c1})}});return}await N1(a0,S0,{submission:P0,pendingError:f0,preventScrollReset:Q1,replace:t&&t.replace,enableViewTransition:t&&t.viewTransition,flushSync:d0,callSiteDefaultShouldRevalidate:t&&t.unstable_defaultShouldRevalidate})}function H5(){if(!t0)t0=WI();Z7(),C1({revalidation:"loading"});let m=t0.promise;if(y.navigation.state==="submitting")return m;if(y.navigation.state==="idle")return N1(y.historyAction,y.location,{startUninterruptedRevalidation:!0}),m;return N1(h||y.historyAction,y.navigation.location,{overrideNavigation:y.navigation,enableViewTransition:z0===!0}),m}async function N1(m,t,B0){s&&s.abort(),s=null,h=m,c=(B0&&B0.startUninterruptedRevalidation)===!0,O5(y.location,y.matches),x=(B0&&B0.preventScrollReset)===!0,z0=(B0&&B0.enableViewTransition)===!0;let _0=U||W,P0=B0&&B0.overrideNavigation,f0=B0?.initialHydration&&y.matches&&y.matches.length>0&&!C?y.matches:k8(_0,t,M),j0=(B0&&B0.flushSync)===!0;if(f0&&y.initialized&&!Z0&&As(y.location,t)&&!(B0&&B0.submission&&P7(B0.submission.formMethod))){J5(t,{matches:f0},{flushSync:j0});return}let S0=_5(f0,_0,t.pathname);if(S0.active&&S0.matches)f0=S0.matches;if(!f0){let{error:Z2,notFoundMatches:g2,route:t1}=k0(t.pathname);J5(t,{matches:g2,loaderData:{},errors:{[t1.id]:Z2}},{flushSync:j0});return}s=new AbortController;let c0=oJ(Z.history,t,s.signal,B0&&B0.submission),a0=Z.getContext?await Z.getContext():new aA,Q1;if(B0&&B0.pendingError)Q1=[XZ(f0).route.id,{type:"error",error:B0.pendingError}];else if(B0&&B0.submission&&P7(B0.submission.formMethod)){let Z2=await t6(c0,t,B0.submission,f0,a0,S0.active,B0&&B0.initialHydration===!0,{replace:B0.replace,flushSync:j0});if(Z2.shortCircuited)return;if(Z2.pendingActionResult){let[g2,t1]=Z2.pendingActionResult;if(I4(t1)&&y3(t1.error)&&t1.error.status===404){s=null,J5(t,{matches:Z2.matches,loaderData:{},errors:{[g2]:t1.error}});return}}f0=Z2.matches||f0,Q1=Z2.pendingActionResult,P0=cA(t,B0.submission),j0=!1,S0.active=!1,c0=oJ(Z.history,c0.url,c0.signal)}let{shortCircuited:d0,matches:p1,loaderData:c1,errors:x5}=await $1(c0,t,f0,a0,S0.active,P0,B0&&B0.submission,B0&&B0.fetcherSubmission,B0&&B0.replace,B0&&B0.initialHydration===!0,j0,Q1,B0&&B0.callSiteDefaultShouldRevalidate);if(d0)return;s=null,J5(t,{matches:p1||f0,...KI(Q1),loaderData:c1,errors:x5})}async function t6(m,t,B0,_0,P0,f0,j0,S0={}){Z7();let c0=Cs(t,B0);if(C1({navigation:c0},{flushSync:S0.flushSync===!0}),f0){let d0=await e5(_0,t.pathname,m.signal);if(d0.type==="aborted")return{shortCircuited:!0};else if(d0.type==="error"){if(d0.partialMatches.length===0){let{matches:c1,route:x5}=QU(W);return{matches:c1,pendingActionResult:[x5.id,{type:"error",error:d0.error}]}}let p1=XZ(d0.partialMatches).route.id;return{matches:d0.partialMatches,pendingActionResult:[p1,{type:"error",error:d0.error}]}}else if(!d0.matches){let{notFoundMatches:p1,error:c1,route:x5}=k0(t.pathname);return{matches:p1,pendingActionResult:[x5.id,{type:"error",error:c1}]}}else _0=d0.matches}let a0,Q1=KU(_0,t);if(!Q1.route.action&&!Q1.route.lazy)a0={type:"error",error:z6(405,{method:m.method,pathname:t.pathname,routeId:Q1.route.id})};else{let d0=tJ(B,$,m,_0,Q1,j0?[]:z,P0),p1=await V6(m,d0,P0,null);if(a0=p1[Q1.route.id],!a0){for(let c1 of _0)if(p1[c1.route.id]){a0=p1[c1.route.id];break}}if(m.signal.aborted)return{shortCircuited:!0}}if(jY(a0)){let d0;if(S0&&S0.replace!=null)d0=S0.replace;else d0=JI(a0.response.headers.get("Location"),new URL(m.url),M,Z.history)===y.location.pathname+y.location.search;return await k2(m,a0,!0,{submission:B0,replace:d0}),{shortCircuited:!0}}if(I4(a0)){let d0=XZ(_0,Q1.route.id);if((S0&&S0.replace)!==!0)h="PUSH";return{matches:_0,pendingActionResult:[d0.route.id,a0,Q1.route.id]}}return{matches:_0,pendingActionResult:[Q1.route.id,a0]}}async function $1(m,t,B0,_0,P0,f0,j0,S0,c0,a0,Q1,d0,p1){let c1=f0||cA(t,j0),x5=j0||S0||$I(c1),Z2=!c&&!a0;if(P0){if(Z2){let G2=N4(d0);C1({navigation:c1,...G2!==void 0?{actionData:G2}:{}},{flushSync:Q1})}let b1=await e5(B0,t.pathname,m.signal);if(b1.type==="aborted")return{shortCircuited:!0};else if(b1.type==="error"){if(b1.partialMatches.length===0){let{matches:H9,route:$8}=QU(W);return{matches:H9,loaderData:{},errors:{[$8.id]:b1.error}}}let G2=XZ(b1.partialMatches).route.id;return{matches:b1.partialMatches,loaderData:{},errors:{[G2]:b1.error}}}else if(!b1.matches){let{error:G2,notFoundMatches:H9,route:$8}=k0(t.pathname);return{matches:H9,loaderData:{},errors:{[$8.id]:G2}}}else B0=b1.matches}let g2=U||W,{dsMatches:t1,revalidatingFetchers:j7}=ny(m,_0,B,$,Z.history,y,B0,x5,t,a0?[]:z,a0===!0,Z0,W0,i0,M0,H0,g2,M,Z.patchRoutesOnNavigation!=null,d0,p1);if(f=++X0,!Z.dataStrategy&&!t1.some((b1)=>b1.shouldLoad)&&!t1.some((b1)=>b1.route.middleware&&b1.route.middleware.length>0)&&j7.length===0){let b1=j();return J5(t,{matches:B0,loaderData:{},errors:d0&&I4(d0[1])?{[d0[0]]:d0[1].error}:null,...KI(d0),...b1?{fetchers:new Map(y.fetchers)}:{}},{flushSync:Q1}),{shortCircuited:!0}}if(Z2){let b1={};if(!P0){b1.navigation=c1;let G2=N4(d0);if(G2!==void 0)b1.actionData=G2}if(j7.length>0)b1.fetchers=S1(j7);C1(b1,{flushSync:Q1})}j7.forEach((b1)=>{if(Y7(b1.key),b1.controller)n.set(b1.key,b1.controller)});let n6=()=>j7.forEach((b1)=>Y7(b1.key));if(s)s.signal.addEventListener("abort",n6);let{loaderResults:v2,fetcherResults:S7}=await R6(t1,j7,m,_0);if(m.signal.aborted)return{shortCircuited:!0};if(s)s.signal.removeEventListener("abort",n6);j7.forEach((b1)=>n.delete(b1.key));let h2=JU(v2);if(h2)return await k2(m,h2.result,!0,{replace:c0}),{shortCircuited:!0};if(h2=JU(S7),h2)return H0.add(h2.key),await k2(m,h2.result,!0,{replace:c0}),{shortCircuited:!0};let{loaderData:rQ,errors:L6}=zI(y,B0,v2,d0,j7,S7);if(a0&&y.errors)L6={...y.errors,...L6};let l4=j(),N9=Y0(f),e6=l4||N9||j7.length>0;return{matches:B0,loaderData:rQ,errors:L6,...e6?{fetchers:new Map(y.fetchers)}:{}}}function N4(m){if(m&&!I4(m[1]))return{[m[0]]:m[1].data};else if(y.actionData)if(Object.keys(y.actionData).length===0)return null;else return y.actionData}function S1(m){return m.forEach((t)=>{let B0=y.fetchers.get(t.key),_0=uK(void 0,B0?B0.data:void 0);y.fetchers.set(t.key,_0)}),new Map(y.fetchers)}async function P6(m,t,B0,_0){Y7(m);let P0=(_0&&_0.flushSync)===!0,f0=U||W,j0=rA(y.location,y.matches,M,B0,t,_0?.relative),S0=k8(f0,j0,M),c0=_5(S0,f0,j0);if(c0.active&&c0.matches)S0=c0.matches;if(!S0){W2(m,t,z6(404,{pathname:j0}),{flushSync:P0});return}let{path:a0,submission:Q1,error:d0}=ty(!0,j0,_0);if(d0){W2(m,t,d0,{flushSync:P0});return}let p1=Z.getContext?await Z.getContext():new aA,c1=(_0&&_0.preventScrollReset)===!0;if(Q1&&P7(Q1.formMethod)){await e2(m,t,a0,S0,p1,c0.active,P0,c1,Q1,_0&&_0.unstable_defaultShouldRevalidate);return}M0.set(m,{routeId:t,path:a0}),await c4(m,t,a0,S0,p1,c0.active,P0,c1,Q1)}async function e2(m,t,B0,_0,P0,f0,j0,S0,c0,a0){Z7(),M0.delete(m);let Q1=y.fetchers.get(m);T5(m,bs(c0,Q1),{flushSync:j0});let d0=new AbortController,p1=oJ(Z.history,B0,d0.signal,c0);if(f0){let C5=await e5(_0,new URL(p1.url).pathname,p1.signal,m);if(C5.type==="aborted")return;else if(C5.type==="error"){W2(m,t,C5.error,{flushSync:j0});return}else if(!C5.matches){W2(m,t,z6(404,{pathname:B0}),{flushSync:j0});return}else _0=C5.matches}let c1=KU(_0,B0);if(!c1.route.action&&!c1.route.lazy){let C5=z6(405,{method:c0.formMethod,pathname:B0,routeId:t});W2(m,t,C5,{flushSync:j0});return}n.set(m,d0);let x5=X0,Z2=tJ(B,$,p1,_0,c1,z,P0),g2=await V6(p1,Z2,P0,m),t1=g2[c1.route.id];if(!t1){for(let C5 of Z2)if(g2[C5.route.id]){t1=g2[C5.route.id];break}}if(p1.signal.aborted){if(n.get(m)===d0)n.delete(m);return}if(i0.has(m)){if(jY(t1)||I4(t1)){T5(m,x8(void 0));return}}else{if(jY(t1))if(n.delete(m),f>x5){T5(m,x8(void 0));return}else return H0.add(m),T5(m,uK(c0)),k2(p1,t1,!1,{fetcherSubmission:c0,preventScrollReset:S0});if(I4(t1)){W2(m,t,t1.error);return}}let j7=y.navigation.location||y.location,n6=oJ(Z.history,j7,d0.signal),v2=U||W,S7=y.navigation.state!=="idle"?k8(v2,y.navigation.location,M):y.matches;G1(S7,"Didn't find any matches after fetcher action");let h2=++X0;q0.set(m,h2);let rQ=uK(c0,t1.data);y.fetchers.set(m,rQ);let{dsMatches:L6,revalidatingFetchers:l4}=ny(n6,P0,B,$,Z.history,y,S7,c0,j7,z,!1,Z0,W0,i0,M0,H0,v2,M,Z.patchRoutesOnNavigation!=null,[c1.route.id,t1],a0);l4.filter((C5)=>C5.key!==m).forEach((C5)=>{let O9=C5.key,sQ=y.fetchers.get(O9),d$=uK(void 0,sQ?sQ.data:void 0);if(y.fetchers.set(O9,d$),Y7(O9),C5.controller)n.set(O9,C5.controller)}),C1({fetchers:new Map(y.fetchers)});let N9=()=>l4.forEach((C5)=>Y7(C5.key));d0.signal.addEventListener("abort",N9);let{loaderResults:e6,fetcherResults:b1}=await R6(L6,l4,n6,P0);if(d0.signal.aborted)return;if(d0.signal.removeEventListener("abort",N9),q0.delete(m),n.delete(m),l4.forEach((C5)=>n.delete(C5.key)),y.fetchers.has(m)){let C5=x8(t1.data);y.fetchers.set(m,C5)}let G2=JU(e6);if(G2)return k2(n6,G2.result,!1,{preventScrollReset:S0});if(G2=JU(b1),G2)return H0.add(G2.key),k2(n6,G2.result,!1,{preventScrollReset:S0});let{loaderData:H9,errors:$8}=zI(y,S7,e6,void 0,l4,b1);if(Y0(h2),y.navigation.state==="loading"&&h2>f)G1(h,"Expected pending action"),s&&s.abort(),J5(y.navigation.location,{matches:S7,loaderData:H9,errors:$8,fetchers:new Map(y.fetchers)});else C1({errors:$8,loaderData:qI(y.loaderData,H9,S7,$8),fetchers:new Map(y.fetchers)}),Z0=!1}async function c4(m,t,B0,_0,P0,f0,j0,S0,c0){let a0=y.fetchers.get(m);T5(m,uK(c0,a0?a0.data:void 0),{flushSync:j0});let Q1=new AbortController,d0=oJ(Z.history,B0,Q1.signal);if(f0){let t1=await e5(_0,new URL(d0.url).pathname,d0.signal,m);if(t1.type==="aborted")return;else if(t1.type==="error"){W2(m,t,t1.error,{flushSync:j0});return}else if(!t1.matches){W2(m,t,z6(404,{pathname:B0}),{flushSync:j0});return}else _0=t1.matches}let p1=KU(_0,B0);n.set(m,Q1);let c1=X0,x5=tJ(B,$,d0,_0,p1,z,P0),g2=(await V6(d0,x5,P0,m))[p1.route.id];if(n.get(m)===Q1)n.delete(m);if(d0.signal.aborted)return;if(i0.has(m)){T5(m,x8(void 0));return}if(jY(g2))if(f>c1){T5(m,x8(void 0));return}else{H0.add(m),await k2(d0,g2,!1,{preventScrollReset:S0});return}if(I4(g2)){W2(m,t,g2.error);return}T5(m,x8(g2.data))}async function k2(m,t,B0,{submission:_0,fetcherSubmission:P0,preventScrollReset:f0,replace:j0}={}){if(!B0)i?.resolve(),i=null;if(t.response.headers.has("X-Remix-Revalidate"))Z0=!0;let S0=t.response.headers.get("Location");G1(S0,"Expected a Location header on the redirect Response"),S0=JI(S0,new URL(m.url),M,Z.history);let c0=aK(y.location,S0,{_isRedirect:!0});if(J){let x5=!1;if(t.response.headers.has("X-Remix-Reload-Document"))x5=!0;else if(WU(S0)){let Z2=FI(S0,!0);x5=Z2.origin!==Y.location.origin||j4(Z2.pathname,M)==null}if(x5){if(j0)Y.location.replace(S0);else Y.location.assign(S0);return}}s=null;let a0=j0===!0||t.response.headers.has("X-Remix-Replace")?"REPLACE":"PUSH",{formMethod:Q1,formAction:d0,formEncType:p1}=y.navigation;if(!_0&&!P0&&Q1&&d0&&p1)_0=$I(y.navigation);let c1=_0||P0;if(zs.has(t.response.status)&&c1&&P7(c1.formMethod))await N1(a0,c0,{submission:{...c1,formAction:S0},preventScrollReset:f0||x,enableViewTransition:B0?z0:void 0});else{let x5=cA(c0,_0);await N1(a0,c0,{overrideNavigation:x5,fetcherSubmission:P0,preventScrollReset:f0||x,enableViewTransition:B0?z0:void 0})}}async function V6(m,t,B0,_0){let P0,f0={};try{P0=await Ms(N,m,t,_0,B0,!1)}catch(j0){return t.filter((S0)=>S0.shouldLoad).forEach((S0)=>{f0[S0.route.id]={type:"error",error:j0}}),f0}if(m.signal.aborted)return f0;if(!P7(m.method))for(let j0 of t){if(P0[j0.route.id]?.type==="error")break;if(!P0.hasOwnProperty(j0.route.id)&&!y.loaderData.hasOwnProperty(j0.route.id)&&(!y.errors||!y.errors.hasOwnProperty(j0.route.id))&&j0.shouldCallHandler())P0[j0.route.id]={type:"error",result:Error(`No result returned from dataStrategy for route ${j0.route.id}`)}}for(let[j0,S0]of Object.entries(P0))if(Rs(S0)){let c0=S0.result;f0[j0]={type:"redirect",response:Os(c0,m,j0,t,M)}}else f0[j0]=await Hs(S0);return f0}async function R6(m,t,B0,_0){let P0=V6(B0,m,_0,null),f0=Promise.all(t.map(async(c0)=>{if(c0.matches&&c0.match&&c0.request&&c0.controller){let Q1=(await V6(c0.request,c0.matches,_0,c0.key))[c0.match.route.id];return{[c0.key]:Q1}}else return Promise.resolve({[c0.key]:{type:"error",error:z6(404,{pathname:c0.path})}})})),j0=await P0,S0=(await f0).reduce((c0,a0)=>Object.assign(c0,a0),{});return{loaderResults:j0,fetcherResults:S0}}function Z7(){Z0=!0,M0.forEach((m,t)=>{if(n.has(t))W0.add(t);Y7(t)})}function T5(m,t,B0={}){y.fetchers.set(m,t),C1({fetchers:new Map(y.fetchers)},{flushSync:(B0&&B0.flushSync)===!0})}function W2(m,t,B0,_0={}){let P0=XZ(y.matches,t);Z4(m),C1({errors:{[P0.route.id]:B0},fetchers:new Map(y.fetchers)},{flushSync:(_0&&_0.flushSync)===!0})}function H4(m){if(y0.set(m,(y0.get(m)||0)+1),i0.has(m))i0.delete(m);return y.fetchers.get(m)||eA}function f2(m,t){Y7(m,t?.reason),T5(m,x8(null))}function Z4(m){let t=y.fetchers.get(m);if(n.has(m)&&!(t&&t.state==="loading"&&q0.has(m)))Y7(m);M0.delete(m),q0.delete(m),H0.delete(m),i0.delete(m),W0.delete(m),y.fetchers.delete(m)}function v6(m){let t=(y0.get(m)||0)-1;if(t<=0)y0.delete(m),i0.add(m);else y0.set(m,t);C1({fetchers:new Map(y.fetchers)})}function Y7(m,t){let B0=n.get(m);if(B0)B0.abort(t),n.delete(m)}function y7(m){for(let t of m){let B0=H4(t),_0=x8(B0.data);y.fetchers.set(t,_0)}}function j(){let m=[],t=!1;for(let B0 of H0){let _0=y.fetchers.get(B0);if(G1(_0,`Expected fetcher: ${B0}`),_0.state==="loading")H0.delete(B0),m.push(B0),t=!0}return y7(m),t}function Y0(m){let t=[];for(let[B0,_0]of q0)if(_00}function A0(m,t){let B0=y.blockers.get(m)||sJ;if(w0.get(m)!==t)w0.set(m,t);return B0}function v0(m){y.blockers.delete(m),w0.delete(m)}function x0(m,t){let B0=y.blockers.get(m)||sJ;G1(B0.state==="unblocked"&&t.state==="blocked"||B0.state==="blocked"&&t.state==="blocked"||B0.state==="blocked"&&t.state==="proceeding"||B0.state==="blocked"&&t.state==="unblocked"||B0.state==="proceeding"&&t.state==="unblocked",`Invalid blocker state transition: ${B0.state} -> ${t.state}`);let _0=new Map(y.blockers);_0.set(m,t),C1({blockers:_0})}function Y1({currentLocation:m,nextLocation:t,historyAction:B0}){if(w0.size===0)return;if(w0.size>1)g5(!1,"A router only supports one blocker at a time");let _0=Array.from(w0.entries()),[P0,f0]=_0[_0.length-1],j0=y.blockers.get(P0);if(j0&&j0.state==="proceeding")return;if(f0({currentLocation:m,nextLocation:t,historyAction:B0}))return P0}function k0(m){let t=z6(404,{pathname:m}),B0=U||W,{matches:_0,route:P0}=QU(B0);return{notFoundMatches:_0,route:P0,error:t}}function J1(m,t,B0){if(P=m,T=t,R=B0||null,!v&&y.navigation===qU){v=!0;let _0=K5(y.location,y.matches);if(_0!=null)C1({restoreScrollPosition:_0})}return()=>{P=null,T=null,R=null}}function I0(m,t){if(R)return R(m,t.map((_0)=>PI(_0,y.loaderData)))||m.key;return m.key}function O5(m,t){if(P&&T){let B0=I0(m,t);P[B0]=T()}}function K5(m,t){if(P){let B0=I0(m,t),_0=P[B0];if(typeof _0==="number")return _0}return null}function _5(m,t,B0){if(Z.patchRoutesOnNavigation){if(!m)return{active:!0,matches:dK(t,B0,M,!0)||[]};else if(Object.keys(m[0].params).length>0)return{active:!0,matches:dK(t,B0,M,!0)}}return{active:!1,matches:null}}async function e5(m,t,B0,_0){if(!Z.patchRoutesOnNavigation)return{type:"success",matches:m};let P0=m;while(!0){let f0=U==null,j0=U||W,S0=$;try{await Z.patchRoutesOnNavigation({signal:B0,path:t,matches:P0,fetcherKey:_0,patch:(Q1,d0)=>{if(B0.aborted)return;ey(Q1,d0,j0,S0,B,!1)}})}catch(Q1){return{type:"error",error:Q1,partialMatches:P0}}finally{if(f0&&!B0.aborted)W=[...W]}if(B0.aborted)return{type:"aborted"};let c0=k8(j0,t,M),a0=null;if(c0){if(Object.keys(c0[0].params).length===0)return{type:"success",matches:c0};else if(a0=dK(j0,t,M,!0),!(a0&&P0.lengthB0.route.id===t[_0].route.id)}function S5(m){$={},U=rK(m,B,void 0,$)}function I7(m,t,B0=!1){let _0=U==null;if(ey(m,t,U||W,$,B,B0),_0)W=[...W],C1({})}if(S={get basename(){return M},get future(){return O},get state(){return y},get routes(){return W},get window(){return Y},initialize:v1,subscribe:R0,enableScrollRestoration:J1,navigate:n5,fetch:P6,revalidate:H5,createHref:(m)=>Z.history.createHref(m),encodeLocation:(m)=>Z.history.encodeLocation(m),getFetcher:H4,resetFetcher:f2,deleteFetcher:v6,dispose:B1,getBlocker:A0,deleteBlocker:v0,patchRoutes:I7,_internalFetchControllers:n,_internalSetRoutes:S5,_internalSetStateDoNotUseOrYouWillBreakYourApp(m){C1(m)}},Z.unstable_instrumentations)S=tr(S,Z.unstable_instrumentations.map((m)=>m.router).filter(Boolean));return S}function Ks(Z){return Z!=null&&(("formData"in Z)&&Z.formData!=null||("body"in Z)&&Z.body!==void 0)}function rA(Z,Y,J,z,q,B){let $,W;if(q){$=[];for(let M of Y)if($.push(M),M.route.id===q){W=M;break}}else $=Y,W=Y[Y.length-1];let U=UU(z?z:".",GU($),j4(Z.pathname,J)||Z.pathname,B==="path");if(z==null)U.search=Z.search,U.hash=Z.hash;if((z==null||z===""||z===".")&&W){let M=QF(U.search);if(W.route.index&&!M)U.search=U.search?U.search.replace(/^\?/,"?index&"):"?index";else if(!W.route.index&&M){let N=new URLSearchParams(U.search),O=N.getAll("index");N.delete("index"),O.filter((A)=>A).forEach((A)=>N.append("index",A));let _=N.toString();U.search=_?`?${_}`:""}}if(J!=="/")U.pathname=ar({basename:J,pathname:U.pathname});return f6(U)}function ty(Z,Y,J){if(!J||!Ks(J))return{path:Y};if(J.formMethod&&!Ts(J.formMethod))return{path:Y,error:z6(405,{method:J.formMethod})};let z=()=>({path:Y,error:z6(400,{type:"invalid-body"})}),B=(J.formMethod||"get").toUpperCase(),$=mI(Y);if(J.body!==void 0){if(J.formEncType==="text/plain"){if(!P7(B))return z();let O=typeof J.body==="string"?J.body:J.body instanceof FormData||J.body instanceof URLSearchParams?Array.from(J.body.entries()).reduce((_,[A,P])=>`${_}${A}=${P} `,""):String(J.body);return{path:Y,submission:{formMethod:B,formAction:$,formEncType:J.formEncType,formData:void 0,json:void 0,text:O}}}else if(J.formEncType==="application/json"){if(!P7(B))return z();try{let O=typeof J.body==="string"?JSON.parse(J.body):J.body;return{path:Y,submission:{formMethod:B,formAction:$,formEncType:J.formEncType,formData:void 0,json:O,text:void 0}}}catch(O){return z()}}}G1(typeof FormData==="function","FormData is not available in this environment");let W,U;if(J.formData)W=iA(J.formData),U=J.formData;else if(J.body instanceof FormData)W=iA(J.body),U=J.body;else if(J.body instanceof URLSearchParams)W=J.body,U=XI(W);else if(J.body==null)W=new URLSearchParams,U=new FormData;else try{W=new URLSearchParams(J.body),U=XI(W)}catch(O){return z()}let M={formMethod:B,formAction:$,formEncType:J&&J.formEncType||"application/x-www-form-urlencoded",formData:U,json:void 0,text:void 0};if(P7(M.formMethod))return{path:Y,submission:M};let N=I3(Y);if(Z&&N.search&&QF(N.search))W.append("index","");return N.search=`?${W}`,{path:f6(N),submission:M}}function ny(Z,Y,J,z,q,B,$,W,U,M,N,O,_,A,P,R,T,v,L,C,D){let I=C?I4(C[1])?C[1].error:C[1].data:void 0,S=q.createURL(B.location),y=q.createURL(U),h;if(N&&B.errors){let c=Object.keys(B.errors)[0];h=$.findIndex((Z0)=>Z0.route.id===c)}else if(C&&I4(C[1])){let c=C[0];h=$.findIndex((Z0)=>Z0.route.id===c)-1}let i=C?C[1].statusCode:void 0,x=i&&i>=400,s={currentUrl:S,currentParams:B.matches[0]?.params||{},nextUrl:y,nextParams:$[0].params,...W,actionResult:I,actionStatus:i},z0=oK($),$0=$.map((c,Z0)=>{let{route:W0}=c,n=null;if(h!=null&&Z0>h)n=!1;else if(W0.lazy)n=!0;else if(!ZF(W0))n=!1;else if(N)n=sA(W0,B.loaderData,B.errors);else if(Bs(B.loaderData,B.matches[Z0],c))n=!0;if(n!==null)return oA(J,z,Z,z0,c,M,Y,n);let X0=!1;if(typeof D==="boolean")X0=D;else if(x)X0=!1;else if(O)X0=!0;else if(S.pathname+S.search===y.pathname+y.search)X0=!0;else if(S.search!==y.search)X0=!0;else if($s(B.matches[Z0],c))X0=!0;let f={...s,defaultShouldRevalidate:X0},q0=lK(c,f);return oA(J,z,Z,z0,c,M,Y,q0,f,D)}),e=[];return P.forEach((c,Z0)=>{if(N||!$.some((y0)=>y0.route.id===c.routeId)||A.has(Z0))return;let W0=B.fetchers.get(Z0),n=W0&&W0.state!=="idle"&&W0.data===void 0,X0=k8(T,c.path,v);if(!X0){if(L&&n)return;e.push({key:Z0,routeId:c.routeId,path:c.path,matches:null,match:null,request:null,controller:null});return}if(R.has(Z0))return;let f=KU(X0,c.path),q0=new AbortController,H0=oJ(q,c.path,q0.signal),M0=null;if(_.has(Z0))_.delete(Z0),M0=tJ(J,z,H0,X0,f,M,Y);else if(n){if(O)M0=tJ(J,z,H0,X0,f,M,Y)}else{let y0;if(typeof D==="boolean")y0=D;else if(x)y0=!1;else y0=O;let i0={...s,defaultShouldRevalidate:y0};if(lK(f,i0))M0=tJ(J,z,H0,X0,f,M,Y,i0)}if(M0)e.push({key:Z0,routeId:c.routeId,path:c.path,matches:M0,match:f,request:H0,controller:q0})}),{dsMatches:$0,revalidatingFetchers:e}}function ZF(Z){return Z.loader!=null||Z.middleware!=null&&Z.middleware.length>0}function sA(Z,Y,J){if(Z.lazy)return!0;if(!ZF(Z))return!1;let z=Y!=null&&Z.id in Y,q=J!=null&&J[Z.id]!==void 0;if(!z&&q)return!1;if(typeof Z.loader==="function"&&Z.loader.hydrate===!0)return!0;return!z&&!q}function Bs(Z,Y,J){let z=!Y||J.route.id!==Y.route.id,q=!Z.hasOwnProperty(J.route.id);return z||q}function $s(Z,Y){let J=Z.route.path;return Z.pathname!==Y.pathname||J!=null&&J.endsWith("*")&&Z.params["*"]!==Y.params["*"]}function lK(Z,Y){if(Z.route.shouldRevalidate){let J=Z.route.shouldRevalidate(Y);if(typeof J==="boolean")return J}return Y.defaultShouldRevalidate}function ey(Z,Y,J,z,q,B){let $;if(Z){let M=z[Z];if(G1(M,`No route found to patch children into: routeId = ${Z}`),!M.children)M.children=[];$=M.children}else $=J;let W=[],U=[];if(Y.forEach((M)=>{let N=$.find((O)=>xI(M,O));if(N)U.push({existingRoute:N,newRoute:M});else W.push(M)}),W.length>0){let M=rK(W,q,[Z||"_","patch",String($?.length||"0")],z);$.push(...M)}if(B&&U.length>0)for(let M=0;MY.children?.some((q)=>xI(J,q)))}var ZI=new WeakMap,kI=({key:Z,route:Y,manifest:J,mapRouteProperties:z})=>{let q=J[Y.id];if(G1(q,"No route found in manifest"),!q.lazy||typeof q.lazy!=="object")return;let B=q.lazy[Z];if(!B)return;let $=ZI.get(q);if(!$)$={},ZI.set(q,$);let W=$[Z];if(W)return W;let U=(async()=>{let M=Er(Z),O=q[Z]!==void 0&&Z!=="hasErrorBoundary";if(M)g5(!M,"Route property "+Z+" is not a supported lazy route property. This property will be ignored."),$[Z]=Promise.resolve();else if(O)g5(!1,`Route "${q.id}" has a static property "${Z}" defined. The lazy property will be ignored.`);else{let _=await B();if(_!=null)Object.assign(q,{[Z]:_}),Object.assign(q,z(q))}if(typeof q.lazy==="object"){if(q.lazy[Z]=void 0,Object.values(q.lazy).every((_)=>_===void 0))q.lazy=void 0}})();return $[Z]=U,U},YI=new WeakMap;function Ws(Z,Y,J,z,q){let B=J[Z.id];if(G1(B,"No route found in manifest"),!Z.lazy)return{lazyRoutePromise:void 0,lazyHandlerPromise:void 0};if(typeof Z.lazy==="function"){let N=YI.get(B);if(N)return{lazyRoutePromise:N,lazyHandlerPromise:N};let O=(async()=>{G1(typeof Z.lazy==="function","No lazy route function found");let _=await Z.lazy(),A={};for(let P in _){let R=_[P];if(R===void 0)continue;let T=Ir(P),L=B[P]!==void 0&&P!=="hasErrorBoundary";if(T)g5(!T,"Route property "+P+" is not a supported property to be returned from a lazy route function. This property will be ignored.");else if(L)g5(!L,`Route "${B.id}" has a static property "${P}" defined but its lazy function is also returning a value for this property. The lazy route property "${P}" will be ignored.`);else A[P]=R}Object.assign(B,A),Object.assign(B,{...z(B),lazy:void 0})})();return YI.set(B,O),O.catch(()=>{}),{lazyRoutePromise:O,lazyHandlerPromise:O}}let $=Object.keys(Z.lazy),W=[],U=void 0;for(let N of $){if(q&&q.includes(N))continue;let O=kI({key:N,route:Z,manifest:J,mapRouteProperties:z});if(O){if(W.push(O),N===Y)U=O}}let M=W.length>0?Promise.all(W).then(()=>{}):void 0;return M?.catch(()=>{}),U?.catch(()=>{}),{lazyRoutePromise:M,lazyHandlerPromise:U}}async function QI(Z){let Y=Z.matches.filter((q)=>q.shouldLoad),J={};return(await Promise.all(Y.map((q)=>q.resolve()))).forEach((q,B)=>{J[Y[B].route.id]=q}),J}async function Gs(Z){if(!Z.matches.some((Y)=>Y.route.middleware))return QI(Z);return fI(Z,()=>QI(Z))}function fI(Z,Y){return Us(Z,Y,(z)=>{if(Ls(z))throw z;return z},Ps,J);function J(z,q,B){if(B)return Promise.resolve(Object.assign(B.value,{[q]:{type:"error",result:z}}));else{let{matches:$}=Z,W=Math.min(Math.max($.findIndex((M)=>M.route.id===q),0),Math.max($.findIndex((M)=>M.shouldCallHandler()),0)),U=XZ($,$[W].route.id).route.id;return Promise.resolve({[U]:{type:"error",result:z}})}}}async function Us(Z,Y,J,z,q){let{matches:B,request:$,params:W,context:U,unstable_pattern:M}=Z,N=B.flatMap((_)=>_.route.middleware?_.route.middleware.map((A)=>[_.route.id,A]):[]);return await gI({request:$,params:W,context:U,unstable_pattern:M},N,Y,J,z,q)}async function gI(Z,Y,J,z,q,B,$=0){let{request:W}=Z;if(W.signal.aborted)throw W.signal.reason??Error(`Request aborted: ${W.method} ${W.url}`);let U=Y[$];if(!U)return await J();let[M,N]=U,O,_=async()=>{if(O)throw Error("You may only call `next()` once per middleware");try{return O={value:await gI(Z,Y,J,z,q,B,$+1)},O.value}catch(A){return O={value:await B(A,M,O)},O.value}};try{let A=await N(Z,_),P=A!=null?z(A):void 0;if(q(P))return P;else if(O)return P??O.value;else return O={value:await _()},O.value}catch(A){return await B(A,M,O)}}function hI(Z,Y,J,z,q){let B=kI({key:"middleware",route:z.route,manifest:Y,mapRouteProperties:Z}),$=Ws(z.route,P7(J.method)?"action":"loader",Y,Z,q);return{middleware:B,route:$.lazyRoutePromise,handler:$.lazyHandlerPromise}}function oA(Z,Y,J,z,q,B,$,W,U=null,M){let N=!1,O=hI(Z,Y,J,q,B);return{...q,_lazyPromises:O,shouldLoad:W,shouldRevalidateArgs:U,shouldCallHandler(_){if(N=!0,!U)return W;if(typeof M==="boolean")return lK(q,{...U,defaultShouldRevalidate:M});if(typeof _==="boolean")return lK(q,{...U,defaultShouldRevalidate:_});return lK(q,U)},resolve(_){let{lazy:A,loader:P,middleware:R}=q.route,T=N||W||_&&!P7(J.method)&&(A||P),v=R&&R.length>0&&!P&&!A;if(T&&(P7(J.method)||!v))return ws({request:J,unstable_pattern:z,match:q,lazyHandlerPromise:O?.handler,lazyRoutePromise:O?.route,handlerOverride:_,scopedContext:$});return Promise.resolve({type:"data",result:void 0})}}}function tJ(Z,Y,J,z,q,B,$,W=null){return z.map((U)=>{if(U.route.id!==q.route.id)return{...U,shouldLoad:!1,shouldRevalidateArgs:W,shouldCallHandler:()=>!1,_lazyPromises:hI(Z,Y,J,U,B),resolve:()=>Promise.resolve({type:"data",result:void 0})};return oA(Z,Y,J,oK(z),U,B,$,!0,W)})}async function Ms(Z,Y,J,z,q,B){if(J.some((M)=>M._lazyPromises?.middleware))await Promise.all(J.map((M)=>M._lazyPromises?.middleware));let $={request:Y,unstable_pattern:oK(J),params:J[0].params,context:q,matches:J},U=await Z({...$,fetcherKey:z,runClientMiddleware:B?()=>{throw Error("You cannot call `runClientMiddleware()` from a static handler `dataStrategy`. Middleware is run outside of `dataStrategy` during SSR in order to bubble up the Response. You can enable middleware via the `respond` API in `query`/`queryRoute`")}:(M)=>{let N=$;return fI(N,()=>{return M({...N,fetcherKey:z,runClientMiddleware:()=>{throw Error("Cannot call `runClientMiddleware()` from within an `runClientMiddleware` handler")}})})}});try{await Promise.all(J.flatMap((M)=>[M._lazyPromises?.handler,M._lazyPromises?.route]))}catch(M){}return U}async function ws({request:Z,unstable_pattern:Y,match:J,lazyHandlerPromise:z,lazyRoutePromise:q,handlerOverride:B,scopedContext:$}){let W,U,M=P7(Z.method),N=M?"action":"loader",O=(_)=>{let A,P=new Promise((v,L)=>A=L);U=()=>A(),Z.signal.addEventListener("abort",U);let R=(v)=>{if(typeof _!=="function")return Promise.reject(Error(`You cannot call the handler for a route which defines a boolean "${N}" [routeId: ${J.route.id}]`));return _({request:Z,unstable_pattern:Y,params:J.params,context:$},...v!==void 0?[v]:[])},T=(async()=>{try{return{type:"data",result:await(B?B((L)=>R(L)):R())}}catch(v){return{type:"error",result:v}}})();return Promise.race([T,P])};try{let _=M?J.route.action:J.route.loader;if(z||q)if(_){let A,[P]=await Promise.all([O(_).catch((R)=>{A=R}),z,q]);if(A!==void 0)throw A;W=P}else{await z;let A=M?J.route.action:J.route.loader;if(A)[W]=await Promise.all([O(A),q]);else if(N==="action"){let P=new URL(Z.url),R=P.pathname+P.search;throw z6(405,{method:Z.method,pathname:R,routeId:J.route.id})}else return{type:"data",result:void 0}}else if(!_){let A=new URL(Z.url),P=A.pathname+A.search;throw z6(404,{pathname:P})}else W=await O(_)}catch(_){return{type:"error",result:_}}finally{if(U)Z.signal.removeEventListener("abort",U)}return W}async function Ns(Z){let Y=Z.headers.get("Content-Type");if(Y&&/\bapplication\/json\b/.test(Y))return Z.body==null?null:Z.json();return Z.text()}async function Hs(Z){let{result:Y,type:J}=Z;if(YF(Y)){let z;try{z=await Ns(Y)}catch(q){return{type:"error",error:q}}if(J==="error")return{type:"error",error:new eJ(Y.status,Y.statusText,z),statusCode:Y.status,headers:Y.headers};return{type:"data",data:z,statusCode:Y.status,headers:Y.headers}}if(J==="error"){if(BI(Y)){if(Y.data instanceof Error)return{type:"error",error:Y.data,statusCode:Y.init?.status,headers:Y.init?.headers?new Headers(Y.init.headers):void 0};return{type:"error",error:Fs(Y),statusCode:y3(Y)?Y.status:void 0,headers:Y.init?.headers?new Headers(Y.init.headers):void 0}}return{type:"error",error:Y,statusCode:y3(Y)?Y.status:void 0}}if(BI(Y))return{type:"data",data:Y.data,statusCode:Y.init?.status,headers:Y.init?.headers?new Headers(Y.init.headers):void 0};return{type:"data",data:Y}}function Os(Z,Y,J,z,q){let B=Z.headers.get("Location");if(G1(B,"Redirects returned/thrown from loaders/actions must have a Location header"),!WU(B)){let $=z.slice(0,z.findIndex((W)=>W.route.id===J)+1);B=rA(new URL(Y.url),$,q,B),Z.headers.set("Location",B)}return Z}function JI(Z,Y,J,z){let q=["about:","blob:","chrome:","chrome-untrusted:","content:","data:","devtools:","file:","filesystem:","javascript:"];if(WU(Z)){let B=Z,$=B.startsWith("//")?new URL(Y.protocol+B):new URL(B);if(q.includes($.protocol))throw Error("Invalid redirect location");let W=j4($.pathname,J)!=null;if($.origin===Y.origin&&W)return $.pathname+$.search+$.hash}try{let B=z.createURL(Z);if(q.includes(B.protocol))throw Error("Invalid redirect location")}catch(B){}return Z}function oJ(Z,Y,J,z){let q=Z.createURL(mI(Y)).toString(),B={signal:J};if(z&&P7(z.formMethod)){let{formMethod:$,formEncType:W}=z;if(B.method=$.toUpperCase(),W==="application/json")B.headers=new Headers({"Content-Type":W}),B.body=JSON.stringify(z.json);else if(W==="text/plain")B.body=z.text;else if(W==="application/x-www-form-urlencoded"&&z.formData)B.body=iA(z.formData);else B.body=z.formData}return new Request(q,B)}function iA(Z){let Y=new URLSearchParams;for(let[J,z]of Z.entries())Y.append(J,typeof z==="string"?z:z.name);return Y}function XI(Z){let Y=new FormData;for(let[J,z]of Z.entries())Y.append(J,z);return Y}function _s(Z,Y,J,z=!1,q=!1){let B={},$=null,W,U=!1,M={},N=J&&I4(J[1])?J[1].error:void 0;if(Z.forEach((O)=>{if(!(O.route.id in Y))return;let _=O.route.id,A=Y[_];if(G1(!jY(A),"Cannot handle redirect results in processLoaderData"),I4(A)){let P=A.error;if(N!==void 0)P=N,N=void 0;if($=$||{},q)$[_]=P;else{let R=XZ(Z,_);if($[R.route.id]==null)$[R.route.id]=P}if(!z)B[_]=jI;if(!U)U=!0,W=y3(A.error)?A.error.status:500;if(A.headers)M[_]=A.headers}else{if(B[_]=A.data,A.statusCode&&A.statusCode!==200&&!U)W=A.statusCode;if(A.headers)M[_]=A.headers}}),N!==void 0&&J){if($={[J[0]]:N},J[2])B[J[2]]=void 0}return{loaderData:B,errors:$,statusCode:W||200,loaderHeaders:M}}function zI(Z,Y,J,z,q,B){let{loaderData:$,errors:W}=_s(Y,J,z);return q.filter((U)=>!U.matches||U.matches.some((M)=>M.shouldLoad)).forEach((U)=>{let{key:M,match:N,controller:O}=U;if(O&&O.signal.aborted)return;let _=B[M];if(G1(_,"Did not find corresponding fetcher result"),I4(_)){let A=XZ(Z.matches,N?.route.id);if(!(W&&W[A.route.id]))W={...W,[A.route.id]:_.error};Z.fetchers.delete(M)}else if(jY(_))G1(!1,"Unhandled fetcher revalidation redirect");else{let A=x8(_.data);Z.fetchers.set(M,A)}}),{loaderData:$,errors:W}}function qI(Z,Y,J,z){let q=Object.entries(Y).filter(([,B])=>B!==jI).reduce((B,[$,W])=>{return B[$]=W,B},{});for(let B of J){let $=B.route.id;if(!Y.hasOwnProperty($)&&Z.hasOwnProperty($)&&B.route.loader)q[$]=Z[$];if(z&&z.hasOwnProperty($))break}return q}function KI(Z){if(!Z)return{};return I4(Z[1])?{actionData:{}}:{actionData:{[Z[0]]:Z[1].data}}}function XZ(Z,Y){return(Y?Z.slice(0,Z.findIndex((z)=>z.route.id===Y)+1):[...Z]).reverse().find((z)=>z.route.hasErrorBoundary===!0)||Z[0]}function QU(Z){let Y=Z.length===1?Z[0]:Z.find((J)=>J.index||!J.path||J.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:Y}],route:Y}}function z6(Z,{pathname:Y,routeId:J,method:z,type:q,message:B}={}){let $="Unknown Server Error",W="Unknown @remix-run/router error";if(Z===400){if($="Bad Request",z&&Y&&J)W=`You made a ${z} request to "${Y}" but did not provide a \`loader\` for route "${J}", so there is no way to handle the request.`;else if(q==="invalid-body")W="Unable to encode submission body"}else if(Z===403)$="Forbidden",W=`Route "${J}" does not match URL "${Y}"`;else if(Z===404)$="Not Found",W=`No route matches URL "${Y}"`;else if(Z===405){if($="Method Not Allowed",z&&Y&&J)W=`You made a ${z.toUpperCase()} request to "${Y}" but did not provide an \`action\` for route "${J}", so there is no way to handle the request.`;else if(z)W=`Invalid request method "${z.toUpperCase()}"`}return new eJ(Z||500,$,Error(W),!0)}function JU(Z){let Y=Object.entries(Z);for(let J=Y.length-1;J>=0;J--){let[z,q]=Y[J];if(jY(q))return{key:z,result:q}}}function mI(Z){let Y=typeof Z==="string"?I3(Z):Z;return f6({...Y,hash:""})}function As(Z,Y){if(Z.pathname!==Y.pathname||Z.search!==Y.search)return!1;if(Z.hash==="")return Y.hash!=="";else if(Z.hash===Y.hash)return!0;else if(Y.hash!=="")return!0;return!1}function Fs(Z){return new eJ(Z.init?.status??500,Z.init?.statusText??"Internal Server Error",Z.data)}function Ps(Z){return Z!=null&&typeof Z==="object"&&Object.entries(Z).every(([Y,J])=>typeof Y==="string"&&Vs(J))}function Vs(Z){return Z!=null&&typeof Z==="object"&&"type"in Z&&"result"in Z&&(Z.type==="data"||Z.type==="error")}function Rs(Z){return YF(Z.result)&&yI.has(Z.result.status)}function I4(Z){return Z.type==="error"}function jY(Z){return(Z&&Z.type)==="redirect"}function BI(Z){return typeof Z==="object"&&Z!=null&&"type"in Z&&"data"in Z&&"init"in Z&&Z.type==="DataWithResponseInit"}function YF(Z){return Z!=null&&typeof Z.status==="number"&&typeof Z.statusText==="string"&&typeof Z.headers==="object"&&typeof Z.body<"u"}function vs(Z){return yI.has(Z)}function Ls(Z){return YF(Z)&&vs(Z.status)&&Z.headers.has("Location")}function Ts(Z){return Xs.has(Z.toUpperCase())}function P7(Z){return Qs.has(Z.toUpperCase())}function QF(Z){return new URLSearchParams(Z).getAll("index").some((Y)=>Y==="")}function KU(Z,Y){let J=typeof Y==="string"?I3(Y).search:Y.search;if(Z[Z.length-1].route.index&&QF(J||""))return Z[Z.length-1];let z=TI(Z);return z[z.length-1]}function $I(Z){let{formMethod:Y,formAction:J,formEncType:z,text:q,formData:B,json:$}=Z;if(!Y||!J||!z)return;if(q!=null)return{formMethod:Y,formAction:J,formEncType:z,formData:void 0,json:void 0,text:q};else if(B!=null)return{formMethod:Y,formAction:J,formEncType:z,formData:B,json:void 0,text:void 0};else if($!==void 0)return{formMethod:Y,formAction:J,formEncType:z,formData:void 0,json:$,text:void 0}}function cA(Z,Y){if(Y)return{state:"loading",location:Z,formMethod:Y.formMethod,formAction:Y.formAction,formEncType:Y.formEncType,formData:Y.formData,json:Y.json,text:Y.text};else return{state:"loading",location:Z,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function Cs(Z,Y){return{state:"submitting",location:Z,formMethod:Y.formMethod,formAction:Y.formAction,formEncType:Y.formEncType,formData:Y.formData,json:Y.json,text:Y.text}}function uK(Z,Y){if(Z)return{state:"loading",formMethod:Z.formMethod,formAction:Z.formAction,formEncType:Z.formEncType,formData:Z.formData,json:Z.json,text:Z.text,data:Y};else return{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:Y}}function bs(Z,Y){return{state:"submitting",formMethod:Z.formMethod,formAction:Z.formAction,formEncType:Z.formEncType,formData:Z.formData,json:Z.json,text:Z.text,data:Y?Y.data:void 0}}function x8(Z){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:Z}}function Ds(Z,Y){try{let J=Z.sessionStorage.getItem(II);if(J){let z=JSON.parse(J);for(let[q,B]of Object.entries(z||{}))if(B&&Array.isArray(B))Y.set(q,new Set(B||[]))}}catch(J){}}function Es(Z,Y){if(Y.size>0){let J={};for(let[z,q]of Y)J[z]=[...q];try{Z.sessionStorage.setItem(II,JSON.stringify(J))}catch(z){g5(!1,`Failed to save applied view transitions in sessionStorage (${z}).`)}}}function WI(){let Z,Y,J=new Promise((z,q)=>{Z=async(B)=>{z(B);try{await J}catch($){}},Y=async(B)=>{q(B);try{await J}catch($){}}});return{promise:J,resolve:Z,reject:Y}}var qZ=B4.createContext(null);qZ.displayName="DataRouter";var SY=B4.createContext(null);SY.displayName="DataRouterState";var uI=B4.createContext(!1);function ys(){return B4.useContext(uI)}var wU=B4.createContext({isTransitioning:!1});wU.displayName="ViewTransition";var NU=B4.createContext(new Map);NU.displayName="Fetchers";var Is=B4.createContext(null);Is.displayName="Await";var V7=B4.createContext(null);V7.displayName="Navigation";var ZX=B4.createContext(null);ZX.displayName="Location";var $4=B4.createContext({outlet:null,matches:[],isDataRoute:!1});$4.displayName="Route";var JF=B4.createContext(null);JF.displayName="RouteError";var nJ=!0,pI="REACT_ROUTER_ERROR",js="REDIRECT",Ss="ROUTE_ERROR_RESPONSE";function xs(Z){if(Z.startsWith(`${pI}:${js}:{`))try{let Y=JSON.parse(Z.slice(28));if(typeof Y==="object"&&Y&&typeof Y.status==="number"&&typeof Y.statusText==="string"&&typeof Y.location==="string"&&typeof Y.reloadDocument==="boolean"&&typeof Y.replace==="boolean")return Y}catch{}}function ks(Z){if(Z.startsWith(`${pI}:${Ss}:{`))try{let Y=JSON.parse(Z.slice(40));if(typeof Y==="object"&&Y&&typeof Y.status==="number"&&typeof Y.statusText==="string")return new eJ(Y.status,Y.statusText,Y.data)}catch{}}function cI(Z,{relative:Y}={}){G1(xY(),"useHref() may be used only in the context of a component.");let{basename:J,navigator:z}=g0.useContext(V7),{hash:q,pathname:B,search:$}=YX(Z,{relative:Y}),W=B;if(J!=="/")W=B==="/"?J:E3([J,B]);return z.createHref({pathname:W,search:$,hash:q})}function xY(){return g0.useContext(ZX)!=null}function J2(){return G1(xY(),"useLocation() may be used only in the context of a component."),g0.useContext(ZX).location}var dI="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function lI(Z){if(!g0.useContext(V7).static)g0.useLayoutEffect(Z)}function S4(){let{isDataRoute:Z}=g0.useContext($4);return Z?rs():fs()}function fs(){G1(xY(),"useNavigate() may be used only in the context of a component.");let Z=g0.useContext(qZ),{basename:Y,navigator:J}=g0.useContext(V7),{matches:z}=g0.useContext($4),{pathname:q}=J2(),B=JSON.stringify(GU(z)),$=g0.useRef(!1);return lI(()=>{$.current=!0}),g0.useCallback((U,M={})=>{if(g5($.current,dI),!$.current)return;if(typeof U==="number"){J.go(U);return}let N=UU(U,JSON.parse(B),q,M.relative==="path");if(Z==null&&Y!=="/")N.pathname=N.pathname==="/"?Y:E3([Y,N.pathname]);(M.replace?J.replace:J.push)(N,M.state,M)},[Y,J,B,q,Z])}var gs=g0.createContext(null);function aI(Z){let Y=g0.useContext($4).outlet;return g0.useMemo(()=>Y&&g0.createElement(gs.Provider,{value:Z},Y),[Y,Z])}function K7(){let{matches:Z}=g0.useContext($4),Y=Z[Z.length-1];return Y?Y.params:{}}function YX(Z,{relative:Y}={}){let{matches:J}=g0.useContext($4),{pathname:z}=J2(),q=JSON.stringify(GU(J));return g0.useMemo(()=>UU(Z,JSON.parse(q),z,Y==="path"),[Z,q,z,Y])}function hs(Z,Y,J,z,q){G1(xY(),"useRoutes() may be used only in the context of a component.");let{navigator:B}=g0.useContext(V7),{matches:$}=g0.useContext($4),W=$[$.length-1],U=W?W.params:{},M=W?W.pathname:"/",N=W?W.pathnameBase:"/",O=W&&W.route;if(nJ){let L=O&&O.path||"";oI(M,!O||L.endsWith("*")||L.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${M}" (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 _=J2(),A;if(Y){let L=typeof Y==="string"?I3(Y):Y;G1(N==="/"||L.pathname?.startsWith(N),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${N}" but pathname "${L.pathname}" was given in the \`location\` prop.`),A=L}else A=_;let P=A.pathname||"/",R=P;if(N!=="/"){let L=N.replace(/^\//,"").split("/");R="/"+P.replace(/^\//,"").split("/").slice(L.length).join("/")}let T=k8(Z,{pathname:R});if(nJ)g5(O||T!=null,`No routes matched location "${A.pathname}${A.search}${A.hash}" `),g5(T==null||T[T.length-1].route.element!==void 0||T[T.length-1].route.Component!==void 0||T[T.length-1].route.lazy!==void 0,`Matched leaf route at location "${A.pathname}${A.search}${A.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let v=ds(T&&T.map((L)=>Object.assign({},L,{params:Object.assign({},U,L.params),pathname:E3([N,B.encodeLocation?B.encodeLocation(L.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:L.pathname]),pathnameBase:L.pathnameBase==="/"?N:E3([N,B.encodeLocation?B.encodeLocation(L.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:L.pathnameBase])})),$,J,z,q);if(Y&&v)return g0.createElement(ZX.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...A},navigationType:"POP"}},v);return v}function ms(){let Z=OU(),Y=y3(Z)?`${Z.status} ${Z.statusText}`:Z instanceof Error?Z.message:JSON.stringify(Z),J=Z instanceof Error?Z.stack:null,z="rgba(200,200,200, 0.5)",q={padding:"0.5rem",backgroundColor:z},B={padding:"2px 4px",backgroundColor:z},$=null;if(nJ)console.error("Error handled by React Router default ErrorBoundary:",Z),$=g0.createElement(g0.Fragment,null,g0.createElement("p",null,"\uD83D\uDCBF Hey developer \uD83D\uDC4B"),g0.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",g0.createElement("code",{style:B},"ErrorBoundary")," or"," ",g0.createElement("code",{style:B},"errorElement")," prop on your route."));return g0.createElement(g0.Fragment,null,g0.createElement("h2",null,"Unexpected Application Error!"),g0.createElement("h3",{style:{fontStyle:"italic"}},Y),J?g0.createElement("pre",{style:q},J):null,$)}var us=g0.createElement(ms,null),rI=class extends g0.Component{constructor(Z){super(Z);this.state={location:Z.location,revalidation:Z.revalidation,error:Z.error}}static getDerivedStateFromError(Z){return{error:Z}}static getDerivedStateFromProps(Z,Y){if(Y.location!==Z.location||Y.revalidation!=="idle"&&Z.revalidation==="idle")return{error:Z.error,location:Z.location,revalidation:Z.revalidation};return{error:Z.error!==void 0?Z.error:Y.error,location:Y.location,revalidation:Z.revalidation||Y.revalidation}}componentDidCatch(Z,Y){if(this.props.onError)this.props.onError(Z,Y);else console.error("React Router caught the following error during render",Z)}render(){let Z=this.state.error;if(this.context&&typeof Z==="object"&&Z&&"digest"in Z&&typeof Z.digest==="string"){let J=ks(Z.digest);if(J)Z=J}let Y=Z!==void 0?g0.createElement($4.Provider,{value:this.props.routeContext},g0.createElement(JF.Provider,{value:Z,children:this.props.component})):this.props.children;if(this.context)return g0.createElement(ps,{error:Z},Y);return Y}};rI.contextType=uI;var dA=new WeakMap;function ps({children:Z,error:Y}){let{basename:J}=g0.useContext(V7);if(typeof Y==="object"&&Y&&"digest"in Y&&typeof Y.digest==="string"){let z=xs(Y.digest);if(z){let q=dA.get(Y);if(q)throw q;let B=bI(z.location,J);if(CI&&!dA.get(Y))if(B.isExternal||z.reloadDocument)window.location.href=B.absoluteURL||B.to;else{let $=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(B.to,{replace:z.replace}));throw dA.set(Y,$),$}return g0.createElement("meta",{httpEquiv:"refresh",content:`0;url=${B.absoluteURL||B.to}`})}}return Z}function cs({routeContext:Z,match:Y,children:J}){let z=g0.useContext(qZ);if(z&&z.static&&z.staticContext&&(Y.route.errorElement||Y.route.ErrorBoundary))z.staticContext._deepestRenderedBoundaryId=Y.route.id;return g0.createElement($4.Provider,{value:Z},J)}function ds(Z,Y=[],J=null,z=null,q=null){if(Z==null){if(!J)return null;if(J.errors)Z=J.matches;else if(Y.length===0&&!J.initialized&&J.matches.length>0)Z=J.matches;else return null}let B=Z,$=J?.errors;if($!=null){let N=B.findIndex((O)=>O.route.id&&$?.[O.route.id]!==void 0);G1(N>=0,`Could not find a matching route for errors on route IDs: ${Object.keys($).join(",")}`),B=B.slice(0,Math.min(B.length,N+1))}let W=!1,U=-1;if(J)for(let N=0;N=0)B=B.slice(0,U+1);else B=[B[0]];break}}}let M=J&&z?(N,O)=>{z(N,{location:J.location,params:J.matches?.[0]?.params??{},unstable_pattern:oK(J.matches),errorInfo:O})}:void 0;return B.reduceRight((N,O,_)=>{let A,P=!1,R=null,T=null;if(J){if(A=$&&O.route.id?$[O.route.id]:void 0,R=O.route.errorElement||us,W){if(U<0&&_===0)oI("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),P=!0,T=null;else if(U===_)P=!0,T=O.route.hydrateFallbackElement||null}}let v=Y.concat(B.slice(0,_+1)),L=()=>{let C;if(A)C=R;else if(P)C=T;else if(O.route.Component)C=g0.createElement(O.route.Component,null);else if(O.route.element)C=O.route.element;else C=N;return g0.createElement(cs,{match:O,routeContext:{outlet:N,matches:v,isDataRoute:J!=null},children:C})};return J&&(O.route.ErrorBoundary||O.route.errorElement||_===0)?g0.createElement(rI,{location:J.location,revalidation:J.revalidation,component:R,error:A,children:L(),routeContext:{outlet:null,matches:v,isDataRoute:!0},onError:M}):L()},null)}function XF(Z){return`${Z} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function sI(Z){let Y=g0.useContext(qZ);return G1(Y,XF(Z)),Y}function QX(Z){let Y=g0.useContext(SY);return G1(Y,XF(Z)),Y}function ls(Z){let Y=g0.useContext($4);return G1(Y,XF(Z)),Y}function iK(Z){let Y=ls(Z),J=Y.matches[Y.matches.length-1];return G1(J.route.id,`${Z} can only be used on routes that contain a unique "id"`),J.route.id}function as(){return iK("useRouteId")}function HU(){return QX("useNavigation").navigation}function f8(){let Z=sI("useRevalidator"),Y=QX("useRevalidator"),J=g0.useCallback(async()=>{await Z.router.revalidate()},[Z.router]);return g0.useMemo(()=>({revalidate:J,state:Y.revalidation}),[J,Y.revalidation])}function kY(){let{matches:Z,loaderData:Y}=QX("useMatches");return g0.useMemo(()=>Z.map((J)=>PI(J,Y)),[Z,Y])}function zF(){let Z=QX("useLoaderData"),Y=iK("useLoaderData");return Z.loaderData[Y]}function qF(){let Z=QX("useActionData"),Y=iK("useLoaderData");return Z.actionData?Z.actionData[Y]:void 0}function OU(){let Z=g0.useContext(JF),Y=QX("useRouteError"),J=iK("useRouteError");if(Z!==void 0)return Z;return Y.errors?.[J]}function rs(){let{router:Z}=sI("useNavigate"),Y=iK("useNavigate"),J=g0.useRef(!1);return lI(()=>{J.current=!0}),g0.useCallback(async(q,B={})=>{if(g5(J.current,dI),!J.current)return;if(typeof q==="number")await Z.navigate(q);else await Z.navigate(q,{fromRouteId:Y,...B})},[Z,Y])}var GI={};function oI(Z,Y,J){if(!Y&&!GI[Z])GI[Z]=!0,g5(!1,J)}var UI={};function MI(Z,Y){if(!Z&&!UI[Y])UI[Y]=!0,console.warn(Y)}var ss="useOptimistic",wI=Z1[ss],os=()=>{return};function is(Z){if(wI)return wI(Z);else return[Z,os]}function iI(Z){let Y={hasErrorBoundary:Z.hasErrorBoundary||Z.ErrorBoundary!=null||Z.errorElement!=null};if(Z.Component){if(nJ){if(Z.element)g5(!1,"You should not include both `Component` and `element` on your route - `Component` will be used.")}Object.assign(Y,{element:Z1.createElement(Z.Component),Component:void 0})}if(Z.HydrateFallback){if(nJ){if(Z.hydrateFallbackElement)g5(!1,"You should not include both `HydrateFallback` and `hydrateFallbackElement` on your route - `HydrateFallback` will be used.")}Object.assign(Y,{hydrateFallbackElement:Z1.createElement(Z.HydrateFallback),HydrateFallback:void 0})}if(Z.ErrorBoundary){if(nJ){if(Z.errorElement)g5(!1,"You should not include both `ErrorBoundary` and `errorElement` on your route - `ErrorBoundary` will be used.")}Object.assign(Y,{errorElement:Z1.createElement(Z.ErrorBoundary),ErrorBoundary:void 0})}return Y}var tI=["HydrateFallback","hydrateFallbackElement"];var ts=class{constructor(){this.status="pending",this.promise=new Promise((Z,Y)=>{this.resolve=(J)=>{if(this.status==="pending")this.status="resolved",Z(J)},this.reject=(J)=>{if(this.status==="pending")this.status="rejected",Y(J)}})}};function KF({router:Z,flushSync:Y,onError:J,unstable_useTransitions:z}){z=ys()||z;let[B,$]=Z1.useState(Z.state),[W,U]=is(B),[M,N]=Z1.useState(),[O,_]=Z1.useState({isTransitioning:!1}),[A,P]=Z1.useState(),[R,T]=Z1.useState(),[v,L]=Z1.useState(),C=Z1.useRef(new Map),D=Z1.useCallback((h,{deletedFetchers:i,newErrors:x,flushSync:s,viewTransitionOpts:z0})=>{if(x&&J)Object.values(x).forEach((e)=>J(e,{location:h.location,params:h.matches[0]?.params??{},unstable_pattern:oK(h.matches)}));h.fetchers.forEach((e,c)=>{if(e.data!==void 0)C.current.set(c,e.data)}),i.forEach((e)=>C.current.delete(e)),MI(s===!1||Y!=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 $0=Z.window!=null&&Z.window.document!=null&&typeof Z.window.document.startViewTransition==="function";if(MI(z0==null||$0,"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."),!z0||!$0){if(Y&&s)Y(()=>$(h));else if(z===!1)$(h);else Z1.startTransition(()=>{if(z===!0)U((e)=>NI(e,h));$(h)});return}if(Y&&s){Y(()=>{if(R)A?.resolve(),R.skipTransition();_({isTransitioning:!0,flushSync:!0,currentLocation:z0.currentLocation,nextLocation:z0.nextLocation})});let e=Z.window.document.startViewTransition(()=>{Y(()=>$(h))});e.finished.finally(()=>{Y(()=>{P(void 0),T(void 0),N(void 0),_({isTransitioning:!1})})}),Y(()=>T(e));return}if(R)A?.resolve(),R.skipTransition(),L({state:h,currentLocation:z0.currentLocation,nextLocation:z0.nextLocation});else N(h),_({isTransitioning:!0,flushSync:!1,currentLocation:z0.currentLocation,nextLocation:z0.nextLocation})},[Z.window,Y,R,A,z,U,J]);Z1.useLayoutEffect(()=>Z.subscribe(D),[Z,D]),Z1.useEffect(()=>{if(O.isTransitioning&&!O.flushSync)P(new ts)},[O]),Z1.useEffect(()=>{if(A&&M&&Z.window){let h=M,i=A.promise,x=Z.window.document.startViewTransition(async()=>{if(z===!1)$(h);else Z1.startTransition(()=>{if(z===!0)U((s)=>NI(s,h));$(h)});await i});x.finished.finally(()=>{P(void 0),T(void 0),N(void 0),_({isTransitioning:!1})}),T(x)}},[M,A,Z.window,z,U]),Z1.useEffect(()=>{if(A&&M&&W.location.key===M.location.key)A.resolve()},[A,R,W.location,M]),Z1.useEffect(()=>{if(!O.isTransitioning&&v)N(v.state),_({isTransitioning:!0,flushSync:!1,currentLocation:v.currentLocation,nextLocation:v.nextLocation}),L(void 0)},[O.isTransitioning,v]);let I=Z1.useMemo(()=>{return{createHref:Z.createHref,encodeLocation:Z.encodeLocation,go:(h)=>Z.navigate(h),push:(h,i,x)=>Z.navigate(h,{state:i,preventScrollReset:x?.preventScrollReset}),replace:(h,i,x)=>Z.navigate(h,{replace:!0,state:i,preventScrollReset:x?.preventScrollReset})}},[Z]),S=Z.basename||"/",y=Z1.useMemo(()=>({router:Z,navigator:I,static:!1,basename:S,onError:J}),[Z,I,S,J]);return Z1.createElement(Z1.Fragment,null,Z1.createElement(qZ.Provider,{value:y},Z1.createElement(SY.Provider,{value:W},Z1.createElement(NU.Provider,{value:C.current},Z1.createElement(wU.Provider,{value:O},Z1.createElement(BF,{basename:S,location:W.location,navigationType:W.historyAction,navigator:I,unstable_useTransitions:z},Z1.createElement(ns,{routes:Z.routes,future:Z.future,state:W,onError:J})))))),null)}function NI(Z,Y){return{...Z,navigation:Y.navigation.state!=="idle"?Y.navigation:Z.navigation,revalidation:Y.revalidation!=="idle"?Y.revalidation:Z.revalidation,actionData:Y.navigation.state!=="submitting"?Y.actionData:Z.actionData,fetchers:Y.fetchers}}var ns=Z1.memo(es);function es({routes:Z,future:Y,state:J,onError:z}){return hs(Z,void 0,J,z,Y)}function tK({to:Z,replace:Y,state:J,relative:z}){G1(xY()," may be used only in the context of a component.");let{static:q}=Z1.useContext(V7);g5(!q," must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.");let{matches:B}=Z1.useContext($4),{pathname:$}=J2(),W=S4(),U=UU(Z,GU(B),$,z==="path"),M=JSON.stringify(U);return Z1.useEffect(()=>{W(JSON.parse(M),{replace:Y,state:J,relative:z})},[W,M,z,Y,J]),null}function g6(Z){return aI(Z.context)}function BF({basename:Z="/",children:Y=null,location:J,navigationType:z="POP",navigator:q,static:B=!1,unstable_useTransitions:$}){G1(!xY(),"You cannot render a inside another . You should never have more than one in your app.");let W=Z.replace(/^\/*/,"/"),U=Z1.useMemo(()=>({basename:W,navigator:q,static:B,unstable_useTransitions:$,future:{}}),[W,q,B,$]);if(typeof J==="string")J=I3(J);let{pathname:M="/",search:N="",hash:O="",state:_=null,key:A="default"}=J,P=Z1.useMemo(()=>{let R=j4(M,W);if(R==null)return null;return{location:{pathname:R,search:N,hash:O,state:_,key:A},navigationType:z}},[W,M,N,O,_,A,z]);if(g5(P!=null,` is not able to match the URL "${M}${N}${O}" because it does not start with the basename, so the won't render anything.`),P==null)return null;return Z1.createElement(V7.Provider,{value:U},Z1.createElement(ZX.Provider,{children:Y,value:P}))}var BU="get",$U="application/x-www-form-urlencoded";function _U(Z){return typeof HTMLElement<"u"&&Z instanceof HTMLElement}function Zo(Z){return _U(Z)&&Z.tagName.toLowerCase()==="button"}function Yo(Z){return _U(Z)&&Z.tagName.toLowerCase()==="form"}function Qo(Z){return _U(Z)&&Z.tagName.toLowerCase()==="input"}function Jo(Z){return!!(Z.metaKey||Z.altKey||Z.ctrlKey||Z.shiftKey)}function Xo(Z,Y){return Z.button===0&&(!Y||Y==="_self")&&!Jo(Z)}var XU=null;function zo(){if(XU===null)try{new FormData(document.createElement("form"),0),XU=!1}catch(Z){XU=!0}return XU}var qo=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function lA(Z){if(Z!=null&&!qo.has(Z))return g5(!1,`"${Z}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${$U}"`),null;return Z}function Ko(Z,Y){let J,z,q,B,$;if(Yo(Z)){let W=Z.getAttribute("action");z=W?j4(W,Y):null,J=Z.getAttribute("method")||BU,q=lA(Z.getAttribute("enctype"))||$U,B=new FormData(Z)}else if(Zo(Z)||Qo(Z)&&(Z.type==="submit"||Z.type==="image")){let W=Z.form;if(W==null)throw Error('Cannot submit a