From 5cb2b9fcb8849860f537b009716efaa1c5dea2bc Mon Sep 17 00:00:00 2001 From: I Luk Kim Date: Wed, 8 Apr 2026 08:10:17 -0700 Subject: [PATCH] Add non-core allocator v2 and Form4 freshness presets --- apps/backtester/run.py | 1132 +++++++++++++++-- apps/paper_trader/backtest_sim.py | 22 +- apps/paper_trader/cli.py | 10 + apps/paper_trader/engine.py | 186 ++- apps/paper_trader/models.py | 8 +- apps/paper_trader/state.py | 5 +- apps/tools/run_composite_eval.py | 6 +- apps/tools/run_engine_ablation.py | 8 +- apps/web/direct_runner.py | 10 +- apps/web/routers/backtest.py | 88 +- apps/web/static/assets/index-BryHz-pc.css | 1 - apps/web/static/assets/index-CbyS0Od7.css | 1 + .../{index-CEy65bTm.js => index-aO-xepTy.js} | 24 +- apps/web/static/index.html | 4 +- apps/web_frontend/src/api/client.ts | 3 + apps/web_frontend/src/pages/Backtest.tsx | 1 + ...rn_max_long_v17.1_idle_alpha_extended.json | 4 +- .../return_max_long_v7.119_composed.json | 2 +- .../return_max_long_v7.119_composed_gld.json | 5 +- docs/current_best_non_core_stack.md | 613 +++++++++ ..._max_long_v7.119_composed_gld_explained.md | 790 ++++++++++++ libs/backtest/artifacts.py | 262 +++- libs/backtest/domain.py | 944 ++++---------- libs/backtest/non_core_allocator.py | 127 ++ libs/backtest/snapshot_store.py | 6 +- .../backtest/test_non_core_allocator_v2.py | 189 +++ 26 files changed, 3559 insertions(+), 892 deletions(-) delete mode 100644 apps/web/static/assets/index-BryHz-pc.css create mode 100644 apps/web/static/assets/index-CbyS0Od7.css rename apps/web/static/assets/{index-CEy65bTm.js => index-aO-xepTy.js} (70%) create mode 100644 docs/current_best_non_core_stack.md create mode 100644 docs/return_max_long_v7.119_composed_gld_explained.md create mode 100644 libs/backtest/non_core_allocator.py create mode 100644 tests/unit/backtest/test_non_core_allocator_v2.py diff --git a/apps/backtester/run.py b/apps/backtester/run.py index 3b708ea..0c0151c 100644 --- a/apps/backtester/run.py +++ b/apps/backtester/run.py @@ -67,6 +67,16 @@ from libs.backtest.execution import ( from libs.backtest.manifests import generate_run_id, load_manifest, resolve_config from libs.backtest.proxies import peer_candidates_for_symbol from libs.backtest.metrics import build_metrics_bundle +from libs.backtest.non_core_allocator import ( + classify_non_core_overlap_class, + classify_parking_class, + compute_marginal_score, + compute_native_rank_pct, + compute_overlap_penalty, + normalize_hold_days_est, + normalize_liquidity_penalty, + normalize_parking_proxy, +) from libs.backtest.selector import rank_candidates, select_candidates from libs.backtest.snapshots import resolve_snapshot_path from libs.backtest.snapshot_store import SnapshotStore @@ -225,6 +235,14 @@ class BacktestRunner: self._parking_committed_target: str | None = None self._parking_pending_target: str | None = None self._parking_pending_target_days: int = 0 + # Overlay shock brake / dwell cap state + self._parking_overlay_brake_cooldown: int = 0 # remaining cooldown days after brake + self._parking_overlay_hold_days: int = 0 # consecutive days holding overlay symbol + # Blend mode state (QQQM + TQQQ dual position) + self._parking_blend_tqqq_shares: int = 0 + self._parking_blend_tqqq_avg_price: float = 0.0 + self._parking_blend_qqqm_shares: int = 0 + self._parking_blend_qqqm_avg_price: float = 0.0 # Stats self._total_candidates_seen = 0 @@ -250,6 +268,8 @@ class BacktestRunner: self._ownership_capture_trade_counter: int = 0 self._lookback_entry_enabled: bool = config.execution.lookback_entry_enabled self._lookback_injected: bool = False + self._non_core_allocator_shadow_rows: list[dict[str, Any]] = [] + self._non_core_allocator_shadow_row_indices_by_date: dict[dt.date, list[int]] = defaultdict(list) def _get_known_upcoming_earnings_by_symbol( self, @@ -603,6 +623,7 @@ class BacktestRunner: total_orders_rejected=self._total_orders_rejected, split_name=self.split_name, per_engine_metrics=per_engine_metrics, + non_core_allocator_shadow_rows=self._non_core_allocator_shadow_rows, ) logger.info( @@ -641,14 +662,16 @@ class BacktestRunner: self._cooldown_remaining -= 1 if self._kill_switch_cooldown_remaining > 0: self._kill_switch_cooldown_remaining -= 1 + if self._parking_overlay_brake_cooldown > 0: + self._parking_overlay_brake_cooldown -= 1 # --- CASH PARKING: check gate, sell if signal changed, hold if same --- # Check gate + trailing stop: sell parking if signal changed or stop hit - if self._parking_shares > 0 and self.config.risk.cash_parking_enabled: + if (self._parking_shares > 0 or self._parking_current_symbol == "tqqq_blend") and self.config.risk.cash_parking_enabled: sold = False # Trailing stop: track peak, exit if down X% from peak stop_pct = self.config.risk.cash_parking_stop_pct - if stop_pct > 0 and self._parking_current_symbol not in ("sgov", ""): + if stop_pct > 0 and self._parking_current_symbol not in ("sgov", "", "tqqq_blend"): macro_early = self.store.get_macro_for_date(date) or {} cur_price = macro_early.get(f"{self._parking_current_symbol}_close") if cur_price: @@ -658,6 +681,59 @@ class BacktestRunner: self._parking_stopped_out = True self._commit_parking_target("sgov") sold = True + # Shock brake: fast exit from overlay symbol on vol acceleration / trend break + overlay_sym = (self.config.risk.cash_parking_low_vol_overlay_symbol or "").lower() + if not sold and overlay_sym and self.config.risk.cash_parking_overlay_shock_brake_enabled: + is_overlay = ( + self._parking_current_symbol == overlay_sym + or self._parking_current_symbol == "tqqq_blend" + ) + if is_overlay: + macro_early = self.store.get_macro_for_date(date) or {} + if self._check_overlay_shock_brake(macro_early): + self._liquidate_parking(date) + self._parking_overlay_brake_cooldown = self.config.risk.cash_parking_overlay_shock_brake_cooldown_days + self._parking_overlay_hold_days = 0 + sold = True + # Re-commit to base park symbol (QQQM) — NOT sgov + base_sym = self.config.risk.cash_parking_symbol + self._commit_parking_target(base_sym) + # Dwell cap: max consecutive days holding overlay symbol + max_hold = self.config.risk.cash_parking_overlay_max_hold_days + if not sold and overlay_sym and max_hold > 0: + is_overlay = ( + self._parking_current_symbol == overlay_sym + or self._parking_current_symbol == "tqqq_blend" + ) + if is_overlay and self._parking_overlay_hold_days >= max_hold: + self._liquidate_parking(date) + self._parking_overlay_hold_days = 0 + sold = True + base_sym = self.config.risk.cash_parking_symbol + self._commit_parking_target(base_sym) + # Dwell revalidation: periodically re-check overlay conditions + reval = self.config.risk.cash_parking_overlay_revalidation_days + if not sold and overlay_sym and reval > 0: + is_overlay = ( + self._parking_current_symbol == overlay_sym + or self._parking_current_symbol == "tqqq_blend" + ) + if is_overlay and self._parking_overlay_hold_days > 0 and self._parking_overlay_hold_days % reval == 0: + macro_reval = self.store.get_macro_for_date(date) or {} + park_mode = self.config.risk.cash_parking_symbol + if self._evaluate_low_vol_overlay_target(macro_reval, park_mode) is None: + self._liquidate_parking(date) + self._parking_overlay_hold_days = 0 + sold = True + self._commit_parking_target(park_mode) + # Track overlay hold days + if not sold and overlay_sym: + is_overlay = ( + self._parking_current_symbol == overlay_sym + or self._parking_current_symbol == "tqqq_blend" + ) + if is_overlay: + self._parking_overlay_hold_days += 1 # Gate signal check if not sold: target = self._evaluate_parking_target(date) @@ -909,6 +985,10 @@ class BacktestRunner: self._schedule_macro_short_candidates(date) self._schedule_macro_long_candidates(date) + idle_candidates: list[Candidate] = [] + shadow_form4_payloads: list[dict[str, Any]] = [] + shadow_ownership_payloads: list[dict[str, Any]] = [] + # --- IDLE-ONLY POST-ALLOCATION ENTRIES --- if not self._kill_switch_triggered and self._post_allocation_idle_engines: portfolio_state = self._refresh_portfolio_state(date, drawdown_pct) @@ -928,6 +1008,46 @@ class BacktestRunner: portfolio_state, macro_data, ) + else: + idle_candidates = [] + + live_non_core_allocator = self._non_core_allocator_v2_live_enabled() and not self._kill_switch_triggered + shadow_non_core_allocator = self._non_core_allocator_v2_shadow_enabled() and not self._kill_switch_triggered + + if shadow_non_core_allocator: + shadow_portfolio_state = self._refresh_portfolio_state(date, drawdown_pct) + if self._form4_capture_enabled(): + shadow_form4_payloads = self._select_form4_capture_candidates(date) + if self._ownership_capture_enabled(): + shadow_ownership_payloads = self._select_ownership_capture_candidates(date) + idle_candidates = self._record_non_core_allocator_v2_shadow_day( + date=date, + portfolio_state=shadow_portfolio_state, + idle_candidates=idle_candidates, + form4_payloads=shadow_form4_payloads, + ownership_payloads=shadow_ownership_payloads, + ) + + if live_non_core_allocator: + if self._dividend_capture_enabled(): + self._enter_dividend_capture_positions(date) + live_form4_payloads: list[dict[str, Any]] = [] + live_ownership_payloads: list[dict[str, Any]] = [] + if self._form4_capture_enabled(): + live_form4_payloads = self._select_form4_capture_candidates(date) + if self._ownership_capture_enabled(): + live_ownership_payloads = self._select_ownership_capture_candidates(date) + self._execute_non_core_allocator_v2_live_day( + date=date, + drawdown_pct=drawdown_pct, + idle_candidates=idle_candidates, + form4_payloads=live_form4_payloads, + ownership_payloads=live_ownership_payloads, + ) + else: + if idle_candidates: + portfolio_state = self._refresh_portfolio_state(date, drawdown_pct) + macro_data = self.store.get_macro_for_date(date) portfolio_state = self._execute_candidate_entries( date=date, candidates=idle_candidates, @@ -938,20 +1058,20 @@ class BacktestRunner: allow_parking_cash_release=True, ) - # --- DIVIDEND CAPTURE RESERVE SLEEVE --- - if self._dividend_capture_enabled(): - self._enter_dividend_capture_positions(date) + # --- FORM 4 RESIDUAL-CASH SLEEVE --- + if self._dividend_capture_enabled(): + self._enter_dividend_capture_positions(date) + if self._form4_capture_enabled(): + self._enter_form4_capture_positions(date) - # --- FORM 4 RESIDUAL-CASH SLEEVE --- - if self._form4_capture_enabled(): - self._enter_form4_capture_positions(date) + # --- OWNERSHIP 13D/13G RESIDUAL-CASH SLEEVE --- + if self._ownership_capture_enabled(): + self._enter_ownership_capture_positions(date) - # --- OWNERSHIP 13D/13G RESIDUAL-CASH SLEEVE --- - if self._ownership_capture_enabled(): - self._enter_ownership_capture_positions(date) + if self._risk_off_alpha_enabled(): + self._enter_risk_off_alpha_positions(date) - if self._risk_off_alpha_enabled(): - self._enter_risk_off_alpha_positions(date) + self._finalize_non_core_allocator_v2_shadow_day(date) # --- CASH PARKING: invest idle cash --- if self.config.risk.cash_parking_enabled: @@ -1360,121 +1480,157 @@ class BacktestRunner: self._commit_parking_target("sgov") self._cash -= new_shares * park_close elif target_sym and investable > 0: - bearish_sym = self.config.risk.cash_parking_bearish_symbol - bearish_alloc_pct = min( - 1.0, - max(0.0, float(self.config.risk.cash_parking_bearish_alloc_pct or 0.0)), - ) - defensive_sym = self._get_parking_defensive_symbol() - defensive_alloc_pct = min( - 1.0, - max(0.0, float(self.config.risk.cash_parking_defensive_alloc_pct or 0.0)), - ) - sgov_amount = 0.0 - symbol_investable = investable + # Overlay blend mode: QQQM + TQQQ dual position (continuous leverage) + overlay_sym_cfg = (self.config.risk.cash_parking_low_vol_overlay_symbol or "").lower() + _blend_handled = False if ( - defensive_sym - and target_sym == defensive_sym - and defensive_alloc_pct < 0.999 - ): - symbol_investable = investable * defensive_alloc_pct - sgov_amount = investable - symbol_investable - elif ( - bearish_sym - and target_sym == bearish_sym - and bearish_alloc_pct < 0.999 + target_sym == overlay_sym_cfg + and self.config.risk.cash_parking_overlay_blend_enabled + and self._parking_current_symbol != "tqqq_blend" ): - symbol_investable = investable * bearish_alloc_pct - sgov_amount = investable - symbol_investable - park_close = macro_data_eod.get(f"{target_sym}_close") - if park_close and park_close > 0 and symbol_investable >= park_close: - new_shares = int(symbol_investable / park_close) - allow_topup = True - min_gain_pct = float(self.config.risk.cash_parking_topup_min_gain_pct) - if ( - self._parking_shares > 0 - and self._parking_current_symbol == target_sym - and min_gain_pct > -99 - and self._parking_avg_price > 0 - ): - allow_topup = park_close >= self._parking_avg_price * (1.0 + min_gain_pct) - if ( - allow_topup - and self._parking_shares > 0 - and self._parking_current_symbol == target_sym - and self._parking_entry_date is not None - ): - min_days_held = max(0, int(self.config.risk.cash_parking_topup_min_days_held or 0)) - if min_days_held > 0 and (date - self._parking_entry_date).days < min_days_held: - allow_topup = False - if ( - allow_topup - and self._parking_shares > 0 - and self._parking_current_symbol == target_sym - and self._parking_peak_price > 0 - and park_close < self._parking_peak_price - ): - topup_risk_score_max = float(self.config.risk.cash_parking_topup_risk_score_max or 0.0) - if topup_risk_score_max > 0: - risk_score = float(self._compute_parking_risk_score(macro_data_eod)) - if risk_score > topup_risk_score_max: - allow_topup = False + w_qqqm, w_tqqq = self._compute_overlay_blend_weights(macro_data_eod) + tqqq_close = macro_data_eod.get("tqqq_close") + qqqm_close = macro_data_eod.get("qqqm_close") + if tqqq_close and tqqq_close > 0 and qqqm_close and qqqm_close > 0: + tqqq_amount = investable * w_tqqq + qqqm_amount = investable * w_qqqm + tqqq_shares = int(tqqq_amount / tqqq_close) + qqqm_shares = int(qqqm_amount / qqqm_close) + total_cost = tqqq_shares * tqqq_close + qqqm_shares * qqqm_close + if total_cost > 0: + self._parking_blend_tqqq_shares = tqqq_shares + self._parking_blend_tqqq_avg_price = tqqq_close + self._parking_blend_qqqm_shares = qqqm_shares + self._parking_blend_qqqm_avg_price = qqqm_close + self._parking_shares = 0 + self._parking_current_symbol = "tqqq_blend" + self._commit_parking_target("tqqq_blend") + self._cash -= total_cost + self._parking_overlay_hold_days = 0 + _blend_handled = True + if not _blend_handled: + bearish_sym = self.config.risk.cash_parking_bearish_symbol + bearish_alloc_pct = min( + 1.0, + max(0.0, float(self.config.risk.cash_parking_bearish_alloc_pct or 0.0)), + ) + defensive_sym = self._get_parking_defensive_symbol() + defensive_alloc_pct = min( + 1.0, + max(0.0, float(self.config.risk.cash_parking_defensive_alloc_pct or 0.0)), + ) + sgov_amount = 0.0 + symbol_investable = investable if ( - allow_topup - and self._parking_shares > 0 - and self._parking_current_symbol == target_sym - and self._parking_peak_price > 0 + defensive_sym + and target_sym == defensive_sym + and defensive_alloc_pct < 0.999 ): - max_peak_dd = float(self.config.risk.cash_parking_topup_max_peak_drawdown_pct) - if max_peak_dd < 999 and park_close < self._parking_peak_price * (1.0 - max_peak_dd): - allow_topup = False - if self._parking_shares > 0 and self._parking_current_symbol == target_sym and allow_topup: - # Add to existing position - old_cost = self._parking_shares * self._parking_avg_price - self._parking_shares += new_shares - self._parking_avg_price = (old_cost + new_shares * park_close) / self._parking_shares - self._commit_parking_target(target_sym) - elif new_shares > 0 and (self._parking_shares <= 0 or self._parking_current_symbol != target_sym): - self._parking_shares = new_shares - self._parking_avg_price = park_close - self._parking_current_symbol = target_sym - self._commit_parking_target(target_sym) - if allow_topup: - self._cash -= new_shares * park_close + symbol_investable = investable * defensive_alloc_pct + sgov_amount = investable - symbol_investable elif ( - new_shares > 0 - and self._parking_shares > 0 - and self._parking_current_symbol == target_sym + bearish_sym + and target_sym == bearish_sym + and bearish_alloc_pct < 0.999 ): - defensive_amount = new_shares * park_close + symbol_investable = investable * bearish_alloc_pct + sgov_amount = investable - symbol_investable + park_close = macro_data_eod.get(f"{target_sym}_close") + if park_close and park_close > 0 and symbol_investable >= park_close: + new_shares = int(symbol_investable / park_close) + allow_topup = True + min_gain_pct = float(self.config.risk.cash_parking_topup_min_gain_pct) + if ( + self._parking_shares > 0 + and self._parking_current_symbol == target_sym + and min_gain_pct > -99 + and self._parking_avg_price > 0 + ): + allow_topup = park_close >= self._parking_avg_price * (1.0 + min_gain_pct) + if ( + allow_topup + and self._parking_shares > 0 + and self._parking_current_symbol == target_sym + and self._parking_entry_date is not None + ): + min_days_held = max(0, int(self.config.risk.cash_parking_topup_min_days_held or 0)) + if min_days_held > 0 and (date - self._parking_entry_date).days < min_days_held: + allow_topup = False + if ( + allow_topup + and self._parking_shares > 0 + and self._parking_current_symbol == target_sym + and self._parking_peak_price > 0 + and park_close < self._parking_peak_price + ): + topup_risk_score_max = float(self.config.risk.cash_parking_topup_risk_score_max or 0.0) + if topup_risk_score_max > 0: + risk_score = float(self._compute_parking_risk_score(macro_data_eod)) + if risk_score > topup_risk_score_max: + allow_topup = False + if ( + allow_topup + and self._parking_shares > 0 + and self._parking_current_symbol == target_sym + and self._parking_peak_price > 0 + ): + max_peak_dd = float(self.config.risk.cash_parking_topup_max_peak_drawdown_pct) + if max_peak_dd < 999 and park_close < self._parking_peak_price * (1.0 - max_peak_dd): + allow_topup = False + if self._parking_shares > 0 and self._parking_current_symbol == target_sym and allow_topup: + # Add to existing position + old_cost = self._parking_shares * self._parking_avg_price + self._parking_shares += new_shares + self._parking_avg_price = (old_cost + new_shares * park_close) / self._parking_shares + self._commit_parking_target(target_sym) + elif new_shares > 0 and (self._parking_shares <= 0 or self._parking_current_symbol != target_sym): + self._parking_shares = new_shares + self._parking_avg_price = park_close + self._parking_current_symbol = target_sym + self._commit_parking_target(target_sym) + if allow_topup: + self._cash -= new_shares * park_close + elif ( + new_shares > 0 + and self._parking_shares > 0 + and self._parking_current_symbol == target_sym + ): + defensive_amount = new_shares * park_close + self._allocate_parallel_sgov( + date=date, + amount=defensive_amount, + macro=macro_data_eod, + ) + self._cash -= defensive_amount + used_amount = new_shares * park_close if allow_topup else 0.0 + if sgov_amount > 0: + sgov_amount += max(0.0, symbol_investable - used_amount) + elif sgov_amount > 0: + sgov_amount += symbol_investable + if sgov_amount > 0: self._allocate_parallel_sgov( date=date, - amount=defensive_amount, + amount=sgov_amount, macro=macro_data_eod, ) - self._cash -= defensive_amount - used_amount = new_shares * park_close if allow_topup else 0.0 - if sgov_amount > 0: - sgov_amount += max(0.0, symbol_investable - used_amount) - elif sgov_amount > 0: - sgov_amount += symbol_investable - if sgov_amount > 0: - self._allocate_parallel_sgov( - date=date, - amount=sgov_amount, - macro=macro_data_eod, - ) - self._cash -= sgov_amount + self._cash -= sgov_amount # Track parking entry date and peak price - if (self._parking_shares > 0 or self._parking_sgov_value > 0) and self._parking_entry_date is None: + has_parking = ( + self._parking_shares > 0 + or self._parking_sgov_value > 0 + or self._parking_current_symbol == "tqqq_blend" + ) + if has_parking and self._parking_entry_date is None: self._parking_entry_date = date self._parking_peak_price = self._parking_avg_price # --- Record daily equity curve snapshot --- market_value_final = self._compute_positions_market_value(date) macro_for_eq = self.store.get_macro_for_date(date) or {} - if self._parking_shares > 0 and self._parking_current_symbol: + if self._parking_current_symbol == "tqqq_blend": + parking_value = self._get_parking_value(date) + elif self._parking_shares > 0 and self._parking_current_symbol: park_price = macro_for_eq.get(f"{self._parking_current_symbol}_close", self._parking_avg_price) parking_value = self._parking_shares * park_price else: @@ -1932,6 +2088,593 @@ class BacktestRunner: return False + def _non_core_allocator_v2_shadow_enabled(self) -> bool: + cfg = self.config.non_core_allocator_v2 + return ( + bool(cfg.enabled) + and str(cfg.mode).strip().lower() == "shadow" + and str(cfg.scope).strip().lower() == "non_core" + ) + + def _non_core_allocator_v2_live_enabled(self) -> bool: + cfg = self.config.non_core_allocator_v2 + return ( + bool(cfg.enabled) + and str(cfg.mode).strip().lower() == "live" + and str(cfg.scope).strip().lower() == "non_core" + ) + + def _non_core_allocator_v2_candidate_key(self, candidate: Candidate) -> str: + return "|".join( + [ + str(candidate.engine_id or "").strip(), + str(candidate.event_id or "").strip(), + str(candidate.symbol or "").strip().upper(), + ] + ) + + def _non_core_allocator_v2_current_parking_symbol(self, date: dt.date) -> str: + target = self._preview_effective_parking_target(date) + if target: + return str(target).strip().lower() + if self._parking_current_symbol: + return str(self._parking_current_symbol).strip().lower() + if self._parking_committed_target: + return str(self._parking_committed_target).strip().lower() + symbol = str(self.config.risk.cash_parking_symbol or "").strip().lower() + return symbol or "sgov" + + def _non_core_allocator_v2_idle_requested_cash_est( + self, + *, + date: dt.date, + candidate: Candidate, + portfolio_state: DailyPortfolioState, + active_bucket_ids: set[str], + macro_data: dict[str, Any] | None, + ) -> tuple[float, bool]: + candidate_portfolio_state = self._adjust_portfolio_state_for_candidate( + date=date, + candidate=candidate, + portfolio_state=portfolio_state, + active_bucket_ids=active_bucket_ids, + ) + plan = build_planned_order( + candidate=candidate, + portfolio_state=candidate_portfolio_state, + open_positions=self._open_positions, + config=self.config, + execution_config=self._build_effective_execution_config(candidate), + cooldown_remaining=self._cooldown_remaining, + macro_data=macro_data, + engine_daily_new_risk_used=self._engine_daily_new_risk_used[candidate.engine_id], + ) + if plan.skip_reason is not None or plan.shares <= 0: + return 0.0, False + return max(float(plan.shares * candidate.entry_price_est), 0.0), True + + def _build_non_core_allocator_v2_day_context( + self, + *, + date: dt.date, + portfolio_state: DailyPortfolioState, + idle_candidates: list[Candidate], + form4_payloads: list[dict[str, Any]], + ownership_payloads: list[dict[str, Any]], + ) -> tuple[list[Candidate], list[dict[str, Any]], dict[str, Candidate], float]: + cfg = self.config.non_core_allocator_v2 + weights = cfg.weights + parking_symbol = self._non_core_allocator_v2_current_parking_symbol(date) + parking_class = classify_parking_class(parking_symbol) + macro = self.store.get_macro_for_date(date) or {} + parking_prefix = self._get_parking_signal_prefix(parking_symbol) + parking_momentum_20 = float(macro.get(f"{parking_prefix}_mom_20") or 0.0) + virtual_cash = max(0.0, float(portfolio_state.cash_available) + float(self._get_parking_value(date))) + active_bucket_ids = self._active_capital_bucket_ids_for_candidates(idle_candidates) + + rows: list[dict[str, Any]] = [] + annotated_idle_candidates: list[Candidate] = [] + candidate_by_key: dict[str, Candidate] = {} + current_index = 0 + + def _append_row( + *, + family: str, + candidate: Candidate, + rank_index: int, + total_count: int, + requested_cash_est: float, + complete: bool, + family_cap: int | None, + ) -> Candidate: + nonlocal current_index + if family == "idle_alpha": + hold_days_est = ( + candidate.engine_max_holding_days + or self._build_effective_execution_config(candidate).max_holding_days + ) + elif family == "form4": + hold_days_est = int(self.config.form4_capture.hold_days) + elif family == "ownership": + hold_days_est = int(self.config.ownership_capture.hold_days) + else: + hold_days_est = int(self.config.risk_off_alpha.max_holding_days or 0) + + native_rank_pct = compute_native_rank_pct(rank_index, total_count) + hold_norm = normalize_hold_days_est(hold_days_est) + liquidity_penalty_norm = normalize_liquidity_penalty( + requested_cash_est=requested_cash_est, + avg_dollar_volume=candidate.avg_dollar_volume, + ) + overlap_class = classify_non_core_overlap_class( + family, + trade_symbol_mode=candidate.trade_symbol_mode, + engine_id=candidate.engine_id, + symbol=candidate.symbol, + ) + overlap_penalty_norm = compute_overlap_penalty(overlap_class, parking_class) + parking_proxy_norm = normalize_parking_proxy( + parking_symbol, + parking_momentum_20=parking_momentum_20, + hold_days_est=hold_days_est, + sgov_annual_rate=self.config.risk.cash_parking_sgov_annual_rate, + ) + marginal_score = compute_marginal_score( + native_rank_pct=native_rank_pct, + hold_norm=hold_norm, + liquidity_penalty_norm=liquidity_penalty_norm, + overlap_penalty_norm=overlap_penalty_norm, + parking_proxy_norm=parking_proxy_norm, + native_strength=weights.native_strength, + hold_penalty=weights.hold_penalty, + liquidity_penalty=weights.liquidity_penalty, + overlap_penalty=weights.overlap_penalty, + parking_opportunity_penalty=weights.parking_opportunity_penalty, + ) + allocator_features = { + "allocator_v2_family": family, + "allocator_v2_native_rank_pct": round(native_rank_pct, 6), + "allocator_v2_hold_days_est": int(hold_days_est), + "allocator_v2_requested_cash_est": round(float(requested_cash_est), 6), + "allocator_v2_avg_dollar_volume": round(float(candidate.avg_dollar_volume), 6), + "allocator_v2_overlap_class": overlap_class, + "allocator_v2_parking_symbol": parking_symbol, + "allocator_v2_parking_class": parking_class, + "allocator_v2_parking_proxy_norm": round(parking_proxy_norm, 6), + "allocator_v2_hold_norm": round(hold_norm, 6), + "allocator_v2_liquidity_penalty_norm": round(liquidity_penalty_norm, 6), + "allocator_v2_overlap_penalty_norm": round(overlap_penalty_norm, 6), + "allocator_v2_marginal_score": round(marginal_score, 6), + "allocator_v2_complete": bool(complete), + } + features = dict(candidate.features) + features.update(allocator_features) + annotated_candidate = candidate.model_copy(update={"features": features}) + candidate_key = self._non_core_allocator_v2_candidate_key(annotated_candidate) + candidate_by_key[candidate_key] = annotated_candidate + rows.append( + { + "date": date.isoformat(), + "engine_id": annotated_candidate.engine_id, + "event_id": annotated_candidate.event_id, + "symbol": annotated_candidate.symbol, + "source_symbol": annotated_candidate.source_symbol, + "trade_sleeve": family, + "allocator_v2_family": family, + "allocator_v2_candidate_key": candidate_key, + "allocator_v2_rank_index": int(rank_index), + "allocator_v2_total_count": int(total_count), + "allocator_v2_family_cap": family_cap, + "allocator_v2_native_rank_pct": round(native_rank_pct, 6), + "allocator_v2_hold_days_est": int(hold_days_est), + "allocator_v2_requested_cash_est": round(float(requested_cash_est), 6), + "allocator_v2_avg_dollar_volume": round(float(annotated_candidate.avg_dollar_volume), 6), + "allocator_v2_overlap_class": overlap_class, + "allocator_v2_parking_symbol": parking_symbol, + "allocator_v2_parking_class": parking_class, + "allocator_v2_parking_proxy_norm": round(parking_proxy_norm, 6), + "allocator_v2_hold_norm": round(hold_norm, 6), + "allocator_v2_liquidity_penalty_norm": round(liquidity_penalty_norm, 6), + "allocator_v2_overlap_penalty_norm": round(overlap_penalty_norm, 6), + "allocator_v2_marginal_score": round(marginal_score, 6), + "allocator_v2_complete": bool(complete), + "allocator_v2_virtual_cash_start": round(virtual_cash, 6), + "allocator_v2_shadow_decision": "blocked_by_budget", + "allocator_v2_shadow_selected": False, + "allocator_v2_live_selected": False, + "allocator_v2_live_vs_shadow_disagree": False, + "_shadow_order_index": current_index, + } + ) + current_index += 1 + return annotated_candidate + + idle_total = len(idle_candidates) + for rank_index, candidate in enumerate(idle_candidates): + requested_cash_est, complete = self._non_core_allocator_v2_idle_requested_cash_est( + date=date, + candidate=candidate, + portfolio_state=portfolio_state, + active_bucket_ids=active_bucket_ids, + macro_data=macro, + ) + annotated_idle_candidates.append( + _append_row( + family="idle_alpha", + candidate=candidate, + rank_index=rank_index, + total_count=idle_total, + requested_cash_est=requested_cash_est, + complete=complete, + family_cap=None, + ) + ) + + form4_positions = sum( + 1 for position in self._open_positions + if position.plan.engine_id == _FORM4_CAPTURE_ENGINE_ID + ) + form4_cap = max( + 0, + min( + int(self.config.form4_capture.max_new_per_day), + max(0, int(self.config.form4_capture.max_positions) - form4_positions), + ), + ) + form4_divisor = max(1, min(len(form4_payloads), form4_cap if form4_cap > 0 else len(form4_payloads))) + form4_budget_total = max(0.0, float(portfolio_state.equity) * float(self.config.form4_capture.reserve_pct)) + form4_requested_cash_est = form4_budget_total / form4_divisor if form4_divisor > 0 else 0.0 + for rank_index, payload in enumerate(form4_payloads): + candidate = self._build_form4_capture_candidate( + symbol=str(payload["symbol"]), + date=date, + filing_date=payload["filing_date"], + avg_dollar_volume=float(payload["avg_dollar_volume"]), + owner_count=int(payload["owner_count"]), + transaction_count=int(payload["transaction_count"]), + event_day_count=int(payload["event_day_count"]), + total_value=float(payload["total_value"]), + weighted_purchase_pct=float(payload["weighted_purchase_pct"]), + max_lag_days=payload["max_lag_days"], + min_lag_days=payload.get("min_lag_days"), + has_officer_or_director=bool(payload["has_officer_or_director"]), + ) + _append_row( + family="form4", + candidate=candidate, + rank_index=rank_index, + total_count=len(form4_payloads), + requested_cash_est=form4_requested_cash_est, + complete=form4_requested_cash_est > 0, + family_cap=form4_cap, + ) + + ownership_positions = sum( + 1 for position in self._open_positions + if position.plan.engine_id == _OWNERSHIP_CAPTURE_ENGINE_ID + ) + ownership_cap = max( + 0, + min( + int(self.config.ownership_capture.max_new_per_day), + max(0, int(self.config.ownership_capture.max_positions) - ownership_positions), + ), + ) + ownership_divisor = max( + 1, + min(len(ownership_payloads), ownership_cap if ownership_cap > 0 else len(ownership_payloads)), + ) + ownership_budget_total = 0.0 + ownership_cfg = self.config.ownership_capture + if float(ownership_cfg.reserve_pct) > 0: + ownership_budget_total = float(portfolio_state.equity) * float(ownership_cfg.reserve_pct) + extra_idle_deploy_pct = min(1.0, max(0.0, float(ownership_cfg.extra_idle_deploy_pct_above_reserve or 0.0))) + if extra_idle_deploy_pct > 0 and float(portfolio_state.equity) > 0: + virtual_cash_ratio = virtual_cash / float(portfolio_state.equity) + if virtual_cash_ratio >= float(ownership_cfg.min_cash_ratio_for_overlay): + ownership_budget_total += max(0.0, virtual_cash - ownership_budget_total) * extra_idle_deploy_pct + elif float(portfolio_state.equity) > 0: + virtual_cash_ratio = virtual_cash / float(portfolio_state.equity) + if virtual_cash_ratio >= float(ownership_cfg.min_cash_ratio_for_overlay): + ownership_budget_total = virtual_cash * min(1.0, max(0.0, float(ownership_cfg.max_idle_deploy_pct))) + ownership_requested_cash_est = ownership_budget_total / ownership_divisor if ownership_divisor > 0 else 0.0 + for rank_index, payload in enumerate(ownership_payloads): + candidate = self._build_ownership_capture_candidate( + symbol=str(payload["symbol"]), + date=date, + filing_date=payload["filing_date"], + form_type=str(payload["form_type"]), + percent_owned=float(payload["percent_owned"]), + aggregate_shares=float(payload["aggregate_shares"]), + activist_flag=bool(payload["activist_flag"]), + is_amendment=bool(payload["is_amendment"]), + prior_percent_owned=payload["prior_percent_owned"], + percent_delta_points=payload["percent_delta_points"], + prior_form_group=payload["prior_form_group"], + is_initial_for_owner=bool(payload["is_initial_for_owner"]), + is_13g_to_13d_transition=bool(payload["is_13g_to_13d_transition"]), + avg_dollar_volume=float(payload["avg_dollar_volume"]), + owner_name=payload.get("owner_name"), + owner_key=payload.get("owner_key"), + purpose_text=payload.get("purpose_text"), + purpose_housekeeping_flag=bool(payload.get("purpose_housekeeping_flag")), + ownership_strength_score=int(payload.get("ownership_strength_score") or 0), + ) + _append_row( + family="ownership", + candidate=candidate, + rank_index=rank_index, + total_count=len(ownership_payloads), + requested_cash_est=ownership_requested_cash_est, + complete=ownership_requested_cash_est > 0, + family_cap=ownership_cap, + ) + + signal_date = self._previous_simulation_date(date) + if signal_date is not None: + desired_symbol = self._select_risk_off_alpha_symbol(signal_date) + existing_risk_off_positions = [ + position for position in self._open_positions + if position.plan.engine_id == _RISK_OFF_ALPHA_ENGINE_ID + ] + if desired_symbol and not existing_risk_off_positions: + risk_off_budget_total = 0.0 + risk_off_cfg = self.config.risk_off_alpha + effective_reserve_pct = self._effective_risk_off_alpha_reserve_pct(signal_date) + if effective_reserve_pct > 0: + risk_off_budget_total = float(portfolio_state.equity) * effective_reserve_pct + elif float(portfolio_state.equity) > 0: + virtual_cash_ratio = virtual_cash / float(portfolio_state.equity) + if virtual_cash_ratio >= float(risk_off_cfg.min_cash_ratio_for_overlay): + risk_off_budget_total = virtual_cash * min(1.0, max(0.0, float(risk_off_cfg.max_idle_deploy_pct))) + symbol = str(desired_symbol).upper() + avg_dollar_volume = float(self.store.get_market_features(symbol, date).get("avg_dollar_volume_20d") or 0.0) + signal_momentum = float( + macro.get(f"{symbol.lower()}_mom_{max(1, int(risk_off_cfg.momentum_lookback_days or 20))}") or 0.0 + ) + candidate = self._build_risk_off_alpha_candidate( + symbol=symbol, + date=date, + signal_date=signal_date, + signal_momentum=signal_momentum, + sgov_streak=self._risk_off_alpha_sgov_streak(signal_date), + avg_dollar_volume=avg_dollar_volume, + ) + _append_row( + family="risk_off_alpha", + candidate=candidate, + rank_index=0, + total_count=1, + requested_cash_est=risk_off_budget_total, + complete=risk_off_budget_total > 0, + family_cap=1, + ) + + return annotated_idle_candidates, rows, candidate_by_key, virtual_cash + + def _select_non_core_allocator_v2_rows( + self, + *, + rows: list[dict[str, Any]], + virtual_cash: float, + ) -> list[dict[str, Any]]: + selected_counts: dict[str, int] = defaultdict(int) + selected_any = False + virtual_cash_remaining = float(virtual_cash) + ordered_indices = sorted( + range(len(rows)), + key=lambda idx: ( + -float(rows[idx]["allocator_v2_marginal_score"]), + -float(rows[idx]["allocator_v2_native_rank_pct"]), + int(rows[idx]["_shadow_order_index"]), + ), + ) + for idx in ordered_indices: + row = rows[idx] + family = str(row["allocator_v2_family"]) + family_cap = row["allocator_v2_family_cap"] + requested_cash_est = float(row["allocator_v2_requested_cash_est"] or 0.0) + if family_cap is not None and int(family_cap) >= 0 and selected_counts[family] >= int(family_cap): + row["allocator_v2_shadow_decision"] = "blocked_by_sleeve_cap" + continue + if requested_cash_est <= 0 or virtual_cash_remaining + 1e-9 < requested_cash_est: + row["allocator_v2_shadow_decision"] = ( + "blocked_by_better_opportunity" if selected_any else "blocked_by_budget" + ) + continue + row["allocator_v2_shadow_decision"] = "selected_shadow_v2" + row["allocator_v2_shadow_selected"] = True + virtual_cash_remaining = max(0.0, virtual_cash_remaining - requested_cash_est) + selected_counts[family] += 1 + selected_any = True + + return [rows[idx] for idx in ordered_indices] + + def _record_non_core_allocator_v2_shadow_day( + self, + *, + date: dt.date, + portfolio_state: DailyPortfolioState, + idle_candidates: list[Candidate], + form4_payloads: list[dict[str, Any]], + ownership_payloads: list[dict[str, Any]], + ) -> list[Candidate]: + if not self._non_core_allocator_v2_shadow_enabled(): + return idle_candidates + + annotated_idle_candidates, rows, _candidate_by_key, virtual_cash = self._build_non_core_allocator_v2_day_context( + date=date, + portfolio_state=portfolio_state, + idle_candidates=idle_candidates, + form4_payloads=form4_payloads, + ownership_payloads=ownership_payloads, + ) + self._select_non_core_allocator_v2_rows(rows=rows, virtual_cash=virtual_cash) + + date_indices: list[int] = [] + for row in rows: + row.pop("_shadow_order_index", None) + self._non_core_allocator_shadow_rows.append(row) + date_indices.append(len(self._non_core_allocator_shadow_rows) - 1) + self._non_core_allocator_shadow_row_indices_by_date[date] = date_indices + return annotated_idle_candidates + + def _execute_fixed_budget_non_core_candidate( + self, + *, + date: dt.date, + candidate: Candidate, + budget: float, + allow_parking_cash_release: bool, + max_parking_release: float | None = None, + ) -> bool: + budget = max(0.0, float(budget)) + if budget <= 0: + return False + + symbol = str(candidate.symbol).upper() + open_symbols = {str(position.plan.candidate.symbol).upper() for position in self._open_positions} + if symbol in open_symbols: + return False + + entry_bar = self.store.get_bar(symbol, date) + if entry_bar is None or entry_bar.get("open") is None: + return False + + if self._cash + 1e-9 < budget and allow_parking_cash_release and self._get_parking_value(date) > 0: + shortfall = budget - self._cash + release_amount = shortfall + if max_parking_release is not None: + release_amount = min(release_amount, max(0.0, float(max_parking_release))) + if release_amount > 0: + self._liquidate_parking_for_cash(date, release_amount) + + effective_budget = min(budget, self._cash) + if effective_budget <= 0: + return False + + effective_exec = self._build_effective_execution_config(candidate) + estimated_fill = float(entry_bar["open"]) * (1.0 + effective_exec.slippage_bps_base / 10_000.0) + shares = int(effective_budget / estimated_fill) if estimated_fill > 0 else 0 + if shares <= 0: + return False + + event_date = candidate.event_date if candidate.event_date is not None else date + plan = PlannedOrder( + candidate=candidate, + shares=shares, + entry_price_limit=float(entry_bar["open"]), + stop_price=0.01, + target_price=float(entry_bar["open"]) * 100.0, + risk_dollars=0.0, + event_date=event_date, + timing_class=str(candidate.timing_class or "unknown"), + engine_id=str(candidate.engine_id or ""), + entry_timing_policy="next_open", + ) + position = simulate_entry(plan, entry_bar, effective_exec) + if position is None: + return False + trade_cost = position.entry_price * position.shares_open + if trade_cost <= 0 or trade_cost > self._cash + 1e-9: + return False + + self._cash -= trade_cost + self._open_positions.append(position) + return True + + def _execute_non_core_allocator_v2_live_day( + self, + *, + date: dt.date, + drawdown_pct: float, + idle_candidates: list[Candidate], + form4_payloads: list[dict[str, Any]], + ownership_payloads: list[dict[str, Any]], + ) -> None: + if not self._non_core_allocator_v2_live_enabled(): + return + + portfolio_state = self._refresh_portfolio_state(date, drawdown_pct) + annotated_idle_candidates, rows, candidate_by_key, virtual_cash = self._build_non_core_allocator_v2_day_context( + date=date, + portfolio_state=portfolio_state, + idle_candidates=idle_candidates, + form4_payloads=form4_payloads, + ownership_payloads=ownership_payloads, + ) + ordered_rows = self._select_non_core_allocator_v2_rows(rows=rows, virtual_cash=virtual_cash) + idle_candidate_by_key = { + self._non_core_allocator_v2_candidate_key(candidate): candidate + for candidate in annotated_idle_candidates + } + + for row in ordered_rows: + if not bool(row.get("allocator_v2_shadow_selected")): + continue + candidate_key = str(row.get("allocator_v2_candidate_key") or "") + family = str(row.get("allocator_v2_family") or "") + requested_cash_est = float(row.get("allocator_v2_requested_cash_est") or 0.0) + + if family == "idle_alpha": + candidate = idle_candidate_by_key.get(candidate_key) + if candidate is None: + continue + current_state = self._refresh_portfolio_state(date, drawdown_pct) + macro_data = self.store.get_macro_for_date(date) + self._execute_candidate_entries( + date=date, + candidates=[candidate], + portfolio_state=current_state, + drawdown_pct=drawdown_pct, + macro_data=macro_data, + allow_same_day_cash_recycle=False, + allow_parking_cash_release=True, + ) + continue + + candidate = candidate_by_key.get(candidate_key) + if candidate is None: + continue + self._execute_fixed_budget_non_core_candidate( + date=date, + candidate=candidate, + budget=requested_cash_est, + allow_parking_cash_release=True, + max_parking_release=(requested_cash_est * 0.05 if family == "form4" else None), + ) + + def _finalize_non_core_allocator_v2_shadow_day(self, date: dt.date) -> None: + if not self._non_core_allocator_v2_shadow_enabled(): + return + row_indices = self._non_core_allocator_shadow_row_indices_by_date.get(date, []) + if not row_indices: + return + + live_candidate_keys: set[str] = set() + for position in self._open_positions: + if position.entry_date != date: + continue + candidate = position.plan.candidate + sleeve = str((candidate.features or {}).get("trade_sleeve") or "").strip().lower() + if sleeve in {"idle_alpha", "form4", "ownership", "risk_off_alpha"}: + live_candidate_keys.add(self._non_core_allocator_v2_candidate_key(candidate)) + for trade in self._closed_trades: + if trade.entry_date != date: + continue + candidate = self._candidate_map.get(trade.trade_id) + if candidate is None: + continue + sleeve = str((candidate.features or {}).get("trade_sleeve") or "").strip().lower() + if sleeve in {"idle_alpha", "form4", "ownership", "risk_off_alpha"}: + live_candidate_keys.add(self._non_core_allocator_v2_candidate_key(candidate)) + + for idx in row_indices: + row = self._non_core_allocator_shadow_rows[idx] + live_selected = str(row.get("allocator_v2_candidate_key") or "") in live_candidate_keys + row["allocator_v2_live_selected"] = live_selected + row["allocator_v2_live_vs_shadow_disagree"] = bool(row.get("allocator_v2_shadow_selected")) != live_selected + def _execute_candidate_entries( self, *, @@ -3359,6 +4102,8 @@ class BacktestRunner: continue if event.owner_count < int(cfg.min_owner_count): continue + if int(event.transaction_count) < int(cfg.min_transaction_count): + continue if event.total_value < float(cfg.min_total_value): continue if event.weighted_purchase_pct < float(cfg.min_purchase_pct): @@ -3367,6 +4112,8 @@ class BacktestRunner: continue if cfg.max_lag_days is not None and event.max_lag_days is not None and event.max_lag_days > int(cfg.max_lag_days): continue + if cfg.max_min_lag_days is not None and event.min_lag_days is not None and event.min_lag_days > int(cfg.max_min_lag_days): + continue if bool(cfg.require_officer_or_director) and not bool(event.has_officer_or_director): continue symbol = str(event.symbol).upper() @@ -3387,6 +4134,7 @@ class BacktestRunner: "total_value": float(event.total_value), "weighted_purchase_pct": float(event.weighted_purchase_pct), "max_lag_days": event.max_lag_days, + "min_lag_days": event.min_lag_days, "has_officer_or_director": bool(event.has_officer_or_director), "avg_dollar_volume": avg_dollar_volume, } @@ -3394,12 +4142,12 @@ class BacktestRunner: rows.sort( key=lambda item: ( - int(item["owner_count"]), - int(item["event_day_count"]), - float(item["weighted_purchase_pct"]), - float(item["total_value"]), + -int(item["transaction_count"]), + -int(item["owner_count"]), + 999999 if item["min_lag_days"] is None else int(item["min_lag_days"]), + -float(item["weighted_purchase_pct"]), + -float(item["total_value"]), ), - reverse=True, ) return rows @@ -3416,6 +4164,7 @@ class BacktestRunner: total_value: float, weighted_purchase_pct: float, max_lag_days: int | None, + min_lag_days: int | None, has_officer_or_director: bool, ) -> Candidate: event_timestamp = dt.datetime.combine(filing_date, dt.time(0, 0), tzinfo=dt.timezone.utc) @@ -3445,7 +4194,7 @@ class BacktestRunner: engine_early_failure_no_progress_fraction=self.config.form4_capture.no_progress_fraction_override, engine_max_holding_days=int(self.config.form4_capture.hold_days), features={ - "trade_sleeve": "idle_alpha", + "trade_sleeve": "form4", "form4_filing_date": filing_date.isoformat(), "form4_owner_count": owner_count, "form4_transaction_count": transaction_count, @@ -3453,6 +4202,7 @@ class BacktestRunner: "form4_total_value": total_value, "form4_weighted_purchase_pct": weighted_purchase_pct, "form4_max_lag_days": max_lag_days, + "form4_min_lag_days": min_lag_days, "form4_has_officer_or_director": has_officer_or_director, }, ) @@ -3496,6 +4246,7 @@ class BacktestRunner: total_value=float(payload["total_value"]), weighted_purchase_pct=float(payload["weighted_purchase_pct"]), max_lag_days=payload["max_lag_days"], + min_lag_days=payload.get("min_lag_days"), has_officer_or_director=bool(payload["has_officer_or_director"]), ) entry_bar = self.store.get_bar(symbol, date) @@ -5194,6 +5945,82 @@ class BacktestRunner: candidates.sort(key=lambda item: item[1], reverse=True) return candidates[0][0] + def _check_overlay_shock_brake(self, macro: dict) -> bool: + """Check QQQ/SMH acceleration signals for fast TQQQ exit. + + Returns True if any brake signal fires. Does NOT use TQQQ price. + Three signals, any one triggers: + 1. Vol acceleration: qqq_vol_5 / qqq_vol_20 > rv_ratio threshold + 2. Trend break + sector: qqq_close < qqq_sma_10 AND smh_mom_5 < 0 + 3. Sharp 5-day drawdown: (qqq_high_5 - qqq_close) / qqq_high_5 > dd5_pct + """ + cfg = self.config.risk + rv_ratio = cfg.cash_parking_overlay_shock_brake_rv_ratio + dd5_pct = cfg.cash_parking_overlay_shock_brake_dd5_pct + sma_cross = cfg.cash_parking_overlay_shock_brake_sma_cross + + # Signal 1: vol acceleration + vol5 = macro.get("qqq_vol_5") + vol20 = macro.get("qqq_vol_20") + if vol5 is not None and vol20 is not None and vol20 > 0: + if vol5 / vol20 > rv_ratio: + return True + + # Signal 2: trend break + sector weakness + if sma_cross: + qqq_close = macro.get("qqq_close") + qqq_sma10 = macro.get("qqq_sma_10") + smh_mom5 = macro.get("smh_mom_5") + if ( + qqq_close is not None + and qqq_sma10 is not None + and smh_mom5 is not None + and qqq_close < qqq_sma10 + and smh_mom5 < 0 + ): + return True + + # Signal 3: sharp 5-day drawdown + qqq_high5 = macro.get("qqq_high_5") + qqq_close = macro.get("qqq_close") + if ( + qqq_high5 is not None + and qqq_close is not None + and qqq_high5 > 0 + and (qqq_high5 - qqq_close) / qqq_high5 > dd5_pct + ): + return True + + # Signal 4: near-SMA buffer — exit when QQQ is within sma_buffer% ABOVE SMA10 (pre-emptive) + sma_buffer = cfg.cash_parking_overlay_shock_brake_sma_buffer + if sma_buffer > 0: + qqq_sma10 = macro.get("qqq_sma_10") + qqq_close2 = macro.get("qqq_close") + if qqq_sma10 and qqq_close2 and qqq_sma10 > 0: + sma_gap = (qqq_close2 - qqq_sma10) / qqq_sma10 + if 0 < sma_gap < sma_buffer: + return True + + return False + + def _compute_overlay_blend_weights(self, macro: dict) -> tuple[float, float]: + """Compute QQQM and TQQQ weights for continuous leverage blend. + + Returns (w_qqqm, w_tqqq) where sum == 1.0. + Effective leverage = 1*w_qqqm + 3*w_tqqq = 1 + 2*w_tqqq. + Target leverage = clip(target_vol / rv20, 1.0, max_leverage). + """ + cfg = self.config.risk + target_vol = cfg.cash_parking_overlay_blend_target_vol + max_lev = cfg.cash_parking_overlay_blend_max_leverage + rv20 = macro.get("qqq_vol_20") + if not rv20 or rv20 <= 0: + return (1.0, 0.0) + target_L = max(1.0, min(target_vol / rv20, max_lev)) + w_tqqq = (target_L - 1.0) / 2.0 + w_tqqq = max(0.0, min(w_tqqq, 1.0)) + return (1.0 - w_tqqq, w_tqqq) + def _evaluate_low_vol_overlay_target(self, macro: dict, park_mode: str) -> str | None: """Upgrade a safe parking regime to a stricter overlay symbol. @@ -5201,6 +6028,10 @@ class BacktestRunner: This helper only allows the overlay when the market is materially calmer than the normal QQQ/QQQM parking threshold. """ + # Shock brake cooldown: suppress overlay re-entry for N days after brake + if self._parking_overlay_brake_cooldown > 0: + return None + overlay_symbol = self.config.risk.cash_parking_low_vol_overlay_symbol if not overlay_symbol or overlay_symbol == park_mode: return None @@ -6335,7 +7166,15 @@ class BacktestRunner: def _get_parking_value(self, date: dt.date) -> float: """Current market value of all parked positions.""" val = 0.0 - if self._parking_shares > 0: + if self._parking_current_symbol == "tqqq_blend": + macro = self.store.get_macro_for_date(date) or {} + if self._parking_blend_tqqq_shares > 0: + tqqq_p = macro.get("tqqq_close", self._parking_blend_tqqq_avg_price) + val += self._parking_blend_tqqq_shares * tqqq_p + if self._parking_blend_qqqm_shares > 0: + qqqm_p = macro.get("qqqm_close", self._parking_blend_qqqm_avg_price) + val += self._parking_blend_qqqm_shares * qqqm_p + elif self._parking_shares > 0: macro = self.store.get_macro_for_date(date) or {} p = macro.get(f"{self._parking_current_symbol}_close", self._parking_avg_price) val += self._parking_shares * p @@ -6383,7 +7222,34 @@ class BacktestRunner: freed = False macro = self.store.get_macro_for_date(date) or {} self._mark_parallel_sgov_to_market(date, macro) - if self._parking_shares > 0: + + # Blend mode: liquidate both TQQQ and QQQM legs + if self._parking_current_symbol == "tqqq_blend": + for sym, shares, avg_price in [ + ("tqqq", self._parking_blend_tqqq_shares, self._parking_blend_tqqq_avg_price), + ("qqqm", self._parking_blend_qqqm_shares, self._parking_blend_qqqm_avg_price), + ]: + if shares > 0: + close_price = macro.get(f"{sym}_close") + if close_price and close_price > 0: + exit_price = close_price + proceeds = shares * close_price + else: + exit_price = avg_price + proceeds = shares * avg_price + parking_pnl = proceeds - (shares * avg_price) + self._cash += proceeds + self._realized_pnl += parking_pnl + self._record_parking_trade(date, sym, shares, avg_price, exit_price) + self._parking_blend_tqqq_shares = 0 + self._parking_blend_tqqq_avg_price = 0.0 + self._parking_blend_qqqm_shares = 0 + self._parking_blend_qqqm_avg_price = 0.0 + self._parking_current_symbol = "" + self._parking_sold_today = True + self._parking_overlay_hold_days = 0 + freed = True + elif self._parking_shares > 0: entry_price_for_record = self._parking_avg_price park_close = macro.get(f"{self._parking_current_symbol}_close") if park_close and park_close > 0: @@ -6404,6 +7270,7 @@ class BacktestRunner: self._parking_shares = 0 self._parking_avg_price = 0.0 self._parking_current_symbol = "" + self._parking_overlay_hold_days = 0 # Mark sold to prevent same-day re-buy (day trade rule) if sold_sym: self._parking_sold_today = True @@ -6413,7 +7280,7 @@ class BacktestRunner: self._cash += self._parking_sgov_value self._reset_parallel_sgov_state() freed = True - if self._parking_shares <= 0 and self._parking_sgov_value <= 0: + if self._parking_shares <= 0 and self._parking_sgov_value <= 0 and self._parking_current_symbol != "tqqq_blend": self._parking_entry_date = None self._parking_peak_price = 0.0 return freed @@ -6447,6 +7314,14 @@ class BacktestRunner: if self._parking_sgov_value < 1e-9: self._reset_parallel_sgov_state() + # Blend mode: liquidate entire blend position if needed + if self._parking_current_symbol == "tqqq_blend" and remaining_needed > 0: + blend_freed = self._liquidate_parking(date) + if blend_freed: + self._parking_freed_for_cash_today = True + freed = True + return freed + if self._parking_shares <= 0 or remaining_needed <= 0: if self._parking_shares <= 0 and self._parking_sgov_value <= 0: self._parking_entry_date = None @@ -7558,15 +8433,26 @@ def main() -> None: parser.add_argument("--parking", default=None, help="Cash parking preset (e.g. qqqm_low_dd)") parser.add_argument("--idle-alpha", default=None, help="Idle alpha sleeve preset (e.g. micro_event_alpha)") parser.add_argument("--idle-alpha-dedup", default=None, choices=["skip", "rename"], help="IA dedup mode: 'skip' (default) skips conflicting IA engines; 'rename' adds __ia_sleeve suffix and injects anyway") - parser.add_argument("--dividend-sleeve", default=None, help="Dividend capture sleeve preset (e.g. reserve_dividend_capture)") + parser.add_argument("--dividend-sleeve", default=None, help="Dividend capture sleeve preset name") parser.add_argument("--form4-sleeve", default=None, help="Form 4 capture sleeve preset (e.g. reserve_form4_cluster)") parser.add_argument("--ownership-sleeve", default=None, help="Ownership 13D/13G sleeve preset (e.g. ownership_13d_raise_reserve_plus_strict)") - parser.add_argument("--risk-off-sleeve", default=None, help="Risk-off alpha sleeve preset (e.g. risk_off_alpha_gld_dbc)") + parser.add_argument("--risk-off-sleeve", default=None, help="Risk-off alpha sleeve preset (e.g. risk_off_alpha_gld_crisis60)") + parser.add_argument("--non-core-allocator-v2", action="store_true", help="Enable non-core allocator v2") + parser.add_argument("--non-core-allocator-v2-mode", choices=["shadow", "live"], default=None, help="Non-core allocator v2 mode") args = parser.parse_args() manifest = load_manifest(args.manifest) config = resolve_config(manifest, config_root=args.config_root, snapshot_id_override=args.snapshot_id) + # Auto-refresh snapshot if stale (covers CLI and web subprocess paths). + # Uses _last_market_closed_date() as the reference so the snapshot updates + # once market closes today (same criteria as price bar extension). + import asyncio as _asyncio + from apps.paper_trader.backtest_sim import _refresh_snapshot, _snapshot_needs_refresh + _snap_id = config.canonical_snapshot_id or config.dataset_snapshot_id + if _snapshot_needs_refresh(_snap_id, _last_market_closed_date()): + _asyncio.run(_refresh_snapshot(_snap_id, universe_profile=None)) + if args.mode: config.risk.backtest_mode = args.mode @@ -7590,6 +8476,10 @@ def main() -> None: if args.risk_off_sleeve: config.risk_off_alpha_sleeve_preset = args.risk_off_sleeve config.apply_risk_off_alpha_sleeve_preset() + if args.non_core_allocator_v2 or args.non_core_allocator_v2_mode: + config.non_core_allocator_v2.enabled = True + if args.non_core_allocator_v2_mode: + config.non_core_allocator_v2.mode = args.non_core_allocator_v2_mode if args.walk_forward and args.robustness_matrix: raise SystemExit("Use either --walk-forward or --robustness-matrix, not both.") diff --git a/apps/paper_trader/backtest_sim.py b/apps/paper_trader/backtest_sim.py index 3878ab3..34b0fc6 100644 --- a/apps/paper_trader/backtest_sim.py +++ b/apps/paper_trader/backtest_sim.py @@ -39,6 +39,7 @@ def run_backtest_session_sync( form4_sleeve_preset: str | None = None, ownership_sleeve_preset: str | None = None, risk_off_alpha_sleeve_preset: str | None = None, + non_core_allocator_v2_mode: str | None = None, snapshot_id_override: str | None = None, fixed_capital_sizing: bool = False, ) -> dict[str, Any]: @@ -59,6 +60,15 @@ def run_backtest_session_sync( manifest = load_manifest(config_path) config = resolve_config(manifest, snapshot_id_override=snapshot_id_override) + # Auto-refresh snapshot if stale (covers web direct_runner path). + # Uses _last_market_closed_date() as the reference so the snapshot updates + # once market closes today (same criteria as price bar extension). + import asyncio as _asyncio + from apps.backtester.run import _last_market_closed_date + _snap_id = config.canonical_snapshot_id or config.dataset_snapshot_id + if _snapshot_needs_refresh(_snap_id, _last_market_closed_date()): + _asyncio.run(_refresh_snapshot(_snap_id, universe_profile=None)) + # Apply parking preset override (CLI --parking option) if parking_preset: config.risk.cash_parking_preset = parking_preset @@ -75,6 +85,9 @@ def run_backtest_session_sync( if risk_off_alpha_sleeve_preset: config.risk_off_alpha_sleeve_preset = risk_off_alpha_sleeve_preset config.apply_risk_off_alpha_sleeve_preset() + if non_core_allocator_v2_mode: + config.non_core_allocator_v2.enabled = True + config.non_core_allocator_v2.mode = non_core_allocator_v2_mode if fixed_capital_sizing: config.risk.fixed_capital_sizing = True @@ -276,12 +289,13 @@ def _snapshot_has_required_coverage( snapshot_id: str, end_date: dt.date, snapshot_dir: str | None = None, - grace_days: int = 3, + grace_days: int = 1, ) -> bool: """Return True when an existing snapshot already covers the requested date. grace_days: max allowed gap between snapshot's latest event and end_date. - Default 3 (covers weekends/holidays). Previous default was 14. + Default 1 (covers weekends/holidays with 1-day lag). Paired with the + .last_refresh marker this ensures at most one refresh per calendar day. """ snapshot_path = _resolve_snapshot_path(snapshot_id, snapshot_dir=snapshot_dir) if snapshot_path is None: @@ -431,6 +445,8 @@ def run_backtest( idle_alpha_preset: str | None = None, form4_sleeve_preset: str | None = None, ownership_sleeve_preset: str | None = None, + risk_off_alpha_sleeve_preset: str | None = None, + non_core_allocator_v2_mode: str | None = None, snapshot_id_override: str | None = None, auto_refresh: bool = True, ) -> list[dict[str, Any]]: @@ -503,6 +519,8 @@ def run_backtest( idle_alpha_preset=idle_alpha_preset, form4_sleeve_preset=form4_sleeve_preset, ownership_sleeve_preset=ownership_sleeve_preset, + risk_off_alpha_sleeve_preset=risk_off_alpha_sleeve_preset, + non_core_allocator_v2_mode=non_core_allocator_v2_mode, snapshot_id_override=snapshot_id_override, ) diff --git a/apps/paper_trader/cli.py b/apps/paper_trader/cli.py index 0e95820..e75cb50 100644 --- a/apps/paper_trader/cli.py +++ b/apps/paper_trader/cli.py @@ -498,6 +498,8 @@ def cmd_backtest(args: argparse.Namespace) -> None: except ValueError as exc: _console.print(f"[red]ERROR: Invalid date: {exc}[/]") sys.exit(1) + if getattr(args, "non_core_allocator_v2", False) and not getattr(args, "non_core_allocator_v2_mode", None): + args.non_core_allocator_v2_mode = "shadow" oracle_url = os.environ.get("ORACLE_URL") or os.environ.get("STOCK_ORACLE_URL", "http://localhost:8000") db_dsn = os.environ.get("DB_DSN") or os.environ.get("POSTGRES_DSN", "") @@ -525,6 +527,8 @@ def cmd_backtest(args: argparse.Namespace) -> None: idle_alpha_preset=getattr(args, 'idle_alpha', None), form4_sleeve_preset=getattr(args, 'form4_sleeve', None), ownership_sleeve_preset=getattr(args, 'ownership_sleeve', None), + risk_off_alpha_sleeve_preset=getattr(args, 'risk_off_sleeve', None), + non_core_allocator_v2_mode=getattr(args, 'non_core_allocator_v2_mode', None), snapshot_id_override=getattr(args, 'snapshot_id', None), auto_refresh=not getattr(args, 'no_refresh', False), ) @@ -684,6 +688,12 @@ def main() -> None: help="Apply Form 4 sleeve preset (e.g. reserve_form4_cluster_patient). Overrides config.") p.add_argument("--ownership-sleeve", default=None, metavar="PRESET", help="Apply 13D/13G ownership sleeve preset (e.g. ownership_13d_raise_reserve_plus_strict). Overrides config.") + p.add_argument("--risk-off-sleeve", default=None, metavar="PRESET", + help="Apply risk-off alpha sleeve preset. Overrides config.") + p.add_argument("--non-core-allocator-v2", action="store_true", default=False, + help="Enable non-core allocator v2.") + p.add_argument("--non-core-allocator-v2-mode", default=None, choices=["shadow", "live"], + help="Run non-core allocator v2 in shadow or live mode.") p.add_argument("--snapshot-id", default=None, metavar="SNAPSHOT_ID", help="Override dataset_snapshot_id (e.g. midlarge-liquid-long-v1-oot-2020-2021)") p.add_argument("--no-refresh", action="store_true", default=False, diff --git a/apps/paper_trader/engine.py b/apps/paper_trader/engine.py index 1aaedca..b4fdccc 100644 --- a/apps/paper_trader/engine.py +++ b/apps/paper_trader/engine.py @@ -127,6 +127,8 @@ class PaperTradingEngine: ) # Lookback entry: fired once per daemon session on the first run_next_open call self._lookback_injected: bool = False + # Overlay shock brake cooldown (in-memory, session-scoped) + self._parking_brake_cooldown_remaining: int = 0 def _get_candidate_capital_bucket_id(self, candidate: Candidate) -> str | None: return candidate.engine_capital_bucket_id @@ -1181,17 +1183,185 @@ class PaperTradingEngine: return actual_sym + def _parking_check_shock_brake(self, today: dt.date) -> bool: + """Check QQQ/SMH acceleration signals for fast overlay exit. + + Returns True if any brake signal fires. + """ + import math + + risk = self._config.risk + rv_ratio = risk.cash_parking_overlay_shock_brake_rv_ratio + dd5_pct = risk.cash_parking_overlay_shock_brake_dd5_pct + sma_cross = risk.cash_parking_overlay_shock_brake_sma_cross + + lookback = 55 # enough for vol_20 + buffer + start = today - dt.timedelta(days=lookback * 2) + qqq_bars_dict = self._broker.get_bars_as_dict(["QQQ"], start, today) + qqq_bars = qqq_bars_dict.get("QQQ", {}) + if len(qqq_bars) < 22: + return False + + sorted_dates = sorted(qqq_bars.keys()) + qqq_closes = [qqq_bars[d]["close"] for d in sorted_dates] + n = len(qqq_closes) + + def _vol(lb: int) -> float | None: + if n < lb + 1: + return None + log_rets = [] + for i in range(n - lb, n): + if qqq_closes[i - 1] > 0: + log_rets.append(math.log(qqq_closes[i] / qqq_closes[i - 1])) + if not log_rets: + return None + mean_r = sum(log_rets) / len(log_rets) + var_r = sum((r - mean_r) ** 2 for r in log_rets) / len(log_rets) + return math.sqrt(var_r * 252) + + # Signal 1: vol acceleration + vol5 = _vol(5) + vol20 = _vol(20) + if vol5 is not None and vol20 is not None and vol20 > 0: + if vol5 / vol20 > rv_ratio: + return True + + # Signal 2: trend break + sector weakness + if sma_cross and n >= 11: + qqq_close_now = qqq_closes[-1] + qqq_sma10 = sum(qqq_closes[-10:]) / 10 + if qqq_close_now < qqq_sma10: + # Check SMH mom_5 + smh_bars_dict = self._broker.get_bars_as_dict(["SMH"], start, today) + smh_bars = smh_bars_dict.get("SMH", {}) + if len(smh_bars) >= 7: + smh_sorted = sorted(smh_bars.keys()) + smh_closes = [smh_bars[d]["close"] for d in smh_sorted] + if len(smh_closes) >= 6 and smh_closes[-6] > 0: + smh_mom5 = (smh_closes[-1] - smh_closes[-6]) / smh_closes[-6] + if smh_mom5 < 0: + return True + + # Signal 3: sharp 5-day drawdown + if n >= 6: + qqq_high5 = max(qqq_closes[-5:]) + qqq_close_now = qqq_closes[-1] + if qqq_high5 > 0 and (qqq_high5 - qqq_close_now) / qqq_high5 > dd5_pct: + return True + + # Signal 4: near-SMA buffer — exit when QQQ within sma_buffer% ABOVE SMA10 (pre-emptive) + sma_buffer = getattr(risk, "cash_parking_overlay_shock_brake_sma_buffer", 0.0) + if sma_buffer > 0 and n >= 11: + qqq_close_now = qqq_closes[-1] + qqq_sma10 = sum(qqq_closes[-10:]) / 10 + if qqq_sma10 > 0: + sma_gap = (qqq_close_now - qqq_sma10) / qqq_sma10 + if 0 < sma_gap < sma_buffer: + return True + + return False + def _parking_check_and_sell(self, session_id: str, today: dt.date) -> bool: """Check gate signal, apply confirmation, trailing stop. Returns True if sold.""" + import math + parking_st = self._state.get_parking_state(session_id) if parking_st is None: return False current_sym = parking_st["symbol"].lower() + risk = self._config.risk target = self._parking_evaluate_gate(today) + # --- Decrement overlay brake cooldown --- + brake_cooldown = int(parking_st.get("overlay_brake_cooldown", 0)) + if brake_cooldown > 0: + brake_cooldown -= 1 + self._state.update_parking_gate_state(session_id, overlay_brake_cooldown=brake_cooldown) + + # --- Shock brake check --- + overlay_sym = (risk.cash_parking_low_vol_overlay_symbol or "").lower() + if ( + overlay_sym + and risk.cash_parking_overlay_shock_brake_enabled + and current_sym == overlay_sym + ): + brake_fired = self._parking_check_shock_brake(today) + if brake_fired: + logger.info("parking_shock_brake", symbol=current_sym, date=str(today)) + # Execute sell immediately (bypass confirmation) + sym = parking_st["symbol"] + qty = parking_st["qty"] + try: + if qty > 0: + self._broker.close_position(sym, qty=qty) + import time + time.sleep(1) + self._state.close_parking_state(session_id) + bars_now = self._broker.get_latest_bars([sym]) + exit_price = bars_now[sym].close if sym in bars_now else parking_st["avg_price"] + self._state.record_trade( + session_id=session_id, + symbol=sym, + engine_id=None, + capital_bucket_id=None, + entry_date=parking_st["entry_date"], + exit_date=today.isoformat(), + entry_price=parking_st["avg_price"], + exit_price=exit_price, + exit_reason="PARKING_SHOCK_BRAKE", + shares=qty, + net_pnl=(exit_price - parking_st["avg_price"]) * qty, + r_multiple=0.0, + holding_days=(today - dt.date.fromisoformat(parking_st["entry_date"])).days, + ) + except Exception as e: + logger.warning("parking_shock_brake_sell_failed", error=str(e)) + # Set cooldown for next active parking state (will be created on re-buy) + # We store cooldown on a session-level attribute for now + self._parking_brake_cooldown_remaining = risk.cash_parking_overlay_shock_brake_cooldown_days + return True + + # --- Dwell cap check --- + overlay_hold_days = int(parking_st.get("overlay_hold_days", 0)) + if overlay_sym and current_sym == overlay_sym: + overlay_hold_days += 1 + self._state.update_parking_gate_state(session_id, overlay_hold_days=overlay_hold_days) + + max_hold = risk.cash_parking_overlay_max_hold_days + if max_hold > 0 and overlay_hold_days >= max_hold: + logger.info("parking_dwell_cap", symbol=current_sym, hold_days=overlay_hold_days) + sym = parking_st["symbol"] + qty = parking_st["qty"] + try: + if qty > 0: + self._broker.close_position(sym, qty=qty) + import time + time.sleep(1) + self._state.close_parking_state(session_id) + bars_now = self._broker.get_latest_bars([sym]) + exit_price = bars_now[sym].close if sym in bars_now else parking_st["avg_price"] + self._state.record_trade( + session_id=session_id, + symbol=sym, + engine_id=None, + capital_bucket_id=None, + entry_date=parking_st["entry_date"], + exit_date=today.isoformat(), + entry_price=parking_st["avg_price"], + exit_price=exit_price, + exit_reason="PARKING_DWELL_CAP", + shares=qty, + net_pnl=(exit_price - parking_st["avg_price"]) * qty, + r_multiple=0.0, + holding_days=(today - dt.date.fromisoformat(parking_st["entry_date"])).days, + ) + except Exception as e: + logger.warning("parking_dwell_cap_sell_failed", error=str(e)) + return True + # --- Trailing stop check --- - stop_pct = self._config.risk.cash_parking_stop_pct + stop_pct = risk.cash_parking_stop_pct if stop_pct > 0 and current_sym != "sgov": peak = parking_st.get("peak_price", 0) or parking_st["avg_price"] bars = self._broker.get_latest_bars([parking_st["symbol"]]) @@ -1412,7 +1582,19 @@ class PaperTradingEngine: # --- New parking position --- target = self._parking_evaluate_gate(today) - # SGOV/QQQ/SPY/QQQM: buy through broker + # Overlay brake cooldown: suppress TQQQ overlay re-entry during cooldown + overlay_sym_cfg = (risk.cash_parking_low_vol_overlay_symbol or "").lower() + if ( + overlay_sym_cfg + and target.lower() == overlay_sym_cfg + and self._parking_brake_cooldown_remaining > 0 + ): + self._parking_brake_cooldown_remaining -= 1 + # Fall back to base park symbol + target = risk.cash_parking_symbol + logger.info("parking_overlay_cooldown_active", remaining=self._parking_brake_cooldown_remaining) + + # SGOV/QQQ/SPY/QQQM/TQQQ: buy through broker sym = target.upper() session_equity, session_cash = self._session_cash(session_id) reserve = session_equity * risk.cash_parking_reserve_pct diff --git a/apps/paper_trader/models.py b/apps/paper_trader/models.py index c8ee9f2..22dc270 100644 --- a/apps/paper_trader/models.py +++ b/apps/paper_trader/models.py @@ -113,8 +113,10 @@ CREATE TABLE IF NOT EXISTS parking_state ( committed_target TEXT NOT NULL DEFAULT '', pending_target TEXT NOT NULL DEFAULT '', pending_days INTEGER NOT NULL DEFAULT 0, - sgov_entry_value REAL NOT NULL DEFAULT 0, - sold_today INTEGER NOT NULL DEFAULT 0 + sgov_entry_value REAL NOT NULL DEFAULT 0, + sold_today INTEGER NOT NULL DEFAULT 0, + overlay_brake_cooldown INTEGER NOT NULL DEFAULT 0, + overlay_hold_days INTEGER NOT NULL DEFAULT 0 ); """ @@ -159,6 +161,8 @@ def create_schema(db_path: str | Path) -> None: ("pending_days", "INTEGER", "0"), ("sgov_entry_value", "REAL", "0"), ("sold_today", "INTEGER", "0"), + ("overlay_brake_cooldown", "INTEGER", "0"), + ("overlay_hold_days", "INTEGER", "0"), ]: try: conn.execute(f"ALTER TABLE parking_state ADD COLUMN {col} {dtype} NOT NULL DEFAULT {default}") diff --git a/apps/paper_trader/state.py b/apps/paper_trader/state.py index 957564c..de6832b 100644 --- a/apps/paper_trader/state.py +++ b/apps/paper_trader/state.py @@ -492,8 +492,9 @@ class StateManager: self, session_id: str, **kwargs: Any, ) -> None: """Update gate hysteresis fields. Accepts: gate_in_sgov, committed_target, - pending_target, pending_days, sold_today.""" - allowed = {"gate_in_sgov", "committed_target", "pending_target", "pending_days", "sold_today"} + pending_target, pending_days, sold_today, overlay_brake_cooldown, overlay_hold_days.""" + allowed = {"gate_in_sgov", "committed_target", "pending_target", "pending_days", "sold_today", + "overlay_brake_cooldown", "overlay_hold_days"} updates, params = [], [] for k, v in kwargs.items(): if k in allowed: diff --git a/apps/tools/run_composite_eval.py b/apps/tools/run_composite_eval.py index 3c60b5f..d670797 100644 --- a/apps/tools/run_composite_eval.py +++ b/apps/tools/run_composite_eval.py @@ -7,7 +7,7 @@ Usage: --manifests configs/experiments/return_max_long_v7.70.json \\ configs/experiments/return_max_long_v18.250.json \\ --parking qqqm_low_dd \\ - --idle-alpha micro_event_alpha_plus \\ + --idle-alpha micro_event_alpha_plus_event_plus \\ --output-root /tmp/composite_eval Compares composite CW, Sharpe, DD, idle fraction, and amplification factor. @@ -39,8 +39,8 @@ def parse_args() -> argparse.Namespace: help="Cash parking preset name (default: qqqm_low_dd).", ) parser.add_argument( - "--idle-alpha", default="micro_event_alpha_plus", - help="Idle alpha sleeve preset name (default: micro_event_alpha_plus).", + "--idle-alpha", default="micro_event_alpha_plus_event_plus", + help="Idle alpha sleeve preset name (default: micro_event_alpha_plus_event_plus).", ) parser.add_argument( "--no-presets", action="store_true", diff --git a/apps/tools/run_engine_ablation.py b/apps/tools/run_engine_ablation.py index 202025e..baa2ec3 100644 --- a/apps/tools/run_engine_ablation.py +++ b/apps/tools/run_engine_ablation.py @@ -10,19 +10,19 @@ Usage: python -m apps.tools.run_engine_ablation \\ --manifest configs/experiments/return_max_long_v7.70.json \\ --parking qqqm_low_dd \\ - --idle-alpha micro_event_alpha_plus \\ + --idle-alpha micro_event_alpha_plus_event_plus \\ --output-root /tmp/ablation_v7.70 # Greedy pruning (iteratively removes worst composite-contributor) python -m apps.tools.run_engine_ablation \\ --manifest configs/experiments/return_max_long_v7.70.json \\ - --parking qqqm_low_dd --idle-alpha micro_event_alpha_plus \\ + --parking qqqm_low_dd --idle-alpha micro_event_alpha_plus_event_plus \\ --greedy-prune --output-root /tmp/ablation_v7.70 # Risk budget sweep (test 0.5x/1.0x/1.5x for each engine's risk budget) python -m apps.tools.run_engine_ablation \\ --manifest configs/experiments/return_max_long_v7.70.json \\ - --parking qqqm_low_dd --idle-alpha micro_event_alpha_plus \\ + --parking qqqm_low_dd --idle-alpha micro_event_alpha_plus_event_plus \\ --budget-sweep --output-root /tmp/ablation_v7.70 """ from __future__ import annotations @@ -46,7 +46,7 @@ def parse_args() -> argparse.Namespace: ) parser.add_argument("--manifest", required=True, help="Base experiment manifest path.") parser.add_argument("--parking", default="qqqm_low_dd", help="Cash parking preset.") - parser.add_argument("--idle-alpha", default="micro_event_alpha_plus", help="IA sleeve preset.") + parser.add_argument("--idle-alpha", default="micro_event_alpha_plus_event_plus", help="IA sleeve preset.") parser.add_argument("--snapshot-dir", default=DEFAULT_SNAPSHOT_DIR) parser.add_argument("--output-root", required=True, help="Root directory for run artifacts.") parser.add_argument("--split", default="all", help="Backtest split (default: 'all' = full period merging train+valid+test).") diff --git a/apps/web/direct_runner.py b/apps/web/direct_runner.py index 93d4f73..8b6e065 100644 --- a/apps/web/direct_runner.py +++ b/apps/web/direct_runner.py @@ -1,7 +1,7 @@ """Direct backtest subprocess runner. Invoked by the web server as a subprocess: - python -m apps.web.direct_runner TASK_ID CONFIG_PATH CAPITAL START_DATE END_DATE RESULT_FILE [--parking PRESET] [--idle-alpha PRESET] [--form4-sleeve PRESET] [--ownership-sleeve PRESET] [--risk-off-sleeve PRESET] + python -m apps.web.direct_runner TASK_ID CONFIG_PATH CAPITAL START_DATE END_DATE RESULT_FILE [--parking PRESET] [--idle-alpha PRESET] [--form4-sleeve PRESET] [--ownership-sleeve PRESET] [--risk-off-sleeve PRESET] [--non-core-allocator-v2-mode MODE] Runs run_backtest_session_sync() and saves the result JSON to RESULT_FILE. Exits 0 on success, non-zero on failure. @@ -23,7 +23,7 @@ def _json_default(obj): def main(): if len(sys.argv) < 7: print( - "Usage: direct_runner TASK_ID CONFIG_PATH CAPITAL START_DATE END_DATE RESULT_FILE [--parking PRESET] [--idle-alpha PRESET] [--form4-sleeve PRESET] [--ownership-sleeve PRESET] [--risk-off-sleeve PRESET]", + "Usage: direct_runner TASK_ID CONFIG_PATH CAPITAL START_DATE END_DATE RESULT_FILE [--parking PRESET] [--idle-alpha PRESET] [--form4-sleeve PRESET] [--ownership-sleeve PRESET] [--risk-off-sleeve PRESET] [--non-core-allocator-v2-mode MODE]", file=sys.stderr, ) sys.exit(2) @@ -41,6 +41,7 @@ def main(): form4_sleeve_preset = None ownership_sleeve_preset = None risk_off_alpha_sleeve_preset = None + non_core_allocator_v2_mode = None snapshot_id_override = None fixed_capital = False remaining = sys.argv[7:] @@ -61,6 +62,9 @@ def main(): elif remaining[i] == "--risk-off-sleeve" and i + 1 < len(remaining): risk_off_alpha_sleeve_preset = remaining[i + 1] i += 2 + elif remaining[i] == "--non-core-allocator-v2-mode" and i + 1 < len(remaining): + non_core_allocator_v2_mode = remaining[i + 1] + i += 2 elif remaining[i] == "--snapshot-id" and i + 1 < len(remaining): snapshot_id_override = remaining[i + 1] i += 2 @@ -76,6 +80,7 @@ def main(): (f" · form4={form4_sleeve_preset}" if form4_sleeve_preset else "") + (f" · ownership={ownership_sleeve_preset}" if ownership_sleeve_preset else "") + (f" · risk_off={risk_off_alpha_sleeve_preset}" if risk_off_alpha_sleeve_preset else "") + + (f" · ncav2={non_core_allocator_v2_mode}" if non_core_allocator_v2_mode else "") + (f" · snapshot={snapshot_id_override}" if snapshot_id_override else "") + (" · fixed_capital" if fixed_capital else "")) sys.stdout.flush() @@ -93,6 +98,7 @@ def main(): form4_sleeve_preset=form4_sleeve_preset, ownership_sleeve_preset=ownership_sleeve_preset, risk_off_alpha_sleeve_preset=risk_off_alpha_sleeve_preset, + non_core_allocator_v2_mode=non_core_allocator_v2_mode, snapshot_id_override=snapshot_id_override, fixed_capital_sizing=fixed_capital, ) diff --git a/apps/web/routers/backtest.py b/apps/web/routers/backtest.py index d8c5e89..0028df9 100644 --- a/apps/web/routers/backtest.py +++ b/apps/web/routers/backtest.py @@ -354,6 +354,7 @@ class BacktestRequest(BaseModel): form4_sleeve: str | None = None # Form 4 residual-cash sleeve preset name ownership_sleeve: str | None = None # 13D/13G ownership sleeve preset name risk_off_sleeve: str | None = None # risk-off alpha sleeve preset name + non_core_allocator_v2_mode: str | None = None # shadow|live snapshot_id: str | None = None # override dataset_snapshot_id (e.g. for OOT periods) fixed_capital: bool = False # non-compounding: size positions using initial capital @@ -370,6 +371,7 @@ class BatchBacktestRequest(BaseModel): form4_sleeve: str | None = None ownership_sleeve: str | None = None risk_off_sleeve: str | None = None + non_core_allocator_v2_mode: str | None = None # --------------------------------------------------------------------------- @@ -389,6 +391,7 @@ def _make_task( form4_sleeve: str | None = None, ownership_sleeve: str | None = None, risk_off_sleeve: str | None = None, + non_core_allocator_v2_mode: str | None = None, snapshot_id: str | None = None, fixed_capital: bool = False, ) -> dict[str, Any]: @@ -415,6 +418,7 @@ def _make_task( "form4_sleeve": form4_sleeve, "ownership_sleeve": ownership_sleeve, "risk_off_sleeve": risk_off_sleeve, + "non_core_allocator_v2_mode": non_core_allocator_v2_mode, "snapshot_id": snapshot_id, } @@ -535,6 +539,7 @@ def _build_cmd( form4_sleeve: str | None = None, ownership_sleeve: str | None = None, risk_off_sleeve: str | None = None, + non_core_allocator_v2_mode: str | None = None, snapshot_id: str | None = None, ) -> list[str]: """Build the paper backtest CLI command.""" @@ -563,6 +568,8 @@ def _build_cmd( cmd += ["--ownership-sleeve", ownership_sleeve] if risk_off_sleeve: cmd += ["--risk-off-sleeve", risk_off_sleeve] + if non_core_allocator_v2_mode: + cmd += ["--non-core-allocator-v2", "--non-core-allocator-v2-mode", non_core_allocator_v2_mode] if snapshot_id: cmd += ["--snapshot-id", snapshot_id] return cmd @@ -601,6 +608,7 @@ def _launch_backtest(req: BacktestRequest) -> dict[str, Any]: eff_form4 = req.form4_sleeve or baked.get("form4_sleeve") eff_ownership = req.ownership_sleeve or baked.get("ownership_sleeve") eff_risk_off = req.risk_off_sleeve or baked.get("risk_off_sleeve") + eff_non_core_allocator_v2_mode = req.non_core_allocator_v2_mode if eff_parking and eff_parking not in PARKING_PRESETS: raise HTTPException(status_code=400, detail=f"Unknown parking preset: {eff_parking}") @@ -612,6 +620,8 @@ def _launch_backtest(req: BacktestRequest) -> dict[str, Any]: raise HTTPException(status_code=400, detail=f"Unknown ownership sleeve preset: {eff_ownership}") if eff_risk_off and eff_risk_off not in RISK_OFF_ALPHA_SLEEVE_PRESETS: raise HTTPException(status_code=400, detail=f"Unknown risk-off sleeve preset: {eff_risk_off}") + if eff_non_core_allocator_v2_mode and eff_non_core_allocator_v2_mode not in {"shadow", "live"}: + raise HTTPException(status_code=400, detail=f"Unknown non-core allocator v2 mode: {eff_non_core_allocator_v2_mode}") task = _make_task( req.experiment_name, @@ -625,6 +635,7 @@ def _launch_backtest(req: BacktestRequest) -> dict[str, Any]: form4_sleeve=eff_form4, ownership_sleeve=eff_ownership, risk_off_sleeve=eff_risk_off, + non_core_allocator_v2_mode=eff_non_core_allocator_v2_mode, snapshot_id=req.snapshot_id, ) task_id = task["task_id"] @@ -648,6 +659,7 @@ def _launch_backtest(req: BacktestRequest) -> dict[str, Any]: "form4_sleeve": eff_form4, "ownership_sleeve": eff_ownership, "risk_off_sleeve": eff_risk_off, + "non_core_allocator_v2_mode": eff_non_core_allocator_v2_mode, "created_at": task["created_at"], }, indent=2)) @@ -664,6 +676,7 @@ def _launch_backtest(req: BacktestRequest) -> dict[str, Any]: eff_form4, eff_ownership, eff_risk_off, + eff_non_core_allocator_v2_mode, req.snapshot_id, ) @@ -701,6 +714,7 @@ def _launch_backtest_multi( form4_sleeve: str | None = None, ownership_sleeve: str | None = None, risk_off_sleeve: str | None = None, + non_core_allocator_v2_mode: str | None = None, ) -> dict[str, Any]: """Launch ONE subprocess with multiple --config flags for batch experiments.""" project_root = get_project_root() @@ -723,6 +737,8 @@ def _launch_backtest_multi( raise HTTPException(status_code=400, detail=f"Unknown ownership sleeve preset: {ownership_sleeve}") if risk_off_sleeve and risk_off_sleeve not in RISK_OFF_ALPHA_SLEEVE_PRESETS: raise HTTPException(status_code=400, detail=f"Unknown risk-off sleeve preset: {risk_off_sleeve}") + if non_core_allocator_v2_mode and non_core_allocator_v2_mode not in {"shadow", "live"}: + raise HTTPException(status_code=400, detail=f"Unknown non-core allocator v2 mode: {non_core_allocator_v2_mode}") display_name = ", ".join(names) task = _make_task( @@ -737,6 +753,7 @@ def _launch_backtest_multi( form4_sleeve=form4_sleeve, ownership_sleeve=ownership_sleeve, risk_off_sleeve=risk_off_sleeve, + non_core_allocator_v2_mode=non_core_allocator_v2_mode, ) task_id = task["task_id"] @@ -760,6 +777,7 @@ def _launch_backtest_multi( "form4_sleeve": form4_sleeve, "ownership_sleeve": ownership_sleeve, "risk_off_sleeve": risk_off_sleeve, + "non_core_allocator_v2_mode": non_core_allocator_v2_mode, "created_at": created_at, }, indent=2)) @@ -776,6 +794,7 @@ def _launch_backtest_multi( form4_sleeve, ownership_sleeve, risk_off_sleeve, + non_core_allocator_v2_mode, ) with open(log_file, "wb") as log_fp: @@ -868,6 +887,7 @@ def _launch_direct_backtest(req: BacktestRequest) -> dict[str, Any]: eff_form4 = req.form4_sleeve or baked.get("form4_sleeve") eff_ownership = req.ownership_sleeve or baked.get("ownership_sleeve") eff_risk_off = req.risk_off_sleeve or baked.get("risk_off_sleeve") + eff_non_core_allocator_v2_mode = req.non_core_allocator_v2_mode task = _make_task( req.experiment_name, req.capital, req.start, req.end, req.year, req.no_trades, @@ -877,6 +897,7 @@ def _launch_direct_backtest(req: BacktestRequest) -> dict[str, Any]: form4_sleeve=eff_form4, ownership_sleeve=eff_ownership, risk_off_sleeve=eff_risk_off, + non_core_allocator_v2_mode=eff_non_core_allocator_v2_mode, snapshot_id=req.snapshot_id, fixed_capital=req.fixed_capital, ) @@ -905,6 +926,8 @@ def _launch_direct_backtest(req: BacktestRequest) -> dict[str, Any]: cmd += ["--ownership-sleeve", eff_ownership] if eff_risk_off: cmd += ["--risk-off-sleeve", eff_risk_off] + if eff_non_core_allocator_v2_mode: + cmd += ["--non-core-allocator-v2-mode", eff_non_core_allocator_v2_mode] if req.snapshot_id: cmd += ["--snapshot-id", req.snapshot_id] if req.fixed_capital: @@ -965,6 +988,7 @@ def submit_batch(req: BatchBacktestRequest) -> dict[str, Any]: form4_sleeve=req.form4_sleeve, ownership_sleeve=req.ownership_sleeve, risk_off_sleeve=req.risk_off_sleeve, + non_core_allocator_v2_mode=req.non_core_allocator_v2_mode, ) task = _launch_backtest(single) return {"tasks": [task]} @@ -981,6 +1005,7 @@ def submit_batch(req: BatchBacktestRequest) -> dict[str, Any]: form4_sleeve=req.form4_sleeve, ownership_sleeve=req.ownership_sleeve, risk_off_sleeve=req.risk_off_sleeve, + non_core_allocator_v2_mode=req.non_core_allocator_v2_mode, ) return {"tasks": [task]} @@ -1200,37 +1225,42 @@ def list_snapshots() -> dict[str, Any]: @router.get("/parking-presets") def get_parking_presets() -> dict[str, Any]: - """Return all named parking presets grouped by category.""" - _GROUP_PREFIX = { - "vol_": "Volatility Only", - "vm_": "Vol + Momentum", - "ve_": "Entropy", - "vme_": "Vol + Momentum + Entropy", - "vv_": "VRP", - "vmv_": "Vol + Momentum + VRP", - "vt_": "Temperature", - "vh_": "Hurst", - "vmh_": "Vol + Momentum + Hurst", - "vmeh_": "Multi-Signal", - "composite_": "Composite", - "dd": "Drawdown", - "vd_": "Vol + Drawdown", + """Return curated parking presets for public UI selection.""" + curated_groups: dict[str, list[str]] = { + "Simple / Baseline": [ + "sgov", + "qqq_no_gate", + "qqqm_low_dd", + "qqqm_low_dd_risk25", + ], + "GLD Defensive": [ + "qqqm_low_dd_gld", + ], + "TQQQ Overlay": [ + "qqqm_low_dd_tqqq_calm", + "qqqm_low_dd_tqqq_calm_v2", + "qqqm_low_dd_tqqq_calm_v2_gld", + ], + "Aggressive Frontier": [ + "qqqm_low_dd_tqqq_active", + "qqqm_low_dd_tqqq_active_v2", + "qqqm_low_dd_tqqq_active_v2_gld", + ], + "TQQQ Shock Brake": [ + "qqqm_low_dd_tqqq_active_v2_gld_brake", + "qqqm_low_dd_tqqq_active_v2_gld_brake_blend", + "qqqm_low_dd_tqqq_active_v2_gld_brake_dwell", + "qqqm_low_dd_tqqq_active_v2_gld_brake_v2", + ], } - _STANDALONE = {"sgov": "Simple / Baseline", "qqq_no_gate": "Simple / Baseline"} - groups: dict[str, list[str]] = {} - for name in PARKING_PRESETS: - if name in _STANDALONE: - group = _STANDALONE[name] - else: - group = "Other" - for prefix, label in _GROUP_PREFIX.items(): - if name.startswith(prefix): - group = label - break - groups.setdefault(group, []).append(name) - - return {"presets": list(PARKING_PRESETS.keys()), "groups": groups} + groups = { + group: [name for name in names if name in PARKING_PRESETS] + for group, names in curated_groups.items() + } + groups = {group: names for group, names in groups.items() if names} + presets = [name for names in groups.values() for name in names] + return {"presets": presets, "groups": groups} @router.get("/idle-alpha-presets") diff --git a/apps/web/static/assets/index-BryHz-pc.css b/apps/web/static/assets/index-BryHz-pc.css deleted file mode 100644 index f91e747..0000000 --- a/apps/web/static/assets/index-BryHz-pc.css +++ /dev/null @@ -1 +0,0 @@ -@import "https://fonts.googleapis.com/css2?family=Google+Sans:wght@400;500;700&family=Google+Sans+Text:wght@400;500;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap";@import "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";@layer components;@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-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-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;--spacing:.25rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--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)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.border{border-style:var(--tw-border-style);border-width:1px}.break-all{word-break:break-all}.uppercase{text-transform:uppercase}.italic{font-style:italic}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}}:root{--bg:#f5f6f8;--bg1:#fff;--bg2:#f0f1f3;--bg3:#e5e7eb;--border:#00000012;--border-md:#0000001f;--border-hi:#00000038;--text1:#1a1d24;--text2:#5f6b7a;--text3:#9ca3af;--cyan:#0077b6;--cyan-dim:#0077b60f;--cyan-mid:#0077b624;--gold:#b8860b;--gold-dim:#b8860b14;--green:#059669;--green-dim:#05966914;--red:#dc2626;--red-dim:#dc262612;--orange:#ea580c;--purple:#7c3aed;--purple-dim:#7c3aed12;--font-sans:"Google Sans", "Google Sans Text", "Inter", system-ui, -apple-system, sans-serif;--font-mono:"IBM Plex Mono", "SF Mono", monospace;--sidebar-w:230px}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}body{font-family:var(--font-sans);background:var(--bg);color:var(--text1);-webkit-font-smoothing:antialiased;min-height:100vh;font-size:16px;line-height:1.6}#root{min-height:100vh;display:flex}.mono,code,pre,kbd,[data-mono],.tabular-nums{font-family:var(--font-mono)}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#00000024;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#0000003d}.glow-cyan,.glow-gold,.glow-green{text-shadow:none}@keyframes fadeUp{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.fade-up{animation:.22s ease-out both fadeUp}@keyframes spin{to{transform:rotate(360deg)}}.spin{animation:.9s linear infinite spin}@keyframes indeterminate{0%{transform:translate(-100%)}to{transform:translate(350%)}}@keyframes pulse-line{0%,to{opacity:.4}50%{opacity:1}}.sqs-bar{background:linear-gradient(90deg, var(--cyan), var(--gold));vertical-align:middle;border-radius:2px;height:3px;display:inline-block}.card{background:var(--bg1);border:1px solid var(--border);border-radius:12px;transition:border-color .15s,box-shadow .15s;box-shadow:0 1px 3px #0000000a,0 1px 2px #00000005}.card:hover{border-color:var(--border-md);box-shadow:0 4px 12px #00000012}.card-active{box-shadow:0 0 0 2px var(--cyan-dim);border-color:var(--cyan)!important}.data-table{border-collapse:collapse;width:100%}.data-table th{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;color:var(--text3);text-align:left;white-space:nowrap;border-bottom:1px solid var(--border);padding:0 16px 12px;font-size:12px;font-weight:500}.data-table td{border-bottom:1px solid var(--border);white-space:nowrap;padding:12px 16px}.data-table tbody tr{transition:background .1s}.data-table tbody tr:hover{background:var(--cyan-dim)}.data-table tbody tr:last-child td{border-bottom:none}input,select,textarea{background:var(--bg1);border:1px solid var(--border-md);color:var(--text1);border-radius:7px;outline:none;padding:9px 13px;font-family:inherit;font-size:15px;transition:border-color .15s,box-shadow .15s}input:focus,select:focus{border-color:var(--cyan);box-shadow:0 0 0 3px var(--cyan-dim)}input::placeholder{color:var(--text3)}button.btn{border:1px solid var(--border-md);background:var(--bg1);color:var(--text2);cursor:pointer;border-radius:7px;padding:8px 18px;font-family:inherit;font-size:14px;font-weight:500;transition:all .15s}button.btn:hover{background:var(--bg2);color:var(--text1);border-color:var(--border-hi)}button.btn-primary{background:var(--cyan-dim);color:var(--cyan);border-color:#0077b647}button.btn-primary:hover{background:var(--cyan-mid)}@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-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}.react-flow{--xy-edge-stroke-default:#b1b1b7;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#555;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#ffffff80;--xy-minimap-background-color-default:#fff;--xy-minimap-mask-background-color-default:#f0f0f099;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#e2e2e2;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:transparent;--xy-background-pattern-dots-color-default:#91919a;--xy-background-pattern-lines-color-default:#eee;--xy-background-pattern-cross-color-default:#e2e2e2;background-color:var(--xy-background-color,var(--xy-background-color-default));--xy-node-color-default:inherit;--xy-node-border-default:1px solid #1a192b;--xy-node-background-color-default:#fff;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #00000014;--xy-node-boxshadow-selected-default:0 0 0 .5px #1a192b;--xy-node-border-radius-default:3px;--xy-handle-background-color-default:#1a192b;--xy-handle-border-color-default:#fff;--xy-selection-background-color-default:#0059dc14;--xy-selection-border-default:1px dotted #0059dccc;--xy-controls-button-background-color-default:#fefefe;--xy-controls-button-background-color-hover-default:#f4f4f4;--xy-controls-button-color-default:inherit;--xy-controls-button-color-hover-default:inherit;--xy-controls-button-border-color-default:#eee;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#fff;--xy-edge-label-color-default:inherit;--xy-resize-background-color-default:#3367d9;direction:ltr}.react-flow.dark{--xy-edge-stroke-default:#3e3e3e;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#727272;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#96969640;--xy-minimap-background-color-default:#141414;--xy-minimap-mask-background-color-default:#3c3c3c99;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#2b2b2b;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:#141414;--xy-background-pattern-dots-color-default:#777;--xy-background-pattern-lines-color-default:#777;--xy-background-pattern-cross-color-default:#777;--xy-node-color-default:#f8f8f8;--xy-node-border-default:1px solid #3c3c3c;--xy-node-background-color-default:#1e1e1e;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #ffffff14;--xy-node-boxshadow-selected-default:0 0 0 .5px #999;--xy-handle-background-color-default:#bebebe;--xy-handle-border-color-default:#1e1e1e;--xy-selection-background-color-default:#c8c8dc14;--xy-selection-border-default:1px dotted #c8c8dccc;--xy-controls-button-background-color-default:#2b2b2b;--xy-controls-button-background-color-hover-default:#3e3e3e;--xy-controls-button-color-default:#f8f8f8;--xy-controls-button-color-hover-default:#fff;--xy-controls-button-border-color-default:#5b5b5b;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#141414;--xy-edge-label-color-default:#f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props,var(--xy-background-color,var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width,var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke,var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width,var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{pointer-events:none;position:absolute;overflow:visible}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:.5s linear infinite dashdraw}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected,var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:.5s linear infinite dashdraw}svg.react-flow__connectionline{z-index:1001;position:absolute;overflow:visible}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{-webkit-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default;position:absolute}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:0 0;pointer-events:none}.react-flow__nodesselection-rect{pointer-events:all;cursor:grab;position:absolute}.react-flow__handle{pointer-events:none;background-color:var(--xy-handle-background-color,var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color,var(--xy-handle-border-color-default));border-radius:100%;width:6px;min-width:5px;height:6px;min-height:5px;position:absolute}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;bottom:0;left:50%;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{z-index:5;margin:15px;position:absolute}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px)translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px)translateY(-50%)}.react-flow__attribution{background:var(--xy-attribution-background-color,var(--xy-attribution-background-color-default));margin:0;padding:2px 3px;font-size:10px}.react-flow__attribution a{color:#999;text-decoration:none}@keyframes dashdraw{0%{stroke-dashoffset:10px}}.react-flow__edgelabel-renderer{pointer-events:none;-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__viewport-portal{-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__minimap{background:var(--xy-minimap-background-color-props,var(--xy-minimap-background-color,var(--xy-minimap-background-color-default)))}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var(--xy-minimap-mask-background-color-props,var(--xy-minimap-mask-background-color,var(--xy-minimap-mask-background-color-default)));stroke:var(--xy-minimap-mask-stroke-color-props,var(--xy-minimap-mask-stroke-color,var(--xy-minimap-mask-stroke-color-default)));stroke-width:var(--xy-minimap-mask-stroke-width-props,var(--xy-minimap-mask-stroke-width,var(--xy-minimap-mask-stroke-width-default)))}.react-flow__minimap-node{fill:var(--xy-minimap-node-background-color-props,var(--xy-minimap-node-background-color,var(--xy-minimap-node-background-color-default)));stroke:var(--xy-minimap-node-stroke-color-props,var(--xy-minimap-node-stroke-color,var(--xy-minimap-node-stroke-color-default)));stroke-width:var(--xy-minimap-node-stroke-width-props,var(--xy-minimap-node-stroke-width,var(--xy-minimap-node-stroke-width-default)))}.react-flow__background-pattern.dots{fill:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-dots-color-default)))}.react-flow__background-pattern.lines{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-lines-color-default)))}.react-flow__background-pattern.cross{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-cross-color-default)))}.react-flow__controls{box-shadow:var(--xy-controls-box-shadow,var(--xy-controls-box-shadow-default));flex-direction:column;display:flex}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{background:var(--xy-controls-button-background-color,var(--xy-controls-button-background-color-default));border:none;border-bottom:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)));width:26px;height:26px;color:var(--xy-controls-button-color-props,var(--xy-controls-button-color,var(--xy-controls-button-color-default)));cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;padding:4px;display:flex}.react-flow__controls-button svg{fill:currentColor;width:100%;max-width:12px;max-height:12px}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{border-radius:var(--xy-node-border-radius,var(--xy-node-border-radius-default));width:150px;color:var(--xy-node-color,var(--xy-node-color-default));text-align:center;border:var(--xy-node-border,var(--xy-node-border-default));background-color:var(--xy-node-background-color,var(--xy-node-background-color-default));padding:10px;font-size:12px}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover,var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected,var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color,var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color,var(--xy-selection-background-color-default));border:var(--xy-selection-border,var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var(--xy-controls-button-background-color-hover-props,var(--xy-controls-button-background-color-hover,var(--xy-controls-button-background-color-hover-default)));color:var(--xy-controls-button-color-hover-props,var(--xy-controls-button-color-hover,var(--xy-controls-button-color-hover-default)))}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)))}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{background-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border:1px solid #fff;border-radius:1px;width:5px;height:5px;translate:-50% -50%}.react-flow__resize-control.handle.left{top:50%;left:0}.react-flow__resize-control.handle.right{top:50%;left:100%}.react-flow__resize-control.handle.top{top:0;left:50%}.react-flow__resize-control.handle.bottom{top:100%;left:50%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border-style:solid;border-width:0}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;height:100%;top:0;transform:translate(-50%)}.react-flow__resize-control.line.left{border-left-width:1px;left:0}.react-flow__resize-control.line.right{border-right-width:1px;left:100%}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{width:100%;height:1px;left:0;transform:translateY(-50%)}.react-flow__resize-control.line.top{border-top-width:1px;top:0}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color,var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color,var(--xy-edge-label-color-default))} diff --git a/apps/web/static/assets/index-CbyS0Od7.css b/apps/web/static/assets/index-CbyS0Od7.css new file mode 100644 index 0000000..dc7e749 --- /dev/null +++ b/apps/web/static/assets/index-CbyS0Od7.css @@ -0,0 +1 @@ +@import "https://fonts.googleapis.com/css2?family=Google+Sans:wght@400;500;700&family=Google+Sans+Text:wght@400;500;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap";@import "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";@layer components;@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-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-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;--spacing:.25rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--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)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.border{border-style:var(--tw-border-style);border-width:1px}.break-all{word-break:break-all}.uppercase{text-transform:uppercase}.italic{font-style:italic}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px 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)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}}:root{--bg:#f5f6f8;--bg1:#fff;--bg2:#f0f1f3;--bg3:#e5e7eb;--border:#00000012;--border-md:#0000001f;--border-hi:#00000038;--text1:#1a1d24;--text2:#5f6b7a;--text3:#9ca3af;--cyan:#0077b6;--cyan-dim:#0077b60f;--cyan-mid:#0077b624;--gold:#b8860b;--gold-dim:#b8860b14;--green:#059669;--green-dim:#05966914;--red:#dc2626;--red-dim:#dc262612;--orange:#ea580c;--purple:#7c3aed;--purple-dim:#7c3aed12;--font-sans:"Google Sans", "Google Sans Text", "Inter", system-ui, -apple-system, sans-serif;--font-mono:"IBM Plex Mono", "SF Mono", monospace;--sidebar-w:230px}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}body{font-family:var(--font-sans);background:var(--bg);color:var(--text1);-webkit-font-smoothing:antialiased;min-height:100vh;font-size:16px;line-height:1.6}#root{min-height:100vh;display:flex}.mono,code,pre,kbd,[data-mono],.tabular-nums{font-family:var(--font-mono)}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#00000024;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#0000003d}.glow-cyan,.glow-gold,.glow-green{text-shadow:none}@keyframes fadeUp{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.fade-up{animation:.22s ease-out both fadeUp}@keyframes spin{to{transform:rotate(360deg)}}.spin{animation:.9s linear infinite spin}@keyframes indeterminate{0%{transform:translate(-100%)}to{transform:translate(350%)}}@keyframes pulse-line{0%,to{opacity:.4}50%{opacity:1}}.sqs-bar{background:linear-gradient(90deg, var(--cyan), var(--gold));vertical-align:middle;border-radius:2px;height:3px;display:inline-block}.card{background:var(--bg1);border:1px solid var(--border);border-radius:12px;transition:border-color .15s,box-shadow .15s;box-shadow:0 1px 3px #0000000a,0 1px 2px #00000005}.card:hover{border-color:var(--border-md);box-shadow:0 4px 12px #00000012}.card-active{box-shadow:0 0 0 2px var(--cyan-dim);border-color:var(--cyan)!important}.data-table{border-collapse:collapse;width:100%}.data-table th{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.06em;color:var(--text3);text-align:left;white-space:nowrap;border-bottom:1px solid var(--border);padding:0 16px 12px;font-size:12px;font-weight:500}.data-table td{border-bottom:1px solid var(--border);white-space:nowrap;padding:12px 16px}.data-table tbody tr{transition:background .1s}.data-table tbody tr:hover{background:var(--cyan-dim)}.data-table tbody tr:last-child td{border-bottom:none}input,select,textarea{background:var(--bg1);border:1px solid var(--border-md);color:var(--text1);border-radius:7px;outline:none;padding:9px 13px;font-family:inherit;font-size:15px;transition:border-color .15s,box-shadow .15s}input:focus,select:focus{border-color:var(--cyan);box-shadow:0 0 0 3px var(--cyan-dim)}input::placeholder{color:var(--text3)}button.btn{border:1px solid var(--border-md);background:var(--bg1);color:var(--text2);cursor:pointer;border-radius:7px;padding:8px 18px;font-family:inherit;font-size:14px;font-weight:500;transition:all .15s}button.btn:hover{background:var(--bg2);color:var(--text1);border-color:var(--border-hi)}button.btn-primary{background:var(--cyan-dim);color:var(--cyan);border-color:#0077b647}button.btn-primary:hover{background:var(--cyan-mid)}@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-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}.react-flow{--xy-edge-stroke-default:#b1b1b7;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#555;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#ffffff80;--xy-minimap-background-color-default:#fff;--xy-minimap-mask-background-color-default:#f0f0f099;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#e2e2e2;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:transparent;--xy-background-pattern-dots-color-default:#91919a;--xy-background-pattern-lines-color-default:#eee;--xy-background-pattern-cross-color-default:#e2e2e2;background-color:var(--xy-background-color,var(--xy-background-color-default));--xy-node-color-default:inherit;--xy-node-border-default:1px solid #1a192b;--xy-node-background-color-default:#fff;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #00000014;--xy-node-boxshadow-selected-default:0 0 0 .5px #1a192b;--xy-node-border-radius-default:3px;--xy-handle-background-color-default:#1a192b;--xy-handle-border-color-default:#fff;--xy-selection-background-color-default:#0059dc14;--xy-selection-border-default:1px dotted #0059dccc;--xy-controls-button-background-color-default:#fefefe;--xy-controls-button-background-color-hover-default:#f4f4f4;--xy-controls-button-color-default:inherit;--xy-controls-button-color-hover-default:inherit;--xy-controls-button-border-color-default:#eee;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#fff;--xy-edge-label-color-default:inherit;--xy-resize-background-color-default:#3367d9;direction:ltr}.react-flow.dark{--xy-edge-stroke-default:#3e3e3e;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#727272;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#96969640;--xy-minimap-background-color-default:#141414;--xy-minimap-mask-background-color-default:#3c3c3c99;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#2b2b2b;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:#141414;--xy-background-pattern-dots-color-default:#777;--xy-background-pattern-lines-color-default:#777;--xy-background-pattern-cross-color-default:#777;--xy-node-color-default:#f8f8f8;--xy-node-border-default:1px solid #3c3c3c;--xy-node-background-color-default:#1e1e1e;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #ffffff14;--xy-node-boxshadow-selected-default:0 0 0 .5px #999;--xy-handle-background-color-default:#bebebe;--xy-handle-border-color-default:#1e1e1e;--xy-selection-background-color-default:#c8c8dc14;--xy-selection-border-default:1px dotted #c8c8dccc;--xy-controls-button-background-color-default:#2b2b2b;--xy-controls-button-background-color-hover-default:#3e3e3e;--xy-controls-button-color-default:#f8f8f8;--xy-controls-button-color-hover-default:#fff;--xy-controls-button-border-color-default:#5b5b5b;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#141414;--xy-edge-label-color-default:#f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props,var(--xy-background-color,var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width,var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke,var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width,var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{pointer-events:none;position:absolute;overflow:visible}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:.5s linear infinite dashdraw}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected,var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:.5s linear infinite dashdraw}svg.react-flow__connectionline{z-index:1001;position:absolute;overflow:visible}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{-webkit-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default;position:absolute}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:0 0;pointer-events:none}.react-flow__nodesselection-rect{pointer-events:all;cursor:grab;position:absolute}.react-flow__handle{pointer-events:none;background-color:var(--xy-handle-background-color,var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color,var(--xy-handle-border-color-default));border-radius:100%;width:6px;min-width:5px;height:6px;min-height:5px;position:absolute}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;bottom:0;left:50%;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{z-index:5;margin:15px;position:absolute}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px)translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px)translateY(-50%)}.react-flow__attribution{background:var(--xy-attribution-background-color,var(--xy-attribution-background-color-default));margin:0;padding:2px 3px;font-size:10px}.react-flow__attribution a{color:#999;text-decoration:none}@keyframes dashdraw{0%{stroke-dashoffset:10px}}.react-flow__edgelabel-renderer{pointer-events:none;-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__viewport-portal{-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__minimap{background:var(--xy-minimap-background-color-props,var(--xy-minimap-background-color,var(--xy-minimap-background-color-default)))}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var(--xy-minimap-mask-background-color-props,var(--xy-minimap-mask-background-color,var(--xy-minimap-mask-background-color-default)));stroke:var(--xy-minimap-mask-stroke-color-props,var(--xy-minimap-mask-stroke-color,var(--xy-minimap-mask-stroke-color-default)));stroke-width:var(--xy-minimap-mask-stroke-width-props,var(--xy-minimap-mask-stroke-width,var(--xy-minimap-mask-stroke-width-default)))}.react-flow__minimap-node{fill:var(--xy-minimap-node-background-color-props,var(--xy-minimap-node-background-color,var(--xy-minimap-node-background-color-default)));stroke:var(--xy-minimap-node-stroke-color-props,var(--xy-minimap-node-stroke-color,var(--xy-minimap-node-stroke-color-default)));stroke-width:var(--xy-minimap-node-stroke-width-props,var(--xy-minimap-node-stroke-width,var(--xy-minimap-node-stroke-width-default)))}.react-flow__background-pattern.dots{fill:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-dots-color-default)))}.react-flow__background-pattern.lines{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-lines-color-default)))}.react-flow__background-pattern.cross{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-cross-color-default)))}.react-flow__controls{box-shadow:var(--xy-controls-box-shadow,var(--xy-controls-box-shadow-default));flex-direction:column;display:flex}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{background:var(--xy-controls-button-background-color,var(--xy-controls-button-background-color-default));border:none;border-bottom:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)));width:26px;height:26px;color:var(--xy-controls-button-color-props,var(--xy-controls-button-color,var(--xy-controls-button-color-default)));cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;padding:4px;display:flex}.react-flow__controls-button svg{fill:currentColor;width:100%;max-width:12px;max-height:12px}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{border-radius:var(--xy-node-border-radius,var(--xy-node-border-radius-default));width:150px;color:var(--xy-node-color,var(--xy-node-color-default));text-align:center;border:var(--xy-node-border,var(--xy-node-border-default));background-color:var(--xy-node-background-color,var(--xy-node-background-color-default));padding:10px;font-size:12px}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover,var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected,var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color,var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color,var(--xy-selection-background-color-default));border:var(--xy-selection-border,var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var(--xy-controls-button-background-color-hover-props,var(--xy-controls-button-background-color-hover,var(--xy-controls-button-background-color-hover-default)));color:var(--xy-controls-button-color-hover-props,var(--xy-controls-button-color-hover,var(--xy-controls-button-color-hover-default)))}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)))}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{background-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border:1px solid #fff;border-radius:1px;width:5px;height:5px;translate:-50% -50%}.react-flow__resize-control.handle.left{top:50%;left:0}.react-flow__resize-control.handle.right{top:50%;left:100%}.react-flow__resize-control.handle.top{top:0;left:50%}.react-flow__resize-control.handle.bottom{top:100%;left:50%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border-style:solid;border-width:0}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;height:100%;top:0;transform:translate(-50%)}.react-flow__resize-control.line.left{border-left-width:1px;left:0}.react-flow__resize-control.line.right{border-right-width:1px;left:100%}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{width:100%;height:1px;left:0;transform:translateY(-50%)}.react-flow__resize-control.line.top{border-top-width:1px;top:0}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color,var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color,var(--xy-edge-label-color-default))} diff --git a/apps/web/static/assets/index-CEy65bTm.js b/apps/web/static/assets/index-aO-xepTy.js similarity index 70% rename from apps/web/static/assets/index-CEy65bTm.js rename to apps/web/static/assets/index-aO-xepTy.js index 6e95f18..0305faf 100644 --- a/apps/web/static/assets/index-CEy65bTm.js +++ b/apps/web/static/assets/index-aO-xepTy.js @@ -1,14 +1,14 @@ -var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,a)=>(a=n==null?{}:e(i(n)),c(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n)),u=(e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.")});(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var d=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=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,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},T=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function D(e,t){return E(e.type,t,e.props)}function O(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function k(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var A=/\/+/g;function j(e,t){return typeof e==`object`&&e&&e.key!=null?k(``+e.key):t.toString(36)}function M(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function N(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,N(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+j(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(A,`$&/`)+`/`),N(o,r,i,``,function(e){return e})):o!=null&&(O(o)&&(o=D(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(A,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u{t.exports=d()})),p=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,S||(S=!0,O());else{var t=n(l);t!==null&&j(x,t.startTime-e)}}var S=!1,C=-1,w=5,T=-1;function E(){return g?!0:!(e.unstable_now()-Tt&&E());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&j(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?O():S=!1}}}var O;if(typeof y==`function`)O=function(){y(D)};else if(typeof MessageChannel<`u`){var k=new MessageChannel,A=k.port2;k.port1.onmessage=D,O=function(){A.postMessage(null)}}else O=function(){_(D,0)};function j(t,n){C=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(C),C=-1):h=!0,j(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,O()))),r},e.unstable_shouldYield=E,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),m=o(((e,t)=>{t.exports=p()})),h=o((e=>{var t=f();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=o((e=>{var t=m(),n=f(),r=g();function i(e){var t=`https://react.dev/errors/`+e;if(1R||(e.current=L[R],L[R]=null,R--)}function B(e,t){R++,L[R]=e.current,e.current=t}var re=ne(null),ie=ne(null),ae=ne(null),oe=ne(null);function se(e,t){switch(B(ae,t),B(ie,e),B(re,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?qd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=qd(t),e=Jd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}z(re),B(re,e)}function ce(){z(re),z(ie),z(ae)}function le(e){e.memoizedState!==null&&B(oe,e);var t=re.current,n=Jd(t,e.type);t!==n&&(B(ie,e),B(re,n))}function ue(e){ie.current===e&&(z(re),z(ie)),oe.current===e&&(z(oe),ip._currentValue=te)}var de,fe;function pe(e){if(de===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);de=t&&t[1]||``,fe=-1()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,a)=>(a=n==null?{}:e(i(n)),c(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n)),u=(e=>typeof require<`u`?require:typeof Proxy<`u`?new Proxy(e,{get:(e,t)=>(typeof require<`u`?require:e)[t]}):e)(function(e){if(typeof require<`u`)return require.apply(this,arguments);throw Error('Calling `require` for "'+e+"\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details.")});(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var d=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=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,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},T=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function D(e,t){return E(e.type,t,e.props)}function O(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function k(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var A=/\/+/g;function j(e,t){return typeof e==`object`&&e&&e.key!=null?k(``+e.key):t.toString(36)}function M(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function N(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,N(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+j(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(A,`$&/`)+`/`),N(o,r,i,``,function(e){return e})):o!=null&&(O(o)&&(o=D(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(A,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u{t.exports=d()})),p=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,S||(S=!0,O());else{var t=n(l);t!==null&&j(x,t.startTime-e)}}var S=!1,C=-1,w=5,T=-1;function E(){return g?!0:!(e.unstable_now()-Tt&&E());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&j(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?O():S=!1}}}var O;if(typeof y==`function`)O=function(){y(D)};else if(typeof MessageChannel<`u`){var k=new MessageChannel,A=k.port2;k.port1.onmessage=D,O=function(){A.postMessage(null)}}else O=function(){_(D,0)};function j(t,n){C=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(C),C=-1):h=!0,j(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,O()))),r},e.unstable_shouldYield=E,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),m=o(((e,t)=>{t.exports=p()})),h=o((e=>{var t=f();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=o((e=>{var t=m(),n=f(),r=g();function i(e){var t=`https://react.dev/errors/`+e;if(1L||(e.current=ne[L],ne[L]=null,L--)}function z(e,t){L++,ne[L]=e.current,e.current=t}var ie=re(null),ae=re(null),oe=re(null),se=re(null);function ce(e,t){switch(z(oe,t),z(ae,e),z(ie,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?qd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=qd(t),e=Jd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}R(ie),z(ie,e)}function le(){R(ie),R(ae),R(oe)}function ue(e){e.memoizedState!==null&&z(se,e);var t=ie.current,n=Jd(t,e.type);t!==n&&(z(ae,e),z(ie,n))}function de(e){ae.current===e&&(R(ie),R(ae)),se.current===e&&(R(se),ip._currentValue=te)}var fe,B;function pe(e){if(fe===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);fe=t&&t[1]||``,B=-1)`:-1i||c[r]!==l[i]){var u=` `+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{me=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?pe(n):``}function ge(e,t){switch(e.tag){case 26:case 27:case 5:return pe(e.type);case 16:return pe(`Lazy`);case 13:return e.child!==t&&t!==null?pe(`Suspense Fallback`):pe(`Suspense`);case 19:return pe(`SuspenseList`);case 0:case 15:return he(e.type,!1);case 11:return he(e.type.render,!1);case 1:return he(e.type,!0);case 31:return pe(`Activity`);default:return``}}function _e(e){try{var t=``,n=null;do t+=ge(e,n),n=e,e=e.return;while(e);return t}catch(e){return` Error generating stack: `+e.message+` -`+e.stack}}var ve=Object.prototype.hasOwnProperty,ye=t.unstable_scheduleCallback,be=t.unstable_cancelCallback,xe=t.unstable_shouldYield,Se=t.unstable_requestPaint,Ce=t.unstable_now,we=t.unstable_getCurrentPriorityLevel,Te=t.unstable_ImmediatePriority,Ee=t.unstable_UserBlockingPriority,De=t.unstable_NormalPriority,Oe=t.unstable_LowPriority,ke=t.unstable_IdlePriority,Ae=t.log,je=t.unstable_setDisableYieldValue,Me=null,Ne=null;function Pe(e){if(typeof Ae==`function`&&je(e),Ne&&typeof Ne.setStrictMode==`function`)try{Ne.setStrictMode(Me,e)}catch{}}var Fe=Math.clz32?Math.clz32:Re,Ie=Math.log,Le=Math.LN2;function Re(e){return e>>>=0,e===0?32:31-(Ie(e)/Le|0)|0}var ze=256,Be=262144,Ve=4194304;function He(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 Ue(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=He(n))):i=He(o):i=He(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=He(n))):i=He(o)):i=He(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function We(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Ge(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 Ke(){var e=Ve;return Ve<<=1,!(Ve&62914560)&&(Ve=4194304),e}function qe(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Je(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Ye(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),cn=!1;if(sn)try{var ln={};Object.defineProperty(ln,`passive`,{get:function(){cn=!0}}),window.addEventListener(`test`,ln,ln),window.removeEventListener(`test`,ln,ln)}catch{cn=!1}var un=null,dn=null,fn=null;function pn(){if(fn)return fn;var e,t=dn,n=t.length,r,i=`value`in un?un.value:un.textContent,a=i.length;for(e=0;e=Gn),Jn=` `,Yn=!1;function Xn(e,t){switch(e){case`keyup`:return Un.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function Zn(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var Qn=!1;function $n(e,t){switch(e){case`compositionend`:return Zn(t);case`keypress`:return t.which===32?(Yn=!0,Jn):null;case`textInput`:return e=t.data,e===Jn&&Yn?null:e;default:return null}}function er(e,t){if(Qn)return e===`compositionend`||!Wn&&Xn(e,t)?(e=pn(),fn=dn=un=null,Qn=!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:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Sr(n)}}function wr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?wr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Tr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Pt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Pt(e.document)}return t}function Er(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 Dr=sn&&`documentMode`in document&&11>=document.documentMode,Or=null,kr=null,Ar=null,jr=!1;function Mr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;jr||Or==null||Or!==Pt(r)||(r=Or,`selectionStart`in r&&Er(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Ar&&xr(Ar,r)||(Ar=r,r=jd(kr,`onSelect`),0>=o,i-=o,Si=1<<32-Fe(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),Ai&&wi(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),Ai&&wi(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return Ai&&wi(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),Ai&&wi(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===O&&Ca(l)===r.type){n(e,r.sibling),c=a(r,o.props),Aa(c,o),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}o.type===y?(c=ui(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=li(o.type,o.key,o.props,null,e.mode,c),Aa(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=pi(o,e.mode,c),c.return=e,e=c}return s(e);case O:return o=Ca(o),b(e,r,o,c)}if(ee(o))return h(e,r,o,c);if(M(o)){if(l=M(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,ka(o),c);if(o.$$typeof===C)return b(e,r,Qi(e,o),c);ja(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=di(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Oa=0;var i=b(e,t,n,r);return Da=null,i}catch(t){if(t===_a||t===ya)throw t;var a=ai(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Na=Ma(!0),Pa=Ma(!1),Fa=!1;function Ia(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function La(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 Ra(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function za(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,Ll&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=ni(e),ti(e,null,n),t}return Qr(e,r,t,n),ni(e)}function Ba(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ze(e,n)}}function Va(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var G=!1;function K(){if(G){var e=la;if(e!==null)throw e}}function Ha(e,t,n,r){G=!1;var i=e.updateQueue;Fa=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,m=f!==s.lane;if(m?(Bl&f)===f:(r&f)===f){f!==0&&f===ca&&(G=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var h=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(h=g.payload,typeof h==`function`){d=h.call(_,d,f);break a}d=h;break a;case 3:h.flags=h.flags&-65537|128;case 0:if(h=g.payload,f=typeof h==`function`?h.call(_,d,f):h,f==null)break a;d=p({},d,f);break a;case 2:Fa=!0}}f=s.callback,f!==null&&(e.flags|=64,m&&(e.flags|=8192),m=i.callbacks,m===null?i.callbacks=[f]:m.push(f))}else m={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=m,c=d):u=u.next=m,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;m=s,s=m.next,m.next=null,i.lastBaseUpdate=m,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Jl|=o,e.lanes=o,e.memoizedState=d}}function Ua(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Wa(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=F.T,s={};F.T=s,As(e,!1,t,n);try{var c=i(),l=F.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?ks(e,t,fa(c,r),gu(e)):ks(e,t,r,gu(e))}catch(n){ks(e,t,{then:function(){},status:`rejected`,reason:n},gu())}finally{I.p=a,o!==null&&s.types!==null&&(o.types=s.types),F.T=o}}function ys(){}function bs(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=xs(e).queue;vs(e,a,t,te,n===null?ys:function(){return Ss(e),n(r)})}function xs(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:te,baseState:te,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:jo,lastRenderedState:te},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:jo,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Ss(e){var t=xs(e);t.next===null&&(t=e.alternate.memoizedState),ks(e,t.next.queue,{},gu())}function Cs(){return Zi(ip)}function ws(){return Eo().memoizedState}function Ts(){return Eo().memoizedState}function Es(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=gu();e=Ra(n);var r=za(t,e,n);r!==null&&(vu(r,t,n),Ba(r,t,n)),t={cache:ia()},e.payload=t;return}t=t.return}}function Ds(e,t,n){var r=gu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},js(e)?Ms(t,n):(n=$r(e,t,n,r),n!==null&&(vu(n,e,r),Ns(n,t,r)))}function Os(e,t,n){ks(e,t,n,gu())}function ks(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(js(e))Ms(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,br(s,o))return Qr(e,t,i,0),Rl===null&&V(),!1}catch{}if(n=$r(e,t,i,r),n!==null)return vu(n,e,r),Ns(n,t,r),!0}return!1}function As(e,t,n,r){if(r={lane:2,revertLane:hd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},js(e)){if(t)throw Error(i(479))}else t=$r(e,n,r,2),t!==null&&vu(t,e,2)}function js(e){var t=e.alternate;return e===q||t!==null&&t===q}function Ms(e,t){lo=co=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Ns(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ze(e,n)}}var Ps={readContext:Zi,use:ko,useCallback:go,useContext:go,useEffect:go,useImperativeHandle:go,useLayoutEffect:go,useInsertionEffect:go,useMemo:go,useReducer:go,useRef:go,useState:go,useDebugValue:go,useDeferredValue:go,useTransition:go,useSyncExternalStore:go,useId:go,useHostTransitionStatus:go,useFormState:go,useActionState:go,useOptimistic:go,useMemoCache:go,useCacheRefresh:go};Ps.useEffectEvent=go;var Fs={readContext:Zi,use:ko,useCallback:function(e,t){return To().memoizedState=[e,t===void 0?null:t],e},useContext:Zi,useEffect:as,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),rs(4194308,4,ds.bind(null,t,e),n)},useLayoutEffect:function(e,t){return rs(4194308,4,e,t)},useInsertionEffect:function(e,t){rs(4,2,e,t)},useMemo:function(e,t){var n=To();t=t===void 0?null:t;var r=e();if(uo){Pe(!0);try{e()}finally{Pe(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=To();if(n!==void 0){var i=n(t);if(uo){Pe(!0);try{n(t)}finally{Pe(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ds.bind(null,q,e),[r.memoizedState,e]},useRef:function(e){var t=To();return e={current:e},t.memoizedState=e},useState:function(e){e=Vo(e);var t=e.queue,n=Os.bind(null,q,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:ps,useDeferredValue:function(e,t){return gs(To(),e,t)},useTransition:function(){var e=Vo(!1);return e=vs.bind(null,q,e.queue,!0,!1),To().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=q,a=To();if(Ai){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),Rl===null)throw Error(i(349));Bl&127||Io(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,as(Ro.bind(null,r,o,e),[e]),r.flags|=2048,ts(9,{destroy:void 0},Lo.bind(null,r,o,n,t),null),n},useId:function(){var e=To(),t=Rl.identifierPrefix;if(Ai){var n=Ci,r=Si;n=(r&~(1<<32-Fe(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=fo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[it]=t,o[at]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Bd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&kc(t)}}return Pc(t),Ac(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&kc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=ae.current,Li(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Oi,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[it]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Ld(e.nodeValue,n)),e||Pi(t,!0)}else e=Kd(e).createTextNode(r),e[it]=t,t.stateNode=e}return Pc(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Li(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[it]=t}else Ri(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Pc(t),e=!1}else n=zi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(no(t),t):(no(t),null);if(t.flags&128)throw Error(i(558))}return Pc(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Li(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[it]=t}else Ri(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Pc(t),a=!1}else a=zi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(no(t),t):(no(t),null)}return no(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Mc(t,t.updateQueue),Pc(t),null);case 4:return ce(),e===null&&Dd(t.stateNode.containerInfo),Pc(t),null;case 10:return Gi(t.type),Pc(t),null;case 19:if(z(ro),r=t.memoizedState,r===null)return Pc(t),null;if(a=(t.flags&128)!=0,o=r.rendering,o===null)if(a)Nc(r,!1);else{if(ql!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=io(e),o!==null){for(t.flags|=128,Nc(r,!1),e=o.updateQueue,t.updateQueue=e,Mc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)ci(n,e),n=n.sibling;return B(ro,ro.current&1|2),Ai&&wi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Ce()>iu&&(t.flags|=128,a=!0,Nc(r,!1),t.lanes=4194304)}else{if(!a)if(e=io(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Mc(t,e),Nc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!Ai)return Pc(t),null}else 2*Ce()-r.renderingStartTime>iu&&n!==536870912&&(t.flags|=128,a=!0,Nc(r,!1),t.lanes=4194304);r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(Pc(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Ce(),e.sibling=null,n=ro.current,B(ro,a?n&1|2:n&1),Ai&&wi(t,r.treeForkCount),e);case 22:case 23:return no(t),Ya(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(Pc(t),t.subtreeFlags&6&&(t.flags|=8192)):Pc(t),n=t.updateQueue,n!==null&&Mc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&z(ma),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Gi(ra),Pc(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Ic(e,t){switch(Ei(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Gi(ra),ce(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return ue(t),null;case 31:if(t.memoizedState!==null){if(no(t),t.alternate===null)throw Error(i(340));Ri()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(no(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Ri()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return z(ro),null;case 4:return ce(),null;case 10:return Gi(t.type),null;case 22:case 23:return no(t),Ya(),e!==null&&z(ma),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Gi(ra),null;case 25:return null;default:return null}}function Lc(e,t){switch(Ei(t),t.tag){case 3:Gi(ra),ce();break;case 26:case 27:case 5:ue(t);break;case 4:ce();break;case 31:t.memoizedState!==null&&no(t);break;case 13:no(t);break;case 19:z(ro);break;case 10:Gi(t.type);break;case 22:case 23:no(t),Ya(),e!==null&&z(ma);break;case 24:Gi(ra)}}function Rc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Ju(t,t.return,e)}}function zc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Ju(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Ju(t,t.return,e)}}function Bc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Wa(t,n)}catch(t){Ju(e,e.return,t)}}}function Vc(e,t,n){n.props=Hs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Ju(e,t,n)}}function Hc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Ju(e,t,n)}}function Uc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Ju(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Ju(e,t,n)}else n.current=null}function Wc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Ju(e,e.return,t)}}function Gc(e,t,n){try{var r=e.stateNode;Vd(r,e.type,n,t),r[at]=t}catch(t){Ju(e,e.return,t)}}function Kc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&rf(e.type)||e.tag===4}function qc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Kc(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&&rf(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Jc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Zt));else if(r!==4&&(r===27&&rf(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Jc(e,t,n),e=e.sibling;e!==null;)Jc(e,t,n),e=e.sibling}function Yc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&rf(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(Yc(e,t,n),e=e.sibling;e!==null;)Yc(e,t,n),e=e.sibling}function Xc(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Bd(t,r,n),t[it]=e,t[at]=n}catch(t){Ju(e,e.return,t)}}var Zc=!1,Qc=!1,$c=!1,el=typeof WeakSet==`function`?WeakSet:Set,tl=null;function nl(e,t){if(e=e.containerInfo,Wd=fp,e=Tr(e),Er(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(Gd={focusedElem:e,selectionRange:n},fp=!1,tl=t;tl!==null;)if(t=tl,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,tl=e;else for(;tl!==null;){switch(t=tl,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Bd(o,r,n),o[it]=e,_t(o),r=o;break a;case`link`:var s=qf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=Cr(s,h),v=Cr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,F.T=null,n=fu,fu=null;var o=cu,s=uu;if(su=0,lu=cu=null,uu=0,Ll&6)throw Error(i(331));var c=Ll;if(Ll|=4,Ml(o.current),wl(o,o.current,s,n),Ll=c,cd(0,!1),Ne&&typeof Ne.onPostCommitFiberRoot==`function`)try{Ne.onPostCommitFiberRoot(Me,o)}catch{}return!0}finally{I.p=a,F.T=r,Wu(e,t)}}function qu(e,t,n){t=H(n,t),t=Js(e.stateNode,t,2),e=za(e,t,2),e!==null&&(Je(e,2),sd(e))}function Ju(e,t,n){if(e.tag===3)qu(e,e,n);else for(;t!==null;){if(t.tag===3){qu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ou===null||!ou.has(r))){e=H(n,e),n=Ys(2),r=za(t,n,2),r!==null&&(Xs(n,r,t,e),Je(r,2),sd(r));break}}t=t.return}}function Yu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Il;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Gl=!0,i.add(n),e=Xu.bind(null,e,t,n),t.then(e,e))}function Xu(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,Rl===e&&(Bl&n)===n&&(ql===4||ql===3&&(Bl&62914560)===Bl&&300>Ce()-nu?!(Ll&2)&&Tu(e,0):Xl|=n,Ql===Bl&&(Ql=0)),sd(e)}function Zu(e,t){t===0&&(t=Ke()),e=ei(e,t),e!==null&&(Je(e,t),sd(e))}function Qu(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Zu(e,n)}function $u(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),Zu(e,n)}function ed(e,t){return ye(e,t)}var td=null,nd=null,rd=!1,id=!1,ad=!1,od=0;function sd(e){e!==nd&&e.next===null&&(nd===null?td=nd=e:nd=nd.next=e),id=!0,rd||(rd=!0,md())}function cd(e,t){if(!ad&&id){ad=!0;do for(var n=!1,r=td;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Fe(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,pd(r,a))}else a=Bl,a=Ue(r,r===Rl?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||We(r,a)||(n=!0,pd(r,a));r=r.next}while(n);ad=!1}}function ld(){ud()}function ud(){id=rd=!1;var e=0;od!==0&&Zd()&&(e=od);for(var t=Ce(),n=null,r=td;r!==null;){var i=r.next,a=dd(r,t);a===0?(r.next=null,n===null?td=i:n.next=i,i===null&&(nd=n)):(n=r,(e!==0||a&3)&&(id=!0)),r=i}su!==0&&su!==5||cd(e,!1),od!==0&&(od=0)}function dd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Hd(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function Df(e,t,n){var r=Ef;if(r&&typeof t==`string`&&t){var i=It(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),xf.has(i)||(xf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Bd(t,`link`,e),_t(t),r.head.appendChild(t)))}}function Of(e){Cf.D(e),Df(`dns-prefetch`,e,null)}function kf(e,t){Cf.C(e,t),Df(`preconnect`,e,t)}function Af(e,t,n){Cf.L(e,t,n);var r=Ef;if(r&&e&&t){var i=`link[rel="preload"][as="`+It(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+It(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+It(n.imageSizes)+`"]`)):i+=`[href="`+It(e)+`"]`;var a=i;switch(t){case`style`:a=If(e);break;case`script`:a=Bf(e)}bf.has(a)||(e=p({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),bf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Lf(a))||t===`script`&&r.querySelector(Vf(a))||(t=r.createElement(`link`),Bd(t,`link`,e),_t(t),r.head.appendChild(t)))}}function jf(e,t){Cf.m(e,t);var n=Ef;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+It(r)+`"][href="`+It(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Bf(e)}if(!bf.has(a)&&(e=p({rel:`modulepreload`,href:e},t),bf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Vf(a)))return}r=n.createElement(`link`),Bd(r,`link`,e),_t(r),n.head.appendChild(r)}}}function Mf(e,t,n){Cf.S(e,t,n);var r=Ef;if(r&&e){var i=gt(r).hoistableStyles,a=If(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Lf(a)))s.loading=5;else{e=p({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=bf.get(a))&&Wf(e,n);var c=o=r.createElement(`link`);_t(c),Bd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Uf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Nf(e,t){Cf.X(e,t);var n=Ef;if(n&&e){var r=gt(n).hoistableScripts,i=Bf(e),a=r.get(i);a||(a=n.querySelector(Vf(i)),a||(e=p({src:e,async:!0},t),(t=bf.get(i))&&Gf(e,t),a=n.createElement(`script`),_t(a),Bd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Pf(e,t){Cf.M(e,t);var n=Ef;if(n&&e){var r=gt(n).hoistableScripts,i=Bf(e),a=r.get(i);a||(a=n.querySelector(Vf(i)),a||(e=p({src:e,async:!0,type:`module`},t),(t=bf.get(i))&&Gf(e,t),a=n.createElement(`script`),_t(a),Bd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Ff(e,t,n,r){var a=(a=ae.current)?Sf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=If(n.href),n=gt(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=If(n.href);var o=gt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(Lf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),bf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},bf.set(e,n),o||zf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Bf(n),n=gt(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function If(e){return`href="`+It(e)+`"`}function Lf(e){return`link[rel="stylesheet"][`+e+`]`}function Rf(e){return p({},e,{"data-precedence":e.precedence,precedence:null})}function zf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Bd(t,`link`,n),_t(t),e.head.appendChild(t))}function Bf(e){return`[src="`+It(e)+`"]`}function Vf(e){return`script[async]`+e}function Hf(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+It(n.href)+`"]`);if(r)return t.instance=r,_t(r),r;var a=p({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),_t(r),Bd(r,`style`,a),Uf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=If(n.href);var o=e.querySelector(Lf(a));if(o)return t.state.loading|=4,t.instance=o,_t(o),o;r=Rf(n),(a=bf.get(a))&&Wf(r,a),o=(e.ownerDocument||e).createElement(`link`),_t(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Bd(o,`link`,r),t.state.loading|=4,Uf(o,n.precedence,e),t.instance=o;case`script`:return o=Bf(n.src),(a=e.querySelector(Vf(o)))?(t.instance=a,_t(a),a):(r=n,(a=bf.get(o))&&(r=p({},n),Gf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),_t(a),Bd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Uf(r,n.precedence,e));return t.instance}function Uf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Yf(e,t,n){if(n===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 Xf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Zf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=If(r.href),a=t.querySelector(Lf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=ep.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,_t(a);return}a=t.ownerDocument||t,r=Rf(r),(i=bf.get(i))&&Wf(r,i),a=a.createElement(`link`),_t(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Bd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=ep.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Qf=0;function $f(e,t){return e.stylesheets&&e.count===0&&np(e,e.stylesheets),0Qf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function ep(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)np(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var tp=null;function np(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,tp=new Map,t.forEach(rp,e),tp=null,ep.call(e))}function rp(e,t){if(!(t.state.loading&4)){var n=tp.get(e);if(n)var r=n.get(null);else{n=new Map,tp.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=_()})),y=l(f(),1),b=v(),x=`modulepreload`,S=function(e){return`/`+e},C={},w=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=S(t,n),t in C)return;C[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:x,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},T=`popstate`;function E(e){return typeof e==`object`&&!!e&&`pathname`in e&&`search`in e&&`hash`in e&&`state`in e&&`key`in e}function D(e={}){function t(e,t){let n=t.state?.masked,{pathname:r,search:i,hash:a}=n||e.location;return M(``,{pathname:r,search:i,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||`default`,n?{pathname:e.location.pathname,search:e.location.search,hash:e.location.hash}:void 0)}function n(e,t){return typeof t==`string`?t:N(t)}return ee(t,n,null,e)}function O(e,t){if(e===!1||e==null)throw Error(t)}function k(e,t){if(!e){typeof console<`u`&&console.warn(t);try{throw Error(t)}catch{}}}function A(){return Math.random().toString(36).substring(2,10)}function j(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.unstable_mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function M(e,t,n=null,r,i){return{pathname:typeof e==`string`?e:e.pathname,search:``,hash:``,...typeof t==`string`?P(t):t,state:n,key:t&&t.key||r||A(),unstable_mask:i}}function N({pathname:e=`/`,search:t=``,hash:n=``}){return t&&t!==`?`&&(e+=t.charAt(0)===`?`?t:`?`+t),n&&n!==`#`&&(e+=n.charAt(0)===`#`?n:`#`+n),e}function P(e){let t={};if(e){let n=e.indexOf(`#`);n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf(`?`);r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function ee(e,t,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,o=i.history,s=`POP`,c=null,l=u();l??(l=0,o.replaceState({...o.state,idx:l},``));function u(){return(o.state||{idx:null}).idx}function d(){s=`POP`;let e=u(),t=e==null?null:e-l;l=e,c&&c({action:s,location:h.location,delta:t})}function f(e,t){s=`PUSH`;let r=E(e)?e:M(h.location,e,t);n&&n(r,e),l=u()+1;let d=j(r,l),f=h.createHref(r.unstable_mask||r);try{o.pushState(d,``,f)}catch(e){if(e instanceof DOMException&&e.name===`DataCloneError`)throw e;i.location.assign(f)}a&&c&&c({action:s,location:h.location,delta:1})}function p(e,t){s=`REPLACE`;let r=E(e)?e:M(h.location,e,t);n&&n(r,e),l=u();let i=j(r,l),d=h.createHref(r.unstable_mask||r);o.replaceState(i,``,d),a&&c&&c({action:s,location:h.location,delta:0})}function m(e){return F(e)}let h={get action(){return s},get location(){return e(i,o)},listen(e){if(c)throw Error(`A history only accepts one active listener`);return i.addEventListener(T,d),c=e,()=>{i.removeEventListener(T,d),c=null}},createHref(e){return t(i,e)},createURL:m,encodeLocation(e){let t=m(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:f,replace:p,go(e){return o.go(e)}};return h}function F(e,t=!1){let n=`http://localhost`;typeof window<`u`&&(n=window.location.origin===`null`?window.location.href:window.location.origin),O(n,`No window.location.(origin|href) available to create URL`);let r=typeof e==`string`?e:N(e);return r=r.replace(/ $/,`%20`),!t&&r.startsWith(`//`)&&(r=n+r),new URL(r,n)}function I(e,t,n=`/`){return te(e,t,n,!1)}function te(e,t,n,r){let i=he((typeof t==`string`?P(t):t).pathname||`/`,n);if(i==null)return null;let a=R(e);z(a);let o=null;for(let e=0;o==null&&e{let c={relativePath:s===void 0?e.path||``:s,caseSensitive:e.caseSensitive===!0,childrenIndex:a,route:e};if(c.relativePath.startsWith(`/`)){if(!c.relativePath.startsWith(r)&&o)return;O(c.relativePath.startsWith(r),`Absolute route path "${c.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),c.relativePath=c.relativePath.slice(r.length)}let l=Ce([r,c.relativePath]),u=n.concat(c);e.children&&e.children.length>0&&(O(e.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${l}".`),R(e.children,t,u,l,o)),!(e.path==null&&!e.index)&&t.push({path:l,score:le(l,e.index),routesMeta:u})};return e.forEach((e,t)=>{if(e.path===``||!e.path?.includes(`?`))a(e,t);else for(let n of ne(e.path))a(e,t,!0,n)}),t}function ne(e){let t=e.split(`/`);if(t.length===0)return[];let[n,...r]=t,i=n.endsWith(`?`),a=n.replace(/\?$/,``);if(r.length===0)return i?[a,``]:[a];let o=ne(r.join(`/`)),s=[];return s.push(...o.map(e=>e===``?a:[a,e].join(`/`))),i&&s.push(...o),s.map(t=>e.startsWith(`/`)&&t===``?`/`:t)}function z(e){e.sort((e,t)=>e.score===t.score?ue(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)):t.score-e.score)}var B=/^:[\w-]+$/,re=3,ie=2,ae=1,oe=10,se=-2,ce=e=>e===`*`;function le(e,t){let n=e.split(`/`),r=n.length;return n.some(ce)&&(r+=se),t&&(r+=ie),n.filter(e=>!ce(e)).reduce((e,t)=>e+(B.test(t)?re:t===``?ae:oe),r)}function ue(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}function de(e,t,n=!1){let{routesMeta:r}=e,i={},a=`/`,o=[];for(let e=0;e{if(t===`*`){let e=s[r]||``;o=a.slice(0,a.length-e.length).replace(/(.)\/+$/,`$1`)}let i=s[r];return n&&!i?e[t]=void 0:e[t]=(i||``).replace(/%2F/g,`/`),e},{}),pathname:a,pathnameBase:o,pattern:e}}function pe(e,t=!1,n=!0){k(e===`*`||!e.endsWith(`*`)||e.endsWith(`/*`),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,`/*`)}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,`/*`)}".`);let r=[],i=`^`+e.replace(/\/*\*?$/,``).replace(/^\/*/,`/`).replace(/[\\.*+^${}|()[\]]/g,`\\$&`).replace(/\/:([\w-]+)(\?)?/g,(e,t,n,i,a)=>{if(r.push({paramName:t,isOptional:n!=null}),n){let t=a.charAt(i+e.length);return t&&t!==`/`?`/([^\\/]*)`:`(?:/([^\\/]*))?`}return`/([^\\/]+)`}).replace(/\/([\w-]+)\?(\/|$)/g,`(/$1)?$2`);return e.endsWith(`*`)?(r.push({paramName:`*`}),i+=e===`*`||e===`/*`?`(.*)$`:`(?:\\/(.+)|\\/*)$`):n?i+=`\\/*$`:e!==``&&e!==`/`&&(i+=`(?:(?=\\/|$))`),[new RegExp(i,t?void 0:`i`),r]}function me(e){try{return e.split(`/`).map(e=>decodeURIComponent(e).replace(/\//g,`%2F`)).join(`/`)}catch(t){return k(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function he(e,t){if(t===`/`)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith(`/`)?t.length-1:t.length,r=e.charAt(n);return r&&r!==`/`?null:e.slice(n)||`/`}var ge=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function _e(e,t=`/`){let{pathname:n,search:r=``,hash:i=``}=typeof e==`string`?P(e):e,a;return n?(n=n.replace(/\/\/+/g,`/`),a=n.startsWith(`/`)?ve(n.substring(1),`/`):ve(n,t)):a=t,{pathname:a,search:Te(r),hash:Ee(i)}}function ve(e,t){let n=t.replace(/\/+$/,``).split(`/`);return e.split(`/`).forEach(e=>{e===`..`?n.length>1&&n.pop():e!==`.`&&n.push(e)}),n.length>1?n.join(`/`):`/`}function ye(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function be(e){return e.filter((e,t)=>t===0||e.route.path&&e.route.path.length>0)}function xe(e){let t=be(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function Se(e,t,n,r=!1){let i;typeof e==`string`?i=P(e):(i={...e},O(!i.pathname||!i.pathname.includes(`?`),ye(`?`,`pathname`,`search`,i)),O(!i.pathname||!i.pathname.includes(`#`),ye(`#`,`pathname`,`hash`,i)),O(!i.search||!i.search.includes(`#`),ye(`#`,`search`,`hash`,i)));let a=e===``||i.pathname===``,o=a?`/`:i.pathname,s;if(o==null)s=n;else{let e=t.length-1;if(!r&&o.startsWith(`..`)){let t=o.split(`/`);for(;t[0]===`..`;)t.shift(),--e;i.pathname=t.join(`/`)}s=e>=0?t[e]:`/`}let c=_e(i,s),l=o&&o!==`/`&&o.endsWith(`/`),u=(a||o===`.`)&&n.endsWith(`/`);return!c.pathname.endsWith(`/`)&&(l||u)&&(c.pathname+=`/`),c}var Ce=e=>e.join(`/`).replace(/\/\/+/g,`/`),we=e=>e.replace(/\/+$/,``).replace(/^\/*/,`/`),Te=e=>!e||e===`?`?``:e.startsWith(`?`)?e:`?`+e,Ee=e=>!e||e===`#`?``:e.startsWith(`#`)?e:`#`+e,De=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||``,this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function Oe(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.internal==`boolean`&&`data`in e}function ke(e){return e.map(e=>e.route.path).filter(Boolean).join(`/`).replace(/\/\/*/g,`/`)||`/`}var Ae=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function je(e,t){let n=e;if(typeof n!=`string`||!ge.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(Ae)try{let e=new URL(window.location.href),r=n.startsWith(`//`)?new URL(e.protocol+n):new URL(n),a=he(r.pathname,t);r.origin===e.origin&&a!=null?n=a+r.search+r.hash:i=!0}catch{k(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);var Me=[`POST`,`PUT`,`PATCH`,`DELETE`];new Set(Me);var Ne=[`GET`,...Me];new Set(Ne);var Pe=y.createContext(null);Pe.displayName=`DataRouter`;var Fe=y.createContext(null);Fe.displayName=`DataRouterState`;var Ie=y.createContext(!1),Le=y.createContext({isTransitioning:!1});Le.displayName=`ViewTransition`;var Re=y.createContext(new Map);Re.displayName=`Fetchers`;var ze=y.createContext(null);ze.displayName=`Await`;var Be=y.createContext(null);Be.displayName=`Navigation`;var Ve=y.createContext(null);Ve.displayName=`Location`;var He=y.createContext({outlet:null,matches:[],isDataRoute:!1});He.displayName=`Route`;var Ue=y.createContext(null);Ue.displayName=`RouteError`;var We=`REACT_ROUTER_ERROR`,Ge=`REDIRECT`,Ke=`ROUTE_ERROR_RESPONSE`;function qe(e){if(e.startsWith(`${We}:${Ge}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`&&typeof t.location==`string`&&typeof t.reloadDocument==`boolean`&&typeof t.replace==`boolean`)return t}catch{}}function Je(e){if(e.startsWith(`${We}:${Ke}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`)return new De(t.status,t.statusText,t.data)}catch{}}function Ye(e,{relative:t}={}){O(Xe(),`useHref() may be used only in the context of a component.`);let{basename:n,navigator:r}=y.useContext(Be),{hash:i,pathname:a,search:o}=rt(e,{relative:t}),s=a;return n!==`/`&&(s=a===`/`?n:Ce([n,a])),r.createHref({pathname:s,search:o,hash:i})}function Xe(){return y.useContext(Ve)!=null}function Ze(){return O(Xe(),`useLocation() may be used only in the context of a component.`),y.useContext(Ve).location}var Qe=`You should call navigate() in a React.useEffect(), not when your component is first rendered.`;function $e(e){y.useContext(Be).static||y.useLayoutEffect(e)}function et(){let{isDataRoute:e}=y.useContext(He);return e?St():tt()}function tt(){O(Xe(),`useNavigate() may be used only in the context of a component.`);let e=y.useContext(Pe),{basename:t,navigator:n}=y.useContext(Be),{matches:r}=y.useContext(He),{pathname:i}=Ze(),a=JSON.stringify(xe(r)),o=y.useRef(!1);return $e(()=>{o.current=!0}),y.useCallback((r,s={})=>{if(k(o.current,Qe),!o.current)return;if(typeof r==`number`){n.go(r);return}let c=Se(r,JSON.parse(a),i,s.relative===`path`);e==null&&t!==`/`&&(c.pathname=c.pathname===`/`?t:Ce([t,c.pathname])),(s.replace?n.replace:n.push)(c,s.state,s)},[t,n,a,i,e])}y.createContext(null);function nt(){let{matches:e}=y.useContext(He),t=e[e.length-1];return t?t.params:{}}function rt(e,{relative:t}={}){let{matches:n}=y.useContext(He),{pathname:r}=Ze(),i=JSON.stringify(xe(n));return y.useMemo(()=>Se(e,JSON.parse(i),r,t===`path`),[e,i,r,t])}function it(e,t){return at(e,t)}function at(e,t,n){O(Xe(),`useRoutes() may be used only in the context of a component.`);let{navigator:r}=y.useContext(Be),{matches:i}=y.useContext(He),a=i[i.length-1],o=a?a.params:{},s=a?a.pathname:`/`,c=a?a.pathnameBase:`/`,l=a&&a.route;{let e=l&&l.path||``;wt(s,!l||e.endsWith(`*`)||e.endsWith(`*?`),`You rendered descendant (or called \`useRoutes()\`) at "${s}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. +`+e.stack}}var ve=Object.prototype.hasOwnProperty,ye=t.unstable_scheduleCallback,be=t.unstable_cancelCallback,xe=t.unstable_shouldYield,Se=t.unstable_requestPaint,Ce=t.unstable_now,we=t.unstable_getCurrentPriorityLevel,Te=t.unstable_ImmediatePriority,Ee=t.unstable_UserBlockingPriority,De=t.unstable_NormalPriority,Oe=t.unstable_LowPriority,ke=t.unstable_IdlePriority,Ae=t.log,je=t.unstable_setDisableYieldValue,Me=null,Ne=null;function Pe(e){if(typeof Ae==`function`&&je(e),Ne&&typeof Ne.setStrictMode==`function`)try{Ne.setStrictMode(Me,e)}catch{}}var Fe=Math.clz32?Math.clz32:Re,Ie=Math.log,Le=Math.LN2;function Re(e){return e>>>=0,e===0?32:31-(Ie(e)/Le|0)|0}var ze=256,Be=262144,Ve=4194304;function He(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 Ue(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=He(n))):i=He(o):i=He(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=He(n))):i=He(o)):i=He(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function We(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Ge(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 Ke(){var e=Ve;return Ve<<=1,!(Ve&62914560)&&(Ve=4194304),e}function qe(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Je(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Ye(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),cn=!1;if(sn)try{var ln={};Object.defineProperty(ln,`passive`,{get:function(){cn=!0}}),window.addEventListener(`test`,ln,ln),window.removeEventListener(`test`,ln,ln)}catch{cn=!1}var un=null,dn=null,fn=null;function pn(){if(fn)return fn;var e,t=dn,n=t.length,r,i=`value`in un?un.value:un.textContent,a=i.length;for(e=0;e=Gn),Jn=` `,Yn=!1;function Xn(e,t){switch(e){case`keyup`:return Un.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function Zn(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var Qn=!1;function $n(e,t){switch(e){case`compositionend`:return Zn(t);case`keypress`:return t.which===32?(Yn=!0,Jn):null;case`textInput`:return e=t.data,e===Jn&&Yn?null:e;default:return null}}function er(e,t){if(Qn)return e===`compositionend`||!Wn&&Xn(e,t)?(e=pn(),fn=dn=un=null,Qn=!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:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Sr(n)}}function wr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?wr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Tr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Pt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Pt(e.document)}return t}function Er(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 Dr=sn&&`documentMode`in document&&11>=document.documentMode,Or=null,kr=null,Ar=null,jr=!1;function Mr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;jr||Or==null||Or!==Pt(r)||(r=Or,`selectionStart`in r&&Er(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Ar&&xr(Ar,r)||(Ar=r,r=jd(kr,`onSelect`),0>=o,i-=o,Si=1<<32-Fe(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),Ai&&wi(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),Ai&&wi(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return Ai&&wi(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),Ai&&wi(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===O&&Ca(l)===r.type){n(e,r.sibling),c=a(r,o.props),Aa(c,o),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}o.type===y?(c=ui(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=li(o.type,o.key,o.props,null,e.mode,c),Aa(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=pi(o,e.mode,c),c.return=e,e=c}return s(e);case O:return o=Ca(o),b(e,r,o,c)}if(ee(o))return h(e,r,o,c);if(M(o)){if(l=M(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,ka(o),c);if(o.$$typeof===C)return b(e,r,Qi(e,o),c);ja(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=di(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Oa=0;var i=b(e,t,n,r);return Da=null,i}catch(t){if(t===_a||t===ya)throw t;var a=ai(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Na=Ma(!0),Pa=Ma(!1),Fa=!1;function Ia(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function La(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 Ra(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function za(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,Ll&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=ni(e),ti(e,null,n),t}return Qr(e,r,t,n),ni(e)}function Ba(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ze(e,n)}}function Va(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var G=!1;function K(){if(G){var e=la;if(e!==null)throw e}}function Ha(e,t,n,r){G=!1;var i=e.updateQueue;Fa=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,m=f!==s.lane;if(m?(Bl&f)===f:(r&f)===f){f!==0&&f===ca&&(G=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var h=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(h=g.payload,typeof h==`function`){d=h.call(_,d,f);break a}d=h;break a;case 3:h.flags=h.flags&-65537|128;case 0:if(h=g.payload,f=typeof h==`function`?h.call(_,d,f):h,f==null)break a;d=p({},d,f);break a;case 2:Fa=!0}}f=s.callback,f!==null&&(e.flags|=64,m&&(e.flags|=8192),m=i.callbacks,m===null?i.callbacks=[f]:m.push(f))}else m={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=m,c=d):u=u.next=m,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;m=s,s=m.next,m.next=null,i.lastBaseUpdate=m,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Jl|=o,e.lanes=o,e.memoizedState=d}}function Ua(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function Wa(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=F.T,s={};F.T=s,As(e,!1,t,n);try{var c=i(),l=F.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?ks(e,t,fa(c,r),gu(e)):ks(e,t,r,gu(e))}catch(n){ks(e,t,{then:function(){},status:`rejected`,reason:n},gu())}finally{I.p=a,o!==null&&s.types!==null&&(o.types=s.types),F.T=o}}function ys(){}function bs(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=xs(e).queue;vs(e,a,t,te,n===null?ys:function(){return Ss(e),n(r)})}function xs(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:te,baseState:te,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:jo,lastRenderedState:te},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:jo,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Ss(e){var t=xs(e);t.next===null&&(t=e.alternate.memoizedState),ks(e,t.next.queue,{},gu())}function Cs(){return Zi(ip)}function ws(){return Eo().memoizedState}function Ts(){return Eo().memoizedState}function Es(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=gu();e=Ra(n);var r=za(t,e,n);r!==null&&(vu(r,t,n),Ba(r,t,n)),t={cache:ia()},e.payload=t;return}t=t.return}}function Ds(e,t,n){var r=gu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},js(e)?Ms(t,n):(n=$r(e,t,n,r),n!==null&&(vu(n,e,r),Ns(n,t,r)))}function Os(e,t,n){ks(e,t,n,gu())}function ks(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(js(e))Ms(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,br(s,o))return Qr(e,t,i,0),Rl===null&&V(),!1}catch{}if(n=$r(e,t,i,r),n!==null)return vu(n,e,r),Ns(n,t,r),!0}return!1}function As(e,t,n,r){if(r={lane:2,revertLane:hd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},js(e)){if(t)throw Error(i(479))}else t=$r(e,n,r,2),t!==null&&vu(t,e,2)}function js(e){var t=e.alternate;return e===q||t!==null&&t===q}function Ms(e,t){lo=co=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Ns(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ze(e,n)}}var Ps={readContext:Zi,use:ko,useCallback:go,useContext:go,useEffect:go,useImperativeHandle:go,useLayoutEffect:go,useInsertionEffect:go,useMemo:go,useReducer:go,useRef:go,useState:go,useDebugValue:go,useDeferredValue:go,useTransition:go,useSyncExternalStore:go,useId:go,useHostTransitionStatus:go,useFormState:go,useActionState:go,useOptimistic:go,useMemoCache:go,useCacheRefresh:go};Ps.useEffectEvent=go;var Fs={readContext:Zi,use:ko,useCallback:function(e,t){return To().memoizedState=[e,t===void 0?null:t],e},useContext:Zi,useEffect:as,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),rs(4194308,4,ds.bind(null,t,e),n)},useLayoutEffect:function(e,t){return rs(4194308,4,e,t)},useInsertionEffect:function(e,t){rs(4,2,e,t)},useMemo:function(e,t){var n=To();t=t===void 0?null:t;var r=e();if(uo){Pe(!0);try{e()}finally{Pe(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=To();if(n!==void 0){var i=n(t);if(uo){Pe(!0);try{n(t)}finally{Pe(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ds.bind(null,q,e),[r.memoizedState,e]},useRef:function(e){var t=To();return e={current:e},t.memoizedState=e},useState:function(e){e=Vo(e);var t=e.queue,n=Os.bind(null,q,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:ps,useDeferredValue:function(e,t){return gs(To(),e,t)},useTransition:function(){var e=Vo(!1);return e=vs.bind(null,q,e.queue,!0,!1),To().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=q,a=To();if(Ai){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),Rl===null)throw Error(i(349));Bl&127||Io(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,as(Ro.bind(null,r,o,e),[e]),r.flags|=2048,ts(9,{destroy:void 0},Lo.bind(null,r,o,n,t),null),n},useId:function(){var e=To(),t=Rl.identifierPrefix;if(Ai){var n=Ci,r=Si;n=(r&~(1<<32-Fe(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=fo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[it]=t,o[at]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Bd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&kc(t)}}return Pc(t),Ac(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&kc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=oe.current,Li(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Oi,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[it]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Ld(e.nodeValue,n)),e||Pi(t,!0)}else e=Kd(e).createTextNode(r),e[it]=t,t.stateNode=e}return Pc(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Li(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[it]=t}else Ri(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Pc(t),e=!1}else n=zi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(no(t),t):(no(t),null);if(t.flags&128)throw Error(i(558))}return Pc(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Li(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[it]=t}else Ri(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Pc(t),a=!1}else a=zi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(no(t),t):(no(t),null)}return no(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Mc(t,t.updateQueue),Pc(t),null);case 4:return le(),e===null&&Dd(t.stateNode.containerInfo),Pc(t),null;case 10:return Gi(t.type),Pc(t),null;case 19:if(R(ro),r=t.memoizedState,r===null)return Pc(t),null;if(a=(t.flags&128)!=0,o=r.rendering,o===null)if(a)Nc(r,!1);else{if(ql!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=io(e),o!==null){for(t.flags|=128,Nc(r,!1),e=o.updateQueue,t.updateQueue=e,Mc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)ci(n,e),n=n.sibling;return z(ro,ro.current&1|2),Ai&&wi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Ce()>iu&&(t.flags|=128,a=!0,Nc(r,!1),t.lanes=4194304)}else{if(!a)if(e=io(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Mc(t,e),Nc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!Ai)return Pc(t),null}else 2*Ce()-r.renderingStartTime>iu&&n!==536870912&&(t.flags|=128,a=!0,Nc(r,!1),t.lanes=4194304);r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(Pc(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Ce(),e.sibling=null,n=ro.current,z(ro,a?n&1|2:n&1),Ai&&wi(t,r.treeForkCount),e);case 22:case 23:return no(t),Ya(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(Pc(t),t.subtreeFlags&6&&(t.flags|=8192)):Pc(t),n=t.updateQueue,n!==null&&Mc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&R(ma),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Gi(ra),Pc(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Ic(e,t){switch(Ei(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Gi(ra),le(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return de(t),null;case 31:if(t.memoizedState!==null){if(no(t),t.alternate===null)throw Error(i(340));Ri()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(no(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Ri()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return R(ro),null;case 4:return le(),null;case 10:return Gi(t.type),null;case 22:case 23:return no(t),Ya(),e!==null&&R(ma),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Gi(ra),null;case 25:return null;default:return null}}function Lc(e,t){switch(Ei(t),t.tag){case 3:Gi(ra),le();break;case 26:case 27:case 5:de(t);break;case 4:le();break;case 31:t.memoizedState!==null&&no(t);break;case 13:no(t);break;case 19:R(ro);break;case 10:Gi(t.type);break;case 22:case 23:no(t),Ya(),e!==null&&R(ma);break;case 24:Gi(ra)}}function Rc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Ju(t,t.return,e)}}function zc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Ju(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Ju(t,t.return,e)}}function Bc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Wa(t,n)}catch(t){Ju(e,e.return,t)}}}function Vc(e,t,n){n.props=Hs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Ju(e,t,n)}}function Hc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Ju(e,t,n)}}function Uc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Ju(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Ju(e,t,n)}else n.current=null}function Wc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Ju(e,e.return,t)}}function Gc(e,t,n){try{var r=e.stateNode;Vd(r,e.type,n,t),r[at]=t}catch(t){Ju(e,e.return,t)}}function Kc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&rf(e.type)||e.tag===4}function qc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Kc(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&&rf(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Jc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Zt));else if(r!==4&&(r===27&&rf(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Jc(e,t,n),e=e.sibling;e!==null;)Jc(e,t,n),e=e.sibling}function Yc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&rf(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(Yc(e,t,n),e=e.sibling;e!==null;)Yc(e,t,n),e=e.sibling}function Xc(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Bd(t,r,n),t[it]=e,t[at]=n}catch(t){Ju(e,e.return,t)}}var Zc=!1,Qc=!1,$c=!1,el=typeof WeakSet==`function`?WeakSet:Set,tl=null;function nl(e,t){if(e=e.containerInfo,Wd=fp,e=Tr(e),Er(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(Gd={focusedElem:e,selectionRange:n},fp=!1,tl=t;tl!==null;)if(t=tl,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,tl=e;else for(;tl!==null;){switch(t=tl,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Bd(o,r,n),o[it]=e,_t(o),r=o;break a;case`link`:var s=qf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=Cr(s,h),v=Cr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,F.T=null,n=fu,fu=null;var o=cu,s=uu;if(su=0,lu=cu=null,uu=0,Ll&6)throw Error(i(331));var c=Ll;if(Ll|=4,Ml(o.current),wl(o,o.current,s,n),Ll=c,cd(0,!1),Ne&&typeof Ne.onPostCommitFiberRoot==`function`)try{Ne.onPostCommitFiberRoot(Me,o)}catch{}return!0}finally{I.p=a,F.T=r,Wu(e,t)}}function qu(e,t,n){t=H(n,t),t=Js(e.stateNode,t,2),e=za(e,t,2),e!==null&&(Je(e,2),sd(e))}function Ju(e,t,n){if(e.tag===3)qu(e,e,n);else for(;t!==null;){if(t.tag===3){qu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ou===null||!ou.has(r))){e=H(n,e),n=Ys(2),r=za(t,n,2),r!==null&&(Xs(n,r,t,e),Je(r,2),sd(r));break}}t=t.return}}function Yu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Il;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Gl=!0,i.add(n),e=Xu.bind(null,e,t,n),t.then(e,e))}function Xu(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,Rl===e&&(Bl&n)===n&&(ql===4||ql===3&&(Bl&62914560)===Bl&&300>Ce()-nu?!(Ll&2)&&Tu(e,0):Xl|=n,Ql===Bl&&(Ql=0)),sd(e)}function Zu(e,t){t===0&&(t=Ke()),e=ei(e,t),e!==null&&(Je(e,t),sd(e))}function Qu(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Zu(e,n)}function $u(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),Zu(e,n)}function ed(e,t){return ye(e,t)}var td=null,nd=null,rd=!1,id=!1,ad=!1,od=0;function sd(e){e!==nd&&e.next===null&&(nd===null?td=nd=e:nd=nd.next=e),id=!0,rd||(rd=!0,md())}function cd(e,t){if(!ad&&id){ad=!0;do for(var n=!1,r=td;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Fe(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,pd(r,a))}else a=Bl,a=Ue(r,r===Rl?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||We(r,a)||(n=!0,pd(r,a));r=r.next}while(n);ad=!1}}function ld(){ud()}function ud(){id=rd=!1;var e=0;od!==0&&Zd()&&(e=od);for(var t=Ce(),n=null,r=td;r!==null;){var i=r.next,a=dd(r,t);a===0?(r.next=null,n===null?td=i:n.next=i,i===null&&(nd=n)):(n=r,(e!==0||a&3)&&(id=!0)),r=i}su!==0&&su!==5||cd(e,!1),od!==0&&(od=0)}function dd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Hd(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function Df(e,t,n){var r=Ef;if(r&&typeof t==`string`&&t){var i=It(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),xf.has(i)||(xf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Bd(t,`link`,e),_t(t),r.head.appendChild(t)))}}function Of(e){Cf.D(e),Df(`dns-prefetch`,e,null)}function kf(e,t){Cf.C(e,t),Df(`preconnect`,e,t)}function Af(e,t,n){Cf.L(e,t,n);var r=Ef;if(r&&e&&t){var i=`link[rel="preload"][as="`+It(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+It(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+It(n.imageSizes)+`"]`)):i+=`[href="`+It(e)+`"]`;var a=i;switch(t){case`style`:a=If(e);break;case`script`:a=Bf(e)}bf.has(a)||(e=p({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),bf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Lf(a))||t===`script`&&r.querySelector(Vf(a))||(t=r.createElement(`link`),Bd(t,`link`,e),_t(t),r.head.appendChild(t)))}}function jf(e,t){Cf.m(e,t);var n=Ef;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+It(r)+`"][href="`+It(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Bf(e)}if(!bf.has(a)&&(e=p({rel:`modulepreload`,href:e},t),bf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Vf(a)))return}r=n.createElement(`link`),Bd(r,`link`,e),_t(r),n.head.appendChild(r)}}}function Mf(e,t,n){Cf.S(e,t,n);var r=Ef;if(r&&e){var i=gt(r).hoistableStyles,a=If(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Lf(a)))s.loading=5;else{e=p({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=bf.get(a))&&Wf(e,n);var c=o=r.createElement(`link`);_t(c),Bd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Uf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Nf(e,t){Cf.X(e,t);var n=Ef;if(n&&e){var r=gt(n).hoistableScripts,i=Bf(e),a=r.get(i);a||(a=n.querySelector(Vf(i)),a||(e=p({src:e,async:!0},t),(t=bf.get(i))&&Gf(e,t),a=n.createElement(`script`),_t(a),Bd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Pf(e,t){Cf.M(e,t);var n=Ef;if(n&&e){var r=gt(n).hoistableScripts,i=Bf(e),a=r.get(i);a||(a=n.querySelector(Vf(i)),a||(e=p({src:e,async:!0,type:`module`},t),(t=bf.get(i))&&Gf(e,t),a=n.createElement(`script`),_t(a),Bd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Ff(e,t,n,r){var a=(a=oe.current)?Sf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=If(n.href),n=gt(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=If(n.href);var o=gt(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(Lf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),bf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},bf.set(e,n),o||zf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Bf(n),n=gt(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function If(e){return`href="`+It(e)+`"`}function Lf(e){return`link[rel="stylesheet"][`+e+`]`}function Rf(e){return p({},e,{"data-precedence":e.precedence,precedence:null})}function zf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Bd(t,`link`,n),_t(t),e.head.appendChild(t))}function Bf(e){return`[src="`+It(e)+`"]`}function Vf(e){return`script[async]`+e}function Hf(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+It(n.href)+`"]`);if(r)return t.instance=r,_t(r),r;var a=p({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),_t(r),Bd(r,`style`,a),Uf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=If(n.href);var o=e.querySelector(Lf(a));if(o)return t.state.loading|=4,t.instance=o,_t(o),o;r=Rf(n),(a=bf.get(a))&&Wf(r,a),o=(e.ownerDocument||e).createElement(`link`),_t(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Bd(o,`link`,r),t.state.loading|=4,Uf(o,n.precedence,e),t.instance=o;case`script`:return o=Bf(n.src),(a=e.querySelector(Vf(o)))?(t.instance=a,_t(a),a):(r=n,(a=bf.get(o))&&(r=p({},n),Gf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),_t(a),Bd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Uf(r,n.precedence,e));return t.instance}function Uf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Yf(e,t,n){if(n===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 Xf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Zf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=If(r.href),a=t.querySelector(Lf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=ep.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,_t(a);return}a=t.ownerDocument||t,r=Rf(r),(i=bf.get(i))&&Wf(r,i),a=a.createElement(`link`),_t(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Bd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=ep.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Qf=0;function $f(e,t){return e.stylesheets&&e.count===0&&np(e,e.stylesheets),0Qf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function ep(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)np(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var tp=null;function np(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,tp=new Map,t.forEach(rp,e),tp=null,ep.call(e))}function rp(e,t){if(!(t.state.loading&4)){var n=tp.get(e);if(n)var r=n.get(null);else{n=new Map,tp.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=_()})),y=l(f(),1),b=v(),x=`modulepreload`,S=function(e){return`/`+e},C={},w=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=S(t,n),t in C)return;C[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:x,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},T=`popstate`;function E(e){return typeof e==`object`&&!!e&&`pathname`in e&&`search`in e&&`hash`in e&&`state`in e&&`key`in e}function D(e={}){function t(e,t){let n=t.state?.masked,{pathname:r,search:i,hash:a}=n||e.location;return M(``,{pathname:r,search:i,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||`default`,n?{pathname:e.location.pathname,search:e.location.search,hash:e.location.hash}:void 0)}function n(e,t){return typeof t==`string`?t:N(t)}return ee(t,n,null,e)}function O(e,t){if(e===!1||e==null)throw Error(t)}function k(e,t){if(!e){typeof console<`u`&&console.warn(t);try{throw Error(t)}catch{}}}function A(){return Math.random().toString(36).substring(2,10)}function j(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.unstable_mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function M(e,t,n=null,r,i){return{pathname:typeof e==`string`?e:e.pathname,search:``,hash:``,...typeof t==`string`?P(t):t,state:n,key:t&&t.key||r||A(),unstable_mask:i}}function N({pathname:e=`/`,search:t=``,hash:n=``}){return t&&t!==`?`&&(e+=t.charAt(0)===`?`?t:`?`+t),n&&n!==`#`&&(e+=n.charAt(0)===`#`?n:`#`+n),e}function P(e){let t={};if(e){let n=e.indexOf(`#`);n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf(`?`);r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function ee(e,t,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,o=i.history,s=`POP`,c=null,l=u();l??(l=0,o.replaceState({...o.state,idx:l},``));function u(){return(o.state||{idx:null}).idx}function d(){s=`POP`;let e=u(),t=e==null?null:e-l;l=e,c&&c({action:s,location:h.location,delta:t})}function f(e,t){s=`PUSH`;let r=E(e)?e:M(h.location,e,t);n&&n(r,e),l=u()+1;let d=j(r,l),f=h.createHref(r.unstable_mask||r);try{o.pushState(d,``,f)}catch(e){if(e instanceof DOMException&&e.name===`DataCloneError`)throw e;i.location.assign(f)}a&&c&&c({action:s,location:h.location,delta:1})}function p(e,t){s=`REPLACE`;let r=E(e)?e:M(h.location,e,t);n&&n(r,e),l=u();let i=j(r,l),d=h.createHref(r.unstable_mask||r);o.replaceState(i,``,d),a&&c&&c({action:s,location:h.location,delta:0})}function m(e){return F(e)}let h={get action(){return s},get location(){return e(i,o)},listen(e){if(c)throw Error(`A history only accepts one active listener`);return i.addEventListener(T,d),c=e,()=>{i.removeEventListener(T,d),c=null}},createHref(e){return t(i,e)},createURL:m,encodeLocation(e){let t=m(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:f,replace:p,go(e){return o.go(e)}};return h}function F(e,t=!1){let n=`http://localhost`;typeof window<`u`&&(n=window.location.origin===`null`?window.location.href:window.location.origin),O(n,`No window.location.(origin|href) available to create URL`);let r=typeof e==`string`?e:N(e);return r=r.replace(/ $/,`%20`),!t&&r.startsWith(`//`)&&(r=n+r),new URL(r,n)}function I(e,t,n=`/`){return te(e,t,n,!1)}function te(e,t,n,r){let i=he((typeof t==`string`?P(t):t).pathname||`/`,n);if(i==null)return null;let a=L(e);R(a);let o=null;for(let e=0;o==null&&e{let c={relativePath:s===void 0?e.path||``:s,caseSensitive:e.caseSensitive===!0,childrenIndex:a,route:e};if(c.relativePath.startsWith(`/`)){if(!c.relativePath.startsWith(r)&&o)return;O(c.relativePath.startsWith(r),`Absolute route path "${c.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),c.relativePath=c.relativePath.slice(r.length)}let l=Ce([r,c.relativePath]),u=n.concat(c);e.children&&e.children.length>0&&(O(e.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${l}".`),L(e.children,t,u,l,o)),!(e.path==null&&!e.index)&&t.push({path:l,score:ue(l,e.index),routesMeta:u})};return e.forEach((e,t)=>{if(e.path===``||!e.path?.includes(`?`))a(e,t);else for(let n of re(e.path))a(e,t,!0,n)}),t}function re(e){let t=e.split(`/`);if(t.length===0)return[];let[n,...r]=t,i=n.endsWith(`?`),a=n.replace(/\?$/,``);if(r.length===0)return i?[a,``]:[a];let o=re(r.join(`/`)),s=[];return s.push(...o.map(e=>e===``?a:[a,e].join(`/`))),i&&s.push(...o),s.map(t=>e.startsWith(`/`)&&t===``?`/`:t)}function R(e){e.sort((e,t)=>e.score===t.score?de(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)):t.score-e.score)}var z=/^:[\w-]+$/,ie=3,ae=2,oe=1,se=10,ce=-2,le=e=>e===`*`;function ue(e,t){let n=e.split(`/`),r=n.length;return n.some(le)&&(r+=ce),t&&(r+=ae),n.filter(e=>!le(e)).reduce((e,t)=>e+(z.test(t)?ie:t===``?oe:se),r)}function de(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}function fe(e,t,n=!1){let{routesMeta:r}=e,i={},a=`/`,o=[];for(let e=0;e{if(t===`*`){let e=s[r]||``;o=a.slice(0,a.length-e.length).replace(/(.)\/+$/,`$1`)}let i=s[r];return n&&!i?e[t]=void 0:e[t]=(i||``).replace(/%2F/g,`/`),e},{}),pathname:a,pathnameBase:o,pattern:e}}function pe(e,t=!1,n=!0){k(e===`*`||!e.endsWith(`*`)||e.endsWith(`/*`),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,`/*`)}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,`/*`)}".`);let r=[],i=`^`+e.replace(/\/*\*?$/,``).replace(/^\/*/,`/`).replace(/[\\.*+^${}|()[\]]/g,`\\$&`).replace(/\/:([\w-]+)(\?)?/g,(e,t,n,i,a)=>{if(r.push({paramName:t,isOptional:n!=null}),n){let t=a.charAt(i+e.length);return t&&t!==`/`?`/([^\\/]*)`:`(?:/([^\\/]*))?`}return`/([^\\/]+)`}).replace(/\/([\w-]+)\?(\/|$)/g,`(/$1)?$2`);return e.endsWith(`*`)?(r.push({paramName:`*`}),i+=e===`*`||e===`/*`?`(.*)$`:`(?:\\/(.+)|\\/*)$`):n?i+=`\\/*$`:e!==``&&e!==`/`&&(i+=`(?:(?=\\/|$))`),[new RegExp(i,t?void 0:`i`),r]}function me(e){try{return e.split(`/`).map(e=>decodeURIComponent(e).replace(/\//g,`%2F`)).join(`/`)}catch(t){return k(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function he(e,t){if(t===`/`)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith(`/`)?t.length-1:t.length,r=e.charAt(n);return r&&r!==`/`?null:e.slice(n)||`/`}var ge=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function _e(e,t=`/`){let{pathname:n,search:r=``,hash:i=``}=typeof e==`string`?P(e):e,a;return n?(n=n.replace(/\/\/+/g,`/`),a=n.startsWith(`/`)?ve(n.substring(1),`/`):ve(n,t)):a=t,{pathname:a,search:Te(r),hash:Ee(i)}}function ve(e,t){let n=t.replace(/\/+$/,``).split(`/`);return e.split(`/`).forEach(e=>{e===`..`?n.length>1&&n.pop():e!==`.`&&n.push(e)}),n.length>1?n.join(`/`):`/`}function ye(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function be(e){return e.filter((e,t)=>t===0||e.route.path&&e.route.path.length>0)}function xe(e){let t=be(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function Se(e,t,n,r=!1){let i;typeof e==`string`?i=P(e):(i={...e},O(!i.pathname||!i.pathname.includes(`?`),ye(`?`,`pathname`,`search`,i)),O(!i.pathname||!i.pathname.includes(`#`),ye(`#`,`pathname`,`hash`,i)),O(!i.search||!i.search.includes(`#`),ye(`#`,`search`,`hash`,i)));let a=e===``||i.pathname===``,o=a?`/`:i.pathname,s;if(o==null)s=n;else{let e=t.length-1;if(!r&&o.startsWith(`..`)){let t=o.split(`/`);for(;t[0]===`..`;)t.shift(),--e;i.pathname=t.join(`/`)}s=e>=0?t[e]:`/`}let c=_e(i,s),l=o&&o!==`/`&&o.endsWith(`/`),u=(a||o===`.`)&&n.endsWith(`/`);return!c.pathname.endsWith(`/`)&&(l||u)&&(c.pathname+=`/`),c}var Ce=e=>e.join(`/`).replace(/\/\/+/g,`/`),we=e=>e.replace(/\/+$/,``).replace(/^\/*/,`/`),Te=e=>!e||e===`?`?``:e.startsWith(`?`)?e:`?`+e,Ee=e=>!e||e===`#`?``:e.startsWith(`#`)?e:`#`+e,De=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||``,this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function Oe(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.internal==`boolean`&&`data`in e}function ke(e){return e.map(e=>e.route.path).filter(Boolean).join(`/`).replace(/\/\/*/g,`/`)||`/`}var Ae=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function je(e,t){let n=e;if(typeof n!=`string`||!ge.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(Ae)try{let e=new URL(window.location.href),r=n.startsWith(`//`)?new URL(e.protocol+n):new URL(n),a=he(r.pathname,t);r.origin===e.origin&&a!=null?n=a+r.search+r.hash:i=!0}catch{k(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);var Me=[`POST`,`PUT`,`PATCH`,`DELETE`];new Set(Me);var Ne=[`GET`,...Me];new Set(Ne);var Pe=y.createContext(null);Pe.displayName=`DataRouter`;var Fe=y.createContext(null);Fe.displayName=`DataRouterState`;var Ie=y.createContext(!1),Le=y.createContext({isTransitioning:!1});Le.displayName=`ViewTransition`;var Re=y.createContext(new Map);Re.displayName=`Fetchers`;var ze=y.createContext(null);ze.displayName=`Await`;var Be=y.createContext(null);Be.displayName=`Navigation`;var Ve=y.createContext(null);Ve.displayName=`Location`;var He=y.createContext({outlet:null,matches:[],isDataRoute:!1});He.displayName=`Route`;var Ue=y.createContext(null);Ue.displayName=`RouteError`;var We=`REACT_ROUTER_ERROR`,Ge=`REDIRECT`,Ke=`ROUTE_ERROR_RESPONSE`;function qe(e){if(e.startsWith(`${We}:${Ge}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`&&typeof t.location==`string`&&typeof t.reloadDocument==`boolean`&&typeof t.replace==`boolean`)return t}catch{}}function Je(e){if(e.startsWith(`${We}:${Ke}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`)return new De(t.status,t.statusText,t.data)}catch{}}function Ye(e,{relative:t}={}){O(Xe(),`useHref() may be used only in the context of a component.`);let{basename:n,navigator:r}=y.useContext(Be),{hash:i,pathname:a,search:o}=rt(e,{relative:t}),s=a;return n!==`/`&&(s=a===`/`?n:Ce([n,a])),r.createHref({pathname:s,search:o,hash:i})}function Xe(){return y.useContext(Ve)!=null}function Ze(){return O(Xe(),`useLocation() may be used only in the context of a component.`),y.useContext(Ve).location}var Qe=`You should call navigate() in a React.useEffect(), not when your component is first rendered.`;function $e(e){y.useContext(Be).static||y.useLayoutEffect(e)}function et(){let{isDataRoute:e}=y.useContext(He);return e?St():tt()}function tt(){O(Xe(),`useNavigate() may be used only in the context of a component.`);let e=y.useContext(Pe),{basename:t,navigator:n}=y.useContext(Be),{matches:r}=y.useContext(He),{pathname:i}=Ze(),a=JSON.stringify(xe(r)),o=y.useRef(!1);return $e(()=>{o.current=!0}),y.useCallback((r,s={})=>{if(k(o.current,Qe),!o.current)return;if(typeof r==`number`){n.go(r);return}let c=Se(r,JSON.parse(a),i,s.relative===`path`);e==null&&t!==`/`&&(c.pathname=c.pathname===`/`?t:Ce([t,c.pathname])),(s.replace?n.replace:n.push)(c,s.state,s)},[t,n,a,i,e])}y.createContext(null);function nt(){let{matches:e}=y.useContext(He),t=e[e.length-1];return t?t.params:{}}function rt(e,{relative:t}={}){let{matches:n}=y.useContext(He),{pathname:r}=Ze(),i=JSON.stringify(xe(n));return y.useMemo(()=>Se(e,JSON.parse(i),r,t===`path`),[e,i,r,t])}function it(e,t){return at(e,t)}function at(e,t,n){O(Xe(),`useRoutes() may be used only in the context of a component.`);let{navigator:r}=y.useContext(Be),{matches:i}=y.useContext(He),a=i[i.length-1],o=a?a.params:{},s=a?a.pathname:`/`,c=a?a.pathnameBase:`/`,l=a&&a.route;{let e=l&&l.path||``;wt(s,!l||e.endsWith(`*`)||e.endsWith(`*?`),`You rendered descendant (or called \`useRoutes()\`) at "${s}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. -Please change the parent to .`)}let u=Ze(),d;if(t){let e=typeof t==`string`?P(t):t;O(c===`/`||e.pathname?.startsWith(c),`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 "${c}" but pathname "${e.pathname}" was given in the \`location\` prop.`),d=e}else d=u;let f=d.pathname||`/`,p=f;if(c!==`/`){let e=c.replace(/^\//,``).split(`/`);p=`/`+f.replace(/^\//,``).split(`/`).slice(e.length).join(`/`)}let m=I(e,{pathname:p});k(l||m!=null,`No routes matched location "${d.pathname}${d.search}${d.hash}" `),k(m==null||m[m.length-1].route.element!==void 0||m[m.length-1].route.Component!==void 0||m[m.length-1].route.lazy!==void 0,`Matched leaf route at location "${d.pathname}${d.search}${d.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 h=ft(m&&m.map(e=>Object.assign({},e,{params:Object.assign({},o,e.params),pathname:Ce([c,r.encodeLocation?r.encodeLocation(e.pathname.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathname]),pathnameBase:e.pathnameBase===`/`?c:Ce([c,r.encodeLocation?r.encodeLocation(e.pathnameBase.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathnameBase])})),i,n);return t&&h?y.createElement(Ve.Provider,{value:{location:{pathname:`/`,search:``,hash:``,state:null,key:`default`,unstable_mask:void 0,...d},navigationType:`POP`}},h):h}function ot(){let e=xt(),t=Oe(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,r=`rgba(200,200,200, 0.5)`,i={padding:`0.5rem`,backgroundColor:r},a={padding:`2px 4px`,backgroundColor:r},o=null;return console.error(`Error handled by React Router default ErrorBoundary:`,e),o=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:a},`ErrorBoundary`),` or`,` `,y.createElement(`code`,{style:a},`errorElement`),` prop on your route.`)),y.createElement(y.Fragment,null,y.createElement(`h2`,null,`Unexpected Application Error!`),y.createElement(`h3`,{style:{fontStyle:`italic`}},t),n?y.createElement(`pre`,{style:i},n):null,o)}var st=y.createElement(ot,null),ct=class extends y.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!==`idle`&&e.revalidation===`idle`?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error===void 0?t.error:e.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error(`React Router caught the following error during render`,e)}render(){let e=this.state.error;if(this.context&&typeof e==`object`&&e&&`digest`in e&&typeof e.digest==`string`){let t=Je(e.digest);t&&(e=t)}let t=e===void 0?this.props.children:y.createElement(He.Provider,{value:this.props.routeContext},y.createElement(Ue.Provider,{value:e,children:this.props.component}));return this.context?y.createElement(ut,{error:e},t):t}};ct.contextType=Ie;var lt=new WeakMap;function ut({children:e,error:t}){let{basename:n}=y.useContext(Be);if(typeof t==`object`&&t&&`digest`in t&&typeof t.digest==`string`){let e=qe(t.digest);if(e){let r=lt.get(t);if(r)throw r;let i=je(e.location,n);if(Ae&&!lt.get(t))if(i.isExternal||e.reloadDocument)window.location.href=i.absoluteURL||i.to;else{let n=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(i.to,{replace:e.replace}));throw lt.set(t,n),n}return y.createElement(`meta`,{httpEquiv:`refresh`,content:`0;url=${i.absoluteURL||i.to}`})}}return e}function dt({routeContext:e,match:t,children:n}){let r=y.useContext(Pe);return r&&r.static&&r.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=t.route.id),y.createElement(He.Provider,{value:e},n)}function ft(e,t=[],n){let r=n?.state;if(e==null){if(!r)return null;if(r.errors)e=r.matches;else if(t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let i=e,a=r?.errors;if(a!=null){let e=i.findIndex(e=>e.route.id&&a?.[e.route.id]!==void 0);O(e>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(a).join(`,`)}`),i=i.slice(0,Math.min(i.length,e+1))}let o=!1,s=-1;if(n&&r){o=r.renderFallback;for(let e=0;e=0?i.slice(0,s+1):[i[0]];break}}}}let c=n?.onError,l=r&&c?(e,t)=>{c(e,{location:r.location,params:r.matches?.[0]?.params??{},unstable_pattern:ke(r.matches),errorInfo:t})}:void 0;return i.reduceRight((e,n,c)=>{let u,d=!1,f=null,p=null;r&&(u=a&&n.route.id?a[n.route.id]:void 0,f=n.route.errorElement||st,o&&(s<0&&c===0?(wt(`route-fallback`,!1,"No `HydrateFallback` element provided to render during initial hydration"),d=!0,p=null):s===c&&(d=!0,p=n.route.hydrateFallbackElement||null)));let m=t.concat(i.slice(0,c+1)),h=()=>{let t;return t=u?f:d?p:n.route.Component?y.createElement(n.route.Component,null):n.route.element?n.route.element:e,y.createElement(dt,{match:n,routeContext:{outlet:e,matches:m,isDataRoute:r!=null},children:t})};return r&&(n.route.ErrorBoundary||n.route.errorElement||c===0)?y.createElement(ct,{location:r.location,revalidation:r.revalidation,component:f,error:u,children:h(),routeContext:{outlet:null,matches:m,isDataRoute:!0},onError:l}):h()},null)}function pt(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function mt(e){let t=y.useContext(Pe);return O(t,pt(e)),t}function ht(e){let t=y.useContext(Fe);return O(t,pt(e)),t}function gt(e){let t=y.useContext(He);return O(t,pt(e)),t}function _t(e){let t=gt(e),n=t.matches[t.matches.length-1];return O(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}function vt(){return _t(`useRouteId`)}function yt(){return ht(`useNavigation`).navigation}function bt(){let{matches:e,loaderData:t}=ht(`useMatches`);return y.useMemo(()=>e.map(e=>L(e,t)),[e,t])}function xt(){let e=y.useContext(Ue),t=ht(`useRouteError`),n=_t(`useRouteError`);return e===void 0?t.errors?.[n]:e}function St(){let{router:e}=mt(`useNavigate`),t=_t(`useNavigate`),n=y.useRef(!1);return $e(()=>{n.current=!0}),y.useCallback(async(r,i={})=>{k(n.current,Qe),n.current&&(typeof r==`number`?await e.navigate(r):await e.navigate(r,{fromRouteId:t,...i}))},[e,t])}var Ct={};function wt(e,t,n){!t&&!Ct[e]&&(Ct[e]=!0,k(!1,n))}y.useOptimistic,y.memo(Tt);function Tt({routes:e,future:t,state:n,isStatic:r,onError:i}){return at(e,void 0,{state:n,isStatic:r,onError:i,future:t})}function Et(e){O(!1,`A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .`)}function Dt({basename:e=`/`,children:t=null,location:n,navigationType:r=`POP`,navigator:i,static:a=!1,unstable_useTransitions:o}){O(!Xe(),`You cannot render a inside another . You should never have more than one in your app.`);let s=e.replace(/^\/*/,`/`),c=y.useMemo(()=>({basename:s,navigator:i,static:a,unstable_useTransitions:o,future:{}}),[s,i,a,o]);typeof n==`string`&&(n=P(n));let{pathname:l=`/`,search:u=``,hash:d=``,state:f=null,key:p=`default`,unstable_mask:m}=n,h=y.useMemo(()=>{let e=he(l,s);return e==null?null:{location:{pathname:e,search:u,hash:d,state:f,key:p,unstable_mask:m},navigationType:r}},[s,l,u,d,f,p,r,m]);return k(h!=null,` is not able to match the URL "${l}${u}${d}" because it does not start with the basename, so the won't render anything.`),h==null?null:y.createElement(Be.Provider,{value:c},y.createElement(Ve.Provider,{children:t,value:h}))}function Ot({children:e,location:t}){return it(kt(e),t)}y.Component;function kt(e,t=[]){let n=[];return y.Children.forEach(e,(e,r)=>{if(!y.isValidElement(e))return;let i=[...t,r];if(e.type===y.Fragment){n.push.apply(n,kt(e.props.children,i));return}O(e.type===Et,`[${typeof e.type==`string`?e.type:e.type.name}] is not a component. All component children of must be a or `),O(!e.props.index||!e.props.children,`An index route cannot have child routes.`);let a={id:e.props.id||i.join(`-`),caseSensitive:e.props.caseSensitive,element:e.props.element,Component:e.props.Component,index:e.props.index,path:e.props.path,middleware:e.props.middleware,loader:e.props.loader,action:e.props.action,hydrateFallbackElement:e.props.hydrateFallbackElement,HydrateFallback:e.props.HydrateFallback,errorElement:e.props.errorElement,ErrorBoundary:e.props.ErrorBoundary,hasErrorBoundary:e.props.hasErrorBoundary===!0||e.props.ErrorBoundary!=null||e.props.errorElement!=null,shouldRevalidate:e.props.shouldRevalidate,handle:e.props.handle,lazy:e.props.lazy};e.props.children&&(a.children=kt(e.props.children,i)),n.push(a)}),n}var At=`get`,jt=`application/x-www-form-urlencoded`;function Mt(e){return typeof HTMLElement<`u`&&e instanceof HTMLElement}function Nt(e){return Mt(e)&&e.tagName.toLowerCase()===`button`}function Pt(e){return Mt(e)&&e.tagName.toLowerCase()===`form`}function Ft(e){return Mt(e)&&e.tagName.toLowerCase()===`input`}function It(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function Lt(e,t){return e.button===0&&(!t||t===`_self`)&&!It(e)}function Rt(e=``){return new URLSearchParams(typeof e==`string`||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,n)=>{let r=e[n];return t.concat(Array.isArray(r)?r.map(e=>[n,e]):[[n,r]])},[]))}function zt(e,t){let n=Rt(e);return t&&t.forEach((e,r)=>{n.has(r)||t.getAll(r).forEach(e=>{n.append(r,e)})}),n}var Bt=null;function Vt(){if(Bt===null)try{new FormData(document.createElement(`form`),0),Bt=!1}catch{Bt=!0}return Bt}var Ht=new Set([`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`]);function Ut(e){return e!=null&&!Ht.has(e)?(k(!1,`"${e}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${jt}"`),null):e}function Wt(e,t){let n,r,i,a,o;if(Pt(e)){let o=e.getAttribute(`action`);r=o?he(o,t):null,n=e.getAttribute(`method`)||At,i=Ut(e.getAttribute(`enctype`))||jt,a=new FormData(e)}else if(Nt(e)||Ft(e)&&(e.type===`submit`||e.type===`image`)){let o=e.form;if(o==null)throw Error(`Cannot submit a