From 1431e9e864f1411f2589042a9497f74284381b5a Mon Sep 17 00:00:00 2001 From: reidliu41 Date: Sun, 1 Mar 2026 19:25:54 +0800 Subject: [PATCH 01/17] feat(memory): add time-decay scoring with Core evergreen exemption --- src/agent/loop_/context.rs | 11 ++- src/agent/memory_loader.rs | 10 ++- src/memory/decay.rs | 152 +++++++++++++++++++++++++++++++++++++ src/memory/mod.rs | 1 + 4 files changed, 170 insertions(+), 4 deletions(-) create mode 100644 src/memory/decay.rs diff --git a/src/agent/loop_/context.rs b/src/agent/loop_/context.rs index cc2564619..bb7f127e8 100644 --- a/src/agent/loop_/context.rs +++ b/src/agent/loop_/context.rs @@ -1,9 +1,13 @@ -use crate::memory::{self, Memory}; +use crate::memory::{self, decay, Memory}; use std::fmt::Write; +/// Default half-life (days) for time decay in context building. +const CONTEXT_DECAY_HALF_LIFE_DAYS: f64 = 7.0; + /// Build context preamble by searching memory for relevant entries. /// Entries with a hybrid score below `min_relevance_score` are dropped to /// prevent unrelated memories from bleeding into the conversation. +/// Core memories are exempt from time decay (evergreen). pub(super) async fn build_context( mem: &dyn Memory, user_msg: &str, @@ -13,7 +17,10 @@ pub(super) async fn build_context( let mut context = String::new(); // Pull relevant memories for this message - if let Ok(entries) = mem.recall(user_msg, 5, session_id).await { + if let Ok(mut entries) = mem.recall(user_msg, 5, session_id).await { + // Apply time decay: older non-Core memories score lower + decay::apply_time_decay(&mut entries, CONTEXT_DECAY_HALF_LIFE_DAYS); + let relevant: Vec<_> = entries .iter() .filter(|e| match e.score { diff --git a/src/agent/memory_loader.rs b/src/agent/memory_loader.rs index bb7bfb5c1..783650d64 100644 --- a/src/agent/memory_loader.rs +++ b/src/agent/memory_loader.rs @@ -1,7 +1,10 @@ -use crate::memory::{self, Memory}; +use crate::memory::{self, decay, Memory}; use async_trait::async_trait; use std::fmt::Write; +/// Default half-life (days) for time decay in memory loading. +const LOADER_DECAY_HALF_LIFE_DAYS: f64 = 7.0; + #[async_trait] pub trait MemoryLoader: Send + Sync { async fn load_context(&self, memory: &dyn Memory, user_message: &str) @@ -38,11 +41,14 @@ impl MemoryLoader for DefaultMemoryLoader { memory: &dyn Memory, user_message: &str, ) -> anyhow::Result { - let entries = memory.recall(user_message, self.limit, None).await?; + let mut entries = memory.recall(user_message, self.limit, None).await?; if entries.is_empty() { return Ok(String::new()); } + // Apply time decay: older non-Core memories score lower + decay::apply_time_decay(&mut entries, LOADER_DECAY_HALF_LIFE_DAYS); + let mut context = String::from("[Memory context]\n"); for entry in entries { if memory::is_assistant_autosave_key(&entry.key) { diff --git a/src/memory/decay.rs b/src/memory/decay.rs new file mode 100644 index 000000000..7fa9b1dfc --- /dev/null +++ b/src/memory/decay.rs @@ -0,0 +1,152 @@ +use super::traits::{MemoryCategory, MemoryEntry}; +use chrono::{DateTime, Utc}; + +/// Default half-life in days for time-decay scoring. +/// After this many days, a non-Core memory's score drops to 50%. +const DEFAULT_HALF_LIFE_DAYS: f64 = 7.0; + +/// Apply exponential time decay to memory entry scores. +/// +/// - `Core` memories are exempt ("evergreen") — their scores are never decayed. +/// - Entries without a parseable RFC3339 timestamp are left unchanged. +/// - Entries without a score (`None`) are left unchanged. +/// +/// Decay formula: `score * 2^(-age_days / half_life_days)` +pub fn apply_time_decay(entries: &mut [MemoryEntry], half_life_days: f64) { + let half_life = if half_life_days <= 0.0 { + DEFAULT_HALF_LIFE_DAYS + } else { + half_life_days + }; + + let now = Utc::now(); + + for entry in entries.iter_mut() { + // Core memories are evergreen — never decay + if entry.category == MemoryCategory::Core { + continue; + } + + let score = match entry.score { + Some(s) => s, + None => continue, + }; + + let ts = match DateTime::parse_from_rfc3339(&entry.timestamp) { + Ok(dt) => dt.with_timezone(&Utc), + Err(_) => continue, + }; + + let age_days = now + .signed_duration_since(ts) + .num_seconds() + .max(0) as f64 + / 86_400.0; + + let decay_factor = (-age_days / half_life * std::f64::consts::LN_2).exp(); + entry.score = Some(score * decay_factor); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn make_entry(category: MemoryCategory, score: Option, timestamp: &str) -> MemoryEntry { + MemoryEntry { + id: "1".into(), + key: "test".into(), + content: "value".into(), + category, + timestamp: timestamp.into(), + session_id: None, + score, + } + } + + fn recent_rfc3339() -> String { + Utc::now().to_rfc3339() + } + + fn days_ago_rfc3339(days: i64) -> String { + (Utc::now() - chrono::Duration::days(days)).to_rfc3339() + } + + #[test] + fn core_memories_are_never_decayed() { + let mut entries = vec![make_entry( + MemoryCategory::Core, + Some(0.9), + &days_ago_rfc3339(30), + )]; + apply_time_decay(&mut entries, 7.0); + assert_eq!(entries[0].score, Some(0.9)); + } + + #[test] + fn recent_entry_score_barely_changes() { + let mut entries = vec![make_entry( + MemoryCategory::Conversation, + Some(0.8), + &recent_rfc3339(), + )]; + apply_time_decay(&mut entries, 7.0); + let decayed = entries[0].score.unwrap(); + assert!( + (decayed - 0.8).abs() < 0.01, + "recent entry should barely decay, got {decayed}" + ); + } + + #[test] + fn one_half_life_halves_score() { + let mut entries = vec![make_entry( + MemoryCategory::Conversation, + Some(1.0), + &days_ago_rfc3339(7), + )]; + apply_time_decay(&mut entries, 7.0); + let decayed = entries[0].score.unwrap(); + assert!( + (decayed - 0.5).abs() < 0.05, + "score after one half-life should be ~0.5, got {decayed}" + ); + } + + #[test] + fn two_half_lives_quarters_score() { + let mut entries = vec![make_entry( + MemoryCategory::Conversation, + Some(1.0), + &days_ago_rfc3339(14), + )]; + apply_time_decay(&mut entries, 7.0); + let decayed = entries[0].score.unwrap(); + assert!( + (decayed - 0.25).abs() < 0.05, + "score after two half-lives should be ~0.25, got {decayed}" + ); + } + + #[test] + fn no_score_entry_is_unchanged() { + let mut entries = vec![make_entry( + MemoryCategory::Conversation, + None, + &days_ago_rfc3339(30), + )]; + apply_time_decay(&mut entries, 7.0); + assert_eq!(entries[0].score, None); + } + + #[test] + fn unparseable_timestamp_is_unchanged() { + let mut entries = vec![make_entry( + MemoryCategory::Conversation, + Some(0.9), + "not-a-date", + )]; + apply_time_decay(&mut entries, 7.0); + assert_eq!(entries[0].score, Some(0.9)); + } +} diff --git a/src/memory/mod.rs b/src/memory/mod.rs index 03979bb77..d6227f5a1 100644 --- a/src/memory/mod.rs +++ b/src/memory/mod.rs @@ -2,6 +2,7 @@ pub mod backend; pub mod chunker; pub mod cli; pub mod cortex; +pub mod decay; pub mod embeddings; pub mod hybrid; pub mod hygiene; From 058ce1d1d7355de2ec74e8aada56edd6d3e15eb5 Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Sun, 1 Mar 2026 13:31:33 -0500 Subject: [PATCH 02/17] fix(anthropic): ignore empty text content blocks --- src/providers/anthropic.rs | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/providers/anthropic.rs b/src/providers/anthropic.rs index b762ef5f4..862803eef 100644 --- a/src/providers/anthropic.rs +++ b/src/providers/anthropic.rs @@ -408,8 +408,9 @@ impl AnthropicProvider { response .content .into_iter() - .find(|c| c.kind == "text") - .and_then(|c| c.text) + .filter(|c| c.kind == "text") + .filter_map(|c| c.text.map(|text| text.trim().to_string())) + .find(|text| !text.is_empty()) .ok_or_else(|| anyhow::anyhow!("No response from Anthropic")) } @@ -1413,6 +1414,36 @@ mod tests { assert!(result.usage.is_none()); } + #[test] + fn parse_text_response_ignores_empty_and_whitespace_text_blocks() { + let json = r#"{ + "content": [ + {"type": "text", "text": ""}, + {"type": "text", "text": " \n "}, + {"type": "text", "text": " final answer "} + ] + }"#; + let response: ChatResponse = serde_json::from_str(json).unwrap(); + + let parsed = AnthropicProvider::parse_text_response(response).unwrap(); + assert_eq!(parsed, "final answer"); + } + + #[test] + fn parse_text_response_rejects_empty_or_whitespace_only_text_blocks() { + let json = r#"{ + "content": [ + {"type": "text", "text": ""}, + {"type": "text", "text": " \n "}, + {"type": "tool_use", "id": "tool_1", "name": "shell"} + ] + }"#; + let response: ChatResponse = serde_json::from_str(json).unwrap(); + + let err = AnthropicProvider::parse_text_response(response).unwrap_err(); + assert!(err.to_string().contains("No response from Anthropic")); + } + #[test] fn capabilities_reports_vision_and_native_tool_calling() { let provider = AnthropicProvider::new(Some("test-key")); From 32172f56da27fd6a67baf811e383deb4b8cb6b8c Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Sun, 1 Mar 2026 14:11:17 -0500 Subject: [PATCH 03/17] style(onboard): apply rustfmt in provider fallback assertions --- src/onboard/wizard.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/onboard/wizard.rs b/src/onboard/wizard.rs index 42ec5b8f4..4beb42016 100644 --- a/src/onboard/wizard.rs +++ b/src/onboard/wizard.rs @@ -8615,8 +8615,14 @@ mod tests { &["ANTHROPIC_OAUTH_TOKEN"] ); assert_eq!(provider_env_var_fallbacks("gemini"), &["GOOGLE_API_KEY"]); - assert_eq!(provider_env_var_fallbacks("minimax"), &["MINIMAX_OAUTH_TOKEN"]); - assert_eq!(provider_env_var_fallbacks("volcengine"), &["DOUBAO_API_KEY"]); + assert_eq!( + provider_env_var_fallbacks("minimax"), + &["MINIMAX_OAUTH_TOKEN"] + ); + assert_eq!( + provider_env_var_fallbacks("volcengine"), + &["DOUBAO_API_KEY"] + ); } #[tokio::test] From 890b5b86a9b844c54788156be5ae14a2cf12d55e Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Sun, 1 Mar 2026 13:31:33 -0500 Subject: [PATCH 04/17] fix(compatible): preserve native tool-call message sequencing --- src/providers/compatible.rs | 319 ++++++++++++++++++++++++++---------- 1 file changed, 231 insertions(+), 88 deletions(-) diff --git a/src/providers/compatible.rs b/src/providers/compatible.rs index 10fb97be4..be4cefc50 100644 --- a/src/providers/compatible.rs +++ b/src/providers/compatible.rs @@ -16,6 +16,7 @@ use reqwest::{ }; use serde::{Deserialize, Serialize}; use serde_json::Value; +use std::collections::HashSet; use tokio_tungstenite::{ connect_async, tungstenite::{ @@ -1618,90 +1619,173 @@ impl OpenAiCompatibleProvider { messages: &[ChatMessage], allow_user_image_parts: bool, ) -> Vec { - messages - .iter() - .map(|message| { - if message.role == "assistant" { - if let Ok(value) = serde_json::from_str::(&message.content) - { - if let Some(tool_calls_value) = value.get("tool_calls") { - if let Ok(parsed_calls) = - serde_json::from_value::>( - tool_calls_value.clone(), - ) - { - let tool_calls = parsed_calls - .into_iter() - .map(|tc| ToolCall { - id: Some(tc.id), - kind: Some("function".to_string()), - function: Some(Function { - name: Some(tc.name), - arguments: Some(tc.arguments), - }), - name: None, - arguments: None, - parameters: None, - }) - .collect::>(); + let mut native_messages = Vec::with_capacity(messages.len()); + let mut assistant_tool_call_ids = HashSet::new(); - let content = value - .get("content") - .and_then(serde_json::Value::as_str) - .map(|value| MessageContent::Text(value.to_string())); - - let reasoning_content = value - .get("reasoning_content") - .and_then(serde_json::Value::as_str) - .map(ToString::to_string); - - return NativeMessage { - role: "assistant".to_string(), - content, - tool_call_id: None, - tool_calls: Some(tool_calls), - reasoning_content, - }; + for message in messages { + if message.role == "assistant" { + if let Ok(value) = serde_json::from_str::(&message.content) { + if let Some(tool_calls) = Self::parse_history_tool_calls(&value) { + for call in &tool_calls { + if let Some(id) = call.id.as_ref() { + assistant_tool_call_ids.insert(id.clone()); } } - } - } - if message.role == "tool" { - if let Ok(value) = serde_json::from_str::(&message.content) { - let tool_call_id = value - .get("tool_call_id") - .and_then(serde_json::Value::as_str) - .map(ToString::to_string); + // Some OpenAI-compatible providers (including NVIDIA NIM models) + // reject assistant tool-call messages if `content` is omitted. let content = value .get("content") .and_then(serde_json::Value::as_str) - .map(|value| MessageContent::Text(value.to_string())) - .or_else(|| Some(MessageContent::Text(message.content.clone()))); + .map(ToString::to_string) + .unwrap_or_default(); - return NativeMessage { - role: "tool".to_string(), - content, - tool_call_id, - tool_calls: None, - reasoning_content: None, - }; + let reasoning_content = value + .get("reasoning_content") + .and_then(serde_json::Value::as_str) + .map(ToString::to_string); + + native_messages.push(NativeMessage { + role: "assistant".to_string(), + content: Some(MessageContent::Text(content)), + tool_call_id: None, + tool_calls: Some(tool_calls), + reasoning_content, + }); + continue; } } + } - NativeMessage { - role: message.role.clone(), - content: Some(Self::to_message_content( - &message.role, - &message.content, - allow_user_image_parts, - )), - tool_call_id: None, - tool_calls: None, - reasoning_content: None, + if message.role == "tool" { + if let Ok(value) = serde_json::from_str::(&message.content) { + let tool_call_id = value + .get("tool_call_id") + .or_else(|| value.get("tool_use_id")) + .or_else(|| value.get("toolUseId")) + .or_else(|| value.get("id")) + .and_then(serde_json::Value::as_str) + .map(ToString::to_string); + + let content_text = value + .get("content") + .and_then(serde_json::Value::as_str) + .map(ToString::to_string) + .unwrap_or_else(|| message.content.clone()); + + if let Some(id) = tool_call_id { + if assistant_tool_call_ids.contains(&id) { + native_messages.push(NativeMessage { + role: "tool".to_string(), + content: Some(MessageContent::Text(content_text)), + tool_call_id: Some(id), + tool_calls: None, + reasoning_content: None, + }); + continue; + } + + tracing::warn!( + tool_call_id = %id, + "Dropping orphan tool-role message; no matching assistant tool_call in history" + ); + } else { + tracing::warn!( + "Dropping tool-role message missing tool_call_id; preserving as user text fallback" + ); + } + + native_messages.push(NativeMessage { + role: "user".to_string(), + content: Some(MessageContent::Text(format!( + "[Tool result]\n{}", + content_text + ))), + tool_call_id: None, + tool_calls: None, + reasoning_content: None, + }); + continue; } - }) - .collect() + } + + native_messages.push(NativeMessage { + role: message.role.clone(), + content: Some(Self::to_message_content( + &message.role, + &message.content, + allow_user_image_parts, + )), + tool_call_id: None, + tool_calls: None, + reasoning_content: None, + }); + } + + native_messages + } + + fn parse_history_tool_calls(value: &serde_json::Value) -> Option> { + let tool_calls_value = value.get("tool_calls")?; + + if let Ok(parsed_calls) = + serde_json::from_value::>(tool_calls_value.clone()) + { + let tool_calls = parsed_calls + .into_iter() + .map(|tc| ToolCall { + id: Some(tc.id), + kind: Some("function".to_string()), + function: Some(Function { + name: Some(tc.name), + arguments: Some(Self::normalize_tool_arguments(tc.arguments)), + }), + name: None, + arguments: None, + parameters: None, + }) + .collect::>(); + if !tool_calls.is_empty() { + return Some(tool_calls); + } + } + + if let Ok(parsed_calls) = serde_json::from_value::>(tool_calls_value.clone()) + { + let mut normalized_calls = Vec::with_capacity(parsed_calls.len()); + for call in parsed_calls { + let Some(name) = call.function_name() else { + continue; + }; + let arguments = call + .function_arguments() + .unwrap_or_else(|| "{}".to_string()); + normalized_calls.push(ToolCall { + id: Some(call.id.unwrap_or_else(|| uuid::Uuid::new_v4().to_string())), + kind: Some("function".to_string()), + function: Some(Function { + name: Some(name), + arguments: Some(Self::normalize_tool_arguments(arguments)), + }), + name: None, + arguments: None, + parameters: None, + }); + } + if !normalized_calls.is_empty() { + return Some(normalized_calls); + } + } + + None + } + + fn normalize_tool_arguments(arguments: String) -> String { + if serde_json::from_str::(&arguments).is_ok() { + arguments + } else { + "{}".to_string() + } } fn with_prompt_guided_tool_instructions( @@ -1741,17 +1825,14 @@ impl OpenAiCompatibleProvider { .filter_map(|tc| { let name = tc.function_name()?; let arguments = tc.function_arguments().unwrap_or_else(|| "{}".to_string()); - let normalized_arguments = - if serde_json::from_str::(&arguments).is_ok() { - arguments - } else { - tracing::warn!( - function = %name, - arguments = %arguments, - "Invalid JSON in native tool-call arguments, using empty object" - ); - "{}".to_string() - }; + let normalized_arguments = Self::normalize_tool_arguments(arguments.clone()); + if normalized_arguments == "{}" && arguments != "{}" { + tracing::warn!( + function = %name, + arguments = %arguments, + "Invalid JSON in native tool-call arguments, using empty object" + ); + } Some(ProviderToolCall { id: tc.id.unwrap_or_else(|| uuid::Uuid::new_v4().to_string()), name, @@ -3381,18 +3462,80 @@ mod tests { #[test] fn convert_messages_for_native_maps_tool_result_payload() { - let input = vec![ChatMessage::tool( - r#"{"tool_call_id":"call_abc","content":"done"}"#, + let input = vec![ + ChatMessage::assistant( + r#"{"content":"","tool_calls":[{"id":"call_abc","name":"shell","arguments":"{}"}]}"#, + ), + ChatMessage::tool(r#"{"tool_call_id":"call_abc","content":"done"}"#), + ]; + + let converted = OpenAiCompatibleProvider::convert_messages_for_native(&input, true); + assert_eq!(converted.len(), 2); + assert_eq!(converted[1].role, "tool"); + assert_eq!(converted[1].tool_call_id.as_deref(), Some("call_abc")); + assert!(matches!( + converted[1].content.as_ref(), + Some(MessageContent::Text(value)) if value == "done" + )); + } + + #[test] + fn convert_messages_for_native_parses_openai_style_assistant_tool_calls() { + let input = vec![ChatMessage::assistant( + r#"{ + "content": null, + "tool_calls": [{ + "id": "call_openai_1", + "type": "function", + "function": { + "name": "shell", + "arguments": "{\"command\":\"pwd\"}" + } + }] + }"#, )]; let converted = OpenAiCompatibleProvider::convert_messages_for_native(&input, true); assert_eq!(converted.len(), 1); - assert_eq!(converted[0].role, "tool"); - assert_eq!(converted[0].tool_call_id.as_deref(), Some("call_abc")); + assert_eq!(converted[0].role, "assistant"); assert!(matches!( converted[0].content.as_ref(), - Some(MessageContent::Text(value)) if value == "done" + Some(MessageContent::Text(value)) if value.is_empty() )); + + let calls = converted[0] + .tool_calls + .as_ref() + .expect("assistant message should include tool_calls"); + assert_eq!(calls.len(), 1); + assert_eq!(calls[0].id.as_deref(), Some("call_openai_1")); + assert!(matches!( + calls[0].function.as_ref().and_then(|f| f.name.as_deref()), + Some("shell") + )); + assert!(matches!( + calls[0] + .function + .as_ref() + .and_then(|f| f.arguments.as_deref()), + Some("{\"command\":\"pwd\"}") + )); + } + + #[test] + fn convert_messages_for_native_rewrites_orphan_tool_message_as_user() { + let input = vec![ChatMessage::tool( + r#"{"tool_call_id":"call_missing","content":"done"}"#, + )]; + + let converted = OpenAiCompatibleProvider::convert_messages_for_native(&input, true); + assert_eq!(converted.len(), 1); + assert_eq!(converted[0].role, "user"); + assert!(matches!( + converted[0].content.as_ref(), + Some(MessageContent::Text(value)) if value.contains("[Tool result]") && value.contains("done") + )); + assert!(converted[0].tool_call_id.is_none()); } #[test] From c479ea7b1025194e2763b52216ed7d1dc4ac424c Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Sun, 1 Mar 2026 14:56:08 -0500 Subject: [PATCH 05/17] fix(mcp): support streamable HTTP headers and SSE responses --- src/tools/mcp_transport.rs | 127 +++++++++++++++++++++++++++++++++---- 1 file changed, 114 insertions(+), 13 deletions(-) diff --git a/src/tools/mcp_transport.rs b/src/tools/mcp_transport.rs index 27398451c..cc98c3c78 100644 --- a/src/tools/mcp_transport.rs +++ b/src/tools/mcp_transport.rs @@ -18,6 +18,12 @@ const MAX_LINE_BYTES: usize = 4 * 1024 * 1024; // 4 MB /// Timeout for init/list operations. const RECV_TIMEOUT_SECS: u64 = 30; +/// Streamable HTTP Accept header required by MCP HTTP transport. +const MCP_STREAMABLE_ACCEPT: &str = "application/json, text/event-stream"; + +/// Default media type for MCP JSON-RPC request bodies. +const MCP_JSON_CONTENT_TYPE: &str = "application/json"; + // ── Transport Trait ────────────────────────────────────────────────────── /// Abstract transport for MCP communication. @@ -171,10 +177,25 @@ impl McpTransportConn for HttpTransport { async fn send_and_recv(&mut self, request: &JsonRpcRequest) -> Result { let body = serde_json::to_string(request)?; + let has_accept = self + .headers + .keys() + .any(|k| k.eq_ignore_ascii_case("Accept")); + let has_content_type = self + .headers + .keys() + .any(|k| k.eq_ignore_ascii_case("Content-Type")); + let mut req = self.client.post(&self.url).body(body); + if !has_content_type { + req = req.header("Content-Type", MCP_JSON_CONTENT_TYPE); + } for (key, value) in &self.headers { req = req.header(key, value); } + if !has_accept { + req = req.header("Accept", MCP_STREAMABLE_ACCEPT); + } let resp = req .send() @@ -194,11 +215,24 @@ impl McpTransportConn for HttpTransport { }); } - let resp_text = resp.text().await.context("failed to read HTTP response")?; - let mcp_resp: JsonRpcResponse = serde_json::from_str(&resp_text) - .with_context(|| format!("invalid JSON-RPC response: {}", resp_text))?; + let is_sse = resp + .headers() + .get(reqwest::header::CONTENT_TYPE) + .and_then(|v| v.to_str().ok()) + .is_some_and(|v| v.to_ascii_lowercase().contains("text/event-stream")); + if is_sse { + let maybe_resp = timeout( + Duration::from_secs(RECV_TIMEOUT_SECS), + read_first_jsonrpc_from_sse_response(resp), + ) + .await + .context("timeout waiting for MCP response from streamable HTTP SSE stream")??; + return maybe_resp + .ok_or_else(|| anyhow!("MCP server returned no response in SSE stream")); + } - Ok(mcp_resp) + let resp_text = resp.text().await.context("failed to read HTTP response")?; + parse_jsonrpc_response_text(&resp_text) } async fn close(&mut self) -> Result<()> { @@ -264,14 +298,21 @@ impl SseTransport { } } + let has_accept = self + .headers + .keys() + .any(|k| k.eq_ignore_ascii_case("Accept")); + let mut req = self .client .get(&self.sse_url) - .header("Accept", "text/event-stream") .header("Cache-Control", "no-cache"); for (key, value) in &self.headers { req = req.header(key, value); } + if !has_accept { + req = req.header("Accept", MCP_STREAMABLE_ACCEPT); + } let resp = req.send().await.context("SSE GET to MCP server failed")?; if resp.status() == reqwest::StatusCode::NOT_FOUND @@ -556,6 +597,30 @@ fn extract_json_from_sse_text(resp_text: &str) -> Cow<'_, str> { Cow::Owned(joined.trim().to_string()) } +fn parse_jsonrpc_response_text(resp_text: &str) -> Result { + let trimmed = resp_text.trim(); + if trimmed.is_empty() { + bail!("MCP server returned no response"); + } + + let json_text = if looks_like_sse_text(trimmed) { + extract_json_from_sse_text(trimmed) + } else { + Cow::Borrowed(trimmed) + }; + + let mcp_resp: JsonRpcResponse = serde_json::from_str(json_text.as_ref()) + .with_context(|| format!("invalid JSON-RPC response: {}", resp_text))?; + Ok(mcp_resp) +} + +fn looks_like_sse_text(text: &str) -> bool { + text.starts_with("data:") + || text.starts_with("event:") + || text.contains("\ndata:") + || text.contains("\nevent:") +} + async fn read_first_jsonrpc_from_sse_response( resp: reqwest::Response, ) -> Result> { @@ -673,21 +738,27 @@ impl McpTransportConn for SseTransport { .chain(secondary_url.into_iter()) .enumerate() { + let has_accept = self + .headers + .keys() + .any(|k| k.eq_ignore_ascii_case("Accept")); + let has_content_type = self + .headers + .keys() + .any(|k| k.eq_ignore_ascii_case("Content-Type")); let mut req = self .client .post(&url) .timeout(Duration::from_secs(120)) - .body(body.clone()) - .header("Content-Type", "application/json"); + .body(body.clone()); + if !has_content_type { + req = req.header("Content-Type", MCP_JSON_CONTENT_TYPE); + } for (key, value) in &self.headers { req = req.header(key, value); } - if !self - .headers - .keys() - .any(|k| k.eq_ignore_ascii_case("Accept")) - { - req = req.header("Accept", "application/json, text/event-stream"); + if !has_accept { + req = req.header("Accept", MCP_STREAMABLE_ACCEPT); } let resp = req.send().await.context("SSE POST to MCP server failed")?; @@ -887,4 +958,34 @@ mod tests { let extracted = extract_json_from_sse_text(input); let _: JsonRpcResponse = serde_json::from_str(extracted.as_ref()).unwrap(); } + + #[test] + fn test_parse_jsonrpc_response_text_handles_plain_json() { + let parsed = parse_jsonrpc_response_text("{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":{}}") + .expect("plain JSON response should parse"); + assert_eq!(parsed.id, Some(serde_json::json!(1))); + assert!(parsed.error.is_none()); + } + + #[test] + fn test_parse_jsonrpc_response_text_handles_sse_framed_json() { + let sse = + "event: message\ndata: {\"jsonrpc\":\"2.0\",\"id\":2,\"result\":{\"ok\":true}}\n\n"; + let parsed = + parse_jsonrpc_response_text(sse).expect("SSE-framed JSON response should parse"); + assert_eq!(parsed.id, Some(serde_json::json!(2))); + assert_eq!( + parsed + .result + .as_ref() + .and_then(|v| v.get("ok")) + .and_then(|v| v.as_bool()), + Some(true) + ); + } + + #[test] + fn test_parse_jsonrpc_response_text_rejects_empty_payload() { + assert!(parse_jsonrpc_response_text(" \n\t ").is_err()); + } } From f7b6295e9b3b904267b0f9201682d2ca385ae5da Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Sun, 1 Mar 2026 14:56:09 -0500 Subject: [PATCH 06/17] feat(agent): expose tool_specs and public run_tool_call_loop --- src/agent/agent.rs | 4 ++++ src/agent/loop_.rs | 2 +- src/agent/mod.rs | 2 +- src/agent/tests.rs | 14 ++++++++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/agent/agent.rs b/src/agent/agent.rs index d286ffc0b..767b59eac 100644 --- a/src/agent/agent.rs +++ b/src/agent/agent.rs @@ -243,6 +243,10 @@ impl Agent { AgentBuilder::new() } + pub fn tool_specs(&self) -> &[ToolSpec] { + &self.tool_specs + } + pub fn history(&self) -> &[ConversationMessage] { &self.history } diff --git a/src/agent/loop_.rs b/src/agent/loop_.rs index 568facfac..3f8feda24 100644 --- a/src/agent/loop_.rs +++ b/src/agent/loop_.rs @@ -983,7 +983,7 @@ pub(crate) async fn run_tool_call_loop_with_non_cli_approval_context( /// Execute a single turn of the agent loop: send messages, parse tool calls, /// execute tools, and loop until the LLM produces a final text response. #[allow(clippy::too_many_arguments)] -pub(crate) async fn run_tool_call_loop( +pub async fn run_tool_call_loop( provider: &dyn Provider, history: &mut Vec, tools_registry: &[Box], diff --git a/src/agent/mod.rs b/src/agent/mod.rs index a5d818fe1..2ef2e0568 100644 --- a/src/agent/mod.rs +++ b/src/agent/mod.rs @@ -16,4 +16,4 @@ mod tests; #[allow(unused_imports)] pub use agent::{Agent, AgentBuilder}; #[allow(unused_imports)] -pub use loop_::{process_message, process_message_with_session, run}; +pub use loop_::{process_message, process_message_with_session, run, run_tool_call_loop}; diff --git a/src/agent/tests.rs b/src/agent/tests.rs index e59999411..978bdfe72 100644 --- a/src/agent/tests.rs +++ b/src/agent/tests.rs @@ -736,6 +736,20 @@ async fn native_dispatcher_sends_tool_specs() { assert!(dispatcher.should_send_tool_specs()); } +#[test] +fn agent_tool_specs_accessor_exposes_registered_tools() { + let provider = Box::new(ScriptedProvider::new(vec![text_response("ok")])); + let agent = build_agent_with( + provider, + vec![Box::new(EchoTool)], + Box::new(NativeToolDispatcher), + ); + + let specs = agent.tool_specs(); + assert_eq!(specs.len(), 1); + assert_eq!(specs[0].name, "echo"); +} + #[tokio::test] async fn xml_dispatcher_does_not_send_tool_specs() { let dispatcher = XmlToolDispatcher; From 09d32dcd79a802483813fd8f56c56f8c5a1b9ad6 Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Sun, 1 Mar 2026 12:52:46 -0500 Subject: [PATCH 07/17] feat(security): add context-aware command allow rules --- docs/config-reference.md | 17 ++ src/config/mod.rs | 13 +- src/config/schema.rs | 164 +++++++++++ src/security/policy.rs | 617 ++++++++++++++++++++++++++++++++------- 4 files changed, 695 insertions(+), 116 deletions(-) diff --git a/docs/config-reference.md b/docs/config-reference.md index a1eaa88ff..873ed2e60 100644 --- a/docs/config-reference.md +++ b/docs/config-reference.md @@ -857,6 +857,7 @@ Environment overrides: | `level` | `supervised` | `read_only`, `supervised`, or `full` | | `workspace_only` | `true` | reject absolute path inputs unless explicitly disabled | | `allowed_commands` | _required for shell execution_ | allowlist of executable names, explicit executable paths, or `"*"` | +| `command_context_rules` | `[]` | per-command context-aware allow/deny rules (domain/path constraints, optional high-risk override) | | `forbidden_paths` | built-in protected list | explicit path denylist (system paths + sensitive dotdirs by default) | | `allowed_roots` | `[]` | additional roots allowed outside workspace after canonicalization | | `max_actions_per_hour` | `20` | per-policy action budget | @@ -878,6 +879,10 @@ Notes: - Access outside the workspace requires `allowed_roots`, even when `workspace_only = false`. - `allowed_roots` supports absolute paths, `~/...`, and workspace-relative paths. - `allowed_commands` entries can be command names (for example, `"git"`), explicit executable paths (for example, `"/usr/bin/antigravity"`), or `"*"` to allow any command name/path (risk gates still apply). +- `command_context_rules` can narrow or override `allowed_commands` for matching commands: + - `action = "allow"` rules are restrictive when present for a command: at least one allow rule must match. + - `action = "deny"` rules explicitly block matching contexts. + - `allow_high_risk = true` allows a matching high-risk command to pass the hard block, but supervised mode still requires `approved=true`. - `file_read` blocks sensitive secret-bearing files/directories by default. Set `allow_sensitive_file_reads = true` only for controlled debugging sessions. - `file_write` and `file_edit` block sensitive secret-bearing files/directories by default. Set `allow_sensitive_file_writes = true` only for controlled break-glass sessions. - `file_read`, `file_write`, and `file_edit` refuse multiply-linked files (hard-link guard) to reduce workspace path bypass risk via hard-link escapes. @@ -912,6 +917,18 @@ Notes: workspace_only = false forbidden_paths = ["/etc", "/root", "/proc", "/sys", "~/.ssh", "~/.gnupg", "~/.aws"] allowed_roots = ["~/Desktop/projects", "/opt/shared-repo"] + +[[autonomy.command_context_rules]] +command = "curl" +action = "allow" +allowed_domains = ["api.github.com", "*.example.internal"] +allow_high_risk = true + +[[autonomy.command_context_rules]] +command = "rm" +action = "allow" +allowed_path_prefixes = ["/tmp"] +allow_high_risk = true ``` ## `[memory]` diff --git a/src/config/mod.rs b/src/config/mod.rs index 24025a15c..2b5bf39c3 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -10,12 +10,13 @@ pub use schema::{ AckReactionRuleConfig, AckReactionStrategy, AgentConfig, AgentSessionBackend, AgentSessionConfig, AgentSessionStrategy, AgentsIpcConfig, AuditConfig, AutonomyConfig, BrowserComputerUseConfig, BrowserConfig, BuiltinHooksConfig, ChannelsConfig, - ClassificationRule, ComposioConfig, Config, CoordinationConfig, CostConfig, CronConfig, - DelegateAgentConfig, DiscordConfig, DockerRuntimeConfig, EconomicConfig, EconomicTokenPricing, - EmbeddingRouteConfig, EstopConfig, FeishuConfig, GatewayConfig, GroupReplyConfig, - GroupReplyMode, HardwareConfig, HardwareTransport, HeartbeatConfig, HooksConfig, - HttpRequestConfig, HttpRequestCredentialProfile, IMessageConfig, IdentityConfig, LarkConfig, - MatrixConfig, MemoryConfig, ModelRouteConfig, MultimodalConfig, NextcloudTalkConfig, + ClassificationRule, CommandContextRuleAction, CommandContextRuleConfig, ComposioConfig, Config, + CoordinationConfig, CostConfig, CronConfig, DelegateAgentConfig, DiscordConfig, + DockerRuntimeConfig, EconomicConfig, EconomicTokenPricing, EmbeddingRouteConfig, EstopConfig, + FeishuConfig, GatewayConfig, GroupReplyConfig, GroupReplyMode, HardwareConfig, + HardwareTransport, HeartbeatConfig, HooksConfig, HttpRequestConfig, + HttpRequestCredentialProfile, IMessageConfig, IdentityConfig, LarkConfig, MatrixConfig, + MemoryConfig, ModelRouteConfig, MultimodalConfig, NextcloudTalkConfig, NonCliNaturalLanguageApprovalMode, ObservabilityConfig, OtpChallengeDelivery, OtpConfig, OtpMethod, OutboundLeakGuardAction, OutboundLeakGuardConfig, PeripheralBoardConfig, PeripheralsConfig, PerplexityFilterConfig, PluginEntryConfig, PluginsConfig, ProgressMode, diff --git a/src/config/schema.rs b/src/config/schema.rs index 349f97a79..b1c5ea355 100644 --- a/src/config/schema.rs +++ b/src/config/schema.rs @@ -3135,6 +3135,67 @@ pub enum NonCliNaturalLanguageApprovalMode { Direct, } +/// Action to apply when a command-context rule matches. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum CommandContextRuleAction { + /// Matching context is explicitly allowed. + #[default] + Allow, + /// Matching context is explicitly denied. + Deny, +} + +/// Context-aware allow/deny rule for shell commands. +/// +/// Rules are evaluated per command segment. Command matching accepts command +/// names (`curl`), explicit paths (`/usr/bin/curl`), and wildcard (`*`). +/// +/// Matching semantics: +/// - `action = "deny"`: if all constraints match, the segment is rejected. +/// - `action = "allow"`: if at least one allow rule exists for a command, +/// segments must match at least one of those allow rules. +/// +/// Constraints are optional: +/// - `allowed_domains`: require URL arguments to match these hosts/patterns. +/// - `allowed_path_prefixes`: require path-like arguments to stay under these prefixes. +/// - `denied_path_prefixes`: for deny rules, match when any path-like argument +/// is under these prefixes; for allow rules, require path arguments not to hit +/// these prefixes. +#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, Default)] +pub struct CommandContextRuleConfig { + /// Command name/path pattern (`git`, `/usr/bin/curl`, or `*`). + pub command: String, + + /// Rule action (`allow` | `deny`). Defaults to `allow`. + #[serde(default)] + pub action: CommandContextRuleAction, + + /// Allowed host patterns for URL arguments. + /// + /// Supports exact hosts (`api.example.com`) and wildcard suffixes (`*.example.com`). + #[serde(default)] + pub allowed_domains: Vec, + + /// Allowed path prefixes for path-like arguments. + /// + /// Prefixes may be absolute, `~/...`, or workspace-relative. + #[serde(default)] + pub allowed_path_prefixes: Vec, + + /// Denied path prefixes for path-like arguments. + /// + /// Prefixes may be absolute, `~/...`, or workspace-relative. + #[serde(default)] + pub denied_path_prefixes: Vec, + + /// Permit high-risk commands when this allow rule matches. + /// + /// The command still requires explicit `approved=true` in supervised mode. + #[serde(default)] + pub allow_high_risk: bool, +} + /// Autonomy and security policy configuration (`[autonomy]` section). /// /// Controls what the agent is allowed to do: shell commands, filesystem access, @@ -3148,6 +3209,13 @@ pub struct AutonomyConfig { pub workspace_only: bool, /// Allowlist of executable names permitted for shell execution. pub allowed_commands: Vec, + + /// Context-aware shell command allow/deny rules. + /// + /// These rules are evaluated per command segment and can narrow or override + /// global `allowed_commands` behavior for matching commands. + #[serde(default)] + pub command_context_rules: Vec, /// Explicit path denylist. Default includes system-critical paths and sensitive dotdirs. pub forbidden_paths: Vec, /// Maximum actions allowed per hour per policy. Default: `100`. @@ -3310,6 +3378,7 @@ impl Default for AutonomyConfig { "tail".into(), "date".into(), ], + command_context_rules: Vec::new(), forbidden_paths: vec![ "/etc".into(), "/root".into(), @@ -7515,6 +7584,61 @@ impl Config { ); } } + for (i, rule) in self.autonomy.command_context_rules.iter().enumerate() { + let command = rule.command.trim(); + if command.is_empty() { + anyhow::bail!("autonomy.command_context_rules[{i}].command must not be empty"); + } + if !command + .chars() + .all(|c| c.is_ascii_alphanumeric() || matches!(c, '_' | '-' | '/' | '.' | '*')) + { + anyhow::bail!( + "autonomy.command_context_rules[{i}].command contains invalid characters: {command}" + ); + } + + for (j, domain) in rule.allowed_domains.iter().enumerate() { + let normalized = domain.trim(); + if normalized.is_empty() { + anyhow::bail!( + "autonomy.command_context_rules[{i}].allowed_domains[{j}] must not be empty" + ); + } + if normalized.chars().any(char::is_whitespace) { + anyhow::bail!( + "autonomy.command_context_rules[{i}].allowed_domains[{j}] must not contain whitespace" + ); + } + } + + for (j, prefix) in rule.allowed_path_prefixes.iter().enumerate() { + let normalized = prefix.trim(); + if normalized.is_empty() { + anyhow::bail!( + "autonomy.command_context_rules[{i}].allowed_path_prefixes[{j}] must not be empty" + ); + } + if normalized.contains('\0') { + anyhow::bail!( + "autonomy.command_context_rules[{i}].allowed_path_prefixes[{j}] must not contain null bytes" + ); + } + } + for (j, prefix) in rule.denied_path_prefixes.iter().enumerate() { + let normalized = prefix.trim(); + if normalized.is_empty() { + anyhow::bail!( + "autonomy.command_context_rules[{i}].denied_path_prefixes[{j}] must not be empty" + ); + } + if normalized.contains('\0') { + anyhow::bail!( + "autonomy.command_context_rules[{i}].denied_path_prefixes[{j}] must not contain null bytes" + ); + } + } + } let mut seen_non_cli_excluded = std::collections::HashSet::new(); for (i, tool_name) in self.autonomy.non_cli_excluded_tools.iter().enumerate() { let normalized = tool_name.trim(); @@ -9299,6 +9423,7 @@ mod tests { assert!(a.require_approval_for_medium_risk); assert!(a.block_high_risk_commands); assert!(a.shell_env_passthrough.is_empty()); + assert!(a.command_context_rules.is_empty()); assert!(!a.allow_sensitive_file_reads); assert!(!a.allow_sensitive_file_writes); assert!(a.non_cli_excluded_tools.contains(&"shell".to_string())); @@ -9330,12 +9455,50 @@ allowed_roots = [] !parsed.allow_sensitive_file_writes, "Missing allow_sensitive_file_writes must default to false" ); + assert!( + parsed.command_context_rules.is_empty(), + "Missing command_context_rules must default to empty" + ); assert!(parsed.non_cli_excluded_tools.contains(&"shell".to_string())); assert!(parsed .non_cli_excluded_tools .contains(&"browser".to_string())); } + #[test] + async fn config_validate_rejects_invalid_command_context_rule_command() { + let mut cfg = Config::default(); + cfg.autonomy.command_context_rules = vec![CommandContextRuleConfig { + command: "curl;rm".into(), + action: CommandContextRuleAction::Allow, + allowed_domains: vec![], + allowed_path_prefixes: vec![], + denied_path_prefixes: vec![], + allow_high_risk: false, + }]; + let err = cfg.validate().unwrap_err(); + assert!(err + .to_string() + .contains("autonomy.command_context_rules[0].command")); + } + + #[test] + async fn config_validate_rejects_empty_command_context_rule_domain() { + let mut cfg = Config::default(); + cfg.autonomy.command_context_rules = vec![CommandContextRuleConfig { + command: "curl".into(), + action: CommandContextRuleAction::Allow, + allowed_domains: vec![" ".into()], + allowed_path_prefixes: vec![], + denied_path_prefixes: vec![], + allow_high_risk: true, + }]; + let err = cfg.validate().unwrap_err(); + assert!(err + .to_string() + .contains("autonomy.command_context_rules[0].allowed_domains[0]")); + } + #[test] async fn config_validate_rejects_duplicate_non_cli_excluded_tools() { let mut cfg = Config::default(); @@ -9531,6 +9694,7 @@ ws_url = "ws://127.0.0.1:3002" level: AutonomyLevel::Full, workspace_only: false, allowed_commands: vec!["docker".into()], + command_context_rules: vec![], forbidden_paths: vec!["/secret".into()], max_actions_per_hour: 50, max_cost_per_day_cents: 1000, diff --git a/src/security/policy.rs b/src/security/policy.rs index ce883a40b..31335942f 100644 --- a/src/security/policy.rs +++ b/src/security/policy.rs @@ -1,4 +1,5 @@ use parking_lot::Mutex; +use reqwest::Url; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use std::path::{Path, PathBuf}; @@ -47,6 +48,24 @@ pub enum ToolOperation { Act, } +/// Action applied when a command context rule matches. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum CommandContextRuleAction { + Allow, + Deny, +} + +/// Context-aware allow/deny rule for shell commands. +#[derive(Debug, Clone)] +pub struct CommandContextRule { + pub command: String, + pub action: CommandContextRuleAction, + pub allowed_domains: Vec, + pub allowed_path_prefixes: Vec, + pub denied_path_prefixes: Vec, + pub allow_high_risk: bool, +} + /// Sliding-window action tracker for rate limiting. #[derive(Debug)] pub struct ActionTracker { @@ -99,6 +118,7 @@ pub struct SecurityPolicy { pub workspace_dir: PathBuf, pub workspace_only: bool, pub allowed_commands: Vec, + pub command_context_rules: Vec, pub forbidden_paths: Vec, pub allowed_roots: Vec, pub max_actions_per_hour: u32, @@ -132,6 +152,7 @@ impl Default for SecurityPolicy { "tail".into(), "date".into(), ], + command_context_rules: Vec::new(), forbidden_paths: vec![ // System directories (blocked even when workspace_only=false) "/etc".into(), @@ -565,7 +586,366 @@ fn is_allowlist_entry_match(allowed: &str, executable: &str, executable_base: &s allowed == executable_base } +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum SegmentRuleDecision { + NoMatch, + Allow, + Deny, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +struct SegmentRuleOutcome { + decision: SegmentRuleDecision, + allow_high_risk: bool, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +struct CommandAllowlistEvaluation { + high_risk_overridden: bool, +} + +fn is_high_risk_base_command(base: &str) -> bool { + matches!( + base, + "rm" | "mkfs" + | "dd" + | "shutdown" + | "reboot" + | "halt" + | "poweroff" + | "sudo" + | "su" + | "chown" + | "chmod" + | "useradd" + | "userdel" + | "usermod" + | "passwd" + | "mount" + | "umount" + | "iptables" + | "ufw" + | "firewall-cmd" + | "curl" + | "wget" + | "nc" + | "ncat" + | "netcat" + | "scp" + | "ssh" + | "ftp" + | "telnet" + ) +} + impl SecurityPolicy { + fn path_matches_rule_prefix(&self, candidate: &str, prefix: &str) -> bool { + let candidate_path = expand_user_path(candidate); + let prefix_path = expand_user_path(prefix); + + let normalized_candidate = if candidate_path.is_absolute() { + candidate_path + } else { + self.workspace_dir.join(candidate_path) + }; + let normalized_prefix = if prefix_path.is_absolute() { + prefix_path + } else { + self.workspace_dir.join(prefix_path) + }; + + normalized_candidate.starts_with(&normalized_prefix) + } + + fn host_matches_pattern(host: &str, pattern: &str) -> bool { + let host = host.trim().to_ascii_lowercase(); + let pattern = pattern.trim().to_ascii_lowercase(); + if host.is_empty() || pattern.is_empty() { + return false; + } + + if let Some(suffix) = pattern.strip_prefix("*.") { + host == suffix || host.ends_with(&format!(".{suffix}")) + } else { + host == pattern + } + } + + fn extract_segment_url_hosts(args: &[&str]) -> Vec { + args.iter() + .filter_map(|token| { + let candidate = strip_wrapping_quotes(token) + .trim() + .trim_matches(|c: char| matches!(c, ',' | ';')); + if candidate.is_empty() { + return None; + } + Url::parse(candidate) + .ok() + .and_then(|url| url.host_str().map(|host| host.to_ascii_lowercase())) + }) + .collect() + } + + fn extract_segment_path_args(args: &[&str]) -> Vec { + let mut paths = Vec::new(); + + for token in args { + let candidate = strip_wrapping_quotes(token).trim(); + if candidate.is_empty() || candidate.contains("://") { + continue; + } + + if let Some(target) = redirection_target(candidate) { + let normalized = strip_wrapping_quotes(target).trim(); + if !normalized.is_empty() && looks_like_path(normalized) { + paths.push(normalized.to_string()); + } + } + + if candidate.starts_with('-') { + if let Some((_, value)) = candidate.split_once('=') { + let normalized = strip_wrapping_quotes(value).trim(); + if !normalized.is_empty() + && !normalized.contains("://") + && looks_like_path(normalized) + { + paths.push(normalized.to_string()); + } + } + + if let Some(value) = attached_short_option_value(candidate) { + let normalized = strip_wrapping_quotes(value).trim(); + if !normalized.is_empty() + && !normalized.contains("://") + && looks_like_path(normalized) + { + paths.push(normalized.to_string()); + } + } + + continue; + } + + if looks_like_path(candidate) { + paths.push(candidate.to_string()); + } + } + + paths + } + + fn rule_conditions_match(&self, rule: &CommandContextRule, args: &[&str]) -> bool { + if !rule.allowed_domains.is_empty() { + let hosts = Self::extract_segment_url_hosts(args); + if hosts.is_empty() { + return false; + } + if !hosts.iter().all(|host| { + rule.allowed_domains + .iter() + .any(|pattern| Self::host_matches_pattern(host, pattern)) + }) { + return false; + } + } + + let path_args = + if rule.allowed_path_prefixes.is_empty() && rule.denied_path_prefixes.is_empty() { + Vec::new() + } else { + Self::extract_segment_path_args(args) + }; + + if !rule.allowed_path_prefixes.is_empty() { + if path_args.is_empty() { + return false; + } + if !path_args.iter().all(|path| { + rule.allowed_path_prefixes + .iter() + .any(|prefix| self.path_matches_rule_prefix(path, prefix)) + }) { + return false; + } + } + + if !rule.denied_path_prefixes.is_empty() { + if path_args.is_empty() { + return false; + } + let has_denied_path = path_args.iter().any(|path| { + rule.denied_path_prefixes + .iter() + .any(|prefix| self.path_matches_rule_prefix(path, prefix)) + }); + match rule.action { + CommandContextRuleAction::Allow => { + if has_denied_path { + return false; + } + } + CommandContextRuleAction::Deny => { + if !has_denied_path { + return false; + } + } + } + } + + true + } + + fn evaluate_segment_context_rules( + &self, + executable: &str, + base_cmd: &str, + args: &[&str], + ) -> SegmentRuleOutcome { + let mut has_allow_rules = false; + let mut allow_match = false; + let mut allow_high_risk = false; + + for rule in &self.command_context_rules { + if !is_allowlist_entry_match(&rule.command, executable, base_cmd) { + continue; + } + + if matches!(rule.action, CommandContextRuleAction::Allow) { + has_allow_rules = true; + } + + if !self.rule_conditions_match(rule, args) { + continue; + } + + match rule.action { + CommandContextRuleAction::Deny => { + return SegmentRuleOutcome { + decision: SegmentRuleDecision::Deny, + allow_high_risk: false, + }; + } + CommandContextRuleAction::Allow => { + allow_match = true; + allow_high_risk |= rule.allow_high_risk; + } + } + } + + if has_allow_rules { + if allow_match { + SegmentRuleOutcome { + decision: SegmentRuleDecision::Allow, + allow_high_risk, + } + } else { + SegmentRuleOutcome { + decision: SegmentRuleDecision::Deny, + allow_high_risk: false, + } + } + } else { + SegmentRuleOutcome { + decision: SegmentRuleDecision::NoMatch, + allow_high_risk: false, + } + } + } + + fn evaluate_command_allowlist( + &self, + command: &str, + ) -> Result { + if self.autonomy == AutonomyLevel::ReadOnly { + return Err("readonly autonomy level blocks shell command execution".into()); + } + + if command.contains('`') + || contains_unquoted_shell_variable_expansion(command) + || command.contains("<(") + || command.contains(">(") + { + return Err("command contains disallowed shell expansion syntax".into()); + } + + if contains_unquoted_char(command, '>') || contains_unquoted_char(command, '<') { + return Err("command contains disallowed redirection syntax".into()); + } + + if command + .split_whitespace() + .any(|w| w == "tee" || w.ends_with("/tee")) + { + return Err("command contains disallowed tee usage".into()); + } + + if contains_unquoted_single_ampersand(command) { + return Err("command contains disallowed background chaining operator '&'".into()); + } + + let segments = split_unquoted_segments(command); + let mut has_cmd = false; + let mut saw_high_risk_segment = false; + let mut all_high_risk_segments_overridden = true; + + for segment in &segments { + let cmd_part = skip_env_assignments(segment); + let mut words = cmd_part.split_whitespace(); + let executable = strip_wrapping_quotes(words.next().unwrap_or("")).trim(); + let base_cmd = executable.rsplit('/').next().unwrap_or("").trim(); + + if base_cmd.is_empty() { + continue; + } + has_cmd = true; + + let args_raw: Vec<&str> = words.collect(); + let args_lower: Vec = args_raw.iter().map(|w| w.to_ascii_lowercase()).collect(); + + let context_outcome = + self.evaluate_segment_context_rules(executable, base_cmd, &args_raw); + if context_outcome.decision == SegmentRuleDecision::Deny { + return Err(format!("context rule denied command segment `{base_cmd}`")); + } + + if context_outcome.decision != SegmentRuleDecision::Allow + && !self + .allowed_commands + .iter() + .any(|allowed| is_allowlist_entry_match(allowed, executable, base_cmd)) + { + return Err(format!( + "command segment `{base_cmd}` is not present in allowed_commands" + )); + } + + if !self.is_args_safe(base_cmd, &args_lower) { + return Err(format!( + "command segment `{base_cmd}` contains unsafe arguments" + )); + } + + let base_lower = base_cmd.to_ascii_lowercase(); + if is_high_risk_base_command(&base_lower) { + saw_high_risk_segment = true; + if !(context_outcome.decision == SegmentRuleDecision::Allow + && context_outcome.allow_high_risk) + { + all_high_risk_segments_overridden = false; + } + } + } + + if !has_cmd { + return Err("command is empty after parsing".into()); + } + + Ok(CommandAllowlistEvaluation { + high_risk_overridden: saw_high_risk_segment && all_high_risk_segments_overridden, + }) + } + // ── Risk Classification ────────────────────────────────────────────── // Risk is assessed per-segment (split on shell operators), and the // highest risk across all segments wins. This prevents bypasses like @@ -592,37 +972,7 @@ impl SecurityPolicy { let joined_segment = cmd_part.to_ascii_lowercase(); // High-risk commands - if matches!( - base.as_str(), - "rm" | "mkfs" - | "dd" - | "shutdown" - | "reboot" - | "halt" - | "poweroff" - | "sudo" - | "su" - | "chown" - | "chmod" - | "useradd" - | "userdel" - | "usermod" - | "passwd" - | "mount" - | "umount" - | "iptables" - | "ufw" - | "firewall-cmd" - | "curl" - | "wget" - | "nc" - | "ncat" - | "netcat" - | "scp" - | "ssh" - | "ftp" - | "telnet" - ) { + if is_high_risk_base_command(base.as_str()) { return CommandRiskLevel::High; } @@ -693,9 +1043,9 @@ impl SecurityPolicy { command: &str, approved: bool, ) -> Result { - if !self.is_command_allowed(command) { - return Err(format!("Command not allowed by security policy: {command}")); - } + let allowlist_eval = self + .evaluate_command_allowlist(command) + .map_err(|reason| format!("Command not allowed by security policy: {reason}"))?; if let Some(path) = self.forbidden_path_argument(command) { return Err(format!("Path blocked by security policy: {path}")); @@ -704,7 +1054,7 @@ impl SecurityPolicy { let risk = self.command_risk_level(command); if risk == CommandRiskLevel::High { - if self.block_high_risk_commands { + if self.block_high_risk_commands && !allowlist_eval.high_risk_overridden { let lower = command.to_ascii_lowercase(); if lower.contains("curl") || lower.contains("wget") { return Err( @@ -750,81 +1100,7 @@ impl SecurityPolicy { /// - Blocks shell redirections (`<`, `>`, `>>`) that can bypass path policy /// - Blocks dangerous arguments (e.g. `find -exec`, `git config`) pub fn is_command_allowed(&self, command: &str) -> bool { - if self.autonomy == AutonomyLevel::ReadOnly { - return false; - } - - // Block subshell/expansion operators — these allow hiding arbitrary - // commands inside an allowed command (e.g. `echo $(rm -rf /)`) and - // bypassing path checks through variable indirection. The helper below - // ignores escapes and literals inside single quotes, so `$(` or `${` - // literals are permitted there. - if command.contains('`') - || contains_unquoted_shell_variable_expansion(command) - || command.contains("<(") - || command.contains(">(") - { - return false; - } - - // Block shell redirections (`<`, `>`, `>>`) — they can read/write - // arbitrary paths and bypass path checks. - // Ignore quoted literals, e.g. `echo "a>b"` and `echo "a') || contains_unquoted_char(command, '<') { - return false; - } - - // Block `tee` — it can write to arbitrary files, bypassing the - // redirect check above (e.g. `echo secret | tee /etc/crontab`) - if command - .split_whitespace() - .any(|w| w == "tee" || w.ends_with("/tee")) - { - return false; - } - - // Block background command chaining (`&`), which can hide extra - // sub-commands and outlive timeout expectations. Keep `&&` allowed. - if contains_unquoted_single_ampersand(command) { - return false; - } - - // Split on unquoted command separators and validate each sub-command. - let segments = split_unquoted_segments(command); - for segment in &segments { - // Strip leading env var assignments (e.g. FOO=bar cmd) - let cmd_part = skip_env_assignments(segment); - - let mut words = cmd_part.split_whitespace(); - let executable = strip_wrapping_quotes(words.next().unwrap_or("")).trim(); - let base_cmd = executable.rsplit('/').next().unwrap_or(""); - - if base_cmd.is_empty() { - continue; - } - - if !self - .allowed_commands - .iter() - .any(|allowed| is_allowlist_entry_match(allowed, executable, base_cmd)) - { - return false; - } - - // Validate arguments for the command - let args: Vec = words.map(|w| w.to_ascii_lowercase()).collect(); - if !self.is_args_safe(base_cmd, &args) { - return false; - } - } - - // At least one command must be present - let has_cmd = segments.iter().any(|s| { - let s = skip_env_assignments(s.trim()); - s.split_whitespace().next().is_some_and(|w| !w.is_empty()) - }); - - has_cmd + self.evaluate_command_allowlist(command).is_ok() } /// Check for dangerous arguments that allow sub-command execution. @@ -1214,6 +1490,11 @@ impl SecurityPolicy { format!("{} (others rejected)", shown.join(", ")) } }; + let context_rules = if self.command_context_rules.is_empty() { + "none".to_string() + } else { + format!("{} configured", self.command_context_rules.len()) + }; let high_risk = if self.block_high_risk_commands { "blocked" @@ -1226,6 +1507,7 @@ impl SecurityPolicy { - Workspace: {workspace} (workspace_only: {ws_only})\n\ - Forbidden paths: {forbidden_preview}\n\ - Allowed commands: {commands_preview}\n\ + - Command context rules: {context_rules}\n\ - High-risk commands: {high_risk}\n\ - Do not exfiltrate data, bypass approval, or run destructive commands without asking." ) @@ -1240,6 +1522,25 @@ impl SecurityPolicy { workspace_dir: workspace_dir.to_path_buf(), workspace_only: autonomy_config.workspace_only, allowed_commands: autonomy_config.allowed_commands.clone(), + command_context_rules: autonomy_config + .command_context_rules + .iter() + .map(|rule| CommandContextRule { + command: rule.command.clone(), + action: match rule.action { + crate::config::CommandContextRuleAction::Allow => { + CommandContextRuleAction::Allow + } + crate::config::CommandContextRuleAction::Deny => { + CommandContextRuleAction::Deny + } + }, + allowed_domains: rule.allowed_domains.clone(), + allowed_path_prefixes: rule.allowed_path_prefixes.clone(), + denied_path_prefixes: rule.denied_path_prefixes.clone(), + allow_high_risk: rule.allow_high_risk, + }) + .collect(), forbidden_paths: autonomy_config.forbidden_paths.clone(), allowed_roots: autonomy_config .allowed_roots @@ -1461,6 +1762,102 @@ mod tests { assert!(!p.is_command_allowed("echo hello")); } + #[test] + fn context_allow_rule_overrides_global_allowlist_for_curl_domain() { + let p = SecurityPolicy { + autonomy: AutonomyLevel::Full, + allowed_commands: vec![], + command_context_rules: vec![CommandContextRule { + command: "curl".into(), + action: CommandContextRuleAction::Allow, + allowed_domains: vec!["api.example.com".into()], + allowed_path_prefixes: vec![], + denied_path_prefixes: vec![], + allow_high_risk: true, + }], + ..SecurityPolicy::default() + }; + + assert!(p.is_command_allowed("curl https://api.example.com/v1/health")); + assert!(p + .validate_command_execution("curl https://api.example.com/v1/health", true) + .is_ok()); + } + + #[test] + fn context_allow_rule_restricts_curl_to_matching_domains() { + let p = SecurityPolicy { + autonomy: AutonomyLevel::Full, + allowed_commands: vec!["curl".into()], + command_context_rules: vec![CommandContextRule { + command: "curl".into(), + action: CommandContextRuleAction::Allow, + allowed_domains: vec!["api.example.com".into()], + allowed_path_prefixes: vec![], + denied_path_prefixes: vec![], + allow_high_risk: true, + }], + ..SecurityPolicy::default() + }; + + assert!(!p.is_command_allowed("curl https://evil.example.com/steal")); + let err = p + .validate_command_execution("curl https://evil.example.com/steal", true) + .expect_err("non-matching domains should be denied by context rules"); + assert!(err.contains("context rule denied")); + } + + #[test] + fn context_allow_rule_restricts_rm_to_allowed_path_prefix() { + let p = SecurityPolicy { + autonomy: AutonomyLevel::Full, + workspace_only: false, + allowed_commands: vec!["rm".into()], + forbidden_paths: vec![], + command_context_rules: vec![CommandContextRule { + command: "rm".into(), + action: CommandContextRuleAction::Allow, + allowed_domains: vec![], + allowed_path_prefixes: vec!["/tmp".into()], + denied_path_prefixes: vec![], + allow_high_risk: true, + }], + ..SecurityPolicy::default() + }; + + assert!(p.is_command_allowed("rm -rf /tmp/cleanup")); + assert!(p + .validate_command_execution("rm -rf /tmp/cleanup", true) + .is_ok()); + + assert!(!p.is_command_allowed("rm -rf /var/log")); + let err = p + .validate_command_execution("rm -rf /var/log", true) + .expect_err("paths outside /tmp should be denied"); + assert!(err.contains("context rule denied")); + } + + #[test] + fn context_deny_rule_can_block_specific_domain_even_when_allowlisted() { + let p = SecurityPolicy { + autonomy: AutonomyLevel::Full, + block_high_risk_commands: false, + allowed_commands: vec!["curl".into()], + command_context_rules: vec![CommandContextRule { + command: "curl".into(), + action: CommandContextRuleAction::Deny, + allowed_domains: vec!["evil.example.com".into()], + allowed_path_prefixes: vec![], + denied_path_prefixes: vec![], + allow_high_risk: false, + }], + ..SecurityPolicy::default() + }; + + assert!(p.is_command_allowed("curl https://api.example.com/v1/health")); + assert!(!p.is_command_allowed("curl https://evil.example.com/steal")); + } + #[test] fn command_risk_low_for_read_commands() { let p = default_policy(); From 5dede160a2981b6cd75d43e8ff9e21bb39f84543 Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Sun, 1 Mar 2026 13:30:03 -0500 Subject: [PATCH 08/17] fix(telegram): add Markdown parse_mode to approval prompts The approval prompt message uses backticks for code formatting but was missing the parse_mode field, Telegram displays the backticks literally instead of rendering them as code. Add "parse_mode": "Markdown" to the sendMessage request body to enable proper formatting. Fixes #2359 Co-Authored-By: Claude Opus 4.6 --- src/channels/telegram.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/channels/telegram.rs b/src/channels/telegram.rs index 419e00534..93782e1bb 100644 --- a/src/channels/telegram.rs +++ b/src/channels/telegram.rs @@ -3158,6 +3158,7 @@ impl Channel for TelegramChannel { "text": format!( "Approval required for tool `{tool_name}`.\nRequest ID: `{request_id}`\nArgs: `{args_preview}`", ), + "parse_mode": "Markdown", "reply_markup": { "inline_keyboard": [[ { From a0bba8ee1b3b8fb1b0d7cf4fff8246619661daca Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Sun, 1 Mar 2026 14:48:08 -0500 Subject: [PATCH 09/17] test(telegram): verify approval prompt markdown payload --- src/channels/telegram.rs | 82 +++++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 23 deletions(-) diff --git a/src/channels/telegram.rs b/src/channels/telegram.rs index 93782e1bb..5e47c3e3a 100644 --- a/src/channels/telegram.rs +++ b/src/channels/telegram.rs @@ -589,6 +589,40 @@ impl TelegramChannel { body } + fn build_approval_prompt_body( + chat_id: &str, + thread_id: Option<&str>, + request_id: &str, + tool_name: &str, + args_preview: &str, + ) -> serde_json::Value { + let mut body = serde_json::json!({ + "chat_id": chat_id, + "text": format!( + "Approval required for tool `{tool_name}`.\nRequest ID: `{request_id}`\nArgs: `{args_preview}`", + ), + "parse_mode": "Markdown", + "reply_markup": { + "inline_keyboard": [[ + { + "text": "Approve", + "callback_data": format!("{TELEGRAM_APPROVAL_CALLBACK_APPROVE_PREFIX}{request_id}") + }, + { + "text": "Deny", + "callback_data": format!("{TELEGRAM_APPROVAL_CALLBACK_DENY_PREFIX}{request_id}") + } + ]] + } + }); + + if let Some(thread_id) = thread_id { + body["message_thread_id"] = serde_json::Value::String(thread_id.to_string()); + } + + body + } + fn extract_update_message_ack_target( update: &serde_json::Value, ) -> Option<(String, i64, AckReactionContextChatType, Option)> { @@ -3153,29 +3187,13 @@ impl Channel for TelegramChannel { raw_args }; - let mut body = serde_json::json!({ - "chat_id": chat_id, - "text": format!( - "Approval required for tool `{tool_name}`.\nRequest ID: `{request_id}`\nArgs: `{args_preview}`", - ), - "parse_mode": "Markdown", - "reply_markup": { - "inline_keyboard": [[ - { - "text": "Approve", - "callback_data": format!("{TELEGRAM_APPROVAL_CALLBACK_APPROVE_PREFIX}{request_id}") - }, - { - "text": "Deny", - "callback_data": format!("{TELEGRAM_APPROVAL_CALLBACK_DENY_PREFIX}{request_id}") - } - ]] - } - }); - - if let Some(thread_id) = thread_id { - body["message_thread_id"] = serde_json::Value::String(thread_id); - } + let body = Self::build_approval_prompt_body( + &chat_id, + thread_id.as_deref(), + request_id, + tool_name, + &args_preview, + ); let response = self .http_client() @@ -3655,6 +3673,24 @@ mod tests { ); } + #[test] + fn approval_prompt_includes_markdown_parse_mode() { + let body = TelegramChannel::build_approval_prompt_body( + "12345", + Some("67890"), + "apr-1234", + "shell", + "{\"command\":\"echo hello\"}", + ); + + assert_eq!(body["parse_mode"], "Markdown"); + assert_eq!(body["chat_id"], "12345"); + assert_eq!(body["message_thread_id"], "67890"); + assert!(body["text"] + .as_str() + .is_some_and(|text| text.contains("`shell`"))); + } + #[test] fn sanitize_telegram_error_redacts_bot_token_in_url() { let input = From 51627f7f6762389994c6fb8e7eb8c7a0610b8b0d Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Sun, 1 Mar 2026 14:00:40 -0500 Subject: [PATCH 10/17] fix(ci): prevent duplicate workflow runs for contributor tier job The contributor-tier-issues job was triggering on both opened and labeled events, while labeled-routes also triggers on labeled events. This caused duplicate workflow runs with "Canceling since a higher priority waiting request" message. Fix by limiting contributor-tier-issues to only run for opened/reopened events, since contributor tier evaluation should happen when the issue/PR is first created, not when labels are added later. Fixes #2352 Co-Authored-By: Claude Opus 4.6 --- .github/workflows/pr-auto-response.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr-auto-response.yml b/.github/workflows/pr-auto-response.yml index 133785990..cbed353e9 100644 --- a/.github/workflows/pr-auto-response.yml +++ b/.github/workflows/pr-auto-response.yml @@ -21,11 +21,10 @@ env: jobs: contributor-tier-issues: + # Only run for opened/reopened events to avoid duplicate runs with labeled-routes job if: >- (github.event_name == 'issues' && - (github.event.action == 'opened' || github.event.action == 'reopened' || github.event.action == 'labeled' || github.event.action == 'unlabeled')) || - (github.event_name == 'pull_request_target' && - (github.event.action == 'labeled' || github.event.action == 'unlabeled')) + (github.event.action == 'opened' || github.event.action == 'reopened')) runs-on: ubuntu-22.04 permissions: contents: read From 12870dfe1f31530fc801c83ffa0239fe307415c6 Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Sun, 1 Mar 2026 14:52:54 -0500 Subject: [PATCH 11/17] fix(ci): scope pr-auto-response concurrency by event action --- .github/workflows/pr-auto-response.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pr-auto-response.yml b/.github/workflows/pr-auto-response.yml index cbed353e9..96bcc2e4b 100644 --- a/.github/workflows/pr-auto-response.yml +++ b/.github/workflows/pr-auto-response.yml @@ -8,7 +8,9 @@ on: types: [opened, labeled, unlabeled] concurrency: - group: pr-auto-response-${{ github.event.pull_request.number || github.event.issue.number || github.run_id }} + # Keep cancellation within the same lifecycle action to avoid `labeled` + # events canceling an in-flight `opened` run for the same issue/PR. + group: pr-auto-response-${{ github.event.pull_request.number || github.event.issue.number || github.run_id }}-${{ github.event.action || 'unknown' }} cancel-in-progress: true permissions: {} From b01462d7a96a96f985d490375de82739f3e10521 Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Sun, 1 Mar 2026 14:53:41 -0500 Subject: [PATCH 12/17] feat(gemini): support multimodal inlineData in user messages --- src/providers/gemini.rs | 176 ++++++++++++++++++++++++++++++++++------ 1 file changed, 152 insertions(+), 24 deletions(-) diff --git a/src/providers/gemini.rs b/src/providers/gemini.rs index c5d269d78..8a7954ed5 100644 --- a/src/providers/gemini.rs +++ b/src/providers/gemini.rs @@ -5,6 +5,7 @@ //! - Google Cloud ADC (`GOOGLE_APPLICATION_CREDENTIALS`) use crate::auth::AuthService; +use crate::multimodal; use crate::providers::traits::{ChatMessage, ChatResponse, Provider, TokenUsage}; use async_trait::async_trait; use base64::Engine; @@ -135,8 +136,22 @@ struct Content { } #[derive(Debug, Serialize, Clone)] -struct Part { - text: String, +#[serde(untagged)] +enum Part { + Text { + text: String, + }, + InlineData { + #[serde(rename = "inlineData")] + inline_data: InlineDataPart, + }, +} + +#[derive(Debug, Serialize, Clone)] +struct InlineDataPart { + #[serde(rename = "mimeType")] + mime_type: String, + data: String, } #[derive(Debug, Serialize, Clone)] @@ -930,6 +945,57 @@ impl GeminiProvider { || status.is_server_error() || error_text.contains("RESOURCE_EXHAUSTED") } + + fn parse_inline_image_marker(image_ref: &str) -> Option { + let rest = image_ref.strip_prefix("data:")?; + let semi_index = rest.find(';')?; + let mime_type = rest[..semi_index].trim(); + if mime_type.is_empty() { + return None; + } + + let payload = rest[semi_index + 1..].strip_prefix("base64,")?.trim(); + if payload.is_empty() { + return None; + } + + Some(InlineDataPart { + mime_type: mime_type.to_string(), + data: payload.to_string(), + }) + } + + fn build_user_parts(content: &str) -> Vec { + let (cleaned_text, image_refs) = multimodal::parse_image_markers(content); + if image_refs.is_empty() { + return vec![Part::Text { + text: content.to_string(), + }]; + } + + let mut parts: Vec = Vec::with_capacity(image_refs.len() + 1); + if !cleaned_text.is_empty() { + parts.push(Part::Text { text: cleaned_text }); + } + + for image_ref in image_refs { + if let Some(inline_data) = Self::parse_inline_image_marker(&image_ref) { + parts.push(Part::InlineData { inline_data }); + } else { + parts.push(Part::Text { + text: format!("[IMAGE:{image_ref}]"), + }); + } + } + + if parts.is_empty() { + vec![Part::Text { + text: String::new(), + }] + } else { + parts + } + } } impl GeminiProvider { @@ -1154,16 +1220,14 @@ impl Provider for GeminiProvider { ) -> anyhow::Result { let system_instruction = system_prompt.map(|sys| Content { role: None, - parts: vec![Part { + parts: vec![Part::Text { text: sys.to_string(), }], }); let contents = vec![Content { role: Some("user".to_string()), - parts: vec![Part { - text: message.to_string(), - }], + parts: Self::build_user_parts(message), }]; let (text, _usage) = self @@ -1189,16 +1253,14 @@ impl Provider for GeminiProvider { "user" => { contents.push(Content { role: Some("user".to_string()), - parts: vec![Part { - text: msg.content.clone(), - }], + parts: Self::build_user_parts(&msg.content), }); } "assistant" => { // Gemini API uses "model" role instead of "assistant" contents.push(Content { role: Some("model".to_string()), - parts: vec![Part { + parts: vec![Part::Text { text: msg.content.clone(), }], }); @@ -1212,7 +1274,7 @@ impl Provider for GeminiProvider { } else { Some(Content { role: None, - parts: vec![Part { + parts: vec![Part::Text { text: system_parts.join("\n\n"), }], }) @@ -1238,13 +1300,11 @@ impl Provider for GeminiProvider { "system" => system_parts.push(&msg.content), "user" => contents.push(Content { role: Some("user".to_string()), - parts: vec![Part { - text: msg.content.clone(), - }], + parts: Self::build_user_parts(&msg.content), }), "assistant" => contents.push(Content { role: Some("model".to_string()), - parts: vec![Part { + parts: vec![Part::Text { text: msg.content.clone(), }], }), @@ -1257,7 +1317,7 @@ impl Provider for GeminiProvider { } else { Some(Content { role: None, - parts: vec![Part { + parts: vec![Part::Text { text: system_parts.join("\n\n"), }], }) @@ -1545,7 +1605,7 @@ mod tests { let body = GenerateContentRequest { contents: vec![Content { role: Some("user".into()), - parts: vec![Part { + parts: vec![Part::Text { text: "hello".into(), }], }], @@ -1586,7 +1646,7 @@ mod tests { let body = GenerateContentRequest { contents: vec![Content { role: Some("user".into()), - parts: vec![Part { + parts: vec![Part::Text { text: "hello".into(), }], }], @@ -1630,7 +1690,7 @@ mod tests { let body = GenerateContentRequest { contents: vec![Content { role: Some("user".into()), - parts: vec![Part { + parts: vec![Part::Text { text: "hello".into(), }], }], @@ -1662,13 +1722,13 @@ mod tests { let request = GenerateContentRequest { contents: vec![Content { role: Some("user".to_string()), - parts: vec![Part { + parts: vec![Part::Text { text: "Hello".to_string(), }], }], system_instruction: Some(Content { role: None, - parts: vec![Part { + parts: vec![Part::Text { text: "You are helpful".to_string(), }], }), @@ -1687,6 +1747,74 @@ mod tests { assert!(json.contains("\"maxOutputTokens\":8192")); } + #[test] + fn build_user_parts_text_only_is_backward_compatible() { + let content = "Plain text message without image markers."; + let parts = GeminiProvider::build_user_parts(content); + assert_eq!(parts.len(), 1); + match &parts[0] { + Part::Text { text } => assert_eq!(text, content), + Part::InlineData { .. } => panic!("text-only message must stay text-only"), + } + } + + #[test] + fn build_user_parts_single_image() { + let parts = GeminiProvider::build_user_parts( + "Describe this image [IMAGE:data:image/png;base64,aGVsbG8=]", + ); + assert_eq!(parts.len(), 2); + match &parts[0] { + Part::Text { text } => assert_eq!(text, "Describe this image"), + Part::InlineData { .. } => panic!("first part should be text"), + } + match &parts[1] { + Part::InlineData { inline_data } => { + assert_eq!(inline_data.mime_type, "image/png"); + assert_eq!(inline_data.data, "aGVsbG8="); + } + Part::Text { .. } => panic!("second part should be inline image data"), + } + } + + #[test] + fn build_user_parts_multiple_images() { + let parts = GeminiProvider::build_user_parts( + "Compare [IMAGE:data:image/png;base64,aQ==] and [IMAGE:data:image/jpeg;base64,ag==]", + ); + assert_eq!(parts.len(), 3); + assert!(matches!(parts[0], Part::Text { .. })); + assert!(matches!(parts[1], Part::InlineData { .. })); + assert!(matches!(parts[2], Part::InlineData { .. })); + } + + #[test] + fn build_user_parts_image_only() { + let parts = GeminiProvider::build_user_parts("[IMAGE:data:image/webp;base64,YWJjZA==]"); + assert_eq!(parts.len(), 1); + match &parts[0] { + Part::InlineData { inline_data } => { + assert_eq!(inline_data.mime_type, "image/webp"); + assert_eq!(inline_data.data, "YWJjZA=="); + } + Part::Text { .. } => panic!("image-only message should create inline image part"), + } + } + + #[test] + fn build_user_parts_fallback_for_non_data_uri_markers() { + let parts = GeminiProvider::build_user_parts("Inspect [IMAGE:https://example.com/img.png]"); + assert_eq!(parts.len(), 2); + match &parts[0] { + Part::Text { text } => assert_eq!(text, "Inspect"), + Part::InlineData { .. } => panic!("first part should be text"), + } + match &parts[1] { + Part::Text { text } => assert_eq!(text, "[IMAGE:https://example.com/img.png]"), + Part::InlineData { .. } => panic!("invalid markers should fall back to text"), + } + } + #[test] fn internal_request_includes_model() { let request = InternalGenerateContentEnvelope { @@ -1696,7 +1824,7 @@ mod tests { request: InternalGenerateContentRequest { contents: vec![Content { role: Some("user".to_string()), - parts: vec![Part { + parts: vec![Part::Text { text: "Hello".to_string(), }], }], @@ -1728,7 +1856,7 @@ mod tests { request: InternalGenerateContentRequest { contents: vec![Content { role: Some("user".to_string()), - parts: vec![Part { + parts: vec![Part::Text { text: "Hello".to_string(), }], }], @@ -1751,7 +1879,7 @@ mod tests { request: InternalGenerateContentRequest { contents: vec![Content { role: Some("user".to_string()), - parts: vec![Part { + parts: vec![Part::Text { text: "Hello".to_string(), }], }], From cc9ff1820bd709d2bb6ce257ad87bcf3523eb570 Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Sun, 1 Mar 2026 14:53:45 -0500 Subject: [PATCH 13/17] feat(autonomy): exclude process by default for non-cli channels --- docs/channels-reference.md | 1 + docs/config-reference.md | 3 ++- src/channels/mod.rs | 47 ++++++++++++++++++++++++++++++++++++++ src/config/schema.rs | 5 ++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/docs/channels-reference.md b/docs/channels-reference.md index f8f0f8c35..bb31b4340 100644 --- a/docs/channels-reference.md +++ b/docs/channels-reference.md @@ -78,6 +78,7 @@ Notes: - You can restrict who can use approval-management commands via `[autonomy].non_cli_approval_approvers`. - Configure natural-language approval mode via `[autonomy].non_cli_natural_language_approval_mode`. - `autonomy.non_cli_excluded_tools` is reloaded from `config.toml` at runtime; `/approvals` shows the currently effective list. +- Default non-CLI exclusions include both `shell` and `process`; remove `process` from `[autonomy].non_cli_excluded_tools` only when you explicitly want background command execution in chat channels. - Each incoming message injects a runtime tool-availability snapshot into the system prompt, derived from the same exclusion policy used by execution. ## Inbound Image Marker Protocol diff --git a/docs/config-reference.md b/docs/config-reference.md index 873ed2e60..d78d5fae2 100644 --- a/docs/config-reference.md +++ b/docs/config-reference.md @@ -868,7 +868,7 @@ Environment overrides: | `allow_sensitive_file_writes` | `false` | allow `file_write`/`file_edit` on sensitive files/dirs (for example `.env`, `.aws/credentials`, private keys) | | `auto_approve` | `[]` | tool operations always auto-approved | | `always_ask` | `[]` | tool operations that always require approval | -| `non_cli_excluded_tools` | `[]` | tools hidden from non-CLI channel tool specs | +| `non_cli_excluded_tools` | built-in denylist (includes `shell`, `process`, `file_write`, ...) | tools hidden from non-CLI channel tool specs | | `non_cli_approval_approvers` | `[]` | optional allowlist for who can run non-CLI approval-management commands | | `non_cli_natural_language_approval_mode` | `direct` | natural-language behavior for approval-management commands (`direct`, `request_confirm`, `disabled`) | | `non_cli_natural_language_approval_mode_by_channel` | `{}` | per-channel override map for natural-language approval mode | @@ -908,6 +908,7 @@ Notes: - `telegram:alice` allows only that channel+sender pair. - `telegram:*` allows any sender on Telegram. - `*:alice` allows `alice` on any channel. +- By default, `process` is excluded on non-CLI channels alongside `shell`. To opt in intentionally, remove `"process"` from `[autonomy].non_cli_excluded_tools` in `config.toml`. - Use `/unapprove ` to remove persisted approval from `autonomy.auto_approve`. - `/approve-pending` lists pending requests for the current sender+chat/channel scope. - If a tool remains unavailable after approval, check `autonomy.non_cli_excluded_tools` (runtime `/approvals` shows this list). Channel runtime reloads this list from `config.toml` automatically. diff --git a/src/channels/mod.rs b/src/channels/mod.rs index 0299a6994..26c33210f 100644 --- a/src/channels/mod.rs +++ b/src/channels/mod.rs @@ -6747,6 +6747,36 @@ BTC is currently around $65,000 based on latest tool output."# } } + struct MockProcessTool; + + #[async_trait::async_trait] + impl Tool for MockProcessTool { + fn name(&self) -> &str { + "process" + } + + fn description(&self) -> &str { + "Mock process tool for runtime visibility tests" + } + + fn parameters_schema(&self) -> serde_json::Value { + serde_json::json!({ + "type": "object", + "properties": { + "action": { "type": "string" } + } + }) + } + + async fn execute(&self, _args: serde_json::Value) -> anyhow::Result { + Ok(ToolResult { + success: true, + output: String::new(), + error: None, + }) + } + } + #[test] fn build_runtime_tool_visibility_prompt_respects_excluded_snapshot() { let tools: Vec> = vec![Box::new(MockPriceTool), Box::new(MockEchoTool)]; @@ -6765,6 +6795,23 @@ BTC is currently around $65,000 based on latest tool output."# assert!(!native.contains("## Tool Use Protocol")); } + #[test] + fn build_runtime_tool_visibility_prompt_excludes_process_with_default_policy() { + let tools: Vec> = vec![Box::new(MockProcessTool), Box::new(MockEchoTool)]; + let excluded = crate::config::AutonomyConfig::default().non_cli_excluded_tools; + + assert!( + excluded.contains(&"process".to_string()), + "default non-CLI exclusion list must include process" + ); + + let prompt = build_runtime_tool_visibility_prompt(&tools, &excluded, false); + assert!(prompt.contains("Excluded by runtime policy:")); + assert!(prompt.contains("process")); + assert!(!prompt.contains("**process**:")); + assert!(prompt.contains("`mock_echo`")); + } + #[tokio::test] async fn process_channel_message_injects_runtime_tool_visibility_prompt() { let channel_impl = Arc::new(RecordingChannel::default()); diff --git a/src/config/schema.rs b/src/config/schema.rs index b1c5ea355..9a2d5b2f0 100644 --- a/src/config/schema.rs +++ b/src/config/schema.rs @@ -3320,6 +3320,7 @@ fn default_always_ask() -> Vec { fn default_non_cli_excluded_tools() -> Vec { [ "shell", + "process", "file_write", "file_edit", "git_operations", @@ -9427,6 +9428,7 @@ mod tests { assert!(!a.allow_sensitive_file_reads); assert!(!a.allow_sensitive_file_writes); assert!(a.non_cli_excluded_tools.contains(&"shell".to_string())); + assert!(a.non_cli_excluded_tools.contains(&"process".to_string())); assert!(a.non_cli_excluded_tools.contains(&"delegate".to_string())); } @@ -9460,6 +9462,9 @@ allowed_roots = [] "Missing command_context_rules must default to empty" ); assert!(parsed.non_cli_excluded_tools.contains(&"shell".to_string())); + assert!(parsed + .non_cli_excluded_tools + .contains(&"process".to_string())); assert!(parsed .non_cli_excluded_tools .contains(&"browser".to_string())); From f3205da359f84343b6cd65e92f818323f745c8ca Mon Sep 17 00:00:00 2001 From: argenis de la rosa Date: Sun, 1 Mar 2026 14:54:04 -0500 Subject: [PATCH 14/17] feat(web): add line numbers and TOML syntax highlighting to config editor --- web/dist/assets/index-BCWngppm.css | 1 + web/dist/assets/index-BW-KH83H.css | 1 - web/dist/assets/index-BarGrDiR.css | 1 - web/dist/assets/index-Bv7iLnHl.js | 305 -------- web/dist/assets/index-D0O_BdVX.js | 693 ----------------- web/dist/assets/index-DOPK6_Za.js | 706 ++++++++++++++++++ web/dist/index.html | 4 +- web/package-lock.json | 232 ++++++ web/package.json | 5 + web/src/components/config/ConfigRawEditor.tsx | 30 +- 10 files changed, 969 insertions(+), 1009 deletions(-) create mode 100644 web/dist/assets/index-BCWngppm.css delete mode 100644 web/dist/assets/index-BW-KH83H.css delete mode 100644 web/dist/assets/index-BarGrDiR.css delete mode 100644 web/dist/assets/index-Bv7iLnHl.js delete mode 100644 web/dist/assets/index-D0O_BdVX.js create mode 100644 web/dist/assets/index-DOPK6_Za.js diff --git a/web/dist/assets/index-BCWngppm.css b/web/dist/assets/index-BCWngppm.css new file mode 100644 index 000000000..b483537be --- /dev/null +++ b/web/dist/assets/index-BCWngppm.css @@ -0,0 +1 @@ +/*! tailwindcss v4.2.0 | 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-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-font-weight:initial;--tw-tracking: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-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-duration:initial;--tw-ease:initial;--tw-leading:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-700:oklch(50.5% .213 27.518);--color-red-900:oklch(39.6% .141 25.723);--color-orange-400:oklch(75% .183 55.934);--color-orange-600:oklch(64.6% .222 41.116);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-900:oklch(37.8% .077 168.94);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-900:oklch(38.1% .176 304.987);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-4xl:56rem;--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: 1.5 ;--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);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-bounce:bounce 1s infinite;--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-bg-primary:#0a0a0f;--color-bg-secondary:#12121a;--color-bg-card:#1a1a2e;--color-bg-card-hover:#22223a;--color-border-default:#2a2a3e;--color-accent-blue:#3b82f6;--color-text-primary:#e2e8f0;--color-text-muted:#64748b}}@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%;-moz-tab-size:4;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;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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset: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%}.right-2{right:calc(var(--spacing) * 2)}.left-0{left:calc(var(--spacing) * 0)}.left-3{left:calc(var(--spacing) * 3)}.z-30{z-index:30}.z-40{z-index:40}.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-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.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-6{margin-top:calc(var(--spacing) * 6)}.mt-auto{margin-top:auto}.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)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-32{height:calc(var(--spacing) * 32)}.h-64{height:calc(var(--spacing) * 64)}.h-\[calc\(100vh-3\.5rem\)\]{height:calc(100vh - 3.5rem)}.h-full{height:100%}.h-screen{height:100vh}.max-h-64{max-height:calc(var(--spacing) * 64)}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-20{width:calc(var(--spacing) * 20)}.w-60{width:calc(var(--spacing) * 60)}.w-full{width:100%}.w-px{width:1px}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[75\%\]{max-width:75%}.max-w-\[200px\]{max-width:200px}.max-w-\[300px\]{max-width:300px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-1{--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-6{--tw-translate-x:calc(var(--spacing) * 6);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}: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-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-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)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-4{row-gap:calc(var(--spacing) * 4)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y: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-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.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-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-700\/50{border-color:#1447e680}@supports (color:color-mix(in lab,red,red)){.border-blue-700\/50{border-color:color-mix(in oklab,var(--color-blue-700) 50%,transparent)}}.border-blue-700\/70{border-color:#1447e6b3}@supports (color:color-mix(in lab,red,red)){.border-blue-700\/70{border-color:color-mix(in oklab,var(--color-blue-700) 70%,transparent)}}.border-blue-800{border-color:var(--color-blue-800)}.border-blue-800\/50{border-color:#193cb880}@supports (color:color-mix(in lab,red,red)){.border-blue-800\/50{border-color:color-mix(in oklab,var(--color-blue-800) 50%,transparent)}}.border-emerald-700\/60{border-color:#00795699}@supports (color:color-mix(in lab,red,red)){.border-emerald-700\/60{border-color:color-mix(in oklab,var(--color-emerald-700) 60%,transparent)}}.border-gray-600{border-color:var(--color-gray-600)}.border-gray-700{border-color:var(--color-gray-700)}.border-gray-800{border-color:var(--color-gray-800)}.border-gray-800\/50{border-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.border-gray-800\/50{border-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500) 30%,transparent)}}.border-green-700{border-color:var(--color-green-700)}.border-green-700\/40{border-color:#00813866}@supports (color:color-mix(in lab,red,red)){.border-green-700\/40{border-color:color-mix(in oklab,var(--color-green-700) 40%,transparent)}}.border-green-700\/50{border-color:#00813880}@supports (color:color-mix(in lab,red,red)){.border-green-700\/50{border-color:color-mix(in oklab,var(--color-green-700) 50%,transparent)}}.border-green-700\/70{border-color:#008138b3}@supports (color:color-mix(in lab,red,red)){.border-green-700\/70{border-color:color-mix(in oklab,var(--color-green-700) 70%,transparent)}}.border-green-800{border-color:var(--color-green-800)}.border-purple-700\/50{border-color:#8200da80}@supports (color:color-mix(in lab,red,red)){.border-purple-700\/50{border-color:color-mix(in oklab,var(--color-purple-700) 50%,transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.border-red-500\/30{border-color:color-mix(in oklab,var(--color-red-500) 30%,transparent)}}.border-red-700{border-color:var(--color-red-700)}.border-red-700\/40{border-color:#bf000f66}@supports (color:color-mix(in lab,red,red)){.border-red-700\/40{border-color:color-mix(in oklab,var(--color-red-700) 40%,transparent)}}.border-red-700\/50{border-color:#bf000f80}@supports (color:color-mix(in lab,red,red)){.border-red-700\/50{border-color:color-mix(in oklab,var(--color-red-700) 50%,transparent)}}.border-yellow-500\/30{border-color:#edb2004d}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/30{border-color:color-mix(in oklab,var(--color-yellow-500) 30%,transparent)}}.border-yellow-700\/40{border-color:#a3610066}@supports (color:color-mix(in lab,red,red)){.border-yellow-700\/40{border-color:color-mix(in oklab,var(--color-yellow-700) 40%,transparent)}}.border-yellow-700\/50{border-color:#a3610080}@supports (color:color-mix(in lab,red,red)){.border-yellow-700\/50{border-color:color-mix(in oklab,var(--color-yellow-700) 50%,transparent)}}.border-yellow-800\/50{border-color:#874b0080}@supports (color:color-mix(in lab,red,red)){.border-yellow-800\/50{border-color:color-mix(in oklab,var(--color-yellow-800) 50%,transparent)}}.border-t-transparent{border-top-color:#0000}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,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-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black) 70%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-600\/20{background-color:#155dfc33}@supports (color:color-mix(in lab,red,red)){.bg-blue-600\/20{background-color:color-mix(in oklab,var(--color-blue-600) 20%,transparent)}}.bg-blue-900\/30{background-color:#1c398e4d}@supports (color:color-mix(in lab,red,red)){.bg-blue-900\/30{background-color:color-mix(in oklab,var(--color-blue-900) 30%,transparent)}}.bg-blue-900\/40{background-color:#1c398e66}@supports (color:color-mix(in lab,red,red)){.bg-blue-900\/40{background-color:color-mix(in oklab,var(--color-blue-900) 40%,transparent)}}.bg-blue-900\/50{background-color:#1c398e80}@supports (color:color-mix(in lab,red,red)){.bg-blue-900\/50{background-color:color-mix(in oklab,var(--color-blue-900) 50%,transparent)}}.bg-blue-950\/30{background-color:#1624564d}@supports (color:color-mix(in lab,red,red)){.bg-blue-950\/30{background-color:color-mix(in oklab,var(--color-blue-950) 30%,transparent)}}.bg-emerald-900\/40{background-color:#004e3b66}@supports (color:color-mix(in lab,red,red)){.bg-emerald-900\/40{background-color:color-mix(in oklab,var(--color-emerald-900) 40%,transparent)}}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-700{background-color:var(--color-gray-700)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.bg-gray-900{background-color:var(--color-gray-900)}.bg-gray-900\/80{background-color:#101828cc}@supports (color:color-mix(in lab,red,red)){.bg-gray-900\/80{background-color:color-mix(in oklab,var(--color-gray-900) 80%,transparent)}}.bg-gray-950{background-color:var(--color-gray-950)}.bg-gray-950\/50{background-color:#03071280}@supports (color:color-mix(in lab,red,red)){.bg-gray-950\/50{background-color:color-mix(in oklab,var(--color-gray-950) 50%,transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-green-600{background-color:var(--color-green-600)}.bg-green-600\/20{background-color:#00a54433}@supports (color:color-mix(in lab,red,red)){.bg-green-600\/20{background-color:color-mix(in oklab,var(--color-green-600) 20%,transparent)}}.bg-green-900\/10{background-color:#0d542b1a}@supports (color:color-mix(in lab,red,red)){.bg-green-900\/10{background-color:color-mix(in oklab,var(--color-green-900) 10%,transparent)}}.bg-green-900\/30{background-color:#0d542b4d}@supports (color:color-mix(in lab,red,red)){.bg-green-900\/30{background-color:color-mix(in oklab,var(--color-green-900) 30%,transparent)}}.bg-green-900\/40{background-color:#0d542b66}@supports (color:color-mix(in lab,red,red)){.bg-green-900\/40{background-color:color-mix(in oklab,var(--color-green-900) 40%,transparent)}}.bg-green-900\/50{background-color:#0d542b80}@supports (color:color-mix(in lab,red,red)){.bg-green-900\/50{background-color:color-mix(in oklab,var(--color-green-900) 50%,transparent)}}.bg-orange-600\/20{background-color:#f0510033}@supports (color:color-mix(in lab,red,red)){.bg-orange-600\/20{background-color:color-mix(in oklab,var(--color-orange-600) 20%,transparent)}}.bg-purple-500{background-color:var(--color-purple-500)}.bg-purple-600\/20{background-color:#9810fa33}@supports (color:color-mix(in lab,red,red)){.bg-purple-600\/20{background-color:color-mix(in oklab,var(--color-purple-600) 20%,transparent)}}.bg-purple-900\/50{background-color:#59168b80}@supports (color:color-mix(in lab,red,red)){.bg-purple-900\/50{background-color:color-mix(in oklab,var(--color-purple-900) 50%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-900\/10{background-color:#82181a1a}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/10{background-color:color-mix(in oklab,var(--color-red-900) 10%,transparent)}}.bg-red-900\/30{background-color:#82181a4d}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/30{background-color:color-mix(in oklab,var(--color-red-900) 30%,transparent)}}.bg-red-900\/40{background-color:#82181a66}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/40{background-color:color-mix(in oklab,var(--color-red-900) 40%,transparent)}}.bg-red-900\/50{background-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/50{background-color:color-mix(in oklab,var(--color-red-900) 50%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-yellow-600{background-color:var(--color-yellow-600)}.bg-yellow-900\/10{background-color:#733e0a1a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-900\/10{background-color:color-mix(in oklab,var(--color-yellow-900) 10%,transparent)}}.bg-yellow-900\/20{background-color:#733e0a33}@supports (color:color-mix(in lab,red,red)){.bg-yellow-900\/20{background-color:color-mix(in oklab,var(--color-yellow-900) 20%,transparent)}}.bg-yellow-900\/30{background-color:#733e0a4d}@supports (color:color-mix(in lab,red,red)){.bg-yellow-900\/30{background-color:color-mix(in oklab,var(--color-yellow-900) 30%,transparent)}}.bg-yellow-900\/40{background-color:#733e0a66}@supports (color:color-mix(in lab,red,red)){.bg-yellow-900\/40{background-color:color-mix(in oklab,var(--color-yellow-900) 40%,transparent)}}.bg-yellow-900\/50{background-color:#733e0a80}@supports (color:color-mix(in lab,red,red)){.bg-yellow-900\/50{background-color:color-mix(in oklab,var(--color-yellow-900) 50%,transparent)}}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-green-950\/20{--tw-gradient-from:#032e1533}@supports (color:color-mix(in lab,red,red)){.from-green-950\/20{--tw-gradient-from:color-mix(in oklab, var(--color-green-950) 20%, transparent)}}.from-green-950\/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))}.to-gray-900{--tw-gradient-to:var(--color-gray-900);--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-3{padding:calc(var(--spacing) * 3)}.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-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-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-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.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-16{padding-right:calc(var(--spacing) * 16)}.pl-9{padding-left:calc(var(--spacing) * 9)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.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-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-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.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-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-blue-200{color:var(--color-blue-200)}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-emerald-300{color:var(--color-emerald-300)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-green-300{color:var(--color-green-300)}.text-green-400{color:var(--color-green-400)}.text-orange-400{color:var(--color-orange-400)}.text-purple-400{color:var(--color-purple-400)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-white{color:var(--color-white)}.text-yellow-300{color:var(--color-yellow-300)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-400\/70{color:#fac800b3}@supports (color:color-mix(in lab,red,red)){.text-yellow-400\/70{color:color-mix(in oklab,var(--color-yellow-400) 70%,transparent)}}.text-yellow-500{color:var(--color-yellow-500)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.opacity-0{opacity:0}.opacity-100{opacity:1}.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)}.filter{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,)}.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-200{--tw-duration:.2s;transition-duration:.2s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}@media(hover:hover){.hover\:border-gray-700:hover{border-color:var(--color-gray-700)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-blue-900\/50:hover{background-color:#1c398e80}@supports (color:color-mix(in lab,red,red)){.hover\:bg-blue-900\/50:hover{background-color:color-mix(in oklab,var(--color-blue-900) 50%,transparent)}}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-gray-800\/30:hover{background-color:#1e29394d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/30:hover{background-color:color-mix(in oklab,var(--color-gray-800) 30%,transparent)}}.hover\:bg-gray-800\/50:hover{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/50:hover{background-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.hover\:bg-green-700:hover{background-color:var(--color-green-700)}.hover\:bg-yellow-700:hover{background-color:var(--color-yellow-700)}.hover\:text-blue-100:hover{color:var(--color-blue-100)}.hover\:text-blue-300:hover{color:var(--color-blue-300)}.hover\:text-gray-200:hover{color:var(--color-gray-200)}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-white:hover{color:var(--color-white)}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:border-transparent:focus{border-color:#0000}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + 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\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:bg-gray-700:disabled{background-color:var(--color-gray-700)}.disabled\:text-gray-500:disabled{color:var(--color-gray-500)}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}@media(min-width:40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}}@media(min-width:48rem){.md\:ml-60{margin-left:calc(var(--spacing) * 60)}.md\:hidden{display:none}.md\:translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:gap-4{gap:calc(var(--spacing) * 4)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}}@media(min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:80rem){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.\[\&_\.cm-content\]\:px-0 .cm-content{padding-inline:calc(var(--spacing) * 0)}.\[\&_\.cm-content\]\:py-4 .cm-content{padding-block:calc(var(--spacing) * 4)}.\[\&_\.cm-editor\]\:bg-gray-950 .cm-editor{background-color:var(--color-gray-950)}.\[\&_\.cm-editor\]\:focus\:outline-none .cm-editor:focus{--tw-outline-style:none;outline-style:none}.\[\&_\.cm-focused\]\:ring-2 .cm-focused{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + 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)}.\[\&_\.cm-focused\]\:ring-blue-500\/70 .cm-focused{--tw-ring-color:#3080ffb3}@supports (color:color-mix(in lab,red,red)){.\[\&_\.cm-focused\]\:ring-blue-500\/70 .cm-focused{--tw-ring-color:color-mix(in oklab, var(--color-blue-500) 70%, transparent)}}.\[\&_\.cm-focused\]\:ring-inset .cm-focused{--tw-ring-inset:inset}.\[\&_\.cm-gutters\]\:border-r .cm-gutters{border-right-style:var(--tw-border-style);border-right-width:1px}.\[\&_\.cm-gutters\]\:border-gray-800 .cm-gutters{border-color:var(--color-gray-800)}.\[\&_\.cm-gutters\]\:bg-gray-950 .cm-gutters{background-color:var(--color-gray-950)}.\[\&_\.cm-scroller\]\:font-mono .cm-scroller{font-family:var(--font-mono)}.\[\&_\.cm-scroller\]\:leading-6 .cm-scroller{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}}html{color-scheme:dark}body{background-color:var(--color-bg-primary);color:var(--color-text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}#root{min-height:100vh}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--color-bg-secondary)}::-webkit-scrollbar-thumb{background:var(--color-border-default);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--color-text-muted)}.card{background-color:var(--color-bg-card);border:1px solid var(--color-border-default);border-radius:.75rem}.card:hover{background-color:var(--color-bg-card-hover)}:focus-visible{outline:2px solid var(--color-accent-blue);outline-offset:2px}@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-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-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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-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-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-leading{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}} diff --git a/web/dist/assets/index-BW-KH83H.css b/web/dist/assets/index-BW-KH83H.css deleted file mode 100644 index 6083c2b3d..000000000 --- a/web/dist/assets/index-BW-KH83H.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.2.0 | 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-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-font-weight:initial;--tw-tracking: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-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-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-700:oklch(50.5% .213 27.518);--color-red-900:oklch(39.6% .141 25.723);--color-orange-400:oklch(75% .183 55.934);--color-orange-600:oklch(64.6% .222 41.116);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-900:oklch(37.8% .077 168.94);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-900:oklch(38.1% .176 304.987);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-4xl:56rem;--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: 1.5 ;--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);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-bounce:bounce 1s infinite;--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-bg-primary:#0a0a0f;--color-bg-secondary:#12121a;--color-bg-card:#1a1a2e;--color-bg-card-hover:#22223a;--color-border-default:#2a2a3e;--color-accent-blue:#3b82f6;--color-text-primary:#e2e8f0;--color-text-muted:#64748b}}@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%;-moz-tab-size:4;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;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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset: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%}.left-0{left:calc(var(--spacing) * 0)}.left-3{left:calc(var(--spacing) * 3)}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.col-span-2{grid-column:span 2/span 2}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.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-6{margin-top:calc(var(--spacing) * 6)}.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)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-32{height:calc(var(--spacing) * 32)}.h-64{height:calc(var(--spacing) * 64)}.h-\[calc\(100vh-3\.5rem\)\]{height:calc(100vh - 3.5rem)}.h-full{height:100%}.h-screen{height:100vh}.max-h-64{max-height:calc(var(--spacing) * 64)}.min-h-\[500px\]{min-height:500px}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-20{width:calc(var(--spacing) * 20)}.w-60{width:calc(var(--spacing) * 60)}.w-full{width:100%}.w-px{width:1px}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[75\%\]{max-width:75%}.max-w-\[200px\]{max-width:200px}.max-w-\[300px\]{max-width:300px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}: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-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-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-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)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y: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)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.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-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-700\/50{border-color:#1447e680}@supports (color:color-mix(in lab,red,red)){.border-blue-700\/50{border-color:color-mix(in oklab,var(--color-blue-700) 50%,transparent)}}.border-blue-700\/70{border-color:#1447e6b3}@supports (color:color-mix(in lab,red,red)){.border-blue-700\/70{border-color:color-mix(in oklab,var(--color-blue-700) 70%,transparent)}}.border-blue-800{border-color:var(--color-blue-800)}.border-emerald-700\/60{border-color:#00795699}@supports (color:color-mix(in lab,red,red)){.border-emerald-700\/60{border-color:color-mix(in oklab,var(--color-emerald-700) 60%,transparent)}}.border-gray-600{border-color:var(--color-gray-600)}.border-gray-700{border-color:var(--color-gray-700)}.border-gray-800{border-color:var(--color-gray-800)}.border-gray-800\/50{border-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.border-gray-800\/50{border-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500) 30%,transparent)}}.border-green-700{border-color:var(--color-green-700)}.border-green-700\/40{border-color:#00813866}@supports (color:color-mix(in lab,red,red)){.border-green-700\/40{border-color:color-mix(in oklab,var(--color-green-700) 40%,transparent)}}.border-green-700\/50{border-color:#00813880}@supports (color:color-mix(in lab,red,red)){.border-green-700\/50{border-color:color-mix(in oklab,var(--color-green-700) 50%,transparent)}}.border-green-700\/70{border-color:#008138b3}@supports (color:color-mix(in lab,red,red)){.border-green-700\/70{border-color:color-mix(in oklab,var(--color-green-700) 70%,transparent)}}.border-green-800{border-color:var(--color-green-800)}.border-purple-700\/50{border-color:#8200da80}@supports (color:color-mix(in lab,red,red)){.border-purple-700\/50{border-color:color-mix(in oklab,var(--color-purple-700) 50%,transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.border-red-500\/30{border-color:color-mix(in oklab,var(--color-red-500) 30%,transparent)}}.border-red-700{border-color:var(--color-red-700)}.border-red-700\/40{border-color:#bf000f66}@supports (color:color-mix(in lab,red,red)){.border-red-700\/40{border-color:color-mix(in oklab,var(--color-red-700) 40%,transparent)}}.border-red-700\/50{border-color:#bf000f80}@supports (color:color-mix(in lab,red,red)){.border-red-700\/50{border-color:color-mix(in oklab,var(--color-red-700) 50%,transparent)}}.border-yellow-500\/30{border-color:#edb2004d}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/30{border-color:color-mix(in oklab,var(--color-yellow-500) 30%,transparent)}}.border-yellow-700\/40{border-color:#a3610066}@supports (color:color-mix(in lab,red,red)){.border-yellow-700\/40{border-color:color-mix(in oklab,var(--color-yellow-700) 40%,transparent)}}.border-yellow-700\/50{border-color:#a3610080}@supports (color:color-mix(in lab,red,red)){.border-yellow-700\/50{border-color:color-mix(in oklab,var(--color-yellow-700) 50%,transparent)}}.border-t-transparent{border-top-color:#0000}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,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-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black) 70%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-600\/20{background-color:#155dfc33}@supports (color:color-mix(in lab,red,red)){.bg-blue-600\/20{background-color:color-mix(in oklab,var(--color-blue-600) 20%,transparent)}}.bg-blue-900\/30{background-color:#1c398e4d}@supports (color:color-mix(in lab,red,red)){.bg-blue-900\/30{background-color:color-mix(in oklab,var(--color-blue-900) 30%,transparent)}}.bg-blue-900\/40{background-color:#1c398e66}@supports (color:color-mix(in lab,red,red)){.bg-blue-900\/40{background-color:color-mix(in oklab,var(--color-blue-900) 40%,transparent)}}.bg-blue-900\/50{background-color:#1c398e80}@supports (color:color-mix(in lab,red,red)){.bg-blue-900\/50{background-color:color-mix(in oklab,var(--color-blue-900) 50%,transparent)}}.bg-blue-950\/30{background-color:#1624564d}@supports (color:color-mix(in lab,red,red)){.bg-blue-950\/30{background-color:color-mix(in oklab,var(--color-blue-950) 30%,transparent)}}.bg-emerald-900\/40{background-color:#004e3b66}@supports (color:color-mix(in lab,red,red)){.bg-emerald-900\/40{background-color:color-mix(in oklab,var(--color-emerald-900) 40%,transparent)}}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-700{background-color:var(--color-gray-700)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.bg-gray-900{background-color:var(--color-gray-900)}.bg-gray-900\/80{background-color:#101828cc}@supports (color:color-mix(in lab,red,red)){.bg-gray-900\/80{background-color:color-mix(in oklab,var(--color-gray-900) 80%,transparent)}}.bg-gray-950{background-color:var(--color-gray-950)}.bg-gray-950\/50{background-color:#03071280}@supports (color:color-mix(in lab,red,red)){.bg-gray-950\/50{background-color:color-mix(in oklab,var(--color-gray-950) 50%,transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-green-600{background-color:var(--color-green-600)}.bg-green-600\/20{background-color:#00a54433}@supports (color:color-mix(in lab,red,red)){.bg-green-600\/20{background-color:color-mix(in oklab,var(--color-green-600) 20%,transparent)}}.bg-green-900\/10{background-color:#0d542b1a}@supports (color:color-mix(in lab,red,red)){.bg-green-900\/10{background-color:color-mix(in oklab,var(--color-green-900) 10%,transparent)}}.bg-green-900\/30{background-color:#0d542b4d}@supports (color:color-mix(in lab,red,red)){.bg-green-900\/30{background-color:color-mix(in oklab,var(--color-green-900) 30%,transparent)}}.bg-green-900\/40{background-color:#0d542b66}@supports (color:color-mix(in lab,red,red)){.bg-green-900\/40{background-color:color-mix(in oklab,var(--color-green-900) 40%,transparent)}}.bg-green-900\/50{background-color:#0d542b80}@supports (color:color-mix(in lab,red,red)){.bg-green-900\/50{background-color:color-mix(in oklab,var(--color-green-900) 50%,transparent)}}.bg-orange-600\/20{background-color:#f0510033}@supports (color:color-mix(in lab,red,red)){.bg-orange-600\/20{background-color:color-mix(in oklab,var(--color-orange-600) 20%,transparent)}}.bg-purple-500{background-color:var(--color-purple-500)}.bg-purple-600\/20{background-color:#9810fa33}@supports (color:color-mix(in lab,red,red)){.bg-purple-600\/20{background-color:color-mix(in oklab,var(--color-purple-600) 20%,transparent)}}.bg-purple-900\/50{background-color:#59168b80}@supports (color:color-mix(in lab,red,red)){.bg-purple-900\/50{background-color:color-mix(in oklab,var(--color-purple-900) 50%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-900\/10{background-color:#82181a1a}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/10{background-color:color-mix(in oklab,var(--color-red-900) 10%,transparent)}}.bg-red-900\/30{background-color:#82181a4d}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/30{background-color:color-mix(in oklab,var(--color-red-900) 30%,transparent)}}.bg-red-900\/40{background-color:#82181a66}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/40{background-color:color-mix(in oklab,var(--color-red-900) 40%,transparent)}}.bg-red-900\/50{background-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/50{background-color:color-mix(in oklab,var(--color-red-900) 50%,transparent)}}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-yellow-600{background-color:var(--color-yellow-600)}.bg-yellow-900\/10{background-color:#733e0a1a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-900\/10{background-color:color-mix(in oklab,var(--color-yellow-900) 10%,transparent)}}.bg-yellow-900\/20{background-color:#733e0a33}@supports (color:color-mix(in lab,red,red)){.bg-yellow-900\/20{background-color:color-mix(in oklab,var(--color-yellow-900) 20%,transparent)}}.bg-yellow-900\/40{background-color:#733e0a66}@supports (color:color-mix(in lab,red,red)){.bg-yellow-900\/40{background-color:color-mix(in oklab,var(--color-yellow-900) 40%,transparent)}}.bg-yellow-900\/50{background-color:#733e0a80}@supports (color:color-mix(in lab,red,red)){.bg-yellow-900\/50{background-color:color-mix(in oklab,var(--color-yellow-900) 50%,transparent)}}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-green-950\/20{--tw-gradient-from:#032e1533}@supports (color:color-mix(in lab,red,red)){.from-green-950\/20{--tw-gradient-from:color-mix(in oklab, var(--color-green-950) 20%, transparent)}}.from-green-950\/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))}.to-gray-900{--tw-gradient-to:var(--color-gray-900);--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-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.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-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-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-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.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-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-\[11px\]{font-size:11px}.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-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-blue-200{color:var(--color-blue-200)}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-emerald-300{color:var(--color-emerald-300)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-green-300{color:var(--color-green-300)}.text-green-400{color:var(--color-green-400)}.text-orange-400{color:var(--color-orange-400)}.text-purple-400{color:var(--color-purple-400)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-white{color:var(--color-white)}.text-yellow-300{color:var(--color-yellow-300)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-400\/70{color:#fac800b3}@supports (color:color-mix(in lab,red,red)){.text-yellow-400\/70{color:color-mix(in oklab,var(--color-yellow-400) 70%,transparent)}}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.opacity-0{opacity:0}.opacity-100{opacity:1}.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)}.filter{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,)}.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-200{--tw-duration:.2s;transition-duration:.2s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}@media(hover:hover){.hover\:border-gray-700:hover{border-color:var(--color-gray-700)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-blue-900\/50:hover{background-color:#1c398e80}@supports (color:color-mix(in lab,red,red)){.hover\:bg-blue-900\/50:hover{background-color:color-mix(in oklab,var(--color-blue-900) 50%,transparent)}}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-gray-800\/30:hover{background-color:#1e29394d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/30:hover{background-color:color-mix(in oklab,var(--color-gray-800) 30%,transparent)}}.hover\:bg-gray-800\/50:hover{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/50:hover{background-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.hover\:bg-green-700:hover{background-color:var(--color-green-700)}.hover\:bg-yellow-700:hover{background-color:var(--color-yellow-700)}.hover\:text-blue-100:hover{color:var(--color-blue-100)}.hover\:text-blue-300:hover{color:var(--color-blue-300)}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-white:hover{color:var(--color-white)}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:border-transparent:focus{border-color:#0000}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + 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\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.disabled\:bg-gray-700:disabled{background-color:var(--color-gray-700)}.disabled\:text-gray-500:disabled{color:var(--color-gray-500)}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}}@media(min-width:48rem){.md\:ml-60{margin-left:calc(var(--spacing) * 60)}.md\:hidden{display:none}.md\:translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:gap-4{gap:calc(var(--spacing) * 4)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}}@media(min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:80rem){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}}html{color-scheme:dark}body{background-color:var(--color-bg-primary);color:var(--color-text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}#root{min-height:100vh}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--color-bg-secondary)}::-webkit-scrollbar-thumb{background:var(--color-border-default);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--color-text-muted)}.card{background-color:var(--color-bg-card);border:1px solid var(--color-border-default);border-radius:.75rem}.card:hover{background-color:var(--color-bg-card-hover)}:focus-visible{outline:2px solid var(--color-accent-blue);outline-offset:2px}@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-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-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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-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-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}} diff --git a/web/dist/assets/index-BarGrDiR.css b/web/dist/assets/index-BarGrDiR.css deleted file mode 100644 index e3678e7fd..000000000 --- a/web/dist/assets/index-BarGrDiR.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.2.0 | 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-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-font-weight:initial;--tw-tracking: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-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-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-700:oklch(50.5% .213 27.518);--color-red-900:oklch(39.6% .141 25.723);--color-orange-400:oklch(75% .183 55.934);--color-orange-600:oklch(64.6% .222 41.116);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-900:oklch(37.8% .077 168.94);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-900:oklch(38.1% .176 304.987);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-4xl:56rem;--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: 1.5 ;--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);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-bounce:bounce 1s infinite;--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-bg-primary:#0a0a0f;--color-bg-secondary:#12121a;--color-bg-card:#1a1a2e;--color-bg-card-hover:#22223a;--color-border-default:#2a2a3e;--color-accent-blue:#3b82f6;--color-text-primary:#e2e8f0;--color-text-muted:#64748b}}@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%;-moz-tab-size:4;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;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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset: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%}.right-2{right:calc(var(--spacing) * 2)}.left-0{left:calc(var(--spacing) * 0)}.left-3{left:calc(var(--spacing) * 3)}.z-30{z-index:30}.z-40{z-index:40}.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-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.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-6{margin-top:calc(var(--spacing) * 6)}.mt-auto{margin-top:auto}.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)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-32{height:calc(var(--spacing) * 32)}.h-64{height:calc(var(--spacing) * 64)}.h-\[calc\(100vh-3\.5rem\)\]{height:calc(100vh - 3.5rem)}.h-full{height:100%}.h-screen{height:100vh}.max-h-64{max-height:calc(var(--spacing) * 64)}.min-h-\[500px\]{min-height:500px}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-20{width:calc(var(--spacing) * 20)}.w-60{width:calc(var(--spacing) * 60)}.w-full{width:100%}.w-px{width:1px}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[75\%\]{max-width:75%}.max-w-\[200px\]{max-width:200px}.max-w-\[300px\]{max-width:300px}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-1{--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-6{--tw-translate-x:calc(var(--spacing) * 6);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}: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-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-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)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-4{row-gap:calc(var(--spacing) * 4)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y: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-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.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-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-700\/50{border-color:#1447e680}@supports (color:color-mix(in lab,red,red)){.border-blue-700\/50{border-color:color-mix(in oklab,var(--color-blue-700) 50%,transparent)}}.border-blue-700\/70{border-color:#1447e6b3}@supports (color:color-mix(in lab,red,red)){.border-blue-700\/70{border-color:color-mix(in oklab,var(--color-blue-700) 70%,transparent)}}.border-blue-800{border-color:var(--color-blue-800)}.border-blue-800\/50{border-color:#193cb880}@supports (color:color-mix(in lab,red,red)){.border-blue-800\/50{border-color:color-mix(in oklab,var(--color-blue-800) 50%,transparent)}}.border-emerald-700\/60{border-color:#00795699}@supports (color:color-mix(in lab,red,red)){.border-emerald-700\/60{border-color:color-mix(in oklab,var(--color-emerald-700) 60%,transparent)}}.border-gray-600{border-color:var(--color-gray-600)}.border-gray-700{border-color:var(--color-gray-700)}.border-gray-800{border-color:var(--color-gray-800)}.border-gray-800\/50{border-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.border-gray-800\/50{border-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.border-green-500\/30{border-color:#00c7584d}@supports (color:color-mix(in lab,red,red)){.border-green-500\/30{border-color:color-mix(in oklab,var(--color-green-500) 30%,transparent)}}.border-green-700{border-color:var(--color-green-700)}.border-green-700\/40{border-color:#00813866}@supports (color:color-mix(in lab,red,red)){.border-green-700\/40{border-color:color-mix(in oklab,var(--color-green-700) 40%,transparent)}}.border-green-700\/50{border-color:#00813880}@supports (color:color-mix(in lab,red,red)){.border-green-700\/50{border-color:color-mix(in oklab,var(--color-green-700) 50%,transparent)}}.border-green-700\/70{border-color:#008138b3}@supports (color:color-mix(in lab,red,red)){.border-green-700\/70{border-color:color-mix(in oklab,var(--color-green-700) 70%,transparent)}}.border-green-800{border-color:var(--color-green-800)}.border-purple-700\/50{border-color:#8200da80}@supports (color:color-mix(in lab,red,red)){.border-purple-700\/50{border-color:color-mix(in oklab,var(--color-purple-700) 50%,transparent)}}.border-red-500\/30{border-color:#fb2c364d}@supports (color:color-mix(in lab,red,red)){.border-red-500\/30{border-color:color-mix(in oklab,var(--color-red-500) 30%,transparent)}}.border-red-700{border-color:var(--color-red-700)}.border-red-700\/40{border-color:#bf000f66}@supports (color:color-mix(in lab,red,red)){.border-red-700\/40{border-color:color-mix(in oklab,var(--color-red-700) 40%,transparent)}}.border-red-700\/50{border-color:#bf000f80}@supports (color:color-mix(in lab,red,red)){.border-red-700\/50{border-color:color-mix(in oklab,var(--color-red-700) 50%,transparent)}}.border-yellow-500\/30{border-color:#edb2004d}@supports (color:color-mix(in lab,red,red)){.border-yellow-500\/30{border-color:color-mix(in oklab,var(--color-yellow-500) 30%,transparent)}}.border-yellow-700\/40{border-color:#a3610066}@supports (color:color-mix(in lab,red,red)){.border-yellow-700\/40{border-color:color-mix(in oklab,var(--color-yellow-700) 40%,transparent)}}.border-yellow-700\/50{border-color:#a3610080}@supports (color:color-mix(in lab,red,red)){.border-yellow-700\/50{border-color:color-mix(in oklab,var(--color-yellow-700) 50%,transparent)}}.border-yellow-800\/50{border-color:#874b0080}@supports (color:color-mix(in lab,red,red)){.border-yellow-800\/50{border-color:color-mix(in oklab,var(--color-yellow-800) 50%,transparent)}}.border-t-transparent{border-top-color:#0000}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,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-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black) 70%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-600\/20{background-color:#155dfc33}@supports (color:color-mix(in lab,red,red)){.bg-blue-600\/20{background-color:color-mix(in oklab,var(--color-blue-600) 20%,transparent)}}.bg-blue-900\/30{background-color:#1c398e4d}@supports (color:color-mix(in lab,red,red)){.bg-blue-900\/30{background-color:color-mix(in oklab,var(--color-blue-900) 30%,transparent)}}.bg-blue-900\/40{background-color:#1c398e66}@supports (color:color-mix(in lab,red,red)){.bg-blue-900\/40{background-color:color-mix(in oklab,var(--color-blue-900) 40%,transparent)}}.bg-blue-900\/50{background-color:#1c398e80}@supports (color:color-mix(in lab,red,red)){.bg-blue-900\/50{background-color:color-mix(in oklab,var(--color-blue-900) 50%,transparent)}}.bg-blue-950\/30{background-color:#1624564d}@supports (color:color-mix(in lab,red,red)){.bg-blue-950\/30{background-color:color-mix(in oklab,var(--color-blue-950) 30%,transparent)}}.bg-emerald-900\/40{background-color:#004e3b66}@supports (color:color-mix(in lab,red,red)){.bg-emerald-900\/40{background-color:color-mix(in oklab,var(--color-emerald-900) 40%,transparent)}}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-700{background-color:var(--color-gray-700)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.bg-gray-900{background-color:var(--color-gray-900)}.bg-gray-900\/80{background-color:#101828cc}@supports (color:color-mix(in lab,red,red)){.bg-gray-900\/80{background-color:color-mix(in oklab,var(--color-gray-900) 80%,transparent)}}.bg-gray-950{background-color:var(--color-gray-950)}.bg-gray-950\/50{background-color:#03071280}@supports (color:color-mix(in lab,red,red)){.bg-gray-950\/50{background-color:color-mix(in oklab,var(--color-gray-950) 50%,transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-green-600{background-color:var(--color-green-600)}.bg-green-600\/20{background-color:#00a54433}@supports (color:color-mix(in lab,red,red)){.bg-green-600\/20{background-color:color-mix(in oklab,var(--color-green-600) 20%,transparent)}}.bg-green-900\/10{background-color:#0d542b1a}@supports (color:color-mix(in lab,red,red)){.bg-green-900\/10{background-color:color-mix(in oklab,var(--color-green-900) 10%,transparent)}}.bg-green-900\/30{background-color:#0d542b4d}@supports (color:color-mix(in lab,red,red)){.bg-green-900\/30{background-color:color-mix(in oklab,var(--color-green-900) 30%,transparent)}}.bg-green-900\/40{background-color:#0d542b66}@supports (color:color-mix(in lab,red,red)){.bg-green-900\/40{background-color:color-mix(in oklab,var(--color-green-900) 40%,transparent)}}.bg-green-900\/50{background-color:#0d542b80}@supports (color:color-mix(in lab,red,red)){.bg-green-900\/50{background-color:color-mix(in oklab,var(--color-green-900) 50%,transparent)}}.bg-orange-600\/20{background-color:#f0510033}@supports (color:color-mix(in lab,red,red)){.bg-orange-600\/20{background-color:color-mix(in oklab,var(--color-orange-600) 20%,transparent)}}.bg-purple-500{background-color:var(--color-purple-500)}.bg-purple-600\/20{background-color:#9810fa33}@supports (color:color-mix(in lab,red,red)){.bg-purple-600\/20{background-color:color-mix(in oklab,var(--color-purple-600) 20%,transparent)}}.bg-purple-900\/50{background-color:#59168b80}@supports (color:color-mix(in lab,red,red)){.bg-purple-900\/50{background-color:color-mix(in oklab,var(--color-purple-900) 50%,transparent)}}.bg-red-500{background-color:var(--color-red-500)}.bg-red-900\/10{background-color:#82181a1a}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/10{background-color:color-mix(in oklab,var(--color-red-900) 10%,transparent)}}.bg-red-900\/30{background-color:#82181a4d}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/30{background-color:color-mix(in oklab,var(--color-red-900) 30%,transparent)}}.bg-red-900\/40{background-color:#82181a66}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/40{background-color:color-mix(in oklab,var(--color-red-900) 40%,transparent)}}.bg-red-900\/50{background-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/50{background-color:color-mix(in oklab,var(--color-red-900) 50%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-yellow-600{background-color:var(--color-yellow-600)}.bg-yellow-900\/10{background-color:#733e0a1a}@supports (color:color-mix(in lab,red,red)){.bg-yellow-900\/10{background-color:color-mix(in oklab,var(--color-yellow-900) 10%,transparent)}}.bg-yellow-900\/20{background-color:#733e0a33}@supports (color:color-mix(in lab,red,red)){.bg-yellow-900\/20{background-color:color-mix(in oklab,var(--color-yellow-900) 20%,transparent)}}.bg-yellow-900\/30{background-color:#733e0a4d}@supports (color:color-mix(in lab,red,red)){.bg-yellow-900\/30{background-color:color-mix(in oklab,var(--color-yellow-900) 30%,transparent)}}.bg-yellow-900\/40{background-color:#733e0a66}@supports (color:color-mix(in lab,red,red)){.bg-yellow-900\/40{background-color:color-mix(in oklab,var(--color-yellow-900) 40%,transparent)}}.bg-yellow-900\/50{background-color:#733e0a80}@supports (color:color-mix(in lab,red,red)){.bg-yellow-900\/50{background-color:color-mix(in oklab,var(--color-yellow-900) 50%,transparent)}}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-green-950\/20{--tw-gradient-from:#032e1533}@supports (color:color-mix(in lab,red,red)){.from-green-950\/20{--tw-gradient-from:color-mix(in oklab, var(--color-green-950) 20%, transparent)}}.from-green-950\/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))}.to-gray-900{--tw-gradient-to:var(--color-gray-900);--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-3{padding:calc(var(--spacing) * 3)}.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-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-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-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.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-16{padding-right:calc(var(--spacing) * 16)}.pl-9{padding-left:calc(var(--spacing) * 9)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.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-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-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.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-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-blue-200{color:var(--color-blue-200)}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-emerald-300{color:var(--color-emerald-300)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-green-300{color:var(--color-green-300)}.text-green-400{color:var(--color-green-400)}.text-orange-400{color:var(--color-orange-400)}.text-purple-400{color:var(--color-purple-400)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-white{color:var(--color-white)}.text-yellow-300{color:var(--color-yellow-300)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-400\/70{color:#fac800b3}@supports (color:color-mix(in lab,red,red)){.text-yellow-400\/70{color:color-mix(in oklab,var(--color-yellow-400) 70%,transparent)}}.text-yellow-500{color:var(--color-yellow-500)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.opacity-0{opacity:0}.opacity-100{opacity:1}.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)}.filter{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,)}.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-200{--tw-duration:.2s;transition-duration:.2s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}@media(hover:hover){.hover\:border-gray-700:hover{border-color:var(--color-gray-700)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-blue-900\/50:hover{background-color:#1c398e80}@supports (color:color-mix(in lab,red,red)){.hover\:bg-blue-900\/50:hover{background-color:color-mix(in oklab,var(--color-blue-900) 50%,transparent)}}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-gray-800\/30:hover{background-color:#1e29394d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/30:hover{background-color:color-mix(in oklab,var(--color-gray-800) 30%,transparent)}}.hover\:bg-gray-800\/50:hover{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/50:hover{background-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.hover\:bg-green-700:hover{background-color:var(--color-green-700)}.hover\:bg-yellow-700:hover{background-color:var(--color-yellow-700)}.hover\:text-blue-100:hover{color:var(--color-blue-100)}.hover\:text-blue-300:hover{color:var(--color-blue-300)}.hover\:text-gray-200:hover{color:var(--color-gray-200)}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-white:hover{color:var(--color-white)}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:border-transparent:focus{border-color:#0000}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + 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\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.disabled\:bg-gray-700:disabled{background-color:var(--color-gray-700)}.disabled\:text-gray-500:disabled{color:var(--color-gray-500)}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}@media(min-width:40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}}@media(min-width:48rem){.md\:ml-60{margin-left:calc(var(--spacing) * 60)}.md\:hidden{display:none}.md\:translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:gap-4{gap:calc(var(--spacing) * 4)}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}}@media(min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:80rem){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}}html{color-scheme:dark}body{background-color:var(--color-bg-primary);color:var(--color-text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}#root{min-height:100vh}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--color-bg-secondary)}::-webkit-scrollbar-thumb{background:var(--color-border-default);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--color-text-muted)}.card{background-color:var(--color-bg-card);border:1px solid var(--color-border-default);border-radius:.75rem}.card:hover{background-color:var(--color-bg-card-hover)}:focus-visible{outline:2px solid var(--color-accent-blue);outline-offset:2px}@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-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-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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-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-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}} diff --git a/web/dist/assets/index-Bv7iLnHl.js b/web/dist/assets/index-Bv7iLnHl.js deleted file mode 100644 index 9a31d32e0..000000000 --- a/web/dist/assets/index-Bv7iLnHl.js +++ /dev/null @@ -1,305 +0,0 @@ -var Iy=Object.defineProperty;var Py=(i,r,f)=>r in i?Iy(i,r,{enumerable:!0,configurable:!0,writable:!0,value:f}):i[r]=f;var Be=(i,r,f)=>Py(i,typeof r!="symbol"?r+"":r,f);(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const m of document.querySelectorAll('link[rel="modulepreload"]'))o(m);new MutationObserver(m=>{for(const h of m)if(h.type==="childList")for(const p of h.addedNodes)p.tagName==="LINK"&&p.rel==="modulepreload"&&o(p)}).observe(document,{childList:!0,subtree:!0});function f(m){const h={};return m.integrity&&(h.integrity=m.integrity),m.referrerPolicy&&(h.referrerPolicy=m.referrerPolicy),m.crossOrigin==="use-credentials"?h.credentials="include":m.crossOrigin==="anonymous"?h.credentials="omit":h.credentials="same-origin",h}function o(m){if(m.ep)return;m.ep=!0;const h=f(m);fetch(m.href,h)}})();function Fm(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var Pc={exports:{}},lu={};/** - * @license React - * react-jsx-runtime.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var _m;function eg(){if(_m)return lu;_m=1;var i=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function f(o,m,h){var p=null;if(h!==void 0&&(p=""+h),m.key!==void 0&&(p=""+m.key),"key"in m){h={};for(var j in m)j!=="key"&&(h[j]=m[j])}else h=m;return m=h.ref,{$$typeof:i,type:o,key:p,ref:m!==void 0?m:null,props:h}}return lu.Fragment=r,lu.jsx=f,lu.jsxs=f,lu}var Am;function tg(){return Am||(Am=1,Pc.exports=eg()),Pc.exports}var s=tg(),er={exports:{}},se={};/** - * @license React - * react.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var wm;function lg(){if(wm)return se;wm=1;var i=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),f=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),m=Symbol.for("react.profiler"),h=Symbol.for("react.consumer"),p=Symbol.for("react.context"),j=Symbol.for("react.forward_ref"),v=Symbol.for("react.suspense"),g=Symbol.for("react.memo"),_=Symbol.for("react.lazy"),N=Symbol.for("react.activity"),z=Symbol.iterator;function B(S){return S===null||typeof S!="object"?null:(S=z&&S[z]||S["@@iterator"],typeof S=="function"?S:null)}var q={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},G=Object.assign,L={};function Y(S,U,Q){this.props=S,this.context=U,this.refs=L,this.updater=Q||q}Y.prototype.isReactComponent={},Y.prototype.setState=function(S,U){if(typeof S!="object"&&typeof S!="function"&&S!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,S,U,"setState")},Y.prototype.forceUpdate=function(S){this.updater.enqueueForceUpdate(this,S,"forceUpdate")};function V(){}V.prototype=Y.prototype;function H(S,U,Q){this.props=S,this.context=U,this.refs=L,this.updater=Q||q}var I=H.prototype=new V;I.constructor=H,G(I,Y.prototype),I.isPureReactComponent=!0;var te=Array.isArray;function fe(){}var J={H:null,A:null,T:null,S:null},$=Object.prototype.hasOwnProperty;function Ne(S,U,Q){var Z=Q.ref;return{$$typeof:i,type:S,key:U,ref:Z!==void 0?Z:null,props:Q}}function Ue(S,U){return Ne(S.type,U,S.props)}function ot(S){return typeof S=="object"&&S!==null&&S.$$typeof===i}function He(S){var U={"=":"=0",":":"=2"};return"$"+S.replace(/[=:]/g,function(Q){return U[Q]})}var zt=/\/+/g;function ue(S,U){return typeof S=="object"&&S!==null&&S.key!=null?He(""+S.key):U.toString(36)}function Qe(S){switch(S.status){case"fulfilled":return S.value;case"rejected":throw S.reason;default:switch(typeof S.status=="string"?S.then(fe,fe):(S.status="pending",S.then(function(U){S.status==="pending"&&(S.status="fulfilled",S.value=U)},function(U){S.status==="pending"&&(S.status="rejected",S.reason=U)})),S.status){case"fulfilled":return S.value;case"rejected":throw S.reason}}throw S}function M(S,U,Q,Z,ne){var de=typeof S;(de==="undefined"||de==="boolean")&&(S=null);var ye=!1;if(S===null)ye=!0;else switch(de){case"bigint":case"string":case"number":ye=!0;break;case"object":switch(S.$$typeof){case i:case r:ye=!0;break;case _:return ye=S._init,M(ye(S._payload),U,Q,Z,ne)}}if(ye)return ne=ne(S),ye=Z===""?"."+ue(S,0):Z,te(ne)?(Q="",ye!=null&&(Q=ye.replace(zt,"$&/")+"/"),M(ne,U,Q,"",function(Vl){return Vl})):ne!=null&&(ot(ne)&&(ne=Ue(ne,Q+(ne.key==null||S&&S.key===ne.key?"":(""+ne.key).replace(zt,"$&/")+"/")+ye)),U.push(ne)),1;ye=0;var Pe=Z===""?".":Z+":";if(te(S))for(var ke=0;ke>>1,Ee=M[ve];if(0>>1;vem(Q,le))Zm(ne,Q)?(M[ve]=ne,M[Z]=le,ve=Z):(M[ve]=Q,M[U]=le,ve=U);else if(Zm(ne,le))M[ve]=ne,M[Z]=le,ve=Z;else break e}}return X}function m(M,X){var le=M.sortIndex-X.sortIndex;return le!==0?le:M.id-X.id}if(i.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var h=performance;i.unstable_now=function(){return h.now()}}else{var p=Date,j=p.now();i.unstable_now=function(){return p.now()-j}}var v=[],g=[],_=1,N=null,z=3,B=!1,q=!1,G=!1,L=!1,Y=typeof setTimeout=="function"?setTimeout:null,V=typeof clearTimeout=="function"?clearTimeout:null,H=typeof setImmediate<"u"?setImmediate:null;function I(M){for(var X=f(g);X!==null;){if(X.callback===null)o(g);else if(X.startTime<=M)o(g),X.sortIndex=X.expirationTime,r(v,X);else break;X=f(g)}}function te(M){if(G=!1,I(M),!q)if(f(v)!==null)q=!0,fe||(fe=!0,He());else{var X=f(g);X!==null&&Qe(te,X.startTime-M)}}var fe=!1,J=-1,$=5,Ne=-1;function Ue(){return L?!0:!(i.unstable_now()-Ne<$)}function ot(){if(L=!1,fe){var M=i.unstable_now();Ne=M;var X=!0;try{e:{q=!1,G&&(G=!1,V(J),J=-1),B=!0;var le=z;try{t:{for(I(M),N=f(v);N!==null&&!(N.expirationTime>M&&Ue());){var ve=N.callback;if(typeof ve=="function"){N.callback=null,z=N.priorityLevel;var Ee=ve(N.expirationTime<=M);if(M=i.unstable_now(),typeof Ee=="function"){N.callback=Ee,I(M),X=!0;break t}N===f(v)&&o(v),I(M)}else o(v);N=f(v)}if(N!==null)X=!0;else{var S=f(g);S!==null&&Qe(te,S.startTime-M),X=!1}}break e}finally{N=null,z=le,B=!1}X=void 0}}finally{X?He():fe=!1}}}var He;if(typeof H=="function")He=function(){H(ot)};else if(typeof MessageChannel<"u"){var zt=new MessageChannel,ue=zt.port2;zt.port1.onmessage=ot,He=function(){ue.postMessage(null)}}else He=function(){Y(ot,0)};function Qe(M,X){J=Y(function(){M(i.unstable_now())},X)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(M){M.callback=null},i.unstable_forceFrameRate=function(M){0>M||125ve?(M.sortIndex=le,r(g,M),f(v)===null&&M===f(g)&&(G?(V(J),J=-1):G=!0,Qe(te,le-ve))):(M.sortIndex=Ee,r(v,M),q||B||(q=!0,fe||(fe=!0,He()))),M},i.unstable_shouldYield=Ue,i.unstable_wrapCallback=function(M){var X=z;return function(){var le=z;z=X;try{return M.apply(this,arguments)}finally{z=le}}}})(ar)),ar}var Dm;function ng(){return Dm||(Dm=1,lr.exports=ag()),lr.exports}var nr={exports:{}},ct={};/** - * @license React - * react-dom.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Rm;function ug(){if(Rm)return ct;Rm=1;var i=xr();function r(v){var g="https://react.dev/errors/"+v;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(r){console.error(r)}}return i(),nr.exports=ug(),nr.exports}/** - * @license React - * react-dom-client.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Um;function sg(){if(Um)return au;Um=1;var i=ng(),r=xr(),f=ig();function o(e){var t="https://react.dev/errors/"+e;if(1Ee||(e.current=ve[Ee],ve[Ee]=null,Ee--)}function Q(e,t){Ee++,ve[Ee]=e.current,e.current=t}var Z=S(null),ne=S(null),de=S(null),ye=S(null);function Pe(e,t){switch(Q(de,t),Q(ne,e),Q(Z,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Fd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Fd(t),e=Wd(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}U(Z),Q(Z,e)}function ke(){U(Z),U(ne),U(de)}function Vl(e){e.memoizedState!==null&&Q(ye,e);var t=Z.current,l=Wd(t,e.type);t!==l&&(Q(ne,e),Q(Z,l))}function ya(e){ne.current===e&&(U(Z),U(ne)),ye.current===e&&(U(ye),In._currentValue=le)}var cn,qi;function Vt(e){if(cn===void 0)try{throw Error()}catch(l){var t=l.stack.trim().match(/\n( *(at )?)/);cn=t&&t[1]||"",qi=-1)":-1n||x[a]!==C[n]){var D=` -`+x[a].replace(" at new "," at ");return e.displayName&&D.includes("")&&(D=D.replace("",e.displayName)),D}while(1<=a&&0<=n);break}}}finally{k=!1,Error.prepareStackTrace=l}return(l=e?e.displayName||e.name:"")?Vt(l):""}function ie(e,t){switch(e.tag){case 26:case 27:case 5:return Vt(e.type);case 16:return Vt("Lazy");case 13:return e.child!==t&&t!==null?Vt("Suspense Fallback"):Vt("Suspense");case 19:return Vt("SuspenseList");case 0:case 15:return P(e.type,!1);case 11:return P(e.type.render,!1);case 1:return P(e.type,!0);case 31:return Vt("Activity");default:return""}}function Ye(e){try{var t="",l=null;do t+=ie(e,l),l=e,e=e.return;while(e);return t}catch(a){return` -Error generating stack: `+a.message+` -`+a.stack}}var _e=Object.prototype.hasOwnProperty,W=i.unstable_scheduleCallback,De=i.unstable_cancelCallback,Kt=i.unstable_shouldYield,Kl=i.unstable_requestPaint,We=i.unstable_now,et=i.unstable_getCurrentPriorityLevel,ga=i.unstable_ImmediatePriority,rn=i.unstable_UserBlockingPriority,bl=i.unstable_NormalPriority,xa=i.unstable_LowPriority,on=i.unstable_IdlePriority,ki=i.log,Jl=i.unstable_setDisableYieldValue,$l=null,vt=null;function Sl(e){if(typeof ki=="function"&&Jl(e),vt&&typeof vt.setStrictMode=="function")try{vt.setStrictMode($l,e)}catch{}}var bt=Math.clz32?Math.clz32:B0,H0=Math.log,L0=Math.LN2;function B0(e){return e>>>=0,e===0?32:31-(H0(e)/L0|0)|0}var mu=256,hu=262144,yu=4194304;function Fl(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function gu(e,t,l){var a=e.pendingLanes;if(a===0)return 0;var n=0,u=e.suspendedLanes,c=e.pingedLanes;e=e.warmLanes;var d=a&134217727;return d!==0?(a=d&~u,a!==0?n=Fl(a):(c&=d,c!==0?n=Fl(c):l||(l=d&~e,l!==0&&(n=Fl(l))))):(d=a&~u,d!==0?n=Fl(d):c!==0?n=Fl(c):l||(l=a&~e,l!==0&&(n=Fl(l)))),n===0?0:t!==0&&t!==n&&(t&u)===0&&(u=n&-n,l=t&-t,u>=l||u===32&&(l&4194048)!==0)?t:n}function fn(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function q0(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function wr(){var e=yu;return yu<<=1,(yu&62914560)===0&&(yu=4194304),e}function Yi(e){for(var t=[],l=0;31>l;l++)t.push(e);return t}function dn(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function k0(e,t,l,a,n,u){var c=e.pendingLanes;e.pendingLanes=l,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=l,e.entangledLanes&=l,e.errorRecoveryDisabledLanes&=l,e.shellSuspendCounter=0;var d=e.entanglements,x=e.expirationTimes,C=e.hiddenUpdates;for(l=c&~l;0"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var V0=/[\n"\\]/g;function Dt(e){return e.replace(V0,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function Ki(e,t,l,a,n,u,c,d){e.name="",c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"?e.type=c:e.removeAttribute("type"),t!=null?c==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Mt(t)):e.value!==""+Mt(t)&&(e.value=""+Mt(t)):c!=="submit"&&c!=="reset"||e.removeAttribute("value"),t!=null?Ji(e,c,Mt(t)):l!=null?Ji(e,c,Mt(l)):a!=null&&e.removeAttribute("value"),n==null&&u!=null&&(e.defaultChecked=!!u),n!=null&&(e.checked=n&&typeof n!="function"&&typeof n!="symbol"),d!=null&&typeof d!="function"&&typeof d!="symbol"&&typeof d!="boolean"?e.name=""+Mt(d):e.removeAttribute("name")}function Gr(e,t,l,a,n,u,c,d){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(e.type=u),t!=null||l!=null){if(!(u!=="submit"&&u!=="reset"||t!=null)){Vi(e);return}l=l!=null?""+Mt(l):"",t=t!=null?""+Mt(t):l,d||t===e.value||(e.value=t),e.defaultValue=t}a=a??n,a=typeof a!="function"&&typeof a!="symbol"&&!!a,e.checked=d?e.checked:!!a,e.defaultChecked=!!a,c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"&&(e.name=c),Vi(e)}function Ji(e,t,l){t==="number"&&vu(e.ownerDocument)===e||e.defaultValue===""+l||(e.defaultValue=""+l)}function ja(e,t,l,a){if(e=e.options,t){t={};for(var n=0;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Pi=!1;if(el)try{var gn={};Object.defineProperty(gn,"passive",{get:function(){Pi=!0}}),window.addEventListener("test",gn,gn),window.removeEventListener("test",gn,gn)}catch{Pi=!1}var jl=null,es=null,Su=null;function $r(){if(Su)return Su;var e,t=es,l=t.length,a,n="value"in jl?jl.value:jl.textContent,u=n.length;for(e=0;e=vn),to=" ",lo=!1;function ao(e,t){switch(e){case"keyup":return bh.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function no(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var _a=!1;function Nh(e,t){switch(e){case"compositionend":return no(t);case"keypress":return t.which!==32?null:(lo=!0,to);case"textInput":return e=t.data,e===to&&lo?null:e;default:return null}}function jh(e,t){if(_a)return e==="compositionend"||!us&&ao(e,t)?(e=$r(),Su=es=jl=null,_a=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:l,offset:t-e};e=a}e:{for(;l;){if(l.nextSibling){l=l.nextSibling;break e}l=l.parentNode}l=void 0}l=mo(l)}}function yo(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?yo(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function go(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=vu(e.document);t instanceof e.HTMLIFrameElement;){try{var l=typeof t.contentWindow.location.href=="string"}catch{l=!1}if(l)e=t.contentWindow;else break;t=vu(e.document)}return t}function cs(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var Mh=el&&"documentMode"in document&&11>=document.documentMode,Aa=null,rs=null,jn=null,os=!1;function xo(e,t,l){var a=l.window===l?l.document:l.nodeType===9?l:l.ownerDocument;os||Aa==null||Aa!==vu(a)||(a=Aa,"selectionStart"in a&&cs(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),jn&&Nn(jn,a)||(jn=a,a=hi(rs,"onSelect"),0>=c,n-=c,Jt=1<<32-bt(t)+n|l<oe?(xe=F,F=null):xe=F.sibling;var Se=A(E,F,T[oe],R);if(Se===null){F===null&&(F=xe);break}e&&F&&Se.alternate===null&&t(E,F),b=u(Se,b,oe),be===null?ee=Se:be.sibling=Se,be=Se,F=xe}if(oe===T.length)return l(E,F),pe&&ll(E,oe),ee;if(F===null){for(;oeoe?(xe=F,F=null):xe=F.sibling;var Zl=A(E,F,Se.value,R);if(Zl===null){F===null&&(F=xe);break}e&&F&&Zl.alternate===null&&t(E,F),b=u(Zl,b,oe),be===null?ee=Zl:be.sibling=Zl,be=Zl,F=xe}if(Se.done)return l(E,F),pe&&ll(E,oe),ee;if(F===null){for(;!Se.done;oe++,Se=T.next())Se=O(E,Se.value,R),Se!==null&&(b=u(Se,b,oe),be===null?ee=Se:be.sibling=Se,be=Se);return pe&&ll(E,oe),ee}for(F=a(F);!Se.done;oe++,Se=T.next())Se=w(F,E,oe,Se.value,R),Se!==null&&(e&&Se.alternate!==null&&F.delete(Se.key===null?oe:Se.key),b=u(Se,b,oe),be===null?ee=Se:be.sibling=Se,be=Se);return e&&F.forEach(function(Wy){return t(E,Wy)}),pe&&ll(E,oe),ee}function ze(E,b,T,R){if(typeof T=="object"&&T!==null&&T.type===G&&T.key===null&&(T=T.props.children),typeof T=="object"&&T!==null){switch(T.$$typeof){case B:e:{for(var ee=T.key;b!==null;){if(b.key===ee){if(ee=T.type,ee===G){if(b.tag===7){l(E,b.sibling),R=n(b,T.props.children),R.return=E,E=R;break e}}else if(b.elementType===ee||typeof ee=="object"&&ee!==null&&ee.$$typeof===$&&sa(ee)===b.type){l(E,b.sibling),R=n(b,T.props),wn(R,T),R.return=E,E=R;break e}l(E,b);break}else t(E,b);b=b.sibling}T.type===G?(R=la(T.props.children,E.mode,R,T.key),R.return=E,E=R):(R=Mu(T.type,T.key,T.props,null,E.mode,R),wn(R,T),R.return=E,E=R)}return c(E);case q:e:{for(ee=T.key;b!==null;){if(b.key===ee)if(b.tag===4&&b.stateNode.containerInfo===T.containerInfo&&b.stateNode.implementation===T.implementation){l(E,b.sibling),R=n(b,T.children||[]),R.return=E,E=R;break e}else{l(E,b);break}else t(E,b);b=b.sibling}R=xs(T,E.mode,R),R.return=E,E=R}return c(E);case $:return T=sa(T),ze(E,b,T,R)}if(Qe(T))return K(E,b,T,R);if(He(T)){if(ee=He(T),typeof ee!="function")throw Error(o(150));return T=ee.call(T),ae(E,b,T,R)}if(typeof T.then=="function")return ze(E,b,Bu(T),R);if(T.$$typeof===H)return ze(E,b,Ou(E,T),R);qu(E,T)}return typeof T=="string"&&T!==""||typeof T=="number"||typeof T=="bigint"?(T=""+T,b!==null&&b.tag===6?(l(E,b.sibling),R=n(b,T),R.return=E,E=R):(l(E,b),R=gs(T,E.mode,R),R.return=E,E=R),c(E)):l(E,b)}return function(E,b,T,R){try{An=0;var ee=ze(E,b,T,R);return qa=null,ee}catch(F){if(F===Ba||F===Hu)throw F;var be=Nt(29,F,null,E.mode);return be.lanes=R,be.return=E,be}finally{}}}var ra=ko(!0),Yo=ko(!1),Al=!1;function ws(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function zs(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function wl(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function zl(e,t,l){var a=e.updateQueue;if(a===null)return null;if(a=a.shared,(je&2)!==0){var n=a.pending;return n===null?t.next=t:(t.next=n.next,n.next=t),a.pending=t,t=zu(e),Eo(e,null,l),t}return wu(e,a,t,l),zu(e)}function zn(e,t,l){if(t=t.updateQueue,t!==null&&(t=t.shared,(l&4194048)!==0)){var a=t.lanes;a&=e.pendingLanes,l|=a,t.lanes=l,Mr(e,l)}}function Ms(e,t){var l=e.updateQueue,a=e.alternate;if(a!==null&&(a=a.updateQueue,l===a)){var n=null,u=null;if(l=l.firstBaseUpdate,l!==null){do{var c={lane:l.lane,tag:l.tag,payload:l.payload,callback:null,next:null};u===null?n=u=c:u=u.next=c,l=l.next}while(l!==null);u===null?n=u=t:u=u.next=t}else n=u=t;l={baseState:a.baseState,firstBaseUpdate:n,lastBaseUpdate:u,shared:a.shared,callbacks:a.callbacks},e.updateQueue=l;return}e=l.lastBaseUpdate,e===null?l.firstBaseUpdate=t:e.next=t,l.lastBaseUpdate=t}var Ds=!1;function Mn(){if(Ds){var e=La;if(e!==null)throw e}}function Dn(e,t,l,a){Ds=!1;var n=e.updateQueue;Al=!1;var u=n.firstBaseUpdate,c=n.lastBaseUpdate,d=n.shared.pending;if(d!==null){n.shared.pending=null;var x=d,C=x.next;x.next=null,c===null?u=C:c.next=C,c=x;var D=e.alternate;D!==null&&(D=D.updateQueue,d=D.lastBaseUpdate,d!==c&&(d===null?D.firstBaseUpdate=C:d.next=C,D.lastBaseUpdate=x))}if(u!==null){var O=n.baseState;c=0,D=C=x=null,d=u;do{var A=d.lane&-536870913,w=A!==d.lane;if(w?(ge&A)===A:(a&A)===A){A!==0&&A===Ha&&(Ds=!0),D!==null&&(D=D.next={lane:0,tag:d.tag,payload:d.payload,callback:null,next:null});e:{var K=e,ae=d;A=t;var ze=l;switch(ae.tag){case 1:if(K=ae.payload,typeof K=="function"){O=K.call(ze,O,A);break e}O=K;break e;case 3:K.flags=K.flags&-65537|128;case 0:if(K=ae.payload,A=typeof K=="function"?K.call(ze,O,A):K,A==null)break e;O=N({},O,A);break e;case 2:Al=!0}}A=d.callback,A!==null&&(e.flags|=64,w&&(e.flags|=8192),w=n.callbacks,w===null?n.callbacks=[A]:w.push(A))}else w={lane:A,tag:d.tag,payload:d.payload,callback:d.callback,next:null},D===null?(C=D=w,x=O):D=D.next=w,c|=A;if(d=d.next,d===null){if(d=n.shared.pending,d===null)break;w=d,d=w.next,w.next=null,n.lastBaseUpdate=w,n.shared.pending=null}}while(!0);D===null&&(x=O),n.baseState=x,n.firstBaseUpdate=C,n.lastBaseUpdate=D,u===null&&(n.shared.lanes=0),Ul|=c,e.lanes=c,e.memoizedState=O}}function Go(e,t){if(typeof e!="function")throw Error(o(191,e));e.call(t)}function Xo(e,t){var l=e.callbacks;if(l!==null)for(e.callbacks=null,e=0;eu?u:8;var c=M.T,d={};M.T=d,Ws(e,!1,t,l);try{var x=n(),C=M.S;if(C!==null&&C(d,x),x!==null&&typeof x=="object"&&typeof x.then=="function"){var D=kh(x,a);Un(e,t,D,_t(e))}else Un(e,t,a,_t(e))}catch(O){Un(e,t,{then:function(){},status:"rejected",reason:O},_t())}finally{X.p=u,c!==null&&d.types!==null&&(c.types=d.types),M.T=c}}function Vh(){}function $s(e,t,l,a){if(e.tag!==5)throw Error(o(476));var n=Nf(e).queue;Sf(e,n,t,le,l===null?Vh:function(){return jf(e),l(a)})}function Nf(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:le,baseState:le,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:il,lastRenderedState:le},next:null};var l={};return t.next={memoizedState:l,baseState:l,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:il,lastRenderedState:l},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function jf(e){var t=Nf(e);t.next===null&&(t=e.alternate.memoizedState),Un(e,t.next.queue,{},_t())}function Fs(){return ut(In)}function Ef(){return Ve().memoizedState}function Tf(){return Ve().memoizedState}function Kh(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var l=_t();e=wl(l);var a=zl(t,e,l);a!==null&&(pt(a,t,l),zn(a,t,l)),t={cache:Ts()},e.payload=t;return}t=t.return}}function Jh(e,t,l){var a=_t();l={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null},$u(e)?_f(t,l):(l=hs(e,t,l,a),l!==null&&(pt(l,e,a),Af(l,t,a)))}function Cf(e,t,l){var a=_t();Un(e,t,l,a)}function Un(e,t,l,a){var n={lane:a,revertLane:0,gesture:null,action:l,hasEagerState:!1,eagerState:null,next:null};if($u(e))_f(t,n);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var c=t.lastRenderedState,d=u(c,l);if(n.hasEagerState=!0,n.eagerState=d,St(d,c))return wu(e,t,n,0),Me===null&&Au(),!1}catch{}finally{}if(l=hs(e,t,n,a),l!==null)return pt(l,e,a),Af(l,t,a),!0}return!1}function Ws(e,t,l,a){if(a={lane:2,revertLane:wc(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},$u(e)){if(t)throw Error(o(479))}else t=hs(e,l,a,2),t!==null&&pt(t,e,2)}function $u(e){var t=e.alternate;return e===re||t!==null&&t===re}function _f(e,t){Ya=Gu=!0;var l=e.pending;l===null?t.next=t:(t.next=l.next,l.next=t),e.pending=t}function Af(e,t,l){if((l&4194048)!==0){var a=t.lanes;a&=e.pendingLanes,l|=a,t.lanes=l,Mr(e,l)}}var Hn={readContext:ut,use:Zu,useCallback:Ge,useContext:Ge,useEffect:Ge,useImperativeHandle:Ge,useLayoutEffect:Ge,useInsertionEffect:Ge,useMemo:Ge,useReducer:Ge,useRef:Ge,useState:Ge,useDebugValue:Ge,useDeferredValue:Ge,useTransition:Ge,useSyncExternalStore:Ge,useId:Ge,useHostTransitionStatus:Ge,useFormState:Ge,useActionState:Ge,useOptimistic:Ge,useMemoCache:Ge,useCacheRefresh:Ge};Hn.useEffectEvent=Ge;var wf={readContext:ut,use:Zu,useCallback:function(e,t){return ft().memoizedState=[e,t===void 0?null:t],e},useContext:ut,useEffect:df,useImperativeHandle:function(e,t,l){l=l!=null?l.concat([e]):null,Ku(4194308,4,gf.bind(null,t,e),l)},useLayoutEffect:function(e,t){return Ku(4194308,4,e,t)},useInsertionEffect:function(e,t){Ku(4,2,e,t)},useMemo:function(e,t){var l=ft();t=t===void 0?null:t;var a=e();if(oa){Sl(!0);try{e()}finally{Sl(!1)}}return l.memoizedState=[a,t],a},useReducer:function(e,t,l){var a=ft();if(l!==void 0){var n=l(t);if(oa){Sl(!0);try{l(t)}finally{Sl(!1)}}}else n=t;return a.memoizedState=a.baseState=n,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:n},a.queue=e,e=e.dispatch=Jh.bind(null,re,e),[a.memoizedState,e]},useRef:function(e){var t=ft();return e={current:e},t.memoizedState=e},useState:function(e){e=Qs(e);var t=e.queue,l=Cf.bind(null,re,t);return t.dispatch=l,[e.memoizedState,l]},useDebugValue:Ks,useDeferredValue:function(e,t){var l=ft();return Js(l,e,t)},useTransition:function(){var e=Qs(!1);return e=Sf.bind(null,re,e.queue,!0,!1),ft().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,l){var a=re,n=ft();if(pe){if(l===void 0)throw Error(o(407));l=l()}else{if(l=t(),Me===null)throw Error(o(349));(ge&127)!==0||$o(a,t,l)}n.memoizedState=l;var u={value:l,getSnapshot:t};return n.queue=u,df(Wo.bind(null,a,u,e),[e]),a.flags|=2048,Xa(9,{destroy:void 0},Fo.bind(null,a,u,l,t),null),l},useId:function(){var e=ft(),t=Me.identifierPrefix;if(pe){var l=$t,a=Jt;l=(a&~(1<<32-bt(a)-1)).toString(32)+l,t="_"+t+"R_"+l,l=Xu++,0<\/script>",u=u.removeChild(u.firstChild);break;case"select":u=typeof a.is=="string"?c.createElement("select",{is:a.is}):c.createElement("select"),a.multiple?u.multiple=!0:a.size&&(u.size=a.size);break;default:u=typeof a.is=="string"?c.createElement(n,{is:a.is}):c.createElement(n)}}u[at]=t,u[dt]=a;e:for(c=t.child;c!==null;){if(c.tag===5||c.tag===6)u.appendChild(c.stateNode);else if(c.tag!==4&&c.tag!==27&&c.child!==null){c.child.return=c,c=c.child;continue}if(c===t)break e;for(;c.sibling===null;){if(c.return===null||c.return===t)break e;c=c.return}c.sibling.return=c.return,c=c.sibling}t.stateNode=u;e:switch(st(u,n,a),n){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break e;case"img":a=!0;break e;default:a=!1}a&&cl(t)}}return Oe(t),fc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,l),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==a&&cl(t);else{if(typeof a!="string"&&t.stateNode===null)throw Error(o(166));if(e=de.current,Oa(t)){if(e=t.stateNode,l=t.memoizedProps,a=null,n=nt,n!==null)switch(n.tag){case 27:case 5:a=n.memoizedProps}e[at]=t,e=!!(e.nodeValue===l||a!==null&&a.suppressHydrationWarning===!0||Jd(e.nodeValue,l)),e||Cl(t,!0)}else e=yi(e).createTextNode(a),e[at]=t,t.stateNode=e}return Oe(t),null;case 31:if(l=t.memoizedState,e===null||e.memoizedState!==null){if(a=Oa(t),l!==null){if(e===null){if(!a)throw Error(o(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(o(557));e[at]=t}else aa(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Oe(t),e=!1}else l=Ss(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=l),e=!0;if(!e)return t.flags&256?(Et(t),t):(Et(t),null);if((t.flags&128)!==0)throw Error(o(558))}return Oe(t),null;case 13:if(a=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(n=Oa(t),a!==null&&a.dehydrated!==null){if(e===null){if(!n)throw Error(o(318));if(n=t.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(o(317));n[at]=t}else aa(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Oe(t),n=!1}else n=Ss(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),n=!0;if(!n)return t.flags&256?(Et(t),t):(Et(t),null)}return Et(t),(t.flags&128)!==0?(t.lanes=l,t):(l=a!==null,e=e!==null&&e.memoizedState!==null,l&&(a=t.child,n=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(n=a.alternate.memoizedState.cachePool.pool),u=null,a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(u=a.memoizedState.cachePool.pool),u!==n&&(a.flags|=2048)),l!==e&&l&&(t.child.flags|=8192),ei(t,t.updateQueue),Oe(t),null);case 4:return ke(),e===null&&Rc(t.stateNode.containerInfo),Oe(t),null;case 10:return nl(t.type),Oe(t),null;case 19:if(U(Ze),a=t.memoizedState,a===null)return Oe(t),null;if(n=(t.flags&128)!==0,u=a.rendering,u===null)if(n)Bn(a,!1);else{if(Xe!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(u=Yu(e),u!==null){for(t.flags|=128,Bn(a,!1),e=u.updateQueue,t.updateQueue=e,ei(t,e),t.subtreeFlags=0,e=l,l=t.child;l!==null;)To(l,e),l=l.sibling;return Q(Ze,Ze.current&1|2),pe&&ll(t,a.treeForkCount),t.child}e=e.sibling}a.tail!==null&&We()>ui&&(t.flags|=128,n=!0,Bn(a,!1),t.lanes=4194304)}else{if(!n)if(e=Yu(u),e!==null){if(t.flags|=128,n=!0,e=e.updateQueue,t.updateQueue=e,ei(t,e),Bn(a,!0),a.tail===null&&a.tailMode==="hidden"&&!u.alternate&&!pe)return Oe(t),null}else 2*We()-a.renderingStartTime>ui&&l!==536870912&&(t.flags|=128,n=!0,Bn(a,!1),t.lanes=4194304);a.isBackwards?(u.sibling=t.child,t.child=u):(e=a.last,e!==null?e.sibling=u:t.child=u,a.last=u)}return a.tail!==null?(e=a.tail,a.rendering=e,a.tail=e.sibling,a.renderingStartTime=We(),e.sibling=null,l=Ze.current,Q(Ze,n?l&1|2:l&1),pe&&ll(t,a.treeForkCount),e):(Oe(t),null);case 22:case 23:return Et(t),Os(),a=t.memoizedState!==null,e!==null?e.memoizedState!==null!==a&&(t.flags|=8192):a&&(t.flags|=8192),a?(l&536870912)!==0&&(t.flags&128)===0&&(Oe(t),t.subtreeFlags&6&&(t.flags|=8192)):Oe(t),l=t.updateQueue,l!==null&&ei(t,l.retryQueue),l=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(l=e.memoizedState.cachePool.pool),a=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(a=t.memoizedState.cachePool.pool),a!==l&&(t.flags|=2048),e!==null&&U(ia),null;case 24:return l=null,e!==null&&(l=e.memoizedState.cache),t.memoizedState.cache!==l&&(t.flags|=2048),nl(Ke),Oe(t),null;case 25:return null;case 30:return null}throw Error(o(156,t.tag))}function Ph(e,t){switch(vs(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return nl(Ke),ke(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return ya(t),null;case 31:if(t.memoizedState!==null){if(Et(t),t.alternate===null)throw Error(o(340));aa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Et(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(o(340));aa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return U(Ze),null;case 4:return ke(),null;case 10:return nl(t.type),null;case 22:case 23:return Et(t),Os(),e!==null&&U(ia),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return nl(Ke),null;case 25:return null;default:return null}}function Pf(e,t){switch(vs(t),t.tag){case 3:nl(Ke),ke();break;case 26:case 27:case 5:ya(t);break;case 4:ke();break;case 31:t.memoizedState!==null&&Et(t);break;case 13:Et(t);break;case 19:U(Ze);break;case 10:nl(t.type);break;case 22:case 23:Et(t),Os(),e!==null&&U(ia);break;case 24:nl(Ke)}}function qn(e,t){try{var l=t.updateQueue,a=l!==null?l.lastEffect:null;if(a!==null){var n=a.next;l=n;do{if((l.tag&e)===e){a=void 0;var u=l.create,c=l.inst;a=u(),c.destroy=a}l=l.next}while(l!==n)}}catch(d){Ce(t,t.return,d)}}function Rl(e,t,l){try{var a=t.updateQueue,n=a!==null?a.lastEffect:null;if(n!==null){var u=n.next;a=u;do{if((a.tag&e)===e){var c=a.inst,d=c.destroy;if(d!==void 0){c.destroy=void 0,n=t;var x=l,C=d;try{C()}catch(D){Ce(n,x,D)}}}a=a.next}while(a!==u)}}catch(D){Ce(t,t.return,D)}}function ed(e){var t=e.updateQueue;if(t!==null){var l=e.stateNode;try{Xo(t,l)}catch(a){Ce(e,e.return,a)}}}function td(e,t,l){l.props=fa(e.type,e.memoizedProps),l.state=e.memoizedState;try{l.componentWillUnmount()}catch(a){Ce(e,t,a)}}function kn(e,t){try{var l=e.ref;if(l!==null){switch(e.tag){case 26:case 27:case 5:var a=e.stateNode;break;case 30:a=e.stateNode;break;default:a=e.stateNode}typeof l=="function"?e.refCleanup=l(a):l.current=a}}catch(n){Ce(e,t,n)}}function Ft(e,t){var l=e.ref,a=e.refCleanup;if(l!==null)if(typeof a=="function")try{a()}catch(n){Ce(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof l=="function")try{l(null)}catch(n){Ce(e,t,n)}else l.current=null}function ld(e){var t=e.type,l=e.memoizedProps,a=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":l.autoFocus&&a.focus();break e;case"img":l.src?a.src=l.src:l.srcSet&&(a.srcset=l.srcSet)}}catch(n){Ce(e,e.return,n)}}function dc(e,t,l){try{var a=e.stateNode;Sy(a,e.type,l,t),a[dt]=t}catch(n){Ce(e,e.return,n)}}function ad(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&kl(e.type)||e.tag===4}function mc(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||ad(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&kl(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function hc(e,t,l){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?(l.nodeType===9?l.body:l.nodeName==="HTML"?l.ownerDocument.body:l).insertBefore(e,t):(t=l.nodeType===9?l.body:l.nodeName==="HTML"?l.ownerDocument.body:l,t.appendChild(e),l=l._reactRootContainer,l!=null||t.onclick!==null||(t.onclick=Pt));else if(a!==4&&(a===27&&kl(e.type)&&(l=e.stateNode,t=null),e=e.child,e!==null))for(hc(e,t,l),e=e.sibling;e!==null;)hc(e,t,l),e=e.sibling}function ti(e,t,l){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?l.insertBefore(e,t):l.appendChild(e);else if(a!==4&&(a===27&&kl(e.type)&&(l=e.stateNode),e=e.child,e!==null))for(ti(e,t,l),e=e.sibling;e!==null;)ti(e,t,l),e=e.sibling}function nd(e){var t=e.stateNode,l=e.memoizedProps;try{for(var a=e.type,n=t.attributes;n.length;)t.removeAttributeNode(n[0]);st(t,a,l),t[at]=e,t[dt]=l}catch(u){Ce(e,e.return,u)}}var rl=!1,Fe=!1,yc=!1,ud=typeof WeakSet=="function"?WeakSet:Set,lt=null;function ey(e,t){if(e=e.containerInfo,Hc=Ni,e=go(e),cs(e)){if("selectionStart"in e)var l={start:e.selectionStart,end:e.selectionEnd};else e:{l=(l=e.ownerDocument)&&l.defaultView||window;var a=l.getSelection&&l.getSelection();if(a&&a.rangeCount!==0){l=a.anchorNode;var n=a.anchorOffset,u=a.focusNode;a=a.focusOffset;try{l.nodeType,u.nodeType}catch{l=null;break e}var c=0,d=-1,x=-1,C=0,D=0,O=e,A=null;t:for(;;){for(var w;O!==l||n!==0&&O.nodeType!==3||(d=c+n),O!==u||a!==0&&O.nodeType!==3||(x=c+a),O.nodeType===3&&(c+=O.nodeValue.length),(w=O.firstChild)!==null;)A=O,O=w;for(;;){if(O===e)break t;if(A===l&&++C===n&&(d=c),A===u&&++D===a&&(x=c),(w=O.nextSibling)!==null)break;O=A,A=O.parentNode}O=w}l=d===-1||x===-1?null:{start:d,end:x}}else l=null}l=l||{start:0,end:0}}else l=null;for(Lc={focusedElem:e,selectionRange:l},Ni=!1,lt=t;lt!==null;)if(t=lt,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,lt=e;else for(;lt!==null;){switch(t=lt,u=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(l=0;l title"))),st(u,a,l),u[at]=e,tt(u),a=u;break e;case"link":var c=fm("link","href",n).get(a+(l.href||""));if(c){for(var d=0;dze&&(c=ze,ze=ae,ae=c);var E=ho(d,ae),b=ho(d,ze);if(E&&b&&(w.rangeCount!==1||w.anchorNode!==E.node||w.anchorOffset!==E.offset||w.focusNode!==b.node||w.focusOffset!==b.offset)){var T=O.createRange();T.setStart(E.node,E.offset),w.removeAllRanges(),ae>ze?(w.addRange(T),w.extend(b.node,b.offset)):(T.setEnd(b.node,b.offset),w.addRange(T))}}}}for(O=[],w=d;w=w.parentNode;)w.nodeType===1&&O.push({element:w,left:w.scrollLeft,top:w.scrollTop});for(typeof d.focus=="function"&&d.focus(),d=0;dl?32:l,M.T=null,l=Nc,Nc=null;var u=Ll,c=hl;if(Ie=0,Ja=Ll=null,hl=0,(je&6)!==0)throw Error(o(331));var d=je;if(je|=4,gd(u.current),md(u,u.current,c,l),je=d,Vn(0,!1),vt&&typeof vt.onPostCommitFiberRoot=="function")try{vt.onPostCommitFiberRoot($l,u)}catch{}return!0}finally{X.p=n,M.T=a,Od(e,t)}}function Hd(e,t,l){t=Ot(l,t),t=tc(e.stateNode,t,2),e=zl(e,t,2),e!==null&&(dn(e,2),Wt(e))}function Ce(e,t,l){if(e.tag===3)Hd(e,e,l);else for(;t!==null;){if(t.tag===3){Hd(t,e,l);break}else if(t.tag===1){var a=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(Hl===null||!Hl.has(a))){e=Ot(l,e),l=Lf(2),a=zl(t,l,2),a!==null&&(Bf(l,a,t,e),dn(a,2),Wt(a));break}}t=t.return}}function Cc(e,t,l){var a=e.pingCache;if(a===null){a=e.pingCache=new ay;var n=new Set;a.set(t,n)}else n=a.get(t),n===void 0&&(n=new Set,a.set(t,n));n.has(l)||(pc=!0,n.add(l),e=cy.bind(null,e,t,l),t.then(e,e))}function cy(e,t,l){var a=e.pingCache;a!==null&&a.delete(t),e.pingedLanes|=e.suspendedLanes&l,e.warmLanes&=~l,Me===e&&(ge&l)===l&&(Xe===4||Xe===3&&(ge&62914560)===ge&&300>We()-ni?(je&2)===0&&$a(e,0):vc|=l,Ka===ge&&(Ka=0)),Wt(e)}function Ld(e,t){t===0&&(t=wr()),e=ta(e,t),e!==null&&(dn(e,t),Wt(e))}function ry(e){var t=e.memoizedState,l=0;t!==null&&(l=t.retryLane),Ld(e,l)}function oy(e,t){var l=0;switch(e.tag){case 31:case 13:var a=e.stateNode,n=e.memoizedState;n!==null&&(l=n.retryLane);break;case 19:a=e.stateNode;break;case 22:a=e.stateNode._retryCache;break;default:throw Error(o(314))}a!==null&&a.delete(t),Ld(e,l)}function fy(e,t){return W(e,t)}var fi=null,Wa=null,_c=!1,di=!1,Ac=!1,ql=0;function Wt(e){e!==Wa&&e.next===null&&(Wa===null?fi=Wa=e:Wa=Wa.next=e),di=!0,_c||(_c=!0,my())}function Vn(e,t){if(!Ac&&di){Ac=!0;do for(var l=!1,a=fi;a!==null;){if(e!==0){var n=a.pendingLanes;if(n===0)var u=0;else{var c=a.suspendedLanes,d=a.pingedLanes;u=(1<<31-bt(42|e)+1)-1,u&=n&~(c&~d),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(l=!0,Yd(a,u))}else u=ge,u=gu(a,a===Me?u:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(u&3)===0||fn(a,u)||(l=!0,Yd(a,u));a=a.next}while(l);Ac=!1}}function dy(){Bd()}function Bd(){di=_c=!1;var e=0;ql!==0&&jy()&&(e=ql);for(var t=We(),l=null,a=fi;a!==null;){var n=a.next,u=qd(a,t);u===0?(a.next=null,l===null?fi=n:l.next=n,n===null&&(Wa=l)):(l=a,(e!==0||(u&3)!==0)&&(di=!0)),a=n}Ie!==0&&Ie!==5||Vn(e),ql!==0&&(ql=0)}function qd(e,t){for(var l=e.suspendedLanes,a=e.pingedLanes,n=e.expirationTimes,u=e.pendingLanes&-62914561;0d)break;var D=x.transferSize,O=x.initiatorType;D&&$d(O)&&(x=x.responseEnd,c+=D*(x"u"?null:document;function sm(e,t,l){var a=Ia;if(a&&typeof t=="string"&&t){var n=Dt(t);n='link[rel="'+e+'"][href="'+n+'"]',typeof l=="string"&&(n+='[crossorigin="'+l+'"]'),im.has(n)||(im.add(n),e={rel:e,crossOrigin:l,href:t},a.querySelector(n)===null&&(t=a.createElement("link"),st(t,"link",e),tt(t),a.head.appendChild(t)))}}function Dy(e){yl.D(e),sm("dns-prefetch",e,null)}function Ry(e,t){yl.C(e,t),sm("preconnect",e,t)}function Oy(e,t,l){yl.L(e,t,l);var a=Ia;if(a&&e&&t){var n='link[rel="preload"][as="'+Dt(t)+'"]';t==="image"&&l&&l.imageSrcSet?(n+='[imagesrcset="'+Dt(l.imageSrcSet)+'"]',typeof l.imageSizes=="string"&&(n+='[imagesizes="'+Dt(l.imageSizes)+'"]')):n+='[href="'+Dt(e)+'"]';var u=n;switch(t){case"style":u=Pa(e);break;case"script":u=en(e)}kt.has(u)||(e=N({rel:"preload",href:t==="image"&&l&&l.imageSrcSet?void 0:e,as:t},l),kt.set(u,e),a.querySelector(n)!==null||t==="style"&&a.querySelector(Fn(u))||t==="script"&&a.querySelector(Wn(u))||(t=a.createElement("link"),st(t,"link",e),tt(t),a.head.appendChild(t)))}}function Uy(e,t){yl.m(e,t);var l=Ia;if(l&&e){var a=t&&typeof t.as=="string"?t.as:"script",n='link[rel="modulepreload"][as="'+Dt(a)+'"][href="'+Dt(e)+'"]',u=n;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=en(e)}if(!kt.has(u)&&(e=N({rel:"modulepreload",href:e},t),kt.set(u,e),l.querySelector(n)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(l.querySelector(Wn(u)))return}a=l.createElement("link"),st(a,"link",e),tt(a),l.head.appendChild(a)}}}function Hy(e,t,l){yl.S(e,t,l);var a=Ia;if(a&&e){var n=Sa(a).hoistableStyles,u=Pa(e);t=t||"default";var c=n.get(u);if(!c){var d={loading:0,preload:null};if(c=a.querySelector(Fn(u)))d.loading=5;else{e=N({rel:"stylesheet",href:e,"data-precedence":t},l),(l=kt.get(u))&&Qc(e,l);var x=c=a.createElement("link");tt(x),st(x,"link",e),x._p=new Promise(function(C,D){x.onload=C,x.onerror=D}),x.addEventListener("load",function(){d.loading|=1}),x.addEventListener("error",function(){d.loading|=2}),d.loading|=4,xi(c,t,a)}c={type:"stylesheet",instance:c,count:1,state:d},n.set(u,c)}}}function Ly(e,t){yl.X(e,t);var l=Ia;if(l&&e){var a=Sa(l).hoistableScripts,n=en(e),u=a.get(n);u||(u=l.querySelector(Wn(n)),u||(e=N({src:e,async:!0},t),(t=kt.get(n))&&Zc(e,t),u=l.createElement("script"),tt(u),st(u,"link",e),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function By(e,t){yl.M(e,t);var l=Ia;if(l&&e){var a=Sa(l).hoistableScripts,n=en(e),u=a.get(n);u||(u=l.querySelector(Wn(n)),u||(e=N({src:e,async:!0,type:"module"},t),(t=kt.get(n))&&Zc(e,t),u=l.createElement("script"),tt(u),st(u,"link",e),l.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},a.set(n,u))}}function cm(e,t,l,a){var n=(n=de.current)?gi(n):null;if(!n)throw Error(o(446));switch(e){case"meta":case"title":return null;case"style":return typeof l.precedence=="string"&&typeof l.href=="string"?(t=Pa(l.href),l=Sa(n).hoistableStyles,a=l.get(t),a||(a={type:"style",instance:null,count:0,state:null},l.set(t,a)),a):{type:"void",instance:null,count:0,state:null};case"link":if(l.rel==="stylesheet"&&typeof l.href=="string"&&typeof l.precedence=="string"){e=Pa(l.href);var u=Sa(n).hoistableStyles,c=u.get(e);if(c||(n=n.ownerDocument||n,c={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(e,c),(u=n.querySelector(Fn(e)))&&!u._p&&(c.instance=u,c.state.loading=5),kt.has(e)||(l={rel:"preload",as:"style",href:l.href,crossOrigin:l.crossOrigin,integrity:l.integrity,media:l.media,hrefLang:l.hrefLang,referrerPolicy:l.referrerPolicy},kt.set(e,l),u||qy(n,e,l,c.state))),t&&a===null)throw Error(o(528,""));return c}if(t&&a!==null)throw Error(o(529,""));return null;case"script":return t=l.async,l=l.src,typeof l=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=en(l),l=Sa(n).hoistableScripts,a=l.get(t),a||(a={type:"script",instance:null,count:0,state:null},l.set(t,a)),a):{type:"void",instance:null,count:0,state:null};default:throw Error(o(444,e))}}function Pa(e){return'href="'+Dt(e)+'"'}function Fn(e){return'link[rel="stylesheet"]['+e+"]"}function rm(e){return N({},e,{"data-precedence":e.precedence,precedence:null})}function qy(e,t,l,a){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?a.loading=1:(t=e.createElement("link"),a.preload=t,t.addEventListener("load",function(){return a.loading|=1}),t.addEventListener("error",function(){return a.loading|=2}),st(t,"link",l),tt(t),e.head.appendChild(t))}function en(e){return'[src="'+Dt(e)+'"]'}function Wn(e){return"script[async]"+e}function om(e,t,l){if(t.count++,t.instance===null)switch(t.type){case"style":var a=e.querySelector('style[data-href~="'+Dt(l.href)+'"]');if(a)return t.instance=a,tt(a),a;var n=N({},l,{"data-href":l.href,"data-precedence":l.precedence,href:null,precedence:null});return a=(e.ownerDocument||e).createElement("style"),tt(a),st(a,"style",n),xi(a,l.precedence,e),t.instance=a;case"stylesheet":n=Pa(l.href);var u=e.querySelector(Fn(n));if(u)return t.state.loading|=4,t.instance=u,tt(u),u;a=rm(l),(n=kt.get(n))&&Qc(a,n),u=(e.ownerDocument||e).createElement("link"),tt(u);var c=u;return c._p=new Promise(function(d,x){c.onload=d,c.onerror=x}),st(u,"link",a),t.state.loading|=4,xi(u,l.precedence,e),t.instance=u;case"script":return u=en(l.src),(n=e.querySelector(Wn(u)))?(t.instance=n,tt(n),n):(a=l,(n=kt.get(u))&&(a=N({},l),Zc(a,n)),e=e.ownerDocument||e,n=e.createElement("script"),tt(n),st(n,"link",a),e.head.appendChild(n),t.instance=n);case"void":return null;default:throw Error(o(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(a=t.instance,t.state.loading|=4,xi(a,l.precedence,e));return t.instance}function xi(e,t,l){for(var a=l.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),n=a.length?a[a.length-1]:null,u=n,c=0;c title"):null)}function ky(e,t,l){if(l===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return e=t.disabled,typeof t.precedence=="string"&&e==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function mm(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function Yy(e,t,l,a){if(l.type==="stylesheet"&&(typeof a.media!="string"||matchMedia(a.media).matches!==!1)&&(l.state.loading&4)===0){if(l.instance===null){var n=Pa(a.href),u=t.querySelector(Fn(n));if(u){t=u._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=vi.bind(e),t.then(e,e)),l.state.loading|=4,l.instance=u,tt(u);return}u=t.ownerDocument||t,a=rm(a),(n=kt.get(n))&&Qc(a,n),u=u.createElement("link"),tt(u);var c=u;c._p=new Promise(function(d,x){c.onload=d,c.onerror=x}),st(u,"link",a),l.instance=u}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(l,t),(t=l.state.preload)&&(l.state.loading&3)===0&&(e.count++,l=vi.bind(e),t.addEventListener("load",l),t.addEventListener("error",l))}}var Vc=0;function Gy(e,t){return e.stylesheets&&e.count===0&&Si(e,e.stylesheets),0Vc?50:800)+t);return e.unsuspend=l,function(){e.unsuspend=null,clearTimeout(a),clearTimeout(n)}}:null}function vi(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Si(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var bi=null;function Si(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,bi=new Map,t.forEach(Xy,e),bi=null,vi.call(e))}function Xy(e,t){if(!(t.state.loading&4)){var l=bi.get(e);if(l)var a=l.get(null);else{l=new Map,bi.set(e,l);for(var n=e.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(r){console.error(r)}}return i(),tr.exports=sg(),tr.exports}var rg=cg();const og=Fm(rg);/** - * react-router v7.13.0 - * - * Copyright (c) Remix Software Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE.md file in the root directory of this source tree. - * - * @license MIT - */var Lm="popstate";function fg(i={}){function r(o,m){let{pathname:h,search:p,hash:j}=o.location;return fr("",{pathname:h,search:p,hash:j},m.state&&m.state.usr||null,m.state&&m.state.key||"default")}function f(o,m){return typeof m=="string"?m:ru(m)}return mg(r,f,null,i)}function qe(i,r){if(i===!1||i===null||typeof i>"u")throw new Error(r)}function Qt(i,r){if(!i){typeof console<"u"&&console.warn(r);try{throw new Error(r)}catch{}}}function dg(){return Math.random().toString(36).substring(2,10)}function Bm(i,r){return{usr:i.state,key:i.key,idx:r}}function fr(i,r,f=null,o){return{pathname:typeof i=="string"?i:i.pathname,search:"",hash:"",...typeof r=="string"?an(r):r,state:f,key:r&&r.key||o||dg()}}function ru({pathname:i="/",search:r="",hash:f=""}){return r&&r!=="?"&&(i+=r.charAt(0)==="?"?r:"?"+r),f&&f!=="#"&&(i+=f.charAt(0)==="#"?f:"#"+f),i}function an(i){let r={};if(i){let f=i.indexOf("#");f>=0&&(r.hash=i.substring(f),i=i.substring(0,f));let o=i.indexOf("?");o>=0&&(r.search=i.substring(o),i=i.substring(0,o)),i&&(r.pathname=i)}return r}function mg(i,r,f,o={}){let{window:m=document.defaultView,v5Compat:h=!1}=o,p=m.history,j="POP",v=null,g=_();g==null&&(g=0,p.replaceState({...p.state,idx:g},""));function _(){return(p.state||{idx:null}).idx}function N(){j="POP";let L=_(),Y=L==null?null:L-g;g=L,v&&v({action:j,location:G.location,delta:Y})}function z(L,Y){j="PUSH";let V=fr(G.location,L,Y);g=_()+1;let H=Bm(V,g),I=G.createHref(V);try{p.pushState(H,"",I)}catch(te){if(te instanceof DOMException&&te.name==="DataCloneError")throw te;m.location.assign(I)}h&&v&&v({action:j,location:G.location,delta:1})}function B(L,Y){j="REPLACE";let V=fr(G.location,L,Y);g=_();let H=Bm(V,g),I=G.createHref(V);p.replaceState(H,"",I),h&&v&&v({action:j,location:G.location,delta:0})}function q(L){return hg(L)}let G={get action(){return j},get location(){return i(m,p)},listen(L){if(v)throw new Error("A history only accepts one active listener");return m.addEventListener(Lm,N),v=L,()=>{m.removeEventListener(Lm,N),v=null}},createHref(L){return r(m,L)},createURL:q,encodeLocation(L){let Y=q(L);return{pathname:Y.pathname,search:Y.search,hash:Y.hash}},push:z,replace:B,go(L){return p.go(L)}};return G}function hg(i,r=!1){let f="http://localhost";typeof window<"u"&&(f=window.location.origin!=="null"?window.location.origin:window.location.href),qe(f,"No window.location.(origin|href) available to create URL");let o=typeof i=="string"?i:ru(i);return o=o.replace(/ $/,"%20"),!r&&o.startsWith("//")&&(o=f+o),new URL(o,f)}function Im(i,r,f="/"){return yg(i,r,f,!1)}function yg(i,r,f,o){let m=typeof r=="string"?an(r):r,h=pl(m.pathname||"/",f);if(h==null)return null;let p=Pm(i);gg(p);let j=null;for(let v=0;j==null&&v{let _={relativePath:g===void 0?p.path||"":g,caseSensitive:p.caseSensitive===!0,childrenIndex:j,route:p};if(_.relativePath.startsWith("/")){if(!_.relativePath.startsWith(o)&&v)return;qe(_.relativePath.startsWith(o),`Absolute route path "${_.relativePath}" nested under path "${o}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),_.relativePath=_.relativePath.slice(o.length)}let N=xl([o,_.relativePath]),z=f.concat(_);p.children&&p.children.length>0&&(qe(p.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${N}".`),Pm(p.children,r,z,N,v)),!(p.path==null&&!p.index)&&r.push({path:N,score:jg(N,p.index),routesMeta:z})};return i.forEach((p,j)=>{var v;if(p.path===""||!((v=p.path)!=null&&v.includes("?")))h(p,j);else for(let g of e0(p.path))h(p,j,!0,g)}),r}function e0(i){let r=i.split("/");if(r.length===0)return[];let[f,...o]=r,m=f.endsWith("?"),h=f.replace(/\?$/,"");if(o.length===0)return m?[h,""]:[h];let p=e0(o.join("/")),j=[];return j.push(...p.map(v=>v===""?h:[h,v].join("/"))),m&&j.push(...p),j.map(v=>i.startsWith("/")&&v===""?"/":v)}function gg(i){i.sort((r,f)=>r.score!==f.score?f.score-r.score:Eg(r.routesMeta.map(o=>o.childrenIndex),f.routesMeta.map(o=>o.childrenIndex)))}var xg=/^:[\w-]+$/,pg=3,vg=2,bg=1,Sg=10,Ng=-2,qm=i=>i==="*";function jg(i,r){let f=i.split("/"),o=f.length;return f.some(qm)&&(o+=Ng),r&&(o+=vg),f.filter(m=>!qm(m)).reduce((m,h)=>m+(xg.test(h)?pg:h===""?bg:Sg),o)}function Eg(i,r){return i.length===r.length&&i.slice(0,-1).every((o,m)=>o===r[m])?i[i.length-1]-r[r.length-1]:0}function Tg(i,r,f=!1){let{routesMeta:o}=i,m={},h="/",p=[];for(let j=0;j{if(_==="*"){let q=j[z]||"";p=h.slice(0,h.length-q.length).replace(/(.)\/+$/,"$1")}const B=j[z];return N&&!B?g[_]=void 0:g[_]=(B||"").replace(/%2F/g,"/"),g},{}),pathname:h,pathnameBase:p,pattern:i}}function Cg(i,r=!1,f=!0){Qt(i==="*"||!i.endsWith("*")||i.endsWith("/*"),`Route path "${i}" will be treated as if it were "${i.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${i.replace(/\*$/,"/*")}".`);let o=[],m="^"+i.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(p,j,v)=>(o.push({paramName:j,isOptional:v!=null}),v?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return i.endsWith("*")?(o.push({paramName:"*"}),m+=i==="*"||i==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):f?m+="\\/*$":i!==""&&i!=="/"&&(m+="(?:(?=\\/|$))"),[new RegExp(m,r?void 0:"i"),o]}function _g(i){try{return i.split("/").map(r=>decodeURIComponent(r).replace(/\//g,"%2F")).join("/")}catch(r){return Qt(!1,`The URL path "${i}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${r}).`),i}}function pl(i,r){if(r==="/")return i;if(!i.toLowerCase().startsWith(r.toLowerCase()))return null;let f=r.endsWith("/")?r.length-1:r.length,o=i.charAt(f);return o&&o!=="/"?null:i.slice(f)||"/"}var Ag=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function wg(i,r="/"){let{pathname:f,search:o="",hash:m=""}=typeof i=="string"?an(i):i,h;return f?(f=f.replace(/\/\/+/g,"/"),f.startsWith("/")?h=km(f.substring(1),"/"):h=km(f,r)):h=r,{pathname:h,search:Dg(o),hash:Rg(m)}}function km(i,r){let f=r.replace(/\/+$/,"").split("/");return i.split("/").forEach(m=>{m===".."?f.length>1&&f.pop():m!=="."&&f.push(m)}),f.length>1?f.join("/"):"/"}function ur(i,r,f,o){return`Cannot include a '${i}' character in a manually specified \`to.${r}\` field [${JSON.stringify(o)}]. Please separate it out to the \`to.${f}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function zg(i){return i.filter((r,f)=>f===0||r.route.path&&r.route.path.length>0)}function pr(i){let r=zg(i);return r.map((f,o)=>o===r.length-1?f.pathname:f.pathnameBase)}function vr(i,r,f,o=!1){let m;typeof i=="string"?m=an(i):(m={...i},qe(!m.pathname||!m.pathname.includes("?"),ur("?","pathname","search",m)),qe(!m.pathname||!m.pathname.includes("#"),ur("#","pathname","hash",m)),qe(!m.search||!m.search.includes("#"),ur("#","search","hash",m)));let h=i===""||m.pathname==="",p=h?"/":m.pathname,j;if(p==null)j=f;else{let N=r.length-1;if(!o&&p.startsWith("..")){let z=p.split("/");for(;z[0]==="..";)z.shift(),N-=1;m.pathname=z.join("/")}j=N>=0?r[N]:"/"}let v=wg(m,j),g=p&&p!=="/"&&p.endsWith("/"),_=(h||p===".")&&f.endsWith("/");return!v.pathname.endsWith("/")&&(g||_)&&(v.pathname+="/"),v}var xl=i=>i.join("/").replace(/\/\/+/g,"/"),Mg=i=>i.replace(/\/+$/,"").replace(/^\/*/,"/"),Dg=i=>!i||i==="?"?"":i.startsWith("?")?i:"?"+i,Rg=i=>!i||i==="#"?"":i.startsWith("#")?i:"#"+i,Og=class{constructor(i,r,f,o=!1){this.status=i,this.statusText=r||"",this.internal=o,f instanceof Error?(this.data=f.toString(),this.error=f):this.data=f}};function Ug(i){return i!=null&&typeof i.status=="number"&&typeof i.statusText=="string"&&typeof i.internal=="boolean"&&"data"in i}function Hg(i){return i.map(r=>r.route.path).filter(Boolean).join("/").replace(/\/\/*/g,"/")||"/"}var t0=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function l0(i,r){let f=i;if(typeof f!="string"||!Ag.test(f))return{absoluteURL:void 0,isExternal:!1,to:f};let o=f,m=!1;if(t0)try{let h=new URL(window.location.href),p=f.startsWith("//")?new URL(h.protocol+f):new URL(f),j=pl(p.pathname,r);p.origin===h.origin&&j!=null?f=j+p.search+p.hash:m=!0}catch{Qt(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:o,isExternal:m,to:f}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var a0=["POST","PUT","PATCH","DELETE"];new Set(a0);var Lg=["GET",...a0];new Set(Lg);var nn=y.createContext(null);nn.displayName="DataRouter";var Ui=y.createContext(null);Ui.displayName="DataRouterState";var Bg=y.createContext(!1),n0=y.createContext({isTransitioning:!1});n0.displayName="ViewTransition";var qg=y.createContext(new Map);qg.displayName="Fetchers";var kg=y.createContext(null);kg.displayName="Await";var wt=y.createContext(null);wt.displayName="Navigation";var fu=y.createContext(null);fu.displayName="Location";var Zt=y.createContext({outlet:null,matches:[],isDataRoute:!1});Zt.displayName="Route";var br=y.createContext(null);br.displayName="RouteError";var u0="REACT_ROUTER_ERROR",Yg="REDIRECT",Gg="ROUTE_ERROR_RESPONSE";function Xg(i){if(i.startsWith(`${u0}:${Yg}:{`))try{let r=JSON.parse(i.slice(28));if(typeof r=="object"&&r&&typeof r.status=="number"&&typeof r.statusText=="string"&&typeof r.location=="string"&&typeof r.reloadDocument=="boolean"&&typeof r.replace=="boolean")return r}catch{}}function Qg(i){if(i.startsWith(`${u0}:${Gg}:{`))try{let r=JSON.parse(i.slice(40));if(typeof r=="object"&&r&&typeof r.status=="number"&&typeof r.statusText=="string")return new Og(r.status,r.statusText,r.data)}catch{}}function Zg(i,{relative:r}={}){qe(un(),"useHref() may be used only in the context of a component.");let{basename:f,navigator:o}=y.useContext(wt),{hash:m,pathname:h,search:p}=du(i,{relative:r}),j=h;return f!=="/"&&(j=h==="/"?f:xl([f,h])),o.createHref({pathname:j,search:p,hash:m})}function un(){return y.useContext(fu)!=null}function vl(){return qe(un(),"useLocation() may be used only in the context of a component."),y.useContext(fu).location}var i0="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function s0(i){y.useContext(wt).static||y.useLayoutEffect(i)}function c0(){let{isDataRoute:i}=y.useContext(Zt);return i?ix():Vg()}function Vg(){qe(un(),"useNavigate() may be used only in the context of a component.");let i=y.useContext(nn),{basename:r,navigator:f}=y.useContext(wt),{matches:o}=y.useContext(Zt),{pathname:m}=vl(),h=JSON.stringify(pr(o)),p=y.useRef(!1);return s0(()=>{p.current=!0}),y.useCallback((v,g={})=>{if(Qt(p.current,i0),!p.current)return;if(typeof v=="number"){f.go(v);return}let _=vr(v,JSON.parse(h),m,g.relative==="path");i==null&&r!=="/"&&(_.pathname=_.pathname==="/"?r:xl([r,_.pathname])),(g.replace?f.replace:f.push)(_,g.state,g)},[r,f,h,m,i])}var Kg=y.createContext(null);function Jg(i){let r=y.useContext(Zt).outlet;return y.useMemo(()=>r&&y.createElement(Kg.Provider,{value:i},r),[r,i])}function du(i,{relative:r}={}){let{matches:f}=y.useContext(Zt),{pathname:o}=vl(),m=JSON.stringify(pr(f));return y.useMemo(()=>vr(i,JSON.parse(m),o,r==="path"),[i,m,o,r])}function $g(i,r){return r0(i,r)}function r0(i,r,f,o,m){var V;qe(un(),"useRoutes() may be used only in the context of a component.");let{navigator:h}=y.useContext(wt),{matches:p}=y.useContext(Zt),j=p[p.length-1],v=j?j.params:{},g=j?j.pathname:"/",_=j?j.pathnameBase:"/",N=j&&j.route;{let H=N&&N.path||"";f0(g,!N||H.endsWith("*")||H.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${g}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. - -Please change the parent to .`)}let z=vl(),B;if(r){let H=typeof r=="string"?an(r):r;qe(_==="/"||((V=H.pathname)==null?void 0:V.startsWith(_)),`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 "${_}" but pathname "${H.pathname}" was given in the \`location\` prop.`),B=H}else B=z;let q=B.pathname||"/",G=q;if(_!=="/"){let H=_.replace(/^\//,"").split("/");G="/"+q.replace(/^\//,"").split("/").slice(H.length).join("/")}let L=Im(i,{pathname:G});Qt(N||L!=null,`No routes matched location "${B.pathname}${B.search}${B.hash}" `),Qt(L==null||L[L.length-1].route.element!==void 0||L[L.length-1].route.Component!==void 0||L[L.length-1].route.lazy!==void 0,`Matched leaf route at location "${B.pathname}${B.search}${B.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 Y=ex(L&&L.map(H=>Object.assign({},H,{params:Object.assign({},v,H.params),pathname:xl([_,h.encodeLocation?h.encodeLocation(H.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:H.pathname]),pathnameBase:H.pathnameBase==="/"?_:xl([_,h.encodeLocation?h.encodeLocation(H.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:H.pathnameBase])})),p,f,o,m);return r&&Y?y.createElement(fu.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...B},navigationType:"POP"}},Y):Y}function Fg(){let i=ux(),r=Ug(i)?`${i.status} ${i.statusText}`:i instanceof Error?i.message:JSON.stringify(i),f=i instanceof Error?i.stack:null,o="rgba(200,200,200, 0.5)",m={padding:"0.5rem",backgroundColor:o},h={padding:"2px 4px",backgroundColor:o},p=null;return console.error("Error handled by React Router default ErrorBoundary:",i),p=y.createElement(y.Fragment,null,y.createElement("p",null,"💿 Hey developer 👋"),y.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",y.createElement("code",{style:h},"ErrorBoundary")," or"," ",y.createElement("code",{style:h},"errorElement")," prop on your route.")),y.createElement(y.Fragment,null,y.createElement("h2",null,"Unexpected Application Error!"),y.createElement("h3",{style:{fontStyle:"italic"}},r),f?y.createElement("pre",{style:m},f):null,p)}var Wg=y.createElement(Fg,null),o0=class extends y.Component{constructor(i){super(i),this.state={location:i.location,revalidation:i.revalidation,error:i.error}}static getDerivedStateFromError(i){return{error:i}}static getDerivedStateFromProps(i,r){return r.location!==i.location||r.revalidation!=="idle"&&i.revalidation==="idle"?{error:i.error,location:i.location,revalidation:i.revalidation}:{error:i.error!==void 0?i.error:r.error,location:r.location,revalidation:i.revalidation||r.revalidation}}componentDidCatch(i,r){this.props.onError?this.props.onError(i,r):console.error("React Router caught the following error during render",i)}render(){let i=this.state.error;if(this.context&&typeof i=="object"&&i&&"digest"in i&&typeof i.digest=="string"){const f=Qg(i.digest);f&&(i=f)}let r=i!==void 0?y.createElement(Zt.Provider,{value:this.props.routeContext},y.createElement(br.Provider,{value:i,children:this.props.component})):this.props.children;return this.context?y.createElement(Ig,{error:i},r):r}};o0.contextType=Bg;var ir=new WeakMap;function Ig({children:i,error:r}){let{basename:f}=y.useContext(wt);if(typeof r=="object"&&r&&"digest"in r&&typeof r.digest=="string"){let o=Xg(r.digest);if(o){let m=ir.get(r);if(m)throw m;let h=l0(o.location,f);if(t0&&!ir.get(r))if(h.isExternal||o.reloadDocument)window.location.href=h.absoluteURL||h.to;else{const p=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(h.to,{replace:o.replace}));throw ir.set(r,p),p}return y.createElement("meta",{httpEquiv:"refresh",content:`0;url=${h.absoluteURL||h.to}`})}}return i}function Pg({routeContext:i,match:r,children:f}){let o=y.useContext(nn);return o&&o.static&&o.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(o.staticContext._deepestRenderedBoundaryId=r.route.id),y.createElement(Zt.Provider,{value:i},f)}function ex(i,r=[],f=null,o=null,m=null){if(i==null){if(!f)return null;if(f.errors)i=f.matches;else if(r.length===0&&!f.initialized&&f.matches.length>0)i=f.matches;else return null}let h=i,p=f==null?void 0:f.errors;if(p!=null){let _=h.findIndex(N=>N.route.id&&(p==null?void 0:p[N.route.id])!==void 0);qe(_>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(p).join(",")}`),h=h.slice(0,Math.min(h.length,_+1))}let j=!1,v=-1;if(f)for(let _=0;_=0?h=h.slice(0,v+1):h=[h[0]];break}}}let g=f&&o?(_,N)=>{var z,B;o(_,{location:f.location,params:((B=(z=f.matches)==null?void 0:z[0])==null?void 0:B.params)??{},unstable_pattern:Hg(f.matches),errorInfo:N})}:void 0;return h.reduceRight((_,N,z)=>{let B,q=!1,G=null,L=null;f&&(B=p&&N.route.id?p[N.route.id]:void 0,G=N.route.errorElement||Wg,j&&(v<0&&z===0?(f0("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),q=!0,L=null):v===z&&(q=!0,L=N.route.hydrateFallbackElement||null)));let Y=r.concat(h.slice(0,z+1)),V=()=>{let H;return B?H=G:q?H=L:N.route.Component?H=y.createElement(N.route.Component,null):N.route.element?H=N.route.element:H=_,y.createElement(Pg,{match:N,routeContext:{outlet:_,matches:Y,isDataRoute:f!=null},children:H})};return f&&(N.route.ErrorBoundary||N.route.errorElement||z===0)?y.createElement(o0,{location:f.location,revalidation:f.revalidation,component:G,error:B,children:V(),routeContext:{outlet:null,matches:Y,isDataRoute:!0},onError:g}):V()},null)}function Sr(i){return`${i} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function tx(i){let r=y.useContext(nn);return qe(r,Sr(i)),r}function lx(i){let r=y.useContext(Ui);return qe(r,Sr(i)),r}function ax(i){let r=y.useContext(Zt);return qe(r,Sr(i)),r}function Nr(i){let r=ax(i),f=r.matches[r.matches.length-1];return qe(f.route.id,`${i} can only be used on routes that contain a unique "id"`),f.route.id}function nx(){return Nr("useRouteId")}function ux(){var o;let i=y.useContext(br),r=lx("useRouteError"),f=Nr("useRouteError");return i!==void 0?i:(o=r.errors)==null?void 0:o[f]}function ix(){let{router:i}=tx("useNavigate"),r=Nr("useNavigate"),f=y.useRef(!1);return s0(()=>{f.current=!0}),y.useCallback(async(m,h={})=>{Qt(f.current,i0),f.current&&(typeof m=="number"?await i.navigate(m):await i.navigate(m,{fromRouteId:r,...h}))},[i,r])}var Ym={};function f0(i,r,f){!r&&!Ym[i]&&(Ym[i]=!0,Qt(!1,f))}y.memo(sx);function sx({routes:i,future:r,state:f,onError:o}){return r0(i,void 0,f,o,r)}function cx({to:i,replace:r,state:f,relative:o}){qe(un()," may be used only in the context of a component.");let{static:m}=y.useContext(wt);Qt(!m," 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:h}=y.useContext(Zt),{pathname:p}=vl(),j=c0(),v=vr(i,pr(h),p,o==="path"),g=JSON.stringify(v);return y.useEffect(()=>{j(JSON.parse(g),{replace:r,state:f,relative:o})},[j,g,o,r,f]),null}function rx(i){return Jg(i.context)}function At(i){qe(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function ox({basename:i="/",children:r=null,location:f,navigationType:o="POP",navigator:m,static:h=!1,unstable_useTransitions:p}){qe(!un(),"You cannot render a inside another . You should never have more than one in your app.");let j=i.replace(/^\/*/,"/"),v=y.useMemo(()=>({basename:j,navigator:m,static:h,unstable_useTransitions:p,future:{}}),[j,m,h,p]);typeof f=="string"&&(f=an(f));let{pathname:g="/",search:_="",hash:N="",state:z=null,key:B="default"}=f,q=y.useMemo(()=>{let G=pl(g,j);return G==null?null:{location:{pathname:G,search:_,hash:N,state:z,key:B},navigationType:o}},[j,g,_,N,z,B,o]);return Qt(q!=null,` is not able to match the URL "${g}${_}${N}" because it does not start with the basename, so the won't render anything.`),q==null?null:y.createElement(wt.Provider,{value:v},y.createElement(fu.Provider,{children:r,value:q}))}function fx({children:i,location:r}){return $g(dr(i),r)}function dr(i,r=[]){let f=[];return y.Children.forEach(i,(o,m)=>{if(!y.isValidElement(o))return;let h=[...r,m];if(o.type===y.Fragment){f.push.apply(f,dr(o.props.children,h));return}qe(o.type===At,`[${typeof o.type=="string"?o.type:o.type.name}] is not a component. All component children of must be a or `),qe(!o.props.index||!o.props.children,"An index route cannot have child routes.");let p={id:o.props.id||h.join("-"),caseSensitive:o.props.caseSensitive,element:o.props.element,Component:o.props.Component,index:o.props.index,path:o.props.path,middleware:o.props.middleware,loader:o.props.loader,action:o.props.action,hydrateFallbackElement:o.props.hydrateFallbackElement,HydrateFallback:o.props.HydrateFallback,errorElement:o.props.errorElement,ErrorBoundary:o.props.ErrorBoundary,hasErrorBoundary:o.props.hasErrorBoundary===!0||o.props.ErrorBoundary!=null||o.props.errorElement!=null,shouldRevalidate:o.props.shouldRevalidate,handle:o.props.handle,lazy:o.props.lazy};o.props.children&&(p.children=dr(o.props.children,h)),f.push(p)}),f}var Mi="get",Di="application/x-www-form-urlencoded";function Hi(i){return typeof HTMLElement<"u"&&i instanceof HTMLElement}function dx(i){return Hi(i)&&i.tagName.toLowerCase()==="button"}function mx(i){return Hi(i)&&i.tagName.toLowerCase()==="form"}function hx(i){return Hi(i)&&i.tagName.toLowerCase()==="input"}function yx(i){return!!(i.metaKey||i.altKey||i.ctrlKey||i.shiftKey)}function gx(i,r){return i.button===0&&(!r||r==="_self")&&!yx(i)}var wi=null;function xx(){if(wi===null)try{new FormData(document.createElement("form"),0),wi=!1}catch{wi=!0}return wi}var px=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function sr(i){return i!=null&&!px.has(i)?(Qt(!1,`"${i}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${Di}"`),null):i}function vx(i,r){let f,o,m,h,p;if(mx(i)){let j=i.getAttribute("action");o=j?pl(j,r):null,f=i.getAttribute("method")||Mi,m=sr(i.getAttribute("enctype"))||Di,h=new FormData(i)}else if(dx(i)||hx(i)&&(i.type==="submit"||i.type==="image")){let j=i.form;if(j==null)throw new Error('Cannot submit a