diff --git a/README.en.md b/README.en.md index 905d13ff..edd1e622 100644 --- a/README.en.md +++ b/README.en.md @@ -341,11 +341,17 @@ The gateway ships with a default model mapping (you can add/remove entries and a | Model | Default reasoning level | Notes | |------|-------------|------| -| `gpt-5.6-reasoning` | `medium` | Reasoning model | -| `gpt-5.5` / `gpt-5.4` / `gpt-5.3` / `gpt-5.2` | `medium` | Fast models (`reasoning_effort` can switch levels) | +| `gpt-6.1-sol` / `gpt-6-sol` | `medium` | GPT-6.1 Sol / GPT-6.0 Sol reasoning models (routed to upstream `Gpt_61_Sol_Reasoning` / `Gpt_6_Sol_Reasoning`) | +| `gpt-6-reasoning` / `gpt-6-astra` | `medium` | GPT-6 reasoning (routed to `Gpt_6_Reasoning`, requires Paid scenario seat) / GPT-6 Astra | +| `gpt-5.6-reasoning` / `gpt-5.6` | `medium` | GPT-5.6 reasoning and fast models (routed to `Gpt_5_6_Reasoning` / `Gpt_5_6_Chat`) | +| `gpt-5.5` / `gpt-5.4` / `gpt-5.3` / `gpt-5.2` | `medium` | Fast models (routed to `Gpt_5_x_Chat`, `reasoning_effort` selects `_Reasoning`) | +| `claude-sonnet` / `claude-sonnet-5` | `medium` | Claude Sonnet models (routed to upstream `Claude_Sonnet` / `Claude_Sonnet_5`) | +| `claude-opus` / `claude-fable` | `medium` | Claude Opus and Fable models (routed to upstream `Claude_Opus` / `Claude_Fable`) | +| `grok-4.5` / `grok-reasoning` | `medium` | Grok models (routed to upstream `Grok_4_5` / `Grok_Reasoning`) | | `flux-3` / `flux-4` | - | Image-generation models (go through the real `/v1/images` image pipeline) | -- Model mapping translates public model names into the upstream tone; the console lets you add/remove mappings and adjust the default reasoning level. +- Model mapping translates public model names into the upstream `tone` request parameter; the console lets you add/remove mappings and adjust the default reasoning level. +- Note: Model availability depends on the tenant's license subscription and admin policies; certain tones (e.g. Claude_Sonnet_5, Gpt_6_Reasoning) require assigned paid seats and will be rejected by upstream authorization if the account lacks entitlement. - Reasoning intensity is adjusted via the OpenAI-compatible `reasoning_effort` parameter (`none/minimal/low/medium/high/xhigh`); fake model names are no longer used to distinguish levels. - New model names that may go live under M365 subscriptions (e.g., `gpt-5.2`, `gpt-5.4`, the `codex` family) are subject to the actual catalog, and can be imported via console configuration. diff --git a/README.md b/README.md index 214b1854..9c840add 100644 --- a/README.md +++ b/README.md @@ -343,11 +343,17 @@ curl http://127.0.0.1:4141/v1/messages \ | 模型 | 默认推理级别 | 说明 | |------|-------------|------| -| `gpt-5.6-reasoning` | `medium` | 推理模型 | -| `gpt-5.5` / `gpt-5.4` / `gpt-5.3` / `gpt-5.2` | `medium` | 快速模型(`reasoning_effort` 可切档) | +| `gpt-6.1-sol` / `gpt-6-sol` | `medium` | GPT-6.1 Sol / GPT-6.0 Sol 推理模型(上游对应 `Gpt_61_Sol_Reasoning` / `Gpt_6_Sol_Reasoning`) | +| `gpt-6-reasoning` / `gpt-6-astra` | `medium` | GPT-6 推理(上游对应 `Gpt_6_Reasoning`,需 Paid 场景席位)/ GPT-6 Astra | +| `gpt-5.6-reasoning` / `gpt-5.6` | `medium` | GPT-5.6 推理与快速模型(上游对应 `Gpt_5_6_Reasoning` / `Gpt_5_6_Chat`) | +| `gpt-5.5` / `gpt-5.4` / `gpt-5.3` / `gpt-5.2` | `medium` | 快速模型(上游对应 `Gpt_5_x_Chat`,`reasoning_effort` 可切 `_Reasoning`) | +| `claude-sonnet` / `claude-sonnet-5` | `medium` | Claude Sonnet 模型(上游对应 `Claude_Sonnet` / `Claude_Sonnet_5`) | +| `claude-opus` / `claude-fable` | `medium` | Claude Opus 与 Fable 模型(上游对应 `Claude_Opus` / `Claude_Fable`) | +| `grok-4.5` / `grok-reasoning` | `medium` | Grok 系列模型(上游对应 `Grok_4_5` / `Grok_Reasoning`) | | `flux-3` / `flux-4` | - | 生图模型(走 `/v1/images` 真实图像管线) | -- 模型映射把公开模型名翻译成上游 tone;控制台可增删映射、调整默认推理级别。 +- 模型映射把公开模型名翻译成发往 M365 上游的 `tone` 请求参数;控制台可增删映射、调整默认推理级别。 +- 注意:各模型的可用性取决于账号所属租户的订阅席位及管理员策略,部分受限模型(如 Claude_Sonnet_5、Gpt_6_Reasoning)在未配置付费席位的账号上会收到上游授权拦截。 - 推理强度通过 OpenAI 兼容的 `reasoning_effort` 参数调整(`none/minimal/low/medium/high/xhigh`),不再用虚假模型名区分档位。 - M365 订阅会上线的新模型名(如 `gpt-5.2`、`gpt-5.4`、`codex` 系)以实际目录为准,可在控制台配置导入。 diff --git a/internal/web/codex_catalog.go b/internal/web/codex_catalog.go index 75d49389..5eac7fd8 100644 --- a/internal/web/codex_catalog.go +++ b/internal/web/codex_catalog.go @@ -68,11 +68,21 @@ var gatewayModels = []modelSpec{ {ID: "gpt-5.4-reasoning", Owner: "microsoft-365", Tools: true}, {ID: "gpt-5.5", Owner: "microsoft-365", Tools: true}, {ID: "gpt-5.5-reasoning", Owner: "microsoft-365", Tools: true}, + {ID: "gpt-5.6", Owner: "microsoft-365", Tools: true}, {ID: "gpt-5.6-reasoning", Owner: "microsoft-365", Tools: true}, + {ID: "gpt-6-sol", Owner: "microsoft-365", DisplayName: "GPT-6 Sol", Tools: true}, + {ID: "gpt-6.1-sol", Owner: "microsoft-365", DisplayName: "GPT-6.1 Sol", Tools: true}, + {ID: "gpt-6-reasoning", Owner: "microsoft-365", DisplayName: "GPT-6 Reasoning", Tools: true}, + {ID: "gpt-6-astra", Owner: "microsoft-365", DisplayName: "GPT-6 Astra", Tools: true}, {ID: "flux-3", Owner: "microsoft-365", DisplayName: "Flux 3", Image: true}, {ID: "flux-4", Owner: "microsoft-365", DisplayName: "Flux 4", Image: true}, {ID: "claude-sonnet", Owner: "anthropic-via-microsoft-365", Tools: true}, {ID: "claude-sonnet-reasoning", Owner: "anthropic-via-microsoft-365", Tools: true}, + {ID: "claude-sonnet-5", Owner: "anthropic-via-microsoft-365", DisplayName: "Claude Sonnet 5", Tools: true}, + {ID: "claude-opus", Owner: "anthropic-via-microsoft-365", DisplayName: "Claude Opus", Tools: true}, + {ID: "claude-fable", Owner: "anthropic-via-microsoft-365", DisplayName: "Claude Fable", Tools: true}, + {ID: "grok-4.5", Owner: "microsoft-365", DisplayName: "Grok 4.5", Tools: true}, + {ID: "grok-reasoning", Owner: "microsoft-365", DisplayName: "Grok Reasoning", Tools: true}, } // isImageModel reports whether a public model id routes to the image @@ -101,7 +111,14 @@ func isKnownPublicModel(model string) bool { } } switch id { - case "claude", "gpt-5.4-quick", "gpt-5.3-think-deeper": + case "claude", "gpt-5.4-quick", "gpt-5.3-think-deeper", + "gpt-5.5-quick", "gpt-5.5-think-deeper", + "gpt-5.6-quick", "gpt-5.6-think-deeper", + "gpt-6-think-deeper", "gpt-6.0-sol", "gpt6sol", "gpt-6-sol-reasoning", "gpt-6.1-sol-reasoning", + "grok-auto", "muse-spark", "critique", "claude-fable": + return true + } + if _, ok := dynamicToneForModel(id); ok { return true } return false @@ -121,17 +138,28 @@ func validUpstreamTone(tone string) bool { return true } } + for _, known := range knownUpstreamTones() { + if tone == known { + return true + } + } return false } func knownUpstreamTones() []string { return []string{ - "Magic", "Gpt_5_2_Auto", "Gpt_5_2_Chat", "Gpt_5_2_Reasoning", + "Magic", "Chat", "Reasoning", + "Gpt_5_2_Auto", "Gpt_5_2_Chat", "Gpt_5_2_Reasoning", "Gpt_5_3_Chat", "Gpt_5_3_Reasoning", "Gpt_5_4_Chat", "Gpt_5_4_Reasoning", "Gpt_5_5_Chat", "Gpt_5_5_Reasoning", - "Gpt_5_6_Reasoning", - "Claude_Sonnet", "Claude_Sonnet_Reasoning", + "Gpt_5_6_Chat", "Gpt_5_6_Reasoning", "GPT_5_6_Chat", "GPT_5_6_Reasoning", + "Gpt_6_Reasoning", "Gpt_6_Astra", "GPT_6_Astra", + "Gpt_6_Sol_Chat", "Gpt_6_Sol_Reasoning", "GPT_6_Sol_Chat", "GPT_6_Sol_Reasoning", + "Gpt_61_Sol_Reasoning", + "Claude_Sonnet", "Claude_Sonnet_Reasoning", "Claude_Sonnet_5", "Claude_Opus", "Claude_Fable", + "Grok_4_5", "Grok_Auto", "Grok_Reasoning", + "Muse_Spark", "Critique", } } @@ -139,8 +167,35 @@ var ( dynamicTones []string dynamicMu sync.RWMutex dynamicAt time.Time + + upstreamTonePattern = regexp.MustCompile(`\b(?:(?:Gpt|GPT)_[0-9]+(?:_[0-9]+)?_[A-Za-z0-9_]+|Claude_[A-Za-z0-9_]+|Grok_[A-Za-z0-9_]+|Muse_Spark|Critique|Magic)\b`) + cdnBundleURLPattern = regexp.MustCompile(`https://res\.public\.onecdn\.static\.microsoft/midgard/versionless-v2/[A-Za-z0-9._-]+\.js`) + mainBundlePattern = regexp.MustCompile(`main\.[a-f0-9]{8}\.js`) + digitsOnlyPattern = regexp.MustCompile(`^[0-9]+$`) ) +func extractBundleURLs(html string) []string { + seen := map[string]bool{} + var urls []string + for _, u := range cdnBundleURLPattern.FindAllString(html, -1) { + if !seen[u] { + seen[u] = true + urls = append(urls, u) + } + } + if m := mainBundlePattern.FindString(html); m != "" { + u := "https://res.public.onecdn.static.microsoft/midgard/versionless-v2/" + m + if !seen[u] { + seen[u] = true + urls = append(urls, u) + } + } + if len(urls) > 5 { + urls = urls[:5] + } + return urls +} + func liveUpstreamTones() []string { dynamicMu.RLock() if dynamicAt.IsZero() || time.Since(dynamicAt) > 24*time.Hour { @@ -165,36 +220,44 @@ func syncUpstreamTones() { dynamicTones = tones dynamicAt = time.Now() dynamicMu.Unlock() - log.Printf("synced %d upstream tones from CDN bundle", len(tones)) + log.Printf("synced %d upstream tones", len(tones)) } func fetchUpstreamTones() []string { + seen := map[string]bool{} + for _, t := range knownUpstreamTones() { + seen[t] = true + } + discovered := false + if cloud := GetM365CloudClient(); cloud != nil { + for _, t := range cloud.DiscoverTones() { + if !seen[t] { + discovered = true + } + seen[t] = true + } + } client := &http.Client{Timeout: 30 * time.Second} pageURL := "https://m365.cloud.microsoft/" - resp, err := client.Get(pageURL) - if err != nil { - return nil - } - body, _ := io.ReadAll(io.LimitReader(resp.Body, 2<<20)) - resp.Body.Close() - re := regexp.MustCompile(`main\.[a-f0-9]{8}\.js`) - m := re.FindString(string(body)) - if m == "" { - return nil + if resp, err := client.Get(pageURL); err == nil { + body, _ := io.ReadAll(io.LimitReader(resp.Body, 2<<20)) + resp.Body.Close() + for _, bundleURL := range extractBundleURLs(string(body)) { + if resp2, err := client.Get(bundleURL); err == nil { + bundle, _ := io.ReadAll(io.LimitReader(resp2.Body, 4<<20)) + resp2.Body.Close() + for _, t := range upstreamTonePattern.FindAllString(string(bundle), -1) { + if !seen[t] { + discovered = true + } + seen[t] = true + } + } + } } - bundleURL := "https://res.public.onecdn.static.microsoft/midgard/versionless-v2/" + m - resp2, err := client.Get(bundleURL) - if err != nil { + if !discovered && len(seen) == len(knownUpstreamTones()) { return nil } - bundle, _ := io.ReadAll(io.LimitReader(resp2.Body, 4<<20)) - resp2.Body.Close() - toneRe := regexp.MustCompile(`(?:Gpt_[0-9]_[0-9]_[A-Za-z_]+|Claude_[A-Za-z0-9_]+|Magic)`) - matches := toneRe.FindAllString(string(bundle), -1) - seen := map[string]bool{} - for _, t := range matches { - seen[t] = true - } result := make([]string, 0, len(seen)) for t := range seen { result = append(result, t) @@ -203,6 +266,146 @@ func fetchUpstreamTones() []string { return result } +// toneToPublicModelSpec converts an upstream M365 tone name (for example a +// newly discovered "Gpt_62_Sol_Reasoning", "Gpt_7_Chat", or "Claude_Sonnet_6") +// into a normalized public OpenAI-compatible modelSpec. +func toneToPublicModelSpec(tone string) (modelSpec, bool) { + tone = strings.TrimSpace(tone) + if tone == "" { + return modelSpec{}, false + } + switch strings.ToLower(tone) { + case "magic", "chat", "reasoning": + return modelSpec{}, false + } + parts := strings.Split(tone, "_") + if len(parts) < 2 { + return modelSpec{}, false + } + // Skip *_Auto internal routing selectors and uppercase duplicate aliases + // (e.g. GPT_6_Sol_Reasoning when Gpt_6_Sol_Reasoning is canonical). + if strings.EqualFold(parts[len(parts)-1], "auto") || parts[0] == "GPT" { + return modelSpec{}, false + } + head := strings.ToLower(parts[0]) + switch head { + case "gpt": + ver := "" + restIdx := 1 + if len(parts) >= 3 && len(parts[1]) == 1 && digitsOnlyPattern.MatchString(parts[1]) && len(parts[2]) == 1 && digitsOnlyPattern.MatchString(parts[2]) { + ver = parts[1] + "." + parts[2] + restIdx = 3 + } else if len(parts[1]) == 2 && digitsOnlyPattern.MatchString(parts[1]) { + ver = parts[1][:1] + "." + parts[1][1:] + restIdx = 2 + } else if digitsOnlyPattern.MatchString(parts[1]) { + ver = parts[1] + restIdx = 2 + } else { + return modelSpec{}, false + } + rest := parts[restIdx:] + if len(rest) == 0 { + return modelSpec{ID: "gpt-" + ver, Owner: "microsoft-365", DisplayName: "GPT-" + ver, Tools: true}, true + } + if len(rest) == 1 && strings.EqualFold(rest[0], "chat") { + return modelSpec{ID: "gpt-" + ver, Owner: "microsoft-365", DisplayName: "GPT-" + ver, Tools: true}, true + } + if len(rest) == 1 && strings.EqualFold(rest[0], "reasoning") { + return modelSpec{ID: "gpt-" + ver + "-reasoning", Owner: "microsoft-365", DisplayName: "GPT-" + ver + " Reasoning", Tools: true}, true + } + if len(rest) == 2 && strings.EqualFold(rest[1], "reasoning") { + sub := strings.ToLower(rest[0]) + return modelSpec{ID: "gpt-" + ver + "-" + sub, Owner: "microsoft-365", DisplayName: "GPT-" + ver + " " + rest[0], Tools: true}, true + } + lowerRest := make([]string, len(rest)) + for i, p := range rest { + lowerRest[i] = strings.ToLower(p) + } + return modelSpec{ + ID: "gpt-" + ver + "-" + strings.Join(lowerRest, "-"), + Owner: "microsoft-365", + DisplayName: "GPT-" + ver + " " + strings.Join(rest, " "), + Tools: true, + }, true + + case "claude": + var idParts, nameParts []string + for i := 1; i < len(parts); i++ { + if digitsOnlyPattern.MatchString(parts[i]) && i+1 < len(parts) && digitsOnlyPattern.MatchString(parts[i+1]) { + ver := parts[i] + "." + parts[i+1] + idParts = append(idParts, ver) + nameParts = append(nameParts, ver) + i++ + continue + } + idParts = append(idParts, strings.ToLower(parts[i])) + nameParts = append(nameParts, parts[i]) + } + if len(idParts) == 0 { + return modelSpec{}, false + } + return modelSpec{ + ID: "claude-" + strings.Join(idParts, "-"), + Owner: "anthropic-via-microsoft-365", + DisplayName: "Claude " + strings.Join(nameParts, " "), + Tools: true, + }, true + + default: + var idParts, nameParts []string + for i := 0; i < len(parts); i++ { + if i > 0 && digitsOnlyPattern.MatchString(parts[i]) && i+1 < len(parts) && digitsOnlyPattern.MatchString(parts[i+1]) { + ver := parts[i] + "." + parts[i+1] + idParts = append(idParts, ver) + nameParts = append(nameParts, ver) + i++ + continue + } + idParts = append(idParts, strings.ToLower(parts[i])) + nameParts = append(nameParts, parts[i]) + } + return modelSpec{ + ID: strings.Join(idParts, "-"), + Owner: "microsoft-365", + DisplayName: strings.Join(nameParts, " "), + Tools: true, + }, true + } +} + +// dynamicToneForModel resolves either a raw upstream tone name (or "tone:..." +// prefix) or an auto-generated public model ID back to its upstream tone. +func dynamicToneForModel(model string) (string, bool) { + trimmed := strings.TrimSpace(model) + if trimmed == "" { + return "", false + } + if strings.HasPrefix(strings.ToLower(trimmed), "tone:") { + raw := strings.TrimSpace(trimmed[5:]) + if raw != "" { + return raw, true + } + } + low := strings.ToLower(trimmed) + for _, tone := range liveUpstreamTones() { + if strings.EqualFold(tone, trimmed) { + return tone, true + } + } + for _, tone := range liveUpstreamTones() { + spec, ok := toneToPublicModelSpec(tone) + if !ok { + continue + } + specID := strings.ToLower(spec.ID) + if specID == low || specID+"-reasoning" == low { + return tone, true + } + } + return "", false +} + func configuredModelMapping(model string, mappings []modelMapping) (modelMapping, bool) { model = strings.ToLower(strings.TrimSpace(model)) for _, mapping := range mappings { @@ -223,6 +426,29 @@ func configuredModelTone(model string, mappings []modelMapping) (string, bool) { func configuredModelSpecs(mappings []modelMapping) []modelSpec { models := append([]modelSpec(nil), gatewayModels...) + baseline := map[string]bool{} + for _, t := range knownUpstreamTones() { + baseline[strings.ToLower(t)] = true + } + for _, tone := range liveUpstreamTones() { + if baseline[strings.ToLower(tone)] { + continue + } + spec, ok := toneToPublicModelSpec(tone) + if !ok { + continue + } + exists := false + for i := range models { + if strings.EqualFold(models[i].ID, spec.ID) { + exists = true + break + } + } + if !exists { + models = append(models, spec) + } + } for _, mapping := range mappings { spec := modelSpec{ ID: strings.TrimSpace(mapping.PublicModel), Owner: "microsoft-365", Tools: true, @@ -282,30 +508,72 @@ func reasoningTone(model, effort string) (string, error) { return tone, nil } base := modelTone(model) - // Explicit reasoning aliases are never silently downgraded by a generic client default. - if strings.Contains(strings.ToLower(model), "reasoning") { + id := strings.ToLower(strings.TrimSpace(model)) + // Explicit reasoning or pinned selector aliases are never silently downgraded + // or cross-routed by a generic client default reasoning_effort. + if strings.Contains(id, "reasoning") || strings.Contains(id, "think-deeper") || + strings.Contains(id, "sol") || strings.Contains(id, "astra") || + strings.Contains(id, "opus") || strings.HasPrefix(id, "claude-sonnet-5") || + strings.HasPrefix(id, "grok") || id == "muse-spark" || id == "critique" || id == "claude-fable" { return base, nil } if e == "" || e == "none" || e == "minimal" || e == "low" { return base, nil } - switch strings.ToLower(strings.TrimSpace(model)) { - case "claude", "claude-sonnet": + switch id { + case "claude", "claude-sonnet", "claude-sonnet-4.6": return "Claude_Sonnet_Reasoning", nil - case "gpt-5.2": + case "gpt-5.2", "gpt-5.2-quick": return "Gpt_5_2_Reasoning", nil - case "gpt-5.3": + case "gpt-5.3", "gpt-5.3-quick": return "Gpt_5_3_Reasoning", nil - case "gpt-5.4": + case "gpt-5.4", "gpt-5.4-quick": return "Gpt_5_4_Reasoning", nil - case "gpt-5.5": + case "gpt-5.5", "gpt-5.5-quick": return "Gpt_5_5_Reasoning", nil - case "gpt-5.6": + case "gpt-5.6", "gpt-5.6-quick": return "Gpt_5_6_Reasoning", nil + case "gpt-6": + return "Gpt_6_Reasoning", nil default: + if base != "magic" { + if strings.HasSuffix(base, "_Chat") { + candidate := strings.TrimSuffix(base, "_Chat") + "_Reasoning" + if validUpstreamTone(candidate) { + return candidate, nil + } + } + return base, nil + } return "Gpt_5_5_Reasoning", nil } } + +// effectiveScenarioAndLicense upgrades the WS scenario/licenseType to +// OfficeWebPaidCopilot + Premium when the requested model or tone is gated on +// the paid scenario (e.g. Gpt_6_Reasoning, Claude_Sonnet_5) and the runtime +// setting is still at the default included scenario. Ungated models +// (gpt-6-sol, gpt-6.1-sol, claude-opus, etc.) keep the configured scenario so +// they work on non-premium accounts and avoid spending priority-access quotas +// unnecessarily. +func effectiveScenarioAndLicense(model, tone, cfgScenario, cfgLicense string) (string, string) { + if cfgScenario != "" && cfgScenario != "OfficeWebIncludedCopilot" { + return cfgScenario, cfgLicense + } + id := strings.ToLower(strings.TrimSpace(model)) + switch id { + case "gpt-6", "gpt-6-reasoning", "gpt-6-think-deeper", + "claude-sonnet-5": + return "OfficeWebPaidCopilot", "Premium" + case "claude-opus", "claude-sonnet", "claude-fable", "gpt-6-sol", "gpt-6.1-sol", "gpt-6-astra": + return cfgScenario, cfgLicense + } + switch tone { + case "Gpt_6_Reasoning", "Claude_Sonnet_5": + return "OfficeWebPaidCopilot", "Premium" + } + return cfgScenario, cfgLicense +} func modelCatalog() []map[string]any { l := configuredModelLimits() models := configuredModelSpecs(currentSettings().ModelMappings) diff --git a/internal/web/codex_catalog_test.go b/internal/web/codex_catalog_test.go index a53c88e1..4fd24389 100644 --- a/internal/web/codex_catalog_test.go +++ b/internal/web/codex_catalog_test.go @@ -5,6 +5,7 @@ import ( "net/http/httptest" "strings" "testing" + "time" ) func TestModelTokenLimitsAreConsistent(t *testing.T) { @@ -193,7 +194,17 @@ func TestReasoningEffortRouting(t *testing.T) { {"claude-sonnet", "high", "Claude_Sonnet_Reasoning"}, {"gpt-5.5", "low", "Gpt_5_5_Chat"}, {"gpt-5.5", "medium", "Gpt_5_5_Reasoning"}, + {"gpt-5.6", "low", "Gpt_5_6_Chat"}, + {"gpt-5.6", "high", "Gpt_5_6_Reasoning"}, {"gpt-5.6-reasoning", "none", "Gpt_5_6_Reasoning"}, + {"gpt-6-sol", "none", "Gpt_6_Sol_Reasoning"}, + {"gpt-6-sol", "high", "Gpt_6_Sol_Reasoning"}, + {"gpt-6.1-sol", "none", "Gpt_61_Sol_Reasoning"}, + {"gpt-6.1-sol", "high", "Gpt_61_Sol_Reasoning"}, + {"gpt-6-reasoning", "none", "Gpt_6_Reasoning"}, + {"claude-opus", "high", "Claude_Opus"}, + {"claude-sonnet-5", "high", "Claude_Sonnet_5"}, + {"claude-fable", "high", "Claude_Fable"}, } for _, tc := range cases { got, err := reasoningTone(tc.model, tc.effort) @@ -204,6 +215,56 @@ func TestReasoningEffortRouting(t *testing.T) { if _, err := reasoningTone("gpt-5.6-reasoning", "extreme"); err == nil { t.Fatal("invalid effort accepted") } + if sc, lic := effectiveScenarioAndLicense("gpt-6-reasoning", "Gpt_6_Reasoning", "OfficeWebIncludedCopilot", "Starter"); sc != "OfficeWebPaidCopilot" || lic != "Premium" { + t.Fatalf("paid scenario upgrade failed: %s / %s", sc, lic) + } + if sc, lic := effectiveScenarioAndLicense("gpt-6.1-sol", "Gpt_61_Sol_Reasoning", "OfficeWebIncludedCopilot", "Starter"); sc != "OfficeWebIncludedCopilot" || lic != "Starter" { + t.Fatalf("included scenario must stay unchanged for gpt-6.1-sol: %s / %s", sc, lic) + } +} + +func TestAutoDiscoveredTonesConvertToPublicModelsAndRoute(t *testing.T) { + dynamicMu.Lock() + origTones := dynamicTones + origAt := dynamicAt + dynamicTones = append(knownUpstreamTones(), "Gpt_62_Sol_Reasoning", "Gpt_7_Chat", "Gpt_7_Reasoning", "Claude_Sonnet_6") + dynamicAt = time.Now() + dynamicMu.Unlock() + defer func() { + dynamicMu.Lock() + dynamicTones = origTones + dynamicAt = origAt + dynamicMu.Unlock() + }() + + specs := configuredModelSpecs(nil) + byID := map[string]modelSpec{} + for _, s := range specs { + byID[s.ID] = s + } + for _, wantID := range []string{"gpt-6.2-sol", "gpt-7", "gpt-7-reasoning", "claude-sonnet-6"} { + if _, ok := byID[wantID]; !ok { + t.Fatalf("expected auto-discovered public model %q in catalog, got %#v", wantID, byID) + } + if !isKnownPublicModel(wantID) { + t.Fatalf("isKnownPublicModel(%q) = false", wantID) + } + } + if byID["claude-sonnet-6"].Owner != "anthropic-via-microsoft-365" { + t.Fatalf("claude-sonnet-6 owner=%q", byID["claude-sonnet-6"].Owner) + } + if got, err := reasoningTone("gpt-6.2-sol", "medium"); err != nil || got != "Gpt_62_Sol_Reasoning" { + t.Fatalf("gpt-6.2-sol routed to %q, err=%v", got, err) + } + if got, err := reasoningTone("gpt-7", "low"); err != nil || got != "Gpt_7_Chat" { + t.Fatalf("gpt-7/low routed to %q, err=%v", got, err) + } + if got, err := reasoningTone("gpt-7", "high"); err != nil || got != "Gpt_7_Reasoning" { + t.Fatalf("gpt-7/high routed to %q, err=%v", got, err) + } + if got, err := reasoningTone("Gpt_62_Sol_Reasoning", "none"); err != nil || got != "Gpt_62_Sol_Reasoning" { + t.Fatalf("direct tone passthrough got %q, err=%v", got, err) + } } func TestChatRejectsInvalidReasoningBeforeUpstream(t *testing.T) { diff --git a/internal/web/m365cloud.go b/internal/web/m365cloud.go index a8b55ec2..81b3e62f 100644 --- a/internal/web/m365cloud.go +++ b/internal/web/m365cloud.go @@ -311,3 +311,76 @@ func InitM365CloudClient(clientID, tenantID, refreshToken string) { func GetM365CloudClient() *M365CloudClient { return m365CloudClient } + +// DiscoverTones queries the authenticated M365 web session (RefreshNavPane +// store metadata and the authenticated /chat HTML/JS bundles) for upstream +// tone identifiers so newly rolled-out models are picked up automatically. +func (c *M365CloudClient) DiscoverTones() []string { + if c == nil { + return nil + } + seen := map[string]bool{} + if result, err := c.doAPI("RefreshNavPane", map[string]any{}); err == nil { + collectModelSelectorTones(result, seen) + if raw, err := json.Marshal(result); err == nil { + for _, m := range upstreamTonePattern.FindAllString(string(raw), -1) { + seen[m] = true + } + } + } + if token, err := c.getAccessToken(); err == nil && token != "" { + req, err := http.NewRequest("GET", "https://m365.cloud.microsoft/chat", nil) + if err == nil { + req.Header.Set("Authorization", "Bearer "+token) + req.Header.Set("User-Agent", chromeUA) + req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") + if resp, err := c.httpClient.Do(req); err == nil { + body, _ := io.ReadAll(io.LimitReader(resp.Body, 2<<20)) + resp.Body.Close() + html := string(body) + for _, m := range upstreamTonePattern.FindAllString(html, -1) { + seen[m] = true + } + for _, bundleURL := range extractBundleURLs(html) { + if bResp, bErr := c.httpClient.Get(bundleURL); bErr == nil { + bundle, _ := io.ReadAll(io.LimitReader(bResp.Body, 4<<20)) + bResp.Body.Close() + for _, m := range upstreamTonePattern.FindAllString(string(bundle), -1) { + seen[m] = true + } + } + } + } + } + } + if len(seen) == 0 { + return nil + } + out := make([]string, 0, len(seen)) + for t := range seen { + out = append(out, t) + } + return out +} + +func collectModelSelectorTones(v any, seen map[string]bool) { + switch node := v.(type) { + case map[string]any: + if opts, ok := node["availableModelSelectionOptions"].([]any); ok { + for _, rawOpt := range opts { + if opt, ok := rawOpt.(map[string]any); ok { + if id, ok := opt["id"].(string); ok && strings.TrimSpace(id) != "" { + seen[strings.TrimSpace(id)] = true + } + } + } + } + for _, child := range node { + collectModelSelectorTones(child, seen) + } + case []any: + for _, item := range node { + collectModelSelectorTones(item, seen) + } + } +} diff --git a/internal/web/pkce_test.go b/internal/web/pkce_test.go index a0c10c59..de2baf11 100644 --- a/internal/web/pkce_test.go +++ b/internal/web/pkce_test.go @@ -141,6 +141,14 @@ func TestCallbackPKCEAcceptsPastedURLAndReturnsSafeCompletionPage(t *testing.T) if !strings.Contains(body, "window.close()") { t.Fatal("completion page does not attempt to close the popup") } + + // Also verify schemeless pasted URLs (e.g. "login.microsoftonline.com/common/oauth2/nativeclient?code=...&state=...") + s.pkce["state2"] = pendingPKCE{Verifier: "verifier", Created: time.Now(), Status: "pending", RedirectURI: auth.DefaultRedirectURI} + rr2 := httptest.NewRecorder() + s.callbackPKCE(rr2, httptest.NewRequest(http.MethodGet, "/api/auth/callback?login.microsoftonline.com/common/oauth2/nativeclient?code="+code+"&state=state2", nil)) + if rr2.Code != http.StatusOK { + t.Fatalf("schemeless callback status = %d, body = %s", rr2.Code, rr2.Body.String()) + } } func TestCallbackPKCEFailureDoesNotExposeAuthorizationCode(t *testing.T) { diff --git a/internal/web/server.go b/internal/web/server.go index 60a63052..8f8640b9 100644 --- a/internal/web/server.go +++ b/internal/web/server.go @@ -325,6 +325,7 @@ func (s *Server) InitM365CloudClient() { } InitM365CloudClient(clientID, acc.TID, acc.RefreshToken) log.Printf("[m365-cloud] client initialized for account %s", acc.Email) + go syncUpstreamTones() } // keepPoolWarm re-warms the accounts most likely to serve the next requests, @@ -1168,10 +1169,19 @@ func (s *Server) callbackPKCE(w http.ResponseWriter, r *http.Request) { state := r.URL.Query().Get("state") code := r.URL.Query().Get("code") oauthError := r.URL.Query().Get("error") - // also accept pasted full callback URL + // also accept pasted full callback URL (with or without https:// scheme) if code == "" && oauthError == "" { - if u := r.URL.Query().Get("url"); u != "" { - if parsed, err := http.NewRequest(http.MethodGet, u, nil); err == nil { + rawURL := r.URL.Query().Get("url") + if rawURL == "" && strings.Contains(r.URL.RawQuery, "code=") { + if idx := strings.Index(r.URL.RawQuery, "code="); idx >= 0 { + rawURL = "https://login.microsoftonline.com/common/oauth2/nativeclient?" + r.URL.RawQuery[idx:] + } + } + if rawURL != "" { + if !strings.HasPrefix(rawURL, "http://") && !strings.HasPrefix(rawURL, "https://") { + rawURL = "https://" + rawURL + } + if parsed, err := http.NewRequest(http.MethodGet, rawURL, nil); err == nil { code = parsed.URL.Query().Get("code") oauthError = parsed.URL.Query().Get("error") if state == "" { @@ -1589,31 +1599,60 @@ type responseFormat struct { func modelTone(model string) string { switch strings.ToLower(strings.TrimSpace(model)) { - case "gpt-5.2": + case "gpt-5.2", "gpt-5.2-quick": return "Gpt_5_2_Chat" - case "gpt-5.2-reasoning": + case "gpt-5.2-reasoning", "gpt-5.2-think-deeper": return "Gpt_5_2_Reasoning" - case "gpt-5.3": + case "gpt-5.3", "gpt-5.3-quick": return "Gpt_5_3_Chat" - case "gpt-5.4": + case "gpt-5.3-reasoning", "gpt-5.3-think-deeper": + return "Gpt_5_3_Reasoning" + case "gpt-5.4", "gpt-5.4-quick": return "Gpt_5_4_Chat" - case "gpt-5.4-reasoning": + case "gpt-5.4-reasoning", "gpt-5.4-think-deeper": return "Gpt_5_4_Reasoning" - case "gpt-5.5": + case "gpt-5.5", "gpt-5.5-quick": return "Gpt_5_5_Chat" - case "gpt-5.5-reasoning": + case "gpt-5.5-reasoning", "gpt-5.5-think-deeper": return "Gpt_5_5_Reasoning" - case "gpt-5.6-reasoning": + case "gpt-5.6", "gpt-5.6-quick": + return "Gpt_5_6_Chat" + case "gpt-5.6-reasoning", "gpt-5.6-think-deeper": return "Gpt_5_6_Reasoning" + case "gpt-6", "gpt-6-reasoning", "gpt-6-think-deeper": + return "Gpt_6_Reasoning" + case "gpt-6-astra", "gpt6-astra": + return "Gpt_6_Astra" + case "gpt-6-sol", "gpt-6.0-sol", "gpt6sol", "gpt-6-sol-reasoning": + return "Gpt_6_Sol_Reasoning" + case "gpt-6-sol-chat": + return "Gpt_6_Sol_Chat" + case "gpt-6.1-sol", "gpt-6.1-sol-reasoning": + return "Gpt_61_Sol_Reasoning" case "claude", "claude-sonnet": return "Claude_Sonnet" - case "claude-sonnet-reasoning": + case "claude-sonnet-5": + return "Claude_Sonnet_5" + case "claude-sonnet-reasoning", "claude-sonnet-think-deeper": return "Claude_Sonnet_Reasoning" - case "gpt-5.4-quick": - return "Gpt_5_4_Chat" - case "gpt-5.3-think-deeper": - return "Gpt_5_3_Chat" + case "claude-opus": + return "Claude_Opus" + case "claude-fable": + return "Claude_Fable" + case "grok-4.5": + return "Grok_4_5" + case "grok-auto": + return "Grok_Auto" + case "grok-reasoning": + return "Grok_Reasoning" + case "muse-spark": + return "Muse_Spark" + case "critique": + return "Critique" default: + if tone, ok := dynamicToneForModel(model); ok { + return tone + } return "magic" } } @@ -1944,11 +1983,12 @@ func (s *Server) adminModelTest(w http.ResponseWriter, r *http.Request) { ctx, cancel := context.WithTimeout(r.Context(), time.Duration(s.settings.get().ChatTimeoutSeconds)*time.Second) defer cancel() testCfg := s.settings.get() + testScenario, testLicense := effectiveScenarioAndLicense(b.Model, tone, testCfg.Scenario, testCfg.LicenseType) res, err := s.chatWithAccount(ctx, acc.ID, chathub.Account{AccessToken: acc.AccessToken, OID: acc.OID, TID: acc.TID}, chathub.Request{ Text: prompt, Tone: tone, - LicenseType: testCfg.LicenseType, - Scenario: testCfg.Scenario, + LicenseType: testLicense, + Scenario: testScenario, FeatureFlags: s.featureFlags(), }) ms := time.Since(start).Milliseconds() @@ -2121,7 +2161,8 @@ func buildAnswerRequest(answerPrompt, tone string, body oaiReq, ledger agentLedg if len(ledger.Completed) > 0 { answerPrompt += "\nFINAL ANSWER RULE: Report only actions supported by completed tool results. If the goal is not fully verified, state exactly what remains unconfirmed." } - req := chathub.Request{Text: answerPrompt, Tone: tone, ConversationID: body.ConversationID, SessionID: body.SessionID, Attachments: body.Attachments, LicenseType: cfg.LicenseType, Scenario: cfg.Scenario, FeatureFlags: flags, Locale: locale.Locale, Market: locale.Market, TimeZone: locale.TimeZone, TimeZoneOffset: locale.TimeZoneOffset, DeviceOS: locale.DeviceOS, DisableMemory: disableMemory} + reqScenario, reqLicense := effectiveScenarioAndLicense(body.Model, tone, cfg.Scenario, cfg.LicenseType) + req := chathub.Request{Text: answerPrompt, Tone: tone, ConversationID: body.ConversationID, SessionID: body.SessionID, Attachments: body.Attachments, LicenseType: reqLicense, Scenario: reqScenario, FeatureFlags: flags, Locale: locale.Locale, Market: locale.Market, TimeZone: locale.TimeZone, TimeZoneOffset: locale.TimeZoneOffset, DeviceOS: locale.DeviceOS, DisableMemory: disableMemory} if planningMode == "native" { req.Tools = body.Tools req.ToolChoice = body.ToolChoice @@ -2440,6 +2481,7 @@ func (s *Server) openaiChat(w http.ResponseWriter, r *http.Request) { } planningMode := s.settings.get().ToolPlanningMode toolCfg := s.settings.get() + toolCfg.Scenario, toolCfg.LicenseType = effectiveScenarioAndLicense(body.Model, tone, toolCfg.Scenario, toolCfg.LicenseType) ctx, cancel := context.WithTimeout(r.Context(), time.Duration(s.settings.get().ChatTimeoutSeconds)*time.Second) defer cancel() diff --git a/internal/web/settings.go b/internal/web/settings.go index 3bd1209a..c3d32637 100644 --- a/internal/web/settings.go +++ b/internal/web/settings.go @@ -31,7 +31,18 @@ var configurableCodexModels = []string{ "gpt-5.4", "gpt-5.4-mini", "gpt-5.5", + "gpt-5.6", "gpt-5.6-reasoning", + "gpt-6-sol", + "gpt-6.1-sol", + "gpt-6-reasoning", + "gpt-6-astra", + "claude-sonnet", + "claude-sonnet-5", + "claude-sonnet-5.5", + "claude-opus", + "claude-opus-4.8", + "claude-opus-5.5", "flux-3", "flux-4", "codex-auto-review", @@ -213,9 +224,9 @@ func validateSettings(v runtimeSettings) error { if !validLicenses[v.LicenseType] { return fmt.Errorf("licenseType 必须为 Starter、Premium、Free、BCAIS、BCSWW、BCWAF 或 BCWBF") } - validScenarios := map[string]bool{"OfficeWebIncludedCopilot": true, "Bizchat": true, "CopilotConsumer": true, "Chathub": true} + validScenarios := map[string]bool{"OfficeWebIncludedCopilot": true, "OfficeWebPaidCopilot": true, "Bizchat": true, "CopilotConsumer": true, "Chathub": true} if !validScenarios[v.Scenario] { - return fmt.Errorf("scenario 必须为 OfficeWebIncludedCopilot、Bizchat、CopilotConsumer 或 Chathub") + return fmt.Errorf("scenario 必须为 OfficeWebIncludedCopilot、OfficeWebPaidCopilot、Bizchat、CopilotConsumer 或 Chathub") } if v.AccountConcurrencyLimit < 1 || v.AccountConcurrencyLimit > 64 { return fmt.Errorf("账号并发上限必须为 1-64") @@ -245,7 +256,7 @@ func (s *settingsStore) save(v runtimeSettings) error { func (s *Server) adminSettings(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: - jsonOut(w, map[string]any{"settings": s.settings.get(), "codexModels": configurableCodexModels, "upstreamTones": knownUpstreamTones(), "autoStartSupported": autoStartSupported(), "autoStart": autoStartEnabled(), "restartRequiredFields": []string{"listenAddress", "configPath", "tokenCachePath", "sessionCachePath", "outboundProxy", "proxyPool", "clientId", "authority", "redirectUri", "scope", "debugLogPath"}}) + jsonOut(w, map[string]any{"settings": s.settings.get(), "codexModels": configurableCodexModels, "upstreamTones": liveUpstreamTones(), "autoStartSupported": autoStartSupported(), "autoStart": autoStartEnabled(), "restartRequiredFields": []string{"listenAddress", "configPath", "tokenCachePath", "sessionCachePath", "outboundProxy", "proxyPool", "clientId", "authority", "redirectUri", "scope", "debugLogPath"}}) case http.MethodPut: // 前端可能只修改一个字段(如监听地址),其余字段以零值提交。 // 逐字段合并到当前设置再校验,避免"改一个字段弄丢其他配置"。 diff --git a/internal/web/web/webapp/assets/index-MDsh_IzE.js b/internal/web/web/webapp/assets/index-CnEBA3Zm.js similarity index 91% rename from internal/web/web/webapp/assets/index-MDsh_IzE.js rename to internal/web/web/webapp/assets/index-CnEBA3Zm.js index 0c09405c..0cf4f978 100644 --- a/internal/web/web/webapp/assets/index-MDsh_IzE.js +++ b/internal/web/web/webapp/assets/index-CnEBA3Zm.js @@ -34,10 +34,10 @@ `+N+e}var ue=!1;function de(e,t){if(!e||ue)return"";ue=!0;var r=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(E){var o=E}Reflect.construct(e,[],t)}else{try{t.call()}catch(E){o=E}e.call(t.prototype)}else{try{throw Error()}catch(E){o=E}e()}}catch(E){if(E&&o&&typeof E.stack=="string"){for(var l=E.stack.split(` `),c=o.stack.split(` `),m=l.length-1,S=c.length-1;1<=m&&0<=S&&l[m]!==c[S];)S--;for(;1<=m&&0<=S;m--,S--)if(l[m]!==c[S]){if(m!==1||S!==1)do if(m--,S--,0>S||l[m]!==c[S]){var T=` -`+l[m].replace(" at new "," at ");return e.displayName&&T.includes("")&&(T=T.replace("",e.displayName)),T}while(1<=m&&0<=S);break}}}finally{ue=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?b(e):""}function fe(e){switch(e.tag){case 5:return b(e.type);case 16:return b("Lazy");case 13:return b("Suspense");case 19:return b("SuspenseList");case 0:case 2:case 15:return e=de(e.type,!1),e;case 11:return e=de(e.type.render,!1),e;case 1:return e=de(e.type,!0),e;default:return""}}function me(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case se:return"Fragment";case G:return"Portal";case le:return"Profiler";case Y:return"StrictMode";case He:return"Suspense";case Le:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case pe:return(e.displayName||"Context")+".Consumer";case H:return(e._context.displayName||"Context")+".Provider";case We:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Xe:return t=e.displayName||null,t!==null?t:me(e.type)||"Memo";case Ge:t=e._payload,e=e._init;try{return me(e(t))}catch{}}return null}function Ce(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return me(t);case 8:return t===Y?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function ve(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function we(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function B(e){var t=we(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),o=""+e[t];if(!e.hasOwnProperty(t)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var l=r.get,c=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(m){o=""+m,c.call(this,m)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return o},setValue:function(m){o=""+m},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function oe(e){e._valueTracker||(e._valueTracker=B(e))}function Se(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),o="";return e&&(o=we(e)?e.checked?"true":"false":e.value),e=o,e!==r?(t.setValue(e),!0):!1}function xt(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function uo(e,t){var r=t.checked;return q({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r??e._wrapperState.initialChecked})}function Su(e,t){var r=t.defaultValue==null?"":t.defaultValue,o=t.checked!=null?t.checked:t.defaultChecked;r=ve(t.value!=null?t.value:r),e._wrapperState={initialChecked:o,initialValue:r,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function ku(e,t){t=t.checked,t!=null&&O(e,"checked",t,!1)}function co(e,t){ku(e,t);var r=ve(t.value),o=t.type;if(r!=null)o==="number"?(r===0&&e.value===""||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if(o==="submit"||o==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?fo(e,t.type,r):t.hasOwnProperty("defaultValue")&&fo(e,t.type,ve(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Cu(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var o=t.type;if(!(o!=="submit"&&o!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,r!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,r!==""&&(e.name=r)}function fo(e,t,r){(t!=="number"||xt(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}var Tr=Array.isArray;function Fn(e,t,r,o){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=As.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function jr(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeType===3){r.nodeValue=t;return}}e.textContent=t}var Nr={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Sm=["Webkit","ms","Moz","O"];Object.keys(Nr).forEach(function(e){Sm.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Nr[t]=Nr[e]})});function zu(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typeof t!="number"||t===0||Nr.hasOwnProperty(e)&&Nr[e]?(""+t).trim():t+"px"}function Ru(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var o=r.indexOf("--")===0,l=zu(r,t[r],o);r==="float"&&(r="cssFloat"),o?e.setProperty(r,l):e[r]=l}}var km=q({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function mo(e,t){if(t){if(km[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(i(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(i(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(t.style!=null&&typeof t.style!="object")throw Error(i(62))}}function go(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var yo=null;function vo(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var xo=null,$n=null,Kn=null;function Au(e){if(e=qr(e)){if(typeof xo!="function")throw Error(i(280));var t=e.stateNode;t&&(t=Js(t),xo(e.stateNode,e.type,t))}}function Eu(e){$n?Kn?Kn.push(e):Kn=[e]:$n=e}function Lu(){if($n){var e=$n,t=Kn;if(Kn=$n=null,Au(e),t)for(e=0;e>>=0,e===0?32:31-(Lm(e)/Mm|0)|0}var Bs=64,Is=4194304;function Ar(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Vs(e,t){var r=e.pendingLanes;if(r===0)return 0;var o=0,l=e.suspendedLanes,c=e.pingedLanes,m=r&268435455;if(m!==0){var S=m&~l;S!==0?o=Ar(S):(c&=m,c!==0&&(o=Ar(c)))}else m=r&~l,m!==0?o=Ar(m):c!==0&&(o=Ar(c));if(o===0)return 0;if(t!==0&&t!==o&&(t&l)===0&&(l=o&-o,c=t&-t,l>=c||l===16&&(c&4194240)!==0))return t;if((o&4)!==0&&(o|=r&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=o;0r;r++)t.push(e);return t}function Er(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-zt(t),e[t]=r}function Vm(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var o=e.eventTimes;for(e=e.expirationTimes;0=_r),oc=" ",ac=!1;function lc(e,t){switch(e){case"keyup":return dg.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function uc(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var qn=!1;function hg(e,t){switch(e){case"compositionend":return uc(t);case"keypress":return t.which!==32?null:(ac=!0,oc);case"textInput":return e=t.data,e===oc&&ac?null:e;default:return null}}function pg(e,t){if(qn)return e==="compositionend"||!Vo&&lc(e,t)?(e=ec(),Us=Eo=sn=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:r,offset:t-e};e=o}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=gc(r)}}function vc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?vc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function xc(){for(var e=window,t=xt();t instanceof e.HTMLIFrameElement;){try{var r=typeof t.contentWindow.location.href=="string"}catch{r=!1}if(r)e=t.contentWindow;else break;t=xt(e.document)}return t}function Wo(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function wg(e){var t=xc(),r=e.focusedElem,o=e.selectionRange;if(t!==r&&r&&r.ownerDocument&&vc(r.ownerDocument.documentElement,r)){if(o!==null&&Wo(r)){if(t=o.start,e=o.end,e===void 0&&(e=t),"selectionStart"in r)r.selectionStart=t,r.selectionEnd=Math.min(e,r.value.length);else if(e=(t=r.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=r.textContent.length,c=Math.min(o.start,l);o=o.end===void 0?c:Math.min(o.end,l),!e.extend&&c>o&&(l=o,o=c,c=l),l=yc(r,c);var m=yc(r,o);l&&m&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==m.node||e.focusOffset!==m.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),c>o?(e.addRange(t),e.extend(m.node,m.offset)):(t.setEnd(m.node,m.offset),e.addRange(t)))}}for(t=[],e=r;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;r=document.documentMode,Qn=null,Oo=null,Fr=null,Uo=!1;function Sc(e,t,r){var o=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;Uo||Qn==null||Qn!==xt(o)||(o=Qn,"selectionStart"in o&&Wo(o)?o={start:o.selectionStart,end:o.selectionEnd}:(o=(o.ownerDocument&&o.ownerDocument.defaultView||window).getSelection(),o={anchorNode:o.anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset}),Fr&&Ur(Fr,o)||(Fr=o,o=Ys(Oo,"onSelect"),0")&&(T=T.replace("",e.displayName)),T}while(1<=m&&0<=S);break}}}finally{ue=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?b(e):""}function fe(e){switch(e.tag){case 5:return b(e.type);case 16:return b("Lazy");case 13:return b("Suspense");case 19:return b("SuspenseList");case 0:case 2:case 15:return e=de(e.type,!1),e;case 11:return e=de(e.type.render,!1),e;case 1:return e=de(e.type,!0),e;default:return""}}function me(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case se:return"Fragment";case G:return"Portal";case le:return"Profiler";case Y:return"StrictMode";case He:return"Suspense";case Le:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case pe:return(e.displayName||"Context")+".Consumer";case H:return(e._context.displayName||"Context")+".Provider";case We:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Xe:return t=e.displayName||null,t!==null?t:me(e.type)||"Memo";case Ge:t=e._payload,e=e._init;try{return me(e(t))}catch{}}return null}function Ce(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return me(t);case 8:return t===Y?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function ve(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function we(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function B(e){var t=we(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),o=""+e[t];if(!e.hasOwnProperty(t)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var l=r.get,c=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(m){o=""+m,c.call(this,m)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return o},setValue:function(m){o=""+m},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function oe(e){e._valueTracker||(e._valueTracker=B(e))}function xe(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),o="";return e&&(o=we(e)?e.checked?"true":"false":e.value),e=o,e!==r?(t.setValue(e),!0):!1}function xt(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function uo(e,t){var r=t.checked;return q({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r??e._wrapperState.initialChecked})}function Su(e,t){var r=t.defaultValue==null?"":t.defaultValue,o=t.checked!=null?t.checked:t.defaultChecked;r=ve(t.value!=null?t.value:r),e._wrapperState={initialChecked:o,initialValue:r,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function ku(e,t){t=t.checked,t!=null&&O(e,"checked",t,!1)}function co(e,t){ku(e,t);var r=ve(t.value),o=t.type;if(r!=null)o==="number"?(r===0&&e.value===""||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if(o==="submit"||o==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?fo(e,t.type,r):t.hasOwnProperty("defaultValue")&&fo(e,t.type,ve(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Cu(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var o=t.type;if(!(o!=="submit"&&o!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,r!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,r!==""&&(e.name=r)}function fo(e,t,r){(t!=="number"||xt(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}var Tr=Array.isArray;function Fn(e,t,r,o){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=As.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function jr(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeType===3){r.nodeValue=t;return}}e.textContent=t}var Nr={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Sm=["Webkit","ms","Moz","O"];Object.keys(Nr).forEach(function(e){Sm.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Nr[t]=Nr[e]})});function zu(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typeof t!="number"||t===0||Nr.hasOwnProperty(e)&&Nr[e]?(""+t).trim():t+"px"}function Ru(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var o=r.indexOf("--")===0,l=zu(r,t[r],o);r==="float"&&(r="cssFloat"),o?e.setProperty(r,l):e[r]=l}}var km=q({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function mo(e,t){if(t){if(km[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(i(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(i(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(t.style!=null&&typeof t.style!="object")throw Error(i(62))}}function go(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var yo=null;function vo(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var xo=null,$n=null,Kn=null;function Au(e){if(e=qr(e)){if(typeof xo!="function")throw Error(i(280));var t=e.stateNode;t&&(t=Js(t),xo(e.stateNode,e.type,t))}}function Eu(e){$n?Kn?Kn.push(e):Kn=[e]:$n=e}function Lu(){if($n){var e=$n,t=Kn;if(Kn=$n=null,Au(e),t)for(e=0;e>>=0,e===0?32:31-(Lm(e)/Mm|0)|0}var Bs=64,Is=4194304;function Ar(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Vs(e,t){var r=e.pendingLanes;if(r===0)return 0;var o=0,l=e.suspendedLanes,c=e.pingedLanes,m=r&268435455;if(m!==0){var S=m&~l;S!==0?o=Ar(S):(c&=m,c!==0&&(o=Ar(c)))}else m=r&~l,m!==0?o=Ar(m):c!==0&&(o=Ar(c));if(o===0)return 0;if(t!==0&&t!==o&&(t&l)===0&&(l=o&-o,c=t&-t,l>=c||l===16&&(c&4194240)!==0))return t;if((o&4)!==0&&(o|=r&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=o;0r;r++)t.push(e);return t}function Er(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-zt(t),e[t]=r}function Vm(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var o=e.eventTimes;for(e=e.expirationTimes;0=_r),oc=" ",ac=!1;function lc(e,t){switch(e){case"keyup":return dg.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function uc(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var qn=!1;function hg(e,t){switch(e){case"compositionend":return uc(t);case"keypress":return t.which!==32?null:(ac=!0,oc);case"textInput":return e=t.data,e===oc&&ac?null:e;default:return null}}function pg(e,t){if(qn)return e==="compositionend"||!Vo&&lc(e,t)?(e=ec(),Us=Eo=sn=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:r,offset:t-e};e=o}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=gc(r)}}function vc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?vc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function xc(){for(var e=window,t=xt();t instanceof e.HTMLIFrameElement;){try{var r=typeof t.contentWindow.location.href=="string"}catch{r=!1}if(r)e=t.contentWindow;else break;t=xt(e.document)}return t}function Wo(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function wg(e){var t=xc(),r=e.focusedElem,o=e.selectionRange;if(t!==r&&r&&r.ownerDocument&&vc(r.ownerDocument.documentElement,r)){if(o!==null&&Wo(r)){if(t=o.start,e=o.end,e===void 0&&(e=t),"selectionStart"in r)r.selectionStart=t,r.selectionEnd=Math.min(e,r.value.length);else if(e=(t=r.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=r.textContent.length,c=Math.min(o.start,l);o=o.end===void 0?c:Math.min(o.end,l),!e.extend&&c>o&&(l=o,o=c,c=l),l=yc(r,c);var m=yc(r,o);l&&m&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==m.node||e.focusOffset!==m.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),c>o?(e.addRange(t),e.extend(m.node,m.offset)):(t.setEnd(m.node,m.offset),e.addRange(t)))}}for(t=[],e=r;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;r=document.documentMode,Qn=null,Oo=null,Fr=null,Uo=!1;function Sc(e,t,r){var o=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;Uo||Qn==null||Qn!==xt(o)||(o=Qn,"selectionStart"in o&&Wo(o)?o={start:o.selectionStart,end:o.selectionEnd}:(o=(o.ownerDocument&&o.ownerDocument.defaultView||window).getSelection(),o={anchorNode:o.anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset}),Fr&&Ur(Fr,o)||(Fr=o,o=Ys(Oo,"onSelect"),0er||(e.current=ea[er],ea[er]=null,er--)}function Te(e,t){er++,ea[er]=e.current,e.current=t}var un={},Ze=ln(un),at=ln(!1),Nn=un;function tr(e,t){var r=e.type.contextTypes;if(!r)return un;var o=e.stateNode;if(o&&o.__reactInternalMemoizedUnmaskedChildContext===t)return o.__reactInternalMemoizedMaskedChildContext;var l={},c;for(c in r)l[c]=t[c];return o&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function lt(e){return e=e.childContextTypes,e!=null}function ei(){Ne(at),Ne(Ze)}function Bc(e,t,r){if(Ze.current!==un)throw Error(i(168));Te(Ze,t),Te(at,r)}function Ic(e,t,r){var o=e.stateNode;if(t=t.childContextTypes,typeof o.getChildContext!="function")return r;o=o.getChildContext();for(var l in o)if(!(l in t))throw Error(i(108,Ce(e)||"Unknown",l));return q({},r,o)}function ti(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||un,Nn=Ze.current,Te(Ze,e),Te(at,at.current),!0}function Vc(e,t,r){var o=e.stateNode;if(!o)throw Error(i(169));r?(e=Ic(e,t,Nn),o.__reactInternalMemoizedMergedChildContext=e,Ne(at),Ne(Ze),Te(Ze,e)):Ne(at),Te(at,r)}var $t=null,ni=!1,ta=!1;function bc(e){$t===null?$t=[e]:$t.push(e)}function Bg(e){ni=!0,bc(e)}function cn(){if(!ta&&$t!==null){ta=!0;var e=0,t=ke;try{var r=$t;for(ke=1;e>=m,l-=m,Kt=1<<32-zt(t)+l|r<ae?(Ke=re,re=null):Ke=re.sibling;var ye=_(z,re,R[ae],$);if(ye===null){re===null&&(re=Ke);break}e&&re&&ye.alternate===null&&t(z,re),j=c(ye,j,ae),ne===null?ee=ye:ne.sibling=ye,ne=ye,re=Ke}if(ae===R.length)return r(z,re),ze&&zn(z,ae),ee;if(re===null){for(;aeae?(Ke=re,re=null):Ke=re.sibling;var xn=_(z,re,ye.value,$);if(xn===null){re===null&&(re=Ke);break}e&&re&&xn.alternate===null&&t(z,re),j=c(xn,j,ae),ne===null?ee=xn:ne.sibling=xn,ne=xn,re=Ke}if(ye.done)return r(z,re),ze&&zn(z,ae),ee;if(re===null){for(;!ye.done;ae++,ye=R.next())ye=U(z,ye.value,$),ye!==null&&(j=c(ye,j,ae),ne===null?ee=ye:ne.sibling=ye,ne=ye);return ze&&zn(z,ae),ee}for(re=o(z,re);!ye.done;ae++,ye=R.next())ye=Q(re,z,ae,ye.value,$),ye!==null&&(e&&ye.alternate!==null&&re.delete(ye.key===null?ae:ye.key),j=c(ye,j,ae),ne===null?ee=ye:ne.sibling=ye,ne=ye);return e&&re.forEach(function(my){return t(z,my)}),ze&&zn(z,ae),ee}function Ie(z,j,R,$){if(typeof R=="object"&&R!==null&&R.type===se&&R.key===null&&(R=R.props.children),typeof R=="object"&&R!==null){switch(R.$$typeof){case P:e:{for(var ee=R.key,ne=j;ne!==null;){if(ne.key===ee){if(ee=R.type,ee===se){if(ne.tag===7){r(z,ne.sibling),j=l(ne,R.props.children),j.return=z,z=j;break e}}else if(ne.elementType===ee||typeof ee=="object"&&ee!==null&&ee.$$typeof===Ge&&$c(ee)===ne.type){r(z,ne.sibling),j=l(ne,R.props),j.ref=Qr(z,ne,R),j.return=z,z=j;break e}r(z,ne);break}else t(z,ne);ne=ne.sibling}R.type===se?(j=In(R.props.children,z.mode,$,R.key),j.return=z,z=j):($=Ai(R.type,R.key,R.props,null,z.mode,$),$.ref=Qr(z,j,R),$.return=z,z=$)}return m(z);case G:e:{for(ne=R.key;j!==null;){if(j.key===ne)if(j.tag===4&&j.stateNode.containerInfo===R.containerInfo&&j.stateNode.implementation===R.implementation){r(z,j.sibling),j=l(j,R.children||[]),j.return=z,z=j;break e}else{r(z,j);break}else t(z,j);j=j.sibling}j=Za(R,z.mode,$),j.return=z,z=j}return m(z);case Ge:return ne=R._init,Ie(z,j,ne(R._payload),$)}if(Tr(R))return Z(z,j,R,$);if(te(R))return J(z,j,R,$);oi(z,R)}return typeof R=="string"&&R!==""||typeof R=="number"?(R=""+R,j!==null&&j.tag===6?(r(z,j.sibling),j=l(j,R),j.return=z,z=j):(r(z,j),j=Xa(R,z.mode,$),j.return=z,z=j),m(z)):r(z,j)}return Ie}var ir=Kc(!0),Hc=Kc(!1),ai=ln(null),li=null,or=null,aa=null;function la(){aa=or=li=null}function ua(e){var t=ai.current;Ne(ai),e._currentValue=t}function ca(e,t,r){for(;e!==null;){var o=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,o!==null&&(o.childLanes|=t)):o!==null&&(o.childLanes&t)!==t&&(o.childLanes|=t),e===r)break;e=e.return}}function ar(e,t){li=e,aa=or=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(ut=!0),e.firstContext=null)}function Ct(e){var t=e._currentValue;if(aa!==e)if(e={context:e,memoizedValue:t,next:null},or===null){if(li===null)throw Error(i(308));or=e,li.dependencies={lanes:0,firstContext:e}}else or=or.next=e;return t}var Rn=null;function da(e){Rn===null?Rn=[e]:Rn.push(e)}function Gc(e,t,r,o){var l=t.interleaved;return l===null?(r.next=r,da(t)):(r.next=l.next,l.next=r),t.interleaved=r,Gt(e,o)}function Gt(e,t){e.lanes|=t;var r=e.alternate;for(r!==null&&(r.lanes|=t),r=e,e=e.return;e!==null;)e.childLanes|=t,r=e.alternate,r!==null&&(r.childLanes|=t),r=e,e=e.return;return r.tag===3?r.stateNode:null}var dn=!1;function fa(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function qc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function qt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function fn(e,t,r){var o=e.updateQueue;if(o===null)return null;if(o=o.shared,(ge&2)!==0){var l=o.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),o.pending=t,Gt(e,r)}return l=o.interleaved,l===null?(t.next=t,da(o)):(t.next=l.next,l.next=t),o.interleaved=t,Gt(e,r)}function ui(e,t,r){if(t=t.updateQueue,t!==null&&(t=t.shared,(r&4194240)!==0)){var o=t.lanes;o&=e.pendingLanes,r|=o,t.lanes=r,No(e,r)}}function Qc(e,t){var r=e.updateQueue,o=e.alternate;if(o!==null&&(o=o.updateQueue,r===o)){var l=null,c=null;if(r=r.firstBaseUpdate,r!==null){do{var m={eventTime:r.eventTime,lane:r.lane,tag:r.tag,payload:r.payload,callback:r.callback,next:null};c===null?l=c=m:c=c.next=m,r=r.next}while(r!==null);c===null?l=c=t:c=c.next=t}else l=c=t;r={baseState:o.baseState,firstBaseUpdate:l,lastBaseUpdate:c,shared:o.shared,effects:o.effects},e.updateQueue=r;return}e=r.lastBaseUpdate,e===null?r.firstBaseUpdate=t:e.next=t,r.lastBaseUpdate=t}function ci(e,t,r,o){var l=e.updateQueue;dn=!1;var c=l.firstBaseUpdate,m=l.lastBaseUpdate,S=l.shared.pending;if(S!==null){l.shared.pending=null;var T=S,E=T.next;T.next=null,m===null?c=E:m.next=E,m=T;var W=e.alternate;W!==null&&(W=W.updateQueue,S=W.lastBaseUpdate,S!==m&&(S===null?W.firstBaseUpdate=E:S.next=E,W.lastBaseUpdate=T))}if(c!==null){var U=l.baseState;m=0,W=E=T=null,S=c;do{var _=S.lane,Q=S.eventTime;if((o&_)===_){W!==null&&(W=W.next={eventTime:Q,lane:0,tag:S.tag,payload:S.payload,callback:S.callback,next:null});e:{var Z=e,J=S;switch(_=t,Q=r,J.tag){case 1:if(Z=J.payload,typeof Z=="function"){U=Z.call(Q,U,_);break e}U=Z;break e;case 3:Z.flags=Z.flags&-65537|128;case 0:if(Z=J.payload,_=typeof Z=="function"?Z.call(Q,U,_):Z,_==null)break e;U=q({},U,_);break e;case 2:dn=!0}}S.callback!==null&&S.lane!==0&&(e.flags|=64,_=l.effects,_===null?l.effects=[S]:_.push(S))}else Q={eventTime:Q,lane:_,tag:S.tag,payload:S.payload,callback:S.callback,next:null},W===null?(E=W=Q,T=U):W=W.next=Q,m|=_;if(S=S.next,S===null){if(S=l.shared.pending,S===null)break;_=S,S=_.next,_.next=null,l.lastBaseUpdate=_,l.shared.pending=null}}while(!0);if(W===null&&(T=U),l.baseState=T,l.firstBaseUpdate=E,l.lastBaseUpdate=W,t=l.shared.interleaved,t!==null){l=t;do m|=l.lane,l=l.next;while(l!==t)}else c===null&&(l.shared.lanes=0);Ln|=m,e.lanes=m,e.memoizedState=U}}function Yc(e,t,r){if(e=t.effects,t.effects=null,e!==null)for(t=0;tr?r:4,e(!0);var o=ya.transition;ya.transition={};try{e(!1),t()}finally{ke=r,ya.transition=o}}function md(){return wt().memoizedState}function _g(e,t,r){var o=gn(e);if(r={lane:o,action:r,hasEagerState:!1,eagerState:null,next:null},gd(e))yd(t,r);else if(r=Gc(e,t,r,o),r!==null){var l=ot();Dt(r,e,o,l),vd(r,t,o)}}function Wg(e,t,r){var o=gn(e),l={lane:o,action:r,hasEagerState:!1,eagerState:null,next:null};if(gd(e))yd(t,l);else{var c=e.alternate;if(e.lanes===0&&(c===null||c.lanes===0)&&(c=t.lastRenderedReducer,c!==null))try{var m=t.lastRenderedState,S=c(m,r);if(l.hasEagerState=!0,l.eagerState=S,Rt(S,m)){var T=t.interleaved;T===null?(l.next=l,da(t)):(l.next=T.next,T.next=l),t.interleaved=l;return}}catch{}finally{}r=Gc(e,t,l,o),r!==null&&(l=ot(),Dt(r,e,o,l),vd(r,t,o))}}function gd(e){var t=e.alternate;return e===Ae||t!==null&&t===Ae}function yd(e,t){Jr=hi=!0;var r=e.pending;r===null?t.next=t:(t.next=r.next,r.next=t),e.pending=t}function vd(e,t,r){if((r&4194240)!==0){var o=t.lanes;o&=e.pendingLanes,r|=o,t.lanes=r,No(e,r)}}var gi={readContext:Ct,useCallback:Je,useContext:Je,useEffect:Je,useImperativeHandle:Je,useInsertionEffect:Je,useLayoutEffect:Je,useMemo:Je,useReducer:Je,useRef:Je,useState:Je,useDebugValue:Je,useDeferredValue:Je,useTransition:Je,useMutableSource:Je,useSyncExternalStore:Je,useId:Je,unstable_isNewReconciler:!1},Og={readContext:Ct,useCallback:function(e,t){return _t().memoizedState=[e,t===void 0?null:t],e},useContext:Ct,useEffect:ad,useImperativeHandle:function(e,t,r){return r=r!=null?r.concat([e]):null,pi(4194308,4,cd.bind(null,t,e),r)},useLayoutEffect:function(e,t){return pi(4194308,4,e,t)},useInsertionEffect:function(e,t){return pi(4,2,e,t)},useMemo:function(e,t){var r=_t();return t=t===void 0?null:t,e=e(),r.memoizedState=[e,t],e},useReducer:function(e,t,r){var o=_t();return t=r!==void 0?r(t):t,o.memoizedState=o.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},o.queue=e,e=e.dispatch=_g.bind(null,Ae,e),[o.memoizedState,e]},useRef:function(e){var t=_t();return e={current:e},t.memoizedState=e},useState:id,useDebugValue:Ta,useDeferredValue:function(e){return _t().memoizedState=e},useTransition:function(){var e=id(!1),t=e[0];return e=bg.bind(null,e[1]),_t().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,r){var o=Ae,l=_t();if(ze){if(r===void 0)throw Error(i(407));r=r()}else{if(r=t(),$e===null)throw Error(i(349));(En&30)!==0||ed(o,t,r)}l.memoizedState=r;var c={value:r,getSnapshot:t};return l.queue=c,ad(nd.bind(null,o,c,e),[e]),o.flags|=2048,ns(9,td.bind(null,o,c,r,t),void 0,null),r},useId:function(){var e=_t(),t=$e.identifierPrefix;if(ze){var r=Ht,o=Kt;r=(o&~(1<<32-zt(o)-1)).toString(32)+r,t=":"+t+"R"+r,r=es++,0<\/script>",e=e.removeChild(e.firstChild)):typeof o.is=="string"?e=m.createElement(r,{is:o.is}):(e=m.createElement(r),r==="select"&&(m=e,o.multiple?m.multiple=!0:o.size&&(m.size=o.size))):e=m.createElementNS(e,r),e[Vt]=t,e[Gr]=o,bd(e,t,!1,!1),t.stateNode=e;e:{switch(m=go(r,o),r){case"dialog":je("cancel",e),je("close",e),l=o;break;case"iframe":case"object":case"embed":je("load",e),l=o;break;case"video":case"audio":for(l=0;l<$r.length;l++)je($r[l],e);l=o;break;case"source":je("error",e),l=o;break;case"img":case"image":case"link":je("error",e),je("load",e),l=o;break;case"details":je("toggle",e),l=o;break;case"input":Su(e,o),l=uo(e,o),je("invalid",e);break;case"option":l=o;break;case"select":e._wrapperState={wasMultiple:!!o.multiple},l=q({},o,{value:void 0}),je("invalid",e);break;case"textarea":wu(e,o),l=ho(e,o),je("invalid",e);break;default:l=o}mo(r,l),S=l;for(c in S)if(S.hasOwnProperty(c)){var T=S[c];c==="style"?Ru(e,T):c==="dangerouslySetInnerHTML"?(T=T?T.__html:void 0,T!=null&&Pu(e,T)):c==="children"?typeof T=="string"?(r!=="textarea"||T!=="")&&jr(e,T):typeof T=="number"&&jr(e,""+T):c!=="suppressContentEditableWarning"&&c!=="suppressHydrationWarning"&&c!=="autoFocus"&&(u.hasOwnProperty(c)?T!=null&&c==="onScroll"&&je("scroll",e):T!=null&&O(e,c,T,m))}switch(r){case"input":oe(e),Cu(e,o,!1);break;case"textarea":oe(e),ju(e);break;case"option":o.value!=null&&e.setAttribute("value",""+ve(o.value));break;case"select":e.multiple=!!o.multiple,c=o.value,c!=null?Fn(e,!!o.multiple,c,!1):o.defaultValue!=null&&Fn(e,!!o.multiple,o.defaultValue,!0);break;default:typeof l.onClick=="function"&&(e.onclick=Zs)}switch(r){case"button":case"input":case"select":case"textarea":o=!!o.autoFocus;break e;case"img":o=!0;break e;default:o=!1}}o&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return et(t),null;case 6:if(e&&t.stateNode!=null)Wd(e,t,e.memoizedProps,o);else{if(typeof o!="string"&&t.stateNode===null)throw Error(i(166));if(r=An(Zr.current),An(bt.current),ii(t)){if(o=t.stateNode,r=t.memoizedProps,o[Vt]=t,(c=o.nodeValue!==r)&&(e=pt,e!==null))switch(e.tag){case 3:Xs(o.nodeValue,r,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&Xs(o.nodeValue,r,(e.mode&1)!==0)}c&&(t.flags|=4)}else o=(r.nodeType===9?r:r.ownerDocument).createTextNode(o),o[Vt]=t,t.stateNode=o}return et(t),null;case 13:if(Ne(Re),o=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(ze&&mt!==null&&(t.mode&1)!==0&&(t.flags&128)===0)Fc(),sr(),t.flags|=98560,c=!1;else if(c=ii(t),o!==null&&o.dehydrated!==null){if(e===null){if(!c)throw Error(i(318));if(c=t.memoizedState,c=c!==null?c.dehydrated:null,!c)throw Error(i(317));c[Vt]=t}else sr(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;et(t),c=!1}else At!==null&&(Ha(At),At=null),c=!0;if(!c)return t.flags&65536?t:null}return(t.flags&128)!==0?(t.lanes=r,t):(o=o!==null,o!==(e!==null&&e.memoizedState!==null)&&o&&(t.child.flags|=8192,(t.mode&1)!==0&&(e===null||(Re.current&1)!==0?Ue===0&&(Ue=3):Qa())),t.updateQueue!==null&&(t.flags|=4),et(t),null);case 4:return lr(),Ba(e,t),e===null&&Kr(t.stateNode.containerInfo),et(t),null;case 10:return ua(t.type._context),et(t),null;case 17:return lt(t.type)&&ei(),et(t),null;case 19:if(Ne(Re),c=t.memoizedState,c===null)return et(t),null;if(o=(t.flags&128)!==0,m=c.rendering,m===null)if(o)rs(c,!1);else{if(Ue!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(m=di(e),m!==null){for(t.flags|=128,rs(c,!1),o=m.updateQueue,o!==null&&(t.updateQueue=o,t.flags|=4),t.subtreeFlags=0,o=r,r=t.child;r!==null;)c=r,e=o,c.flags&=14680066,m=c.alternate,m===null?(c.childLanes=0,c.lanes=e,c.child=null,c.subtreeFlags=0,c.memoizedProps=null,c.memoizedState=null,c.updateQueue=null,c.dependencies=null,c.stateNode=null):(c.childLanes=m.childLanes,c.lanes=m.lanes,c.child=m.child,c.subtreeFlags=0,c.deletions=null,c.memoizedProps=m.memoizedProps,c.memoizedState=m.memoizedState,c.updateQueue=m.updateQueue,c.type=m.type,e=m.dependencies,c.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),r=r.sibling;return Te(Re,Re.current&1|2),t.child}e=e.sibling}c.tail!==null&&Be()>fr&&(t.flags|=128,o=!0,rs(c,!1),t.lanes=4194304)}else{if(!o)if(e=di(m),e!==null){if(t.flags|=128,o=!0,r=e.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),rs(c,!0),c.tail===null&&c.tailMode==="hidden"&&!m.alternate&&!ze)return et(t),null}else 2*Be()-c.renderingStartTime>fr&&r!==1073741824&&(t.flags|=128,o=!0,rs(c,!1),t.lanes=4194304);c.isBackwards?(m.sibling=t.child,t.child=m):(r=c.last,r!==null?r.sibling=m:t.child=m,c.last=m)}return c.tail!==null?(t=c.tail,c.rendering=t,c.tail=t.sibling,c.renderingStartTime=Be(),t.sibling=null,r=Re.current,Te(Re,o?r&1|2:r&1),t):(et(t),null);case 22:case 23:return qa(),o=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==o&&(t.flags|=8192),o&&(t.mode&1)!==0?(gt&1073741824)!==0&&(et(t),t.subtreeFlags&6&&(t.flags|=8192)):et(t),null;case 24:return null;case 25:return null}throw Error(i(156,t.tag))}function Qg(e,t){switch(ra(t),t.tag){case 1:return lt(t.type)&&ei(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return lr(),Ne(at),Ne(Ze),ga(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return pa(t),null;case 13:if(Ne(Re),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));sr()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ne(Re),null;case 4:return lr(),null;case 10:return ua(t.type._context),null;case 22:case 23:return qa(),null;case 24:return null;default:return null}}var Si=!1,tt=!1,Yg=typeof WeakSet=="function"?WeakSet:Set,X=null;function cr(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(null)}catch(o){Me(e,t,o)}else r.current=null}function Ia(e,t,r){try{r()}catch(o){Me(e,t,o)}}var Od=!1;function Xg(e,t){if(qo=Ws,e=xc(),Wo(e)){if("selectionStart"in e)var r={start:e.selectionStart,end:e.selectionEnd};else e:{r=(r=e.ownerDocument)&&r.defaultView||window;var o=r.getSelection&&r.getSelection();if(o&&o.rangeCount!==0){r=o.anchorNode;var l=o.anchorOffset,c=o.focusNode;o=o.focusOffset;try{r.nodeType,c.nodeType}catch{r=null;break e}var m=0,S=-1,T=-1,E=0,W=0,U=e,_=null;t:for(;;){for(var Q;U!==r||l!==0&&U.nodeType!==3||(S=m+l),U!==c||o!==0&&U.nodeType!==3||(T=m+o),U.nodeType===3&&(m+=U.nodeValue.length),(Q=U.firstChild)!==null;)_=U,U=Q;for(;;){if(U===e)break t;if(_===r&&++E===l&&(S=m),_===c&&++W===o&&(T=m),(Q=U.nextSibling)!==null)break;U=_,_=U.parentNode}U=Q}r=S===-1||T===-1?null:{start:S,end:T}}else r=null}r=r||{start:0,end:0}}else r=null;for(Qo={focusedElem:e,selectionRange:r},Ws=!1,X=t;X!==null;)if(t=X,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,X=e;else for(;X!==null;){t=X;try{var Z=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(Z!==null){var J=Z.memoizedProps,Ie=Z.memoizedState,z=t.stateNode,j=z.getSnapshotBeforeUpdate(t.elementType===t.type?J:Et(t.type,J),Ie);z.__reactInternalSnapshotBeforeUpdate=j}break;case 3:var R=t.stateNode.containerInfo;R.nodeType===1?R.textContent="":R.nodeType===9&&R.documentElement&&R.removeChild(R.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(i(163))}}catch($){Me(t,t.return,$)}if(e=t.sibling,e!==null){e.return=t.return,X=e;break}X=t.return}return Z=Od,Od=!1,Z}function ss(e,t,r){var o=t.updateQueue;if(o=o!==null?o.lastEffect:null,o!==null){var l=o=o.next;do{if((l.tag&e)===e){var c=l.destroy;l.destroy=void 0,c!==void 0&&Ia(t,r,c)}l=l.next}while(l!==o)}}function ki(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var r=t=t.next;do{if((r.tag&e)===e){var o=r.create;r.destroy=o()}r=r.next}while(r!==t)}}function Va(e){var t=e.ref;if(t!==null){var r=e.stateNode;switch(e.tag){case 5:e=r;break;default:e=r}typeof t=="function"?t(e):t.current=e}}function Ud(e){var t=e.alternate;t!==null&&(e.alternate=null,Ud(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Vt],delete t[Gr],delete t[Jo],delete t[Mg],delete t[Dg])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Fd(e){return e.tag===5||e.tag===3||e.tag===4}function $d(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Fd(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function ba(e,t,r){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?r.nodeType===8?r.parentNode.insertBefore(e,t):r.insertBefore(e,t):(r.nodeType===8?(t=r.parentNode,t.insertBefore(e,r)):(t=r,t.appendChild(e)),r=r._reactRootContainer,r!=null||t.onclick!==null||(t.onclick=Zs));else if(o!==4&&(e=e.child,e!==null))for(ba(e,t,r),e=e.sibling;e!==null;)ba(e,t,r),e=e.sibling}function _a(e,t,r){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?r.insertBefore(e,t):r.appendChild(e);else if(o!==4&&(e=e.child,e!==null))for(_a(e,t,r),e=e.sibling;e!==null;)_a(e,t,r),e=e.sibling}var qe=null,Lt=!1;function hn(e,t,r){for(r=r.child;r!==null;)Kd(e,t,r),r=r.sibling}function Kd(e,t,r){if(It&&typeof It.onCommitFiberUnmount=="function")try{It.onCommitFiberUnmount(Ds,r)}catch{}switch(r.tag){case 5:tt||cr(r,t);case 6:var o=qe,l=Lt;qe=null,hn(e,t,r),qe=o,Lt=l,qe!==null&&(Lt?(e=qe,r=r.stateNode,e.nodeType===8?e.parentNode.removeChild(r):e.removeChild(r)):qe.removeChild(r.stateNode));break;case 18:qe!==null&&(Lt?(e=qe,r=r.stateNode,e.nodeType===8?Zo(e.parentNode,r):e.nodeType===1&&Zo(e,r),Ir(e)):Zo(qe,r.stateNode));break;case 4:o=qe,l=Lt,qe=r.stateNode.containerInfo,Lt=!0,hn(e,t,r),qe=o,Lt=l;break;case 0:case 11:case 14:case 15:if(!tt&&(o=r.updateQueue,o!==null&&(o=o.lastEffect,o!==null))){l=o=o.next;do{var c=l,m=c.destroy;c=c.tag,m!==void 0&&((c&2)!==0||(c&4)!==0)&&Ia(r,t,m),l=l.next}while(l!==o)}hn(e,t,r);break;case 1:if(!tt&&(cr(r,t),o=r.stateNode,typeof o.componentWillUnmount=="function"))try{o.props=r.memoizedProps,o.state=r.memoizedState,o.componentWillUnmount()}catch(S){Me(r,t,S)}hn(e,t,r);break;case 21:hn(e,t,r);break;case 22:r.mode&1?(tt=(o=tt)||r.memoizedState!==null,hn(e,t,r),tt=o):hn(e,t,r);break;default:hn(e,t,r)}}function Hd(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r=e.stateNode;r===null&&(r=e.stateNode=new Yg),t.forEach(function(o){var l=oy.bind(null,e,o);r.has(o)||(r.add(o),o.then(l,l))})}}function Mt(e,t){var r=t.deletions;if(r!==null)for(var o=0;ol&&(l=m),o&=~c}if(o=l,o=Be()-o,o=(120>o?120:480>o?480:1080>o?1080:1920>o?1920:3e3>o?3e3:4320>o?4320:1960*Jg(o/1960))-o,10e?16:e,mn===null)var o=!1;else{if(e=mn,mn=null,Ni=0,(ge&6)!==0)throw Error(i(331));var l=ge;for(ge|=4,X=e.current;X!==null;){var c=X,m=c.child;if((X.flags&16)!==0){var S=c.deletions;if(S!==null){for(var T=0;TBe()-Ua?Dn(e,0):Oa|=r),dt(e,t)}function of(e,t){t===0&&((e.mode&1)===0?t=1:(t=Is,Is<<=1,(Is&130023424)===0&&(Is=4194304)));var r=ot();e=Gt(e,t),e!==null&&(Er(e,t,r),dt(e,r))}function iy(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),of(e,r)}function oy(e,t){var r=0;switch(e.tag){case 13:var o=e.stateNode,l=e.memoizedState;l!==null&&(r=l.retryLane);break;case 19:o=e.stateNode;break;default:throw Error(i(314))}o!==null&&o.delete(t),of(e,r)}var af;af=function(e,t,r){if(e!==null)if(e.memoizedProps!==t.pendingProps||at.current)ut=!0;else{if((e.lanes&r)===0&&(t.flags&128)===0)return ut=!1,Gg(e,t,r);ut=(e.flags&131072)!==0}else ut=!1,ze&&(t.flags&1048576)!==0&&_c(t,si,t.index);switch(t.lanes=0,t.tag){case 2:var o=t.type;xi(e,t),e=t.pendingProps;var l=tr(t,Ze.current);ar(t,r),l=xa(null,t,o,e,l,r);var c=Sa();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,lt(o)?(c=!0,ti(t)):c=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,fa(t),l.updater=yi,t.stateNode=l,l._reactInternals=t,Na(t,o,e,r),t=Aa(null,t,o,!0,c,r)):(t.tag=0,ze&&c&&na(t),it(null,t,l,r),t=t.child),t;case 16:o=t.elementType;e:{switch(xi(e,t),e=t.pendingProps,l=o._init,o=l(o._payload),t.type=o,l=t.tag=ly(o),e=Et(o,e),l){case 0:t=Ra(null,t,o,e,r);break e;case 1:t=Ld(null,t,o,e,r);break e;case 11:t=Pd(null,t,o,e,r);break e;case 14:t=zd(null,t,o,Et(o.type,e),r);break e}throw Error(i(306,o,""))}return t;case 0:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:Et(o,l),Ra(e,t,o,l,r);case 1:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:Et(o,l),Ld(e,t,o,l,r);case 3:e:{if(Md(t),e===null)throw Error(i(387));o=t.pendingProps,c=t.memoizedState,l=c.element,qc(e,t),ci(t,o,null,r);var m=t.memoizedState;if(o=m.element,c.isDehydrated)if(c={element:o,isDehydrated:!1,cache:m.cache,pendingSuspenseBoundaries:m.pendingSuspenseBoundaries,transitions:m.transitions},t.updateQueue.baseState=c,t.memoizedState=c,t.flags&256){l=ur(Error(i(423)),t),t=Dd(e,t,o,r,l);break e}else if(o!==l){l=ur(Error(i(424)),t),t=Dd(e,t,o,r,l);break e}else for(mt=an(t.stateNode.containerInfo.firstChild),pt=t,ze=!0,At=null,r=Hc(t,null,o,r),t.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(sr(),o===l){t=Qt(e,t,r);break e}it(e,t,o,r)}t=t.child}return t;case 5:return Xc(t),e===null&&ia(t),o=t.type,l=t.pendingProps,c=e!==null?e.memoizedProps:null,m=l.children,Yo(o,l)?m=null:c!==null&&Yo(o,c)&&(t.flags|=32),Ed(e,t),it(e,t,m,r),t.child;case 6:return e===null&&ia(t),null;case 13:return Bd(e,t,r);case 4:return ha(t,t.stateNode.containerInfo),o=t.pendingProps,e===null?t.child=ir(t,null,o,r):it(e,t,o,r),t.child;case 11:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:Et(o,l),Pd(e,t,o,l,r);case 7:return it(e,t,t.pendingProps,r),t.child;case 8:return it(e,t,t.pendingProps.children,r),t.child;case 12:return it(e,t,t.pendingProps.children,r),t.child;case 10:e:{if(o=t.type._context,l=t.pendingProps,c=t.memoizedProps,m=l.value,Te(ai,o._currentValue),o._currentValue=m,c!==null)if(Rt(c.value,m)){if(c.children===l.children&&!at.current){t=Qt(e,t,r);break e}}else for(c=t.child,c!==null&&(c.return=t);c!==null;){var S=c.dependencies;if(S!==null){m=c.child;for(var T=S.firstContext;T!==null;){if(T.context===o){if(c.tag===1){T=qt(-1,r&-r),T.tag=2;var E=c.updateQueue;if(E!==null){E=E.shared;var W=E.pending;W===null?T.next=T:(T.next=W.next,W.next=T),E.pending=T}}c.lanes|=r,T=c.alternate,T!==null&&(T.lanes|=r),ca(c.return,r,t),S.lanes|=r;break}T=T.next}}else if(c.tag===10)m=c.type===t.type?null:c.child;else if(c.tag===18){if(m=c.return,m===null)throw Error(i(341));m.lanes|=r,S=m.alternate,S!==null&&(S.lanes|=r),ca(m,r,t),m=c.sibling}else m=c.child;if(m!==null)m.return=c;else for(m=c;m!==null;){if(m===t){m=null;break}if(c=m.sibling,c!==null){c.return=m.return,m=c;break}m=m.return}c=m}it(e,t,l.children,r),t=t.child}return t;case 9:return l=t.type,o=t.pendingProps.children,ar(t,r),l=Ct(l),o=o(l),t.flags|=1,it(e,t,o,r),t.child;case 14:return o=t.type,l=Et(o,t.pendingProps),l=Et(o.type,l),zd(e,t,o,l,r);case 15:return Rd(e,t,t.type,t.pendingProps,r);case 17:return o=t.type,l=t.pendingProps,l=t.elementType===o?l:Et(o,l),xi(e,t),t.tag=1,lt(o)?(e=!0,ti(t)):e=!1,ar(t,r),Sd(t,o,l),Na(t,o,l,r),Aa(null,t,o,!0,e,r);case 19:return Vd(e,t,r);case 22:return Ad(e,t,r)}throw Error(i(156,t.tag))};function lf(e,t){return Wu(e,t)}function ay(e,t,r,o){this.tag=e,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=o,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function jt(e,t,r,o){return new ay(e,t,r,o)}function Ya(e){return e=e.prototype,!(!e||!e.isReactComponent)}function ly(e){if(typeof e=="function")return Ya(e)?1:0;if(e!=null){if(e=e.$$typeof,e===We)return 11;if(e===Xe)return 14}return 2}function vn(e,t){var r=e.alternate;return r===null?(r=jt(e.tag,t,e.key,e.mode),r.elementType=e.elementType,r.type=e.type,r.stateNode=e.stateNode,r.alternate=e,e.alternate=r):(r.pendingProps=t,r.type=e.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=e.flags&14680064,r.childLanes=e.childLanes,r.lanes=e.lanes,r.child=e.child,r.memoizedProps=e.memoizedProps,r.memoizedState=e.memoizedState,r.updateQueue=e.updateQueue,t=e.dependencies,r.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},r.sibling=e.sibling,r.index=e.index,r.ref=e.ref,r}function Ai(e,t,r,o,l,c){var m=2;if(o=e,typeof e=="function")Ya(e)&&(m=1);else if(typeof e=="string")m=5;else e:switch(e){case se:return In(r.children,l,c,t);case Y:m=8,l|=8;break;case le:return e=jt(12,r,t,l|2),e.elementType=le,e.lanes=c,e;case He:return e=jt(13,r,t,l),e.elementType=He,e.lanes=c,e;case Le:return e=jt(19,r,t,l),e.elementType=Le,e.lanes=c,e;case ce:return Ei(r,l,c,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case H:m=10;break e;case pe:m=9;break e;case We:m=11;break e;case Xe:m=14;break e;case Ge:m=16,o=null;break e}throw Error(i(130,e==null?e:typeof e,""))}return t=jt(m,r,t,l),t.elementType=e,t.type=o,t.lanes=c,t}function In(e,t,r,o){return e=jt(7,e,o,t),e.lanes=r,e}function Ei(e,t,r,o){return e=jt(22,e,o,t),e.elementType=ce,e.lanes=r,e.stateNode={isHidden:!1},e}function Xa(e,t,r){return e=jt(6,e,null,t),e.lanes=r,e}function Za(e,t,r){return t=jt(4,e.children!==null?e.children:[],e.key,t),t.lanes=r,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function uy(e,t,r,o,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=jo(0),this.expirationTimes=jo(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=jo(0),this.identifierPrefix=o,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function Ja(e,t,r,o,l,c,m,S,T){return e=new uy(e,t,r,S,T),t===1?(t=1,c===!0&&(t|=8)):t=0,c=jt(3,null,null,t),e.current=c,c.stateNode=e,c.memoizedState={element:o,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},fa(c),e}function cy(e,t,r){var o=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(s){console.error(s)}}return n(),il.exports=ky(),il.exports}var Cf;function wy(){if(Cf)return bi;Cf=1;var n=Cy();return bi.createRoot=n.createRoot,bi.hydrateRoot=n.hydrateRoot,bi}var Ty=wy();const Ol=A.createContext({});function to(n){const s=A.useRef(null);return s.current===null&&(s.current=n()),s.current}const no=A.createContext(null),vs=A.createContext({transformPagePoint:n=>n,isStatic:!1,reducedMotion:"never"});class jy extends A.Component{getSnapshotBeforeUpdate(s){const i=this.props.childRef.current;if(i&&s.isPresent&&!this.props.isPresent){const a=this.props.sizeRef.current;a.height=i.offsetHeight||0,a.width=i.offsetWidth||0,a.top=i.offsetTop,a.left=i.offsetLeft}return null}componentDidUpdate(){}render(){return this.props.children}}function Ny({children:n,isPresent:s}){const i=A.useId(),a=A.useRef(null),u=A.useRef({width:0,height:0,top:0,left:0}),{nonce:h}=A.useContext(vs);return A.useInsertionEffect(()=>{const{width:f,height:p,top:g,left:y}=u.current;if(s||!a.current||!f||!p)return;a.current.dataset.motionPopId=i;const v=document.createElement("style");return h&&(v.nonce=h),document.head.appendChild(v),v.sheet&&v.sheet.insertRule(` +`+c.stack}return{value:e,source:t,stack:l,digest:null}}function Pa(e,t,r){return{value:e,source:null,stack:r??null,digest:t??null}}function za(e,t){try{console.error(t.value)}catch(r){setTimeout(function(){throw r})}}var $g=typeof WeakMap=="function"?WeakMap:Map;function Cd(e,t,r){r=qt(-1,r),r.tag=3,r.payload={element:null};var o=t.value;return r.callback=function(){Ti||(Ti=!0,Fa=o),za(e,t)},r}function wd(e,t,r){r=qt(-1,r),r.tag=3;var o=e.type.getDerivedStateFromError;if(typeof o=="function"){var l=t.value;r.payload=function(){return o(l)},r.callback=function(){za(e,t)}}var c=e.stateNode;return c!==null&&typeof c.componentDidCatch=="function"&&(r.callback=function(){za(e,t),typeof o!="function"&&(pn===null?pn=new Set([this]):pn.add(this));var m=t.stack;this.componentDidCatch(t.value,{componentStack:m!==null?m:""})}),r}function Td(e,t,r){var o=e.pingCache;if(o===null){o=e.pingCache=new $g;var l=new Set;o.set(t,l)}else l=o.get(t),l===void 0&&(l=new Set,o.set(t,l));l.has(r)||(l.add(r),e=sy.bind(null,e,t,r),t.then(e,e))}function jd(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function Nd(e,t,r,o,l){return(e.mode&1)===0?(e===t?e.flags|=65536:(e.flags|=128,r.flags|=131072,r.flags&=-52805,r.tag===1&&(r.alternate===null?r.tag=17:(t=qt(-1,1),t.tag=2,fn(r,t,1))),r.lanes|=1),e):(e.flags|=65536,e.lanes=l,e)}var Kg=V.ReactCurrentOwner,ut=!1;function it(e,t,r,o){t.child=e===null?Hc(t,null,r,o):ir(t,e.child,r,o)}function Pd(e,t,r,o,l){r=r.render;var c=t.ref;return ar(t,l),o=xa(e,t,r,o,c,l),r=Sa(),e!==null&&!ut?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~l,Qt(e,t,l)):(ze&&r&&na(t),t.flags|=1,it(e,t,o,l),t.child)}function zd(e,t,r,o,l){if(e===null){var c=r.type;return typeof c=="function"&&!Ya(c)&&c.defaultProps===void 0&&r.compare===null&&r.defaultProps===void 0?(t.tag=15,t.type=c,Rd(e,t,c,o,l)):(e=Ai(r.type,null,o,t,t.mode,l),e.ref=t.ref,e.return=t,t.child=e)}if(c=e.child,(e.lanes&l)===0){var m=c.memoizedProps;if(r=r.compare,r=r!==null?r:Ur,r(m,o)&&e.ref===t.ref)return Qt(e,t,l)}return t.flags|=1,e=vn(c,o),e.ref=t.ref,e.return=t,t.child=e}function Rd(e,t,r,o,l){if(e!==null){var c=e.memoizedProps;if(Ur(c,o)&&e.ref===t.ref)if(ut=!1,t.pendingProps=o=c,(e.lanes&l)!==0)(e.flags&131072)!==0&&(ut=!0);else return t.lanes=e.lanes,Qt(e,t,l)}return Ra(e,t,r,o,l)}function Ad(e,t,r){var o=t.pendingProps,l=o.children,c=e!==null?e.memoizedState:null;if(o.mode==="hidden")if((t.mode&1)===0)t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Te(dr,gt),gt|=r;else{if((r&1073741824)===0)return e=c!==null?c.baseLanes|r:r,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Te(dr,gt),gt|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},o=c!==null?c.baseLanes:r,Te(dr,gt),gt|=o}else c!==null?(o=c.baseLanes|r,t.memoizedState=null):o=r,Te(dr,gt),gt|=o;return it(e,t,l,r),t.child}function Ed(e,t){var r=t.ref;(e===null&&r!==null||e!==null&&e.ref!==r)&&(t.flags|=512,t.flags|=2097152)}function Ra(e,t,r,o,l){var c=lt(r)?Nn:Ze.current;return c=tr(t,c),ar(t,l),r=xa(e,t,r,o,c,l),o=Sa(),e!==null&&!ut?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~l,Qt(e,t,l)):(ze&&o&&na(t),t.flags|=1,it(e,t,r,l),t.child)}function Ld(e,t,r,o,l){if(lt(r)){var c=!0;ti(t)}else c=!1;if(ar(t,l),t.stateNode===null)xi(e,t),Sd(t,r,o),Na(t,r,o,l),o=!0;else if(e===null){var m=t.stateNode,S=t.memoizedProps;m.props=S;var T=m.context,E=r.contextType;typeof E=="object"&&E!==null?E=Ct(E):(E=lt(r)?Nn:Ze.current,E=tr(t,E));var W=r.getDerivedStateFromProps,U=typeof W=="function"||typeof m.getSnapshotBeforeUpdate=="function";U||typeof m.UNSAFE_componentWillReceiveProps!="function"&&typeof m.componentWillReceiveProps!="function"||(S!==o||T!==E)&&kd(t,m,o,E),dn=!1;var _=t.memoizedState;m.state=_,ci(t,o,m,l),T=t.memoizedState,S!==o||_!==T||at.current||dn?(typeof W=="function"&&(ja(t,r,W,o),T=t.memoizedState),(S=dn||xd(t,r,S,o,_,T,E))?(U||typeof m.UNSAFE_componentWillMount!="function"&&typeof m.componentWillMount!="function"||(typeof m.componentWillMount=="function"&&m.componentWillMount(),typeof m.UNSAFE_componentWillMount=="function"&&m.UNSAFE_componentWillMount()),typeof m.componentDidMount=="function"&&(t.flags|=4194308)):(typeof m.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=o,t.memoizedState=T),m.props=o,m.state=T,m.context=E,o=S):(typeof m.componentDidMount=="function"&&(t.flags|=4194308),o=!1)}else{m=t.stateNode,qc(e,t),S=t.memoizedProps,E=t.type===t.elementType?S:Et(t.type,S),m.props=E,U=t.pendingProps,_=m.context,T=r.contextType,typeof T=="object"&&T!==null?T=Ct(T):(T=lt(r)?Nn:Ze.current,T=tr(t,T));var Q=r.getDerivedStateFromProps;(W=typeof Q=="function"||typeof m.getSnapshotBeforeUpdate=="function")||typeof m.UNSAFE_componentWillReceiveProps!="function"&&typeof m.componentWillReceiveProps!="function"||(S!==U||_!==T)&&kd(t,m,o,T),dn=!1,_=t.memoizedState,m.state=_,ci(t,o,m,l);var Z=t.memoizedState;S!==U||_!==Z||at.current||dn?(typeof Q=="function"&&(ja(t,r,Q,o),Z=t.memoizedState),(E=dn||xd(t,r,E,o,_,Z,T)||!1)?(W||typeof m.UNSAFE_componentWillUpdate!="function"&&typeof m.componentWillUpdate!="function"||(typeof m.componentWillUpdate=="function"&&m.componentWillUpdate(o,Z,T),typeof m.UNSAFE_componentWillUpdate=="function"&&m.UNSAFE_componentWillUpdate(o,Z,T)),typeof m.componentDidUpdate=="function"&&(t.flags|=4),typeof m.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof m.componentDidUpdate!="function"||S===e.memoizedProps&&_===e.memoizedState||(t.flags|=4),typeof m.getSnapshotBeforeUpdate!="function"||S===e.memoizedProps&&_===e.memoizedState||(t.flags|=1024),t.memoizedProps=o,t.memoizedState=Z),m.props=o,m.state=Z,m.context=T,o=E):(typeof m.componentDidUpdate!="function"||S===e.memoizedProps&&_===e.memoizedState||(t.flags|=4),typeof m.getSnapshotBeforeUpdate!="function"||S===e.memoizedProps&&_===e.memoizedState||(t.flags|=1024),o=!1)}return Aa(e,t,r,o,c,l)}function Aa(e,t,r,o,l,c){Ed(e,t);var m=(t.flags&128)!==0;if(!o&&!m)return l&&Vc(t,r,!1),Qt(e,t,c);o=t.stateNode,Kg.current=t;var S=m&&typeof r.getDerivedStateFromError!="function"?null:o.render();return t.flags|=1,e!==null&&m?(t.child=ir(t,e.child,null,c),t.child=ir(t,null,S,c)):it(e,t,S,c),t.memoizedState=o.state,l&&Vc(t,r,!0),t.child}function Md(e){var t=e.stateNode;t.pendingContext?Bc(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Bc(e,t.context,!1),ha(e,t.containerInfo)}function Dd(e,t,r,o,l){return sr(),oa(l),t.flags|=256,it(e,t,r,o),t.child}var Ea={dehydrated:null,treeContext:null,retryLane:0};function La(e){return{baseLanes:e,cachePool:null,transitions:null}}function Bd(e,t,r){var o=t.pendingProps,l=Re.current,c=!1,m=(t.flags&128)!==0,S;if((S=m)||(S=e!==null&&e.memoizedState===null?!1:(l&2)!==0),S?(c=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(l|=1),Te(Re,l&1),e===null)return ia(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?((t.mode&1)===0?t.lanes=1:e.data==="$!"?t.lanes=8:t.lanes=1073741824,null):(m=o.children,e=o.fallback,c?(o=t.mode,c=t.child,m={mode:"hidden",children:m},(o&1)===0&&c!==null?(c.childLanes=0,c.pendingProps=m):c=Ei(m,o,0,null),e=In(e,o,r,null),c.return=t,e.return=t,c.sibling=e,t.child=c,t.child.memoizedState=La(r),t.memoizedState=Ea,e):Ma(t,m));if(l=e.memoizedState,l!==null&&(S=l.dehydrated,S!==null))return Hg(e,t,m,o,S,l,r);if(c){c=o.fallback,m=t.mode,l=e.child,S=l.sibling;var T={mode:"hidden",children:o.children};return(m&1)===0&&t.child!==l?(o=t.child,o.childLanes=0,o.pendingProps=T,t.deletions=null):(o=vn(l,T),o.subtreeFlags=l.subtreeFlags&14680064),S!==null?c=vn(S,c):(c=In(c,m,r,null),c.flags|=2),c.return=t,o.return=t,o.sibling=c,t.child=o,o=c,c=t.child,m=e.child.memoizedState,m=m===null?La(r):{baseLanes:m.baseLanes|r,cachePool:null,transitions:m.transitions},c.memoizedState=m,c.childLanes=e.childLanes&~r,t.memoizedState=Ea,o}return c=e.child,e=c.sibling,o=vn(c,{mode:"visible",children:o.children}),(t.mode&1)===0&&(o.lanes=r),o.return=t,o.sibling=null,e!==null&&(r=t.deletions,r===null?(t.deletions=[e],t.flags|=16):r.push(e)),t.child=o,t.memoizedState=null,o}function Ma(e,t){return t=Ei({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function vi(e,t,r,o){return o!==null&&oa(o),ir(t,e.child,null,r),e=Ma(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function Hg(e,t,r,o,l,c,m){if(r)return t.flags&256?(t.flags&=-257,o=Pa(Error(i(422))),vi(e,t,m,o)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(c=o.fallback,l=t.mode,o=Ei({mode:"visible",children:o.children},l,0,null),c=In(c,l,m,null),c.flags|=2,o.return=t,c.return=t,o.sibling=c,t.child=o,(t.mode&1)!==0&&ir(t,e.child,null,m),t.child.memoizedState=La(m),t.memoizedState=Ea,c);if((t.mode&1)===0)return vi(e,t,m,null);if(l.data==="$!"){if(o=l.nextSibling&&l.nextSibling.dataset,o)var S=o.dgst;return o=S,c=Error(i(419)),o=Pa(c,o,void 0),vi(e,t,m,o)}if(S=(m&e.childLanes)!==0,ut||S){if(o=$e,o!==null){switch(m&-m){case 4:l=2;break;case 16:l=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:l=32;break;case 536870912:l=268435456;break;default:l=0}l=(l&(o.suspendedLanes|m))!==0?0:l,l!==0&&l!==c.retryLane&&(c.retryLane=l,Gt(e,l),Dt(o,e,l,-1))}return Qa(),o=Pa(Error(i(421))),vi(e,t,m,o)}return l.data==="$?"?(t.flags|=128,t.child=e.child,t=iy.bind(null,e),l._reactRetry=t,null):(e=c.treeContext,mt=an(l.nextSibling),pt=t,ze=!0,At=null,e!==null&&(St[kt++]=Kt,St[kt++]=Ht,St[kt++]=Pn,Kt=e.id,Ht=e.overflow,Pn=t),t=Ma(t,o.children),t.flags|=4096,t)}function Id(e,t,r){e.lanes|=t;var o=e.alternate;o!==null&&(o.lanes|=t),ca(e.return,t,r)}function Da(e,t,r,o,l){var c=e.memoizedState;c===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:o,tail:r,tailMode:l}:(c.isBackwards=t,c.rendering=null,c.renderingStartTime=0,c.last=o,c.tail=r,c.tailMode=l)}function Vd(e,t,r){var o=t.pendingProps,l=o.revealOrder,c=o.tail;if(it(e,t,o.children,r),o=Re.current,(o&2)!==0)o=o&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Id(e,r,t);else if(e.tag===19)Id(e,r,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}o&=1}if(Te(Re,o),(t.mode&1)===0)t.memoizedState=null;else switch(l){case"forwards":for(r=t.child,l=null;r!==null;)e=r.alternate,e!==null&&di(e)===null&&(l=r),r=r.sibling;r=l,r===null?(l=t.child,t.child=null):(l=r.sibling,r.sibling=null),Da(t,!1,l,r,c);break;case"backwards":for(r=null,l=t.child,t.child=null;l!==null;){if(e=l.alternate,e!==null&&di(e)===null){t.child=l;break}e=l.sibling,l.sibling=r,r=l,l=e}Da(t,!0,r,null,c);break;case"together":Da(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function xi(e,t){(t.mode&1)===0&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Qt(e,t,r){if(e!==null&&(t.dependencies=e.dependencies),Ln|=t.lanes,(r&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(i(153));if(t.child!==null){for(e=t.child,r=vn(e,e.pendingProps),t.child=r,r.return=t;e.sibling!==null;)e=e.sibling,r=r.sibling=vn(e,e.pendingProps),r.return=t;r.sibling=null}return t.child}function Gg(e,t,r){switch(t.tag){case 3:Md(t),sr();break;case 5:Xc(t);break;case 1:lt(t.type)&&ti(t);break;case 4:ha(t,t.stateNode.containerInfo);break;case 10:var o=t.type._context,l=t.memoizedProps.value;Te(ai,o._currentValue),o._currentValue=l;break;case 13:if(o=t.memoizedState,o!==null)return o.dehydrated!==null?(Te(Re,Re.current&1),t.flags|=128,null):(r&t.child.childLanes)!==0?Bd(e,t,r):(Te(Re,Re.current&1),e=Qt(e,t,r),e!==null?e.sibling:null);Te(Re,Re.current&1);break;case 19:if(o=(r&t.childLanes)!==0,(e.flags&128)!==0){if(o)return Vd(e,t,r);t.flags|=128}if(l=t.memoizedState,l!==null&&(l.rendering=null,l.tail=null,l.lastEffect=null),Te(Re,Re.current),o)break;return null;case 22:case 23:return t.lanes=0,Ad(e,t,r)}return Qt(e,t,r)}var bd,Ba,_d,Wd;bd=function(e,t){for(var r=t.child;r!==null;){if(r.tag===5||r.tag===6)e.appendChild(r.stateNode);else if(r.tag!==4&&r.child!==null){r.child.return=r,r=r.child;continue}if(r===t)break;for(;r.sibling===null;){if(r.return===null||r.return===t)return;r=r.return}r.sibling.return=r.return,r=r.sibling}},Ba=function(){},_d=function(e,t,r,o){var l=e.memoizedProps;if(l!==o){e=t.stateNode,An(bt.current);var c=null;switch(r){case"input":l=uo(e,l),o=uo(e,o),c=[];break;case"select":l=q({},l,{value:void 0}),o=q({},o,{value:void 0}),c=[];break;case"textarea":l=ho(e,l),o=ho(e,o),c=[];break;default:typeof l.onClick!="function"&&typeof o.onClick=="function"&&(e.onclick=Zs)}mo(r,o);var m;r=null;for(E in l)if(!o.hasOwnProperty(E)&&l.hasOwnProperty(E)&&l[E]!=null)if(E==="style"){var S=l[E];for(m in S)S.hasOwnProperty(m)&&(r||(r={}),r[m]="")}else E!=="dangerouslySetInnerHTML"&&E!=="children"&&E!=="suppressContentEditableWarning"&&E!=="suppressHydrationWarning"&&E!=="autoFocus"&&(u.hasOwnProperty(E)?c||(c=[]):(c=c||[]).push(E,null));for(E in o){var T=o[E];if(S=l!=null?l[E]:void 0,o.hasOwnProperty(E)&&T!==S&&(T!=null||S!=null))if(E==="style")if(S){for(m in S)!S.hasOwnProperty(m)||T&&T.hasOwnProperty(m)||(r||(r={}),r[m]="");for(m in T)T.hasOwnProperty(m)&&S[m]!==T[m]&&(r||(r={}),r[m]=T[m])}else r||(c||(c=[]),c.push(E,r)),r=T;else E==="dangerouslySetInnerHTML"?(T=T?T.__html:void 0,S=S?S.__html:void 0,T!=null&&S!==T&&(c=c||[]).push(E,T)):E==="children"?typeof T!="string"&&typeof T!="number"||(c=c||[]).push(E,""+T):E!=="suppressContentEditableWarning"&&E!=="suppressHydrationWarning"&&(u.hasOwnProperty(E)?(T!=null&&E==="onScroll"&&je("scroll",e),c||S===T||(c=[])):(c=c||[]).push(E,T))}r&&(c=c||[]).push("style",r);var E=c;(t.updateQueue=E)&&(t.flags|=4)}},Wd=function(e,t,r,o){r!==o&&(t.flags|=4)};function rs(e,t){if(!ze)switch(e.tailMode){case"hidden":t=e.tail;for(var r=null;t!==null;)t.alternate!==null&&(r=t),t=t.sibling;r===null?e.tail=null:r.sibling=null;break;case"collapsed":r=e.tail;for(var o=null;r!==null;)r.alternate!==null&&(o=r),r=r.sibling;o===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:o.sibling=null}}function et(e){var t=e.alternate!==null&&e.alternate.child===e.child,r=0,o=0;if(t)for(var l=e.child;l!==null;)r|=l.lanes|l.childLanes,o|=l.subtreeFlags&14680064,o|=l.flags&14680064,l.return=e,l=l.sibling;else for(l=e.child;l!==null;)r|=l.lanes|l.childLanes,o|=l.subtreeFlags,o|=l.flags,l.return=e,l=l.sibling;return e.subtreeFlags|=o,e.childLanes=r,t}function qg(e,t,r){var o=t.pendingProps;switch(ra(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return et(t),null;case 1:return lt(t.type)&&ei(),et(t),null;case 3:return o=t.stateNode,lr(),Ne(at),Ne(Ze),ga(),o.pendingContext&&(o.context=o.pendingContext,o.pendingContext=null),(e===null||e.child===null)&&(ii(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,At!==null&&(Ha(At),At=null))),Ba(e,t),et(t),null;case 5:pa(t);var l=An(Zr.current);if(r=t.type,e!==null&&t.stateNode!=null)_d(e,t,r,o,l),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!o){if(t.stateNode===null)throw Error(i(166));return et(t),null}if(e=An(bt.current),ii(t)){o=t.stateNode,r=t.type;var c=t.memoizedProps;switch(o[Vt]=t,o[Gr]=c,e=(t.mode&1)!==0,r){case"dialog":je("cancel",o),je("close",o);break;case"iframe":case"object":case"embed":je("load",o);break;case"video":case"audio":for(l=0;l<$r.length;l++)je($r[l],o);break;case"source":je("error",o);break;case"img":case"image":case"link":je("error",o),je("load",o);break;case"details":je("toggle",o);break;case"input":Su(o,c),je("invalid",o);break;case"select":o._wrapperState={wasMultiple:!!c.multiple},je("invalid",o);break;case"textarea":wu(o,c),je("invalid",o)}mo(r,c),l=null;for(var m in c)if(c.hasOwnProperty(m)){var S=c[m];m==="children"?typeof S=="string"?o.textContent!==S&&(c.suppressHydrationWarning!==!0&&Xs(o.textContent,S,e),l=["children",S]):typeof S=="number"&&o.textContent!==""+S&&(c.suppressHydrationWarning!==!0&&Xs(o.textContent,S,e),l=["children",""+S]):u.hasOwnProperty(m)&&S!=null&&m==="onScroll"&&je("scroll",o)}switch(r){case"input":oe(o),Cu(o,c,!0);break;case"textarea":oe(o),ju(o);break;case"select":case"option":break;default:typeof c.onClick=="function"&&(o.onclick=Zs)}o=l,t.updateQueue=o,o!==null&&(t.flags|=4)}else{m=l.nodeType===9?l:l.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=Nu(r)),e==="http://www.w3.org/1999/xhtml"?r==="script"?(e=m.createElement("div"),e.innerHTML=" + diff --git a/webapp/src/pages/Accounts.tsx b/webapp/src/pages/Accounts.tsx index 9cf58378..95569e7a 100644 --- a/webapp/src/pages/Accounts.tsx +++ b/webapp/src/pages/Accounts.tsx @@ -107,8 +107,13 @@ export function AccountsPage({ push }: { push: Push }) { } setAuthBusy(true); try { - const url = raw.startsWith("http") - ? `/api/auth/callback?url=${encodeURIComponent(raw)}` + const normalized = /^https?:\/\//i.test(raw) + ? raw + : raw.includes("nativeclient") || raw.includes("microsoftonline.com") + ? `https://${raw}` + : ""; + const url = normalized + ? `/api/auth/callback?url=${encodeURIComponent(normalized)}` : `/api/auth/callback?${raw.replace(/^\?/, "")}`; await api(url); setAuthMsg({ kind: "success", text: t("Authorization succeeded") }); diff --git a/webapp/src/pages/Settings.tsx b/webapp/src/pages/Settings.tsx index 75a03cae..c4e16ffd 100644 --- a/webapp/src/pages/Settings.tsx +++ b/webapp/src/pages/Settings.tsx @@ -138,7 +138,7 @@ export function SettingsPage({ push }: { push: (m: string, k?: "success" | "erro